From 3bd9791f7cf0fb675b78199ca4b054982eb41e18 Mon Sep 17 00:00:00 2001 From: PrashantUnity Date: Sun, 6 Sep 2026 23:52:30 +0530 Subject: [PATCH] Just Page --- .agents/AGENTS.md | 431 --- .agents/rules/m3_expressive_ui_mandate.md | 65 - .../rules/performance_and_zero_lag_mandate.md | 73 - .agents/rules/plugin_pattern_mandate.md | 57 - .agents/skills/avalonia/DETAILED_SUMMARY.md | 479 --- .../skills/avalonia/REFACTORING_SUMMARY.md | 303 -- .agents/skills/avalonia/SKILL.md | 321 -- .../avalonia/resources/controls-reference.md | 677 ---- .../resources/custom-controls-advanced.md | 593 --- .../avalonia/resources/mvvm-databinding.md | 622 --- .../avalonia/resources/platform-specific.md | 743 ---- .../avalonia/resources/reactive-animations.md | 665 ---- .../avalonia/resources/styling-guide.md | 552 --- .cursorrules | 21 - .github/workflows/release.yml | 195 - .gitignore | 89 - .vscode/launch.json | 16 - .vscode/tasks.json | 57 - AGENTS.md | 1 - ..._VIEWER_CONTINUOUS_SCROLL_RENDERING_BUG.md | 68 - Bug/README.md | 7 - CLAUDE.md | 19 - GEMINI.md | 101 - LICENSE | 21 - PdfEditorApp.slnx | 9 - README.md | 150 - docs/ARCHITECTURE.md | 166 - docs/CONTRIBUTING.md | 78 - docs/EXTERNAL_PLUGIN_DEVELOPMENT_GUIDE.md | 749 ---- docs/FEATURES.md | 31 - ...MATERIAL_DESIGN_3_EXPRESSIVE_GUIDELINES.md | 173 - docs/PDF_DECONSTRUCTION_AND_EDITING.md | 152 - docs/PLUGIN_BASED_ARCHITECTURE.md | 440 --- docs/THIRD_PARTY_LICENSES.md | 134 - docs/TIC_TAC_TOE_EXAMPLE.md | 359 -- docs/assets/Frame 23.svg | 7 - docs/assets/Frame 24.svg | 8 - docs/assets/Frame 26.svg | 8 - docs/assets/oldlogo.png | Bin 51729 -> 0 bytes docs/examples/ScratchpadPlugin/README.md | 16 - .../ScratchpadPlugin/ScratchpadPlugin.cs | 132 - .../ScratchpadPlugin/ScratchpadPlugin.csproj | 82 - .../ScratchpadPlugin/ScratchpadView.axaml | 77 - .../ScratchpadPlugin/ScratchpadView.axaml.cs | 11 - .../ScratchpadPlugin/ScratchpadViewModel.cs | 53 - docs/examples/ScratchpadPlugin/plugin.json | 18 - docs/examples/SnakePlugin/README.md | 33 - .../SnakePlugin/SnakeCanvasControl.cs | 152 - docs/examples/SnakePlugin/SnakeGamePlugin.cs | 143 - docs/examples/SnakePlugin/SnakeGameView.axaml | 201 - .../SnakePlugin/SnakeGameView.axaml.cs | 160 - .../SnakePlugin/SnakeGameViewModel.cs | 368 -- docs/examples/SnakePlugin/SnakePlugin.csproj | 82 - docs/examples/SnakePlugin/plugin.json | 25 - .../DocumentTelemetryPlugin.cs | 123 - .../DocumentTelemetryView.axaml | 78 - .../DocumentTelemetryView.axaml.cs | 11 - .../DocumentTelemetryViewModel.cs | 49 - docs/examples/TelemetryPlugin/README.md | 16 - .../TelemetryPlugin/TelemetryPlugin.csproj | 82 - docs/examples/TelemetryPlugin/plugin.json | 10 - docs/examples/TicTacToePlugin/README.md | 66 - .../TicTacToePlugin/TicTacToePlugin.cs | 155 - .../TicTacToePlugin/TicTacToePlugin.csproj | 109 - .../TicTacToePlugin/TicTacToeView.axaml | 162 - .../TicTacToePlugin/TicTacToeView.axaml.cs | 11 - .../TicTacToePlugin/TicTacToeViewModel.cs | 265 -- docs/examples/TicTacToePlugin/plugin.json | 32 - packaging/macos/AppIcon.icns | Bin 226652 -> 0 bytes .../macos/AppIcon.iconset/icon_128x128.png | Bin 5962 -> 0 bytes .../macos/AppIcon.iconset/icon_128x128@2x.png | Bin 14257 -> 0 bytes .../macos/AppIcon.iconset/icon_16x16.png | Bin 502 -> 0 bytes .../macos/AppIcon.iconset/icon_16x16@2x.png | Bin 1118 -> 0 bytes .../macos/AppIcon.iconset/icon_256x256.png | Bin 14257 -> 0 bytes .../macos/AppIcon.iconset/icon_256x256@2x.png | Bin 35186 -> 0 bytes .../macos/AppIcon.iconset/icon_32x32.png | Bin 1118 -> 0 bytes .../macos/AppIcon.iconset/icon_32x32@2x.png | Bin 2568 -> 0 bytes .../macos/AppIcon.iconset/icon_512x512.png | Bin 35186 -> 0 bytes .../macos/AppIcon.iconset/icon_512x512@2x.png | Bin 51518 -> 0 bytes packaging/macos/Info.plist.template | 62 - packaging/windows/app.ico | Bin 27089 -> 0 bytes packaging/windows/installer.iss | 81 - .../windows/msix/AppxManifest.xml.template | 79 - .../windows/msix/Assets/SplashScreen.png | Bin 8477 -> 0 bytes .../windows/msix/Assets/Square150x150Logo.png | Bin 7449 -> 0 bytes .../windows/msix/Assets/Square310x310Logo.png | Bin 18264 -> 0 bytes .../windows/msix/Assets/Square44x44Logo.png | Bin 1544 -> 0 bytes ...x44Logo.targetsize-24_altform-unplated.png | Bin 822 -> 0 bytes ...44Logo.targetsize-256_altform-unplated.png | Bin 14257 -> 0 bytes ...x44Logo.targetsize-48_altform-unplated.png | Bin 1742 -> 0 bytes .../windows/msix/Assets/Square71x71Logo.png | Bin 2914 -> 0 bytes packaging/windows/msix/Assets/StoreLogo.png | Bin 1838 -> 0 bytes .../windows/msix/Assets/Wide310x150Logo.png | Bin 3495 -> 0 bytes packaging/windows/msix/build-msix.ps1 | 113 - profiles/desktop.profile.json | 27 - profiles/headless.profile.json | 19 - run | 4 - .../Analysis/LiveChartsRenderer.cs | 560 --- .../Analysis/PdfLayoutAnalyzer.cs | 1120 ------ .../Analysis/TableGridDetector.cs | 227 -- .../Analysis/UnicodeScriptDetector.cs | 358 -- .../Data/BatchMergeModels.cs | 76 - .../Data/DataBindingService.cs | 235 -- src/PdfEditorApp.Core/Data/DataMatrix.cs | 206 - src/PdfEditorApp.Core/Data/DataMergeEngine.cs | 396 -- .../Data/DataSourceService.cs | 536 --- .../Data/IBatchPdfGenerator.cs | 22 - .../Data/IDataBindingService.cs | 15 - .../Data/IDataMergeEngine.cs | 31 - .../Data/IDataSourceService.cs | 17 - .../Extractors/PdfFormExtractor.cs | 108 - .../Extractors/PdfImageExtractor.cs | 360 -- .../Extractors/PdfTextExtractor.cs | 160 - .../Extractors/PdfVectorExtractor.cs | 264 -- .../Deconstruction/PdfDeconstructionEngine.cs | 258 -- .../PdfDeconstructionOptions.cs | 89 - .../Utils/CmykColorConverter.cs | 30 - .../Utils/ColorContrastHelper.cs | 121 - .../Deconstruction/Utils/PdfColorHelper.cs | 190 - .../Deconstruction/Utils/SvgPathBuilder.cs | 110 - src/PdfEditorApp.Core/Models/AiModels.cs | 214 -- .../Models/CommandPaletteItem.cs | 13 - src/PdfEditorApp.Core/Models/CommentItem.cs | 10 - .../Elements/DynamicElementJsonResolver.cs | 52 - .../Models/Elements/PdfBarcodeElement.cs | 17 - .../Models/Elements/PdfChartElement.cs | 65 - .../Models/Elements/PdfDividerElement.cs | 20 - .../Models/Elements/PdfElementBase.cs | 44 - .../Models/Elements/PdfFormFieldElement.cs | 38 - .../Models/Elements/PdfImageElement.cs | 77 - .../Models/Elements/PdfInkElement.cs | 17 - .../Models/Elements/PdfMathElement.cs | 66 - .../Models/Elements/PdfMeasurementElement.cs | 43 - .../Models/Elements/PdfQrCodeElement.cs | 18 - .../Models/Elements/PdfRedactionElement.cs | 19 - .../Models/Elements/PdfShapeElement.cs | 44 - .../Models/Elements/PdfStickyNoteElement.cs | 21 - .../Models/Elements/PdfSvgElement.cs | 31 - .../Models/Elements/PdfTableElement.cs | 34 - .../Models/Elements/PdfTextElement.cs | 122 - .../Models/Elements/PdfTextSpan.cs | 94 - .../Models/Elements/PdfWatermarkElement.cs | 18 - src/PdfEditorApp.Core/Models/Enums.cs | 519 --- .../Models/FontPackageModels.cs | 71 - src/PdfEditorApp.Core/Models/OcrModels.cs | 103 - src/PdfEditorApp.Core/Models/OutlineItem.cs | 8 - .../Models/PdfDocumentModel.cs | 44 - src/PdfEditorApp.Core/Models/PdfPageModel.cs | 62 - .../Models/PdfSecuritySettings.cs | 32 - .../PdfEditorApp.Core.csproj | 29 - .../Descriptors/CanvasElementDescriptor.cs | 49 - .../Descriptors/ICanvasElementRegistry.cs | 40 - .../Descriptors/ICommandPaletteRegistry.cs | 46 - .../Descriptors/IDataConnectorRegistry.cs | 32 - .../Plugins/Descriptors/IDialogRegistry.cs | 51 - .../Descriptors/IDocumentExporterRegistry.cs | 88 - .../Descriptors/IDocumentImporterRegistry.cs | 71 - .../Plugins/Descriptors/IInspectorRegistry.cs | 66 - .../Descriptors/INavigationRegistry.cs | 57 - .../Plugins/Descriptors/IOcrEngineRegistry.cs | 36 - .../Plugins/Descriptors/IOverlayRegistry.cs | 60 - .../Plugins/Descriptors/IRibbonRegistry.cs | 82 - .../Plugins/Descriptors/ISidebarRegistry.cs | 50 - .../Plugins/Descriptors/IStatusBarRegistry.cs | 33 - .../Plugins/Descriptors/ITemplateRegistry.cs | 32 - .../Plugins/Descriptors/OverlayDescriptor.cs | 56 - .../Plugins/Descriptors/PdfToolDescriptor.cs | 51 - .../Descriptors/RibbonActionDescriptor.cs | 33 - .../Plugins/FryPluginContext.cs | 855 ----- src/PdfEditorApp.Core/Plugins/IFryPlugin.cs | 50 - .../Plugins/IFryPluginContext.cs | 315 -- .../Plugins/Manifests/PluginManifest.cs | 56 - .../Marketplace/FileInstalledPluginStore.cs | 142 - .../Marketplace/IInstalledPluginStore.cs | 17 - .../Marketplace/IPluginMarketplaceService.cs | 48 - .../Marketplace/InstalledPluginRecord.cs | 19 - .../Marketplace/MarketplacePluginItem.cs | 45 - .../Pipelines/DocumentPipelineContexts.cs | 103 - .../Plugins/Pipelines/IPipelineManager.cs | 56 - .../Plugins/Pipelines/PipelineManager.cs | 207 - .../Plugins/PluginExceptions.cs | 36 - src/PdfEditorApp.Core/Plugins/PluginHost.cs | 443 --- src/PdfEditorApp.Core/Plugins/PluginScope.cs | 106 - .../Plugins/Profiles/IFryPluginBundle.cs | 21 - .../Plugins/Profiles/PluginProfile.cs | 58 - .../Plugins/Profiles/ProfileLoader.cs | 109 - .../Plugins/Settings/IPluginSettingsStore.cs | 116 - src/PdfEditorApp.Core/QuestPdfInitializer.cs | 19 - .../Services/IFontPackageService.cs | 73 - .../Utils/FryPdfEmbeddingHelper.cs | 154 - .../Utils/PdfDocumentSanitizer.cs | 134 - src/PdfEditorApp/App.axaml | 103 - src/PdfEditorApp/App.axaml.cs | 293 -- src/PdfEditorApp/Assets/Fonts/BebasNeue.ttf | Bin 61400 -> 0 bytes src/PdfEditorApp/Assets/Fonts/Caveat.ttf | Bin 403648 -> 0 bytes src/PdfEditorApp/Assets/Fonts/Cinzel.ttf | Bin 125468 -> 0 bytes src/PdfEditorApp/Assets/Fonts/ComicNeue.ttf | Bin 57248 -> 0 bytes .../Assets/Fonts/DancingScript.ttf | Bin 133636 -> 0 bytes src/PdfEditorApp/Assets/Fonts/FiraCode.ttf | Bin 260364 -> 0 bytes src/PdfEditorApp/Assets/Fonts/GreatVibes.ttf | Bin 457588 -> 0 bytes src/PdfEditorApp/Assets/Fonts/Inter.ttf | Bin 876576 -> 0 bytes src/PdfEditorApp/Assets/Fonts/Lobster.ttf | Bin 406076 -> 0 bytes src/PdfEditorApp/Assets/Fonts/Lora.ttf | Bin 212196 -> 0 bytes .../Assets/Fonts/Merriweather.ttf | Bin 4628080 -> 0 bytes src/PdfEditorApp/Assets/Fonts/Montserrat.ttf | Bin 744936 -> 0 bytes src/PdfEditorApp/Assets/Fonts/NotoSans.ttf | Bin 556328 -> 0 bytes src/PdfEditorApp/Assets/Fonts/OpenSans.ttf | Bin 532636 -> 0 bytes src/PdfEditorApp/Assets/Fonts/Orbitron.ttf | Bin 38576 -> 0 bytes src/PdfEditorApp/Assets/Fonts/Oswald.ttf | Bin 172088 -> 0 bytes src/PdfEditorApp/Assets/Fonts/Pacifico.ttf | Bin 329380 -> 0 bytes .../Assets/Fonts/PlayfairDisplay.ttf | Bin 123240 -> 0 bytes src/PdfEditorApp/Assets/Fonts/Roboto.ttf | Bin 488584 -> 0 bytes src/PdfEditorApp/Assets/Fonts/RobotoMono.ttf | Bin 183700 -> 0 bytes src/PdfEditorApp/Assets/Fonts/SourceSans3.ttf | Bin 646340 -> 0 bytes src/PdfEditorApp/Assets/IconCodefrydev.svg | 8 - src/PdfEditorApp/Assets/app-logo.ico | Bin 27089 -> 0 bytes src/PdfEditorApp/Assets/app-logo.png | Bin 52561 -> 0 bytes src/PdfEditorApp/Assets/app-logo.svg | 37 - .../Converters/CommonConverters.cs | 395 -- .../Converters/ExtendedConverters.cs | 1158 ------ .../Converters/HexToBrushConverter.cs | 62 - src/PdfEditorApp/Messages/ShellMessages.cs | 89 - src/PdfEditorApp/Models/AiChatMessage.cs | 72 - src/PdfEditorApp/Models/AiChatSession.cs | 51 - src/PdfEditorApp/Models/AiSettingsModel.cs | 121 - .../Models/DocumentComparisonModels.cs | 54 - src/PdfEditorApp/Models/HelpGuideItem.cs | 36 - src/PdfEditorApp/Models/PdfFilePreviewItem.cs | 80 - .../Models/PdfPagePreviewThumbnail.cs | 34 - src/PdfEditorApp/Models/PdfToolModels.cs | 522 --- src/PdfEditorApp/Models/PdfToolPreviewPage.cs | 34 - src/PdfEditorApp/Models/RecentDocumentItem.cs | 86 - .../Models/ThirdPartyToolLicense.cs | 47 - src/PdfEditorApp/Models/UiSettingsModel.cs | 94 - src/PdfEditorApp/Models/WorkflowModels.cs | 84 - src/PdfEditorApp/PdfEditorApp.csproj | 52 - .../Plugins/Bundles/AiProvidersBundle.cs | 109 - .../Plugins/Bundles/CanvasElementsBundle.cs | 386 -- .../Plugins/Bundles/CommandPaletteBundle.cs | 288 -- .../Plugins/Bundles/DataStudioBundle.cs | 66 - .../Plugins/Bundles/DialogsBundle.cs | 240 -- .../Plugins/Bundles/DocumentIoBundle.cs | 95 - .../Plugins/Bundles/EditorSidebarsBundle.cs | 89 - .../Plugins/Bundles/InspectorBundle.cs | 227 -- .../Plugins/Bundles/OcrEnginesBundle.cs | 69 - .../Plugins/Bundles/ShellOverlaysBundle.cs | 19 - .../Bundles/StandardTemplatesBundle.cs | 171 - .../Plugins/Bundles/StatusBarBundle.cs | 113 - .../Plugins/Bundles/ToolsConversionBundle.cs | 285 -- .../Bundles/ToolsIntelligenceBundle.cs | 153 - .../Plugins/Bundles/ToolsOrganizeBundle.cs | 153 - .../Plugins/Bundles/ToolsSecurityBundle.cs | 175 - .../Plugins/Bundles/WorkspacePagesBundle.cs | 404 -- .../Plugins/Cli/HeadlessCliRunner.cs | 316 -- .../Plugins/Loader/FryPluginPackageLoader.cs | 160 - .../Plugins/Loader/PluginAssemblyLoader.cs | 308 -- src/PdfEditorApp/Plugins/ToolPluginBase.cs | 31 - src/PdfEditorApp/Program.cs | 32 - .../Services/AI/AiProviderRegistry.cs | 58 - src/PdfEditorApp/Services/AI/AiService.cs | 695 ---- .../Services/AI/IAiProviderRegistry.cs | 86 - src/PdfEditorApp/Services/AI/IAiService.cs | 50 - .../Services/AI/IPdfStudioAgentService.cs | 36 - .../Services/AI/PdfStudioAgentService.cs | 1464 -------- .../Services/AI/Providers/GroqAiProvider.cs | 73 - .../Services/AI/Providers/OllamaAiProvider.cs | 72 - .../Services/AI/Providers/OpenAiProvider.cs | 63 - .../Services/BatchPdfGeneratorService.cs | 444 --- .../Services/Canvas/CanvasElementRegistry.cs | 377 -- .../Services/Data/DataConnectorRegistry.cs | 139 - .../Services/Dialogs/DialogRegistry.cs | 78 - .../Services/DocumentAuditService.cs | 681 ---- .../Services/DocumentCompareService.cs | 281 -- .../Export/DocumentExporterRegistry.cs | 293 -- .../Services/FileOperationHelper.cs | 263 -- src/PdfEditorApp/Services/FontHelper.cs | 164 - .../Services/FontPackageService.cs | 595 --- src/PdfEditorApp/Services/FryPdfDocument.cs | 65 - src/PdfEditorApp/Services/HelpGuideService.cs | 1796 --------- .../Services/IHelpGuideService.cs | 35 - .../Services/IPdfDocumentOperationsService.cs | 28 - .../Services/IPdfExportService.cs | 14 - .../Services/IRecentDocumentsService.cs | 22 - .../Services/ISmartPlacementService.cs | 31 - src/PdfEditorApp/Services/ITemplateService.cs | 42 - .../Services/IUiSettingsService.cs | 35 - .../Import/DocumentImporterRegistry.cs | 189 - .../Services/Inspector/InspectorRegistry.cs | 60 - .../Services/Math/MathLayoutEngine.cs | 1482 -------- .../Services/Math/MathPresetsLibrary.cs | 525 --- .../Services/Navigation/NavigationRegistry.cs | 75 - .../Services/Ocr/AppleVisionOcrEngine.cs | 300 -- .../Services/Ocr/CompositeOcrProvider.cs | 101 - .../Services/Ocr/OcrEngineRegistry.cs | 63 - .../Services/Ocr/TesseractModelService.cs | 368 -- .../Services/Ocr/TesseractOcrEngine.cs | 245 -- .../Services/Ocr/WindowsMediaOcrEngine.cs | 41 - .../Services/Overlays/OverlayRegistry.cs | 240 -- .../Services/PageOrganizerService.cs | 241 -- .../Palette/CommandPaletteRegistry.cs | 64 - .../Services/PdfDocumentOperationsService.cs | 266 -- src/PdfEditorApp/Services/PdfExportService.cs | 897 ----- src/PdfEditorApp/Services/PdfImportService.cs | 90 - .../Plugins/PluginMarketplaceService.cs | 806 ---- .../Services/ProjectPersistenceService.cs | 162 - src/PdfEditorApp/Services/QrCodeHelper.cs | 108 - .../Services/RecentDocumentsService.cs | 103 - .../Services/Ribbon/RibbonRegistry.cs | 136 - .../Services/Sidebar/SidebarRegistry.cs | 66 - src/PdfEditorApp/Services/SignatureService.cs | 206 - .../Services/SmartPlacementService.cs | 111 - .../Services/StatusBar/StatusBarRegistry.cs | 90 - .../Services/SvgOrnamentLibrary.cs | 605 --- src/PdfEditorApp/Services/SvgShapeHelper.cs | 469 --- src/PdfEditorApp/Services/TemplateService.cs | 199 - src/PdfEditorApp/Services/ThemeService.cs | 318 -- .../Tools/Conversion/PdfConversionService.cs | 1076 ------ .../Tools/Core/IPdfToolViewModelFactory.cs | 15 - .../Services/Tools/Core/PdfFileHelper.cs | 377 -- .../Services/Tools/Core/PdfPageRenderer.cs | 156 - .../Services/Tools/Core/PdfToolRegistry.cs | 553 --- .../Tools/Core/PdfToolViewModelFactory.cs | 156 - .../Services/Tools/Core/PdfWorkflowEngine.cs | 281 -- .../Tools/Intelligence/AiDocumentService.cs | 210 -- .../DocumentTranslationService.cs | 225 -- .../Tools/Intelligence/PdfFormService.cs | 127 - .../Tools/Intelligence/PdfOcrService.cs | 347 -- .../Services/Tools/Organize/PdfPageService.cs | 768 ---- .../Tools/Security/PdfOptimizationService.cs | 596 --- .../Tools/Security/PdfSecurityService.cs | 562 --- .../Security/QuestPdfOperationsEngine.cs | 559 --- .../Services/Typography/RichTextHelper.cs | 732 ---- .../Services/Typography/TextLayoutEngine.cs | 957 ----- .../Services/UiSettingsService.cs | 119 - src/PdfEditorApp/Services/UndoRedoService.cs | 140 - .../Styles/FluentOfficeStyles.axaml | 670 ---- .../Styles/Material3ExpressiveStyles.axaml | 851 ----- .../Styles/Material3ExpressiveTokens.axaml | 406 -- .../Academic/AcademicPaperTemplate.cs | 707 ---- .../Academic/HistoryResearchPaperTemplate.cs | 540 --- .../Academic/MathResearchPaperTemplate.cs | 629 ---- .../Academic/PhysicsResearchPaperTemplate.cs | 616 --- .../Career/ResumeAcademicCvTemplate.cs | 490 --- .../ResumeCreativeMinimalistTemplate.cs | 472 --- .../Career/ResumeModernCleanTemplate.cs | 606 --- .../Templates/Career/ResumeTemplate.cs | 525 --- .../CertificateNavyGoldTemplate.cs | 338 -- .../Certificates/CertificateTemplate.cs | 393 -- .../Certificates/DiplomaAcademicTemplate.cs | 356 -- .../Corporate/AnnualReportTemplate.cs | 1007 ----- .../Corporate/EmployeePayslipTemplate.cs | 429 --- .../InteractiveExecutiveBriefTemplate.cs | 1378 ------- .../Corporate/OcrAnalysisReportTemplate.cs | 556 --- .../Education/BilingualExamPaperTemplate.cs | 390 -- .../FactorizationWorksheetTemplate.cs | 204 - .../Education/MathBODMASWorksheetTemplate.cs | 390 -- .../Education/QuadrilateralsGuideTemplate.cs | 298 -- .../StatesOfMatterDiagramNotesTemplate.cs | 294 -- .../CreativeTypographyShowcaseTemplate.cs | 781 ---- .../Events/GalaInvitationTemplate.cs | 264 -- .../WeddingInvitationRoyalFloralTemplate.cs | 266 -- .../WeddingInvitationTraditionalTemplate.cs | 429 --- .../Finance/FinanceResearchPaperTemplate.cs | 579 --- .../Templates/Finance/InvoiceTemplate.cs | 388 -- .../General/BlankDocumentTemplate.cs | 92 - .../RichTextPublishingShowcaseTemplate.cs | 643 ---- .../Templates/ITemplateDefinition.cs | 10 - .../Technical/ArduinoCheatSheetTemplate.cs | 273 -- src/PdfEditorApp/ViewLocator.cs | 37 - .../ViewModels/AiAssistantViewModel.cs | 889 ----- .../ViewModels/AiSettingsViewModel.cs | 691 ---- .../BatchGenerationViewModel.cs | 891 ----- .../DataStudio/DataStudioViewModel.cs | 646 ---- .../DynamicInspectorSectionViewModel.cs | 27 - .../ViewModels/DynamicRibbonGroupViewModel.cs | 15 - .../ViewModels/DynamicRibbonTabViewModel.cs | 17 - .../ViewModels/DynamicSidebarTabViewModel.cs | 19 - .../BarcodeElementViewModel.cs | 83 - .../ChartElementViewModel.cs | 710 ---- .../DividerElementViewModel.cs | 103 - .../ElementViewModels/ElementViewModelBase.cs | 163 - .../FormFieldElementViewModel.cs | 179 - .../ImageElementViewModel.cs | 180 - .../ElementViewModels/InkElementViewModel.cs | 92 - .../ElementViewModels/MathElementViewModel.cs | 227 -- .../MeasurementElementViewModel.cs | 110 - .../QrCodeElementViewModel.cs | 174 - .../RedactionElementViewModel.cs | 86 - .../ShapeElementViewModel.cs | 201 - .../StickyNoteElementViewModel.cs | 95 - .../ElementViewModels/SvgElementViewModel.cs | 208 -- .../TableElementViewModel.cs | 248 -- .../ElementViewModels/TextElementViewModel.cs | 798 ---- .../WatermarkElementViewModel.cs | 72 - .../ViewModels/FontManagerViewModel.cs | 310 -- .../FryPdfViewer/FryPdfPageViewerViewModel.cs | 177 - .../FryPdfViewer/FryPdfViewerViewModel.cs | 463 --- .../FryPdfViewer/InteractiveChartViewModel.cs | 337 -- .../FryPdfViewer/InteractiveTableViewModel.cs | 307 -- .../ViewModels/HelpGuideViewModel.cs | 208 -- src/PdfEditorApp/ViewModels/HomeViewModel.cs | 1925 ---------- .../ViewModels/InspectorViewModel.cs | 2477 ------------ .../ViewModels/MainViewModel.Elements.cs | 1891 ---------- .../ViewModels/MainViewModel.Pages.cs | 693 ---- .../ViewModels/MainViewModel.Palette.cs | 943 ----- .../ViewModels/MainViewModel.Persistence.cs | 444 --- src/PdfEditorApp/ViewModels/MainViewModel.cs | 2277 ----------- .../ViewModels/NavigationItemViewModel.cs | 68 - .../ViewModels/OverlayInstanceViewModel.cs | 135 - src/PdfEditorApp/ViewModels/PageViewModel.cs | 501 --- .../ViewModels/PdfToolCardViewModel.cs | 49 - .../ViewModels/PdfToolRunnerViewModel.cs | 577 --- .../ViewModels/PdfViewerModels.cs | 398 -- .../PdfViewerViewModel.Annotations.cs | 149 - .../ViewModels/PdfViewerViewModel.Document.cs | 723 ---- .../PdfViewerViewModel.Navigation.cs | 590 --- .../PdfViewerViewModel.Rendering.cs | 468 --- .../ViewModels/PdfViewerViewModel.Search.cs | 143 - .../PdfViewerViewModel.Selection.cs | 516 --- .../ViewModels/PdfViewerViewModel.cs | 600 --- .../ViewModels/PluginItemViewModel.cs | 102 - .../ViewModels/PluginSettingItemViewModel.cs | 25 - .../PluginsManagerDetailViewModel.cs | 328 -- .../ViewModels/PluginsManagerViewModel.cs | 802 ---- .../ViewModels/SettingsViewModel.cs | 459 --- .../Shell/PdfLivePreviewViewModel.cs | 313 -- .../ViewModels/StatusBarWidgetViewModel.cs | 34 - .../ViewModels/TemplateCardViewModel.cs | 49 - .../ViewModels/TesseractManagerViewModel.cs | 325 -- .../Conversion/ExcelToPdfToolViewModel.cs | 32 - .../Conversion/HtmlToPdfToolViewModel.cs | 64 - .../Tools/Conversion/JpgToPdfToolViewModel.cs | 55 - .../Conversion/PdfToExcelToolViewModel.cs | 35 - .../Tools/Conversion/PdfToJpgToolViewModel.cs | 51 - .../Conversion/PdfToMarkdownToolViewModel.cs | 39 - .../Conversion/PdfToPdfAToolViewModel.cs | 31 - .../PdfToPowerPointToolViewModel.cs | 31 - .../Conversion/PdfToWordToolViewModel.cs | 39 - .../PowerPointToPdfToolViewModel.cs | 32 - .../Conversion/ScanToPdfToolViewModel.cs | 51 - .../Conversion/WordToPdfToolViewModel.cs | 32 - .../Tools/Core/PdfToolViewModelBase.cs | 788 ---- .../Intelligence/AiSummarizerToolViewModel.cs | 49 - .../Intelligence/ComparePdfToolViewModel.cs | 119 - .../Intelligence/EditPdfToolViewModel.cs | 37 - .../Tools/Intelligence/OcrPdfToolViewModel.cs | 434 --- .../Intelligence/PdfFormsToolViewModel.cs | 37 - .../Intelligence/TranslatePdfToolViewModel.cs | 41 - .../Tools/Organize/CropPdfToolViewModel.cs | 51 - .../Tools/Organize/MergePdfToolViewModel.cs | 75 - .../Organize/OrganizePdfToolViewModel.cs | 50 - .../Organize/PageNumbersToolViewModel.cs | 63 - .../Tools/Organize/RotatePdfToolViewModel.cs | 39 - .../Tools/Organize/SplitPdfToolViewModel.cs | 50 - .../Security/CompressPdfToolViewModel.cs | 205 - .../Tools/Security/ProtectPdfToolViewModel.cs | 127 - .../Tools/Security/RedactPdfToolViewModel.cs | 344 -- .../Tools/Security/RepairPdfToolViewModel.cs | 26 - .../Tools/Security/SignPdfToolViewModel.cs | 66 - .../Tools/Security/UnlockPdfToolViewModel.cs | 31 - .../Tools/Security/WatermarkToolViewModel.cs | 59 - src/PdfEditorApp/ViewModels/ViewModelBase.cs | 7 - .../ViewModels/WorkflowBuilderViewModel.cs | 296 -- .../Views/AiAssistantSidebarView.axaml | 641 ---- .../Views/AiAssistantSidebarView.axaml.cs | 11 - src/PdfEditorApp/Views/CanvasRulerControl.cs | 236 -- .../Views/CanvasTextHudView.axaml | 226 -- .../Views/CanvasTextHudView.axaml.cs | 13 - .../Views/Controls/AdvancedTextControl.cs | 692 ---- .../Views/Controls/AskAiButton.cs | 239 -- .../Views/Controls/PdfTextOverlayControl.cs | 666 ---- .../Views/Dialogs/AboutDialog.axaml | 510 --- .../Views/Dialogs/AboutDialog.axaml.cs | 31 - .../Views/Dialogs/AiAssistantDialog.axaml | 325 -- .../Views/Dialogs/AiAssistantDialog.axaml.cs | 11 - .../Views/Dialogs/BatchGenerationDialog.axaml | 532 --- .../Dialogs/BatchGenerationDialog.axaml.cs | 11 - .../Views/Dialogs/BatesNumberingDialog.axaml | 167 - .../Dialogs/BatesNumberingDialog.axaml.cs | 11 - .../Views/Dialogs/CommandPaletteDialog.axaml | 195 - .../Dialogs/CommandPaletteDialog.axaml.cs | 77 - .../Dialogs/CompareDocumentsDialog.axaml | 140 - .../Dialogs/CompareDocumentsDialog.axaml.cs | 11 - .../Views/Dialogs/CustomStampDialog.axaml | 116 - .../Views/Dialogs/CustomStampDialog.axaml.cs | 11 - .../Views/Dialogs/DataStudioDialog.axaml | 346 -- .../Views/Dialogs/DataStudioDialog.axaml.cs | 11 - .../Dialogs/DeleteConfirmationDialog.axaml | 99 - .../Dialogs/DeleteConfirmationDialog.axaml.cs | 45 - .../Dialogs/DocumentSecurityDialog.axaml | 132 - .../Dialogs/DocumentSecurityDialog.axaml.cs | 11 - .../Views/Dialogs/ExportSuccessDialog.axaml | 59 - .../Dialogs/ExportSuccessDialog.axaml.cs | 11 - .../Views/Dialogs/HeaderFooterDialog.axaml | 119 - .../Views/Dialogs/HeaderFooterDialog.axaml.cs | 11 - .../Dialogs/MathEquationStudioDialog.axaml | 317 -- .../Dialogs/MathEquationStudioDialog.axaml.cs | 11 - .../Views/Dialogs/NewDocumentDialog.axaml | 561 --- .../Views/Dialogs/NewDocumentDialog.axaml.cs | 11 - .../Views/Dialogs/PdfToolRunnerDialog.axaml | 419 --- .../Dialogs/PdfToolRunnerDialog.axaml.cs | 11 - .../Views/Dialogs/PluginsDialog.axaml | 424 --- .../Views/Dialogs/PluginsDialog.axaml.cs | 60 - .../Dialogs/PreflightDiagnosticsDialog.axaml | 174 - .../PreflightDiagnosticsDialog.axaml.cs | 11 - .../Views/Dialogs/RenameDocumentDialog.axaml | 141 - .../Dialogs/RenameDocumentDialog.axaml.cs | 62 - .../Views/Dialogs/SearchRedactDialog.axaml | 102 - .../Views/Dialogs/SearchRedactDialog.axaml.cs | 11 - .../Views/Dialogs/ShortcutsHelpDialog.axaml | 320 -- .../Dialogs/ShortcutsHelpDialog.axaml.cs | 21 - .../Views/Dialogs/SignatureStudioDialog.axaml | 141 - .../Dialogs/SignatureStudioDialog.axaml.cs | 11 - .../Views/Dialogs/SplitExtractDialog.axaml | 114 - .../Views/Dialogs/SplitExtractDialog.axaml.cs | 11 - .../Dialogs/WatermarkManagerDialog.axaml | 130 - .../Dialogs/WatermarkManagerDialog.axaml.cs | 11 - .../Views/Dialogs/WorkflowBuilderDialog.axaml | 303 -- .../Dialogs/WorkflowBuilderDialog.axaml.cs | 11 - .../Views/DocumentCanvasView.axaml | 1163 ------ .../Views/DocumentCanvasView.axaml.cs | 1414 ------- .../Views/FindReplaceBarView.axaml | 62 - .../Views/FindReplaceBarView.axaml.cs | 11 - .../Views/FontManagerPageView.axaml | 412 -- .../Views/FontManagerPageView.axaml.cs | 11 - src/PdfEditorApp/Views/FryPdfViewerView.axaml | 1035 ----- .../Views/FryPdfViewerView.axaml.cs | 94 - .../Views/HelpGuidePageView.axaml | 526 --- .../Views/HelpGuidePageView.axaml.cs | 11 - .../Views/HomeDashboardView.axaml | 761 ---- .../Views/HomeDashboardView.axaml.cs | 13 - src/PdfEditorApp/Views/HomeView.axaml | 627 ---- src/PdfEditorApp/Views/HomeView.axaml.cs | 36 - .../Views/InspectorSidebarView.axaml | 3319 ----------------- .../Views/InspectorSidebarView.axaml.cs | 142 - .../Views/LicensingPageView.axaml | 567 --- .../Views/LicensingPageView.axaml.cs | 11 - src/PdfEditorApp/Views/MainWindow.axaml | 561 --- src/PdfEditorApp/Views/MainWindow.axaml.cs | 114 - src/PdfEditorApp/Views/MathFormulaControl.cs | 473 --- .../Views/NewDocumentPageView.axaml | 762 ---- .../Views/NewDocumentPageView.axaml.cs | 11 - .../Views/Overlays/ShellOverlayHost.axaml | 171 - .../Views/Overlays/ShellOverlayHost.axaml.cs | 210 -- .../Views/PdfReaderLandingPageView.axaml | 525 --- .../Views/PdfReaderLandingPageView.axaml.cs | 17 - src/PdfEditorApp/Views/PdfToolPageView.axaml | 163 - .../Views/PdfToolPageView.axaml.cs | 13 - .../Views/PdfToolsStudioView.axaml | 282 -- .../Views/PdfToolsStudioView.axaml.cs | 13 - src/PdfEditorApp/Views/PdfViewerView.axaml | 1299 ------- src/PdfEditorApp/Views/PdfViewerView.axaml.cs | 897 ----- .../Views/PluginsManagerPageView.axaml | 1122 ------ .../Views/PluginsManagerPageView.axaml.cs | 42 - src/PdfEditorApp/Views/RibbonView.axaml | 1270 ------- src/PdfEditorApp/Views/RibbonView.axaml.cs | 11 - src/PdfEditorApp/Views/SettingsPageView.axaml | 990 ----- .../Views/SettingsPageView.axaml.cs | 11 - .../Views/Shell/PdfToolWorkspaceView.axaml | 368 -- .../Views/Shell/PdfToolWorkspaceView.axaml.cs | 359 -- .../Views/StarredToolsPageView.axaml | 135 - .../Views/StarredToolsPageView.axaml.cs | 13 - .../Views/TesseractManagerPageView.axaml | 409 -- .../Views/TesseractManagerPageView.axaml.cs | 11 - .../Views/ThumbnailSidebarView.axaml | 617 --- .../Views/ThumbnailSidebarView.axaml.cs | 11 - .../Tools/Conversion/ExcelToPdfToolView.axaml | 148 - .../Conversion/ExcelToPdfToolView.axaml.cs | 11 - .../Tools/Conversion/HtmlToPdfToolView.axaml | 150 - .../Conversion/HtmlToPdfToolView.axaml.cs | 11 - .../Tools/Conversion/JpgToPdfToolView.axaml | 156 - .../Conversion/JpgToPdfToolView.axaml.cs | 11 - .../Tools/Conversion/PdfToExcelToolView.axaml | 134 - .../Conversion/PdfToExcelToolView.axaml.cs | 11 - .../Tools/Conversion/PdfToJpgToolView.axaml | 150 - .../Conversion/PdfToJpgToolView.axaml.cs | 11 - .../Conversion/PdfToMarkdownToolView.axaml | 135 - .../Conversion/PdfToMarkdownToolView.axaml.cs | 11 - .../Tools/Conversion/PdfToPdfAToolView.axaml | 149 - .../Conversion/PdfToPdfAToolView.axaml.cs | 11 - .../Conversion/PdfToPowerPointToolView.axaml | 133 - .../PdfToPowerPointToolView.axaml.cs | 11 - .../Tools/Conversion/PdfToWordToolView.axaml | 135 - .../Conversion/PdfToWordToolView.axaml.cs | 11 - .../Conversion/PowerPointToPdfToolView.axaml | 138 - .../PowerPointToPdfToolView.axaml.cs | 11 - .../Tools/Conversion/ScanToPdfToolView.axaml | 126 - .../Conversion/ScanToPdfToolView.axaml.cs | 11 - .../Tools/Conversion/WordToPdfToolView.axaml | 148 - .../Conversion/WordToPdfToolView.axaml.cs | 11 - .../Intelligence/AiSummarizerToolView.axaml | 160 - .../AiSummarizerToolView.axaml.cs | 11 - .../Intelligence/ComparePdfToolView.axaml | 150 - .../Intelligence/ComparePdfToolView.axaml.cs | 11 - .../Tools/Intelligence/EditPdfToolView.axaml | 100 - .../Intelligence/EditPdfToolView.axaml.cs | 11 - .../Tools/Intelligence/OcrPdfToolView.axaml | 315 -- .../Intelligence/OcrPdfToolView.axaml.cs | 11 - .../Tools/Intelligence/PdfFormsToolView.axaml | 136 - .../Intelligence/PdfFormsToolView.axaml.cs | 11 - .../Intelligence/TranslatePdfToolView.axaml | 150 - .../TranslatePdfToolView.axaml.cs | 11 - .../Tools/Organize/CropPdfToolView.axaml | 151 - .../Tools/Organize/CropPdfToolView.axaml.cs | 11 - .../Tools/Organize/MergePdfToolView.axaml | 166 - .../Tools/Organize/MergePdfToolView.axaml.cs | 11 - .../Tools/Organize/OrganizePdfToolView.axaml | 141 - .../Organize/OrganizePdfToolView.axaml.cs | 11 - .../Tools/Organize/PageNumbersToolView.axaml | 170 - .../Organize/PageNumbersToolView.axaml.cs | 11 - .../Tools/Organize/RotatePdfToolView.axaml | 196 - .../Tools/Organize/RotatePdfToolView.axaml.cs | 11 - .../Tools/Organize/SplitPdfToolView.axaml | 252 -- .../Tools/Organize/SplitPdfToolView.axaml.cs | 11 - .../Tools/Security/CompressPdfToolView.axaml | 328 -- .../Security/CompressPdfToolView.axaml.cs | 11 - .../Tools/Security/ProtectPdfToolView.axaml | 169 - .../Security/ProtectPdfToolView.axaml.cs | 11 - .../Tools/Security/RedactPdfToolView.axaml | 235 -- .../Tools/Security/RedactPdfToolView.axaml.cs | 89 - .../Tools/Security/RepairPdfToolView.axaml | 140 - .../Tools/Security/RepairPdfToolView.axaml.cs | 11 - .../Tools/Security/SignPdfToolView.axaml | 197 - .../Tools/Security/SignPdfToolView.axaml.cs | 11 - .../Tools/Security/UnlockPdfToolView.axaml | 146 - .../Tools/Security/UnlockPdfToolView.axaml.cs | 11 - .../Tools/Security/WatermarkToolView.axaml | 231 -- .../Tools/Security/WatermarkToolView.axaml.cs | 11 - .../Views/TrashCachePageView.axaml | 205 - .../Views/TrashCachePageView.axaml.cs | 11 - src/PdfEditorApp/app.manifest | 18 - test | 4 - tests/PdfEditorApp.Tests/AiServiceTests.cs | 1091 ------ .../BatchPdfGeneratorTests.cs | 222 -- .../BezierShapeAndLineEngineTests.cs | 410 -- .../CanvasEditingEngineTests.cs | 367 -- .../CollapseExpandWorkspaceTests.cs | 336 -- tests/PdfEditorApp.Tests/ConverterTests.cs | 250 -- .../DataMergeEngineTests.cs | 251 -- tests/PdfEditorApp.Tests/DataStudioTests.cs | 308 -- .../PdfEditorApp.Tests/DirectEditingTests.cs | 371 -- .../DocumentAuditServiceTests.cs | 140 - .../DocumentCompareServiceTests.cs | 124 - .../DocumentExportAndPersistenceTests.cs | 283 -- .../DocumentFileOperationsTests.cs | 302 -- .../DocumentMetadataTests.cs | 165 - .../DynamicToolRegistryTests.cs | 150 - .../EducationAndCheatSheetTemplateTests.cs | 239 -- .../EmployeePayslipBatchTests.cs | 95 - tests/PdfEditorApp.Tests/FontManagerTests.cs | 167 - tests/PdfEditorApp.Tests/FryPdfViewerTests.cs | 546 --- .../GestureAndNavigationTests.cs | 274 -- .../HeadlessCliRunnerTests.cs | 41 - tests/PdfEditorApp.Tests/HelpGuideTests.cs | 239 -- .../PdfEditorApp.Tests/HomeViewModelTests.cs | 237 -- .../PdfEditorApp.Tests/LicensingPageTests.cs | 218 -- .../Material3ExpressiveThemeTests.cs | 558 --- tests/PdfEditorApp.Tests/MathEngineTests.cs | 372 -- .../MicrokernelPillarsTests.cs | 287 -- .../Mocks/MockRecentDocumentsService.cs | 38 - tests/PdfEditorApp.Tests/OcrEngineTests.cs | 315 -- .../OverlayExtensibilityTests.cs | 218 -- .../PageOrganizerServiceTests.cs | 196 - .../PdfDeconstructionEngineTests.cs | 213 -- .../PdfEditorApp.Tests.csproj | 31 - tests/PdfEditorApp.Tests/PdfEngineTests.cs | 2044 ---------- .../PdfImportAndViewerTests.cs | 1219 ------ .../PdfLayoutAnalyzerTests.cs | 266 -- tests/PdfEditorApp.Tests/PdfReaderTests.cs | 695 ---- .../PdfToolViewModelsTests.cs | 405 -- .../PdfToolsServiceTests.cs | 955 ----- tests/PdfEditorApp.Tests/PipelineTests.cs | 163 - .../PluginAssemblyLoaderTests.cs | 43 - .../PluginEcosystemTests.cs | 308 -- tests/PdfEditorApp.Tests/PluginKernelTests.cs | 361 -- .../PluginsManagerPageTests.cs | 245 -- .../PluginsStudioUiTests.cs | 158 - .../ProfileAndBundleTests.cs | 196 - .../RemotePluginMarketplaceTests.cs | 260 -- .../PdfEditorApp.Tests/RichTextEngineTests.cs | 459 --- .../SignatureAndFormsServiceTests.cs | 112 - .../PdfEditorApp.Tests/SmartPlacementTests.cs | 148 - .../SnakeMarketplaceIntegrationTests.cs | 147 - .../SnakeOverlayPluginTests.cs | 357 -- .../TesseractManagerTests.cs | 177 - .../TextSelectionAndOcrTests.cs | 230 -- tests/PdfEditorApp.Tests/ThemeServiceTests.cs | 337 -- .../Tools/Conversion/ExcelToPdfToolTests.cs | 60 - .../Tools/Conversion/HtmlToPdfToolTests.cs | 62 - .../Tools/Conversion/JpgToPdfToolTests.cs | 61 - .../Tools/Conversion/PdfToExcelToolTests.cs | 59 - .../Tools/Conversion/PdfToJpgToolTests.cs | 106 - .../Conversion/PdfToMarkdownToolTests.cs | 60 - .../Tools/Conversion/PdfToPdfAToolTests.cs | 59 - .../Conversion/PdfToPowerPointToolTests.cs | 59 - .../Tools/Conversion/PdfToWordToolTests.cs | 86 - .../Conversion/PowerPointToPdfToolTests.cs | 60 - .../Tools/Conversion/ScanToPdfToolTests.cs | 60 - .../Tools/Conversion/WordToPdfToolTests.cs | 60 - .../Tools/Core/ToolTestFixture.cs | 208 -- .../Intelligence/AiSummarizerToolTests.cs | 59 - .../Tools/Intelligence/ComparePdfToolTests.cs | 96 - .../Tools/Intelligence/EditPdfToolTests.cs | 76 - .../Tools/Intelligence/OcrPdfToolTests.cs | 131 - .../Tools/Intelligence/PdfFormsToolTests.cs | 60 - .../Intelligence/TranslatePdfToolTests.cs | 87 - .../Tools/Organize/CropPdfToolTests.cs | 64 - .../Tools/Organize/MergePdfToolTests.cs | 212 -- .../Tools/Organize/OrganizePdfToolTests.cs | 88 - .../Tools/Organize/PageNumbersToolTests.cs | 60 - .../Tools/Organize/RotatePdfToolTests.cs | 90 - .../Tools/Organize/SplitPdfToolTests.cs | 88 - .../Tools/Security/CompressPdfToolTests.cs | 125 - .../Tools/Security/ProtectPdfToolTests.cs | 106 - .../Tools/Security/QuestPdfOperationsTests.cs | 264 -- .../Tools/Security/RedactPdfToolTests.cs | 423 --- .../Tools/Security/RepairPdfToolTests.cs | 58 - .../Tools/Security/SignPdfToolTests.cs | 62 - .../Tools/Security/UnlockPdfToolTests.cs | 59 - .../Tools/Security/WatermarkToolTests.cs | 63 - .../TotalMicrokernelTests.cs | 369 -- .../TypographyAndTextEngineTests.cs | 709 ---- tests/PdfEditorApp.Tests/UiSettingsTests.cs | 425 --- watch | 5 - 724 files changed, 160991 deletions(-) delete mode 100644 .agents/AGENTS.md delete mode 100644 .agents/rules/m3_expressive_ui_mandate.md delete mode 100644 .agents/rules/performance_and_zero_lag_mandate.md delete mode 100644 .agents/rules/plugin_pattern_mandate.md delete mode 100644 .agents/skills/avalonia/DETAILED_SUMMARY.md delete mode 100644 .agents/skills/avalonia/REFACTORING_SUMMARY.md delete mode 100644 .agents/skills/avalonia/SKILL.md delete mode 100644 .agents/skills/avalonia/resources/controls-reference.md delete mode 100644 .agents/skills/avalonia/resources/custom-controls-advanced.md delete mode 100644 .agents/skills/avalonia/resources/mvvm-databinding.md delete mode 100644 .agents/skills/avalonia/resources/platform-specific.md delete mode 100644 .agents/skills/avalonia/resources/reactive-animations.md delete mode 100644 .agents/skills/avalonia/resources/styling-guide.md delete mode 100644 .cursorrules delete mode 100644 .github/workflows/release.yml delete mode 100644 .gitignore delete mode 100644 .vscode/launch.json delete mode 100644 .vscode/tasks.json delete mode 120000 AGENTS.md delete mode 100644 Bug/PDF_VIEWER_CONTINUOUS_SCROLL_RENDERING_BUG.md delete mode 100644 Bug/README.md delete mode 100644 CLAUDE.md delete mode 100644 GEMINI.md delete mode 100644 LICENSE delete mode 100644 PdfEditorApp.slnx delete mode 100644 README.md delete mode 100644 docs/ARCHITECTURE.md delete mode 100644 docs/CONTRIBUTING.md delete mode 100644 docs/EXTERNAL_PLUGIN_DEVELOPMENT_GUIDE.md delete mode 100644 docs/FEATURES.md delete mode 100644 docs/MATERIAL_DESIGN_3_EXPRESSIVE_GUIDELINES.md delete mode 100644 docs/PDF_DECONSTRUCTION_AND_EDITING.md delete mode 100644 docs/PLUGIN_BASED_ARCHITECTURE.md delete mode 100644 docs/THIRD_PARTY_LICENSES.md delete mode 100644 docs/TIC_TAC_TOE_EXAMPLE.md delete mode 100644 docs/assets/Frame 23.svg delete mode 100644 docs/assets/Frame 24.svg delete mode 100644 docs/assets/Frame 26.svg delete mode 100644 docs/assets/oldlogo.png delete mode 100644 docs/examples/ScratchpadPlugin/README.md delete mode 100644 docs/examples/ScratchpadPlugin/ScratchpadPlugin.cs delete mode 100644 docs/examples/ScratchpadPlugin/ScratchpadPlugin.csproj delete mode 100644 docs/examples/ScratchpadPlugin/ScratchpadView.axaml delete mode 100644 docs/examples/ScratchpadPlugin/ScratchpadView.axaml.cs delete mode 100644 docs/examples/ScratchpadPlugin/ScratchpadViewModel.cs delete mode 100644 docs/examples/ScratchpadPlugin/plugin.json delete mode 100644 docs/examples/SnakePlugin/README.md delete mode 100644 docs/examples/SnakePlugin/SnakeCanvasControl.cs delete mode 100644 docs/examples/SnakePlugin/SnakeGamePlugin.cs delete mode 100644 docs/examples/SnakePlugin/SnakeGameView.axaml delete mode 100644 docs/examples/SnakePlugin/SnakeGameView.axaml.cs delete mode 100644 docs/examples/SnakePlugin/SnakeGameViewModel.cs delete mode 100644 docs/examples/SnakePlugin/SnakePlugin.csproj delete mode 100644 docs/examples/SnakePlugin/plugin.json delete mode 100644 docs/examples/TelemetryPlugin/DocumentTelemetryPlugin.cs delete mode 100644 docs/examples/TelemetryPlugin/DocumentTelemetryView.axaml delete mode 100644 docs/examples/TelemetryPlugin/DocumentTelemetryView.axaml.cs delete mode 100644 docs/examples/TelemetryPlugin/DocumentTelemetryViewModel.cs delete mode 100644 docs/examples/TelemetryPlugin/README.md delete mode 100644 docs/examples/TelemetryPlugin/TelemetryPlugin.csproj delete mode 100644 docs/examples/TelemetryPlugin/plugin.json delete mode 100644 docs/examples/TicTacToePlugin/README.md delete mode 100644 docs/examples/TicTacToePlugin/TicTacToePlugin.cs delete mode 100644 docs/examples/TicTacToePlugin/TicTacToePlugin.csproj delete mode 100644 docs/examples/TicTacToePlugin/TicTacToeView.axaml delete mode 100644 docs/examples/TicTacToePlugin/TicTacToeView.axaml.cs delete mode 100644 docs/examples/TicTacToePlugin/TicTacToeViewModel.cs delete mode 100644 docs/examples/TicTacToePlugin/plugin.json delete mode 100644 packaging/macos/AppIcon.icns delete mode 100644 packaging/macos/AppIcon.iconset/icon_128x128.png delete mode 100644 packaging/macos/AppIcon.iconset/icon_128x128@2x.png delete mode 100644 packaging/macos/AppIcon.iconset/icon_16x16.png delete mode 100644 packaging/macos/AppIcon.iconset/icon_16x16@2x.png delete mode 100644 packaging/macos/AppIcon.iconset/icon_256x256.png delete mode 100644 packaging/macos/AppIcon.iconset/icon_256x256@2x.png delete mode 100644 packaging/macos/AppIcon.iconset/icon_32x32.png delete mode 100644 packaging/macos/AppIcon.iconset/icon_32x32@2x.png delete mode 100644 packaging/macos/AppIcon.iconset/icon_512x512.png delete mode 100644 packaging/macos/AppIcon.iconset/icon_512x512@2x.png delete mode 100644 packaging/macos/Info.plist.template delete mode 100644 packaging/windows/app.ico delete mode 100644 packaging/windows/installer.iss delete mode 100644 packaging/windows/msix/AppxManifest.xml.template delete mode 100644 packaging/windows/msix/Assets/SplashScreen.png delete mode 100644 packaging/windows/msix/Assets/Square150x150Logo.png delete mode 100644 packaging/windows/msix/Assets/Square310x310Logo.png delete mode 100644 packaging/windows/msix/Assets/Square44x44Logo.png delete mode 100644 packaging/windows/msix/Assets/Square44x44Logo.targetsize-24_altform-unplated.png delete mode 100644 packaging/windows/msix/Assets/Square44x44Logo.targetsize-256_altform-unplated.png delete mode 100644 packaging/windows/msix/Assets/Square44x44Logo.targetsize-48_altform-unplated.png delete mode 100644 packaging/windows/msix/Assets/Square71x71Logo.png delete mode 100644 packaging/windows/msix/Assets/StoreLogo.png delete mode 100644 packaging/windows/msix/Assets/Wide310x150Logo.png delete mode 100644 packaging/windows/msix/build-msix.ps1 delete mode 100644 profiles/desktop.profile.json delete mode 100644 profiles/headless.profile.json delete mode 100755 run delete mode 100644 src/PdfEditorApp.Core/Analysis/LiveChartsRenderer.cs delete mode 100644 src/PdfEditorApp.Core/Analysis/PdfLayoutAnalyzer.cs delete mode 100644 src/PdfEditorApp.Core/Analysis/TableGridDetector.cs delete mode 100644 src/PdfEditorApp.Core/Analysis/UnicodeScriptDetector.cs delete mode 100644 src/PdfEditorApp.Core/Data/BatchMergeModels.cs delete mode 100644 src/PdfEditorApp.Core/Data/DataBindingService.cs delete mode 100644 src/PdfEditorApp.Core/Data/DataMatrix.cs delete mode 100644 src/PdfEditorApp.Core/Data/DataMergeEngine.cs delete mode 100644 src/PdfEditorApp.Core/Data/DataSourceService.cs delete mode 100644 src/PdfEditorApp.Core/Data/IBatchPdfGenerator.cs delete mode 100644 src/PdfEditorApp.Core/Data/IDataBindingService.cs delete mode 100644 src/PdfEditorApp.Core/Data/IDataMergeEngine.cs delete mode 100644 src/PdfEditorApp.Core/Data/IDataSourceService.cs delete mode 100644 src/PdfEditorApp.Core/Deconstruction/Extractors/PdfFormExtractor.cs delete mode 100644 src/PdfEditorApp.Core/Deconstruction/Extractors/PdfImageExtractor.cs delete mode 100644 src/PdfEditorApp.Core/Deconstruction/Extractors/PdfTextExtractor.cs delete mode 100644 src/PdfEditorApp.Core/Deconstruction/Extractors/PdfVectorExtractor.cs delete mode 100644 src/PdfEditorApp.Core/Deconstruction/PdfDeconstructionEngine.cs delete mode 100644 src/PdfEditorApp.Core/Deconstruction/PdfDeconstructionOptions.cs delete mode 100644 src/PdfEditorApp.Core/Deconstruction/Utils/CmykColorConverter.cs delete mode 100644 src/PdfEditorApp.Core/Deconstruction/Utils/ColorContrastHelper.cs delete mode 100644 src/PdfEditorApp.Core/Deconstruction/Utils/PdfColorHelper.cs delete mode 100644 src/PdfEditorApp.Core/Deconstruction/Utils/SvgPathBuilder.cs delete mode 100644 src/PdfEditorApp.Core/Models/AiModels.cs delete mode 100644 src/PdfEditorApp.Core/Models/CommandPaletteItem.cs delete mode 100644 src/PdfEditorApp.Core/Models/CommentItem.cs delete mode 100644 src/PdfEditorApp.Core/Models/Elements/DynamicElementJsonResolver.cs delete mode 100644 src/PdfEditorApp.Core/Models/Elements/PdfBarcodeElement.cs delete mode 100644 src/PdfEditorApp.Core/Models/Elements/PdfChartElement.cs delete mode 100644 src/PdfEditorApp.Core/Models/Elements/PdfDividerElement.cs delete mode 100644 src/PdfEditorApp.Core/Models/Elements/PdfElementBase.cs delete mode 100644 src/PdfEditorApp.Core/Models/Elements/PdfFormFieldElement.cs delete mode 100644 src/PdfEditorApp.Core/Models/Elements/PdfImageElement.cs delete mode 100644 src/PdfEditorApp.Core/Models/Elements/PdfInkElement.cs delete mode 100644 src/PdfEditorApp.Core/Models/Elements/PdfMathElement.cs delete mode 100644 src/PdfEditorApp.Core/Models/Elements/PdfMeasurementElement.cs delete mode 100644 src/PdfEditorApp.Core/Models/Elements/PdfQrCodeElement.cs delete mode 100644 src/PdfEditorApp.Core/Models/Elements/PdfRedactionElement.cs delete mode 100644 src/PdfEditorApp.Core/Models/Elements/PdfShapeElement.cs delete mode 100644 src/PdfEditorApp.Core/Models/Elements/PdfStickyNoteElement.cs delete mode 100644 src/PdfEditorApp.Core/Models/Elements/PdfSvgElement.cs delete mode 100644 src/PdfEditorApp.Core/Models/Elements/PdfTableElement.cs delete mode 100644 src/PdfEditorApp.Core/Models/Elements/PdfTextElement.cs delete mode 100644 src/PdfEditorApp.Core/Models/Elements/PdfTextSpan.cs delete mode 100644 src/PdfEditorApp.Core/Models/Elements/PdfWatermarkElement.cs delete mode 100644 src/PdfEditorApp.Core/Models/Enums.cs delete mode 100644 src/PdfEditorApp.Core/Models/FontPackageModels.cs delete mode 100644 src/PdfEditorApp.Core/Models/OcrModels.cs delete mode 100644 src/PdfEditorApp.Core/Models/OutlineItem.cs delete mode 100644 src/PdfEditorApp.Core/Models/PdfDocumentModel.cs delete mode 100644 src/PdfEditorApp.Core/Models/PdfPageModel.cs delete mode 100644 src/PdfEditorApp.Core/Models/PdfSecuritySettings.cs delete mode 100644 src/PdfEditorApp.Core/PdfEditorApp.Core.csproj delete mode 100644 src/PdfEditorApp.Core/Plugins/Descriptors/CanvasElementDescriptor.cs delete mode 100644 src/PdfEditorApp.Core/Plugins/Descriptors/ICanvasElementRegistry.cs delete mode 100644 src/PdfEditorApp.Core/Plugins/Descriptors/ICommandPaletteRegistry.cs delete mode 100644 src/PdfEditorApp.Core/Plugins/Descriptors/IDataConnectorRegistry.cs delete mode 100644 src/PdfEditorApp.Core/Plugins/Descriptors/IDialogRegistry.cs delete mode 100644 src/PdfEditorApp.Core/Plugins/Descriptors/IDocumentExporterRegistry.cs delete mode 100644 src/PdfEditorApp.Core/Plugins/Descriptors/IDocumentImporterRegistry.cs delete mode 100644 src/PdfEditorApp.Core/Plugins/Descriptors/IInspectorRegistry.cs delete mode 100644 src/PdfEditorApp.Core/Plugins/Descriptors/INavigationRegistry.cs delete mode 100644 src/PdfEditorApp.Core/Plugins/Descriptors/IOcrEngineRegistry.cs delete mode 100644 src/PdfEditorApp.Core/Plugins/Descriptors/IOverlayRegistry.cs delete mode 100644 src/PdfEditorApp.Core/Plugins/Descriptors/IRibbonRegistry.cs delete mode 100644 src/PdfEditorApp.Core/Plugins/Descriptors/ISidebarRegistry.cs delete mode 100644 src/PdfEditorApp.Core/Plugins/Descriptors/IStatusBarRegistry.cs delete mode 100644 src/PdfEditorApp.Core/Plugins/Descriptors/ITemplateRegistry.cs delete mode 100644 src/PdfEditorApp.Core/Plugins/Descriptors/OverlayDescriptor.cs delete mode 100644 src/PdfEditorApp.Core/Plugins/Descriptors/PdfToolDescriptor.cs delete mode 100644 src/PdfEditorApp.Core/Plugins/Descriptors/RibbonActionDescriptor.cs delete mode 100644 src/PdfEditorApp.Core/Plugins/FryPluginContext.cs delete mode 100644 src/PdfEditorApp.Core/Plugins/IFryPlugin.cs delete mode 100644 src/PdfEditorApp.Core/Plugins/IFryPluginContext.cs delete mode 100644 src/PdfEditorApp.Core/Plugins/Manifests/PluginManifest.cs delete mode 100644 src/PdfEditorApp.Core/Plugins/Marketplace/FileInstalledPluginStore.cs delete mode 100644 src/PdfEditorApp.Core/Plugins/Marketplace/IInstalledPluginStore.cs delete mode 100644 src/PdfEditorApp.Core/Plugins/Marketplace/IPluginMarketplaceService.cs delete mode 100644 src/PdfEditorApp.Core/Plugins/Marketplace/InstalledPluginRecord.cs delete mode 100644 src/PdfEditorApp.Core/Plugins/Marketplace/MarketplacePluginItem.cs delete mode 100644 src/PdfEditorApp.Core/Plugins/Pipelines/DocumentPipelineContexts.cs delete mode 100644 src/PdfEditorApp.Core/Plugins/Pipelines/IPipelineManager.cs delete mode 100644 src/PdfEditorApp.Core/Plugins/Pipelines/PipelineManager.cs delete mode 100644 src/PdfEditorApp.Core/Plugins/PluginExceptions.cs delete mode 100644 src/PdfEditorApp.Core/Plugins/PluginHost.cs delete mode 100644 src/PdfEditorApp.Core/Plugins/PluginScope.cs delete mode 100644 src/PdfEditorApp.Core/Plugins/Profiles/IFryPluginBundle.cs delete mode 100644 src/PdfEditorApp.Core/Plugins/Profiles/PluginProfile.cs delete mode 100644 src/PdfEditorApp.Core/Plugins/Profiles/ProfileLoader.cs delete mode 100644 src/PdfEditorApp.Core/Plugins/Settings/IPluginSettingsStore.cs delete mode 100644 src/PdfEditorApp.Core/QuestPdfInitializer.cs delete mode 100644 src/PdfEditorApp.Core/Services/IFontPackageService.cs delete mode 100644 src/PdfEditorApp.Core/Utils/FryPdfEmbeddingHelper.cs delete mode 100644 src/PdfEditorApp.Core/Utils/PdfDocumentSanitizer.cs delete mode 100644 src/PdfEditorApp/App.axaml delete mode 100644 src/PdfEditorApp/App.axaml.cs delete mode 100644 src/PdfEditorApp/Assets/Fonts/BebasNeue.ttf delete mode 100644 src/PdfEditorApp/Assets/Fonts/Caveat.ttf delete mode 100644 src/PdfEditorApp/Assets/Fonts/Cinzel.ttf delete mode 100644 src/PdfEditorApp/Assets/Fonts/ComicNeue.ttf delete mode 100644 src/PdfEditorApp/Assets/Fonts/DancingScript.ttf delete mode 100644 src/PdfEditorApp/Assets/Fonts/FiraCode.ttf delete mode 100644 src/PdfEditorApp/Assets/Fonts/GreatVibes.ttf delete mode 100644 src/PdfEditorApp/Assets/Fonts/Inter.ttf delete mode 100644 src/PdfEditorApp/Assets/Fonts/Lobster.ttf delete mode 100644 src/PdfEditorApp/Assets/Fonts/Lora.ttf delete mode 100644 src/PdfEditorApp/Assets/Fonts/Merriweather.ttf delete mode 100644 src/PdfEditorApp/Assets/Fonts/Montserrat.ttf delete mode 100644 src/PdfEditorApp/Assets/Fonts/NotoSans.ttf delete mode 100644 src/PdfEditorApp/Assets/Fonts/OpenSans.ttf delete mode 100644 src/PdfEditorApp/Assets/Fonts/Orbitron.ttf delete mode 100644 src/PdfEditorApp/Assets/Fonts/Oswald.ttf delete mode 100644 src/PdfEditorApp/Assets/Fonts/Pacifico.ttf delete mode 100644 src/PdfEditorApp/Assets/Fonts/PlayfairDisplay.ttf delete mode 100644 src/PdfEditorApp/Assets/Fonts/Roboto.ttf delete mode 100644 src/PdfEditorApp/Assets/Fonts/RobotoMono.ttf delete mode 100644 src/PdfEditorApp/Assets/Fonts/SourceSans3.ttf delete mode 100644 src/PdfEditorApp/Assets/IconCodefrydev.svg delete mode 100644 src/PdfEditorApp/Assets/app-logo.ico delete mode 100644 src/PdfEditorApp/Assets/app-logo.png delete mode 100644 src/PdfEditorApp/Assets/app-logo.svg delete mode 100644 src/PdfEditorApp/Converters/CommonConverters.cs delete mode 100644 src/PdfEditorApp/Converters/ExtendedConverters.cs delete mode 100644 src/PdfEditorApp/Converters/HexToBrushConverter.cs delete mode 100644 src/PdfEditorApp/Messages/ShellMessages.cs delete mode 100644 src/PdfEditorApp/Models/AiChatMessage.cs delete mode 100644 src/PdfEditorApp/Models/AiChatSession.cs delete mode 100644 src/PdfEditorApp/Models/AiSettingsModel.cs delete mode 100644 src/PdfEditorApp/Models/DocumentComparisonModels.cs delete mode 100644 src/PdfEditorApp/Models/HelpGuideItem.cs delete mode 100644 src/PdfEditorApp/Models/PdfFilePreviewItem.cs delete mode 100644 src/PdfEditorApp/Models/PdfPagePreviewThumbnail.cs delete mode 100644 src/PdfEditorApp/Models/PdfToolModels.cs delete mode 100644 src/PdfEditorApp/Models/PdfToolPreviewPage.cs delete mode 100644 src/PdfEditorApp/Models/RecentDocumentItem.cs delete mode 100644 src/PdfEditorApp/Models/ThirdPartyToolLicense.cs delete mode 100644 src/PdfEditorApp/Models/UiSettingsModel.cs delete mode 100644 src/PdfEditorApp/Models/WorkflowModels.cs delete mode 100644 src/PdfEditorApp/PdfEditorApp.csproj delete mode 100644 src/PdfEditorApp/Plugins/Bundles/AiProvidersBundle.cs delete mode 100644 src/PdfEditorApp/Plugins/Bundles/CanvasElementsBundle.cs delete mode 100644 src/PdfEditorApp/Plugins/Bundles/CommandPaletteBundle.cs delete mode 100644 src/PdfEditorApp/Plugins/Bundles/DataStudioBundle.cs delete mode 100644 src/PdfEditorApp/Plugins/Bundles/DialogsBundle.cs delete mode 100644 src/PdfEditorApp/Plugins/Bundles/DocumentIoBundle.cs delete mode 100644 src/PdfEditorApp/Plugins/Bundles/EditorSidebarsBundle.cs delete mode 100644 src/PdfEditorApp/Plugins/Bundles/InspectorBundle.cs delete mode 100644 src/PdfEditorApp/Plugins/Bundles/OcrEnginesBundle.cs delete mode 100644 src/PdfEditorApp/Plugins/Bundles/ShellOverlaysBundle.cs delete mode 100644 src/PdfEditorApp/Plugins/Bundles/StandardTemplatesBundle.cs delete mode 100644 src/PdfEditorApp/Plugins/Bundles/StatusBarBundle.cs delete mode 100644 src/PdfEditorApp/Plugins/Bundles/ToolsConversionBundle.cs delete mode 100644 src/PdfEditorApp/Plugins/Bundles/ToolsIntelligenceBundle.cs delete mode 100644 src/PdfEditorApp/Plugins/Bundles/ToolsOrganizeBundle.cs delete mode 100644 src/PdfEditorApp/Plugins/Bundles/ToolsSecurityBundle.cs delete mode 100644 src/PdfEditorApp/Plugins/Bundles/WorkspacePagesBundle.cs delete mode 100644 src/PdfEditorApp/Plugins/Cli/HeadlessCliRunner.cs delete mode 100644 src/PdfEditorApp/Plugins/Loader/FryPluginPackageLoader.cs delete mode 100644 src/PdfEditorApp/Plugins/Loader/PluginAssemblyLoader.cs delete mode 100644 src/PdfEditorApp/Plugins/ToolPluginBase.cs delete mode 100644 src/PdfEditorApp/Program.cs delete mode 100644 src/PdfEditorApp/Services/AI/AiProviderRegistry.cs delete mode 100644 src/PdfEditorApp/Services/AI/AiService.cs delete mode 100644 src/PdfEditorApp/Services/AI/IAiProviderRegistry.cs delete mode 100644 src/PdfEditorApp/Services/AI/IAiService.cs delete mode 100644 src/PdfEditorApp/Services/AI/IPdfStudioAgentService.cs delete mode 100644 src/PdfEditorApp/Services/AI/PdfStudioAgentService.cs delete mode 100644 src/PdfEditorApp/Services/AI/Providers/GroqAiProvider.cs delete mode 100644 src/PdfEditorApp/Services/AI/Providers/OllamaAiProvider.cs delete mode 100644 src/PdfEditorApp/Services/AI/Providers/OpenAiProvider.cs delete mode 100644 src/PdfEditorApp/Services/BatchPdfGeneratorService.cs delete mode 100644 src/PdfEditorApp/Services/Canvas/CanvasElementRegistry.cs delete mode 100644 src/PdfEditorApp/Services/Data/DataConnectorRegistry.cs delete mode 100644 src/PdfEditorApp/Services/Dialogs/DialogRegistry.cs delete mode 100644 src/PdfEditorApp/Services/DocumentAuditService.cs delete mode 100644 src/PdfEditorApp/Services/DocumentCompareService.cs delete mode 100644 src/PdfEditorApp/Services/Export/DocumentExporterRegistry.cs delete mode 100644 src/PdfEditorApp/Services/FileOperationHelper.cs delete mode 100644 src/PdfEditorApp/Services/FontHelper.cs delete mode 100644 src/PdfEditorApp/Services/FontPackageService.cs delete mode 100644 src/PdfEditorApp/Services/FryPdfDocument.cs delete mode 100644 src/PdfEditorApp/Services/HelpGuideService.cs delete mode 100644 src/PdfEditorApp/Services/IHelpGuideService.cs delete mode 100644 src/PdfEditorApp/Services/IPdfDocumentOperationsService.cs delete mode 100644 src/PdfEditorApp/Services/IPdfExportService.cs delete mode 100644 src/PdfEditorApp/Services/IRecentDocumentsService.cs delete mode 100644 src/PdfEditorApp/Services/ISmartPlacementService.cs delete mode 100644 src/PdfEditorApp/Services/ITemplateService.cs delete mode 100644 src/PdfEditorApp/Services/IUiSettingsService.cs delete mode 100644 src/PdfEditorApp/Services/Import/DocumentImporterRegistry.cs delete mode 100644 src/PdfEditorApp/Services/Inspector/InspectorRegistry.cs delete mode 100644 src/PdfEditorApp/Services/Math/MathLayoutEngine.cs delete mode 100644 src/PdfEditorApp/Services/Math/MathPresetsLibrary.cs delete mode 100644 src/PdfEditorApp/Services/Navigation/NavigationRegistry.cs delete mode 100644 src/PdfEditorApp/Services/Ocr/AppleVisionOcrEngine.cs delete mode 100644 src/PdfEditorApp/Services/Ocr/CompositeOcrProvider.cs delete mode 100644 src/PdfEditorApp/Services/Ocr/OcrEngineRegistry.cs delete mode 100644 src/PdfEditorApp/Services/Ocr/TesseractModelService.cs delete mode 100644 src/PdfEditorApp/Services/Ocr/TesseractOcrEngine.cs delete mode 100644 src/PdfEditorApp/Services/Ocr/WindowsMediaOcrEngine.cs delete mode 100644 src/PdfEditorApp/Services/Overlays/OverlayRegistry.cs delete mode 100644 src/PdfEditorApp/Services/PageOrganizerService.cs delete mode 100644 src/PdfEditorApp/Services/Palette/CommandPaletteRegistry.cs delete mode 100644 src/PdfEditorApp/Services/PdfDocumentOperationsService.cs delete mode 100644 src/PdfEditorApp/Services/PdfExportService.cs delete mode 100644 src/PdfEditorApp/Services/PdfImportService.cs delete mode 100644 src/PdfEditorApp/Services/Plugins/PluginMarketplaceService.cs delete mode 100644 src/PdfEditorApp/Services/ProjectPersistenceService.cs delete mode 100644 src/PdfEditorApp/Services/QrCodeHelper.cs delete mode 100644 src/PdfEditorApp/Services/RecentDocumentsService.cs delete mode 100644 src/PdfEditorApp/Services/Ribbon/RibbonRegistry.cs delete mode 100644 src/PdfEditorApp/Services/Sidebar/SidebarRegistry.cs delete mode 100644 src/PdfEditorApp/Services/SignatureService.cs delete mode 100644 src/PdfEditorApp/Services/SmartPlacementService.cs delete mode 100644 src/PdfEditorApp/Services/StatusBar/StatusBarRegistry.cs delete mode 100644 src/PdfEditorApp/Services/SvgOrnamentLibrary.cs delete mode 100644 src/PdfEditorApp/Services/SvgShapeHelper.cs delete mode 100644 src/PdfEditorApp/Services/TemplateService.cs delete mode 100644 src/PdfEditorApp/Services/ThemeService.cs delete mode 100644 src/PdfEditorApp/Services/Tools/Conversion/PdfConversionService.cs delete mode 100644 src/PdfEditorApp/Services/Tools/Core/IPdfToolViewModelFactory.cs delete mode 100644 src/PdfEditorApp/Services/Tools/Core/PdfFileHelper.cs delete mode 100644 src/PdfEditorApp/Services/Tools/Core/PdfPageRenderer.cs delete mode 100644 src/PdfEditorApp/Services/Tools/Core/PdfToolRegistry.cs delete mode 100644 src/PdfEditorApp/Services/Tools/Core/PdfToolViewModelFactory.cs delete mode 100644 src/PdfEditorApp/Services/Tools/Core/PdfWorkflowEngine.cs delete mode 100644 src/PdfEditorApp/Services/Tools/Intelligence/AiDocumentService.cs delete mode 100644 src/PdfEditorApp/Services/Tools/Intelligence/DocumentTranslationService.cs delete mode 100644 src/PdfEditorApp/Services/Tools/Intelligence/PdfFormService.cs delete mode 100644 src/PdfEditorApp/Services/Tools/Intelligence/PdfOcrService.cs delete mode 100644 src/PdfEditorApp/Services/Tools/Organize/PdfPageService.cs delete mode 100644 src/PdfEditorApp/Services/Tools/Security/PdfOptimizationService.cs delete mode 100644 src/PdfEditorApp/Services/Tools/Security/PdfSecurityService.cs delete mode 100644 src/PdfEditorApp/Services/Tools/Security/QuestPdfOperationsEngine.cs delete mode 100644 src/PdfEditorApp/Services/Typography/RichTextHelper.cs delete mode 100644 src/PdfEditorApp/Services/Typography/TextLayoutEngine.cs delete mode 100644 src/PdfEditorApp/Services/UiSettingsService.cs delete mode 100644 src/PdfEditorApp/Services/UndoRedoService.cs delete mode 100644 src/PdfEditorApp/Styles/FluentOfficeStyles.axaml delete mode 100644 src/PdfEditorApp/Styles/Material3ExpressiveStyles.axaml delete mode 100644 src/PdfEditorApp/Styles/Material3ExpressiveTokens.axaml delete mode 100644 src/PdfEditorApp/Templates/Academic/AcademicPaperTemplate.cs delete mode 100644 src/PdfEditorApp/Templates/Academic/HistoryResearchPaperTemplate.cs delete mode 100644 src/PdfEditorApp/Templates/Academic/MathResearchPaperTemplate.cs delete mode 100644 src/PdfEditorApp/Templates/Academic/PhysicsResearchPaperTemplate.cs delete mode 100644 src/PdfEditorApp/Templates/Career/ResumeAcademicCvTemplate.cs delete mode 100644 src/PdfEditorApp/Templates/Career/ResumeCreativeMinimalistTemplate.cs delete mode 100644 src/PdfEditorApp/Templates/Career/ResumeModernCleanTemplate.cs delete mode 100644 src/PdfEditorApp/Templates/Career/ResumeTemplate.cs delete mode 100644 src/PdfEditorApp/Templates/Certificates/CertificateNavyGoldTemplate.cs delete mode 100644 src/PdfEditorApp/Templates/Certificates/CertificateTemplate.cs delete mode 100644 src/PdfEditorApp/Templates/Certificates/DiplomaAcademicTemplate.cs delete mode 100644 src/PdfEditorApp/Templates/Corporate/AnnualReportTemplate.cs delete mode 100644 src/PdfEditorApp/Templates/Corporate/EmployeePayslipTemplate.cs delete mode 100644 src/PdfEditorApp/Templates/Corporate/InteractiveExecutiveBriefTemplate.cs delete mode 100644 src/PdfEditorApp/Templates/Corporate/OcrAnalysisReportTemplate.cs delete mode 100644 src/PdfEditorApp/Templates/Education/BilingualExamPaperTemplate.cs delete mode 100644 src/PdfEditorApp/Templates/Education/FactorizationWorksheetTemplate.cs delete mode 100644 src/PdfEditorApp/Templates/Education/MathBODMASWorksheetTemplate.cs delete mode 100644 src/PdfEditorApp/Templates/Education/QuadrilateralsGuideTemplate.cs delete mode 100644 src/PdfEditorApp/Templates/Education/StatesOfMatterDiagramNotesTemplate.cs delete mode 100644 src/PdfEditorApp/Templates/Events/CreativeTypographyShowcaseTemplate.cs delete mode 100644 src/PdfEditorApp/Templates/Events/GalaInvitationTemplate.cs delete mode 100644 src/PdfEditorApp/Templates/Events/WeddingInvitationRoyalFloralTemplate.cs delete mode 100644 src/PdfEditorApp/Templates/Events/WeddingInvitationTraditionalTemplate.cs delete mode 100644 src/PdfEditorApp/Templates/Finance/FinanceResearchPaperTemplate.cs delete mode 100644 src/PdfEditorApp/Templates/Finance/InvoiceTemplate.cs delete mode 100644 src/PdfEditorApp/Templates/General/BlankDocumentTemplate.cs delete mode 100644 src/PdfEditorApp/Templates/General/RichTextPublishingShowcaseTemplate.cs delete mode 100644 src/PdfEditorApp/Templates/ITemplateDefinition.cs delete mode 100644 src/PdfEditorApp/Templates/Technical/ArduinoCheatSheetTemplate.cs delete mode 100644 src/PdfEditorApp/ViewLocator.cs delete mode 100644 src/PdfEditorApp/ViewModels/AiAssistantViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/AiSettingsViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/BatchGeneration/BatchGenerationViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/DataStudio/DataStudioViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/DynamicInspectorSectionViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/DynamicRibbonGroupViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/DynamicRibbonTabViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/DynamicSidebarTabViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/ElementViewModels/BarcodeElementViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/ElementViewModels/ChartElementViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/ElementViewModels/DividerElementViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/ElementViewModels/ElementViewModelBase.cs delete mode 100644 src/PdfEditorApp/ViewModels/ElementViewModels/FormFieldElementViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/ElementViewModels/ImageElementViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/ElementViewModels/InkElementViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/ElementViewModels/MathElementViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/ElementViewModels/MeasurementElementViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/ElementViewModels/QrCodeElementViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/ElementViewModels/RedactionElementViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/ElementViewModels/ShapeElementViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/ElementViewModels/StickyNoteElementViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/ElementViewModels/SvgElementViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/ElementViewModels/TableElementViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/ElementViewModels/TextElementViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/ElementViewModels/WatermarkElementViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/FontManagerViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/FryPdfViewer/FryPdfPageViewerViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/FryPdfViewer/FryPdfViewerViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/FryPdfViewer/InteractiveChartViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/FryPdfViewer/InteractiveTableViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/HelpGuideViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/HomeViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/InspectorViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/MainViewModel.Elements.cs delete mode 100644 src/PdfEditorApp/ViewModels/MainViewModel.Pages.cs delete mode 100644 src/PdfEditorApp/ViewModels/MainViewModel.Palette.cs delete mode 100644 src/PdfEditorApp/ViewModels/MainViewModel.Persistence.cs delete mode 100644 src/PdfEditorApp/ViewModels/MainViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/NavigationItemViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/OverlayInstanceViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/PageViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/PdfToolCardViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/PdfToolRunnerViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/PdfViewerModels.cs delete mode 100644 src/PdfEditorApp/ViewModels/PdfViewerViewModel.Annotations.cs delete mode 100644 src/PdfEditorApp/ViewModels/PdfViewerViewModel.Document.cs delete mode 100644 src/PdfEditorApp/ViewModels/PdfViewerViewModel.Navigation.cs delete mode 100644 src/PdfEditorApp/ViewModels/PdfViewerViewModel.Rendering.cs delete mode 100644 src/PdfEditorApp/ViewModels/PdfViewerViewModel.Search.cs delete mode 100644 src/PdfEditorApp/ViewModels/PdfViewerViewModel.Selection.cs delete mode 100644 src/PdfEditorApp/ViewModels/PdfViewerViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/PluginItemViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/PluginSettingItemViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/PluginsManagerDetailViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/PluginsManagerViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/SettingsViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/Shell/PdfLivePreviewViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/StatusBarWidgetViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/TemplateCardViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/TesseractManagerViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/Tools/Conversion/ExcelToPdfToolViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/Tools/Conversion/HtmlToPdfToolViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/Tools/Conversion/JpgToPdfToolViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/Tools/Conversion/PdfToExcelToolViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/Tools/Conversion/PdfToJpgToolViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/Tools/Conversion/PdfToMarkdownToolViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/Tools/Conversion/PdfToPdfAToolViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/Tools/Conversion/PdfToPowerPointToolViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/Tools/Conversion/PdfToWordToolViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/Tools/Conversion/PowerPointToPdfToolViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/Tools/Conversion/ScanToPdfToolViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/Tools/Conversion/WordToPdfToolViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/Tools/Core/PdfToolViewModelBase.cs delete mode 100644 src/PdfEditorApp/ViewModels/Tools/Intelligence/AiSummarizerToolViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/Tools/Intelligence/ComparePdfToolViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/Tools/Intelligence/EditPdfToolViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/Tools/Intelligence/OcrPdfToolViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/Tools/Intelligence/PdfFormsToolViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/Tools/Intelligence/TranslatePdfToolViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/Tools/Organize/CropPdfToolViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/Tools/Organize/MergePdfToolViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/Tools/Organize/OrganizePdfToolViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/Tools/Organize/PageNumbersToolViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/Tools/Organize/RotatePdfToolViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/Tools/Organize/SplitPdfToolViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/Tools/Security/CompressPdfToolViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/Tools/Security/ProtectPdfToolViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/Tools/Security/RedactPdfToolViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/Tools/Security/RepairPdfToolViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/Tools/Security/SignPdfToolViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/Tools/Security/UnlockPdfToolViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/Tools/Security/WatermarkToolViewModel.cs delete mode 100644 src/PdfEditorApp/ViewModels/ViewModelBase.cs delete mode 100644 src/PdfEditorApp/ViewModels/WorkflowBuilderViewModel.cs delete mode 100644 src/PdfEditorApp/Views/AiAssistantSidebarView.axaml delete mode 100644 src/PdfEditorApp/Views/AiAssistantSidebarView.axaml.cs delete mode 100644 src/PdfEditorApp/Views/CanvasRulerControl.cs delete mode 100644 src/PdfEditorApp/Views/CanvasTextHudView.axaml delete mode 100644 src/PdfEditorApp/Views/CanvasTextHudView.axaml.cs delete mode 100644 src/PdfEditorApp/Views/Controls/AdvancedTextControl.cs delete mode 100644 src/PdfEditorApp/Views/Controls/AskAiButton.cs delete mode 100644 src/PdfEditorApp/Views/Controls/PdfTextOverlayControl.cs delete mode 100644 src/PdfEditorApp/Views/Dialogs/AboutDialog.axaml delete mode 100644 src/PdfEditorApp/Views/Dialogs/AboutDialog.axaml.cs delete mode 100644 src/PdfEditorApp/Views/Dialogs/AiAssistantDialog.axaml delete mode 100644 src/PdfEditorApp/Views/Dialogs/AiAssistantDialog.axaml.cs delete mode 100644 src/PdfEditorApp/Views/Dialogs/BatchGenerationDialog.axaml delete mode 100644 src/PdfEditorApp/Views/Dialogs/BatchGenerationDialog.axaml.cs delete mode 100644 src/PdfEditorApp/Views/Dialogs/BatesNumberingDialog.axaml delete mode 100644 src/PdfEditorApp/Views/Dialogs/BatesNumberingDialog.axaml.cs delete mode 100644 src/PdfEditorApp/Views/Dialogs/CommandPaletteDialog.axaml delete mode 100644 src/PdfEditorApp/Views/Dialogs/CommandPaletteDialog.axaml.cs delete mode 100644 src/PdfEditorApp/Views/Dialogs/CompareDocumentsDialog.axaml delete mode 100644 src/PdfEditorApp/Views/Dialogs/CompareDocumentsDialog.axaml.cs delete mode 100644 src/PdfEditorApp/Views/Dialogs/CustomStampDialog.axaml delete mode 100644 src/PdfEditorApp/Views/Dialogs/CustomStampDialog.axaml.cs delete mode 100644 src/PdfEditorApp/Views/Dialogs/DataStudioDialog.axaml delete mode 100644 src/PdfEditorApp/Views/Dialogs/DataStudioDialog.axaml.cs delete mode 100644 src/PdfEditorApp/Views/Dialogs/DeleteConfirmationDialog.axaml delete mode 100644 src/PdfEditorApp/Views/Dialogs/DeleteConfirmationDialog.axaml.cs delete mode 100644 src/PdfEditorApp/Views/Dialogs/DocumentSecurityDialog.axaml delete mode 100644 src/PdfEditorApp/Views/Dialogs/DocumentSecurityDialog.axaml.cs delete mode 100644 src/PdfEditorApp/Views/Dialogs/ExportSuccessDialog.axaml delete mode 100644 src/PdfEditorApp/Views/Dialogs/ExportSuccessDialog.axaml.cs delete mode 100644 src/PdfEditorApp/Views/Dialogs/HeaderFooterDialog.axaml delete mode 100644 src/PdfEditorApp/Views/Dialogs/HeaderFooterDialog.axaml.cs delete mode 100644 src/PdfEditorApp/Views/Dialogs/MathEquationStudioDialog.axaml delete mode 100644 src/PdfEditorApp/Views/Dialogs/MathEquationStudioDialog.axaml.cs delete mode 100644 src/PdfEditorApp/Views/Dialogs/NewDocumentDialog.axaml delete mode 100644 src/PdfEditorApp/Views/Dialogs/NewDocumentDialog.axaml.cs delete mode 100644 src/PdfEditorApp/Views/Dialogs/PdfToolRunnerDialog.axaml delete mode 100644 src/PdfEditorApp/Views/Dialogs/PdfToolRunnerDialog.axaml.cs delete mode 100644 src/PdfEditorApp/Views/Dialogs/PluginsDialog.axaml delete mode 100644 src/PdfEditorApp/Views/Dialogs/PluginsDialog.axaml.cs delete mode 100644 src/PdfEditorApp/Views/Dialogs/PreflightDiagnosticsDialog.axaml delete mode 100644 src/PdfEditorApp/Views/Dialogs/PreflightDiagnosticsDialog.axaml.cs delete mode 100644 src/PdfEditorApp/Views/Dialogs/RenameDocumentDialog.axaml delete mode 100644 src/PdfEditorApp/Views/Dialogs/RenameDocumentDialog.axaml.cs delete mode 100644 src/PdfEditorApp/Views/Dialogs/SearchRedactDialog.axaml delete mode 100644 src/PdfEditorApp/Views/Dialogs/SearchRedactDialog.axaml.cs delete mode 100644 src/PdfEditorApp/Views/Dialogs/ShortcutsHelpDialog.axaml delete mode 100644 src/PdfEditorApp/Views/Dialogs/ShortcutsHelpDialog.axaml.cs delete mode 100644 src/PdfEditorApp/Views/Dialogs/SignatureStudioDialog.axaml delete mode 100644 src/PdfEditorApp/Views/Dialogs/SignatureStudioDialog.axaml.cs delete mode 100644 src/PdfEditorApp/Views/Dialogs/SplitExtractDialog.axaml delete mode 100644 src/PdfEditorApp/Views/Dialogs/SplitExtractDialog.axaml.cs delete mode 100644 src/PdfEditorApp/Views/Dialogs/WatermarkManagerDialog.axaml delete mode 100644 src/PdfEditorApp/Views/Dialogs/WatermarkManagerDialog.axaml.cs delete mode 100644 src/PdfEditorApp/Views/Dialogs/WorkflowBuilderDialog.axaml delete mode 100644 src/PdfEditorApp/Views/Dialogs/WorkflowBuilderDialog.axaml.cs delete mode 100644 src/PdfEditorApp/Views/DocumentCanvasView.axaml delete mode 100644 src/PdfEditorApp/Views/DocumentCanvasView.axaml.cs delete mode 100644 src/PdfEditorApp/Views/FindReplaceBarView.axaml delete mode 100644 src/PdfEditorApp/Views/FindReplaceBarView.axaml.cs delete mode 100644 src/PdfEditorApp/Views/FontManagerPageView.axaml delete mode 100644 src/PdfEditorApp/Views/FontManagerPageView.axaml.cs delete mode 100644 src/PdfEditorApp/Views/FryPdfViewerView.axaml delete mode 100644 src/PdfEditorApp/Views/FryPdfViewerView.axaml.cs delete mode 100644 src/PdfEditorApp/Views/HelpGuidePageView.axaml delete mode 100644 src/PdfEditorApp/Views/HelpGuidePageView.axaml.cs delete mode 100644 src/PdfEditorApp/Views/HomeDashboardView.axaml delete mode 100644 src/PdfEditorApp/Views/HomeDashboardView.axaml.cs delete mode 100644 src/PdfEditorApp/Views/HomeView.axaml delete mode 100644 src/PdfEditorApp/Views/HomeView.axaml.cs delete mode 100644 src/PdfEditorApp/Views/InspectorSidebarView.axaml delete mode 100644 src/PdfEditorApp/Views/InspectorSidebarView.axaml.cs delete mode 100644 src/PdfEditorApp/Views/LicensingPageView.axaml delete mode 100644 src/PdfEditorApp/Views/LicensingPageView.axaml.cs delete mode 100644 src/PdfEditorApp/Views/MainWindow.axaml delete mode 100644 src/PdfEditorApp/Views/MainWindow.axaml.cs delete mode 100644 src/PdfEditorApp/Views/MathFormulaControl.cs delete mode 100644 src/PdfEditorApp/Views/NewDocumentPageView.axaml delete mode 100644 src/PdfEditorApp/Views/NewDocumentPageView.axaml.cs delete mode 100644 src/PdfEditorApp/Views/Overlays/ShellOverlayHost.axaml delete mode 100644 src/PdfEditorApp/Views/Overlays/ShellOverlayHost.axaml.cs delete mode 100644 src/PdfEditorApp/Views/PdfReaderLandingPageView.axaml delete mode 100644 src/PdfEditorApp/Views/PdfReaderLandingPageView.axaml.cs delete mode 100644 src/PdfEditorApp/Views/PdfToolPageView.axaml delete mode 100644 src/PdfEditorApp/Views/PdfToolPageView.axaml.cs delete mode 100644 src/PdfEditorApp/Views/PdfToolsStudioView.axaml delete mode 100644 src/PdfEditorApp/Views/PdfToolsStudioView.axaml.cs delete mode 100644 src/PdfEditorApp/Views/PdfViewerView.axaml delete mode 100644 src/PdfEditorApp/Views/PdfViewerView.axaml.cs delete mode 100644 src/PdfEditorApp/Views/PluginsManagerPageView.axaml delete mode 100644 src/PdfEditorApp/Views/PluginsManagerPageView.axaml.cs delete mode 100644 src/PdfEditorApp/Views/RibbonView.axaml delete mode 100644 src/PdfEditorApp/Views/RibbonView.axaml.cs delete mode 100644 src/PdfEditorApp/Views/SettingsPageView.axaml delete mode 100644 src/PdfEditorApp/Views/SettingsPageView.axaml.cs delete mode 100644 src/PdfEditorApp/Views/Shell/PdfToolWorkspaceView.axaml delete mode 100644 src/PdfEditorApp/Views/Shell/PdfToolWorkspaceView.axaml.cs delete mode 100644 src/PdfEditorApp/Views/StarredToolsPageView.axaml delete mode 100644 src/PdfEditorApp/Views/StarredToolsPageView.axaml.cs delete mode 100644 src/PdfEditorApp/Views/TesseractManagerPageView.axaml delete mode 100644 src/PdfEditorApp/Views/TesseractManagerPageView.axaml.cs delete mode 100644 src/PdfEditorApp/Views/ThumbnailSidebarView.axaml delete mode 100644 src/PdfEditorApp/Views/ThumbnailSidebarView.axaml.cs delete mode 100644 src/PdfEditorApp/Views/Tools/Conversion/ExcelToPdfToolView.axaml delete mode 100644 src/PdfEditorApp/Views/Tools/Conversion/ExcelToPdfToolView.axaml.cs delete mode 100644 src/PdfEditorApp/Views/Tools/Conversion/HtmlToPdfToolView.axaml delete mode 100644 src/PdfEditorApp/Views/Tools/Conversion/HtmlToPdfToolView.axaml.cs delete mode 100644 src/PdfEditorApp/Views/Tools/Conversion/JpgToPdfToolView.axaml delete mode 100644 src/PdfEditorApp/Views/Tools/Conversion/JpgToPdfToolView.axaml.cs delete mode 100644 src/PdfEditorApp/Views/Tools/Conversion/PdfToExcelToolView.axaml delete mode 100644 src/PdfEditorApp/Views/Tools/Conversion/PdfToExcelToolView.axaml.cs delete mode 100644 src/PdfEditorApp/Views/Tools/Conversion/PdfToJpgToolView.axaml delete mode 100644 src/PdfEditorApp/Views/Tools/Conversion/PdfToJpgToolView.axaml.cs delete mode 100644 src/PdfEditorApp/Views/Tools/Conversion/PdfToMarkdownToolView.axaml delete mode 100644 src/PdfEditorApp/Views/Tools/Conversion/PdfToMarkdownToolView.axaml.cs delete mode 100644 src/PdfEditorApp/Views/Tools/Conversion/PdfToPdfAToolView.axaml delete mode 100644 src/PdfEditorApp/Views/Tools/Conversion/PdfToPdfAToolView.axaml.cs delete mode 100644 src/PdfEditorApp/Views/Tools/Conversion/PdfToPowerPointToolView.axaml delete mode 100644 src/PdfEditorApp/Views/Tools/Conversion/PdfToPowerPointToolView.axaml.cs delete mode 100644 src/PdfEditorApp/Views/Tools/Conversion/PdfToWordToolView.axaml delete mode 100644 src/PdfEditorApp/Views/Tools/Conversion/PdfToWordToolView.axaml.cs delete mode 100644 src/PdfEditorApp/Views/Tools/Conversion/PowerPointToPdfToolView.axaml delete mode 100644 src/PdfEditorApp/Views/Tools/Conversion/PowerPointToPdfToolView.axaml.cs delete mode 100644 src/PdfEditorApp/Views/Tools/Conversion/ScanToPdfToolView.axaml delete mode 100644 src/PdfEditorApp/Views/Tools/Conversion/ScanToPdfToolView.axaml.cs delete mode 100644 src/PdfEditorApp/Views/Tools/Conversion/WordToPdfToolView.axaml delete mode 100644 src/PdfEditorApp/Views/Tools/Conversion/WordToPdfToolView.axaml.cs delete mode 100644 src/PdfEditorApp/Views/Tools/Intelligence/AiSummarizerToolView.axaml delete mode 100644 src/PdfEditorApp/Views/Tools/Intelligence/AiSummarizerToolView.axaml.cs delete mode 100644 src/PdfEditorApp/Views/Tools/Intelligence/ComparePdfToolView.axaml delete mode 100644 src/PdfEditorApp/Views/Tools/Intelligence/ComparePdfToolView.axaml.cs delete mode 100644 src/PdfEditorApp/Views/Tools/Intelligence/EditPdfToolView.axaml delete mode 100644 src/PdfEditorApp/Views/Tools/Intelligence/EditPdfToolView.axaml.cs delete mode 100644 src/PdfEditorApp/Views/Tools/Intelligence/OcrPdfToolView.axaml delete mode 100644 src/PdfEditorApp/Views/Tools/Intelligence/OcrPdfToolView.axaml.cs delete mode 100644 src/PdfEditorApp/Views/Tools/Intelligence/PdfFormsToolView.axaml delete mode 100644 src/PdfEditorApp/Views/Tools/Intelligence/PdfFormsToolView.axaml.cs delete mode 100644 src/PdfEditorApp/Views/Tools/Intelligence/TranslatePdfToolView.axaml delete mode 100644 src/PdfEditorApp/Views/Tools/Intelligence/TranslatePdfToolView.axaml.cs delete mode 100644 src/PdfEditorApp/Views/Tools/Organize/CropPdfToolView.axaml delete mode 100644 src/PdfEditorApp/Views/Tools/Organize/CropPdfToolView.axaml.cs delete mode 100644 src/PdfEditorApp/Views/Tools/Organize/MergePdfToolView.axaml delete mode 100644 src/PdfEditorApp/Views/Tools/Organize/MergePdfToolView.axaml.cs delete mode 100644 src/PdfEditorApp/Views/Tools/Organize/OrganizePdfToolView.axaml delete mode 100644 src/PdfEditorApp/Views/Tools/Organize/OrganizePdfToolView.axaml.cs delete mode 100644 src/PdfEditorApp/Views/Tools/Organize/PageNumbersToolView.axaml delete mode 100644 src/PdfEditorApp/Views/Tools/Organize/PageNumbersToolView.axaml.cs delete mode 100644 src/PdfEditorApp/Views/Tools/Organize/RotatePdfToolView.axaml delete mode 100644 src/PdfEditorApp/Views/Tools/Organize/RotatePdfToolView.axaml.cs delete mode 100644 src/PdfEditorApp/Views/Tools/Organize/SplitPdfToolView.axaml delete mode 100644 src/PdfEditorApp/Views/Tools/Organize/SplitPdfToolView.axaml.cs delete mode 100644 src/PdfEditorApp/Views/Tools/Security/CompressPdfToolView.axaml delete mode 100644 src/PdfEditorApp/Views/Tools/Security/CompressPdfToolView.axaml.cs delete mode 100644 src/PdfEditorApp/Views/Tools/Security/ProtectPdfToolView.axaml delete mode 100644 src/PdfEditorApp/Views/Tools/Security/ProtectPdfToolView.axaml.cs delete mode 100644 src/PdfEditorApp/Views/Tools/Security/RedactPdfToolView.axaml delete mode 100644 src/PdfEditorApp/Views/Tools/Security/RedactPdfToolView.axaml.cs delete mode 100644 src/PdfEditorApp/Views/Tools/Security/RepairPdfToolView.axaml delete mode 100644 src/PdfEditorApp/Views/Tools/Security/RepairPdfToolView.axaml.cs delete mode 100644 src/PdfEditorApp/Views/Tools/Security/SignPdfToolView.axaml delete mode 100644 src/PdfEditorApp/Views/Tools/Security/SignPdfToolView.axaml.cs delete mode 100644 src/PdfEditorApp/Views/Tools/Security/UnlockPdfToolView.axaml delete mode 100644 src/PdfEditorApp/Views/Tools/Security/UnlockPdfToolView.axaml.cs delete mode 100644 src/PdfEditorApp/Views/Tools/Security/WatermarkToolView.axaml delete mode 100644 src/PdfEditorApp/Views/Tools/Security/WatermarkToolView.axaml.cs delete mode 100644 src/PdfEditorApp/Views/TrashCachePageView.axaml delete mode 100644 src/PdfEditorApp/Views/TrashCachePageView.axaml.cs delete mode 100644 src/PdfEditorApp/app.manifest delete mode 100755 test delete mode 100644 tests/PdfEditorApp.Tests/AiServiceTests.cs delete mode 100644 tests/PdfEditorApp.Tests/BatchPdfGeneratorTests.cs delete mode 100644 tests/PdfEditorApp.Tests/BezierShapeAndLineEngineTests.cs delete mode 100644 tests/PdfEditorApp.Tests/CanvasEditingEngineTests.cs delete mode 100644 tests/PdfEditorApp.Tests/CollapseExpandWorkspaceTests.cs delete mode 100644 tests/PdfEditorApp.Tests/ConverterTests.cs delete mode 100644 tests/PdfEditorApp.Tests/DataMergeEngineTests.cs delete mode 100644 tests/PdfEditorApp.Tests/DataStudioTests.cs delete mode 100644 tests/PdfEditorApp.Tests/DirectEditingTests.cs delete mode 100644 tests/PdfEditorApp.Tests/DocumentAuditServiceTests.cs delete mode 100644 tests/PdfEditorApp.Tests/DocumentCompareServiceTests.cs delete mode 100644 tests/PdfEditorApp.Tests/DocumentExportAndPersistenceTests.cs delete mode 100644 tests/PdfEditorApp.Tests/DocumentFileOperationsTests.cs delete mode 100644 tests/PdfEditorApp.Tests/DocumentMetadataTests.cs delete mode 100644 tests/PdfEditorApp.Tests/DynamicToolRegistryTests.cs delete mode 100644 tests/PdfEditorApp.Tests/EducationAndCheatSheetTemplateTests.cs delete mode 100644 tests/PdfEditorApp.Tests/EmployeePayslipBatchTests.cs delete mode 100644 tests/PdfEditorApp.Tests/FontManagerTests.cs delete mode 100644 tests/PdfEditorApp.Tests/FryPdfViewerTests.cs delete mode 100644 tests/PdfEditorApp.Tests/GestureAndNavigationTests.cs delete mode 100644 tests/PdfEditorApp.Tests/HeadlessCliRunnerTests.cs delete mode 100644 tests/PdfEditorApp.Tests/HelpGuideTests.cs delete mode 100644 tests/PdfEditorApp.Tests/HomeViewModelTests.cs delete mode 100644 tests/PdfEditorApp.Tests/LicensingPageTests.cs delete mode 100644 tests/PdfEditorApp.Tests/Material3ExpressiveThemeTests.cs delete mode 100644 tests/PdfEditorApp.Tests/MathEngineTests.cs delete mode 100644 tests/PdfEditorApp.Tests/MicrokernelPillarsTests.cs delete mode 100644 tests/PdfEditorApp.Tests/Mocks/MockRecentDocumentsService.cs delete mode 100644 tests/PdfEditorApp.Tests/OcrEngineTests.cs delete mode 100644 tests/PdfEditorApp.Tests/OverlayExtensibilityTests.cs delete mode 100644 tests/PdfEditorApp.Tests/PageOrganizerServiceTests.cs delete mode 100644 tests/PdfEditorApp.Tests/PdfDeconstructionEngineTests.cs delete mode 100644 tests/PdfEditorApp.Tests/PdfEditorApp.Tests.csproj delete mode 100644 tests/PdfEditorApp.Tests/PdfEngineTests.cs delete mode 100644 tests/PdfEditorApp.Tests/PdfImportAndViewerTests.cs delete mode 100644 tests/PdfEditorApp.Tests/PdfLayoutAnalyzerTests.cs delete mode 100644 tests/PdfEditorApp.Tests/PdfReaderTests.cs delete mode 100644 tests/PdfEditorApp.Tests/PdfToolViewModelsTests.cs delete mode 100644 tests/PdfEditorApp.Tests/PdfToolsServiceTests.cs delete mode 100644 tests/PdfEditorApp.Tests/PipelineTests.cs delete mode 100644 tests/PdfEditorApp.Tests/PluginAssemblyLoaderTests.cs delete mode 100644 tests/PdfEditorApp.Tests/PluginEcosystemTests.cs delete mode 100644 tests/PdfEditorApp.Tests/PluginKernelTests.cs delete mode 100644 tests/PdfEditorApp.Tests/PluginsManagerPageTests.cs delete mode 100644 tests/PdfEditorApp.Tests/PluginsStudioUiTests.cs delete mode 100644 tests/PdfEditorApp.Tests/ProfileAndBundleTests.cs delete mode 100644 tests/PdfEditorApp.Tests/RemotePluginMarketplaceTests.cs delete mode 100644 tests/PdfEditorApp.Tests/RichTextEngineTests.cs delete mode 100644 tests/PdfEditorApp.Tests/SignatureAndFormsServiceTests.cs delete mode 100644 tests/PdfEditorApp.Tests/SmartPlacementTests.cs delete mode 100644 tests/PdfEditorApp.Tests/SnakeMarketplaceIntegrationTests.cs delete mode 100644 tests/PdfEditorApp.Tests/SnakeOverlayPluginTests.cs delete mode 100644 tests/PdfEditorApp.Tests/TesseractManagerTests.cs delete mode 100644 tests/PdfEditorApp.Tests/TextSelectionAndOcrTests.cs delete mode 100644 tests/PdfEditorApp.Tests/ThemeServiceTests.cs delete mode 100644 tests/PdfEditorApp.Tests/Tools/Conversion/ExcelToPdfToolTests.cs delete mode 100644 tests/PdfEditorApp.Tests/Tools/Conversion/HtmlToPdfToolTests.cs delete mode 100644 tests/PdfEditorApp.Tests/Tools/Conversion/JpgToPdfToolTests.cs delete mode 100644 tests/PdfEditorApp.Tests/Tools/Conversion/PdfToExcelToolTests.cs delete mode 100644 tests/PdfEditorApp.Tests/Tools/Conversion/PdfToJpgToolTests.cs delete mode 100644 tests/PdfEditorApp.Tests/Tools/Conversion/PdfToMarkdownToolTests.cs delete mode 100644 tests/PdfEditorApp.Tests/Tools/Conversion/PdfToPdfAToolTests.cs delete mode 100644 tests/PdfEditorApp.Tests/Tools/Conversion/PdfToPowerPointToolTests.cs delete mode 100644 tests/PdfEditorApp.Tests/Tools/Conversion/PdfToWordToolTests.cs delete mode 100644 tests/PdfEditorApp.Tests/Tools/Conversion/PowerPointToPdfToolTests.cs delete mode 100644 tests/PdfEditorApp.Tests/Tools/Conversion/ScanToPdfToolTests.cs delete mode 100644 tests/PdfEditorApp.Tests/Tools/Conversion/WordToPdfToolTests.cs delete mode 100644 tests/PdfEditorApp.Tests/Tools/Core/ToolTestFixture.cs delete mode 100644 tests/PdfEditorApp.Tests/Tools/Intelligence/AiSummarizerToolTests.cs delete mode 100644 tests/PdfEditorApp.Tests/Tools/Intelligence/ComparePdfToolTests.cs delete mode 100644 tests/PdfEditorApp.Tests/Tools/Intelligence/EditPdfToolTests.cs delete mode 100644 tests/PdfEditorApp.Tests/Tools/Intelligence/OcrPdfToolTests.cs delete mode 100644 tests/PdfEditorApp.Tests/Tools/Intelligence/PdfFormsToolTests.cs delete mode 100644 tests/PdfEditorApp.Tests/Tools/Intelligence/TranslatePdfToolTests.cs delete mode 100644 tests/PdfEditorApp.Tests/Tools/Organize/CropPdfToolTests.cs delete mode 100644 tests/PdfEditorApp.Tests/Tools/Organize/MergePdfToolTests.cs delete mode 100644 tests/PdfEditorApp.Tests/Tools/Organize/OrganizePdfToolTests.cs delete mode 100644 tests/PdfEditorApp.Tests/Tools/Organize/PageNumbersToolTests.cs delete mode 100644 tests/PdfEditorApp.Tests/Tools/Organize/RotatePdfToolTests.cs delete mode 100644 tests/PdfEditorApp.Tests/Tools/Organize/SplitPdfToolTests.cs delete mode 100644 tests/PdfEditorApp.Tests/Tools/Security/CompressPdfToolTests.cs delete mode 100644 tests/PdfEditorApp.Tests/Tools/Security/ProtectPdfToolTests.cs delete mode 100644 tests/PdfEditorApp.Tests/Tools/Security/QuestPdfOperationsTests.cs delete mode 100644 tests/PdfEditorApp.Tests/Tools/Security/RedactPdfToolTests.cs delete mode 100644 tests/PdfEditorApp.Tests/Tools/Security/RepairPdfToolTests.cs delete mode 100644 tests/PdfEditorApp.Tests/Tools/Security/SignPdfToolTests.cs delete mode 100644 tests/PdfEditorApp.Tests/Tools/Security/UnlockPdfToolTests.cs delete mode 100644 tests/PdfEditorApp.Tests/Tools/Security/WatermarkToolTests.cs delete mode 100644 tests/PdfEditorApp.Tests/TotalMicrokernelTests.cs delete mode 100644 tests/PdfEditorApp.Tests/TypographyAndTextEngineTests.cs delete mode 100644 tests/PdfEditorApp.Tests/UiSettingsTests.cs delete mode 100755 watch diff --git a/.agents/AGENTS.md b/.agents/AGENTS.md deleted file mode 100644 index 0e58f08..0000000 --- a/.agents/AGENTS.md +++ /dev/null @@ -1,431 +0,0 @@ -# FryPDF Agent Operating Guide (AGENTS.md) - -Welcome to the **FryPDF** repository. This guide provides AI agents and human contributors with the architectural guidelines, core workflows, conventions, and debugging procedures needed to work effectively in this codebase. - ---- - -## 1. Project Overview & Tech Stack - -**FryPDF** is a high-performance, cross-platform PDF creation, editing, and document analysis studio. - -- **Framework**: .NET 10 / C# 13+ -- **Architecture**: Microkernel Plugin System ("Everything is a Plugin") inspired by Cordis architecture -- **UI Toolkit**: Avalonia UI (v12.x) with Google Material Design 3 (M3) Expressive styling (macOS, Windows, Linux) -- **MVVM**: `CommunityToolkit.Mvvm` (Observable Objects, Relay Commands, Source Generators) -- **PDF Generation & Export**: `QuestPDF` -- **PDF Parsing & Deconstruction**: `UglyToad.PdfPig` & `PdfPig.DocumentLayoutAnalysis` -- **Raster & Graphics Engine**: `SkiaSharp` -- **Testing**: `xUnit` + Skia visual verification testing suite (770+ unit and integration tests) - ---- - -## 2. Essential Commands - -### Build Solution -```bash -dotnet build -``` - -### Run Full Test Suite (770+ Unit & Integration Tests) -```bash -dotnet test -``` - -### Run Specific / Filtered Tests -```bash -dotnet test --filter "FullyQualifiedName~GestureAndNavigationTests" -dotnet test --filter "FullyQualifiedName~PluginKernelTests" -dotnet test --filter "FullyQualifiedName~PluginsStudioUiTests" -dotnet test --filter "FullyQualifiedName~Material3ExpressiveThemeTests" -dotnet test --filter "FullyQualifiedName~GenerateVisualComparison_SideBySide" -``` - -### Run Desktop App Locally -```bash -dotnet run --project src/PdfEditorApp/PdfEditorApp.csproj -``` - ---- - -## 3. Project Structure - -``` -PDFCreator/ -├── src/ -│ ├── PdfEditorApp.Core/ # Pure headless core engine (cross-platform, zero UI dependencies) -│ │ ├── Analysis/ # Layout analysis, typography, Unicode script detection -│ │ ├── Deconstruction/ # PDF deconstruction engine (PDF stream to live editable model) -│ │ ├── Models/ # Domain element POCOs (Text, Image, Shape, Table, Chart, Math, Form) -│ │ └── Plugins/ # Microkernel plugin infrastructure (IFryPluginContext, DAG, Pipelines) -│ │ ├── Descriptors/ # Extension descriptors (Tools, Ribbon, Sidebars, Inspector, Navigation) -│ │ ├── Pipelines/ # Typed dispatch pipelines (Waterfall, Bail, Parallel, Serial, Emit) -│ │ ├── Profiles/ # App composition profiles (desktop, headless-cli, sdk) and bundle contracts -│ │ └── Settings/ # Typed plugin settings schema and persistent file store -│ └── PdfEditorApp/ # Main Avalonia desktop application -│ ├── Assets/ # Embedded fonts (Noto Sans, Roboto, Inter, etc.) and SVG icons -│ ├── Plugins/ # Desktop plugin implementations and modular bundles -│ │ ├── Bundles/ # 16 standard bundles (Tools, Pages, Sidebars, AI, CanvasElements, etc.) -│ │ └── Loader/ # Collectible AssemblyLoadContext and .fryplugin package extractor -│ ├── Services/ # Dynamic registries (Tools, Ribbon, Sidebars, Inspector, Navigation, AI) -│ ├── ViewModels/ # MVVM ViewModels (MainViewModel, HomeViewModel, ElementViewModels) -│ └── Views/ # Avalonia XAML Views, canvas controls, and M3 dialogs -├── tests/ -│ └── PdfEditorApp.Tests/ # Comprehensive xUnit test suite (770+ tests) & visual verification suite -├── docs/ # Architecture, contributing, M3 guidelines, and plugin manuals -├── AGENTS.md # Root link to this operating guide -├── GEMINI.md # Immediate critical agent mandate instructions -└── README.md # Repository overview -``` - ---- - -## 4. Architectural Rules & Subsystem Guidelines - -### A. PDF Deconstruction Engine ([`PdfDeconstructionEngine.cs`](src/PdfEditorApp.Core/Deconstruction/PdfDeconstructionEngine.cs)) - -When importing 3rd-party PDFs for live editing: - -1. **Strict Layered Z-Index Allocation**: - - **`ZIndex = 0..99`**: Background container shapes ($W \ge 120\text{ pt}, H \ge 80\text{ pt}$) and faint watermarks. - - **`ZIndex = 100..499`**: Content images (photos, QR codes, emblems, government banners, logos). - - **`ZIndex = 500..599`**: Structured tables and data grids. - - **`ZIndex = 600..999`**: Foreground shapes, badges, and divider lines. - - **`ZIndex = 1000..1999`**: Text blocks, headings, labels, and rotated vertical marginalia. - - **`ZIndex = 2000+`**: Interactive form fields, checkboxes, and digital signatures. - > **CRITICAL RULE**: Background shapes must NEVER be placed at a higher Z-index than content images. Otherwise, white container cards will occlude images underneath. - -2. **Multi-Format Skia Image Extraction**: - - Always use SkiaSharp multi-format decoding (`ExtractImageBytes`) to decode raw DCT/JPEG, JPEG2000, uncompressed CMYK/RGB, and monochrome 1-bit samples before re-encoding to standardized PNG bytes. - -3. **Watermark Classification**: - - Only classify an image as a background watermark if it spans $\ge 65\%$ page width and $\ge 55\%$ page height. Sub-page content images (such as information cards) must retain $100\%$ opacity. - ---- - -### B. Layout Analysis & Typography Engine ([`PdfLayoutAnalyzer.cs`](src/PdfEditorApp.Core/Analysis/PdfLayoutAnalyzer.cs)) - -1. **Script-Aware Token Joining**: - - For Indic scripts (Devanagari, Tamil, Telugu, etc.) and CJK, evaluate horizontal bounding-box gaps. Sub-threshold gaps must be joined without artificial spaces to preserve natural words. - -2. **Paragraph Indent & Clustering**: - - In `ShouldClusterLines`, check vertical line pitch ($\le 0.95 \times \text{FontSize}$). - - If the next line has a positive left indent ($>8\text{ pt}$), break to start a new paragraph. - -3. **Line Height Multipliers**: - - `LineHeight` is a proportional multiplier ($1.25\times$ to $1.4\times\text{FontSize}$), not fixed points. - -4. **Script-Aware Font Fallback ([`UnicodeScriptDetector.cs`](src/PdfEditorApp.Core/Analysis/UnicodeScriptDetector.cs))**: - - Match detected Unicode script ranges to system/embedded font families (e.g. `Noto Sans Devanagari`, `Kohinoor Devanagari`, `Noto Sans SC`, `PingFang SC`) to eliminate tofu boxes (`□□□`). - ---- - -### C. MVVM Architecture & Maximum CommunityToolkit.Mvvm Utilization - -Always take maximum advantage of **`CommunityToolkit.Mvvm`** features and source generators across all ViewModels: - -1. **Source Generators Over Boilerplate**: - - **`[ObservableProperty]`**: Always prefer `[ObservableProperty]` attributes on private fields (`[ObservableProperty] private string _title;`) to let Roslyn source generators generate clean, type-safe public properties and partial change methods (`OnTitleChanged`). - - **`[NotifyPropertyChangedFor]`**: Use `[NotifyPropertyChangedFor(nameof(DependentProperty))]` on backing fields to automatically cascade dependent property notifications instead of manually calling `OnPropertyChanged` in property bodies. - - **`[NotifyCanExecuteChangedFor]`**: Use `[NotifyCanExecuteChangedFor(nameof(MyCommand))]` on state-driving properties so buttons bound to commands automatically refresh their enabled/disabled visual state without manual polling. - -2. **Relay Commands & Async Operations**: - - **`[RelayCommand]`**: Always use `[RelayCommand]` on methods instead of declaring manual `IRelayCommand` fields and instantiating `new RelayCommand(...)`. - - **Async Relay Commands**: Declare asynchronous operations directly as `[RelayCommand] private async Task LoadDocumentAsync(...)`. CommunityToolkit automatically manages `IsRunning`, concurrent execution locking, and cancellation token propagation. - - **CanExecute Wiring**: Use `[RelayCommand(CanExecute = nameof(CanPerformAction))]` for clean condition-based execution guards. - -3. **Loose Coupling & Memory-Safe Messaging (`WeakReferenceMessenger`)**: - - Use `WeakReferenceMessenger.Default.Send(new Message(...))` and `Register(this, ...)` for decoupled communication between services, ribbons, sidebars, and dialogs. - - Never pass strong references to ViewModels or Views to prevent memory retention cycles. - - For ViewModels requiring lifetime-bound messaging, inherit from `ObservableRecipient` and activate/deactivate with `IsActive = true/false`. - -4. **Input Validation with `ObservableValidator`**: - - Inherit from `ObservableValidator` for dialog forms and data entry ViewModels. - - Use standard DataAnnotations (`[Required]`, `[Range]`, `[RegularExpression]`, `[CustomValidation]`) and call `ValidateProperty(value, nameof(...))` or `ValidateAllProperties()`. - -5. **Canvas Element ViewModels**: - - Every canvas element inherits from `ElementViewModelBase` and implements `LoadFromModel(PdfElementModelBase)` and `ToModel()`. - - Property changes must notify to support live canvas rendering, property sidebar binding, and atomic undo/redo records. - - Keep business logic and coordinate conversions inside `Core` and `Services`, leaving ViewModels focused on presentation state and commands. - ---- - -### D. Avalonia UI Data Binding & Value Converters - -When binding ViewModels to Avalonia XAML Views: - -1. **Verify Converter Requirement for Data Types & Transforms**: - - Always check if a ViewModel property type differs from the View property type (e.g. `double` $\to$ `ITransform`, `string` hex $\to$ `IBrush`/`Color`, `long` bytes $\to$ formatted size, `enum` $\to$ display title, `double` points $\to$ mm/inches). - - **Critical Avalonia Rule**: Never instantiate an `AvaloniaObject` transform directly inside a Style/ControlTheme Setter (e.g. ``). Avalonia `Transform` instances do **not** inherit `DataContext` inside Setter values, causing `{Binding}` to fail silently to 0. Always bind through an `IValueConverter`: - ```xml - - - ``` - -2. **Check Existing Converter Registrations**: - - Inspect [`CommonConverters.cs`](src/PdfEditorApp/Converters/CommonConverters.cs) and [`ExtendedConverters.cs`](src/PdfEditorApp/Converters/ExtendedConverters.cs) before writing ad-hoc inline bindings. - - When adding a new converter, register it in [`App.axaml`](src/PdfEditorApp/App.axaml) for global application availability. - -3. **Converter Quality & Testing**: - - Implement `ConvertBack` whenever two-way binding is required (e.g. numeric adjustments, unit conversions, color views). - - Handle `null` and invalid input gracefully without throwing unhandled exceptions. - - Add deterministic unit test assertions in [`tests/PdfEditorApp.Tests/ConverterTests.cs`](tests/PdfEditorApp.Tests/ConverterTests.cs). - ---- - -### E. Memory Leak Prevention, Resource Disposal & LOH Management - -To maintain high responsiveness and prevent memory leaks during long editing sessions and large PDF processing: - -1. **Large Object Heap (LOH) & Base64 Bloat Prevention**: - - **Never** store Base64 strings for raw image or vector assets inside document models (`PdfDocumentModel`, `PdfPageModel`, `PdfImageElement`) or ViewModels. - - Store raw `byte[] ImageData` directly. Any object $\ge 85,000\text{ bytes}$ is allocated on the LOH, which is not compacted in standard GC cycles and causes memory fragmentation. - - `Base64Data` must only be computed lazily on demand for JSON serialization. - -2. **Unmanaged Graphics Handle & Bitmap Disposal**: - - `SKBitmap`, `SKImage`, `SKSurface`, `SKPixmap`, `SKData`, `SKCodec`, and Avalonia `Bitmap`/`WriteableBitmap` wrap native unmanaged graphics handles (`IntPtr`). - - Always wrap short-lived Skia graphics objects in `using` statements. - - In ViewModels ([`ImageElementViewModel.cs`](src/PdfEditorApp/ViewModels/ElementViewModels/ImageElementViewModel.cs), [`ChartElementViewModel.cs`](src/PdfEditorApp/ViewModels/ElementViewModels/ChartElementViewModel.cs)), always dispose previous bitmap instances before assigning a new `PreviewBitmap` or `ChartBitmap`: - ```csharp - var oldBitmap = _previewBitmap; - _previewBitmap = newBitmap; - OnPropertyChanged(nameof(PreviewBitmap)); - oldBitmap?.Dispose(); - ``` - - When closing pages or clearing canvas items, ensure child element view models dispose their bitmaps. - -3. **Event Handler & Subscription Lifecycle**: - - Do not attach event listeners (`PropertyChanged`, `CollectionChanged`, timers) to singleton services from transient ViewModels without an unsubscription mechanism. - - Prefer `CommunityToolkit.Mvvm` `WeakReferenceMessenger` for cross-component communication to avoid strong reference cycles that prevent garbage collection. - -4. **PDF Streams & UglyToad.PdfPig Lifecycle**: - - `PdfDocument.Open(...)` parses internal object tables and font dictionaries. Always wrap `PdfDocument` instances in `using` blocks in [`PdfDeconstructionEngine.cs`](src/PdfEditorApp.Core/Deconstruction/PdfDeconstructionEngine.cs) and services. - - Always dispose input/output `MemoryStream` and `FileStream` objects promptly. - -5. **Bounded Undo/Redo History**: - - The undo/redo command stack must remain bounded (e.g. max 50 actions) to prevent unlimited memory growth from document state snapshots. - ---- - -### F. Google Material Design 3 (M3) Expressive UI Mandate (STRICT) - -**CRITICAL MANDATE**: ALL future UI changes, new views, dialogs, sidebars, controls, or visual enhancements across FryPDF **MUST strictly adhere to Google Material Design 3 (M3) Expressive** design principles. Flat, rigid, or rectangular legacy styles are strictly forbidden. - -1. **Expressive Shape Scale Hierarchy**: - - Never hardcode arbitrary small corner radii (`CornerRadius="2"`, `"4"`, etc.) on major interactive elements. - - Always reference the centralized M3 shape scale tokens defined in [`Material3ExpressiveTokens.axaml`](src/PdfEditorApp/Styles/Material3ExpressiveTokens.axaml): - - **`M3ShapeCornerNone` (0px)**: Edge-to-edge full-bleed panels and splitters. - - **`M3ShapeCornerExtraSmall` (4px)**: Micro badges, code spans, keyboard shortcut badges (`kbd-badge`). - - **`M3ShapeCornerSmall` (8px)**: Badges, thumbnail cards, compact chips, small status pills. - - **`M3ShapeCornerMedium` (12px)**: Context menus, tooltips, list items, card inner sections. - - **`M3ShapeCornerLarge` (16px)**: Content cards (`m3-card-elevated`), `TextBox.m3-outlined`, `ComboBox`, `NumericUpDown`, inspector section groups. - - **`M3ShapeCornerExtraLarge` (28px)**: Modal dialog cards (`Border.m3-dialog-card`, `AboutDialog`, `CommandPaletteDialog`, `AiAssistantDialog`), hero promo banners. - - **`M3ShapeCornerFull` (9999px)**: Tactile pill buttons (`primary-btn`, `accent-btn`, `action-pill-btn`, `m3-filled-btn`, `m3-tonal-btn`), segmented button capsules (`m3-segmented-container`), global search bars (`TextBox.m3-search`), Floating Action Buttons (`m3-fab`), and chubby slider thumbs. - -2. **Tonal Palette & Dynamic Color Roles**: - - Never hardcode light/dark hex colors (e.g. `#FFFFFF`, `#000000`, `#F1F5F9`) in templates or hover triggers that break dark mode adaptability. - - Always reference semantic M3 color roles via `{DynamicResource ...}`: - - **Primary Actions**: `M3PrimaryBrush`, `M3OnPrimaryBrush`, `M3PrimaryContainerBrush`, `M3OnPrimaryContainerBrush`. - - **Secondary / Active Accents**: `M3SecondaryBrush`, `M3SecondaryContainerBrush`, `M3OnSecondaryContainerBrush`. - - **Surfaces & Layers**: `M3SurfaceBrush`, `M3SurfaceDimBrush`, `M3SurfaceContainerLowestBrush` through `M3SurfaceContainerHighestBrush`. - - **Outlines & Dividers**: `M3OutlineBrush`, `M3OutlineVariantBrush`. - - **Legacy Aliases**: When maintaining existing views, legacy aliases (`WinBgBrush`, `WinPanelBrush`, `WinBorderBrush`, `WinAccentBrush`, `WinTextBrush`, `WinMutedBrush`, `WinHoverBrush`, `WinActiveBrush`, `WinInputBgBrush`) are supported and automatically map to M3 Expressive tokens. - -3. **Standard Component Classes ([`Material3ExpressiveStyles.axaml`](src/PdfEditorApp/Styles/Material3ExpressiveStyles.axaml))**: - - **Buttons**: Use standard M3 hierarchy (`m3-filled-btn`, `m3-tonal-btn`, `m3-elevated-btn`, `m3-outlined-btn`, `m3-text-btn`, `m3-fab`, `m3-fab-extended`, `m3-icon-btn`). - - **Segmented Capsules**: Wrap segmented buttons in `Border.m3-segmented-container` with child `Button.m3-segment-btn` or `RadioButton.m3-segment-btn`. - - **Chips**: Use `Button.m3-chip`, `Button.m3-filter-chip`, or `ToggleButton.m3-filter-chip` with `M3ShapeCornerSmall` or pill geometry. - - **Cards & Dialogs**: Use `Border.m3-card-elevated`, `Border.m3-card-filled`, `Border.m3-card-outlined`, and `Border.m3-dialog-card`. - - **Inputs & Search**: Use `TextBox.m3-outlined` for forms/inspector and `TextBox.m3-search` for pill search fields. - - **Tactile Chubby Sliders**: Retain chubby tactile sliders with `SliderTrackThemeHeight` ($\ge 8\text{px}$), `SliderHorizontalThumbWidth` ($\ge 20\text{px}$), and smooth hover scale transitions. - -4. **Elevation Shadows & Motion Physics**: - - Apply elevation on `Border` elements using multi-layered diffuse shadows: `{StaticResource M3ElevationLevel0}` through `{StaticResource M3ElevationLevel5}`. (Note: `BoxShadow` is an Avalonia `Border` property; do not apply it directly to `Button` or `ContextMenu` selectors). - - Use subtle, springy micro-transitions (`BrushTransition` 150ms, `TransformOperationsTransition` 150ms) on hover and pressed states. - -5. **Regression Verification**: - - Every new token or UI component style must be covered in [`tests/PdfEditorApp.Tests/Material3ExpressiveThemeTests.cs`](tests/PdfEditorApp.Tests/Material3ExpressiveThemeTests.cs) and pass `dotnet test`. - - Build must always remain 100% warning-free (`TreatWarningsAsErrors=true`). - ---- - -### G. Modular Microkernel Plugin Architecture ("Everything is a Plugin") (STRICT) - -**CRITICAL ARCHITECTURAL MANDATE**: -FryPDF implements an **"Everything is a Plugin"** microkernel architecture inspired by the **Cordis** framework. -**Monolithic additions, hardcoded switch-case statements, god viewmodels, and hardwired view instantiations are strictly forbidden.** -Whenever you create new tools, add document operations, contribute ribbon actions, add sidebar panels, introduce inspector sections, or add new canvas element types, you **MUST implement them as modular plugins registered through dynamic capability registries**. - -#### 1. The 5 Core Architectural Pillars -- **A. Inverted Capability Context (`IFryPluginContext`)**: Plugins register and consume capabilities via a thread-safe context (`ctx.RegisterService`, `ctx.GetService`, `ctx.TryGetService`). -- **B. Directed Acyclic Graph (DAG) Dependency Solver**: Plugins declare dependencies via `RequiredServices` or `[DependsOn]`. The kernel sorts and mounts dependencies in topological order. -- **C. Reversible Effects (`PluginScope` & LIFO Rollback)**: Every registration (listeners, commands, event handlers) is tracked as an effect. Unloading a plugin unwinds its effect stack in reverse order, ensuring 100% clean teardown with zero dangling subscriptions. -- **D. Typed Dispatch Pipelines**: - - `Waterfall`: Around-middleware with `next()` delegation (e.g. Export pipelines, document watermarking, audit trails). - - `Bail`: Short-circuits on first handled result (e.g. multi-format document converters, OCR engines). - - `Parallel`: Concurrent asynchronous dispatch via `Task.WhenAll` (e.g. analytics, autosave). - - `Serial`: Sequential asynchronous dispatch (e.g. validation chains, signature checks). - - `Emit`: Decoupled broadcast notifications. -- **E. Composable Profiles & Bundles**: Capabilities are grouped into self-contained `IFryPluginBundle` instances and composed into profiles (`desktop`, `headless-cli`, `sdk`). - -#### 2. The 12 Dynamic Registry Pillars -Never write hardcoded UI wiring. Mount capabilities through the designated registry: - -| Pillar / Registry | Descriptor | Typical Usage | -| :--- | :--- | :--- | -| **1. PDF Tools** | `IPdfToolRegistry` / `PdfToolDescriptor` | New tools (Merge, Split, Watermark, Compress, etc.). Inherit from `ToolPluginBase`. | -| **2. Dynamic Ribbon** | `IRibbonRegistry` / `RibbonContribution` | Custom ribbon tabs (`RibbonTabDescriptor`), groups, and action pill buttons. | -| **3. Extensible Sidebars** | `ISidebarRegistry` / `SidebarTabDescriptor` | Custom sidebars (signatures, bookmarks, AI search, metadata trees). | -| **4. Contextual Inspector** | `IInspectorRegistry` / `InspectorSectionDescriptor` | Custom property sections targeting specific canvas element types. | -| **5. Workspace Pages** | `INavigationRegistry` / `NavigationItemDescriptor` | New workspace pages and navigation sections. | -| **6. Canvas Elements** | `ICanvasElementRegistry` / `CanvasElementDescriptor` | Custom element types (Barcode, LaTeX Math, Form, Stamp, Ink). | -| **7. Document Importers** | `IDocumentImporterRegistry` / `DocumentImporterDescriptor` | Born-digital PDF, DOCX, XLSX, Markdown, HTML ingestion. | -| **8. Document Exporters** | `IDocumentExporterRegistry` / `DocumentExporterDescriptor` | QuestPDF static PDF, PDF/A, image sequences, CSV data export. | -| **9. AI Providers** | `IAiProviderRegistry` / `AiProviderDescriptor` | Local Ollama, OpenAI, Groq, Anthropic, custom LLM endpoints. | -| **10. OCR Engines** | `IOcrEngineRegistry` / `OcrEngineDescriptor` | Tesseract, Apple Vision OCR, Windows OCR, cloud vision engines. | -| **11. Data Connectors** | `IDataConnectorRegistry` / `DataConnectorDescriptor` | Excel, CSV, JSON REST APIs, SQL database ingestion. | -| **12. Status & Dialogs** | `IStatusBarRegistry`, `IDialogRegistry` | Contextual status indicators, modals, and command palette actions. | - -#### 3. Standard Tool Plugin Pattern Example -When implementing a new tool, inherit from `ToolPluginBase` and register it inside a bundle: - -```csharp -public class CustomWatermarkToolPlugin : ToolPluginBase -{ - public override string Id => "frypdf.tool.watermark"; - public override string Name => "Watermark PDF"; - - protected override PdfToolDescriptor CreateDescriptor() => new() - { - Id = Id, - Name = Name, - Description = "Apply custom text and image stamps with opacity control.", - Category = "OptimizeAndSecurity", - IconKind = "Watermark", - IconColorHex = "#0284C7", - BackgroundAccentHex = "#F0F9FF", - SupportsMultiFile = true, - AcceptedFileExtensions = ".pdf", - CreateViewModel = sp => ActivatorUtilities.CreateInstance(sp) - }; -} -``` - -#### 4. Reversible Effects Rule -Any plugin subscribing to events or registering UI elements must use `ctx.RegisterEffect`: -```csharp -public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) -{ - var subscription = WeakReferenceMessenger.Default.Register(this, HandleDocumentChanged); - ctx.RegisterEffect(() => WeakReferenceMessenger.Default.Unregister(this)); - return Task.CompletedTask; -} -``` - -#### 5. Declarative Settings Schema -Plugins with configurable settings declare typed schemas via `IFryPlugin.SettingsSchema`. The UI automatically generates an M3 Expressive configurator in `PluginsDialog.axaml`: -```csharp -public IReadOnlyDictionary? SettingsSchema => new Dictionary -{ - ["ApiKey"] = new() { Key = "ApiKey", Label = "API Key", Type = PluginSettingType.Secret, IsRequired = true }, - ["Model"] = new() { Key = "Model", Label = "Model", Type = PluginSettingType.Select, Options = ["gpt-4o", "claude-3-5-sonnet"] } -}; -``` - ---- - -### H. High-Performance, Zero-Lag Responsiveness & Resource Lifecycle (STRICT) - -**CRITICAL PERFORMANCE MANDATE**: -FryPDF is designed to feel instantaneous, smooth, and lightweight. **UI lag, dropped frames, stuttering animations, and memory leaks are completely unacceptable.** -Always think in terms of performance optimization when designing and writing code: - -#### 1. Zero UI Thread Blocking -- **Never Run Heavy Work on the UI Thread**: PDF parsing, deconstruction, Skia rasterization, QuestPDF compilation, OCR recognition, AI completions, JSON serialization, and disk/network I/O MUST run on background threads via `Task.Run` or asynchronous pipelines. -- **Never Block Asynchronously**: Never call `.Result`, `.Wait()`, or `.GetAwaiter().GetResult()` on the Avalonia UI thread. -- **Cancellation Token Propagation**: Always accept and respect `CancellationToken` in long-running jobs to allow instant aborts when the user switches pages or cancels operations. - -#### 2. Instant Navigation & View Caching (0ms Latency) -- **Plugin View Caching**: In view models managing navigation (e.g. [`HomeViewModel.cs`](src/PdfEditorApp/ViewModels/HomeViewModel.cs)), always cache dynamically instantiated plugin views in an instance dictionary (`_dynamicViewCache`). Never destroy and re-instantiate heavy visual trees on every tab switch: - ```csharp - if (!_dynamicViewCache.TryGetValue(sectionName, out var cachedView)) - { - cachedView = desc.ViewFactory(serviceProvider); - _dynamicViewCache[sectionName] = cachedView; - } - DynamicPageView = cachedView; - ``` -- **Pre-Mounted Built-In Trees**: For primary screens (Dashboard, Reader Landing, PDF Tools Studios), pre-mount compiled XAML templates in the parent view (`HomeView.axaml`) so navigation occurs in 0ms with zero layout recalculation overhead. - -#### 3. UI Virtualization & Recycling -- **Virtualizing Panels Only**: Always use virtualized layout containers (`ItemsRepeater`, `VirtualizingStackPanel` with `ScrollUnit="Pixel"`) for document page thumbnails, tool cards, audit logs, and tabular data rows. -- **Never use unvirtualized `StackPanel`** inside a `ScrollViewer` for collections with more than 10 items. -- **Element Recycling**: Ensure templates in `ItemsRepeater` reuse container elements rather than continually allocating visual tree nodes during scrolling. - -#### 4. Gesture & Continuous Input Smoothing -- **Proportional Clamped Zooming**: For trackpad pinch-to-zoom and gestures, calculate zoom multiplicatively with bounds clamping to prevent exponential explosion: - ```csharp - double newZoom = Math.Clamp(Math.Round(currentZoom * (1.0 + delta), 3), 0.1, 5.0); - ``` -- **Reactive Debounce & Throttling**: - - Debounce search queries and text filters (150–250ms) before filtering in-memory collections. - - Throttle slider scrubbing events during interactive drag; do not trigger expensive Skia canvas repaints on every micro-pixel increment. - - Throttle canvas drag and snap-line calculation loops. - -#### 5. SkiaSharp Rendering & Frame Budgets -- **Frame Budgets**: Maintain $\le 16\text{ms}$ (60 FPS) and $\le 8\text{ms}$ (120 FPS) frame render times. -- **RenderTransform Over Layout Mutation**: Animate transformations using `RenderTransform` (GPU-accelerated compositing). Never animate `Margin`, `Width`, or `Height`, as mutating layout properties triggers full synchronous measure/arrange passes across the visual tree. -- **Minimize Visual Tree Depth**: Avoid unnecessary nested `Border`, `Grid`, and `Panel` elements. Keep visual hierarchy shallow. - -#### 6. Large Object Heap (LOH) & GC Hygiene -- **Never allocate $\ge 85\text{ KB}$ byte arrays in loops**: Reuse memory buffers via `ArrayPool.Shared` and `MemoryStream`. -- **Zero Base64 in Models**: Store raw `byte[]` for image and vector payloads. Compute Base64 only lazily during JSON persistence export. -- **Immediate Unmanaged Disposal**: Wrap short-lived `SKBitmap`, `SKImage`, `SKSurface`, `SKData`, and `SKCodec` instances in `using` blocks. Dispose previous bitmaps before assigning replacement preview bitmaps. -- **Weak Subscriptions**: Use `WeakReferenceMessenger` for pub/sub messaging to ensure garbage collection is never blocked by forgotten event subscriptions. - ---- - -## 5. Continuous PDF Scenario Development Workflow - -When adding support for a new or complex PDF type: - -1. **Place Sample PDF Locally**: Save the test PDF in the project root or test directory. Ensure it matches `.gitignore` patterns (`*.pdf`, `sample*.pdf`) and is **never** staged or committed to Git. -2. **Run Visual Verification Test**: - ```bash - dotnet test --filter "FullyQualifiedName~GenerateVisualComparison_SideBySide" - ``` -3. **Inspect Output Bitmaps**: Open the generated side-by-side PNG in `VisualArtifacts/` (automatically ignored by Git) to compare original PDF ground truth against the deconstructed canvas. -4. **Tune Algorithms**: Adjust clustering, Z-indexing, or shape heuristics in `PdfDeconstructionEngine` or `PdfLayoutAnalyzer`. -5. **Enforce Regression Invariance**: Run `dotnet test` and confirm all 770+ unit tests pass. - ---- - -## 6. Coding & Quality Standards - -- **Nullable Reference Types**: Enabled across all projects (`enable`). -- **Treat Warnings As Errors**: All builds must be 100% warning-free (`TreatWarningsAsErrors=true`). -- **Plugin-First Architecture**: All new tools, elements, sidebars, and panels must implement `IFryPlugin` and register into the appropriate registry. -- **Zero-Lag Compliance**: Zero UI-thread blocking, view caching on navigation, and virtualized collections are mandatory. -- **Unit Testing**: Every new service, converter, plugin, or deconstruction heuristic must include unit tests with deterministic assertions. -- **Documentation**: Keep [`docs/PLUGIN_BASED_ARCHITECTURE.md`](docs/PLUGIN_BASED_ARCHITECTURE.md), [`docs/PDF_DECONSTRUCTION_AND_EDITING.md`](docs/PDF_DECONSTRUCTION_AND_EDITING.md), and [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md) updated when making structural changes. - ---- - -## 7. Security, Privacy & Zero PII Policy (STRICT) - -**CRITICAL RULE**: Under no circumstances should sensitive data, credentials, or Personally Identifiable Information (PII) ever be written, hardcoded, or committed to this repository. - -1. **Zero PII in Source Code and Tests**: - - **Never** hardcode real personal names, private addresses, real phone numbers, real email addresses, or personal biometric/signature records in source code, unit test assertions, docstrings, or template defaults. - - **Never** write real government identification numbers (e.g. Aadhaar numbers, SSNs, PANs, Passport numbers, Driver's License IDs). - - In test cases, always use **structural assertions** (e.g. element count, dimension bounds, non-empty text) or **generic regular expressions** (e.g. `\b\d{4}\s\d{4}\s\d{4}\b`) rather than asserting specific personal data. - -2. **No Credentials, Keys, or Secrets**: - - **Never** commit API keys, access tokens, passwords, private certificates, or user credentials. - - Use environment variables or configuration providers for external services where needed. - -3. **Synthetic & Dummy Data Only**: - - When building mock templates, demonstrations, or test fixtures, use only standard synthetic dummy data (e.g. `Jane Doe`, `555-0199`, `user@example.com`, `ACME Corp`, generic sample logos). - -4. **Local Artifact & PDF Exclusion**: - - All real-world test PDFs, generated side-by-side visual comparison bitmaps, and test exports must be excluded via `.gitignore` (`*.pdf`, `VisualArtifacts/`, `*_side_by_side.png`). - - Prior to making commits or pushing to remote, always verify with `git status` and `git diff` that no untracked PDFs or sensitive data are being introduced. diff --git a/.agents/rules/m3_expressive_ui_mandate.md b/.agents/rules/m3_expressive_ui_mandate.md deleted file mode 100644 index 1acf3ef..0000000 --- a/.agents/rules/m3_expressive_ui_mandate.md +++ /dev/null @@ -1,65 +0,0 @@ -# STRICT MANDATE: Google Material Design 3 (M3) Expressive UI - -**APPLIES TO ALL AI AGENTS AND DEVELOPERS**: -Whenever you create new UI, modify existing UI, add dialogs, sidebars, buttons, controls, or adjust styles/themes in FryPDF, you **MUST STRICTLY FOLLOW GOOGLE MATERIAL DESIGN 3 (M3) EXPRESSIVE** guidelines. -Never use sharp, rigid, boxy, or flat legacy styling. - ---- - -## 1. Shape Scale Hierarchy (NEVER HARDCODE SMALL CORNER RADII) -Never write arbitrary `CornerRadius="2"`, `"4"`, `"5"` on interactive controls or containers. Always reference the tokens in `Material3ExpressiveTokens.axaml`: - -- **Pill Contours (`CornerRadius="{StaticResource M3ShapeCornerFull}"` or `9999`)**: - - Primary, accent, tonal, and action buttons (`primary-btn`, `accent-btn`, `action-pill-btn`, `m3-filled-btn`, `m3-tonal-btn`) - - Segmented button capsules (`Border.m3-segmented-container` + `Button.m3-segment-btn`) - - Global search fields (`TextBox.m3-search`, Command Palette search bar) - - Floating Action Buttons (`m3-fab`, `m3-fab-extended`) - - Chubby slider thumbs -- **28px Extra-Large Contours (`CornerRadius="{StaticResource M3ShapeCornerExtraLarge}"`)**: - - Modal dialog cards (`Border.m3-dialog-card`, `AboutDialog`, `CommandPaletteDialog`, `AiAssistantDialog`) - - Large hero promo cards and dashboard banners -- **16px Large Contours (`CornerRadius="{StaticResource M3ShapeCornerLarge}"`)**: - - Content cards (`m3-card-elevated`, `m3-card-filled`, `m3-card-outlined`) - - Form fields and inputs (`TextBox.m3-outlined`, `ComboBox`, `NumericUpDown`) - - Inspector section cards -- **12px Medium Contours (`CornerRadius="{StaticResource M3ShapeCornerMedium}"`)**: - - Context menus, dropdown menus, flyouts, tooltips, list items -- **8px Small Contours (`CornerRadius="{StaticResource M3ShapeCornerSmall}"`)**: - - Chips (`m3-chip`, `m3-filter-chip`), thumbnail cards, status badges - ---- - -## 2. Color Roles (NO HARDCODED LIGHT/DARK HEX COLORS) -Never hardcode hex colors (like `#FFFFFF`, `#000000`, `#F1F5F9`) in templates or hover triggers that break dark mode adaptability. Always use `{DynamicResource ...}` tokens: - -- **Primary Actions**: `M3PrimaryBrush`, `M3OnPrimaryBrush`, `M3PrimaryContainerBrush`, `M3OnPrimaryContainerBrush` -- **Secondary / Active Accents**: `M3SecondaryBrush`, `M3SecondaryContainerBrush`, `M3OnSecondaryContainerBrush` -- **Surfaces & Layers**: `M3SurfaceBrush`, `M3SurfaceDimBrush`, `M3SurfaceContainerLowestBrush` through `M3SurfaceContainerHighestBrush` -- **Borders & Dividers**: `M3OutlineBrush`, `M3OutlineVariantBrush` -- **Legacy Aliases**: When maintaining existing views, `WinBgBrush`, `WinPanelBrush`, `WinBorderBrush`, `WinAccentBrush`, `WinTextBrush`, `WinMutedBrush`, `WinHoverBrush`, `WinActiveBrush`, `WinInputBgBrush` map automatically to M3 tokens. - ---- - -## 3. Standard Component Classes (`Material3ExpressiveStyles.axaml`) -- **Buttons**: `m3-filled-btn`, `m3-tonal-btn`, `m3-elevated-btn`, `m3-outlined-btn`, `m3-text-btn`, `m3-fab`, `m3-icon-btn` -- **Capsules & Chips**: `Border.m3-segmented-container`, `Button.m3-segment-btn`, `Button.m3-chip`, `ToggleButton.m3-filter-chip` -- **Cards & Dialogs**: `Border.m3-card-elevated`, `Border.m3-dialog-card` -- **Inputs & Search**: `TextBox.m3-outlined`, `TextBox.m3-search` -- **Tactile Sliders**: Chubby 8-10px tracks with 20-22px thumbs and interactive scale transitions. - ---- - -## 4. MVVM: Maximum CommunityToolkit.Mvvm Utilization -Take full advantage of **`CommunityToolkit.Mvvm`** across all ViewModels: -- **`[ObservableProperty]`**: Generate observable properties from private fields (`[ObservableProperty] private string _title;`). -- **`[NotifyPropertyChangedFor]` & `[NotifyCanExecuteChangedFor]`**: Cascade dependent updates and automatically refresh button commands without manual boilerplate. -- **`[RelayCommand]` & Async Commands**: Decorate methods directly with `[RelayCommand]`. Asynchronous tasks (`async Task DoWorkAsync()`) automatically handle `IsRunning`, cancellation, and locking. -- **`WeakReferenceMessenger`**: Use decoupled pub/sub messaging (`WeakReferenceMessenger.Default.Send(...)` / `Register(...)`) or inherit from `ObservableRecipient` to prevent memory leaks and strong references. -- **`ObservableValidator`**: Use for forms, dialogs, and validated inputs with standard DataAnnotations (`[Required]`, `[Range]`, etc.). - ---- - -## 5. Verification -After making any UI changes: -1. `dotnet build` must succeed with **0 warnings and 0 errors** (`TreatWarningsAsErrors=true`). -2. Run `dotnet test --filter "FullyQualifiedName~Material3ExpressiveThemeTests"` to ensure no token regressions. diff --git a/.agents/rules/performance_and_zero_lag_mandate.md b/.agents/rules/performance_and_zero_lag_mandate.md deleted file mode 100644 index 6a76c9e..0000000 --- a/.agents/rules/performance_and_zero_lag_mandate.md +++ /dev/null @@ -1,73 +0,0 @@ -# STRICT PERFORMANCE MANDATE: Zero-Lag, 60+ FPS & Responsive Architecture - -**APPLIES TO ALL AI AGENTS AND DEVELOPERS**: -FryPDF is an interactive, real-time desktop document studio. **UI lag, frame drops, blocking operations, stuttering transitions, and high memory retention are strictly forbidden.** -Whenever you write or modify code in FryPDF, you **MUST ALWAYS THINK IN TERMS OF PERFORMANCE OPTIMIZATION**. - ---- - -## 1. Zero UI Thread Blocking -- **Never Run Heavy Operations on the UI Thread**: - - PDF deconstruction, parsing, Skia rendering, QuestPDF generation, OCR execution, AI inference, and disk/network I/O **must always be offloaded** via `Task.Run` or asynchronous commands. -- **Never Block Asynchronously**: - - Calling `.Result`, `.Wait()`, or `.GetAwaiter().GetResult()` on the Avalonia UI thread is strictly forbidden. -- **Always Pass `CancellationToken`**: - - Accept and propagate cancellation tokens throughout long-running operations so users can instantly cancel actions or switch pages without background worker orphan threads. - ---- - -## 2. Instant Navigation & View Caching (0ms Latency) -- **Cache Contributed Plugin Views**: - - In navigation controllers (such as `HomeViewModel`), always cache dynamically created views in an instance dictionary (`_dynamicViewCache`). Never destroy and re-instantiate heavy visual trees when navigating between tabs. -- **Pre-Mounted Static Views**: - - Built-in primary pages (Overview Dashboard, Tools Studio, PDF Reader Landing) should have pre-mounted XAML elements in `HomeView.axaml` to guarantee 0ms instantaneous switching without layout compilation overhead. - ---- - -## 3. Virtualization & Recycling -- **Always Virtualize Dynamic Collections**: - - Always use `ItemsRepeater` or `VirtualizingStackPanel` with `ScrollUnit="Pixel"` for lists with variable or large items (document thumbnails, tool card grids, audit logs, tabular data). - - Never use an unvirtualized `StackPanel` inside a `ScrollViewer` for collections larger than 10 items. - ---- - -## 4. Continuous Input Throttling & Debouncing -- **Pinch-to-Zoom Math**: - - Calculate trackpad pinch gestures multiplicatively and clamp strictly: - `Math.Clamp(Math.Round(currentZoom * (1.0 + delta), 3), 0.1, 5.0)` to eliminate exponential explosion. -- **Debounced Filters**: - - Debounce search queries and text filters (150–250ms) to avoid executing filter passes on every keystroke. -- **Throttled Sliders**: - - Do not trigger expensive Skia repaints or document recompilations on every slider micro-tick; throttle updates during drag. - ---- - -## 5. Memory Management & Unmanaged Resource Disposal -- **Large Object Heap (LOH) Avoidance**: - - Any byte array $\ge 85\text{ KB}$ is allocated on the LOH and causes GC fragmentation. Use `ArrayPool.Shared` and `MemoryStream` buffers. - - Never store Base64 strings in memory for image or vector assets; store raw `byte[] ImageData` directly and compute Base64 only lazily for JSON export. -- **Dispose Unmanaged Skia Objects Immediately**: - - `SKBitmap`, `SKImage`, `SKSurface`, `SKData`, and Avalonia `WriteableBitmap` hold native unmanaged pointers. - - Always wrap temporary Skia objects in `using` blocks. - - Always dispose old bitmaps before assigning replacement preview bitmaps. -- **Weak Subscriptions**: - - Use `WeakReferenceMessenger` for pub/sub messaging across ViewModels to avoid memory retention cycles that prevent garbage collection. - ---- - -## 6. Rendering & Frame Budgets -- **Frame Budgets**: - - Maintain 16ms per frame (60 FPS) and 8ms per frame (120 FPS). -- **Favor `RenderTransform` Over Layout Mutations**: - - Use GPU-composited `RenderTransform` rather than mutating layout properties (`Margin`, `Width`, `Height`) during animations or gesture interactions to avoid triggering costly synchronous layout reflows. -- **Keep Visual Trees Shallow**: - - Avoid deeply nested `Border` and `Grid` hierarchies. - ---- - -## 7. Verification -- Run navigation and gesture performance tests: - ```bash - dotnet test --filter "FullyQualifiedName~GestureAndNavigationTests" - ``` -- Verify zero warnings (`TreatWarningsAsErrors=true`). diff --git a/.agents/rules/plugin_pattern_mandate.md b/.agents/rules/plugin_pattern_mandate.md deleted file mode 100644 index d7ad794..0000000 --- a/.agents/rules/plugin_pattern_mandate.md +++ /dev/null @@ -1,57 +0,0 @@ -# STRICT ARCHITECTURE MANDATE: Modular Microkernel Plugin Pattern ("Everything is a Plugin") - -**APPLIES TO ALL AI AGENTS AND DEVELOPERS**: -Whenever you add features, create tools, contribute UI components, introduce file formats, integrate AI or OCR models, or refactor existing subsystems in FryPDF, you **MUST STRICTLY FOLLOW THE MODULAR MICROKERNEL PLUGIN PATTERN**. -Never write monolithic switch-case statements, god classes, or hardcoded UI component instantiations. - ---- - -## 1. The "Everything is a Plugin" Principle -FryPDF's architecture is inspired by **DeepSeek Harness (`deepseek-harness`)** and the **Cordis** framework: -- The core runtime does not privilege any single subsystem. -- All tools, workspace pages, sidebar panels, ribbon buttons, inspector property sections, canvas elements, AI providers, OCR engines, data connectors, and file importers/exporters are **modular plugins mounted on `IFryPluginContext`**. - ---- - -## 2. Core Implementation Rules - -### A. Inherit from `IFryPlugin` or `ToolPluginBase` -- For PDF tools, inherit from `ToolPluginBase` (which provides automated descriptor registration into `IPdfToolRegistry`). -- For other capabilities, implement `IFryPlugin` directly (`Id`, `Name`, `Version`, `RequiredServices`, `ApplyAsync`). - -### B. Mount Through the 12 Dynamic Registry Pillars -Never instantiate or route components via hardcoded `switch` statements. Always register through the dynamic registry corresponding to the capability: -1. **Tools**: `IPdfToolRegistry` via `ctx.RegisterTool(...)` / `PdfToolDescriptor` -2. **Ribbon Tabs & Groups**: `IRibbonRegistry` via `ctx.RegisterRibbonContribution(...)` -3. **Sidebar Panels**: `ISidebarRegistry` via `ctx.RegisterSidebarTab(...)` -4. **Inspector Sections**: `IInspectorRegistry` via `ctx.RegisterInspectorSection(...)` -5. **Workspace Pages**: `INavigationRegistry` via `ctx.RegisterNavigationItem(...)` -6. **Canvas Elements**: `ICanvasElementRegistry` via `ctx.RegisterCanvasElement(...)` -7. **Document Importers**: `IDocumentImporterRegistry` -8. **Document Exporters**: `IDocumentExporterRegistry` -9. **AI Providers**: `IAiProviderRegistry` -10. **OCR Engines**: `IOcrEngineRegistry` -11. **Data Connectors**: `IDataConnectorRegistry` -12. **Status Bar & Modals**: `IStatusBarRegistry`, `IDialogRegistry` - -### C. Reversible Effects (`PluginScope` & LIFO Rollback) -Every registration—whether an event listener, a message broker subscription, a status bar widget, or an unmanaged cache—**MUST be registered through `PluginScope` (`ctx.RegisterEffect(...)`)**. -When a plugin is unmounted or reloaded, its effects unwind in reverse order to ensure **100% clean teardown and zero memory leaks**. - -### D. Group Capabilities into Bundles (`IFryPluginBundle`) -Group related plugins into a bundle (e.g. `ToolsOrganizeBundle`, `CanvasElementsBundle`, `WorkspacePagesBundle`). Bundles allow composition into runtime profiles (`desktop.profile.json`, `headless.profile.json`). - -### E. Declarative Settings Schema -If a plugin requires configuration (API keys, URLs, model names, options), declare them via `IFryPlugin.SettingsSchema` using `PluginSettingDefinition`. The UI automatically renders an M3 Expressive configuration card in `PluginsDialog.axaml` without manual XAML forms. - ---- - -## 3. Verification -- `dotnet build` must succeed with **0 warnings and 0 errors** (`TreatWarningsAsErrors=true`). -- Unit tests must be written for the plugin and descriptor registration in `tests/PdfEditorApp.Tests/`. -- Run: - ```bash - dotnet test --filter "FullyQualifiedName~PluginKernelTests" - dotnet test --filter "FullyQualifiedName~PluginsStudioUiTests" - dotnet test --filter "FullyQualifiedName~TotalMicrokernelTests" - ``` diff --git a/.agents/skills/avalonia/DETAILED_SUMMARY.md b/.agents/skills/avalonia/DETAILED_SUMMARY.md deleted file mode 100644 index 200c5bc..0000000 --- a/.agents/skills/avalonia/DETAILED_SUMMARY.md +++ /dev/null @@ -1,479 +0,0 @@ -# Avalonia Skill Refactoring - Detailed Summary - -## Executive Summary - -The **avalonia skill** has been successfully refactored from a monolithic ~650-line document into a modular orchestration hub following the proven pattern from **thought-patterns** skill. - -**Result**: A 314-line orchestration hub + 6 focused, self-contained resource files (3,852 lines total) that provide comprehensive, navigable guidance for cross-platform Avalonia development. - ---- - -## Before & After Comparison - -### Before Refactoring -``` -SKILL.md (650 lines) -├── Project structure -├── MVVM architecture -├── XAML best practices -├── Data binding -├── Value converters -├── Styling and theming -├── Common controls -├── Custom controls -├── Reactive programming -├── Cross-platform -├── Performance optimization -├── Common patterns -├── Testing -└── Debugging tips - -resources/ (3 files - basic, underutilized) -├── controls-reference.md (677 lines) -├── platform-specific.md (743 lines) -└── styling-guide.md (552 lines) -``` - -### After Refactoring -``` -SKILL.md (314 lines) - ORCHESTRATION HUB -├── Quick reference table (6 resources) -├── Framework overview -├── Getting started -├── Core patterns (MVVM, Reactive, Platform-adaptive) -├── Navigation by task (5 scenarios) -├── Resource organization guide -├── Common workflows (4 patterns) -├── Best practices summary -└── Cross-platform deployment info - -resources/ (6 files - comprehensive, well-organized) -├── mvvm-databinding.md (622 lines) - PRIMARY -├── controls-reference.md (677 lines) - PRIMARY -├── reactive-animations.md (665 lines) - ADVANCED -├── custom-controls-advanced.md (593 lines) - ADVANCED -├── styling-guide.md (552 lines) - PRIMARY -└── platform-specific.md (743 lines) - ADVANCED - -REFACTORING_SUMMARY.md (documentation) -``` - ---- - -## Content Breakdown by Resource - -### 1. MVVM Data Binding (622 lines) -**Purpose**: Foundation for understanding Avalonia's MVVM architecture and data binding system - -**Sections**: -- MVVM Architecture overview and benefits -- ViewModel base classes (ReactiveObject vs INotifyPropertyChanged) -- Data binding fundamentals (modes, paths, syntax) -- Binding paths (simple, nested, indexed, relative source) -- Binding to commands (parameter passing, multi-binding) -- Multi-binding (combining multiple values) -- Binding validation -- Value converters (single and multi-value) -- Dependency injection setup with ServiceCollection -- Collections and list binding (ObservableCollection) -- ListBox and DataGrid binding patterns -- Design-time data (for XAML preview) -- Common patterns (master-detail, tab navigation, loading state) -- Best practices - -**Key Features**: -- Comprehensive DI examples -- ReactiveUI integration -- Real-world validation patterns -- Service registration walkthrough - -### 2. Controls Reference (677 lines) -**Purpose**: Complete documentation of all Avalonia controls - -**Sections**: -- **Layout Controls**: Grid, StackPanel, DockPanel, WrapPanel, UniformGrid, Canvas, Panel, ScrollViewer, Border, Viewbox -- **Input Controls**: TextBox, Button, CheckBox, RadioButton, ComboBox, Slider, NumericUpDown, DatePicker, TimePicker, CalendarDatePicker, ToggleSwitch -- **Display Controls**: TextBlock, Label, Image, ProgressBar, Separator -- **Collection Controls**: ListBox, TreeView, DataGrid, ItemsControl, Carousel -- **Menu & Navigation**: Menu, ContextMenu, TabControl, Expander, SplitView -- **Dialogs & Popups**: Window, Dialog, ToolTip, Flyout -- **Drawing & Shapes**: Rectangle, Ellipse, Line, Polyline, Polygon, Path -- **Advanced Controls**: AutoCompleteBox, Calendar, MaskedTextBox, ColorPicker, PathIcon - -**Key Features**: -- XAML examples for every control -- Common property bindings -- Template customization -- Real-world usage patterns - -### 3. Reactive Programming & Animations (665 lines) -**Purpose**: Advanced reactive patterns and animation techniques - -**Sections**: -- ReactiveUI integration and installation -- Reactive properties with RaiseAndSetIfChanged -- Reactive commands (sync and async) -- Observable sequences (filtering, transformation) -- Combining observables (CombineLatest, Merge, Switch) -- Buffering and grouping -- Basic animations and transitions -- Complex multi-step animations -- Easing functions (10+ options with examples) -- Programmatic animations in code-behind -- Observable patterns (search with debounce, form validation, auto-complete) -- Performance optimization (debouncing, throttling, sampling) -- Memory management and disposal -- Best practices - -**Key Features**: -- Complete observable operator reference -- Easing function gallery -- Real-world search/validation patterns -- Performance tuning techniques - -### 4. Custom Controls & Advanced Techniques (593 lines) -**Purpose**: Building custom controls and optimizing complex UIs - -**Sections**: -- Creating custom TemplatedControl -- Control properties (StyledProperty) -- Template application (OnApplyTemplate) -- User control composition -- Control templates -- Advanced layouts (adaptive panels, virtualized) -- Performance optimization: - - Compiled bindings - - Virtualization (Simple, Item modes) - - Lazy loading and pagination - - Image optimization -- Render transforms (Translate, Scale, Rotate, Skew) -- Drawing and graphics: - - Shapes (Rectangle, Ellipse, Path) - - Drawing context API - - SVG-like path data -- Styling custom controls (complex selectors) -- Testing with Avalonia.Headless - -**Key Features**: -- Full custom control lifecycle -- Virtualization implementation -- Graphics rendering examples -- Custom control testing - -### 5. Styling Guide (552 lines) -**Purpose**: Advanced styling, theming, and animations - -**Sections**: -- Style basics (selectors, pseudo-classes, combinators) -- Resource dictionaries and theming -- Control templates with template parts -- Data templates (simple and hierarchical) -- Animations: - - Basic keyframe animations - - Transitions and timing - - Easing functions - - Complex multi-step animations - - Infinite loops -- Theme variants (light/dark mode) -- Theme-aware resources -- Runtime theme switching -- Advanced patterns: - - Button styles (primary, danger, icon) - - Card styles - - Input field styling - - List item styling -- Custom theme example (Material Design) -- Performance tips - -**Key Features**: -- Comprehensive selector reference -- Complete animation gallery -- Theme variant patterns -- Material Design example - -### 6. Platform-Specific Implementation (743 lines) -**Purpose**: Cross-platform considerations and platform-specific features - -**Sections**: -- Platform detection (Windows, macOS, Linux, Android, iOS, Browser) -- Multi-platform project structure -- Service abstraction pattern -- Platform-specific service implementations: - - Desktop (FileService example) - - Android (with Context) - - iOS (with NSFileManager) -- Service registration per platform -- Platform-specific UI (OnPlatform markup) -- Platform-specific resources -- Platform-specific views (view locator pattern) -- Window management per platform -- Mobile activity setup (Android) -- iOS AppDelegate -- File system access (cross-platform paths) -- Native dialogs -- Platform-specific features: - - Windows (UWP APIs, DLLs) - - macOS (Cocoa, Dock menu, Touch Bar) - - Linux (D-Bus, system tray) - - Android (Toast, permissions, sharing) - - iOS (activities, alerts, sharing) -- Input handling (touch vs mouse, keyboard shortcuts) -- Performance considerations per platform -- Testing platform-specific code - -**Key Features**: -- Complete service abstraction examples -- Platform detection patterns -- Conditional compilation examples -- All 6 platforms covered - ---- - -## Navigation Features - -### Quick Reference Table (Main SKILL.md) - -Immediate access to the right resource: - -| Task/Goal | Resource | -|-----------|----------| -| MVVM patterns, data binding, dependency injection, value converters | mvvm-databinding.md | -| UI controls reference | controls-reference.md | -| Custom controls, advanced layouts, performance optimization | custom-controls-advanced.md | -| Styling, themes, animations, control templates | styling-guide.md | -| Reactive patterns, commands, observables, animations | reactive-animations.md | -| Platform-specific implementation | platform-specific.md | - -### Task-Based Navigation (Main SKILL.md) - -Five common scenarios with explicit resource paths: - -``` -Task: "I need to build a form with validation" - 1. Load mvvm-databinding.md → Implement ViewModel - 2. Load controls-reference.md → Find form controls - 3. Load reactive-animations.md → Add reactive validation - -Task: "I'm seeing poor performance with large lists" - 1. Load custom-controls-advanced.md → Enable virtualization - 2. Load mvvm-databinding.md → Use compiled bindings - 3. Load reactive-animations.md → Debounce updates - -Task: "I need platform-specific behavior" - 1. Load platform-specific.md → Implement service interfaces - 2. Load mvvm-databinding.md → Register via DI - 3. Platform-specific projects → Implement per-platform - -Task: "I want custom styling and animations" - 1. Load styling-guide.md → Define styles/themes - 2. Load reactive-animations.md → Add animations - 3. Load custom-controls-advanced.md → Custom templates - -Task: "I'm building a complex control" - 1. Load custom-controls-advanced.md → TemplatedControl pattern - 2. Load mvvm-databinding.md → Attached properties/binding - 3. Load styling-guide.md → Control templates -``` - -### Common Workflows (Main SKILL.md) - -Four detailed workflow patterns: - -1. **Desktop App (Windows/macOS/Linux)** - - Standard project setup - - Create Views and ViewModels - - Use controls for UI - - Add styles - - Implement services with DI - - Add animations - - Test on each platform - -2. **Cross-Platform Mobile+Desktop** - - Shared + platform-specific projects - - Service interface abstraction - - Per-platform implementations - - OnPlatform adaptive UI - - DI registration - - Comprehensive testing - -3. **Real-Time Search** - - SearchViewModel design - - Observable collections - - Reactive search pattern - - Input debouncing - - ListBox display - - CSS styling - -4. **Complex Data-Driven UI** - - ViewModel hierarchy - - Master-detail views - - DataGrid for tables - - Sorting/filtering with observables - - Virtualization optimization - - Custom controls - ---- - -## Quality Metrics - -### Organization -- ✓ 6 focused resource files (vs. 1 monolithic file) -- ✓ Clear decision table for navigation -- ✓ Self-contained modules -- ✓ Zero redundancy across files -- ✓ Hierarchical section structure - -### Coverage -- ✓ All 20+ major controls documented with examples -- ✓ All 6 platforms (Windows, macOS, Linux, iOS, Android, Web) -- ✓ MVVM, reactive, styling, platform patterns -- ✓ Beginner to advanced topics -- ✓ Testing, debugging, optimization included - -### Usability -- ✓ Quick reference table (seconds to find resource) -- ✓ Task-based navigation (5 common scenarios) -- ✓ Workflow examples (4 detailed patterns) -- ✓ Code examples for every pattern -- ✓ Best practices in every resource - -### Content -- ✓ 3,852 total lines (vs. 650 original) -- ✓ 314-line orchestration hub -- ✓ 6x more comprehensive content -- ✓ All existing content preserved and enhanced -- ✓ Improved organization and clarity - -### Consistency -- ✓ Follows thought-patterns orchestration pattern -- ✓ Consistent formatting and structure -- ✓ Unified code example style -- ✓ Consistent best practices sections -- ✓ Aligned metadata and descriptions - ---- - -## File Statistics - -``` -File Lines Purpose -───────────────────────────────────────────────────────────── -SKILL.md 314 Orchestration hub -mvvm-databinding.md 622 MVVM + data binding -controls-reference.md 677 UI controls -reactive-animations.md 665 Reactive patterns -custom-controls-advanced.md 593 Advanced techniques -styling-guide.md 552 Styling + animations -platform-specific.md 743 Cross-platform -───────────────────────────────────────────────────────────── -TOTAL 4,166 (without REFACTORING_SUMMARY) -``` - ---- - -## Validation Checklist - -✓ All controls documented with XAML examples -✓ All 6 platforms covered (Windows, macOS, Linux, iOS, Android, Web) -✓ Styling and theming guidance complete (selectors, templates, animations) -✓ Data binding patterns fully documented (modes, converters, validation) -✓ Reactive programming comprehensive (properties, commands, observables) -✓ Performance optimization detailed (virtualization, compiled bindings) -✓ Testing guidance included (unit tests, UI tests, headless) -✓ MVVM architecture clearly explained -✓ Platform separation achieved (dedicated platform-specific.md) -✓ Controls organization improved (45+ controls across 8 categories) -✓ Navigation structure enhanced (quick reference + task-based routing) -✓ Design pattern examples provided (master-detail, validation, search) -✓ Best practices throughout (10+ per resource) -✓ Code examples all tested and verified format - ---- - -## Key Improvements Achieved - -### 1. Accessibility -- **Before**: Scroll through 650 lines to find information -- **After**: Decision table + quick lookup → Find resource in seconds - -### 2. Modularity -- **Before**: All content in one file, many cross-cutting concerns -- **After**: 6 focused files, each addressing 1-2 related topics - -### 3. Completeness -- **Before**: ~650 lines covering Avalonia basics -- **After**: ~4,166 lines with comprehensive coverage - -### 4. Learning Path -- **Before**: No clear progression from basics to advanced -- **After**: Clear path: MVVM → Controls → Styling → Reactive → Advanced - -### 5. Platform Support -- **Before**: Platform info scattered in main file -- **After**: Dedicated 743-line platform-specific resource - -### 6. Documentation -- **Before**: Basic examples -- **After**: Comprehensive examples for every pattern - ---- - -## Usage Examples - -### For Quick Answer -**Q: How do I bind a list to a ListBox?** -- Open SKILL.md → Find "UI controls reference" in table → Load controls-reference.md → Find ListBox section - -**Time**: 30 seconds - -### For Pattern Learning -**Q: How do I implement reactive search?** -- Open SKILL.md → Find task "Add Real-Time Search" → Follow resource path: - - mvvm-databinding.md (SearchViewModel) - - reactive-animations.md (Observable patterns) - - controls-reference.md (ListBox display) - - styling-guide.md (CSS styling) - -**Time**: 10 minutes - -### For Complex Scenario -**Q: Build a cross-platform app with custom controls and real-time data** -- Follow workflow: "Complex Data-Driven UI" -- Reference resources: - - mvvm-databinding.md (architecture) - - custom-controls-advanced.md (custom UI) - - reactive-animations.md (real-time updates) - - platform-specific.md (deployment) - -**Time**: ~2 hours - ---- - -## Alignment with Thought-Patterns Pattern - -The avalonia refactoring follows the proven orchestration pattern from thought-patterns: - -| Aspect | Thought-Patterns | Avalonia | -|--------|------------------|----------| -| Hub size | 169 lines | 314 lines (more complex) | -| Resource files | 6 files | 6 files (pattern matched) | -| Total content | ~1,900 lines | ~4,166 lines (UI more extensive) | -| Navigation | Decision table | Decision table + task routing | -| Organization | Pattern categories | Skill categories | -| Approach | Modular, self-contained | Modular, self-contained | - -**Conclusion**: Avalonia refactoring successfully implements orchestration pattern with appropriate adaptation for UI framework complexity. - ---- - -## Conclusion - -The avalonia skill has been transformed from a difficult-to-navigate monolith into an elegant, modular orchestration hub with 6 focused resource files. Users can now: - -1. **Find answers quickly** via decision table (30 seconds) -2. **Learn progressively** from basics to advanced topics -3. **Reference patterns** for common scenarios -4. **Understand deeply** with comprehensive examples -5. **Deploy confidently** with platform guidance - -All existing content has been preserved and significantly enhanced with new material on reactive patterns, custom controls, and advanced optimization techniques. diff --git a/.agents/skills/avalonia/REFACTORING_SUMMARY.md b/.agents/skills/avalonia/REFACTORING_SUMMARY.md deleted file mode 100644 index ff1fa5e..0000000 --- a/.agents/skills/avalonia/REFACTORING_SUMMARY.md +++ /dev/null @@ -1,303 +0,0 @@ -# Avalonia Skill Refactoring Summary - -## Refactoring Complete ✓ - -The avalonia skill has been successfully refactored following the modular orchestration pattern established in skills/thought-patterns/. - ---- - -## Metrics - -### Main SKILL.md File -- **Original**: ~650 lines (monolithic, all content mixed together) -- **Refactored**: 314 lines (orchestration hub) -- **Reduction**: 52% shorter, focused on routing and decision-making - -### Resource Files Organization - -| Resource File | Purpose | Lines | -|---|---|---| -| **mvvm-databinding.md** | MVVM architecture, data binding, DI, converters | 622 | -| **controls-reference.md** | Complete controls documentation (layouts, inputs, collections, menus) | 677 | -| **reactive-animations.md** | Reactive patterns, commands, observables, animations | 665 | -| **custom-controls-advanced.md** | Custom controls, advanced layouts, performance, virtualization | 593 | -| **styling-guide.md** | Styling, themes, animations, control templates | 552 | -| **platform-specific.md** | Cross-platform implementation, mobile/desktop specifics | 743 | - -### Total Content -- **Original**: ~650 lines in single file -- **Refactored**: 314 (hub) + 4,252 (resources) = **4,566 total lines** -- **Improvement**: 7x more content, all well-organized and navigable - ---- - -## Architecture Changes - -### Before Refactoring -``` -avalonia/ -└── SKILL.md (650 lines) - ├── Project structure - ├── MVVM architecture - ├── XAML best practices - ├── Data binding - ├── Value converters - ├── Styling and theming - ├── Common controls - ├── Custom controls - ├── Reactive programming - ├── Cross-platform - ├── Performance optimization - ├── Common patterns - ├── Testing - └── Debugging tips - └── resources/ (3 files - underutilized) - ├── controls-reference.md - ├── platform-specific.md - └── styling-guide.md -``` - -### After Refactoring (Modular Orchestration) -``` -avalonia/ -├── SKILL.md (314 lines) - ORCHESTRATION HUB -│ ├── Quick reference table (when to load which resource) -│ ├── Framework overview -│ ├── Getting started (minimal setup) -│ ├── Core patterns (MVVM, Reactive, Platform-adaptive) -│ ├── Navigation by task (5 common scenarios) -│ ├── Resource organization guide -│ ├── Common workflows (4 patterns) -│ └── Best practices summary -└── resources/ - ├── mvvm-databinding.md (622 lines) PRIMARY - │ ├── MVVM architecture overview - │ ├── ViewModel base classes - │ ├── Data binding fundamentals - │ ├── Binding paths and modes - │ ├── Value converters (single & multi) - │ ├── Dependency injection - │ ├── Collections and binding - │ ├── Design-time data - │ └── Common patterns - ├── controls-reference.md (677 lines) PRIMARY - │ ├── Layout controls (Grid, StackPanel, DockPanel, WrapPanel, etc.) - │ ├── Input controls (TextBox, Button, CheckBox, RadioButton, etc.) - │ ├── Display controls (TextBlock, Label, Image, ProgressBar, etc.) - │ ├── Collection controls (ListBox, DataGrid, TreeView, Carousel, etc.) - │ ├── Menu and navigation (Menu, TabControl, SplitView, etc.) - │ ├── Dialogs and popups (Window, Dialog, Tooltip, Flyout, etc.) - │ └── Drawing and shapes (Rectangle, Ellipse, Path, etc.) - ├── reactive-animations.md (665 lines) ADVANCED - │ ├── ReactiveUI integration - │ ├── Reactive properties - │ ├── Reactive commands (sync & async) - │ ├── Observable sequences - │ ├── Animations and transitions - │ ├── Easing functions - │ ├── Programmatic animations - │ ├── Observable patterns (search, validation, auto-complete) - │ └── Performance optimization - ├── custom-controls-advanced.md (593 lines) ADVANCED - │ ├── Custom TemplatedControl creation - │ ├── User control composition - │ ├── Advanced layouts (adaptive, virtualized) - │ ├── Performance optimization - │ ├── Lazy loading and virtualization - │ ├── Image optimization - │ ├── Render transforms - │ ├── Drawing and graphics - │ └── Testing custom controls - ├── styling-guide.md (552 lines) PRIMARY - │ ├── Style basics (selectors, pseudo-classes) - │ ├── Resource dictionaries - │ ├── Control templates - │ ├── Data templates - │ ├── Animations - │ ├── Theme variants (light/dark) - │ ├── Advanced styling patterns - │ ├── Custom theme example - │ └── Performance tips - └── platform-specific.md (743 lines) ADVANCED - ├── Platform detection - ├── Multi-project structure - ├── Platform-specific services - ├── Platform-specific UI - ├── Window management per platform - ├── File system access - ├── Native dialogs - ├── Platform-specific features (Windows/macOS/Linux/Android/iOS) - ├── Input handling - ├── Performance considerations - └── Testing platform-specific code -``` - ---- - -## Navigation Structure - -### Decision-Based Routing (Main SKILL.md) - -The refactored hub uses a **decision table** to route to the right resource: - -```markdown -| Task/Goal | Load Resource | -|-----------|---------------| -| MVVM patterns, data binding, dependency injection, value converters | `resources/mvvm-databinding.md` | -| UI controls reference (layouts, inputs, collections, menus) | `resources/controls-reference.md` | -| Custom controls, advanced layouts, performance optimization, virtualization | `resources/custom-controls-advanced.md` | -| Styling, themes, animations, control templates | `resources/styling-guide.md` | -| Reactive patterns, commands, observables, animations | `resources/reactive-animations.md` | -| Windows, macOS, Linux, iOS, Android implementation details | `resources/platform-specific.md` | -``` - -### Task-Based Workflows - -Five common scenarios with explicit navigation paths: - -1. **"I need to build a form with validation"** - - mvvm-databinding → controls-reference → reactive-animations - -2. **"I'm seeing poor performance with large lists"** - - custom-controls-advanced → mvvm-databinding → reactive-animations - -3. **"I need platform-specific behavior"** - - platform-specific → mvvm-databinding → platform-specific DI - -4. **"I want custom styling and animations"** - - styling-guide → reactive-animations → custom-controls-advanced - -5. **"I'm building a complex control"** - - custom-controls-advanced → mvvm-databinding → styling-guide - ---- - -## Content Organization Improvements - -### Coverage by Concern Area - -| Concern | Before | After | Location | -|---------|--------|-------|----------| -| MVVM & Architecture | Fragmented | Comprehensive | mvvm-databinding.md | -| Controls Reference | Fragmented | Complete + organized | controls-reference.md | -| Data Binding | Fragmented | Dedicated section | mvvm-databinding.md | -| Styling & Theming | Dedicated | Enhanced | styling-guide.md | -| Animations | Minimal | Full section | reactive-animations.md | -| Reactive Patterns | Minimal | Comprehensive | reactive-animations.md | -| Custom Controls | Basic | Advanced | custom-controls-advanced.md | -| Performance | Brief | Detailed | custom-controls-advanced.md | -| Platform Support | Detailed | Enhanced | platform-specific.md | -| Testing | Basic | Referenced | All resources | - -### Platform Separation - -**Before**: Platform guidance spread throughout main file -**After**: Dedicated `platform-specific.md` with: -- Platform detection patterns -- Service abstraction examples -- Per-platform implementations (Windows, macOS, Linux, iOS, Android) -- Platform-specific features and native integration -- Conditional UI rendering (OnPlatform patterns) -- Cross-platform best practices - ---- - -## Key Improvements - -### 1. **Clarity & Navigation** -- ✓ Quick reference table on first page -- ✓ Clear "When to Load Which Resource" guidance -- ✓ Task-based navigation (5 common scenarios) -- ✓ Workflow examples for common use cases - -### 2. **Modularity** -- ✓ Each resource focused on 1-2 related topics -- ✓ Self-contained modules (can read independently) -- ✓ No redundant content across files -- ✓ Clear dependencies between resources - -### 3. **Content Expansion** -- ✓ MVVM patterns deeply covered (622 lines) -- ✓ Complete controls reference (677 lines) -- ✓ Reactive programming comprehensive (665 lines) -- ✓ Advanced techniques detailed (593 lines custom, 552 styling) -- ✓ Platform support enhanced (743 lines) - -### 4. **Accessibility** -- ✓ Front-matter clearly identifies purpose -- ✓ Table-based decision system -- ✓ Code examples for every pattern -- ✓ Clear section hierarchy -- ✓ Best practices in every resource - -### 5. **Consistency** -- ✓ Follows thought-patterns orchestration pattern -- ✓ Similar structure and formatting -- ✓ Consistent code example style -- ✓ Unified best practices section - ---- - -## How to Use the Refactored Skill - -### For New Users -1. Read the main **SKILL.md** (314 lines, ~5 minutes) -2. Identify your task/goal -3. Look up the corresponding resource in the decision table -4. Load that resource for detailed guidance - -### For Quick Reference -- Use the **decision table** to find the right resource in seconds -- Each resource has a clear section hierarchy -- All code examples are copyable and immediately usable - -### For Comprehensive Learning -- Start with **mvvm-databinding.md** (architecture foundation) -- Progress to **controls-reference.md** (UI components) -- Add **styling-guide.md** (visual design) -- Explore **reactive-animations.md** (advanced patterns) -- Master **custom-controls-advanced.md** (complex scenarios) -- Reference **platform-specific.md** (multi-platform deployment) - ---- - -## Validation Checklist ✓ - -✓ All controls documented (GridLayout, StackPanel, ListBox, DataGrid, etc.) -✓ All platforms covered (Windows, macOS, Linux, iOS, Android) -✓ Styling guidance complete (selectors, templates, animations, themes) -✓ Data binding patterns documented (modes, converters, validation) -✓ Reactive programming comprehensive (properties, commands, observables) -✓ Performance optimization covered (virtualization, compiled bindings, debouncing) -✓ Testing guidance included (unit tests, UI tests with Avalonia.Headless) -✓ MVVM architecture clearly explained -✓ Platform separation achieved -✓ Controls organization improved -✓ Navigation structure enhanced - ---- - -## Comparison to Thought-Patterns Reference - -The thought-patterns skill was successfully refactored from ~650 to 169 lines (orchestration hub) with 6 focused resource files. The avalonia refactoring follows the same pattern: - -- **Main file size**: Avalonia 314 lines (vs. thought-patterns 169) - justified by additional complexity of UI framework -- **Resource files**: Avalonia 6 files (vs. thought-patterns 6 files) - matched complexity -- **Total lines**: Avalonia 4,566 (vs. thought-patterns ~1,900) - reflects comprehensive UI documentation -- **Navigation**: Both use decision tables and task-based routing -- **Organization**: Both follow modular, self-contained pattern - ---- - -## Summary - -The avalonia skill has been successfully transformed from a monolithic 650-line document into a modular orchestration hub (314 lines) + 6 focused resource files (4,252 lines). The refactoring: - -- **Improves clarity**: Clear decision table routing on first page -- **Enhances modularity**: Each resource self-contained and focused -- **Expands content**: 7x more material, all well-organized -- **Maintains consistency**: Follows thought-patterns orchestration pattern -- **Enables learning**: Clear progression path from basics to advanced topics -- **Supports quick reference**: Decision table + task-based navigation - -Users can now quickly find exactly what they need without wading through irrelevant content. diff --git a/.agents/skills/avalonia/SKILL.md b/.agents/skills/avalonia/SKILL.md deleted file mode 100644 index 283e1fd..0000000 --- a/.agents/skills/avalonia/SKILL.md +++ /dev/null @@ -1,321 +0,0 @@ ---- -name: avalonia -description: Expert guidance for developing cross-platform desktop applications with Avalonia UI framework. Use when building, debugging, or optimizing Avalonia apps including MVVM architecture, XAML design, data binding, styling, theming, custom controls, and cross-platform deployment for Windows, macOS, Linux, iOS, Android, and WebAssembly. -version: 2.0 ---- - -# Avalonia UI Framework - Orchestration Hub - -Modular guidance for cross-platform desktop and mobile development using Avalonia, a WPF-inspired XAML-based framework for .NET. - -> [!IMPORTANT] -> **REPOSITORY MANDATE: Google Material Design 3 (M3) Expressive** -> In this repository, **ALL** Avalonia UI controls, views, dialogs, sidebars, buttons, and styles **MUST strictly follow Material Design 3 (M3) Expressive**. -> - **Never hardcode small corner radii** (`2`, `4`, `5`). Use M3 shape tokens: Pills (`M3ShapeCornerFull`/`9999`) for buttons, search bars, segmented capsules, and slider thumbs; `M3ShapeCornerExtraLarge` (28) for dialog cards; `M3ShapeCornerLarge` (16) for cards/inputs; `M3ShapeCornerMedium` (12) for menus. -> - **Never hardcode hex colors**. Always bind to dynamic tokens (`M3PrimaryBrush`, `M3SecondaryContainerBrush`, `M3SurfaceContainer...`, or legacy `Win...Brush` aliases). -> - Refer to `src/PdfEditorApp/Styles/Material3ExpressiveTokens.axaml`, `Material3ExpressiveStyles.axaml`, and `docs/MATERIAL_DESIGN_3_EXPRESSIVE_GUIDELINES.md`. - -## Quick Reference: When to Load Which Resource - -| Task/Goal | Load Resource | -|-----------|---------------| -| MVVM patterns, data binding, dependency injection, value converters | `resources/mvvm-databinding.md` | -| UI controls reference (layouts, inputs, collections, menus) | `resources/controls-reference.md` | -| Custom controls, advanced layouts, performance optimization, virtualization | `resources/custom-controls-advanced.md` | -| Styling, themes, animations, control templates | `resources/styling-guide.md` | -| Reactive patterns, commands, observables, animations | `resources/reactive-animations.md` | -| Windows, macOS, Linux, iOS, Android implementation details | `resources/platform-specific.md` | - -## Framework Overview - -**Avalonia** is a cross-platform XAML framework supporting: -- **Platforms**: Windows, macOS, Linux, iOS, Android, WebAssembly -- **Architecture**: MVVM with ReactiveUI support -- **Styling**: CSS-like selectors with Fluent/Simple themes -- **Features**: Data binding, reactive commands, observable collections, custom controls -- **Modern .NET**: .NET 6+ and .NET Standard 2.0 - -### Standard Project Structure - -``` -MyAvaloniaApp/ -├── MyAvaloniaApp/ # Shared code -│ ├── App.axaml -│ ├── Views/ # XAML views -│ ├── ViewModels/ # Business logic + state -│ ├── Models/ # Data models -│ ├── Services/ # Application services -│ ├── Converters/ # Value converters -│ ├── Assets/ # Images, fonts -│ └── Styles/ # Style resources -├── MyAvaloniaApp.Desktop/ # Desktop-specific (Win/Mac/Linux) -├── MyAvaloniaApp.Android/ # Android-specific (optional) -├── MyAvaloniaApp.iOS/ # iOS-specific (optional) -└── MyAvaloniaApp.Browser/ # WebAssembly (optional) -``` - -## Getting Started - -### Minimal Setup - -```csharp -// Program.cs -public static void Main(string[] args) -{ - BuildAvaloniaApp().StartWithClassicDesktopLifetime(args); -} - -public static AppBuilder BuildAvaloniaApp() => - AppBuilder.Configure() - .UsePlatformDetect() - .LogToTrace(); -``` - -```xml - - - - - - -``` - -```xml - - - - - - -``` - -## Core Patterns - -### MVVM Architecture Pattern - -1. **View** (XAML): UI presentation with data bindings -2. **ViewModel** (C#): State management and commands -3. **Model** (C#): Business logic and data access -4. **Service**: Cross-cutting concerns (DI/IoC) - -**Load** `resources/mvvm-databinding.md` for: -- ViewModel base classes -- Data binding modes and paths -- Multi-binding and converters -- Dependency injection setup -- Design-time data - -### Reactive Programming Pattern - -Leverage ReactiveUI for event-driven UI updates: - -```csharp -this.WhenAnyValue(x => x.SearchText) - .Debounce(TimeSpan.FromMilliseconds(300)) - .Subscribe(text => PerformSearch(text)); -``` - -**Load** `resources/reactive-animations.md` for: -- Reactive properties and commands -- Observable sequences -- Animations and transitions -- Performance optimization - -### Platform-Adaptive Pattern - -Design once, adapt per platform: - -```xml - - - - -``` - -**Load** `resources/platform-specific.md` for: -- Runtime platform detection -- Platform-specific services -- Conditional UI rendering -- Native dialogs and features - -## Navigation by Task - -### "I need to build a form with validation" - -1. Load `resources/mvvm-databinding.md` → Implement ViewModel with property validation -2. Load `resources/controls-reference.md` → Find TextBox, ComboBox, Button controls -3. Load `resources/reactive-animations.md` → Add debounced validation with observables - -### "I'm seeing poor performance with large lists" - -1. Load `resources/custom-controls-advanced.md` → Enable virtualization -2. Load `resources/mvvm-databinding.md` → Use compiled bindings -3. Load `resources/reactive-animations.md` → Debounce/throttle updates - -### "I need platform-specific behavior" - -1. Load `resources/platform-specific.md` → Implement service interfaces -2. Load `resources/mvvm-databinding.md` → Register platform implementations via DI -3. Platform-specific `resources/` → Implement per-platform project - -### "I want custom styling and animations" - -1. Load `resources/styling-guide.md` → Define styles and themes -2. Load `resources/reactive-animations.md` → Add animations to styles -3. Load `resources/custom-controls-advanced.md` → Custom control templates - -### "I'm building a complex control" - -1. Load `resources/custom-controls-advanced.md` → TemplatedControl or UserControl pattern -2. Load `resources/mvvm-databinding.md` → Attached properties and data binding -3. Load `resources/styling-guide.md` → Control templates and styling - -## Resource Organization - -### `mvvm-databinding.md` (Primary) -- Architecture overview -- ViewModel patterns with ReactiveUI -- Binding modes and syntax -- Value converters -- Collections and list binding -- Design-time data -- Master-detail and tab patterns - -### `controls-reference.md` (Primary) -- Layout controls (Grid, StackPanel, DockPanel, etc.) -- Input controls (TextBox, Button, CheckBox, ComboBox, etc.) -- Display controls (TextBlock, Image, ProgressBar, etc.) -- Collection controls (ListBox, DataGrid, TreeView, etc.) -- Navigation (Menu, TabControl, SplitView, etc.) -- Shapes and drawing - -### `styling-guide.md` (Primary) -- CSS-like selectors (type, class, pseudo-classes) -- Resource dictionaries and themes -- Control templates -- Data templates -- Animations and transitions -- Easing functions -- Theme variants (light/dark) - -### `reactive-animations.md` (Advanced) -- ReactiveUI integration -- Reactive properties -- Reactive commands (sync and async) -- Observable sequences -- Filtering, transformation, combining -- Programmatic animations -- Common patterns (search, validation, auto-complete) - -### `custom-controls-advanced.md` (Advanced) -- Custom TemplatedControl creation -- User control composition -- Advanced layouts -- Virtualization -- Performance optimization -- Render transforms -- Graphics and drawing - -### `platform-specific.md` (Advanced) -- Runtime platform detection -- Multi-project structure -- Service abstractions -- Platform-specific implementations -- Window management per platform -- File system access -- Native features (Windows DLL, macOS Cocoa, etc.) - -## Common Workflows - -### Build a Desktop App (Windows/macOS/Linux) - -``` -1. → Setup: Standard project structure + FluentTheme -2. → Create Views and ViewModels following MVVM -3. → Use controls-reference for UI layouts -4. → Add styles with styling-guide -5. → Implement services with DI (mvvm-databinding) -6. → Add animations with reactive-animations -7. → Test on each platform with platform-specific guidance -``` - -### Build a Cross-Platform Mobile+Desktop App - -``` -1. → Create shared project + platform-specific projects -2. → Define service interfaces in shared code (mvvm-databinding) -3. → Implement services per platform (platform-specific) -4. → Use OnPlatform for adaptive UI -5. → Register platform implementations via DI -6. → Test thoroughly on each target (iOS/Android/Windows/Mac) -``` - -### Add Real-Time Search - -``` -1. → Create SearchViewModel (mvvm-databinding) -2. → Use ObservableCollection for results (mvvm-databinding) -3. → Implement with reactive search pattern (reactive-animations) -4. → Debounce input to reduce API calls -5. → Display with ListBox (controls-reference) -6. → Style with appropriate CSS selectors (styling-guide) -``` - -### Build Complex Data-Driven UI - -``` -1. → Design ViewModel hierarchy (mvvm-databinding) -2. → Create master-detail view (mvvm-databinding) -3. → Use DataGrid for tabular data (controls-reference) -4. → Add sorting/filtering with observables (reactive-animations) -5. → Optimize with virtualization (custom-controls-advanced) -6. → Add custom controls if needed (custom-controls-advanced) -``` - -## Best Practices Summary - -**Architecture** -- Maintain strict MVVM separation of concerns -- Use dependency injection for testability -- Keep business logic in ViewModels, not Views - -**Performance** -- Enable compiled bindings with `x:DataType` -- Virtualize large collections -- Debounce rapid updates - -**Styling** -- Use resource dictionaries for consistency -- Support light and dark themes -- Test styles on all target platforms - -**Reactive Patterns** -- Use observables for event-driven updates -- Debounce/throttle input-triggered operations -- Always handle ThrownExceptions on commands - -**Testing** -- Unit test ViewModels in isolation -- Use Avalonia.Headless for UI testing -- Provide design-time DataContext in XAML - -## Cross-Platform Deployment - -- **Windows**: ClickOnce, MSI, portable exe -- **macOS**: DMG, homebrew -- **Linux**: AppImage, snap, flatpak -- **Mobile**: Apple App Store, Google Play Store -- **Web**: Static hosting (WASM runtime required) - -Refer to `resources/platform-specific.md` for platform-specific build and deployment guidance. - ---- - -**Navigation**: Choose a resource above based on your task. Each resource is self-contained with comprehensive examples and best practices. diff --git a/.agents/skills/avalonia/resources/controls-reference.md b/.agents/skills/avalonia/resources/controls-reference.md deleted file mode 100644 index b0e1b70..0000000 --- a/.agents/skills/avalonia/resources/controls-reference.md +++ /dev/null @@ -1,677 +0,0 @@ -# Avalonia Controls Reference - -Comprehensive reference for all major Avalonia UI controls. - -## Layout Controls - -### Grid -Flexible grid-based layout with rows and columns. - -```xml - - - - - -``` - -**Column/Row Definitions:** -- `*` - Star sizing (proportional) -- `Auto` - Size to content -- `100` - Fixed pixel size -- `2*` - Two parts of available space - -### StackPanel -Stacks child elements horizontally or vertically. - -```xml - - - - - -``` - -### Flyout -Popup attached to control. - -```xml - -``` - -## Drawing and Shapes - -### Rectangle -```xml - -``` - -### Ellipse -```xml - -``` - -### Line -```xml - -``` - -### Polyline -```xml - -``` - -### Polygon -```xml - -``` - -### Path -```xml - - - - - - - - - - - - -``` - -## Advanced Controls - -### AutoCompleteBox -Text input with auto-completion. - -```xml - -``` - -### Calendar -Calendar control. - -```xml - -``` - -### MaskedTextBox -Text input with format mask. - -```xml - -``` - -### ColorPicker -Color selection control. - -```xml - -``` - -### PathIcon -Icon from path data. - -```xml - -``` - -This reference covers the most commonly used Avalonia controls. For complete API documentation, refer to the official Avalonia documentation. diff --git a/.agents/skills/avalonia/resources/custom-controls-advanced.md b/.agents/skills/avalonia/resources/custom-controls-advanced.md deleted file mode 100644 index 30a3a27..0000000 --- a/.agents/skills/avalonia/resources/custom-controls-advanced.md +++ /dev/null @@ -1,593 +0,0 @@ -# Custom Controls and Advanced Techniques - -Building custom controls, advanced layouts, and optimization patterns for complex Avalonia applications. - -## Custom Controls - -### Creating a Custom Control - -```csharp -using Avalonia; -using Avalonia.Controls; -using Avalonia.Controls.Primitives; -using Avalonia.Data; - -public class RatingControl : TemplatedControl -{ - // Define attached property for rating value - public static readonly StyledProperty RatingProperty = - AvaloniaProperty.Register( - nameof(Rating), - defaultValue: 0, - defaultBindingMode: BindingMode.TwoWay); - - public int Rating - { - get => GetValue(RatingProperty); - set => SetValue(RatingProperty, value); - } - - // Maximum rating (e.g., 5 stars) - public static readonly StyledProperty MaximumProperty = - AvaloniaProperty.Register( - nameof(Maximum), - defaultValue: 5); - - public int Maximum - { - get => GetValue(MaximumProperty); - set => SetValue(MaximumProperty, value); - } - - protected override void OnApplyTemplate(TemplateAppliedEventArgs e) - { - base.OnApplyTemplate(e); - - // Access template parts - var grid = e.NameScope.Get("PART_ItemsControl"); - if (grid != null) - { - // Initialize template parts - } - } -} -``` - -### Control Template - -```xml - - - - - - -``` - -### User Control (Composite Control) - -```csharp -public partial class UserCard : UserControl -{ - public static readonly StyledProperty NameProperty = - AvaloniaProperty.Register(nameof(Name)); - - public string Name - { - get => GetValue(NameProperty); - set => SetValue(NameProperty, value); - } - - public static readonly StyledProperty EmailProperty = - AvaloniaProperty.Register(nameof(Email)); - - public string Email - { - get => GetValue(EmailProperty); - set => SetValue(EmailProperty, value); - } - - public static readonly StyledProperty AvatarProperty = - AvaloniaProperty.Register(nameof(Avatar)); - - public IImage Avatar - { - get => GetValue(AvatarProperty); - set => SetValue(AvatarProperty, value); - } - - public UserCard() - { - InitializeComponent(); - } -} -``` - -```xml - - - - - - - - - - - -``` - -## Advanced Layouts - -### Adaptive Layout - -```csharp -public class AdaptivePanel : Panel -{ - protected override Size MeasureOverride(Size availableSize) - { - double totalWidth = 0; - double maxHeight = 0; - - foreach (var child in Children) - { - child.Measure(availableSize); - totalWidth += child.DesiredSize.Width; - maxHeight = Math.Max(maxHeight, child.DesiredSize.Height); - } - - return new Size(Math.Min(totalWidth, availableSize.Width), maxHeight); - } - - protected override Size ArrangeOverride(Size finalSize) - { - double xOffset = 0; - - foreach (var child in Children) - { - child.Arrange(new Rect(xOffset, 0, child.DesiredSize.Width, finalSize.Height)); - xOffset += child.DesiredSize.Width; - } - - return finalSize; - } -} -``` - -### Virtualized Stack Panel - -```csharp -public class VirtualizingStackPanel : VirtualizingPanel -{ - public static readonly StyledProperty OrientationProperty = - AvaloniaProperty.Register( - nameof(Orientation), - Orientation.Vertical); - - public Orientation Orientation - { - get => GetValue(OrientationProperty); - set => SetValue(OrientationProperty, value); - } - - protected override Size MeasureOverride(Size availableSize) - { - // Implement virtualization logic - return availableSize; - } - - protected override Size ArrangeOverride(Size finalSize) - { - // Arrange only visible items - return finalSize; - } -} -``` - -## Performance Optimization - -### Compiled Bindings - -```xml - - - - - - - - - - - - -``` - -### Virtualization - -```xml - - - - - - - - - - - - -``` - -### Lazy Loading - -```csharp -public class LazyLoadViewModel : ReactiveObject -{ - private ObservableCollection _items; - public ObservableCollection Items - { - get => _items; - set => this.RaiseAndSetIfChanged(ref _items, value); - } - - private int _pageNumber = 0; - private const int PageSize = 50; - - public LazyLoadViewModel() - { - Items = new ObservableCollection(); - LoadNextPage(); - } - - public void LoadNextPage() - { - Task.Run(async () => - { - var newItems = await _dataService.GetItemsAsync(_pageNumber * PageSize, PageSize); - foreach (var item in newItems) - { - Items.Add(item); - } - _pageNumber++; - }); - } -} -``` - -```xml - - - - - - - - - - -``` - -### Image Optimization - -```xml - - - - - - -``` - -```csharp -// Load image asynchronously -public async Task LoadImageAsync(string url) -{ - using (var client = new HttpClient()) - { - var data = await client.GetByteArrayAsync(url); - using (var stream = new MemoryStream(data)) - { - return new Bitmap(stream); - } - } -} -``` - -## Render Transforms - -### Transform Types - -```xml - - - - - - - - - - - - - - - - - - - - - - - - -``` - -### Programmatic Transforms - -```csharp -public partial class MainWindow : Window -{ - public MainWindow() - { - InitializeComponent(); - } - - public void TransformElement() - { - var element = this.FindControl("MyBorder"); - - // Translate - var translateTransform = new TranslateTransform { X = 10, Y = 20 }; - element.RenderTransform = translateTransform; - - // Scale with origin - var scaleTransform = new ScaleTransform - { - ScaleX = 1.5, - ScaleY = 1.5, - CenterX = 50, - CenterY = 50 - }; - element.RenderTransform = scaleTransform; - - // Rotate with origin - var rotateTransform = new RotateTransform - { - Angle = 45, - CenterX = 50, - CenterY = 50 - }; - element.RenderTransform = rotateTransform; - } -} -``` - -## Drawing and Graphics - -### Shapes - -```xml - - - - - - - - - - - - - - -``` - -### Paths - -```xml - - - - - - - - - - - - - - - -``` - -### Drawing Context (Code-Behind) - -```csharp -public class DrawingControl : Control -{ - public override void Render(DrawingContext context) - { - base.Render(context); - - // Draw rectangle - var rect = new Rect(10, 10, 100, 50); - context.DrawRectangle(new SolidColorBrush(Colors.Blue), null, rect); - - // Draw ellipse - var ellipse = new EllipseGeometry(new Rect(120, 10, 100, 100)); - context.DrawGeometry(new SolidColorBrush(Colors.Red), null, ellipse); - - // Draw line - var pen = new Pen(new SolidColorBrush(Colors.Black), 2); - context.DrawLine(pen, new Point(0, 0), new Point(100, 100)); - - // Draw text - var formattedText = new FormattedText( - "Hello", - CultureInfo.CurrentCulture, - FlowDirection.LeftToRight, - new Typeface("Arial"), - 14, - new SolidColorBrush(Colors.Black)); - context.DrawText(formattedText, new Point(10, 10)); - } -} -``` - -## Styling Advanced Patterns - -### Complex Selectors - -```xml - - - - - - - - - - - - - -``` - -### Conditional Styling - -```xml - - - - - -``` - -## Testing Custom Controls - -```csharp -using Avalonia.Headless.XUnit; -using Xunit; - -public class RatingControlTests -{ - [AvaloniaFact] - public void Rating_CanBeSet() - { - var control = new RatingControl { Rating = 3 }; - Assert.Equal(3, control.Rating); - } - - [AvaloniaFact] - public void Rating_BindsCorrectly() - { - var control = new RatingControl(); - var binding = new Binding("Value") - { - Mode = BindingMode.TwoWay, - Source = new { Value = 4 } - }; - control.Bind(RatingControl.RatingProperty, binding); - Assert.Equal(4, control.Rating); - } - - [AvaloniaFact] - public void Template_AppliesCorrectly() - { - var window = new Window - { - Content = new RatingControl { Rating = 5 } - }; - window.Show(); - - var control = ((RatingControl)window.Content); - Assert.Equal(5, control.Rating); - } -} -``` - -## Best Practices - -1. **Follow MVVM** - Keep custom control logic separate from business logic -2. **Use attached properties** - For control customization -3. **Template-based controls** - Use TemplatedControl for complex controls -4. **Virtualize large collections** - For performance -5. **Minimize render overhead** - Cache renders when possible -6. **Use compiled bindings** - For better performance -7. **Profile performance** - Use tools to identify bottlenecks -8. **Test thoroughly** - Use Avalonia.Headless for UI testing -9. **Document properties** - Clearly document custom properties -10. **Follow platform conventions** - Match native look and feel diff --git a/.agents/skills/avalonia/resources/mvvm-databinding.md b/.agents/skills/avalonia/resources/mvvm-databinding.md deleted file mode 100644 index f451b69..0000000 --- a/.agents/skills/avalonia/resources/mvvm-databinding.md +++ /dev/null @@ -1,622 +0,0 @@ -# MVVM Architecture and Data Binding - -Core patterns for implementing Model-View-ViewModel architecture and establishing data bindings in Avalonia applications. - -## MVVM Architecture - -### Overview - -Model-View-ViewModel (MVVM) separates concerns into three layers: - -- **Model**: Business logic and data -- **View**: UI presentation (XAML) -- **ViewModel**: Bridge between View and Model, handles state and commands - -### Project Structure - -``` -MyAvaloniaApp/ -├── Models/ # Business logic and data -│ ├── User.cs -│ ├── Product.cs -│ └── IDataService.cs # Service interfaces -├── ViewModels/ # MVVM logic -│ ├── MainViewModel.cs -│ ├── UserListViewModel.cs -│ └── ViewModelBase.cs # Common base class -├── Views/ # XAML views -│ ├── MainWindow.axaml -│ ├── UserListView.axaml -│ └── ... -└── Services/ # Application services - ├── DataService.cs - ├── NavigationService.cs - └── ... -``` - -### ViewModel Base Class - -Use ReactiveUI's `ReactiveObject` or implement `INotifyPropertyChanged`: - -```csharp -using ReactiveUI; -using System.Reactive; -using System.Collections.ObjectModel; - -public class MainViewModel : ReactiveObject -{ - private string _name; - public string Name - { - get => _name; - set => this.RaiseAndSetIfChanged(ref _name, value); - } - - private string _email; - public string Email - { - get => _email; - set => this.RaiseAndSetIfChanged(ref _email, value); - } - - private ObservableCollection _users; - public ObservableCollection Users - { - get => _users; - set => this.RaiseAndSetIfChanged(ref _users, value); - } - - public ReactiveCommand SaveCommand { get; } - public ReactiveCommand LoadCommand { get; } - - public MainViewModel() - { - SaveCommand = ReactiveCommand.Create(Save); - LoadCommand = ReactiveCommand.Create(Load); - - Users = new ObservableCollection(); - } - - private void Save() - { - // Save logic - } - - private void Load() - { - // Load logic - } -} -``` - -### INotifyPropertyChanged Implementation - -For projects not using ReactiveUI: - -```csharp -using System.ComponentModel; -using System.Runtime.CompilerServices; - -public class MainViewModel : INotifyPropertyChanged -{ - private string _name; - public string Name - { - get => _name; - set => SetProperty(ref _name, value); - } - - private string _email; - public string Email - { - get => _email; - set => SetProperty(ref _email, value); - } - - public event PropertyChangedEventHandler PropertyChanged; - - protected void SetProperty(ref T field, T value, [CallerMemberName] string propertyName = "") - { - if (!Equals(field, value)) - { - field = value; - OnPropertyChanged(propertyName); - } - } - - protected void OnPropertyChanged(string propertyName) - { - PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); - } -} -``` - -## Data Binding Fundamentals - -### Binding Modes - -```xml - - - - - - - - - - - -``` - -### Binding Paths - -```xml - - - - - - - - - - - - - - -``` - -### Multi-Binding - -```xml - - - - - - - - - - - - - - - - - - - - - -``` - -### Binding Validation - -```xml - - - - - - - - - -``` - -## Value Converters - -### Basic Converter - -```csharp -using System.Globalization; -using Avalonia.Data.Converters; - -public class BoolToVisibilityConverter : IValueConverter -{ - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - if (value is bool boolValue) - return boolValue ? Avalonia.Controls.Visibility.Visible : Avalonia.Controls.Visibility.Collapsed; - return Avalonia.Controls.Visibility.Collapsed; - } - - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - if (value is Avalonia.Controls.Visibility visibility) - return visibility == Avalonia.Controls.Visibility.Visible; - return false; - } -} -``` - -### Multi-Value Converter - -```csharp -public class FullNameConverter : IMultiValueConverter -{ - public object Convert(IList values, Type targetType, object parameter, CultureInfo culture) - { - if (values.Count < 2) return ""; - var firstName = values[0]?.ToString() ?? ""; - var lastName = values[1]?.ToString() ?? ""; - return $"{firstName} {lastName}".Trim(); - } -} -``` - -### Using Converters - -```xml - - - - - - - - - - - - - - - - - -``` - -## Dependency Injection - -### Service Registration - -```csharp -using Microsoft.Extensions.DependencyInjection; - -public override void OnFrameworkInitializationCompleted() -{ - var services = new ServiceCollection(); - - // Register application services - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - - // Register view models - services.AddTransient(); - services.AddTransient(); - - // Register views - services.AddSingleton(); - - var provider = services.BuildServiceProvider(); - - if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) - { - desktop.MainWindow = provider.GetRequiredService(); - } - - base.OnFrameworkInitializationCompleted(); -} -``` - -### View-ViewModel Binding - -```csharp -// App.axaml.cs -public class App : Application -{ - private ServiceProvider _serviceProvider; - - public override void OnFrameworkInitializationCompleted() - { - _serviceProvider = new ServiceCollection() - .AddSingleton() - .AddTransient() - .AddSingleton() - .BuildServiceProvider(); - - if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) - { - desktop.MainWindow = _serviceProvider.GetRequiredService(); - } - - base.OnFrameworkInitializationCompleted(); - } -} -``` - -```csharp -// MainWindow.axaml.cs -public partial class MainWindow : Window -{ - public MainWindow(MainViewModel viewModel) - { - InitializeComponent(); - DataContext = viewModel; - } -} -``` - -## Collections and Binding - -### ObservableCollection Binding - -```csharp -public class UserListViewModel : ReactiveObject -{ - private ObservableCollection _users; - public ObservableCollection Users - { - get => _users; - set => this.RaiseAndSetIfChanged(ref _users, value); - } - - private User _selectedUser; - public User SelectedUser - { - get => _selectedUser; - set => this.RaiseAndSetIfChanged(ref _selectedUser, value); - } - - public UserListViewModel() - { - Users = new ObservableCollection(); - LoadUsers(); - } - - private void LoadUsers() - { - var users = _dataService.GetAllUsers(); - Users = new ObservableCollection(users); - } - - public void AddUser(User user) - { - Users.Add(user); - } - - public void RemoveUser(User user) - { - Users.Remove(user); - } -} -``` - -### ListBox Binding - -```xml - - - - - - - - - - - - - -``` - -### DataGrid Binding - -```xml - - - - - - - - - - -``` - -### Complex Multi-Step Animations - -```xml - - - - - - - - -``` - -### Easing Functions - -Available easing functions: - -- `LinearEasing` -- `QuadraticEaseIn`, `QuadraticEaseOut`, `QuadraticEaseInOut` -- `CubicEaseIn`, `CubicEaseOut`, `CubicEaseInOut` -- `QuarticEaseIn`, `QuarticEaseOut`, `QuarticEaseInOut` -- `QuinticEaseIn`, `QuinticEaseOut`, `QuinticEaseInOut` -- `SineEaseIn`, `SineEaseOut`, `SineEaseInOut` -- `CircularEaseIn`, `CircularEaseOut`, `CircularEaseInOut` -- `BounceEaseIn`, `BounceEaseOut`, `BounceEaseInOut` -- `ElasticEaseIn`, `ElasticEaseOut`, `ElasticEaseInOut` -- `BackEaseIn`, `BackEaseOut`, `BackEaseInOut` - -```xml - - -``` - -### Programmatic Animations - -```csharp -using Avalonia.Animation; - -public partial class MainWindow : Window -{ - public MainWindow() - { - InitializeComponent(); - } - - public async void AnimateButton() - { - var button = this.FindControl -``` - -### Complex Animations -```xml - -``` - -### Easing Functions -```xml - - - - - -``` - -Available easing functions: -- `LinearEasing` -- `QuadraticEaseIn`, `QuadraticEaseOut`, `QuadraticEaseInOut` -- `CubicEaseIn`, `CubicEaseOut`, `CubicEaseInOut` -- `QuarticEaseIn`, `QuarticEaseOut`, `QuarticEaseInOut` -- `QuinticEaseIn`, `QuinticEaseOut`, `QuinticEaseInOut` -- `SineEaseIn`, `SineEaseOut`, `SineEaseInOut` -- `CircularEaseIn`, `CircularEaseOut`, `CircularEaseInOut` -- `BounceEaseIn`, `BounceEaseOut`, `BounceEaseInOut` -- `ElasticEaseIn`, `ElasticEaseOut`, `ElasticEaseInOut` -- `BackEaseIn`, `BackEaseOut`, `BackEaseInOut` - -## Theme Variants - -### Supporting Light/Dark Themes -```xml - - - - - - - - - - -``` - -### Theme-Aware Resources -```xml - - - - - - - - - - - - - -``` - -### Runtime Theme Switching -```csharp -// Switch to dark theme -Application.Current.RequestedThemeVariant = ThemeVariant.Dark; - -// Switch to light theme -Application.Current.RequestedThemeVariant = ThemeVariant.Light; - -// Use system theme -Application.Current.RequestedThemeVariant = ThemeVariant.Default; -``` - -## Advanced Styling Patterns - -### Button Styles -```xml - - - - - - - - - - - - - - - - - - - -``` - -### Card Style -```xml - - - -``` - -### Input Field Styles -```xml - - - - - -``` - -### List Item Styles -```xml - - - - - - - -``` - -## Custom Theme Example - -```xml - - - - - #6200EE - #3700B3 - #03DAC6 - #FFFFFF - #FFFFFF - #B00020 - #FFFFFF - #000000 - #000000 - #000000 - #FFFFFF - - - - - - - - - - - - - - - -``` - -## Performance Tips - -1. **Use Static Resources**: Prefer `StaticResource` over `DynamicResource` when values won't change -2. **Minimize Template Complexity**: Keep control templates simple to reduce render time -3. **Use Transitions Sparingly**: Too many animations can impact performance -4. **Cache Brushes**: Define brushes as resources instead of inline -5. **Avoid Deep Nesting**: Flatten selector hierarchies when possible - -## Best Practices - -1. **Organize Styles**: Separate styles into logical files (Colors, Buttons, etc.) -2. **Use Naming Conventions**: Consistent naming for resources and classes -3. **Document Custom Styles**: Comment complex selectors and templates -4. **Test Theme Variants**: Ensure styles work in both light and dark themes -5. **Follow Platform Guidelines**: Match native look and feel when appropriate -6. **Use Class Modifiers**: Prefer classes over direct styling for reusability -7. **Leverage Inheritance**: Use base styles and extend them -8. **Keep It DRY**: Extract common patterns into reusable styles - -This guide provides a foundation for advanced styling in Avalonia. Experiment with these patterns and adapt them to your application's design requirements. diff --git a/.cursorrules b/.cursorrules deleted file mode 100644 index 5f598a5..0000000 --- a/.cursorrules +++ /dev/null @@ -1,21 +0,0 @@ -# Cursor & AI Agent Rules for FryPDF - -## STRICT MANDATE: Google Material Design 3 (M3) Expressive UI -Whenever you create or modify any UI in this repository: -1. **NEVER use flat, sharp, or rectangular legacy styles**. -2. **Always use Material 3 Expressive shapes**: - - Buttons, search bars, segmented capsules, FABs, and slider thumbs MUST be pills (`CornerRadius="{StaticResource M3ShapeCornerFull}"` or `9999`). - - Dialog cards MUST be 28px (`CornerRadius="{StaticResource M3ShapeCornerExtraLarge}"`). - - Cards and inputs MUST be 16px (`CornerRadius="{StaticResource M3ShapeCornerLarge}"`). - - Menus and list items MUST be 12px (`CornerRadius="{StaticResource M3ShapeCornerMedium}"`). - - Badges and chips MUST be 8px (`CornerRadius="{StaticResource M3ShapeCornerSmall}"`). -3. **NEVER hardcode light/dark hex colors**. Always use dynamic tokens (`M3PrimaryBrush`, `M3SecondaryContainerBrush`, `M3SurfaceContainer...`, or legacy aliases `WinBgBrush`, `WinAccentBrush`, etc.). -4. **Take maximum advantage of CommunityToolkit.Mvvm**: - - Use `[ObservableProperty]`, `[RelayCommand]`, `[AsyncRelayCommand]`. - - Use `[NotifyPropertyChangedFor]` and `[NotifyCanExecuteChangedFor]`. - - Use `WeakReferenceMessenger.Default` for decoupled communication. -5. **Reference files**: - - `src/PdfEditorApp/Styles/Material3ExpressiveTokens.axaml` - - `src/PdfEditorApp/Styles/Material3ExpressiveStyles.axaml` - - `docs/MATERIAL_DESIGN_3_EXPRESSIVE_GUIDELINES.md` - - `.agents/AGENTS.md` diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml deleted file mode 100644 index 6757818..0000000 --- a/.github/workflows/release.yml +++ /dev/null @@ -1,195 +0,0 @@ -name: Release - -on: - push: - tags: - - 'v*' - workflow_dispatch: - inputs: - version: - description: 'Release version tag (e.g. 1.0.0 or v1.0.0)' - required: false - default: '' - -concurrency: - group: release-${{ github.ref }} - cancel-in-progress: true - -jobs: - determine-version: - runs-on: ubuntu-latest - outputs: - version: ${{ steps.version.outputs.version }} - four_part_version: ${{ steps.version.outputs.four_part_version }} - steps: - - name: Determine version from git tag - id: version - shell: bash - run: | - RAW_VER="" - if [ -n "${{ github.event.inputs.version }}" ]; then - RAW_VER="${{ github.event.inputs.version }}" - elif [[ "${GITHUB_REF}" == refs/tags/* ]]; then - RAW_VER="${GITHUB_REF_NAME}" - else - RAW_VER="1.0.0-dev" - fi - - # Strip leading 'v' or 'V' - CLEAN_VER="${RAW_VER#[vV]}" - echo "version=${CLEAN_VER}" >> "$GITHUB_OUTPUT" - - # Compute 4-part numeric version for Windows assembly & MSIX (Major.Minor.Build.Revision) - BASE_NUMERIC=$(echo "$CLEAN_VER" | cut -d'-' -f1) - IFS='.' read -r -a PARTS <<< "$BASE_NUMERIC" - P0="${PARTS[0]:-1}" - P1="${PARTS[1]:-0}" - P2="${PARTS[2]:-0}" - P3="${PARTS[3]:-0}" - FOUR_PART="$P0.$P1.$P2.$P3" - echo "four_part_version=${FOUR_PART}" >> "$GITHUB_OUTPUT" - echo "Resolved Release Version: ${CLEAN_VER} (4-part: ${FOUR_PART})" - - test: - name: Run Unit Tests - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-dotnet@v4 - with: - dotnet-version: '10.0.x' - - name: Restore & Build - run: dotnet build -c Release - - name: Run Test Suite - run: dotnet test --no-build -c Release --verbosity normal - - build-windows: - needs: [determine-version, test] - runs-on: windows-latest - env: - VERSION: ${{ needs.determine-version.outputs.version }} - FOUR_PART_VERSION: ${{ needs.determine-version.outputs.four_part_version }} - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-dotnet@v4 - with: - dotnet-version: '10.0.x' - - - name: Publish win-x64 - shell: pwsh - run: > - dotnet publish src/PdfEditorApp/PdfEditorApp.csproj -c Release -r win-x64 --self-contained true - -p:Version=$env:VERSION - -p:AssemblyVersion=$env:FOUR_PART_VERSION - -p:FileVersion=$env:FOUR_PART_VERSION - -p:InformationalVersion=$env:VERSION - -o publish/win-x64 - - # ISCC.exe ships preinstalled on the windows-latest runner image at this path. - - name: Build Inno Setup installer (.exe) - shell: pwsh - run: | - & "C:\Program Files (x86)\Inno Setup 6\ISCC.exe" packaging\windows\installer.iss "/DMyAppVersion=$env:VERSION" "/DMyPublishDir=$env:GITHUB_WORKSPACE\publish\win-x64" - - - name: Build & Sign Windows MSIX Package (.msix) - shell: pwsh - run: | - .\packaging\windows\msix\build-msix.ps1 -Version "$env:VERSION" -PublishDir "$env:GITHUB_WORKSPACE\publish\win-x64" -OutputDir "$env:GITHUB_WORKSPACE\packaging\windows" - - - name: Upload Windows Installer (.exe) - uses: actions/upload-artifact@v4 - with: - name: windows-installer - path: packaging/windows/FryPDF-Setup-${{ needs.determine-version.outputs.version }}.exe - if-no-files-found: error - - - name: Upload Windows MSIX Package (.msix) - uses: actions/upload-artifact@v4 - with: - name: windows-msix - path: | - packaging/windows/FryPDF-${{ needs.determine-version.outputs.version }}-x64.msix - packaging/windows/FryPDF-${{ needs.determine-version.outputs.version }}-PublicCert.cer - if-no-files-found: error - - build-macos: - needs: [determine-version, test] - runs-on: macos-latest - env: - VERSION: ${{ needs.determine-version.outputs.version }} - FOUR_PART_VERSION: ${{ needs.determine-version.outputs.four_part_version }} - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-dotnet@v4 - with: - dotnet-version: '10.0.x' - - - name: Publish osx-arm64 - run: > - dotnet publish src/PdfEditorApp/PdfEditorApp.csproj -c Release -r osx-arm64 --self-contained true - -p:Version=$VERSION - -p:AssemblyVersion=$FOUR_PART_VERSION - -p:FileVersion=$FOUR_PART_VERSION - -p:InformationalVersion=$VERSION - -o publish/osx-arm64 - - - name: Assemble .app bundle - run: | - APP="FryPDF.app" - rm -rf "$APP" - mkdir -p "$APP/Contents/MacOS" "$APP/Contents/Resources" - cp -R publish/osx-arm64/. "$APP/Contents/MacOS/" - sed "s/__VERSION__/$VERSION/g" packaging/macos/Info.plist.template > "$APP/Contents/Info.plist" - cp packaging/macos/AppIcon.icns "$APP/Contents/Resources/AppIcon.icns" - chmod +x "$APP/Contents/MacOS/PdfEditorApp" - - # Ad-hoc signing keeps the bundle identity stable across runs without full notarization - - name: Ad-hoc codesign - run: codesign --force --deep --sign - "FryPDF.app" - - - name: Create dmg - run: | - mkdir -p dmg-root - cp -R "FryPDF.app" dmg-root/ - ln -s /Applications dmg-root/Applications - hdiutil create -volname "FryPDF" -srcfolder dmg-root -ov -format UDZO "FryPDF-$VERSION-arm64.dmg" - - - name: Upload artifact - uses: actions/upload-artifact@v4 - with: - name: macos-dmg - path: FryPDF-${{ needs.determine-version.outputs.version }}-arm64.dmg - if-no-files-found: error - - release: - needs: [determine-version, test, build-windows, build-macos] - if: startsWith(github.ref, 'refs/tags/v') || github.event_name == 'workflow_dispatch' - runs-on: ubuntu-latest - permissions: - contents: write - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Download all artifacts - uses: actions/download-artifact@v4 - with: - path: artifacts - - - name: Create GitHub Release - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - VERSION: ${{ needs.determine-version.outputs.version }} - run: | - TAG_NAME="v$VERSION" - if [[ "${GITHUB_REF}" == refs/tags/* ]]; then - TAG_NAME="${GITHUB_REF_NAME}" - fi - - gh release create "$TAG_NAME" \ - "artifacts/windows-installer/FryPDF-Setup-$VERSION.exe" \ - "artifacts/windows-msix/FryPDF-$VERSION-x64.msix" \ - "artifacts/windows-msix/FryPDF-$VERSION-PublicCert.cer" \ - "artifacts/macos-dmg/FryPDF-$VERSION-arm64.dmg" \ - --title "FryPDF $TAG_NAME" \ - --generate-notes diff --git a/.gitignore b/.gitignore deleted file mode 100644 index ae77332..0000000 --- a/.gitignore +++ /dev/null @@ -1,89 +0,0 @@ -## .NET and C# -[Bb]in/ -[Oo]bj/ -[Ll]og/ -[Ll]ogs/ -*.user -*.userosscache -*.sln.docstates -*.suo -*.userprefs -*.dbmdl -*.jfm -*.pidb -*.booproj - -## Build results -[Dd]ebug/ -[Dd]ebugPublic/ -[Rr]elease/ -[Rr]eleases/ -x64/ -x86/ -[Aa][Rr][Mm]/ -[Aa][Rr][Mm]64/ -bld/ -[Bb]in/[Dd]ebug/ -[Bb]in/[Rr]elease/ -[Oo]bj/[Dd]ebug/ -[Oo]bj/[Rr]elease/ - -## Visual Studio & JetBrains Rider -.vs/ -.idea/ -*.sln.iml -*.DotSettings.user -_ReSharper*/ -*.rsuser - -## Visual Studio Code -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json -*.code-workspace - -## Test Results & Coverage -TestResults/ -*.trx -*.coverage -*.coveragexml -coverage.opencover.xml - -## NuGet Packages -*.nupkg -*.snupkg -*.nuget.props -*.nuget.targets -packages/ - -## Avalonia & Skia Artifacts -.avalonia/ -*.generated.cs - -## macOS specific -.DS_Store -.AppleDouble -.LSOverride -Icon -._* -.DocumentRevisions-V100 -.fseventsd -.Spotlight-V100 -.TemporaryItems -.Trashes -.VolumeIcon.icns -.com.apple.timemachine.donotpresent - -## Local user project files & generated PDFs -*.pdf -!Assets/**/*.pdf -*.pdfproj -!Templates/**/*.pdfproj -*sample1.pdf* -*sample2.pdf* - -## Visual Verification Artifacts -VisualArtifacts/ -*_side_by_side.png \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index afbe683..0000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "version": "0.2.0", - "configurations": [ - { - "name": "Launch FryPDF (Avalonia Desktop)", - "type": "coreclr", - "request": "launch", - "preLaunchTask": "build", - "program": "${workspaceFolder}/src/PdfEditorApp/bin/Debug/net10.0/PdfEditorApp.dll", - "args": [], - "cwd": "${workspaceFolder}/src/PdfEditorApp", - "stopAtEntry": false, - "console": "internalConsole" - } - ] -} diff --git a/.vscode/tasks.json b/.vscode/tasks.json deleted file mode 100644 index 23b3b9d..0000000 --- a/.vscode/tasks.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "version": "2.0.0", - "tasks": [ - { - "label": "build", - "command": "dotnet", - "type": "process", - "args": [ - "build", - "${workspaceFolder}/PdfEditorApp.slnx", - "/property:GenerateFullPaths=true", - "/consoleloggerparameters:NoSummary" - ], - "problemMatcher": "$msCompile", - "group": { - "kind": "build", - "isDefault": true - } - }, - { - "label": "run", - "command": "dotnet", - "type": "process", - "args": [ - "run", - "--project", - "${workspaceFolder}/src/PdfEditorApp/PdfEditorApp.csproj" - ], - "problemMatcher": "$msCompile" - }, - { - "label": "watch", - "command": "dotnet", - "type": "process", - "args": [ - "watch", - "--project", - "${workspaceFolder}/src/PdfEditorApp/PdfEditorApp.csproj" - ], - "problemMatcher": "$msCompile" - }, - { - "label": "test", - "command": "dotnet", - "type": "process", - "args": [ - "test", - "${workspaceFolder}/PdfEditorApp.slnx" - ], - "problemMatcher": "$msCompile", - "group": { - "kind": "test", - "isDefault": true - } - } - ] -} diff --git a/AGENTS.md b/AGENTS.md deleted file mode 120000 index 41280d2..0000000 --- a/AGENTS.md +++ /dev/null @@ -1 +0,0 @@ -.agents/AGENTS.md \ No newline at end of file diff --git a/Bug/PDF_VIEWER_CONTINUOUS_SCROLL_RENDERING_BUG.md b/Bug/PDF_VIEWER_CONTINUOUS_SCROLL_RENDERING_BUG.md deleted file mode 100644 index ca3c129..0000000 --- a/Bug/PDF_VIEWER_CONTINUOUS_SCROLL_RENDERING_BUG.md +++ /dev/null @@ -1,68 +0,0 @@ -# Bug: PDF Viewer Continuous Scrolling Page Rendering & Active Page Synchronization - -- **ID**: `BUG-001` -- **Component**: `PdfEditorApp` -> `PdfViewerView` / `PdfViewerViewModel` -- **Status**: Open / Postponed for later resolution -- **Reported Date**: 2026-09-02 -- **Related Files**: - - [`src/PdfEditorApp/Views/PdfViewerView.axaml`](../src/PdfEditorApp/Views/PdfViewerView.axaml) - - [`src/PdfEditorApp/Views/PdfViewerView.axaml.cs`](../src/PdfEditorApp/Views/PdfViewerView.axaml.cs) - - [`src/PdfEditorApp/ViewModels/PdfViewerViewModel.cs`](../src/PdfEditorApp/ViewModels/PdfViewerViewModel.cs) - - [`src/PdfEditorApp/Views/Controls/PdfTextOverlayControl.cs`](../src/PdfEditorApp/Views/Controls/PdfTextOverlayControl.cs) - ---- - -## 1. Description & Symptoms - -When viewing a multi-page PDF document in Continuous Scroll Mode: -1. **Scrolling Does Not Render Scrolled-To Pages**: - - As the user scrolls down through the document (e.g. from Page 1 to Page 18), the scrolled-to page displays as a blank card showing only the placeholder icon and the label (`"Page 18"`). - - The high-resolution rendered Skia bitmap for the page (`Bitmap`) is not loaded/displayed on the screen while scrolling. -2. **Left Thumbnail Rail Does Not Synchronize**: - - The thumbnail rail on the left continues to highlight Page 1 (blue border) and does not update to track the currently visible page in the viewport. -3. **Clicking Immediately Fixes It**: - - Clicking directly anywhere on the page (e.g. clicking on Page 18) immediately causes the page to render and display its contents, and synchronizes the active page state. - ---- - -## 2. Steps to Reproduce - -1. Launch the desktop application: - ```bash - dotnet run --project src/PdfEditorApp/PdfEditorApp.csproj - ``` -2. Open any multi-page PDF document (e.g. 20+ pages). -3. Use the trackpad, mouse wheel, or scrollbar thumb to scroll down to Page 15–20. -4. **Observe**: - - The page in the viewport displays the document icon placeholder and page number, but no document content. - - The thumbnail rail remains on Page 1. -5. Click on the page: - - **Observe**: The document content renders immediately upon clicking. - ---- - -## 3. Technical Investigation & Findings So Far - -### What We Know -- **Why clicking works**: - - In `PdfTextOverlayControl.OnPointerPressed`: - - The control captures the click directly on the bound page item (`Page = page`). - - It invokes `vm.SelectPage(page)`. - - `SelectPage` sets `CurrentPageNumber = page.PageNumber`. - - `OnCurrentPageNumberChanged` triggers `EnsurePageRendered(pageNumber)`, which rasterizes the page via Skia and sets `page.Bitmap = bmp`. -- **What happens during scrolling**: - - `ContinuousScrollViewer` scrolls the content on screen. - - Visible-page calculation is handled by `ResolveVisiblePages` and `OnContinuousScrollOffsetChanged`. - - Possible issues to investigate when resuming: - 1. **Event Delivery**: Verify whether `ScrollChanged` or `OffsetProperty` events are firing during user gestures on macOS. - 2. **Coordinate Offset**: In `ResolveVisiblePages`, verify whether `viewer.Offset.Y` accurately reflects the scroll offset of the items in Avalonia across various DPI scales. - 3. **Render Lock Contention**: `StartBackgroundWorker` in `PdfViewerViewModel` loops through pages extracting thumbnails and text geometry under `_renderLock`. Check if `EnsurePageRendered` is waiting on `_renderLock` or if `_pendingForegroundRenders` is being blocked. - 4. **Virtualization vs Plain StackPanel**: `ContinuousItemsControl` uses a standard `StackPanel`. Check if an `ItemsRepeater` or `VirtualizingStackPanel` with an `ILogicalScrollable` scroll provider would be more robust for large documents. - ---- - -## 4. Next Steps When Resuming - -1. Add temporary console/debug logging inside `OnContinuousViewerScrollChanged` and `OnContinuousScrollOffsetChanged` to inspect `viewer.Offset.Y`, `detectedPageNum`, and `firstVisiblePage`. -2. Inspect if `RenderPageAtScale` is called and whether the resulting `Bitmap` is assigned to `page.Bitmap` on the UI thread. -3. Test alternative viewport intersection detection (e.g. checking control visual tree positions directly or subscribing to item layout updates). diff --git a/Bug/README.md b/Bug/README.md deleted file mode 100644 index 345e81f..0000000 --- a/Bug/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# Bug Tracking - -This directory tracks known bugs, reproduction steps, technical investigations, and roadmaps for future resolution. - -| Bug ID | Title | Component | Status | File | -| :--- | :--- | :--- | :--- | :--- | -| `BUG-001` | PDF Viewer Continuous Scroll Page Rendering & Sync | `PdfEditorApp` (Viewer) | Open | [PDF_VIEWER_CONTINUOUS_SCROLL_RENDERING_BUG.md](./PDF_VIEWER_CONTINUOUS_SCROLL_RENDERING_BUG.md) | diff --git a/CLAUDE.md b/CLAUDE.md deleted file mode 100644 index 89694a0..0000000 --- a/CLAUDE.md +++ /dev/null @@ -1,19 +0,0 @@ -# Claude Code Operating Guidelines for FryPDF - -## Build & Test Commands -- Build: `dotnet build` (Warning-free required: `TreatWarningsAsErrors=true`) -- Run Tests: `dotnet test` -- Filtered Tests: `dotnet test --filter "FullyQualifiedName~Material3ExpressiveThemeTests"` - -## CRITICAL UI MANDATE: Google Material Design 3 (M3) Expressive -ALL UI work in this repository must strictly adhere to Google Material Design 3 (M3) Expressive: -- **Shape Scale**: - - Buttons, search bars, segmented capsules, FABs, chubby slider thumbs $\to$ Pill (`CornerRadius="{StaticResource M3ShapeCornerFull}"` or `9999`) - - Dialog cards $\to$ Extra Large (`CornerRadius="{StaticResource M3ShapeCornerExtraLarge}"` or `28`) - - Cards, inputs (`TextBox.m3-outlined`), ComboBox, NumericUpDown $\to$ Large (`CornerRadius="{StaticResource M3ShapeCornerLarge}"` or `16`) - - Menus and list items $\to$ Medium (`CornerRadius="{StaticResource M3ShapeCornerMedium}"` or `12`) - - Chips and badges $\to$ Small (`CornerRadius="{StaticResource M3ShapeCornerSmall}"` or `8`) -- **Colors**: Never hardcode hex colors. Always reference dynamic tokens: `M3PrimaryBrush`, `M3SecondaryContainerBrush`, `M3SurfaceContainer...`, or legacy aliases (`WinBgBrush`, `WinAccentBrush`, etc.). -- **Chubby Sliders**: Retain chubby 8-10px tracks and 20-22px thumbs with hover transitions. -- **CommunityToolkit.Mvvm**: Take maximum advantage of CommunityToolkit source generators (`[ObservableProperty]`, `[RelayCommand]`, `[AsyncRelayCommand]`), cascading notifications (`[NotifyPropertyChangedFor]`, `[NotifyCanExecuteChangedFor]`), and `WeakReferenceMessenger.Default` for decoupled pub/sub messaging. -- **Reference**: Read `.agents/rules/m3_expressive_ui_mandate.md` and `docs/MATERIAL_DESIGN_3_EXPRESSIVE_GUIDELINES.md`. diff --git a/GEMINI.md b/GEMINI.md deleted file mode 100644 index 60bce1c..0000000 --- a/GEMINI.md +++ /dev/null @@ -1,101 +0,0 @@ -# FryPDF Agent Operating Instructions (GEMINI.md) - -## 1. CRITICAL UI MANDATE: Google Material Design 3 (M3) Expressive (STRICT) - -**ATTENTION AI AGENT**: -You MUST strictly adhere to **Google Material Design 3 (M3) Expressive** whenever modifying or creating any UI elements, views, sidebars, buttons, dialogs, or styles in this repository. - -1. **Shape Scale Hierarchy**: - - **Pills (`CornerRadius="{StaticResource M3ShapeCornerFull}"` or `9999`)**: All buttons (`primary-btn`, `accent-btn`, `action-pill-btn`, `m3-filled-btn`, `m3-tonal-btn`), search inputs (`TextBox.m3-search`), segmented capsules (`m3-segmented-container`), FABs (`m3-fab`), and chubby slider thumbs. - - **28px Extra-Large (`CornerRadius="{StaticResource M3ShapeCornerExtraLarge}"`)**: All modal dialog cards (`Border.m3-dialog-card`, `AboutDialog`, `CommandPaletteDialog`, `AiAssistantDialog`) and hero banners. - - **16px Large (`CornerRadius="{StaticResource M3ShapeCornerLarge}"`)**: Cards (`m3-card-elevated`), inputs (`TextBox.m3-outlined`), `ComboBox`, `NumericUpDown`, inspector section groups. - - **12px Medium (`CornerRadius="{StaticResource M3ShapeCornerMedium}"`)**: Context menus, tooltips, list items. - - **8px Small (`CornerRadius="{StaticResource M3ShapeCornerSmall}"`)**: Badges, thumbnail cards, chips (`m3-chip`, `m3-filter-chip`). - - **NEVER** use small arbitrary corner radii (like `2` or `4`) on interactive elements. - -2. **Colors & Dark Mode**: - - **NEVER** hardcode hex colors in templates or hover triggers. - - Always reference `{DynamicResource ...}` keys: `M3PrimaryBrush`, `M3SecondaryContainerBrush`, `M3SurfaceBrush`, `M3SurfaceContainer...`, `M3OutlineBrush`, or legacy aliases (`WinBgBrush`, `WinAccentBrush`, etc.). - -3. **Chubby Tactile Sliders**: - - Always maintain chubby tactile sliders with 8-10px tracks and 20-22px thumbs with hover transitions. - -4. **CommunityToolkit.Mvvm Mandate**: - - Maximize use of `CommunityToolkit.Mvvm` source generators (`[ObservableProperty]`, `[RelayCommand]`, `[AsyncRelayCommand]`). - - Use `[NotifyPropertyChangedFor]` and `[NotifyCanExecuteChangedFor]` to cleanly cascade property and command updates. - - Use `WeakReferenceMessenger.Default` for decoupled pub/sub messaging across ViewModels and services. - - Use `ObservableValidator` with DataAnnotations for dialogs and user forms. - ---- - -## 2. CRITICAL ARCHITECTURE MANDATE: Modular Plugin Pattern ("Everything is a Plugin") (STRICT) - -**ATTENTION AI AGENT**: -FryPDF uses a modular microkernel plugin architecture inspired by Cordis. -You MUST adhere to the **Plugin Pattern** whenever adding, refactoring, or extending application capabilities: - -1. **No Monolithic Switches or Hardcoded Wiring**: - - **NEVER** hardcode switch-case ladders, god view models, or monolithic enum registries when adding features. - - Every tool, canvas element, ribbon action, sidebar panel, inspector section, workspace page, dialog, AI provider, OCR engine, and file connector MUST be an isolated plugin (`IFryPlugin` or `ToolPluginBase`) mounted through an `IFryPluginBundle`. - -2. **The 12 Dynamic Registry Pillars**: - - Always register capabilities via the corresponding registry: - - Tools $\to$ `IPdfToolRegistry` / `PdfToolDescriptor` - - Ribbon Actions & Tabs $\to$ `IRibbonRegistry` / `RibbonContribution` / `RibbonTabDescriptor` - - Sidebars $\to$ `ISidebarRegistry` / `SidebarTabDescriptor` - - Inspector Sections $\to$ `IInspectorRegistry` / `InspectorSectionDescriptor` - - Workspace Navigation $\to$ `INavigationRegistry` / `NavigationItemDescriptor` - - Canvas Elements $\to$ `ICanvasElementRegistry` / `CanvasElementDescriptor` - - Importers / Exporters $\to$ `IDocumentImporterRegistry` / `IDocumentExporterRegistry` - - AI Providers / OCR $\to$ `IAiProviderRegistry` / `IOcrEngineRegistry` - - Status Bar / Dialogs $\to$ `IStatusBarRegistry` / `IDialogRegistry` - -3. **Reversible Effects & Zero Dangling Handlers**: - - Every side effect, event listener, or resource subscription registered during `ApplyAsync` MUST be registered through `PluginScope` (`ctx.RegisterEffect(...)`) to ensure clean LIFO rollback and zero memory leaks on plugin unload or reload. - -4. **Declarative Settings Schema**: - - User-configurable options must be declared via `IFryPlugin.SettingsSchema` using `PluginSettingDefinition` so that M3 Expressive configuration interfaces are auto-generated without manual UI boilerplate. - ---- - -## 3. CRITICAL PERFORMANCE MANDATE: Zero-Lag, 60+ FPS & Memory Safety (STRICT) - -**ATTENTION AI AGENT**: -FryPDF is an interactive real-time document studio. **LAG, FRAME DROPS, AND UI THREAD STALLS ARE UNACCEPTABLE**. You MUST design and write code thinking in terms of performance optimization: - -1. **Zero UI Thread Blocking**: - - **NEVER** run CPU-bound parsing, PDF deconstruction, Skia rasterization, QuestPDF document compilation, OCR, AI inference, or file/network I/O on the Avalonia UI thread. - - **NEVER** call `.Result`, `.Wait()`, or `.GetAwaiter().GetResult()` on asynchronous operations. - - Always offload heavy tasks to the thread pool (`Task.Run`) and use `[RelayCommand]` with asynchronous `Task` signatures and `CancellationToken`. - -2. **Instant Navigation & View Caching (0ms Transitions)**: - - For plugin-driven views, always cache instantiated views (e.g. `_dynamicViewCache` pattern in `HomeViewModel`) instead of destroying and re-instantiating heavy visual trees during navigation. - - Use pre-mounted XAML views for high-frequency screens (Home dashboard, tools studios, reader landing) to ensure instantaneous tab switching without layout latency. - -3. **UI Virtualization & Recycling**: - - Always use virtualized layout containers (`ItemsRepeater`, `VirtualizingStackPanel` with `ScrollUnit="Pixel"`) for document page thumbnails, tool cards, audit logs, and tabular data rows. Never use unvirtualized `StackPanel` for dynamic or unbound collections. - -4. **Input Throttling & Debouncing**: - - Smooth all high-frequency continuous user inputs: - - Trackpad pinch-to-zoom: Use proportional multiplicative deltas with clamping (`Math.Clamp(old * (1 + delta), 0.1, 5.0)`) to eliminate exponential explosion. - - Search boxes & filters: Debounce text changes (150–250ms) before filtering collections. - - Sliders: Throttle redraw updates during drag events; do not trigger full document re-renders on every micro-tick. - -5. **Memory Management, LOH Avoidance & Skia Disposal**: - - **Large Object Heap (LOH)**: Never allocate byte arrays $\ge 85\text{ KB}$ repeatedly in tight loops. Use `ArrayPool.Shared` and streams. Never store Base64 strings in memory for images; store raw `byte[]` and compute Base64 lazily for JSON only. - - **Unmanaged Graphics Handles**: `SKBitmap`, `SKImage`, `SKSurface`, `SKData`, and Avalonia `WriteableBitmap` wrap native pointers. Always dispose previous bitmap instances immediately when replacing them. - - **Subscription Hygiene**: Use `WeakReferenceMessenger` for pub/sub messaging. Detach all events on view unloading to prevent GC roots from retaining ViewModels. - -6. **Frame Budgeting & Render Transforms**: - - Keep render updates within 16ms (60 FPS) and 8ms (120 FPS). - - Use `RenderTransform` (GPU-accelerated) rather than mutating layout properties (`Margin`, `Width`, `Height`) during animations or gesture scaling. - ---- - -## 4. Reference Files & Documentation - -- **Operating Guide**: [`.agents/AGENTS.md`](.agents/AGENTS.md) -- **Plugin Architecture Manual**: [`docs/PLUGIN_BASED_ARCHITECTURE.md`](docs/PLUGIN_BASED_ARCHITECTURE.md) -- **M3 Expressive Guidelines**: [`docs/MATERIAL_DESIGN_3_EXPRESSIVE_GUIDELINES.md`](docs/MATERIAL_DESIGN_3_EXPRESSIVE_GUIDELINES.md) -- **M3 Tokens**: [`src/PdfEditorApp/Styles/Material3ExpressiveTokens.axaml`](src/PdfEditorApp/Styles/Material3ExpressiveTokens.axaml) -- **M3 Styles**: [`src/PdfEditorApp/Styles/Material3ExpressiveStyles.axaml`](src/PdfEditorApp/Styles/Material3ExpressiveStyles.axaml) diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 250e3e3..0000000 --- a/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2026 Code Fry Dev - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/PdfEditorApp.slnx b/PdfEditorApp.slnx deleted file mode 100644 index af9e07d..0000000 --- a/PdfEditorApp.slnx +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/README.md b/README.md deleted file mode 100644 index 6125fc6..0000000 --- a/README.md +++ /dev/null @@ -1,150 +0,0 @@ -# FryPDF — Modern Desktop PDF Studio - -
- -FryPDF App Logo - -### **Privacy-First, Professional Desktop PDF Creator, Editor & Document Studio** -*Engineered with .NET 10, Avalonia UI, QuestPDF, SkiaSharp & Modular Microkernel Plugins.* - -[![.NET 10](https://img.shields.io/badge/.NET-10.0-512BD4?style=flat-square&logo=dotnet&logoColor=white)](https://dotnet.microsoft.com/) -[![Avalonia UI](https://img.shields.io/badge/Avalonia-12.1-7029E6?style=flat-square&logo=avalonia&logoColor=white)](https://avaloniaui.net/) -[![QuestPDF](https://img.shields.io/badge/QuestPDF-2026.8-FF4500?style=flat-square)](https://www.questpdf.com/) -[![Platforms](https://img.shields.io/badge/Platforms-macOS%20%7C%20Windows%20%7C%20Linux-4B5563?style=flat-square)](https://github.com/CodeFryDev/FryPDF) -[![Tests](https://img.shields.io/badge/Tests-788%20Passed-10B981?style=flat-square)](tests/PdfEditorApp.Tests) -[![Architecture](https://img.shields.io/badge/Architecture-Microkernel%20Plugins-0284C7?style=flat-square)](docs/PLUGIN_BASED_ARCHITECTURE.md) -[![UI System](https://img.shields.io/badge/Design-Material%203%20Expressive-EE4B32?style=flat-square)](docs/MATERIAL_DESIGN_3_EXPRESSIVE_GUIDELINES.md) -[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg?style=flat-square)](LICENSE) - -
- ---- - -> ⚠️ **Active Development Stage**: FryPDF is currently in an active stage of development. While core document engines, offline tools, vector editing, and plugin systems are fully operational, new plugin capabilities and complex edge cases are actively being refined. Feedback & issue reports are warmly welcomed! - ---- - -## ✨ Key Capabilities & Highlights - -- 🧩 **Modular Microkernel Plugin Architecture ("Everything is a Plugin")**: Inspired by Cordis architecture. Every tool, canvas element, ribbon action, sidebar panel, inspector section, AI provider, and file connector is an isolated, dynamic plugin mounted through composable plugin bundles with reversible LIFO rollback and zero memory leaks. Supports third-party `.fryplugin` external packages (see the [External Plugin Development Guide](docs/EXTERNAL_PLUGIN_DEVELOPMENT_GUIDE.md)). -- 🎨 **Google Material Design 3 (M3) Expressive UI**: Beautiful cross-platform user experience across macOS, Windows, and Linux. Features expressive pill shapes, segmented button capsules, floating action buttons (FABs), chubby tactile sliders (8–10px track, 20–22px thumbs), elevation shadows, and dynamic light/dark tonal themes. -- ⚡ **Zero-Lag, 60+ FPS Real-Time Performance**: Multi-tier view caching (`_dynamicViewCache`), virtualized UI recycling (`ItemsRepeater`, `VirtualizingStackPanel`), debounced high-frequency inputs (pinch-to-zoom deltas, search filters), and asynchronous non-blocking worker thread pipelines (`Task.Run`). -- 📕 **Dedicated PDF Reader Mode**: Pure reading mode with continuous vertical scroll, single-page fit, and two-page book spreads. Includes eye-comfort color themes (Daylight, Warm Sepia, Dark Night, High Contrast), real page thumbnail strip, bookmarks/TOC tree, live search with match jumping, review annotations (multi-color highlights, sticky notes, approval stamps), and a 1-click bridge to the visual editor. -- 📖 **Universal PDF Deconstruction Engine**: Ingest and deconstruct 3rd-party binary `.pdf` streams into live editable vector canvas elements (grouped text blocks, fonts, embedded imagery, and AcroForms) with strict layered Z-index ordering and multi-format SkiaSharp decoding (DCT, JPEG2000, uncompressed CMYK/RGB, monochrome 1-bit). -- 🌐 **Script-Aware Typography & Font Fallback**: Sub-threshold token clustering and script-aware font matching (Indic scripts such as Devanagari, Tamil, Telugu; CJK; and Latin) to eliminate missing character tofu boxes (`□□□`). -- 📝 **Interactive AcroForms with Formula Engine**: Text inputs, checkboxes, radio buttons, dropdowns, combo boxes, and signature boxes with real-time formula dependency recalculation and field validation. -- 🖋️ **Vector Signature Studio**: Type-to-sign with curated cursive calligraphy styles or draw custom vector signatures with smooth bezier curve interpolation. -- 📊 **Dynamic Vector Charts & Math**: Built-in sub-pixel LaTeX mathematical typesetting and 13+ dynamic vector chart varieties (Horizontal Bar, Column, Line, Smooth Curve, Area, Donut, Pie, Radar, Scatter, Bubble, Candlestick, Waterfall, Polar). -- 🤖 **Offline AI Studio Assistant**: Integrated with `Microsoft.Extensions.AI` and `OllamaSharp` for 100% offline local LLM inference (Llama, Mistral, Gemma) or cloud endpoints (OpenAI, Groq) to generate and edit document layouts, tables, and callouts from natural language prompts. -- 🔍 **Local OCR PDF Engine**: Convert scanned documents and image-only PDFs into searchable text layers locally using Tesseract OCR and native platform vision APIs without cloud uploads. -- 🔢 **Legal Bates Numbering & FOIA Redaction**: Automated sequential page numbering with customizable prefixes, suffixes, digit padding, and 6-anchor positioning. Permanent pattern-based redaction with irreversible pixel destruction. -- 🛠️ **32 Dedicated Full-Page PDF Tools**: Complete offline toolchain across 6 suites (Organize & Page, Optimize & Security, Convert from PDF, Convert to PDF, Edit & Forms, AI & Automation) with zero popup dialogs. -- 💾 **Dual-Format Persistence**: Native `.frypdf` JSON-based project files & standard compiled binary `.pdf` documents via QuestPDF. - ---- - -## 📁 Repository Structure - -``` -PDFCreator/ -├── src/ -│ ├── PdfEditorApp.Core/ # Pure headless core engine (cross-platform, zero UI dependencies) -│ │ ├── Analysis/ # Layout analysis, typography, Unicode script detection -│ │ ├── Deconstruction/ # PDF deconstruction engine (PDF stream to live editable model) -│ │ ├── Models/ # Domain element POCOs (Text, Image, Shape, Table, Chart, Math, Form) -│ │ └── Plugins/ # Microkernel plugin infrastructure (IFryPluginContext, DAG, Pipelines) -│ │ ├── Descriptors/ # Extension descriptors (Tools, Ribbon, Sidebars, Inspector, Navigation) -│ │ ├── Pipelines/ # Typed dispatch pipelines (Waterfall, Bail, Parallel, Serial, Emit) -│ │ ├── Profiles/ # App composition profiles (desktop, headless-cli, sdk) and bundle contracts -│ │ └── Settings/ # Typed plugin settings schema and persistent file store -│ └── PdfEditorApp/ # Main Avalonia desktop application -│ ├── Assets/ # Embedded fonts (Inter, Roboto, Noto Sans) and SVG icons -│ ├── Converters/ # Avalonia XAML data-binding and transform converters -│ ├── Plugins/ # Desktop plugin implementations and 16 modular bundles -│ │ ├── Bundles/ # Standard bundles (Tools, Pages, Sidebars, AI, CanvasElements, etc.) -│ │ └── Loader/ # Collectible AssemblyLoadContext and .fryplugin package extractor -│ ├── Services/ # Dynamic registries (Tools, Ribbon, Sidebars, Inspector, Navigation, AI) -│ ├── Styles/ # Material Design 3 Expressive tokens & component themes -│ ├── ViewModels/ # Reactive MVVM ViewModels (CommunityToolkit.Mvvm source generators) -│ └── Views/ # Avalonia XAML Windows, Canvas controls, and M3 dialogs -├── tests/ -│ └── PdfEditorApp.Tests/ # Comprehensive test suite (788 unit & integration tests) -├── packaging/ -│ ├── macos/ # macOS bundle templates, AppIcon.icns, & DMG creator -│ └── windows/ # Inno Setup installer & Windows MSIX packaging with full store assets -├── docs/ # Architecture, M3 Expressive guidelines, and plugin manuals -│ ├── PLUGIN_BASED_ARCHITECTURE.md -│ ├── EXTERNAL_PLUGIN_DEVELOPMENT_GUIDE.md # Step-by-step external plugin developer tutorial -│ ├── TIC_TAC_TOE_EXAMPLE.md # Complete playable Tic-Tac-Toe reference plugin tutorial -│ ├── MATERIAL_DESIGN_3_EXPRESSIVE_GUIDELINES.md -│ ├── ARCHITECTURE.md -│ ├── FEATURES.md -│ ├── CONTRIBUTING.md -│ └── THIRD_PARTY_LICENSES.md -├── index.html # Official FryPDF web portal & interactive tool catalog -├── run # Quick CLI runner script (./run) -└── watch # Quick CLI hot-reload script (./watch) -``` - ---- - -## 🚀 Quick Start - -### Prerequisites -- [.NET 10 SDK](https://dotnet.microsoft.com/download/dotnet/10.0) (v10.0+) - -### Build Solution -```bash -dotnet build -``` - -### Run Full Test Suite (788 Tests) -```bash -dotnet test -``` - -### Run Application Locally -```bash -# Using root helper script -./run - -# Or using dotnet CLI directly -dotnet run --project src/PdfEditorApp -``` - -### Run with Hot Reload -```bash -./watch -``` - ---- - -## 📦 Packaging & Installers - -- **macOS**: Standalone `FryPDF.app` bundle and `.dmg` disk image (Universal Apple Silicon & Intel) with high-resolution `AppIcon.icns`. - > **Note**: If macOS Gatekeeper displays an unverified developer notice after downloading from GitHub Releases, run this command in Terminal: - > ```bash - > xattr -dr com.apple.quarantine "/Applications/FryPDF.app" - > ``` -- **Windows**: Official **Microsoft Store** verified app (`ms-windows-store://pdp/?productid=9P5GW2Q81B33`), **Inno Setup** executable (`FryPDF-Setup.exe`), and modern **MSIX** package with full tile assets. -- **Linux**: Portable `.tar.gz` archive, AppImage, or direct .NET 10 compilation. - ---- - -## 📚 Architectural Guides & Documentation - -- [Plugin Architecture Manual](docs/PLUGIN_BASED_ARCHITECTURE.md) — Comprehensive guide to the microkernel plugin system, 12 dynamic registries, pipelines, and settings schema. -- [Material Design 3 Expressive Guidelines](docs/MATERIAL_DESIGN_3_EXPRESSIVE_GUIDELINES.md) — Google M3 Expressive tokens, shape scale hierarchy, and styling rules. -- [Architecture & Technical Design](docs/ARCHITECTURE.md) — MVVM architecture, headless core engine, and Avalonia data binding. -- [Feature Catalog & Capabilities](docs/FEATURES.md) — In-depth breakdown of all 32 tools, vector engines, and document tools. -- [Contributing Guide](docs/CONTRIBUTING.md) — Developer setup, code conventions, and pull request workflow. -- [Third-Party & Font Licenses](docs/THIRD_PARTY_LICENSES.md) — Open-source dependency attributions and typography licenses. - ---- - -## 📄 License & Credits - -FryPDF Desktop Studio is open-source software licensed under the [MIT License](LICENSE). -Copyright © 2026 **Code Fry Dev**. All rights reserved. - -Developed with ❤️ using Avalonia UI, QuestPDF, and SkiaSharp. diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md deleted file mode 100644 index 6274682..0000000 --- a/docs/ARCHITECTURE.md +++ /dev/null @@ -1,166 +0,0 @@ -# FryPDF Technical Architecture - -FryPDF is a modern, high-performance, cross-platform PDF creation and editing studio built with **Avalonia UI** (v12.x), **C# / .NET 10**, and **QuestPDF**. - ---- - -## 1. Directory Structure - -``` -PDFCreator/ -├── src/ -│ └── PdfEditorApp/ # Main Avalonia Application -│ ├── Assets/ # Embedded icons, fonts, sample assets -│ ├── Converters/ # XAML value converters -│ ├── Models/ # Domain entities, element models, security/audit -│ ├── Services/ # Business logic, export engines, audit, undo/redo -│ ├── Styles/ # Avalonia Fluent theme styles & control themes -│ ├── Templates/ # Built-in document templates (Annual Report, Resume, etc.) -│ ├── ViewModels/ # MVVM CommunityToolkit ViewModels -│ ├── Views/ # Avalonia XAML Views, UserControls, and Dialogs -│ ├── App.axaml / .cs # Application root & resource dictionary -│ ├── Program.cs # Entry point & Avalonia initialization -│ ├── ViewLocator.cs # View-ViewModel resolver -│ └── app.manifest # Windows DPI-awareness and OS compatibility -├── tests/ -│ └── PdfEditorApp.Tests/ # Unit & Integration Tests (xUnit) -├── packaging/ -│ ├── macos/ # macOS bundle templates, icons, codesign -│ └── windows/ # Inno Setup installer (.iss) & MSIX packaging scripts -├── docs/ # Developer and user documentation -├── .github/workflows/ # GitHub Actions CI/CD release pipelines -├── PdfEditorApp.slnx # Solution configuration -└── README.md -``` - ---- - -## 2. Core Architectural Layers - -### MVVM Presentation Layer -- **`MainViewModel`**: Orchestrates top-level state: active view (Home vs Editor), current page, ribbon commands, tool modes, modal dialogs, and persistence commands. -- **`InspectorViewModel`**: Provides two-way property binding for the contextual sidebar (geometry, typography, fill colors, stroke, borders, rotation, opacity, form settings). -- **`HomeViewModel`**: Powers the Start screen with recent documents, quick action cards, and the interactive Template Gallery. -- **`ElementViewModelBase` & Subclasses**: Rich observable view models for every canvas element type (Text, Heading, Image, Shape, Table, Chart, FormField, StickyNote, Redaction, Stamp, BatesNumber, Measurement, QR Code, Ink). - -### Domain & Document Model -- **`PdfDocumentModel`**: Represents the root document (metadata, security settings, page collection, outlines, comments). -- **`PdfPageModel`**: Holds page dimensions, margins, header/footer definitions, and collection of `PdfElementModelBase`. -- **`PdfElementModelBase`**: Pure POCO domain models for serialization and export. - -### Services Layer -- **`PdfExportService` (`IPdfExportService`)**: Compiles the document hierarchy and elements into high-fidelity PDF binaries using QuestPDF. -- **`PdfImportService` (`IPdfImportService`)**: Imports existing PDFs, delegating to `PdfDeconstructionEngine` for born-digital parsing and embedded JSON detection. -- **`TemplateService` (`ITemplateService`)**: Provides starter templates (Executive Resume, Annual Report, Invoice, Certificate, Academic Paper) and allows community template extensions. -- **`ProjectPersistenceService` (`IProjectPersistenceService`)**: Handles lossless JSON-based project saving (`.frypdf`) and loading. -- **`SmartPlacementService` (`ISmartPlacementService`)**: Computes viewport-aware positions, cursor drop-points, and cascading offsets for newly inserted elements. -- **`UndoRedoService`**: Command-pattern undo/redo manager supporting atomic reversible actions. -- **`DocumentAuditService` (`IDocumentAuditService`)**: Preflight diagnostics engine checking for accessibility, contrast, empty fields, low-res images, and security flaws. -- **`SignatureService` (`ISignatureService`)**: Procedural vector and cursive signature generation. -- **`RecentDocumentsService` (`IRecentDocumentsService`)**: Manages LRU recent files history. - ---- - -## 3. PDF Deconstruction & Layout Analysis Subsystem - -Located in `src/PdfEditorApp.Core/`: -- **`PdfDeconstructionEngine`**: Deconstructs 3rd-party PDFs into live editable elements with deterministic layered Z-indexing (`Z=0..99` background cards, `Z=100..499` images, `Z=500..599` tables, `Z=600..999` shapes, `Z=1000..1999` text, `Z=2000+` form fields) and Skia multi-format image decoding. -- **`PdfLayoutAnalyzer`**: Intelligent layout clustering, script-aware gap thresholding, and paragraph indent recognition. -- **`UnicodeScriptDetector`**: Codepoint classifier covering 30+ world scripts with font fallback resolution. - ---- - -## 4. Data Studio & LiveCharts2 Ingestion Subsystem - -Located in `src/PdfEditorApp.Core/Data/` and `src/PdfEditorApp/ViewModels/DataStudio/`: -- **`DataMatrix`**: Unified in-memory tabular data structure with column type inference (Text, Number, Currency, Percentage, Date), row/column mutations, and matrix accessors. -- **`IDataSourceService` / `DataSourceService`**: Multi-source data ingestion pipeline: - - **Excel (`.xlsx`)**: High-performance OpenXml workbook parser supporting multi-sheet inspection and shared strings. - - **CSV / TSV**: RFC-4180 compliant parser with auto-delimiter detection (comma, tab, semicolon, pipe) and quoted multiline cell handling. - - **REST API / JSON**: Async HTTP client with custom headers, Bearer tokens, and flexible JsonPath array navigation. - - **Clipboard & Manual Entry**: Instant tabular clipboard paste and live spreadsheet grid editor. -- **`IDataBindingService` / `DataBindingService`**: Maps tabular datasets to LiveCharts2 series and Table elements, plus bidirectional Table $\leftrightarrow$ Chart conversion with full Undo/Redo tracking. -- **`DataStudioViewModel` & `DataStudioDialog`**: Modal Studio providing tabbed connector workflows, interactive column mapping, and live Skia-rendered chart previews. - ---- - -## 5. UI Architecture & Material Design 3 (M3) Expressive System - -FryPDF strictly implements **Google Material Design 3 (M3) Expressive** design principles across all screens, controls, and dialogs. - -- **Tokens (`Material3ExpressiveTokens.axaml`)**: - - Full M3 Expressive shape scale (`M3ShapeCornerNone` (0px) to `M3ShapeCornerFull` (9999px), with `M3ShapeCornerExtraLarge` (28px) for dialogs and `M3ShapeCornerLarge` (16px) for cards/inputs). - - Semantic tonal color palettes for Light and Dark themes (`Primary`, `SecondaryContainer`, `Surface`, `SurfaceContainer`, etc.). - - Multi-level elevation shadows (`M3ElevationLevel0` through `M3ElevationLevel5`). - - Tactile chubby slider tokens with interactive hover scaling. -- **Control Styles (`Material3ExpressiveStyles.axaml`)**: - - M3 button hierarchy (`m3-filled-btn`, `m3-tonal-btn`, `m3-elevated-btn`, `m3-outlined-btn`, `m3-text-btn`, `m3-fab`, `m3-icon-btn`). - - Segmented capsules (`m3-segmented-container` + `m3-segment-btn`), filter/assist chips (`m3-chip`, `m3-filter-chip`), and cards (`m3-card-elevated`, `m3-dialog-card`). - - Pill search bars (`TextBox.m3-search`) and outlined inputs (`TextBox.m3-outlined`). -- **Mandate**: All future UI additions and modifications must strictly conform to the [Material Design 3 Expressive Guidelines](MATERIAL_DESIGN_3_EXPRESSIVE_GUIDELINES.md) and Section 4.F of [`.agents/AGENTS.md`](../.agents/AGENTS.md). - ---- - -## 6. AI Studio & Document Generation Subsystem - -Located in `src/PdfEditorApp/Services/AI/` and `src/PdfEditorApp/ViewModels/`: -- **`IPdfStudioAgentService` / `PdfStudioAgentService`**: Autonomous document studio agent translating natural language prompts into live, native, and editable FryPDF canvas elements (headers, invoices, tables, warning cards, certificates, badges, grids). -- **`IAiService` / `AiService`**: Unified multi-provider AI gateway powered by `Microsoft.Extensions.AI`: - - **Local Offline Inference (`OllamaLocal`)**: Connects to locally hosted Ollama instances via `OllamaSharp` (Llama 3.2, Mistral, Gemma, Phi-3) with 100% privacy, zero cloud data transfer, and zero network sockets. - - **Cloud Providers (`OpenAiCloud`, `CustomOpenAiCompatible`)**: Direct integration with OpenAI, Groq, OpenRouter, LM Studio, or vLLM endpoints via standard OpenAI-compatible REST protocols. -- **`AiAssistantViewModel` & `AiAssistantDialog`**: Interactive M3 Expressive dialog supporting prompt execution, in-place element modification, suggested prompts, live model switching, activity logging, and atomic canvas undo/redo. -- **`AiDocumentService`**: Extractive NLP summarization, keyword extraction, and document translation engine. - ---- - -## 7. Plugin-Based Architecture ("Everything is a Plugin") - -FryPDF incorporates an extensible, plugin-first microkernel architecture inspired by the **Cordis** framework. -- **Dynamic Capability Context (`IFryPluginContext`)**: Swappable services and extension points without hardcoded compile-time dependencies. -- **12 Dynamic Registry Pillars**: Extensibility across Tools (`IPdfToolRegistry`), Ribbon Tabs (`IRibbonRegistry`), Sidebars (`ISidebarRegistry`), Contextual Inspector (`IInspectorRegistry`), Navigation Pages (`INavigationRegistry`), Canvas Elements (`ICanvasElementRegistry`), Importers/Exporters (`IDocumentImporterRegistry`, `IDocumentExporterRegistry`), AI/OCR (`IAiProviderRegistry`, `IOcrEngineRegistry`), Data Connectors (`IDataConnectorRegistry`), and Status/Dialogs (`IStatusBarRegistry`, `IDialogRegistry`). -- **Declarative Dependency Resolution**: Directed Acyclic Graph (DAG) topological loader. -- **Reversible Effects (`PluginScope`)**: LIFO registration disposal eliminating memory leaks on unload. -- **Multi-Mode Dispatch Pipelines**: `Waterfall` (around-middleware), `Bail` (first handled result), `Parallel`, `Serial`, and `Emit`. -- **Profiles & Bundles**: Target-specific application assemblies (`desktop`, `headless-cli`, `sdk`) composed of 16 standard bundles. -- **Dynamic Hot-Mounting**: Collectible `AssemblyLoadContext` (`FryPluginLoadContext`) supporting friction-free drag-and-drop `.fryplugin` package installation without restarting the application. - -For the full architectural specification, interface designs, and pipeline mechanics, see the [Plugin-Based Architecture Manual](PLUGIN_BASED_ARCHITECTURE.md). - ---- - -## 8. Interactive Document Viewer & Presentation Subsystem (.frypdf) - -Located in `src/PdfEditorApp/ViewModels/FryPdfViewer/` and `src/PdfEditorApp/Views/`: -- **Read-Only Interactive Experience**: Unlike the creation studio canvas which allows arbitrary dragging, resizing, and styling, the `.frypdf` Viewer offers a streamlined, non-destructive presentation and consumption mode for rich document artifacts beyond what static binary PDFs support. -- **Interactive Live Tables (`InteractiveTableViewModel`)**: - - Real-time substring row filtering across all columns via search input. - - Interactive header column sorting (ascending / descending toggle). - - Sticky frosted header bar with column headers and row count metrics. - - One-click CSV export to system clipboard. -- **Animated Tactile Charts (`InteractiveChartViewModel`)**: - - Smooth 600ms cubic ease-out entry animations using Avalonia's `DispatcherTimer`. - - Interactive tactile bar hover cards displaying exact values and category labels. - - In-place tabular data inspector toggle (`IsShowingDataTable`). - - Tactile animation replay capability for live presentations. -- **Living Form Fields & Digital Signatures**: - - Interactive read-only checkboxes and toggle states for document inspection. - - Validated digital signature and seal verification badges. -- **Presentation Mode**: - - Fullscreen/edge-to-edge slide show layout hiding editor chrome. - - Floating M3 Expressive pill HUD with quick navigation, page counters, zoom controls, and exit commands. -- **Bi-Directional Studio Bridge**: - - Documents can be launched into the interactive viewer directly from Home, the title bar, or file open pickers. - - Users can transition back into the full Editing Studio instantly via `TransitionToEditorCommand` or export directly to standard static PDF via QuestPDF. - ---- - -## 9. High-Performance, Zero-Lag Engineering Architecture - -FryPDF enforces strict performance standards to deliver 60+ FPS desktop fluid responsiveness: -- **Zero UI Thread Blocking**: All CPU-intensive parsing, Skia rendering, QuestPDF generation, OCR, and AI inference execute on background thread pools via `Task.Run` with cancellation token support. UI thread blocking methods (`.Result`, `.Wait()`) are strictly forbidden. -- **0ms Instant Navigation & View Caching**: Dynamic plugin views are lazily instantiated and cached in-memory (`_dynamicViewCache`), while core workspace views are pre-mounted in XAML to guarantee instantaneous section switching without layout spikes. -- **Virtualized Layouts**: All variable-length collections (thumbnails, tool cards, audit logs, tabular rows) use `ItemsRepeater` or `VirtualizingStackPanel` with pixel scrolling and element recycling. -- **Continuous Input Throttling & Debouncing**: Proportional clamped pinch-to-zoom math prevents exponential explosion; search inputs and drag operations are debounced/throttled. -- **Strict Memory & LOH Hygiene**: Allocations $\ge 85\text{ KB}$ are eliminated from tight loops via `ArrayPool.Shared`. Unmanaged graphics handles (`SKBitmap`, `SKImage`, `SKSurface`) are disposed immediately upon replacement. Weak reference messaging (`WeakReferenceMessenger`) prevents retain cycles. - -For detailed algorithms, testing procedures, and the continuous improvement workflow, see the [PDF Deconstruction & Editing Guide](PDF_DECONSTRUCTION_AND_EDITING.md). diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md deleted file mode 100644 index 5c5923e..0000000 --- a/docs/CONTRIBUTING.md +++ /dev/null @@ -1,78 +0,0 @@ -# Contributing to FryPDF - -Thank you for your interest in contributing to FryPDF! - ---- - -## 1. Prerequisites -- **.NET 10 SDK** (or later) -- IDE: JetBrains Rider, Visual Studio Code (with C# Dev Kit), or Visual Studio 2026 - ---- - -## 2. Solution Structure -- `src/PdfEditorApp.Core/`: Pure headless core engine (PDF deconstruction, layout analysis, data models, microkernel plugin context). -- `src/PdfEditorApp/`: Main Avalonia desktop application (Material Design 3 Expressive UI, dynamic registries, modular bundles). -- `tests/PdfEditorApp.Tests/`: Unit and integration tests (xUnit + Skia verification). -- `docs/`: Technical manuals and architecture specifications. -- `packaging/`: Platform-specific installers (macOS .app/.dmg, Windows Inno Setup & MSIX). - ---- - -## 3. Building and Running - -### Build Solution -```bash -dotnet build -``` - -### Run Tests -```bash -dotnet test -``` - -### Run Application Locally -```bash -dotnet run --project src/PdfEditorApp/PdfEditorApp.csproj -``` - ---- - -## 4. Coding Conventions & Mandates - -### A. General Standards -- Use C# 13+ / .NET 10 features (nullable reference types, pattern matching, file-scoped namespaces). -- Follow MVVM design patterns with `CommunityToolkit.Mvvm` source generators (`[ObservableProperty]`, `[RelayCommand]`). -- Ensure no warnings or build errors are introduced (`true`). -- Add comprehensive unit tests in `tests/PdfEditorApp.Tests/` for all new features, tools, and converters. - -### B. Modular Plugin Pattern ("Everything is a Plugin") -- Never write monolithic `switch-case` ladders, god view models, or hardcoded UI instantiations. -- Implement new capabilities (tools, canvas elements, ribbon actions, sidebars, inspector sections, workspace pages, AI providers, and converters) as modular plugins (`IFryPlugin` or `ToolPluginBase`) mounted into an `IFryPluginBundle`. -- Register components through the 12 dynamic capability registries (`IPdfToolRegistry`, `IRibbonRegistry`, `ISidebarRegistry`, `IInspectorRegistry`, etc.). -- Track all side effects via `ctx.RegisterEffect` to guarantee leak-free reversible unmounting. -- For complete specifications, see [Plugin-Based Architecture Manual](PLUGIN_BASED_ARCHITECTURE.md) and the step-by-step [External Plugin Development Guide](EXTERNAL_PLUGIN_DEVELOPMENT_GUIDE.md). - -### C. Zero-Lag Performance & Responsiveness Mandate -- **Zero UI Thread Blocking**: PDF parsing, Skia rasterization, QuestPDF export, OCR, and AI inference must run asynchronously on background threads via `Task.Run`. Never call `.Result` or `.Wait()` on the UI thread. -- **Instant Navigation & View Caching**: In navigation controllers, cache contributed dynamic views (`_dynamicViewCache` pattern) to ensure 0ms instantaneous page transitions. -- **Virtualization Only**: Always use `ItemsRepeater` or `VirtualizingStackPanel` with `ScrollUnit="Pixel"` for variable-length collections (thumbnails, tool cards, audit logs, data rows). -- **Smooth Continuous Inputs**: Multiplicatively clamp pinch-to-zoom math, debounce search query text changes (150–250ms), and throttle slider repaints during drag. -- **Memory & LOH Hygiene**: Never allocate byte arrays $\ge 85\text{ KB}$ in loops. Immediately dispose unmanaged Skia graphics objects (`SKBitmap`, `SKImage`, `SKSurface`). Use `WeakReferenceMessenger` to prevent retain cycles. - -### D. Google Material Design 3 (M3) Expressive UI Mandate -- All UI elements must strictly adhere to Google Material Design 3 Expressive guidelines. -- Use centralized shape tokens (`M3ShapeCornerFull` for pills/buttons/search, `M3ShapeCornerExtraLarge` for dialogs, `M3ShapeCornerLarge` for cards/inputs). -- Never hardcode hex colors; reference dynamic M3 theme brushes (`M3PrimaryBrush`, `M3SurfaceBrush`, etc.). -- See [Material Design 3 Expressive Guidelines](MATERIAL_DESIGN_3_EXPRESSIVE_GUIDELINES.md). - -### E. Security & Privacy (Strict Zero PII Policy) -- Never commit credentials, API keys, passwords, or Personally Identifiable Information (PII) — including real government IDs, personal names, phone numbers, or addresses. Always use synthetic dummy data. - ---- - -## 5. Developing & Testing PDF Deconstruction Algorithms -When adding support for new PDF document types (invoices, ID cards, tax forms, multi-column articles, complex scripts): -1. Review the detailed architecture and continuous improvement guide: [PDF Deconstruction & Editing Guide](PDF_DECONSTRUCTION_AND_EDITING.md). -2. Run the visual side-by-side verification test (`GenerateVisualComparison_SideBySide_SavesArtifacts`) to compare ground-truth PDF rendering vs deconstructed canvas elements. -3. Validate that all 770+ unit tests pass without regressions (`dotnet test`). diff --git a/docs/EXTERNAL_PLUGIN_DEVELOPMENT_GUIDE.md b/docs/EXTERNAL_PLUGIN_DEVELOPMENT_GUIDE.md deleted file mode 100644 index c920183..0000000 --- a/docs/EXTERNAL_PLUGIN_DEVELOPMENT_GUIDE.md +++ /dev/null @@ -1,749 +0,0 @@ -# Developing External Plugins for FryPDF - -> **Authoritative Guide & Developer Manual** -> Learn how to build, test, package, and distribute third-party plugins for **FryPDF** using **.NET 10, C# 13, and Avalonia UI (Material Design 3 Expressive)**. - ---- - -## 1. Overview & Architectural Foundation - -FryPDF is built upon an **"Everything is a Plugin"** modular microkernel architecture inspired by the **Cordis** framework. The core desktop shell privileges no single subsystem: tools, dynamic ribbon actions, editor sidebars, contextual property panels, floating overlays, AI engines, and file converters are all isolated plugins mounted into an active runtime context (`IFryPluginContext`). - -### Why Build a FryPDF External Plugin? -- **Zero Monolithic Wiring**: You never need to fork or recompile FryPDF to introduce new features. -- **Isolated Collectible Loading**: Plugins execute inside dedicated `CollectiblePluginLoadContext` (`AssemblyLoadContext`) sandboxes. Plugins can be loaded, enabled, disabled, updated, and completely unloaded from memory without restarting the application. -- **Dynamic M3 Expressive Integration**: Your UI automatically integrates with Google Material Design 3 (M3) Expressive themes, color tokens, and elevation physics. -- **Auto-Generated Settings UI**: Declare typed configuration options in your code or manifest; FryPDF automatically generates an M3 Expressive settings dialog. -- **Single-File Distribution (`.fryplugin`)**: Distribute your plugin as a single `.fryplugin` package (ZIP archive containing `plugin.json`, DLLs, and resources) that users can install via drag-and-drop. - ---- - -## 2. Prerequisites & Environment Setup - -Before starting, ensure you have: -- **[.NET 10 SDK](https://dotnet.microsoft.com/download/dotnet/10.0)** (v10.0 or later) -- An IDE with modern C# 13+ support: - - Visual Studio Code (with C# Dev Kit extension) - - JetBrains Rider (2025.1+) - - Visual Studio 2026 (v18+) - -### Zero Source Code Requirement -> [!TIP] -> **You do NOT need to clone FryPDF's repository or download its source code to create plugins!** -> External developers develop plugins independently against either: -> 1. **Their installed FryPDF application** (referencing the compiled `.dll` files from the install directory). -> 2. **The `FryPdf.PluginSdk` NuGet package** (`dotnet add package FryPdf.PluginSdk`). - -### Referenced Host Contracts -External plugins compile against the following host contracts (provided by the installed application at runtime): -- **`PdfEditorApp.Core.dll`**: Core domain models, plugin contracts (`IFryPlugin`, `IFryPluginContext`), and extension descriptors. -- **`PdfEditorApp.dll`** *(optional, for UI plugins)*: Avalonia UI views, viewmodels, base classes (`ToolPluginBase`), and services. -- **`CommunityToolkit.Mvvm`**: Standard MVVM source generators (`[ObservableProperty]`, `[RelayCommand]`). -- **`Avalonia`** (12.x): Cross-platform UI controls and styling. - ---- - -## 3. The Anatomy of an External Plugin - -Every external plugin consists of: -1. **A .NET 10 Class Library** targeting `net10.0`. -2. **An Implementation of `IFryPlugin`** (or subclass of `ToolPluginBase`). -3. **Reversible Effects & Dynamic Registrations** mounted via `ApplyAsync`. -4. **A `plugin.json` Manifest File** describing metadata, dependencies, and settings. -5. **A `.fryplugin` Archive** bundle for distribution. - -### 3.1 The `IFryPlugin` Interface -Every plugin must implement the `IFryPlugin` contract: - -```csharp -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using PdfEditorApp.Core.Plugins; -using PdfEditorApp.Core.Plugins.Manifests; - -namespace MyCompany.FryPdf.Plugins; - -public class MyCustomPlugin : IFryPlugin -{ - // Unique identifier (reverse-domain style: ..) - public string Id => "com.mycompany.frypdf.customtool"; - - // User-friendly display name - public string Name => "Custom PDF Tool"; - - // Semantic version of the plugin - public Version Version => new(1, 0, 0); - - // Declares required service contracts that must be registered before mounting - public IReadOnlyList RequiredServices => Array.Empty(); - - // Declares service contracts this plugin provides to other plugins - public IReadOnlyList ProvidedServices => Array.Empty(); - - // Declarative configuration schema for user-editable settings - public IReadOnlyDictionary? SettingsSchema => null; - - // Called when the plugin is mounted into FryPDF - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - // Register tools, ribbon buttons, sidebars, pipelines, or services here - return Task.CompletedTask; - } -} -``` - ---- - -## 4. The 12 Dynamic Capability Registries - -FryPDF provides 12 dynamic extension pillars accessible through `IFryPluginContext`. Never write hardcoded UI wiring—always register through these pillars: - -| Pillar | Registry / Context Method | Typical Use Case | -| :--- | :--- | :--- | -| **1. PDF Tools** | `ctx.RegisterTool(PdfToolDescriptor)` | Standalone tools (Merge, Split, Rotate, Watermark, Compress, etc.). | -| **2. Dynamic Ribbon** | `ctx.RegisterRibbonAction(RibbonActionDescriptor)`
`ctx.RegisterRibbonTab(RibbonTabDescriptor)`
`ctx.RegisterRibbonGroup(RibbonGroupDescriptor)` | Action pill buttons, custom ribbon groups, or dedicated ribbon tabs. | -| **3. Extensible Sidebars** | `ctx.RegisterSidebarTab(SidebarTabDescriptor)` | Custom sidebar panels (e.g. Audit Logs, Bookmarks, AI Chat, Metadata). | -| **4. Contextual Inspector** | `ctx.RegisterInspectorSection(InspectorSectionDescriptor)` | Custom property editor panels targeting specific canvas elements. | -| **5. Canvas Elements** | `ctx.RegisterCanvasElement(CanvasElementDescriptor)` | Custom vector elements (Barcode, LaTeX Math, Stamps, Ink, Form Fields). | -| **6. Shell Overlays** | `ctx.RegisterOverlay(OverlayDescriptor)` | Floating, draggable, minimizable M3 utility cards (e.g. Scratchpad, Notes). | -| **7. Command Palette** | `ctx.RegisterCommand(CommandPaletteDescriptor)` | Searchable commands triggered via ⌘K / Ctrl+K with keyboard shortcuts. | -| **8. Status Bar Widgets** | `ctx.RegisterStatusBarWidget(StatusBarWidgetDescriptor)` | Footer status pills, counters, toggles, or telemetry badges. | -| **9. Document Importers** | `ctx.RegisterImporter(IDocumentImporter)` | Custom file format decoders (Markdown, DOCX, XLSX, HTML, EPUB). | -| **10. Document Exporters** | `ctx.RegisterExporter(IDocumentExporter)` | Custom file generators (PDF/A, multi-image sequences, CSV, HTML). | -| **11. OCR & AI Engines** | `ctx.RegisterOcrEngine(IOcrEngine)` | Platform-specific OCR engines (Apple Vision, Tesseract) or local AI models. | -| **12. Data Connectors** | `ctx.RegisterDataConnector(IDataConnector)` | Tabular data loaders (REST APIs, SQLite databases, JSON feeds). | - -### Reversible Effects Rule (`ctx.RegisterEffect`) -Whenever your plugin registers event listeners, creates file hooks, or starts background workers, **you MUST track them using `ctx.RegisterEffect`**. When the plugin unloads, FryPDF unwinds these actions in reverse order (LIFO), guaranteeing zero memory leaks and zero dangling event listeners: - -```csharp -public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) -{ - // Subscribe to a message or event - var token = WeakReferenceMessenger.Default.Register(this, HandleDocumentChanged); - - // Register rollback action for clean teardown - ctx.RegisterEffect(() => - { - WeakReferenceMessenger.Default.Unregister(this); - }); - - return Task.CompletedTask; -} -``` - ---- - -## 5. Step-by-Step Tutorial: Building a "Watermark Plus" Plugin - -Let's build a real, fully functional external plugin: **`FryPdf.Plugin.WatermarkPlus`**. -This plugin: -1. Adds a dedicated full-page PDF tool to the "Optimize & Security" suite. -2. Contributes a quick-action pill to the Ribbon's **View** tab. -3. Contributes a keyboard shortcut to the **Command Palette** (⌘K / Ctrl+K). -4. Provides configurable settings (Default Watermark Text, Default Opacity) with auto-generated M3 UI. - -### Step 5.1: Create the Project File (`.csproj`) -Create a new directory named `FryPdf.Plugin.WatermarkPlus` and add `FryPdf.Plugin.WatermarkPlus.csproj`: - -```xml - - - net10.0 - enable - enable - 13 - true - FryPdf.Plugin.WatermarkPlus - FryPdf.Plugin.WatermarkPlus - 1.0.0 - Acme Document Solutions - Enterprise Watermarking Plugin for FryPDF - - - - - - /Applications/FryPDF.app/Contents/MacOS - C:\Program Files\FryPDF - /opt/FryPDF - $(FRYPDF_HOME) - - - - - - $(FryPdfInstallDir)\PdfEditorApp.Core.dll - false - - - $(FryPdfInstallDir)\PdfEditorApp.dll - false - - - - - - - - - - - - - - - - - -``` - -> [!IMPORTANT] -> **Host Dependency Exclusion (`false`)**: -> Always mark `PdfEditorApp.Core`, `PdfEditorApp`, `Avalonia`, and `CommunityToolkit.Mvvm` as compile-only (`Private=false` or `PrivateAssets="all"`). The host application already loads these assemblies. Packaging duplicate copies of Avalonia or Core DLLs inside your plugin will cause type casting errors across `AssemblyLoadContext` boundaries. - ---- - -### Step 5.2: Create the `plugin.json` Manifest -Create `plugin.json` in the project root: - -```json -{ - "id": "com.acme.frypdf.watermarkplus", - "name": "Watermark Plus", - "version": "1.0.0", - "author": "Acme Document Solutions", - "description": "Apply enterprise security watermarks, confidential stamps, and company emblems to multi-page PDFs.", - "entryPoint": "FryPdf.Plugin.WatermarkPlus.dll", - "icon": "Watermark", - "dependencies": [], - "settingsSchema": { - "DefaultText": { - "type": "string", - "label": "Default Stamp Text", - "description": "Default text prefilled in the watermark input", - "default": "CONFIDENTIAL" - }, - "DefaultOpacity": { - "type": "number", - "label": "Default Opacity (%)", - "description": "Default stamp opacity percentage (1-100)", - "default": 35 - }, - "IncludeDateStamp": { - "type": "boolean", - "label": "Append Current Date", - "description": "Automatically append today's date below the watermark text", - "default": true - }, - "StampColor": { - "type": "select", - "label": "Stamp Color", - "description": "Default watermark tone", - "default": "Red", - "options": ["Red", "DarkSlate", "NavyBlue", "EmeraldGreen"] - } - } -} -``` - -#### Supported `settingsSchema` Types: -- **`"string"`**: Renders a Material Design 3 `TextBox.m3-outlined`. -- **`"secret"`**: Renders a secure password field with `PasswordChar="●"`. -- **`"number"`**: Renders an M3 `NumericUpDown.m3-outlined`. -- **`"boolean"`**: Renders a tactile M3 `ToggleSwitch`. -- **`"select"`**: Renders an M3 `ComboBox.m3-outlined` populated with the `options` array. - ---- - -### Step 5.3: Implement the Tool ViewModel -Create `WatermarkPlusViewModel.cs`. Use `CommunityToolkit.Mvvm` for reactive properties and commands: - -```csharp -using System; -using System.IO; -using System.Threading.Tasks; -using CommunityToolkit.Mvvm.ComponentModel; -using CommunityToolkit.Mvvm.Input; -using PdfEditorApp.Services.Tools.Core; - -namespace FryPdf.Plugin.WatermarkPlus; - -public partial class WatermarkPlusViewModel : PdfToolViewModelBase -{ - public override string ToolId => "com.acme.frypdf.watermarkplus"; - public override string DisplayName => "Watermark Plus"; - public override string Category => "Optimize & Security"; - - [ObservableProperty] - private string _stampText = "CONFIDENTIAL"; - - [ObservableProperty] - private double _opacityPercent = 35.0; - - [ObservableProperty] - private bool _includeDate = true; - - [ObservableProperty] - private string _statusMessage = "Ready to stamp documents."; - - public WatermarkPlusViewModel(IServiceProvider serviceProvider) : base(serviceProvider) - { - } - - [RelayCommand] - private async Task ApplyWatermarkAsync() - { - if (SelectedFiles.Count == 0) - { - StatusMessage = "Please select at least one PDF document."; - return; - } - - IsProcessing = true; - ProgressValue = 0; - StatusMessage = "Applying watermark stamps..."; - - try - { - // Execute heavy PDF stamping off the UI thread via Task.Run - await Task.Run(async () => - { - int count = SelectedFiles.Count; - for (int i = 0; i < count; i++) - { - var file = SelectedFiles[i]; - // Example: Apply stamp using Core deconstruction or QuestPDF pipelines - await Task.Delay(150); // Simulate processing - - ProgressValue = (double)(i + 1) / count * 100.0; - } - }); - - StatusMessage = $"Successfully watermarked {SelectedFiles.Count} documents!"; - } - catch (Exception ex) - { - StatusMessage = $"Error: {ex.Message}"; - } - finally - { - IsProcessing = false; - } - } -} -``` - ---- - -### Step 5.4: Implement the Avalonia M3 Tool View -Create `WatermarkPlusView.axaml` adhering strictly to **Material Design 3 Expressive** guidelines: - -```xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -``` - -And the code-behind in `WatermarkPlusView.axaml.cs`: - -```csharp -using Avalonia.Controls; - -namespace FryPdf.Plugin.WatermarkPlus; - -public partial class WatermarkPlusView : UserControl -{ - public WatermarkPlusView() - { - InitializeComponent(); - } -} -``` - ---- - -### Step 5.5: Implement the Main Plugin Class -Now connect everything together by implementing `IFryPlugin` in `WatermarkPlusPlugin.cs`: - -```csharp -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Extensions.DependencyInjection; -using PdfEditorApp.Core.Plugins; -using PdfEditorApp.Core.Plugins.Descriptors; -using PdfEditorApp.Core.Plugins.Manifests; -using PdfEditorApp.Services.Tools.Core; - -namespace FryPdf.Plugin.WatermarkPlus; - -public class WatermarkPlusPlugin : IFryPlugin -{ - public string Id => "com.acme.frypdf.watermarkplus"; - public string Name => "Watermark Plus"; - public Version Version => new(1, 0, 0); - - public IReadOnlyList RequiredServices => Array.Empty(); - public IReadOnlyList ProvidedServices => Array.Empty(); - - public IReadOnlyDictionary? SettingsSchema => new Dictionary - { - ["DefaultText"] = new() - { - Type = "string", - Label = "Default Stamp Text", - Description = "Default text prefilled in the watermark input", - DefaultValue = "CONFIDENTIAL" - }, - ["DefaultOpacity"] = new() - { - Type = "number", - Label = "Default Opacity (%)", - Description = "Default stamp opacity percentage (1-100)", - DefaultValue = 35 - } - }; - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - // 1. Register Dedicated Full-Page Tool - var toolRegistration = ctx.RegisterTool(new PdfToolDescriptor - { - Id = Id, - Name = Name, - Description = "Apply custom security watermarks with dynamic opacity and timestamp stamps.", - Category = "OptimizeAndSecurity", - IconKind = "Watermark", - IconColorHex = "#0284C7", - BackgroundAccentHex = "#F0F9FF", - SupportsMultiFile = true, - AcceptedFileExtensions = ".pdf", - CreateViewModel = sp => ActivatorUtilities.CreateInstance(sp) - }); - - // 2. Register Ribbon Action in the 'Tools' Tab - var ribbonRegistration = ctx.RegisterRibbonAction(new RibbonActionDescriptor - { - Id = "action.ribbon.watermarkplus", - TabId = "tools", - GroupId = "security", - Label = "Watermark Plus", - Tooltip = "Open Watermark Plus Studio", - IconKind = "Watermark", - Order = 105, - Action = sp => - { - if (sp.GetService(typeof(IPdfToolRegistry)) is IPdfToolRegistry toolRegistry) - { - toolRegistry.OpenTool(Id); - } - } - }); - - // 3. Register Command in Command Palette (Ctrl+K / ⌘K) - var cmdRegistration = ctx.RegisterCommand(new CommandPaletteDescriptor - { - Id = "cmd.watermarkplus.open", - Title = "Open Watermark Plus Studio", - Subtitle = "Security stamp and watermark tool", - Category = "Security", - IconKind = "Watermark", - Shortcut = "Ctrl+Shift+W", - Order = 80, - Action = sp => - { - if (sp.GetService(typeof(IPdfToolRegistry)) is IPdfToolRegistry toolRegistry) - { - toolRegistry.OpenTool(Id); - } - } - }); - - // 4. Register Reversible Effects for 100% Clean Unload - ctx.RegisterEffect(() => - { - toolRegistration.Dispose(); - ribbonRegistration.Dispose(); - cmdRegistration.Dispose(); - }); - - return Task.CompletedTask; - } -} -``` - ---- - -## 6. Packaging Your Plugin (`.fryplugin`) - -FryPDF uses `.fryplugin` distribution packages. A `.fryplugin` file is simply a standard ZIP archive with the following structure: - -``` -WatermarkPlus.fryplugin (ZIP file) -├── plugin.json # Root manifest -├── FryPdf.Plugin.WatermarkPlus.dll# Compiled entry assembly -└── [OtherDependency.dll] # Any external 3rd-party dependencies (excluding host DLLs) -``` - -### 6.1 Automated Packaging with MSBuild (Recommended) -Add the following snippet to the bottom of your `.csproj` file. Every time you run `dotnet build -c Release`, MSBuild will automatically package your plugin into a `.fryplugin` file ready for installation: - -```xml - - - - $(TargetDir)staging\ - $(TargetDir)$(AssemblyName).fryplugin - - - - - - - - - - - - - - - - - - -``` - -### 6.2 Manual Packaging via CLI -You can also package your plugin manually using standard command-line tools: - -```bash -# 1. Build project in Release mode -dotnet build -c Release - -# 2. Navigate to output folder -cd bin/Release/net10.0/ - -# 3. Create ZIP archive renamed to .fryplugin -zip -r WatermarkPlus.fryplugin plugin.json FryPdf.Plugin.WatermarkPlus.dll -``` - ---- - -## 7. Installing and Testing Your Plugin in FryPDF - -FryPDF supports 3 seamless ways to load and test your external plugin: - -### Method 1: Drag-and-Drop Installation (Easiest) -1. Launch **FryPDF**. -2. Open the **Plugins Manager** (Click the Settings gear in the header $\to$ **Plugins & Extensions**, or press `Ctrl+Shift+P` / `⌘Shift+P`). -3. Drag and drop your `.fryplugin` (or `.dll`) directly onto the dialog window. -4. FryPDF immediately unpacks the package, inspects the manifest, loads the assembly into an isolated `CollectiblePluginLoadContext`, and mounts your plugin with zero restart required! - -### Method 2: Command Palette or File Picker -1. In FryPDF, press `Ctrl+K` or `⌘K` to open the **Command Palette**. -2. Type `Install Plugin Package...` and press Enter. -3. Select your `.fryplugin` or compiled `.dll` file from the open file dialog. - -### Method 3: Direct File Placement (Auto-Discovery) -On startup, FryPDF scans designated plugin directories and automatically loads all unpacked folders, `.fryplugin` archives, and standalone `.dll` files. You can drop your plugin files into either of the following locations: - -#### Platform User Directories: -- **macOS**: `~/Library/Application Support/FryPdf/plugins//` -- **Windows**: `%APPDATA%\FryPdf\plugins\\` (e.g. `C:\Users\\AppData\Roaming\FryPdf\plugins\\`) -- **Linux**: `~/.config/FryPdf/plugins//` - -#### Application Local Directory: -- `/plugins//` - ---- - -## 8. Material Design 3 (M3) Expressive Styling Mandate - -To maintain visual harmony with FryPDF, all external plugins must adhere to **Google Material Design 3 Expressive**: - -### 8.1 Shape Scale Tokens -Always reference centralized M3 shape scale tokens rather than hardcoding arbitrary numbers: - -| Token Key | Radius | Usage | -| :--- | :--- | :--- | -| `{StaticResource M3ShapeCornerFull}` | `9999px` | Buttons (`m3-filled-btn`, `m3-tonal-btn`), segmented pills, search boxes (`TextBox.m3-search`), slider thumbs. | -| `{StaticResource M3ShapeCornerExtraLarge}` | `28px` | Modal dialog cards (`Border.m3-dialog-card`), hero banners. | -| `{StaticResource M3ShapeCornerLarge}` | `16px` | Content cards (`m3-card-elevated`), inputs (`TextBox.m3-outlined`), ComboBoxes. | -| `{StaticResource M3ShapeCornerMedium}` | `12px` | Context menus, flyouts, tooltips, list items. | -| `{StaticResource M3ShapeCornerSmall}` | `8px` | Badges, chips, thumbnail cards. | - -### 8.2 Dynamic Tonal Brushes (Dark & Light Mode) -**NEVER** hardcode hex colors (like `#FFFFFF` or `#1E293B`) in your views. Always reference semantic `{DynamicResource ...}` keys so your plugin seamlessly responds to daylight, warm sepia, dark night, and high contrast themes: - -- **Primary Colors**: `M3PrimaryBrush`, `M3OnPrimaryBrush`, `M3PrimaryContainerBrush`, `M3OnPrimaryContainerBrush` -- **Surfaces**: `M3SurfaceBrush`, `M3SurfaceContainerBrush`, `M3SurfaceContainerHighestBrush`, `M3SurfaceDimBrush` -- **Text & Outlines**: `M3OnSurfaceBrush`, `M3OnSurfaceVariantBrush`, `M3OutlineBrush`, `M3OutlineVariantBrush` - ---- - -## 9. Performance & Memory Safety Mandates - -FryPDF is an interactive 60+ FPS studio. External plugins must comply with the following performance rules: - -1. **Zero UI Thread Blocking**: - - **Never** perform PDF parsing, document rendering, OCR, or file I/O synchronously on the Avalonia UI thread. - - Offload heavy tasks using `await Task.Run(...)` and support cooperative cancellation (`CancellationToken`). -2. **Unmanaged Graphics Disposal**: - - If using `SkiaSharp` (`SKBitmap`, `SKImage`, `SKSurface`), always dispose old instances when replacing preview images to prevent native memory leaks. -3. **No Large Object Heap (LOH) Allocations**: - - Do not allocate large byte arrays ($\ge 85\text{ KB}$) in tight loops. Use `ArrayPool.Shared` or streams. -4. **Collectible ALC Hygiene**: - - Avoid creating static references, global event hooks, or long-lived thread-pool timers that reference your plugin types without an unsubscription mechanism. Static references will anchor your `AssemblyLoadContext` and prevent the plugin from being garbage collected when unloaded. - ---- - -## 10. Automated Testing of External Plugins - -You can verify your plugin's mounting and lifecycle in an xUnit test project using the same loader FryPDF uses: - -```csharp -using System.IO; -using PdfEditorApp.Core.Plugins; -using PdfEditorApp.Plugins.Loader; -using Xunit; - -namespace FryPdf.Plugin.WatermarkPlus.Tests; - -public class PluginLifecycleTests -{ - [Fact] - public void Plugin_Loads_And_Instantiates_Successfully() - { - var dllPath = typeof(WatermarkPlusPlugin).Assembly.Location; - using var package = PluginAssemblyLoader.LoadPluginAssembly(dllPath); - - Assert.NotEmpty(package.Plugins); - var plugin = package.Plugins[0]; - Assert.Equal("com.acme.frypdf.watermarkplus", plugin.Id); - Assert.Equal("Watermark Plus", plugin.Name); - } - - [Fact] - public void PluginPackage_Unpacks_And_Validates_Manifest() - { - var tempPkg = Path.Combine(Path.GetTempPath(), "test.fryplugin"); - var stagingDir = Path.GetDirectoryName(typeof(WatermarkPlusPlugin).Assembly.Location)!; - - // Create package - FryPluginPackageLoader.CreatePackage(stagingDir, tempPkg); - Assert.True(File.Exists(tempPkg)); - - // Unpack and verify - using var result = FryPluginPackageLoader.UnpackAndLoad(tempPkg); - Assert.Equal("com.acme.frypdf.watermarkplus", result.Manifest.Id); - Assert.NotNull(result.AssemblyPackage); - - File.Delete(tempPkg); - } -} -``` - ---- - -## 11. Summary & Next Steps - -With FryPDF's modular microkernel architecture, creating professional external plugins is clean, fast, and robust: -- Implement `IFryPlugin` (or inherit `ToolPluginBase`). -- Register capabilities into `IFryPluginContext` with reversible rollback. -- Add `plugin.json` and package as `.fryplugin`. -- Drag and drop onto FryPDF to run! - -For in-depth details on internal pipeline mechanics, DAG solvers, and core architecture, see: -- [Plugin-Based Architecture Manual (`PLUGIN_BASED_ARCHITECTURE.md`)](PLUGIN_BASED_ARCHITECTURE.md) -- [Complete Tic-Tac-Toe Reference Plugin Guide (`TIC_TAC_TOE_EXAMPLE.md`)](TIC_TAC_TOE_EXAMPLE.md) (Source: [`docs/examples/TicTacToePlugin/`](examples/TicTacToePlugin)) -- [Material Design 3 Expressive Guidelines (`MATERIAL_DESIGN_3_EXPRESSIVE_GUIDELINES.md`)](MATERIAL_DESIGN_3_EXPRESSIVE_GUIDELINES.md) -- [PDF Deconstruction and Vector Editing (`PDF_DECONSTRUCTION_AND_EDITING.md`)](PDF_DECONSTRUCTION_AND_EDITING.md) diff --git a/docs/FEATURES.md b/docs/FEATURES.md deleted file mode 100644 index 6727022..0000000 --- a/docs/FEATURES.md +++ /dev/null @@ -1,31 +0,0 @@ -# FryPDF Feature Catalog - -A comprehensive overview of features provided by FryPDF Desktop Studio. - ---- - -## 1. Visual Page Canvas & Layout Engine -- **Infinite Zoom & Pan**: Fluid canvas zoom from 25% to 500% with fit-to-width and fit-to-page shortcuts. -- **Smart Snap-to-Grid & Guides**: Customizable 10pt/20pt/50pt grid snapping and smart alignment guidelines. -- **Smart Viewport Placement**: Automatically inserts new elements directly into the user's visible scroll region. -- **Multi-Element Alignment & Layering**: Align left/center/right, distribute evenly, bring to front, send to back. - -## 2. Rich Element Types -- **Typography & Text Blocks**: Heading presets, body text, multi-column blocks, font families, letter spacing, line height. -- **Vector Shapes**: Rectangles, rounded rects, pills, circles, callout speech bubbles, stars, arrows, brackets. -- **Interactive Chart Types (LiveCharts2 & QuestPDF)**: 17+ chart kinds including Clustered Columns, Horizontal Bars, Stacked Bars/Columns, Linear & Smooth Splines, Filled Area, Step Lines, Donut & Pie Rings with hole customization, Semi-Circle KPI Speedometer Gauges, Scatter Plots, Multi-Metric Spider/Radar, Polar Area, Candlestick OHLC financial charts, and Waterfall variance analysis with 7 curated color palettes (*Corporate*, *Emerald*, *Sunset*, *Cyber Neon*, *Slate*, *Pastel*, *Rainbow*) and 300+ DPI Skia print export. -- **Tables**: Auto-calculating rows/columns, alternating row stripes, custom border styles and header fills. -- **Dynamic Barcodes & QR Codes**: QR codes (URL, vCard, WiFi, Email presets), Code 128, EAN-13, PDF-417. -- **Ink & Freehand Drawing**: Vector pen strokes with configurable width, color, smoothing, and eraser. -- **Measurement Tool**: Real-world distance measuring with point, millimeter, centimeter, and inch unit conversions. - -## 3. Acrobat-Grade Document Tools -- **Interactive AcroForms Studio**: Text inputs, checkboxes, radio buttons, dropdowns, combo boxes, signature fields with live validation. -- **Signature Studio**: Type-to-sign with curated cursive calligraphy styles or draw custom vector signatures. -- **Legal Bates Numbering**: Sequential numbering with custom prefixes, suffixes, digit padding, and 6 positioning anchors. -- **Sanitize & Search / Redact**: Search and permanently redact sensitive terms with standard exemption codes (e.g. FOIA (b)(4)). -- **Document Comparison & Diff**: Compare two PDF projects to highlight added, removed, and modified elements. -- **Preflight & Accessibility Audit**: Scan document for low-contrast text, missing alt-text, broken links, unflattened forms. -- **Watermark & Stamp Manager**: Standard confidentiality stamps, draft watermarks, and custom dynamic date stamps. -- **Split & Extract Pages**: Burst documents into individual pages, extract page ranges, or split by interval. -- **Document Security**: AES password encryption, copy/print permissions restrictions. diff --git a/docs/MATERIAL_DESIGN_3_EXPRESSIVE_GUIDELINES.md b/docs/MATERIAL_DESIGN_3_EXPRESSIVE_GUIDELINES.md deleted file mode 100644 index b7b761b..0000000 --- a/docs/MATERIAL_DESIGN_3_EXPRESSIVE_GUIDELINES.md +++ /dev/null @@ -1,173 +0,0 @@ -# Google Material Design 3 (M3) Expressive Guidelines - -This document provides developer guidelines and design principles for building and maintaining user interfaces in **FryPDF** according to **Google Material Design 3 (M3) Expressive**. - ---- - -## 1. Core Principles of Material 3 Expressive - -1. **Expressive Geometry & Rounded Contours**: - - Material 3 Expressive moves away from sharp, boxy, or rigid rectangular UI. - - Elements feature soft, welcoming, and tactile corner radii: - - Large pill shapes for interactive triggers, search fields, and buttons. - - 28px extra-large rounded corners for modal dialogs and alert surfaces. - - 16px large corners for cards, form fields, and inspector panels. - -2. **Tonal Hierarchy & Semantic Color Roles**: - - Rather than arbitrary saturated colors, M3 Expressive employs a balanced tonal hierarchy: - - **Primary & OnPrimary**: High-emphasis focal actions. - - **PrimaryContainer & OnPrimaryContainer**: Standout highlights and contextual notices. - - **SecondaryContainer & OnSecondaryContainer**: Selected tabs, active pills, badges, chips. - - **Surface, SurfaceDim, SurfaceContainer (Lowest to Highest)**: Layered depth without harsh outlines. - - **Outline & OutlineVariant**: Subtle boundary separation. - -3. **Tactile Interaction & Motion Physics**: - - Interactive elements respond with tactile feedback: - - Chubby sliders with 8-10px tracks and 20-22px thumbs that scale slightly on hover. - - Smooth 150ms brush and transform transitions on buttons, chips, and menu items. - -4. **100% Theme Adaptability (Light & Dark)**: - - Never hardcode raw hex colors in XAML. - - Always reference `{DynamicResource ...}` keys so the UI transitions seamlessly between Light and Dark modes. - ---- - -## 2. Shape Scale Tokens Reference - -All shape tokens are defined in [`src/PdfEditorApp/Styles/Material3ExpressiveTokens.axaml`](../src/PdfEditorApp/Styles/Material3ExpressiveTokens.axaml): - -| Token Resource Key | Value | Typical Use Case | -|---|---|---| -| `M3ShapeCornerNone` | `0px` | Full-bleed splitters, root windows, edge dividers | -| `M3ShapeCornerExtraSmall` | `4px` | Micro-badges, inline code spans, keyboard shortcut hints (`kbd-badge`) | -| `M3ShapeCornerSmall` | `8px` | Badges, thumbnail cards, small chips, icon button frames | -| `M3ShapeCornerMedium` | `12px` | Context menus, flyouts, tooltips, list items, card inner sections | -| `M3ShapeCornerLarge` | `16px` | Content cards (`m3-card-elevated`), `TextBox.m3-outlined`, `ComboBox`, `NumericUpDown`, inspector section groups | -| `M3ShapeCornerExtraLarge` | `28px` | Modal dialog cards (`Border.m3-dialog-card`, `AboutDialog`, `CommandPaletteDialog`, `AiAssistantDialog`), hero promo banners | -| `M3ShapeCornerFull` | `9999px` | Tactile pill buttons, segmented button capsules (`m3-segmented-container`), global search bars (`TextBox.m3-search`), Floating Action Buttons (`m3-fab`), chubby slider thumbs | - ---- - -## 3. Color Roles Reference - -| Token Resource Key | Light Theme Role | Dark Theme Role | Description | -|---|---|---|---| -| `M3PrimaryBrush` | `#00639A` | `#92CCFF` | High-emphasis actions and accents | -| `M3OnPrimaryBrush` | `#FFFFFF` | `#003353` | Text/icons on top of Primary | -| `M3PrimaryContainerBrush` | `#CEE5FF` | `#004B76` | Prominent highlights and container fills | -| `M3OnPrimaryContainerBrush` | `#001D32` | `#CEE5FF` | Text/icons on top of PrimaryContainer | -| `M3SecondaryBrush` | `#51606F` | `#B8C8DA` | Supporting secondary actions | -| `M3SecondaryContainerBrush` | `#D5E4F7` | `#3A4857` | Active navigation tabs, selected chips, segmented items | -| `M3OnSecondaryContainerBrush` | `#0E1D2A` | `#D5E4F7` | Text/icons on top of SecondaryContainer | -| `M3SurfaceBrush` | `#F8F9FF` | `#101418` | Base canvas and screen background | -| `M3SurfaceDimBrush` | `#D8DAE0` | `#101418` | Dimmed surface contrast | -| `M3SurfaceContainerLowestBrush`| `#FFFFFF` | `#0B0F12` | Deepest recessed containers | -| `M3SurfaceContainerLowBrush` | `#F2F3FA` | `#181C20` | Subtle background panels | -| `M3SurfaceContainerBrush` | `#ECEEF4` | `#1D2024` | Default cards and panels | -| `M3SurfaceContainerHighBrush` | `#E6E8EE` | `#272A2F` | Hovered items and elevated headers | -| `M3SurfaceContainerHighestBrush`| `#E0E2E8` | `#32353A` | Search bars and segmented capsules | -| `M3OutlineBrush` | `#727780` | `#8C919A` | High-contrast component borders | -| `M3OutlineVariantBrush` | `#C2C7CF` | `#42474E` | Subtle dividers and card outlines | - -### Legacy Aliases (Fully Supported) -For compatibility with existing views, the following aliases automatically resolve to the corresponding M3 color tokens: -- `WinBgBrush` $\to$ `M3SurfaceBrush` -- `WinPanelBrush` $\to$ `M3SurfaceContainerBrush` -- `WinBorderBrush` $\to$ `M3OutlineVariantBrush` -- `WinAccentBrush` $\to$ `M3PrimaryBrush` -- `WinAccentHoverBrush` $\to$ `M3PrimaryHoverBrush` -- `WinTextBrush` $\to$ `M3OnSurfaceBrush` -- `WinMutedBrush` $\to$ `M3OnSurfaceVariantBrush` -- `WinHoverBrush` $\to$ `M3SurfaceContainerHighBrush` -- `WinActiveBrush` $\to$ `M3SecondaryContainerBrush` -- `WinInputBgBrush` $\to$ `M3SurfaceContainerLowestBrush` - ---- - -## 4. Component Styles Reference - -All pre-built M3 Expressive styles are defined in [`src/PdfEditorApp/Styles/Material3ExpressiveStyles.axaml`](../src/PdfEditorApp/Styles/Material3ExpressiveStyles.axaml): - -### Buttons -```xml - - - - - - - - -``` - -### Segmented Buttons Capsule -```xml - - - - - - - - - diff --git a/docs/examples/ScratchpadPlugin/ScratchpadView.axaml.cs b/docs/examples/ScratchpadPlugin/ScratchpadView.axaml.cs deleted file mode 100644 index bba5a82..0000000 --- a/docs/examples/ScratchpadPlugin/ScratchpadView.axaml.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Avalonia.Controls; - -namespace PdfEditorApp.Plugins.Scratchpad; - -public partial class ScratchpadView : UserControl -{ - public ScratchpadView() - { - InitializeComponent(); - } -} diff --git a/docs/examples/ScratchpadPlugin/ScratchpadViewModel.cs b/docs/examples/ScratchpadPlugin/ScratchpadViewModel.cs deleted file mode 100644 index db5cd53..0000000 --- a/docs/examples/ScratchpadPlugin/ScratchpadViewModel.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System; -using CommunityToolkit.Mvvm.ComponentModel; -using CommunityToolkit.Mvvm.Input; - -namespace PdfEditorApp.Plugins.Scratchpad; - -/// -/// ViewModel for the floating review scratchpad overlay. -/// Supports markdown note taking, word & character counts, and quick clipboard export. -/// -public partial class ScratchpadViewModel : ObservableObject -{ - private readonly IServiceProvider? _serviceProvider; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(WordCount))] - [NotifyPropertyChangedFor(nameof(CharacterCount))] - private string _notesText = "# PDF Review Notes\n- Checked page 1 header\n- Approved layout on page 3\n- Ready for signing"; - - [ObservableProperty] - private string _statusMessage = "Ready"; - - public int CharacterCount => NotesText?.Length ?? 0; - - public int WordCount - { - get - { - if (string.IsNullOrWhiteSpace(NotesText)) return 0; - return NotesText.Split(new[] { ' ', '\r', '\n', '\t' }, StringSplitOptions.RemoveEmptyEntries).Length; - } - } - - public ScratchpadViewModel(IServiceProvider? serviceProvider = null) - { - _serviceProvider = serviceProvider; - } - - [RelayCommand] - public void ClearNotes() - { - NotesText = string.Empty; - StatusMessage = "Cleared notes"; - } - - [RelayCommand] - public void AddTimestamp() - { - var stamp = $"\n\n## Note ({DateTime.Now:HH:mm:ss})\n- "; - NotesText += stamp; - StatusMessage = "Added timestamp note"; - } -} diff --git a/docs/examples/ScratchpadPlugin/plugin.json b/docs/examples/ScratchpadPlugin/plugin.json deleted file mode 100644 index 662fb1f..0000000 --- a/docs/examples/ScratchpadPlugin/plugin.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "id": "frypdf.overlay.scratchpad", - "name": "Review Scratchpad & Notes", - "version": "1.0.0", - "author": "FryPDF Tools Team", - "description": "Floating Markdown scratchpad with live word/char counters and timestamp logs for PDF review.", - "entryPoint": "ScratchpadPlugin.dll", - "icon": "NotebookEditOutline", - "dependencies": [], - "settingsSchema": { - "AutoClearOnClose": { - "type": "boolean", - "label": "Auto-Clear Notes on Close", - "description": "Automatically clear notes text when closing the scratchpad overlay.", - "default": false - } - } -} diff --git a/docs/examples/SnakePlugin/README.md b/docs/examples/SnakePlugin/README.md deleted file mode 100644 index 4be2f88..0000000 --- a/docs/examples/SnakePlugin/README.md +++ /dev/null @@ -1,33 +0,0 @@ -# Retro Arcade Snake Game Plugin (`frypdf.overlay.snake`) - -An interactive, non-modal floating arcade game plugin for **FryPDF** demonstrating the Cordis-inspired `shell.overlay` slot architecture. - ---- - -## Features -- **Non-Modal Floating Overlay**: Runs smoothly on top of any document without interrupting editing or reading. -- **60+ FPS Rendering**: Avalonia `DrawingContext` direct visual drawing with zero Large Object Heap allocations. -- **On-Screen D-Pad & Keyboard Controls**: Use arrow keys, WASD, or touch/click the on-screen tactile D-Pad. -- **Configurable Settings**: Game Speed (Normal, Fast, Zen) and Wall Collision toggle. -- **Deep Shell Integration**: Contributes to Command Palette (`Ctrl+Alt+S`), Status Bar (`🐍 Snake`), and Ribbon View Tab. - ---- - -## Building the Plugin - -To compile the plugin and generate the `.fryplugin` release archive: - -```bash -dotnet build SnakePlugin.csproj -c Release -``` - -The output package `Snake.fryplugin` will be created in `bin/Release/net10.0/Snake.fryplugin`. - ---- - -## Installing into FryPDF - -1. Open **FryPDF**. -2. Go to **Plugins & Extensions Studio** (via left sidebar, View tab, or Ctrl+K). -3. Search for **"Snake"** in the **Store** tab and click **Install**. - - Or click **"Install from File..."** in the top-right corner and select `Snake.fryplugin`. diff --git a/docs/examples/SnakePlugin/SnakeCanvasControl.cs b/docs/examples/SnakePlugin/SnakeCanvasControl.cs deleted file mode 100644 index 2f74b73..0000000 --- a/docs/examples/SnakePlugin/SnakeCanvasControl.cs +++ /dev/null @@ -1,152 +0,0 @@ -using System; -using Avalonia; -using Avalonia.Controls; -using Avalonia.Media; - -namespace PdfEditorApp.Plugins.Snake; - -/// -/// High-performance Avalonia rendering surface for the Snake game. -/// Renders dark retro-arcade grid, animated snake segments, glowing food, and bonus stars via DrawingContext with zero memory allocations per frame. -/// -public class SnakeCanvasControl : Control -{ - private static readonly IBrush BackgroundBrush = new SolidColorBrush(Color.Parse("#0D1117")); - private static readonly IPen GridLinePen = new Pen(new SolidColorBrush(Color.Parse("#161B22")), 0.75); - private static readonly IBrush SnakeHeadBrush = new SolidColorBrush(Color.Parse("#34D399")); - private static readonly IBrush SnakeBodyBrush = new SolidColorBrush(Color.Parse("#22C55E")); - private static readonly IBrush EyeWhiteBrush = Brushes.White; - private static readonly IBrush EyePupilBrush = new SolidColorBrush(Color.Parse("#064E3B")); - private static readonly IBrush FoodBrush = new SolidColorBrush(Color.Parse("#EF4444")); - private static readonly IBrush FoodGlowBrush = new SolidColorBrush(Color.Parse("#40EF4444")); - private static readonly IBrush BonusFoodBrush = new SolidColorBrush(Color.Parse("#F59E0B")); - private static readonly IBrush BonusFoodGlowBrush = new SolidColorBrush(Color.Parse("#50F59E0B")); - - private SnakeGameViewModel? _viewModel; - - public SnakeCanvasControl() - { - ClipToBounds = true; - } - - protected override void OnDataContextChanged(EventArgs e) - { - base.OnDataContextChanged(e); - - if (_viewModel != null) - { - _viewModel.RenderRequested -= OnRenderRequested; - } - - _viewModel = DataContext as SnakeGameViewModel; - - if (_viewModel != null) - { - _viewModel.RenderRequested += OnRenderRequested; - } - - InvalidateVisual(); - } - - private void OnRenderRequested() - { - InvalidateVisual(); - } - - public override void Render(DrawingContext context) - { - base.Render(context); - - var bounds = Bounds; - if (bounds.Width <= 0 || bounds.Height <= 0) return; - - // 1. Draw Dark Background - context.FillRectangle(BackgroundBrush, bounds); - - double cellWidth = bounds.Width / SnakeGameViewModel.GridWidth; - double cellHeight = bounds.Height / SnakeGameViewModel.GridHeight; - - // 2. Draw Subtle Grid Lines - for (int x = 0; x <= SnakeGameViewModel.GridWidth; x++) - { - double lineX = x * cellWidth; - context.DrawLine(GridLinePen, new Point(lineX, 0), new Point(lineX, bounds.Height)); - } - - for (int y = 0; y <= SnakeGameViewModel.GridHeight; y++) - { - double lineY = y * cellHeight; - context.DrawLine(GridLinePen, new Point(0, lineY), new Point(bounds.Width, lineY)); - } - - if (_viewModel == null) return; - - // 3. Draw Bonus Food (Golden Orb) - if (_viewModel.BonusFood.HasValue) - { - var bonusPt = _viewModel.BonusFood.Value; - double bx = bonusPt.X * cellWidth + cellWidth / 2.0; - double by = bonusPt.Y * cellHeight + cellHeight / 2.0; - double bonusRadius = Math.Min(cellWidth, cellHeight) * 0.44; - - // Glow halo - context.DrawEllipse(BonusFoodGlowBrush, null, new Point(bx, by), bonusRadius * 1.5, bonusRadius * 1.5); - // Core - context.DrawEllipse(BonusFoodBrush, null, new Point(bx, by), bonusRadius, bonusRadius); - } - - // 4. Draw Regular Food (Red Glowing Orb) - var food = _viewModel.Food; - double fx = food.X * cellWidth + cellWidth / 2.0; - double fy = food.Y * cellHeight + cellHeight / 2.0; - double foodRadius = Math.Min(cellWidth, cellHeight) * 0.38; - - // Food glow - context.DrawEllipse(FoodGlowBrush, null, new Point(fx, fy), foodRadius * 1.45, foodRadius * 1.45); - // Food body - context.DrawEllipse(FoodBrush, null, new Point(fx, fy), foodRadius, foodRadius); - - // 5. Draw Snake Segments - bool isHead = true; - foreach (var segment in _viewModel.SnakeBody) - { - double segX = segment.X * cellWidth + 1.0; - double segY = segment.Y * cellHeight + 1.0; - double segW = Math.Max(1.0, cellWidth - 2.0); - double segH = Math.Max(1.0, cellHeight - 2.0); - - var segRect = new Rect(segX, segY, segW, segH); - - if (isHead) - { - // Head segment with rounded pill corners - context.DrawRectangle(SnakeHeadBrush, null, new RoundedRect(segRect, 5.0)); - - // Cute eyes - double eyeSize = Math.Max(2.5, Math.Min(cellWidth, cellHeight) * 0.22); - double pupilSize = eyeSize * 0.55; - - // Eye offsets - double eyeOffset = cellWidth * 0.24; - double eyeCenterX = segX + segW / 2.0; - double eyeCenterY = segY + segH / 2.0; - - Point leftEye = new(eyeCenterX - eyeOffset, eyeCenterY - eyeOffset); - Point rightEye = new(eyeCenterX + eyeOffset, eyeCenterY - eyeOffset); - - context.DrawEllipse(EyeWhiteBrush, null, leftEye, eyeSize, eyeSize); - context.DrawEllipse(EyePupilBrush, null, leftEye, pupilSize, pupilSize); - - context.DrawEllipse(EyeWhiteBrush, null, rightEye, eyeSize, eyeSize); - context.DrawEllipse(EyePupilBrush, null, rightEye, pupilSize, pupilSize); - - isHead = false; - } - else - { - // Body segment - context.DrawRectangle(SnakeBodyBrush, null, new RoundedRect(segRect, 3.5)); - } - } - } -} diff --git a/docs/examples/SnakePlugin/SnakeGamePlugin.cs b/docs/examples/SnakePlugin/SnakeGamePlugin.cs deleted file mode 100644 index 68ed3be..0000000 --- a/docs/examples/SnakePlugin/SnakeGamePlugin.cs +++ /dev/null @@ -1,143 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using CommunityToolkit.Mvvm.Input; -using PdfEditorApp.Core.Plugins; -using PdfEditorApp.Core.Plugins.Descriptors; -using PdfEditorApp.Core.Plugins.Manifests; -using PdfEditorApp.ViewModels; - -namespace PdfEditorApp.Plugins.Snake; - -/// -/// Modular plugin contributing a playable, draggable Snake game targeting the 'shell.overlay' slot. -/// Inspired by the Cordis client-side dynamic plugin architecture. -/// -public class SnakeGamePlugin : IFryPlugin -{ - public string Id => "frypdf.overlay.snake"; - public string Name => "Playable Snake Game"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => Array.Empty(); - - public IReadOnlyDictionary? SettingsSchema => new Dictionary - { - ["InitialSpeed"] = new() - { - Label = "Game Speed", - Description = "Default tick speed for snake movement", - Type = "select", - Options = new() { "Normal", "Fast", "Zen" }, - DefaultValue = "Normal" - }, - ["WallCollision"] = new() - { - Label = "Wall Collision Mode", - Description = "When enabled, hitting the border causes game over. When disabled, the snake wraps around edges.", - Type = "boolean", - DefaultValue = true - } - }; - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - // 1. Register Shell Overlay Descriptor - ctx.RegisterOverlay(new OverlayDescriptor - { - Id = Id, - Title = "🐍 Snake", - Slot = "shell.overlay", - DefaultWidth = 320, - DefaultHeight = 420, - InitialX = null, - InitialY = 100, - IsDraggable = true, - IsMinimizable = true, - IsClosable = true, - IconKind = "GamepadVariantOutline", - ChromeMode = OverlayChromeMode.CustomChrome, - ViewType = typeof(SnakeGameView), - ViewModelType = typeof(SnakeGameViewModel), - ViewFactory = sp => new SnakeGameView - { - DataContext = new SnakeGameViewModel(sp) - }, - ViewModelFactory = sp => new SnakeGameViewModel(sp) - }); - - // 2. Register Command Palette action - ctx.RegisterCommand(new CommandPaletteDescriptor - { - Id = "cmd.overlay.snake", - Title = "Play Snake Game (Shell Overlay)", - Subtitle = "Launch draggable retro-arcade Snake game floating over the application", - Category = "Shell Overlays", - IconKind = "GamepadVariantOutline", - Shortcut = "Ctrl+Alt+S", - Order = 95, - Action = sp => - { - if (sp.GetService(typeof(IOverlayRegistry)) is IOverlayRegistry reg) - { - reg.ToggleOverlay(Id); - } - } - }); - - // 3. Register Footer Status Bar Widget (Clickable 🐍 Snake pill) - ctx.RegisterStatusBarWidget(new StatusBarWidgetDescriptor - { - WidgetId = "frypdf.status.snake", - Alignment = StatusBarAlignment.Right, - Order = 15, - ToolTip = "Play Snake Game (Floating Shell Overlay)", - Factory = sp => - { - var reg = sp.GetService(typeof(IOverlayRegistry)) as IOverlayRegistry; - return new StatusBarWidgetViewModel - { - WidgetId = "frypdf.status.snake", - Label = "🐍 Snake", - IconKind = "GamepadVariantOutline", - ToolTip = "Launch floating Snake game overlay", - IsActive = true, - Command = new RelayCommand(() => - { - reg?.ToggleOverlay(Id); - }) - }; - } - }); - - // 4. Register Ribbon Action in View Tab - ctx.RegisterRibbonAction(new RibbonActionDescriptor - { - Id = "frypdf.ribbon.action.snake", - TabId = "view", - GroupId = "plugins", - Label = "Snake Game", - Tooltip = "Launch floating retro Snake arcade in shell.overlay", - IconKind = "GamepadVariantOutline", - Order = 50, - Action = sp => - { - if (sp.GetService(typeof(IOverlayRegistry)) is IOverlayRegistry reg) - { - reg.ToggleOverlay(Id); - } - } - }); - - // Reversible effect: Ensure overlay is hidden if plugin is unloaded - ctx.RegisterEffect(() => - { - if (ctx.TryGetService(out var reg)) - { - reg.HideOverlay(Id); - } - }); - - return Task.CompletedTask; - } -} diff --git a/docs/examples/SnakePlugin/SnakeGameView.axaml b/docs/examples/SnakePlugin/SnakeGameView.axaml deleted file mode 100644 index 61c940d..0000000 --- a/docs/examples/SnakePlugin/SnakeGameView.axaml +++ /dev/null @@ -1,201 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/examples/SnakePlugin/SnakeGameView.axaml.cs b/docs/examples/SnakePlugin/SnakeGameView.axaml.cs deleted file mode 100644 index 0088c6e..0000000 --- a/docs/examples/SnakePlugin/SnakeGameView.axaml.cs +++ /dev/null @@ -1,160 +0,0 @@ -using System; -using Avalonia; -using Avalonia.Controls; -using Avalonia.Input; -using Avalonia.Interactivity; -using Avalonia.VisualTree; -using PdfEditorApp.ViewModels; - -namespace PdfEditorApp.Plugins.Snake; - -public partial class SnakeGameView : UserControl -{ - private Point _dragStartPoint; - private bool _isDragging; - private bool _isLocallyMinimized; - - public SnakeGameView() - { - InitializeComponent(); - } - - protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e) - { - base.OnAttachedToVisualTree(e); - Focus(); - } - - protected override void OnKeyDown(KeyEventArgs e) - { - base.OnKeyDown(e); - - if (DataContext is not SnakeGameViewModel vm) return; - - switch (e.Key) - { - case Key.Up: - case Key.W: - vm.ChangeDirection(SnakeDirection.Up); - e.Handled = true; - break; - case Key.Down: - case Key.S: - vm.ChangeDirection(SnakeDirection.Down); - e.Handled = true; - break; - case Key.Left: - case Key.A: - vm.ChangeDirection(SnakeDirection.Left); - e.Handled = true; - break; - case Key.Right: - case Key.D: - vm.ChangeDirection(SnakeDirection.Right); - e.Handled = true; - break; - case Key.Space: - vm.TogglePlayPause(); - e.Handled = true; - break; - case Key.R: - vm.ResetGame(); - vm.StartGame(); - e.Handled = true; - break; - } - } - - private void OnHeaderPointerPressed(object? sender, PointerPressedEventArgs e) - { - if (e.GetCurrentPoint(this).Properties.IsLeftButtonPressed) - { - _isDragging = true; - _dragStartPoint = e.GetPosition(this.VisualRoot as Visual ?? this); - e.Pointer.Capture(sender as Control); - Focus(); - e.Handled = true; - } - } - - private void OnHeaderPointerMoved(object? sender, PointerEventArgs e) - { - if (_isDragging) - { - var root = this.VisualRoot as Visual ?? this; - var currentPoint = e.GetPosition(root); - var deltaX = currentPoint.X - _dragStartPoint.X; - var deltaY = currentPoint.Y - _dragStartPoint.Y; - _dragStartPoint = currentPoint; - - var overlayVm = FindOverlayViewModel(); - if (overlayVm != null) - { - overlayVm.X = Math.Max(0, overlayVm.X + deltaX); - overlayVm.Y = Math.Max(0, overlayVm.Y + deltaY); - } - e.Handled = true; - } - } - - private void OnHeaderPointerReleased(object? sender, PointerReleasedEventArgs e) - { - if (_isDragging) - { - _isDragging = false; - e.Pointer.Capture(null); - e.Handled = true; - } - } - - private void OnMinimizeClick(object? sender, RoutedEventArgs e) - { - _isLocallyMinimized = !_isLocallyMinimized; - - if (CanvasContainer != null) - { - CanvasContainer.IsVisible = !_isLocallyMinimized; - } - - if (FooterContainer != null) - { - FooterContainer.IsVisible = !_isLocallyMinimized; - } - - var overlayVm = FindOverlayViewModel(); - if (overlayVm != null) - { - overlayVm.IsMinimized = _isLocallyMinimized; - } - } - - private void OnCloseClick(object? sender, RoutedEventArgs e) - { - if (DataContext is SnakeGameViewModel vm) - { - vm.PauseGame(); - } - - var overlayVm = FindOverlayViewModel(); - if (overlayVm != null) - { - overlayVm.Close(); - } - } - - private OverlayInstanceViewModel? FindOverlayViewModel() - { - // First check parent control DataContext - Visual? current = this; - while (current != null) - { - if (current is Control ctrl && ctrl.DataContext is OverlayInstanceViewModel ovm) - { - return ovm; - } - current = current.GetVisualParent(); - } - - return null; - } -} diff --git a/docs/examples/SnakePlugin/SnakeGameViewModel.cs b/docs/examples/SnakePlugin/SnakeGameViewModel.cs deleted file mode 100644 index 06408fe..0000000 --- a/docs/examples/SnakePlugin/SnakeGameViewModel.cs +++ /dev/null @@ -1,368 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using Avalonia.Threading; -using CommunityToolkit.Mvvm.ComponentModel; -using CommunityToolkit.Mvvm.Input; -using Microsoft.Extensions.DependencyInjection; -using PdfEditorApp.Core.Plugins.Settings; - -namespace PdfEditorApp.Plugins.Snake; - -public enum SnakeDirection -{ - None, - Up, - Down, - Left, - Right -} - -public enum SnakeGameState -{ - Ready, - Playing, - Paused, - GameOver -} - -public readonly record struct GridPoint(int X, int Y); - -/// -/// MVVM game loop and state management for the floating Snake Game plugin. -/// Designed for 60+ FPS zero-allocation tick processing, dynamic speed acceleration, and persistent high scores. -/// -public partial class SnakeGameViewModel : ObservableObject, IDisposable -{ - private readonly DispatcherTimer _gameTimer; - private readonly Random _random = new(); - private readonly IPluginSettingsStore? _settingsStore; - - public const int GridWidth = 20; - public const int GridHeight = 20; - - [ObservableProperty] - private int _score; - - [ObservableProperty] - private int _highScore; - - [ObservableProperty] - private SnakeGameState _state = SnakeGameState.Ready; - - [ObservableProperty] - private bool _wallCollision = true; - - [ObservableProperty] - private int _speedMs = 120; - - [ObservableProperty] - private string _statusText = "Press Space or Arrows to Start"; - - [ObservableProperty] - private string _actionButtonLabel = "Start"; - - private SnakeDirection _currentDirection = SnakeDirection.Right; - private SnakeDirection _pendingDirection = SnakeDirection.Right; - - public LinkedList SnakeBody { get; } = new(); - public GridPoint Food { get; private set; } - public GridPoint? BonusFood { get; private set; } - public int BonusFoodTicksRemaining { get; private set; } - - public event Action? RenderRequested; - - public SnakeGameViewModel(IServiceProvider? serviceProvider = null) - { - _settingsStore = serviceProvider?.GetService(); - LoadSettingsAndHighScore(); - - _gameTimer = new DispatcherTimer - { - Interval = TimeSpan.FromMilliseconds(SpeedMs) - }; - _gameTimer.Tick += OnGameTick; - - ResetGame(); - } - - private void LoadSettingsAndHighScore() - { - if (_settingsStore != null) - { - HighScore = (int)_settingsStore.GetSetting("frypdf.overlay.snake", "HighScore", 0.0); - WallCollision = _settingsStore.GetSetting("frypdf.overlay.snake", "WallCollision", true); - var speedPref = _settingsStore.GetSetting("frypdf.overlay.snake", "InitialSpeed", "Normal"); - SpeedMs = speedPref switch - { - "Fast" => 90, - "Zen" => 160, - _ => 120 - }; - } - } - - public void ResetGame() - { - _gameTimer.Stop(); - SnakeBody.Clear(); - - // Initial 3-segment snake in middle - int startX = GridWidth / 2; - int startY = GridHeight / 2; - SnakeBody.AddFirst(new GridPoint(startX, startY)); - SnakeBody.AddLast(new GridPoint(startX - 1, startY)); - SnakeBody.AddLast(new GridPoint(startX - 2, startY)); - - _currentDirection = SnakeDirection.Right; - _pendingDirection = SnakeDirection.Right; - Score = 0; - BonusFood = null; - BonusFoodTicksRemaining = 0; - State = SnakeGameState.Ready; - StatusText = "Press Space or Arrows to Play"; - ActionButtonLabel = "Start"; - - SpawnFood(); - RenderRequested?.Invoke(); - } - - [RelayCommand] - public void TogglePlayPause() - { - switch (State) - { - case SnakeGameState.Ready: - StartGame(); - break; - case SnakeGameState.Playing: - PauseGame(); - break; - case SnakeGameState.Paused: - ResumeGame(); - break; - case SnakeGameState.GameOver: - ResetGame(); - StartGame(); - break; - } - } - - public void StartGame() - { - State = SnakeGameState.Playing; - StatusText = "Playing"; - ActionButtonLabel = "Pause"; - _gameTimer.Interval = TimeSpan.FromMilliseconds(SpeedMs); - _gameTimer.Start(); - RenderRequested?.Invoke(); - } - - public void PauseGame() - { - if (State != SnakeGameState.Playing) return; - _gameTimer.Stop(); - State = SnakeGameState.Paused; - StatusText = "Game Paused"; - ActionButtonLabel = "Resume"; - RenderRequested?.Invoke(); - } - - public void ResumeGame() - { - if (State != SnakeGameState.Paused) return; - State = SnakeGameState.Playing; - StatusText = "Playing"; - ActionButtonLabel = "Pause"; - _gameTimer.Start(); - RenderRequested?.Invoke(); - } - - public void ChangeDirection(SnakeDirection newDir) - { - if (newDir == SnakeDirection.None) return; - - if (State == SnakeGameState.Ready || State == SnakeGameState.Paused) - { - StartGame(); - } - - // Prevent immediate 180-degree reverse - bool isOpposite = (_currentDirection == SnakeDirection.Up && newDir == SnakeDirection.Down) || - (_currentDirection == SnakeDirection.Down && newDir == SnakeDirection.Up) || - (_currentDirection == SnakeDirection.Left && newDir == SnakeDirection.Right) || - (_currentDirection == SnakeDirection.Right && newDir == SnakeDirection.Left); - - if (!isOpposite) - { - _pendingDirection = newDir; - } - } - - private void OnGameTick(object? sender, EventArgs e) - { - if (State != SnakeGameState.Playing) return; - - _currentDirection = _pendingDirection; - var head = SnakeBody.First!.Value; - int nextX = head.X; - int nextY = head.Y; - - switch (_currentDirection) - { - case SnakeDirection.Up: nextY--; break; - case SnakeDirection.Down: nextY++; break; - case SnakeDirection.Left: nextX--; break; - case SnakeDirection.Right: nextX++; break; - } - - // 1. Check Wall Collision / Wrap-around - if (WallCollision) - { - if (nextX < 0 || nextX >= GridWidth || nextY < 0 || nextY >= GridHeight) - { - TriggerGameOver("Crashed into wall!"); - return; - } - } - else - { - nextX = (nextX + GridWidth) % GridWidth; - nextY = (nextY + GridHeight) % GridHeight; - } - - var newHead = new GridPoint(nextX, nextY); - - // 2. Check Self-Collision - // Ignore the tail segment since it will move forward if not eating - var currentTail = SnakeBody.Last!.Value; - bool isEating = (newHead == Food) || (BonusFood.HasValue && newHead == BonusFood.Value); - - foreach (var segment in SnakeBody) - { - if (!isEating && segment == currentTail) continue; - if (segment == newHead) - { - TriggerGameOver("Ran into yourself!"); - return; - } - } - - // 3. Move Snake - SnakeBody.AddFirst(newHead); - - if (newHead == Food) - { - Score += 10; - UpdateHighScore(); - SpawnFood(); - - // Dynamic speed up: decrease interval slightly as snake gets longer - var newIntervalMs = Math.Max(55, SpeedMs - (Score / 30) * 4); - _gameTimer.Interval = TimeSpan.FromMilliseconds(newIntervalMs); - - // Chance to spawn golden bonus food every 50 points - if (Score % 50 == 0 && !BonusFood.HasValue) - { - SpawnBonusFood(); - } - } - else if (BonusFood.HasValue && newHead == BonusFood.Value) - { - Score += 50; - UpdateHighScore(); - BonusFood = null; - BonusFoodTicksRemaining = 0; - } - else - { - // Remove tail if didn't eat - SnakeBody.RemoveLast(); - } - - // Decrement bonus food countdown - if (BonusFood.HasValue) - { - BonusFoodTicksRemaining--; - if (BonusFoodTicksRemaining <= 0) - { - BonusFood = null; - } - } - - RenderRequested?.Invoke(); - } - - private void TriggerGameOver(string reason) - { - _gameTimer.Stop(); - State = SnakeGameState.GameOver; - StatusText = $"Game Over! {reason}"; - ActionButtonLabel = "Play Again"; - UpdateHighScore(); - RenderRequested?.Invoke(); - } - - private void UpdateHighScore() - { - if (Score > HighScore) - { - HighScore = Score; - _settingsStore?.SetSetting("frypdf.overlay.snake", "HighScore", (double)HighScore); - _settingsStore?.Save(); - } - } - - private void SpawnFood() - { - var occupied = new HashSet(SnakeBody); - if (BonusFood.HasValue) occupied.Add(BonusFood.Value); - - var available = new List(); - for (int x = 0; x < GridWidth; x++) - { - for (int y = 0; y < GridHeight; y++) - { - var pt = new GridPoint(x, y); - if (!occupied.Contains(pt)) - { - available.Add(pt); - } - } - } - - if (available.Count > 0) - { - Food = available[_random.Next(available.Count)]; - } - } - - private void SpawnBonusFood() - { - var occupied = new HashSet(SnakeBody) { Food }; - var available = new List(); - for (int x = 0; x < GridWidth; x++) - { - for (int y = 0; y < GridHeight; y++) - { - var pt = new GridPoint(x, y); - if (!occupied.Contains(pt)) - { - available.Add(pt); - } - } - } - - if (available.Count > 0) - { - BonusFood = available[_random.Next(available.Count)]; - BonusFoodTicksRemaining = 45; // ~5 seconds - } - } - - public void Dispose() - { - _gameTimer.Stop(); - _gameTimer.Tick -= OnGameTick; - } -} diff --git a/docs/examples/SnakePlugin/SnakePlugin.csproj b/docs/examples/SnakePlugin/SnakePlugin.csproj deleted file mode 100644 index 778c614..0000000 --- a/docs/examples/SnakePlugin/SnakePlugin.csproj +++ /dev/null @@ -1,82 +0,0 @@ - - - net10.0 - enable - enable - 13 - true - SnakePlugin - PdfEditorApp.Plugins.Snake - 1.0.0 - FryPDF Team - Playable Retro Arcade Snake game shell overlay plugin for FryPDF - - - - - - - - false - runtime - - - false - runtime - - - - - - $(FRYPDF_HOME) - /Applications/FryPDF.app/Contents/MacOS - C:\Program Files\FryPDF - /opt/FryPDF - - - - - $(FryPdfInstallDir)\PdfEditorApp.Core.dll - false - - - $(FryPdfInstallDir)\PdfEditorApp.dll - false - - - - - - - - - - - - - - - - - - - $(TargetDir)staging\ - $(TargetDir)Snake.fryplugin - - - - - - - - - - - - - - - - - - diff --git a/docs/examples/SnakePlugin/plugin.json b/docs/examples/SnakePlugin/plugin.json deleted file mode 100644 index 4166338..0000000 --- a/docs/examples/SnakePlugin/plugin.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "id": "frypdf.overlay.snake", - "name": "Retro Arcade Snake Game", - "version": "1.0.0", - "author": "FryPDF Team", - "description": "Playable, draggable retro-arcade Snake game floating over the application canvas in the 'shell.overlay' slot.", - "entryPoint": "SnakePlugin.dll", - "icon": "GamepadVariantOutline", - "dependencies": [], - "settingsSchema": { - "InitialSpeed": { - "type": "select", - "label": "Game Speed", - "description": "Default tick speed for snake movement", - "default": "Normal", - "options": ["Normal", "Fast", "Zen"] - }, - "WallCollision": { - "type": "boolean", - "label": "Wall Collision Mode", - "description": "When enabled, hitting the border causes game over. When disabled, the snake wraps around edges.", - "default": true - } - } -} diff --git a/docs/examples/TelemetryPlugin/DocumentTelemetryPlugin.cs b/docs/examples/TelemetryPlugin/DocumentTelemetryPlugin.cs deleted file mode 100644 index 2358ca8..0000000 --- a/docs/examples/TelemetryPlugin/DocumentTelemetryPlugin.cs +++ /dev/null @@ -1,123 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using CommunityToolkit.Mvvm.Input; -using PdfEditorApp.Core.Plugins; -using PdfEditorApp.Core.Plugins.Descriptors; -using PdfEditorApp.Core.Plugins.Manifests; -using PdfEditorApp.ViewModels; - -namespace PdfEditorApp.Plugins.Telemetry; - -/// -/// Plugin contributing a live document diagnostics & memory telemetry HUD targeting 'shell.overlay'. -/// Uses OverlayChromeMode.StandardCard for automatic Material Design 3 frame and dragging physics. -/// -public class DocumentTelemetryPlugin : IFryPlugin -{ - public string Id => "frypdf.overlay.telemetry"; - public string Name => "Document Telemetry HUD"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => Array.Empty(); - - public IReadOnlyDictionary? SettingsSchema => null; - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - // 1. Register Overlay with StandardCard chrome - ctx.RegisterOverlay(new OverlayDescriptor - { - Id = Id, - Title = "⚡ Telemetry HUD", - Slot = "shell.overlay", - DefaultWidth = 320, - DefaultHeight = 250, - InitialX = null, - InitialY = 160, - IsDraggable = true, - IsMinimizable = true, - IsClosable = true, - IconKind = "ChartTimelineVariant", - ChromeMode = OverlayChromeMode.StandardCard, - ViewType = typeof(DocumentTelemetryView), - ViewModelType = typeof(DocumentTelemetryViewModel), - ViewFactory = sp => new DocumentTelemetryView - { - DataContext = new DocumentTelemetryViewModel(sp) - }, - ViewModelFactory = sp => new DocumentTelemetryViewModel(sp) - }); - - // 2. Register Command Palette - ctx.RegisterCommand(new CommandPaletteDescriptor - { - Id = "cmd.overlay.telemetry", - Title = "Toggle Telemetry HUD (Shell Overlay)", - Subtitle = "Display real-time memory and document engine diagnostics", - Category = "Shell Overlays", - IconKind = "ChartTimelineVariant", - Shortcut = "Ctrl+Alt+T", - Order = 92, - Action = sp => - { - if (sp.GetService(typeof(IOverlayRegistry)) is IOverlayRegistry reg) - { - reg.ToggleOverlay(Id); - } - } - }); - - // 3. Register Footer Status Bar Widget - ctx.RegisterStatusBarWidget(new StatusBarWidgetDescriptor - { - WidgetId = "frypdf.status.telemetry", - Alignment = StatusBarAlignment.Right, - Order = 13, - ToolTip = "Toggle Document Telemetry HUD", - Factory = sp => - { - var reg = sp.GetService(typeof(IOverlayRegistry)) as IOverlayRegistry; - return new StatusBarWidgetViewModel - { - WidgetId = "frypdf.status.telemetry", - Label = "⚡ HUD", - IconKind = "ChartTimelineVariant", - ToolTip = "Toggle real-time engine telemetry", - IsActive = true, - Command = new RelayCommand(() => reg?.ToggleOverlay(Id)) - }; - } - }); - - // 4. Register Ribbon Action in View Tab - ctx.RegisterRibbonAction(new RibbonActionDescriptor - { - Id = "frypdf.ribbon.action.telemetry", - TabId = "view", - GroupId = "plugins", - Label = "Telemetry HUD", - Tooltip = "Open real-time diagnostics HUD in shell.overlay", - IconKind = "ChartTimelineVariant", - Order = 54, - Action = sp => - { - if (sp.GetService(typeof(IOverlayRegistry)) is IOverlayRegistry reg) - { - reg.ToggleOverlay(Id); - } - } - }); - - // Clean rollback on unload - ctx.RegisterEffect(() => - { - if (ctx.TryGetService(out var reg)) - { - reg.HideOverlay(Id); - } - }); - - return Task.CompletedTask; - } -} diff --git a/docs/examples/TelemetryPlugin/DocumentTelemetryView.axaml b/docs/examples/TelemetryPlugin/DocumentTelemetryView.axaml deleted file mode 100644 index 939dfd2..0000000 --- a/docs/examples/TelemetryPlugin/DocumentTelemetryView.axaml +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/examples/TelemetryPlugin/DocumentTelemetryView.axaml.cs b/docs/examples/TelemetryPlugin/DocumentTelemetryView.axaml.cs deleted file mode 100644 index d89e6b4..0000000 --- a/docs/examples/TelemetryPlugin/DocumentTelemetryView.axaml.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Avalonia.Controls; - -namespace PdfEditorApp.Plugins.Telemetry; - -public partial class DocumentTelemetryView : UserControl -{ - public DocumentTelemetryView() - { - InitializeComponent(); - } -} diff --git a/docs/examples/TelemetryPlugin/DocumentTelemetryViewModel.cs b/docs/examples/TelemetryPlugin/DocumentTelemetryViewModel.cs deleted file mode 100644 index 3296679..0000000 --- a/docs/examples/TelemetryPlugin/DocumentTelemetryViewModel.cs +++ /dev/null @@ -1,49 +0,0 @@ -using System; -using CommunityToolkit.Mvvm.ComponentModel; -using CommunityToolkit.Mvvm.Input; - -namespace PdfEditorApp.Plugins.Telemetry; - -/// -/// ViewModel for real-time document performance and environment telemetry HUD. -/// -public partial class DocumentTelemetryViewModel : ObservableObject -{ - private readonly IServiceProvider? _serviceProvider; - - [ObservableProperty] - private string _memoryAllocatedMb = "0.0 MB"; - - [ObservableProperty] - private int _garbageCollections; - - [ObservableProperty] - private string _architecture = System.Runtime.InteropServices.RuntimeInformation.ProcessArchitecture.ToString(); - - [ObservableProperty] - private string _osDescription = System.Runtime.InteropServices.RuntimeInformation.OSDescription; - - [ObservableProperty] - private string _status = "Optimal (60+ FPS)"; - - public DocumentTelemetryViewModel(IServiceProvider? serviceProvider = null) - { - _serviceProvider = serviceProvider; - RefreshMetrics(); - } - - [RelayCommand] - public void RefreshMetrics() - { - long bytes = GC.GetTotalMemory(forceFullCollection: false); - MemoryAllocatedMb = $"{(bytes / 1024.0 / 1024.0):F1} MB"; - GarbageCollections = GC.CollectionCount(0) + GC.CollectionCount(1) + GC.CollectionCount(2); - } - - [RelayCommand] - public void RunGCTrim() - { - GC.Collect(2, GCCollectionMode.Aggressive, blocking: true, compacting: true); - RefreshMetrics(); - } -} diff --git a/docs/examples/TelemetryPlugin/README.md b/docs/examples/TelemetryPlugin/README.md deleted file mode 100644 index f9187ce..0000000 --- a/docs/examples/TelemetryPlugin/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# Document Telemetry HUD Plugin (`frypdf.overlay.telemetry`) - -Live performance telemetry HUD showing managed heap allocation, GC cycles, and memory trimming in the `shell.overlay` slot. - -## Features -- **Managed Heap Monitoring**: Real-time memory allocation in MB. -- **Garbage Collection Counter**: Tracks GC gen0, gen1, gen2 cycles. -- **One-Click Heap Trimming**: Trigger memory compaction and collection. -- **Hardware Architecture**: Displays OS and processor information. - -## Building and Packaging -To build and create the `.fryplugin` distribution archive: -```bash -dotnet build -c Release -``` -This produces `bin/Release/net10.0/Telemetry.fryplugin`. diff --git a/docs/examples/TelemetryPlugin/TelemetryPlugin.csproj b/docs/examples/TelemetryPlugin/TelemetryPlugin.csproj deleted file mode 100644 index 1660053..0000000 --- a/docs/examples/TelemetryPlugin/TelemetryPlugin.csproj +++ /dev/null @@ -1,82 +0,0 @@ - - - net10.0 - enable - enable - 13 - true - TelemetryPlugin - PdfEditorApp.Plugins.Telemetry - 1.0.0 - FryPDF Core Engineering - Document Telemetry HUD shell overlay plugin for FryPDF - - - - - - - - false - runtime - - - false - runtime - - - - - - $(FRYPDF_HOME) - /Applications/FryPDF.app/Contents/MacOS - C:\Program Files\FryPDF - /opt/FryPDF - - - - - $(FryPdfInstallDir)\PdfEditorApp.Core.dll - false - - - $(FryPdfInstallDir)\PdfEditorApp.dll - false - - - - - - - - - - - - - - - - - - - $(TargetDir)staging\ - $(TargetDir)Telemetry.fryplugin - - - - - - - - - - - - - - - - - - diff --git a/docs/examples/TelemetryPlugin/plugin.json b/docs/examples/TelemetryPlugin/plugin.json deleted file mode 100644 index b6734af..0000000 --- a/docs/examples/TelemetryPlugin/plugin.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "id": "frypdf.overlay.telemetry", - "name": "Document Telemetry HUD", - "version": "1.0.0", - "author": "FryPDF Core Engineering", - "description": "Live performance telemetry HUD showing managed heap allocation, GC cycles, and memory trimming.", - "entryPoint": "TelemetryPlugin.dll", - "icon": "ChartTimelineVariant", - "dependencies": [] -} diff --git a/docs/examples/TicTacToePlugin/README.md b/docs/examples/TicTacToePlugin/README.md deleted file mode 100644 index 7db4d0a..0000000 --- a/docs/examples/TicTacToePlugin/README.md +++ /dev/null @@ -1,66 +0,0 @@ -# FryPDF Tic-Tac-Toe Plugin Example - -A complete, self-contained external plugin example for **FryPDF** implementing a playable, draggable **Tic-Tac-Toe** mini-game floating overlay. - ---- - -## Features - -- 🎮 **Floating Draggable Shell Overlay**: Mounted to `shell.overlay` with standard Material Design 3 chrome (pin, minimize, close, draggable header). -- 🤖 **Two Game Modes**: Single-Player vs Smart AI or pass-and-play Local 2-Player mode. -- 🏆 **Live Score Tracking**: Persistent counters for Player X wins, Player O wins, and Draws. -- 🎨 **Material Design 3 (M3) Expressive Styling**: Adheres to FryPDF's token system (`M3ShapeCornerFull`, `M3ShapeCornerLarge`, dynamic tonal brushes). -- ⌨️ **Command Palette Integration**: Trigger instantly via `Ctrl+Alt+T` / `⌘Alt+T`. -- 🕹️ **Footer Status Bar Widget**: Quick-toggle pill button (`🎮 Tic-Tac-Toe`) in the footer status bar. -- 🎗️ **Ribbon Action**: Quick launcher in the Ribbon's **View** tab. -- ⚙️ **Declarative Settings**: Auto-generated M3 settings schema for initial mode, AI difficulty, and sound effects. - ---- - -## Project Structure - -``` -TicTacToePlugin/ -├── TicTacToePlugin.csproj # .NET 10 project file with automated .fryplugin packager -├── plugin.json # Manifest with metadata, icon, and settings schema -├── TicTacToePlugin.cs # IFryPlugin implementation and capability registrations -├── TicTacToeViewModel.cs # Reactive MVVM game state, win detection & AI logic -├── TicTacToeView.axaml # Avalonia XAML Material Design 3 Expressive view -├── TicTacToeView.axaml.cs # Code-behind -└── README.md # This file -``` - ---- - -## Building and Packaging - -Run the following command in this directory: - -```bash -dotnet build -c Release -``` - -MSBuild will compile the plugin and automatically package it into: -``` -bin/Release/net10.0/TicTacToe.fryplugin -``` - ---- - -## Installing into FryPDF - -### Option 1: Drag-and-Drop (Recommended) -1. Open **FryPDF**. -2. Open the **Plugins Manager** (Click the Settings gear in the header $\to$ **Plugins & Extensions**, or press `Ctrl+Shift+P` / `⌘Shift+P`). -3. Drag and drop `TicTacToe.fryplugin` onto the dialog window. -4. The game mounts immediately without restarting! - -### Option 2: Command Palette -1. In FryPDF, press `Ctrl+K` or `⌘K` to open the **Command Palette**. -2. Type `Install Plugin Package...` and select `TicTacToe.fryplugin`. - -### Option 3: Manual Auto-Discovery Folder -Copy `TicTacToe.fryplugin` (or the folder containing `TicTacToePlugin.dll` and `plugin.json`) into your user plugins directory: -- **macOS**: `~/Library/Application Support/FryPdf/plugins/` -- **Windows**: `%APPDATA%\FryPdf\plugins\` -- **Linux**: `~/.config/FryPdf/plugins/` diff --git a/docs/examples/TicTacToePlugin/TicTacToePlugin.cs b/docs/examples/TicTacToePlugin/TicTacToePlugin.cs deleted file mode 100644 index f091395..0000000 --- a/docs/examples/TicTacToePlugin/TicTacToePlugin.cs +++ /dev/null @@ -1,155 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using CommunityToolkit.Mvvm.Input; -using PdfEditorApp.Core.Plugins; -using PdfEditorApp.Core.Plugins.Descriptors; -using PdfEditorApp.Core.Plugins.Manifests; -using PdfEditorApp.ViewModels; - -namespace FryPdf.Plugin.TicTacToe; - -/// -/// Modular plugin contributing an interactive, draggable Tic-Tac-Toe game targeting the 'shell.overlay' slot. -/// Demonstrates clean registration into Overlays, Command Palette, Ribbon, and Status Bar. -/// -public class TicTacToePlugin : IFryPlugin -{ - public string Id => "com.frypdf.plugin.tictactoe"; - public string Name => "Tic-Tac-Toe"; - public Version Version => new(1, 0, 0); - - public IReadOnlyList RequiredServices => Array.Empty(); - public IReadOnlyList ProvidedServices => Array.Empty(); - - public IReadOnlyDictionary? SettingsSchema => new Dictionary - { - ["DefaultMode"] = new() - { - Type = "select", - Label = "Default Game Mode", - Description = "Initial opponent mode on game launch", - DefaultValue = "PlayerVsAi", - Options = ["PlayerVsAi", "TwoPlayers"] - }, - ["AiDifficulty"] = new() - { - Type = "select", - Label = "AI Difficulty", - Description = "Tactical strategy level of computer player", - DefaultValue = "Smart", - Options = ["Smart", "Unbeatable", "Easy"] - }, - ["SoundEnabled"] = new() - { - Type = "boolean", - Label = "Sound Effects", - Description = "Enable sound alerts for moves and game over events", - DefaultValue = true - } - }; - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - // 1. Register Floating Shell Overlay with StandardCard chrome (Auto M3 titlebar, pin, minimize, close) - var overlayReg = ctx.RegisterOverlay(new OverlayDescriptor - { - Id = Id, - Title = "🎮 Tic-Tac-Toe", - Slot = "shell.overlay", - DefaultWidth = 330, - DefaultHeight = 440, - InitialX = null, - InitialY = 110, - IsDraggable = true, - IsMinimizable = true, - IsClosable = true, - IconKind = "GamepadVariantOutline", - ChromeMode = OverlayChromeMode.StandardCard, - ViewType = typeof(TicTacToeView), - ViewModelType = typeof(TicTacToeViewModel), - ViewFactory = _ => new TicTacToeView - { - DataContext = new TicTacToeViewModel() - }, - ViewModelFactory = _ => new TicTacToeViewModel() - }); - - // 2. Register Command in Command Palette (Ctrl+Alt+T / ⌘Alt+T) - var cmdReg = ctx.RegisterCommand(new CommandPaletteDescriptor - { - Id = "cmd.overlay.tictactoe", - Title = "Play Tic-Tac-Toe (Shell Overlay)", - Subtitle = "Launch floating Tic-Tac-Toe mini-game with local 2P & AI opponent", - Category = "Shell Overlays", - IconKind = "GamepadVariantOutline", - Shortcut = "Ctrl+Alt+T", - Order = 96, - Action = sp => - { - if (sp.GetService(typeof(IOverlayRegistry)) is IOverlayRegistry reg) - { - reg.ToggleOverlay(Id); - } - } - }); - - // 3. Register Footer Status Bar Widget (Clickable 🎮 Tic-Tac-Toe pill) - var statusReg = ctx.RegisterStatusBarWidget(new StatusBarWidgetDescriptor - { - WidgetId = "frypdf.status.tictactoe", - Alignment = StatusBarAlignment.Right, - Order = 16, - ToolTip = "Play Tic-Tac-Toe (Floating Shell Overlay)", - Factory = sp => - { - var reg = sp.GetService(typeof(IOverlayRegistry)) as IOverlayRegistry; - return new StatusBarWidgetViewModel - { - WidgetId = "frypdf.status.tictactoe", - Label = "🎮 Tic-Tac-Toe", - IconKind = "GamepadVariantOutline", - ToolTip = "Toggle floating Tic-Tac-Toe game", - IsActive = true, - Command = new RelayCommand(() => reg?.ToggleOverlay(Id)) - }; - } - }); - - // 4. Register Quick-Action Pill in the Ribbon's 'View' Tab - var ribbonReg = ctx.RegisterRibbonAction(new RibbonActionDescriptor - { - Id = "frypdf.ribbon.action.tictactoe", - TabId = "view", - GroupId = "plugins", - Label = "Tic-Tac-Toe", - Tooltip = "Open floating Tic-Tac-Toe game overlay", - IconKind = "GamepadVariantOutline", - Order = 54, - Action = sp => - { - if (sp.GetService(typeof(IOverlayRegistry)) is IOverlayRegistry reg) - { - reg.ToggleOverlay(Id); - } - } - }); - - // 5. Register Reversible Effects for 100% Clean Teardown - ctx.RegisterEffect(() => - { - overlayReg.Dispose(); - cmdReg.Dispose(); - statusReg.Dispose(); - ribbonReg.Dispose(); - - if (ctx.TryGetService(out var reg)) - { - reg.HideOverlay(Id); - } - }); - - return Task.CompletedTask; - } -} diff --git a/docs/examples/TicTacToePlugin/TicTacToePlugin.csproj b/docs/examples/TicTacToePlugin/TicTacToePlugin.csproj deleted file mode 100644 index 5c6edb2..0000000 --- a/docs/examples/TicTacToePlugin/TicTacToePlugin.csproj +++ /dev/null @@ -1,109 +0,0 @@ - - - net10.0 - enable - enable - 13 - true - TicTacToePlugin - FryPdf.Plugin.TicTacToe - 1.0.0 - Code Fry Dev - Playable Tic-Tac-Toe shell overlay plugin for FryPDF - - - - - - - - - false - runtime - - - false - runtime - - - - - - - - - $(FRYPDF_HOME) - /Applications/FryPDF.app/Contents/MacOS - C:\Program Files\FryPDF - /opt/FryPDF - - - - - - $(FryPdfInstallDir)\PdfEditorApp.Core.dll - false - - - $(FryPdfInstallDir)\PdfEditorApp.dll - false - - - - - - - - - - - - - - - - - - - - - $(TargetDir)staging\ - $(TargetDir)TicTacToe.fryplugin - - - - - - - - - - - - - - - - - - diff --git a/docs/examples/TicTacToePlugin/TicTacToeView.axaml b/docs/examples/TicTacToePlugin/TicTacToeView.axaml deleted file mode 100644 index 355635f..0000000 --- a/docs/examples/TicTacToePlugin/TicTacToeView.axaml +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/examples/TicTacToePlugin/TicTacToeView.axaml.cs b/docs/examples/TicTacToePlugin/TicTacToeView.axaml.cs deleted file mode 100644 index 9ea3ef2..0000000 --- a/docs/examples/TicTacToePlugin/TicTacToeView.axaml.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Avalonia.Controls; - -namespace FryPdf.Plugin.TicTacToe; - -public partial class TicTacToeView : UserControl -{ - public TicTacToeView() - { - InitializeComponent(); - } -} diff --git a/docs/examples/TicTacToePlugin/TicTacToeViewModel.cs b/docs/examples/TicTacToePlugin/TicTacToeViewModel.cs deleted file mode 100644 index 2f2f42c..0000000 --- a/docs/examples/TicTacToePlugin/TicTacToeViewModel.cs +++ /dev/null @@ -1,265 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Linq; -using CommunityToolkit.Mvvm.ComponentModel; -using CommunityToolkit.Mvvm.Input; - -namespace FryPdf.Plugin.TicTacToe; - -/// -/// Individual cell on the 3x3 Tic-Tac-Toe grid. -/// -public partial class TicTacToeCellViewModel : ObservableObject -{ - public int Index { get; } - - [ObservableProperty] - private string _value = ""; - - [ObservableProperty] - private bool _isWinningCell; - - [ObservableProperty] - private bool _isEnabled = true; - - public TicTacToeCellViewModel(int index) - { - Index = index; - } - - public void Reset() - { - Value = ""; - IsWinningCell = false; - IsEnabled = true; - } -} - -/// -/// Reactive ViewModel for the Tic-Tac-Toe mini-game. -/// Manages turn state, win detection, score tracking, and single-player AI heuristics. -/// -public partial class TicTacToeViewModel : ObservableObject -{ - private static readonly int[][] WinningLines = - [ - [0, 1, 2], [3, 4, 5], [6, 7, 8], // Rows - [0, 3, 6], [1, 4, 7], [2, 5, 8], // Columns - [0, 4, 8], [2, 4, 6] // Diagonals - ]; - - private readonly Random _random = new(); - - public ObservableCollection Cells { get; } = new(); - - [ObservableProperty] - private string _currentTurn = "X"; - - [ObservableProperty] - private string _statusMessage = "Player X's Turn (❌)"; - - [ObservableProperty] - private bool _isGameOver; - - [ObservableProperty] - private string _winner = ""; - - [ObservableProperty] - private bool _isAiMode = true; - - [ObservableProperty] - private int _xWins; - - [ObservableProperty] - private int _oWins; - - [ObservableProperty] - private int _draws; - - public TicTacToeViewModel() - { - for (int i = 0; i < 9; i++) - { - Cells.Add(new TicTacToeCellViewModel(i)); - } - - ResetGame(); - } - - [RelayCommand] - public void MakeMove(int index) - { - if (IsGameOver || index < 0 || index >= Cells.Count) return; - - var cell = Cells[index]; - if (!string.IsNullOrEmpty(cell.Value)) return; - - // Apply Player Move - cell.Value = CurrentTurn; - cell.IsEnabled = false; - - if (EvaluateBoard()) return; - - // Advance Turn - CurrentTurn = CurrentTurn == "X" ? "O" : "X"; - StatusMessage = CurrentTurn == "X" ? "Player X's Turn (❌)" : "Player O's Turn (⭕)"; - - // If Playing against AI and it's O's turn, calculate AI move - if (IsAiMode && CurrentTurn == "O" && !IsGameOver) - { - ExecuteAiTurn(); - } - } - - [RelayCommand] - public void ResetGame() - { - foreach (var cell in Cells) - { - cell.Reset(); - } - - CurrentTurn = "X"; - IsGameOver = false; - Winner = ""; - StatusMessage = "Player X's Turn (❌)"; - } - - [RelayCommand] - public void ResetScores() - { - XWins = 0; - OWins = 0; - Draws = 0; - ResetGame(); - } - - [RelayCommand] - public void ToggleAiMode() - { - IsAiMode = !IsAiMode; - ResetGame(); - } - - private void ExecuteAiTurn() - { - int move = FindBestMove("O", "X"); - if (move >= 0 && move < Cells.Count) - { - var cell = Cells[move]; - cell.Value = "O"; - cell.IsEnabled = false; - - if (EvaluateBoard()) return; - - CurrentTurn = "X"; - StatusMessage = "Player X's Turn (❌)"; - } - } - - private bool EvaluateBoard() - { - // 1. Check for a Winning Line - foreach (var line in WinningLines) - { - string a = Cells[line[0]].Value; - string b = Cells[line[1]].Value; - string c = Cells[line[2]].Value; - - if (!string.IsNullOrEmpty(a) && a == b && b == c) - { - IsGameOver = true; - Winner = a; - - // Highlight winning combination - Cells[line[0]].IsWinningCell = true; - Cells[line[1]].IsWinningCell = true; - Cells[line[2]].IsWinningCell = true; - - // Disable remaining empty cells - foreach (var cell in Cells.Where(c => string.IsNullOrEmpty(c.Value))) - { - cell.IsEnabled = false; - } - - if (a == "X") - { - XWins++; - StatusMessage = "🎉 Player X (❌) Wins!"; - } - else - { - OWins++; - StatusMessage = IsAiMode ? "🤖 Computer (⭕) Wins!" : "🎉 Player O (⭕) Wins!"; - } - - return true; - } - } - - // 2. Check for Draw - if (Cells.All(c => !string.IsNullOrEmpty(c.Value))) - { - IsGameOver = true; - Winner = "Draw"; - Draws++; - StatusMessage = "🤝 It's a Draw!"; - return true; - } - - return false; - } - - /// - /// Evaluates tactical moves: 1) Win if possible, 2) Block opponent win, 3) Take center, 4) Take corner, 5) Any open. - /// - private int FindBestMove(string ai, string opponent) - { - var available = Cells.Where(c => string.IsNullOrEmpty(c.Value)).Select(c => c.Index).ToList(); - if (available.Count == 0) return -1; - - // 1. Check if AI can win in one move - foreach (var idx in available) - { - if (SimulateMoveWins(idx, ai)) return idx; - } - - // 2. Block opponent winning move - foreach (var idx in available) - { - if (SimulateMoveWins(idx, opponent)) return idx; - } - - // 3. Take center cell (4) if free - if (available.Contains(4)) return 4; - - // 4. Take any corner (0, 2, 6, 8) - int[] corners = [0, 2, 6, 8]; - var openCorners = corners.Where(available.Contains).ToList(); - if (openCorners.Count > 0) - { - return openCorners[_random.Next(openCorners.Count)]; - } - - // 5. Pick random available cell - return available[_random.Next(available.Count)]; - } - - private bool SimulateMoveWins(int index, string mark) - { - foreach (var line in WinningLines) - { - if (!line.Contains(index)) continue; - - int other1 = line.First(i => i != index); - int other2 = line.Last(i => i != index); - - if (Cells[other1].Value == mark && Cells[other2].Value == mark) - { - return true; - } - } - return false; - } -} diff --git a/docs/examples/TicTacToePlugin/plugin.json b/docs/examples/TicTacToePlugin/plugin.json deleted file mode 100644 index 1cce40e..0000000 --- a/docs/examples/TicTacToePlugin/plugin.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "id": "com.frypdf.plugin.tictactoe", - "name": "Tic-Tac-Toe", - "version": "1.0.0", - "author": "Code Fry Dev", - "description": "Interactive floating Tic-Tac-Toe mini-game with local 2-Player mode and intelligent AI opponent.", - "entryPoint": "TicTacToePlugin.dll", - "icon": "GamepadVariantOutline", - "dependencies": [], - "settingsSchema": { - "DefaultMode": { - "type": "select", - "label": "Default Game Mode", - "description": "Choose between single player vs AI or pass-and-play two player mode", - "default": "PlayerVsAi", - "options": ["PlayerVsAi", "TwoPlayers"] - }, - "AiDifficulty": { - "type": "select", - "label": "AI Difficulty", - "description": "Strategy level used by the computer opponent", - "default": "Smart", - "options": ["Smart", "Unbeatable", "Easy"] - }, - "SoundEnabled": { - "type": "boolean", - "label": "Sound Effects", - "description": "Play subtle audio cues on move placements and victories", - "default": true - } - } -} diff --git a/packaging/macos/AppIcon.icns b/packaging/macos/AppIcon.icns deleted file mode 100644 index cf40f4ee5f11cbca5086cfbd9d4e7504e951b8b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 226652 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

e*JB1XIG}!esO5P%MZV*93WHpX0sa! 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
}4X4?+FF)raHTq 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

% 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

(2k4G*qz@3oxfj5wjX16er!TfR=>QC)Y#82 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 diff --git a/packaging/macos/AppIcon.iconset/icon_128x128.png b/packaging/macos/AppIcon.iconset/icon_128x128.png deleted file mode 100644 index 496af2ab7a0d94f0c4842999706fb75efc005dc1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5962 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 ZDu7)QFbI;!e;zrBuBMSjt(pV+e*k|nP1^tf diff --git a/packaging/macos/AppIcon.iconset/icon_128x128@2x.png b/packaging/macos/AppIcon.iconset/icon_128x128@2x.png deleted file mode 100644 index 6394c697f2382962578167c3e60d18f2348830e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14257 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 diff --git a/packaging/macos/AppIcon.iconset/icon_256x256.png b/packaging/macos/AppIcon.iconset/icon_256x256.png deleted file mode 100644 index 6394c697f2382962578167c3e60d18f2348830e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14257 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 vO2a;?^lHgk*f#kR_7+M0@5G|2nf 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 diff --git a/packaging/macos/AppIcon.iconset/icon_32x32.png b/packaging/macos/AppIcon.iconset/icon_32x32.png deleted file mode 100644 index ea2769d61fc6d6b9b12831828b3848b1fd83d5b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1118 zcmV-k1flzhP)PuAXOOjo#uy5~j#{AzA!g&W;5H}!g+8yQY(1Eon(ex^sqxWDq}DTNxaXl* z2&3*t9{zw3BKrIL>A=8%u9>+phK!D$+b%?W&1?Xdrshs`_V%W%9ZRBC0@TiD$HuxV z_JlDePCD|1Fj@+Y`8hX#qO-HpkytAow3?t;if!mjB~2@aF^0#n-zN&+*}r!Cm|JbDPd;Bxp4P_7GIdyND$sA>nx(lrlsjhKPg>Us)G~FD(2nw{B_a z`Q)`Xk7cvjdbhj^35ps~3I!OYSjy*d^s`|s7YYdc6sVsL$oC`Ai}R3L!Q;%0 zl*g@oEku#lbPfLwOWPO&rL{E*r4+^|r*Y^&AB>;E9nm6+pMHqor8gjNYlhJpgwjM# zawLQ$U}3$t*!#pDEG-vtd2Rv0L*2M#_hW8dh60B1b&EzKb~nQAPe9y(`*>&=ZCjer z(S8@YI@@vj%y}FcI_W$&Hq$kLCVr6;#Ik(y-~DJ1LnlYvdP`FyvZu~s@Qbfq*oBm! ze}#Wt@WkE|0?sJnSmOPIeR%Gb0eqP~jir16lhc>+`Qf)w3%F}UHMS6Ihf@<4D+CV`xPb@AdSu7yS6!EmY~&jH?nN2HUf+>DGaRs~(nd0TX*C#G_dhzr($-xEi<3DBhKKu0K^+q?D0RS~OlN+=})>5qW kahoNgH~lB&Ch#xf51`UMK*_wll>h($07*qoM6N<$g0M;yj{pDw diff --git a/packaging/macos/AppIcon.iconset/icon_32x32@2x.png b/packaging/macos/AppIcon.iconset/icon_32x32@2x.png deleted file mode 100644 index b8893da389a64b78231d2b96b51fc8dc4fa3c14d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2568 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 e1r&h)d;ACTIx3ozV7WH{00007+M0@5G|2nf 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 diff --git a/packaging/macos/AppIcon.iconset/icon_512x512@2x.png b/packaging/macos/AppIcon.iconset/icon_512x512@2x.png deleted file mode 100644 index 3cf0bc4a43af71de66f5e76a7a4f1631b2038f1c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51518 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 diff --git a/packaging/macos/Info.plist.template b/packaging/macos/Info.plist.template deleted file mode 100644 index 6866a48..0000000 --- a/packaging/macos/Info.plist.template +++ /dev/null @@ -1,62 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - PdfEditorApp - CFBundleIconFile - AppIcon.icns - CFBundleIdentifier - in.codefrydev.frypdf - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - FryPDF - CFBundleDisplayName - FryPDF - CFBundlePackageType - APPL - CFBundleShortVersionString - __VERSION__ - CFBundleVersion - __VERSION__ - LSMinimumSystemVersion - 10.15 - NSHighResolutionCapable - - LSApplicationCategoryType - public.app-category.productivity - NSHumanReadableCopyright - Copyright © 2026 CodeFryDev. All rights reserved. - CFBundleDocumentTypes - - - CFBundleTypeName - FryPDF Project - CFBundleTypeRole - Editor - CFBundleTypeExtensions - - frypdf - pdfproj - - LSHandlerRank - Owner - - - CFBundleTypeName - PDF Document - CFBundleTypeRole - Viewer - CFBundleTypeExtensions - - pdf - - LSHandlerRank - Alternate - - - - diff --git a/packaging/windows/app.ico b/packaging/windows/app.ico deleted file mode 100644 index 9c72c356ad8a297640b160b6ac62d5329c60e9aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27089 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 EAEcF;EC2ui diff --git a/packaging/windows/installer.iss b/packaging/windows/installer.iss deleted file mode 100644 index 4604481..0000000 --- a/packaging/windows/installer.iss +++ /dev/null @@ -1,81 +0,0 @@ -; Inno Setup 6 Script for FryPDF by CodeFryDev -#ifndef MyAppVersion -#define MyAppVersion "1.0.0" -#endif - -#ifndef MyPublishDir -#define MyPublishDir "..\..\publish\win-x64" -#endif - -#define MyAppName "FryPDF" -#define MyAppPublisher "CodeFryDev" -#define MyAppURL "https://codefrydev.in" -#define MyAppSupportURL "mailto:codefrydev@gmail.com" -#define MyAppExeName "PdfEditorApp.exe" - -[Setup] -; Basic Application Info -AppId={{D37E88A1-1B2F-4A92-875D-876E842109AB} -AppName={#MyAppName} -AppVersion={#MyAppVersion} -AppVerName={#MyAppName} {#MyAppVersion} -AppPublisher={#MyAppPublisher} -AppPublisherURL={#MyAppURL} -AppSupportURL={#MyAppSupportURL} -AppUpdatesURL={#MyAppURL} - -; Destination Directories -DefaultDirName={autopf}\{#MyAppName} -DefaultGroupName={#MyAppName} -DisableProgramGroupPage=yes - -; Output Configuration -OutputDir=. -OutputBaseFilename=FryPDF-Setup-{#MyAppVersion} -SetupIconFile=app.ico -UninstallDisplayIcon={app}\{#MyAppExeName} - -; Compression & Modern Wizard Style -Compression=lzma2/ultra64 -SolidCompression=yes -WizardStyle=modern -ArchitecturesInstallIn64BitMode=x64compatible -PrivilegesRequired=lowest -PrivilegesRequiredOverridesAllowed=dialog - -; File Associations -ChangesAssociations=yes - -[Languages] -Name: "english"; MessagesFile: "compiler:Default.isl" - -[Tasks] -Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked -Name: "fileassoc_proj"; Description: "Associate with FryPDF project files (.frypdf)"; GroupDescription: "File Associations:" -Name: "fileassoc_pdf"; Description: "Associate with Adobe / standard PDF documents (.pdf)"; GroupDescription: "File Associations:"; Flags: unchecked - -[Files] -Source: "{#MyPublishDir}\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs - -[Icons] -Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}" -Name: "{group}\Uninstall {#MyAppName}"; Filename: "{uninstallexe}" -Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon - -[Registry] -; .frypdf Association -Root: HKA; Subkey: "Software\Classes\.frypdf"; ValueType: string; ValueName: ""; ValueData: "FryPDF.Project"; Flags: uninsdeletevalue; Tasks: fileassoc_proj -; Legacy .pdfproj Association -Root: HKA; Subkey: "Software\Classes\.pdfproj"; ValueType: string; ValueName: ""; ValueData: "FryPDF.Project"; Flags: uninsdeletevalue; Tasks: fileassoc_proj -Root: HKA; Subkey: "Software\Classes\FryPDF.Project"; ValueType: string; ValueName: ""; ValueData: "FryPDF Project File"; Flags: uninsdeletekey; Tasks: fileassoc_proj -Root: HKA; Subkey: "Software\Classes\FryPDF.Project\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\{#MyAppExeName},0"; Flags: uninsdeletekey; Tasks: fileassoc_proj -Root: HKA; Subkey: "Software\Classes\FryPDF.Project\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#MyAppExeName}"" ""%1"""; Flags: uninsdeletekey; Tasks: fileassoc_proj - -; .pdf Association (optional) -Root: HKA; Subkey: "Software\Classes\.pdf\OpenWithProgids"; ValueType: string; ValueName: "FryPDF.Document"; ValueData: ""; Flags: uninsdeletevalue; Tasks: fileassoc_pdf -Root: HKA; Subkey: "Software\Classes\FryPDF.Document"; ValueType: string; ValueName: ""; ValueData: "PDF Document"; Flags: uninsdeletekey; Tasks: fileassoc_pdf -Root: HKA; Subkey: "Software\Classes\FryPDF.Document\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\{#MyAppExeName},0"; Flags: uninsdeletekey; Tasks: fileassoc_pdf -Root: HKA; Subkey: "Software\Classes\FryPDF.Document\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#MyAppExeName}"" ""%1"""; Flags: uninsdeletekey; Tasks: fileassoc_pdf - -[Run] -Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent diff --git a/packaging/windows/msix/AppxManifest.xml.template b/packaging/windows/msix/AppxManifest.xml.template deleted file mode 100644 index 46c3881..0000000 --- a/packaging/windows/msix/AppxManifest.xml.template +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - - FryPDF - Code Fry Dev - Assets\StoreLogo.png - FryPDF is a privacy-first, professional desktop PDF editor and creator by Code Fry Dev. - - - - - - - - - - - - - - - - - - - - - - - - - - FryPDF Project - Assets\Square44x44Logo.png - - .frypdf - .pdfproj - - - - - - PDF Document - Assets\Square44x44Logo.png - - .pdf - - - - - - - - - - - diff --git a/packaging/windows/msix/Assets/SplashScreen.png b/packaging/windows/msix/Assets/SplashScreen.png deleted file mode 100644 index 4e87f14591180ec65e6623ef150898dbcda40c59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8477 zcmeHs`6HC=+y0HH$0U`lC!|f7kjnBzLZOW8GlQ`!V;w3xS&N_xHWCT*q~u$9Z1QO^t60@So%d06@Utj;=WX zaC-p&m;50<@J+b%S|0$M{$Zf20}pz?G8X*a*5$+6`Wn7&&`(|b{DI>GFHh*U7Jofi z?gWYd;&Oni==71q(gnn&FS3)|P}%t}B1fIH9{@VD(xVq;Wlw9!ez_28b^b2{nT1sb zu`_Hh!=is7(V)<{+CuRA=D-`caliHAu36Eg23H7bq~<0U05sZ^peH~}fPoi{phc6{ zxWxe=a_$glBam^f7@QH5_}_v5Lh^q~21Df?KA@J>?0lJ5CriLG%Y#NxBB}1^1GOf{ zh5!;R==y5(3(VR_ z?R{#E-FS-kdC4nw;(ZZEc~00d`Fk6}S2wFCN9LgROVy&xb%s)eaWV@{t35GK8?^6z z-nth*{&?CSiU9^Lf>t>_qa|^Ya+#YK!*d>0E%S+c6+Ss4AI_*)>=6CM9*I|RZ_?Fd zextI#6(n}27YQ){lGXuLAYsqyKol`6K}yR^@cOn4M%jrp;^Tz5rSea49nG!k%GXNN z$O!YBZ$z(w%;RV}pJUzdg9vx77eW3V5?6dOE|{F0OVd{SQCtpvu6r}AJ;ihO1;+1p zS46g4`dxpKRyLI@vb(A1aAfS${=x{x5sl?ZC`Q~_$nD(muX*f{6wl?oTF)4**mrcYYkAcrWGcvvNUXj7SrxzrE zzc~Odtu5%|c}Fh$nPlUFTanVD-r%;aGqF*wTJ=x63vOc~7_i2L_$=FPe-e-gJRGiQ z3736~?ZEbBD&Q*`=2b&6JIk6oFTzx9<;oJ!58`LtsbBqF=i`X(r+ACK!PT{@M|+wG z1gvb3NW2SkCg;IG%0;3n1$vmfS?Hm(g+axz=ZIw?e9Sdu$8hzXGk&?#X|B{a5&b}1 zf)NhOR0Wn!mna_OX>>bjZU(u9g&}4PMOf;ocMCP&m|r;-I*2PBEx{6q<;=N@al9ff zuOCXkxg4YOPw~HdX`T1hsxUzl+F$R(!ou2BLT3*T7Odn6{h>^krMze%$|h3;7#9#x z1;SYtz8x6|ri)=47TT8gW^vWS!qoA~PL{4KoSIm>cBZe5o|~b} zG&s@26MrNE!c8ob?w_dmhG2AZwqjuC<-HPnZXGE8m~9{&sg_eL9HTVy=yx2fpHQui zdVBZtm@BlOFjewyf1B>mH;~qyIMM~LH|;xTa)UTF``8qOa(%moQ&H%GOB{IHgRe|x z&5Q-x^mLmz%cBQNvqYo`e$ecNH?8DN7FFBrW2p+(6b}#R$N}hwpkBarPrd|#-LS3o zjFKO=IK=8|3F==4dK1qcq}CHE? zewl({6+gmt*fSaiT&Sq5n8reND~&UNa%3Z4qd2oIjaMdKdAg@oLvzHl<<3SbFNA*yu7f;i)Q!8}azSO`DY)vG!_&HgY?X z^N}1OvvD#~zxzCY)&lbGQ*nZ6VI}ze!v2yA-R4!K-u*eVv@7nlHv+d<%Hg9{{(b@T z?=C&Qr8X9xl$cskF}tdM+wOy;_o;HWY?q44t$@ICxAjs|%`-p74F`XtcWbKr{zDTL z`?r;T@B$=JkWJ$+4$+RKtA_NlNp&`NU>A1qXYxH25=ZI!ycW!Rw74Ci&;FC^_fVPFe z;VXqt+eBd=o(6Iyu{u16!BqLal|Zemh=y&L=Kc>~SibqFt0vbGQ8;(yWgaKAsR)SlbrF{t!nbhymC;Ayq$bC?@{pNsYfxTam{f(CEcDU zc_a1z1iXf8eX}+f5q;yy!K`}(1n#v#M}%h-g~R+nnGz);{WncI2gd}jQ`Q{VzDDm# zUx`bzzusc?+(viNOK0jrwo_C3G#}PNJilu|`dIyM5c}<)U~3VTP3C7jP8s!uABP0f zaMO!j*taBIBYZ$6=wb&L6zRgua3`c4RfJ3aaQ~c+jijeK4K`@e)j&FDygvcM<#>!T zwbU&Sc8oP6#=I+66cubs;W%6Sq`evIy~*V+PcO@YzQNpGNQA{Yg@atJZilCGN}VlK zEf&@fj*4d1V~&!JnRGH|Vjz2unZw2kLtr+1V=3k}+^} zY4$z&$+}+*amG%rRQK9ywMnaFXeGo`6>!>8wV5xO*u8tHcB7hI8f@p+EWlXKmFoSt zvzmW(&b!E3a5Uc~a9@ADWQQPy=Zj;eFPe@0> zYqMU=QF@AiwlA0jl=YOaD8q5(F6L{ehDg$=|D zl3?jPA_%4J?DGt^-#2fYFtv?Y<8c- zrG_nZ-@(o%xcq~?3B~F~(Usc0a`2G8x1qElwJTXIQbd~cRXRt3x^`W8fjlr6rsYaE_{JW$)?5mnXGYa7Ffm%G)ja!I!gZs+g7sS6)h1 zFlW;jhdc7;6Dq{2B21Q7d!D&s@Kvp0dV#hNGgLFHUyW!T9UyU1{dK8Jm}|E_Xzk-* zCYrNpy3=p+@ASJ}4j!~7Cx2Nsu~9jL624)-^r=O+0vOP`(8){hiy6P@G(>k^xs{wx zfHM<%waC=Y>t?JQ8)6k*eCHo?+GRYpRC~+DYAt?^UGxbs!nNGcqQ7-VD5uM-WtcwN zk;IOACpy2mVE7gOYaBLnwMMO`)s3x|U&Bk6_#f7!ibhX)S}A%UQ|vgZHs|;A4Lf_P3c}6jY&S9)GxJxOpQ)GhvORw?vbtY($yN@R$DT&BkUk;2 zk?1oZGW=rE9@&^m$=^$e^2?GKcG6};;l%h(G2}iII`p@U1f|ux{jRx&+(GAyLO!g%mw=vv;Jt}1wZvb?WR!OTXSF9W%@ zRNfX^9H|;TAqEWafx0zB%{05Tfu}0C6ZyLewN3CLo_ufWpz7hWWesr-Ah*}A2QyuK zt9PZ+m}CKG0c1vgIZTOAG`M3$+7eSMoxWwc*ls3+TP|V z4FUNum3NX36Su5*=<@#wxXhiTG}(j1F2Cdskzb!O_fnwEui>&D@tBG}e5SgGRc~Zv zlz>xVL|PTDT76`!zP+fysO$QA+0;FCxOJtKMS&L_;-&i68hsk0(5)-qa=!{li@RV3 z7&-MrM{=N6h#8%|-bH4q!E~#~Qbz%SOtrHUH-Y=85*sd|mdA;z|Hz;mIS_6miNP7Z zvp+U?6;@U(=URmN$NKS~KR;vyw0C&0lz&;(6nIFV%rk9p0NnUMxqhMervh4h<&1=;xub0HWog-=!=uA=d3QCnjqiIF5KEe zYVL0LR?lyUkFs-dkE*iiNO`PExL3jcG{eS^m3aygdOMwrCOoPy%srB}wCeOFubQ@) zHuh#Lz0L&W3;HbhhcwyZVPT1f%}=!JhMQipNIoNd2{Mb@Ns?LhE_L1xuC6tm`{O45 zo02S9?A_`veP2Anl9X{Y)*FZ#k&1;$3svu}9{h#djL1t&3>f^D+AgAuVO&@p?cT7u z6>%h#8XRa6;B&d+vn);p=l~I;|KLxL$$4k~yfUsir}TGET-RrAvC8_8HW|Ch#kDTE zjDIht-d!B(tmbyk@0;IWus0N%648U0(6W(v|1hHspNF!!a#ADUMMlspuja;FLH~F+B|#?9 z!ZkEKWQWS$X=+}y8z%-qaTH1?`>YkJbW&0>cqqL3$5KI6xaSkgYsK%}29FR#aOQG< zz=jV3%Hm*!XQAixCHmFdI~U$kV%xBBs9JgA!+WSPR}we6pLS1h#N?jFh<}e|eQrZT z-JK8j)Kyy8c~yUTw}3uteGGPW@n-Te*%TL`kPx;f5UsP5TTMh~Em+Wnd&rz};T z69nZ+_f%lA+roxD%U=BhJk&ED)gw3fmNA&wJ0)#M^Rq50p9nDAV`0S>r+n*+8O7+q zZ=cCYw$54A`o6M&l&KTXWK0OQgD*VRsqMnFY57YFTmfOVQ&lV@hmP#eeNYzpCR(dKO`uCs=`3iJ3vVjY5aa`|GyMn9<+IuUTQ++R>MIqE9R<3F`TzNC3D2>VTgOJ+t}y zheYCsv!YHDG7!hT_e?`E*sB$ZZWsl#z}?B2qUgd6Waf?YA)0=UTsi`gU4PmH;{D}O zwA;Ck=v;$ON=Tb|P1Mh^9+dEKj*8w&5}SMT$)KX$wY)#*ft}CB&?ir@5Hw{&l(&Md z{e-=bkQA3RzQgl#T<=e#LeR(mA}4gF?Qg6yu!aB~%Wc2;mS&w89U>vFPIsg?cyM|5 zJv*k0q2z{%0BiUD%xH~Hi%C7>i%Y0&ELh_Qa=}W{(a*~NqNv3JxqqgR|YuGa(7+9|uLn7Xs4DoqJ~gK~kyM2V7sJF&?w59Z@Qfi0Et6 zW7$o=Q8jO04Lx$52RI=I+IWsQaQI&r>njZZ=O==O5u$9@G3 zBV54pBp^akKGDR~6o1^|bmZ;71*3r-V?jp3LvEtHN=+ct`iV=QL@a1l$jYFoXx%FW zRh70hvCU!GNda|5H_V%5TTepIa7j!w97_3TVAj!d>0fVhpmm?Ewbt#k_$=~RnCkLU z0(V;7T4KDMTT-Iuzjl{i!7H~htg(Ce1AD{33t2F$zjFQVT4@pd*_ofZ*Cw%UAYGoG zd-}uQ?-b7kHa9~Xwn@>+qWIFYFZA>(=m|Fkc0#e^bEeXPBbGYQl_tyI3tAT=Hv8lJ zlPudU6-{5>h2h^4eCjAub%BIm^LugriDpZw4*r=XEO}Cl=2{`=*_;9P5!qQRah$~$ z$w$8`8Yv|oiG{(!A0(RBtmY2AE8$0th?E5~7FQ^b&{4)S=J2|cwg%L}s`tl7zL_uP zhStQ{l0u_VH<-M%jF7~)owBr%df2xiW1X|OUtCfat-O}9Vf0o+2O7)ZC`ktn+3Dmr z+g);V_u1+NBF_|pyoXuIRzn%3LV^hYVP{^QyX&bV#Ld!lxLuj{x={gfcd%7t;&E(g zN=DJfRg=Q$^c1;oTlnfpg+MP(1t$d-5oUWYJcQWeD`>vX8JpUg^RCw)Htezh>mS1A z!9fBu?<%626KH;>Xi7-XeYoHVQVIP6;$QOD8;`JVRr<%{z_fg;RCgx1?Z|MF4t4$)D=h+~C zdGbVF0Hw;$J4#1inuqTC_Nie$rbBP+-X2sVJ!q#bayl)A@1~KGO)@Dz0;J4lunkpR zVyoL&^P1%u`#{?u7v-VTuS~bv;t?ysuJo*bLpT*WhE`a^IHRFE3wueXFJbt1F#OLE z8(cEd{lvWsfMXe0cW!@*DSYQyZ@WKyPIyZZ3(a;;_nIAt80zr~sXhuDh+~a@XXm(h zaY|1iGC0KOx+8wAsG-tX3t~O?RBbC_&Z~i3Zfdt(e%z+Z++(h8^h@{Rh>z_2iQFC` zK|Jf*^q40k!TW%FSR@ai{P&+c(_|Wjpn0vBrMH~()-o%9q;2Zik~FGBs}8$sc_yh1*#* z|Gqk6$LyH3q5iZCp6;I?1t!n@Ij3_-i4$ln0fnG52)jm>25Ppa5Vc-M$|{8w*UTn{ z3o46UvfJ}_-5P#{G#6lSJ=21PyFYT{5;6;$J~SY|tEuTD)YCtaZ3BFZhUd*R!m&bg zNa&)*nxCbeZ!5X|x`*dx9ak3DpYT;Mkg9b@8rNCUGxghSo?mlpJ_l0~hGc%?#4G(q-083!X zalCJB`WMkdD)^AUD1mex+f(f6{hW^SQAB-I2tDA*<=)U-xcTDMNx?n6I`*{(($oz9j z82Q~jDCEe`!(1103 zRSVZxseB`CEH8>^nQnS-9PG1JLO^~2p3J)oF3eD$Iw?rOv1 z#L$2(pU`AKCmy6#nLCi^~oqTU~quzWYOXvpzx%l@!GJ>!9rdd%v zJI+3nLl~))Q`Yml}TkCN>#CmyA{ zs*-xbj76@`YJOG&n_A_5_b3=d^=aK5*jqgth@MZ>R^aall t0Ca(a0B{{7%YO&{3(5bA3@<14wcO!qS#edxl^~}813hD1%1y`U{|DHNogV-I diff --git a/packaging/windows/msix/Assets/Square150x150Logo.png b/packaging/windows/msix/Assets/Square150x150Logo.png deleted file mode 100644 index e722bfc9901527e20acfb702f85ed050df45540a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7449 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 i|A&1TdOi3L6)CY@>?7dO4@T#bx*`2PV2PgWHG diff --git a/packaging/windows/msix/Assets/Square310x310Logo.png b/packaging/windows/msix/Assets/Square310x310Logo.png deleted file mode 100644 index 47ee948d69b926ae9d6a44900892105ead6f037b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18264 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 z 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 Ang9R* diff --git a/packaging/windows/msix/Assets/Square44x44Logo.targetsize-256_altform-unplated.png b/packaging/windows/msix/Assets/Square44x44Logo.targetsize-256_altform-unplated.png deleted file mode 100644 index 6394c697f2382962578167c3e60d18f2348830e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14257 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 diff --git a/packaging/windows/msix/Assets/Square71x71Logo.png b/packaging/windows/msix/Assets/Square71x71Logo.png deleted file mode 100644 index 81aaeab693ff54e3b883e564332fef44158c2a36..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2914 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 diff --git a/packaging/windows/msix/Assets/Wide310x150Logo.png b/packaging/windows/msix/Assets/Wide310x150Logo.png deleted file mode 100644 index 029b14c29c0bdfc87e308d38e75f4dbd368da3a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3495 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 eEbpG5%8g2pwz$$7 -/// Headless SkiaSharp LiveCharts2 rendering engine for high-resolution chart export in QuestPDF and preview rasterization. -/// -public static class LiveChartsRenderer -{ - private static bool _isConfigured; - private static readonly object _configLock = new(); - - public static void EnsureConfigured() - { - if (_isConfigured) return; - lock (_configLock) - { - if (!_isConfigured) - { - LiveCharts.Configure(config => LiveChartsSkiaSharp.UseDefaults(config)); - _isConfigured = true; - } - } - } - - public static IReadOnlyList GetPaletteHexColors(ChartPalette palette) - { - return palette switch - { - ChartPalette.CorporateBlue => new[] { "#0F6CBD", "#3D95E6", "#82BDF0", "#C7E0F4", "#0B4A82", "#115EA3" }, - ChartPalette.EmeraldGreen => new[] { "#107C41", "#27A25D", "#57C488", "#97E3B5", "#0E5E32", "#188A4C" }, - ChartPalette.SunsetOrange => new[] { "#D83B01", "#F7630C", "#FF8C00", "#FCE100", "#A80000", "#EA4300" }, - ChartPalette.CyberNeon => new[] { "#8764B8", "#B146C2", "#00B7C3", "#00CC6A", "#E3008C", "#FFB900" }, - ChartPalette.ExecutiveSlate => new[] { "#323130", "#605E5C", "#8A8886", "#B3B0AD", "#201F1E", "#484644" }, - ChartPalette.PastelHarmony => new[] { "#7986CB", "#4DB6AC", "#FFD54F", "#BA68C8", "#FF8A65", "#A1887F" }, - ChartPalette.VibrantRainbow => new[] { "#E63946", "#F4A261", "#E9C46A", "#2A9D8F", "#264653", "#457B9D" }, - _ => new[] { "#0F6CBD", "#3D95E6", "#82BDF0", "#C7E0F4", "#0B4A82" } - }; - } - - public static SKColor ParseColor(string? hex, SKColor fallback) - { - if (string.IsNullOrWhiteSpace(hex)) return fallback; - return SKColor.TryParse(hex, out var color) ? color : fallback; - } - - public static byte[] RenderChartToPngBytes(PdfChartElement chartEl, int width = 500, int height = 300, float dpiScale = 2.0f) - { - EnsureConfigured(); - - int targetWidth = Math.Max(200, (int)(width * dpiScale)); - int targetHeight = Math.Max(150, (int)(height * dpiScale)); - - var palette = GetPaletteHexColors(chartEl.Palette); - var legendPos = ToLiveChartsLegend(chartEl.LegendPosition); - - using SKImage? img = chartEl.ChartType switch - { - ChartType.DonutPie or ChartType.GaugeProgress => RenderPieChart(chartEl, targetWidth, targetHeight, palette, legendPos, dpiScale), - ChartType.Radar or ChartType.PolarArea => RenderPolarChart(chartEl, targetWidth, targetHeight, palette, legendPos, dpiScale), - _ => RenderCartesianChart(chartEl, targetWidth, targetHeight, palette, legendPos, dpiScale) - }; - - if (img == null) - return Array.Empty(); - - using var data = img.Encode(SKEncodedImageFormat.Png, 100); - return data.ToArray(); - } - - private static LegendPosition ToLiveChartsLegend(ChartLegendPosition pos) - { - return pos switch - { - ChartLegendPosition.Top => LegendPosition.Top, - ChartLegendPosition.Bottom => LegendPosition.Bottom, - ChartLegendPosition.Left => LegendPosition.Left, - ChartLegendPosition.Right => LegendPosition.Right, - _ => LegendPosition.Hidden - }; - } - - private static SKImage RenderCartesianChart(PdfChartElement chartEl, int width, int height, IReadOnlyList palette, LegendPosition legendPos, float dpiScale) - { - var seriesList = new List(); - var categories = chartEl.Categories.Count > 0 ? chartEl.Categories : new List { "A", "B", "C", "D" }; - - var primaryValues = chartEl.Values.Count > 0 ? chartEl.Values : new List { 10, 20, 30, 40 }; - - bool hasMultiSeries = chartEl.MultiSeries.Count > 0; - - switch (chartEl.ChartType) - { - case ChartType.HorizontalBar: - { - if (hasMultiSeries) - { - for (int sIdx = 0; sIdx < chartEl.MultiSeries.Count; sIdx++) - { - var s = chartEl.MultiSeries[sIdx]; - var color = ParseColor(s.ColorHex ?? palette[sIdx % palette.Count], SKColors.RoyalBlue); - seriesList.Add(new RowSeries - { - Name = s.Name, - Values = s.Values.Count > 0 ? s.Values : primaryValues, - Fill = new SolidColorPaint(color), - Stroke = null, - DataLabelsSize = 10 * dpiScale, - DataLabelsPaint = chartEl.ShowDataLabels ? new SolidColorPaint(SKColors.DarkSlateGray) : null - }); - } - } - else - { - var color = ParseColor(chartEl.BarColorsHex.FirstOrDefault() ?? palette[0], SKColors.RoyalBlue); - seriesList.Add(new RowSeries - { - Name = chartEl.Title, - Values = primaryValues, - Fill = new SolidColorPaint(color), - Stroke = null, - DataLabelsSize = 10 * dpiScale, - DataLabelsPaint = chartEl.ShowDataLabels ? new SolidColorPaint(SKColors.DarkSlateGray) : null - }); - } - break; - } - - case ChartType.StackedBar: - { - if (hasMultiSeries) - { - for (int sIdx = 0; sIdx < chartEl.MultiSeries.Count; sIdx++) - { - var s = chartEl.MultiSeries[sIdx]; - var color = ParseColor(s.ColorHex ?? palette[sIdx % palette.Count], SKColors.RoyalBlue); - seriesList.Add(new StackedColumnSeries - { - Name = s.Name, - Values = s.Values.Count > 0 ? s.Values : primaryValues, - Fill = new SolidColorPaint(color), - Stroke = null - }); - } - } - else - { - for (int i = 0; i < primaryValues.Count; i++) - { - var color = ParseColor(i < chartEl.BarColorsHex.Count ? chartEl.BarColorsHex[i] : palette[i % palette.Count], SKColors.RoyalBlue); - seriesList.Add(new StackedColumnSeries - { - Name = i < categories.Count ? categories[i] : $"Segment {i + 1}", - Values = new double[] { primaryValues[i] }, - Fill = new SolidColorPaint(color), - Stroke = null - }); - } - } - break; - } - - case ChartType.StackedHorizontalBar: - { - if (hasMultiSeries) - { - for (int sIdx = 0; sIdx < chartEl.MultiSeries.Count; sIdx++) - { - var s = chartEl.MultiSeries[sIdx]; - var color = ParseColor(s.ColorHex ?? palette[sIdx % palette.Count], SKColors.RoyalBlue); - seriesList.Add(new StackedRowSeries - { - Name = s.Name, - Values = s.Values.Count > 0 ? s.Values : primaryValues, - Fill = new SolidColorPaint(color), - Stroke = null - }); - } - } - else - { - var color = ParseColor(chartEl.BarColorsHex.FirstOrDefault() ?? palette[0], SKColors.RoyalBlue); - seriesList.Add(new StackedRowSeries - { - Name = chartEl.Title, - Values = primaryValues, - Fill = new SolidColorPaint(color), - Stroke = null - }); - } - break; - } - - case ChartType.Line: - { - if (hasMultiSeries) - { - for (int sIdx = 0; sIdx < chartEl.MultiSeries.Count; sIdx++) - { - var s = chartEl.MultiSeries[sIdx]; - var color = ParseColor(s.ColorHex ?? palette[sIdx % palette.Count], SKColors.RoyalBlue); - seriesList.Add(new LineSeries - { - Name = s.Name, - Values = s.Values.Count > 0 ? s.Values : primaryValues, - Stroke = new SolidColorPaint(color, (float)chartEl.StrokeThickness * dpiScale), - Fill = null, - GeometrySize = 6 * dpiScale, - GeometryStroke = new SolidColorPaint(color, 2 * dpiScale), - GeometryFill = new SolidColorPaint(SKColors.White), - LineSmoothness = 0.0 - }); - } - } - else - { - var color = ParseColor(chartEl.BarColorsHex.FirstOrDefault() ?? palette[0], SKColors.RoyalBlue); - seriesList.Add(new LineSeries - { - Name = chartEl.Title, - Values = primaryValues, - Stroke = new SolidColorPaint(color, (float)chartEl.StrokeThickness * dpiScale), - Fill = null, - GeometrySize = 6 * dpiScale, - GeometryStroke = new SolidColorPaint(color, 2 * dpiScale), - GeometryFill = new SolidColorPaint(SKColors.White), - LineSmoothness = 0.0 - }); - } - break; - } - - case ChartType.SmoothLine: - { - var color = ParseColor(chartEl.BarColorsHex.FirstOrDefault() ?? palette[0], SKColors.RoyalBlue); - seriesList.Add(new LineSeries - { - Name = chartEl.Title, - Values = primaryValues, - Stroke = new SolidColorPaint(color, (float)chartEl.StrokeThickness * dpiScale), - Fill = null, - GeometrySize = 7 * dpiScale, - GeometryStroke = new SolidColorPaint(color, 2 * dpiScale), - GeometryFill = new SolidColorPaint(SKColors.White), - LineSmoothness = (float)chartEl.CurveSmoothness - }); - break; - } - - case ChartType.Area: - { - var color = ParseColor(chartEl.BarColorsHex.FirstOrDefault() ?? palette[0], SKColors.RoyalBlue); - var fillColor = color.WithAlpha(65); - seriesList.Add(new LineSeries - { - Name = chartEl.Title, - Values = primaryValues, - Stroke = new SolidColorPaint(color, (float)chartEl.StrokeThickness * dpiScale), - Fill = new SolidColorPaint(fillColor), - GeometrySize = 6 * dpiScale, - GeometryStroke = new SolidColorPaint(color, 2 * dpiScale), - GeometryFill = new SolidColorPaint(SKColors.White), - LineSmoothness = (float)chartEl.CurveSmoothness - }); - break; - } - - case ChartType.StepLine: - { - var color = ParseColor(chartEl.BarColorsHex.FirstOrDefault() ?? palette[0], SKColors.RoyalBlue); - seriesList.Add(new StepLineSeries - { - Name = chartEl.Title, - Values = primaryValues, - Stroke = new SolidColorPaint(color, (float)chartEl.StrokeThickness * dpiScale), - Fill = null, - GeometrySize = 6 * dpiScale, - GeometryStroke = new SolidColorPaint(color, 2 * dpiScale), - GeometryFill = new SolidColorPaint(SKColors.White) - }); - break; - } - - case ChartType.ScatterPlot: - { - var color = ParseColor(chartEl.BarColorsHex.FirstOrDefault() ?? palette[0], SKColors.RoyalBlue); - var points = new List(); - for (int i = 0; i < primaryValues.Count; i++) - { - points.Add(new ObservablePoint(i + 1, primaryValues[i])); - } - seriesList.Add(new ScatterSeries - { - Name = chartEl.Title, - Values = points, - Stroke = new SolidColorPaint(color, 2 * dpiScale), - Fill = new SolidColorPaint(color.WithAlpha(180)), - GeometrySize = 10 * dpiScale - }); - break; - } - - case ChartType.Candlestick: - { - var financialPoints = new List(); - for (int i = 0; i < primaryValues.Count; i++) - { - double close = primaryValues[i]; - double open = i > 0 ? primaryValues[i - 1] : close * 0.95; - double high = Math.Max(open, close) * 1.08; - double low = Math.Min(open, close) * 0.92; - financialPoints.Add(new FinancialPoint(new DateTime(2026, 1, 1).AddDays(i), high, open, close, low)); - } - seriesList.Add(new CandlesticksSeries - { - Name = chartEl.Title, - Values = financialPoints, - UpStroke = new SolidColorPaint(SKColors.ForestGreen, 2 * dpiScale), - UpFill = new SolidColorPaint(SKColors.ForestGreen.WithAlpha(200)), - DownStroke = new SolidColorPaint(SKColors.IndianRed, 2 * dpiScale), - DownFill = new SolidColorPaint(SKColors.IndianRed.WithAlpha(200)) - }); - break; - } - - case ChartType.Waterfall: - case ChartType.Funnel: - case ChartType.Pyramid: - case ChartType.BarColumn: - default: - { - if (hasMultiSeries) - { - for (int sIdx = 0; sIdx < chartEl.MultiSeries.Count; sIdx++) - { - var s = chartEl.MultiSeries[sIdx]; - var color = ParseColor(s.ColorHex ?? palette[sIdx % palette.Count], SKColors.RoyalBlue); - seriesList.Add(new ColumnSeries - { - Name = s.Name, - Values = s.Values.Count > 0 ? s.Values : primaryValues, - Fill = new SolidColorPaint(color), - Stroke = null, - Rx = 4 * dpiScale, - Ry = 4 * dpiScale, - DataLabelsSize = 9 * dpiScale, - DataLabelsPaint = chartEl.ShowDataLabels ? new SolidColorPaint(SKColors.DarkSlateGray) : null - }); - } - } - else - { - var color = ParseColor(chartEl.BarColorsHex.FirstOrDefault() ?? palette[0], SKColors.RoyalBlue); - seriesList.Add(new ColumnSeries - { - Name = chartEl.Title, - Values = primaryValues, - Fill = new SolidColorPaint(color), - Stroke = null, - Rx = 4 * dpiScale, - Ry = 4 * dpiScale, - DataLabelsSize = 9 * dpiScale, - DataLabelsPaint = chartEl.ShowDataLabels ? new SolidColorPaint(SKColors.DarkSlateGray) : null - }); - } - break; - } - } - - var xAxes = new Axis[] - { - new Axis - { - Labels = categories.ToArray(), - Name = chartEl.XAxisTitle, - LabelsPaint = new SolidColorPaint(SKColors.DarkSlateGray), - TextSize = 10.5f * dpiScale, - NameTextSize = 11.5f * dpiScale, - SeparatorsPaint = chartEl.ShowGridlines ? new SolidColorPaint(SKColors.LightGray.WithAlpha(110)) { StrokeThickness = 1 * dpiScale } : null - } - }; - - var yAxes = new Axis[] - { - new Axis - { - Name = chartEl.YAxisTitle, - LabelsPaint = new SolidColorPaint(SKColors.DarkSlateGray), - TextSize = 10.5f * dpiScale, - NameTextSize = 11.5f * dpiScale, - SeparatorsPaint = chartEl.ShowGridlines ? new SolidColorPaint(SKColors.LightGray.WithAlpha(110)) { StrokeThickness = 1 * dpiScale } : null - } - }; - -#pragma warning disable CS0618 - var titlePaint = !string.IsNullOrWhiteSpace(chartEl.Title) - ? new LabelVisual - { - Text = chartEl.Title, - TextSize = 13.5f * dpiScale, - Paint = new SolidColorPaint(SKColors.Black) - } - : null; -#pragma warning restore CS0618 - - var chart = new SKCartesianChart - { - Width = width, - Height = height, - Series = seriesList, - XAxes = xAxes, - YAxes = yAxes, - Title = titlePaint, - LegendPosition = legendPos, - LegendTextSize = 10.5f * dpiScale, - LegendTextPaint = new SolidColorPaint(SKColors.DarkSlateGray) - }; - - return chart.GetImage(); - } - - private static SKImage RenderPieChart(PdfChartElement chartEl, int width, int height, IReadOnlyList palette, LegendPosition legendPos, float dpiScale) - { - var seriesList = new List(); - var categories = chartEl.Categories.Count > 0 ? chartEl.Categories : new List { "Q1", "Q2", "Q3", "Q4" }; - var values = chartEl.Values.Count > 0 ? chartEl.Values : new List { 25, 25, 25, 25 }; - - double innerRadius = chartEl.ChartType == ChartType.DonutPie ? Math.Max(0.1, chartEl.DonutHoleRatio) : 0.0; - double maxAngle = chartEl.ChartType == ChartType.GaugeProgress ? 180 : 360; - double initialRotation = chartEl.ChartType == ChartType.GaugeProgress ? -180 : -90; - - for (int i = 0; i < values.Count; i++) - { - var color = ParseColor(i < chartEl.BarColorsHex.Count ? chartEl.BarColorsHex[i] : palette[i % palette.Count], SKColors.RoyalBlue); - string name = i < categories.Count ? categories[i] : $"Segment {i + 1}"; - string valLabel = i < chartEl.ValueLabels.Count && !string.IsNullOrEmpty(chartEl.ValueLabels[i]) - ? chartEl.ValueLabels[i] - : values[i].ToString("G"); - - seriesList.Add(new PieSeries - { - Name = $"{name} ({valLabel})", - Values = new double[] { values[i] }, - Fill = new SolidColorPaint(color), - Stroke = new SolidColorPaint(SKColors.White, 2 * dpiScale), - InnerRadius = innerRadius, - DataLabelsSize = 10 * dpiScale, - DataLabelsPaint = chartEl.ShowDataLabels ? new SolidColorPaint(SKColors.White) : null - }); - } - -#pragma warning disable CS0618 - var titlePaint = !string.IsNullOrWhiteSpace(chartEl.Title) - ? new LabelVisual - { - Text = chartEl.Title, - TextSize = 13.5f * dpiScale, - Paint = new SolidColorPaint(SKColors.Black) - } - : null; -#pragma warning restore CS0618 - - var chart = new SKPieChart - { - Width = width, - Height = height, - Series = seriesList, - Title = titlePaint, - LegendPosition = legendPos, - LegendTextSize = 10.5f * dpiScale, - LegendTextPaint = new SolidColorPaint(SKColors.DarkSlateGray), - MaxAngle = maxAngle, - InitialRotation = initialRotation - }; - - return chart.GetImage(); - } - - private static SKImage RenderPolarChart(PdfChartElement chartEl, int width, int height, IReadOnlyList palette, LegendPosition legendPos, float dpiScale) - { - var seriesList = new List(); - var categories = chartEl.Categories.Count > 0 ? chartEl.Categories : new List { "Speed", "Reliability", "Comfort", "Safety", "Efficiency" }; - var values = chartEl.Values.Count > 0 ? chartEl.Values : new List { 8, 9, 7, 10, 8.5 }; - - var color = ParseColor(chartEl.BarColorsHex.FirstOrDefault() ?? palette[0], SKColors.RoyalBlue); - bool isArea = chartEl.ChartType == ChartType.PolarArea; - - seriesList.Add(new PolarLineSeries - { - Name = chartEl.Title, - Values = values, - Stroke = new SolidColorPaint(color, (float)chartEl.StrokeThickness * dpiScale), - Fill = isArea ? new SolidColorPaint(color.WithAlpha(90)) : null, - GeometrySize = 7 * dpiScale, - GeometryStroke = new SolidColorPaint(color, 2 * dpiScale), - GeometryFill = new SolidColorPaint(SKColors.White), - IsClosed = true - }); - - var angleAxes = new PolarAxis[] - { - new PolarAxis - { - Labels = categories.ToArray(), - LabelsPaint = new SolidColorPaint(SKColors.DarkSlateGray), - TextSize = 10 * dpiScale, - SeparatorsPaint = chartEl.ShowGridlines ? new SolidColorPaint(SKColors.LightGray.WithAlpha(120)) { StrokeThickness = 1 * dpiScale } : null - } - }; - - var radiusAxes = new PolarAxis[] - { - new PolarAxis - { - LabelsPaint = new SolidColorPaint(SKColors.Gray), - TextSize = 9 * dpiScale, - SeparatorsPaint = chartEl.ShowGridlines ? new SolidColorPaint(SKColors.LightGray.WithAlpha(100)) { StrokeThickness = 1 * dpiScale } : null - } - }; - -#pragma warning disable CS0618 - var titlePaint = !string.IsNullOrWhiteSpace(chartEl.Title) - ? new LabelVisual - { - Text = chartEl.Title, - TextSize = 13.5f * dpiScale, - Paint = new SolidColorPaint(SKColors.Black) - } - : null; -#pragma warning restore CS0618 - - var chart = new SKPolarChart - { - Width = width, - Height = height, - Series = seriesList, - AngleAxes = angleAxes, - RadiusAxes = radiusAxes, - Title = titlePaint, - LegendPosition = legendPos, - LegendTextSize = 10.5f * dpiScale, - LegendTextPaint = new SolidColorPaint(SKColors.DarkSlateGray) - }; - - return chart.GetImage(); - } -} diff --git a/src/PdfEditorApp.Core/Analysis/PdfLayoutAnalyzer.cs b/src/PdfEditorApp.Core/Analysis/PdfLayoutAnalyzer.cs deleted file mode 100644 index 4057978..0000000 --- a/src/PdfEditorApp.Core/Analysis/PdfLayoutAnalyzer.cs +++ /dev/null @@ -1,1120 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; -using UglyToad.PdfPig.Content; -using PdfEditorApp.Core.Deconstruction.Utils; - -namespace PdfEditorApp.Core.Analysis; - -///

-/// Represents a structured text line extracted from a PDF page with accurate font and geometry metrics. -/// -public class ExtractedPdfLine -{ - public List Words { get; } = new(); - public List Spans { get; set; } = new(); - public double Left { get; set; } - public double Right { get; set; } - public double Top { get; set; } - public double Bottom { get; set; } - public double BaselineY { get; set; } - public string Text { get; set; } = string.Empty; - public double FontSize { get; set; } = 11.0; - public string FontFamily { get; set; } = "Arial"; - public bool IsBold { get; set; } - public bool IsItalic { get; set; } - public string ColorHex { get; set; } = "#0F172A"; - - public double Rotation { get; set; } = 0.0; - public double Width => Math.Max(1, Right - Left); - public double Height => Math.Max(1, Top - Bottom); - public double MidY => (Top + Bottom) / 2.0; -} - -/// -/// Represents a coherent, editable multi-line paragraph block or single-line header -/// grouped using intelligent proximity and typographic analysis (similar to Adobe Acrobat / PDFelement). -/// -public class ExtractedPdfParagraph -{ - public List Lines { get; } = new(); - public List Spans { get; set; } = new(); - public double Left { get; set; } - public double Right { get; set; } - public double Top { get; set; } - public double Bottom { get; set; } - public string Text { get; set; } = string.Empty; - public double FontSize { get; set; } = 11.0; - public string FontFamily { get; set; } = "Arial"; - public bool IsBold { get; set; } - public bool IsItalic { get; set; } - public string ColorHex { get; set; } = "#0F172A"; - public double LineHeight { get; set; } = 1.2; - public bool IsHeading { get; set; } - public bool IsBulletOrList { get; set; } - public double Rotation { get; set; } = 0.0; - public TextAlignmentMode Alignment { get; set; } = TextAlignmentMode.Left; - - public double CanvasX { get; set; } - public double CanvasY { get; set; } - public double CanvasWidth { get; set; } - public double CanvasHeight { get; set; } -} - -/// -/// High-precision layout analyzer for PDF documents. -/// Deconstructs raw glyphs and words into structured lines, paragraphs, headings, and column flows. -/// -public static class PdfLayoutAnalyzer -{ - /// - /// Analyzes words on a PDF page and reconstructs structured, editable paragraph blocks. - /// Supports multi-orientation text (horizontal, 90° and 270° vertical marginalia). - /// - /// The PDF page to analyze. - /// Page height in PDF points (for coordinate flip). - /// Multiplier to widen column gap threshold (1.5 for landscape/ID cards). - public static List AnalyzeAndGroupPageText(Page page, double pageHeight, double columnGapMultiplier = 1.0) - { - var rawWords = page.GetWords() - .Where(w => !string.IsNullOrWhiteSpace(w.Text)) - .ToList(); - - if (rawWords.Count == 0) - { - return new List(); - } - - // Clean null characters and non-printable noise from words - var words = CleanWords(rawWords); - if (words.Count == 0) return new List(); - - var allParagraphs = new List(); - - // Partition words by dominant orientation - var horizontalWords = new List(); - var rotate270Words = new List(); - var rotate90Words = new List(); - var rotate180Words = new List(); - - foreach (var w in words) - { - var firstLetter = w.Letters.FirstOrDefault(); - var orient = firstLetter?.TextOrientation ?? TextOrientation.Horizontal; - - switch (orient) - { - case TextOrientation.Rotate270: - rotate270Words.Add(w); - break; - case TextOrientation.Rotate90: - rotate90Words.Add(w); - break; - case TextOrientation.Rotate180: - rotate180Words.Add(w); - break; - default: - horizontalWords.Add(w); - break; - } - } - - // 1. Process standard Horizontal text - if (horizontalWords.Count > 0) - { - var hLines = ExtractLinesFromWords(horizontalWords, columnGapMultiplier); - var hParas = ClusterLinesIntoParagraphs(hLines, pageHeight); - allParagraphs.AddRange(hParas); - } - - // 2. Process Rotate270 vertical text (e.g. bottom-to-top or top-to-bottom marginalia) - if (rotate270Words.Count > 0) - { - var v270Paras = ExtractVerticalParagraphs(rotate270Words, pageHeight, 270.0); - allParagraphs.AddRange(v270Paras); - } - - // 3. Process Rotate90 vertical text - if (rotate90Words.Count > 0) - { - var v90Paras = ExtractVerticalParagraphs(rotate90Words, pageHeight, 90.0); - allParagraphs.AddRange(v90Paras); - } - - // 4. Process Rotate180 text - if (rotate180Words.Count > 0) - { - var v180Paras = ExtractVerticalParagraphs(rotate180Words, pageHeight, 180.0); - allParagraphs.AddRange(v180Paras); - } - - return allParagraphs; - } - - private static List CleanWords(List rawWords) - { - var cleaned = new List(); - foreach (var w in rawWords) - { - if (string.IsNullOrWhiteSpace(w.Text)) continue; - - // Strip null chars and control codes - string txt = w.Text.Replace("\0", "").Trim(); - if (string.IsNullOrWhiteSpace(txt)) continue; - - cleaned.Add(w); - } - return cleaned; - } - - private static List ExtractVerticalParagraphs(List words, double pageHeight, double rotationAngle) - { - var paragraphs = new List(); - if (words == null || words.Count == 0) return paragraphs; - - // Group words by vertical column baseline (matching X coordinate). - // For Rotate270 text each glyph is a single character stacked bottom-to-top, - // so we use a narrow X-band threshold to bucket same-column glyphs together. - var colBuckets = new List>(); - var sortedByX = words.OrderBy(w => w.BoundingBox.Left).ToList(); - - foreach (var word in sortedByX) - { - double wordLeft = word.BoundingBox.Left; - double wordRight = word.BoundingBox.Right; - double wordMidX = (wordLeft + wordRight) / 2.0; - - List? matchingCol = null; - double bestDist = double.MaxValue; - - foreach (var col in colBuckets) - { - double colMidX = (col.Min(w => w.BoundingBox.Left) + col.Max(w => w.BoundingBox.Right)) / 2.0; - double dist = Math.Abs(wordMidX - colMidX); - // Use a tight 12pt X-band tolerance so left/right card text is never merged - if (dist <= 12.0 && dist < bestDist) - { - bestDist = dist; - matchingCol = col; - } - } - - if (matchingCol != null) - { - matchingCol.Add(word); - } - else - { - colBuckets.Add(new List { word }); - } - } - - foreach (var col in colBuckets) - { - // For Rotate270: PDF text matrix is rotated 270°, meaning each glyph's Y-axis - // points leftward. Reading order runs bottom→top in PDF coordinates. - // For Rotate90: reading order runs top→bottom in PDF coordinates. - // - // IMPORTANT: PdfPig may return inverted BoundingBox.Bottom/Top for rotated glyphs - // (Bottom > Top is possible). Use GeoMinY/GeoMaxY helpers for reliable geometric bounds. - static double GeoMinY(Word w) => Math.Min(w.BoundingBox.Bottom, w.BoundingBox.Top); - static double GeoMaxY(Word w) => Math.Max(w.BoundingBox.Bottom, w.BoundingBox.Top); - - // Sort by geometric minimum Y (bottom of glyph on page). For Rotate270 text, - // glyphs with the smallest Y value are at the visual bottom of the card. - var orderedWords = rotationAngle is 270.0 or 90.0 - ? col.OrderBy(GeoMinY).ToList() - : col.OrderByDescending(GeoMinY).ToList(); - - if (orderedWords.Count == 0) continue; - - var firstLetter = orderedWords[0].Letters.FirstOrDefault(); - double fontSize = firstLetter != null ? Math.Max(6.0, firstLetter.PointSize) : 10.0; - - // For Rotate270/90 text, gaps are computed geometrically (GeoMinY(cur) - GeoMaxY(prev)). - // Adjacent glyphs within the same word overlap slightly (gap ≈ 0 to -0.5pt). - // A word-space character produces a gap of approximately fontSize * 0.15 to 0.25. - // Use a threshold just above 0 to catch spaces without false-positives within a word. - double spaceThreshold = Math.Max(fontSize * 0.2, 0.8); - - var sb = new StringBuilder(); - for (int i = 0; i < orderedWords.Count; i++) - { - var cur = orderedWords[i]; - string txt = cur.Text.Replace("\0", "").Trim(); - if (string.IsNullOrWhiteSpace(txt)) continue; - - if (i > 0 && sb.Length > 0) - { - var prev = orderedWords[i - 1]; - // Gap between the geometric top of prev glyph and geometric bottom of cur glyph. - // Using geometric bounds ensures correctness for inverted PdfPig Rotate270 boxes. - double prevGeoMaxY = GeoMaxY(prev); - double curGeoMinY = GeoMinY(cur); - double verticalGap = curGeoMinY - prevGeoMaxY; - - // Add a space whenever the geometric gap between successive glyphs exceeds - // the word-space threshold. With correct geometric bounds: - // - Adjacent glyphs within the same word: gap ≤ 0 (overlap or touching) - // - Word-space boundary: gap ≈ fontSize * 0.15-0.25 (positive gap) - // The threshold of fontSize*0.2 (≥0.8pt) cleanly separates these cases. - if (verticalGap >= spaceThreshold) - { - sb.Append(' '); - } - } - sb.Append(txt); - } - - string fullText = UnicodeScriptDetector.NormalizeExtractedText(sb.ToString().Trim()); - if (string.IsNullOrWhiteSpace(fullText)) continue; - string fontFamily = firstLetter != null ? NormalizeFontFamily(firstLetter.FontName) : "Open Sans"; - string colorHex = PdfColorHelper.ToHex(firstLetter?.Color, null, "#0F172A"); - - double minLeft = orderedWords.Min(w => w.BoundingBox.Left); - double maxRight = orderedWords.Max(w => w.BoundingBox.Right); - // Use geometric bounds: span all geometric Y extents of glyphs in the column. - double geoMaxY = orderedWords.Max(GeoMaxY); - double geoMinY = orderedWords.Min(GeoMinY); - - // In PDF space for Rotate270/90 text: - // pdfSpanLength = full Y-axis span of the glyph column → TEXT LENGTH (how long the text run is) - // pdfSpanThick = X-axis width of the glyph column → FONT THICKNESS (cap height in points) - double pdfSpanLength = geoMaxY - geoMinY; - double pdfSpanThick = maxRight - minLeft; - - // Unrotated element dimensions: - // Width = text run length (how long the string is when rendered horizontally) - // Height = line height / font cap-height - // Add generous padding so glyphs don't clip at the bounding box edge. - double unrotatedW = Math.Max(30.0, pdfSpanLength + 12.0); - double unrotatedH = Math.Max(14.0, Math.Max(pdfSpanThick * 2.2, fontSize * 1.6)); - - // Center of the glyph cluster in PDF coordinates → Canvas coordinates. - // Use geometric center Y of the column. - double centerPdfX = (minLeft + maxRight) / 2.0; - double centerPdfY = (geoMaxY + geoMinY) / 2.0; - double centerCanvasX = centerPdfX; - double centerCanvasY = pageHeight - centerPdfY; - - // ── Rotation-aware placement ──────────────────────────────────────────────── - // Avalonia's RotateTransform pivots around the element's own center (RenderTransformOrigin=50%,50%). - // After a 90° or 270° rotation the element's visual footprint swaps Width↔Height: - // Visual width = unrotatedH (the thin font-height dimension) - // Visual height = unrotatedW (the long text-run dimension) - // - // Canvas.Left/Top (top-left of the UNROTATED box) must satisfy: - // pivot_X = canvasX + unrotatedW/2 → canvasX = centerCanvasX - unrotatedW/2 - // pivot_Y = canvasY + unrotatedH/2 → canvasY = centerCanvasY - unrotatedH/2 - // - // This places the rotation pivot exactly at (centerCanvasX, centerCanvasY), - // so the rotated text visually appears centred over the original PDF glyph cluster. - double canvasX = Math.Max(0, centerCanvasX - (unrotatedW / 2.0)); - double canvasY = Math.Max(0, centerCanvasY - (unrotatedH / 2.0)); - - paragraphs.Add(new ExtractedPdfParagraph - { - Left = minLeft, - Right = maxRight, - Top = geoMaxY, - Bottom = geoMinY, - Text = fullText, - FontSize = Math.Round(fontSize, 1), - FontFamily = fontFamily, - ColorHex = colorHex, - Rotation = rotationAngle, - CanvasX = Math.Round(canvasX, 1), - CanvasY = Math.Round(canvasY, 1), - CanvasWidth = Math.Round(unrotatedW, 1), - CanvasHeight = Math.Round(unrotatedH, 1) - }); - } - - return paragraphs; - } - - /// - /// Computes accurate geometric and typographic bounds for a word. - /// Replaces collapsed bounding boxes (e.g. Type3 fonts, OCR lines, or glyphs with zero height) - /// with proper font ascender/descender bounds relative to the actual baseline. - /// - public static (double Left, double Right, double Top, double Bottom, double BaselineY, double Height) GetWordEffectiveBounds(Word word) - { - var firstLetter = word.Letters.FirstOrDefault(); - double ptSize = firstLetter != null && firstLetter.PointSize > 0 ? firstLetter.PointSize : Math.Max(word.BoundingBox.Height, 10.0); - - double bboxH = word.BoundingBox.Height; - double rawBottom = word.BoundingBox.Bottom; - double rawTop = word.BoundingBox.Top; - double rawLeft = word.BoundingBox.Left; - double rawRight = word.BoundingBox.Right; - - // Baseline: prefer StartBaseLine.Y if non-zero, otherwise rawBottom - double baselineY = rawBottom; - if (firstLetter != null && Math.Abs(firstLetter.StartBaseLine.Y) > 0.001) - { - baselineY = firstLetter.StartBaseLine.Y; - } - - // If the bounding box height is collapsed or abnormally small (< 60% of point size) - // (common in Type3 fonts, OCR text overlays, or stripped font metrics): - if (bboxH < ptSize * 0.60 || (firstLetter != null && string.Equals(firstLetter.FontName, "Type3", StringComparison.OrdinalIgnoreCase))) - { - double ascent = ptSize * 0.78; - double descent = ptSize * 0.22; - double effTop = baselineY + ascent; - double effBottom = baselineY - descent; - return (rawLeft, rawRight, effTop, effBottom, baselineY, ptSize); - } - - return (rawLeft, rawRight, rawTop, rawBottom, baselineY, Math.Max(ptSize * 0.8, bboxH)); - } - - private class LineBucket - { - public List Words { get; } = new(); - public double BaselineY { get; set; } - public double Top { get; set; } - public double Bottom { get; set; } - } - - /// - /// Groups words into horizontal lines respecting baseline alignment, reading order, and column bounds. - /// - /// Words extracted from a PDF page. - /// Adjusts column gap sensitivity (>1 = more aggressive column splitting). - public static List ExtractLinesFromWords(List words, double columnGapMultiplier = 1.0) - { - var resultLines = new List(); - if (words == null || words.Count == 0) return resultLines; - - // Step 1: Bucket words into baseline lines - var buckets = new List(); - - // Sort roughly by vertical baseline position descending - var sortedByY = words - .OrderByDescending(w => GetWordEffectiveBounds(w).BaselineY) - .ToList(); - - foreach (var word in sortedByY) - { - var (wLeft, wRight, wTop, wBottom, wBase, wHeight) = GetWordEffectiveBounds(word); - double wordMidY = (wTop + wBottom) / 2.0; - - // For scripts with tall ascenders (Devanagari, Arabic, CJK), use a tighter midY-only match - // so characters in different rows are never bucketed together. - double threshold = Math.Max(3.0, wHeight * 0.40); - - // Find matching bucket - LineBucket? matchingBucket = null; - double bestDist = double.MaxValue; - - foreach (var b in buckets) - { - double bucketMidY = (b.Top + b.Bottom) / 2.0; - double dist = Math.Abs(wordMidY - bucketMidY); - double baseDist = Math.Abs(wBase - b.BaselineY); - - if (dist <= threshold || baseDist <= threshold) - { - if (dist < bestDist) - { - bestDist = dist; - matchingBucket = b; - } - } - } - - if (matchingBucket != null) - { - matchingBucket.Words.Add(word); - matchingBucket.Top = Math.Max(matchingBucket.Top, wTop); - matchingBucket.Bottom = Math.Min(matchingBucket.Bottom, wBottom); - matchingBucket.BaselineY = (matchingBucket.BaselineY * (matchingBucket.Words.Count - 1) + wBase) / matchingBucket.Words.Count; - } - else - { - var newBucket = new LineBucket - { - BaselineY = wBase, - Top = wTop, - Bottom = wBottom - }; - newBucket.Words.Add(word); - buckets.Add(newBucket); - } - } - - // Step 2: For each bucket, sort words left-to-right and split on column gaps - foreach (var bucket in buckets) - { - var orderedWords = bucket.Words.OrderBy(w => w.BoundingBox.Left).ToList(); - if (orderedWords.Count == 0) continue; - - var currentSegment = new List(); - - foreach (var word in orderedWords) - { - if (currentSegment.Count == 0) - { - currentSegment.Add(word); - continue; - } - - double prevRight = currentSegment.Max(w => GetWordEffectiveBounds(w).Right); - double gap = GetWordEffectiveBounds(word).Left - prevRight; - var wordBounds = GetWordEffectiveBounds(word); - double wordHeight = Math.Max(6.0, wordBounds.Height); - - // Column / element gap threshold: in typography, gaps > 25pt or > 1.1x font size represent separate columns/badges. - double baseGap = Math.Max(16.0, Math.Min(30.0, wordHeight * 1.1)); - double maxColGap = baseGap * Math.Max(0.5, columnGapMultiplier); - - if (gap > maxColGap) - { - // Split segment - var line = BuildLine(currentSegment); - if (line != null) resultLines.Add(line); - - currentSegment = new List { word }; - } - else - { - currentSegment.Add(word); - } - } - - if (currentSegment.Count > 0) - { - var line = BuildLine(currentSegment); - if (line != null) resultLines.Add(line); - } - } - - // Sort all lines in natural reading order: top-to-bottom, left-to-right - return resultLines - .OrderByDescending(l => l.Top) - .ThenBy(l => l.Left) - .ToList(); - } - - private static ExtractedPdfLine? BuildLine(List words) - { - if (words == null || words.Count == 0) return null; - - var ordered = words.OrderBy(w => GetWordEffectiveBounds(w).Left).ToList(); - var sb = new StringBuilder(); - - double minLeft = ordered.Min(w => GetWordEffectiveBounds(w).Left); - double maxRight = ordered.Max(w => GetWordEffectiveBounds(w).Right); - double maxTop = ordered.Max(w => GetWordEffectiveBounds(w).Top); - double minBottom = ordered.Min(w => GetWordEffectiveBounds(w).Bottom); - double avgBaseline = ordered.Average(w => GetWordEffectiveBounds(w).BaselineY); - - for (int i = 0; i < ordered.Count; i++) - { - if (i > 0) - { - var prev = ordered[i - 1]; - var cur = ordered[i]; - double gap = GetWordEffectiveBounds(cur).Left - GetWordEffectiveBounds(prev).Right; - double ptSize = cur.Letters.FirstOrDefault()?.PointSize ?? 10.0; - double spaceThreshold = Math.Max(1.6, ptSize * 0.18); - - bool isComplexScript = UnicodeScriptDetector.ContainsDevanagari(cur.Text) || - UnicodeScriptDetector.ContainsDevanagari(prev.Text) || - UnicodeScriptDetector.ContainsCjk(cur.Text) || - UnicodeScriptDetector.IsRtlText(cur.Text); - - if (isComplexScript) - { - // For complex scripts with split glyphs/matras, only space if gap is genuine word spacing - if (gap >= spaceThreshold) - { - sb.Append(' '); - } - } - else - { - sb.Append(' '); - } - } - sb.Append(ordered[i].Text); - } - - string text = sb.ToString().Trim(); - if (string.IsNullOrWhiteSpace(text)) return null; - - // Sample dominant font characteristics from words - var firstWord = ordered[0]; - var firstLetter = firstWord.Letters.FirstOrDefault(); - - double fontSize = 11.0; - string fontFamily = "Open Sans"; - bool isBold = false; - bool isItalic = false; - string colorHex = "#0F172A"; - - if (firstLetter != null) - { - fontSize = Math.Max(6.0, firstLetter.PointSize); - fontFamily = NormalizeFontFamily(firstLetter.FontName); - - // Unicode Script Detection: When font name normalization falls back to a generic - // Latin font (Open Sans) but the actual text contains non-Latin codepoints, use - // UnicodeScriptDetector to pick the correct world-script font from our library. - // This handles CJK, Arabic, Hebrew, Devanagari, Thai, etc. from ANY PDF source. - if (fontFamily == "Open Sans" && !string.IsNullOrEmpty(text)) - { - string detectedFont = UnicodeScriptDetector.DetectScriptFontFamily(text); - if (detectedFont != "Open Sans") - { - fontFamily = detectedFont; - } - } - - if (!string.IsNullOrEmpty(firstLetter.FontName)) - { - string fn = firstLetter.FontName.ToLowerInvariant(); - isBold = fn.Contains("bold") || fn.Contains("black") || fn.Contains("heavy") || fn.Contains("semibold") || fn.Contains("extrabold"); - isItalic = fn.Contains("italic") || fn.Contains("oblique"); - - // Type3 Identification sequence formatting (12-digit ID numbers) - if (fn.Contains("type3") && text.Length >= 12 && text.Count(char.IsDigit) >= 10) - { - isBold = true; - } - } - - colorHex = PdfColorHelper.ToHex(firstLetter.Color, null, colorHex); - } - - var rawLineSpans = new List(); - for (int i = 0; i < ordered.Count; i++) - { - var w = ordered[i]; - var let = w.Letters.FirstOrDefault(); - double wSize = let != null ? Math.Max(6.0, let.PointSize) : fontSize; - string wFam = let != null ? NormalizeFontFamily(let.FontName) : fontFamily; - bool wBold = false; - bool wItalic = false; - string wCol = colorHex; - - if (let != null && !string.IsNullOrEmpty(let.FontName)) - { - string fn = let.FontName.ToLowerInvariant(); - wBold = fn.Contains("bold") || fn.Contains("black") || fn.Contains("heavy") || fn.Contains("semibold") || fn.Contains("extrabold"); - wItalic = fn.Contains("italic") || fn.Contains("oblique"); - } - if (let?.Color != null) - { - wCol = PdfColorHelper.ToHex(let.Color, null, wCol); - } - - string wText = UnicodeScriptDetector.NormalizeExtractedText((i > 0 ? " " : "") + w.Text); - rawLineSpans.Add(new PdfTextSpan - { - Text = wText, - FontFamily = wFam, - FontSize = wSize, - IsBold = wBold, - IsItalic = wItalic, - TextColorHex = wCol - }); - } - - var normalizedLineSpans = NormalizeSpans(rawLineSpans); - - return new ExtractedPdfLine - { - Left = minLeft, - Right = maxRight, - Top = maxTop, - Bottom = minBottom, - BaselineY = avgBaseline, - Text = UnicodeScriptDetector.NormalizeExtractedText(text), - FontSize = fontSize, - FontFamily = fontFamily, - IsBold = isBold, - IsItalic = isItalic, - ColorHex = colorHex, - Spans = normalizedLineSpans - }; - } - - /// - /// Clusters lines into coherent paragraphs and standalone headings. - /// - public static List ClusterLinesIntoParagraphs(List lines, double pageHeight) - { - var paragraphs = new List(); - if (lines == null || lines.Count == 0) return paragraphs; - - // Sort lines in natural multi-column reading order (top-to-bottom of Column 1, then Column 2) - var sortedLines = SortLinesInNaturalReadingOrder(lines); - - var currentCluster = new List(); - - foreach (var line in sortedLines) - { - if (currentCluster.Count == 0) - { - currentCluster.Add(line); - continue; - } - - var prevLine = currentCluster.Last(); - - // Evaluate if this line belongs to the same paragraph - bool canCluster = ShouldClusterLines(prevLine, line); - - if (canCluster) - { - currentCluster.Add(line); - } - else - { - var para = BuildParagraphFromLines(currentCluster, pageHeight); - if (para != null) paragraphs.Add(para); - - currentCluster = new List { line }; - } - } - - if (currentCluster.Count > 0) - { - var para = BuildParagraphFromLines(currentCluster, pageHeight); - if (para != null) paragraphs.Add(para); - } - - return paragraphs; - } - - private static List SortLinesInNaturalReadingOrder(List lines) - { - if (lines.Count <= 3) return lines.OrderByDescending(l => l.Top).ThenBy(l => l.Left).ToList(); - - double minX = lines.Min(l => l.Left); - double maxX = lines.Max(l => l.Right); - double spanW = maxX - minX; - - // Detect multi-column or card layouts (2, 3, 4+ columns) on wide pages or cheat sheets - if (spanW > 240.0) - { - // Full-width headers spanning > 60% of total content width - var fullSpanHeaders = lines.Where(l => (l.Right - l.Left) >= spanW * 0.60).ToList(); - var nonSpanLines = lines.Except(fullSpanHeaders).ToList(); - - if (nonSpanLines.Count >= 4) - { - var columnGroups = new List>(); - var sortedByX = nonSpanLines.OrderBy(l => l.Left).ToList(); - - foreach (var line in sortedByX) - { - // Find a column group where line overlaps horizontally or is closely aligned with column bounds - var matchingCol = columnGroups.FirstOrDefault(col => - { - double colMinX = col.Min(cl => cl.Left); - double colMaxX = col.Max(cl => cl.Right); - return (line.Left >= colMinX - 15.0 && line.Left <= colMaxX + 15.0) || - (line.Right >= colMinX - 15.0 && line.Right <= colMaxX + 15.0); - }); - - if (matchingCol != null) - { - matchingCol.Add(line); - } - else - { - columnGroups.Add(new List { line }); - } - } - - // If multiple distinct columns were identified - if (columnGroups.Count >= 2 && columnGroups.All(c => c.Count >= 2)) - { - var ordered = new List(); - - double topContentY = nonSpanLines.Max(l => l.Top); - var topHeaders = fullSpanHeaders.Where(h => h.Bottom >= topContentY - 10.0).OrderByDescending(h => h.Top).ToList(); - var bottomFooters = fullSpanHeaders.Where(h => h.Bottom < topContentY - 10.0).OrderByDescending(h => h.Top).ToList(); - - ordered.AddRange(topHeaders); - - // Sort column groups from left to right, and lines inside each column top-to-bottom - var sortedColumns = columnGroups.OrderBy(c => c.Min(l => l.Left)).ToList(); - foreach (var col in sortedColumns) - { - ordered.AddRange(col.OrderByDescending(l => l.Top).ThenBy(l => l.Left)); - } - - ordered.AddRange(bottomFooters); - return ordered; - } - } - } - - return lines.OrderByDescending(l => l.Top).ThenBy(l => l.Left).ToList(); - } - - private static bool ShouldClusterLines(ExtractedPdfLine prev, ExtractedPdfLine next) - { - // 1. Font Size compatibility (within 1.5pt difference) - double sizeDiff = Math.Abs(prev.FontSize - next.FontSize); - if (sizeDiff > 1.5) return false; - - // 2. Bold / Weight compatibility (headings are distinct from body paragraphs) - if (prev.IsBold != next.IsBold) return false; - - // 3. Font Family compatibility - if (!string.Equals(prev.FontFamily, next.FontFamily, StringComparison.OrdinalIgnoreCase)) return false; - - // 4. Text Color compatibility - if (!string.Equals(prev.ColorHex, next.ColorHex, StringComparison.OrdinalIgnoreCase)) return false; - - // 5. Vertical line pitch calculation (distance from prev bottom to next top) - double verticalPitch = prev.Bottom - next.Top; // in PDF points, descending Y - double expectedLineGap = Math.Max(7.0, prev.FontSize * 0.95); - - // If line gap is negative (overlapping) or greater than standard paragraph spacing, break - if (verticalPitch < -2.0 || verticalPitch > expectedLineGap) return false; - - // 6. Paragraph Indentation: if next line starts indented to the right (>= 8pt), it marks a new paragraph - if (next.Left > prev.Left + 8.0) return false; - - // 7. Horizontal column & margin check - bool horizontalOverlap = (next.Left < prev.Right + 10) && (next.Right > prev.Left - 10); - if (!horizontalOverlap) return false; - - // Check left margin alignment (within 14pt for justified text variations) - double leftIndentDiff = Math.Abs(prev.Left - next.Left); - if (leftIndentDiff > 14.0) return false; - - // 7. Bullet / List Item start detection - string nextText = next.Text.Trim(); - if (nextText.StartsWith("•") || nextText.StartsWith("-") || nextText.StartsWith("—") || - (nextText.Length >= 2 && char.IsDigit(nextText[0]) && (nextText[1] == '.' || nextText[1] == ')'))) - { - // If next line starts with a list marker, break to a new paragraph/list block - return false; - } - - return true; - } - - private static ExtractedPdfParagraph? BuildParagraphFromLines(List lines, double pageHeight) - { - if (lines == null || lines.Count == 0) return null; - - double minLeft = lines.Min(l => l.Left); - double maxRight = lines.Max(l => l.Right); - double maxTop = lines.Max(l => l.Top); - double minBottom = lines.Min(l => l.Bottom); - - var firstLine = lines[0]; - double dominantFontSize = lines.GroupBy(l => Math.Round(l.FontSize, 1)).OrderByDescending(g => g.Count()).First().Key; - string dominantFontFamily = firstLine.FontFamily; - string dominantColor = firstLine.ColorHex; - bool isBold = lines.Count(l => l.IsBold) >= (lines.Count / 2.0); - bool isItalic = lines.Count(l => l.IsItalic) >= (lines.Count / 2.0); - - var sb = new StringBuilder(); - for (int i = 0; i < lines.Count; i++) - { - if (i > 0) sb.Append(Environment.NewLine); - sb.Append(lines[i].Text); - } - - string fullText = UnicodeScriptDetector.NormalizeExtractedText(sb.ToString().Trim()); - if (string.IsNullOrWhiteSpace(fullText)) return null; - - // Calculate average line pitch / height ratio - double lineHeight = 1.2; - if (lines.Count > 1) - { - double totalSpan = maxTop - minBottom; - double avgLineSpan = totalSpan / lines.Count; - if (dominantFontSize > 0) - { - lineHeight = Math.Max(1.0, Math.Min(2.0, avgLineSpan / dominantFontSize)); - } - } - - bool isHeading = (dominantFontSize >= 14.0 || (isBold && dominantFontSize >= 12.5) || (lines.Count == 1 && isBold)); - bool isBullet = fullText.StartsWith("•") || fullText.StartsWith("-") || fullText.StartsWith("—"); - bool isRtl = UnicodeScriptDetector.IsRtlText(fullText); - var alignment = isRtl ? TextAlignmentMode.Right : TextAlignmentMode.Left; - - // Convert PDF coordinates (origin bottom-left, Y goes up) to Canvas coordinates (origin top-left, Y goes down) - double canvasX = Math.Max(0, minLeft); - double canvasY = Math.Max(0, pageHeight - maxTop); - // Add a small safety padding (4-6pt) to width & height so Avalonia text controls render without unexpected line-clipping - double canvasWidth = Math.Max(30.0, (maxRight - minLeft) + 6.0); - double canvasHeight = Math.Max(16.0, (maxTop - minBottom) + 4.0); - - var paraSpans = new List(); - for (int i = 0; i < lines.Count; i++) - { - if (i > 0 && paraSpans.Count > 0) - { - paraSpans.Last().Text += "\n"; - } - if (lines[i].Spans != null && lines[i].Spans.Count > 0) - { - foreach (var s in lines[i].Spans) - { - paraSpans.Add(s.Clone()); - } - } - } - var normalizedParaSpans = NormalizeSpans(paraSpans); - - return new ExtractedPdfParagraph - { - Left = minLeft, - Right = maxRight, - Top = maxTop, - Bottom = minBottom, - Text = fullText, - FontSize = Math.Round(dominantFontSize, 1), - FontFamily = dominantFontFamily, - IsBold = isBold, - IsItalic = isItalic, - ColorHex = dominantColor, - LineHeight = Math.Round(lineHeight, 2), - IsHeading = isHeading, - IsBulletOrList = isBullet, - Alignment = alignment, - CanvasX = Math.Round(canvasX, 1), - CanvasY = Math.Round(canvasY, 1), - CanvasWidth = Math.Round(canvasWidth, 1), - CanvasHeight = Math.Round(canvasHeight, 1), - Spans = normalizedParaSpans - }; - } - - private static List NormalizeSpans(List spans) - { - if (spans.Count <= 1) return spans; - - var merged = new List(spans.Count); - PdfTextSpan? current = null; - - foreach (var s in spans) - { - if (string.IsNullOrEmpty(s.Text)) continue; - - if (current == null) - { - current = s.Clone(); - continue; - } - - if (string.Equals(current.FontFamily, s.FontFamily, StringComparison.OrdinalIgnoreCase) && - Nullable.Equals(current.FontSize, s.FontSize) && - current.IsBold == s.IsBold && - current.IsItalic == s.IsItalic && - string.Equals(current.TextColorHex, s.TextColorHex, StringComparison.OrdinalIgnoreCase)) - { - current.Text += s.Text; - } - else - { - merged.Add(current); - current = s.Clone(); - } - } - - if (current != null) - { - merged.Add(current); - } - - return merged; - } - - /// - /// Normalizes PDF font names (e.g., 'ABCDEF+Arial-BoldMT' or 'TimesNewRomanPS') to clean cross-platform font families. - /// Handles: Latin, Devanagari (Hindi/Marathi), Tamil, Telugu, Arabic, CJK (Chinese/Japanese/Korean). - /// - public static string NormalizeFontFamily(string? fontName) - { - if (string.IsNullOrWhiteSpace(fontName)) return "Open Sans"; - - string fn = fontName.ToLowerInvariant(); - - // Strip PDF subset prefixes like 'ABCDEF+' - int plusIdx = fn.IndexOf('+'); - if (plusIdx >= 0 && plusIdx < fn.Length - 1) - { - fn = fn.Substring(plusIdx + 1); - } - - // --- Latin & Common Fonts --- - if (fn.Contains("arial")) return "Arial"; - if (fn.Contains("times") || fn.Contains("libertine")) return "PT Serif"; - if (fn.Contains("cambria") || fn.Contains("crimson") || fn.Contains("garamond") || fn.Contains("palatino")) return "Crimson Text"; - if (fn.Contains("courier") || fn.Contains("firacode") || fn.Contains("robotomono")) return "Fira Code"; - if (fn.Contains("consolas") || fn.Contains("lucidasans")) return "Fira Code"; - if (fn.Contains("segoe")) return "Open Sans"; // Fallback to Open Sans for cross-platform - if (fn.Contains("roboto")) return "Roboto"; - if (fn.Contains("inter")) return "Inter"; - if (fn.Contains("calibri") || fn.Contains("cabin")) return "Cabin"; - if (fn.Contains("georgia") || fn.Contains("ptserif") || fn.Contains("pt serif")) return "PT Serif"; - if (fn.Contains("verdana")) return "Verdana"; - if (fn.Contains("helvetica")) return "Arial"; // Helvetica → Arial cross-platform - if (fn.Contains("lato")) return "Lato"; - if (fn.Contains("opensans") || fn.Contains("open sans")) return "Open Sans"; - if (fn.Contains("poppins")) return "Poppins"; - if (fn.Contains("sourcesans") || fn.Contains("source sans")) return "Source Sans 3"; - if (fn.Contains("notosans") && !fn.Contains("devanagari") && !fn.Contains("tamil") && - !fn.Contains("telugu") && !fn.Contains("arabic") && !fn.Contains("gujarati") && - !fn.Contains("kannada") && !fn.Contains("bengali") && !fn.Contains("malayalam")) - return "Noto Sans"; - if (fn.Contains("notoserif")) return "Noto Serif"; - if (fn.Contains("mono") || fn.Contains("courier")) return "Fira Code"; - if (fn.Contains("raleway")) return "Raleway"; - if (fn.Contains("nunito")) return "Nunito"; - if (fn.Contains("ubuntu")) return "Ubuntu"; - if (fn.Contains("merriweather")) return "Merriweather"; - if (fn.Contains("oswald")) return "Oswald"; - if (fn.Contains("montserrat")) return "Montserrat"; - if (fn.Contains("playfair")) return "Playfair Display"; - if (fn.Contains("josefin")) return "Josefin Sans"; - if (fn.Contains("titillium")) return "Titillium Web"; - if (fn.Contains("exo")) return "Exo 2"; - if (fn.Contains("librebaskerville") || fn.Contains("libre baskerville")) return "Libre Baskerville"; - if (fn.Contains("librefranklin") || fn.Contains("libre franklin")) return "Libre Franklin"; - if (fn.Contains("lora")) return "Lora"; - if (fn.Contains("bebas")) return "Bebas Neue"; - if (fn.Contains("cinzel")) return "Cinzel"; - if (fn.Contains("orbitron")) return "Orbitron"; - if (fn.Contains("lobster")) return "Lobster"; - if (fn.Contains("pacifico")) return "Pacifico"; - if (fn.Contains("dancingscript") || fn.Contains("dancing script")) return "Dancing Script"; - if (fn.Contains("caveat")) return "Caveat"; - if (fn.Contains("greatvibes") || fn.Contains("great vibes")) return "Great Vibes"; - if (fn.Contains("comicneue") || fn.Contains("comic")) return "Comic Neue"; - if (fn.Contains("luckiest") || fn.Contains("bungee") || fn.Contains("fredoka")) return "Poppins"; - if (fn.Contains("impact")) return "Oswald"; - if (fn.Contains("alfaslab") || fn.Contains("alfa slab")) return "Montserrat"; - - // --- Indian Scripts → mapped to Noto variants we have on disk --- - if (fn.Contains("nirmala") || fn.Contains("mangal") || fn.Contains("devanagari") || - fn.Contains("kruti") || fn.Contains("shree") || fn.Contains("aakar") || - fn.Contains("lohit") || fn.Contains("samyak") || fn.Contains("tiro") || - fn.Contains("hindi") || fn.Contains("marathi") || fn.Contains("sanskrit")) - return "Noto Sans Devanagari"; - if (fn.Contains("tamil") || fn.Contains("latha") || fn.Contains("vijaya")) - return "Noto Sans Tamil"; - if (fn.Contains("telugu") || fn.Contains("gautami") || fn.Contains("vani")) - return "Noto Sans Telugu"; - if (fn.Contains("kannada") || fn.Contains("tunga") || fn.Contains("kedage")) - return "Noto Sans Kannada"; - if (fn.Contains("malayalam") || fn.Contains("kartika") || fn.Contains("rachana")) - return "Noto Sans Malayalam"; - if (fn.Contains("gujarati") || fn.Contains("shruti") || fn.Contains("aakar")) - return "Noto Sans Gujarati"; - if (fn.Contains("punjabi") || fn.Contains("gurmukhi") || fn.Contains("raavi")) - return "Noto Sans"; - if (fn.Contains("bengali") || fn.Contains("vrinda") || fn.Contains("shonar")) - return "Noto Sans Bengali"; - if (fn.Contains("oriya") || fn.Contains("odia") || fn.Contains("kalinga")) - return "Noto Sans"; - - // --- Arabic / Urdu / Farsi --- - if (fn.Contains("arabic") || fn.Contains("urdu") || fn.Contains("farsi") || - fn.Contains("naskh") || fn.Contains("scheherazade") || fn.Contains("amiri") || - fn.Contains("traditional arabic") || fn.Contains("simplified arabic")) - return "Noto Sans Arabic"; - - // --- CJK (Chinese / Japanese / Korean) --- with proper script distinction --- - // Chinese Simplified: SimSun, SimHei, Microsoft YaHei, WenQuanYi, Noto SC - if (fn.Contains("simsun") || fn.Contains("simhei") || fn.Contains("wqy") || - fn.Contains("notosanssc") || fn.Contains("noto sans sc") || - fn.Contains("microsoftyahei") || fn.Contains("yahei") || - fn.Contains("songti") || fn.Contains("heiti") || fn.Contains("fangsong") || - fn.Contains("source han sans sc") || fn.Contains("source han sans cn")) - return "Noto Sans SC"; - // Chinese Traditional: MingLiU, PMingLiU, Microsoft JhengHei, Noto TC - if (fn.Contains("mingliu") || fn.Contains("pmingliou") || fn.Contains("kaiti") || - fn.Contains("notosanstc") || fn.Contains("noto sans tc") || - fn.Contains("microsoftjhenghei") || fn.Contains("jhenghei") || - fn.Contains("source han sans tw") || fn.Contains("source han sans hk")) - return "Noto Sans TC"; - // Japanese: MS Gothic, MS Mincho, IPAex, Meiryo, Hiragino, Noto JP - if (fn.Contains("msgothic") || fn.Contains("msmincho") || fn.Contains("ipaex") || - fn.Contains("meiryo") || fn.Contains("hiragino") || fn.Contains("yu gothic") || - fn.Contains("yugothic") || fn.Contains("yumincho") || fn.Contains("noto sans jp") || - fn.Contains("notosansjp") || fn.Contains("source han sans jp") || - fn.Contains("kozuka") || fn.Contains("morisawa")) - return "Noto Sans JP"; - // Korean: Malgun, Batang, Gulim, Dotum, Nanum, Noto KR - if (fn.Contains("malgun") || fn.Contains("batang") || fn.Contains("gulim") || - fn.Contains("dotum") || fn.Contains("nanum") || fn.Contains("nanumgothic") || - fn.Contains("notosanskr") || fn.Contains("noto sans kr") || - fn.Contains("source han sans k") || fn.Contains("apple sd gothic")) - return "Noto Sans KR"; - // General CJK fallback (unidentified CJK font) - if (fn.Contains("cjk") || fn.Contains("chinese") || fn.Contains("japanese") || fn.Contains("korean")) - return "Noto Sans SC"; - - // --- Thai --- - if (fn.Contains("thai") || fn.Contains("sarabun") || fn.Contains("thsarabun") || - fn.Contains("browallia") || fn.Contains("cordia") || fn.Contains("angsana")) - return "Noto Sans Thai"; - - // --- Hebrew --- - if (fn.Contains("hebrew") || fn.Contains("heebo") || fn.Contains("david") || - fn.Contains("miriam") || fn.Contains("frank ruehl") || fn.Contains("frankruehl")) - return "Noto Sans Hebrew"; - - // --- Greek --- - if (fn.Contains("greek") || fn.Contains("gfs") || fn.Contains("paleologos") || - fn.Contains("didot") || fn.Contains("helvetica greek")) - return "GFS Neohellenic"; - - // --- Cyrillic (Russian, Ukrainian, Bulgarian, Serbian, Macedonian) --- - if (fn.Contains("cyrillic") || fn.Contains("golos") || fn.Contains("russo") || - fn.Contains("pragmatica") || fn.Contains("paratypesans") || - fn.Contains("ptastra") || fn.Contains("ptsans")) - return "Golos Text"; - - // --- Georgian --- - if (fn.Contains("georgian") || fn.Contains("sylfaen") || fn.Contains("alk") || - fn.Contains("bpg") || fn.Contains("dejavu georgian")) - return "Noto Sans Georgian"; - - // --- Armenian --- - if (fn.Contains("armenian") || fn.Contains("mshtakan") || fn.Contains("euphemia")) - return "Noto Sans Armenian"; - - // --- Persian / Farsi --- - if (fn.Contains("persian") || fn.Contains("farsi") || fn.Contains("vazir") || - fn.Contains("iran") || fn.Contains("yekan") || fn.Contains("nazanin")) - return "Vazirmatn"; - - // --- Urdu (Nastaliq) --- - if (fn.Contains("urdu") || fn.Contains("nastaliq") || fn.Contains("noori") || fn.Contains("nafees")) - return "Noto Nastaliq Urdu"; - - // --- Myanmar --- - if (fn.Contains("myanmar") || fn.Contains("burmese") || fn.Contains("zawgyi") || fn.Contains("mon")) - return "Noto Sans Myanmar"; - - // --- Khmer --- - if (fn.Contains("khmer") || fn.Contains("cambodian") || fn.Contains("battambang")) - return "Noto Sans Khmer"; - - // --- Ethiopic --- - if (fn.Contains("ethiopic") || fn.Contains("amharic") || fn.Contains("geez") || - fn.Contains("abyssinica") || fn.Contains("nyala")) - return "Noto Sans Ethiopic"; - - return "Open Sans"; // Default: clean, widely compatible sans-serif - } -} diff --git a/src/PdfEditorApp.Core/Analysis/TableGridDetector.cs b/src/PdfEditorApp.Core/Analysis/TableGridDetector.cs deleted file mode 100644 index 9020a06..0000000 --- a/src/PdfEditorApp.Core/Analysis/TableGridDetector.cs +++ /dev/null @@ -1,227 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using PdfEditorApp.Core.Models.Elements; -using UglyToad.PdfPig.Content; -using UglyToad.PdfPig.Core; -using UglyToad.PdfPig.Graphics; - -namespace PdfEditorApp.Core.Analysis; - -/// -/// Result of table detection containing the reconstructed PdfTableElement -/// and the indices/bounds of swallowed lines and text blocks. -/// -public class DetectedTableResult -{ - public PdfTableElement TableElement { get; set; } = new(); - public List ConsumedPathIndices { get; } = new(); - public List ConsumedParagraphs { get; } = new(); - public PdfRectangle BoundingBox { get; set; } -} - -/// -/// Advanced Table Grid Detector and Structure Reconstructor. -/// Detects tabular grids from raw vector lines and cell alignments in 3rd-party PDFs, -/// synthesizing cohesive, editable PdfTableElement models. -/// -public static class TableGridDetector -{ - public static List DetectTables( - IReadOnlyList? paths, - List paragraphs, - double pageWidth, - double pageHeight) - { - var results = new List(); - if (paths == null || paths.Count == 0 || paragraphs == null || paragraphs.Count == 0) - return results; - - // Step 1: Extract horizontal and vertical line segments from paths - var hLines = new List<(double Y, double Left, double Right, int PathIndex)>(); - var vLines = new List<(double X, double Bottom, double Top, int PathIndex)>(); - - for (int i = 0; i < paths.Count; i++) - { - var p = paths[i]; - var bbox = p.GetBoundingRectangle(); - if (!bbox.HasValue) continue; - - var b = bbox.Value; - if (b.Width >= pageWidth * 0.98 && b.Height >= pageHeight * 0.98) continue; // Skip page border - - // Horizontal line segment: width >= 40, height <= 4 - if (b.Width >= 40.0 && b.Height <= 4.0) - { - double canvasY = pageHeight - b.Top; - hLines.Add((canvasY, b.Left, b.Right, i)); - } - // Vertical line segment: height >= 20, width <= 4 - else if (b.Height >= 20.0 && b.Width <= 4.0) - { - double canvasTop = pageHeight - b.Top; - double canvasBottom = pageHeight - b.Bottom; - vLines.Add((b.Left, canvasTop, canvasBottom, i)); - } - } - - // Need at least 2 horizontal lines to form a table - if (hLines.Count < 2) return results; - - // Group horizontal lines by proximity and overlapping X spans to find table clusters - var sortedHLines = hLines.OrderBy(h => h.Y).ToList(); - var tableHLinesGroups = new List>(); - var currentGroup = new List<(double Y, double Left, double Right, int PathIndex)>(); - - foreach (var hl in sortedHLines) - { - if (currentGroup.Count == 0) - { - currentGroup.Add(hl); - continue; - } - - var prev = currentGroup.Last(); - double yGap = hl.Y - prev.Y; - bool xOverlap = (hl.Left < prev.Right + 10) && (hl.Right > prev.Left - 10); - - // Table rows typically have pitch between 12pt and 60pt - if (yGap <= 65.0 && xOverlap) - { - currentGroup.Add(hl); - } - else - { - if (currentGroup.Count >= 3) - { - tableHLinesGroups.Add(new List<(double Y, double Left, double Right, int PathIndex)>(currentGroup)); - } - currentGroup = new List<(double Y, double Left, double Right, int PathIndex)> { hl }; - } - } - - if (currentGroup.Count >= 3) - { - tableHLinesGroups.Add(currentGroup); - } - - // Step 2: For each table line cluster, construct a structured PdfTableElement - foreach (var group in tableHLinesGroups) - { - double tableTopY = group.Min(h => h.Y); - double tableBottomY = group.Max(h => h.Y); - double tableLeftX = group.Min(h => h.Left); - double tableRightX = group.Max(h => h.Right); - double tableW = tableRightX - tableLeftX; - double tableH = tableBottomY - tableTopY; - - if (tableW < 80.0 || tableH < 30.0) continue; - - // Find all text paragraphs within table bounds - var tableParas = paragraphs.Where(p => - p.CanvasX >= tableLeftX - 10 && - p.CanvasX + p.CanvasWidth <= tableRightX + 10 && - p.CanvasY >= tableTopY - 10 && - p.CanvasY + p.CanvasHeight <= tableBottomY + 10).ToList(); - - if (tableParas.Count < 4) continue; // Need at least 4 text items to be a valid multi-cell table - - // Detect column divisions from text X positions - var distinctColXs = tableParas - .Select(p => Math.Round(p.CanvasX, -1)) // Round to nearest 10pt - .Distinct() - .OrderBy(x => x) - .ToList(); - - if (distinctColXs.Count < 2) continue; // Must have at least 2 columns - - // Group distinct rows by Y pitch - var distinctRowYs = group - .Select(h => h.Y) - .OrderBy(y => y) - .ToList(); - - int rowCount = distinctRowYs.Count - 1; - int colCount = distinctColXs.Count; - if (rowCount < 2 || colCount < 2) continue; - - var headers = new List(); - var rows = new List>(); - - // Populate header row (Row 0) - double row0Top = distinctRowYs[0]; - double row0Bottom = distinctRowYs[1]; - - for (int c = 0; c < colCount; c++) - { - double colLeft = distinctColXs[c] - 15; - double colRight = (c + 1 < colCount) ? distinctColXs[c + 1] - 5 : tableRightX + 5; - - var cellParas = tableParas.Where(p => - p.CanvasY >= row0Top - 5 && p.CanvasY <= row0Bottom + 5 && - p.CanvasX >= colLeft && p.CanvasX < colRight) - .OrderBy(p => p.CanvasX) - .ToList(); - - string headerText = string.Join(" ", cellParas.Select(p => p.Text.Trim())); - headers.Add(string.IsNullOrWhiteSpace(headerText) ? $"Col {c + 1}" : headerText); - } - - // Populate body rows (Row 1..N) - for (int r = 1; r < rowCount; r++) - { - double rTop = distinctRowYs[r]; - double rBottom = distinctRowYs[r + 1]; - var rowData = new List(); - - for (int c = 0; c < colCount; c++) - { - double colLeft = distinctColXs[c] - 15; - double colRight = (c + 1 < colCount) ? distinctColXs[c + 1] - 5 : tableRightX + 5; - - var cellParas = tableParas.Where(p => - p.CanvasY >= rTop - 5 && p.CanvasY <= rBottom + 5 && - p.CanvasX >= colLeft && p.CanvasX < colRight) - .OrderBy(p => p.CanvasX) - .ToList(); - - string cellText = string.Join(" ", cellParas.Select(p => p.Text.Trim())); - rowData.Add(cellText); - } - - rows.Add(rowData); - } - - if (headers.Count > 0 && rows.Count > 0) - { - var tableElement = new PdfTableElement - { - X = Math.Round(tableLeftX, 1), - Y = Math.Round(tableTopY, 1), - Width = Math.Round(tableW, 1), - Height = Math.Round(tableH, 1), - Headers = headers, - Rows = rows, - HeaderBackgroundHex = "#0F6CBD", - HeaderTextHex = "#FFFFFF", - AlternateRowBackgroundHex = "#F8FAFC", - BorderColorHex = "#CBD5E1" - }; - - var detected = new DetectedTableResult - { - TableElement = tableElement, - BoundingBox = new PdfRectangle(tableLeftX, tableBottomY, tableRightX, tableTopY) - }; - - detected.ConsumedPathIndices.AddRange(group.Select(h => h.PathIndex)); - detected.ConsumedParagraphs.AddRange(tableParas); - - results.Add(detected); - } - } - - return results; - } -} diff --git a/src/PdfEditorApp.Core/Analysis/UnicodeScriptDetector.cs b/src/PdfEditorApp.Core/Analysis/UnicodeScriptDetector.cs deleted file mode 100644 index 4d4e596..0000000 --- a/src/PdfEditorApp.Core/Analysis/UnicodeScriptDetector.cs +++ /dev/null @@ -1,358 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace PdfEditorApp.Core.Analysis; - -/// -/// Detects the Unicode script of text content using codepoint range analysis. -/// -/// Used as the authoritative fallback when PDF font names are ambiguous, obfuscated, -/// or use non-standard naming conventions (common in CJK, Arabic, and Indian PDFs). -/// -/// Supports 30+ world scripts including CJK (Simplified/Traditional Chinese, Japanese, Korean), -/// Indian scripts (Devanagari, Tamil, Telugu, Bengali, Gujarati, Kannada, Malayalam, Odia, Gurmukhi), -/// RTL scripts (Arabic, Hebrew, Persian/Urdu), and Southeast/Central Asian scripts. -/// -public static class UnicodeScriptDetector -{ - /// - /// Classifies the dominant Unicode script of a string. - /// Returns the best-matching FontFamily name from our embedded font library. - /// - public static string DetectScriptFontFamily(string? text) - { - if (string.IsNullOrWhiteSpace(text)) - return "Open Sans"; - - // Count codepoints per script block - var scriptCounts = new Dictionary(); - - for (int i = 0; i < text.Length;) - { - int codepoint = char.ConvertToUtf32(text, i); - i += char.IsSurrogatePair(text, i) ? 2 : 1; - - // Skip whitespace and common punctuation - if (codepoint <= 0x0040) continue; - if (IsBasicLatin(codepoint)) continue; - - var script = ClassifyCodepoint(codepoint); - if (script != UnicodeScript.Unknown) - { - scriptCounts.TryGetValue(script, out int count); - scriptCounts[script] = count + 1; - } - } - - if (scriptCounts.Count == 0) - return "Open Sans"; - - // Return the font for the dominant script - var dominant = scriptCounts.MaxBy(kvp => kvp.Value).Key; - return ScriptToFontFamily(dominant); - } - - /// - /// Normalizes extracted PDF text by decomposing typographic ligatures (ff, fi, fl, ffi, ffl, ft, st), - /// replacing non-breaking spaces with standard spaces, and stripping replacement characters. - /// Eliminates tofu boxes ("□") when rendering extracted text with standard fonts. - /// - public static string NormalizeExtractedText(string? text) - { - if (string.IsNullOrEmpty(text)) return string.Empty; - - var sb = new StringBuilder(text.Length); - for (int i = 0; i < text.Length; i++) - { - char c = text[i]; - switch (c) - { - case '\uFB00': sb.Append("ff"); break; - case '\uFB01': sb.Append("fi"); break; - case '\uFB02': sb.Append("fl"); break; - case '\uFB03': sb.Append("ffi"); break; - case '\uFB04': sb.Append("ffl"); break; - case '\uFB05': sb.Append("ft"); break; - case '\uFB06': sb.Append("st"); break; - case '\u00A0': // Non-breaking space - case '\u2007': // Figure space - case '\u202F': // Narrow no-break space - sb.Append(' '); - break; - case '\u200B': // Zero-width space - break; - case '\uFFFD': // Replacement character artifact - break; - default: - sb.Append(c); - break; - } - } - return sb.ToString(); - } - - /// - /// Quick check: does this string contain any CJK characters? - /// - public static bool ContainsCjk(string text) - { - foreach (char c in text) - { - int cp = c; - if ((cp >= 0x4E00 && cp <= 0x9FFF) || // CJK Unified Ideographs - (cp >= 0x3400 && cp <= 0x4DBF) || // CJK Extension A - (cp >= 0x20000 && cp <= 0x2A6DF) || // CJK Extension B (surrogate pair range) - (cp >= 0x3040 && cp <= 0x309F) || // Hiragana - (cp >= 0x30A0 && cp <= 0x30FF) || // Katakana - (cp >= 0xAC00 && cp <= 0xD7AF)) // Korean Hangul Syllables - return true; - } - return false; - } - - /// - /// Quick check: does this string need an RTL font? - /// - public static bool IsRtlText(string text) - { - foreach (char c in text) - { - int cp = c; - if ((cp >= 0x0600 && cp <= 0x06FF) || // Arabic - (cp >= 0x0590 && cp <= 0x05FF) || // Hebrew - (cp >= 0xFB50 && cp <= 0xFDFF) || // Arabic Presentation Forms-A - (cp >= 0xFE70 && cp <= 0xFEFF)) // Arabic Presentation Forms-B - return true; - } - return false; - } - - /// - /// Quick check: does this string contain Devanagari (Hindi/Marathi/Sanskrit)? - /// - public static bool ContainsDevanagari(string text) - { - foreach (char c in text) - { - int cp = c; - if (cp >= 0x0900 && cp <= 0x097F) return true; - } - return false; - } - - private static UnicodeScript ClassifyCodepoint(int cp) - { - // === CJK Unified Ideographs (used by Chinese, Japanese, rarely Korean) === - if (cp >= 0x4E00 && cp <= 0x9FFF) return UnicodeScript.CjkUnified; - if (cp >= 0x3400 && cp <= 0x4DBF) return UnicodeScript.CjkUnified; // Extension A - if (cp >= 0xF900 && cp <= 0xFAFF) return UnicodeScript.CjkUnified; // CJK Compatibility - - // === Japanese-Specific === - if (cp >= 0x3040 && cp <= 0x309F) return UnicodeScript.Hiragana; - if (cp >= 0x30A0 && cp <= 0x30FF) return UnicodeScript.Katakana; - if (cp >= 0x31F0 && cp <= 0x31FF) return UnicodeScript.Katakana; // Katakana Phonetic Extensions - if (cp >= 0xFF65 && cp <= 0xFF9F) return UnicodeScript.Katakana; // Halfwidth Katakana - - // === Korean === - if (cp >= 0xAC00 && cp <= 0xD7AF) return UnicodeScript.HangulSyllables; - if (cp >= 0x1100 && cp <= 0x11FF) return UnicodeScript.HangulJamo; - if (cp >= 0x3130 && cp <= 0x318F) return UnicodeScript.HangulCompatJamo; - if (cp >= 0xA960 && cp <= 0xA97F) return UnicodeScript.HangulJamoExtended; - - // === Chinese Bopomofo (Traditional Chinese phonetics) === - if (cp >= 0x02EA && cp <= 0x02EB) return UnicodeScript.TraditionalChinese; - if (cp >= 0x3100 && cp <= 0x312F) return UnicodeScript.TraditionalChinese; - if (cp >= 0x31A0 && cp <= 0x31BF) return UnicodeScript.TraditionalChinese; - - // === Chinese CJK Strokes (Traditional-specific) === - if (cp >= 0x31C0 && cp <= 0x31EF) return UnicodeScript.TraditionalChinese; - - // === Arabic === - if (cp >= 0x0600 && cp <= 0x06FF) return UnicodeScript.Arabic; - if (cp >= 0x0750 && cp <= 0x077F) return UnicodeScript.Arabic; // Arabic Supplement - if (cp >= 0x08A0 && cp <= 0x08FF) return UnicodeScript.Arabic; // Arabic Extended-A - if (cp >= 0xFB50 && cp <= 0xFDFF) return UnicodeScript.Arabic; // Arabic Presentation Forms-A - if (cp >= 0xFE70 && cp <= 0xFEFF) return UnicodeScript.Arabic; // Arabic Presentation Forms-B - if (cp >= 0x1EE00 && cp <= 0x1EEFF) return UnicodeScript.Arabic; // Arabic Mathematical - - // === Persian / Farsi (subset of Arabic block, with specific codepoints) === - // Farsi uses Arabic script with some extra chars — handled under Arabic above - - // === Hebrew === - if (cp >= 0x0590 && cp <= 0x05FF) return UnicodeScript.Hebrew; - if (cp >= 0xFB00 && cp <= 0xFB4F) return UnicodeScript.Hebrew; // Alphabetic Presentation Forms (Hebrew part) - - // === Devanagari (Hindi, Marathi, Sanskrit, Nepali) === - if (cp >= 0x0900 && cp <= 0x097F) return UnicodeScript.Devanagari; - if (cp >= 0xA8E0 && cp <= 0xA8FF) return UnicodeScript.Devanagari; // Devanagari Extended - - // === Bengali (Bangla) === - if (cp >= 0x0980 && cp <= 0x09FF) return UnicodeScript.Bengali; - - // === Gurmukhi (Punjabi) === - if (cp >= 0x0A00 && cp <= 0x0A7F) return UnicodeScript.Gurmukhi; - - // === Gujarati === - if (cp >= 0x0A80 && cp <= 0x0AFF) return UnicodeScript.Gujarati; - - // === Oriya / Odia === - if (cp >= 0x0B00 && cp <= 0x0B7F) return UnicodeScript.Odia; - - // === Tamil === - if (cp >= 0x0B80 && cp <= 0x0BFF) return UnicodeScript.Tamil; - - // === Telugu === - if (cp >= 0x0C00 && cp <= 0x0C7F) return UnicodeScript.Telugu; - - // === Kannada === - if (cp >= 0x0C80 && cp <= 0x0CFF) return UnicodeScript.Kannada; - - // === Malayalam === - if (cp >= 0x0D00 && cp <= 0x0D7F) return UnicodeScript.Malayalam; - - // === Sinhala (Sri Lanka) === - if (cp >= 0x0D80 && cp <= 0x0DFF) return UnicodeScript.Sinhala; - - // === Thai === - if (cp >= 0x0E00 && cp <= 0x0E7F) return UnicodeScript.Thai; - - // === Lao === - if (cp >= 0x0E80 && cp <= 0x0EFF) return UnicodeScript.Lao; - - // === Tibetan === - if (cp >= 0x0F00 && cp <= 0x0FFF) return UnicodeScript.Tibetan; - - // === Myanmar / Burmese === - if (cp >= 0x1000 && cp <= 0x109F) return UnicodeScript.Myanmar; - - // === Georgian === - if (cp >= 0x10A0 && cp <= 0x10FF) return UnicodeScript.Georgian; - if (cp >= 0x2D00 && cp <= 0x2D2F) return UnicodeScript.Georgian; // Georgian Supplement - - // === Ethiopic (Amharic, Tigrinya, etc.) === - if (cp >= 0x1200 && cp <= 0x137F) return UnicodeScript.Ethiopic; - if (cp >= 0x1380 && cp <= 0x139F) return UnicodeScript.Ethiopic; - - // === Armenian === - if (cp >= 0x0530 && cp <= 0x058F) return UnicodeScript.Armenian; - - // === Cyrillic (Russian, Ukrainian, Bulgarian, Serbian, etc.) === - if (cp >= 0x0400 && cp <= 0x04FF) return UnicodeScript.Cyrillic; - if (cp >= 0x0500 && cp <= 0x052F) return UnicodeScript.Cyrillic; // Cyrillic Supplement - if (cp >= 0x2DE0 && cp <= 0x2DFF) return UnicodeScript.Cyrillic; // Cyrillic Extended-A - - // === Greek === - if (cp >= 0x0370 && cp <= 0x03FF) return UnicodeScript.Greek; - if (cp >= 0x1F00 && cp <= 0x1FFF) return UnicodeScript.Greek; // Greek Extended - - // === Khmer (Cambodia) === - if (cp >= 0x1780 && cp <= 0x17FF) return UnicodeScript.Khmer; - - // === Mongolian === - if (cp >= 0x1800 && cp <= 0x18AF) return UnicodeScript.Mongolian; - - return UnicodeScript.Unknown; - } - - private static bool IsBasicLatin(int cp) - { - return cp < 0x0250; // Basic Latin + Latin-1 Supplement + Latin Extended-A+B - } - - private static string ScriptToFontFamily(UnicodeScript script) => script switch - { - // === CJK === - UnicodeScript.Hiragana => "Noto Sans JP", // Japanese hiragana → JP font - UnicodeScript.Katakana => "Noto Sans JP", // Japanese katakana → JP font - UnicodeScript.CjkUnified => "Noto Sans SC", // Default CJK → Simplified Chinese (superset) - UnicodeScript.TraditionalChinese => "Noto Sans TC", // Traditional Chinese specific - UnicodeScript.HangulSyllables => "Noto Sans KR", // Korean - UnicodeScript.HangulJamo => "Noto Sans KR", - UnicodeScript.HangulCompatJamo => "Noto Sans KR", - UnicodeScript.HangulJamoExtended => "Noto Sans KR", - - // === RTL === - UnicodeScript.Arabic => "Noto Sans Arabic", - UnicodeScript.Hebrew => "Noto Sans Hebrew", - - // === Indian Scripts === - UnicodeScript.Devanagari => "Noto Sans Devanagari", - UnicodeScript.Bengali => "Noto Sans Bengali", - UnicodeScript.Gurmukhi => "Noto Sans", // Gurmukhi → general Noto Sans - UnicodeScript.Gujarati => "Noto Sans Gujarati", - UnicodeScript.Odia => "Noto Sans", - UnicodeScript.Tamil => "Noto Sans Tamil", - UnicodeScript.Telugu => "Noto Sans Telugu", - UnicodeScript.Kannada => "Noto Sans Kannada", - UnicodeScript.Malayalam => "Noto Sans Malayalam", - UnicodeScript.Sinhala => "Noto Sans Sinhala", - UnicodeScript.Tibetan => "Noto Sans", - - // === Southeast Asian === - UnicodeScript.Thai => "Noto Sans Thai", - UnicodeScript.Lao => "Noto Sans Lao", - UnicodeScript.Myanmar => "Noto Sans Myanmar", - UnicodeScript.Khmer => "Noto Sans Khmer", - - // === Eurasian === - UnicodeScript.Georgian => "Noto Sans Georgian", - UnicodeScript.Armenian => "Noto Sans Armenian", - UnicodeScript.Ethiopic => "Noto Sans Ethiopic", - UnicodeScript.Cyrillic => "Noto Sans", // Cyrillic covered by Noto Sans Latin - UnicodeScript.Greek => "GFS Neohellenic", - UnicodeScript.Mongolian => "Noto Sans", - - _ => "Open Sans" - }; -} - -/// -/// Unicode script classification enum. -/// -public enum UnicodeScript -{ - Unknown, - - // CJK - CjkUnified, - TraditionalChinese, - Hiragana, - Katakana, - HangulSyllables, - HangulJamo, - HangulCompatJamo, - HangulJamoExtended, - - // RTL - Arabic, - Hebrew, - - // Indian - Devanagari, - Bengali, - Gurmukhi, - Gujarati, - Odia, - Tamil, - Telugu, - Kannada, - Malayalam, - Sinhala, - Tibetan, - - // Southeast Asian - Thai, - Lao, - Myanmar, - Khmer, - - // Eurasian - Georgian, - Armenian, - Ethiopic, - Cyrillic, - Greek, - Mongolian, -} diff --git a/src/PdfEditorApp.Core/Data/BatchMergeModels.cs b/src/PdfEditorApp.Core/Data/BatchMergeModels.cs deleted file mode 100644 index 71c651e..0000000 --- a/src/PdfEditorApp.Core/Data/BatchMergeModels.cs +++ /dev/null @@ -1,76 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace PdfEditorApp.Core.Data; - -public enum BatchOutputMode -{ - SeparateFiles, - SingleMergedPdf, - ZipArchive -} - -public enum FieldTransformType -{ - None, - Currency, - Date, - Numeric, - Percentage, - Uppercase, - Lowercase, - TitleCase -} - -public class FieldMappingItem -{ - public string PlaceholderTag { get; set; } = string.Empty; - public string DataColumnName { get; set; } = string.Empty; - public FieldTransformType Transform { get; set; } = FieldTransformType.None; - public string CustomFormat { get; set; } = string.Empty; - public string DefaultValue { get; set; } = string.Empty; - public string SampleValue { get; set; } = string.Empty; - - public FieldMappingItem() { } - - public FieldMappingItem(string placeholderTag, string dataColumnName, string defaultValue = "") - { - PlaceholderTag = placeholderTag; - DataColumnName = dataColumnName; - DefaultValue = defaultValue; - } -} - -public class BatchGenerationConfig -{ - public BatchOutputMode OutputMode { get; set; } = BatchOutputMode.SeparateFiles; - public string OutputDirectory { get; set; } = string.Empty; - public string OutputFilePath { get; set; } = string.Empty; - public string FilenamePattern { get; set; } = "Document_{{Index}}.pdf"; - public bool SkipEmptyRows { get; set; } = true; - public int? MaxRecordCount { get; set; } -} - -public class BatchProgressReport -{ - public int CurrentIndex { get; set; } - public int TotalCount { get; set; } - public string CurrentItemName { get; set; } = string.Empty; - public int SucceededCount { get; set; } - public int FailedCount { get; set; } - public string StatusMessage { get; set; } = string.Empty; - public double Percentage => TotalCount > 0 ? (double)CurrentIndex / TotalCount * 100.0 : 0; -} - -public class BatchGenerationResult -{ - public int TotalProcessed { get; set; } - public int SuccessfulCount { get; set; } - public int FailedCount { get; set; } - public List GeneratedFiles { get; set; } = new(); - public string? OutputMergedFilePath { get; set; } - public string? OutputZipFilePath { get; set; } - public List<(int RowIndex, string ErrorMessage)> Errors { get; set; } = new(); - public TimeSpan ElapsedTime { get; set; } - public bool IsSuccess => FailedCount == 0 && SuccessfulCount > 0; -} diff --git a/src/PdfEditorApp.Core/Data/DataBindingService.cs b/src/PdfEditorApp.Core/Data/DataBindingService.cs deleted file mode 100644 index 786557f..0000000 --- a/src/PdfEditorApp.Core/Data/DataBindingService.cs +++ /dev/null @@ -1,235 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using PdfEditorApp.Core.Analysis; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; - -namespace PdfEditorApp.Core.Data; - -public class DataBindingService : IDataBindingService -{ - public void ApplyToChart(DataMatrix matrix, PdfChartElement chart, int categoryColIndex = 0, List? valueColIndices = null) - { - if (matrix.RowCount == 0 || matrix.ColumnCount == 0) return; - - categoryColIndex = Math.Clamp(categoryColIndex, 0, matrix.ColumnCount - 1); - valueColIndices ??= Enumerable.Range(0, matrix.ColumnCount).Where(i => i != categoryColIndex).ToList(); - if (valueColIndices.Count == 0) - { - valueColIndices.Add(categoryColIndex == 0 ? Math.Min(1, matrix.ColumnCount - 1) : 0); - } - - var categories = matrix.GetColumnValues(categoryColIndex); - var palette = LiveChartsRenderer.GetPaletteHexColors(chart.Palette); - - chart.Categories = categories; - - if (valueColIndices.Count == 1) - { - // Single Series mapping - int valCol = valueColIndices[0]; - var rawValues = matrix.GetColumnValues(valCol); - var values = new List(); - var valueLabels = new List(); - var barColors = new List(); - - for (int r = 0; r < rawValues.Count; r++) - { - string raw = rawValues[r]; - if (DataMatrix.TryParseNumeric(raw, out double num)) - { - values.Add(num); - } - else - { - values.Add(0.0); - } - valueLabels.Add(raw); - barColors.Add(palette[r % palette.Count]); - } - - chart.Values = values; - chart.ValueLabels = valueLabels; - chart.BarColorsHex = barColors; - chart.MultiSeries = new List(); - - if (string.IsNullOrEmpty(chart.Title) || chart.Title.Contains("Chart Analysis")) - { - chart.Title = matrix.Headers.ElementAtOrDefault(valCol) ?? "Chart Analysis"; - } - } - else - { - // Multi-Series mapping (e.g. Sales, Target, Expense) - var multiSeriesList = new List(); - var firstColValues = new List(); - var firstColLabels = new List(); - var barColors = new List(); - - for (int s = 0; s < valueColIndices.Count; s++) - { - int valCol = valueColIndices[s]; - string seriesName = matrix.Headers.ElementAtOrDefault(valCol) ?? $"Series {s + 1}"; - string seriesColor = palette[s % palette.Count]; - var rawValues = matrix.GetColumnValues(valCol); - var numValues = new List(); - - for (int r = 0; r < rawValues.Count; r++) - { - if (DataMatrix.TryParseNumeric(rawValues[r], out double num)) - { - numValues.Add(num); - } - else - { - numValues.Add(0.0); - } - - if (s == 0) - { - firstColValues.Add(numValues[r]); - firstColLabels.Add(rawValues[r]); - barColors.Add(palette[r % palette.Count]); - } - } - - multiSeriesList.Add(new ChartSeriesItem - { - Name = seriesName, - Values = numValues, - ColorHex = seriesColor - }); - } - - chart.MultiSeries = multiSeriesList; - chart.Values = firstColValues; - chart.ValueLabels = firstColLabels; - chart.BarColorsHex = barColors; - } - } - - public void ApplyToTable(DataMatrix matrix, PdfTableElement table) - { - if (matrix.ColumnCount == 0) return; - - table.Headers = new List(matrix.Headers); - table.Rows = new List>(); - - foreach (var r in matrix.Rows) - { - table.Rows.Add(new List(r)); - } - - // Auto-scale height - double calculatedHeight = Math.Max(table.Height, 35 + (matrix.RowCount * 26)); - table.Height = calculatedHeight; - } - - public DataMatrix ExtractFromTable(PdfTableElement table) - { - var headers = new List(table.Headers); - var rows = new List>(); - - foreach (var r in table.Rows) - { - rows.Add(new List(r)); - } - - return new DataMatrix(headers, rows); - } - - public DataMatrix ExtractFromChart(PdfChartElement chart) - { - var headers = new List { "Category" }; - var rows = new List>(); - - if (chart.MultiSeries != null && chart.MultiSeries.Count > 0) - { - foreach (var series in chart.MultiSeries) - { - headers.Add(series.Name); - } - - for (int r = 0; r < chart.Categories.Count; r++) - { - var row = new List { chart.Categories[r] }; - foreach (var series in chart.MultiSeries) - { - row.Add(r < series.Values.Count ? series.Values[r].ToString("G") : "0"); - } - rows.Add(row); - } - } - else - { - headers.Add(string.IsNullOrWhiteSpace(chart.Title) ? "Value" : chart.Title); - for (int r = 0; r < chart.Categories.Count; r++) - { - string cat = chart.Categories[r]; - string val = r < chart.ValueLabels.Count && !string.IsNullOrWhiteSpace(chart.ValueLabels[r]) - ? chart.ValueLabels[r] - : (r < chart.Values.Count ? chart.Values[r].ToString("G") : "0"); - - rows.Add(new List { cat, val }); - } - } - - return new DataMatrix(headers, rows); - } - - public PdfChartElement ConvertTableToChart(PdfTableElement table, ChartType chartType = ChartType.BarColumn) - { - var matrix = ExtractFromTable(table); - var chart = new PdfChartElement - { - X = table.X, - Y = table.Y, - Width = Math.Max(table.Width, 380), - Height = Math.Max(table.Height, 220), - Title = matrix.Headers.Count > 1 ? $"{matrix.Headers[1]} Analysis" : "Table Data Chart", - ChartType = chartType, - Palette = ChartPalette.CorporateBlue - }; - - // Determine category column (first text column) and numeric columns - int catCol = 0; - var valCols = new List(); - - for (int c = 0; c < matrix.ColumnCount; c++) - { - var type = matrix.InferColumnType(c); - if (type == DataColumnType.Number || type == DataColumnType.Currency || type == DataColumnType.Percentage) - { - valCols.Add(c); - } - } - - if (valCols.Count == 0) - { - valCols = Enumerable.Range(1, Math.Max(0, matrix.ColumnCount - 1)).ToList(); - } - - ApplyToChart(matrix, chart, catCol, valCols); - return chart; - } - - public PdfTableElement ConvertChartToTable(PdfChartElement chart) - { - var matrix = ExtractFromChart(chart); - var table = new PdfTableElement - { - X = chart.X, - Y = chart.Y, - Width = Math.Max(chart.Width, 350), - Height = Math.Max(chart.Height, 35 + (matrix.RowCount * 26)), - HeaderBackgroundHex = "#0F6CBD", - HeaderTextHex = "#FFFFFF", - AlternateRowBackgroundHex = "#F8F9FA", - BorderColorHex = "#E1DFDD" - }; - - ApplyToTable(matrix, table); - return table; - } -} diff --git a/src/PdfEditorApp.Core/Data/DataMatrix.cs b/src/PdfEditorApp.Core/Data/DataMatrix.cs deleted file mode 100644 index fae3360..0000000 --- a/src/PdfEditorApp.Core/Data/DataMatrix.cs +++ /dev/null @@ -1,206 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; -using System.Text.RegularExpressions; - -namespace PdfEditorApp.Core.Data; - -public enum DataColumnType -{ - Text, - Number, - Currency, - Percentage, - Date -} - -public class DataMatrix -{ - public List Headers { get; set; } = new(); - public List> Rows { get; set; } = new(); - - public int ColumnCount => Headers.Count; - public int RowCount => Rows.Count; - - public DataMatrix() - { - } - - public DataMatrix(IEnumerable headers, IEnumerable>? rows = null) - { - Headers = new List(headers); - if (rows != null) - { - foreach (var row in rows) - { - Rows.Add(new List(row)); - } - } - } - - public string GetCellValue(int rowIndex, int colIndex) - { - if (rowIndex < 0 || rowIndex >= Rows.Count) return string.Empty; - var row = Rows[rowIndex]; - if (colIndex < 0 || colIndex >= row.Count) return string.Empty; - return row[colIndex] ?? string.Empty; - } - - public string GetCell(int rowIndex, int colIndex) => GetCellValue(rowIndex, colIndex); - public void SetCell(int rowIndex, int colIndex, string value) => SetCellValue(rowIndex, colIndex, value); - - public void SetCellValue(int rowIndex, int colIndex, string value) - { - while (rowIndex >= Rows.Count) - { - var newRow = new List(); - while (newRow.Count < ColumnCount) newRow.Add(string.Empty); - Rows.Add(newRow); - } - - var targetRow = Rows[rowIndex]; - while (colIndex >= targetRow.Count) - { - targetRow.Add(string.Empty); - } - - targetRow[colIndex] = value; - } - - public List GetColumnValues(int colIndex) - { - var result = new List(RowCount); - for (int r = 0; r < RowCount; r++) - { - result.Add(GetCellValue(r, colIndex)); - } - return result; - } - - public void AddRow(IEnumerable cells) - { - var rowList = new List(cells); - while (rowList.Count < ColumnCount) - { - rowList.Add(string.Empty); - } - Rows.Add(rowList); - } - - public void AddColumn(string header, IEnumerable? initialValues = null) - { - Headers.Add(string.IsNullOrWhiteSpace(header) ? $"Col {ColumnCount + 1}" : header); - var valuesList = initialValues?.ToList(); - - for (int r = 0; r < RowCount; r++) - { - string val = (valuesList != null && r < valuesList.Count) ? valuesList[r] : string.Empty; - Rows[r].Add(val); - } - } - - public void AddColumn(string header, string defaultValue) - { - Headers.Add(string.IsNullOrWhiteSpace(header) ? $"Col {ColumnCount + 1}" : header); - for (int r = 0; r < RowCount; r++) - { - Rows[r].Add(defaultValue ?? string.Empty); - } - } - - public void RemoveRow(int rowIndex) - { - if (rowIndex >= 0 && rowIndex < Rows.Count) - { - Rows.RemoveAt(rowIndex); - } - } - - public void RemoveColumn(int colIndex) - { - if (colIndex >= 0 && colIndex < Headers.Count) - { - Headers.RemoveAt(colIndex); - foreach (var row in Rows) - { - if (colIndex < row.Count) - { - row.RemoveAt(colIndex); - } - } - } - } - - public DataColumnType InferColumnType(int colIndex) - { - if (RowCount == 0) return DataColumnType.Text; - - int numCount = 0; - int currencyCount = 0; - int pctCount = 0; - int dateCount = 0; - int sampleCount = Math.Min(RowCount, 50); - - for (int r = 0; r < sampleCount; r++) - { - string val = GetCellValue(r, colIndex).Trim(); - if (string.IsNullOrEmpty(val)) continue; - - if (val.EndsWith("%") && TryParseNumeric(val.TrimEnd('%'), out _)) - { - pctCount++; - } - else if ((val.StartsWith("$") || val.StartsWith("€") || val.StartsWith("£") || val.StartsWith("¥") || val.StartsWith("₹")) && - TryParseNumeric(val.Substring(1), out _)) - { - currencyCount++; - } - else if (DateTime.TryParse(val, CultureInfo.InvariantCulture, DateTimeStyles.None, out _)) - { - dateCount++; - } - else if (TryParseNumeric(val, out _)) - { - numCount++; - } - } - - if (pctCount > sampleCount * 0.6) return DataColumnType.Percentage; - if (currencyCount > sampleCount * 0.6) return DataColumnType.Currency; - if (dateCount > sampleCount * 0.6) return DataColumnType.Date; - if (numCount > sampleCount * 0.6) return DataColumnType.Number; - - return DataColumnType.Text; - } - - public static bool TryParseNumeric(string? raw, out double result) - { - result = 0; - if (string.IsNullOrWhiteSpace(raw)) return false; - - string sanitized = Regex.Replace(raw.Trim(), @"[$,€£¥₹\s]", ""); - if (sanitized.EndsWith("%")) - { - sanitized = sanitized.TrimEnd('%'); - if (double.TryParse(sanitized, NumberStyles.Any, CultureInfo.InvariantCulture, out var pct)) - { - result = pct; - return true; - } - } - - return double.TryParse(sanitized, NumberStyles.Any, CultureInfo.InvariantCulture, out result) || - double.TryParse(sanitized, NumberStyles.Any, CultureInfo.CurrentCulture, out result); - } - - public DataMatrix Clone() - { - var clone = new DataMatrix(Headers); - foreach (var r in Rows) - { - clone.Rows.Add(new List(r)); - } - return clone; - } -} diff --git a/src/PdfEditorApp.Core/Data/DataMergeEngine.cs b/src/PdfEditorApp.Core/Data/DataMergeEngine.cs deleted file mode 100644 index 943a0e9..0000000 --- a/src/PdfEditorApp.Core/Data/DataMergeEngine.cs +++ /dev/null @@ -1,396 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Text.RegularExpressions; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; - -namespace PdfEditorApp.Core.Data; - -public class DataMergeEngine : IDataMergeEngine -{ - private static readonly Regex PlaceholderRegex = new( - @"\{\{\s*([a-zA-Z0-9_\.\-]+)\s*(?:\:\s*([^\}\?]+?)\s*)?(?:\?\?\s*([^\}]+?)\s*)?\}\}", - RegexOptions.Compiled); - - private static readonly NumberFormatInfo InrNumberFormat = new() - { - NumberGroupSizes = [3, 2], - NumberGroupSeparator = ",", - NumberDecimalSeparator = ".", - NumberDecimalDigits = 2 - }; - - public IReadOnlyList DetectPlaceholders(PdfDocumentModel template) - { - if (template == null) return Array.Empty(); - - var foundTags = new HashSet(StringComparer.OrdinalIgnoreCase); - - void ScanString(string? text) - { - if (string.IsNullOrEmpty(text)) return; - var matches = PlaceholderRegex.Matches(text); - foreach (Match m in matches) - { - if (m.Groups[1].Success) - { - string tag = m.Groups[1].Value.Trim(); - if (!string.IsNullOrEmpty(tag)) - { - foundTags.Add(tag); - } - } - } - } - - // 1. Document Metadata - ScanString(template.Title); - ScanString(template.Author); - ScanString(template.Subject); - ScanString(template.Keywords); - - // 2. Pages - foreach (var page in template.Pages) - { - ScanString(page.HeaderLeft); - ScanString(page.HeaderCenter); - ScanString(page.HeaderRight); - ScanString(page.FooterLeft); - ScanString(page.FooterCenter); - ScanString(page.FooterRight); - - if (page.Watermark != null) - { - ScanString(page.Watermark.Text); - } - - foreach (var element in page.Elements) - { - switch (element) - { - case PdfTextElement textEl: - ScanString(textEl.Text); - if (textEl.Spans != null) - { - foreach (var span in textEl.Spans) - { - ScanString(span.Text); - } - } - ScanString(textEl.TextColorHex); - ScanString(textEl.BackgroundColorHex); - break; - - case PdfQrCodeElement qrEl: - ScanString(qrEl.Content); - ScanString(qrEl.Label); - break; - - case PdfBarcodeElement barEl: - ScanString(barEl.CodeValue); - break; - - case PdfImageElement imgEl: - ScanString(imgEl.ImagePath); - ScanString(imgEl.AltText); - break; - - case PdfTableElement tableEl: - foreach (var header in tableEl.Headers) - { - ScanString(header); - } - foreach (var row in tableEl.Rows) - { - foreach (var cell in row) - { - ScanString(cell); - } - } - break; - - case PdfChartElement chartEl: - ScanString(chartEl.Title); - foreach (var cat in chartEl.Categories) - { - ScanString(cat); - } - break; - - case PdfShapeElement shapeEl: - ScanString(shapeEl.Label); - break; - } - } - } - - return foundTags.OrderBy(t => t).ToList(); - } - - public PdfDocumentModel HydrateDocument(PdfDocumentModel template, IReadOnlyDictionary record, DataMergeOptions? options = null) - { - if (template == null) throw new ArgumentNullException(nameof(template)); - record ??= new Dictionary(); - options ??= new DataMergeOptions(); - - // 1. Deep clone template - var doc = template.Clone(); - - // 2. Hydrate Document Metadata - doc.Title = EvaluateText(doc.Title, record, options); - doc.Author = EvaluateText(doc.Author, record, options); - doc.Subject = EvaluateText(doc.Subject, record, options); - doc.Keywords = EvaluateText(doc.Keywords, record, options); - doc.ModifiedDate = DateTime.Now; - - // 3. Hydrate Pages - foreach (var page in doc.Pages) - { - page.HeaderLeft = EvaluateText(page.HeaderLeft, record, options); - page.HeaderCenter = EvaluateText(page.HeaderCenter, record, options); - page.HeaderRight = EvaluateText(page.HeaderRight, record, options); - page.FooterLeft = EvaluateText(page.FooterLeft, record, options); - page.FooterCenter = EvaluateText(page.FooterCenter, record, options); - page.FooterRight = EvaluateText(page.FooterRight, record, options); - - if (page.Watermark != null) - { - page.Watermark.Text = EvaluateText(page.Watermark.Text, record, options); - } - - foreach (var element in page.Elements) - { - HydrateElement(element, record, options); - } - } - - return doc; - } - - private void HydrateElement(PdfElementBase element, IReadOnlyDictionary record, DataMergeOptions options) - { - switch (element) - { - case PdfTextElement textEl: - textEl.Text = EvaluateText(textEl.Text, record, options); - if (textEl.Spans != null && textEl.Spans.Count > 0) - { - foreach (var span in textEl.Spans) - { - span.Text = EvaluateText(span.Text, record, options); - } - textEl.SynchronizePlainTextFromSpans(); - } - if (textEl.TextColorHex.Contains("{{")) - { - string evaluatedColor = EvaluateText(textEl.TextColorHex, record, options); - if (evaluatedColor.StartsWith("#") && (evaluatedColor.Length == 7 || evaluatedColor.Length == 9)) - { - textEl.TextColorHex = evaluatedColor; - } - } - if (textEl.BackgroundColorHex.Contains("{{")) - { - string evaluatedBg = EvaluateText(textEl.BackgroundColorHex, record, options); - if (evaluatedBg.StartsWith("#") && (evaluatedBg.Length == 7 || evaluatedBg.Length == 9)) - { - textEl.BackgroundColorHex = evaluatedBg; - } - } - break; - - case PdfQrCodeElement qrEl: - qrEl.Content = EvaluateText(qrEl.Content, record, options); - qrEl.Label = EvaluateText(qrEl.Label, record, options); - break; - - case PdfBarcodeElement barEl: - barEl.CodeValue = EvaluateText(barEl.CodeValue, record, options); - break; - - case PdfImageElement imgEl: - if (!string.IsNullOrEmpty(imgEl.ImagePath) && imgEl.ImagePath.Contains("{{")) - { - string resolvedPath = EvaluateText(imgEl.ImagePath, record, options); - imgEl.ImagePath = resolvedPath; - } - if (!string.IsNullOrEmpty(imgEl.Base64Data) && imgEl.Base64Data.Contains("{{")) - { - string resolvedBase64 = EvaluateText(imgEl.Base64Data, record, options); - imgEl.Base64Data = resolvedBase64; - } - imgEl.AltText = EvaluateText(imgEl.AltText, record, options); - break; - - case PdfTableElement tableEl: - for (int h = 0; h < tableEl.Headers.Count; h++) - { - tableEl.Headers[h] = EvaluateText(tableEl.Headers[h], record, options); - } - for (int r = 0; r < tableEl.Rows.Count; r++) - { - var row = tableEl.Rows[r]; - for (int c = 0; c < row.Count; c++) - { - row[c] = EvaluateText(row[c], record, options); - } - } - break; - - case PdfChartElement chartEl: - chartEl.Title = EvaluateText(chartEl.Title, record, options); - for (int i = 0; i < chartEl.Categories.Count; i++) - { - chartEl.Categories[i] = EvaluateText(chartEl.Categories[i], record, options); - } - break; - - case PdfShapeElement shapeEl: - if (!string.IsNullOrEmpty(shapeEl.Label)) - { - shapeEl.Label = EvaluateText(shapeEl.Label, record, options); - } - break; - } - } - - public string EvaluateText(string? templateText, IReadOnlyDictionary record, DataMergeOptions? options = null) - { - if (string.IsNullOrEmpty(templateText)) return string.Empty; - if (!templateText.Contains("{{")) return templateText; - - options ??= new DataMergeOptions(); - - return PlaceholderRegex.Replace(templateText, match => - { - string fieldName = match.Groups[1].Value.Trim(); - string format = match.Groups[2].Success ? match.Groups[2].Value.Trim() : string.Empty; - string fallback = match.Groups[3].Success ? match.Groups[3].Value.Trim() : options.DefaultFallbackValue; - - string? rawValue = FindRecordValue(record, fieldName, options.CaseInsensitiveLookup); - - if (string.IsNullOrEmpty(rawValue)) - { - return !string.IsNullOrEmpty(fallback) - ? fallback - : (options.PreserveUnmatchedPlaceholders ? match.Value : string.Empty); - } - - return FormatValue(rawValue, format); - }); - } - - private static string? FindRecordValue(IReadOnlyDictionary record, string fieldName, bool caseInsensitive) - { - if (record.TryGetValue(fieldName, out var directVal)) - { - return directVal; - } - - if (caseInsensitive) - { - foreach (var kvp in record) - { - if (string.Equals(kvp.Key, fieldName, StringComparison.OrdinalIgnoreCase)) - { - return kvp.Value; - } - - // Also check normalized name (stripping underscores, spaces, dashes) - if (NormalizeFieldName(kvp.Key) == NormalizeFieldName(fieldName)) - { - return kvp.Value; - } - } - } - - return null; - } - - private static string NormalizeFieldName(string name) - { - return Regex.Replace(name.Trim().ToLowerInvariant(), @"[\s_\-\.]", ""); - } - - private static string FormatValue(string rawValue, string format) - { - if (string.IsNullOrEmpty(format)) return rawValue; - - // 1. Case Transforms - switch (format.ToLowerInvariant()) - { - case "upper": - case "uppercase": - return rawValue.ToUpperInvariant(); - - case "lower": - case "lowercase": - return rawValue.ToLowerInvariant(); - - case "title": - case "titlecase": - return CultureInfo.CurrentCulture.TextInfo.ToTitleCase(rawValue.ToLowerInvariant()); - - case "cap": - case "capitalize": - if (rawValue.Length == 0) return rawValue; - return char.ToUpperInvariant(rawValue[0]) + (rawValue.Length > 1 ? rawValue.Substring(1) : ""); - } - - // 2. Currency Formatting: "C", "currency", "currency:INR", "currency:EUR", "$" - if (format.StartsWith("currency", StringComparison.OrdinalIgnoreCase) || - format.Equals("C", StringComparison.OrdinalIgnoreCase) || - format.Equals("$", StringComparison.OrdinalIgnoreCase)) - { - if (DataMatrix.TryParseNumeric(rawValue, out double amount)) - { - if (format.Contains(':')) - { - string currencyCode = format.Split(':')[1].Trim().ToUpperInvariant(); - return currencyCode switch - { - "INR" or "RS" => amount < 0 ? $"-₹{Math.Abs(amount).ToString("N2", InrNumberFormat)}" : $"₹{amount.ToString("N2", InrNumberFormat)}", - "EUR" => amount < 0 ? $"-€{Math.Abs(amount).ToString("N2", CultureInfo.InvariantCulture)}" : $"€{amount.ToString("N2", CultureInfo.InvariantCulture)}", - "GBP" => amount < 0 ? $"-£{Math.Abs(amount).ToString("N2", CultureInfo.InvariantCulture)}" : $"£{amount.ToString("N2", CultureInfo.InvariantCulture)}", - "JPY" => amount < 0 ? $"-¥{Math.Abs(amount).ToString("N0", CultureInfo.InvariantCulture)}" : $"¥{amount.ToString("N0", CultureInfo.InvariantCulture)}", - _ => amount < 0 ? $"-${Math.Abs(amount).ToString("N2", CultureInfo.InvariantCulture)}" : $"${amount.ToString("N2", CultureInfo.InvariantCulture)}" - }; - } - return amount.ToString("C", CultureInfo.CurrentCulture); - } - return rawValue; - } - - // 3. Numeric Formatting: "N0", "N2", "F2", "P1", etc. - if (DataMatrix.TryParseNumeric(rawValue, out double numVal)) - { - try - { - return numVal.ToString(format, CultureInfo.InvariantCulture); - } - catch - { - // Fallback - } - } - - // 4. Date Formatting: "yyyy-MM-dd", "MMM dd, yyyy", "dd/MM/yyyy", etc. - if (DateTime.TryParse(rawValue, CultureInfo.InvariantCulture, DateTimeStyles.None, out var dt) || - DateTime.TryParse(rawValue, CultureInfo.CurrentCulture, DateTimeStyles.None, out dt)) - { - try - { - return dt.ToString(format, CultureInfo.InvariantCulture); - } - catch - { - // Fallback - } - } - - return rawValue; - } -} diff --git a/src/PdfEditorApp.Core/Data/DataSourceService.cs b/src/PdfEditorApp.Core/Data/DataSourceService.cs deleted file mode 100644 index fc7dbaf..0000000 --- a/src/PdfEditorApp.Core/Data/DataSourceService.cs +++ /dev/null @@ -1,536 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Net.Http; -using System.Text; -using System.Text.Json; -using System.Text.RegularExpressions; -using System.Threading; -using System.Threading.Tasks; -using DocumentFormat.OpenXml.Packaging; -using DocumentFormat.OpenXml.Spreadsheet; - -namespace PdfEditorApp.Core.Data; - -public class DataSourceService : IDataSourceService -{ - private static readonly HttpClient SharedHttpClient = new() - { - Timeout = TimeSpan.FromSeconds(20) - }; - - public DataMatrix ParseCsv(string text, char? delimiter = null, bool firstRowIsHeader = true) - { - if (string.IsNullOrWhiteSpace(text)) return new DataMatrix(); - - char actualDelimiter = delimiter ?? DetectDelimiter(text); - var parsedRows = ParseDelimitedText(text, actualDelimiter); - - if (parsedRows.Count == 0) return new DataMatrix(); - - var headers = new List(); - var rows = new List>(); - - int startRow = 0; - int maxCols = parsedRows.Max(r => r.Count); - - if (firstRowIsHeader && parsedRows.Count > 0) - { - var headerRow = parsedRows[0]; - for (int i = 0; i < maxCols; i++) - { - string h = (i < headerRow.Count && !string.IsNullOrWhiteSpace(headerRow[i])) ? headerRow[i].Trim() : $"Column {i + 1}"; - headers.Add(h); - } - startRow = 1; - } - else - { - for (int i = 0; i < maxCols; i++) - { - headers.Add($"Column {i + 1}"); - } - } - - for (int r = startRow; r < parsedRows.Count; r++) - { - var row = parsedRows[r]; - var normalizedRow = new List(); - for (int c = 0; c < maxCols; c++) - { - normalizedRow.Add(c < row.Count ? row[c].Trim() : string.Empty); - } - // Skip entirely empty rows - if (normalizedRow.Any(v => !string.IsNullOrWhiteSpace(v))) - { - rows.Add(normalizedRow); - } - } - - return new DataMatrix(headers, rows); - } - - public DataMatrix ParseTsv(string text, bool firstRowIsHeader = true) - { - return ParseCsv(text, '\t', firstRowIsHeader); - } - - public DataMatrix ParseJson(string jsonText, string? jsonPath = null) - { - if (string.IsNullOrWhiteSpace(jsonText)) return new DataMatrix(); - - using var doc = JsonDocument.Parse(jsonText); - var root = doc.RootElement; - - // Navigate jsonPath if supplied (e.g. "data.items" or "results") - if (!string.IsNullOrWhiteSpace(jsonPath)) - { - var segments = jsonPath.Split('.', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries); - foreach (var segment in segments) - { - if (root.ValueKind == JsonValueKind.Object && root.TryGetProperty(segment, out var child)) - { - root = child; - } - else - { - break; - } - } - } - - // If root is an Object containing an array property (like {"data": [...]}), auto-unwrap the first array - if (root.ValueKind == JsonValueKind.Object) - { - foreach (var prop in root.EnumerateObject()) - { - if (prop.Value.ValueKind == JsonValueKind.Array) - { - root = prop.Value; - break; - } - } - } - - if (root.ValueKind != JsonValueKind.Array) - { - // If single object, treat as 1-row matrix - if (root.ValueKind == JsonValueKind.Object) - { - var headers = new List(); - var row = new List(); - foreach (var prop in root.EnumerateObject()) - { - headers.Add(prop.Name); - row.Add(prop.Value.ToString()); - } - return new DataMatrix(headers, new[] { row }); - } - return new DataMatrix(); - } - - var arrayItems = root.EnumerateArray().ToList(); - if (arrayItems.Count == 0) return new DataMatrix(); - - // Case 1: Array of Objects: [{"colA": 1, "colB": 2}, ...] - if (arrayItems[0].ValueKind == JsonValueKind.Object) - { - var headerSet = new HashSet(); - var headers = new List(); - - // Collect all unique property names across all items - foreach (var item in arrayItems) - { - if (item.ValueKind == JsonValueKind.Object) - { - foreach (var prop in item.EnumerateObject()) - { - if (headerSet.Add(prop.Name)) - { - headers.Add(prop.Name); - } - } - } - } - - var rows = new List>(); - foreach (var item in arrayItems) - { - var row = new List(); - if (item.ValueKind == JsonValueKind.Object) - { - foreach (var h in headers) - { - if (item.TryGetProperty(h, out var val)) - { - row.Add(val.ToString()); - } - else - { - row.Add(string.Empty); - } - } - } - rows.Add(row); - } - - return new DataMatrix(headers, rows); - } - - // Case 2: 2D Array: [["Header1", "Header2"], ["Val1", "Val2"]] - if (arrayItems[0].ValueKind == JsonValueKind.Array) - { - var headers = new List(); - var rows = new List>(); - - var firstRow = arrayItems[0].EnumerateArray().Select(e => e.ToString()).ToList(); - int maxCols = arrayItems.Max(item => item.ValueKind == JsonValueKind.Array ? item.GetArrayLength() : 0); - - for (int i = 0; i < maxCols; i++) - { - headers.Add(i < firstRow.Count && !string.IsNullOrWhiteSpace(firstRow[i]) ? firstRow[i] : $"Column {i + 1}"); - } - - for (int r = 1; r < arrayItems.Count; r++) - { - var item = arrayItems[r]; - var row = new List(); - if (item.ValueKind == JsonValueKind.Array) - { - var cells = item.EnumerateArray().Select(e => e.ToString()).ToList(); - for (int c = 0; c < maxCols; c++) - { - row.Add(c < cells.Count ? cells[c] : string.Empty); - } - } - rows.Add(row); - } - - return new DataMatrix(headers, rows); - } - - // Case 3: 1D Primitive Array: [10, 20, 30, 40] - { - var headers = new List { "Value" }; - var rows = arrayItems.Select(item => new List { item.ToString() }).ToList(); - return new DataMatrix(headers, rows); - } - } - - public List GetExcelSheetNames(Stream stream) - { - var names = new List(); - try - { - using var doc = SpreadsheetDocument.Open(stream, false); - var workbookPart = doc.WorkbookPart; - if (workbookPart?.Workbook?.Sheets != null) - { - foreach (Sheet sheet in workbookPart.Workbook.Sheets.Elements()) - { - if (!string.IsNullOrEmpty(sheet.Name)) - { - names.Add(sheet.Name!); - } - } - } - } - catch - { - // Ignore format errors - } - return names; - } - - public DataMatrix ParseExcel(Stream stream, string? sheetName = null, bool firstRowIsHeader = true) - { - try - { - using var doc = SpreadsheetDocument.Open(stream, false); - var workbookPart = doc.WorkbookPart; - if (workbookPart == null) return new DataMatrix(); - - var sharedStringTable = workbookPart.SharedStringTablePart?.SharedStringTable; - - Sheet? targetSheet = null; - if (!string.IsNullOrEmpty(sheetName)) - { - targetSheet = workbookPart.Workbook?.Sheets?.Elements() - .FirstOrDefault(s => string.Equals(s.Name, sheetName, StringComparison.OrdinalIgnoreCase)); - } - targetSheet ??= workbookPart.Workbook?.Sheets?.Elements().FirstOrDefault(); - - if (targetSheet == null || targetSheet.Id == null) return new DataMatrix(); - - var worksheetPart = (WorksheetPart)workbookPart.GetPartById(targetSheet.Id!); - var sheetData = worksheetPart.Worksheet?.Elements().FirstOrDefault(); - if (sheetData == null) return new DataMatrix(); - - var parsedRows = new List>(); - int maxColIndex = 0; - - foreach (Row row in sheetData.Elements()) - { - var rowCells = new Dictionary(); - foreach (Cell cell in row.Elements()) - { - int colIndex = GetColumnIndexFromCellReference(cell.CellReference?.Value); - string cellValue = GetCellTextValue(cell, sharedStringTable); - rowCells[colIndex] = cellValue; - if (colIndex > maxColIndex) maxColIndex = colIndex; - } - - var rowList = new List(); - for (int c = 0; c <= maxColIndex; c++) - { - rowList.Add(rowCells.TryGetValue(c, out var v) ? v : string.Empty); - } - parsedRows.Add(rowList); - } - - if (parsedRows.Count == 0) return new DataMatrix(); - - // Re-normalize all rows to have uniform column count - int totalCols = maxColIndex + 1; - var headers = new List(); - var rows = new List>(); - int startRow = 0; - - if (firstRowIsHeader && parsedRows.Count > 0) - { - var first = parsedRows[0]; - for (int c = 0; c < totalCols; c++) - { - string h = (c < first.Count && !string.IsNullOrWhiteSpace(first[c])) ? first[c].Trim() : $"Column {c + 1}"; - headers.Add(h); - } - startRow = 1; - } - else - { - for (int c = 0; c < totalCols; c++) - { - headers.Add($"Column {c + 1}"); - } - } - - for (int r = startRow; r < parsedRows.Count; r++) - { - var row = parsedRows[r]; - var normalizedRow = new List(); - for (int c = 0; c < totalCols; c++) - { - normalizedRow.Add(c < row.Count ? row[c] : string.Empty); - } - if (normalizedRow.Any(v => !string.IsNullOrWhiteSpace(v))) - { - rows.Add(normalizedRow); - } - } - - return new DataMatrix(headers, rows); - } - catch (Exception ex) - { - throw new InvalidOperationException($"Failed to parse Excel workbook: {ex.Message}", ex); - } - } - - public async Task FetchFromRestApiAsync( - string url, - Dictionary? headers = null, - string? jsonPath = null, - CancellationToken cancellationToken = default) - { - if (string.IsNullOrWhiteSpace(url)) - { - throw new ArgumentException("REST API URL cannot be empty.", nameof(url)); - } - - if (!url.StartsWith("http://", StringComparison.OrdinalIgnoreCase) && - !url.StartsWith("https://", StringComparison.OrdinalIgnoreCase)) - { - url = "https://" + url; - } - - using var request = new HttpRequestMessage(HttpMethod.Get, url); - request.Headers.Add("User-Agent", "FryPDF-Studio/1.0"); - - if (headers != null) - { - foreach (var kvp in headers) - { - if (!string.IsNullOrWhiteSpace(kvp.Key) && !string.IsNullOrWhiteSpace(kvp.Value)) - { - request.Headers.TryAddWithoutValidation(kvp.Key.Trim(), kvp.Value.Trim()); - } - } - } - - var response = await SharedHttpClient.SendAsync(request, cancellationToken); - response.EnsureSuccessStatusCode(); - - string jsonContent = await response.Content.ReadAsStringAsync(cancellationToken); - return ParseJson(jsonContent, jsonPath); - } - - public string FormatAsCsv(DataMatrix matrix, char delimiter = ',') - { - var sb = new StringBuilder(); - - // Headers - sb.AppendLine(string.Join(delimiter.ToString(), matrix.Headers.Select(h => EscapeCsvField(h, delimiter)))); - - // Rows - foreach (var row in matrix.Rows) - { - var escapedCells = new List(); - for (int c = 0; c < matrix.ColumnCount; c++) - { - string cell = c < row.Count ? row[c] : string.Empty; - escapedCells.Add(EscapeCsvField(cell, delimiter)); - } - sb.AppendLine(string.Join(delimiter.ToString(), escapedCells)); - } - - return sb.ToString(); - } - - private static string EscapeCsvField(string? field, char delimiter) - { - if (string.IsNullOrEmpty(field)) return string.Empty; - if (field.Contains(delimiter) || field.Contains('"') || field.Contains('\n') || field.Contains('\r')) - { - return $"\"{field.Replace("\"", "\"\"")}\""; - } - return field; - } - - private static char DetectDelimiter(string text) - { - var firstFewLines = text.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries).Take(5).ToList(); - if (firstFewLines.Count == 0) return ','; - - int commas = firstFewLines.Sum(l => l.Count(c => c == ',')); - int tabs = firstFewLines.Sum(l => l.Count(c => c == '\t')); - int semicolons = firstFewLines.Sum(l => l.Count(c => c == ';')); - int pipes = firstFewLines.Sum(l => l.Count(c => c == '|')); - - if (tabs > commas && tabs > semicolons && tabs > pipes) return '\t'; - if (semicolons > commas && semicolons > tabs && semicolons > pipes) return ';'; - if (pipes > commas && pipes > tabs && pipes > semicolons) return '|'; - - return ','; - } - - private static List> ParseDelimitedText(string text, char delimiter) - { - var rows = new List>(); - var currentRow = new List(); - var currentCell = new StringBuilder(); - bool inQuotes = false; - - for (int i = 0; i < text.Length; i++) - { - char c = text[i]; - - if (inQuotes) - { - if (c == '"') - { - if (i + 1 < text.Length && text[i + 1] == '"') - { - currentCell.Append('"'); - i++; - } - else - { - inQuotes = false; - } - } - else - { - currentCell.Append(c); - } - } - else - { - if (c == '"') - { - inQuotes = true; - } - else if (c == delimiter) - { - currentRow.Add(currentCell.ToString()); - currentCell.Clear(); - } - else if (c == '\r') - { - if (i + 1 < text.Length && text[i + 1] == '\n') - { - i++; - } - currentRow.Add(currentCell.ToString()); - currentCell.Clear(); - rows.Add(currentRow); - currentRow = new List(); - } - else if (c == '\n') - { - currentRow.Add(currentCell.ToString()); - currentCell.Clear(); - rows.Add(currentRow); - currentRow = new List(); - } - else - { - currentCell.Append(c); - } - } - } - - if (currentCell.Length > 0 || currentRow.Count > 0) - { - currentRow.Add(currentCell.ToString()); - rows.Add(currentRow); - } - - return rows; - } - - private static int GetColumnIndexFromCellReference(string? cellRef) - { - if (string.IsNullOrEmpty(cellRef)) return 0; - int colIndex = 0; - foreach (char c in cellRef) - { - if (char.IsLetter(c)) - { - colIndex = (colIndex * 26) + (char.ToUpperInvariant(c) - 'A' + 1); - } - else break; - } - return Math.Max(0, colIndex - 1); - } - - private static string GetCellTextValue(Cell cell, SharedStringTable? sharedTable) - { - if (cell.CellValue == null) - { - return cell.InnerText ?? string.Empty; - } - - string value = cell.CellValue.Text; - if (cell.DataType != null && cell.DataType.Value == CellValues.SharedString) - { - if (int.TryParse(value, out int sstIndex) && sharedTable != null) - { - var sstItem = sharedTable.Elements().ElementAtOrDefault(sstIndex); - return sstItem?.Text?.Text ?? sstItem?.InnerText ?? value; - } - } - - return value; - } -} diff --git a/src/PdfEditorApp.Core/Data/IBatchPdfGenerator.cs b/src/PdfEditorApp.Core/Data/IBatchPdfGenerator.cs deleted file mode 100644 index eda652a..0000000 --- a/src/PdfEditorApp.Core/Data/IBatchPdfGenerator.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using PdfEditorApp.Core.Models; - -namespace PdfEditorApp.Core.Data; - -public interface IBatchPdfGenerator -{ - /// - /// Executes batch generation across all records in the data matrix, populating the document template and - /// outputting separate PDF files, a single merged multi-page PDF, or a compressed ZIP archive. - /// - Task GenerateBatchAsync( - PdfDocumentModel template, - DataMatrix matrix, - IReadOnlyList? mappings, - BatchGenerationConfig config, - IProgress? progress = null, - CancellationToken cancellationToken = default); -} diff --git a/src/PdfEditorApp.Core/Data/IDataBindingService.cs b/src/PdfEditorApp.Core/Data/IDataBindingService.cs deleted file mode 100644 index 9365e9a..0000000 --- a/src/PdfEditorApp.Core/Data/IDataBindingService.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System.Collections.Generic; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; - -namespace PdfEditorApp.Core.Data; - -public interface IDataBindingService -{ - void ApplyToChart(DataMatrix matrix, PdfChartElement chart, int categoryColIndex = 0, List? valueColIndices = null); - void ApplyToTable(DataMatrix matrix, PdfTableElement table); - DataMatrix ExtractFromTable(PdfTableElement table); - DataMatrix ExtractFromChart(PdfChartElement chart); - PdfChartElement ConvertTableToChart(PdfTableElement table, ChartType chartType = ChartType.BarColumn); - PdfTableElement ConvertChartToTable(PdfChartElement chart); -} diff --git a/src/PdfEditorApp.Core/Data/IDataMergeEngine.cs b/src/PdfEditorApp.Core/Data/IDataMergeEngine.cs deleted file mode 100644 index db8d5b7..0000000 --- a/src/PdfEditorApp.Core/Data/IDataMergeEngine.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System.Collections.Generic; -using PdfEditorApp.Core.Models; - -namespace PdfEditorApp.Core.Data; - -public class DataMergeOptions -{ - public bool CaseInsensitiveLookup { get; set; } = true; - public bool PreserveUnmatchedPlaceholders { get; set; } = false; - public string DefaultFallbackValue { get; set; } = string.Empty; -} - -public interface IDataMergeEngine -{ - /// - /// Scans a PDF document model and returns all unique placeholder tags found (e.g. "EmployeeName", "BasicSalary"). - /// - IReadOnlyList DetectPlaceholders(PdfDocumentModel template); - - /// - /// Clones the template PDF document and replaces all placeholder expressions with data from the record dictionary. - /// Supports Text, QR Codes, Barcodes, Image URLs/Base64, Table cells, Page Headers/Footers, and Document Metadata. - /// - PdfDocumentModel HydrateDocument(PdfDocumentModel template, IReadOnlyDictionary record, DataMergeOptions? options = null); - - /// - /// Evaluates placeholders and format expressions inside a single string. - /// Syntax: {{FieldName}}, {{FieldName:C}}, {{FieldName:yyyy-MM-dd}}, {{FieldName:upper}}, {{FieldName ?? Default}} - /// - string EvaluateText(string templateText, IReadOnlyDictionary record, DataMergeOptions? options = null); -} diff --git a/src/PdfEditorApp.Core/Data/IDataSourceService.cs b/src/PdfEditorApp.Core/Data/IDataSourceService.cs deleted file mode 100644 index b1614d8..0000000 --- a/src/PdfEditorApp.Core/Data/IDataSourceService.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System.Collections.Generic; -using System.IO; -using System.Threading; -using System.Threading.Tasks; - -namespace PdfEditorApp.Core.Data; - -public interface IDataSourceService -{ - DataMatrix ParseCsv(string text, char? delimiter = null, bool firstRowIsHeader = true); - DataMatrix ParseTsv(string text, bool firstRowIsHeader = true); - DataMatrix ParseJson(string jsonText, string? jsonPath = null); - DataMatrix ParseExcel(Stream stream, string? sheetName = null, bool firstRowIsHeader = true); - List GetExcelSheetNames(Stream stream); - Task FetchFromRestApiAsync(string url, Dictionary? headers = null, string? jsonPath = null, CancellationToken cancellationToken = default); - string FormatAsCsv(DataMatrix matrix, char delimiter = ','); -} diff --git a/src/PdfEditorApp.Core/Deconstruction/Extractors/PdfFormExtractor.cs b/src/PdfEditorApp.Core/Deconstruction/Extractors/PdfFormExtractor.cs deleted file mode 100644 index 383c726..0000000 --- a/src/PdfEditorApp.Core/Deconstruction/Extractors/PdfFormExtractor.cs +++ /dev/null @@ -1,108 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using Microsoft.Extensions.Logging; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; -using UglyToad.PdfPig; -using UglyToad.PdfPig.AcroForms; -using UglyToad.PdfPig.AcroForms.Fields; - -namespace PdfEditorApp.Core.Deconstruction.Extractors; - -/// -/// Strongly-typed, reflection-free AcroForms interactive form field extractor. -/// Maps native PdfPig AcroField hierarchy into editable models. -/// -public static class PdfFormExtractor -{ - /// - /// Extracts all AcroForms on the given document/page using strongly-typed patterns without reflection. - /// - public static List ExtractFormFields( - PdfDocument? doc, - int pageNumber, - double pageHeight, - ref int formZIndex, - PdfDeconstructionOptions options, - ILogger? logger = null) - { - var formElements = new List(); - if (doc == null) return formElements; - - try - { - if (doc.TryGetForm(out var form) && form != null && form.Fields != null) - { - foreach (var field in form.Fields) - { - if (!field.Bounds.HasValue || field.Bounds.Value.Width <= 0 || field.Bounds.Value.Height <= 0) - continue; - - var b = field.Bounds.Value; - double fX = Math.Max(0, b.Left); - double fY = Math.Max(0, pageHeight - b.Top); - double fW = Math.Max(20, b.Width); - double fH = Math.Max(14, b.Height); - - string fieldName = field.Information?.PartialName - ?? field.Information?.AlternateName - ?? field.Information?.MappingName - ?? "FormField"; - - string fieldValue = ExtractFieldValue(field); - FormFieldType fieldType = MapFieldType(field); - - // PDF spec 32000-1: bit 1 of FieldFlags is ReadOnly (0x1) - bool isReadOnly = (field.FieldFlags & 1) != 0; - - var formElement = new PdfFormFieldElement - { - X = Math.Round(fX, 1), - Y = Math.Round(fY, 1), - Width = Math.Round(fW, 1), - Height = Math.Round(fH, 1), - FieldName = fieldName, - Value = fieldValue, - DefaultValue = fieldValue, - FieldType = fieldType, - IsReadOnly = isReadOnly, - ZIndex = formZIndex++ - }; - formElements.Add(formElement); - } - } - } - catch (Exception ex) - { - logger?.LogWarning(ex, "Failed to extract AcroForms on page {PageNumber}", pageNumber); - } - - return formElements; - } - - private static string ExtractFieldValue(AcroFieldBase field) - { - return field switch - { - AcroTextField tf => tf.Value ?? string.Empty, - AcroCheckboxField cb => cb.IsChecked ? "true" : "false", - AcroRadioButtonField rb => rb.IsSelected ? "true" : "false", - AcroComboBoxField combo => combo.SelectedOptions.FirstOrDefault() ?? combo.Options.FirstOrDefault()?.ToString() ?? string.Empty, - AcroListBoxField list => list.SelectedOptions.FirstOrDefault() ?? list.Options.FirstOrDefault()?.ToString() ?? string.Empty, - _ => string.Empty - }; - } - - private static FormFieldType MapFieldType(AcroFieldBase field) - { - return field.FieldType switch - { - AcroFieldType.Checkbox => FormFieldType.Checkbox, - AcroFieldType.RadioButton => FormFieldType.Radio, - AcroFieldType.ComboBox or AcroFieldType.ListBox => FormFieldType.Dropdown, - AcroFieldType.Signature => FormFieldType.Signature, - _ => FormFieldType.Text - }; - } -} diff --git a/src/PdfEditorApp.Core/Deconstruction/Extractors/PdfImageExtractor.cs b/src/PdfEditorApp.Core/Deconstruction/Extractors/PdfImageExtractor.cs deleted file mode 100644 index b1c341f..0000000 --- a/src/PdfEditorApp.Core/Deconstruction/Extractors/PdfImageExtractor.cs +++ /dev/null @@ -1,360 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using Microsoft.Extensions.Logging; -using SkiaSharp; -using UglyToad.PdfPig.Content; -using PdfEditorApp.Core.Deconstruction.Utils; -using PdfEditorApp.Core.Models.Elements; - -namespace PdfEditorApp.Core.Deconstruction.Extractors; - -/// -/// High-performance SkiaSharp & PdfPig Image Extraction Subsystem. -/// Decodes DCT/JPEG, JPEG2000, uncompressed CMYK, Grayscale, RGB, and 1-bit monochrome bitmaps. -/// Stores raw binary image bytes directly to avoid Large Object Heap (LOH) string fragmentation. -/// -public static class PdfImageExtractor -{ - /// - /// Extracts images from a pure scanned PDF page (where an image covers most of the page canvas). - /// - public static List ExtractScannedCanvasImages( - IReadOnlyList images, - int pageNumber, - double pageHeight, - ref int bgZIndex, - PdfDeconstructionOptions options, - ILogger? logger = null) - { - var elements = new List(); - - foreach (var img in images) - { - try - { - byte[]? imgBytes = ExtractImageBytes(img, logger); - if (imgBytes != null && imgBytes.Length > 0) - { - double imgX = Math.Max(0, img.BoundingBox.Left); - double imgY = Math.Max(0, pageHeight - img.BoundingBox.Top); - double imgW = Math.Max(10, img.BoundingBox.Width); - double imgH = Math.Max(10, img.BoundingBox.Height); - - var scannedImgElement = new PdfImageElement - { - X = Math.Round(imgX, 1), - Y = Math.Round(imgY, 1), - Width = Math.Round(imgW, 1), - Height = Math.Round(imgH, 1), - ImageData = imgBytes, - ZIndex = bgZIndex++, - IsLocked = false, - CornerRadius = 0, - BorderThickness = 0, - BorderColorHex = "Transparent", - AltText = $"Scanned Page {pageNumber} Canvas" - }; - elements.Add(scannedImgElement); - } - } - catch (Exception ex) - { - logger?.LogWarning(ex, "Failed to extract scanned canvas image on page {PageNumber}", pageNumber); - } - } - - return elements; - } - - /// - /// Extracts embedded images (photos, logos, figures, icons, watermarks) from a born-digital or mixed PDF page. - /// - public static List ExtractEmbeddedImages( - IReadOnlyList images, - int pageNumber, - double pageWidth, - double pageHeight, - bool hasSufficientText, - ref int bgZIndex, - ref int imgZIndex, - PdfDeconstructionOptions options, - ILogger? logger = null) - { - var elements = new List(); - - foreach (var img in images) - { - try - { - double imgW = Math.Max(10, img.BoundingBox.Width); - double imgH = Math.Max(10, img.BoundingBox.Height); - - byte[]? imgBytes = ExtractImageBytes(img, logger); - if (imgBytes != null && imgBytes.Length > 0) - { - double imgX = Math.Max(0, img.BoundingBox.Left); - double imgY = Math.Max(0, pageHeight - img.BoundingBox.Top); - - // Classify full-page background or centered document watermark - bool isFullPageBg = imgW >= pageWidth * options.FullPageBgRatio && - imgH >= pageHeight * options.FullPageBgRatio && - hasSufficientText; - - bool isWatermark = (imgW >= pageWidth * options.WatermarkWidthRatio && - imgH >= pageHeight * options.WatermarkHeightRatio) && - hasSufficientText; - - var imgElement = new PdfImageElement - { - X = Math.Round(imgX, 1), - Y = Math.Round(imgY, 1), - Width = Math.Round(imgW, 1), - Height = Math.Round(imgH, 1), - ImageData = imgBytes, - ZIndex = (isFullPageBg || isWatermark) ? bgZIndex++ : imgZIndex++, - IsLocked = isFullPageBg || isWatermark, - Opacity = isWatermark ? options.WatermarkOpacity : 1.0, - CornerRadius = 0, - BorderThickness = 0, - BorderColorHex = "Transparent", - AltText = (isFullPageBg || isWatermark) - ? $"Watermark Background ({Math.Round(imgW):F0}x{Math.Round(imgH):F0})" - : $"Embedded Image ({Math.Round(imgW):F0}x{Math.Round(imgH):F0})" - }; - elements.Add(imgElement); - } - } - catch (Exception ex) - { - logger?.LogWarning(ex, "Failed to extract embedded image on page {PageNumber}", pageNumber); - } - } - - return elements; - } - - /// - /// Decodes raw PDF image samples into a clean, standardized PNG byte array using SkiaSharp with unsafe pointer optimizations. - /// - public static byte[]? ExtractImageBytes(IPdfImage img, ILogger? logger = null) - { - // 1. Try native PNG extraction from PdfPig - try - { - if (img.TryGetPng(out var pngBytes) && pngBytes != null && pngBytes.Length >= 8) - { - // Verify standard PNG magic header (0x89, 'P', 'N', 'G') - if (pngBytes[0] == 0x89 && pngBytes[1] == 0x50 && pngBytes[2] == 0x4E && pngBytes[3] == 0x47) - { - return pngBytes; - } - } - } - catch (Exception ex) - { - logger?.LogDebug(ex, "PdfPig native TryGetPng failed; proceeding to SkiaSharp multi-format fallback"); - } - - // 2. Try decoding raw image bytes (JPEG / JPEG2000 / WEBP / BMP) via SkiaSharp - try - { - if (!img.RawBytes.IsEmpty && img.RawBytes.Length > 0) - { - var rawArray = img.RawBytes.ToArray(); - using var skData = SKData.CreateCopy(rawArray); - using var skImg = SKImage.FromEncodedData(skData); - if (skImg != null) - { - using var encoded = skImg.Encode(SKEncodedImageFormat.Png, 100); - if (encoded != null && encoded.Size > 0) - { - return encoded.ToArray(); - } - } - - // Check for JPEG direct magic header - if (rawArray.Length > 3 && rawArray[0] == 0xFF && rawArray[1] == 0xD8) - { - using var skBmp = SKBitmap.Decode(rawArray); - if (skBmp != null) - { - using var imgFromBmp = SKImage.FromBitmap(skBmp); - using var encoded = imgFromBmp.Encode(SKEncodedImageFormat.Png, 100); - if (encoded != null && encoded.Size > 0) - { - return encoded.ToArray(); - } - } - } - } - } - catch (Exception ex) - { - logger?.LogDebug(ex, "SkiaSharp encoded stream decode failed; proceeding to raw pixel sample extraction"); - } - - // 3. Raw pixel samples conversion via SkiaSharp using unsafe pointer loops (zero bounds-checking overhead) - try - { - int w = img.WidthInSamples; - int h = img.HeightInSamples; - - if (w > 0 && h > 0 && img.TryGetBytesAsMemory(out var pixelMem) && pixelMem.Length > 0) - { - var rawPixels = pixelMem.ToArray(); - - // Case A: 24-bit RGB (3 bytes per pixel) - if (rawPixels.Length >= w * h * 3) - { - using var bitmap = new SKBitmap(w, h, SKColorType.Rgba8888, SKAlphaType.Opaque); - unsafe - { - byte* dstPtr = (byte*)bitmap.GetPixels().ToPointer(); - fixed (byte* srcPtr = rawPixels) - { - int pixelCount = w * h; - byte* src = srcPtr; - byte* dst = dstPtr; - for (int i = 0; i < pixelCount; i++) - { - dst[0] = src[0]; // R - dst[1] = src[1]; // G - dst[2] = src[2]; // B - dst[3] = 255; // A - src += 3; - dst += 4; - } - } - } - - using var image = SKImage.FromBitmap(bitmap); - using var encoded = image.Encode(SKEncodedImageFormat.Png, 100); - if (encoded != null && encoded.Size > 0) - { - return encoded.ToArray(); - } - } - // Case B: 8-bit Grayscale (1 byte per pixel) - else if (rawPixels.Length >= w * h) - { - using var bitmap = new SKBitmap(w, h, SKColorType.Rgba8888, SKAlphaType.Opaque); - unsafe - { - byte* dstPtr = (byte*)bitmap.GetPixels().ToPointer(); - fixed (byte* srcPtr = rawPixels) - { - int pixelCount = w * h; - byte* src = srcPtr; - byte* dst = dstPtr; - for (int i = 0; i < pixelCount; i++) - { - byte g = *src++; - dst[0] = g; - dst[1] = g; - dst[2] = g; - dst[3] = 255; - dst += 4; - } - } - } - - using var image = SKImage.FromBitmap(bitmap); - using var encoded = image.Encode(SKEncodedImageFormat.Png, 100); - if (encoded != null && encoded.Size > 0) - { - return encoded.ToArray(); - } - } - // Case C: 32-bit CMYK (4 bytes per pixel) - else if (rawPixels.Length >= w * h * 4) - { - using var bitmap = new SKBitmap(w, h, SKColorType.Rgba8888, SKAlphaType.Opaque); - unsafe - { - byte* dstPtr = (byte*)bitmap.GetPixels().ToPointer(); - fixed (byte* srcPtr = rawPixels) - { - int pixelCount = w * h; - byte* src = srcPtr; - byte* dst = dstPtr; - for (int i = 0; i < pixelCount; i++) - { - CmykColorConverter.ConvertCmykToRgb(src[0], src[1], src[2], src[3], out byte r, out byte g, out byte b); - dst[0] = r; - dst[1] = g; - dst[2] = b; - dst[3] = 255; - src += 4; - dst += 4; - } - } - } - - using var image = SKImage.FromBitmap(bitmap); - using var encoded = image.Encode(SKEncodedImageFormat.Png, 100); - if (encoded != null && encoded.Size > 0) - { - return encoded.ToArray(); - } - } - // Case D: 1-bit Monochrome (e.g. stamps, fax/signatures) - else if (img.BitsPerComponent == 1) - { - using var bitmap = new SKBitmap(w, h, SKColorType.Rgba8888, SKAlphaType.Opaque); - unsafe - { - byte* dstPtr = (byte*)bitmap.GetPixels().ToPointer(); - fixed (byte* srcPtr = rawPixels) - { - int rowStride = (w + 7) / 8; - for (int y = 0; y < h; y++) - { - byte* rowSrc = srcPtr + (y * rowStride); - byte* rowDst = dstPtr + (y * w * 4); - for (int x = 0; x < w; x++) - { - int byteIdx = x >> 3; - int bitIdx = 7 - (x & 7); - bool isWhite = ((rowSrc[byteIdx] >> bitIdx) & 1) != 0; - byte val = isWhite ? (byte)255 : (byte)0; - rowDst[0] = val; - rowDst[1] = val; - rowDst[2] = val; - rowDst[3] = 255; - rowDst += 4; - } - } - } - } - - using var image = SKImage.FromBitmap(bitmap); - using var encoded = image.Encode(SKEncodedImageFormat.Png, 100); - if (encoded != null && encoded.Size > 0) - { - return encoded.ToArray(); - } - } - } - } - catch (Exception ex) - { - logger?.LogWarning(ex, "Failed to decode raw pixel sample memory"); - } - - // 4. Raw bytes fallback - try - { - if (!img.RawBytes.IsEmpty && img.RawBytes.Length > 0) - { - return img.RawBytes.ToArray(); - } - } - catch (Exception ex) - { - logger?.LogWarning(ex, "Failed raw bytes fallback for image"); - } - - return null; - } -} diff --git a/src/PdfEditorApp.Core/Deconstruction/Extractors/PdfTextExtractor.cs b/src/PdfEditorApp.Core/Deconstruction/Extractors/PdfTextExtractor.cs deleted file mode 100644 index 7f91abc..0000000 --- a/src/PdfEditorApp.Core/Deconstruction/Extractors/PdfTextExtractor.cs +++ /dev/null @@ -1,160 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using Microsoft.Extensions.Logging; -using UglyToad.PdfPig.Content; -using PdfEditorApp.Core.Analysis; -using PdfEditorApp.Core.Deconstruction.Utils; -using PdfEditorApp.Core.Models.Elements; - -namespace PdfEditorApp.Core.Deconstruction.Extractors; - -/// -/// Subsystem for extracting, clustering, and formatting text elements from PDF pages. -/// Implements WCAG 2.1 relative luminance dynamic contrast protection and card/container grouping. -/// -public static class PdfTextExtractor -{ - /// - /// Clusters raw PDF words into structured paragraphs and maps them to models. - /// - public static List ExtractTextElements( - Page page, - List paragraphs, - HashSet consumedParagraphs, - IReadOnlyList currentElements, - int pageNumber, - double pageWidth, - double pageHeight, - ref int textZIndex, - PdfDeconstructionOptions options, - ILogger? logger = null) - { - var textElements = new List(); - - try - { - var shapeElements = currentElements.OfType().ToList(); - - foreach (var para in paragraphs) - { - if (consumedParagraphs.Contains(para)) continue; // Swallowed by table - if (string.IsNullOrWhiteSpace(para.Text)) continue; - - // Dynamic WCAG Contrast Protection against underlying shape fills - var underlyingShape = shapeElements - .Where(s => s.X <= para.CanvasX + 10 && - s.Y <= para.CanvasY + 10 && - s.X + s.Width >= para.CanvasX + para.CanvasWidth - 10 && - s.Y + s.Height >= para.CanvasY + para.CanvasHeight - 10 && - !string.Equals(s.FillColorHex, "Transparent", StringComparison.OrdinalIgnoreCase)) - .OrderByDescending(s => s.ZIndex) - .FirstOrDefault(); - - string underlyingBgHex = underlyingShape?.FillColorHex ?? "#FFFFFF"; - string finalColor = ColorContrastHelper.EnsureLegibleContrast( - para.ColorHex, - underlyingBgHex, - options.MinContrastRatio, - options.HighContrastDarkTextColor, - options.HighContrastLightTextColor); - - var textElement = new PdfTextElement - { - X = para.CanvasX, - Y = para.CanvasY, - Width = para.CanvasWidth, - Height = para.CanvasHeight, - Text = para.Text, - FontSize = para.FontSize, - FontFamily = para.FontFamily, - IsBold = para.IsBold, - IsItalic = para.IsItalic, - TextColorHex = finalColor, - LineHeight = para.LineHeight, - Rotation = para.Rotation, - Alignment = para.Alignment, - TextWrap = false, - ZIndex = textZIndex++ - }; - - if (para.Spans != null && para.Spans.Count > 1) - { - textElement.Spans = new List(para.Spans.Count); - foreach (var span in para.Spans) - { - var spanClone = span.Clone(); - if (string.Equals(spanClone.TextColorHex, para.ColorHex, StringComparison.OrdinalIgnoreCase)) - { - spanClone.TextColorHex = finalColor; - } - textElement.Spans.Add(spanClone); - } - } - - textElements.Add(textElement); - } - - // Card & Container Box Grouping: Associate background shapes with their contained text - GroupContainersAndText(shapeElements, textElements, options); - } - catch (Exception ex) - { - logger?.LogWarning(ex, "Failed to extract structured text on page {PageNumber}", pageNumber); - - // Fallback: single page text element if unusual encodings prevent grouping - if (textElements.Count == 0 && !string.IsNullOrWhiteSpace(page.Text)) - { - var fallbackText = new PdfTextElement - { - X = 36, - Y = 36, - Width = pageWidth - 72, - Height = pageHeight - 72, - Text = page.Text, - FontSize = 11, - FontFamily = "Arial", - TextColorHex = options.HighContrastDarkTextColor, - ZIndex = textZIndex++ - }; - textElements.Add(fallbackText); - } - } - - return textElements; - } - - /// - /// Groups card/container shapes with their contained text elements by assigning a shared GroupId. - /// - public static void GroupContainersAndText( - List shapeElements, - List textElements, - PdfDeconstructionOptions options) - { - var backgroundShapes = shapeElements - .Where(s => s.Width >= options.MinContainerCardWidth && - s.Height >= options.MinContainerCardHeight && - !string.Equals(s.FillColorHex, "Transparent", StringComparison.OrdinalIgnoreCase)) - .ToList(); - - foreach (var shape in backgroundShapes) - { - var innerTexts = textElements - .Where(t => t.X >= shape.X - 5 && t.Y >= shape.Y - 5 && - t.X + t.Width <= shape.X + shape.Width + 5 && - t.Y + t.Height <= shape.Y + shape.Height + 5) - .ToList(); - - if (innerTexts.Count > 0) - { - string containerGroupId = Guid.NewGuid().ToString("N"); - shape.GroupId = containerGroupId; - foreach (var t in innerTexts) - { - t.GroupId = containerGroupId; - } - } - } - } -} diff --git a/src/PdfEditorApp.Core/Deconstruction/Extractors/PdfVectorExtractor.cs b/src/PdfEditorApp.Core/Deconstruction/Extractors/PdfVectorExtractor.cs deleted file mode 100644 index b6751b4..0000000 --- a/src/PdfEditorApp.Core/Deconstruction/Extractors/PdfVectorExtractor.cs +++ /dev/null @@ -1,264 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using Microsoft.Extensions.Logging; -using UglyToad.PdfPig.Core; -using UglyToad.PdfPig.Graphics; -using PdfEditorApp.Core.Deconstruction.Utils; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; - -namespace PdfEditorApp.Core.Deconstruction.Extractors; - -/// -/// Subsystem for extracting vector graphics, dividers, and background containers from PDF paths. -/// Automatically groups excess micro-paths into a single resolution-independent -/// so no charts, diagrams, or illustrations are dropped. -/// -public static class PdfVectorExtractor -{ - /// - /// Extracts vector shapes, divider lines, and grouped SVG clusters from the page paths. - /// - public static List ExtractVectors( - IReadOnlyList? paths, - HashSet consumedPathIndices, - int pageNumber, - double pageWidth, - double pageHeight, - ref int bgZIndex, - ref int shapeZIndex, - PdfDeconstructionOptions options, - ILogger? logger = null, - UglyToad.PdfPig.PdfDocument? doc = null) - { - var elements = new List(); - if (paths == null || paths.Count == 0) return elements; - - int extractedShapeCount = 0; - var excessPaths = new List(); - - for (int pathIdx = 0; pathIdx < paths.Count; pathIdx++) - { - if (consumedPathIndices.Contains(pathIdx)) continue; // Swallowed by table - - try - { - var path = paths[pathIdx]; - var bbox = path.GetBoundingRectangle(); - if (!bbox.HasValue) continue; - - var b = bbox.Value; - if (b.Width <= 0.5 && b.Height <= 0.5) continue; - - // Ignore full-page border clipping frames - if (b.Width >= pageWidth * 0.98 && b.Height >= pageHeight * 0.98) continue; - - // If we have exceeded the maximum individual shape threshold, accumulate into excess group - if (extractedShapeCount >= options.MaxVectorShapesPerPage) - { - excessPaths.Add(path); - continue; - } - - double canvasX = Math.Max(0, b.Left); - double canvasY = Math.Max(0, pageHeight - b.Top); - double canvasW = Math.Max(1.0, b.Width); - double canvasH = Math.Max(1.0, b.Height); - - string strokeHex = PdfColorHelper.ToHex(path.StrokeColor, doc, "#0F172A"); - string fillHex = path.IsStroked && path.StrokeColor != null ? strokeHex : "#000000"; - if (path.FillColor != null) - { - fillHex = PdfColorHelper.ToHex(path.FillColor, doc, fillHex); - } - - // 1. Check if it's a thin horizontal divider line - if (canvasH <= options.DividerMaxHeight && canvasW >= options.DividerMinWidth) - { - var divider = new PdfDividerElement - { - X = Math.Round(canvasX, 1), - Y = Math.Round(canvasY, 1), - Width = Math.Round(canvasW, 1), - Height = Math.Round(Math.Max(1.0, canvasH), 1), - Thickness = Math.Round(Math.Max(1.0, canvasH), 1), - IsVertical = false, - ColorHex = path.IsStroked ? strokeHex : (path.IsFilled ? fillHex : "#CBD5E1"), - ZIndex = shapeZIndex++ - }; - elements.Add(divider); - extractedShapeCount++; - } - // 2. Check if it's a thin vertical divider line - else if (canvasW <= options.DividerMaxHeight && canvasH >= options.DividerMinWidth) - { - var divider = new PdfDividerElement - { - X = Math.Round(canvasX, 1), - Y = Math.Round(canvasY, 1), - Width = Math.Round(Math.Max(1.0, canvasW), 1), - Height = Math.Round(canvasH, 1), - Thickness = Math.Round(Math.Max(1.0, canvasW), 1), - IsVertical = true, - ColorHex = path.IsStroked ? strokeHex : (path.IsFilled ? fillHex : "#CBD5E1"), - ZIndex = shapeZIndex++ - }; - elements.Add(divider); - extractedShapeCount++; - } - // 3. 2D shape / container / badge - else if (canvasW >= options.MinShapeDimension && canvasH >= options.MinShapeDimension && (path.IsFilled || path.IsStroked)) - { - // Distinguish large background container cards vs foreground shapes - bool isLargeContainer = (canvasW >= options.LargeContainerMinWidth && canvasH >= options.LargeContainerMinHeight) && - (path.IsFilled || (path.IsStroked && !path.IsFilled)); - int targetZIndex = isLargeContainer ? bgZIndex++ : shapeZIndex++; - - bool isSimpleRect = IsSimpleAxisAlignedRectangle(path); - if (isSimpleRect) - { - var shape = new PdfShapeElement - { - X = Math.Round(canvasX, 1), - Y = Math.Round(canvasY, 1), - Width = Math.Round(canvasW, 1), - Height = Math.Round(canvasH, 1), - FillColorHex = path.IsFilled ? fillHex : "Transparent", - StrokeColorHex = path.IsStroked ? strokeHex : "Transparent", - StrokeThickness = path.IsStroked ? Math.Max(1.0, path.LineWidth) : 0, - CornerRadius = 0, - ShapeType = ShapeType.Rectangle, - ZIndex = targetZIndex - }; - elements.Add(shape); - extractedShapeCount++; - } - else - { - // Complex polygon, L-bracket, curve, or path with cutouts: - // Preserve exact geometry and transparent cutouts as a native vector CustomSvgPath shape - string pathData = SvgPathBuilder.BuildPathData(path, canvasX, canvasY, pageHeight); - if (!string.IsNullOrWhiteSpace(pathData)) - { - var shape = new PdfShapeElement - { - X = Math.Round(canvasX, 1), - Y = Math.Round(canvasY, 1), - Width = Math.Round(canvasW, 1), - Height = Math.Round(canvasH, 1), - FillColorHex = path.IsFilled ? fillHex : "Transparent", - StrokeColorHex = path.IsStroked ? strokeHex : "Transparent", - StrokeThickness = path.IsStroked ? Math.Max(1.0, path.LineWidth) : 0, - CornerRadius = 0, - ShapeType = ShapeType.CustomSvgPath, - CustomPathData = pathData.Trim(), - ZIndex = targetZIndex - }; - elements.Add(shape); - extractedShapeCount++; - } - } - } - } - catch (Exception ex) - { - logger?.LogDebug(ex, "Failed to process vector path {PathIndex} on page {PageNumber}", pathIdx, pageNumber); - } - } - - // Group excess vector paths into a single SVG element to guarantee zero data loss - if (options.GroupExcessVectorsAsSvg && excessPaths.Count > 0) - { - try - { - double minX = double.MaxValue; - double minY = double.MaxValue; - double maxX = double.MinValue; - double maxY = double.MinValue; - - foreach (var p in excessPaths) - { - var bbox = p.GetBoundingRectangle(); - if (bbox.HasValue) - { - var b = bbox.Value; - double cX = Math.Max(0, b.Left); - double cY = Math.Max(0, pageHeight - b.Top); - minX = Math.Min(minX, cX); - minY = Math.Min(minY, cY); - maxX = Math.Max(maxX, cX + b.Width); - maxY = Math.Max(maxY, cY + b.Height); - } - } - - if (minX < maxX && minY < maxY) - { - double groupW = Math.Max(10, maxX - minX); - double groupH = Math.Max(10, maxY - minY); - string svgMarkup = SvgPathBuilder.BuildSvgFromPaths(excessPaths, minX, minY, groupW, groupH, pageHeight, doc); - - var svgElement = new PdfSvgElement - { - X = Math.Round(minX, 1), - Y = Math.Round(minY, 1), - Width = Math.Round(groupW, 1), - Height = Math.Round(groupH, 1), - SvgSource = svgMarkup, - PresetName = "VectorIllustrationCluster", - ZIndex = shapeZIndex++ - }; - elements.Add(svgElement); - } - } - catch (Exception ex) - { - logger?.LogWarning(ex, "Failed to group excess vector paths on page {PageNumber}", pageNumber); - } - } - - return elements; - } - - /// - /// Evaluates whether a raw PDF vector path is a simple 4-corner axis-aligned rectangle. - /// If not (e.g. L-shaped borders, triangles, polygons with cutouts, curves), it must be preserved - /// as a resolution-independent SVG rather than flattened into an occluding solid box. - /// - public static bool IsSimpleAxisAlignedRectangle(PdfPath path) - { - if (path.Count != 1) return false; - var subpath = path[0]; - if (subpath.Commands == null) return false; - if (subpath.Commands.Any(c => c is PdfSubpath.BezierCurve)) return false; - - var lines = subpath.Commands.OfType().ToList(); - if (lines.Count != 3 && lines.Count != 4) return false; - - var moves = subpath.Commands.OfType().ToList(); - if (moves.Count != 1) return false; - - var pts = new List { moves[0].Location }; - foreach (var l in lines) pts.Add(l.To); - - for (int i = 0; i < pts.Count - 1; i++) - { - double dx = Math.Abs(pts[i].X - pts[i + 1].X); - double dy = Math.Abs(pts[i].Y - pts[i + 1].Y); - if (dx > 0.1 && dy > 0.1) return false; - } - - var bbox = path.GetBoundingRectangle(); - if (!bbox.HasValue) return false; - var b = bbox.Value; - - foreach (var pt in pts) - { - bool nearCorner = (Math.Abs(pt.X - b.Left) < 0.5 || Math.Abs(pt.X - b.Right) < 0.5) && - (Math.Abs(pt.Y - b.Bottom) < 0.5 || Math.Abs(pt.Y - b.Top) < 0.5); - if (!nearCorner) return false; - } - - return true; - } -} diff --git a/src/PdfEditorApp.Core/Deconstruction/PdfDeconstructionEngine.cs b/src/PdfEditorApp.Core/Deconstruction/PdfDeconstructionEngine.cs deleted file mode 100644 index cdd5c60..0000000 --- a/src/PdfEditorApp.Core/Deconstruction/PdfDeconstructionEngine.cs +++ /dev/null @@ -1,258 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using Microsoft.Extensions.Logging; -using UglyToad.PdfPig; -using UglyToad.PdfPig.Content; -using PdfEditorApp.Core.Analysis; -using PdfEditorApp.Core.Deconstruction.Extractors; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Utils; - -namespace PdfEditorApp.Core.Deconstruction; - -/// -/// Professional PDF Deconstruction Engine (Adobe Acrobat & Wondershare PDFelement Architecture). -/// Orchestrates modular extractors to parse any standard or complex PDF into clean, editable, multi-layered document models. -/// -public static class PdfDeconstructionEngine -{ - /// - /// Deconstructs a binary PDF stream into a fully editable . - /// If the PDF contains an embedded FryPDF native model, restores it losslessly. - /// Otherwise, performs intelligent deconstruction using default options. - /// - public static PdfDocumentModel Deconstruct( - byte[] pdfBytes, - string title = "Imported_Document.pdf", - string? password = null) - { - return Deconstruct(pdfBytes, PdfDeconstructionOptions.Default, null, title, password); - } - - /// - /// Deconstructs a binary PDF stream with custom options and diagnostic logging. - /// - public static PdfDocumentModel Deconstruct( - byte[] pdfBytes, - PdfDeconstructionOptions options, - ILogger? logger = null, - string title = "Imported_Document.pdf", - string? password = null) - { - // 1. Check if the PDF contains an embedded native FryPDF project model for 100% lossless roundtrip - if (FryPdfEmbeddingHelper.TryExtractEmbeddedModel(pdfBytes, out var embeddedModel) && embeddedModel != null) - { - if (!string.IsNullOrWhiteSpace(title) && string.Equals(embeddedModel.Title, "Untitled.pdf", StringComparison.OrdinalIgnoreCase)) - { - embeddedModel.Title = title; - } - return embeddedModel; - } - - byte[] sanitized = PdfDocumentSanitizer.SanitizePdfBytes(pdfBytes); - - var parsingOptions = new ParsingOptions(); - if (!string.IsNullOrEmpty(password)) - { - parsingOptions.Password = password; - } - - PdfDocument? doc = null; - try - { - doc = PdfDocument.Open(sanitized, parsingOptions); - } - catch (Exception ex) - { - logger?.LogDebug(ex, "Primary PDF open failed; attempting salvage and repair"); - try - { - byte[] repaired = PdfDocumentSanitizer.SalvageAndRepairPdfBytes(sanitized); - doc = PdfDocument.Open(repaired, parsingOptions); - } - catch - { - doc = PdfDocument.Open(pdfBytes, parsingOptions); - } - } - - using (doc) - { - return DeconstructDocument(doc, title, options, logger); - } - } - - /// - /// Deconstructs an opened PdfPig document into a structured . - /// - public static PdfDocumentModel DeconstructDocument( - PdfDocument doc, - string defaultTitle, - PdfDeconstructionOptions? options = null, - ILogger? logger = null) - { - options ??= PdfDeconstructionOptions.Default; - - var model = new PdfDocumentModel - { - Title = string.IsNullOrWhiteSpace(doc.Information.Title) ? defaultTitle : doc.Information.Title, - Author = doc.Information.Author ?? "Unknown Author", - Subject = doc.Information.Subject ?? "Imported PDF Document", - Keywords = doc.Information.Keywords ?? "", - Creator = string.IsNullOrWhiteSpace(doc.Information.Creator) ? "FryPDF" : doc.Information.Creator, - Producer = string.IsNullOrWhiteSpace(doc.Information.Producer) ? "codefrydev.in" : doc.Information.Producer, - CreatedDate = DateTime.Now, - ModifiedDate = DateTime.Now - }; - - int totalPages = doc.NumberOfPages; - for (int pageNum = 1; pageNum <= totalPages; pageNum++) - { - var page = doc.GetPage(pageNum); - var pageModel = DeconstructPage(page, pageNum, doc, options, logger); - model.Pages.Add(pageModel); - } - - return model; - } - - /// - /// Deconstructs an individual PDF page into vector shapes, images, grouped text paragraphs, and form fields. - /// - public static PdfPageModel DeconstructPage( - Page page, - int pageNumber, - PdfDocument? doc = null, - PdfDeconstructionOptions? options = null, - ILogger? logger = null) - { - options ??= PdfDeconstructionOptions.Default; - - double pageWidth = Math.Max(100.0, page.Width); - double pageHeight = Math.Max(100.0, page.Height); - - var pageModel = new PdfPageModel - { - PageNumber = pageNumber, - Width = pageWidth, - Height = pageHeight, - Format = DeterminePageFormat(pageWidth, pageHeight), - Orientation = pageWidth > pageHeight ? PageOrientation.Landscape : PageOrientation.Portrait, - RotationAngle = (int)page.Rotation.Value, - BackgroundColorHex = "#FFFFFF", - ShowHeaderFooter = false - }; - - int bgZIndex = options.InitialBgZIndex; - int imgZIndex = options.InitialImgZIndex; - int tableZIndex = options.InitialTableZIndex; - int shapeZIndex = options.InitialShapeZIndex; - int textZIndex = options.InitialTextZIndex; - int formZIndex = options.InitialFormZIndex; - - var words = page.GetWords() - .Where(w => !string.IsNullOrWhiteSpace(w.Text)) - .ToList(); - - var images = page.GetImages().ToList(); - - // 1. Detect page type: - // - Pure scanned: image covers >= threshold of page AND <= max word count - // - Born-digital / Mixed: has both digital text and images/vectors - bool hasMassiveImageCover = images.Any(img => - img.BoundingBox.Width >= pageWidth * options.PureScannedImageCoverageThreshold && - img.BoundingBox.Height >= pageHeight * options.PureScannedImageCoverageThreshold); - - bool isPureScanned = words.Count <= options.PureScannedWordCountMax && images.Count > 0 && hasMassiveImageCover; - bool hasSufficientText = words.Count > options.PureScannedWordCountMax; - - if (isPureScanned) - { - // Pure Scanned Page Mode: Extract high-res image as base canvas layer - var scannedImages = PdfImageExtractor.ExtractScannedCanvasImages(images, pageNumber, pageHeight, ref bgZIndex, options, logger); - pageModel.Elements.AddRange(scannedImages); - } - else - { - // Born-Digital / Mixed Document Mode: - pageModel.BackgroundColorHex = "#FFFFFF"; - - // A. Extract Embedded Images (Photos, Logos, Figures, Icons, Watermarks) - var embeddedImages = PdfImageExtractor.ExtractEmbeddedImages( - images, pageNumber, pageWidth, pageHeight, hasSufficientText, ref bgZIndex, ref imgZIndex, options, logger); - pageModel.Elements.AddRange(embeddedImages); - - // B. Extract and Cluster Text Paragraphs - var paragraphs = new List(); - try - { - bool isLandscape = pageWidth > pageHeight; - double colGapMultiplier = isLandscape ? options.ColumnGapMultiplierLandscape : options.ColumnGapMultiplierPortrait; - paragraphs = PdfLayoutAnalyzer.AnalyzeAndGroupPageText(page, pageHeight, colGapMultiplier); - } - catch (Exception ex) - { - logger?.LogWarning(ex, "Failed to analyze page text layout on page {PageNumber}", pageNumber); - } - - // C. Detect Structured Tables from intersecting vector lines and cell alignments - var consumedPathIndices = new HashSet(); - var consumedParagraphs = new HashSet(); - - try - { - var detectedTables = TableGridDetector.DetectTables(page.Paths, paragraphs, pageWidth, pageHeight); - foreach (var tableResult in detectedTables) - { - tableResult.TableElement.ZIndex = tableZIndex++; - pageModel.Elements.Add(tableResult.TableElement); - - foreach (var idx in tableResult.ConsumedPathIndices) - consumedPathIndices.Add(idx); - - foreach (var para in tableResult.ConsumedParagraphs) - consumedParagraphs.Add(para); - } - } - catch (Exception ex) - { - logger?.LogWarning(ex, "Failed to detect tables on page {PageNumber}", pageNumber); - } - - // D. Extract Vector Paths & Geometric Shapes (Dividers, Rectangles, Borders, SVG Clusters) - var vectorElements = PdfVectorExtractor.ExtractVectors( - page.Paths, consumedPathIndices, pageNumber, pageWidth, pageHeight, ref bgZIndex, ref shapeZIndex, options, logger, doc); - pageModel.Elements.AddRange(vectorElements); - - // E. Add Unconsumed Text Elements with Dynamic Contrast and Container Grouping - var textElements = PdfTextExtractor.ExtractTextElements( - page, paragraphs, consumedParagraphs, pageModel.Elements, pageNumber, pageWidth, pageHeight, ref textZIndex, options, logger); - pageModel.Elements.AddRange(textElements); - } - - // 3. Extract AcroForm Form Fields (Text Boxes, Checkboxes, Signatures, Dropdowns) - var formElements = PdfFormExtractor.ExtractFormFields(doc, pageNumber, pageHeight, ref formZIndex, options, logger); - pageModel.Elements.AddRange(formElements); - - return pageModel; - } - - /// - /// Determines standard page format (A4, Letter, Legal, A3, A5) based on physical point dimensions. - /// - public static PageFormat DeterminePageFormat(double width, double height) - { - double maxDim = Math.Max(width, height); - double minDim = Math.Min(width, height); - - if (Math.Abs(minDim - 595.28) < 20 && Math.Abs(maxDim - 841.89) < 20) return PageFormat.A4; - if (Math.Abs(minDim - 612.0) < 20 && Math.Abs(maxDim - 792.0) < 20) return PageFormat.Letter; - if (Math.Abs(minDim - 612.0) < 20 && Math.Abs(maxDim - 1008.0) < 20) return PageFormat.Legal; - if (Math.Abs(minDim - 841.89) < 30 && Math.Abs(maxDim - 1190.55) < 30) return PageFormat.A3; - if (Math.Abs(minDim - 419.53) < 20 && Math.Abs(maxDim - 595.28) < 20) return PageFormat.A5; - if (Math.Abs(minDim - 2592.0) < 50 && Math.Abs(maxDim - 3456.0) < 50) return PageFormat.Poster; - - return PageFormat.A4; - } -} diff --git a/src/PdfEditorApp.Core/Deconstruction/PdfDeconstructionOptions.cs b/src/PdfEditorApp.Core/Deconstruction/PdfDeconstructionOptions.cs deleted file mode 100644 index 149b49e..0000000 --- a/src/PdfEditorApp.Core/Deconstruction/PdfDeconstructionOptions.cs +++ /dev/null @@ -1,89 +0,0 @@ -namespace PdfEditorApp.Core.Deconstruction; - -/// -/// Configurable options and geometric/typographic heuristics for the PDF Deconstruction Engine. -/// Replaces hardcoded magic numbers and enables tuning for diverse document archetypes (e.g. scanned IDs, textbooks, reports, forms). -/// -public class PdfDeconstructionOptions -{ - /// Default singleton instance with production-tuned heuristics. - public static PdfDeconstructionOptions Default => new(); - - /// Minimum percentage of page area an image must occupy to be classified as a scanned page canvas (0.0..1.0). - public double PureScannedImageCoverageThreshold { get; set; } = 0.85; - - /// Maximum digital word count on a page to still treat it as a pure scanned document. - public int PureScannedWordCountMax { get; set; } = 5; - - /// Minimum width percentage for an image to be classified as a document watermark (0.0..1.0). - public double WatermarkWidthRatio { get; set; } = 0.65; - - /// Minimum height percentage for an image to be classified as a document watermark (0.0..1.0). - public double WatermarkHeightRatio { get; set; } = 0.55; - - /// Opacity applied to detected watermark images (0.0..1.0). - public double WatermarkOpacity { get; set; } = 0.10; - - /// Minimum width and height ratio for an image to be considered a full-page background underlay. - public double FullPageBgRatio { get; set; } = 0.88; - - /// Minimum width in points for a filled vector rectangle to be considered a background container card. - public double LargeContainerMinWidth { get; set; } = 120.0; - - /// Minimum height in points for a filled vector rectangle to be considered a background container card. - public double LargeContainerMinHeight { get; set; } = 80.0; - - /// Maximum height in points for a vector path to be categorized as a horizontal divider line. - public double DividerMaxHeight { get; set; } = 3.5; - - /// Minimum width in points for a vector path to be categorized as a horizontal divider line. - public double DividerMinWidth { get; set; } = 6.0; - - /// Maximum number of individual vector shapes extracted before grouping remaining excess micro-paths into a combined SVG. - public int MaxVectorShapesPerPage { get; set; } = 1000; - - /// Whether to group vector paths exceeding into a single instead of dropping them. - public bool GroupExcessVectorsAsSvg { get; set; } = true; - - /// Minimum dimension (width and height in points) for a vector shape to be extracted as a standalone element. - public double MinShapeDimension { get; set; } = 2.0; - - /// Minimum width in points for card/container grouping with inner text elements. - public double MinContainerCardWidth { get; set; } = 60.0; - - /// Minimum height in points for card/container grouping with inner text elements. - public double MinContainerCardHeight { get; set; } = 30.0; - - /// Default high-contrast text color hex when contrast against background shape is insufficient. - public string HighContrastDarkTextColor { get; set; } = "#0F172A"; - - /// Default high-contrast light text color hex when contrast against dark background shape is insufficient. - public string HighContrastLightTextColor { get; set; } = "#FFFFFF"; - - /// Minimum WCAG relative luminance contrast ratio before dynamic text contrast adjustment is applied. - public double MinContrastRatio { get; set; } = 1.25; - - /// Column gap multiplier for landscape layout analysis. - public double ColumnGapMultiplierLandscape { get; set; } = 1.5; - - /// Column gap multiplier for portrait layout analysis. - public double ColumnGapMultiplierPortrait { get; set; } = 1.0; - - /// Initial Z-index for background container cards and full-page watermarks. - public int InitialBgZIndex { get; set; } = 0; - - /// Initial Z-index for content images (photos, QR codes, emblems, logos). - public int InitialImgZIndex { get; set; } = 100; - - /// Initial Z-index for structured tables and data grids. - public int InitialTableZIndex { get; set; } = 500; - - /// Initial Z-index for foreground vector shapes, badges, and divider lines. - public int InitialShapeZIndex { get; set; } = 600; - - /// Initial Z-index for text paragraphs and headings. - public int InitialTextZIndex { get; set; } = 1000; - - /// Initial Z-index for interactive AcroForm form fields. - public int InitialFormZIndex { get; set; } = 2000; -} diff --git a/src/PdfEditorApp.Core/Deconstruction/Utils/CmykColorConverter.cs b/src/PdfEditorApp.Core/Deconstruction/Utils/CmykColorConverter.cs deleted file mode 100644 index 74197b9..0000000 --- a/src/PdfEditorApp.Core/Deconstruction/Utils/CmykColorConverter.cs +++ /dev/null @@ -1,30 +0,0 @@ -using System; - -namespace PdfEditorApp.Core.Deconstruction.Utils; - -/// -/// High-precision CMYK-to-sRGB colorimetric conversion engine. -/// Provides ink density adjustments and black point compensation to eliminate washed-out colors. -/// -public static class CmykColorConverter -{ - /// - /// Converts CMYK byte channels (0..255) to calibrated sRGB byte channels (0..255). - /// - public static void ConvertCmykToRgb(byte cByte, byte mByte, byte yByte, byte kByte, out byte rByte, out byte gByte, out byte bByte) - { - float c = cByte / 255f; - float m = mByte / 255f; - float y = yByte / 255f; - float k = kByte / 255f; - - // Subtractive CMYK color model with black point compensation - float r = (1f - c) * (1f - k); - float g = (1f - m) * (1f - k); - float b = (1f - y) * (1f - k); - - rByte = (byte)Math.Clamp((int)Math.Round(r * 255f), 0, 255); - gByte = (byte)Math.Clamp((int)Math.Round(g * 255f), 0, 255); - bByte = (byte)Math.Clamp((int)Math.Round(b * 255f), 0, 255); - } -} diff --git a/src/PdfEditorApp.Core/Deconstruction/Utils/ColorContrastHelper.cs b/src/PdfEditorApp.Core/Deconstruction/Utils/ColorContrastHelper.cs deleted file mode 100644 index c44f343..0000000 --- a/src/PdfEditorApp.Core/Deconstruction/Utils/ColorContrastHelper.cs +++ /dev/null @@ -1,121 +0,0 @@ -using System; -using System.Globalization; - -namespace PdfEditorApp.Core.Deconstruction.Utils; - -/// -/// WCAG 2.1 compliant color luminance and contrast calculation helper. -/// Used to dynamically protect text readability against arbitrary background shapes and cards. -/// -public static class ColorContrastHelper -{ - /// - /// Calculates the relative luminance of a given hex color according to WCAG 2.1 guidelines. - /// Returns a value between 0.0 (darkest black) and 1.0 (lightest white). - /// - public static double GetRelativeLuminance(string hexColor) - { - if (!TryParseRgb(hexColor, out byte r, out byte g, out byte b)) - { - // Default to white canvas luminance - return 1.0; - } - - double rLin = Linearize(r / 255.0); - double gLin = Linearize(g / 255.0); - double bLin = Linearize(b / 255.0); - - return 0.2126 * rLin + 0.7152 * gLin + 0.0722 * bLin; - } - - /// - /// Calculates the WCAG contrast ratio between two colors. - /// Result ranges from 1:1 (no contrast) to 21:1 (maximum contrast, e.g. pure black on pure white). - /// - public static double GetContrastRatio(string color1Hex, string color2Hex) - { - double l1 = GetRelativeLuminance(color1Hex); - double l2 = GetRelativeLuminance(color2Hex); - - double lighter = Math.Max(l1, l2); - double darker = Math.Min(l1, l2); - - return (lighter + 0.05) / (darker + 0.05); - } - - /// - /// Evaluates the contrast of text color against an underlying background color. - /// If the contrast ratio is below , dynamically adjusts the text color - /// to either or depending on background luminance. - /// - public static string EnsureLegibleContrast( - string textColorHex, - string backgroundColorHex, - double minContrastRatio = 3.0, - string darkFallback = "#0F172A", - string lightFallback = "#FFFFFF") - { - if (string.IsNullOrWhiteSpace(backgroundColorHex) || - string.Equals(backgroundColorHex, "Transparent", StringComparison.OrdinalIgnoreCase)) - { - backgroundColorHex = "#FFFFFF"; - } - - double contrast = GetContrastRatio(textColorHex, backgroundColorHex); - if (contrast >= minContrastRatio) - { - return textColorHex; - } - - double bgLuminance = GetRelativeLuminance(backgroundColorHex); - return bgLuminance > 0.5 ? darkFallback : lightFallback; - } - - public static bool TryParseRgb(string? hex, out byte r, out byte g, out byte b) - { - r = g = b = 0; - if (string.IsNullOrWhiteSpace(hex)) return false; - - string clean = hex.Trim().TrimStart('#'); - if (string.Equals(clean, "Transparent", StringComparison.OrdinalIgnoreCase)) - { - return false; - } - - if (clean.Length == 3) - { - if (byte.TryParse(new string(clean[0], 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out r) && - byte.TryParse(new string(clean[1], 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out g) && - byte.TryParse(new string(clean[2], 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out b)) - { - return true; - } - } - else if (clean.Length == 6) - { - if (byte.TryParse(clean.Substring(0, 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out r) && - byte.TryParse(clean.Substring(2, 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out g) && - byte.TryParse(clean.Substring(4, 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out b)) - { - return true; - } - } - else if (clean.Length == 8) - { - // AARRGGBB or RRGGBBAA -> treat as AARRGGBB standard - if (byte.TryParse(clean.Substring(2, 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out r) && - byte.TryParse(clean.Substring(4, 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out g) && - byte.TryParse(clean.Substring(6, 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out b)) - { - return true; - } - } - - return false; - } - - private static double Linearize(double val) - { - return val <= 0.04045 ? val / 12.92 : Math.Pow((val + 0.055) / 1.055, 2.4); - } -} diff --git a/src/PdfEditorApp.Core/Deconstruction/Utils/PdfColorHelper.cs b/src/PdfEditorApp.Core/Deconstruction/Utils/PdfColorHelper.cs deleted file mode 100644 index bcc2e1d..0000000 --- a/src/PdfEditorApp.Core/Deconstruction/Utils/PdfColorHelper.cs +++ /dev/null @@ -1,190 +0,0 @@ -using System; -using UglyToad.PdfPig; -using UglyToad.PdfPig.Core; -using UglyToad.PdfPig.Graphics.Colors; -using UglyToad.PdfPig.Tokens; - -namespace PdfEditorApp.Core.Deconstruction.Utils; - -/// -/// Robust color conversion utility for converting arbitrary PdfPig IColor instances -/// (RGB, CMYK, Gray, Pattern, Separation, DeviceN) into standard #RRGGBB hex strings. -/// Prevents unhandled exceptions from crashing the deconstruction engine on complex color spaces. -/// -public static class PdfColorHelper -{ - /// - /// Converts any PdfPig IColor to a standard #RRGGBB hex string. - /// Never throws; returns if the color cannot be evaluated. - /// - public static string ToHex(IColor? color, PdfDocument? doc = null, string fallbackHex = "#0F172A") - { - if (color == null) return fallbackHex; - - try - { - // 1. Handle Pattern colors (Tiling & Shading) - if (color is PatternColor pat) - { - string? patHex = TryExtractPatternHex(pat, doc); - if (!string.IsNullOrEmpty(patHex)) - { - return patHex; - } - return fallbackHex; - } - - // 2. Standard direct conversion (RGB, CMYK, Gray, DeviceN) - var (r, g, b) = color.ToRGBValues(); - int rI = Math.Clamp((int)Math.Round(r * 255.0), 0, 255); - int gI = Math.Clamp((int)Math.Round(g * 255.0), 0, 255); - int bI = Math.Clamp((int)Math.Round(b * 255.0), 0, 255); - - return $"#{rI:X2}{gI:X2}{bI:X2}"; - } - catch - { - return fallbackHex; - } - } - - /// - /// Recursively extracts dominant/representative RGB color from pattern dictionaries and shading functions. - /// - private static string? TryExtractPatternHex(PatternColor pat, PdfDocument? doc) - { - if (pat is TilingPatternColor tp && tp.Resources != null && doc != null) - { - var hex = TryExtractHexFromResources(tp.Resources, doc); - if (hex != null) return hex; - } - - // Return a vibrant blue hero banner fallback for tiling pattern backgrounds - return "#2563EB"; - } - - private static string? TryExtractHexFromResources(DictionaryToken resDict, PdfDocument doc) - { - try - { - // 1. Check direct Shading in resources - if (resDict.TryGet(NameToken.Shading, out var shDict)) - { - foreach (var kvp in shDict.Data) - { - var hex = ExtractHexFromShadingToken(kvp.Value, doc); - if (hex != null) return hex; - } - } - - // 2. Check XObject (Forms) in resources - if (resDict.TryGet(NameToken.Xobject, out var xobjDict)) - { - foreach (var kvp in xobjDict.Data) - { - DictionaryToken? formRes = null; - if (kvp.Value is IndirectReferenceToken irt) - { - var formObj = doc.Structure.GetObject(irt.Data); - if (formObj?.Data is StreamToken st && st.StreamDictionary.TryGet(NameToken.Resources, out var r)) - { - formRes = r; - } - else if (formObj?.Data is StreamToken st2 && - st2.StreamDictionary.Data.TryGetValue(NameToken.Resources, out var rToken) && - rToken is IndirectReferenceToken rIrt) - { - formRes = doc.Structure.GetObject(rIrt.Data)?.Data as DictionaryToken; - } - } - - if (formRes != null) - { - var hex = TryExtractHexFromResources(formRes, doc); - if (hex != null) return hex; - } - } - } - } - catch - { - // Suppress and return null to trigger fallback - } - - return null; - } - - private static string? ExtractHexFromShadingToken(IToken token, PdfDocument doc) - { - DictionaryToken? shData = null; - if (token is IndirectReferenceToken irt) - { - shData = doc.Structure.GetObject(irt.Data)?.Data as DictionaryToken; - } - else if (token is DictionaryToken dt) - { - shData = dt; - } - - if (shData != null && shData.TryGet(NameToken.Function, out var fnDict)) - { - return ExtractColorFromFunctionDict(fnDict, doc); - } - - return null; - } - - private static string? ExtractColorFromFunctionDict(DictionaryToken fnDict, PdfDocument doc) - { - // Check C0 (initial color) - if (fnDict.TryGet(NameToken.C0, out var c0) && c0.Data.Count >= 3) - { - double r = (c0.Data[0] as NumericToken)?.Double ?? 0; - double g = (c0.Data[1] as NumericToken)?.Double ?? 0; - double b = (c0.Data[2] as NumericToken)?.Double ?? 0; - - int rI = Math.Clamp((int)Math.Round(r * 255.0), 0, 255); - int gI = Math.Clamp((int)Math.Round(g * 255.0), 0, 255); - int bI = Math.Clamp((int)Math.Round(b * 255.0), 0, 255); - return $"#{rI:X2}{gI:X2}{bI:X2}"; - } - - // Check C1 (ending color) if C0 not present - if (fnDict.TryGet(NameToken.C1, out var c1) && c1.Data.Count >= 3) - { - double r = (c1.Data[0] as NumericToken)?.Double ?? 0; - double g = (c1.Data[1] as NumericToken)?.Double ?? 0; - double b = (c1.Data[2] as NumericToken)?.Double ?? 0; - - int rI = Math.Clamp((int)Math.Round(r * 255.0), 0, 255); - int gI = Math.Clamp((int)Math.Round(g * 255.0), 0, 255); - int bI = Math.Clamp((int)Math.Round(b * 255.0), 0, 255); - return $"#{rI:X2}{gI:X2}{bI:X2}"; - } - - // Recursively inspect Functions array if stitched function (FunctionType 3) - if (fnDict.TryGet(NameToken.Functions, out var fns)) - { - foreach (var fToken in fns.Data) - { - DictionaryToken? subFn = null; - if (fToken is IndirectReferenceToken irt) - { - subFn = doc.Structure.GetObject(irt.Data)?.Data as DictionaryToken; - } - else if (fToken is DictionaryToken dt) - { - subFn = dt; - } - - if (subFn != null) - { - var hex = ExtractColorFromFunctionDict(subFn, doc); - if (hex != null) return hex; - } - } - } - - return null; - } -} diff --git a/src/PdfEditorApp.Core/Deconstruction/Utils/SvgPathBuilder.cs b/src/PdfEditorApp.Core/Deconstruction/Utils/SvgPathBuilder.cs deleted file mode 100644 index 675e3fc..0000000 --- a/src/PdfEditorApp.Core/Deconstruction/Utils/SvgPathBuilder.cs +++ /dev/null @@ -1,110 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Text; -using UglyToad.PdfPig.Core; -using UglyToad.PdfPig.Graphics; - -namespace PdfEditorApp.Core.Deconstruction.Utils; - -/// -/// Converts collections of raw PdfPig vector paths into optimized standard SVG markup. -/// Used to group excess vector paths into a single resolution-independent . -/// -public static class SvgPathBuilder -{ - /// - /// Builds an SVG string containing all the provided paths with their respective fill, stroke, and geometry commands. - /// Coordinates are transformed from PDF bottom-left to standard SVG top-left coordinates. - /// - public static string BuildSvgFromPaths( - IReadOnlyList paths, - double minX, - double minY, - double width, - double height, - double pageHeight, - UglyToad.PdfPig.PdfDocument? doc = null) - { - var sb = new StringBuilder(); - var inv = CultureInfo.InvariantCulture; - - sb.Append($"\n"); - - foreach (var path in paths) - { - string pathData = BuildPathData(path, minX, minY, pageHeight); - if (string.IsNullOrWhiteSpace(pathData)) continue; - - string strokeHex = "none"; - double strokeWidth = 0; - if (path.IsStroked) - { - strokeWidth = Math.Max(0.5, path.LineWidth); - strokeHex = PdfColorHelper.ToHex(path.StrokeColor, doc, "#0F172A"); - } - - string fillHex = "none"; - if (path.IsFilled) - { - fillHex = PdfColorHelper.ToHex(path.FillColor, doc, strokeHex != "none" ? strokeHex : "#000000"); - } - - sb.Append($" \n"); - } - - sb.Append(""); - return sb.ToString(); - } - - public static string BuildPathData(PdfPath path, double offsetX, double offsetY, double pageHeight) - { - var sb = new StringBuilder(); - var inv = CultureInfo.InvariantCulture; - - for (int sIdx = 0; sIdx < path.Count; sIdx++) - { - var subpath = path[sIdx]; - if (subpath.Commands == null) continue; - - foreach (var cmd in subpath.Commands) - { - switch (cmd) - { - case PdfSubpath.Move move: - double mx = move.Location.X - offsetX; - double my = (pageHeight - move.Location.Y) - offsetY; - sb.Append($"M {mx.ToString("F1", inv)} {my.ToString("F1", inv)} "); - break; - - case PdfSubpath.Line line: - double lx = line.To.X - offsetX; - double ly = (pageHeight - line.To.Y) - offsetY; - sb.Append($"L {lx.ToString("F1", inv)} {ly.ToString("F1", inv)} "); - break; - - case PdfSubpath.BezierCurve bezier: - var lines = bezier.ToLines(8); - foreach (var l in lines) - { - double ex = l.To.X - offsetX; - double ey = (pageHeight - l.To.Y) - offsetY; - sb.Append($"L {ex.ToString("F1", inv)} {ey.ToString("F1", inv)} "); - } - break; - - case PdfSubpath.Close: - sb.Append("Z "); - break; - } - } - } - - string result = sb.ToString().TrimEnd(); - if (path.IsFilled && !result.EndsWith("Z", StringComparison.OrdinalIgnoreCase)) - { - result += " Z"; - } - return result; - } -} diff --git a/src/PdfEditorApp.Core/Models/AiModels.cs b/src/PdfEditorApp.Core/Models/AiModels.cs deleted file mode 100644 index aa2b4ca..0000000 --- a/src/PdfEditorApp.Core/Models/AiModels.cs +++ /dev/null @@ -1,214 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text.Json.Serialization; - -namespace PdfEditorApp.Core.Models; - -/// -/// Supported AI provider categories in FryPDF. -/// -public enum AiProviderType -{ - /// - /// Local self-hosted Ollama runtime (100% private, free, offline). - /// - OllamaLocal = 0, - - /// - /// Cloud OpenAI API (requires user API key, paid usage). - /// - OpenAiCloud = 1, - - /// - /// Custom OpenAI-compatible endpoint (Groq, OpenRouter, LM Studio, LocalAI, vLLM). - /// - CustomOpenAiCompatible = 2 -} - -/// -/// Economic and locality classification tier of an AI model. -/// -public enum AiModelTier -{ - /// - /// Free, zero cloud data transfer, run locally on device. - /// - FreeLocal = 0, - - /// - /// Free cloud tier (e.g. Ollama Cloud free tier, OpenRouter free models, Groq free tier). - /// - FreeCloud = 1, - - /// - /// Cloud-hosted API model requiring tokens / paid subscription. - /// - PaidCloud = 2 -} - -/// -/// Metadata representing an available AI language model in FryPDF. -/// -public class AiModelInfo -{ - [JsonPropertyName("id")] - public string Id { get; set; } = string.Empty; - - [JsonPropertyName("displayName")] - public string DisplayName { get; set; } = string.Empty; - - [JsonPropertyName("provider")] - public AiProviderType Provider { get; set; } = AiProviderType.OllamaLocal; - - [JsonPropertyName("tier")] - public AiModelTier Tier { get; set; } = AiModelTier.FreeLocal; - - [JsonPropertyName("sizeBytes")] - public long? SizeBytes { get; set; } - - [JsonPropertyName("formattedSize")] - public string FormattedSize { get; set; } = string.Empty; - - [JsonPropertyName("parameterSize")] - public string ParameterSize { get; set; } = string.Empty; - - [JsonPropertyName("description")] - public string Description { get; set; } = string.Empty; - - [JsonPropertyName("isInstalledLocally")] - public bool IsInstalledLocally { get; set; } - - [JsonPropertyName("category")] - public string Category { get; set; } = "Ollama Library"; - - [JsonPropertyName("capabilities")] - public string Capabilities { get; set; } = string.Empty; - - [JsonIgnore] - public bool IsFree => Tier == AiModelTier.FreeLocal || Tier == AiModelTier.FreeCloud; - - [JsonIgnore] - public bool IsCloud => Tier == AiModelTier.FreeCloud || Tier == AiModelTier.PaidCloud; - - [JsonIgnore] - public string TierBadgeText => Tier switch - { - AiModelTier.FreeLocal => "Free / Local", - AiModelTier.FreeCloud => "Free / Cloud", - AiModelTier.PaidCloud => "Paid / Cloud", - _ => "Free" - }; - - [JsonIgnore] - public string BadgeBackgroundColor => Tier switch - { - AiModelTier.FreeLocal => "#DCFCE7", - AiModelTier.FreeCloud => "#E0F2FE", - AiModelTier.PaidCloud => "#EDE9FE", - _ => "#F3F4F6" - }; - - [JsonIgnore] - public string BadgeBorderColor => Tier switch - { - AiModelTier.FreeLocal => "#86EFAC", - AiModelTier.FreeCloud => "#7DD3FC", - AiModelTier.PaidCloud => "#C4B5FD", - _ => "#D1D5DB" - }; - - [JsonIgnore] - public string BadgeForegroundColor => Tier switch - { - AiModelTier.FreeLocal => "#15803D", - AiModelTier.FreeCloud => "#0369A1", - AiModelTier.PaidCloud => "#6D28D9", - _ => "#374151" - }; - - [JsonIgnore] - public string FullTitleWithBadge => $"[{TierBadgeText}] {DisplayName}"; - - public override bool Equals(object? obj) => - obj is AiModelInfo other && string.Equals(Id, other.Id, StringComparison.OrdinalIgnoreCase); - - public override int GetHashCode() => - string.IsNullOrEmpty(Id) ? 0 : StringComparer.OrdinalIgnoreCase.GetHashCode(Id); - - public override string ToString() => string.IsNullOrWhiteSpace(DisplayName) ? Id : FullTitleWithBadge; - - public static AiModelInfo CreateForCustomId(string id, AiProviderType provider, bool isEndpointRemote = false, string? endpoint = null) - { - if (string.IsNullOrWhiteSpace(id)) - { - id = provider == AiProviderType.CustomOpenAiCompatible ? "openai/gpt-oss-120b" : "llama3.2"; - } - - id = id.Trim(); - bool isCloud = id.Contains("cloud", StringComparison.OrdinalIgnoreCase) || - id.Contains(":free", StringComparison.OrdinalIgnoreCase) || - isEndpointRemote; - - AiModelTier tier; - if (provider == AiProviderType.OllamaLocal) - { - tier = isCloud ? AiModelTier.FreeCloud : AiModelTier.FreeLocal; - } - else if (provider == AiProviderType.CustomOpenAiCompatible) - { - bool isGroq = (endpoint?.Contains("groq", StringComparison.OrdinalIgnoreCase) == true) || id.Contains("groq", StringComparison.OrdinalIgnoreCase); - bool isFree = id.Contains("free", StringComparison.OrdinalIgnoreCase) || isGroq; - if (!isEndpointRemote) - { - tier = AiModelTier.FreeLocal; - } - else - { - tier = isFree ? AiModelTier.FreeCloud : AiModelTier.PaidCloud; - } - } - else - { - tier = AiModelTier.PaidCloud; - } - - string formattedSize = isCloud - ? (provider == AiProviderType.CustomOpenAiCompatible && (endpoint?.Contains("groq", StringComparison.OrdinalIgnoreCase) == true) ? "Groq LPU Cloud" : "Cloud API") - : "Local / Custom"; - - return new AiModelInfo - { - Id = id, - DisplayName = id, - Provider = provider, - Tier = tier, - Category = provider == AiProviderType.OllamaLocal ? "Ollama Custom" : (provider == AiProviderType.CustomOpenAiCompatible ? "Custom Compatible" : "OpenAI Cloud"), - Description = $"Model identifier: {id}", - FormattedSize = formattedSize, - IsInstalledLocally = !isCloud && provider == AiProviderType.OllamaLocal - }; - } - - public static string FormatBytes(long bytes) - { - if (bytes <= 0) return string.Empty; - if (bytes >= 1024L * 1024 * 1024) - return $"{bytes / (1024.0 * 1024 * 1024):0.0} GB"; - if (bytes >= 1024L * 1024) - return $"{bytes / (1024.0 * 1024):0.0} MB"; - return $"{bytes / 1024.0:0.0} KB"; - } -} - -/// -/// Result of an AI Studio Agent prompt execution. -/// -public class AiAgentResult -{ - public bool Success { get; set; } - public string Message { get; set; } = string.Empty; - public int ElementsCreatedCount { get; set; } - public List ActionDescriptions { get; set; } = new(); - public string? RawOutput { get; set; } - public TimeSpan Duration { get; set; } -} diff --git a/src/PdfEditorApp.Core/Models/CommandPaletteItem.cs b/src/PdfEditorApp.Core/Models/CommandPaletteItem.cs deleted file mode 100644 index 31a4fbf..0000000 --- a/src/PdfEditorApp.Core/Models/CommandPaletteItem.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; - -namespace PdfEditorApp.Core.Models; - -public class CommandPaletteItem -{ - public string Title { get; set; } = ""; - public string Subtitle { get; set; } = ""; - public string Category { get; set; } = "General"; - public string IconKind { get; set; } = "LightningBolt"; - public string Shortcut { get; set; } = ""; - public Action Action { get; set; } = () => { }; -} diff --git a/src/PdfEditorApp.Core/Models/CommentItem.cs b/src/PdfEditorApp.Core/Models/CommentItem.cs deleted file mode 100644 index 1f48acf..0000000 --- a/src/PdfEditorApp.Core/Models/CommentItem.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace PdfEditorApp.Core.Models; - -public class CommentItem -{ - public string Author { get; set; } = ""; - public string Timestamp { get; set; } = ""; - public string Text { get; set; } = ""; - public string Status { get; set; } = ""; - public int PageIndex { get; set; } -} diff --git a/src/PdfEditorApp.Core/Models/Elements/DynamicElementJsonResolver.cs b/src/PdfEditorApp.Core/Models/Elements/DynamicElementJsonResolver.cs deleted file mode 100644 index a66f1bc..0000000 --- a/src/PdfEditorApp.Core/Models/Elements/DynamicElementJsonResolver.cs +++ /dev/null @@ -1,52 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text.Json; -using System.Text.Json.Serialization; -using System.Text.Json.Serialization.Metadata; -using PdfEditorApp.Core.Plugins.Descriptors; - -namespace PdfEditorApp.Core.Models.Elements; - -/// -/// Configures System.Text.Json polymorphic serialization for -/// by dynamically reflecting all registered canvas element types from . -/// Enables 3rd-party plugins to contribute novel canvas element models without modifying core enums. -/// -public static class DynamicElementJsonResolver -{ - public static JsonSerializerOptions CreateOptions(Func>? descriptorsProvider = null, bool writeIndented = false) - { - var resolver = new DefaultJsonTypeInfoResolver(); - - if (descriptorsProvider != null) - { - resolver.Modifiers.Add(typeInfo => - { - if (typeInfo.Type == typeof(PdfElementBase)) - { - var descriptors = descriptorsProvider(); - if (descriptors != null && typeInfo.PolymorphismOptions != null) - { - foreach (var desc in descriptors) - { - if (!typeInfo.PolymorphismOptions.DerivedTypes.Any(d => d.DerivedType == desc.ModelType)) - { - typeInfo.PolymorphismOptions.DerivedTypes.Add(new JsonDerivedType(desc.ModelType, desc.ElementTypeId)); - } - } - } - } - }); - } - - var options = new JsonSerializerOptions - { - WriteIndented = writeIndented, - TypeInfoResolver = resolver, - DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull - }; - options.Converters.Add(new JsonStringEnumConverter()); - return options; - } -} diff --git a/src/PdfEditorApp.Core/Models/Elements/PdfBarcodeElement.cs b/src/PdfEditorApp.Core/Models/Elements/PdfBarcodeElement.cs deleted file mode 100644 index e4aecc4..0000000 --- a/src/PdfEditorApp.Core/Models/Elements/PdfBarcodeElement.cs +++ /dev/null @@ -1,17 +0,0 @@ -namespace PdfEditorApp.Core.Models.Elements; - -public class PdfBarcodeElement : PdfElementBase -{ - public override ElementKind Kind => ElementKind.Barcode; - - public string CodeValue { get; set; } = "DOC-2026-984210"; - public string BarcodeFormat { get; set; } = "Code128"; - public string BarColorHex { get; set; } = "#0F172A"; - public string BackgroundColorHex { get; set; } = "#FFFFFF"; - public bool ShowText { get; set; } = true; - - public override PdfElementBase Clone() - { - return (PdfBarcodeElement)base.Clone(); - } -} diff --git a/src/PdfEditorApp.Core/Models/Elements/PdfChartElement.cs b/src/PdfEditorApp.Core/Models/Elements/PdfChartElement.cs deleted file mode 100644 index 3418370..0000000 --- a/src/PdfEditorApp.Core/Models/Elements/PdfChartElement.cs +++ /dev/null @@ -1,65 +0,0 @@ -using System.Collections.Generic; - -namespace PdfEditorApp.Core.Models.Elements; - -public class ChartSeriesItem -{ - public string Name { get; set; } = "Series 1"; - public List Values { get; set; } = new(); - public string? ColorHex { get; set; } - - public ChartSeriesItem Clone() => new() - { - Name = Name, - Values = new List(Values), - ColorHex = ColorHex - }; -} - -public class PdfChartElement : PdfElementBase -{ - public override ElementKind Kind => ElementKind.Chart; - - public string Title { get; set; } = "Revenue Growth (Q1-Q4)"; - public ChartType ChartType { get; set; } = ChartType.BarColumn; - public ChartPalette Palette { get; set; } = ChartPalette.CorporateBlue; - public ChartLegendPosition LegendPosition { get; set; } = ChartLegendPosition.Top; - - public List Categories { get; set; } = new() { "Q1", "Q2", "Q3", "Q4" }; - public List Values { get; set; } = new() { 1.2, 1.8, 2.5, 3.1 }; - public List ValueLabels { get; set; } = new() { "$1.2B", "$1.8B", "$2.5B", "$3.1B" }; - public List BarColorsHex { get; set; } = new() { "#C7E0F4", "#82BDF0", "#3D95E6", "#0F6CBD" }; - public List MultiSeries { get; set; } = new(); - - public bool ShowDataLabels { get; set; } = true; - public bool ShowGridlines { get; set; } = true; - public double DonutHoleRatio { get; set; } = 0.6; - public double CurveSmoothness { get; set; } = 0.65; - public double StrokeThickness { get; set; } = 3.0; - public string? XAxisTitle { get; set; } - public string? YAxisTitle { get; set; } - - public string BackgroundColorHex { get; set; } = "#F8F9FA"; - public string BorderColorHex { get; set; } = "#E1DFDD"; - - public override PdfElementBase Clone() - { - var clone = (PdfChartElement)base.Clone(); - clone.Categories = new List(Categories); - clone.Values = new List(Values); - clone.ValueLabels = new List(ValueLabels); - clone.BarColorsHex = new List(BarColorsHex); - clone.MultiSeries = new List(); - foreach (var s in MultiSeries) - { - clone.MultiSeries.Add(new ChartSeriesItem - { - Name = s.Name, - Values = new List(s.Values), - ColorHex = s.ColorHex - }); - } - return clone; - } -} - diff --git a/src/PdfEditorApp.Core/Models/Elements/PdfDividerElement.cs b/src/PdfEditorApp.Core/Models/Elements/PdfDividerElement.cs deleted file mode 100644 index 030a8f1..0000000 --- a/src/PdfEditorApp.Core/Models/Elements/PdfDividerElement.cs +++ /dev/null @@ -1,20 +0,0 @@ -namespace PdfEditorApp.Core.Models.Elements; - -public class PdfDividerElement : PdfElementBase -{ - public override ElementKind Kind => ElementKind.Divider; - - public string ColorHex { get; set; } = "#0F6CBD"; - public double Thickness { get; set; } = 2; - public bool IsVertical { get; set; } = false; - public DividerStyle Style { get; set; } = DividerStyle.Straight; - public double WaveAmplitude { get; set; } = 6.0; - public double WaveFrequency { get; set; } = 4.0; - public LineDashStyle DashStyle { get; set; } = LineDashStyle.Solid; - - public override PdfElementBase Clone() - { - var clone = (PdfDividerElement)base.Clone(); - return clone; - } -} diff --git a/src/PdfEditorApp.Core/Models/Elements/PdfElementBase.cs b/src/PdfEditorApp.Core/Models/Elements/PdfElementBase.cs deleted file mode 100644 index 7357038..0000000 --- a/src/PdfEditorApp.Core/Models/Elements/PdfElementBase.cs +++ /dev/null @@ -1,44 +0,0 @@ -using System; -using System.Text.Json.Serialization; - -namespace PdfEditorApp.Core.Models.Elements; - -[JsonPolymorphic(TypeDiscriminatorPropertyName = "$type")] -[JsonDerivedType(typeof(PdfTextElement), typeDiscriminator: "text")] -[JsonDerivedType(typeof(PdfImageElement), typeDiscriminator: "image")] -[JsonDerivedType(typeof(PdfShapeElement), typeDiscriminator: "shape")] -[JsonDerivedType(typeof(PdfDividerElement), typeDiscriminator: "divider")] -[JsonDerivedType(typeof(PdfChartElement), typeDiscriminator: "chart")] -[JsonDerivedType(typeof(PdfTableElement), typeDiscriminator: "table")] -[JsonDerivedType(typeof(PdfWatermarkElement), typeDiscriminator: "watermark")] -[JsonDerivedType(typeof(PdfFormFieldElement), typeDiscriminator: "formfield")] -[JsonDerivedType(typeof(PdfQrCodeElement), typeDiscriminator: "qrcode")] -[JsonDerivedType(typeof(PdfBarcodeElement), typeDiscriminator: "barcode")] -[JsonDerivedType(typeof(PdfRedactionElement), typeDiscriminator: "redaction")] -[JsonDerivedType(typeof(PdfInkElement), typeDiscriminator: "ink")] -[JsonDerivedType(typeof(PdfStickyNoteElement), typeDiscriminator: "stickynote")] -[JsonDerivedType(typeof(PdfMeasurementElement), typeDiscriminator: "measurement")] -[JsonDerivedType(typeof(PdfSvgElement), typeDiscriminator: "svg")] -[JsonDerivedType(typeof(PdfMathElement), typeDiscriminator: "math")] -public abstract class PdfElementBase -{ - public string Id { get; set; } = Guid.NewGuid().ToString("N"); - public abstract ElementKind Kind { get; } - - public double X { get; set; } - public double Y { get; set; } - public double Width { get; set; } = 200; - public double Height { get; set; } = 100; - public int ZIndex { get; set; } = 0; - public double Rotation { get; set; } = 0; - public double Opacity { get; set; } = 1.0; - public bool IsLocked { get; set; } = false; - public string? GroupId { get; set; } - - public virtual PdfElementBase Clone() - { - var clone = (PdfElementBase)MemberwiseClone(); - clone.Id = Guid.NewGuid().ToString("N"); - return clone; - } -} diff --git a/src/PdfEditorApp.Core/Models/Elements/PdfFormFieldElement.cs b/src/PdfEditorApp.Core/Models/Elements/PdfFormFieldElement.cs deleted file mode 100644 index c69f8b2..0000000 --- a/src/PdfEditorApp.Core/Models/Elements/PdfFormFieldElement.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System.Collections.Generic; - -namespace PdfEditorApp.Core.Models.Elements; - -public class PdfFormFieldElement : PdfElementBase -{ - public override ElementKind Kind => ElementKind.FormField; - - public FormFieldType FieldType { get; set; } = FormFieldType.Text; - public string FieldName { get; set; } = "form_field_1"; - public string Label { get; set; } = "Full Name:"; - public string Placeholder { get; set; } = "Enter your full legal name..."; - public string Value { get; set; } = ""; - public string DefaultValue { get; set; } = ""; - public string Tooltip { get; set; } = ""; - public bool IsRequired { get; set; } = true; - public bool IsReadOnly { get; set; } = false; - public bool IsChecked { get; set; } = false; - public FormValidationType ValidationType { get; set; } = FormValidationType.None; - public string CustomValidationRegex { get; set; } = ""; - public string BorderColorHex { get; set; } = "#0F6CBD"; - public string BackgroundColorHex { get; set; } = "#F8FAFC"; - public double FontSize { get; set; } = 12; - public List Options { get; set; } = new() { "Option 1", "Option 2", "Option 3" }; - - // Acrobat Form Calculations & Action Buttons - public CalculationFormula CalculationFormula { get; set; } = CalculationFormula.None; - public string CalculationSourceFields { get; set; } = ""; - public FormButtonAction ButtonAction { get; set; } = FormButtonAction.SubmitForm; - public string ActionTarget { get; set; } = ""; - - public override PdfElementBase Clone() - { - var clone = (PdfFormFieldElement)base.Clone(); - clone.Options = new List(Options); - return clone; - } -} diff --git a/src/PdfEditorApp.Core/Models/Elements/PdfImageElement.cs b/src/PdfEditorApp.Core/Models/Elements/PdfImageElement.cs deleted file mode 100644 index 13fd78d..0000000 --- a/src/PdfEditorApp.Core/Models/Elements/PdfImageElement.cs +++ /dev/null @@ -1,77 +0,0 @@ -using System; -using System.Text.Json.Serialization; - -namespace PdfEditorApp.Core.Models.Elements; - -public class PdfImageElement : PdfElementBase -{ - public override ElementKind Kind => ElementKind.Image; - - public string? ImagePath { get; set; } - - /// - /// Raw binary image bytes (PNG, JPEG, etc.). - /// Storing bytes directly eliminates Large Object Heap (LOH) string allocation bloat during PDF deconstruction. - /// - [JsonIgnore] - public byte[]? ImageData - { - get => _imageData; - set - { - _imageData = value; - _cachedBase64 = null; - } - } - private byte[]? _imageData; - - /// - /// Base64 encoded representation for JSON persistence and legacy interop. - /// Evaluated lazily on demand from to avoid memory overhead. - /// - public string? Base64Data - { - get - { - if (_cachedBase64 != null) return _cachedBase64; - if (_imageData != null && _imageData.Length > 0) - { - _cachedBase64 = Convert.ToBase64String(_imageData); - return _cachedBase64; - } - return null; - } - set - { - _cachedBase64 = value; - if (!string.IsNullOrEmpty(value)) - { - try - { - _imageData = Convert.FromBase64String(value); - } - catch - { - // Invalid base64 string - } - } - } - } - private string? _cachedBase64; - - public bool KeepAspectRatio { get; set; } = true; - public double CornerRadius { get; set; } = 4; - public string BorderColorHex { get; set; } = "#E1DFDD"; - public double BorderThickness { get; set; } = 1; - public string AltText { get; set; } = "Image"; - - public override PdfElementBase Clone() - { - var clone = (PdfImageElement)base.Clone(); - if (_imageData != null) - { - clone.ImageData = (byte[])_imageData.Clone(); - } - return clone; - } -} diff --git a/src/PdfEditorApp.Core/Models/Elements/PdfInkElement.cs b/src/PdfEditorApp.Core/Models/Elements/PdfInkElement.cs deleted file mode 100644 index 34ea9e1..0000000 --- a/src/PdfEditorApp.Core/Models/Elements/PdfInkElement.cs +++ /dev/null @@ -1,17 +0,0 @@ -namespace PdfEditorApp.Core.Models.Elements; - -public class PdfInkElement : PdfElementBase -{ - public override ElementKind Kind => ElementKind.Ink; - - public string PointsData { get; set; } = "10,10 50,40 100,20 180,60 220,30"; - public string StrokeColorHex { get; set; } = "#0F6CBD"; - public double StrokeThickness { get; set; } = 3.0; - public bool IsHighlighter { get; set; } = false; - public bool IsSmoothSpline { get; set; } = true; - - public override PdfElementBase Clone() - { - return (PdfInkElement)base.Clone(); - } -} diff --git a/src/PdfEditorApp.Core/Models/Elements/PdfMathElement.cs b/src/PdfEditorApp.Core/Models/Elements/PdfMathElement.cs deleted file mode 100644 index 887aa79..0000000 --- a/src/PdfEditorApp.Core/Models/Elements/PdfMathElement.cs +++ /dev/null @@ -1,66 +0,0 @@ -namespace PdfEditorApp.Core.Models.Elements; - -/// -/// Native mathematical equation & formula element supporting standard LaTeX / Math syntax, -/// vector SVG rendering, equation numbering tags, and full typography customization. -/// -public class PdfMathElement : PdfElementBase -{ - public override ElementKind Kind => ElementKind.Math; - - /// The mathematical expression in standard LaTeX syntax. - public string Formula { get; set; } = @"\int_{-\infty}^{\infty} e^{-x^2} \, dx = \sqrt{\pi}"; - - /// Base typography font size for rendered math symbols. - public double FontSize { get; set; } = 16; - - /// Hex color for mathematical symbols, text, and operators. - public string TextColorHex { get; set; } = "#0F172A"; - - /// Optional background color fill for equation card/callout. - public string BackgroundColorHex { get; set; } = "#00000000"; - - /// Border stroke color. - public string BorderColorHex { get; set; } = "#00000000"; - - /// Border stroke thickness. - public double BorderThickness { get; set; } = 0; - - /// Corner radius for rounded equation card borders. - public double CornerRadius { get; set; } = 4; - - /// Internal padding around the rendered equation. - public double Padding { get; set; } = 8; - - /// Whether to render a visible background box. - public bool ShowBackground { get; set; } = false; - - /// Whether to render a visible border around the equation. - public bool ShowBorder { get; set; } = false; - - /// Whether to render an equation number tag (e.g. (1), (2.3)) aligned to the right. - public bool ShowEquationNumber { get; set; } = false; - - /// Equation numbering label (e.g. "(1)", "(2.4)", "(IV.1)"). - public string EquationNumber { get; set; } = "(1)"; - - /// Alignment of the equation within its bounding box (Left, Center, Right). - public TextAlignmentMode Alignment { get; set; } = TextAlignmentMode.Center; - - /// Display mode (DisplayBlock for standalone centered equations, Inline for compact formulas). - public MathDisplayStyle DisplayStyle { get; set; } = MathDisplayStyle.DisplayBlock; - - /// Subject category classification (Algebra, Calculus, Physics, Quantum, Finance, etc.). - public MathCategory Category { get; set; } = MathCategory.Calculus; - - /// Optional preset name if created from template library. - public string? PresetName { get; set; } = "Gaussian Integral"; - - /// Optional user explanation or theorem title. - public string? Description { get; set; } = "Euler-Poisson Gaussian Integral"; - - public override PdfElementBase Clone() - { - return (PdfMathElement)base.Clone(); - } -} diff --git a/src/PdfEditorApp.Core/Models/Elements/PdfMeasurementElement.cs b/src/PdfEditorApp.Core/Models/Elements/PdfMeasurementElement.cs deleted file mode 100644 index 8c265af..0000000 --- a/src/PdfEditorApp.Core/Models/Elements/PdfMeasurementElement.cs +++ /dev/null @@ -1,43 +0,0 @@ -using System; - -namespace PdfEditorApp.Core.Models.Elements; - -public class PdfMeasurementElement : PdfElementBase -{ - public override ElementKind Kind => ElementKind.Measurement; - - public double StartX { get; set; } = 0; - public double StartY { get; set; } = 0; - public double EndX { get; set; } = 200; - public double EndY { get; set; } = 0; - - public RulerUnit Unit { get; set; } = RulerUnit.Points; - public double ScaleFactor { get; set; } = 1.0; // 1 pt = ScaleFactor * Unit - public string CustomLabel { get; set; } = ""; - public string StrokeColorHex { get; set; } = "#DC2626"; - public double StrokeThickness { get; set; } = 1.5; - public double ArrowSize { get; set; } = 6.0; - public double ExtensionLineLength { get; set; } = 10.0; - public double FontSize { get; set; } = 10.0; - - public double CalculateDistance() - { - double dx = EndX - StartX; - double dy = EndY - StartY; - return Math.Sqrt(dx * dx + dy * dy); - } - - public string GetFormattedDistance() - { - if (!string.IsNullOrWhiteSpace(CustomLabel)) - return CustomLabel; - - double distancePts = CalculateDistance(); - return Unit switch - { - RulerUnit.Inches => $"{distancePts / 72.0:F2} in", - RulerUnit.Millimeters => $"{distancePts * 25.4 / 72.0:F1} mm", - _ => $"{distancePts:F1} pt" - }; - } -} diff --git a/src/PdfEditorApp.Core/Models/Elements/PdfQrCodeElement.cs b/src/PdfEditorApp.Core/Models/Elements/PdfQrCodeElement.cs deleted file mode 100644 index be6d4e2..0000000 --- a/src/PdfEditorApp.Core/Models/Elements/PdfQrCodeElement.cs +++ /dev/null @@ -1,18 +0,0 @@ -namespace PdfEditorApp.Core.Models.Elements; - -public class PdfQrCodeElement : PdfElementBase -{ - public override ElementKind Kind => ElementKind.QrCode; - - public string Content { get; set; } = "https://github.com/PrashantUnity/PDFCreator"; - public string DarkColorHex { get; set; } = "#0F172A"; - public string LightColorHex { get; set; } = "#FFFFFF"; - public string Label { get; set; } = "SCAN TO VERIFY CREDENTIAL"; - public QrCodeEccLevel EccLevel { get; set; } = QrCodeEccLevel.M; - public bool DrawQuietZones { get; set; } = true; - - public override PdfElementBase Clone() - { - return (PdfQrCodeElement)base.Clone(); - } -} diff --git a/src/PdfEditorApp.Core/Models/Elements/PdfRedactionElement.cs b/src/PdfEditorApp.Core/Models/Elements/PdfRedactionElement.cs deleted file mode 100644 index 8456bf6..0000000 --- a/src/PdfEditorApp.Core/Models/Elements/PdfRedactionElement.cs +++ /dev/null @@ -1,19 +0,0 @@ -namespace PdfEditorApp.Core.Models.Elements; - -public class PdfRedactionElement : PdfElementBase -{ - public override ElementKind Kind => ElementKind.Redaction; - - public RedactionMode Mode { get; set; } = RedactionMode.Blackout; - public string ExemptionCode { get; set; } = "[REDACTED - (b)(4) PRIVILEGED]"; - public string FillColorHex { get; set; } = "#0F172A"; - public string TextColorHex { get; set; } = "#FFFFFF"; - public string BorderColorHex { get; set; } = "#DC2626"; - public double BorderThickness { get; set; } = 1.5; - public bool ShowOverlayText { get; set; } = true; - - public override PdfElementBase Clone() - { - return (PdfRedactionElement)base.Clone(); - } -} diff --git a/src/PdfEditorApp.Core/Models/Elements/PdfShapeElement.cs b/src/PdfEditorApp.Core/Models/Elements/PdfShapeElement.cs deleted file mode 100644 index 82d0594..0000000 --- a/src/PdfEditorApp.Core/Models/Elements/PdfShapeElement.cs +++ /dev/null @@ -1,44 +0,0 @@ -namespace PdfEditorApp.Core.Models.Elements; - -public class PdfShapeElement : PdfElementBase -{ - public override ElementKind Kind => ElementKind.Shape; - - public ShapeType ShapeType { get; set; } = ShapeType.Rectangle; - public string FillColorHex { get; set; } = "#F8F9FA"; - public string StrokeColorHex { get; set; } = "#0F6CBD"; - public double StrokeThickness { get; set; } = 1.5; - public double CornerRadius { get; set; } = 4; - public string? Label { get; set; } - public string? LabelColorHex { get; set; } = "#201F1E"; - public double LabelFontSize { get; set; } = 12; - - public string? CustomPathData { get; set; } - public string? SecondaryFillColorHex { get; set; } - public string? SecondaryStrokeColorHex { get; set; } - - // Bézier Curves, Connectors & Line Caps - public double BezierP0X { get; set; } = 0.0; - public double BezierP0Y { get; set; } = 0.5; - public double BezierP1X { get; set; } = 0.33; - public double BezierP1Y { get; set; } = 0.10; - public double BezierP2X { get; set; } = 0.67; - public double BezierP2Y { get; set; } = 0.90; - public double BezierP3X { get; set; } = 1.0; - public double BezierP3Y { get; set; } = 0.5; - - public LineEndCap StartCap { get; set; } = LineEndCap.None; - public LineEndCap EndCap { get; set; } = LineEndCap.None; - public LineDashStyle DashStyle { get; set; } = LineDashStyle.Solid; - public double WaveFrequency { get; set; } = 2.0; - public double CurvatureDepth { get; set; } = 40.0; - - public override PdfElementBase Clone() - { - var clone = (PdfShapeElement)base.Clone(); - clone.CustomPathData = CustomPathData; - clone.SecondaryFillColorHex = SecondaryFillColorHex; - clone.SecondaryStrokeColorHex = SecondaryStrokeColorHex; - return clone; - } -} diff --git a/src/PdfEditorApp.Core/Models/Elements/PdfStickyNoteElement.cs b/src/PdfEditorApp.Core/Models/Elements/PdfStickyNoteElement.cs deleted file mode 100644 index c631ec6..0000000 --- a/src/PdfEditorApp.Core/Models/Elements/PdfStickyNoteElement.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; - -namespace PdfEditorApp.Core.Models.Elements; - -public class PdfStickyNoteElement : PdfElementBase -{ - public override ElementKind Kind => ElementKind.StickyNote; - - public string Author { get; set; } = "Senior Reviewer"; - public string Timestamp { get; set; } = DateTime.Now.ToString("MMM dd, yyyy HH:mm"); - public string NoteText { get; set; } = "Please verify the audit figures with the legal compliance team prior to final PDF release."; - public string Status { get; set; } = "Pending Review"; - public string ColorHex { get; set; } = "#FEF3C7"; - public string BorderColorHex { get; set; } = "#F59E0B"; - public bool IsExpanded { get; set; } = true; - - public override PdfElementBase Clone() - { - return (PdfStickyNoteElement)base.Clone(); - } -} diff --git a/src/PdfEditorApp.Core/Models/Elements/PdfSvgElement.cs b/src/PdfEditorApp.Core/Models/Elements/PdfSvgElement.cs deleted file mode 100644 index ff956ad..0000000 --- a/src/PdfEditorApp.Core/Models/Elements/PdfSvgElement.cs +++ /dev/null @@ -1,31 +0,0 @@ -namespace PdfEditorApp.Core.Models.Elements; - -/// -/// Native vector SVG element for logos, icons, ceremonial crests, garlands, and complex illustrations. -/// -public class PdfSvgElement : PdfElementBase -{ - public override ElementKind Kind => ElementKind.Svg; - - /// Raw SVG XML string markup. - public string SvgSource { get; set; } = ""; - - /// Optional file path if loaded from external disk file. - public string? FilePath { get; set; } - - /// Optional color override / tint (if specified, replaces default fills with this color). - public string? TintColorHex { get; set; } - - /// Preset ornament identifier if selected from built-in library. - public string? PresetName { get; set; } - - public bool KeepAspectRatio { get; set; } = true; - public double CornerRadius { get; set; } = 0; - public string? BorderColorHex { get; set; } - public double BorderThickness { get; set; } = 0; - - public override PdfElementBase Clone() - { - return (PdfSvgElement)base.Clone(); - } -} diff --git a/src/PdfEditorApp.Core/Models/Elements/PdfTableElement.cs b/src/PdfEditorApp.Core/Models/Elements/PdfTableElement.cs deleted file mode 100644 index 22e0802..0000000 --- a/src/PdfEditorApp.Core/Models/Elements/PdfTableElement.cs +++ /dev/null @@ -1,34 +0,0 @@ -using System.Collections.Generic; - -namespace PdfEditorApp.Core.Models.Elements; - -public class PdfTableElement : PdfElementBase -{ - public override ElementKind Kind => ElementKind.Table; - - public List Headers { get; set; } = new() { "Item Description", "Qty", "Rate", "Amount" }; - public List> Rows { get; set; } = new() - { - new() { "Cloud Architecture Consulting", "40 hrs", "$150.00", "$6,000.00" }, - new() { "Avalonia Desktop UI Engineering", "60 hrs", "$140.00", "$8,400.00" }, - new() { "QuestPDF Engine Integration", "25 hrs", "$160.00", "$4,000.00" }, - new() { "QA, Testing & Performance Tuning", "15 hrs", "$120.00", "$1,800.00" } - }; - - public string HeaderBackgroundHex { get; set; } = "#0F6CBD"; - public string HeaderTextHex { get; set; } = "#FFFFFF"; - public string AlternateRowBackgroundHex { get; set; } = "#F8F9FA"; - public string BorderColorHex { get; set; } = "#E1DFDD"; - - public override PdfElementBase Clone() - { - var clone = (PdfTableElement)base.Clone(); - clone.Headers = new List(Headers); - clone.Rows = new List>(); - foreach (var row in Rows) - { - clone.Rows.Add(new List(row)); - } - return clone; - } -} diff --git a/src/PdfEditorApp.Core/Models/Elements/PdfTextElement.cs b/src/PdfEditorApp.Core/Models/Elements/PdfTextElement.cs deleted file mode 100644 index ca01a35..0000000 --- a/src/PdfEditorApp.Core/Models/Elements/PdfTextElement.cs +++ /dev/null @@ -1,122 +0,0 @@ -namespace PdfEditorApp.Core.Models.Elements; - -public class PdfTextElement : PdfElementBase -{ - public override ElementKind Kind => ElementKind.Text; - - // Content & Typography - public string Text { get; set; } = "Enter text here"; - public string FontFamily { get; set; } = "Segoe UI"; - public double FontSize { get; set; } = 14; - public bool IsBold { get; set; } = false; - public bool IsItalic { get; set; } = false; - public bool IsUnderline { get; set; } = false; - public bool IsDoubleUnderline { get; set; } = false; - public bool IsStrikethrough { get; set; } = false; - public string TextColorHex { get; set; } = "#201F1E"; - public double TextOpacity { get; set; } = 1.0; - - // Paragraph & Spacing - public TextAlignmentMode Alignment { get; set; } = TextAlignmentMode.Left; - public TextVerticalAlignment VerticalAlignment { get; set; } = TextVerticalAlignment.Top; - public double LineHeight { get; set; } = 1.4; - public double CharacterSpacing { get; set; } = 0; - public double WordSpacing { get; set; } = 0; - public double ParagraphSpacing { get; set; } = 0; - public bool TextWrap { get; set; } = true; - - // Stroke / Outline - public bool HasStroke { get; set; } = false; - public string StrokeColorHex { get; set; } = "#000000"; - public double StrokeWidth { get; set; } = 1.0; - - // Shadow & Glow - public bool HasShadow { get; set; } = false; - public string ShadowColorHex { get; set; } = "#80000000"; - public double ShadowOffsetX { get; set; } = 2.0; - public double ShadowOffsetY { get; set; } = 2.0; - public double ShadowBlurRadius { get; set; } = 4.0; - public double ShadowOpacity { get; set; } = 0.5; - - // Box Background, Border & Padding - public double Padding { get; set; } = 0; - public string BackgroundColorHex { get; set; } = "#00000000"; // Transparent by default - public string BorderColorHex { get; set; } = "#00000000"; - public double BorderThickness { get; set; } = 0; - public double CornerRadius { get; set; } = 0; - - // Curved & Circular Typography - public TextShapeMode ShapeMode { get; set; } = TextShapeMode.Normal; - public double CurveRadius { get; set; } = 120; - public double CurveArcAngle { get; set; } = 180; // Sweep angle in degrees (e.g. 30 to 360) - public double CurveStartAngle { get; set; } = 0; // Center offset angle in degrees - public bool CurveClockwise { get; set; } = true; - public bool CurveInvert { get; set; } = false; // Invert text along curve (inside vs outside) - public CircularTextPlacement CircularPlacement { get; set; } = CircularTextPlacement.TopArc; - - // Per-Character & Transform Offsets - public double BaselineShift { get; set; } = 0; - public double CharacterRotation { get; set; } = 0; - public double ScaleX { get; set; } = 1.0; - public double ScaleY { get; set; } = 1.0; - public bool FlipX { get; set; } = false; - public bool FlipY { get; set; } = false; - - // Bézier Curve Typography (Normalized 0.0 to 1.0 relative coordinates) - public BezierCurvePreset BezierPreset { get; set; } = BezierCurvePreset.Wave; - public double BezierP0X { get; set; } = 0.0; - public double BezierP0Y { get; set; } = 0.5; - public double BezierP1X { get; set; } = 0.33; - public double BezierP1Y { get; set; } = 0.10; - public double BezierP2X { get; set; } = 0.67; - public double BezierP2Y { get; set; } = 0.90; - public double BezierP3X { get; set; } = 1.0; - public double BezierP3Y { get; set; } = 0.5; - - // Multi-Span Rich Text Runs (Granular inline formatting) - public System.Collections.Generic.List? Spans { get; set; } - - /// - /// Returns the effective plain text for search, display titles, and fallback rendering. - /// Concatenates inline spans if present, otherwise returns . - /// - public string GetEffectivePlainText() - { - if (Spans == null || Spans.Count == 0) - { - return Text ?? string.Empty; - } - - var sb = new System.Text.StringBuilder(); - foreach (var span in Spans) - { - sb.Append(span.Text); - } - return sb.ToString(); - } - - /// - /// Synchronizes with the concatenated content of . - /// - public void SynchronizePlainTextFromSpans() - { - if (Spans != null && Spans.Count > 0) - { - Text = GetEffectivePlainText(); - } - } - - public override PdfElementBase Clone() - { - var clone = (PdfTextElement)base.Clone(); - if (Spans != null) - { - clone.Spans = new System.Collections.Generic.List(Spans.Count); - foreach (var span in Spans) - { - clone.Spans.Add(span.Clone()); - } - } - return clone; - } -} diff --git a/src/PdfEditorApp.Core/Models/Elements/PdfTextSpan.cs b/src/PdfEditorApp.Core/Models/Elements/PdfTextSpan.cs deleted file mode 100644 index 9730897..0000000 --- a/src/PdfEditorApp.Core/Models/Elements/PdfTextSpan.cs +++ /dev/null @@ -1,94 +0,0 @@ -namespace PdfEditorApp.Core.Models.Elements; - -/// -/// Specifies the vertical script alignment for inline rich text (e.g. chemical formulas H₂O, exponents x²). -/// -public enum TextScriptMode -{ - Normal = 0, - Superscript = 1, - Subscript = 2 -} - -/// -/// Represents an inline text span (run) within a , -/// allowing granular control over fonts, weights, colors, styles, scripts, and links. -/// -public class PdfTextSpan -{ - /// - /// The plain text content of this inline span. - /// - public string Text { get; set; } = string.Empty; - - /// - /// Optional font family override. If null, inherits from parent . - /// - public string? FontFamily { get; set; } - - /// - /// Optional font size override in points. If null, inherits from parent . - /// - public double? FontSize { get; set; } - - /// - /// Optional bold override. If null, inherits from parent . - /// - public bool? IsBold { get; set; } - - /// - /// Optional italic override. If null, inherits from parent . - /// - public bool? IsItalic { get; set; } - - /// - /// Optional underline override. If null, inherits from parent . - /// - public bool? IsUnderline { get; set; } - - /// - /// Optional strikethrough override. If null, inherits from parent . - /// - public bool? IsStrikethrough { get; set; } - - /// - /// Optional text color hex override (e.g. #0F6CBD). If null, inherits from parent . - /// - public string? TextColorHex { get; set; } - - /// - /// Optional background highlight color hex (e.g. #FFEB3B). If null or empty, transparent. - /// - public string? HighlightColorHex { get; set; } - - /// - /// Vertical script alignment (Normal, Superscript, Subscript). - /// - public TextScriptMode Script { get; set; } = TextScriptMode.Normal; - - /// - /// Optional clickable hyperlink URI (e.g. https://example.com). - /// - public string? LinkUrl { get; set; } - - /// - /// Creates a deep clone of this text span. - /// - public PdfTextSpan Clone() - { - return new PdfTextSpan - { - Text = Text, - FontFamily = FontFamily, - FontSize = FontSize, - IsBold = IsBold, - IsItalic = IsItalic, - IsUnderline = IsUnderline, - IsStrikethrough = IsStrikethrough, - TextColorHex = TextColorHex, - HighlightColorHex = HighlightColorHex, - Script = Script, - LinkUrl = LinkUrl - }; - } -} diff --git a/src/PdfEditorApp.Core/Models/Elements/PdfWatermarkElement.cs b/src/PdfEditorApp.Core/Models/Elements/PdfWatermarkElement.cs deleted file mode 100644 index 0606f4a..0000000 --- a/src/PdfEditorApp.Core/Models/Elements/PdfWatermarkElement.cs +++ /dev/null @@ -1,18 +0,0 @@ -namespace PdfEditorApp.Core.Models.Elements; - -public class PdfWatermarkElement : PdfElementBase -{ - public override ElementKind Kind => ElementKind.Watermark; - - public string Text { get; set; } = "CONFIDENTIAL"; - public double FontSize { get; set; } = 48; - public string ColorHex { get; set; } = "#CC0000"; - public new double Opacity { get; set; } = 0.15; - public double Angle { get; set; } = -35; - - public override PdfElementBase Clone() - { - var clone = (PdfWatermarkElement)base.Clone(); - return clone; - } -} diff --git a/src/PdfEditorApp.Core/Models/Enums.cs b/src/PdfEditorApp.Core/Models/Enums.cs deleted file mode 100644 index b02184e..0000000 --- a/src/PdfEditorApp.Core/Models/Enums.cs +++ /dev/null @@ -1,519 +0,0 @@ -namespace PdfEditorApp.Core.Models; - -public enum ElementKind -{ - Text, - Heading, - Image, - Shape, - Divider, - Table, - Chart, - Watermark, - Stamp, - StickyNote, - FormField, - QrCode, - Barcode, - Redaction, - Ink, - Measurement, - Svg, - Math -} - -public enum MathDisplayStyle -{ - DisplayBlock, - Inline -} - -public enum MathCategory -{ - SchoolArithmetic, - Algebra, - Calculus, - Physics, - QuantumMechanics, - Finance, - Statistics, - DiscreteMath, - Geometry, - Logic, - Chemistry, - Custom -} - -public enum FormFieldType -{ - Text, - MultilineText, - Checkbox, - Radio, - Dropdown, - Signature, - Button, - DatePicker, - Number, - SignatureLine -} - -public enum CalculationFormula -{ - None, - Sum, - Average, - Product, - Min, - Max -} - -public enum FormButtonAction -{ - SubmitForm, - ResetForm, - PrintDocument, - GotoPage -} - -public enum BatesPosition -{ - TopLeft, - TopCenter, - TopRight, - BottomLeft, - BottomCenter, - BottomRight -} - -public enum SplitExtractMode -{ - SplitEveryNPages, - SplitByPageRanges, - ExtractSelectedPages -} - -public enum CompareDiffType -{ - ElementAdded, - ElementRemoved, - ElementModified, - TextModified, - FormattingModified, - MetadataModified, - SecurityModified, - PageCountChanged -} - -public enum RulerUnit -{ - Points, - Inches, - Millimeters -} - -public enum FormValidationType -{ - None, - Email, - Numeric, - Phone, - Date, - CustomRegex -} - -public enum SignatureStyle -{ - DrawnInk, - CursiveElegance, - SignatureCasual, - ClassicScript, - ModernHandwriting, - UploadedImage -} - -public enum GridSnapSize -{ - None = 0, - Points10 = 10, - Points20 = 20, - Points50 = 50 -} - -public enum RedactionMode -{ - Blackout, - Whiteout, - Grayout -} - -public enum PageFormat -{ - A4, - Letter, - Legal, - Executive, - A3, - A5, - Tabloid, - Poster, - Custom -} - -public enum PageOrientation -{ - Portrait, - Landscape -} - -public enum TextAlignmentMode -{ - Left, - Center, - Right, - Justify -} - -public enum TextVerticalAlignment -{ - Top, - Center, - Bottom -} - -public enum TextShapeMode -{ - Normal, - Curved, - Circular, - BezierCurve -} - -public enum BezierCurvePreset -{ - Custom, - Wave, - SCurve, - Bridge, - Valley, - Rise -} - -public enum TextWrappingMode -{ - Wrap, - NoWrap -} - -public enum CircularTextPlacement -{ - TopArc, - BottomArc, - FullCircle, - CustomArc -} - -public enum CurveDirectionMode -{ - Clockwise, - CounterClockwise -} - -public enum ShapeType -{ - Rectangle, - RoundedRectangle, - Circle, - Triangle, - RightTriangle, - Diamond, - Pentagon, - Hexagon, - Octagon, - Star5, - Star4Badge, - Star8Badge, - Star12Seal, - RosetteSeal, - LaurelWreathSeal, - MedalRibbonBadge, - RibbonBanner, - CornerPolygonalAccentTopLeft, - CornerPolygonalAccentBottomRight, - CornerDiagonalWedge, - Chevron, - Trapezoid, - Parallelogram, - ShieldBadge, - AwardBadge, - ArrowRight, - ArrowLeft, - Callout, - Heart, - Cloud, - Line, - Arrow, - BezierCurve, - CurvedArrow, - SCurveConnector, - WaveLine, - ArcLine, - CurlyBrace, - CurvedCallout, - Teardrop, - WaveRibbon, - OrganicBlob, - Star, - Card, - StickyNote, - RevisionCloud, - DimensionLine, - CustomSvgPath -} - -public enum LineEndCap -{ - None, - Arrow, - StealthArrow, - OpenArrow, - Circle, - Diamond, - Square -} - -public enum LineDashStyle -{ - Solid, - Dashed, - Dotted, - DashDot -} - -public enum DividerStyle -{ - Straight, - Wave, - SCurve, - Arch, - DoubleWave, - CalligraphicFlourish -} - -public enum ChartType -{ - BarColumn, - HorizontalBar, - Line, - SmoothLine, - Area, - DonutPie, - StackedBar, - StackedHorizontalBar, - ScatterPlot, - Radar, - PolarArea, - Funnel, - Waterfall, - GaugeProgress, - StepLine, - Pyramid, - Candlestick -} - -public enum ChartPalette -{ - CorporateBlue, - EmeraldGreen, - SunsetOrange, - CyberNeon, - ExecutiveSlate, - PastelHarmony, - VibrantRainbow -} - -public enum ChartLegendPosition -{ - Hidden, - Top, - Bottom, - Left, - Right -} - - -public enum TablePresetStyle -{ - ModernMinimal, - EnterpriseBlue, - DarkModeSlate, - ZebraStriped, - FinancialBordered, - EmeraldGreen, - AmberAccent, - CompactClean -} - -public enum BarcodeType -{ - Code128, - Code39, - Ean13, - UpcA, - Itf14, - Codabar, - Pdf417 -} - -public enum QrCodeEccLevel -{ - L, // Low (~7% recovery) - M, // Medium (~15% recovery) - Q, // Quartile (~25% recovery) - H // High (~30% recovery) -} - -public enum QrCodePresetKind -{ - Url, - Wifi, - VCard, - PlainText, - Email, - PhoneCall, - Sms, - GeoLocation, - CryptoAddress, - EventCalendar -} - -public enum StampType -{ - Approved, - Confidential, - Draft, - Urgent, - SignHere, - Void, - Completed, - Final, - Expired, - Received, - Custom -} - -public enum RibbonTabKind -{ - File, - Home, - Edit, - Comment, - Insert, - Sign, - Forms, - Organize, - Protect, - Audit, - Export, - Plugins -} - -public enum ToolMode -{ - Select, - Pan, - Zoom, - Text, - Shape, - Highlight, - Draw, - Form, - Redact, - Signature, - Measure -} - -public enum SidebarTabKind -{ - Thumbnails, - Outline, - Comments, - AiAssistant -} - -public enum HomeNavSection -{ - Home, - NewDocument, - PdfReader, - AllTools, - OrganizeAndPage, - OptimizeAndSecurity, - ConvertFromPdf, - ConvertToPdf, - EditAndForms, - AiAndAutomation, - Starred, - Trash, - Licensing, - FontPackages, - TesseractData, - Help, - Settings, - Plugins -} - -public enum ToastPosition -{ - BottomCenter, - BottomRight, - BottomLeft, - TopCenter, - TopRight, - TopLeft -} - -public enum ToastStyleVariant -{ - Solid, - Subtle, - Auto -} - -public enum ToastNotificationType -{ - Primary, - Success, - Danger, - Warning, - General -} - -public enum PdfReaderTheme -{ - Default, - Sepia, - Dark, - HighContrast -} - -public enum PdfViewLayoutMode -{ - ContinuousScroll, - SinglePage, - TwoPageSpread -} - -public enum PdfViewerZoomMode -{ - Custom, - FitWidth, - FitPage -} - -public enum AppThemeMode -{ - System, - Light, - Dark -} diff --git a/src/PdfEditorApp.Core/Models/FontPackageModels.cs b/src/PdfEditorApp.Core/Models/FontPackageModels.cs deleted file mode 100644 index cc3acd4..0000000 --- a/src/PdfEditorApp.Core/Models/FontPackageModels.cs +++ /dev/null @@ -1,71 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace PdfEditorApp.Core.Models; - -/// -/// Categories for grouping language and font packages. -/// -public enum FontPackageCategory -{ - All, - EastAsia, - SouthAsia, - MiddleEast, - SoutheastAsia, - EuropeAndEurasia, - DesignAndTypography -} - -/// -/// Status of an on-demand font package. -/// -public enum FontPackageStatus -{ - NotInstalled, - Downloading, - Installed, - UpdateAvailable, - Error -} - -/// -/// Metadata for an individual font file inside a package. -/// -public class FontFileItem -{ - public string FileName { get; set; } = string.Empty; - public string DownloadUrl { get; set; } = string.Empty; - public long FileSizeBytes { get; set; } - public string FontFamilyName { get; set; } = string.Empty; - public bool IsBold { get; set; } - public bool IsItalic { get; set; } -} - -/// -/// Representation of a language or font pack available for on-demand installation. -/// -public class FontPackageInfo -{ - public string Id { get; set; } = string.Empty; - public string Name { get; set; } = string.Empty; - public string NativeName { get; set; } = string.Empty; - public string FlagEmoji { get; set; } = "🌐"; - public string Region { get; set; } = string.Empty; - public FontPackageCategory Category { get; set; } = FontPackageCategory.EastAsia; - public string Description { get; set; } = string.Empty; - public string SampleText { get; set; } = string.Empty; - public List SupportedLanguages { get; set; } = new(); - public List IncludedFontFamilies { get; set; } = new(); - public List Files { get; set; } = new(); - public long TotalEstimatedSizeBytes { get; set; } - public string FormattedSize => FormatBytes(TotalEstimatedSizeBytes); - public bool IsBundledByDefault { get; set; } - - public static string FormatBytes(long bytes) - { - if (bytes <= 0) return "0 KB"; - if (bytes < 1024 * 1024) return $"{bytes / 1024.0:F1} KB"; - return $"{bytes / (1024.0 * 1024.0):F1} MB"; - } -} diff --git a/src/PdfEditorApp.Core/Models/OcrModels.cs b/src/PdfEditorApp.Core/Models/OcrModels.cs deleted file mode 100644 index 29e0241..0000000 --- a/src/PdfEditorApp.Core/Models/OcrModels.cs +++ /dev/null @@ -1,103 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; - -namespace PdfEditorApp.Core.Models; - -/// -/// Type of OCR engine used for text recognition. -/// -public enum OcrEngineType -{ - Auto, - OsNative, - Tesseract, - None -} - -/// -/// Lightweight normalized or point bounding box independent of UI framework. -/// -public readonly record struct OcrBoundingBox(double X, double Y, double Width, double Height) -{ - public double Right => X + Width; - public double Bottom => Y + Height; - - public static OcrBoundingBox Empty => new(0, 0, 0, 0); - - public bool Contains(double px, double py) => - px >= X && px <= Right && py >= Y && py <= Bottom; -} - -/// -/// A single recognized word with bounds normalized between 0.0 and 1.0. -/// -public class OcrWordItem -{ - public string Text { get; set; } = string.Empty; - public OcrBoundingBox NormalizedBounds { get; set; } - public float Confidence { get; set; } = 1.0f; -} - -/// -/// A line of recognized words. -/// -public class OcrLineItem -{ - public string Text { get; set; } = string.Empty; - public OcrBoundingBox NormalizedBounds { get; set; } - public List Words { get; set; } = new(); -} - -/// -/// Output of an OCR recognition operation on an image or page. -/// -public class OcrResult -{ - public bool Success { get; set; } - public string ErrorMessage { get; set; } = string.Empty; - public string FullText { get; set; } = string.Empty; - public List Lines { get; set; } = new(); - public List Words { get; set; } = new(); - public string EngineUsed { get; set; } = string.Empty; - public long DurationMs { get; set; } -} - -/// -/// Metadata for an on-demand downloadable Tesseract language model. -/// -public class TesseractLanguagePackageInfo -{ - public string Code { get; set; } = string.Empty; - public string DisplayName { get; set; } = string.Empty; - public string NativeName { get; set; } = string.Empty; - public string FlagEmoji { get; set; } = "🌐"; - public string Category { get; set; } = "Latin & European"; - public string Description { get; set; } = string.Empty; - public string SampleText { get; set; } = string.Empty; - public long EstimatedSizeBytes { get; set; } - public string DownloadUrl { get; set; } = string.Empty; - public string FileName => $"{Code}.traineddata"; - public bool IsInstalled { get; set; } - - public string FormattedSize => FormatBytes(EstimatedSizeBytes); - - public static string FormatBytes(long bytes) - { - if (bytes <= 0) return "0 KB"; - if (bytes < 1024 * 1024) return $"{bytes / 1024.0:F1} KB"; - return $"{bytes / (1024.0 * 1024.0):F1} MB"; - } -} - -/// -/// Unified contract for optical character recognition providers. -/// -public interface IOcrEngine -{ - string EngineName { get; } - OcrEngineType EngineType { get; } - bool IsAvailable { get; } - Task RecognizeTextAsync(byte[] imageBytes, string language = "eng", CancellationToken ct = default); -} diff --git a/src/PdfEditorApp.Core/Models/OutlineItem.cs b/src/PdfEditorApp.Core/Models/OutlineItem.cs deleted file mode 100644 index c4b3296..0000000 --- a/src/PdfEditorApp.Core/Models/OutlineItem.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace PdfEditorApp.Core.Models; - -public class OutlineItem -{ - public string Title { get; set; } = ""; - public int PageIndex { get; set; } - public string Kind { get; set; } = "Heading"; -} diff --git a/src/PdfEditorApp.Core/Models/PdfDocumentModel.cs b/src/PdfEditorApp.Core/Models/PdfDocumentModel.cs deleted file mode 100644 index 454cc48..0000000 --- a/src/PdfEditorApp.Core/Models/PdfDocumentModel.cs +++ /dev/null @@ -1,44 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace PdfEditorApp.Core.Models; - -public class PdfDocumentModel -{ - public string Id { get; set; } = Guid.NewGuid().ToString("N"); - public string Title { get; set; } = "Document_2026.pdf"; - public string Author { get; set; } = "CodeFryDev"; - public string Subject { get; set; } = "Annual Financial & Operations Report"; - public string Keywords { get; set; } = ""; - public string Creator { get; set; } = "FryPDF"; - public string Producer { get; set; } = "codefrydev.in"; - public DateTime CreatedDate { get; set; } = DateTime.Now; - public DateTime ModifiedDate { get; set; } = DateTime.Now; - - public List Pages { get; set; } = new(); - public PdfSecuritySettings SecuritySettings { get; set; } = new(); - - public PdfDocumentModel Clone() - { - var clone = new PdfDocumentModel - { - Id = Guid.NewGuid().ToString("N"), - Title = Title, - Author = Author, - Subject = Subject, - Keywords = Keywords, - Creator = Creator, - Producer = Producer, - CreatedDate = CreatedDate, - ModifiedDate = DateTime.Now, - SecuritySettings = SecuritySettings.Clone() - }; - - foreach (var page in Pages) - { - clone.Pages.Add(page.Clone()); - } - - return clone; - } -} diff --git a/src/PdfEditorApp.Core/Models/PdfPageModel.cs b/src/PdfEditorApp.Core/Models/PdfPageModel.cs deleted file mode 100644 index e361e34..0000000 --- a/src/PdfEditorApp.Core/Models/PdfPageModel.cs +++ /dev/null @@ -1,62 +0,0 @@ -using System; -using System.Collections.Generic; -using PdfEditorApp.Core.Models.Elements; - -namespace PdfEditorApp.Core.Models; - -public class PdfPageModel -{ - public string Id { get; set; } = Guid.NewGuid().ToString("N"); - public int PageNumber { get; set; } = 1; - - public PageFormat Format { get; set; } = PageFormat.A4; - public PageOrientation Orientation { get; set; } = PageOrientation.Portrait; - public int RotationAngle { get; set; } = 0; // 0, 90, 180, 270 - - public double Width { get; set; } = 800; // Screen display canvas points (A4 ratio = 800 x 1131) - public double Height { get; set; } = 1131; - - public string BackgroundColorHex { get; set; } = "#FFFFFF"; - - public bool ShowHeaderFooter { get; set; } = true; - public string? HeaderLeft { get; set; } - public string? HeaderCenter { get; set; } - public string? HeaderRight { get; set; } - public string? FooterLeft { get; set; } = "CONFIDENTIAL & PROPRIETARY"; - public string? FooterCenter { get; set; } - public string? FooterRight { get; set; } = "Page {P} of {N}"; - - public PdfWatermarkElement? Watermark { get; set; } - - public List Elements { get; set; } = new(); - - public PdfPageModel Clone() - { - var clone = new PdfPageModel - { - Id = Guid.NewGuid().ToString("N"), - PageNumber = PageNumber, - Format = Format, - Orientation = Orientation, - RotationAngle = RotationAngle, - Width = Width, - Height = Height, - BackgroundColorHex = BackgroundColorHex, - ShowHeaderFooter = ShowHeaderFooter, - HeaderLeft = HeaderLeft, - HeaderCenter = HeaderCenter, - HeaderRight = HeaderRight, - FooterLeft = FooterLeft, - FooterCenter = FooterCenter, - FooterRight = FooterRight, - Watermark = (PdfWatermarkElement?)Watermark?.Clone() - }; - - foreach (var element in Elements) - { - clone.Elements.Add(element.Clone()); - } - - return clone; - } -} diff --git a/src/PdfEditorApp.Core/Models/PdfSecuritySettings.cs b/src/PdfEditorApp.Core/Models/PdfSecuritySettings.cs deleted file mode 100644 index 4a1f36a..0000000 --- a/src/PdfEditorApp.Core/Models/PdfSecuritySettings.cs +++ /dev/null @@ -1,32 +0,0 @@ -namespace PdfEditorApp.Core.Models; - -public class PdfSecuritySettings -{ - public bool IsPasswordProtected { get; set; } = false; - public string OpenPassword { get; set; } = ""; - public string PermissionsPassword { get; set; } = ""; - - public bool AllowPrinting { get; set; } = true; - public bool AllowContentCopying { get; set; } = true; - public bool AllowModifications { get; set; } = true; - public bool AllowAnnotations { get; set; } = true; - - public bool ScrubMetadataOnExport { get; set; } = false; - public bool RemoveCommentsOnExport { get; set; } = false; - - public PdfSecuritySettings Clone() - { - return new PdfSecuritySettings - { - IsPasswordProtected = IsPasswordProtected, - OpenPassword = OpenPassword, - PermissionsPassword = PermissionsPassword, - AllowPrinting = AllowPrinting, - AllowContentCopying = AllowContentCopying, - AllowModifications = AllowModifications, - AllowAnnotations = AllowAnnotations, - ScrubMetadataOnExport = ScrubMetadataOnExport, - RemoveCommentsOnExport = RemoveCommentsOnExport - }; - } -} diff --git a/src/PdfEditorApp.Core/PdfEditorApp.Core.csproj b/src/PdfEditorApp.Core/PdfEditorApp.Core.csproj deleted file mode 100644 index 5edc5c7..0000000 --- a/src/PdfEditorApp.Core/PdfEditorApp.Core.csproj +++ /dev/null @@ -1,29 +0,0 @@ - - - net10.0 - enable - true - $(NoWarn);NU1901;NU1902;NU1903;NU1904 - PdfEditorApp.Core - PdfEditorApp.Core - 1.0.0 - Code Fry Dev - Copyright © 2026 Code Fry Dev - true - High-performance PDF deconstruction, layout analysis, and document engineering core library - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp.Core/Plugins/Descriptors/CanvasElementDescriptor.cs b/src/PdfEditorApp.Core/Plugins/Descriptors/CanvasElementDescriptor.cs deleted file mode 100644 index 8b7d275..0000000 --- a/src/PdfEditorApp.Core/Plugins/Descriptors/CanvasElementDescriptor.cs +++ /dev/null @@ -1,49 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace PdfEditorApp.Core.Plugins.Descriptors; - -/// -/// Descriptor defining a canvas element type contributed by a plugin or built-in system. -/// -public record CanvasElementDescriptor -{ - /// Unique identifier for this element type, e.g. "frypdf.element.text" or "vendor.element.barcode". - public required string ElementTypeId { get; init; } - - /// Human-readable display name, e.g. "Barcode / QR Code". - public required string DisplayName { get; init; } - - /// The domain model type (must inherit from ). - public required Type ModelType { get; init; } - - /// The presentation ViewModel type for the canvas element. - public required Type ViewModelType { get; init; } - - /// Icon representing this element type in the inserter menu or toolbar. - public string IconKind { get; init; } = "ShapeOutline"; - - /// Default initial width in points when placed on canvas. - public double DefaultWidth { get; init; } = 150; - - /// Default initial height in points when placed on canvas. - public double DefaultHeight { get; init; } = 100; - - /// Search tags for element discovery. - public IReadOnlyList Tags { get; init; } = Array.Empty(); - - /// Optional factory delegate to instantiate the ViewModel from an optional model instance. - public Func? Factory { get; init; } - - /// Whether this element can be inserted directly from the Ribbon Insert tab / toolbar. - public bool CanInsertFromToolbar { get; init; } = true; - - /// Category grouping in the inserter menu (e.g. "Basic", "Media", "Data", "Forms", "Math"). - public string InsertionCategory { get; init; } = "Basic"; - - /// Optional single-key shortcut for rapid insertion (e.g. "T", "R", "I"). - public string? ShortcutKey { get; init; } - - /// Ordering weight in the inserter menu (lower numbers appear first). - public int SortOrder { get; init; } = 100; -} diff --git a/src/PdfEditorApp.Core/Plugins/Descriptors/ICanvasElementRegistry.cs b/src/PdfEditorApp.Core/Plugins/Descriptors/ICanvasElementRegistry.cs deleted file mode 100644 index 5822ab7..0000000 --- a/src/PdfEditorApp.Core/Plugins/Descriptors/ICanvasElementRegistry.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace PdfEditorApp.Core.Plugins.Descriptors; - -/// -/// Registry for canvas element types contributed by plugins or core modules. -/// -public interface ICanvasElementRegistry -{ - /// - /// Registers a canvas element descriptor. - /// - void RegisterElement(CanvasElementDescriptor descriptor); - - /// - /// Unregisters a canvas element descriptor by its unique ID. - /// - bool UnregisterElement(string elementTypeId); - - /// - /// Looks up an element descriptor by its unique element type ID. - /// - CanvasElementDescriptor? GetDescriptor(string elementTypeId); - - /// - /// Looks up an element descriptor matching a domain model type. - /// - CanvasElementDescriptor? GetDescriptorByModelType(Type modelType); - - /// - /// Returns all registered canvas element descriptors. - /// - IReadOnlyList GetAllDescriptors(); - - /// - /// Returns all canvas element descriptors that can be inserted from the toolbar. - /// - IReadOnlyList GetInsertableElements(); -} diff --git a/src/PdfEditorApp.Core/Plugins/Descriptors/ICommandPaletteRegistry.cs b/src/PdfEditorApp.Core/Plugins/Descriptors/ICommandPaletteRegistry.cs deleted file mode 100644 index bf1aa38..0000000 --- a/src/PdfEditorApp.Core/Plugins/Descriptors/ICommandPaletteRegistry.cs +++ /dev/null @@ -1,46 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace PdfEditorApp.Core.Plugins.Descriptors; - -/// -/// Descriptor for a command or action searchable in the Command Palette (⌘K / Ctrl+K), -/// contributed dynamically by plugins. -/// -public class CommandPaletteDescriptor -{ - public string Id { get; init; } = ""; - public string Title { get; init; } = ""; - public string Subtitle { get; init; } = ""; - public string Category { get; init; } = "General"; - public string IconKind { get; init; } = "LightningBolt"; - public string? Shortcut { get; init; } - public int Order { get; init; } = 100; - public Action? Action { get; init; } -} - -/// -/// Registry for discovering and dispatching Command Palette commands across plugins. -/// -public interface ICommandPaletteRegistry -{ - /// - /// Registers a command into the palette. - /// - IDisposable RegisterCommand(CommandPaletteDescriptor descriptor); - - /// - /// Unregisters a command by its unique ID. - /// - bool UnregisterCommand(string commandId); - - /// - /// Gets all registered command palette descriptors. - /// - IReadOnlyList GetAllCommands(); - - /// - /// Triggered when commands are registered or unregistered. - /// - event Action? RegistryChanged; -} diff --git a/src/PdfEditorApp.Core/Plugins/Descriptors/IDataConnectorRegistry.cs b/src/PdfEditorApp.Core/Plugins/Descriptors/IDataConnectorRegistry.cs deleted file mode 100644 index 728a4bd..0000000 --- a/src/PdfEditorApp.Core/Plugins/Descriptors/IDataConnectorRegistry.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using PdfEditorApp.Core.Data; - -namespace PdfEditorApp.Core.Plugins.Descriptors; - -/// -/// Contract for a data connector plugin that loads tabular datasets into a . -/// -public interface IDataConnector -{ - string ConnectorId { get; } - string DisplayName { get; } - string Description { get; } - string IconKind { get; } - IReadOnlyList SupportedExtensions { get; } - - Task LoadDataAsync(Dictionary parameters, CancellationToken ct = default); -} - -/// -/// Registry for discovering and dispatching data connectors contributed by plugins. -/// -public interface IDataConnectorRegistry -{ - IDisposable RegisterConnector(IDataConnector connector); - IDataConnector? GetConnector(string connectorId); - IReadOnlyList GetAllConnectors(); - event Action? RegistryChanged; -} diff --git a/src/PdfEditorApp.Core/Plugins/Descriptors/IDialogRegistry.cs b/src/PdfEditorApp.Core/Plugins/Descriptors/IDialogRegistry.cs deleted file mode 100644 index 028bf9a..0000000 --- a/src/PdfEditorApp.Core/Plugins/Descriptors/IDialogRegistry.cs +++ /dev/null @@ -1,51 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace PdfEditorApp.Core.Plugins.Descriptors; - -/// -/// Descriptor representing a modal dialog or floating studio contributed by a plugin. -/// -public sealed class DialogDescriptor -{ - public required string Id { get; init; } - public required string Title { get; init; } - public Type? ViewModelType { get; init; } - public Type? ViewType { get; init; } - public Func? ViewFactory { get; init; } - public Func? ViewModelFactory { get; init; } - public bool IsModal { get; init; } = true; - public double? PreferredWidth { get; init; } - public double? PreferredHeight { get; init; } -} - -/// -/// Registry for pluggable modal dialogs and studio overlays. -/// -public interface IDialogRegistry -{ - /// - /// Registers a dialog descriptor. - /// - IDisposable RegisterDialog(DialogDescriptor descriptor); - - /// - /// Unregisters a dialog by its unique ID. - /// - bool UnregisterDialog(string dialogId); - - /// - /// Gets a registered dialog descriptor by its ID. - /// - DialogDescriptor? GetDialog(string dialogId); - - /// - /// Gets all registered dialog descriptors. - /// - IReadOnlyList GetAllDialogs(); - - /// - /// Fired when dialogs are registered or unregistered. - /// - event Action? RegistryChanged; -} diff --git a/src/PdfEditorApp.Core/Plugins/Descriptors/IDocumentExporterRegistry.cs b/src/PdfEditorApp.Core/Plugins/Descriptors/IDocumentExporterRegistry.cs deleted file mode 100644 index f785790..0000000 --- a/src/PdfEditorApp.Core/Plugins/Descriptors/IDocumentExporterRegistry.cs +++ /dev/null @@ -1,88 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using PdfEditorApp.Core.Models; - -namespace PdfEditorApp.Core.Plugins.Descriptors; - -/// -/// Options provided to document exporters during export execution. -/// -public record DocumentExportOptions -{ - public string OutputPath { get; init; } = ""; - public int Dpi { get; init; } = 300; - public bool IncludeAnnotations { get; init; } = true; - public bool OptimizeForWeb { get; init; } = false; - public string? Password { get; init; } - public Dictionary CustomParameters { get; init; } = new(); -} - -/// -/// Contract for a document exporter plugin that serializes a -/// to an output format (PDF, Markdown, HTML, Plain Text, PNG/JPEG, SVG). -/// -public interface IDocumentExporter -{ - /// - /// Unique identifier for this exporter, e.g. "frypdf.exporter.pdf" or "frypdf.exporter.markdown". - /// - string ExporterId { get; } - - /// - /// User-facing display name, e.g. "PDF Document (.pdf)" or "GitHub-Flavored Markdown (.md)". - /// - string DisplayName { get; } - - /// - /// Default file extension with leading dot, e.g. ".pdf", ".md", ".html". - /// - string DefaultExtension { get; } - - /// - /// File filter description for OS save dialogs, e.g. "PDF Documents (*.pdf)|*.pdf". - /// - string FileFilterDescription { get; } - - /// - /// Material icon name for UI representation. - /// - string IconKind { get; } - - /// - /// Exports the document model and returns the generated bytes. - /// - Task ExportAsync(PdfDocumentModel document, DocumentExportOptions options, CancellationToken ct = default); -} - -/// -/// Registry for discovering and managing multi-format document exporters contributed by plugins. -/// -public interface IDocumentExporterRegistry -{ - /// - /// Registers an exporter into the system. - /// - IDisposable RegisterExporter(IDocumentExporter exporter); - - /// - /// Retrieves an exporter by its unique ID. - /// - IDocumentExporter? GetExporter(string exporterId); - - /// - /// Finds an exporter by output file extension (e.g. ".md" or ".html"). - /// - IDocumentExporter? FindExporterByExtension(string extension); - - /// - /// Gets all registered document exporters. - /// - IReadOnlyList GetAllExporters(); - - /// - /// Raised whenever an exporter is registered or unregistered. - /// - event Action? RegistryChanged; -} diff --git a/src/PdfEditorApp.Core/Plugins/Descriptors/IDocumentImporterRegistry.cs b/src/PdfEditorApp.Core/Plugins/Descriptors/IDocumentImporterRegistry.cs deleted file mode 100644 index 578a9dd..0000000 --- a/src/PdfEditorApp.Core/Plugins/Descriptors/IDocumentImporterRegistry.cs +++ /dev/null @@ -1,71 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Threading; -using System.Threading.Tasks; -using PdfEditorApp.Core.Models; - -namespace PdfEditorApp.Core.Plugins.Descriptors; - -/// -/// Contract for a document importer plugin that converts raw file streams or bytes -/// into editable, multi-layered instances. -/// -public interface IDocumentImporter -{ - /// - /// Unique identifier for this importer, e.g. "frypdf.importer.pdfpig" or "frypdf.importer.image". - /// - string ImporterId { get; } - - /// - /// User-facing display name, e.g. "Adobe PDF Deconstruction Engine" or "Raster Image Converter". - /// - string DisplayName { get; } - - /// - /// Supported file extensions including leading dot, e.g. [".pdf"] or [".png", ".jpg", ".jpeg", ".webp"]. - /// - IReadOnlyList SupportedExtensions { get; } - - /// - /// Priority order for resolution when multiple importers claim the same extension (higher = higher priority). - /// - int Priority => 0; - - /// - /// Imports a document stream and returns an editable . - /// - Task ImportAsync(Stream stream, string fileName, string? password = null, CancellationToken ct = default); -} - -/// -/// Registry for discovering and dispatching document importers contributed by plugins. -/// -public interface IDocumentImporterRegistry -{ - /// - /// Registers an importer into the system. - /// - IDisposable RegisterImporter(IDocumentImporter importer); - - /// - /// Finds the highest-priority importer capable of handling the specified file path or extension. - /// - IDocumentImporter? FindImporter(string filePathOrExtension); - - /// - /// Retrieves an importer by its unique ID. - /// - IDocumentImporter? GetImporter(string importerId); - - /// - /// Gets all registered document importers. - /// - IReadOnlyList GetAllImporters(); - - /// - /// Raised whenever an importer is registered or unregistered. - /// - event Action? RegistryChanged; -} diff --git a/src/PdfEditorApp.Core/Plugins/Descriptors/IInspectorRegistry.cs b/src/PdfEditorApp.Core/Plugins/Descriptors/IInspectorRegistry.cs deleted file mode 100644 index 755c180..0000000 --- a/src/PdfEditorApp.Core/Plugins/Descriptors/IInspectorRegistry.cs +++ /dev/null @@ -1,66 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace PdfEditorApp.Core.Plugins.Descriptors; - -/// -/// Descriptor for an inspector property panel section contributed by a plugin. -/// -public class InspectorSectionDescriptor -{ - /// - /// Unique identifier for this section, e.g. "frypdf.inspector.geometry" or "frypdf.inspector.barcode". - /// - public string SectionId { get; init; } = ""; - - /// - /// Section header title displayed in the inspector sidebar. - /// - public string Title { get; init; } = ""; - - /// - /// Material icon name for the section header. - /// - public string IconKind { get; init; } = "Tune"; - - /// - /// Display sort order within the inspector (lower numbers appear higher). - /// - public int Order { get; init; } = 100; - - /// - /// Evaluates whether this section applies to the given element instance (or null for page/document level). - /// - public Func AppliesTo { get; init; } = _ => true; - - /// - /// Factory delegate to create the section ViewModel or control. - /// - public Func Factory { get; init; } = (sp, el) => new object(); -} - -/// -/// Registry for discovering and managing dynamic inspector property panels. -/// -public interface IInspectorRegistry -{ - /// - /// Registers a new inspector section into the system. - /// - IDisposable RegisterSection(InspectorSectionDescriptor descriptor); - - /// - /// Gets all inspector sections applicable to the selected element or context. - /// - IReadOnlyList GetSectionsForTarget(object? target); - - /// - /// Gets all registered inspector sections. - /// - IReadOnlyList GetAllSections(); - - /// - /// Raised whenever a section is registered or unregistered. - /// - event Action? RegistryChanged; -} diff --git a/src/PdfEditorApp.Core/Plugins/Descriptors/INavigationRegistry.cs b/src/PdfEditorApp.Core/Plugins/Descriptors/INavigationRegistry.cs deleted file mode 100644 index 9170b3a..0000000 --- a/src/PdfEditorApp.Core/Plugins/Descriptors/INavigationRegistry.cs +++ /dev/null @@ -1,57 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace PdfEditorApp.Core.Plugins.Descriptors; - -/// -/// Descriptor representing a workspace page or navigation section contributed by a plugin. -/// -public sealed class NavigationItemDescriptor -{ - public required string Id { get; init; } - public required string Title { get; init; } - public string Group { get; init; } = "General"; // Overview, Categories, Library, Preferences, Extensions - public string IconKind { get; init; } = "ApplicationOutline"; - public string? BadgeText { get; init; } - public string? BadgeColorHex { get; init; } - public int Order { get; init; } = 100; - public Type? ViewModelType { get; init; } - public Func? ViewFactory { get; init; } - public Func? ViewModelFactory { get; init; } -} - -/// -/// Registry for pluggable navigation sections and full-page workspace views. -/// -public interface INavigationRegistry -{ - /// - /// Registers a new navigation item descriptor. - /// - IDisposable RegisterNavigationItem(NavigationItemDescriptor descriptor); - - /// - /// Unregisters a navigation item by its unique ID. - /// - bool UnregisterNavigationItem(string itemId); - - /// - /// Gets all registered navigation items in ascending display order. - /// - IReadOnlyList GetAllItems(); - - /// - /// Gets registered navigation items belonging to a specific group. - /// - IReadOnlyList GetItemsByGroup(string group); - - /// - /// Gets a single navigation item by its unique ID. - /// - NavigationItemDescriptor? GetItem(string itemId); - - /// - /// Fired when navigation items are registered or unregistered. - /// - event Action? RegistryChanged; -} diff --git a/src/PdfEditorApp.Core/Plugins/Descriptors/IOcrEngineRegistry.cs b/src/PdfEditorApp.Core/Plugins/Descriptors/IOcrEngineRegistry.cs deleted file mode 100644 index 8cb7169..0000000 --- a/src/PdfEditorApp.Core/Plugins/Descriptors/IOcrEngineRegistry.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System; -using System.Collections.Generic; -using PdfEditorApp.Core.Models; - -namespace PdfEditorApp.Core.Plugins.Descriptors; - -/// -/// Registry for discovering and dispatching OCR engines contributed by plugins. -/// -public interface IOcrEngineRegistry -{ - /// - /// Registers an OCR engine into the system. - /// - IDisposable RegisterEngine(IOcrEngine engine); - - /// - /// Finds an OCR engine by its display name. - /// - IOcrEngine? GetEngine(string engineName); - - /// - /// Gets all registered OCR engines. - /// - IReadOnlyList GetAllEngines(); - - /// - /// Gets all available OCR engines that are supported on the current host OS. - /// - IReadOnlyList GetAvailableEngines(); - - /// - /// Raised whenever an OCR engine is registered or unregistered. - /// - event Action? RegistryChanged; -} diff --git a/src/PdfEditorApp.Core/Plugins/Descriptors/IOverlayRegistry.cs b/src/PdfEditorApp.Core/Plugins/Descriptors/IOverlayRegistry.cs deleted file mode 100644 index 4605d5d..0000000 --- a/src/PdfEditorApp.Core/Plugins/Descriptors/IOverlayRegistry.cs +++ /dev/null @@ -1,60 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace PdfEditorApp.Core.Plugins.Descriptors; - -/// -/// Thread-safe registry and manager for non-modal floating overlays targeting the 'shell.overlay' slot. -/// -public interface IOverlayRegistry -{ - /// - /// Registers an overlay descriptor contributed by a plugin. - /// - IDisposable RegisterOverlay(OverlayDescriptor descriptor); - - /// - /// Unregisters an overlay by its unique ID. - /// - bool UnregisterOverlay(string overlayId); - - /// - /// Retrieves a registered overlay descriptor by its ID. - /// - OverlayDescriptor? GetOverlay(string overlayId); - - /// - /// Gets all currently registered overlay descriptors. - /// - IReadOnlyList GetAllOverlays(); - - /// - /// Displays the specified overlay in the active shell. - /// - void ShowOverlay(string overlayId); - - /// - /// Hides the specified overlay. - /// - void HideOverlay(string overlayId); - - /// - /// Toggles the visibility of the specified overlay. - /// - void ToggleOverlay(string overlayId); - - /// - /// Checks whether the specified overlay is currently visible and active. - /// - bool IsOverlayVisible(string overlayId); - - /// - /// Fired when an overlay descriptor is registered or unregistered. - /// - event Action? RegistryChanged; - - /// - /// Fired when active overlay instances are shown, hidden, or modified. - /// - event Action? ActiveOverlaysChanged; -} diff --git a/src/PdfEditorApp.Core/Plugins/Descriptors/IRibbonRegistry.cs b/src/PdfEditorApp.Core/Plugins/Descriptors/IRibbonRegistry.cs deleted file mode 100644 index 7c4fd5d..0000000 --- a/src/PdfEditorApp.Core/Plugins/Descriptors/IRibbonRegistry.cs +++ /dev/null @@ -1,82 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace PdfEditorApp.Core.Plugins.Descriptors; - -/// -/// Descriptor representing a Ribbon Tab contributed dynamically by a plugin. -/// -public sealed class RibbonTabDescriptor -{ - public required string Id { get; init; } - public required string Title { get; init; } - public int Order { get; init; } = 100; - public bool IsDynamic { get; init; } = true; -} - -/// -/// Descriptor representing a logical group of tools within a Ribbon Tab. -/// -public sealed class RibbonGroupDescriptor -{ - public required string Id { get; init; } - public required string TabId { get; init; } - public required string Title { get; init; } - public int Order { get; init; } = 100; -} - -/// -/// Registry for dynamic Ribbon tabs, groups, and actions contributed by plugins. -/// -public interface IRibbonRegistry -{ - /// - /// Registers a dynamic ribbon tab. - /// - IDisposable RegisterTab(RibbonTabDescriptor tab); - - /// - /// Registers a ribbon tool group inside a tab. - /// - IDisposable RegisterGroup(RibbonGroupDescriptor group); - - /// - /// Registers a ribbon action descriptor. - /// - void RegisterAction(RibbonActionDescriptor action); - - /// - /// Unregisters a ribbon action by its unique ID. - /// - bool UnregisterAction(string actionId); - - /// - /// Gets all registered ribbon tabs. - /// - IReadOnlyList GetAllTabs(); - - /// - /// Gets all groups registered under a specific ribbon tab. - /// - IReadOnlyList GetGroupsForTab(string tabId); - - /// - /// Gets all actions registered for a specific Ribbon tab (e.g. "Home", "Tools", "Plugins"). - /// - IReadOnlyList GetActionsForTab(string tabId); - - /// - /// Gets all actions registered for a specific group within a tab. - /// - IReadOnlyList GetActionsForGroup(string tabId, string groupId); - - /// - /// Gets all registered ribbon actions across all tabs. - /// - IReadOnlyList GetAllActions(); - - /// - /// Triggered when tabs, groups, or actions are added or removed. - /// - event Action? RegistryChanged; -} diff --git a/src/PdfEditorApp.Core/Plugins/Descriptors/ISidebarRegistry.cs b/src/PdfEditorApp.Core/Plugins/Descriptors/ISidebarRegistry.cs deleted file mode 100644 index 246e69a..0000000 --- a/src/PdfEditorApp.Core/Plugins/Descriptors/ISidebarRegistry.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace PdfEditorApp.Core.Plugins.Descriptors; - -/// -/// Descriptor representing an editor sidebar panel contributed by a plugin. -/// -public sealed class SidebarTabDescriptor -{ - public required string Id { get; init; } - public required string Title { get; init; } - public string IconKind { get; init; } = "DockLeft"; - public string Tooltip { get; init; } = ""; - public int Order { get; init; } = 100; - public Type? ViewModelType { get; init; } - public Func? ViewFactory { get; init; } - public Func? ViewModelFactory { get; init; } -} - -/// -/// Registry for pluggable document editor left/right sidebar tabs. -/// -public interface ISidebarRegistry -{ - /// - /// Registers a sidebar tab descriptor. - /// - IDisposable RegisterTab(SidebarTabDescriptor descriptor); - - /// - /// Unregisters a sidebar tab by its ID. - /// - bool UnregisterTab(string tabId); - - /// - /// Gets all registered sidebar tabs ordered by priority. - /// - IReadOnlyList GetAllTabs(); - - /// - /// Gets a single tab descriptor by its ID. - /// - SidebarTabDescriptor? GetTab(string tabId); - - /// - /// Fired when sidebar tabs are registered or unregistered. - /// - event Action? RegistryChanged; -} diff --git a/src/PdfEditorApp.Core/Plugins/Descriptors/IStatusBarRegistry.cs b/src/PdfEditorApp.Core/Plugins/Descriptors/IStatusBarRegistry.cs deleted file mode 100644 index 8c04587..0000000 --- a/src/PdfEditorApp.Core/Plugins/Descriptors/IStatusBarRegistry.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace PdfEditorApp.Core.Plugins.Descriptors; - -public enum StatusBarAlignment -{ - Left, - Right -} - -/// -/// Descriptor for a status bar widget contributed by a plugin. -/// -public class StatusBarWidgetDescriptor -{ - public string WidgetId { get; init; } = ""; - public string ToolTip { get; init; } = ""; - public StatusBarAlignment Alignment { get; init; } = StatusBarAlignment.Left; - public int Order { get; init; } = 100; - public Func Factory { get; init; } = _ => new object(); -} - -/// -/// Registry for discovering and dispatching status bar widgets. -/// -public interface IStatusBarRegistry -{ - IDisposable RegisterWidget(StatusBarWidgetDescriptor widget); - IReadOnlyList GetWidgets(StatusBarAlignment alignment); - IReadOnlyList GetAllWidgets(); - event Action? RegistryChanged; -} diff --git a/src/PdfEditorApp.Core/Plugins/Descriptors/ITemplateRegistry.cs b/src/PdfEditorApp.Core/Plugins/Descriptors/ITemplateRegistry.cs deleted file mode 100644 index 2b555e9..0000000 --- a/src/PdfEditorApp.Core/Plugins/Descriptors/ITemplateRegistry.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System; -using System.Collections.Generic; -using PdfEditorApp.Core.Models; - -namespace PdfEditorApp.Core.Plugins.Descriptors; - -/// -/// Contract for a document template contributed by a plugin. -/// -public interface ITemplateDescriptor -{ - string Id { get; } - string Name { get; } - string Description { get; } - string Category { get; } - string IconKind { get; } - string AccentColorHex { get; } - - PdfDocumentModel Create(); -} - -/// -/// Registry for discovering and dispatching document templates. -/// -public interface ITemplateRegistry -{ - IDisposable RegisterTemplate(ITemplateDescriptor template); - ITemplateDescriptor? GetTemplate(string id); - IReadOnlyList GetAllTemplates(); - IReadOnlyList GetCategories(); - event Action? RegistryChanged; -} diff --git a/src/PdfEditorApp.Core/Plugins/Descriptors/OverlayDescriptor.cs b/src/PdfEditorApp.Core/Plugins/Descriptors/OverlayDescriptor.cs deleted file mode 100644 index a49978f..0000000 --- a/src/PdfEditorApp.Core/Plugins/Descriptors/OverlayDescriptor.cs +++ /dev/null @@ -1,56 +0,0 @@ -using System; - -namespace PdfEditorApp.Core.Plugins.Descriptors; - -/// -/// Mode determining how the shell overlay container renders framing, titlebar, and chrome for the overlay view. -/// -public enum OverlayChromeMode -{ - /// - /// Automatic Google Material Design 3 Expressive window card frame with draggable header, title, icon, minimize pill, and close button. - /// Ideal for standard user controls, tools, forms, and utilities without requiring manual header implementation. - /// - StandardCard = 0, - - /// - /// Borderless / custom chrome where the view provides its own entire visual frame, header, and dragging physics. - /// Used for games, custom HUDs, or full-bleed graphics overlays (e.g. Retro Snake). - /// - CustomChrome = 1, - - /// - /// Compact floating pill / HUD bar anchored or free-floating. - /// - FloatingPill = 2 -} - -/// -/// Descriptor representing a non-modal floating overlay panel contributed by a plugin (targeting 'shell.overlay'). -/// Inspired by the Cordis dynamic overlay slot architecture. -/// -public sealed class OverlayDescriptor -{ - public required string Id { get; init; } - public required string Title { get; init; } - public string Slot { get; init; } = "shell.overlay"; - public double DefaultWidth { get; init; } = 320; - public double DefaultHeight { get; init; } = 420; - public double? InitialX { get; init; } - public double? InitialY { get; init; } - public bool IsDraggable { get; init; } = true; - public bool IsMinimizable { get; init; } = true; - public bool IsClosable { get; init; } = true; - public string IconKind { get; init; } = "WindowRestore"; - public OverlayChromeMode ChromeMode { get; init; } = OverlayChromeMode.StandardCard; - public bool HasCustomChrome => ChromeMode == OverlayChromeMode.CustomChrome; - public bool IsResizable { get; init; } = true; - public double MinWidth { get; init; } = 220; - public double MinHeight { get; init; } = 100; - public double MaxWidth { get; init; } = 1600; - public double MaxHeight { get; init; } = 1400; - public Type? ViewType { get; init; } - public Type? ViewModelType { get; init; } - public Func? ViewFactory { get; init; } - public Func? ViewModelFactory { get; init; } -} diff --git a/src/PdfEditorApp.Core/Plugins/Descriptors/PdfToolDescriptor.cs b/src/PdfEditorApp.Core/Plugins/Descriptors/PdfToolDescriptor.cs deleted file mode 100644 index 705c285..0000000 --- a/src/PdfEditorApp.Core/Plugins/Descriptors/PdfToolDescriptor.cs +++ /dev/null @@ -1,51 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace PdfEditorApp.Core.Plugins.Descriptors; - -/// -/// Metadata descriptor defining a PDF tool contributed by a plugin. -/// -public record PdfToolDescriptor -{ - /// Unique string identifier, e.g. "frypdf.tool.merge" or "vendor.tool.stamp". - public required string Id { get; init; } - - /// Optional integer or legacy enum tag for backwards compatibility with legacy UI. - public int? LegacyId { get; init; } - - /// Human-readable display title, e.g. "Merge PDF". - public required string Name { get; init; } - - /// Descriptive summary explaining the tool's capabilities. - public required string Description { get; init; } - - /// Display category grouping, e.g. "Organize & Page", "Security", "Conversion", "Intelligence". - public required string Category { get; init; } - - /// Material Design / vector icon identifier. - public required string IconKind { get; init; } - - /// Brand or accent hex color for the icon, e.g. "#EA580C". - public string IconColorHex { get; init; } = "#2563EB"; - - /// Subtle tonal background container hex color, e.g. "#FFF7ED". - public string BackgroundAccentHex { get; init; } = "#EFF6FF"; - - /// Whether this tool supports bulk multi-file processing. - public bool SupportsMultiFile { get; init; } - - /// Comma-separated file extensions accepted by this tool, e.g. ".pdf". - public string AcceptedFileExtensions { get; init; } = ".pdf"; - - /// Search tags and keywords for quick discovery. - public IReadOnlyList Tags { get; init; } = Array.Empty(); - - /// - /// Factory delegate to instantiate the tool's execution ViewModel given a service provider. - /// - public Func? CreateViewModel { get; init; } - - /// Arbitrary metadata properties. - public IReadOnlyDictionary Metadata { get; init; } = new Dictionary(); -} diff --git a/src/PdfEditorApp.Core/Plugins/Descriptors/RibbonActionDescriptor.cs b/src/PdfEditorApp.Core/Plugins/Descriptors/RibbonActionDescriptor.cs deleted file mode 100644 index 7a0b7f3..0000000 --- a/src/PdfEditorApp.Core/Plugins/Descriptors/RibbonActionDescriptor.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System; - -namespace PdfEditorApp.Core.Plugins.Descriptors; - -/// -/// Descriptor defining a Ribbon action button or menu item contributed dynamically by a plugin. -/// -public record RibbonActionDescriptor -{ - /// Unique identifier, e.g. "ribbon.action.ocr" or "ribbon.action.stamp". - public required string Id { get; init; } - - /// Target Ribbon Tab, e.g. "Home", "Tools", "Insert", "Security", "View". - public required string TabId { get; init; } - - /// Target Group inside the tab, e.g. "Organize", "AI Studio", "Annotations". - public required string GroupId { get; init; } - - /// Display label on the button or menu item. - public required string Label { get; init; } - - /// Optional descriptive tooltip. - public string? Tooltip { get; init; } - - /// Material Design / vector icon identifier. - public required string IconKind { get; init; } - - /// Display sort order within the group. - public int Order { get; init; } = 100; - - /// Optional action delegate to execute when clicked. - public Action? Action { get; init; } -} diff --git a/src/PdfEditorApp.Core/Plugins/FryPluginContext.cs b/src/PdfEditorApp.Core/Plugins/FryPluginContext.cs deleted file mode 100644 index d31ce7f..0000000 --- a/src/PdfEditorApp.Core/Plugins/FryPluginContext.cs +++ /dev/null @@ -1,855 +0,0 @@ -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Threading.Tasks; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Plugins.Descriptors; -using PdfEditorApp.Core.Plugins.Pipelines; - -namespace PdfEditorApp.Core.Plugins; - -/// -/// Root implementation of . -/// Provides dynamic service discovery, pipeline orchestration, tool registration, and scoped lifecycle wrapping. -/// -public class FryPluginContext : IFryPluginContext -{ - private readonly ConcurrentDictionary _services = new(); - private readonly ConcurrentDictionary _tools = new(StringComparer.OrdinalIgnoreCase); - private readonly ConcurrentDictionary _canvasElements = new(StringComparer.OrdinalIgnoreCase); - private readonly ConcurrentDictionary _ribbonActions = new(StringComparer.OrdinalIgnoreCase); - private readonly ConcurrentDictionary _importers = new(StringComparer.OrdinalIgnoreCase); - private readonly ConcurrentDictionary _exporters = new(StringComparer.OrdinalIgnoreCase); - private readonly ConcurrentDictionary _inspectorSections = new(StringComparer.OrdinalIgnoreCase); - private readonly ConcurrentDictionary _templates = new(StringComparer.OrdinalIgnoreCase); - private readonly ConcurrentDictionary _ocrEngines = new(StringComparer.OrdinalIgnoreCase); - private readonly ConcurrentDictionary _dataConnectors = new(StringComparer.OrdinalIgnoreCase); - private readonly ConcurrentDictionary _statusBarWidgets = new(StringComparer.OrdinalIgnoreCase); - private readonly ConcurrentDictionary _commands = new(StringComparer.OrdinalIgnoreCase); - private readonly ConcurrentDictionary _navigationItems = new(StringComparer.OrdinalIgnoreCase); - private readonly ConcurrentDictionary _dialogs = new(StringComparer.OrdinalIgnoreCase); - private readonly ConcurrentDictionary _sidebarTabs = new(StringComparer.OrdinalIgnoreCase); - private readonly ConcurrentDictionary _ribbonTabs = new(StringComparer.OrdinalIgnoreCase); - private readonly ConcurrentDictionary _ribbonGroups = new(StringComparer.OrdinalIgnoreCase); - private readonly ConcurrentDictionary _overlays = new(StringComparer.OrdinalIgnoreCase); - private readonly IPipelineManager _pipelines; - - private readonly IServiceProvider? _fallbackServiceProvider; - private readonly PluginScope? _scope; - - public IPipelineManager Pipelines => _pipelines; - - public FryPluginContext( - IServiceProvider? fallbackServiceProvider = null, - IPipelineManager? pipelines = null, - PluginScope? scope = null) - { - _fallbackServiceProvider = fallbackServiceProvider; - _pipelines = pipelines ?? new PipelineManager(); - _scope = scope; - } - - /// - /// Creates a child context scoped to a specific plugin. - /// Registrations in the scoped context automatically attach their disposal to the plugin's . - /// - public FryPluginContext CreateScopedContext(PluginScope pluginScope) - { - ArgumentNullException.ThrowIfNull(pluginScope); - return new ScopedPluginContext(this, pluginScope); - } - - // --- Service Registration & Discovery --- - - public virtual void RegisterService(TService implementation) where TService : class - { - ArgumentNullException.ThrowIfNull(implementation); - _services[typeof(TService)] = implementation; - } - - public virtual void RegisterService(Type serviceType, object implementation) - { - ArgumentNullException.ThrowIfNull(serviceType); - ArgumentNullException.ThrowIfNull(implementation); - _services[serviceType] = implementation; - } - - public virtual TService GetService() where TService : class - { - if (TryGetService(out var service)) - { - return service; - } - - throw new KeyNotFoundException($"Service of type '{typeof(TService).FullName}' is not registered."); - } - - public virtual bool TryGetService([NotNullWhen(true)] out TService? service) where TService : class - { - if (_services.TryGetValue(typeof(TService), out var obj) && obj is TService typedObj) - { - service = typedObj; - return true; - } - - if (_fallbackServiceProvider?.GetService(typeof(TService)) is TService fallbackObj) - { - service = fallbackObj; - return true; - } - - service = null; - return false; - } - - public virtual bool HasService() where TService : class => HasService(typeof(TService)); - - public virtual bool HasService(Type serviceType) - { - ArgumentNullException.ThrowIfNull(serviceType); - return _services.ContainsKey(serviceType) || (_fallbackServiceProvider?.GetService(serviceType) != null); - } - - public virtual object? GetService(Type serviceType) - { - ArgumentNullException.ThrowIfNull(serviceType); - if (_services.TryGetValue(serviceType, out var obj)) - { - return obj; - } - - return _fallbackServiceProvider?.GetService(serviceType); - } - - // --- Effects --- - - public virtual IDisposable RegisterEffect(Action onDispose) - { - if (_scope != null) - { - return _scope.RegisterEffect(onDispose); - } - - return new DisposableAction(onDispose); - } - - public virtual IDisposable RegisterDisposable(IDisposable disposable) - { - ArgumentNullException.ThrowIfNull(disposable); - return RegisterEffect(disposable.Dispose); - } - - // --- Pipelines --- - - public virtual IDisposable RegisterWaterfall(string pipelineName, Func, Task> middleware) - { - var registration = _pipelines.RegisterWaterfall(pipelineName, middleware); - return RegisterDisposable(registration); - } - - public virtual Task ExecuteWaterfallAsync(string pipelineName, TContext context, Func? terminal = null) - { - return _pipelines.ExecuteWaterfallAsync(pipelineName, context, terminal); - } - - public virtual IDisposable RegisterBail(string pipelineName, Func> handler) where TResult : class - { - var registration = _pipelines.RegisterBail(pipelineName, handler); - return RegisterDisposable(registration); - } - - public virtual Task ExecuteBailAsync(string pipelineName, TContext context) where TResult : class - { - return _pipelines.ExecuteBailAsync(pipelineName, context); - } - - public virtual IDisposable RegisterParallel(string pipelineName, Func handler) - { - var registration = _pipelines.RegisterParallel(pipelineName, handler); - return RegisterDisposable(registration); - } - - public virtual Task ExecuteParallelAsync(string pipelineName, TContext context) - { - return _pipelines.ExecuteParallelAsync(pipelineName, context); - } - - public virtual IDisposable RegisterSerial(string pipelineName, Func handler) - { - var registration = _pipelines.RegisterSerial(pipelineName, handler); - return RegisterDisposable(registration); - } - - public virtual Task ExecuteSerialAsync(string pipelineName, TContext context) - { - return _pipelines.ExecuteSerialAsync(pipelineName, context); - } - - // --- Tools --- - - public event Action? ToolsChanged; - - public virtual IDisposable RegisterTool(PdfToolDescriptor tool) - { - ArgumentNullException.ThrowIfNull(tool); - ArgumentException.ThrowIfNullOrWhiteSpace(tool.Id); - - _tools[tool.Id] = tool; - ToolsChanged?.Invoke(); - - return RegisterEffect(() => - { - _tools.TryRemove(tool.Id, out _); - ToolsChanged?.Invoke(); - }); - } - - public virtual IReadOnlyList GetRegisteredTools() - { - return _tools.Values.ToList(); - } - - public virtual PdfToolDescriptor? GetTool(string id) - { - if (string.IsNullOrWhiteSpace(id)) return null; - return _tools.GetValueOrDefault(id); - } - - // --- Canvas Elements --- - - public virtual IDisposable RegisterCanvasElement(CanvasElementDescriptor descriptor) - { - ArgumentNullException.ThrowIfNull(descriptor); - ArgumentException.ThrowIfNullOrWhiteSpace(descriptor.ElementTypeId); - - _canvasElements[descriptor.ElementTypeId] = descriptor; - - if (TryGetService(out var elementRegistry)) - { - elementRegistry.RegisterElement(descriptor); - } - - return RegisterEffect(() => - { - _canvasElements.TryRemove(descriptor.ElementTypeId, out _); - if (TryGetService(out var registry)) - { - registry.UnregisterElement(descriptor.ElementTypeId); - } - }); - } - - public virtual IReadOnlyList GetRegisteredCanvasElements() - { - return _canvasElements.Values.ToList(); - } - - public virtual CanvasElementDescriptor? GetCanvasElement(string elementTypeId) - { - if (string.IsNullOrWhiteSpace(elementTypeId)) return null; - return _canvasElements.GetValueOrDefault(elementTypeId); - } - - // --- Ribbon Actions --- - - public virtual IDisposable RegisterRibbonAction(RibbonActionDescriptor descriptor) - { - ArgumentNullException.ThrowIfNull(descriptor); - ArgumentException.ThrowIfNullOrWhiteSpace(descriptor.Id); - - _ribbonActions[descriptor.Id] = descriptor; - - if (TryGetService(out var ribbonRegistry)) - { - ribbonRegistry.RegisterAction(descriptor); - } - - return RegisterEffect(() => - { - _ribbonActions.TryRemove(descriptor.Id, out _); - if (TryGetService(out var reg)) - { - reg.UnregisterAction(descriptor.Id); - } - }); - } - - public virtual IReadOnlyList GetRegisteredRibbonActions() - { - return _ribbonActions.Values.OrderBy(r => r.Order).ToList(); - } - - // --- Document Importers --- - - public virtual IDisposable RegisterImporter(IDocumentImporter importer) - { - ArgumentNullException.ThrowIfNull(importer); - _importers[importer.ImporterId] = importer; - - if (TryGetService(out var reg)) - { - reg.RegisterImporter(importer); - } - - return RegisterEffect(() => - { - _importers.TryRemove(importer.ImporterId, out _); - }); - } - - public virtual IReadOnlyList GetRegisteredImporters() - { - return _importers.Values.OrderByDescending(i => i.Priority).ToList(); - } - - // --- Document Exporters --- - - public virtual IDisposable RegisterExporter(IDocumentExporter exporter) - { - ArgumentNullException.ThrowIfNull(exporter); - _exporters[exporter.ExporterId] = exporter; - - if (TryGetService(out var reg)) - { - reg.RegisterExporter(exporter); - } - - return RegisterEffect(() => - { - _exporters.TryRemove(exporter.ExporterId, out _); - }); - } - - public virtual IReadOnlyList GetRegisteredExporters() - { - return _exporters.Values.ToList(); - } - - // --- Inspector Panels --- - - public virtual IDisposable RegisterInspectorSection(InspectorSectionDescriptor descriptor) - { - ArgumentNullException.ThrowIfNull(descriptor); - _inspectorSections[descriptor.SectionId] = descriptor; - - if (TryGetService(out var reg)) - { - reg.RegisterSection(descriptor); - } - - return RegisterEffect(() => - { - _inspectorSections.TryRemove(descriptor.SectionId, out _); - }); - } - - public virtual IReadOnlyList GetRegisteredInspectorSections() - { - return _inspectorSections.Values.OrderBy(s => s.Order).ToList(); - } - - // --- Document Templates --- - - public virtual IDisposable RegisterTemplate(ITemplateDescriptor template) - { - ArgumentNullException.ThrowIfNull(template); - _templates[template.Id] = template; - - if (TryGetService(out var reg)) - { - reg.RegisterTemplate(template); - } - - return RegisterEffect(() => - { - _templates.TryRemove(template.Id, out _); - }); - } - - public virtual IReadOnlyList GetRegisteredTemplates() - { - return _templates.Values.ToList(); - } - - // --- OCR Engines --- - - public virtual IDisposable RegisterOcrEngine(IOcrEngine engine) - { - ArgumentNullException.ThrowIfNull(engine); - _ocrEngines[engine.EngineName] = engine; - - if (TryGetService(out var reg)) - { - reg.RegisterEngine(engine); - } - - return RegisterEffect(() => - { - _ocrEngines.TryRemove(engine.EngineName, out _); - }); - } - - public virtual IReadOnlyList GetRegisteredOcrEngines() - { - return _ocrEngines.Values.ToList(); - } - - // --- Data Connectors --- - - public virtual IDisposable RegisterDataConnector(IDataConnector connector) - { - ArgumentNullException.ThrowIfNull(connector); - _dataConnectors[connector.ConnectorId] = connector; - - if (TryGetService(out var reg)) - { - reg.RegisterConnector(connector); - } - - return RegisterEffect(() => - { - _dataConnectors.TryRemove(connector.ConnectorId, out _); - }); - } - - public virtual IReadOnlyList GetRegisteredDataConnectors() - { - return _dataConnectors.Values.ToList(); - } - - // --- Status Bar Widgets --- - - public virtual IDisposable RegisterStatusBarWidget(StatusBarWidgetDescriptor widget) - { - ArgumentNullException.ThrowIfNull(widget); - _statusBarWidgets[widget.WidgetId] = widget; - - IDisposable? sub = null; - if (TryGetService(out var reg)) - { - sub = reg.RegisterWidget(widget); - } - - return RegisterEffect(() => - { - _statusBarWidgets.TryRemove(widget.WidgetId, out _); - sub?.Dispose(); - }); - } - - public virtual IReadOnlyList GetRegisteredStatusBarWidgets() - { - return _statusBarWidgets.Values.OrderBy(w => w.Order).ToList(); - } - - // --- Command Palette --- - - public virtual IDisposable RegisterCommand(CommandPaletteDescriptor descriptor) - { - ArgumentNullException.ThrowIfNull(descriptor); - _commands[descriptor.Id] = descriptor; - - if (TryGetService(out var reg)) - { - reg.RegisterCommand(descriptor); - } - - return RegisterEffect(() => - { - _commands.TryRemove(descriptor.Id, out _); - if (TryGetService(out var r)) - { - r.UnregisterCommand(descriptor.Id); - } - }); - } - - public virtual IReadOnlyList GetRegisteredCommands() - { - return _commands.Values.OrderBy(c => c.Order).ToList(); - } - - // --- Navigation Registry --- - - public virtual IDisposable RegisterNavigationItem(NavigationItemDescriptor descriptor) - { - ArgumentNullException.ThrowIfNull(descriptor); - _navigationItems[descriptor.Id] = descriptor; - - if (TryGetService(out var reg)) - { - reg.RegisterNavigationItem(descriptor); - } - - return RegisterEffect(() => - { - _navigationItems.TryRemove(descriptor.Id, out _); - if (TryGetService(out var r)) - { - r.UnregisterNavigationItem(descriptor.Id); - } - }); - } - - public virtual IReadOnlyList GetRegisteredNavigationItems() - { - return _navigationItems.Values.OrderBy(n => n.Order).ToList(); - } - - // --- Dialog Registry --- - - public virtual IDisposable RegisterDialog(DialogDescriptor descriptor) - { - ArgumentNullException.ThrowIfNull(descriptor); - _dialogs[descriptor.Id] = descriptor; - - if (TryGetService(out var reg)) - { - reg.RegisterDialog(descriptor); - } - - return RegisterEffect(() => - { - _dialogs.TryRemove(descriptor.Id, out _); - if (TryGetService(out var r)) - { - r.UnregisterDialog(descriptor.Id); - } - }); - } - - public virtual IReadOnlyList GetRegisteredDialogs() - { - return _dialogs.Values.ToList(); - } - - // --- Sidebar Registry --- - - public virtual IDisposable RegisterSidebarTab(SidebarTabDescriptor descriptor) - { - ArgumentNullException.ThrowIfNull(descriptor); - _sidebarTabs[descriptor.Id] = descriptor; - - if (TryGetService(out var reg)) - { - reg.RegisterTab(descriptor); - } - - return RegisterEffect(() => - { - _sidebarTabs.TryRemove(descriptor.Id, out _); - if (TryGetService(out var r)) - { - r.UnregisterTab(descriptor.Id); - } - }); - } - - public virtual IReadOnlyList GetRegisteredSidebarTabs() - { - return _sidebarTabs.Values.OrderBy(s => s.Order).ToList(); - } - - // --- Dynamic Ribbon Tabs & Groups --- - - public virtual IDisposable RegisterRibbonTab(RibbonTabDescriptor descriptor) - { - ArgumentNullException.ThrowIfNull(descriptor); - _ribbonTabs[descriptor.Id] = descriptor; - - if (TryGetService(out var reg)) - { - reg.RegisterTab(descriptor); - } - - return RegisterEffect(() => - { - _ribbonTabs.TryRemove(descriptor.Id, out _); - }); - } - - public virtual IDisposable RegisterRibbonGroup(RibbonGroupDescriptor descriptor) - { - ArgumentNullException.ThrowIfNull(descriptor); - _ribbonGroups[descriptor.Id] = descriptor; - - if (TryGetService(out var reg)) - { - reg.RegisterGroup(descriptor); - } - - return RegisterEffect(() => - { - _ribbonGroups.TryRemove(descriptor.Id, out _); - }); - } - - // --- Shell Overlay Registry (Cordis Architecture Inspired) --- - - public virtual IDisposable RegisterOverlay(OverlayDescriptor descriptor) - { - ArgumentNullException.ThrowIfNull(descriptor); - _overlays[descriptor.Id] = descriptor; - - if (TryGetService(out var reg)) - { - reg.RegisterOverlay(descriptor); - } - - return RegisterEffect(() => - { - _overlays.TryRemove(descriptor.Id, out _); - if (TryGetService(out var r)) - { - r.UnregisterOverlay(descriptor.Id); - } - }); - } - - public virtual IReadOnlyList GetRegisteredOverlays() - { - return _overlays.Values.ToList(); - } - - - /// - /// Scoped context subclass wrapping a parent context with a plugin-specific . - /// - private sealed class ScopedPluginContext : FryPluginContext - { - private readonly FryPluginContext _parent; - private readonly PluginScope _pluginScope; - - public ScopedPluginContext(FryPluginContext parent, PluginScope pluginScope) - : base(parent._fallbackServiceProvider, parent._pipelines, pluginScope) - { - _parent = parent; - _pluginScope = pluginScope; - } - - public override void RegisterService(TService implementation) - { - _parent.RegisterService(implementation); - _pluginScope.RegisterEffect(() => - { - // Remove from parent services dictionary - _parent._services.TryRemove(typeof(TService), out _); - }); - } - - public override void RegisterService(Type serviceType, object implementation) - { - _parent.RegisterService(serviceType, implementation); - _pluginScope.RegisterEffect(() => - { - _parent._services.TryRemove(serviceType, out _); - }); - } - - public override TService GetService() => _parent.GetService(); - public override bool TryGetService([NotNullWhen(true)] out TService? service) where TService : class => _parent.TryGetService(out service); - public override bool HasService() where TService : class => _parent.HasService(); - public override bool HasService(Type serviceType) => _parent.HasService(serviceType); - public override object? GetService(Type serviceType) => _parent.GetService(serviceType); - - public override IDisposable RegisterEffect(Action onDispose) => _pluginScope.RegisterEffect(onDispose); - public override IDisposable RegisterDisposable(IDisposable disposable) => _pluginScope.RegisterDisposable(disposable); - - public override IDisposable RegisterWaterfall(string pipelineName, Func, Task> middleware) - { - var reg = _parent.Pipelines.RegisterWaterfall(pipelineName, middleware); - return _pluginScope.RegisterDisposable(reg); - } - - public override Task ExecuteWaterfallAsync(string pipelineName, TContext context, Func? terminal = null) - { - return _parent.ExecuteWaterfallAsync(pipelineName, context, terminal); - } - - public override IDisposable RegisterBail(string pipelineName, Func> handler) where TResult : class - { - var reg = _parent.Pipelines.RegisterBail(pipelineName, handler); - return _pluginScope.RegisterDisposable(reg); - } - - public override Task ExecuteBailAsync(string pipelineName, TContext context) where TResult : class - { - return _parent.ExecuteBailAsync(pipelineName, context); - } - - public override IDisposable RegisterParallel(string pipelineName, Func handler) - { - var reg = _parent.Pipelines.RegisterParallel(pipelineName, handler); - return _pluginScope.RegisterDisposable(reg); - } - - public override Task ExecuteParallelAsync(string pipelineName, TContext context) - { - return _parent.ExecuteParallelAsync(pipelineName, context); - } - - public override IDisposable RegisterSerial(string pipelineName, Func handler) - { - var reg = _parent.Pipelines.RegisterSerial(pipelineName, handler); - return _pluginScope.RegisterDisposable(reg); - } - - public override Task ExecuteSerialAsync(string pipelineName, TContext context) - { - return _parent.ExecuteSerialAsync(pipelineName, context); - } - - public override IDisposable RegisterTool(PdfToolDescriptor tool) - { - var reg = _parent.RegisterTool(tool); - return _pluginScope.RegisterDisposable(reg); - } - - public override IReadOnlyList GetRegisteredTools() => _parent.GetRegisteredTools(); - public override PdfToolDescriptor? GetTool(string id) => _parent.GetTool(id); - - public override IDisposable RegisterCanvasElement(CanvasElementDescriptor descriptor) - { - var reg = _parent.RegisterCanvasElement(descriptor); - return _pluginScope.RegisterDisposable(reg); - } - - public override IReadOnlyList GetRegisteredCanvasElements() => _parent.GetRegisteredCanvasElements(); - public override CanvasElementDescriptor? GetCanvasElement(string elementTypeId) => _parent.GetCanvasElement(elementTypeId); - - public override IDisposable RegisterRibbonAction(RibbonActionDescriptor descriptor) - { - var reg = _parent.RegisterRibbonAction(descriptor); - return _pluginScope.RegisterDisposable(reg); - } - - public override IReadOnlyList GetRegisteredRibbonActions() => _parent.GetRegisteredRibbonActions(); - - public override IDisposable RegisterImporter(IDocumentImporter importer) - { - var reg = _parent.RegisterImporter(importer); - return _pluginScope.RegisterDisposable(reg); - } - - public override IReadOnlyList GetRegisteredImporters() => _parent.GetRegisteredImporters(); - - public override IDisposable RegisterExporter(IDocumentExporter exporter) - { - var reg = _parent.RegisterExporter(exporter); - return _pluginScope.RegisterDisposable(reg); - } - - public override IReadOnlyList GetRegisteredExporters() => _parent.GetRegisteredExporters(); - - public override IDisposable RegisterInspectorSection(InspectorSectionDescriptor descriptor) - { - var reg = _parent.RegisterInspectorSection(descriptor); - return _pluginScope.RegisterDisposable(reg); - } - - public override IReadOnlyList GetRegisteredInspectorSections() => _parent.GetRegisteredInspectorSections(); - - public override IDisposable RegisterTemplate(ITemplateDescriptor template) - { - var reg = _parent.RegisterTemplate(template); - return _pluginScope.RegisterDisposable(reg); - } - - public override IReadOnlyList GetRegisteredTemplates() => _parent.GetRegisteredTemplates(); - - public override IDisposable RegisterOcrEngine(IOcrEngine engine) - { - var reg = _parent.RegisterOcrEngine(engine); - return _pluginScope.RegisterDisposable(reg); - } - - public override IReadOnlyList GetRegisteredOcrEngines() => _parent.GetRegisteredOcrEngines(); - - public override IDisposable RegisterDataConnector(IDataConnector connector) - { - var reg = _parent.RegisterDataConnector(connector); - return _pluginScope.RegisterDisposable(reg); - } - - public override IReadOnlyList GetRegisteredDataConnectors() => _parent.GetRegisteredDataConnectors(); - - public override IDisposable RegisterStatusBarWidget(StatusBarWidgetDescriptor widget) - { - var reg = _parent.RegisterStatusBarWidget(widget); - return _pluginScope.RegisterDisposable(reg); - } - - public override IReadOnlyList GetRegisteredStatusBarWidgets() => _parent.GetRegisteredStatusBarWidgets(); - - public override IDisposable RegisterCommand(CommandPaletteDescriptor descriptor) - { - var reg = _parent.RegisterCommand(descriptor); - return _pluginScope.RegisterDisposable(reg); - } - - public override IReadOnlyList GetRegisteredCommands() => _parent.GetRegisteredCommands(); - - public override IDisposable RegisterNavigationItem(NavigationItemDescriptor descriptor) - { - var reg = _parent.RegisterNavigationItem(descriptor); - return _pluginScope.RegisterDisposable(reg); - } - - public override IReadOnlyList GetRegisteredNavigationItems() => _parent.GetRegisteredNavigationItems(); - - public override IDisposable RegisterDialog(DialogDescriptor descriptor) - { - var reg = _parent.RegisterDialog(descriptor); - return _pluginScope.RegisterDisposable(reg); - } - - public override IReadOnlyList GetRegisteredDialogs() => _parent.GetRegisteredDialogs(); - - public override IDisposable RegisterSidebarTab(SidebarTabDescriptor descriptor) - { - var reg = _parent.RegisterSidebarTab(descriptor); - return _pluginScope.RegisterDisposable(reg); - } - - public override IReadOnlyList GetRegisteredSidebarTabs() => _parent.GetRegisteredSidebarTabs(); - - public override IDisposable RegisterRibbonTab(RibbonTabDescriptor descriptor) - { - var reg = _parent.RegisterRibbonTab(descriptor); - return _pluginScope.RegisterDisposable(reg); - } - - public override IDisposable RegisterRibbonGroup(RibbonGroupDescriptor descriptor) - { - var reg = _parent.RegisterRibbonGroup(descriptor); - return _pluginScope.RegisterDisposable(reg); - } - - public override IDisposable RegisterOverlay(OverlayDescriptor descriptor) - { - var reg = _parent.RegisterOverlay(descriptor); - return _pluginScope.RegisterDisposable(reg); - } - - public override IReadOnlyList GetRegisteredOverlays() => _parent.GetRegisteredOverlays(); - } - - - private sealed class DisposableAction : IDisposable - { - private Action? _action; - - public DisposableAction(Action action) - { - _action = action; - } - - public void Dispose() - { - var act = System.Threading.Interlocked.Exchange(ref _action, null); - act?.Invoke(); - } - } -} diff --git a/src/PdfEditorApp.Core/Plugins/IFryPlugin.cs b/src/PdfEditorApp.Core/Plugins/IFryPlugin.cs deleted file mode 100644 index b4c5f7f..0000000 --- a/src/PdfEditorApp.Core/Plugins/IFryPlugin.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; - -namespace PdfEditorApp.Core.Plugins; - -/// -/// Contract implemented by all FryPDF plugins. -/// Inspired by Cordis architecture: every capability mounts into a shared context. -/// -public interface IFryPlugin -{ - /// - /// Unique identifier for this plugin, e.g. "frypdf.tool.merge" or "frypdf.engine.questpdf". - /// - string Id { get; } - - /// - /// User-friendly name of the plugin. - /// - string Name { get; } - - /// - /// Plugin version. - /// - Version Version { get; } - - /// - /// Service contracts required by this plugin before it can mount (declarative injection graph). - /// - IReadOnlyList RequiredServices { get; } - - /// - /// Service contracts provided by this plugin (used for dependency graph cycle detection and validation). - /// - IReadOnlyList ProvidedServices => Array.Empty(); - - /// - /// Optional declarative configuration schema describing configurable user settings for this plugin. - /// - IReadOnlyDictionary? SettingsSchema => null; - - /// - /// Mounts the plugin into the active context, registering services, pipelines, tools, and effects. - /// - /// The active plugin context. - /// Cancellation token. - Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default); -} diff --git a/src/PdfEditorApp.Core/Plugins/IFryPluginContext.cs b/src/PdfEditorApp.Core/Plugins/IFryPluginContext.cs deleted file mode 100644 index f9601c3..0000000 --- a/src/PdfEditorApp.Core/Plugins/IFryPluginContext.cs +++ /dev/null @@ -1,315 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; -using System.Threading.Tasks; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Plugins.Descriptors; -using PdfEditorApp.Core.Plugins.Pipelines; - -namespace PdfEditorApp.Core.Plugins; - -/// -/// The central capability context provided to plugins during their lifecycle. -/// Acts as a dynamic service bus, pipeline orchestrator, and effect tracker. -/// -public interface IFryPluginContext : IServiceProvider -{ - // --- 1. Service Bus --- - - /// - /// Registers a service contract and implementation into the context. - /// - void RegisterService(TService implementation) where TService : class; - - /// - /// Registers a service contract by type and implementation into the context. - /// - void RegisterService(Type serviceType, object implementation); - - /// - /// Retrieves a required registered service. Throws if the service is not found. - /// - TService GetService() where TService : class; - - /// - /// Attempts to retrieve a registered service. - /// - bool TryGetService([NotNullWhen(true)] out TService? service) where TService : class; - - /// - /// Checks whether a service contract has been registered. - /// - bool HasService() where TService : class; - - /// - /// Checks whether a service contract of the given type has been registered. - /// - bool HasService(Type serviceType); - - // --- 2. Reversible Effects --- - - /// - /// Registers a cleanup action that will be executed when the current plugin unloads. - /// - IDisposable RegisterEffect(Action onDispose); - - /// - /// Registers an to be disposed when the current plugin unloads. - /// - IDisposable RegisterDisposable(IDisposable disposable); - - // --- 3. Pipeline Operations --- - - /// - /// Gets the pipeline manager for registering and executing typed pipelines. - /// - IPipelineManager Pipelines { get; } - - /// - /// Registers a middleware into a named Waterfall pipeline. - /// - IDisposable RegisterWaterfall(string pipelineName, Func, Task> middleware); - - /// - /// Executes a named Waterfall pipeline. - /// - Task ExecuteWaterfallAsync(string pipelineName, TContext context, Func? terminal = null); - - /// - /// Registers a handler into a named Bail pipeline. - /// - IDisposable RegisterBail(string pipelineName, Func> handler) where TResult : class; - - /// - /// Executes a named Bail pipeline. - /// - Task ExecuteBailAsync(string pipelineName, TContext context) where TResult : class; - - /// - /// Registers a handler into a named Parallel pipeline. - /// - IDisposable RegisterParallel(string pipelineName, Func handler); - - /// - /// Executes a named Parallel pipeline. - /// - Task ExecuteParallelAsync(string pipelineName, TContext context); - - /// - /// Registers a handler into a named Serial pipeline. - /// - IDisposable RegisterSerial(string pipelineName, Func handler); - - /// - /// Executes a named Serial pipeline. - /// - Task ExecuteSerialAsync(string pipelineName, TContext context); - - // --- 4. Tool Registry --- - - /// - /// Event fired when a tool is dynamically registered or unregistered. - /// - event Action? ToolsChanged; - - /// - /// Registers a PDF tool contributed by a plugin. - /// - IDisposable RegisterTool(PdfToolDescriptor tool); - - /// - /// Gets all currently registered PDF tools. - /// - IReadOnlyList GetRegisteredTools(); - - /// - /// Finds a tool by its unique string identifier. - /// - PdfToolDescriptor? GetTool(string id); - - // --- 5. Canvas Element Registry --- - - /// - /// Registers a custom canvas element type contributed by a plugin. - /// - IDisposable RegisterCanvasElement(CanvasElementDescriptor descriptor); - - /// - /// Gets all registered canvas element types. - /// - IReadOnlyList GetRegisteredCanvasElements(); - - /// - /// Finds a canvas element descriptor by its unique element type identifier. - /// - CanvasElementDescriptor? GetCanvasElement(string elementTypeId); - - // --- 6. Ribbon Action Registry --- - - /// - /// Registers a dynamic Ribbon action button or menu item contributed by a plugin. - /// - IDisposable RegisterRibbonAction(RibbonActionDescriptor descriptor); - - /// - /// Gets all registered Ribbon actions. - /// - IReadOnlyList GetRegisteredRibbonActions(); - - // --- 7. Document Importer Registry --- - - /// - /// Registers a document importer contributed by a plugin. - /// - IDisposable RegisterImporter(IDocumentImporter importer); - - /// - /// Gets all registered document importers. - /// - IReadOnlyList GetRegisteredImporters(); - - // --- 8. Document Exporter Registry --- - - /// - /// Registers a document exporter contributed by a plugin. - /// - IDisposable RegisterExporter(IDocumentExporter exporter); - - /// - /// Gets all registered document exporters. - /// - IReadOnlyList GetRegisteredExporters(); - - // --- 9. Inspector Panel Registry --- - - /// - /// Registers an inspector section property panel contributed by a plugin. - /// - IDisposable RegisterInspectorSection(InspectorSectionDescriptor descriptor); - - /// - /// Gets all registered inspector sections. - /// - IReadOnlyList GetRegisteredInspectorSections(); - - // --- 10. Document Template Registry --- - - /// - /// Registers a document template contributed by a plugin. - /// - IDisposable RegisterTemplate(ITemplateDescriptor template); - - /// - /// Gets all registered document templates. - /// - IReadOnlyList GetRegisteredTemplates(); - - // --- 12. OCR Engine Registry --- - - /// - /// Registers an OCR engine contributed by a plugin. - /// - IDisposable RegisterOcrEngine(IOcrEngine engine); - - /// - /// Gets all registered OCR engines. - /// - IReadOnlyList GetRegisteredOcrEngines(); - - // --- 13. Data Connector Registry --- - - /// - /// Registers a data connector contributed by a plugin. - /// - IDisposable RegisterDataConnector(IDataConnector connector); - - /// - /// Gets all registered data connectors. - /// - IReadOnlyList GetRegisteredDataConnectors(); - - // --- 14. Status Bar Registry --- - - /// - /// Registers a status bar widget contributed by a plugin. - /// - IDisposable RegisterStatusBarWidget(StatusBarWidgetDescriptor widget); - - /// - /// Gets all registered status bar widgets. - /// - IReadOnlyList GetRegisteredStatusBarWidgets(); - - // --- 15. Command Palette Registry --- - - /// - /// Registers a command searchable in the Command Palette (⌘K / Ctrl+K). - /// - IDisposable RegisterCommand(CommandPaletteDescriptor descriptor); - - /// - /// Gets all registered command palette descriptors. - /// - IReadOnlyList GetRegisteredCommands(); - - // --- 16. Navigation Registry --- - - /// - /// Registers a workspace navigation section or full-page view contributed by a plugin. - /// - IDisposable RegisterNavigationItem(NavigationItemDescriptor descriptor); - - /// - /// Gets all registered navigation item descriptors. - /// - IReadOnlyList GetRegisteredNavigationItems(); - - // --- 17. Dialog Registry --- - - /// - /// Registers a modal dialog or floating studio contributed by a plugin. - /// - IDisposable RegisterDialog(DialogDescriptor descriptor); - - /// - /// Gets all registered modal dialog descriptors. - /// - IReadOnlyList GetRegisteredDialogs(); - - // --- 18. Sidebar Registry --- - - /// - /// Registers an editor sidebar panel contributed by a plugin. - /// - IDisposable RegisterSidebarTab(SidebarTabDescriptor descriptor); - - /// - /// Gets all registered editor sidebar tab descriptors. - /// - IReadOnlyList GetRegisteredSidebarTabs(); - - // --- 19. Dynamic Ribbon Tabs & Groups --- - - /// - /// Registers a dynamic Ribbon Tab contributed by a plugin. - /// - IDisposable RegisterRibbonTab(RibbonTabDescriptor descriptor); - - /// - /// Registers a dynamic Ribbon tool group inside a Ribbon tab. - /// - IDisposable RegisterRibbonGroup(RibbonGroupDescriptor descriptor); - - // --- 20. Shell Overlay Registry (Cordis Architecture Inspired) --- - - /// - /// Registers a floating shell overlay contributed by a plugin (targeting 'shell.overlay'). - /// - IDisposable RegisterOverlay(OverlayDescriptor descriptor); - - /// - /// Gets all registered floating overlay descriptors. - /// - IReadOnlyList GetRegisteredOverlays(); -} - diff --git a/src/PdfEditorApp.Core/Plugins/Manifests/PluginManifest.cs b/src/PdfEditorApp.Core/Plugins/Manifests/PluginManifest.cs deleted file mode 100644 index 03009fd..0000000 --- a/src/PdfEditorApp.Core/Plugins/Manifests/PluginManifest.cs +++ /dev/null @@ -1,56 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text.Json.Serialization; - -namespace PdfEditorApp.Core.Plugins.Manifests; - -/// -/// Declarative manifest representation parsed from a plugin package's "plugin.json". -/// -public class PluginManifest -{ - [JsonPropertyName("id")] - public string Id { get; set; } = ""; - - [JsonPropertyName("name")] - public string Name { get; set; } = ""; - - [JsonPropertyName("version")] - public string Version { get; set; } = "1.0.0"; - - [JsonPropertyName("author")] - public string Author { get; set; } = ""; - - [JsonPropertyName("description")] - public string Description { get; set; } = ""; - - [JsonPropertyName("entryPoint")] - public string EntryPoint { get; set; } = ""; - - [JsonPropertyName("icon")] - public string Icon { get; set; } = "PuzzleOutline"; - - [JsonPropertyName("dependencies")] - public List Dependencies { get; set; } = new(); - - [JsonPropertyName("settingsSchema")] - public Dictionary SettingsSchema { get; set; } = new(); -} - -public class PluginSettingDefinition -{ - [JsonPropertyName("type")] - public string Type { get; set; } = "string"; // string, boolean, number, select - - [JsonPropertyName("label")] - public string Label { get; set; } = ""; - - [JsonPropertyName("description")] - public string Description { get; set; } = ""; - - [JsonPropertyName("default")] - public object? DefaultValue { get; set; } - - [JsonPropertyName("options")] - public List? Options { get; set; } -} diff --git a/src/PdfEditorApp.Core/Plugins/Marketplace/FileInstalledPluginStore.cs b/src/PdfEditorApp.Core/Plugins/Marketplace/FileInstalledPluginStore.cs deleted file mode 100644 index f61ef7c..0000000 --- a/src/PdfEditorApp.Core/Plugins/Marketplace/FileInstalledPluginStore.cs +++ /dev/null @@ -1,142 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text.Json; - -namespace PdfEditorApp.Core.Plugins.Marketplace; - -/// -/// File-backed persistent store for installed plugin history saving to "installed_plugins.json". -/// -public class FileInstalledPluginStore : IInstalledPluginStore -{ - private readonly string _filePath; - private readonly Dictionary _records = new(StringComparer.OrdinalIgnoreCase); - private readonly object _lock = new(); - - private static readonly JsonSerializerOptions JsonOptions = new() - { - WriteIndented = true, - PropertyNameCaseInsensitive = true - }; - - public FileInstalledPluginStore(string? filePath = null) - { - _filePath = filePath ?? Path.Combine(AppContext.BaseDirectory, "installed_plugins.json"); - LoadFromFile(); - } - - private void LoadFromFile() - { - lock (_lock) - { - _records.Clear(); - try - { - if (File.Exists(_filePath)) - { - var json = File.ReadAllText(_filePath); - var list = JsonSerializer.Deserialize>(json, JsonOptions); - if (list != null) - { - foreach (var item in list) - { - if (!string.IsNullOrWhiteSpace(item.PluginId)) - { - _records[item.PluginId] = item; - } - } - } - } - } - catch (Exception ex) - { - System.Diagnostics.Debug.WriteLine($"[FileInstalledPluginStore] Load error: {ex.Message}"); - } - } - } - - public IReadOnlyList GetAll() - { - lock (_lock) - { - return _records.Values.OrderByDescending(r => r.InstalledAt).ToList(); - } - } - - public InstalledPluginRecord? Get(string pluginId) - { - if (string.IsNullOrWhiteSpace(pluginId)) return null; - - lock (_lock) - { - return _records.TryGetValue(pluginId, out var record) ? record : null; - } - } - - public bool IsInstalled(string pluginId) - { - if (string.IsNullOrWhiteSpace(pluginId)) return false; - - lock (_lock) - { - return _records.ContainsKey(pluginId); - } - } - - public void AddOrUpdate(InstalledPluginRecord record) - { - ArgumentNullException.ThrowIfNull(record); - if (string.IsNullOrWhiteSpace(record.PluginId)) return; - - lock (_lock) - { - _records[record.PluginId] = record; - SaveInternal(); - } - } - - public bool Remove(string pluginId) - { - if (string.IsNullOrWhiteSpace(pluginId)) return false; - - lock (_lock) - { - if (_records.Remove(pluginId)) - { - SaveInternal(); - return true; - } - return false; - } - } - - public void Save() - { - lock (_lock) - { - SaveInternal(); - } - } - - private void SaveInternal() - { - try - { - var dir = Path.GetDirectoryName(_filePath); - if (!string.IsNullOrEmpty(dir) && !Directory.Exists(dir)) - { - Directory.CreateDirectory(dir); - } - - var list = _records.Values.OrderByDescending(r => r.InstalledAt).ToList(); - var json = JsonSerializer.Serialize(list, JsonOptions); - File.WriteAllText(_filePath, json); - } - catch (Exception ex) - { - System.Diagnostics.Debug.WriteLine($"[FileInstalledPluginStore] Save error: {ex.Message}"); - } - } -} diff --git a/src/PdfEditorApp.Core/Plugins/Marketplace/IInstalledPluginStore.cs b/src/PdfEditorApp.Core/Plugins/Marketplace/IInstalledPluginStore.cs deleted file mode 100644 index 81a6f26..0000000 --- a/src/PdfEditorApp.Core/Plugins/Marketplace/IInstalledPluginStore.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace PdfEditorApp.Core.Plugins.Marketplace; - -/// -/// Contract for persisting and retrieving installed plugin records and history across application sessions. -/// -public interface IInstalledPluginStore -{ - IReadOnlyList GetAll(); - InstalledPluginRecord? Get(string pluginId); - bool IsInstalled(string pluginId); - void AddOrUpdate(InstalledPluginRecord record); - bool Remove(string pluginId); - void Save(); -} diff --git a/src/PdfEditorApp.Core/Plugins/Marketplace/IPluginMarketplaceService.cs b/src/PdfEditorApp.Core/Plugins/Marketplace/IPluginMarketplaceService.cs deleted file mode 100644 index 5eec948..0000000 --- a/src/PdfEditorApp.Core/Plugins/Marketplace/IPluginMarketplaceService.cs +++ /dev/null @@ -1,48 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; - -namespace PdfEditorApp.Core.Plugins.Marketplace; - -/// -/// Service providing access to the curated FryPDF Plugin Store and Extensions Marketplace. -/// Enables discovery, searching, downloading, and package installation of official and community extensions. -/// -public interface IPluginMarketplaceService -{ - /// - /// Retrieves all available extensions from the marketplace catalog. - /// - Task> GetCatalogAsync(CancellationToken ct = default); - - /// - /// Searches the marketplace catalog by query keywords, category, or tags. - /// - Task> SearchAsync(string query, string? category = null, CancellationToken ct = default); - - /// - /// Simulates or executes downloading and installing a marketplace plugin package by ID. - /// - Task InstallPluginAsync(string pluginId, IProgress? progress = null, Action? statusCallback = null, CancellationToken ct = default); - - /// - /// Uninstalls an installed marketplace plugin. - /// - Task UninstallPluginAsync(string pluginId, CancellationToken ct = default); - - /// - /// Checks whether a specific plugin is installed locally. - /// - bool IsPluginInstalled(string pluginId); - - /// - /// Checks for available updates across all installed marketplace plugins. - /// - Task> CheckForUpdatesAsync(CancellationToken ct = default); - - /// - /// Fetches and synchronizes extensions from the remote registry (e.g. PDFCreator-resources). - /// - Task> FetchRemoteCatalogAsync(bool forceRefresh = false, CancellationToken ct = default); -} diff --git a/src/PdfEditorApp.Core/Plugins/Marketplace/InstalledPluginRecord.cs b/src/PdfEditorApp.Core/Plugins/Marketplace/InstalledPluginRecord.cs deleted file mode 100644 index 52e987c..0000000 --- a/src/PdfEditorApp.Core/Plugins/Marketplace/InstalledPluginRecord.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; - -namespace PdfEditorApp.Core.Plugins.Marketplace; - -/// -/// Record representing an installed plugin persisted to disk. -/// Tracks installation timestamp, enabled state, and last known overlay position. -/// -public class InstalledPluginRecord -{ - public string PluginId { get; set; } = string.Empty; - public string Name { get; set; } = string.Empty; - public string Version { get; set; } = "1.0.0"; - public DateTime InstalledAt { get; set; } = DateTime.UtcNow; - public bool IsEnabled { get; set; } = true; - public bool WasOverlayOpen { get; set; } = false; - public double? LastX { get; set; } - public double? LastY { get; set; } -} diff --git a/src/PdfEditorApp.Core/Plugins/Marketplace/MarketplacePluginItem.cs b/src/PdfEditorApp.Core/Plugins/Marketplace/MarketplacePluginItem.cs deleted file mode 100644 index 63ce3dd..0000000 --- a/src/PdfEditorApp.Core/Plugins/Marketplace/MarketplacePluginItem.cs +++ /dev/null @@ -1,45 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace PdfEditorApp.Core.Plugins.Marketplace; - -/// -/// Status of a plugin in the FryPDF Plugin Store / Marketplace. -/// -public enum MarketplacePluginStatus -{ - Available, - Installing, - Installed, - UpdateAvailable -} - -/// -/// Domain model for an extension or plugin available in the FryPDF Marketplace / Store. -/// Inspired by the VS Code Extensions Gallery item schema. -/// -public sealed class MarketplacePluginItem -{ - public required string Id { get; init; } - public required string Name { get; init; } - public required string Publisher { get; init; } - public required string Version { get; init; } - public required string Description { get; init; } - public string LongDescription { get; init; } = string.Empty; - public string Category { get; init; } = "General"; - public IReadOnlyList Tags { get; init; } = Array.Empty(); - public double Rating { get; init; } = 4.8; - public int RatingCount { get; init; } = 120; - public int InstallCount { get; init; } = 1500; - public string FormattedSize { get; init; } = "1.2 MB"; - public string IconKind { get; init; } = "PuzzleOutline"; - public string IconColorHex { get; init; } = "#7C3AED"; - public string License { get; init; } = "MIT"; - public bool IsVerified { get; init; } = true; - public bool IsOfficial { get; init; } = false; - public string DownloadUrl { get; init; } = string.Empty; - public IReadOnlyList Highlights { get; init; } = Array.Empty(); - public IReadOnlyList ContributedFeatures { get; init; } = Array.Empty(); - public IReadOnlyList Dependencies { get; init; } = Array.Empty(); - public MarketplacePluginStatus Status { get; set; } = MarketplacePluginStatus.Available; -} diff --git a/src/PdfEditorApp.Core/Plugins/Pipelines/DocumentPipelineContexts.cs b/src/PdfEditorApp.Core/Plugins/Pipelines/DocumentPipelineContexts.cs deleted file mode 100644 index 1dadf20..0000000 --- a/src/PdfEditorApp.Core/Plugins/Pipelines/DocumentPipelineContexts.cs +++ /dev/null @@ -1,103 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Threading; -using PdfEditorApp.Core.Models; - -namespace PdfEditorApp.Core.Plugins.Pipelines; - -/// -/// Execution context for document export waterfall pipelines ("document:export"). -/// Allows plugins to intercept document models before generation, and inspect/transform -/// the generated binary PDF bytes afterwards. -/// -public class PdfExportPipelineContext -{ - /// The document model to be exported. - public PdfDocumentModel Document { get; set; } - - /// The compiled output PDF bytes. Can be transformed or substituted by pipeline filters. - public byte[]? ResultPdfBytes { get; set; } - - /// Optional progress reporting channel. - public IProgress? Progress { get; init; } - - /// Cancellation token for aborting generation. - public CancellationToken CancellationToken { get; init; } - - /// Dynamic properties and options passed to pipeline filters. - public IDictionary Properties { get; } = new Dictionary(StringComparer.OrdinalIgnoreCase); - - public PdfExportPipelineContext(PdfDocumentModel document, IProgress? progress = null, CancellationToken cancellationToken = default) - { - Document = document ?? throw new ArgumentNullException(nameof(document)); - Progress = progress; - CancellationToken = cancellationToken; - } -} - -/// -/// Execution context for document import waterfall pipelines ("document:import"). -/// Allows plugins to preprocess input streams, parse proprietary formats, or enrich deconstructed models. -/// -public class PdfImportPipelineContext -{ - /// The raw stream of the document being imported. - public Stream InputStream { get; init; } - - /// The resulting deconstructed document model. - public PdfDocumentModel? Document { get; set; } - - /// Cancellation token for aborting import. - public CancellationToken CancellationToken { get; init; } - - /// Dynamic properties and options passed to pipeline handlers. - public IDictionary Properties { get; } = new Dictionary(StringComparer.OrdinalIgnoreCase); - - /// The file name or title of the document being imported. - public string FileName { get; init; } = "Document.pdf"; - - /// Optional password provided for decryption. - public string? Password { get; init; } - - public PdfImportPipelineContext(Stream inputStream, string fileName = "Document.pdf", string? password = null, CancellationToken cancellationToken = default) - { - InputStream = inputStream ?? throw new ArgumentNullException(nameof(inputStream)); - FileName = fileName; - Password = password; - CancellationToken = cancellationToken; - } -} - -/// -/// Execution context for PDF tool execution waterfall pipelines ("tool:execute"). -/// Allows plugins to wrap tool invocations with auditing, telemetry, progress reporting, and output post-processing. -/// -public class PdfToolExecutionPipelineContext -{ - /// The identifier of the tool being executed. - public string ToolId { get; init; } - - /// Tool options object. - public object Options { get; set; } - - /// Optional progress reporting channel. - public IProgress? Progress { get; init; } - - /// Cancellation token for aborting the tool. - public CancellationToken CancellationToken { get; init; } - - /// The result produced by the tool execution. - public object? Result { get; set; } - - /// Dynamic properties and options passed to pipeline filters. - public IDictionary Properties { get; } = new Dictionary(StringComparer.OrdinalIgnoreCase); - - public PdfToolExecutionPipelineContext(string toolId, object options, IProgress? progress = null, CancellationToken cancellationToken = default) - { - ToolId = toolId ?? throw new ArgumentNullException(nameof(toolId)); - Options = options ?? throw new ArgumentNullException(nameof(options)); - Progress = progress; - CancellationToken = cancellationToken; - } -} diff --git a/src/PdfEditorApp.Core/Plugins/Pipelines/IPipelineManager.cs b/src/PdfEditorApp.Core/Plugins/Pipelines/IPipelineManager.cs deleted file mode 100644 index 95a96e2..0000000 --- a/src/PdfEditorApp.Core/Plugins/Pipelines/IPipelineManager.cs +++ /dev/null @@ -1,56 +0,0 @@ -using System; -using System.Threading.Tasks; - -namespace PdfEditorApp.Core.Plugins.Pipelines; - -/// -/// Orchestrates typed execution pipelines inspired by Cordis architecture. -/// Supports 4 primary dispatch modes: Waterfall (around-middleware), Bail (first handled result), -/// Parallel (concurrent execution), and Serial (ordered execution). -/// -public interface IPipelineManager -{ - /// - /// Registers a middleware component into a named Waterfall pipeline. - /// Middleware components wrap subsequent handlers using the provided next delegate. - /// - IDisposable RegisterWaterfall(string pipelineName, Func, Task> middleware); - - /// - /// Executes a named Waterfall pipeline with the given context and optional terminal delegate. - /// - Task ExecuteWaterfallAsync(string pipelineName, TContext context, Func? terminal = null); - - /// - /// Registers a handler into a named Bail pipeline. - /// The pipeline will evaluate handlers until the first handler returns a non-null result. - /// - IDisposable RegisterBail(string pipelineName, Func> handler) where TResult : class; - - /// - /// Executes a named Bail pipeline, returning the result of the first handler that produces a non-null value. - /// - Task ExecuteBailAsync(string pipelineName, TContext context) where TResult : class; - - /// - /// Registers a handler into a named Parallel pipeline. - /// All handlers will be executed concurrently using . - /// - IDisposable RegisterParallel(string pipelineName, Func handler); - - /// - /// Executes all handlers registered in a Parallel pipeline concurrently. - /// - Task ExecuteParallelAsync(string pipelineName, TContext context); - - /// - /// Registers a handler into a named Serial pipeline. - /// Handlers will be awaited sequentially in order of registration. - /// - IDisposable RegisterSerial(string pipelineName, Func handler); - - /// - /// Executes all handlers registered in a Serial pipeline in sequential order. - /// - Task ExecuteSerialAsync(string pipelineName, TContext context); -} diff --git a/src/PdfEditorApp.Core/Plugins/Pipelines/PipelineManager.cs b/src/PdfEditorApp.Core/Plugins/Pipelines/PipelineManager.cs deleted file mode 100644 index 5589d36..0000000 --- a/src/PdfEditorApp.Core/Plugins/Pipelines/PipelineManager.cs +++ /dev/null @@ -1,207 +0,0 @@ -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; - -namespace PdfEditorApp.Core.Plugins.Pipelines; - -/// -/// Thread-safe implementation of . -/// Supports Waterfall (around-middleware), Bail (first non-null return), Parallel, and Serial dispatch modes. -/// -public class PipelineManager : IPipelineManager -{ - private readonly ConcurrentDictionary> _pipelines = new(); - private readonly object _syncLock = new(); - - public IDisposable RegisterWaterfall(string pipelineName, Func, Task> middleware) - { - ArgumentException.ThrowIfNullOrWhiteSpace(pipelineName); - ArgumentNullException.ThrowIfNull(middleware); - - var key = $"waterfall:{pipelineName}:{typeof(TContext).FullName}"; - return RegisterHandler(key, middleware); - } - - public async Task ExecuteWaterfallAsync(string pipelineName, TContext context, Func? terminal = null) - { - ArgumentException.ThrowIfNullOrWhiteSpace(pipelineName); - - var key = $"waterfall:{pipelineName}:{typeof(TContext).FullName}"; - List, Task>>? middlewares = null; - - lock (_syncLock) - { - if (!_pipelines.TryGetValue(key, out var list) || list.Count == 0) - { - middlewares = null; - } - else - { - middlewares = list.Cast, Task>>().ToList(); - } - } - - if (middlewares == null || middlewares.Count == 0) - { - if (terminal != null) - { - await terminal(); - } - return; - } - - // Build the pipeline chain: last middleware calls terminal, preceding middlewares call next - Func pipeline = terminal ?? (() => Task.CompletedTask); - - for (int i = middlewares.Count - 1; i >= 0; i--) - { - var currentMiddleware = middlewares[i]; - var nextDelegate = pipeline; - pipeline = () => currentMiddleware(context, nextDelegate); - } - - await pipeline(); - } - - public IDisposable RegisterBail(string pipelineName, Func> handler) where TResult : class - { - ArgumentException.ThrowIfNullOrWhiteSpace(pipelineName); - ArgumentNullException.ThrowIfNull(handler); - - var key = $"bail:{pipelineName}:{typeof(TContext).FullName}:{typeof(TResult).FullName}"; - return RegisterHandler(key, handler); - } - - public async Task ExecuteBailAsync(string pipelineName, TContext context) where TResult : class - { - ArgumentException.ThrowIfNullOrWhiteSpace(pipelineName); - - var key = $"bail:{pipelineName}:{typeof(TContext).FullName}:{typeof(TResult).FullName}"; - List>> handlers; - - lock (_syncLock) - { - if (!_pipelines.TryGetValue(key, out var list) || list.Count == 0) - { - return default; - } - - handlers = list.Cast>>().ToList(); - } - - foreach (var handler in handlers) - { - var result = await handler(context); - if (result is not null) - { - return result; - } - } - - return default; - } - - public IDisposable RegisterParallel(string pipelineName, Func handler) - { - ArgumentException.ThrowIfNullOrWhiteSpace(pipelineName); - ArgumentNullException.ThrowIfNull(handler); - - var key = $"parallel:{pipelineName}:{typeof(TContext).FullName}"; - return RegisterHandler(key, handler); - } - - public async Task ExecuteParallelAsync(string pipelineName, TContext context) - { - ArgumentException.ThrowIfNullOrWhiteSpace(pipelineName); - - var key = $"parallel:{pipelineName}:{typeof(TContext).FullName}"; - List> handlers; - - lock (_syncLock) - { - if (!_pipelines.TryGetValue(key, out var list) || list.Count == 0) - { - return; - } - - handlers = list.Cast>().ToList(); - } - - var tasks = handlers.Select(h => h(context)).ToArray(); - await Task.WhenAll(tasks); - } - - public IDisposable RegisterSerial(string pipelineName, Func handler) - { - ArgumentException.ThrowIfNullOrWhiteSpace(pipelineName); - ArgumentNullException.ThrowIfNull(handler); - - var key = $"serial:{pipelineName}:{typeof(TContext).FullName}"; - return RegisterHandler(key, handler); - } - - public async Task ExecuteSerialAsync(string pipelineName, TContext context) - { - ArgumentException.ThrowIfNullOrWhiteSpace(pipelineName); - - var key = $"serial:{pipelineName}:{typeof(TContext).FullName}"; - List> handlers; - - lock (_syncLock) - { - if (!_pipelines.TryGetValue(key, out var list) || list.Count == 0) - { - return; - } - - handlers = list.Cast>().ToList(); - } - - foreach (var handler in handlers) - { - await handler(context); - } - } - - private IDisposable RegisterHandler(string key, object handler) - { - lock (_syncLock) - { - var list = _pipelines.GetOrAdd(key, _ => new List()); - list.Add(handler); - } - - return new DisposableAction(() => - { - lock (_syncLock) - { - if (_pipelines.TryGetValue(key, out var list)) - { - list.Remove(handler); - if (list.Count == 0) - { - _pipelines.TryRemove(key, out _); - } - } - } - }); - } - - private sealed class DisposableAction : IDisposable - { - private Action? _action; - - public DisposableAction(Action action) - { - _action = action; - } - - public void Dispose() - { - var act = System.Threading.Interlocked.Exchange(ref _action, null); - act?.Invoke(); - } - } -} diff --git a/src/PdfEditorApp.Core/Plugins/PluginExceptions.cs b/src/PdfEditorApp.Core/Plugins/PluginExceptions.cs deleted file mode 100644 index c42f551..0000000 --- a/src/PdfEditorApp.Core/Plugins/PluginExceptions.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System; - -namespace PdfEditorApp.Core.Plugins; - -/// -/// Base exception for all plugin-related runtime errors. -/// -public class PluginException : Exception -{ - public PluginException(string message) : base(message) { } - public PluginException(string message, Exception innerException) : base(message, innerException) { } -} - -/// -/// Thrown when a plugin requires a service contract that was not registered by any loaded plugin or the host. -/// -public class PluginMissingDependencyException : PluginException -{ - public string PluginId { get; } - public Type MissingServiceType { get; } - - public PluginMissingDependencyException(string pluginId, Type missingServiceType) - : base($"Plugin '{pluginId}' requires service '{missingServiceType.FullName}', but it was not provided by any active plugin or host service.") - { - PluginId = pluginId; - MissingServiceType = missingServiceType; - } -} - -/// -/// Thrown when a cycle is detected in plugin dependency declarations. -/// -public class PluginCircularDependencyException : PluginException -{ - public PluginCircularDependencyException(string message) : base(message) { } -} diff --git a/src/PdfEditorApp.Core/Plugins/PluginHost.cs b/src/PdfEditorApp.Core/Plugins/PluginHost.cs deleted file mode 100644 index ca83386..0000000 --- a/src/PdfEditorApp.Core/Plugins/PluginHost.cs +++ /dev/null @@ -1,443 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; - -namespace PdfEditorApp.Core.Plugins; - -/// -/// Lifecycle state of a registered FryPDF plugin. -/// -public enum PluginState -{ - Unloaded, - Registered, - Resolving, - Active, - Suspended, - Faulted -} - -/// -/// Internal tracking descriptor for a plugin and its activation scope. -/// -public class PluginEntry -{ - public IFryPlugin Plugin { get; } - public PluginState State { get; set; } = PluginState.Registered; - public PluginScope? Scope { get; set; } - public Exception? LastError { get; set; } - - public PluginEntry(IFryPlugin plugin) - { - Plugin = plugin; - } -} - -/// -/// Orchestrates plugin registration, dependency-driven topological mounting, reactive lifecycle states, -/// cascading dependency activation/deactivation, and scoped LIFO teardown. -/// -public class PluginHost : IAsyncDisposable, IDisposable -{ - private readonly object _lock = new(); - private readonly List _registeredPlugins = new(); - private readonly Dictionary _entries = new(StringComparer.OrdinalIgnoreCase); - private readonly List<(IFryPlugin Plugin, PluginScope Scope)> _activePlugins = new(); - private readonly FryPluginContext _context; - private bool _isRunning; - - /// - /// Event fired when an individual plugin transitions lifecycle states (e.g. Active, Suspended, Faulted). - /// - public event Action? PluginStateChanged; - - /// - /// The root plugin context. - /// - public IFryPluginContext Context => _context; - - /// - /// Gets all currently active plugins in order of activation. - /// - public IReadOnlyList LoadedPlugins - { - get - { - lock (_lock) - { - return _activePlugins.Select(p => p.Plugin).ToList(); - } - } - } - - /// - /// Gets all registered plugins, regardless of state. - /// - public IReadOnlyList RegisteredPlugins - { - get - { - lock (_lock) - { - return _registeredPlugins.ToList(); - } - } - } - - public PluginHost(FryPluginContext? context = null) - { - _context = context ?? new FryPluginContext(); - } - - /// - /// Gets the current lifecycle state of a plugin. - /// - public PluginState GetPluginState(string pluginId) - { - lock (_lock) - { - return _entries.TryGetValue(pluginId, out var entry) ? entry.State : PluginState.Unloaded; - } - } - - /// - /// Checks whether a plugin is currently in the Active state. - /// - public bool IsPluginActive(string pluginId) => GetPluginState(pluginId) == PluginState.Active; - - /// - /// Registers a plugin for mounting. - /// - public void RegisterPlugin(IFryPlugin plugin) - { - ArgumentNullException.ThrowIfNull(plugin); - lock (_lock) - { - if (_entries.TryGetValue(plugin.Id, out var existing)) - { - if (ReferenceEquals(existing.Plugin, plugin)) return; - - // Replace previous registration with the new plugin instance - _registeredPlugins.Remove(existing.Plugin); - _registeredPlugins.Add(plugin); - _entries[plugin.Id] = new PluginEntry(plugin); - return; - } - _registeredPlugins.Add(plugin); - _entries[plugin.Id] = new PluginEntry(plugin); - } - } - - /// - /// Registers multiple plugins for mounting. - /// - public void RegisterPlugins(IEnumerable plugins) - { - ArgumentNullException.ThrowIfNull(plugins); - foreach (var plugin in plugins) - { - RegisterPlugin(plugin); - } - } - - /// - /// Mounts all registered plugins in dependency-resolved topological order. - /// - public async Task StartAsync(CancellationToken ct = default) - { - List pending; - lock (_lock) - { - if (_isRunning) return; - pending = new List(_registeredPlugins.Where(p => _entries[p.Id].State != PluginState.Active)); - } - - while (pending.Count > 0) - { - ct.ThrowIfCancellationRequested(); - - var activatable = pending - .Where(p => p.RequiredServices.All(reqType => _context.HasService(reqType))) - .ToList(); - - if (activatable.Count == 0) - { - var allProvided = new HashSet(pending.SelectMany(p => p.ProvidedServices)); - - foreach (var p in pending) - { - var missing = p.RequiredServices.FirstOrDefault(r => !_context.HasService(r) && !allProvided.Contains(r)); - if (missing != null) - { - throw new PluginMissingDependencyException(p.Id, missing); - } - } - - throw new PluginCircularDependencyException( - $"Circular dependency detected among plugins: {string.Join(", ", pending.Select(p => p.Id))}"); - } - - foreach (var plugin in activatable) - { - ct.ThrowIfCancellationRequested(); - await MountPluginCoreAsync(plugin, ct); - pending.Remove(plugin); - } - } - - lock (_lock) - { - _isRunning = true; - } - } - - /// - /// Dynamically enables an individual plugin at runtime, mounting its capabilities and - /// reactively cascading activation to any downstream plugins waiting on its provided services. - /// - public async Task EnablePluginAsync(string pluginId, CancellationToken ct = default) - { - ArgumentException.ThrowIfNullOrWhiteSpace(pluginId); - - PluginEntry entry; - lock (_lock) - { - if (!_entries.TryGetValue(pluginId, out var e)) - { - throw new KeyNotFoundException($"Plugin with ID '{pluginId}' is not registered."); - } - if (e.State == PluginState.Active) return; - entry = e; - } - - // Validate dependencies - var missing = entry.Plugin.RequiredServices.FirstOrDefault(req => !_context.HasService(req)); - if (missing != null) - { - throw new PluginMissingDependencyException(entry.Plugin.Id, missing); - } - - await MountPluginCoreAsync(entry.Plugin, ct); - - // Cascading auto-mount for any suspended or registered plugins that can now activate - await AutoMountSatisfiedPluginsAsync(ct); - } - - /// - /// Dynamically disables an individual plugin at runtime, cleanly tearing down its effects - /// and cascading suspension to any dependent plugins that require services provided by this plugin. - /// - public async Task DisablePluginAsync(string pluginId, CancellationToken ct = default) - { - ArgumentException.ThrowIfNullOrWhiteSpace(pluginId); - - PluginEntry entry; - lock (_lock) - { - if (!_entries.TryGetValue(pluginId, out var e) || e.State != PluginState.Active) - { - return; - } - entry = e; - } - - // Unmount the target plugin first - await UnmountPluginCoreAsync(entry, PluginState.Suspended); - - // Cascading deactivation: iteratively suspend any active plugins whose RequiredServices are no longer satisfied in Context! - bool progress = true; - while (progress) - { - progress = false; - PluginEntry? nextToSuspend = null; - - lock (_lock) - { - nextToSuspend = _activePlugins - .Select(p => _entries[p.Plugin.Id]) - .FirstOrDefault(p => p.Plugin.RequiredServices.Any(req => !_context.HasService(req))); - } - - if (nextToSuspend != null) - { - await UnmountPluginCoreAsync(nextToSuspend, PluginState.Suspended); - progress = true; - } - } - } - - /// - /// Reloads a plugin by disabling it and re-enabling it. - /// - public async Task ReloadPluginAsync(string pluginId, CancellationToken ct = default) - { - await DisablePluginAsync(pluginId, ct); - await EnablePluginAsync(pluginId, ct); - } - - private async Task MountPluginCoreAsync(IFryPlugin plugin, CancellationToken ct) - { - PluginScope scope = new(); - var scopedContext = _context.CreateScopedContext(scope); - - lock (_lock) - { - if (_entries.TryGetValue(plugin.Id, out var entry)) - { - entry.State = PluginState.Resolving; - entry.Scope = scope; - entry.LastError = null; - } - } - - try - { - await plugin.ApplyAsync(scopedContext, ct); - - lock (_lock) - { - _activePlugins.Add((plugin, scope)); - if (_entries.TryGetValue(plugin.Id, out var entry)) - { - entry.State = PluginState.Active; - } - } - - PluginStateChanged?.Invoke(plugin.Id, PluginState.Active); - } - catch (Exception ex) - { - scope.Dispose(); - - lock (_lock) - { - if (_entries.TryGetValue(plugin.Id, out var entry)) - { - entry.State = PluginState.Faulted; - entry.Scope = null; - entry.LastError = ex; - } - } - - PluginStateChanged?.Invoke(plugin.Id, PluginState.Faulted); - throw; - } - } - - private Task UnmountPluginCoreAsync(PluginEntry entry, PluginState nextState) - { - PluginScope? scopeToDispose = null; - - lock (_lock) - { - var idx = _activePlugins.FindIndex(p => string.Equals(p.Plugin.Id, entry.Plugin.Id, StringComparison.OrdinalIgnoreCase)); - if (idx >= 0) - { - scopeToDispose = _activePlugins[idx].Scope; - _activePlugins.RemoveAt(idx); - } - - entry.State = nextState; - entry.Scope = null; - } - - if (scopeToDispose != null) - { - try - { - scopeToDispose.Dispose(); - } - catch (Exception ex) - { - entry.LastError = ex; - } - } - - PluginStateChanged?.Invoke(entry.Plugin.Id, nextState); - return Task.CompletedTask; - } - - private async Task AutoMountSatisfiedPluginsAsync(CancellationToken ct) - { - bool progress = true; - while (progress) - { - progress = false; - List candidates; - - lock (_lock) - { - candidates = _entries.Values - .Where(e => e.State is PluginState.Suspended or PluginState.Registered) - .Where(e => e.Plugin.RequiredServices.All(req => _context.HasService(req))) - .ToList(); - } - - foreach (var candidate in candidates) - { - ct.ThrowIfCancellationRequested(); - await MountPluginCoreAsync(candidate.Plugin, ct); - progress = true; - } - } - } - - /// - /// Unmounts all active plugins in reverse (LIFO) order and disposes their scopes. - /// - public async Task StopAsync(CancellationToken ct = default) - { - List<(IFryPlugin Plugin, PluginScope Scope)> toUnload; - lock (_lock) - { - if (!_isRunning && _activePlugins.Count == 0) return; - _isRunning = false; - - toUnload = new List<(IFryPlugin Plugin, PluginScope Scope)>(_activePlugins); - _activePlugins.Clear(); - - foreach (var entry in _entries.Values) - { - entry.State = PluginState.Unloaded; - entry.Scope = null; - } - } - - toUnload.Reverse(); - - List? exceptions = null; - foreach (var (plugin, scope) in toUnload) - { - try - { - scope.Dispose(); - } - catch (Exception ex) - { - exceptions ??= new List(); - exceptions.Add(new PluginException($"Error while unloading plugin '{plugin.Id}': {ex.Message}", ex)); - } - } - - if (exceptions is { Count: > 0 }) - { - throw new AggregateException("One or more errors occurred while stopping plugins.", exceptions); - } - - await Task.CompletedTask; - } - - public async ValueTask DisposeAsync() - { - await StopAsync(); - GC.SuppressFinalize(this); - } - - public void Dispose() - { - StopAsync().GetAwaiter().GetResult(); - GC.SuppressFinalize(this); - } -} diff --git a/src/PdfEditorApp.Core/Plugins/PluginScope.cs b/src/PdfEditorApp.Core/Plugins/PluginScope.cs deleted file mode 100644 index 8016935..0000000 --- a/src/PdfEditorApp.Core/Plugins/PluginScope.cs +++ /dev/null @@ -1,106 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace PdfEditorApp.Core.Plugins; - -/// -/// Manages the reversible effects and resources registered by a plugin during its lifetime. -/// When the scope is disposed, registered effects and unmanaged handles are unwound in reverse (LIFO) order. -/// -public sealed class PluginScope : IDisposable -{ - private readonly object _lock = new(); - private readonly Stack _disposers = new(); - private bool _isDisposed; - - /// - /// Gets whether this scope has been disposed. - /// - public bool IsDisposed - { - get - { - lock (_lock) return _isDisposed; - } - } - - /// - /// Registers a reversible effect or cleanup action to execute when this scope is disposed. - /// - /// The cleanup action to execute on disposal. - /// An token that can prematurely unregister or execute this effect. - public IDisposable RegisterEffect(Action onDispose) - { - ArgumentNullException.ThrowIfNull(onDispose); - - lock (_lock) - { - ObjectDisposedException.ThrowIf(_isDisposed, this); - _disposers.Push(onDispose); - } - - return new ScopeEffectToken(onDispose); - } - - /// - /// Registers an instance to be disposed when this scope is torn down. - /// - public IDisposable RegisterDisposable(IDisposable disposable) - { - ArgumentNullException.ThrowIfNull(disposable); - return RegisterEffect(disposable.Dispose); - } - - /// - /// Unwinds all registered effects in reverse (LIFO) order. - /// - public void Dispose() - { - List actionsToRun; - - lock (_lock) - { - if (_isDisposed) return; - _isDisposed = true; - - actionsToRun = new List(_disposers); - _disposers.Clear(); - } - - // Execute in LIFO order (Stack enumeration is top-to-bottom, which is LIFO) - List? exceptions = null; - foreach (var action in actionsToRun) - { - try - { - action(); - } - catch (Exception ex) - { - exceptions ??= new List(); - exceptions.Add(ex); - } - } - - if (exceptions is { Count: > 0 }) - { - throw new AggregateException("One or more errors occurred while unwinding plugin effects.", exceptions); - } - } - - private sealed class ScopeEffectToken : IDisposable - { - private Action? _action; - - public ScopeEffectToken(Action action) - { - _action = action; - } - - public void Dispose() - { - // Note: The main scope disposal will safely no-op or run whatever is registered. - _action = null; - } - } -} diff --git a/src/PdfEditorApp.Core/Plugins/Profiles/IFryPluginBundle.cs b/src/PdfEditorApp.Core/Plugins/Profiles/IFryPluginBundle.cs deleted file mode 100644 index 2a9db22..0000000 --- a/src/PdfEditorApp.Core/Plugins/Profiles/IFryPluginBundle.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System.Collections.Generic; - -namespace PdfEditorApp.Core.Plugins.Profiles; - -/// -/// Represents a cohesive bundle of plugins, inspired by the Cordis bundle concept. -/// -public interface IFryPluginBundle -{ - /// Unique identifier for this bundle, e.g. "FryPdf.Bundle.Organize". - string Id { get; } - - /// Display name of the bundle. - string Name { get; } - - /// Description of the bundle's capabilities. - string Description { get; } - - /// Collection of plugins contained within this bundle. - IReadOnlyList Plugins { get; } -} diff --git a/src/PdfEditorApp.Core/Plugins/Profiles/PluginProfile.cs b/src/PdfEditorApp.Core/Plugins/Profiles/PluginProfile.cs deleted file mode 100644 index 28a1f34..0000000 --- a/src/PdfEditorApp.Core/Plugins/Profiles/PluginProfile.cs +++ /dev/null @@ -1,58 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; - -namespace PdfEditorApp.Core.Plugins.Profiles; - -/// -/// Defines an application runtime profile configuration. -/// Defines composable application profiles (e.g. 'desktop', 'headless', 'sdk'). -/// -public class PluginProfile -{ - /// Name of the profile, e.g. "desktop" or "headless". - public string ProfileName { get; set; } = "desktop"; - - /// Alias for ProfileName to support standard metadata naming. - public string Name - { - get => ProfileName; - set => ProfileName = value; - } - - /// Profile version description. - public string Version { get; set; } = "1.0.0"; - - /// Profile summary description. - public string Description { get; set; } = string.Empty; - - /// List of bundle IDs to mount in this profile. - public List Bundles { get; set; } = new(); - - /// Optional list of individually enabled plugin IDs. - public List EnabledPlugins { get; set; } = new(); - - /// Optional list of individual plugin IDs to disable even if their bundle is included. - public List DisabledPlugins { get; set; } = new(); - - /// Profile-specific configuration key-value pairs. - public Dictionary Settings { get; set; } = new(StringComparer.OrdinalIgnoreCase); - - /// Checks whether a plugin is enabled under this profile. - public bool IsPluginEnabled(string pluginId) - { - ArgumentException.ThrowIfNullOrWhiteSpace(pluginId); - if (DisabledPlugins.Any(d => string.Equals(d, pluginId, StringComparison.OrdinalIgnoreCase))) - return false; - if (EnabledPlugins.Count > 0) - return EnabledPlugins.Any(e => string.Equals(e, pluginId, StringComparison.OrdinalIgnoreCase)); - return true; - } - - /// Checks whether a bundle is configured in this profile. - public bool IsBundleEnabled(string bundleId) - { - ArgumentException.ThrowIfNullOrWhiteSpace(bundleId); - return Bundles.Any(b => string.Equals(b, bundleId, StringComparison.OrdinalIgnoreCase)); - } -} diff --git a/src/PdfEditorApp.Core/Plugins/Profiles/ProfileLoader.cs b/src/PdfEditorApp.Core/Plugins/Profiles/ProfileLoader.cs deleted file mode 100644 index ad2a89c..0000000 --- a/src/PdfEditorApp.Core/Plugins/Profiles/ProfileLoader.cs +++ /dev/null @@ -1,109 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text.Json; -using System.Threading.Tasks; - -namespace PdfEditorApp.Core.Plugins.Profiles; - -/// -/// Deserializes profile configuration files and mounts active bundles into the . -/// -public static class ProfileLoader -{ - private static readonly JsonSerializerOptions JsonOptions = new() - { - PropertyNameCaseInsensitive = true, - ReadCommentHandling = JsonCommentHandling.Skip, - AllowTrailingCommas = true - }; - - /// - /// Parses a from raw JSON text. - /// - public static PluginProfile LoadFromJson(string json) - { - ArgumentException.ThrowIfNullOrWhiteSpace(json); - return JsonSerializer.Deserialize(json, JsonOptions) - ?? throw new JsonException("Failed to deserialize profile JSON."); - } - - /// - /// Alias for . - /// - public static PluginProfile LoadProfileFromJson(string json) => LoadFromJson(json); - - /// - /// Reads and parses a from a file on disk. - /// - public static PluginProfile LoadFromFile(string filePath) - { - ArgumentException.ThrowIfNullOrWhiteSpace(filePath); - if (!File.Exists(filePath)) - { - throw new FileNotFoundException($"Profile configuration file '{filePath}' was not found."); - } - - var json = File.ReadAllText(filePath); - return LoadFromJson(json); - } - - /// - /// Alias for . - /// - public static PluginProfile LoadProfileFromFile(string filePath) => LoadFromFile(filePath); - - /// - /// Mounts bundles defined in the profile into the target , excluding any disabled plugins. - /// - public static void ApplyProfile( - PluginProfile profile, - PluginHost host, - IEnumerable availableBundles) - { - ArgumentNullException.ThrowIfNull(profile); - ArgumentNullException.ThrowIfNull(host); - ArgumentNullException.ThrowIfNull(availableBundles); - - var bundleMap = availableBundles.ToDictionary(b => b.Id, StringComparer.OrdinalIgnoreCase); - var disabledSet = new HashSet(profile.DisabledPlugins, StringComparer.OrdinalIgnoreCase); - - foreach (var bundleId in profile.Bundles) - { - if (bundleMap.TryGetValue(bundleId, out var bundle)) - { - foreach (var plugin in bundle.Plugins) - { - if (!disabledSet.Contains(plugin.Id)) - { - host.RegisterPlugin(plugin); - } - } - } - } - } - - /// - /// Filters available plugins according to the profile and registers & starts them on the host. - /// - public static async Task ApplyToHostAsync( - PluginHost host, - PluginProfile profile, - IEnumerable availablePlugins) - { - ArgumentNullException.ThrowIfNull(host); - ArgumentNullException.ThrowIfNull(profile); - ArgumentNullException.ThrowIfNull(availablePlugins); - - foreach (var plugin in availablePlugins) - { - if (profile.IsPluginEnabled(plugin.Id)) - { - host.RegisterPlugin(plugin); - } - } - - await host.StartAsync(); - } -} diff --git a/src/PdfEditorApp.Core/Plugins/Settings/IPluginSettingsStore.cs b/src/PdfEditorApp.Core/Plugins/Settings/IPluginSettingsStore.cs deleted file mode 100644 index a9dc042..0000000 --- a/src/PdfEditorApp.Core/Plugins/Settings/IPluginSettingsStore.cs +++ /dev/null @@ -1,116 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Text.Json; - -namespace PdfEditorApp.Core.Plugins.Settings; - -/// -/// Contract for persisting and retrieving user configurations for plugins. -/// -public interface IPluginSettingsStore -{ - T GetSetting(string pluginId, string key, T defaultValue); - void SetSetting(string pluginId, string key, T value); - Dictionary GetPluginSettings(string pluginId); - void Save(); -} - -/// -/// File-backed persistent settings store saving to "plugins.settings.json". -/// -public class FilePluginSettingsStore : IPluginSettingsStore -{ - private readonly string _filePath; - private readonly Dictionary> _data; - private readonly object _lock = new(); - - public FilePluginSettingsStore(string? filePath = null) - { - _filePath = filePath ?? Path.Combine(AppContext.BaseDirectory, "plugins.settings.json"); - _data = LoadFromFile(); - } - - private Dictionary> LoadFromFile() - { - try - { - if (File.Exists(_filePath)) - { - var json = File.ReadAllText(_filePath); - return JsonSerializer.Deserialize>>(json) ?? new(); - } - } - catch - { - // Fall back to clean state on corruption - } - return new(); - } - - public T GetSetting(string pluginId, string key, T defaultValue) - { - lock (_lock) - { - if (_data.TryGetValue(pluginId, out var dict) && dict.TryGetValue(key, out var val)) - { - if (val is JsonElement elem) - { - return JsonSerializer.Deserialize(elem.GetRawText()) ?? defaultValue; - } - if (val is T typedVal) - { - return typedVal; - } - } - return defaultValue; - } - } - - public void SetSetting(string pluginId, string key, T value) - { - lock (_lock) - { - if (!_data.TryGetValue(pluginId, out var dict)) - { - dict = new(); - _data[pluginId] = dict; - } - dict[key] = value!; - Save(); - } - } - - public Dictionary GetPluginSettings(string pluginId) - { - lock (_lock) - { - if (_data.TryGetValue(pluginId, out var dict)) - { - return new(dict); - } - return new(); - } - } - - public void Save() - { - lock (_lock) - { - try - { - var dir = Path.GetDirectoryName(_filePath); - if (!string.IsNullOrEmpty(dir) && !Directory.Exists(dir)) - { - Directory.CreateDirectory(dir); - } - var json = JsonSerializer.Serialize(_data, new JsonSerializerOptions { WriteIndented = true }); - File.WriteAllText(_filePath, json); - } - catch - { - // Silently ignore disk write failures - } - } - } -} diff --git a/src/PdfEditorApp.Core/QuestPdfInitializer.cs b/src/PdfEditorApp.Core/QuestPdfInitializer.cs deleted file mode 100644 index ae655da..0000000 --- a/src/PdfEditorApp.Core/QuestPdfInitializer.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System.Runtime.CompilerServices; -using QuestPDF.Infrastructure; - -namespace PdfEditorApp.Core; - -/// -/// Global static module initializer that configures QuestPDF license tier automatically -/// on module load before any document generation code or tests run. -/// -internal static class QuestPdfInitializer -{ -#pragma warning disable CA2255 // The 'ModuleInitializer' attribute is only intended to be used in application code - [ModuleInitializer] - internal static void Initialize() - { - QuestPDF.Settings.License = LicenseType.Community; - } -#pragma warning restore CA2255 -} diff --git a/src/PdfEditorApp.Core/Services/IFontPackageService.cs b/src/PdfEditorApp.Core/Services/IFontPackageService.cs deleted file mode 100644 index b304de4..0000000 --- a/src/PdfEditorApp.Core/Services/IFontPackageService.cs +++ /dev/null @@ -1,73 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using PdfEditorApp.Core.Models; - -namespace PdfEditorApp.Core.Services; - -/// -/// Service managing on-demand language and font packs for international and creative PDF rendering. -/// Keeps the application lightweight while enabling global script support through local caching. -/// -public interface IFontPackageService -{ - /// - /// Event fired whenever fonts are downloaded, imported, or deleted. - /// - event Action? FontLibraryChanged; - - /// - /// Returns the catalog of all available font packages. - /// - IReadOnlyList GetAllPackages(); - - /// - /// Returns the local user directory where downloaded/custom fonts are stored. - /// - string GetUserFontDirectory(); - - /// - /// Checks if a package's font files are present on disk. - /// - bool IsPackageInstalled(FontPackageInfo package); - - /// - /// Downloads all font files in a package asynchronously with progress reporting. - /// - Task DownloadPackageAsync( - FontPackageInfo package, - IProgress? progress = null, - Action? statusCallback = null, - CancellationToken ct = default); - - /// - /// Deletes a downloaded font package from local disk to reclaim space. - /// - Task DeletePackageAsync(FontPackageInfo package); - - /// - /// Calculates the total disk space used by downloaded and custom fonts. - /// - Task GetTotalCacheSizeBytesAsync(); - - /// - /// Deletes all downloaded font cache files. - /// - Task ClearAllCacheAsync(); - - /// - /// Imports a user-supplied custom .ttf / .otf font file into the local font directory. - /// - Task ImportCustomFontAsync(string sourceFilePath); - - /// - /// Scans text for non-Latin script characters and returns the corresponding font package if not yet installed. - /// - FontPackageInfo? DetectMissingPackageForText(string text); - - /// - /// Returns all font file paths available across embedded and downloaded directories. - /// - IEnumerable GetAllAvailableFontFilePaths(); -} diff --git a/src/PdfEditorApp.Core/Utils/FryPdfEmbeddingHelper.cs b/src/PdfEditorApp.Core/Utils/FryPdfEmbeddingHelper.cs deleted file mode 100644 index 4b8d509..0000000 --- a/src/PdfEditorApp.Core/Utils/FryPdfEmbeddingHelper.cs +++ /dev/null @@ -1,154 +0,0 @@ -using System; -using System.IO; -using System.IO.Compression; -using System.Text; -using System.Text.Json; -using System.Text.Json.Serialization; -using PdfEditorApp.Core.Models; - -namespace PdfEditorApp.Core.Utils; - -/// -/// Embeds and extracts lossless native FryPDF document models (including tables, charts, -/// math formulas, barcodes, QR codes, layers, and vector shapes) directly inside standard PDF files. -/// -public static class FryPdfEmbeddingHelper -{ - public const string StartMarker = "%FRYPDF_MODEL_V1_START%"; - public const string EndMarker = "%FRYPDF_MODEL_V1_END%"; - - private static readonly JsonSerializerOptions JsonOptions = new() - { - WriteIndented = false, - DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull, - Converters = { new JsonStringEnumConverter() } - }; - - /// - /// Embeds the serialized, compressed PdfDocumentModel into the PDF bytes as a valid PDF comment stream. - /// The resulting PDF remains 100% compliant with standard PDF viewers (Acrobat, Chrome, Preview). - /// - public static byte[] EmbedModelInPdfBytes(byte[] pdfBytes, PdfDocumentModel model) - { - if (pdfBytes == null || pdfBytes.Length == 0 || model == null) - return pdfBytes ?? Array.Empty(); - - try - { - string json = JsonSerializer.Serialize(model, JsonOptions); - byte[] jsonBytes = Encoding.UTF8.GetBytes(json); - - byte[] compressedBytes; - using (var ms = new MemoryStream()) - { - using (var deflate = new DeflateStream(ms, CompressionLevel.Optimal, leaveOpen: true)) - { - deflate.Write(jsonBytes, 0, jsonBytes.Length); - } - compressedBytes = ms.ToArray(); - } - - string base64 = Convert.ToBase64String(compressedBytes); - - var sb = new StringBuilder(); - sb.AppendLine(); - sb.AppendLine(StartMarker); - - // Chunk base64 into 76-char lines formatted as valid PDF comments - for (int i = 0; i < base64.Length; i += 76) - { - int len = Math.Min(76, base64.Length - i); - sb.Append('%'); - sb.AppendLine(base64.Substring(i, len)); - } - - sb.AppendLine(EndMarker); - sb.AppendLine("%%EOF"); - - byte[] payloadBytes = Encoding.ASCII.GetBytes(sb.ToString()); - - byte[] result = new byte[pdfBytes.Length + payloadBytes.Length]; - Buffer.BlockCopy(pdfBytes, 0, result, 0, pdfBytes.Length); - Buffer.BlockCopy(payloadBytes, 0, result, pdfBytes.Length, payloadBytes.Length); - - return result; - } - catch - { - // If serialization fails, return unmodified PDF bytes - return pdfBytes; - } - } - - /// - /// Attempts to extract and deserialize an embedded FryPdfModel from the PDF bytes. - /// Returns true if a valid, lossless model was successfully retrieved. - /// - public static bool TryExtractEmbeddedModel(byte[] pdfBytes, out PdfDocumentModel? model) - { - model = null; - if (pdfBytes == null || pdfBytes.Length < 64) return false; - - try - { - // Look for StartMarker and EndMarker in the byte stream - string content = Encoding.ASCII.GetString(pdfBytes); - int startIdx = content.IndexOf(StartMarker, StringComparison.Ordinal); - if (startIdx < 0) return false; - - int dataStart = startIdx + StartMarker.Length; - int endIdx = content.IndexOf(EndMarker, dataStart, StringComparison.Ordinal); - if (endIdx < 0) return false; - - string rawPayload = content.Substring(dataStart, endIdx - dataStart); - - // Clean lines and strip leading '%' comment characters - var base64Sb = new StringBuilder(rawPayload.Length); - using (var reader = new StringReader(rawPayload)) - { - string? line; - while ((line = reader.ReadLine()) != null) - { - string trimmed = line.Trim(); - if (trimmed.StartsWith("%")) - { - trimmed = trimmed.Substring(1).Trim(); - } - if (!string.IsNullOrEmpty(trimmed)) - { - base64Sb.Append(trimmed); - } - } - } - - string base64 = base64Sb.ToString(); - if (string.IsNullOrWhiteSpace(base64)) return false; - - byte[] compressedBytes = Convert.FromBase64String(base64); - - byte[] jsonBytes; - using (var inputMs = new MemoryStream(compressedBytes)) - using (var deflate = new DeflateStream(inputMs, CompressionMode.Decompress)) - using (var outputMs = new MemoryStream()) - { - deflate.CopyTo(outputMs); - jsonBytes = outputMs.ToArray(); - } - - string json = Encoding.UTF8.GetString(jsonBytes); - var deserialized = JsonSerializer.Deserialize(json, JsonOptions); - - if (deserialized != null && deserialized.Pages.Count > 0) - { - model = deserialized; - return true; - } - } - catch - { - // Ignore extraction errors and fallback to deconstruction - } - - return false; - } -} diff --git a/src/PdfEditorApp.Core/Utils/PdfDocumentSanitizer.cs b/src/PdfEditorApp.Core/Utils/PdfDocumentSanitizer.cs deleted file mode 100644 index e4a6b82..0000000 --- a/src/PdfEditorApp.Core/Utils/PdfDocumentSanitizer.cs +++ /dev/null @@ -1,134 +0,0 @@ -using System; -using System.IO; -using System.Text; -using PdfSharpCore.Pdf; -using PdfSharpCore.Pdf.IO; -using UglyToad.PdfPig; -using UglyToad.PdfPig.Writer; - -namespace PdfEditorApp.Core.Utils; - -/// -/// Low-level PDF byte sanitizer, header repair, cross-reference rebuild, and producer metadata engine. -/// -public static class PdfDocumentSanitizer -{ - public static byte[] SanitizePdfBytes(byte[] rawBytes) - { - if (rawBytes == null || rawBytes.Length < 10) return rawBytes ?? Array.Empty(); - - // Look for the last %%EOF token in the file - string rawText = Encoding.ASCII.GetString(rawBytes, Math.Max(0, rawBytes.Length - 8192), Math.Min(rawBytes.Length, 8192)); - int eofIdx = rawText.LastIndexOf("%%EOF", StringComparison.OrdinalIgnoreCase); - - if (eofIdx >= 0) - { - int startOffset = Math.Max(0, rawBytes.Length - 8192); - int eofAbsoluteEnd = startOffset + eofIdx + 5; - - if (eofAbsoluteEnd < rawBytes.Length) - { - var trimmed = new byte[eofAbsoluteEnd + 2]; - Array.Copy(rawBytes, 0, trimmed, 0, eofAbsoluteEnd); - trimmed[eofAbsoluteEnd] = (byte)'\r'; - trimmed[eofAbsoluteEnd + 1] = (byte)'\n'; - return trimmed; - } - } - else - { - // Missing %%EOF, append standard trailer terminator - using var ms = new MemoryStream(); - ms.Write(rawBytes, 0, rawBytes.Length); - byte[] terminator = Encoding.ASCII.GetBytes("\r\n%%EOF\r\n"); - ms.Write(terminator, 0, terminator.Length); - return ms.ToArray(); - } - - return rawBytes; - } - - public static byte[] SalvageAndRepairPdfBytes(byte[] rawBytes) - { - if (rawBytes == null || rawBytes.Length < 10) return rawBytes ?? Array.Empty(); - - string fullText = Encoding.ASCII.GetString(rawBytes); - int rootIdx = fullText.IndexOf("/Root", StringComparison.OrdinalIgnoreCase); - if (rootIdx >= 0 && !fullText.Contains("trailer")) - { - int spaceIdx = fullText.IndexOf(" ", rootIdx + 5); - string rootRef = "1 0 R"; - if (spaceIdx > 0 && spaceIdx + 10 < fullText.Length) - { - string snippet = fullText.Substring(rootIdx + 5, Math.Min(20, fullText.Length - (rootIdx + 5))).Trim(); - var parts = snippet.Split(new[] { ' ', '\r', '\n', '/' }, StringSplitOptions.RemoveEmptyEntries); - if (parts.Length >= 3 && parts[2] == "R") - { - rootRef = $"{parts[0]} {parts[1]} R"; - } - } - - using var ms = new MemoryStream(); - ms.Write(rawBytes, 0, rawBytes.Length); - string synthTrailer = $"\r\ntrailer\r\n<<\r\n/Root {rootRef}\r\n>>\r\nstartxref\r\n0\r\n%%EOF\r\n"; - byte[] tBytes = Encoding.ASCII.GetBytes(synthTrailer); - ms.Write(tBytes, 0, tBytes.Length); - return ms.ToArray(); - } - return rawBytes; - } - - public static byte[] ReconstructCleanPdfWithPdfPig(string filePath) - { - var builder = new PdfDocumentBuilder(); - using (var pigDoc = UglyToad.PdfPig.PdfDocument.Open(filePath)) - { - for (int i = 1; i <= pigDoc.NumberOfPages; i++) - { - builder.AddPage(pigDoc, i); - } - } - return builder.Build(); - } - - public static byte[] PatchProducerInBytes(byte[] bytes, string producer = "codefrydev.in") - { - if (bytes == null || bytes.Length < 20) return bytes ?? Array.Empty(); - - try - { - string text = Encoding.ASCII.GetString(bytes); - if (text.Contains("/Encrypt")) - { - // Never binary patch encrypted PDF streams - return bytes; - } - - int searchIdx = 0; - while ((searchIdx = text.IndexOf("/Producer", searchIdx, StringComparison.Ordinal)) >= 0) - { - int openParen = text.IndexOf('(', searchIdx); - if (openParen > searchIdx && openParen < searchIdx + 25) - { - int closeParen = text.IndexOf(')', openParen); - if (closeParen > openParen) - { - int origSpanLen = closeParen - openParen + 1; - string replacement = $"({producer})"; - if (replacement.Length <= origSpanLen) - { - string filler = "%".PadRight(origSpanLen - replacement.Length, ' '); - string fullPatch = replacement + filler; - byte[] patchBytes = Encoding.ASCII.GetBytes(fullPatch); - Array.Copy(patchBytes, 0, bytes, openParen, patchBytes.Length); - } - } - } - searchIdx += 9; - } - } - catch { } - - return bytes; - } -} diff --git a/src/PdfEditorApp/App.axaml b/src/PdfEditorApp/App.axaml deleted file mode 100644 index 1573427..0000000 --- a/src/PdfEditorApp/App.axaml +++ /dev/null @@ -1,103 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 8 - 0 - 0 - 24 - 24 - 20 - 20 - 20 - 20 - 10 - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/PdfEditorApp/App.axaml.cs b/src/PdfEditorApp/App.axaml.cs deleted file mode 100644 index 943ff88..0000000 --- a/src/PdfEditorApp/App.axaml.cs +++ /dev/null @@ -1,293 +0,0 @@ -using PdfEditorApp.Services.Tools.Core; -using PdfEditorApp.Services.Tools.Organize; -using PdfEditorApp.Services.Tools.Security; -using PdfEditorApp.Services.Tools.Conversion; -using PdfEditorApp.Services.Tools.Intelligence; -using PdfEditorApp.ViewModels.Tools.Core; -using PdfEditorApp.ViewModels.Tools.Organize; -using PdfEditorApp.ViewModels.Tools.Security; -using PdfEditorApp.ViewModels.Tools.Conversion; -using PdfEditorApp.ViewModels.Tools.Intelligence; -using System; -using Avalonia; -using Avalonia.Controls.ApplicationLifetimes; -using Avalonia.Markup.Xaml; -using Microsoft.Extensions.DependencyInjection; -using PdfEditorApp.Core.Plugins; -using PdfEditorApp.Core.Plugins.Descriptors; -using PdfEditorApp.Services; -using PdfEditorApp.Services.Canvas; -using PdfEditorApp.Services.Ribbon; -using PdfEditorApp.Services.AI; -using PdfEditorApp.Services.Data; -using PdfEditorApp.Services.Export; -using PdfEditorApp.Services.Import; -using PdfEditorApp.Services.Inspector; -using PdfEditorApp.Services.Ocr; -using PdfEditorApp.Services.StatusBar; -using PdfEditorApp.ViewModels; -using PdfEditorApp.Views; - -namespace PdfEditorApp; - -public partial class App : Application -{ - public static IServiceProvider Services { get; private set; } = null!; - - public override void Initialize() - { - Name = "FryPDF"; - LiveChartsCore.LiveCharts.Configure(config => LiveChartsCore.SkiaSharpView.LiveChartsSkiaSharp.UseDefaults(config)); - AvaloniaXamlLoader.Load(this); - } - - private void AboutMenuItem_OnClick(object? sender, EventArgs e) - { - if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop && desktop.MainWindow?.DataContext is MainViewModel mainVm) - { - mainVm.OpenAboutDialogCommand.Execute(null); - } - } - - public override void OnFrameworkInitializationCompleted() - { - var serviceCollection = new ServiceCollection(); - ConfigureServices(serviceCollection); - Services = serviceCollection.BuildServiceProvider(); - - var themeService = Services.GetRequiredService(); - themeService.Initialize(); - - InitializePluginSystem(); - - if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) - { - var mainVm = Services.GetRequiredService(); - desktop.MainWindow = new MainWindow - { - DataContext = mainVm, - }; - } - - base.OnFrameworkInitializationCompleted(); - } - - private static void InitializePluginSystem() - { - try - { - PageViewModel.DefaultElementService = Services.GetRequiredService(); - var host = Services.GetRequiredService(); - - var profilePath = System.IO.Path.Combine(AppContext.BaseDirectory, "profiles", "desktop.profile.json"); - if (!System.IO.File.Exists(profilePath)) - { - profilePath = "profiles/desktop.profile.json"; - } - - PdfEditorApp.Core.Plugins.Profiles.PluginProfile profile; - if (System.IO.File.Exists(profilePath)) - { - profile = PdfEditorApp.Core.Plugins.Profiles.ProfileLoader.LoadFromFile(profilePath); - } - else - { - profile = new PdfEditorApp.Core.Plugins.Profiles.PluginProfile { ProfileName = "desktop" }; - } - - var availableBundles = new PdfEditorApp.Core.Plugins.Profiles.IFryPluginBundle[] - { - new PdfEditorApp.Plugins.Bundles.ToolsOrganizeBundle(), - new PdfEditorApp.Plugins.Bundles.ToolsSecurityBundle(), - new PdfEditorApp.Plugins.Bundles.ToolsConversionBundle(), - new PdfEditorApp.Plugins.Bundles.ToolsIntelligenceBundle(), - new PdfEditorApp.Plugins.Bundles.DataStudioBundle(), - new PdfEditorApp.Plugins.Bundles.CanvasElementsBundle(), - new PdfEditorApp.Plugins.Bundles.DocumentIoBundle(), - new PdfEditorApp.Plugins.Bundles.AiProvidersBundle(), - new PdfEditorApp.Plugins.Bundles.OcrEnginesBundle(), - new PdfEditorApp.Plugins.Bundles.StandardTemplatesBundle(), - new PdfEditorApp.Plugins.Bundles.StatusBarBundle(), - new PdfEditorApp.Plugins.Bundles.InspectorBundle(), - new PdfEditorApp.Plugins.Bundles.CommandPaletteBundle(), - new PdfEditorApp.Plugins.Bundles.WorkspacePagesBundle(), - new PdfEditorApp.Plugins.Bundles.DialogsBundle(), - new PdfEditorApp.Plugins.Bundles.EditorSidebarsBundle(), - new PdfEditorApp.Plugins.Bundles.ShellOverlaysBundle() - }; - - PdfEditorApp.Core.Plugins.Profiles.ProfileLoader.ApplyProfile(profile, host, availableBundles); - - string[] directoriesToScan = - [ - System.IO.Path.Combine(AppContext.BaseDirectory, "plugins"), - System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "FryPdf", "plugins") - ]; - - foreach (var dir in directoriesToScan) - { - if (System.IO.Directory.Exists(dir)) - { - var externalPackages = PdfEditorApp.Plugins.Loader.PluginAssemblyLoader.DiscoverAndLoadDirectory(dir); - foreach (var pkg in externalPackages) - { - foreach (var plugin in pkg.Plugins) - { - host.RegisterPlugin(plugin); - } - } - } - } - - host.StartAsync().GetAwaiter().GetResult(); - } - catch (Exception ex) - { - System.Diagnostics.Debug.WriteLine($"[App] Plugin system initialization warning: {ex.Message}"); - } - } - - public static void ConfigureServices(IServiceCollection services) - { - // Core Services - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(sp => new PdfExportService(sp.GetService())); - services.AddSingleton(sp => new PdfImportService(sp.GetRequiredService(), sp.GetService())); - services.AddSingleton(sp => new ProjectPersistenceService(sp.GetRequiredService(), sp.GetService())); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddTransient(); - - // Plugin Infrastructure (Everything is a Plugin) - services.AddSingleton(sp => new CanvasElementRegistry(sp, seedBuiltIns: false)); - services.AddSingleton(sp => sp.GetRequiredService()); - services.AddSingleton(sp => sp.GetRequiredService()); - services.AddSingleton(); - services.AddSingleton(sp => sp.GetRequiredService()); - - services.AddSingleton(); - services.AddSingleton(sp => sp.GetRequiredService()); - services.AddSingleton(); - services.AddSingleton(sp => sp.GetRequiredService()); - services.AddSingleton(sp => new InspectorRegistry(seedDefaults: false)); - services.AddSingleton(sp => sp.GetRequiredService()); - services.AddSingleton(); - services.AddSingleton(sp => sp.GetRequiredService()); - services.AddSingleton(sp => (ITemplateRegistry)sp.GetRequiredService()); - services.AddSingleton(); - services.AddSingleton(sp => sp.GetRequiredService()); - services.AddSingleton(); - services.AddSingleton(sp => sp.GetRequiredService()); - services.AddSingleton(sp => new StatusBarRegistry(seedDefaults: false)); - services.AddSingleton(sp => sp.GetRequiredService()); - services.AddSingleton(); - services.AddSingleton(sp => sp.GetRequiredService()); - services.AddSingleton(); - services.AddSingleton(sp => sp.GetRequiredService()); - services.AddSingleton(); - services.AddSingleton(sp => sp.GetRequiredService()); - services.AddSingleton(); - services.AddSingleton(sp => sp.GetRequiredService()); - services.AddSingleton(); - services.AddSingleton(sp => sp.GetRequiredService()); - services.AddSingleton(); - services.AddSingleton(); - - - services.AddSingleton(sp => new FryPluginContext(sp)); - services.AddSingleton(sp => sp.GetRequiredService()); - services.AddSingleton(sp => new PluginHost(sp.GetRequiredService())); - services.AddSingleton(); - - // PDF Tools Platform Services - services.AddSingleton(); - services.AddSingleton(sp => new PdfToolRegistry(sp.GetRequiredService(), seedDefaults: false)); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(sp => - new PdfDocumentOperationsService( - sp.GetRequiredService(), - sp.GetRequiredService(), - sp.GetRequiredService(), - sp.GetRequiredService(), - sp.GetRequiredService(), - sp.GetRequiredService(), - sp.GetRequiredService(), - sp.GetRequiredService(), - sp.GetRequiredService(), - sp.GetRequiredService(), - sp.GetService())); - services.AddSingleton(sp => - new PdfToolViewModelFactory( - sp.GetRequiredService(), - sp.GetRequiredService(), - sp)); - - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - - // ViewModels - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - - // Individual Tool ViewModels (resolvable directly or via IPdfToolViewModelFactory) - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - } -} \ No newline at end of file diff --git a/src/PdfEditorApp/Assets/Fonts/BebasNeue.ttf b/src/PdfEditorApp/Assets/Fonts/BebasNeue.ttf deleted file mode 100644 index c328c6e08b20a20a1de47d823e007ee73812a438..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61400 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 diff --git a/src/PdfEditorApp/Assets/Fonts/Caveat.ttf b/src/PdfEditorApp/Assets/Fonts/Caveat.ttf deleted file mode 100644 index f84acf2ce2d1b3329b194749530dbaec047e6df6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 403648 zcmeFa2bf&NwJy4N=~rB~yAb5Xy#76nFGISt=W!uQ6t z`yPDw!&jY){_tir+q}>ID|c7-qdkaH*W!EozPlg3PD$}yP#@o^u;1?cu0DLt#N{OV zj>mW&ShxQ{2Y+|rvJ*%QPDgXMtvhh_y0zMAC*%6dQC|n;&@|EE$)(%u=AZC465=hC z(C>Gg@R59fY3=jlYiDnHUU^2`i?15$$}4a?B607Q=Wvg?wX?t4U3q4>-1|}fQ7l=a zSZsUJnM&$E{4VfaVZUN$;TPiT`3|^bPW_$jN>=C*aSU>!J zCg$eIe*=p~>%K$xV63PA6MWRqKBJeu3EZNI{|K*-kI*D#F3lImV4hy4)qFjz7Hest zh|xl&1Lfbx80Ap&v(qe~t#foWY)<^FW8=G0)p$PMa`KPhgJbVSWxl z|CWI6yMTsAgKh`0cW5Q*?uPc}puG#x&PgcyIqF@?eY6Am{XF`(E$%Z1_gRMDm*GA; z;y&l&KFe|K4!F-U+{cgm+=cth!F>+J_0w>l!*HM7aG!-d4O*iv?(<#T=Z9$LJGjqN zsP`!DQ^0**!F}@VcFgC$2|h$~CD^TWI9o}pw!)mz&!^G~whMlH6z}r0#0*;dZ(@(( z`tw;+?P@jwD1ojkY5Kp!dHC%q(EA@izoZr4fLX(3`H|n)cSq{gHlS=7Jy!e42-vu8At>yYoYx9Ll~Z@@fsf$sNXtlx}pd*!=hp1v8oenWXD%6f*e8_#0?kED`^ zBWMjDYe+TSjBq(%O^Xi1Cz!PWX>F8~k)D?ay|jL%>gq z!5b^U50d|;Kn9OK7I@D z-$TESuJ?sZ+;b7Tgm%S!j>fnS$9u{fixX&ES_o2AY zLAcNUxKAASS%v$o#C_JG{ljpdWAOfM+~-2vXAtFwdH4A%tpeRv@yon*GLJn5dTs;$ z-j!})X}ZhPdtcEJkOK>`juuI99s226Ds8Qii=4YVge402)w*VB$z{|hBxU36jH z7o{G8d^nKrjJ6;nAQKLhav1H`aXRh=`3c+v8F+$drh~*>TwkG6*gdotABXY_Xpz{7 z#`8Z8%S6a0_Bt&c)n(98{3d#cKSA4}kGorthJzQfJ*IWjgxu0{e>k_?75$FWtmG1vY{vW#C7c z%L`B+y49mekk&zVc6mDZ0JLY(&Cp>*eiX`i0F zUm{=Em)<+Z3HpCcFVM-G6VQacOU>*98sIVLpAW(BpgG2P0O)=?dlozgy~%g3JuCZz z@=4qe{`dp!#0|QWKS$l39{Gs26JsEo|Ah6liuRE@g!fPn+F0W07U&SZBOT%C5$GSO zKX?c5x4Q1&5zNn7bh0SZUg8|+)!V^WQqRbF9@b0zI`HyW;BTp4g0LYz!MuD7o%cSK zJstBV^xjV~FKMiwCFmpc%P{{;^Yjk%3*QavuFgNpq;BD@^r%qjYN=On-4)=S6Tv$N zie8NUHS|O3Alctxoy8x8?u>wEq~7U6UpgR568PK&jHL|L(Z0iS-_sX7L1h-Ko#V-r zEAZRVShv^U{Q$`M^}rsK!rV?`m!d5xQ@?|EDIcY7`bx?_$e6XYCozYMy>&htviXOg z={)GuEokc~tlMocrpXvv05alB%;mE*%afb)aZMk!kLU-f3)oHI4?pg)H%&u3>oE6g z*x8UB^4_b_FTxzpL%;rren)D5W@qB_@u!Dpw&*mCBQmdi+PbWp|6Ou^U$yT zXa;B{^+pPEZjF@bY+LkI()+~Pi=aaaSjAlQsen08fPO>ho0Qcx)akFi!S2Rbr7mru z2FSaysJ|CzcQ9zVH`*DH^4*i&OUXq0hkA3iALi*;^d(9A@P(ka1Gy~aIOcd%?tcmz z4M0yy`CWpn?grm$XmcjYr3`-n<4@wgD=}^4CH`Cz!0z-@FegCAlrHl_yl+ycmVhm*u*9?h3>1}BMS7ZVVp7ie&bf}SK;%M zSPOT9UvB^{&IHaS_(VVhUqo~08JYqx-bpi2HisQbX8{p_za@{dAo7{XO_EU(z-BTwwRt zKEnHQ_`WN=zRCXG1An0Yz8del0H*`8Z{vXJfUMKQp2k|g2RsE{k=KiLv_jHa(vP1A z+1m&Hy%u)+3FyaP@DA|v=w{djPl6t6fmLYZTwq5r7V~-!9Z&nxkC~t!^YiHvjPeus z(o+Eqn1}E0<9!m|Uj{w}KE!v#B%~isZvwXhe+K%2R-gm84Rx*qHUf_UPXgxyKL#!X zt^ghe4h9YbmI5bYExpNhXY=s>A@C{C3cL(_g7T?=hR^Q}*A_Vjpg(WbjvaepC2=4-j;4d!4yJAeh`)@%Njkduj zhdOBxb9^j2lbypJW6!ZS*qiKK_5u4FPxCw<;5+hj_}%;={yYAPP=q0T!Y_iNB$`FP zxLZjnC1sp4P1#LZsqC#BqFkla)UcXWThz{+lWWS&$nBI{ncFvaa_-#RFLJ-iJ)V0b z_i^s?LZA>Sqzbu0u~05_6?zNf3eyXV3hN3-6izK%QMj^jb>X_gjfI;Fw-xRx{Hh_= zP-rMNENR%a7%E1K$>O%f6~)z+w?BE{OQlxBDC9T_)J5aya&H_D4v*t)jN?Q0#a83^ zEynSJAfX9scpPPK9HgX`MrFJ*UD-p~OF2+kuUxAJ)Rfw&cI14y#@zJW^4uP|eR9X= z&dJ@GyF2$t?)BV9xz8|;a3N916bjxrdJ2QX<2bl*JjU_kt;TWZ=r|TP?6lQ5R#o1@ zIH*=rRIwg0BX2xg-rzP-ZGEk|R>XT$4spweTi)Gr-IfC|$HbasiTCd@dXzTP&*_HR zfka>Z9QEdp{Pf>_-*hO^ro(0JO>;JVZ__247H!II+F|3H`0w$JpQDs*tZjU6<7XS+ zCEEDL#@jaDyzxgH0~>uCF4=I+hATJhw*f({mu_%opaIEcME3))vNiIf$jQHW$C?tY zqNo1NE7=Prdx?X^(c<{8OHqcNi0gsp6ie|bt`bpZE1xM_R7G_$Cm}VW#?%DnCZm?s zX0=sqS9{bxwMtZnI&SOMMn0=@?GFD_LDO&grv_xH>f+w#ivz{s=-Z{@F7az|gg8Nb zTkI`v5bMOr;t+9^*k2qeekN`aKNW|Hdobz%1u0G$NQgG-#`>E^Ga%LH(RQ?yR@0ue zmiC9dJ%YYVr_kwi2AwC46Z?qc#iJPgC-g^pi{7RW=&wwL3~*VPHLymk{tnj32G~qC zi_K;W*)p~hJCGg34rfQOR}7EA|y1i5=Ll#d@(?>><{O!w@UwkRuM{flV$XL=$DPmWnh4 ztuRRADFN?&XWE{2pp~>-+(f%Wb{t7Z)3MNKYuNVmCwdXG^9_2HHh~Y{gGKZ=NTn}W znnhV0cEw*yx*n^pvAsVm$Gls59l(s7yS^@Yj3RV70^#tz((2!cBf80 zdY$~xM0>F5h$+892E9fN^f{Gj3v_1!c5MbW(RkQ)li?d}NBgk_@T*tAzh4c#w=Z4E z_7fkA55-@^-^3T^^osdw~6xJ;WYik3w5K&Yof~vsc)k*sJU{wt>A4?Xiiy z1F8ELemFmZAIXp6$MWO&xA}?uBz`hKg`daI=NIw|_(l9;ekuO}|33c_zlLASkLM@w z>-f?93Vu2NF~5>u#V_MOBg&wczs?(pAmm;0gn0{mefgysnGM|hY&$|L+S9_5eo z-|`rLg2(xjJi(vhN&YlX@n@hnpXC|;9MAISd5-@c+UF0vz+d1E{ExiIU*skJ5^v-$ z^CtcZFY{MM&8CZ@pk??AH(0^9egwIwP|=ElXiREr+#u7@Z3H<9o0uFJdQBBmJFP7^8_S1+Qcx zthPPq9Ci#WrDMfO;zV(VI8&T19u~h7`-#iM<>D&wV{wJJP29@vWWQv0vtO{g?qs!- zf1;c|A~@w<((#^MLh#fG79YX;C3wcf6(9w40owwwMfj1xS=c$j{*;3K6>T=QX<&cp zD}f_`Gl8psUlN(Ci0oy+zEJEd0O%(d_LTc7@K++g1rz|teE(cv4**)je+F*q{ zu^KoEI2*WzDES}&`!S6^q|t{AzGq$pU{Plc0DaAYMui=S8cqQ&17JfoJO*qeDjf}+ zgMBQFv+*?GN5GxH6Ts`h7er0aO-*HB0dyQn(Y6@>Y>ash_-QWgyPcnCeiOonL83(m5iJIdm$ngYe;d&bI}z=8718qd ziFQVRcDb5pw=B^LjB$_YL@Q4xT2&)j^GBjRHxYen713U}*WS3-zUcFQPZOOmq%cJj|5*GeFV|5>xhm6pB;}m`}R1Z6BVM9@crb^iM|6mo-&c> zRE+V|4gmK(bvb}*PW=vmIXx9)I`v`THQ*DX^%0^6bX}jPGpp=N!=M9MJ2W@xVd=Yv~-U zrE|b5=dJ+IuXE9_^FAOt|4X6^K-UW@0LE~^Vr*dE3_J*+KNq3Bi_zZ2XzyaQcQM+# z7=672^LNR5;Bw#&;4xq$@EOtfU7!(|04xI50_gjtI}rWA2Na1e!@VxUy)OF}(GPz} zbUFHU`QgABz?A^z?}{ggeykEyA`l100N{%&cLeq)y6P<8YND&r?$!GNCjplLKLLIV zp#N8cp4Wh$*MOeafS%WYp4aXIfRC;Pe_!`^q8nO>Zp2*QG@s~Z%>T^^paYl=U>14*ZUNui@>2k7wXx~E6>5@z}ouL5~9~YvkmyZ@hSK&=*R0A z`y05==0$Mnk05%hO7u4H4(8z9Ft8b6fNr??8KMtL!0!+S!1aGU2qA%WM4#`DJ$Vr1 ztKY)A`WgH&$bi}ph`|zMY-dDpE(Lx@OmT^+_X1A=n}NR*GnNuFKO$x~0^@)Mz<$87 zzpCcAP{lFSxp-I4eV&UzHMbK{SJz|N!5KF=PNWViY zi#Bq269|JOfffK`UWW2zDBocd@FlV3=-cucz)k?@upI3yzYw?v zK!2A%3%pHi=OchKfvbRD65HitV!N6^9_R<=0O;?ohXJPpKPI-~Mq+#HN^I4(#8!iL zd%g*LN^C9Y@~xAI?cGLfpND`y0Ur?CZ#J-;*#6fMI{@Ve`~i5M*g?40AsF{zX#m$8 zjy@cIJMbIed16Nn0<(Y}fo~Bz>JDN@m^a8?cJA>2=zZ?x z#Llk(1HepR8Nx;n5W8p>U|(VvKThoXpv@2P`wx#Hb~&!O9M@caC-5-v0pwHJLT6vwsM&L7I*MmoI0N>mQ9=H*Gyz#HZZnA)8VmE_#Ztfv= z%T!`NxsupVe+&Gc*w5|*o(47m9}KECE)*WWR&B`ZjUx1>*Xf z#LX$htq+LXe<$wq5qDBRD=-e24J;?_-U~cM+_fcuCE{)816Kj}0Z#)Ph>t=4JKBkNcEc^%n|Sv`;ys5E z?>&}y-*<`kpH94r-JG$Dh!4I+eB5T@6Jo?CV$4HF6Q8u6_~eI)PkEB~w3CTXNB_4u zi}+03XWQQspY<;BIcRh4T;lUiBfj0a#23sWzVIUAi$UWhdl6rXv2K40@f{fP9sR_Y z&m+DQe%r-@iv)VE!2Nc|{r1?I_)6S!74EhAPsI1k6JOg*{9CUP-y8jhjNF;%77vKT`wn+nE^anP}&%*#O3K_D#gk zIgj{xFB3l>bibfL{6fsng&5C8+X1-$#di_E1bzGdSmKwiBmM(i^TTPxFV7LbLI5j) zUladP5Wu~DbP#~K`tirauZjSue>Lh~V*}{VwU-gU&IAqyUL}45`hLR|{}DHV9yeng zKfRLpt=~h+BWQXD=I73fiT@JU-i>*^=cmN)1)cBD5P#ql;tyi(e~WuPd=K$Q2Z=xS zBJn5C$0vSA{K+N&zdv;?@uz1Hf9B`JpIr#NL;Shth(C{Oevh(0px-Y{0dVafLF1Rv z_N(B9KRrbJHO$k7EyOpSO#F=s@y%<9zXh7Ua~$#a@!R`n6aO=4@d2*+%Ov6-qP>sb zBL3Ii0bKuA(DGBv)u%P$pZS42&A>$vX!`+=kkHovn@AW7fPIGXI`Toc z2k@JDJ*l<(w!Dhi!o9eghFG5uu`FT@tf48)SlHx(H3)VJ*S8FQ^*Ou4-Eu#h>TbD? zKfUD+mo3=xlq>H2GB?B?-_pwm+4FzjPTaDkxTRHbxAY-u*@e7;G{1&sAi_%Va=AJ% z#QX8LDnH1-)oQ#a7K_I;O?L&}qFT9Jk@W`jqRaK7rfVqEx+AEdhr6oP-fFcc9*cDk zDY&+~h+<7Exnf30RxQnH zbb~CA@*91#TU*v0c|fZfP&MW=h22>Bk!(XG!fswwU9EF4T438Ls-+8+^VXqhgZ^;7 zecP6Bj^`_R?2bq(trENPGQq1LO}wsQufZ!_FXoSyzNL9c zt^M|B%eRVO4VRV$O63@r?lyeI6=K%t74IknuBq0Z66^U%h`hpUQHynk0JD^|as|^} zf0bmpWT5ULF;K-v$r}Cgv&UW|f59tp?{g0rEuQ0&lS*Kl5||1c7LCZ};zPW*8beiZ zp;9U1FV{7E_gd#D}9F%-!gb;-Z|_0Q#UsVuLPm3XCjQYsQseZo|H z;W<4)k+Q99AR19k#|WEA&18{uLXC!W#cx_B3ni0=-_^8)9mrT(+=<1*c2_3U5z|_# z@mR`HRi0{zCAu4RH_D^QaKN@SGcYjV55`oV#dNJ}@{|rmQzLfJ#zHAXrnQA~x*Am! zQ|Eq{wf7|RnJw>iXTo`ltJouCTrqU+D5*x>$pv|`A)_kUV6I?xnUO&2scYBAt8*mlZ|+NNq~x{u*EpQgID5KPk) zo^L4$D-m#_iqKS56Wq3h76>>7bF=NqG2QuegJ0pc?I`%w9}-q1V*6CquVSH^J_YuO z-*Wwm5^y?a#5fnRV!=>b6P0QX9OUtew{~2t9bLTcxy76o)^6t$`DL^l9q&n=0dIcg zoK>q}oH7Ojv4Po=Uu3Z-P%3@pfj%jds{K76dh6l+vnQm6MUgkpWhsxmOQk47 zGa8z!GZeTCpC50_rM0vf8Q;`8DH9C{E4kwYJriTPVaH;aMb}U)6(q?vx3{>i2Jw+@ zFjZF+!qa9m*3cPqveAIqF~L@JpROB$m}R9K!kH=K@=fiQ8n)cFRy(dZW?NU#acz|u z88;Le%(MiRs2MUXr?Z%zRJBX#0D}xvlanS+>{Y{VI%N98{yD4nS<#TsFx6BP*T?0Y zX;a1q$Bm2Fala;leI5SxHoxxY>4MLQMRcF3v(t1_5tik255yWvjtz09*tQu|bz2!% zZi9D32i6`yEc`m`s8PIwOUm|*NP2H&f{0R**NN_F0J+*^iF|cq{b}C1^T;Y!bgWKK zOv3N|`Lt!}%pc&kUojfO*>bV180+t_?NA}=L|v09S|p+vnyL7M@!9$2s>@AgsJ7zw zJ7dP>63v#8G+ia1Fu`GA``XoS??^ zV#U{5G8JxGGg|u>wJ9+rZ+EPm>o>KSVKe9NvbN;Ue)$)_cL-=&&=Xn}#IAH{dc>2k19F0fwemm(Go*Qq zLAuK3avU$z$4%s#C~ENtzTs8sDn`9^gyIe1LO$U5ZBw&^qq)ruZgbi0pUiCodRIW= zq%)f9wiWD3YhEbHVkM}#mhBj(p)e7MLO~mbuo#=T>t3DV*1Q@VJEd4+OlYQNN3!98@jXtkGu79kIYZ?J z2u{YWfTlQ_Z3xaomT&xmc3*porr2Cm+|=0apkP?QaRn>I*HFqCx~VEMPBc7G_aSe{ zn<#H_{5R$adIxf+B6U^~)E=I+t*5MSKx)DfWjIjn`=&YM|6&g141U8TT0Wl@Py+w; zB#L-LV=xpC*^VC5OChca-KkHgvekSt=GTHI=D-XT-K3APZ*{Tl3@F%gk$YPDdv#e}2$xL9-=vBIf*m8R7p(M#xGbJ;DfzdF-uVgax&?_%Zx!I>56}DpJ}G%j$AB zw5GHuJo6$RsaqK_n7Y!4@dR+)(1bkh@=Q@F+wqfEI#8CL6u!mK2420I6zjv*%bWSm zR4}3`M#%6rHQ73g8h%CPp~iS(j1tfL)TX494C-M+kGJI7yGqGI!mr2dObhg$l{JTE zHd$`kP|cPFQwFxHf za2T&85WvkNDJLvo9qL@uvF)S{Z~{r0_t~roZ((DyUb>Sv*Ta2K%tJpM z?eD75b~lZ-dy<$pTKfKIA8tTi`p78W9j?2}R_#hp%*4J&eat@>vqo#bgDoBgoA_^B~c!Bb6_3An1GQiIZX0byc!#j z?51^>Ws$TC>P8*hENN=Qdc0aW&T68$-RT|QWtw_434={hS;FuMUHHRM%hq7;>#857 zgU>>uhoUM*!e=X1fQS8h5LGnQFnx~TZc{Nd5D2E#Xc&&YVsYuNhZ@@!4@B}@iI_?x z9^~$%c?Exisv3e#0AGR0pt=oT&x8r>MxrR-7@7W<(>pXi9L_toVJOj%Nt?{M@*5TRe# zeNXTi{071{Bf=k&vYs&}$>uH5C?X%;(l2|<+M5-)o-tW%i0ftiD5*C>SZRA{+70O( zWAU()FZl8^g6@o_)EM1xm=iXgOu#NT`>jI3O1JqH#|Mgb^vC;qL%}qUG=(q`u^QK37r&&h8)M4!heMa1}B7Q?>md`A;Mml#J>sG75 z?%A1;DE4LxL(L5KmL0PdMYoN7b2K)w80~4+LpIn?j(UZ+5V5T&7b2HTDNDcOEyQ~1 zTS$?um(K8(QN48Y-SyI#N4GN7OJ7;?_-I{e1J_G8VkcB;)SHm>^DCroQ@l%h;nJUz z+zOYjtFM35M<3$deSOj%mcN4fagZ|FW<4T>U+W&fbV0z!5ovuz zrQuwbOGUOX2GC%+jEcn~476@nLB(&wtO&RY{&5AI9r6odD4OEeHCPwfI$b<>#!@){iBF1ru_);yOGPP?UUA zR;URW8>-&i8xIyOGiVx>*w~7$V(vRrGhu!x@FbK#(1nm^ZZzl``BZ0%DnO`H=}Cz^xn>lfcDVMbOaSN-2mx2YSYBQ{1!;Jen~o-#_sf#xkoxL#3joiO@A&4 zT`!g4;d<#?cYIwc!^8E`&0E!#;o*Aed*4`h!|h+UFn6@>#@p(pv*h%RlqzQVPosU1 zq2zkIo3?6KhLY>0?{C!y8A`5~zB^pEZ|io&=fyvawkyNJ^}6re4pCBjp*D@(4f?DE z3xR(;A>51208bEm%rL54@j*s5G{m3!x=|PQiWJyV>LbYOagwJ=rGS_9TF(PUy5$Se(QAB)IEfNdXY94XE@M8VbB=d;P zHDm!{M`vN}A>{5}h-~*&bjGL=g7~IKk>S6d+5^pcp)S4hZb?qLv=9%E>JiWi;nHGR z)jDKQPre2~$oi`nu^~kDKtV6|?$Nm#2dU*^1!e2>Eqb9Q7&}(n?WknG8%!xi&}Q5h4`)SFwt3J%kO(TxvGm4DhBX=fs1w7%1*05^lu*_1 zWeq162u>-6TXQh=vH^eEr#wLrpYtYurxO<#y9PSmhmj7-Z$QXM{xS*nWCWG=zM<_l}Hytyf3 ze@rgySC&h2W_9g(c0a$Fkii8>30h++ygjqNiky{lw`UP{_d#g(Rj=EU#XmMrG7NBm4_>gkVW+aOW%y&2tQFnxkXsJGJz zrlrRqC9M>la1a%2ID|u*X@QoY8lUJ1$(eN_`6ns1Wa+m2W(X2ls*C4nJn)(D%l(BUA}4M|1TzMe86n5dZtVr zaAE#O6ztEqO56CMZc7dL9Ot6{>8X6#NH}&bpG)Y7r)p_KkNASAObjtqrt>ZT^Ye_= zQLH^8^85$V*jF{I4lmp(EqfUY@#M`2`-8u|ZDY^Ds;`nV${^8nFIwuYoe{}bms${h za+lEC>XV{R>K4?1g(B-ofrrLD#eq0Dyn#xYpN|NN!L(>L=<^%4#a!FU1Ott(8Gp%r*tb_C#?^tffEiYTOK4g88tb;My`ZY8%On-7z_!+CkF_n1)Y> zPwd3t7YN<*=}Dha?4Q#WZ*kmQoG~dbod7~6+|;0~oGwlEg$sq!0jJMvp4KXCoXQGX z6H>Vuai^%-dA}KUM6S_kauR`-i5;bxliFe4yZXR_&bcecWh`v6>25lcswhUl)|z5Y zYj1r1zJ4{NM@w9>eThc5lr<{5uUtByKwA4ses}B+$1N#MvmB>6=MK$p4fa+O4U_G_ zghHi&^S3hIa1(!x{~l+nM)v-pW4b-h76kP+6(B3((kbvPK>Ugss0=G7kK9nua#Abx zzn=D~4wTEoq7J{{wYvp1XoSOhAnCF|(hf#JvO-om{Xr+&zoZRjE$tmumgVB zGZ1e{_0H&RS+ZkSSE1A&uJ%_{UnREdx>zO*`Qy>cbDNRLD-FH(r3|Z=%B`b%>6`D> zOJ{kst(WTJ6*}277VEX8i(Ie0@g1pCR@4^qTlo<<4~A7EmyHx(U~CRrRy?X!AW0-S zJ?jXCo>e}wvn@B`FiqG3ifXZFEY|B;TXH77)gh~SO38EXV!AZW(N?!ykFrf~#duyc zXRG~fEq+ypU)tfAVE14HbhC<}J3=_ATqdf-5}fI_25w~{*)%2|ZHQnCPt{PWIRWgK zVpkbk*kF1l{JLeSp@=G6g}Ff=h6V+Ty$ChnVCsu{DjioNaH?f=hQk-|!4wY#)l}wE z2OG_92%#qtwz|i~-GNH1V_M(P5~X$8{JG+@5pgoORCt5#>NF# zP3{kvp~`mCJGUPcB9Cp>plv3V#%4Q^uz0b(NmUb;+2C(0xjx5q_ejm!cED(M;(pV# zG)L15Swu{P7?bstWbQ|OzGS4XK40&=D>cr6$OxH-oaGYD9kv3b0P<9So#>wWiF>xJ z>-kUKe3kn#b8>H6fidejN)gDc*ey*F&JhVy84KuG6wX{y?$~Bid8iP%yZCYxnqpJyv!rgYK9UIaS+iyvYEyuW< zr?HpTxqUbs^ejKw%X+DozU6VXtXt1ysh4gZtvk=lda0MbH(K{-&l0YeZm7xia$s$? zq$o7LSE`ufUmNbjJTDifUU$=I3zv$8BXz|aqov>SGGyv?-yiM6Szd-ry%f`jcK4~Z zZhbfL`OxFA#rLTF0w?T#jyYY2yso-TlnY25h+%d|UNR9OjwC0UbTG1ZOk0+z zP`V4zrpcx2?GXIGWs8#{t`jyKt`s_Y#~^ZQae*CGa5-Xr%^mGot_G04qG%eHn=hO5 zr#KW+A`ya5BGjO3SGs%Jvsme+|3&OIljZvw5aiOjrp=nt#$oswL58)Dn3L5xZfvva zhY&DrD`-2RTp^fL6vx(**(is|=C+ay2FA^rJH5+{Ioe4lI93F=tQ@MsNXY(vv@`#(!eQuIhLV*IPT zqyv)GvKfmzg|@V5LzAb|Rz9b>@mLah0UU0(4L?`ctoh@O4Ux94o^;om<=KFO?8S7^)hre6i%hVAu8FH0IYs|ECrLzG%2PVO zF(rwgtF`z0)7ePpie-&m6(iq-C=YhEe8R^ACEb?~#9}<33~6eRr;{LzVrflQ#7+$~ zgEbb`p5k-hi7%#uvG$8#47uWA@F3MlevpztDpV|L{6$=&2cC5l0^AEn$FSn@ib`Kx z@)MU_CA~Z8eT27`A6_a_rCgNN>aUo#pU==l0PdFx-wXQI_8E~VvMUgH3fX~VBGjUq zsi>*yiIfi8i0O)Exv`YbK}2oRU^p98q}~f6kmfr`spcasVXHYJ{F)h3)z)k*8w~h; zddduy5Gd(#wCKQKxrErX9t#Jficw7DrVIx1NkvWg9UE~>?3p0hBbpBea~XdQ(nVF` zxg2ueOkW}ZH`8^}s?t*J3%V++!d--)p*JSgtm6)ZQezCnMM7D3FgbN8(vLvdxwX4- z688~AI1uxw=N*BTO1w@{ILgvq@l2LVc>oc`x}7Pr`r^pLk`^YmRz17l+d{3Ppzcb* zsqieAQbkhIMJlK_M+h#J%Tfv-f^;gmQKT^^6ml4|6=pi1oDXp!1pT>!Oh3pbC*k*F zmq-a<*oZHN-7!vM8BxL@C>}~p)Zorw-vMf(BKLf5eZhmJs|N zkQOzZQMr6|ttc7H^JhVha-|+!lf(jRc^4uvQT`%#q$DGrrbL5?f(4a`sw5k7dayCC zu%N~5zRs2HUCjt&j~PEHovda9?RL=WX8Rh^c>4|m(QLp?HwJoP#ch*;+}!d-d?=rt zGPcAc8K=1~qXy!3HfKz*xZ`v3l|;AYPFXNB)V#wqD`v;xpqlZ_;J8e*r>DjCgTfJfPDaO9T{RM92l24uR=WC9P6nw1niCPlp3L}(30OxSg*-oJ zZC#;y9!$-}$?(4d8KfPY} zeVB=iPOLqS=NsJN$>MUk8*JEtRgGzq>?vn!*e#N!D2910(=U4J+lRf~-Sx@QWrW$Q zUB<>>R|H-ZCKPjt7uu2h?xoFDyjj~4igDfcCz0XCY}+=RN%I?~}PHWuN1FjXx^rY%V)ThiD=Z%byv%uW{Eh?Z|c)GXK9nq|-q4UwR$t9_MXwWRrM zh|ZGFwsn0>wMW(Ae_~78^y7mTj3-3E-;gq}&4^@DBVP{q`zIvamewMyEI3f%LXJg? ziNvG9^fSE`r?;K&E z9IUDmmg?{_Etj-%w5uqCMbg%au|X|UD*CKcOw|J>hyqU%{BIa)M?O2zac5-b*nXdZ zO#(F=kI$Kx4r8%kha5Jwttm*7PUsod(B7;^+lnx!QkK*YNH}Y3k0v_Hj-vEukb2tM z)&L{NHSOlq^u=vKq!=b**a61ggKKKZyrUQM2n1!*aOY%(0umDtWXiS#ooHWECMt>Dac%)FHBt{2C#&VrQahznQU;%wa$}Y;{~T(iB(N446??WlRN~k!@+FX$PHn zZ_p8-{IzhoPR1i4slD@PS9lAXbG}qkaukt0bZH zW+3RWpfo5skoylt1P*BgHW?ER;=$pti=aQ#kk5gxkLQM8br^SoL5CZWh!NM3Sei*I zA`-Ssfrhq@Qnp1jwpwwSS8hOat4_Wl(>lJ}YAm*=e1Qo=p#Xe@V!#+PVO+cJL&gxo zK*$(z)FAVfvXO$y8~geyYG9~8FgaDp3%-;Y0U!47G`Y`>&=LNsA;cA6F(J7L(QdfV z0*|Jm^~1!8!)rerF<}H0@$#hn=mxh;fBByv+bdek=a(9hlP7OJB_+q1wV9G9AtSs}#q7orPdc*pJEYfL zOM7^>NnKQf-@abg5rnMbG0C#s`0Gh?@UCReVOI8-)2rVViF)sdUU_T{HidY2xuaXe z^i-)5jwh`!>=U~bisT{&Y%#+!f^AVXz!6*lb@B~yY-r`1{IIq|euPc1oc-{iZ7Vvy z=+hyT;l|)_1WqxG9iI-x`+~DhURzqe+m6MSC|A>Y+nG@qx8rtgt<_S>bs|^~J_`-P zW>-Y1y%BqonmRB$Z+B0g((7}ANZL1qk?8JNw0<5e7uR%z>8h~md`iRQPD_`&OdfeW z(TsET(tZ6%lCoYZw~y7K)0FMS7_JB;o@V*Uki*ms3`fpUT3fPjLwFIS~1fROVRHQ1>h8I{Ztk01g% zDh=y`PU;x&*hs*}Qz@Qlhn-4f7I0rso|%C}!ATwyc{wt5%DCENfr+V9S94b*7nU7wZptl~ z8MG6YHMP*%i70HaNwb3*$a6ZjTlRte{kGJ;kZ|&a6;_hD8ub@+Cc+wZT?~5RCFxKn zKz-54Qjp7AWU}1T5p}idtwHGr40xyd>gF(fTzNo&eS{N33LF85++ffWN+1%^-KMf@ zCNln5n;%rfPllc7K-bZ?M9mXFz5w0GIqFqytu0P|#^i+6 z)QpZfa7TRZ_?c5 z-aX_ZtCz}US})!Fjinn_d|g*Ay?WhE2x4*S$3ulLM)L8tgok`EPgqLgd(y5xcb@5^ zRWRvYWvSUl86Jy6PH25ktSUT~@E8O3alJC?*YoV8cOBPYYDr^Q&bViGN&bMHjg15d z#v>xWKq4;mY(r9UOKF^R!buL!W9cZfJI40GcMXD8cn}y)lId;{iXTyVU2kZvI9kwR z$ztAUp5j=>$>DOmX{@c{C=;?YIoJgVh1s^s zkr#O)%U6qW?5s9rgs+gsDFEzusVtI=aI1R)HvggeVQpEqg>w#}d_y2B6xUMom9ozW z`gpR`V0JFdMEzf_5h(Bc?kjHYxqrshumRS>Z`3PsSRo&oQLJ)5gwap@{2r>D4jt$UwGAL z!mEz#+(|q>vP9YJQY4|uBw2>FfxHNjjQPS%P3ghj7Gyaf;ICtR2>Un#<09=d43<*& zK#q$JvBZKt%ddr+Gl&NvnI)k4d`QV|&-IlPtphFPqTvg*W%oYT6=tP5J9R=E`T?&5 z2R&3_nyNi8DcL()=LuuWJu;f>Vn1eT%r3Y1`-*ujP;O2SRfA)?{NQMBgYLHOBqpCx#lQcA2(g`vzx~$L`pk8Jn@3mUt?c?%NqTotCL;re10Z zII~)tc4$O$o13*l?PKTl7RQtmjngBMAoPcAAn2`H8X`x?f`+dk^iV9`n2XJtU+P;} zPV}Z62V0qNRWt-jY@8s3iGo}kX%lz^@WcuZj!B!~bxEvxsXVY!FMV^<*QGKctX{ft zL%npCB;iP@V(uvu!cMG3w{qfi@e!R}dj#c^P`;JnCO(SFQXG)M|J_G={PKWIh0fzs z@ve(Ed6O4n$M52=INUb;J3DUp_YZl_`+YSM=GJ%#b6$1_66UTSE^o&3_-@8^UOCRP z-{X}pME#GjA6?&TLxLTi%`C^Vu+}UN`nsGo@Y!Cu?B8vp_t(+C#*uRI#nXikPJ;od+bT^}+st<hbF#L*-NQF3dX}xr1DPx6qV0j=`?T4Q3!)DQl#9%LB z=No&kkXEWP5T4WLh$zz4{AM7CW6D+pPjN+}R74F$aZ(tklpQZ*43Efi<4C-*!tqEv zCIy{Trx1|Hx7yg5X=qo#nbJFj5Ra=$%x#LyM@%GQ+Bma0WV#JzdiZFulg~T<{jT=UmF6N5NDe(lY%PUg$dMAhFtRTpVH_o@FmYNN^PA8r^5lRTPP&aPcv=8F-j?Q|+g!=Ofi>&^RF)bm z`j8!NnXWI4Ku+JR3rh=T#WF1DFSo|SJuMKx*l)mbR77u$?jEBY7&C9ch91?&&c;TE zszfwqI4Yh#5VCALYU2?OIE5ZaC!PK&`Q>YRVs<#EThLnA?sG6rh5>siWT&S#xhZBw zIV8>e#^j{In3@_Wl?GFB+t5V-(LjZ#8&WK1B?>GFHKO;Cj=9Z&WkQ(Vsk zgDH9F;V6jLC7}CG(rAP^JuF|P#o!52yvJY?)Z^^(&@c8j5fJu5HTWyJemH3jHNDDG z(MiJ_R^jx(*oj?8!VRjKN^1y#^n&5WqFzQ!RCg@o+9II?8DcoUZbESff-xJZFs@p( z{e5F&9lb`7N3_DYwwADsV_V1mDm5}5Y-=8S(&W(K)JbuFV?zQt11bwfOhi-Q ze&P6YGy@ynQV@wxV%JAAQss_zWT5F<|MdLi^~d+&N!z++6f#H;4XODILNrJf4dQ_+ zbad@y1SY>v+sN1!VkvMfWB^NY;IJ7rFi@!{srE>f;xVI_R~eI=zAo%-Z>I-rI1=pw zS^8y^tL%jtWTm=6F0f6jzII{6V3bqxTxLb}}abKz$vh!IDn>^VJ zmLis~2!;LFSYzQ_!Jk{StYUS#shQbAUosf%XmSg#6&D7Sj)B8iZp0Cq>(fJxskRsn z@A%s)MtJhfaXzOl5Nx-z*i?3-^5_G10$@X&Iq~P+Xlp#$*O5cWS%#YmW8xE#^W2ha zm^IY0tT=I=1BaLwdlLD^rebDXo8fei?Sh8`Ryw2hBEJM;^5796iE%^t)%n8P(~>Rxi#959rW49{J>c40uYu%Gmy@Km*B> z*&d>xWFl&SYF3B}ZB>VtQH;SCq<;Q6Cw`>Hse7>4^`UP(8TL+f^%L zA5Ih}0m__cj)t9@J3UZxS&NHwnCJ*BJu>p-!!#I)c#2h%ynr8U1VF{~MVBslB zE@ovDFoP8EXLTSDO9c`cM@bvaovkLeEZn35^A$hC2}go1o*aO9ES|m~AB(}@8aE)M z=;+9Ah`{SZ&Ws*bMG&=NG$BU}33^E4R*?`9u$^p#caGVv3n|1&&NV-t*?}A{qkCe~ zN$WUNVA)w_)A6+@PU1RfF+z<^cT<7NVutL1<4S2hM}#*-Ml76?eVpT`80l`^cS%4 zDT5W>G~zD^?!BaCim8-m@jOq#WBOt9wNEeO*XlqOln3kArHH2eI)qd6p%Au$?CjK_ z)zpcD_XZA_F<;npal)+9>|%%BOg1~hhgi7L*%$BY4hE8urZHjcY*>90<0+hb&qw`z z{h{W?O?Ig*I&|E`rtPLj`)9}`C{4vtCLA$Cz#-xon(dfPZIQ0sal&i>C(Ke2rPQBm zzzH*KK;VQKNMhS#3$dY6thdz&`!Ve8Yggha(RblV-SWs6co;*FZ0w!*^3tU1U$;K- z1-bekPJ9iCk@H@1^pfwuz95pfdxB4#iqbAiZp7uvq=bmw_W+GpBe*z8vq!S0vDw2A|CyFOPiL zc3@VfQz?uI6>#DUG9Ns?HoG9(8DoejWfJMhIP!&O%;3lu4i$7y8S;*NHPw%Nf&7WM zF*)z=>nqD6Ur51_OpQ}t)ix_MFcyzlq^8<~NO(HWJDULwu6Z-^ACC8UAtO(y46~?| zC15>C`-->hM`l3A&5*VJ|Iqd(;MS#AUFY4y+4FezK6{^ep66tq{GL(=$^BG^EAn^!9=4?jL&3Jwio7w{6woLvx=V;uElqfucwCLi}I41yqku z86KYPNRQ9MpZWNVB!o#Jrk(SrEk1`%7t7C{-_-sV!HIYRN=kz7uyf@Y6^BR!mq5Td zm2+?;vQ**(nk?dyuj}Ff>q;}YlFgOuR3%IN1-?<40fiW|toaON0YEC)cQioAsc$sw zD2bfTpft!#r>Pl@hdh4i&FgXLnZuMKkyH9`rTDH*M%klKWm%G#v2YWxU8-4%QhcOE zaiA}ojjf#@XuoiVQc`fTgZj7)2aE5O(alHBT-&zBySw$RcYNNHZYbD&Qwv+r`S3=R z6^Ky992yShc{xm$VY2kEADND;WkRA6Id(c4+S6rUcb~bow-8wItI)NtBTMp?;uDB_ zIhPmTTuGvmfwFwk{;8a-iW+KtB=y?chUEW6eyVRp0abDJMZD@VWku;-?K7J8e5C z)4XM#4BNMdyL(OOG6GVM&9Zg>sk=K=nzAS<2BA4k_B#tJDiU`X&Tbd{l8)xa+d+L2 zhKbn;)*Ok6IccV+cWwZ(v8|nJhrWZMz(;j~)s+Etv-e<2y(k+Y1s8@b^B0b^MV7O83cieSD+i14vvCBl4I29>Xf~}=g zT{qdzgHgv$61N6(Rnqhg&@~Yddq5#bG7fD(52AyXp0vi->!UTO5M%S~bcBMt1W~kc zt!N}CK@L*Jb+@x(J8TB_?(K&lxAOETArm(Yz_0_Hu(#GzFuj02+Wp-cbx?BcUOO7o z<3d(lBkYC01u}bWY3<-1uuqMKYoU>XpYdzkJfDQpF=2D1vwtX;Gaj$UzQW zOMXY7Lnrc6qD7I$<*PciMOTH1tO6yeUn0}jXvlpP%s@%IRA+VND-o>n)H2-3OhNES{{%jU-PD0tC1azlF$UkrSh!? zCNCm!Af^%<>H0+&Mz{9kyRUw_yt7v`cV>-2Eu3xNzLnxiZgrNnTL1-%vQxU~<67(U zpDP~gB#W^(jia!g`K!5M#)Y{aGiHVsBDd|jY^%r&hD!q5xQOktuGO24*|4S2SIx&5mc2ziv>dNZKIeQ_pGAMoK3G*}FzPXwU)Z(!q~BX;Gv_iGfSrnR}r3OiwU5T}u6&laA)ckSAy zZ9##xx2T2Iq#K;wy%yy|N$p3acha7i{@&?2icfFu&_Ssp;!o;#^*=@Z;cKO(O5p`) z{g7>NM4F3^5V6vyYjwy~8;FD!1Se!(kh^qhUeKK&!b@xdzfhHRk@9*iE-yD?d2+fA zuY6y*s8I1AJlYC%&LK_5gQyjgX_qvrZnVaec>DT5G?vyJ3I~vnh-01*8yH$|dnd-s z*qz>!`Thbin@)>$64{gT!iE8$Bq!?t*nr_K>^5;HiB*Ix3LM6oGO=~ou zo7h<$?hhS&n1t5H-V2Wu3%5AiWYZb7={8L?dcqFVTZ0atgZ>BOS$i}Kecy1lPxgGB zR>g3+J)Me22V|3Dh;Y>{ieg2MeORV*t2SJYtWplmF9t|+8xS9S=_DZL$Cxl=RlR`W zRi;dxfO7@bQ@O_LI)yE)O_^5~N$rKxlcG|1Y}F-v4^dwle8HzHLsTl=|2B94<$#Ab z052XMPKoOxAG9Q=kZHB&i_i#Dr+u0QSzPO%Emv=xz$a%o!-?Ot^P|G8ht6ak9PA37 zGN9#*=!$?SBwt3G2(1J{>PG#~Y50D}_9yYEA3M%!M|i<@`^WpaNAIYwdm(A^BKP}a zvlaC3-W!dZgW8Govb*HlfK!Gv;A!Lgg@!GGN^ht-b%Un zw*JirvBZ)EHHLyBl(9>^|4ckpajmBoL zXU5~#Z?}6m4DMjJ)+&<0s6KkjTNm-b^>@~3b3c|Yw!=4FvpE4w+{nB)XoX$ZI~_(; z_~IzfLNaJ!2fJhzPNy&**4<9i@$BA`dK)E*Svs(>$Yui;5)Uj=yt5PTJw&WRP0xG# z^Sh5ti<2FH0QWIj^?w6F$aieKO~rt@5|ha5L~$pHa;tw-@>AcJN|mdu+J&=%EZ2D- zwxp9nqCQKl3QG!Z2eC^GqOKm#$62+yoZ4~@SIa)<7vx2^O)Obefm1TW6uF&>dNVaONu0xaqiV(1e5QrwZo|rL3aMz`z{f2cm)Gb@* zU_E&KL(vev(5M^K5{Mj0X|c?D9aro6yd3n4gE!4di1eouI^qaALGsgt?FBbiMTThs zw{Pq7O~+l$X|2L6W=BW4)upYr{>^UCD0Gf8_IW!U6y?P3?vZsPaE|+t4et>hQASjZoY4RrT+ji-UC-Km z%U%Wj1{rnXvhpY6hl_ThJN9Z$sE*?a#F)&{?qLz{t!Ia35KV@)GV&YUltY03xBYRN z)Qd*h>s#X_S-MtJ^X&d>=i#JHbOiQ?sIirA4X}lJK!JHu=Y48uTA1M@Ky`7BL^nI9Y8;jFNVjpBp_K) zt7V0~cl-99wVF{x75%RsT=`SBxK(UzehI0PgySyd z#HsLGzE^Q#B_ffwXqft{zQ5|;mJG(_>!Z{e;S0dEqUlp|POLdyHB|DfB$Mj5fIPTP z?NR;5sClSph{xej2MXbf7?Fkrwy3AIR%yEs$I{koM08`;eY;IK13-h}2|m#T-NFIj zUNF0m$GC;V7)!zl2()Ia-RDo7%#4qZ0uNlTIVl<$a0XyT6upwj+PZPG>EuP`_%p|D zY%cO~-DoesTXl37>ZTxxuirfjF_RXsq-Zb$XRBw88hNMKn?=zq2vX0s%uW%}mjPpF z0Tjy@VqT7cy&xPyP{Hc_Pv<{lEcI_vK_G@P6j*W_-NN)?_t2z zM&oalT;(N>xxV%r@QM?vbgv0^4Chv$Zy?fKXgCa)um$WNd0Ubp(mqLPIgpexaUhh= z&R`!xG6x8o8RYP-crnXbc3_frcpuNnZDenfdLmHtwHV)zsGF0EfP58?Y$wQI(SMQL zSK#OU+3+?_fKv>oBvZ}9{wCB1hEtP_Smd}RB}04;r{Q)s{iZ`U3?~$l=F-`{i!)y< z9lzbJTSnFn?fK5ctlONysnfFkI&Ot;%umjCoO}T8I&|B0XD|s*_fuf(zL^zL2lzSI zZN7?%7E_`Gy;*I6t3&ZfIfK|DanfZOcp*V{1WGO&M7ihHUXkyq)w7oCD)c;IpFCim zSgi%8q3n$Z4b+u2<04@k1KEC9*{xu!mO8g!@%!(Hg88cf+K|!)-gI!xKrYLnw}ACPHnp%bV+GS%H;9$Uk2s! zo{cZz?64|1SM~;hS9V4=fTH+Xuve7BF6u0=wKU%yko-pC;?7-EU?j@lzX~U%+F~8> zR@^BzioYRS@qPUy5fcvjU`VkgGo1BNv_7Mc>H5v_X1kf)4{DzO&!$-`@2P z>chUnLe-;i|JqR+4t4zM2^dVH==EX2iwBLzU%PpDM7$E;f75<`_bz^UTz3pG*{i*! zZwHq1&{6BgY0BP_!^y!hC*SI&32zJLiuEN+0RIDUZ{+E?5L4H)1l4z2xs&L<<>pX| zI?xT*k`$~RsfSvv=n&XEb^ZaK=dS=+5zH;M5fZOF_3cy!1LHQ>?zT5_teW%Hk0$C~MyUDXfe=g>mig)|#2iNkM7L zYK7Oz?j$p^XuRr?b@LLU7ics*vK=NlG`u*I$OD@LVJH6~FAjC<{A{FSV91hacJKon z<e1g~)b}no+2>m8~9MeJ7ACM2yu& z`dIBtS#!6-WmR6~Np(bA*a)gJ%D$lEqPP>(mlah-8>8SCSYwrcslM{3tKU;;6jLj% z-6m9U`m2MtJ(o0$f^;Z!C1H!k*l`VxsajnpX0|+^@}bitS;36lBy;MX%{dC9)+D;I zYJ;H_PyBY%ZE^#chB&dPgGEK@lru^$VQ9BXDKpshT9NoW4{4*_tsokfu(XruBjZb& zKU`9zi2_nwW_#4nj$DeA0Tm)c@9njw>w@S721;0I{94|xuY(0Fu9H@N_tCY+pn=+Q z<#i&pheWk-1q;Cf zsil==R{Ml+E*9G^iit8vN)c!u6LmNdFID;Y{F-LbBM--_6tJ{fzTMAm-+#DB)3~=6 zyD+cP<7B4fmOu-~W%1->=gC&t#$7e_j6LH8yIWG87=@jEa_qHk%czxM_trk0?6#EV zYLOW~_ebw;e&+KxK`ZFys8K&Ys>Ah3=B(xv!SYdCJKR3~;@c0uqZ6jVl-ecT@?gK{ zk`IW}e7n^Ewd|xNI{t?9e+XRjJ3%0kZzXSap}PVDQS(#q_IYk48Z`<9e?vX|<w+(r7#m9((uoc+jq48+-u7@vWzUrTNBWZ{_>35e>?%b+ilpgSk982>rRkfCh|8 z91{D%8`Ee|B+yOr(FlU0Sg*Hxft4aUzi@-T7i4*~cd{2cJ#XwSC;7c6Zji3w6orV6 zp(dii?J3l`uGvnT58dtUeDEEwOgI`=HYg? zE6loJJ}CW1wFNcjokyOThnXGOThGtNsN%Pt|63+&f8)kGQAOMlaR!BJPidpFzOUGj zOUbTJ(9SD47No?hq{!(>Wk7)3R1s&S=d6~fCqJs37FrIr`uJh!ih^>(Oh7r;X?YFu z{&uT9ymyq;^+r3>I?H0`*4C`iNnJl^SV!GqNd}|Q^7?Hv4vnL7GOIf-0g89)@g`N_ z(9hED+0m^|4Ll2M$Y8pR_@O6zxFzmvXVb4yS)Rkr?8MMWF`EXdSu*eir=u3NSL4+j zpgD09d8D={NIkmU{d!(J`q;6}(1@7y09DIotC-vCFc&!&l z9C}TUN)Tj5q&i3l)}Y=XN9Bak;Cg3EAWIgw4+;P{^Pn{747XZQNR&BTE&b(GY5=c4 z|CjnZ^*^T&$CjLHK)))Ls;C0lt-LUWya@J{jX)U>a5RuNZdWNUNgj!nRJ)t+)n$Ip zo$5T4E)dG{C^ssNvqmT?Zwu%_VY(cOg<|factFVJ5AU}kY28G)H7jXvk1X5yU-X7|ymJNuT#$Miv8BQXpK5CnW!2`s4+@lwB@5`7L$$|6z`p@V;w()iBa>S_Q zAr-%cr9wk--_Sl$z&SF$)M0fS>U((_iMSB2cn{*Q6(pC{t(9T82skS(mP{(;1hpIz zg8W>FBN{-I0FcGBcCMd9K^KxZ>e>n50mgICLkpNYw&KX4+Mb5aXg=nQph##Flh^ES zUMsPLBt{viqi-I@wb53izp1&dus7CWxWwUtb0NwOli06m>8&DdiKtN zH;jDRth>Xe4$_F@4&;Po7LE9^LE~_p^rzB_+qrohuGc|pdv26uSa7w=))Pu+qq=%!)s|g7`3f5XPs2@fiE)?EO9m-2m z&AvshByFd~?ifef*8Ai2CO)w39HjjNvyo}(DBJaV=3)&hEUZOiTQam1oV+@Luk^!` zl%re#gHHnP>BrAU+Ry6WwedPSJSsseMMlK(x@}&x^GjY!d|x&U>FjFFF2#DG^7QOq zes{4Db@IlPKKO8XM((2ZFy*&S8EaIWEC-}rt;U>)DP3Py+_YVNvUPMY@8T)DPP

zpykI&3&;}Ch87W^zkK3n{C2xDG~&41BDyovH$0r2+&-IW#{NTRendWNb3cq>Cqkz1 zRONsRfFY31peh-hJ~|59$$DfiZ{KaZLvL`)wPw5duDD@O5hZ^GRjWsZiEkzfhc5tz zTfRd%DSV4Cs@<*xBatx{_v(42??CK=T(!i+sJrBs9(*Z7Q4JA6f0<&YvUo~WQQ%6S zF9K__2*0NFCqcHmipc%g2^@L8GhCnUqc+s4fNa&8VVt=jY+>Z>1ld+zY&U~mEAQUC zmdE6(Kl!;~UB?9@$`GglY+clNai%a7b%X*W$%&1yBo3?>S&eBEbX5w47+D=6L&6Qv z{QlH*vLM_&X{9|*f6xV*FVsM#CZI%^ABl1q<`(kYn7wS>WFAr616tq@$t2gB$){nx>aAPn+TJ{WwN5O3LL5| zQ-Q-=ih1CBvHt&juprs%fn)OQVE5!OWdIfEL8kz1XM*;0VFrPHN9;Im0_h^GsOEIW z!7y~^bvPgbH=956(4aQy)O(}x{noUH1JA5^ppQz~A>gYhv$ODehsdtRAekt~*3BqhdmUuN!+-T~mDO0t}P z2(Q`~_#qOZoN%+mZN*i|K>j*99_i{`$hdr?$4CTDF{%PsA_|^>tI0_;#(8&p8f#RO zh$#Eukfm%8L)&2xN5HBO5OmNpQj79D(^F^cY0Wt4z}QTjN`42|nRC^nqDAS6%o#;O zd@yDp;`U4Bk4haG5adfh2XRN1G_qtw8qi1vbx5Kk$ps47k)v7QYjj+IMrY9^U4*f8 z<0Igh$H1U6BZrRJ6lzw}J?$@7 zt#+C3TIL|?l7bm@8rO64_U7XLnyQ%#?HP#xvBhBzBncoyKDx>Hx+pS3J(JTHr?Yi1 zA<>5-jncuBCq}D7Fwkptmeg~t?pCLumB>L`!Pq9TvzI3`mnQYb?T6O3zkRS9HUg4C zXw#RR|BC)2`nQM|bZUu~$eJntP>$frWGN$7*nNKKyGvWQn6%vp?J!W zt!V>N`X<)1YMPrbs!Mz&VEVxt{H+0%0({~Svd(rJL@W3Llc{g8)xvEpN`X&AMwA%G zjA>$$Nk-W526?!IvJSO6jd2_`QnR?*SRguIh+?oIsX-fXJ&yt^qrlt3X1gx@Wu(0Q zz!d%Q*O}W38$0`*)7Lz;BIKe{f)~q?nMM6}vAeU%(ueOKkpRGXS$xwn%yx4@L`ScK~MXw<7aOABfqw~Iq1ChGkX1%6HY*K z%x0W1Z#ni?dk%*npZYKf-c#fWN+nNf4;t?bAeV2 z;y&C1;dK@7ke|XdnwYb@x4N*PMdLPER2mP-4FMSv5Vh_OrsKe%de(p_X>{$hQwvC) z;}Uto<4c??y%st>uWVF(nR-qgH9dgcbz`HW}R?wf8YZi6k0(yuSATHvVt0)s?WG2wh#!$OAL^n%U`2uK4OA{Q5s2Q%YSnd?Bsks1D-sp{Z5W7A$+-oCYDp6QDT)x}Tcs?*_%`fmN3p$C6f zQ5|zUNnTIHA>YYsS66~n0uiw&Ns40f;xdV0-muE$xgjmgvRR--O9hsAd_-dX^g!}r z#aibzT*?SCC3#*(^~Obv-Ak!rYh?OtDU|^LYcfB+}6Ps ze?eyb;zbB5 zA+Q+(LIoJcB5{|jVRg_@;boQN)z>HE{19Ex-m>|+yV6nzU=70uk(=pYi@8kWswvbx6J#6b_bWdA(y6A8Nxx@B~e zAv5>^@!2?Twp(4W@bJ+`#UNTfcO=JRiV(l+{NIC7|2FD`#SDIx^J7$oRh)+HFztYnGg?)bwmG@!Vwl_6eOq z2uSnmy-BMaGZ!)o+g@#+Mf>sYp=;iM!xlMohNqA#4{JO;?E_TioRE3RX!^|~_woM6I?Ip*A(v>7Awzd6>KQewcMIwR)?#z?Jf5^UU<7H^oIS- z%`T$&2F%Di^nU>9az*DcUtkiH1Wt)H`0fsv-BZ=wtK`A+Rj=~mzw)o@$rUW1`c?UQ z+NeSgiMM%ON=IrM)%P}DDV@{*IqAkpLrTGpQ z&R>Q->;2?2q^fZ$SvFd$v`W3FggTkZ6rC+;MR7vFpb zx8E-gR_Wd6UUkjy-d-7_=IqU%{hCAkNUzpyfXAzwZJM1@9ZF35JHO%D-GKmA|H1ix zhQpWL@3;f2 z(!2eJ7eD9uLp~_O4xV`7@blmNc-?vWt6sghO;ZrH`c7~Ap_{YLk!@}lG!q#+2gzzu zYaTDkM;f)!#EKex6tFB_e;#z(6b1ZJr8+x-Jv7tP+ov-kWekGA;fCk`RR44OH^?E9 z$qEofmX(kvgfWull1)nJ#^4IBL*$|M{FrfI6LqS{8qd{T>LkZmFe-0CtsyHUp^|)m zS|#aDej%F<1Im&{`fU4nCt%np^iK>^^m~E1d;6x)q3myup`1#I3qi(NDWpl}Ae|lL z5n%h$qhwvP;>K_UQAF%el%QkA-_Dx@q4(_hjnM4^%7I+{PdMXyE58lH!1Lwi$Ya7| z;lQz!89I?c*4R1y+^43lkvMLLc39FIuAX&vUv<5ASc?W>t5$>f+%r0}Y16VIIIC)O zWAB&c78EQ4H{a^rzY|5dbdUey`OoX`*8lXzYfyR+4XXUhM&-K;44afLBzi}@GE-QN z4Z#-{rQ{?Tk0TYx%L4@F5u$10D7>MxEK&?Q{Yj()X-tUW@FYHKQ_KzNT%skphF&lC zcZa~sgFJ7Z9Ir}^Z?Q6f2RMwQxoaBzdFX6kKZAiQ%7woZh~T0d>>n>kew$&Q>x<+4 zV0}AJqHFi=Ffj_gi?ZxJ`Ko(+mXoEl2{!X&P0x5DJA6P~{4M&IZhWY!!G<8x@JGg4}Z$LsaJ&~ot9LdQ{on3UpFn-*1*l$BH*t3ft$BXA{T!v>#> z(K{6cj}L?sfTUD=JoepwbohCHf@GD=54g zrK5G{BStSchwom69hw}atuBmwLRf$A##uJ+^XS_8{^KVAzaW90M{t5SqE5h+Ljq%~ z7*9ffklc9Z=kC@AK*!KdpHaG;3Wl_Xv0ZU^%%G@eqeib|>xr}Vhu0wpfB0BwvP>v+ z!C43u0zPG|yCG+c3<`jaP{P=aNc)KPweZA3wsa~svr;5B&e6%?1xu0Iot0lELX-`s zluQZmG(TZAPWfHYCZzQa5Gy8bQ6}XJ%I$rxu>;;H^JeuB&i_H=M2%>N$SPr}&MX%jb9oY*+OhbAzjJZ~Y1l20wW5>UB#s(r`gpN642a;M9sVj-f zB2c2ZJpR;b(9BJsAe*%^hH{h=S;?)oeX4$!uPS(!ttsoH9Gia*F_M&(#lgsKJUVJO z@o*0YTStWxvk^%ulhMPXQ)uQu;}j1f=)(fIEXdW7hc1imwCUAa@f0G0wq-Qaq7wrC zu6f!xtsfoMoqkFtiLMjeQ~c`Ax<6jDXr#LEL zJL@d%;U+-M?KIZAH{bktyJ-4D@hZq$)5v%X(Al)NvTW7^*Ma0-+_1E7(*Bf;S~?|? zBKvkC56)9#svrducS4!)Mvh>`cS8wzyh75}SNBqpz}`!T>KOZG{nOrl&&U^LzDz)t zCo_t+KxKsN+NVzwbamd^nNyHAqJ2ME#xx=@VgRtTAR`+LFY|gczm{$e`_DetYcA>k zGRdyD8IRKi;DPxDo7qjB=-}BKucYhgs)`qE6i329gy7n?-ZSCqQSce0kbv4El^Q zg28V8+G&G@_4Ohdb)SAMTU<+^PxhP7zWEPLibw9BLOE{#5%AUJ9M)%QmwEBzi5I{s z_u_`9{Zok1ucI)Zt5inf>x;RZl@C>g0Vic~c;QQ-OR}*}#KcvPW+~GqXXVACo@C?k zLQX}sEl>DmYaueQeu&ZDA%u^d+hX!HdR}XdPEeAQOktSTI-4;g2q}yTye4A;px)^e zo1Mn^u{bAD$HbRWeXz=d{OpcZCvC{sh*>$F(I3GmfYP4VYg?cN-LPyD*Gn1Kul44M zH=cN90k>bI?|tqet;|3aq&v`TwKm`N_Q)i9ek&k9Af7D|$WZh>EW}C70)u<<} zo&l&_(bJf=E})4>GK=#cE3K33GyQAOr0V+DZ~UY-RQG>@=+eb? zBG7>l*S>wj*S>}mXrB{^3c3ia>W@X0(tE(?xy~F#I%TZnZpd!DP zcldGTa#UA8di4%}PHp1q>aSJzo_~Re`0_KDu5vEq9lk~v_oTY_V^{C+cOH0(m##j; z|DoKI>fVp5dq3y=O%J}W@n4R_yvX~0P&pday`T71S>|UqGVQChKMoV_-D-=eBTXW4 z_K=tmS$CCW7t72)#B?YHz?Likr?My6JFsK?V>#gqhdRt~w<9M!kOgR(GO|;&cLuOa z!7vs~+QrE}NIbtb**{+SgKnzpy>XDN^ma*J0>FEH9Qu<9Bu#ZYo6eTvR~{| zaXG+Wb^a~dho}ePRgusWwU!JX&m||0ypF5Fx%!tntktOunF>!TZgC`u%#P8BQcGeOEl_7nrG(i$b$W2 zx(teTBO@z8M;&MkqE-49Xg28;j?e64nXpASvg`FY_K5I>@N(6tA1(0XX+1$?)YPQd zZGM3XXsh0WcFo#e(_n76{i3yYA=GKu*Y35_DTKHXOAw~S3{c)2Q5~c-A~+4oeR->( z$lzrp!|RdPFk2m}@8m|91Wk}gQINMYBHNm7Pc0kcNC6QH8N|(DhHgD_exiM&_6>~0 zW^$W|T5#d$4jBZ|tjpJ-vc4+zzcR^1DLN+7l^6dr)IzXW>Jnf6QTJ9M9kLwkq0W3( zGppNa5s}DX02Gl}+u8%RZ(BA=cfMx%w z;qA|OUOUzzytLz10&mNtop<{u>^_mjU)LFRs9BX2`dQ&!maG3ltkA{P59_j1<*ITT zF0NKigIxVFu|gMDU*>%bb?LQMkCCB$@zRVc^+s!}7a_X1x0sNNB$!g{%RPWaAqyf#s4_L& z)Uf#$Qldj?U>u|Ptms8XEn|D~k_`(Xvm1qnvVXufxF`zD#66DbI|c_X>jO~yT^yE@&yd8Y>+ ztusreZ+*)MznWhyl3*UX(=ZyV9Zv$A7%okAnoci~+8F7CBwY=+H#@s${kTM%@PmK*;_8Y1{;R7m|M6U|a#kYV%d4h)O-`@R+6c9wK4g6B z31XMxj6(WLEdd+;fCUlLZDouzqIe}{{^CdP!sQj>NNRGJQH_~2o&!7tOcM=b)S}$@ zIY76D1K!yTO3!uback(1m6yav?j}3iLkW-V#2J#Q4;=cevWBx6Y2S;5)Zo6NZsjLg ztH=ee!>8SNNju`x{_dakcmHIc&gVdIBBC!8$3e?0!}G0TV&v){R)(j#`r!{;UVTQH znCj}w>fR@~cSjtZi+A|ow_V=*7IAbgu6|U#!{GcySrD#f^4CoFr+(w&ui4_#T-^Jy ztH1X42R_+L)h9b&YX1&{R=tC*jih9K@gDCISLfnAJ}&QZ{!8bd`QYC({>u-3l6zmr zC;n=2buRAx#0OB8^Z$i+-sGKcNCK@o`PHVRfO*Jyqz)K1nN;?q$xjX-PM`}6lu{tJ zZzfsVlTv~6Zx)X>gOIis$D;jo=6k)K9nf;bz5}EbvMZ=@3PA}0G52YB{blo8eLD&J za0|8iKV4|83?RPm#7&dZ!r85C^R?^F!Zcf6EZz`^?_@j!)VdYLQyc%wHv5BMKGMHC zTs2~oxrRv>B&9sr#)q`G@?^j7=lXp;%kTRESUFjZ=kyV4G*)`~@(2EJw#bv`pVYoj z|8^mbINiPMK6%iHDhnxjP1x%$5RI4HnI%$4=LYGl%MC7pUez96MS%QPZoQk4)3qdE z4?9JJqd)Tl`uJ4qtyvDb<5i+VzS?d&LEB8})`{AU8#`11oXp>D<`l+^AX_By_9nkV zI7lB3onVy1XteSD(y@>fDuMln4~n&X^8B?TFvM70 z{lyz0Ucu`~JA9A!mp4`fZ*NuB2Bm%QRg@W<9boD=-$BtGcZv3*wAX@8freBn5oEd{F7Rk)lw1tV16usAlcWe%t7tP! z=tnJDnL&-s{Yk3v)D>v7z*7aIJlOdCf(Y2)y`pW$2tC+=>%vYE-UFC`i^nC4LX5Z zag9E5X2!LwzS!p%&ObpL>-*{5+c>nUuz)94=dxG?=^iur${8ZK7L{HXAt-Hx4jeoZ zz~t(}pUg^-io)DUu7EN%v3l8Q!k2|}%5e&L11+PdkMPTKHYZ7kg8j)XAVa!XjX5)JqVPli_2S;oe&F7BLS&|cTmA(3?)PtW zgsc)k@nyAM^ut!o=15|WQB}dz?^kLsq;B6oymLKi)WZ^j++HMHo9tCT4DS8jCHn7c zMHX+-%mj0n(eZ2TsK1=iKuzcPFa7_OHtO>FjfwuH+E+>=vgsS~aPLGKs*g&M# zuixnwjNb7*L`!NIcnpRnqPZ774><2^5T=a|0r#c{v76H>2%8nal}}7trMa8t5!_HD zg>z8Mv+ZWHWfB6?kvJUIae+s@8VGDGZ3+Ms2cF$fgR~%CW$U;{RAd@QyiShrJ@&EX93S$`iVlcf0dy?M!e>)e^IGq zJ&&zsFKEprlUz0oBVM*vy~g;7W{-IvwCs-a!EO!l#gFs{h;!>+)XX*RSsVXAgYdm##j;zfvB4^$s6b@32QQ^MSuctyR(<2j?GQ8@zX8uyL^Q2E5+N zMM1emdn=_@NOl1o$E$Q_`+Q18=cp zrUX^xL5Be}QdMrMsxl}-J0E5A+kqGK?NjCq&b&_3vuMYofo1phYBew8#up9`X3?0L z6Giv=^>USOW>SZga`K%JdJe|5^`dC8h?v7bHF+@xvFZWMrI@U>E{n;yu|0~(rh!$N zoDa0`(*DNA8^vD$hl$NaG~!gsSMe`Jd*y=CVe!sIc`v+7kkdF8Re#8Y@|Bog$vR7C z7Uq}?G?y-V5Cosg>O{sZ>6gJ(29gFE(V!#;6An$UF|&q9-Rhfnwm^pouaz?yJGJ2| zX>dToq=rW-ogy>>X!UnG2ge~0YiD&(1bL``NONm>I~_SDpzE$r!lY?N_uu&1es@!B zIpI!7+f?CenL!^_FzQ&LVN@h<(ZLATAZ51CTl`{~HpTf0`nae%J>+dTfOKpx6N3!HL*vy5@~fl~xc? znfP7A<=M?n>lMGBF^SFgZxbPYJ~H$VAGv?G>1Mx^*hn*f8glzr@k7r%0i(YR<&;pt z+I`{fYtX#6op-grN+s`10vn0%s=7N8!YNe;|7Ge!m@7HeP%RsELKb2&b51#<5QA`W zynPIOXAPDxP`G>hY1plgb7#I{I)~&2lg$7C8H5X#VgLD8??O-_F z4_49Mh;$WW^{+Zg->U&;f#r+A+B=_tI{^xod{2iRB&M>TKT)0$cksZ`n`w zw+O?V-BW=he;&1~pVt1gq&-g6ZcIT;zxfMe-=+c75 ztVzGuEg(0+ZDhSI27-e>E>;t#2y5ekk-35rkdOSYm62xhot)Gv;V)NzLAiR>)sL8R zQeVS;9^Ui-m`)k@? zlT5W}!x2ZOv;Z8yCNZC=WC`7<>x%hMc{^$SIanua!C&%^rAn*jQD1FBn1G0#e@z_GciI#AL zfyt%Hg!S}NhKK0&sN?PKn@-224+AA3sHXYBtoJZ+%Oqe{Y`PdgbzRG7N$eGLa!?qD z|3vO9f$7mlL7NT)d+nB`L!{(J?Q!AuhXIbKhzg8WO zeC-Q-P&J>R(&ehWDB&e4Sw%T$c_D*GFV5|g#sOZs>|W)s9~{r=W8;XCT+V}Udn|{} z#Xjb@IoB0^_If;)4WSlLcD%qWt!ESVFAGNq>ChSomC`KS?Oz|N$fc=vN zqP*L08R?L=IonEZwd|%IEoSt3a@>N7rlph_5g{c;K9p(woY@3fZo0!FZq~;8yJ0l4 zqG8XOuHwNCsVDk-V!aO~OV$?}Kn-Tw>1V7mAgpehWETFotF?*n2FzrQ>w&CIep zeI^RB@?X56YkyJSmf?J)GRZ>H&!iUoly#9qr??7mD@733RRS;kDrL3gOrJ0SNm=9S z`c>Uj*vmQhX~D&}kq8rbX>QA0hq_tov;`YXJ2XUM%rJC`%wS|`xJka-YwJcbZ;okQ z=ZugvQk26Z(D2t0Q>mdA3QVTPJ%vSVd4N#%uBXXqaovYB(J6(40Xe}QP*0#ocNp62 zMUd^FM76kzxP@q2yJ^#s{M*E>l?eUJ7)TS!)$RWAmoa6s~4gabygv- z+GAWTE2)YkFL-pVvG%-|OJ}UX43BO!+9D+@(@q+N5$8-Ft4F0t?0K!@&|d}=R~qb$ z8UuIe5u{O>Qe@WDy-DeGEjqhR$yqhSVRv%xY;(cGN8bKq{0O`W$wLq41Bmx+p*P}8 zac`b%uJSrGA~1=HVC12Gl)+AO4Rw)o;iccaxcVU#!Btm3?2A>Gd#mzrb@e04(U+?~ zt>U`s>dWrsz2Bowi|XnJz00frT*YWs<`VqSU z^(Y;5IQXy*0(OLT)?wa4qm|fXmZ>I5abwK9^G?w0-m-4K8bSuQ&Ljrx?Zd}|ZPS5O zrJHndwVLokcDq5tOxByQ|D>f1;rSCAJNjcJ>E6sI!$~AOxy*YgD^(p8#nnYVuW+YG zB@Lq{Q=fQ@%JovH8L?En#xi@8h9CL$?~hwPH5b)q!pQ>oor4B{8e<*K28{v$E3rxz z0M>-S& zt#%n6*4XLKM=(W*GaZbY$-!Zg(`MsN7ED?J|3c>&1UgVC4lJ^L{kqd=cnQ>ZwDnA+ zhOI=RoGCKmvPEAbYEWGjR7Q36)U(Cn`#m={*TWOv~Snm z&oS^u+#!ku5{mGNMOm)=AyFLll0IX8c%eJ;bSM$%c0i!wp9&UKxJ^VJ><-y89M#V@ zuWcE0*w>s@yWD{xZxdKF4D8I6v1_>(#JG<2ww(pHpBg$8q#z6F$MN-g*)zyZl%sBQVFkTld9dov z?)BVe{>%Ch0xhe*f6`1h16VJDi&Yy880f z)$dmJy1M$&fBDM2qE6M-k6m5;DP?J@tDpFnqGYX&9Lc{(r^Tl-g^+qj=_D4c20BVz zRVoi6_zPfLb;4G)iSh&!pg`FC{F~A`Uj253S*Wi5+6UEDPD3Pybk$WjVk9^G;zmdN-?(zT@r+1P962Eyr-q@jHwxOO z1VUOclK>`1kCX6+L!43G18I7i`dyk!kLg8MtLz3am`cal8 z!n+^PSl(IGOXz`XZvDVp?B(T>N~m@^q*!K{GmyTK$%DR&2mLpYn>;RCRUVYBS~Y4( z4@3177wJ~DK`)P{YM7)vItp~Tb*o30lYv9->f#TCMcpQz2I#;<2IvPVpD-oCqvKvp zMa1a@T2Zzk7c{N9*@zd@j4 zhG_|-kJ0h!*G^-9>~)`c<`nh~fEUapv75WsR@tmp>^1Xvb%J#$!}{h1{r(vZN-eHYA0I>H zle4iKO@Fr2DEG5~@|$NDe!DJ+PYbN73oSbzQ^tfriw{5EOO3r|JQ?Nn(k`}I?U4*v zsyEA+s$3Q=HX*NREz8l(S-xNrl3`h%GYTH=+}s*M6*`*wSw2_~l2w{?NbUf4o7hEg zXIezNyA!$t;F0L}hmY(ch|fCzO(4hbr7>HMG)Og+9jKI`LJ7%}Vqe7ou-D6~xl?2^ zL2Zyul`yyLLuw0H*|*sLO+NQedFH2^!Zm^C;dT!B!@pM znI2(CV{%uW-7F{^q5rgq-i4nv@@tJc)>o%R{iR0OIRx)%GThN8eGi+Kv{zKHD z{sNkzPIjTzK@^4Lv&C9Su~u-JoLNNV=L8{)A5uARz~uOq`f?x{6tOL6Z6TdI9P)r z>FXswnpcHX;Z@^KUXpIDZj-M?DJh#dw{gRd`;h9jNuBg+ZnJ5(M$FxDZPJ+Sfzv&a z+9( zu3A4qeuv%^mlN5~8ELUOD0)+dPsm(PJoB0X7T+08TX=?@d^m=&ja1*PUaa{0z@oz1 z*2xy($2jiw(pFD<#F8-$NOxum!CED|~WGerI{$~XDC2WmojYvS* zPC?f2_##gA5{;6bBPWbXfe5%>xxz}oT;(NFtQdFs?Z&wFiU1Uk&~3 zbzSh!^`ql$4-y%FFxz|bb$2FrwrlWHo5T;~Ablt5t!9I})A;224wTHk(_~t42jrQ- zjHg@svqQ#^F_Hzg3X`rPH0#|PeQlt3Hp-1n&Rfz9vj3WlziR2FzcEtL& zn7N}k>oP02hD*$R5}%bb-y!$}cpPfbG?JT6^nt!eoPLs>p78df%VlN6H_WB=e=WEmKb=vW8AGO90_H&4e7f1xFm4wH{N^LrB6~ zLWv?7q~12H9=6Ol=@5-HljaAVy_0$k(_vVQt=2l*jb^h^KRv1YLoYcy4xKt~fN3;K z^uW}{>%B;u%`HIB$s%tawT6_!^q&fP32}8`1i+e;+9jk;|12;8uM#Q*mV~GHloxxI z%H0Ex`^uyLLE!7ct{1oJUYy8DTmk@xjEeFKF&dp^^k1a-J%4auyV(=V>DhL9t$?tM z!ym*QjPP*~f^sZuqNeh&`~yPXeb&aN_6P}?8%nU%4*zYk70Lc~$l{fpMYfUtN8wea zQtbInH*6$s2(hZdBEqmM?jeMvi7KJhl!;T;D(A%x%q0qKN7Y^Le3p8xkyEjVx+qJJ2MiaC`>LFDJ=0tI5VYU@B z|Gdh>tEVc&Gms%Gf+Umzu)^9L;tHrvVE(PHp2{A%a1SK4qV$bjgFhi^#n*{=nMx6l zVD!2;KID?Rb$ujK;m)rXMiV1$bzEY3hMJ=O3<0r9!HU85YWlI+p1M&4c~H%OpdUA? zOnkTOHKrES?4)Pli|A4(!)|l3P#0VWumI~Rtmjni;1u_5kK_^dlYShtx0q92fxsFM zPGV1pC`}Th34@vceFb|Fg z<5ROt{q3{Crtoq6$&En!8IV!*C6RNHF;+f!A1#_|c&5k>H z?#W{eS=wVxpUhuotTszcr!WUg;ENLbA$Q(*?%BYY3%2%~FWZCSzl*O}hHef~gSd_BFdPO<4m@leR>#{1ADZgIc zSi!v1YQH^TDvSJ9u$r2kMcbvDhzX#RGKCOFiN2IJfJ47~#df{&1PuYhjA_aB@QUg>Yp)1?q z0pE3A#lA#Ei2ao{sNP1rhYLf-@BfQ1V7@kEE*SLG@!rks5(+Mq1jz;$OaWnUGu9EH zkgrEK^*h^*DM30o&6+)lwjUbj!4QH!BTM~0G<%lM(f!y6{w01vvJ2+vLF-`q-_RlG zPn+f}XdiV}H^T3ykB^zLq>Lz6u1*h`2{;{Rc@~(BvzFi1-cz);GPth^tLm0t-n;v{ zsPNOps*w*Ro+h&er7ze$G7WLjy}j4jls2&U;J1B`_5~Z)I1JE4woK)>$?QF;AJ z8Y)T@8A^P3ROy>#{Us&>P>{61k}?(qTMNZ9taT!BRLh%$$+qVg^pwzVLS95`^}Tf7 z4m>7l6Xqm?mbcuQGIv~K>XxstRc5Da)0*U$zLPRo%OkgxGN9z~!m6W5b8TG^fWp))@J7ZHK~Mcn}_r2J$&VpTz(TjXEVXh8M(#T@VvtDMwY zWhF|*iXg{kRiog?s3x{N(tjzcXMNvPRoC9NbyZh&SMU4m`}BPKcfaLs`gC;{Ef*~yfi4KMnB5p8 ztgwSv5*8Vp!xj>Q1QOtw5VIPP6R?aO+2jyAam*59Y-4;v9LPC1(&YEN)iZa~)s^51 z6yH;KzUiKtp6+*f-e>v$|IbDbK%X?*c3pbD6mUJJ3oKO-cV|7cls0L&LY5Lw*MuCw z!3f=M3o%Q&_Qm6&M~KGhnq&~qO#UlwWWe$KnR_D`cwc`#C59D)K-Y02tz84old(phAM%kkrx{gg6=$STvI%)S&G}JF5ec>Z18x&+mWv-A%e$ zp}4+(>3CEm&BJcC@0GNt#V<9zg}e32t#Ia8k!gjZ74=PPZP1->rU)Y2MSUiWwg66) z{yX#W^aV-lXel2>VhXX#_zTwi2~X3AflZ~E1I`DT{T62i$4$*|3F4Qstwr-P{JDHM z4!m+m_|^FIH*8$N`!}WO9pY}-1BOH>4>Uf7Jm7Dz&hIJ+N?A33en zc1O+>`di1c1&ADJxU!<`n_K|`#sX_U%J+pIv7iVfx2njpbC*!WTQgO zwmM1{P1ZZP!UfAka;yxLBvMWgYRvHu^5R66_>p{(%X)PTFQPq&4xvtr`NWz&+bu_A zNgx!rH~!FW6@n>8Ac(##As(;}-^xMHtBwR02yf5-?F_%nFa?}F7FV-*`lX*#>N?GFT?3XR#{s9 zfHSwz=piq#zrS7vgEBd}TGCIPBZI;f>jjl^gVH?8L2f91LOWed<4(-a#qARXWBe1W zaD%+M2o7nig-=-D;Nv;$g9idX=OgDtsu{a`uvpa`}zH%fz7j-3eS~wvH!Y!{urjN zA$raMZIkKLR=|}v^iJK^ql9kbL|t^Ria}r)o!eKV`jnbwnrvstUo4GdRWZ%YaEtdxGBsPY@@ueD!9keR2fYBie9#hx)nBE|`OQSP z@Brjct=w-}^;i8kC)!cqgX8bwq~s8Cw}cQEczfvm+=+wS!&bfJRK z%(l8Fi6DAfQI&9dVWXr=2As^K^`_WDP8(@#jdY;Y=3xQxQC`KNi%h3f6;?iv>;&Gp%rozG$?{j> z2=AY#WbMl{>RO$qd@lx5xvsJdxI&tBTiPApO;E!PNGU?MT)%JFA{k6p+ir5~@p%Tr z{w(R*X}Vk1dU<<0Zg}-<&H++OYgsLB#Dmap7#6fUx?+*(fKy7V=;+doL$?J5{Knzz z1TrtT3+7&Yb9xsB$s?D5lhptgh|WO&@GU24vliCf>zlKCn}c~+ZaDM3!GNCMEdEb| zfAd$db9bdjj>)kE zXKHLB;z&lQ;XydUxhO<020xH`{WJD4+17JxEv)yc3 zvGzYRyd8;e0E!kp)Y@f5e;U1dHT^pkbwd1JX1J=j^I^Gg0Mt0pEcUc5T~<%3IX zrJSkxqEM^GuGWCWF(lv^C$%KbpRC64d+k^x;IV!dri{j`!c?QRObX)Pr`pu+j!$Pb z8fe6>gG8M8U@qcDtYDHCG;K>;POBeCUjWE(*}*|A*}5#!7}6(_OdP8Vw;*~-C*x21 z?apj{xwYLN$JEm59!PhD;+yWUB(bx%wS5RaF-(G;Iv5&|&rJ_hA`O5^;T2BvTIp;N z9vC*d!Ep-}V*aa99S`fJclybbo)w>7Z5Fjs=Btr` z#f;TZm4%D7#cINJAWbAH1gim)Cm2Qbzgl_cq5oXA=XoaOH`ARhtfp|C1FP>e>B`)| z7tKibL63CmXlaDb2IHt}BbrEG&*=IR*6~D;<^c4Ihbc7;35kfCxTI8&t$$K^X<7_8 zW&Gs0Lj|1mMw(7s z1v{C3WgN%>CJ3sw>}BfDz8CA6?Kg|pJgL3Wi@V8AD?;oNR1j$&i00EFOY<)y2lSW4dZ5e$%TpJ2+BSvwP!|ZdV+w3b}sW+Qw6y_og+4_)oL;S*Isu*mHH4-WQWZyvll(oJr2x%v^&B*_=;mf> z09eY-KlfYcxYITTM?z12h8#yDL{Cvf__t5?!vOuxR?PZ*d1qdu@w^CqAdXNUZCX?M zqD7?lMsON%MYsAwocJbob~x@5Ku1B^V&or(sqiie?O!Hc7frQO*{loJ*)ATw+K8;W zDu7gLPEH60fX{V)L`F6V9(6rOGAdbJ)9MW%;t~%N{Pj(g_!qjpk@z>~MgN8bi z-=W=}5yewt4nO7LXylJBUmatz(~Vu&#boN7q}!%bMrMUZ!|`btySecBOQQY32^cm4 zcXI*FN){h6U)}M==Q09%~iGO_Osr}XZY492~)|3K;LmFHdTSp7of z)9GiR{H@h_#GY85%Kuz=uQ()PJ)h2?;=5aPiDA4|zM%U0=_)CTjiSvNo&@RfE+G() zA$U;?1;!H-I$$QAku5Foxky5j;Ui;%&6L)5ni0At-GkOk>1-0aW~VXj=!L&`E8-+4 zFNb8j9}I1`jiMYm`-`+_ZRgshC}NmH^GY*MX{JX29A6m{+cZNy`(Ihx1SR}dj6qfT zQlC$02g+(wXb-#k%zR`v7QVI$W?6|U6D5hy`3V&>R+TI^7O@Q5yjpltx%v*jK~BbF zrLq`6a|GfH(9(^lK`OF=*jg`S;%ZuI zMWbZ*`Zl$rxI4Ue_W|PX)DOB{|2WkMS@Qe$)~%MGbh|e&EmT&5UKy8&+)QRMG^uf8 zU%*VCw`OYZAn!kaIvuE z?cSp|7VCN3_`?3t!XF{c>t@;Eweftt$=fdIc=}%L$JTBs@X>h!`278f@sqb}6DJ6s zSY66Y9;mPMkWxp0kya7V`A4xX*|FyVsbZ%%Wf$RA+%s?<0osf9)J03V1)n1%TqYy! z#oFdFqq{CHSQ)0Rz%MtzWi25_8 zGNaz1F%=2@d*%a=WVke)z{J(`$4;)?KMu6dLt>#Fw72Y7Z=nL4!irgcEEE=K~jeiDaFV~M8qV$f)%az zhp%sq(?QQaGNnLRLju21ZYD`b`;E{K$1{JsF*#`EClJNvAVHJD4L8QU(*{|FM$;4o zG2UO_HFhrVn(_XAyg1ryp+PJtH^Nc!8QN>Js5y!r^c%P_q&FMWym=T!Y|b|$2==24 zli&+DG1WMouMagg)ZSN1`h2Juk(_|xX;bvqO~_qP(WvtQD2M4Rfg&Ef6L>J;=#$`g z$e<&l*NMHr(TZu?j&_TN|2`mw5(5(8%6wHB{>71;`)X>%m;kaH^C^z7Exc_aJ-b3C zuVOxVmc)-*{+5kAw=XNO=OG6l~xm_>tIZId7~qc;}6iKZy6 zZTkYL!v~^qxHKV(!?0aQLpETpzVwhpqDHHOiH12ZT`vET_CEb7EUZ)_Px++MB!+*b zNvVuSC8<8Q#SAeThgBP*Roe7iiB-+yB$v@*2qct|nk5Ge*Mx?07)zTnvI3Iofdhev zG%sNeiWABr*fLIeuuIr-wmAD+@Y+C)4#A40Bok@hYb6d+2({i2Rr+DceMEHNRpi*O zB|$SsWjY&?i03$D583u0PC5w8;Vanu_;$D2+=z%yS( zuJfJRXOrSkI}_ur-VSf0nj0H~b%M9a+rpz)^UK?lC~7GiRD9NRGxckZ1SdclX_}XW zIO@DB;62jS&D7GUKIj08Oz@5*tw{yWCu~eg37v>ZowPgDvcTV7w%gZ_>DC4uvY(kE z737rw55^;qE9d{8UYeniJ+jp;Xk5t55%|53hZlQ$i)wd%Lq3 zyu9eCshvtS2#duARMjGODLa+?gEeTz1$7-Q%t`l?r%|yYqZG|LAb-Vgq%9g-9`6AQ zX5%$SR9<@wQFz}N7>)F5wFgO)elplYb21hzo$M1$A2vPg0)@k^P^y{x)7Hdm&5_&> zYY9cRFuZXclxh$kYyxADp#)&WSmK6MO1;k*%FAe0e;ex5gmxTAfVyj^WED}Ql;~5gUz!WEKm4#ui z=4aY;nzveUFQ=FY%EhITuW!^QWPYW6PHos;w4tx_LHApG`_XJ*avwPhnw}bMf81vK z15a#fgsz)qoTsDXme;_}vR5b~>3Z3)2c8d9cGQ{6uKd!omi9dqzyMiFio06j;tg|% z%UhR;mrroYXS@inFOu0jD{^5?j&*j9d`5M;6Xjy)eng9KQ~VU%jX7Qf{mX zuf2TSIUU2uOY*z-k7o@;3`y=pLD8+RPwd$;-Z&X2LzKs`KypxU2IQS40Q`P^bZb~Y zJP4f0=FCf7u?J7AIojuH-#{HqjFZ|5Cv!D@gb) zEFkHJd4N~2@VnP~$t(ofL+Ku6*O2-qz%J!>eY^g*h{3;a?dLAqFR%!!Dliizm%#Cq zX%bUr%|8qvzEC%+Y91&*V`2$8Qqm`LiMmyRhmX3VV0|pw;<$0_6Zv0Y_A8uybLGs~ z+RL9SJ&rZ6Z|{vzT%fZBr=nRW;R)itJ7_(PxNjeL$!2h&N)DJCzB69oi>s0!t>ZyF zTb2Axwe8D=6=fbJR^k(rZqEYV&lBgv>6NDo7$_*n4R%_)pIWr~rgrr}fc!6e=-?SZ z{;e|GJQp&Dqo3J>mqN!}d#9u=HZLQMlX>HLf}k%)vM>X#ZMTq8dg|=k_5X{d@L#R{ z-L-$V_U~SNIpoh?57nxXl^_e@xhsMw^2L^fICL~$n!v>Hwjo)&65zKiV@< z@F>UOQz;lc+xks_3e9H$;a_C24Q?&tXRkI=mO4_3-4l;ih|gYbFQS{zX-wUtW{+Ug zd_>{=kGSAI^asy??lZXN3cH^-P4t{`5uc6TH)MGlmn%yplFX7XR6g|oUu+fY@}*3v zedOi)7j65rFMH`SelN1LKe6oShyI6;Lw?ebP9OS+#sAeD)IXv8st>dHU$EN;2l7W@ ze#P;8j`hX&dS1H^kt#Viuwq9+VGvuQCVp;M#mCvzKl-j9a{j)s0j=7C5C>?Zsw)VN z|FhbHX!GZjh4AC0`*dyaG*gHQtx$(P++upcCL(h7zKAiDc;i{7PzvPJ=Qk1gnrB$M z6;UbfivR_K8 z^|7srkJ2mqFuh{vgCa2Om!#tGF)x{y#$9{E$H9=OmO=V=v#x&rP7Z z_j*x;GAmo+U@0xn=MwC_&{}*+)(&ij@SweTeDbm4pOa?*soTf9f93{7FXGn^#x)R` zWR{iQn~N{yg9qvZHQ6xfHgKX_RBXu^CPWfNcXC zkwV%Ob&eY37{OLBjmhoBC-iFv2UqndEbf-QEZTZ-)1PBde@45Ej>cEP1OaO)5L0m; z=LZGp2tMVBG$LmO%F?z(2^_#nzZwtq;Yw7B(N;Lh(zQweFw&y57-$ShvVJh_uI-(O=;m z`cJQY!P<9LyPWMMAFCqsNod4ONffU@q>_&WRe3b7wyio57V|0<85(3PiRMn16wXyR zMILqa@g*gI5H2huDf=x!AgM(_YNx8<=M?d)R{;p}tKNc%G3!)q1!;g(9w2>r22F%~c_J1KomNV;$&!4sU%8ojIiWM7&GJ%0Azp+EM0Yt~xK z^pQ9^`#t^ZppbqRlP3zr%H3jcR|8xvQHyhVK3`Q{VNA&QGm%TCN&&{D5U4JSf-)hJ zIXs^@zQM0sJIJRC_Fj9hK;p#P z+7|?^My;mN0D{elP3{g}zd%bx;0wG!04ASi@_=h$IDVVS%df6VSAe*3um&jI#N zod&S&PHc#Tyc$2_Q_#D4pHj^EmugfWJNtL~FB=bvL^Pu+W2v?~NhS3?>4IYtvwSc6 z0VZ9Oq1>m=dXV$X;gRGMmZxli?uuh$lgw6ieyXfoIKAqU1FTAxF}}qy`y;bH%cV6S z&;~TW3nfuy(WiyKt!%jgGWY7uEV+K8IelpC zj+2F*PVeO+f;v;_xA6#^Dk^Z7f7z5>5;L;4s%ccy_ z=F!Zw>o-BAW!x}5*c<3A_^aqAYW^>U*YDlGkIq2iXc&>m=+4aK^x9FB>gj0v`0B6v zsFCQMjr5)k&bdZkp4}%u`Ll03n@H2>&M**Mpv3|=jm-D&`=n2O!=%0J#Ur4F6vH6O z+8t;3$jkbHA$?z9khQY;Lv2U895a#ZE51SjqRcVAw*kS}WMFJ9zHLB$Z^P)dtHkb^6 zH{Ms(Qu+i1n6H{c$=`$k0qe-gnv^Te&_&pW!-KN0y{>gO_crRiD|8p9;^?*yB7ZXL zqw)r+z}FfbdT>z02|R~#E3Hsw{$L+*BMwfyySht965XpeARjWtQP1q!K`*Fxf?_9+ zCYhJji%zG|=yqB28;v^H8JqKthd?fJ3ZHhiK5>f38UmYYwi8_&ZjN-ng*XlwMW|KD z->HFA#y+7T*FK{317*U+o||-aik&@uFt78dxsh4EJExEE&eZK~i|)TySi!=#`*42U zVL$BqjONrzIsj%_)OBnf{KxGl2GUgw@I&f%4@xOIP7aP5KI>Y5M{l96@2BbiVD0PG z!ctQx#c`|#YeeRi*%eb!T|CdVnrUn=ryS3S^`^imKU(q(HKUcWkQ>!+$WP?;aYogI~XsUw4FhkOpi>KU>pVv7eqYt znCsrSo6kj0P%qJ%SWr`hbYR30T{xq#mqvrw+sKPfN&g$W?q#8yqP^?;{k9HL(+=&B zUdh8o|5B<4QF_=$h!Djqk{TLv&n~#po{w@A#u>}(%{#3{HyOcHgNg`9ANp`+355`& z4!E&A8b^B#&xZ*D%eUR*q}H{lmnK7>q9q-`br-tv)jO?pk<@|vL+z*Y-{8^HpdFOm zkTb@SmglcMdoM@9&#!$>wd?n97za0uYMjA>nibic-6q4kx++gam3!692~6Qses;sS zsV_B_Mz7 zN50)^#u+tX!+hoI>qhwgWE9m#+w0!jQ?~)Wr$6eaC?>Z`kdeLxW!z{yYPYi4>2lV% zackdbAGfkmu>J6ppY-r{g63K?F^fqn9>x9RReIs=|Lbwl^ZN1QuY2ssnBTZ{Xb0_j&>dlcoIM4*OX2DU|-bus%M|N zc($^%ul>+}0O|N7vcYoi-1s1Eudv|SyU*Us?>v6?EBd?i@4~^qU)g2#SUengjJ2*j zoc*)k(7#9j;g!=b7FNJDH`Lj9F((!FRmF7b7?nfzh9QBwVpipBivmJMkyD9ecVIM+ z&L>DVB(HWpt7<0MQ?kRr`VMBLZsV!=CGS zUaw6Tvjo8hW4b-ii`_zR586hyrRhLh!FY=Q2ObA>7SQCZ#0Y>sf@leyT(qHdmzq1J zSX#1?-xHrP9*q&}4+)-voIY8@5x^Gcc)K$bts_h-{mOt{Hs?cP1Q7dFn4L~h2iQkL zs{Jd_R6%=~$pScm;Os+qKKP>2Y7~Nx=O3KRgMO%Wr_h=nzSVLvf%rn_Gd3^n+4kmM zU~RRn*+hT6f1bbR)HW1xR8Q%dN~<44cltG}P^ zWvv~k$6rWH_XyKziL!?Z3jVeJNBWPF02cT4+-p?<>uQE2qGR@|8JBrvJ{HRSNeWlE za(oqR%$$iltro<^WG>{`mKhiSE3BQK&pEI0wt;U3ctJ2LTW~~>tfiO^TLD(C7S+R} zE#18I*sDi?_JgukD|5UU6JDhU4^Im?g8=>`?=S}9Cc=udEdXR^LT zP1d{4{zn4vpOw3bNmu(qw#n)&QtqqFLN#^lE53(nu~=lXyI@6$bp%Wkg1ZvuMsVw^ zDP!W)ckFHbGokJaay)NmK=bPHG_?pp8#~aR5{RcBeYINyNG1KC)nN~5bgjVe2PHz( z>e9M^m5rna{Bkz2Att;aB_7Q=OOD|>3LflAPow) zk-AA8okpWQ?9^~pv*RwBVxNSc@MA`k)+kmZ&>OksL+05*l)@?I<65wDxLHra0)hRc zF-qP#eAUbs6>c?R%2xib%A$Sn?@4c@FFX4|{kQagfw04ut^MGIw<+Q5DnTXAKW45F zl)&*));u69296=h#gZ{>7_wEcE9-l1FBGf>k5k}T$4tNte8g&A7;g56APdnQR?W|s z7lY0WEmUSh?GKqrj;qV{T!WPV3V(A(gWc_6ak+1{OVjF(e6$#CBXB+1j2jt458Vam zT)R!Ohinl-@?qR9JtTjw-OLai5{Mx|A-&s2oon~(Y}$7>_Sfxi{H^|B z4Da8w8_8qK?&WUx&9?XI!usu3^>bv76qOIm^Z))7Q+k%ehMO&NEtI{hCr`z)h z%ukl-hPQRJKfuU;<=IsKUHxrq-^L(Vvfx%o907-}OvhrZR^qwokWVkT3qG^NOH}KS zN|nXQ5?03j@bE|ohUb}0BB<(cS2wL*(a zA-mHt8f`3A*n_49;V>RVUSjEFMi9wGfROaVz%XMbjzk>QHSeF{x;l{80&}aUm)jBjR8SH2At{;T^?^~_x%1%lBwJ*iChi}(46;Ze z3g5d2@$T`U-r8(h+gDC!8vM-h&cc~IFv)jvZ(}=3H&V&&)o9N*7LT4jTv}a(alYv6 zkBy(!e{t-Y>oG_NvV3I9TnYPe4tLUzMDGbp|IVPA^@h3xpJJk=R?#d zrGw%gNX1!#3=h1u6rdmMWJw9>wT;(o=&e#_Rsh~cIhn$ZuA^h*(0#LXwNSdgYW0?f z?mS4x{Oak@!V_oG>sdsF0`@V;`m8J)dR*e3nT?Hk9FqYCT~2Bbs1ft=Z94O*~$WXFWE`}kRD{AK;?)_#)HoXKQF znL@;M&i4vK&vc$LQ_K_8LGGBy4;6!L&UfSSgj-a2${jW{u96taSvDlap?0rYHb-(I z@m&>Kv8m;ctnwC+q*q=#3ryKQR?kuvg}CX)HHV-{R4$CLo6aGGGkMK6D#1(u95lSI z(A-9)1OTP3b^6v`yj!0f?E2AeV9a(WdUuzyg%4{oGNhMpzQqiL1FIlYNhvi=K}iDq zZ>F6)OPP2N-8zmAIBV!}5~+2ZxZ_KLf_@B+&*!b_y>+1JMNF3igJXb7NTB&iicei{ zMB4Xfw;w#Q+{xH=)+Zz^-Hqd8I=jL}1hDCaW%S9$V2*{56AFna!8#*CK}eu!c@!ad zviZciyS_8fu6#zXgxTWUB30AT>&Gxg%e~zqF7R_Chi~rRdEj!8OdH<8r7b$1kfn(x z56z~FL8o)t8En#77Va4&{*70zXN%O?*q_(T$plKI2ZvT0Y>Hg=H=Mm%|NHv4i!ve} zothQ3tuLlWk_k+;*lGJ%W^6vke9JtktIB^?D+T9W`R}L)tL@J%l-bVjEaWItHhf>% z49tOee0-_yP;D44DFbv!^Dw&hcmIY>7s3Na`gbqv?hi(gV6t7+V8)4~ouk`$ro6CB>jYH~MgTCd_jHnaB^_85aeOOCJ zWBTfl(~J-W!=zj|e+#UoyVScSdo4z9A@y>7c`Vf@2Rz}L@-h!$}-KI`n?Yk#Q!O-M9vmXr2k z|5{MWsvP5T$vnt3S4kqi=juz#btYNnnaN-#Zs3V7WTxi}u?%vZN}IV{Yv-2_>oE$H zl#JrCht9DPrD>@9AOXoA<(w<%kQ<%|q6g(P&k#DIw*(r^`?vB=kZw-syGy#TsCObd zA=xo(X(U|nQ4kKpUZV_3s=4a;9%x$+yyE^1!(JTiPmI=jBGeWSj%|};IJ7p~l6JNo%d5|67P)_Av*SBNPnNIs78A!DZ!P@VaMmVd1A4Dqvp>?`q<hEf~HQQUAdL>aIGhCiA25i+V9G(^$LVXJp_fM}_Ne~ybQWm&_C$69Y8 z3)j$9p)Y3odj|#W8R#WYyy_(A#?d@B7n^puY(#CU&~)b>XZFYeT!}bP-fMWmF=aDQ znP$5LcJI}%xz8!-ow<(xMmZ46M3N23545L9y8ZNqiA7*K@9K-{7x|j! zzZtaZ`92LV{6$`7W z+BR1H>e=rZU!nif+6R>Xjr|rvmQe}tfDS;Vj*&Yeh?KHKHLw@M$TuwLDm8O4Rq_IA zg)iAK^Hb~M2XpRbeygA5GGRFC1v4viDif#T8TFb>5VKiL|1s{xVlKxBy9@fj)0;}U z2|^vf=70L;^&alGjdShlh-6ZMC3}X%TBD;Up~l%NE?GSPmKVmG|hhVD-Kc=PEl zgj}K?y8(G3aawbTLoUtkQqcuKCIC7jxiYH5@Md=EUfwWm3cius^d&_UyK%bfbhif_ zL*#GZYSfY3%X}1V;~m#;`@PLY9(&0_7I`EC5%P?tUA@6d(~OLwhFQ00K-oyN-n2W) zY7k{1Ug*Q^t*&OZ33BH%9W!HfP9x1BOf#t)8?}vtg%ND;PH6vTHnul=Mq_v8<$h7; zW2ErNjD!~Nu~S}dvo6tdX|6YDHf8112+Q1PA4r))M?u+d1F|Ln#{{705gKGLipeb8 z-LNq%ljGC%@~Di*4TOWpx+LS>NjaOh=Tj(dWI79cric)RMoo?x&NiCOZE`m~x`=C8 zuG+;vdiM9I(7kW%7pmw^d_q|Q$`{O6R+Cl25}Q;LuM8*Pib-W|xswZ5f1k|loQr`t zVbN6=ueCA})rup6z!HctP~8=mycidM2b_oGOKjGZ7zv^g^}6cBlhj|erdHJv7P=OZ)TP%WI{ zPAecZJA$%BJW|VCs$bN{D3n1*($QaIRoPi11RB#Jr0cRGQU`fMKrjR_yqwh`?PS0U zgqa9Hf&7A>dC|}#(UH**snzQsa+f%V*NcpvS@EK1_1fe9RS6RbBGwQW(SF3*Xbf3B1hM!Y{ej!u zO4D%?6hS;~Yt2h1GoyLw(hiN0inuort*iAgNwOAZUT8;bFx*RIZIN(ab~YYbM`hQf zc6|NeTkuUehEC?aM;{v$GmtCD^pGF<>a%}He&nZcR_MmS<0mNqJgC2$g#Ry*FOhD8 z?>l=0gZ1jOKcK7N--ZaerUBexwpb3z{ghR)V3Am?lKow}vXDYxqM6((y(P|z926(> zusVFvmXakPYhfY&s5&JM=Dc1N$*R>_mE*W4KkW-mR@C3bl_ax>rPuNY=J9@=Aj_W( z&~yp;&{%&YzMytel+xNKTYePUbt-E0t%Dr|ToIe{UOv3u0+M6Yar+=+xt(S(8!0Lu zEj@BdUT(5c=yd9IYyGW-{`t}AmE0JtkIZzEY2~b^@4smflt9g3+H$(2AuyvFXds}u z@qqEwv?=uUX4Gyc1^y!rqFEr_COR5~7TG-O^xL%Lfiq`Xami6f)K3P)^9h5R6QEhr zvB`BZ=3)2jf7joje--lrtLyx+agTZ7F@>1l{vn<{`=|8M_&NQ@x$6$kYHPnjUGtyo zzqSe<(Dq_alclR>i>!cbK-qP2VzWn=jJa%A{^2;eZ~?^E#1!yswUzlsZef~*94+%E zS2eFpE%)*V$&hMec7zPSG&DBY(3yDO_@nGv+DBZwoSOK_NmM67(EI$4nrc^a2s&OH5u1<%L*yu( z5~3V#W?trlt}_({Dc$rSp#<9-*7DU!Kl(~a%GON(Nhfh}|7*1;!DUU*lp>fgdxtT` zn3gTA^s8a^@y-NpC^S;|hd@|Lhfq;c2L^&T>1Wk_YR&Evpt+o+aHKwncm|XaMRVQNk8G~K$L$;?(?D^aYW{!-2?8z#-r>2rX z-Z;(32hdDuJgcgA>h*Cws>!z5&oZep@puVuYM?ezCweNNF;fSnIc!FBL79eLv-tpS zBz&4+G7TrgIG}+FA~gMIcr}^S=rMtBhejd-EYzso=|(!ZuTNik`V4WjLm!sDQHsIW*M%QnBr~Mr9{S5|VXfda}CT7KjoZS`pFp8=Wv82WZMfdF|xE+sWki z(A_>-H*0ujE{fCCyRFUB!_YfiCe*TR_S`(Gjd%AOn=Q{T2_>!B%+l6R8r=u)OXEwY zak&}$;r5p6>>bDclzvGx=GNSvs}HueI$AIZsZ>XwN$;;=Z!zr6zz|OEw4)L)D2HhphI zl$ofVTr(+8TgwyTcyh{sW<5k9(1H-1W$JL_wSjxyz_7B!Q`8_Dc|^ProwYws7cCm%{2yziPmjEemt=<#aW zd#rT2K0xEoau`~2VB2Xh+(l|&et5JYD}n!! z8=~`NpHPi=MDDodk6!U`(Jh;ec0cpQ)2vys)yQW@+efdpCOeDVYP6>#L$()6(&}8SALo=)yXGb_K||7U_HJ~yzJqHvMLa~HPFL$ z0N;>C5BI6ydIYTTkhz*QX>a@hcf2v;(4H8Ex)vAnjoOE4v~2v%*V9 zi9eoojP_(>^qRr71>uASG;~s;$3r_MXYcZXR}b_^`%C3<8~M9<7`4}rH|XtFr%^n` zVr(>3cNQX$riL97wbAc}XK=?joF(^65f{e=$}TApLP#n5;w(w#k5C-A_uv(ePI!bW zp{zODE;OCuz7bf+dOLP@kCM^-^XB2+h%6p~^mm;7d;NZLJ0&V3e~r`E8ZRtnTde}2 zH(3j&6-KingjSCAOPKb-nlS~WTgC^keDbu&2ugE%lGJwZzM}ZJXN2?^XP3@-frY&` zbdsntfJ8JO{GC6aT+x#tQ2w6&b8GKd`*9h0aUIzmY9q;B0w}&<#81VhG9_#)Im*~9 zvTLdzu~oVA{1VPMI~f;<=c_%pD_#)ODch7+qEwRSi<|~qd<*hf_9MToHlWyDeo6jc zZ0d6Xs!#ZFUn1=4!uIVJmtGBM3Qq+u7Uf!jrZHyHc1#bWV(#Q5Cj}_p?Yv_+MlYu6wID{^a_D-AFZx=xD#aW2tMbh1+OLGirFVO8_~5OU7x;l{ ze@2hMPXUF}I_PYm2-VjoGHAazY=3Yg-C z-y7s)LprxV`L^9BhG!$P2Q5MSiw$FlS!e zi%8yjB|C2gS)qt~4=-s=Qy$Jl5GWFgkN{aSLkxWN4MhtvrG}bKexk&=su^1@xr<9p z?Xzb(U&h-WiontL+nUg<3#2WmM63l1uq;P!>zNOu2ee-`>ss z@hro=#hlXB&CX`i#>U|w8~c|oq1hVFMw2IB|LS3}Nn80*(WKD9H~<%#=JomJtUwiU z&`k+=T&qVm0mbkL|Bx=aMrgXb3EMpfWtn5TNrGo)8W|t@H{C(rxN$8q6LV{P?eQzE z&8@IbWOC<$?Fa9F;`IK{xaus8d~4L-*u1viU!UwwlNpT}Jae+UKSRhQeCYMB9d$CF zOeBZk&z}9U{%e#RfmfRhtBe`r$#u*({Ld*U4^eH9MiKHagUr)J4}3k9@njM>p)!$Z zu@Gv>nsTh?^qnJ_$iD@@BIO9FNlIME#RkJ(s{O>NSM93md{a{@&sbyN(jc2t#A1n> zSU!SB<^V!;SQd%UV&q@Mi7BcL`G-SAej;TY0WR~87<%#|P}{XyZ@z$WkWr@yCq)ww z0)!2Nij8HF$M+^-Eu+01hC-j>|?>(=(iRY%SgcQ=!0$jJP%@3wj zseob1`${Ga&PE!HfS+$UuBbZOH8>;GCWp6%Q~q&xjy5e3#R1vfjR`Y{hIjRmd&iW4 z7rk2Arg<`DX95N^Qs5I7;=}WbdeH(tY>O zh5o_OL=(=?wtP^(m?|Q6f;=1?hiLCZ|LV_$9KufeeB8;e#-02Dg`-;~U^!p@H14FD zt{kKG9JkSy{b?=cOs{ep&%H*u?Rh?MN!TEvwMt9@~AeA(x2-Xf^kuP zVN|c&LVV4YU+8`quaKSh9H+2WM`Y;F?i6135sqNmpXK=x$|%Q=mRGuFR!sq&Z z`QSNjpT0IbdyOI`bl3iEmAn@lsH*7pVo5NrlAx9~Tb)B<-{caj_OuJaw5h-z3s@P! zPYl9>u}vlw(i7deNUD(c+yY=zGx8Rd*AG4QpA4DdyBj)P7;>^tPXS%0sCOI2#ic? z6%CQ>DAeNM>k(_E>L#q*IJJP5#S#aw3dEEcmkn-BeY3!i)_(6Jn3pdOh`7=E*8>w^ z4{?%398?4@U@tI0tc;+*S$3SV*N!%9KlUl42r~S2?qD)-sRr;?wIj0`)%!^?g^>Z= zhNOS=Cl4F5t+%#;8Pcl?*tT9T(w;HvtzU++glsSZ_V#qq)qd(D7=?E@QIlrIlo97y zHsNKQdd~^^adK;%ZuWtu_2Q^gr)-eKblN<0o;dr* z`hV2lv-W<1p6t8{I{Q_Q7XFc`IYz^8HADE+IIy?|IPz+fS6f}aPPkhxRmo$~RLLeB z^`=$1iBb=c8LdvIYMop>l!~9~U%ccG$Y0n+~=VP4T`#^}#eX$mfGY2g>P% zPD3zYCLow*&8VBuzu|QIu+l6@aFk~nZo?xX)|dlE2bMt};qQ~~nlaf(I93hsxcU%O z+giTXZo@E%OK`zPmy!-MM4t|Kc)AskNJ5gpYi-map5qgn{VCKgqVe*fhsrne4kQOa z=8819R0#aZV(jPJd9l?5-tK0eOB+z9Ueuj-21XJvmhxeOAj`L!`EGIeAl#{%QQnF{ z7?aFR;T)9^f1NaQlX)rtr%t^=WhKD0X*yzTe}#(QKg5W1*50`GpRN5!6;4a&CsU_V zl#1LTJ^u(HggyBeY(#u3acOPk#^d7Qd+h=ghE0^gNX!rSzT+?0i0BjYihv*i6B~3C zZC8no5B{A`2>Vf6`zL3=Vw^J9C4EiazV>eB`goN!;Y??v3fxq#Q~MKRs()zv#?q&y z2OG_A^d{|MT=RMk^v#f`c_H|V++$4&Z2>(mQD zgP<$#338I6zMmo`0++4@u4>-m+tK@4l0ZV{}b@0Kr z^By~K4R*C1C)XdiZySbeTK7?=UZnA~q!#+{6^9OjaKGb+y1TXEc4M%vI5xWZmhNNS z-JGPO-z_>f=@Uvysbst;Mc=wEEz{~#vjBa`2lN45-yB3oCo>XPtVLGj^yp;EZ7eTu zvIw3yyQ!FbbL}@)i{N+8{udU(H=X?sWT*dj?QaOiLug|KsXFK`3_M73QTP`}BFE6n z#EJJXmr^i31OHw)f=?50C7E}AoqGiQie>YH%rsx+!dvXCyVQ%QdbFegt2I*n+Oep( z;>oNaX&H5Fc_-Y$+K_wa`Uh~rgh*ElwIL!msgW18uG6#iwwFL78fD307)*SBd(*Y2 z+Y8T|bTycf)SjvJ(ZYdRfl0T*9EN8AUcKgyho(Pj&^!y^g+CcMgoF9X;moFn#Cie} zIPN6vUb8mciKw2^iHAS$88m)3!`&{DB2iKL)2*77bf-v^=urP$nG1_zKkGMwwTt|3 zR>mCXI^9$t4z_%290vEzJChF01!`TJOfgK6CS`61Af45u3mEYn#^+duHWjUJ9&~8jg!+IpZXc4gutdw?`?0{ z?%uvr8*NPN&M8D9Y?o2KCEn;*E{ZjD8xJ=}wWOH_#)8&usFowl+$)UP;mNvLXW4uq z%SpJ1&9%=arB!WPf{CYN$!cu~4zZe7CT%GbtE3g?tcdD)GFInnLdnM?+QVX7axWKn z1~Cw_a`b;=Q{*QythMep>EuE}i4W6_2C#YIZpJztyPZ+mn~%4~`N^*DH-=5vP-wbX zbb4|u7v<&RWrKAPE-rd6q>rP3cBZX$aHdE<4O&haHgDYg8HqXJ0d(TmT5+2o&nL)h zez_HPTD?oN<44ww-q=kpceW141NzRlTg|JtuF%vhp!>HyUeq@yWU5^6{>_sowrY88 z;P1Zq<&kTF@@lyVbn8wy#Muv<;!7IJE^{RRH$4Bpo&B`_!}@yx z@_Z{>)mZzdJpK*+y*Oo$3J-q99$dL(tCqzJaqC0%zDyIAktzP81C2Mr|sJq*!}Ilb9FdYP@aoDcm1 zggKfpbc)-#Ki`Os#{(;#uXk=NlbwBOVR3x+fc{1L7p?s&kumLts}&|+)hLkks77yb zNKeOwwHl&};bOh67V^`-F<(#{Lct4xVJU`i4hjH+P$zFTrMiK=qV_=)CKV$dSj9fz zS+x-^{<>5d<(E`rSwUByPY+M_^Lv|3Hvnq`8{45ZGFtRRV^krVFmyc9 zt!Op9IcTO{2^Rownjb1peRKnBLO(KI{2i*qg;0pSMN>zEh*A#O|J1$FLy6FNU1i_!g-0y-ac?MPTJ#52j zA3cl2xSAqaQ7Ww>tL(zUJ)c9V=9&_kT8wI4(CJ9cxVT7CnqJ5&a&A7CUzvX-dZqr^ z&tWyzBJ%EZ2cwzAbNQ9t%=|F)N_aB|-gNACJJ5(ze-gK*qj{MW#&pvwh=?tUVc4-U z=~E?p0s1AU-ixp=8~^dygvZeg!ed4!Z6MOmqh89QeIE0&3E~dCH})p3!!Y6&z`#r$ zs}?jjcuY|ZkVQ?ixfft%ax%XNEfb6U-Vgo0E=1wE_Age>(_7EJ8q0i6AnwwBgWB^< z!elw;*tD`;E65hWE``z(^^re2wb*J<2Tbwxd^b-5*FgIxK!py2fVTcyKQ6rEJGG>p zJoM^^;=IRRK^8tW)-PWZaXX}gzUkvcN`4Gb$5{Vy&~kXC>d+D#%ahC66h%n5ODKM1wFMhAIkAk0bOaUB0$%BCkp7Qz3Za`m6jVH3#c^NWL>nP zH!Bcp9t((dev_tIfLK|^kDW#OgfX4#-f9_t>DdpnjK2w4uK%Ea#ad1t;CmQvF*=yA z$})*PvMtg8$TTxf97=t%z*bXWr{Z^TuUr$-X>_NPZxz~5j9T@pR3ixmS2vEE<1uDU z0tc~rRRk#~E9oWnjcgi%1k775KN42loHwG~3lEz4(gmpn(wfMRLX)M-LuxZEw)K7KZot?)lPy3FJ#ZZ{2&OL>G$@p}=SWRZHDk%jxnm3#Yj? zvZJ&V6dVVlGug@7yPP`4Nf$3~b8AE{8rh$X_T5)*A&HnBL@;I6 zWVbc@ya$R2zhKfR@#IRgIi-2s{q$Y+7Lb!bSP94h-AW%Oz!A)M(sti;_Nbb`jGjc_ zx%Ritt2+$v$|IMlGCuL9^;0h>!kc#?4ny*U{6GAJo9p*nu!G+a!WpjDv(js7|K}&l z0$^u9mm#3U@|3U%)d83rA4JicjSUXr75Wbnwh2&<^(&G`` z(D2s{E2}&GwpPD_rUW&IxDQ^*sUc-!p$Ufq+i(KOSsE~blhu1^^TB(kW;#ui0< z3cH@?tdjk+9VOK@*ZzsJ|C;vQXTQg)c$DYg56+8lQ_fnJf&$4sD>=s;$&88wfngcRH7b#9$BBOT%u3h(zGZSL+iRicf9 zpy@C`k4~G zvboeIQ8NK`qmmw!laq6ns_)a4I`(umqhkDX$>yu{nMxcmZGasw;u8*EtpP*_;)&(v zi%~{U3H}sr6#Q|&Hs6~;oR1&AqDRm?AaIgT#Z0Y z9G^v^bw+vxtuv9e(;q(j`)U{by8Z*kU7i=+YRmYb_6MtHzrqmF(dyaXR!pnq*$0ew z=wCxBCRC3_u=M*yFmEMT`a$*VTfp4CU4I*Q5d`pB^7!l3Yw=k4S)M#w*<@H-n%HEX z{ma$8|5pDZ6)=Jzp{?Ri&HmO4jKDbwS}u(ZWfJJwilhzg1iAPkSJ2ZwqzAM?I^rZq&&@uqLJ-_ zxLqky)*BXrl<6?KMBhI>Ky)p#BeW$)XiHu#r^9rzw5?=oGFTq$( ziWX);CJ`VAIseR{xzAq>RHyz>e=63muCf# zT&*P0&|{wY`ZP?rN0;5ts-)nnB;N9{e_mOY-Af5>Y^*l;pBkO~^B4KM;L5`{2(`@6p*&#Hi4y{-iMYVLUUiL<``b^2Fw z@B8H0n*O;zrJhAQLEZbi)xA&2Jg=Ya>p!IMw_hVIb6yaEn^v9^W}Hj@=c=})_0b@3 zvGhV@m@lk3-#&e*@JT(+EJ`-3^f_)^b$YLkZ~2RJWc2O%{HA`meCG02^enree>LF+r7@o(G5#Ni7YIG*}ccG6*mizTNBfsZ~)^ z5`7$w3W3|Be=!*u!;_{wTemrb72g96Utsy^1l8&AQ)ILp;%1DWOwI;ICnhz7f zC{x82b&zk;zt-!A>2XU`pr>Y3*%4Dlm z^U3VV_adLfeq0fwS7$7{S~7wc9+|T3b7qqXIUuIdj1h2u#)LXyL_N9&8gf??Ah51jQ|lsmsRofor9w9de*f)$68C!$t} z==M_90Qxs1AxJ~mM#&_He!s4x?goX4X5`TP&^U)jiMTY(4E|76tt0qTM{I|{B@$>{Rpye8VFl$4uC`Vn$_)f<(+rjIG2YbEN2An9v2$Z@Gd-HQu za`ByO-ywU`CS%3OvhTzNqBZt>PV#*+xA=j&DCNiuG9%~3NHy=7nw+KlNWmovb+!2pR&blnS0@3xRb zu;4CscZG|IoulsKA%uHvgO()dQEGK~vTy)WbSZ=4u-)A5@iz1;Fz`(SN~H$$4($}% z7VXw{?2Ynt+C+(>=b1567SqF8`sFlf;XB#wxO2}Dz83V)E9>}+ku&dvE&52{KC)^E zNDXfX#nPHH6@3MMO>e)f56rGu^y>3Dct48ay3=B9>Fp_mc;;-M)P?9w|A@>Pqs-O= zl6rKp168u(d8gd@p~`T}Kw}@Pgr%TaSKC&7V=+%+InVDupO@1YP_AZEKdoF%(V8Wo z|CdTOTAF2xZnW9!1N9T>TaLB8Yj>V;tQ{Q21E0j;^JJvk2VHucKVL>Vd|KDqZPDD} zqms3*7kR<1xe&IdMI3uvf0@WhyQwI@Ps`aO4-XyMi&M5WjprU{4|GqQ=c`M@L?Ti5 ze06EKPnFcQ+iL0`rP4KpBqST81gW&HYmr-P;#qyc*;neX(BH|lzeRa)--2rO=cxGV z8}PJ@wJ(8eyC6F1pxgR(@v+8YcBS|NEJVm-q?|u~Y}ceb!_KuTTavQJIjvIsw7Ftit@1*G@sXL5Fq8f^)Wa!`S4B_R zk0cz=cc#9m9&@r1vF7qC7nicCvg z7!Oq!`0h69qO`|AW(0vB#Qxi@#)j#ZO%z94h(Le^Mk>Gy^RkY>LwWOZ+Di}@)}?KC zt^P%|nZet<`;x=m|tkZ~nI5?c=nIGr&C~OpqD| z9kaHvJWde!T@r%ZS>2wt&0Y|mHp(4bD%vxIm)o~r?fdSUcJ}|#_8!o(rB{9DJ^9qh zq0Tv#zvf;R!i!nMp+021Okk}U~;y>R=~z1U?JfF83&jF%Q8`5dl(Bm z3~PY#8jOb_ELa$3L|7R0o!|b>y{})l+F)xTIJ$kS>Qud3``h3CcKGlA{-u+BN&-Jw zA8{hsm&ob82ypj;Y+m#NQ+h19hnGz3sdMbFO6>jiOD6VS8dZ0%?%zVxxs&}Hph{@m zH1S*J*Gmc3KONR*#GT9xKGWphr{m{tPwR#2>tkzteJ4px;gn_)#)S)bM7N>&UXbH6 zCKnfg`Tp`8-wr4OIm*uRu)6lKlaFEduAcleJhN}Z?tKV5Ct0BX3}eVoEIpvAplk%d z25Ofn&qFP$jp5r8=l<5-kY6~>#9ujP*Od4cBp7%g&M7Y#>PdO&iY)Ph52)Q%d|1Ln z?K>KyNn4LL)6RKdh7{It7>-sZZ{2oQ=N3S7Xn2|K5&*)t{6=-q^}(d|V9x=cK77S1 z1`IxfPJ}wKTikr`p1*)A7Zga)47!(h%fO$Ef{Nn44p`HHDkY}thYygl0Sukh^6QEQ8dl;oMfK8IoIHp+{?$L2l zc9K>vG`sG~_F4nBxu|V|sS-{W&7_GW(LoH7$AvQw8Z5#%iw0>}$NNovd-I_k+FRO> zy1SR#A=KDtsnk0_A~u?8hxz#PxO>FdIH7oHKoR{iuOLiT;AZR_6h&SP&(1hq_2b>c z66#gE6?Kjlj0IxkoNrc8_hxABF2uFZ>HmJ|cPcX9Y{ZwLnuHdrN$4ev^yO5Eo7&qa%enlqZP5r2!cz0taGtE}uNYFS zVF*apXV$J!>}<_SEuFm~W%38GDk{^!PdGs0MiU15%~d}fhq&7K?rdmMPnQd%CEm(3e3Umg`N^*+=Rf{jfE)?=Mr$)K7y6=;6Tyop(6A-GP<#dBw@s%f{w~p+&tCuo**?;D^kXbEh*Jb%Q); z?IliU&{M5w3}}Wwuq@1cwWKL2N?{oQH{KZx`aYBsjj3Jr+R13U-`sBYE?(@U!-ios z)*oM8dvq1zbIS;sSV=l3WQdAcbPC~&uvX&>caI6U=!N31S-V&+-#hO<^0GcOY9?b% zu0Q_h1+&4_%Mnmxa6PFr*=$oNg?|F0>2jlzV$I3E$Qml6%gU6c>|K^xE>xiYg~h96{Ybm; zd~GHq(|N1tEH}u?^Fx(5b!WiQYV!ed@ecSUX4&R?*%Lr$VwzZP6%uT_=M2E=a?$F(4PT)60e#pvgrK+$-kV_69VjW2K#B zvUa>2kK>AVvNZR@WhV&p{&GKaa9Oz-jijf&(Z9UCa%n(wGtAhlSNB*|pD8U6c2h7z zzMpsUEBdGK6G>BAlPv}!%hr&KeI=r}?GmGD&qe&Fx8M@W0`O3krqpk|{S?}L%nmzy zH-(|w-X%B68%x!ZsO-4hSb>&3T`v7RR3R~66GTosF!C1IWDcQfr`0(J&3rRzMe*`% zmO1SbS0j>$~GYAd+<$V11H92;I8 zPHs$E`&9ys-P-yh#tsDKrOO5L(;za7!TS?iFu;!Eb~tU@BvN>r$GN+_fY=$1z_QKe zHDT)iZ>ZrRCFRZ_N;V@y~sXU_JOr(kgFCW_||wZ7b;RG=sK~^+j;*cPl{G3L-!sDucH!9Ufam#8R=uvC}i|xXseuNVLVHdEUcC}5jlztGA_(i z@E{Bxj3T#Ov63c?aA}xMvb86-I)`0Ou+g=l!L$_oYl9q>nf021_(#Gk7Ka`aV?y5px1ZjIOPBQnN0H4kk4-a(n#_Bqv2x{AYqW`C?!b*`WtU+Eqd47K zj~f9i@z}|4f-w7gtOP(T9zTBaefq!9KgwfJ!#w^n<|N->P?Np%!)m4e#>xMw|AGF& zr7vLz+7p$*KRdGKY(dIAl73bxjkE2cICk>>j^Luw7Od zJ(wPEy}ABH?;8bkN+;)fjWVZI7WtaxTE^^{)drn*3=5LvE5}H}h}|}+MFtJ|;Ag_= zB2BwVJR#4=>(iN!!Sq-YXIyW zkBs7&=>eihDkzR1^taq89g_qbx;}=`*zx+W~P*IFjv4e>IqFLV9e=rFc~Ez#Pl;=SYDI9*?jNWNIj^Niag99i98HJ$yNH#T+B zb>DUJQR4yqo0ghO8&dj~X(oh41-`x*rYpcHk%zjl9df+zB>%ll*-vjkR*}Ko^#Vw; zR#pJHDw5g-%(L2maSK|eXb2*DdhAvEkH7W&9h1FDn%fXt20M2>bqsfV+U>VCuYBI) zJ#WwfJ&mMf3~~G7%$ThL#$<9!1cf;@3{LlVfAdCKIK}omUj_je^WtbnOBgQwJK4<# zF8kTRK4kORV|Q;qeq#phni<&hynVR5{)!vphB2Jj;mudS`sSV9^kUB&PjRA)xJ3)m7XKJu z`F&{S*NC;?tCy#EJP`$F>aD}{Ob12pkdc}>rcAcnCBm+6ke}u4Jy%MkO0aU1{rp|G z^c(k@vzj3DLuoT)z_EbjOzZ-DxKUAUKRYWs%i3_cn_G;TrN%*3gMcP2!wF+vTxa9bg$+h;&@2ZFe2ZL$ zPrJcJnXfjhy(%0IK;+HBY@>kVadsG53r-%W=M$ap7g+h$4hvJQSA&a#d_4`fm?Pd{ z$PdTu*Pd+Y|C|23OCJ-u#3L|(;TBxkuv!0968X-Gp#(|g4aJQ1v5*n||0FQR43 zvkbo@ohBUN(>w2)#G?q84)S7vD-QD>&V9+1?op5B=TBic%KE`x!a3sfC}@gz{JD_l zf1mz8Ed89?ZDPXd^Fs8`OP?xzeGi!rXqEbqIWI~tAP*?4Uas=FYJYJxh$1+VAxgjn z(-H=u0V{Rm7-n*tsfs4^qZ67*Ah2-A3gOb2!shBw<)5$tVxP7ztYTtR{lZ~c0~VKD zhf(xLgsV8n{2v69@UnEm=)wi?nHqF077Y9h_kda%uR9pgRTagg;EhHXx+UgJ)0>Us zKm`$Wpw+h>e{$!TWQjGI(ArJwU)(>24YILX2E9P<56zwJro)&JhE6kjT3_BjT5}-g z&`N_NaqmrsltbCd?#k|pn_kQ#Fu$T;w4pT^FzGR+&1VMa8bo{BZ`?@+5H^B$U?QTi z|KQ^fw#jfverLYGUN1%>#-`bU@kwHOAa22udAm8V9HYEHuNbiJl*Q=Ue} zirY3PHy?vt;jdT3Z}_exxXUD(BrR}{7y5(@8B-UoK^QJb)x62@ zr{Rs!$}3i3qG=!JK*M8T;#$}ZcVEBDc@yuS+YR*Aply)J)?~)8wf>6rgEt*A`pa5f zzy;vZ15TV`4vrXHWkfsY_Tuelwu%jgYm?k_=%~E>H%mr|--gQfNoU;7Q z)}k^p3QK;~q2E1WFM5%e_Cu@F#g1FO{nW`D+xNwBdG5Y>W3ADt~~U}4Zirnrc-VgqZ<>bQT;~8-FwF|4s3q!?#`k$92`MH-+%Hm_~_!3|ETiO-^F8TIiJh;TQ!a1 z-<@3Lz8R74gDT$o$8z7vCr&PD|3v>G-uFY?XW&77oOtX9p}BZMlKmR0PlE#jljPoM zI5at<)Li3TNnQfo-3=v zKaR&MOc@;d{5wM`mk0ASM)q%o5S+q#Z^2UWCtbFX~38W;0x3x;tGb9#}S4(-0uYn1mv4R@VClnIDa z)QYHvGj7__ow+URSf95z{fhLLei{5YX5VcbnVlvEVHF4Yi`f(YzKlLqUclW|!%9LJM!e&W(F=TKwUJZFA z+gfZdYsCXkJaKQ{JJ<82AVj}4RBFNU!E!Q$WD8y`ck8feb??5p>llT^8TX&OAEvzz zv1_2b=iGY3$?xf3&TfNnpt9!+#E67ma48q1z~ zxcKf1qpPFo^%+n!5a^r+P7YUfgH8h7KDd6~@4fPkZ`|-3{WM*>u-2Nk$l+0_X;D_A zSYx@n_iRL)+cSsYkLjHb+ZS38VR1&Huf$&6O$N?h`pHv?{yuEVzXY=uMjY*W!4WUg z<>-|s6>S=6I35Bqs*aE?QpGt?Zo^y!5+b`(7ot{CWG)8F{w7IEk^4=B&7agW5@m{( z+3qqb(WKL!ZRp}@!T({;HpWJ{wNA4&F1>AL-7KUZam<`Jx4K-SbDa(5dlTCcz4_=X zXLH=d`XI&5VY|6mOzxO~5^YclxN%1j^r`zoe@u6>OwZ+bhT%VYF|9DCcp}v*=}*7dTdX}W zw@-aD*`Vh`IjEJ|Hw5vZG&dE;T;qDqdV?m zZ-0&#Xtu~sZNjc38ACiG7F@h-gZU^oMt=GK5k>Nx7LODB_5CL=aSrS=bq^<7#@oZA z-MaVDhcC;7RBgPoGiJlQ_vHWP82?605HNclKf>desj}eDko&NW-{7alasLTQ7e66K zxg}nWv5+-XtAk6d7PKz)$ik`D>Lpe`F-9EI!ZxlBgk#=)X4xbX!;0}!<{6fp4!lF? zkYrmq1t6u0gX0(z#<_u7aqq2*8z#2#j<6RTTwj|O1i6eOVdIod<~WH{3MR?yP69pQ zK(L6BM%O0kB1vXxzDJda*g4FvKlI>Lrk%j|&e(8!xH1pICZUxX_k5>2q?E|%-szXj zv?vOw-ov5Hx|W?wMHbo+RAAtod-&?bWmx@SFY>!bH=n&zA2h4u8BTK8wi#&HNcSKo z+yer#nrpf{uYGod_eM-)T!f<=qokK6oiraZl!uff)9bcx z+;uT=y8T82U`2NM&I^p#l_a^47EafeU8b^!oBNwVdExq%!wD)7_@e=2FOajq%|~>{ zwD|e8n~$AG#msyXFW+_71MB63%PaSGnOyE<5h(}>yq`V!QT-aURCv6W%_>R`^+-gI z&?U2dEEh|sE=So?nZC|r)`HXi3INjDZmJ?5ODUJO>-pwDZyjt6+ySf}diwOi?9N@m zv>I-&YsXI53;iA$OlR+&jnq!hfdC8Ju~yvu=*tFuxWH~6oxjxGfWgL0?zlngHl}v4 zePLMQ2S@IeOQS1W`1tu{se0ng>%lD7&9ysUzLIc;R9Xt~V(jFd_Pr}RPj&OxUl=@m zgCTS}gA6p#KEJ5{hW?%Ee6Z!49iO2fZV&uU4HT+~I0Q6&%iLiS7j=YLD>o8asBeAS zE%t|K!{hII4+UJzgit<;PI1G#lE&wtm2#r><3dnO@Um(yc*&vI*TuWW8Kdyfq9V}tf_87$AD z%~x)=cUwWG9F^bK-=qHnti-=n$Lh|>|G}dVFMR>V;f#!crB+`WiO30puxgQg|l$oCZ+O*Mx1>0a@6vH188W+dysA@WZ0Q}&d*HJRv9?!G-l}hFrWn_)X5O6fzct?5N&L)0+1f}OlEYFipt6Y2i$H1 zcz@KUqGA-X@+BFizUTekIccVq-rJufnnx zQyetUzwG6g9IK=+!V8w?@#yl1T9w{xG2)xS9UfR2z#2vpFE8d<5L?-hx!L~wf%%1Z zUuOK7mNM%Ev7uakJqISTwD72lTYX$17qo*`v1oCt=%S*d--=tIIIO zmW8@Hl)u6TL*hs@G~mm{sTX`(3iA-qDai`+fA}$Wk|1_R$8f;K2N7IBl5aK18zuRq zl%bxC{tWYYFp~LCK&^Q?itl9BA9`9v*h3IE;#gc0S3$@a%lSyZ3E9X?jfmU3atX=4jkG zI%G8`sl({F zvl%rRs(od2<#C9bZR49Us5)cH%B-DdTGw2?aDJ|(X1{Otul6b9Z$9?OV_W)z!D216 zp<>P!0tp?#r~P;JuVYsTL#DR$Js>DPM3=!A*SUYpSY)dHFV^Vbc&^Oaajoc>v)j*T zL=GIZy#2(ew*o&IZzG4clt4LO#k-URk~tCDKT8;}fQzR!){ZaiC3!0c+yFBp-#vyd z(!r0EnS9bbpE61<^5Ui!0y-3nVwkg?6{mN;gmMy@_=F8D3TMQ8p&J6-sz^F$u?7;X z&A2Yo1cKOQtIhl?&LdL zOzv~xr_`w!SpmDUJ?#@q6F{fO>DqP|OpCObWl?_a%5f%1_v8ET-ILNW=a~e~Uav&H zUwv{-|4seJm+0xhkw>jhExFi*IhSmOx^ijOO*k)-F$hmNxYf}v!J?$o&Mp~Dq+St= zbZZCj$(1ru&nM^fgD3-ele+fi9UIv=wsW_+*)&@%I~`(Vo#tqH)PxfxMVPKb6S>Vk z$@)IErsks6pHK#ihTFSCWKP+@_nhVe`{SdP7Ntch3{*vfhO7H|X0>;kUO{2R&^$Oc zNg=RmCJYGK$BbU&ZyjzxF>X>hS{`i|%f@tK+UX~N zoA)~BzwnE%;LpJY;!(P>Ld$5iHHNBRe9Oh|afi|hJ97-in!K`2PylE+xZ^!{j;}*v zNzsO{#Gve=nKwH-ojhbs-gWYO#&_d`es3Lw+e+2ZW4SoSYx$N{?RHYGszuB6P$?m^ z95M@@8#&zNo}*ipEiBa)!#P`><9cm`-APOlA0ijw7b|ZsSS9&bRT{B>y8+qzuDC~O zi}Mvkt>Z9ksV~i{F(W{2CnyWxB`#B(t+a&Ah4djA((Zltc3itNSspRu*Qd+KVT7{Z zX=q7z(9N^}hFC%=$igokj|7WJf4Gj#FIRhiBF_R@$K8+jrhKYAny8Tui#%bBFwU0V;2%ez~<(nYhpCxpP_X zYT@*U1(Qx~pIlKtx%b&OJ$1t;>~AL!>*+=jYwI^3xNB3J+!!A`K=y^it_*V)XWg6J z96^BZO{We2+}$^KOo#Ku-+0|4>EQC^q1gwM;gEHt$dJQ0%SMw@7Ri-wJ$a4s7$Ng} zmp(3gO)Ue*_hKFy3q&nFtz7c7+BUbANembZdB(aX8&lSmOKm#YV2k>#l3+Pg4|(?J zs8$hqi(H~8JZW8QxHnjghkcrd8-wMsO3l}$?$+Z#bna#Iv#~J-C_!nk2*jXzV zU4MW#?qu8XXx@_v%__zF^}xp70*9}?^zW5peFiI=3#?3)sDAB4z?t#MAL0vr4fjz7 zrbPA8ld<**{ewLIH{7Q$z31c?$bNn|lS9dVT9b*?D-e@x$vHbgEs`qQra~goq?gOm>l*3?Om7eCKX9pF-dYm9VZQ z87WAx3n~cmINO_zLF_Td5=t+P6IC;It;TGtaJP0F`Qj}&>yT$7q)E?RTnWmZW_aa+ z>q)e=CHZf?ELr+j5MsX%FY`?*Xg;&UYE|k;nLTp4M5k-TVjfjTthoH|%$lAix{0}8 zkf>mxUvNp70P&kF^%gZQup(zK%SV;vH^z+mEk`s!hW-1O4W|ody))A)w{qKSBV>b# zAZ?JYQh8$zC20d)+qew8-6w8_Tal!%UnM4Oy(Iiu42YmjZvj#kXuJ`Pqs45AF0U@Qq2-U@__E}WI z=Fmhk>OvJ`25q&-8Z-={W*q zX~=BUIX4yu`JGA|{J&5Iz}TQfErA^{J?J}bRV^xE)RYA!f>tmPfrp9j!&|tV+rS(D z$cc%TKwdz5o(%^;>MDU~;aN2O2r*zU$*MDg65u*X0b#I2^5mGj^kSiPC$5`N80%`C z8J$7m1-8QF75MEqX9%Xfiou^8f4E5b=Gu_%Gk3Z_p~EOO+0~(yESetDv32?ebvp@=0FDM0m}0e4N(Z9>l%Sep@jd!ZF(&3othYC#K&6QHa%yb@%3 zX(PxO`o*aNdIVZNC#=ZWA!>l4@GA#k(C|mMA39`gfNu829dEI1T3 z@MFTlnNFSNW?IfhxD|}3Xq3I#eC6&=N}^v*SlDXIqo zFrkN%Dtp-R%Sog?P1o7*^7+zllDjTD-u8uaIP#AyY1-e>-m`T1R8f%>R580p2coXn zkCG<<7Lsz~aGBgnp&f{vl2z}fx?XyMM)eEdhYSio>-0E^ zq|||LBWE37Z?1GgeYMM&WDvsO5HU_+PQDI$8lpM~?WpA8mNmxo?>Z*PT*wt;hm0wO zPtPlZYNy9!Z9i@1-ZH3A+aY%)F@o2>v$9t9)@d#WN}-cnfnozPJI|VhY(>fzT~Oq%GY2BF<;s_I|oz<%hyr5 zetL$h-Lj~^q>7>lj(?VeR?Z$=m6l@-x7x|L^yxnIDOt8IFkG2>Fr6mJ!J%-}Lf__S zQFi&E18-#wa6(LU;`qB|(hfDq{9W-{nYdg;6!hAMVYImcr8v25%ig|xJ{=P~(Y?!5 zD3Yz0A3vA0`{6WBOKb+Y40&6qiR7Mk$ptA@Y8uP|6gE5(&vjAK}Z**xBEiejj8Vx(iDD*}p=%>Lf0KKlcb261A;e9053gaf+%+Pm} z%mS$y&|zmuFH3XHkJeTMN9Y$EXWMzVn_mj!G+XY_k3^ifyb)%twi86bu!;fxhwY%b z-ZJ#K=yl>z9(qhpFpciSr{qBNlPppiJ^A+KwAJT`yIFwuq`L~+<-wu4dbom3>^Hpm ziqFyQ5M(atC*SehFKbU|U(7(kFRB^q5Y(B|Pu?D>RQRI8V#EulBATl#&huUf_w6Gy zF~20ma8PMQ$D?#e@u;=H0a=g(J+7}>gIPB~Hsvbdg3xt~ODmk#>>{%7)u6%$WX=Jo zrTq9p89AfoUKi3&$dGI|aAe?l;B0rh)~K<%IWZbdQn$ctG94XW$)o0I5_H_8f4;w( zG<&>eIHR(Rmr68m{(< z{G#SMlA3%ZX)#Qp3uNE-C=`cYK&B9%DK9h49+LMi@IuJQG6*H{V8jTm;j{~17xddH z<<0Eq@*pZ5ecTc+JA&N_hsKtXJaOKPfKFuC9x^#z7RUIE>g0B8d29RY4MACrhWNd6rAajj3;?aM0XRKo6y&~{%l$ zQIfPwv-czh%oKKc5*K`s&9sRk** z9f{z`4Jn{p{gM);YX<&LhG2g^u9|Q!f=q& zgd_bHZpx{w!OK^UO3LK1qh)mbAvBC_Q`ic~dvc;|tdoAFGm@z!po|$-j3){yA8qP{ zDlT=p{cZ9tCaE%T5<6}?l~1Qfiphb;`?QIAT7PqMs4*B3D*#^|ZB~|HjkgD>!Cz@q zEuo7ihYSAEgHoyEqt?ys^`ZEIxYLpEZ60lh&Gl-SBH?H7VSZlwdW@z}Y}d)NVowfh z@k5l&b3}?qA~_;31Up~wYVEd)bZe0c8#cR=bBnZ@AY14c6ZdAX;(fpvzbyhdP39@q zfk6kjV7RDc>G7?bAuvN!j^uJL*DSgy!G4fD(m<0o0ELPPzUrC9qm?QdZBj@2H0W~tQvx%OpC57m40 zv`j4DlEa1w>PYpoz!e1OvKF9NC>!0a4i9&OU2vzqfzkF2?Lc(I1IVmk^PVjSA z>%(~1iStoTafpqET}FqTMu)<^G>iy*$`n$V+XQ!fdn!b7R z%h)hM3Q}C6oy6PRWq_vZLELTSK`;dY>lD{7(RPo1wzu2Pcrhb!gnPhOpPmf04{ATi zSHD}C{MRqp+P7%Z3;Mh2@tc;`^kdw1Tl;}Ol0?xjoa|w~U`o)a&7MB~h%);;mLuX< z1mXPXNv=Pw{oK+Um%eQ2{ivOIKxh=IBwEMjJyknJo^f2ap8Nfa}rf4#_2kaJ6h_I~XREI94JSd%v|x!U(=?>jrmMdz^z2v#l@j_cMkA?aI9 zA4Eeep1dSa)(3jMDk@IG9BE+#&=Pv=Gw;^%CXqK4rcE=3z#jfRjlxw9h%_HEd0CGS zE|gVj(RByBn6u5IKt?y&oXR|ICKY@dd$9167JQq~4SLLQvfzznD~yMr7Lb+^Xyi{* zuXCaAmfmb9%e&YUO8h|-McQyCGZvp}6d;x9f|Yq)kDYvn_A}bM1j~Kud)FmC`95cM zl%s_wQDt#M#TdwUm4ph1j!1}VDiG*%3O4k-0&5}90E-hxjV9B{~EH|`{lN;l(MS}|&(XvGe&VuLx2z!FD#r5u3 zc-jYR9PCdudL6UcZQFyP6OlnBXzDbhjrFi|GowIqnn$Qubhddx&FhI)Wwq}thR$(q&GP6TMB??t;8y^6cR$Ru0 zm#`7SLU z{U^Z#aJLAO>xer9PD2tz-!tw)V*1VVU74ss8ZgomnwOzN$V0jq5v`uL zUPZDMXAv@z$E&ChBHYU}FMrINR&Ecz0toz^!fb`3-t>-hs|z|RBX4Iqxw&Im$+hb= z_G~mTrXd3ir>X8kw#G;l-vl@-K3m4k~fE;aVkgZY`y*(TegWjlL!EAfcmC3==rX9BPvYm-42tXDx$PZ6J=< zocx*g6anzj(tR~XO=7kqMS_hzpU+uR<;W;Ss6-@9WyEk-lwf#yp3l*l%FP>{)eVe&*q9u2Tk{gb%y7D6BSATRo$8LB zI@-KR24O4N$clpvM#>Q20B(XrfQ&rU6(=)Db6VSbvqQJv%MTc=i16{y z(?fs+e9^a_d`f>A&fYyjJTX%g31Z4mHJl0p-&5Alo&q3M8-=fREZCK> z&(nTXZB+N&ec_ia6+ai$eCC6s_*&fKYy4FI=Al zW=#qO+{#5(Fv~R+KDTyo7L;s9uF$vg(NDj4gs6^h@i>#QWBt;91;B+ZU z)D+^Hv*kLIx;Q4v-pP(uFA9XfnX4rvKq;_^+PkC0fKE8L#nDY?(i>YBC0r$jrxCAB z&XWubpnos~fo3)(rGh=<>k;w!c5f@BF`m;E)rUMv0_j9w9%h&`eYA7f>C@f;4ANq- z65Y=9yHG}8gcMGpRIN?FXup%nfq^$U>XIiS#goQ^5OxZeiMLVcE@tF;L4D;gHk3ag%z7ixqoh!qg9}J0S}Kqdr7pv_sM_Ou+D_lRwwK zU;BQJw6Dj2h#P2Q?c{1=EtS5X3G;|x8Z8FeQ{TW(UawO?b&^7E=XG&d zSTvSoBFfCU0g=$zIi!3`<*CS`+V;P0wH&hEk>Ev`PPf{|`lqAJ0H#wGxU?i7NEnbc zwOsBOicsu4u~aaddFgKGNl6CPrlFNE3I9yEDD{Rjbc6BGWicE)I;P&za5YHjGl9T? zqyuC_xO`cqclOH3g%-Iq=@Ex>+>hhoj7`J7Bg%w=aX_v^%9Ma`#>?0r*-Q?d)-pR6 zq@>6^!j{1mLnwlBkZYqm8y~?(3Ge|oh{xW5WJ#(X+hTe}6h~z(4bEKI{Gl>wsKu$-4k#BA_yRly2Kf{2Gu90G+ zaEUW*z<1M5eL!WB*S4S}mdz0nRU(&x$7@}ve%AEqsL~4t<+W+e4p&?J%g)>`w zI7ip!Qwca^Z;KQ~5f$^WJVYI-0i5b4LRI3E|CZb&muju9Y5|`e{0>@M7TWvC<%#-X z-_QrojBIVP*Iw8ys$ZD_?Hh#4Lo$o(X!4LI14y9!mHIBBR%GLxpmGEY(A@;^*fYi5 zrGq!<6lsHQ7`NP;(b?79U_f%Zo+L@k4B~DP15ZaI(PP2!85RUZ=8=_^!uuFA37jdR zyAp&C_XevjByW-`cHGtQjg94H2Xd88f)j~5L}wHP6WC*x-L5t(Sfp)Q0RRDn!R`@c z8jz@%LKMXgp_myRzx`Ygma`JqoM==|c1~l!@SPxv0i)PAvoy)E)#NJmi`v)1di%}d zWnu*m6fW>omiV1y#xWJOFNNt9qfkql$Z`O#qD0sZCYM`S9JM|yhg`BYEabrg&Iz@y zr%y`~Nqyc-t(O!#)jL$=Q+|oeU}8fOqR{P4)>X6c51D#t(g}mXzhcSc4eRLJk zGi#HOTZe&$#1eH~tT8AthG&{pEA94ZOILMirnH2^hDXabJq5%%^j~D@a$8tBx?xQE z94;VDFNGh)_Pu17#4RWZ;;gfn0zD}>-iTpajdG)qS=6|@{mab=L@5AkfV4Cba1M~o zAqrzsH5@^e6$4Z=^iIrRH2!`XXaR(tCvAWgGe~`>W^Z6yEt)MKa7VMUY*qbPo)4zI z-Q^;qzQyX?LG9ujv=1#kDZXHhl)y}r(2yk%yP~RWcqQc#J4Lj<7CpbIR8TE&`8l7; z-N&aZcQ`$hIWIZ3grZIHq9^KM`Gu5h#7cmMG>zGInT{n_%#`tnRz3$9Bj%(%$4D~a zgUN7X#%D`?Ul8DuYc+B3z@$j00FH`d#|`FD_<2YhUHJwpFQ7xkzexPq4nxEM3eX&n zWSIDKJh93k+0dK4ZWgr@C~43GD{B?2&3rYZq0)eL&b7+T${Pp_(g>iHr3FK}76{_O zM*7UWz|Tp3QLFmE1B)yqHrXnyP;zGB_zz&1A3C-aGNk zRF4z85ySPNHB>@=RZ`xJFDSmrB@0*LNTeCr5A6*)sr zw#r{!^8}{=;fa)2sA7osh^sMniS=-E=q`fEBo5GM0j}i(4Tft=X z*6i>w>khKzM5{`z#GlK{27Nh=gyeN|y>P+FY4JhnlErl22!~LL_(%P_F8XxlS%CW( z(1)cnns`1q`%$q%^O`uXpq9Kc^mZVo)*7h+9v9V+$RMhAwp;oB&PZ#y{eG#tgreyD z8=*Wew5OLIUwWM&A(1qqXVwPtMV7W)YQY>?g!IJ++xt(nxms*Ze zb^ssAXJ{YDCQbol#V4uBMiuqS-Nih%+l!}+R+qu=B4J|ST96P?mIm)WPwVJ{4@ODrzDMM1>$Z25krXam*!vYo)*ZSIO$QmXeYf z;zG_MG2T!|ppe2+WMNp%LY_LiR3TqIK-1L+i><%)vYZIzajE{n`k!SL1*^p!q+eN> zkC>H!u4V7C(@Dog?UvvzEaMKwOBy3=J^W5-MGnbzkdcu=^FNp89+ql>@pE>YV6-S0W3K`K2?+*X5r=yhgkw(iijan7p#s4y9YUDoZiZa3 zf!ImGg0wf0kz1^0=5XrAogdc$ZAT%($906SvKmgh0l78pNhu!|vmKgL$Y*1DLhvc&Mv z3`fEnyw_MO*t2$rt}Hr%+*lE~ndYDKg`{EHgmR4^(dq`J;C#R#C7N+sXIolcx*yct z(yY!@PLV%{uBZVfYf#6-z+BYEsyAFccW_U(RIMFqsLGi}*y^nk;?{~#9zlda+Qc0O zrGZz)Vd(lB2`mUh5GRP{SBgFVtuhE<#6GAxBQ!Q^i z_6o8NiP!569z4H1O{4J5-JKa=9XbWm&V#$l>(c7-wv!X>jTiOPz? z>!<;t3$X_Rfg=q#PZmL$UIZods2bLXfB=Kz133ia2jiX$aDwj?7XoL5#3aXsnQZ2C z;tA6 zg|}pJcE}>(|9&9i*T3jwq$L#oAgi&w4KXa^jbQ)NV_l9^fg4k%K08vEKT`zbZ>i%i z0?Sh$f8O#y8;oHK4#%^jV!6e9F2ms1d?Z=!hW+^L*i8TEGebTi+&Lpbj)!IZ~mPJPT9SSwaTK$3FYl*dAveR6kWQe(U+=<}XmOF7{pyX6;_W zF6xYU1j6~r`6w0iwC%f#4SL#0iu7pACQ_#XTel|ba~BR_$knmXfJ}+`Ned7N5JH6| zMw`NG=u@GjgVzy`3?1}%0fUA&UoBw6#Tmh*lP3d+-{`DQ%szbs^jc$C@J@ZJ2@NQg z0M=t-1}&wvOS8reEHf^d2ND{uiqm7*7mN)^QKRAAO?r-VpDBUz*|bM;ihyVrkj1wb z?PjkH$dhf&5Cp=oaPLybpRbOcz=sk@;z=sI^zx1QT1?lZQH;z&&;&F@^%IkYmjsNO zgUN{}(_veJ82a@z&^}0_*0d75eswr|aZbQX?%A@DCwdRYj zlY2D&OR^f31u7`_tK_L@6(OcP6q`I1hk=`rXVh*VZI9#LFWWPvlQm_GHcPQam-RK^rC?sJFCnnzX1-@HVs)vB{IA zP=g>RjvWiz-oRC)ia}H=uNuWPc4J=m%Qkohatk25D2AebnAa4#mYk{V(~EI#V2k(L z;Eq{XFb&(<$BS{Z5jlgFl^>*|^KcMzE|lBH)3Ahw&&nt&F&N70?K6i8fVrj(!bV2p zlT2ceKTu*L+DK!xHU^dBHN%MX7WI0lHko7<)6@i?!vLT=jxCut+P}!k0}6wiUMrL_ zzX?L{@8UInyDDiS<64?^TZ4$7t*eAypM3I+O3Fy5o+FV=i9;ZZQn41Nly;Ob_gKh^ z=Wkh*fyy+pmUZr2y+xLisF`_Rx#G|QuR;??YL1%R1mT2?Kk(3J4Ki^` zN+>ovC(N=y0)A*XAe?2^77HG<9Gd_d_F&nxwBk7I1egcGyJ8)v@kG>?fngWE#S|f3 zPqtFYYzKC@vK(io1rL)AYBT8Iu7Awx=8!uCQ_2dY8@mKAMtZJf!w#~_m;4p=iN$$BAqH@Np? z{8v)B*+z=b+AH_Wve5uIl0d8I#*o!`_$<$W82v?7?R}gP@BxdYoA}ZWYqLeL$(qd< zY9ESt9a}9a&+_|iXNiC%UX%`I>D7nTZ&N?Z)6J)}LTzyt*Lpp|%Tu>+ci|hk8Ie_Wc&QxC* zIRBy@)3=SIL~#ljc@15j-U32pj!&2;aDs^am(>8iz}T(uR)Z*4a&I`j1cp*NnN7G z93pr)(9bxChG$<|z{+OTS}UfCcZf-=JtbwlltN3HB+}mj;W)OZOFuXxCo~}G?ndv| z{}RD|CWvV5QJr2R`sgG&(6l|#ZvDBB|25;Jk=ipS?^XEJg(67zy?PwluDj6QoSpe;_j#5nHR>{P9Udjki@qL=Qo z2t|!u*WYukKChlLTEZnJ8=E!a;kUYnovN8in-m6b7<@1y==iFBNP|oe?Z6Oy= zR`tKnEdSrtHB|-xfgb4%OLIpoz)yFL(*=R$y0e**x z?mg;>k{U-pra$1iS?$0JP#UVD}YeyjG9Xa z&Bof^%U83=M9t`JJ=#YTawB4RI4+%;7%ln|`C|Yj(>Ir{_n6#8D@TIoXz4knyNxNm zxMagnQ+zgDL(myTkY)74!5|Lh5#Irz6`;n;y}V;Xh6y%C;2Sa>6wGP9nnX0vt zoL~%T;r7x>Yx+#(=4;{;z+K0gRE{R0*ZGtQYxluD_xH^yl>>eE&gqT22a=Vb(CcS! zcxshKV<4UT2P+rpb&36%A9YOfgL#`^*1@;7Mt$(1&U9lVjS6zaZ#|KS_H|1w(tdA2 z-9_oRwkC7+@p9ks*@xr%ixmO&cb19K&Xr?Y%E|m1 zgBixb0H5Q~CPb|f^1OhmEm8+>f;JIrGpUQjf&*oM6_JQ%H*-P|wo&7bX>KJ1l9K{- zAaI@pa9BiAf_J#k6Ld<-7IbsGox#{LgEydVMjX`7`;Z_3s)k6Bzn}BMYia%funUPc zy*&a?fpHO!o;;sGTmaE}Zh?MSG7_ZY?9BM1rRfVI#%U(yO~|@{YPw=s$OcH@9K%aN z5)h_h9ErFI92LJ|k(n{40w4V^fX6_$1a`{Jg8nfRYp5Xb?M7?Ov>;u~!GYC(l7@pn zq#!`+IosgiY_uVkmq_X*!Yf&s)1&{a4dK(f5Nb7GdGMuWOP#*qHm@7EPKE6A4?@O& z+J_L6@9>`wu^u}MvAWcoptpHZXMz=aFYHX9j>PGToc`+WgoNe+^Rzv|S&^Ber-7Ex zSQ2PSD%JY*R)t_bcu}iDILVmHh$Z@~+7&o;-+c0zMpKJE*GXi^sr#&h?fqQf4!^B^ zM@`=^U~aV)(C*s=ZQpj_Vrkh8^_j~S*podV8$oTGTT3I`@T}!Uc3hq3Qp+;`;Z*ZM zBsf8l(!~cEA#>hI4ZDtaKl$QM>w^j7Me*WB7_&k8@{`TD?hZ0kHPo(A+CNtv#mQ)xsC|$4oa8HY0G?TOBf-kkW4x zAGeZ$6fhC%(@TfipXkyo7AXwYQzzf9{fPdzrCbBn2GaoOQuI&cc^2y--c#ctN-hyJ z4@n$IA6?THX|W3Gs{IV~ScI-VLvE4V37t=qd&=nG`)FUuQ0kD=KZOw=z`tzz=ytnc zCtk@E7ne3y$>bU3_DXvIB$ebo0DI^SDeQ6R;iJU-#c4C4Cn-&FY-R9zkC{Uu<^$$y znyr1edKFn;{;}q$6AVhVooN<*e#bLQz+df!+n}uh5@iR68y;W^e>mH|@0C}lS2rwc zu|k4Z{yD}{ME$kd@Wyg{bYT;aqR)Zsbh>#CYl3cG-kI%toSIK8<=V%zFK43NJtT6T zKQ)h!kf$=eW%aya7n!4Y$c)#{;FEQhhUaRXykf{C?9+1W!Tdk?D`_$Zvuc+k0W>j8 z>u_;*T$B}%L@52Xy5&KdN4}e+QI_Hv2bgk7A7&$%c8cSjFriE_-8o$IhrLucdQ(4H z(>uRH4bvYryq41^urut+(5A_|DP1%oFT=B*GRx7<+~)FZK@dQ30$qW{)2O;$q7B-e z3#8l@BOwTv50|#nzx-<*u)i zyNtis6XvUDPTr{fFVq>XEd8COrF~>^Ao0@aE+^5f^zrOaM5MYE~-`UL# zVcrD)N4*rESk5joS1>3DVmJ^OnE0i%EVtk}`BKIpF)NLh_Ab+d@N22^6Y7i$4xJp= z2euLMx=h9>HQm<&-GtPzxX`vLr$x9_(Z%2#3|dl504d+QqvQA=02D<~$P6W1_GvB%Q;zclY8wo-P0tPt zFZkFXw`hUN1&i7_c@I=9UrfaOO)R2goM<+U zI~p@~-mLvB=?i!wUaIL?hEtr1y0*Nm2n!|4M7f8bvd;4t^+L;{sT-tXT(?3KOG(E2 zMV-*!@DiB`yk9BAuyiDR`%y3$(Vx?X`#z-op6^bI`qLYvjTO?mFYJ#tga4-XXua9* zLxCkORQv9BHuD&_8Iu`i*-~qxEfs@pBl`5V>GkT= zEAqJ~4{CovgD7X|gR=RYR|;Xu)suJVpGTYjTnE^x*6Akz3Z3#<$tF~MR%}AGHHGEs zllp)tSXi!X>oloO}aEcJUI#uR=9n;*!Hx=S8^Og>8< z%V&L3KC9mRfQC;u|0nkZG%Wlg?~{A=udeU?1Sa9+!#w*X+Ba~V38g#wg8jrWI>c4% zd^uv~wcj;Wei?-i6#=6vpUz2A>(Aj_8DMTWx)s(KqH%ndx=7hHMHP>m|8Eph1jj5O`@qlH6{dUkr}{ z|4=c6@{&l0$h+_t&)s|>(@0G}!XgOY$gi-RHD`!z{Fz!XdG?pof(erd3+Bs$33lk; zs%ND~pJz2`G?!=J4+OpikA%SBZ@I;%tugjOd}X_~xa{m*ytw~%7}1~J@_4J2S$tYm zSeZ1+&-u)-L*IYu%SuJRt{Uhc_zbW@r_z9b2u1z1S{h1n(h%@f>RIS=MMfVLrIwa` z8TLF!PV(%Z{im~Mzgx+(e)f~Ua`x=6>z8lc`=`GzvX`Fk`d?G-u>so=&pvYUPGR(7 z3lX5O(T%766VIxCF+t<&|FHfWAUXj@dGZGB-9U9#pal4vtdm5AwW>40YN1?U<$s{_ ztP)Ks&I140ks2aT{r3`uJ+B7;KX>l|C|P#achd4^Q~O3s$NySoI}Uy>7G0z zjYblqh!R0ULSZln35)`Z024$o*dSm9D1k6R0t>JK0VeHYz%23t0^`LCvOx<1feFH9 zo`2uD^oY&uCY^->^4(;Nj49GBkfDlQO6`MsIxf$a zMX6Gy8N5<%O7E1fl%G5z%b=brQOx?lww0EWpM~;&3Q=1$7V~p{lgInj89&i*D9Ovu zlrQ=9U?}}FI_+PyHG!xKlnya9;U1EJagYWTMhBqeG{L48ylB;L0*^1VNJ0)8)g8j4 z8cj1)U`>;1t(Miire(BfuP6*Bv+>?(O7%!8kaq?h4+vb(q-6~}DON)Ab3S!g{-QKQ z;;m4%r%1d4><@{BUo_|pX6%JTjm!@6X)VuB8K%I|ZvvK;3RD0}*R#D*2M0_NjSLjh zpq%lg1-Xe7kZ!*r3+O@udA z=Q8MmGMltfPL|z9M6RqFFOpioJH}1D16YQ4YM)){R35rY?UjK~x!-Z$OMSQjo$q*y zU}{YIPbCkg`=pHzXKGasw^>fLN-B8TmYt%qg<{l9wT|;SL*pAxc6fB*?u*G>BaY+R z?!~izQ=_33LYmR2s2lc(rg;l?(&g^0jv3TIE(O`!NTVhQZxps5F7@3s?)36@SYvi% zG$hZ$7(u1mKAV2L(F?4XXV!gi|B&?dt^G%X-!wr}0;MRrDG z1Fc3(auQ9+_+bNQ&`+Te;|R1mDc&Oig;5)gg-Eu2^v@KM)pN--a;e5tboJbamfAJH zt3$8y%_cfs0aT6IbK)LJQ9^F)Hn!m-@ve@gtld#-cdX)$g0?W%UU$tL9N%l;Q~^^V zUi6jNSA$0)U-`^i(&fsa*<@&CI-O8JwA1Q-sdo*eD!m}~ybAn^L;FbRtNn|8fUoQ> zX7GhaUF{v>t7?>S`2Dq&b^T85A%4e);C=xqUY>6{n?Rt> zmXl}z@)z8Lg4BJPM-4 zF23M=K0jo{gbnG_m{va?&#&*}l9K47VNnWub!~e04s$!w{l;-9NA?@HuMj@X{U&{| z$H)XxX{~63fIlDK_hRYFWIoFhsEGFB<@tRYBv0n|eH@ZG?h%gT=U4Fcv2v2&yDUK! zyH9CjF_0Pilw^~XSoWm&Dw|s#ke8z=D689=wk;&XEtSxXPU2VBjx9Stp}AgnI=a;sVM?|RnL`rT!0tYtIu8s|aIcu=*q)^mp) zbdoI$v0yDAact9&39`bn7A(5|i+Zc8-A`$@INM=PB!e6iQn91oIeMK6%wI|rcoK3W zKe=5qsz%zMXwQcjFvFlBDsfgx!$Vn$s7{c^9xaltK1$?%EetazFxaqBY9)7kZX#ok ziF0bOc{S+RqlC{`x=*l+fVNt1X=1e`W^Nz7Ui-I~a~@dA!O>sv_-9o*i1u~pm^UaL z^9&}h->E+z$~u88GE}k;RiH$DyrY>dKp#(0-R$#OY5Ex>E_fBcqb{fhAVY3!bqRWT z2qRZ|lWHzUHaw5crqjIT)BSE{)Y&SKy`ieA1rWF+-StDfCd=2N^M@Qru{)Z_o*#d*`0?dCfa6M%Ks< z&Yq7LWhh2Nh*WDyfP(m^l?G{p*H)eh;jBa~j2m&0h($zmayynomZtMO9o7y(sZk?w z3zPyV1!$I15>b<4k|vHRa-@JgoYKmgLAg|ikxKn{LNRRCMjtT2xSCeRsj!!FIo!JzLjjjt{FZ+@2 zHQS#pcj^ULBZh|o7`dn&2$QJeqxDD;0u@2KhEewgi9l~Wso379HXzhkH4?-J7f(6b z`zO!cGM4qcRW+xZtJFMNxE4DWKSY79IyE{ zRRW1>NJ^bm7(BT7LvHJ7BPd>@jkyn8SgG{<->BHGtTifj3=YB@F5K+su`m-fx5y&#t)?>1c{_Df~BoCSSNHH zfyWk;hSQ4O-PG>WTukdNp=-T$IEuzWyt(SZ64nHh#K|^D$uZ1Foai?KflMg)(dqyc%#Y^VXzoQo0b93)T)^m;L#L(~+unc&%p zV=Yh8Z8$9Gw9XfM;q2kRr!dqGSQhCd@E9NQiI_BPlm<;r8}2~1L^7eUI-0~C%9ybD>8NBGQK(&Ccq-nPIL`SL&p zEEu8bZ*Btmcxnv_cbFCIi_4Sy;CwR16WbWhMkY#6+VPTGCzJcSjR@a=kyHgFHWDY_ zivs>Z?R!ai3wEC@`SGf=9d=dpkueurkVQ~?LG2j1D054;PS%$kLTUeqKuQl|x-GM| zQ+XBV^C3DP2%wmcvvM$d7z(0rCCL6H1iPWrhLXMw4O)YKq3rB>l@L0ynu9Q<7pdwd zv(Ro&IvfW=Xn?Osb2sSRuO@BBIb3x5Zn(Q2x9I}ob9=74x-qJSPE^9%7c76iu|W$N{qw;_^Dty0^Jz0gA6xhSU&VK=nc}Z03tD4HO7M4`bgm9cAV#A4df=WAa>ZBi&Wk!dx+=e`Ox|6%2%tOPr=p#-z+nmcsCs?Z6+4n zFl#};#1sQG6qY&lkSWKqyFoYv^Fc-{sR%*sHLY>hYM9C~?Ov`Nn6=mDfeZ!l`%2gYLgLP+^4m!y+fv5;rg}0|4-ycv<%9ezZGxnE<^aB! zRQVWHZpEe0&(MU#e&mR7%?Mw5-$KahFs$skC`*{v;Xa^+l2B&$9o?SqHp5;DE}IS- zYafNDX~}Fc0Ov3m3_@Tf$g23ji9jrsj7bce37{*qHZjeQ$);%#6Uw5Alx4UC+YS

e}hw=YbLK<`Ab)nja(dU4w&G(FL>w8x-nM`stZQ!&UY09yf6 z#N*b=cIXd+WNn3lB6&u4sTke{fPpTLm>!qBSs5AzRC?j6MWo@B3~*@;vb+?1Q7R3N2{PwRc#Hg} zJwpoDG>6jlgHm^rX)Jj#sPw8puu8u$gts&s)PN46q74595D9^B=$JzjxJ^L?qobCY zb{JnEs_awdWEKtBNHvMR5>R&$crh}uhTfhGu{m|Hnu>1jWS-r0m)CJm0*=ynd5k)y z#jDnclMAyBf1P;i8W#KBAm~yOtiNWdOcGKNA|Ju z?q$njB+ETI-_62!CEHEyW_hL39Oc$0H6{U=xGBm|NZh81SlVaFY$+XSP<8;hFw69U zkXyQG`6P1JfSfRJ$>gMB$EL`SO2vb}z!V+Fd9D11)E}GVMekYhzN4+5!dE z7_R`NhaZohu3;J7g`m}Jwiq@-5VYr!kF|WewK2pa3PB@k}{#0Y_-O> zWnK&vM%WZV{Wz`dowE?le74OUsumQ1MpEbG(@R>3;5Gm;SDLFz^k z)bk-rNoc{;o|Xsu2TZ~f>(ZGE#w@H3b$EIWVdkSrypy&zMv1odtY4{BDMK)?meic- zY8bChC<)X%`x*1bsEvBv%GY5jXr%eF-%a|5bko(d*q@#|KaGfw7y7)So~@^zLU%s; zZ<51B>ff&R@QX@aAYWWH51| zA3Ynt2E0q)*D!n*L`l{{x^Ne;l-gibIJgGk!d(|L!^(rO8|9~)S}|H2SO`0+w}SBO zowsr*pM3OPpwWFXk(uyJ%9c<%YObc#_noglSCFHYAp%biR)tC3T$tjwF~J5P4gQT??Z?pykiU|jr5D=qyZXj(ME$g*KvRq9f$5zB;%!AH-zcTlLN zm-*8?E=vxo%zQI%Nn<`p%;;-~V_Gzi>6lG0Zje(!{}ABmARx#{ zvy>_##z{b@bkp+-qqDtwJ0ikOXAqX7*O~0F77#@SaLX-s+(u|dbR}fPKEohOTNC~? z<{H!q3`%?0srq9YZ!iQH$jBqo8dcq%0KPaWr9;0LC5HzoF*DkfLM=VX?0T$qNZB%BhTg z`i-^(saC_tipcd~%Zdge`aNrg_!wyUsuKa^Q8f!umTX3Md6@%9b{fDj=y`zIs>6N< zp)>q-T_*UeRz?FD9V8FHXpoF@1d9tI5Y7l%>Q41q20%?e>859HIUNHzfUt4cTdui! z>Qu%sfh|FYdw5|_Ms@KP`BQ*qBxlp;99f*Y10Q;91>K-Hm2ic1W)s%-Rvl`J^+6|G z+?ojIGz;=+IO+E?By-=%ZZDPju?$s%fv7Sht8RJ0Q{st8*os19(|#$aHyHwVYn`291uO2T0Kzx~c^>ueR2{{r1y+0u+j+X0ms% zy@+D@9*{7wHXy+_ai$kubf29G3@yrz;a1fU~-m0T=9BtIyhOozL+# zWn#%$O!7tp| z5F}QzfckJ{T(9+UF@PBWmqB}0eK>#wC?%0Zvq3-=yskg|jye!;Nh7}Z8Ba{oT%g2J zy-c(>nh*jz%?tvnsxxG-xpvsmXto4ZLg0P|7l(E6dY@YvXn&{*nQvD62Twu!kpA>a zKq>QBD(nsdIG>Wy$ zMXm3rEDGSmiHdne)DUUDB>e1dhIUUVj98o{Fy897>O9Y_MY}A4lEKQ6d zwA-h4X;fGk0$<4|0P9+87EA$pz*bETo^YxV{SPj%YsA9P`nFlaO(Lxd_6rx`$q z*lcU|#_0~GYSuHO8kOLDvfOKR9kC=@&^mn4#_E0NR_KPsT-kxH!zt@|0Hm^u{s~}4 z|F8ZKjT>J@_U%MU^E=0?2Z0zATa;*yeHE!XKI#q0%FURXY`K#&s5V=9e6ci$_T3KiAOVv@CeG61o2$r zxS94^dewHZBZf$pWCW)gGg0ox9n3PBAIb8_0%7l`vQCoi{7w`SZY|kKuo5}DaL1C7 zB;#1sf`h}r1M{Ccj%PZ{Q$RRLg@@rXU$gEvqFDq5@r2Bw4lJ}KL>YaG$i-k)Uif4|N!$#Wh;09r>t@9V#bS~)*F!7QWnQTL5M-)RCLRa_N zsV)gA&(&oztAz*UrDI><0TV5;`z}}u5v@q(m^Wy}t@kcQV=r73)(dbtp^mbv`2(j& zQ$#MH_GENxlQ-OLFE0tKW_`iz_wjQnd*sX);9wBZVh1uW_3TAw`N2<{apuQ&oQi8Q zeDVxhLtm|ZF@{c>A$2-_|4ac|JzE<4>s&vpDk4w|H#cPbI=5w0q$T;hQZypexr_=W zXN6&f(3D0ifw7bcoX%#4g?x%CL|lbuB@=Vyr-_gynu6)!D%>e2jxC^oJhTrE{-c6U zk;KEgDby)2?ehdP0OnLP;+$C&1Oc;e08Ce}e~yBQa(4R@L7`fK8=J`RN(iccr$nFv z8jp?%8!}K5gjd5w1z`qSRLUgXqa#IOt$=1yP*Fy`1u}jK6jjZ^iHg=Q?ai|S$ z9V&RIu)2dAuCSvR5I6yjYEqmO+$bjtEU*%*L7yFdFHm^TVG5cCa#ld(Rj!BniFomg z6<|0^SXv4mvM-DO3BDwt=Q^ikb^feBJYcFpM-G#_;%zu(xP$i6v8FxIS;0bEKfOE6R z3?-er_b$9hDFO2_z%7x=X|QSO#o;kdkl|w;oz@+#+4&yhaF{ZGjp)JPFq2fr(WNG> zw>FlX1c(GaA+fuF8&>YAwDsFSOeId2;t~p7HZVHm_(IET=LrcTk8zQ4FQ?-vKjm>H zN>N_NnQgX(k`iUm@;NyP#}CR=6iMY{M_by5s|j8p6Ukf%7AI89Q7*?A*7~I3q9Fo6 zlB@da`2{Ngl9BAJBn5%$Vbm4Hv3BMbd?9EU6xFgcv*Ndg18;C~+3qkp1o|!{w35@7 z00u-b4dP7Zx|kTk0&i}z3$c>$N(QZ!3>YIOebc>zP1+PEPdOc|^8rMXjO>vix2gNw zerZS1#A0gKkS?5R_*@I&;(bj(jv7IF$L(pI3-b-ouz0Jff_1Ww?=KVAQqPiLof3lB zb80dCEN`+6#Xmj3ZmL{J&Lc{SKD?09%2g)4l(hFS`=b7l^S7GKgyBE@83G%NF~}*H zCA4B1cBiQOvm_q@((R=I2!I5W)aorALQG+(hXqa;B@L!L_2KP924{tqx{z*70NxN9 zT{Q4dv1{^;to`7kWLv3I?rzH5Et@--GLC>)Z3h&wo~;oG&BDYj?!(cEw$5asO9%u4cp9yyCpmGdA6 z@OTbi1SQGUD-Wo=Y6Rb5LlVPa34rOzq2YYE6s&p+v}t?Am_!$JKOlT?NgSw103f8K zLa&dMlUn;tc8dWgR-dXQHDmS~rR1$mx3$p%081Vr1eD|7(CkqkrtDw?YA*K@Z{4?jrTP;YH?K=NF{tW4i^3US3 zO9H8Um+aJBE5e-ibj~7L4W2Vt=K~m@lf)bN0q9~-oWXcO&+pROYDnV<%<8~HIxSAU z157<$JaZDA@d!q}w3X@6dScT@17&JNqY^qH*x@p0^YlpA7*Li=vpV@478S;-fS}cU z6-`^kN}OVO=_@6^7I)vOcQ$ivHaZ+r`_h^8Yi=$Dj`Kb|V2`m|Dz}qp<^EM;SPR=s z%tBCCH^`};I=AoByHm5~W?A>?Y9?ns3+|i+D!^B6C z)vX&N*K0YGLyx|FdOG+Eq~Kvlg8Ie)NC0TU-txxO47E!pw&XBQn_(jtU|Q0K@x6buU8G&PN%7keWRK@dyhI=FRV1RH!+lpRiCT%!!av!5*)L}{3;8> zDsk}CnoH|SxqMQqkXL9a>9U^D%j>Pp{!%+~siFF`#MaClNdRIqo%-%@2;MOh6ZM7I zTcFoXHR7T+-6le|&p$Bjj_vgHYG0yO&CHx^lmbSY*7A|-OsIAdxmo7IMk~2Br;==w z9>m8N&H41Bw*Yqb)za8BQD0E$0Ey|T!YXwk+l^$9+TuhNN`uVp5qnrRu-c?t715|f zPNI9c;lz{@ppl@|xg|{1Y$ig$!i&hRfo?4Y z7N}LoxYIL|3dK1@DiI}s4d&CyT6$3w7(oZsV*!>9Uz$|*t>ER9U5QV#!(C~gpxiHx zpWp6y(9i-vDu2?qvtVO)T^KU64Jkwt@laj2f~DoCnB-2|Q|hN7=nu45ZJjxsVYz%% z6R7K}%#jnEAitMZ7P0MLB;b07Dp-@Kf@3bSR0de(J|sYwByxHF%Z*Szo#W}L+m1L; zBHYs06Of4M!7Q;$#1-J*DK}Q)FPuiOc$)EB1cMlv9U&!2M<2kPS`x-XKsaq*j0ynW z9-}7Iv=WL@CT*)0xm$RUJs-Sh0(9oh3HxWjopTOo!XYl_TE~lxU>5Pd=Ef2!UT<@` zeb{y;vz{;<8?diMjc{w5z#67xJ|9-3W$~XRmC1n#?4_qI&yiqJ%Cqei&J!5r6n4Fu zJ%zE_DL|aQHLX$<^GLXV4(;<_f~GB9d^R4ts{F~Fxp7vwNJS z$HX%tgwnmp)1xMkoa074exTu@+s^da$`TE8GO6(4w`+E@0_^ zoKPrEbO`aBzpu}1APIUd*UjmH4ED#zlt7yi0R=ss|Lb%DYN}ToWF;(S2EQ2 z6(26sPKFSh*3YW2zSNVp61C=tya}ouKt95Yjhu+BI z)Wv{*fH^NlR0huIJb)0O(dctztc})1@rvvaKlKV_2aO zt@_iwVG=K-G<}8BUIc+xP0N}||3{V{SjLhWfkSgEyF6E|+63Z?C%a zO5Dn))c!4Q=#k-vMa>m8OY+6+C0QHsV4SG|DNR2<`OoLn3$JxV~L38H-(F! z{S&fFk`&Wv=jOXoFrxfY^+Vt84C+~zIS^2%psSLu2*Yk|6;#CxuwZ2%y5?-0ZnYV3 zppcGr@sb>@0p`{kK!JWfn5vEOg5~e`x(Cp1lD}>F-u|uU*95(qCibNaP$5Qv@H=au zI!6mk|1+RMU8<%vBY!;cId0*~GKjMpVDadwM9ZI7c~EB0C=w_`sjjL# zPjcbqiDF-=i&crnT+SNLNvi_?jzlg5h$mv=j$gflRWs5~hc2EN!cf8_O&CL)#9njC zPzunXhf}?ze{Rki+AB#zp*a+fu%sOwEQ?}Knx63k#Km6Cz3||3R*F+g%QJAi$o+1O z$9ER_F<+?VE3|MLK<0#@)0W~3HLqkGP0Sd0>oa$ZJhE_KUCFe+(=+!Z<{N*<)Yr?}@0Se8-zpx@<(U za??N+Z+ADphZKg|Iomh=ZzIXs&UkKPQ4es@JY>!8tlbZ1sNODwA(KIwA znC6s(>|!2+h)#s6%Oqw5ejt4pjqKbV3%9;zxoB}T!osFX*&~tAn5|74C}VSp+(S*z zVybt;*e=2gCLLDoV7TNgIL_2-Q_m*9#B`Zobm9qF0$i~H3Ev=U0w@J7UzP3imZSd; zCc+w%pOPbzYZk3@GKsr=g7L*O;$R$0NhUkt)$=KcsOk$2v^9=f;y=plrY{bZc>zh?fkAn_ES0v;pFPbqDEEM?baXUmEl_ zqfSU3HmlQf2<2BC!o6Xvw2Lm)d&6usHqW2U1|v$g+nYf?;)-5XLGS7b3HLcc^e*;< zWP7<8$eZC$WOngvs(EwZuWx;dOM zVNHf%dv7KLJ)4O`EEP6!$!kC`FScMsX5hjJjCxy-GjajY8yWUeR*Z4L5Qf#WU1}dB zp{gxGQ-Q=SYSXQ$C0)O{KQX48i}mVwc|cMZnl{O4ak;pW=p|CE_)omibw!nYJ+}EH zdRtNPa)v}2h)x`s4Gs;0;>PcyVX!&VY>P6j=m|+E%A>cadRyt%@F=npks&V;@L#qz zu_JCiy8rg1Q}1~j>wW{^V^CtewT+eSUL$U|Hu#DoFj2D%7n`QVtn2u@d+vs?ONJ@r zsb({!XQQ`8HfV9&y_c3T7p@i4?I-QM1dt>Q743y&)>^HiM+XgI6(I;QzLXLo%Do;3 z0v%hQF8Fa0hj|156G`s6z2*}H{Wy!`0V-|DHpqqt;Bav^XhWyDz|K!72Mo^o0b z6LYLTM5ss$nQ=r^CP?njQyg+c9$D)8 z&79G2Qu4ELG9hh7=*^1mck?K)q_4&5TE2%3Q|&Y(mo$20`+Kj>a8YN<0&p< zt+9P(ODqTksN~k#eli}7;!#WhLvJ^_qtfAXXP@>Q-x4uYEga?mB>3084n_k z?*S5P!9{BuAWE{l)8-X`rDms6XW=VJg!`99jN>nCcVs61m6crkUA+TU7l0IH>5fZ2KoTc6QI~S@Wt%#e zFV`)wAZq9H%QibhvV%$j7~Im7@VH-{@e~KG#9JjjCO+};+eA{bt@6Jgu4TTEA`xZc zzo86Mpl2zQSiQ+4gtQX>9jGPWC&_FZOY1?y*S)k_XzK;}m^^gT01wP+x5!Ovou%cc z#%T+X)NZnWMtYI)!Q5hf!=x>fMF?rHgDGIZ*rt=Fa07N0ms{DYVRl_lp#B?8fMXcD zr=yc^<1u50SC^0AeXV&dv_Aj`!Vzl)$)p`Jw>R#RDKwHiUgyimm^|Q~)S0$^J9W7W_DEv(M~*>J3RV52Kpu3c)4^46dNjZkeF2} z(8zXI&a%k!urKgz)Ps-~0xU&@{BeIc#aO*kv>a=mnoW`7p)wK&e2CoC7Y7u$|IB|1PLt`JMJ_bHK>FLqdw0NHyS?⁣YsmL8P*_#Bp@Rnl^Sdg04 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%0AMS0`Kr>>-yS$Az>iYugs-$EZ{VKvR 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 diff --git a/src/PdfEditorApp/Assets/Fonts/Cinzel.ttf b/src/PdfEditorApp/Assets/Fonts/Cinzel.ttf deleted file mode 100644 index d218a0b9c8879fd5a708872cc0ef357e507b35ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 125468 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

j|ZQ__GM1U>X3aQ2SOeVc{b#7XnN@M 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%0D0MJewm9X1tFt-o%jrLk{8p0JxC>cKj{r+{)pA zB_GEBj~pRN{!vo9lOu}~KEhkaI1=E>cR4@C5z;azDRV!m{fNT>e~y#?r#J%O(E#V4 zaRh+K(>#5K!vU|J<=sJ!B>43U^8YK29PsRAO7SX31YM2a^YxP)x!~O&IRB9&3;cVN zvb@C+2M<%69q=&8ft-dTKsq^Gi#c-WktY!@I1*Cmi;Qv_5Eob{6tZE3sa0rNg`=Zz z%u+aJC>%2tjzNWEQn4wj*c1huRsriZ98s`gE$53k;$Uzux-=rq3@OB|!aAYwwF+OE zD}9vm2z-O!*JpTFB%4umFCOIlW%EBt=j$9%TIn}P=V6X0?e&}Zzr_*NTCwQ2d>g;i zjf^kf!7nvr&G$H>NJby!{5VGx?Uo;K{#TAD`Yk^s&XXKbtq)7ErIjr_2j>0iU+gt~3uII=?`)32ScriynTWcIWpi6+-r5qvJ?Yn3V0y{@x z=g=~b68=>VhZg!Z{6FVNXbBzqpkI>muQ@X4i+)4;FLGp|+w)t_FL7kiH@!mpdyOMX zAN42FAL0m02ZUeRp));UEQL`>VH8prg|xOKw%nF0yri#o z+o9EVx#cON~6o1UEIZN@X4+-2%n zcrX^+j6hRNq_<*+P4H|r7<3uoJhKb*y-YCeQgqL5^isK*G2PAU5ig~Cy(f=pxg=F7 zlcZ4NU03iOxu^A6S7$urg~*O|YwZ$^Ct((yL2;4_B)*2U6T-Y=I7Cvaz`Z&gV(qis z=MKkl>;QQ?h|XM(#yn2RMIQs(!?e$QNacFaffmjtj+^}-H-|}Se`V{CtB*j*D9?bWQkdmrmg7dDypWU3$aXv bs8M)2(1XovAtq0R9?S%8ngZXEFY)^?t^Z9{ diff --git a/src/PdfEditorApp/Assets/Fonts/DancingScript.ttf b/src/PdfEditorApp/Assets/Fonts/DancingScript.ttf deleted file mode 100644 index 9f521e7fb357ec9ea9820ebd36a9d7b1f72f2935..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 133636 zcmdSC2b^R@wJ=_FZ|9tI&N-*ase8iC%+AbC4m&%`CN{Adc9&&=B_mlRC_X`gf&tNo z2~{`j z`P%7H?-%Xed~`qaKJqO7Jk)oc zwR!Kh-lHn$+mmo#@VEW@4jq2vROfFI`l$>dtz!SdZTrs@Ty+UN58sgxC<#rY-pQv< zwQf?j{}r+93jje+sxi5bem-;OLsj+Z-|#g&LU#ew<^I8Q>@BCEF7K~Zb(PQ8(3Wa9 z$%VOyK;ZA)@RkSRN%E%Ee?0ik!+*xtAwJZ)k^zj-Fn7hvD1*MaS{0$&5jwvc?$=@K z$JSTSBM800)NmNY8KA&>$$dP+JPsEZV)4h}8xL9^ufEKzAT47+2Igv1!mn2UjDLlC znFxH}iHi8U)o1Vrs?Ra&k%MWiewKLy>R*5o%s!-Nlt{xoh`dY>QZc6LKk*+>h4~sX zGe?n`y%MfBL3uwiGUrr(hyT6$JifB}I_|5!fuF9vf=8>b;!^ctd`a~s{4=1ypQ~@6 zXR6)!%fQJmA(pwc`g8mQyn8P^b6NGn_8qpm}K>j_%ssWUsV5&e_efxNuxB-pbc=gGX*q*dDR!OsQLhY5bePqs{Q~y zT74b;7>UqNkOV!2Fr$FaKSBZg8{|Xhp^MO8pwXHA1IVZ z2%j{UU8qR-hTRThM|kJ|wA6TweF}Ju@LN-1b@08d`dOX<_>b^lz1)b#*>$z=gfIU; zF02zI@SDg<=K+}u%?0KKnHy`$W|(giD287|ZDh_saX01;nLqzSh0MX`LgylxkN;JH zc}nIgov+_OA@=_2t;{a~pZ`vIH=O^A=cp_o^5FkbVVu?HNujca$eZRuWDhCNR9|5Y zH916N(f>rb8-=JGA~LPH{2b&Ek#Vnrj3aW6TwkeO$!8A!WaA!u$KP+jx%)q@b|WZ6 zKH{sY&kz~OmFj6626_G%eE%a{iOj5mOd?lOzEypO`FQO!k)>(}XrrcJ2 zm5Ej#X8fS{o(3KF=jv-~%B%4GpVc>60qC{Ykc52<`gA_piH&GC=#*Z(1r6dLn!s{Y z#+vHo%okCXIfdfPC(tCm3>{`t=q~gs3Ng1KFsRY#P)-Jz8jhGZ;==OJMiH* zQ5M_bnu06ne^MADGJtN(ft_JszJMkfEsV`G)!#DrL*K5bs)4uEOcd^ofer8;&}-X~ zfcY7;dm&2j?gSg)6Hw-=KVr^9KA3gx`@fyTqhN?e-ey(SK3T+Pn%`S##Zbw39 z9F5TuM^|GpTEZ+m&x3Lv8o+m=0Q)3Lpzji!r}`!MBZBKQaJ9qrc>;wi*u~YK)XMMR zdN&keSF&)u7YcnEu5Utl5Xw3z&{p*dC}2-kr=jeDG71H_t9lyB{qVdNuJDfP*PuKK zrT&f^;Pczs{}*kK!2G%ywS&zuhlk-xFnSv4==Ejz{4;tF;TF_R>s8@;FFFP^g@29r zlJ^r_n#&_ZzOZLfnvlxGa)o|F+bklss1EV?pN8w@=mL;iKs_W!Nz{V6(E?gQ$I(fA z5?_mNz<1zJ;qT$!;TIVz6KAqak(p;6X1>XMoB27*V`Z$8)v#99$A;Jhn`ZNlOC0~^ z_=ij9vbY>Bk1OCxxmsOi*J0NkuDe_xaoy|sgzM9;2VGxueaUTbdpvxP#-sO`J%gSV z&$c(1Y8CJxn7B|1wW1!hh&H2h(d`tI+wuMQQT#mq1O6uyVNx|r9s^8%!Xj1xn5Y30 zFB_;~asgm+yG!dbxoj>M#iXT%$(^oy0F#fo9so?f;ClESm~4Fm1T1q3{}pf%0A0Td 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

!d90_QC|Hbb|#<5iX1&% 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%0Dl7E|#7oLe)Zs`F0Op?Xxu#W(W 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

jOW6bh%jMVT2e5}0eMN>M8GuR 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�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 diff --git a/src/PdfEditorApp/Assets/Fonts/GreatVibes.ttf b/src/PdfEditorApp/Assets/Fonts/GreatVibes.ttf deleted file mode 100644 index a1327ff3b862246f1f253639040edcc473e5f3a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 457588 zcmcef4O~>k`p2J{IcLuT3oP%*n+waEu)K@}C@Lr#Bqb>ol^Gcon%%6- z%&fF1t*jQava+JGGPAO>^4_exT`MaqyVuHF%K881?1E_4z4!mQ|37`c&YYQNo@Zvx zoM&Fn?naD={P2%L*3#mV(Y`Oy5HcknB@zcqD<)34<;N>L$dtC5=!%u4Q>GSv_P}`- zGCf>LRAHMqB`tIApD)}?#MVJe?Ys->ngc#)sV9owK;(5|-X$%zsJ92S5aqQZf5(F6 z^Dda1Caxk%SwrMwIj?R>Gt#ZFcNn4hyr#<*1W#CV9Z}5zQWw=X%&)7D|3}MM=#M~t zb^{VTCi&>NhJA`{xS*xAXX^SUT%RBs*x9sbUR^-@Iy2FTbX;$_psuyq<16cB$d~qQ z7uH=cf0ef7Ia2rL5ve}Si>=0G<+lEKOosRENu4b zi=SIE$2ads@)bvrLZ3eP#3&hlmRz^EC+O6E?F;2GD0k!D8zQ`#4< za2?bx=C^1RJs2r35SE-yyJ(;6CKwd&&R*5}}+^zqQwe}4^mZczPdy|@vjgMK&DAQA$l+_Z_~e3 z-_XC6;r|A-;}@>#oqc8Z>bry+exW{D#+Ap>ma|!=|FbuZ@6}JKYxPqybn|t;cyHR7 z;TrvG{+<4Xnu{^h52an-tOV+(Od0wq8U7xkrRPC@x8Bp6&v)rP{4bQr@1am5lyMjH z&bsbR|F4GPnm&7(B8bXhQ`-HFZS`Zy6n9~q_Hvc}1)on|@|qu~NR0g)MWKLy7x6H3 z-AyU~F1%e&Gi2|lF!3CaVSnyCea+*E$vl2P>i4*Q^8XY59@YHD-hTZgSM*N>LM0mY zk=N_=T(wmH{*MqL`gMK0Oo8G*fImoHe+0ctZK4Z(2IT!V;(KUdZ(3it$0gHyEuRlL zcKH^4i-^>3{r`r~b=&mNpA~1pca!%YA?E9^{5$YV$o&68zWyzjTuPQdWHwpE)x_8j zdgp%wo~XC?N8GGm^Sfl|{}hrq{hzq^UmNk>wEiLTd*!68cv!#b3{v#hg&Y34{_1~~ z(?0XGZ~WibSgzm2Khf_O=jng_cTiOQ8~%%a@INAnV))ryepcGEy3YR#{KgN#7yes% z=VDF(N(kf;igw)3-{T#Oiy!rm_(H4@|BQM4QVQ)4zemsIpU@zF9(kPYk5o?zRUX!l zDeq#PxmtgfEug6XQ&v#WIrI~&b=!TCLRl}Rl)_vLV&CXFY$zp5Kgmk<&y94A;@D{z z;u2TdMExb^OR>0)VJ#HtCWy7@d-`1myW;x0Y#w~@8<5L}eIomr=-)Du^rq`yoR0UV z{Rg2p)_^bTcC7f_cJv?6wgi?#!&w~#8dOpYy`*jHS7{ zowoHX`3-A&N_x{+1Mb<`%+^2dpGNPaF94r}{mT0kO7H8(deabwxZ_BddAQ%#>t&GH z4}Qh9#!jIh`oX88pC{`d_2d11aaa0y-GTMOE9f63u2XRlK<>fO}GD18w+f zrMlxDeQAO`5tl#)_t7Pr$-MOA=isArq#bAX_cSxE|3t6j-n~wdu2BD&Ue`ZBJeuCq zUv}rk(5q5L|Ab!De`NJ&rwjjnairn7J)I}7zd!Sug3r2^dd`*BtKSt~fi|A0_kBD= zalnpeBFBg)>;GWi!!P_EpTN!p{hxhYsZV163Dfb+{{hrVv)NoqW>;X$&c!{?-}=XB>J=u{Yx3A zhkKe(?=wLftJ8n^4Gr$J{^OeIkFtNw-G+>S?CJY__SpKQU!EKn;;id4$BawQzaCqs z?V-H>6-&h&mr4;v_wPHo{xL4OM9-yI&CoN@H@Zdy>p})a;!)ndJYnd zv`C5)QDouU{S*H38jL~2YsoaKhG_*vph85jZ>JFYE7VX8nLtr+>yD*Wcr5 zfesz@f<1e3CH=|xBaemNSuWEN$)JfK%*FMg~-ZSiOhh6lC zI)=g|B7pMx+L?rQO~n4>2mP=7uaNspf3L4@*HWnhddnGW{!ENhtl^oDYpn@?^%G0M zI-_r0jd8G0|GP0R`uommtOq4m>Ob*3lxfs|b*-~-e=GDQ#+qNQ?{3!DOSpvw7;|wo zp1Fr9gh!E;*SXgfX&5)3f=g&P_kgaipvzd-VBMId|J}8A#X4Bdr}A0(1U8x>H(8&_ zK1N)wx8)wm)4g6kNp^B`&brS;y(O)vdungpp-1jhWSv){&JwwP=&f&{yS`&lXIWQw z{rc**)?K%$&^HV9lIy@C$YBl7BawCrZIbo=0Zhi;Q1J8sx+)uPew%_P~=)ye>VdL~m&<0i32kEz+ zVWYqP{$l`rO6v^$w;B4YvF~;1HOliq=$!z)E71nnG-O)QZz=A+n}IMA$Ua?#wxaK7 zE&55e@%Q>r%1Mxqz6~+zd`HhL*-u7aK7G0`WuF@N8GVWV+-mfvTo3iOS=Oz$&6C~f z?mG9@$*9k{Y;NnBW$1@q=_haozE|$4*!%ihbQ9(jGy3KYtjj($_JN6P5BzEx=8g`% zn_Z*7!`7nzTlCl24Hz>sK^w-|Ei~-kmU{`ldl>Xgz__o`&u8t}Tb!?7!&aeBrs~hK z%dzg-44ug|13r5`8%WuVV}BAt;|T9aSTxN>IEGoNjQLX?uBBWf@s2VXWm+ zCR;;Sa203Kc927B*c~qTpY>1iJlx5Ne0dz*%}%19?}YA`sTAvgdUgQB&~luiEJvH# z(8lGwf!g^@I*)CjcJ?Rq{ae&X=c6C~-1CLdaGx6~ihiUS7*``$5c=AJc{>YdPzqho z=aLudd<*y0-{9}i0E5HORgC+(hbq`0+RWZY+usFWVr*jG$9zpZ9Q7%tL>cmXp?8=5 z9LDJZT&uV~j~65TCOmte!k4^LkKVv}T0F*og8sKYs$la67PvVX3ucV-z+3Yfk$NFoCaG-vp zD4Rcx@%XcTJ-=7~keAX#jJX-G^DWjsquFTvO8C(T-mHIu^YKr3A>o~|{ymz9cj_2( zr2hl)KoErZ&+a&`b&Mn(Z}W^lnJ@oj80!vYyf-})@u+^+h@!rIU_6t46i8e0Pv-Uh z$q|V1(w3Bwc}Dzmgc7`qrvYwm!1ZT{OS|$G^#_+{{GmPY!FW-RGMoD4gd&dj_v8V@ zIl%apfBH%M)2m-z%f52=htW^6&F()V-Jd?gGjS>E_7n{SfsEn$TU>7g-?+o$2wy>- zAb1}L312xDI4*E3 z*_^O>)aDyEKeYML%};MW`0$jUUOu7!%8k+Kjb2KpVYHDRWn);dt!16)p{=Z& zz0UTsn{}4Sy!X$j% zJ!BUtBI}GEA|+gjRfa3Y%3Njj89lTMJw)iCjW)6=Hmfbb7HW&I+0a92woKblcMmn& zTF^sn=%M>;51@x0wsqOI+jiJ?x_hW1y4u}Ce(0eAeLYl<9y;QvMGr0B9KX3>^NP(| zHb1g?+vdNxdx+_}=@aZnreS2A_1E+GSqbv;uSOa^kAuGz_`Hhi?@fA-4#20+z~v;G zMFDgbZ|809Tm(v*j4MsbLS=z67qQvOEG19L=AZHR`7Yj#@eBzD-zWc0eDqb)SBamW zI`Z)mJbz!|lSH32$@DKi{^Ix-^3y9a{wDbOi-TXZ;9vNiFX|3I^+o9yHzT(0i@RJh zhTMQJ)GxAS?DN{sr++>X;SiAbdHUx*hmWB_cYX>l^4`|dC1h;Q$?0?bf_OOh7LnpzE+?WYQ1kXSBwzj#KqzYaiv%(ZWs57UE+1|j@T~_X&zd#=BZ6L9W?!@WoSj( zV67DGkJWZ+acZg-pjDwic58{+RMUH={n`s!on|+k&|WvatEOpzrk$pzP0yKrreOGD zPqL98MPSBHr72WIW$^DSsEw|{dT$iHfal<4dX2uIx3uwem?f|QERxySIQm{lzuFED zdoRD0-_7siT^RYVz<0b0&#DMbc<`6S7*Qk2MTJ--rfU<#1!9}%6kEi@;(c+M_z-WZ zHsDiR*HSo6K^*)sO6QMb<+mND2u`eEpQd4aCr#rAsF=S>ld$5c<{wcBe~lLMZ>f=g zLl^MxsR^I{x|IJ)OZd;US_IN6VWq2uN;e8Wx?TvnN(9py5l-txjEJR8LarUts8giS zW|2;hV4e7c$fq4*6g`QxWVaYgABzRFOH81TL_K{iTIje~MnB=5`H!NFk+^}WVl`95 zO^k~hnXg#Se8e5hTdZT*;zgDrcCv8s02?B@S(v$&HbWd{ zRpK-L2$`IDVxvL3^h|tR|iuz74Vm6qsXG|Vl>{B-ayNRiCz&C zS%lck;)Ih$i>=Hq9%ZrOG5%M4qHPTY@!N4~aX($ef28yIQMv;w?7xch=`*pA=JLZL zj2ie?^sFex+0{LGht)}+iwm*8zXj{e^;iSGLsR*O)Go|)13nw}rkF+t#eDi%ET><^ zb!?z`h^32XnMvHt{KN*jnE#WWqnE@Id|K=_8jVj{ye+EeE3ugNiE4UB%wSW*$5_>5 z@u%os>^Bzif8abRjOEiTya8S-qUi5pDV-7>tWtc!9}-RcMgD?_I`+LI!qm|=BXpq0<}mjR!h{;Y8kxURCT&KO|4R^)mdtdI#Zpi zo~Jgbcc|;tJJk*9J?cjFKDAT5UwuH`qHb58P@httRClOPtIw%B)o0b0)YsJA>L&GG z^>y_w^+mN?eOcY5zM?*_zM#IUKB#V1A6K7I&sX=T`Rd);CT*j3ueMgZhobmKoHlO8 z>VFH~pl_u#z73}=&*4*u&r?3;t6csJ4du_`Q+R)&>3I7-7AJIb_#x~#UZ?r|OKQd^ zvo6CY{4VD`)XGoNCHxm^!Or4leA4SW;YsU+jqb$G>n;&bTSNvuC^G3`F@)|Hsq~l_ zN=`A1y2NmLS`^YVqKKXsW%QINpf5!;9T6ANr=o#A5$DlSaS44ZE~OLV8p0<9=ofJ< zofOwIP29rF;#S7QDkj9An1@)y0>s@cP~5|U#U^GIcd{7q2+I{OvncT(%MmZJOz|8W zAzov{#Vf2tyv+*49#$y!vLf*&D;96DG2%T|Cf;Qe!~s?<{>EmC&smN5f&%$kta|Uj zr=D)ar+{uEAHEtp$D6T>`V&q`uOk!hAdRoUCwo?6XLdbJ=KJy1`U9Gco!Jlz ze-ZQOLs84(MHfpHkFzB41apX|Sc=%eQpM9OSv<)q#9!D%@n<$!9As0)r>0L$hfE)v zKGFO%f6ZI-)vTJ2mZGJa{%QJ3t2e!)4$*S7;o1-_TN|d8VCKu!hGMoX#tfLJjnGD! zx=pW`UNt>qde-#3=>^k^rk6}Fn|5h)FguoMwOXY%g&q=vvD!aIJ$#e6i;Wihu-n$@ zZjqoxXam`7oB~|Qyu?~sO805+VIPr+9r1&7NHl8uwfCLmusLaJRY|qYHf{&`Od97j zO_@>U%nElVR@W}Dt(;orSveniWcJaWX!mc<`B?A6iLHfO<#SNNurETTjO}4<9NjDNKs) z8#rE$GY68zrG+J<3Posot*vCGy-wa#qq8Yo-VmoP9F^>?C2p;~uGnS5`*(^vV^Io) z`E)kzq{zK$-=OPuv}#VJm!15L2moW4b4Wy=u39dcUb z)nr^*jr-*XMOLFzZ0Lh|sJPRwsMfZ!*5>p>x1~7!9pfsix|I6j>R6}ue0yt(Gr%!! zQq{OAuEg+Yqz4%3fsQWnFPd7_$K=Rk#v&7-p?W(RLK;jbl8>d|3ofvdpbUOG;7yQly@Fvwr6mb`b^G(aA+l%HPHq zGsZ)ZgSv>9R8~3t?S-}yrw@jow;e;S&{q3YC_d%nhwWKmVWI4SK;*Hyu0V6L^M>T` z7!2=Vv@s|-#Tnx0VloUxf6H)yqf5vz%+aODFx=6l$}qywWs+f}qf3)vl%vZm!-0-2 z4;dyq&>OD)cbaO^({@{`lg*M(ON!IcFEh9=^CDMfO25qbzRbn0Oq+w8zRADaPBiKX zS5sv>`?oI|?X#g?F=(F*?P#A2W6?et#-V*Oj7R%qn1J@lFcIyO;UKh6hDm6j3{xGp zJmW!1bJ%K~p|v(RJyt8nL>)qBsvNWF4rf}jGY!vU1|Ee{jM#HNkoLM_&5#a%w85;@|W8A)9#3o5CCQf#1y#GI76({;?YS!vO8ahw(-eoRG05s$ySQ%RZ%1CO z-F>&<`BR)Dd#xG0@4j8Na)EPplY4J*0sKd*?8VW}kfN%JaLlQ;yz11hbQXx`cGMZU zlfx^{$Spi0x3_G6eP@>_ayW-2_ZR3b)N8QV;T)d462ni9v6Xnzf3I%1p{dSvRI$Wp zvK+?ouAZ;M0uc+yhwnlrv&;q|FkD)k>Q(QYUT7$XsbtM&?PGGDPa7jEu~eGBUD2%E-uhM!kv= zYcT31V~s|=WbAySUNW}OsF#d28TFE}3ygZn*o8*DWNZ=oIIr&pHXB#Y0%Tm|ijG2b zvFvmy<}Ae363n%TN|_c{RLWdz$jA&Sa|sHM=+k441HI*qEfug6_w&wqh!8I-*Q(}3S8rgN`ZFBj_lKSt#M`O zyUrDr;@7*PQoI8tN4oT_a7CrSN>@}0+~C;eWvpzSrtobF7bVy>*J4I|o zYwv`fLf8QAo{Z%r`xE9m*Osrji?qTgXV9p$7?qObMS-P4D^-SgB$x(hs;4_?x;l>M zn^G`;8A+DH=K~A;$-B*yOl^31<^?go!sn>~|Fs$a%Cx8D>!#waSk^HKyM>M_d0k)J zl_;-wn8}qu#ns_m2{P#!a~mIlh0-I^^-lH_KUwrcKnx)_iBN3y*|vKFNJ@{Ht}D0J{x~J=B{)%Ud^omJHSEL zD>|GY63*oaXKf@lf?WV_`xOf)0QF!U*a;31sS3ckyIKR<0M=9L0dNxM`8J%xZvlG& z-cy(ZK^bTw@;r|3R)^yCJj(f^oNp(-zztbH$ofGx0Ct0+HyHV$Yly-kKmn)%OMw&Y z28W0uAQP2HWP`nEl#lHI8v%609swta;;bNxC}ADg2_TnnlqiXak_$jRK)K|tU>}h~ z0nq6v2hE@p>;@Hk_DFzK-6+m55_5;{SjR4S>+5)zKy+moqOFvGOahPZ@2sREYOo6&A*!{2bWjOk zqZYbrp?fasGj9vn3t(e@3s?ts5}kK~sBs@rQvs+49bhX!T5~OECt3oX7bg;3278yS z2B_OolwXSSOAq10BMLzNmF1v~s4WoW5-o@BYfBxL zJ*yypV+25bZ>%D^se))V@>fHCHS%w960NBxS_}Pab3qM&j1M*6)iM4hP1{Z;@yo0k%8fvzpk^$=`rMI9eKMD!TsA4C3Q$a@TV zkD*?V?Eon2L|G?fomE8JaJ?P%+rA2PgTwfMKq$xqwV)kr0egv_B%-HKZU@Rd3mY#$ z<^{;S0GSsc^8#dEE&%nQgXk65eFb)R?Ng0jCr?ia}Yg0jCr=2ys^L_K;s0Lu340tdlKe0Bsjbq6R0D66-CRRD52f`=VJEVkn5~&u4B8YM2y#IUXak*KH$WZYY@ir4fK|W=_Jb3|;v*3U(123_C;eKrLt|HWcj`S_xXg2G9)-6B~wh3@Zk( zop+GfNDHx1&|Qf1!YojZg*VETG=bGv_(M-AuE#_G*d9|4I>1(Nh}c*Kpq*oDKpW@; z2f#^U<4|@S%8o-F#%%zo!?@$b$`b+P%b~w~7eKqlTL9$8L;v`7U?(_6Y=RkNfhw>H zK*t2=m{f+JL$MN@wgn(<+F<~j(`}#_K>zd(fO<}cjTw-uQ9vR&iw(0@D1-JXk| z;X%1|OTijq>qCj%iS#>>ekaP@*+LBSCEEbK8=!Z?7O)Q-A%>64u)7ZsyJtUutxe?s za+_8ICqVk96U6QfC3YY3?rS23d6nI7A@)EevCWA9_1+Bqn^A5v^lyg#&D{WcH>2zp z8^{F}paHajbpZOe>;p%LJxCxFq=Om&Jr6?9L(ubZJ+ZBj-wOGykbk6|*rU+n+z56N z+XngVsLytkeFA;?WFWDpkpC3yJcV*kq1;ou!69N#A13xpE3s!G|18Qsy8|2~w(|(F z=aBXsbUcT4JqMZRHh^w`GS5M8w?gd20%9+>fK|kHm4kY)6s!ST!7c!OuR!*d2v7`a z0Lr|AGOu<3)aNynd94%d1c!<34h4C{UT+6mz+P~S*j}XVtp%%zy@|9pk@i*~Z~*9j zdmXWTNPEW&koGR}-pwWU9@>MsoxP9xzYqN%AdY#ReNYA(zy`1noFw*P1VFnER1*6L zJfT`co=MlA0{3Fy%7%Lk%zzu;!!9Ql?Vzz zJwQ1dWNjM&>SIHFY{!VlKv&ETun$0=oj@o^2bG|Mc&w9nJkk=Hi6_ENBJ?Jf5g!x? zP_IG7#FKEHguX~x4WK^>`jagHdXk|hxfN^$`@nJH4(M~_fm(oiIktek;280gK#&Wd zF9r2W*+o1JHqsivD&pyoP2UZU63?)LL{LCHb1Q)U%p=6JVgd9IsUe>202QDCw1H0I zxn|-+kv2x&#IT?9Kt&{u>q#R`Z3S)dlQ11C60yaaVDu>sVj zqyn^njR5vaP><2E0O_NVK6({^?$P_eG2+;p^HP*8EeG|)%Qk@R0A?n=l_ zh1^ugO)UUbpc!-!pN{LQvqT@mVN8 z3vzR+z*4Xg$m@LoI&1fWW5nyM#OJnx4FKim9wa^wdgs|dC4e5BA8?!>@cP}v&qKTs zvW?q`W9`J7%mA`Yxu60-SJP?$Ijp64(*Xdv3nD-ks0D3c9dLsE#4m&ntf}~g4FI|? z+y{;mUt|HXpaLuf$Xm3FIM!VJqGQAtqugTHUR(x{wir5>KzGYw;uj+i>n?tYlXxrQ zt%zTi3u*vlF53vY0c0;%0PJ601zG{@EG6PsLVnp+;%zoi3>v^H0G(~9ciRc#%OSfQ zdX_`aHL!CH?6f1l9r^7?iC+ud*CrCbZVT88Aa~tK;@3mx_0V}e>T`Vy@fDTCR~{jL zgN68wc>wLXaShl34iY}v1Y$uMs3pF-39JU&0rakh-kZ(D*8~#34SLriZ!PlHLg($! zd3ymsx!c=8C)f>;w=R_U9UF+RhmG~eiQfs?J7Yl^fQ=1k%U!6;Cd4}-za@hBR`A$< z;@hBe`&QylRS1vU`>n~nJA4FK0)L*LhV#J}k#{vG6gfUe`H*U!1cPay5r0^+A2)3b(z zkaUtz50fxkNqBUV@WN+fy|$9@K2E}~f`mW9pj9M7AQMI;B9Io*LSkSniRf|?_C$a% z4(ajhNF*Y3I7p=KB9UG|VlcuX$4F!clE^_`?miO3_marR^{6%yMTba?t|3vjiUjt2 zqTEViLM@33g~Vj&t85@K4LYVB!I3cR&S(Xw<1EB$kv{i0iTQaX&O1P&5&9dEzHljt z3lJ{q28RJ;nop3x^CT7@BeBE`j*@7B&K9I!44W4x;)j2be`ytH0I1ug>quM%otNSI z@^TVa!0wdjeKNnE!EbdtEfgT#tZ5-X9nYAcC9A$}8V-weIC zLf@K`B-S+n)b$Q0iS_%y5fXQzz8lOW?%GS@9;DyfLZY*k#1^D&fsO~Qpc@<@@z83p z1>kz?K@yKfka)}jVnH4WC-ij@fX>HrNo+^Go<#hqT_m2}Nn+=563;>B^QgxQl_a{6 z_Y!1wwUc<|D2dmaN$lQ0;`QC&5Q#mg)7}CSZz69W>h*3tiT6`P5?WJ(3OPpN$I2{BXq1HB{i3nbSo(t(2)t5%)O)x z2_z*OHgcdlr=FBt)M;2dDR~v7Mp0ZXYS*p>skj zDHTM@B*Z5xAOd8OGUWg%Q$tCa)&bUmEu`Q$PpRHc%FGs0YH&T!Ms&$Yu7j>8i zx%o~~7HlA;!AeSF6DjAf1{+CPc!(6tYswcKj&mz4XV z_x>`_06M@Hup1m9&Mw2{)?N(#;jl$W6ACCI&8L&~l|fPQ@? z3v3|eRkZOnszjwU8RHk<{S5 zqz(uL4fxTFTF^#ncp_*eHKK{s$XHN8>OiCo>?G9|0d|ubjrG zK2mcF0Mc`hl8QZ)inCyKST5K_>hN{|nc>Gs&9j0waDdbi=>TDV71#?TRspFA0emkiXB0w`ZLh8gU&;+)SihYh+(Mswh3+NoqWv9bt6>L`_UbTO4>bkYA0u&M*V$n2`u_K^f=(>%e|+ z7#t^crUEJebkA%CtH1$LYpMX`W<>y`%{ocyY^2pe?>s9=C$)YnsS6yWp0|(G2H0=d zOKKzP(1>!4M@cLbqK{u(3(7r|Wq>zJ%eTLr?)yRu{ z@#%r-1(ho2g2KZFgoXs;<3#>`UaDeZoN-Z(`B)W-+J-SMRKAQbi7Qy2;i!i3={TTa zb4-Y_iA26W-WD%U4>R=Q%VVaH{{jGXiGLz`q`Ro~OsDJIz);HTKl8qWkWP>Ac_G*=fJ;0m9jl zzuqlsg&Dtpa3MWh;L|iDE;3Lxa}!e)UOvtlT2WPyh2tQz2RFBo$*h=7N}CtMld77P zMpB89${I<-PpxP)pFBK79Tv{H9uvX~hMirE1itwsJQ`0I*HEhZv=WW#3_X*o3kKHC zVbpluoC|9&oHD7jBtLI(Mp9x#n8g!6ST@_@5uB{X#1F~J&hZg;S0p<-CzT^*aAr`T zW(o=n4i3rZgEMgl43PvMfwaMy`64G9GDy~ZxGRO{;L=A3(y)55)ceBNQ&nF@xVbNtn z;%o_plLm1uxoV7q2Y7@!iZdLkV=gK7wvha`yu7C?#k2C4k}*0p?E$_||BgJmIDQl0 zJLiz(UYV;!XP?ZY`~m%2x6HTwWVR@NeKJn|v`dELw*~rSszje2ir21L@EI(+wD}tr zKZ9hKkUvKti}c#Qqo3Z#&Z)OstWom%Y;XG=nazsYC)35ZpQC==;yLkTpUflp?W1$G zb9q0RE&RrF$tdCCRG*%QdS%Y)i#|Plec{sfM}6@(1&4_4d-dQs^>&Mcirpnc37Vl1 zz5JwTpb_L}^s?++^s;kA-+k#8Zz$G2y$}D6-dcQHuh;e!d?wp2#{l2Kw)fN1ELQZ% z+{Yh1XCFT(KJ2TXA%profp4!>%KEwcs7qna%6@ul#i~BNo%pS%-`6_d#CONj; zBUFwlcu)6Of2yBtLyuwmb(d}Tz>|G*rtRnZY~Rn@%X!KwvGb0oHsiv_y zVk}pKKOOuVad=OKX;NGzQ+2=6CaN$U*jAS&Sd}MV&b#_+rAbWIxpO*)I$u-{- zPBcXN&U^*_FeKaXi_$HMUeB15&vRV<)Q4*(liShy@Py24nFUws@|Hdd9O-R^qjKu5 zzI{_gMpzJr2el7a_RuDU8WzHUfH z?Uab9g5jwa+tgX>t{N7cH8?3OHLY??+4{BD%pVpW60DdpTWaR<&6j6Sxnf#WaH1t( zM2XEuGnpL)Ln3^F($gXq@xG^I~WMX9y8 zQDgG*&R!s7FS}{tc-31q`LGGWA?~GuB6@mK>Sj+Z3Ox5J!68>11Inh&P91Hss@{B2 z^uT)t&6zbmbxcoK`OG^;HP8JnHJ)kJljMTqu{LGO=yR?fhBu7!?eKu(SjpY1h@N4V zQPuTx;?BK(Fjgax3f#8^FN*WEE!|KKl381ua~tkfO+E+PTq1&sws6i{K_3q7K>|0kH`9y>g4~2XejlL?s@+u zYaUSRVR-Dbty-k13^c6ne`5+>-NJ>X@f;02+oYT%u$TDHI}f)@6N=XON4AJOs(ZW7 zgYYm`7i8SKX+;O4T`xYpW9vhk-oE$kwQD-ouUNlq=|zhc)J>W&x}>lmCo4TQdLUNq z*R$&bU8{CHpT?>^q3=nJk2m7(xkj$tL)?q^5V=;*3<<_^-DJ!_a><{MWxgzdl{yyc zGABwgGK~~tRUbS!6CNNtdq`FS%ngPHDdxjjCK7WD4`Gytg1GD11jd`&#wu-Uo7T@vNF1O)h5Auokw|Sb4 zeTOyN5oA%Bxa3r~&6ADA>UmX9_GKZ}>|keM-o!PuD$n3_I3I4knh%MOR* z!o}&*6=s>v9=4E%E0Hw=*y0 z>MN#M6i*+_nhN*gidP$XS-6*F8D>PTn0O;u$Sf@8Ml8^MJeg0UpSM+bdics8YLN>x z_!m_*{L654!d1(vs~BC^zHH@HD=%1henZuj)mK(d9yc~WFFVVT6dz}c3J&zpXgZtj zZ!EvuTUNPQ6*(Af_84QIYK&hwa4~F67<(A8`NCMGVN|IeK#*K&^6qx>}`#Q@; znY6&9f~uhjsX>FXgEZ@)JX=h0X5OsAWh(UW1gacXVxH4f@&7upM&aYWMYk5*cLSkG{Vw#_~$H3%(9Nga=x$c%u?6+g(T!ZE8 z(Gta_FYI+_%spUId4fDS!Dx{K2v-;@@Ol_8Cex7mIn_zI(PiZm6MUk4{^bzSJcY^E z)892lq9+!4X>yoUw2dlUeiNVO8Yl@<^3))|z}$hhqFj4)_K3)w^E0Zv;s^N-ZSHwG zEWh!Z(KCm&cPtz1XS1F;Jbc;N<3n&o_0swVh-X4>eCPlcW(*$~m0}ArO}@Y4uArjPVWBaENzXMlE~Sg{8&QwY>Vg}~3JZiuoe;*k>6Wx0 zETEU;&fd4a#ar?4#=TWd>b3Y7l`wI+XH!fTnB&d!RD4GD&u zxR_n+XSj*p#~CxBbQHM#sY2c(6CPuv4K}8=>}+G2L#mvuj7d(86XQ%QI3!95!Ihlg zw-`hMO*wYdm>4D#%;^A3|zSat%x9LwEv#=GDzddeJycLso8+rRE-agCVQxqK3 zHj)o{sy?2LzD!tgs4O@>PDuV1=HG~CPguMHIA%6^WDDPet$7`$vEkZ;RX50!*IRGC z;r3OxFUMx9W${Ie=B%t;IkS55q>`c$!v|-iI1=I_!vp=Tz8Io7jSW6)Cc`kZ!c2Llacyv*-EKSuzdx}>WQ5MLdQFZiuO9Yap58L%)@586z91weO+W6xw_OJ?3U(UueAi!~lj8x${3&q2*A#+S8@Nt=E} zdHn;aiSY#&jamLmfhGS#-P>YceL=|u;}VC?&CkDb(ZVq|HRLZ{oSrv&NV<<_V9LN@ zS>9eL6Vr#x8||nWpI$Yi^p?Wf)}hy|@K|#bzsWyfa(&Y1smVhsQnF?kYYx|acnj+Z z99GKnAC6D;k{Rc z{WxbbWcuv5&V{9{Jo_{Zp2OZ2j_q(?`aOO1=;ZTpaK`kao)^Upcym=xbp@816fYrY z0(_Z#HzWs9B&JVJg11Rws_yu|}TlvJY9PbbZ z#tE|q45(~q&JrfGC24?dTv?bUZr;3vxE!3WF_y99lBVflF-biyD}EkBQ-h~nv}{>U zdiMN^;Iw!jO8|6hX3a}Y$V|6c{e9=%SP?yG>ZF1ITQuWlQ)EcgoaUCnafL+}4NMs{ zblymhn#=RD2M3JG7?_eCox8mK^17(_0CcB(j_(jQ@fMZfcOXA6@QFab$1@M5h?z9` z5ZlrJ**IELun1}+4XY9jhbH(%L^%6K%mS)rRvY2pdk-W`I2OkHwSLbt-t7HOX$9+2 z#pAS={$&e>{`O2BnjvyCZ#>Y(>77h=?Tc`h(Es@lkT3b9C}cGgyR_hc{Ja9Q zW5etLo@Ui-R~=cNZb#90s-n5{Ucn$MV-y$3HC8)$QdwznklAe3 zX5m1zCMTUKikinviU~)#CLHC;M=cE_0_U*39vB}gQ_Z-~M26GuefSi`REG{9YLcf; z(r4o>!?}tnST&gBBi^sH^xH{iisKc78Lt>Hnq1aS7bEGrEs3die|u7_BhmvK6!+*2Im3BSfN>DBydb~q zx2`-nVT|jjbxPqB>C+QpU(c;@IrJ5i3Nqzc>c!rc@VTXjBL~8%b5WH0S$L%M@~38| z{10*O0Ug(Q--+HfcY5!b8BFg3%nW9L8Ppl{-UtwdAV>lv2=?B@E><;)>XNH$HA`|N z%SDQvIB`wlU=bNwi^K1J-!1?8 z`?v6SS{J>M&=(Gd9-hCQs8^gPQ0f!5#eO33`K9OGg0y!|0V`$x(qJrXFwl?l*$sh) zansTv4)TBLt0Q~8^n_uw*!={ApKtjGToBm9C?x0sYJYLhe0$CSS8vDEFaUccLr@3s zFC2*#xPhjWKt#Z}qI0OG6)O66Si|-On%c8#;lTC-8#fI0H#gR12*TiYSxho;8a=8J z>@opmBhZ1!RD>^9ATk(efEYw{iy#a{ty&>P>sEY(N<_#@&;n0Gm|DmeBg_?sUbPS( zK=c5<8|_QBHWdyQYR3lGW#k4$-RZVni*;9vv+Q&{NYDO!UONPJVi-kGG_EGDdS#-^ggF_WbC^2L?6{sx9xoo|*GBEyVqyOx%_V z1e@x;nXAt{T~u0?9)GNRIvLAVI3gjHR3B;ddfU^ji#;K)*HxvGuo9Ch?F#R|HZgu? zU9{R2jxd|N3&)Nv`YS?%m&f;hxyc-S|7|vIccr3sPYis3`~~0AKIuQPpGP13MReHx z3-s9iIarjUePJjg0Y?NC3!sb?vPFPp@Yi4Y)gqN)#Y@9S!dDUAtEkt^CQ;0Z!q8eu zY2b;62i=E1mB59>Z)U+?{XW4l1e_^KOMEiP2YfgQtfo{*)U=SI{NL*N09*{EGJ2mfA{3TUVF6YRgQ&J-+|secAL(foB!SOrcHbsjlY3yEgV!)NW=ETKyKCCFgfk z|MHO!pdR)~e?Ryl*kpoV$mTWc89B{K8yjRCEn#LA?|tf5rLNyL#XaHbD!*&%@%w5z zA2}Y>+d~a*XQf;!kwRl+dVY6`%AW^t)*NEBH-Wu0eMXg$kHkI~; zo7?KOAt$@TV%HeFE~#Sp18DZ^exru78iB8dV84lShS-s{gqC4P{+(dg`Ih}e{)oTB zHoO8%>t9Ql*1wkQNZ<0nnl%s8&)u?y1BNQaK0GuSu@}Yjh`lJD_Y!&xi@z_d+3OshIs*q0=JSxxb1Tf|f6DdZVZ zBp5{DmBKKQ0(g|gb#pvj5j1Q*@l-0LU{$4`ROfKi*MVZLvtRb%4N?x zA%JzNN|#N-akKkVbFc2|cxG_spw(7rYz3BMYHZM@NBV}7@spQN#&3t@oG+ej*!0}Y z!inhm@!^2fy!6Z5mS~_a>M#dGF}nX2G(~OFt5v*4?RKP;5>~2^1rtF847{_4iibWi z?Dh4tvPNI9Nyob?<;nXWf1;??Ywm>AEd8C++5OPM*rU~Lk6bz!;;o$`xFV0*9i_Yw z-}2QpbaIiZmT&f5M@x1H5#I`)B;GNVnhtXz~lxW7PTLnSJB! zc8=$+oY|`3lv?O=o=!YtP+Y3)vfM$al0ItB>gEzrxQi$tYA z^3cV{E&x;obq-U`bRU@b~P!9P+EHgoeU==|E35klz9!Lx9voh9VwbZPI0N+?m zHi=%}tV%bY+}fHw(`L_9%${!z1RW-C+NWQ!1Z)-6h3-$Djm5hkY_`k2J{ciKg^tte zH5-qxe8cR)7OQpsTxy1XaOBj0l${-@o=cx#l$yigUa!=wOr98(tKa{{DuM&nSEioW zffn91{Z5a^&r3{`i`BlYQdYJSWV+$H+T9Zd-sf@2Y!>8WqHVukVy-YZf9rIGqqw6d z%&NlX{>sh+tv1`A?j$W2kPsv8}-QfoT8_0;2(lLP>TOR zNJt?dM1dk`c=C}UCWJUBjDqraw}@5&zMmKY6+SIPckQ^^+Olx6G25D%*n2EDy=!)z z4*0pMv8%nk>E!m7NK3m@!MiGSVT-#nnjMU#cB~(I;&dWV6;^0mRio)^FE%!8s%@I@ ziLu7^NVLCDZEs4(#|^BUWjRxC)F1b?j3j+AyH*Zutv1lSTGz2Ik{wS+3O-kp#fijH zS=d!y2sil!eIdTTA3=|_!O|ia$;U8nMut{oZ>d)>5^>FU%4^8G*`Sku;GE^NUtd|ntbT_0n)`d0dJXf_#QXcxmHS)nz?#xoxW9|E6f>oy z$O$B8iuXs>-h6+*!MV$4zjoWRe~*2cYZKRCUtvG&`wlwCZ=`f9@0x78arHZYic6OF z{rnyF-7Mryir@DX6QKWsJQH#Z|Dya%goj=&@AD#aTzr3P-VIsv`SO~V&>jC)8X)iH z#`hK8%`NYb?DOODJ};y6_11mJnxB`~yo1>gw_ihI)8cb|^^W^oFRyu<*>u}|c5(IM z8oYO54c_}J%v;o+weNk;>i51`$c@F>tFC#OISHF;&9~ZpQW+?GhV=5HXlIUa##twv)=%SSHI}y+!&S@q5P!fiOXGPpkx_bUhi!?fV zpd*`%_iwE?=5s--Os>z@wrtJ!O=vYyhuUq(O&2^|^=xnB-ieG#W~kkKwlckLets;= zSUV%p;bKT?tF1EHEtXVs!&FtOOF}CoDkqcZot*4VR1GcEE3{ewcqzP3no=$Q0eclP zeLYnVfDLJv3(OLLpV7Pp6g0?RvGl<3RhS=a02+ z+SO!G*t|9S=bCCaG{n|*M9gMAaxyeBZ8Xv{x2L*ruqQPV8qbeSD8l{?v87s`7qvHF17#n38@nNr3p!o@0Epgk4u$wyVR zyD?teGv4414gnK>0h1Jej0qEIYPSC^2kh+tOlOXvIlLqZ0oQCGfd(R5Mn4@G^UATM{ujUwc0LBNu{9Vj@8lx$g3(-5yK9t%@aupzaju9kuVas!5#A(wZRahv9xwH1@qMkt4gJr zY21)r`l+dvf1MfTs9lsU%n>&gNP9!cSLkugMO#%E~ ztY;)hkdaCd8b;zJp_j|38b;O#aa%apf@k4vA|yw&zeFaav;nS_E>Ni35HNGu(4HMz zHmw`!?QUww=VJc6O(Cx+!D%au13y2r8be!a2>>fA836*UhPQK*>Mvt#q%y)t2oD*I z@E(1l$#9`>cDigB9L>vQ%_64O-a1e=5mL$Tun2RztpDhX++-B2tBSM|pzZ6a?!Y%` zVoChBrnbLVm=vNF@r4VP-7Ra3hTQ~KJ0{OXR@n}f5q{}a*jL1ESlY|qYB2DJ24yaqgZQ3A4{v3^SeCb6K~c@Eayzj`4t|CD!Y|(yb;K{<6@(>2 zWtYFnEVCXopKPSsiiNC&d|y($1GF5G4kUp{7+xrTk15{%A2;C2;Zz%m%-%P9$iMHi8>|$;TrQ<0M|Y2%-4x)IJX`qUQm`-AbZBAJQGKRm-Q2Jfy}_2^iJ&!q>>P>AT-0G zXv7;SNlLt@P%T~?@raSYR1%!!I6w&?6aGj1F^uen8lr17>}ovhk1}KF`uWC4MrAe! z6Qixc{#<-veqB1*9nk3{$n}WU=XAV35z~a$kNN%m#faXlmU1eutvFwkUfdef)!3bO zZ-qK+t(@Lb7wj*D8|P1)W^8(+PH6}!4X%Wx+8680+jKIeOiTM}>uvFvwW@WjCeq+x z6;jrhN^1DZNI<19X|=9ukIt)ANLa>J?XBzdR0OqZw_U4qqUfuCCS{2=g_^eXrR~hO zH42&92Ji!)474tMGxk%UbqHG63x}9f^mWiNYJBMH0v&@GF(vZ*%)cSp@On`-N3*og zs09rZY=ube9D+eKhKivki)D}-F6US|$z&n9pl9(fVjKw*)(}@BGFmnVfz^b(@M6=4 zyHX~Tpvp_QULqqk2{bh^KG@&UR%p)ER>eIPdYyuy=IMD70s^;?k1l9`Wd8`>4)H<- zZ3(=S11ypbtweo9l}c<0Tp*}Tzo13gOa@MDHG@C3b+p}3p_kPUukSVctjHGQ8I@I; zQuC?y_Kb{i#Zw8bN+Yd5v41LCGgC+|OxA@=YL!}76KUCcAoI-S%=#U>t1D$1i8Ghf za~31V{F{O0I5rtF#;rr1ol0 zyftB=C%ckkof(JPAxlnm>Lez+LXB^V7hbXa3CV+)?DQb>TSe2{1fx3Lwg;JqHq9U(m)jUE6P%#RU@gb*><)qk2AuV8zQYsq;wKQrGNkv}cjT{f* zN6j3i(cnkm+jBYyFEJq+Gi!?D_r7~MZG^;pSB}wYZ@;%1dyn4nj#a9L!5g>zp*Gh3 zAG~RjkN$t;rb%JNy1Twrsv%KJr_src~cFgMZWFrH(x~-q}4W1&M-|~ zICI~z1N(OESlGH{)AZEXXkSl9TT2rOJGqe#L_J79NV3&R(F_Q3A<;|>&O)uN;8L(# zh$t82ybx|Go5A3F0y*6rk|K*lX@HO}(UGuhR{l;RQNnM+S=g3fRFL2odSkWt3-GOw%Wa(%)H^tm?Ka;4vq^~bkVDy-V>kj$o$8g`}y{$xq2+@9~X(EnOEJ~vAj z8Ullc>sOXCqA0nQNEw31ujTu@?Rk?N5Mit9i0&MOjT<(uAa-?9L>a`Eix!w2{7UR;>lJUcVFerTYl ztJspSOIGlV$SAp`zt-jjFMU{4tvGS z$;XCv+?U*ZZMOH(wB5ROtZHT`C%0A^v}RV(o$uJ2P{~!i(mF61i5YqBzW^gqJ8j_i)4W~=SJL!EK=(gO*fCtu~aLe@(P2YPjeOvcx7-*9qw-ZK;p zbbA%R5Kvv??{MXIjHNfs#3ybKllvOnf%pEy-85B?3^fi_xGB5AA?T749sLV*$)cc3USSfL_9`Q(gYFWB zSXx7{XK~G&fO#s#HI-}E{I~L&HyHO_*St#q^wu@+zf0)4yw4R%v-BD0Hq>G)eTE#i zyj;4U-zl$oi5XnG5BTHH!5f)8QP=6AqNbkK@IACzqenq2$)XcQJ$dIG4<87b zdvX*PDpgukFP(?~NHFks)a--hL$lXGt{EsPYXuTXhi&PPyudH!I)O5>V=X& zlAbpVKKY!>T zikB{*zkdJq`;H$xcj(-nUE3EnZYB!ziyqQrOc0M+#isVcA zesX}+9FL5@xKE{04K1VxI-@-aw(s~@;ufCW6*Qrq*&0*M74R}ciiq;mP%xBak%NH9ZCX^w!UrI*3CwQ*DJ6ed^010$bCYwEx!#)i z#-X%AqGTF2?aNjVCX*;c8cL!FP};PA*Y<7OGA$WjLw`)6wl!>O3%HBf?3U@t$r<1e zWnTPjnHS%t|LqoDT+vmBFw6WYy0fUhzq8iQAxith_q-u)4fjO~Fz&Fmgrt$wUcPkXFik!5;H9T7KXvBR;fqHu?%T6tac;}( z%!cXlbpw6vt&R1Gm{@rM1$l@*L@F;GG$TE zq+>vCQvNE6Gw4?7I>tYm?rb{Lp!giq?qMjERXRr)Vse%{U&{}s7<1U$CI>H z#|#8OP5mO^wvAF6Wkw~bUFYFaA{xLMc_4163S?=?c}hp7L__IFD5*{YLf2AyMyp54 zyb0JU=-g5DIX>bYm0c>K{vu3owS-071C5A0gl zFf~5b*VEqGkdK9YUaMIlqh6z5GlMTk%n=qM@g~GpPhwaxS4VUQk$|uvYw9vUlZnA7 zT8merCvzwy`!Ew&YXWvw)88p0U+5N~mKn#FNq$&f`_Hd&mQoo@_ zp4-u$N>)EQiUJLeR$1gzuUr{sFCxCk>v#m_cqNn^TjsadsV`CAVE=2;SVQv)2m0we zLmQ0jfR{ECt|KXg2PidOr<&B_@)iZS4iPwB26p2ldI_gLk2HL}R8PbGX3cUl3n1Jm zH^_~K^BN#QRxPUFdC3kNt*6Ya-n@u7h}LeftdIIxo?5A{`k**3&jg}B7+hO+#4w(XVIcoT6V7Hi#wAfEYWEp4?y4# z(l7-7SFES0-~HM-Vo_GN=xrewxfL@B)cHijdeLMHmhW< zbvMMj!dMd^;(fnoW+^6EWYi z|H<_Xd<`Pw1H%!Gu4Tb+&tkq}YyHmSazVT|Ew)#NMia=oD9Ly|TYtD_m5h%Z>l9=> zElPOKgi3&=w?e-7Iu8osK_?4oYc|8AQ9#Aliin zVi&S{iJoL&(NYwNA@M*<>CpX1un%csAL=NLPO|_zaE)0AD{zp~>sM?;fd}CzQB6Y6 zBNF)C^J_g%t;TsPhi;~bJ$lobBqe{}9nR#`22TAE9`)|061jWegHKf}3~Cs|ANoCi zz|-FCLGN;;oI>J=f#jAT)8ob`zVm^CRIQ?^umAQJUVrI@XPu=5NKO5R!LUHuWT7}g4A1O8VlC&%@P#wJS=PE z!Ej=PKPTIzaJy-sQ|?jrE0`?jzgE#@3;sHWM+HX{}59%oh}D4k_hYUGF!x-H@dN zPc)zY`p$5|U7PS)6%es zF;ANmjp&({rFr?MfIV^pe@Uz9{#jbl*Z)=}xM)A6HpxwDSjNZ!<)y@bB^ESNMYOb* zBc`ifOY6^4dYx9UJBus?UMfe%h>kKaI?ys>7A<6xNihfUfTTc{m23uT13_Ul3RW}z zORH5O)Br-)64Nn+WA}cvVOB;S3hSFsTv>V z%_=C9S^=M9YYwqbrvzc(lqrqKl+pJedBk&@}=K+{e{my`}DPkFWi6r?4bjD zc8;&>XhR?m-4J{z$VOV$yY#yRUJ~7C;sT3)G=X4=Crt!~P@P}OUds_rS_tfmu@@@| z$_Y+#-A!F-$X57QD=$s+WT#R;2hq9aq{!mQv`AL`>5_9@QwsCIgC-4c$nh(sD}tFv zvO`568eV@G7ok3N1#zYa+D~oHspQpJol2ok_<6Qw-CU|Fxa-pghYemBJXvKlJJ19b9(a4DE~`Q(FH+Muu2LglMZsYaiI~RQJ ztyf;$tOzlG8uCdwz3+`c=R#Yw%G(e`-$ag2v_*}EhIJXM+%|jiY8#SB@vBs6XOjyX zJGC+eO01$A!>jt+aB}pwk#nTKO<-(YhY7i`=uu^I8Rb&W5UzlO?$q;^?y;dJwM?#R zSwFKbkJbTj(b>ku>yr%ri<4^5IHq-Iuo6=4rv9sPWmTnbWUy!eSJN|}e`FR_PwWNW zs+35)FoBS(MlI{m>t+_2>JKu%x%_=3M|5)NC-_AQbr;_k0!Pg9|5$F}zQlGQ$94-f zS{#D-LZ94nV_Z~eBC(fX!BTWFAvuN;AXpGBWiLZUWXvc{ZJzDzZf+#q*6dcGq~%f? z5e-_QE28%VKuD;!Ek~(Ip4m!tnczRrQl#6GkZl4&BY(<bjIRC6PQdLS@< zWuO>o$<_=v#ww)lI*r!gG%A_lXCCiac=JLJ`?ky^Q&$kX^nWZ};NQc04UvLIfEQ2D z(KL@jIzE;I>gd#PU$z;aiF2ku_%aFUxD*DB%_#e`@|rie z$=j~6tXlIb=e^w;?uVSAyw552U+Mo&Y<1L${P&WrPVR?eNxV6>=T>UPrLjQL0thc%7 zt@|u}Y|TACNIktgQ@ZCF;o+I(|5*Ml`gOL3YM^?k&lOb#lN_c-E$Y}-0y05T#wMXT z;ALnQ#G;%{!pxBn6H(*T9LjS`$%7=d1sVQp7qj?xRtV9E7fBE~iQK#hWwyx9U!6HD zTt&Ktz;Ws6%4Vt)&I+xXYM>jWEB32kXA-Fo?j-sI7Gw+52}$=wK`l`f&=X)^WRq|- zIG6P9_4~TxKD9!ZbyYXXBuY+}@C4e7mFc)KVNW!5ha?hb(q~lb^x=@VLaLHG{jmgX z*5=xMzCtEs)+oDblGc_${(*K$%CC@W93FP;;Xr+pxysZ(Gu@?ADGR4|4d^PZK{P}| zU;ft4#vt2kS$MGD)HOERsx^QGQ9tq0@@{sJZ9(QPY6)~m)Ns3yI=vaD7aHxX^l?E; zZ={{?ltES_C!RsuKop=VSq{)Sg`8`}0unq0%pcKanj+~qq^(LNV~rmqNM0U~2L81iRioSkvRLFgct?wO%Q0IPI_R@^!znQDxlpQjH;DwREiCToVaY zDtU=U!^WFa8-|OPP^(J~eau$q_2@2cKeZU}Dowjyso!@l61PTeMw3&naGA^UuA2S* zGEaSl^WBDD-dMvgU!ku3a=pkezg%D9m+vlJ;NFKnKa6go*NO@^^i;gWEyR3`-=eb0 zs!GsMq+_U zwDSF>e{P9{hieTAm9a3F33pY^y!>}pok^$87;10@bIIC3|9Af%=HH`EmD0U*p?Gp) zWDz_}blahhp~Edd`QG45BSU8<^uDK#G&R;tH@XapfTMjb>+8yPEc9fJ;e<|Sb?GI= ztJj_!eEz5BxN)gjuJS^6;TuS7EUD3aqNKYv3B5eYe2Y>qPhpLYB|ZMdHLr4x<^Nfd zeg9MVmhAGn_upfm$G4oLc2TFOzb|SREDR$H!aO79Gj*~3m!D#-QKyvEyWXo)MKr~{q0G+P9D}J(Mi3z{lH`~CYSnr5>~5qJLPbV+djX!>$9KfWUDjg zfQ6R@O_g31)APuo4(>-FI2q^v9S6+xO; z)}hFYXif3c^GcNHKx>x3J5+!n4*&}E2DZbXuMY|9DwRTIMP7+d-$>nb9kOqgyiAE9 z54T=lHhzVT$kZH~+O=bLW_oIPu(eR1OI7L4YFxEF@kn=7 z_rb#0pB-P3B7ux;RI6{a*7)u&N|4!O+;Yik2wBa|lTF!NAYX7=^fIT#-_sQEccj`T z^G18vvLaQQ&$TN}?GN|d5G+JDv#7!7<}b7B(beQp>KW>XMa>i~LnfnK>Yil8A9sfyJ3vvOX}B9#n*LNqc#YNduIU9;e}{D<0Px^s*NKR9*zlgZ9VotA&FSfOXBv&(SgF!kh^vD=JK9qHH5G_ftEy3Sx4zCkaPE^M zuF;KC-A0+(WEr22XWQeQVIA5Ms;rh|f1;`{o?aNU7?gaS%cL|rl3 zcCEq+a)WOy(%T!*Q_qUJOcGoE3G@`{IsFsSuPCh{_3`4GHzcm*zb&o#+m$s-ZxOmJ zuepLg=%-6-PM6pGe9fARtaj}h#MS>d=>HGcBxdJ)i~19KN6~3VT~l5M5a8RiT5^u& z)K5JQ^q@#fRb*fTQIHc9t400KAxaI~Uk#B*MvTaT11cqQ^g@=Z6e=mA@38XKjAR$0 zh$<_+GzS}GsP3n(Cwq!Sc!i7)?}j##yOapQ;B7_~Aisg=3; z8F(4#Z+PQL&|y({7@~>e6YFW}kG}V%w_bnkv(G>Dz@YuU+myJ^$vhq9zWsh@ou3D` zL^E!u%dba6zRcVOv$YO|HnaR_e42r&6G4U7-g4%MH1}`}`7C6b;uu@rmolM$k!~y@0-* zI$oiW68r|dZ(75%*O~9%%(JU>*2k$AsQ+2i%+fLydI-v)v*1#S7Rfpap#Eh_h3P3O z=qv>?O%)Qv5=lEPC@m$ggwoPr77LBuOwwJjXpsenHiW!kMSUURnW!(sL*`KXlh;9g zP2J0;s3*{&ni3_$w`^Y0WaT5E$%Ip&$*PDZ`|R^iJ@MG}tCug_kA&p?JGO6_nn2YF zG}^~=AHSi|NHe5gk4A&mTkRp=yJmwSbgLEgYtnGqD*Gv`W}7vtyaz33^6A$ZOgVGH z{%hBD-tDz2V`j>7kJ>J+?J zk`XiV36O-bv?LXp5Gd-9NjL}1^JNSf9=YN`53aONs7LZIMYWg1+ckH(7Pd5L+Oc|% zl`G-pl@7!&NP@rl*jq1^lB8YtKtD~*BSp7=YG8`QPy9Zo!)n%Ps6M)njH!fEF1Si0 zEFs1{37l*Nor!=n@vp>Mb`il6>z;)O2BN7jzl@|jMVvb&xbNc3HP)@*4Zh-$Pi*w9 zUu-J0)gRr^*=>(#w;oCr_jSm)PdyiK#GGI})qi+@#`s z^(V+Afs3O^=U?@mq20>8rV!p zwJNPtg;`@9+IJ(|sMeBP0a_kYIoU0Z0W&mo`avUxoV5${&4~Fj`w@@Pfgp9T@9%KjjYEhPv*m*i!D2avtO8@W(?fmm zX|R@X1h3&Q|C-Oa@&2@+_vvEhdw+1~08RbhfAd#A{DXJD_bvulJpa^_*B*HQ8Mz0( ze(39STV|&FdWr~4*evim_tX1GE-o$j51@I`p;!sNh_(nxt`$3V3m&IvjtH>ss=%Sp z{+lcmeNkTO<59u|lov)wju=M7D*DJgwh}B1@qF;M?8ba*^iY?_(U`&%4@pfd&@o>y zh4j;p9h-|J2bwGd4oe@uZ)Z13Y$8FOEfPl-k5Vp`d(oKGmFr`b6K5ZNIJW|F)VkzO zKHb&6zL?*2-*emTsoiJ`ZmMWI{Op8pd`F?B{R6nUu6w>Soe;QLQ{|rc*wJ>ommMU) z2yeE&_sv@vyE-c{HXSMsN5X@7G~E%yNm8HP|J$$dGp4i+NCj?)XFY&*9@dFZxR8 zIm(LlXRH9}mDWJNl-E3g4m(P5jZ#>Hu8%)k`Xc)sb`y1pdXoAK^+oF6i>?H%QcGwJ z^-LZv>KR(bpB!d%%2#$UTHT79GmLRiYK}qmq*Q~rExjz@qFm!R(*@D6wHKRn*(_qJ3OsRbq?Z}WpE|p4ajvcPbC*^9jT1wnfn?H5p zVlg~j4|)(`Dc2ir`1JElrob^zcjB>M;9Ns?0%6CxZEl}IKX}z zneswC=a=rpD-YBAmVZ&g41OVE1}pYjnV+uEU%uNKewk^dD#WuY?sV2g`j2nB&$rpj z;#r8@3Tt5Rz0JG}^G`2eBILeE@Rkua7VXJ*U>@$lMAR#Epr|_pdvaF~qgUTQ3tNJC zKg5>kLaveoMG#0KK-nY5!vd|_5;~n2V;clY z+YW$ML_9h^>TW2z)&cqu_bT?6w^6E;S3c~WsZ_e@(*5aF1aJuL+e=X-pL*}feJAlk z_Uv4o-!eAR*&qfUXmH$I9P4U|uG;fZ+ts12} zG{yer7*>%KLU8UW4jr>!rTK6#8c6s# z)gu>FkAhc0qX36OXE{RDXj2HR8AURz5)HjrN~>YDDD>BW!ZoC8A>EEP*(gk2*$K(W zS3bga45OLGt{M{7*Dz2yq353c%%`9I+;g9M{Q83r+<)%meJJkVwqa^`sJ9!_578tB z!`Ae2D-xigB}kH(6n{RP>JX}?a4|5jk~+Cp<%Oe2EEK8*7lwtf1|T%y9&S-M%-gCe zk2dQv1vU4oI5bJSEvC|0rL+u*^y-9Ljo`CSc@GLp8L?H?YV{Uq1&M56wc2_A?{CsI zE%uCD8tJv)o7!L{mMuAn)SyOLtTn|;;{BF;(NdPN6mtEwEc@A2s^b^k?H+*W5Q6Q02EU(XDA}_MufjY4i>I~pBp`{FB zqr|C4D@~B8lu|0BN=!slfQ}V}jwS6RRise95;fLW?%{HtS4?9U1&OgMc#vhqW7nU1 z=KAxGJ%9D`xw9vZ?%T6*Lq#lxo}qF_JjlZu0Wpz3ccdgPO#&Yl(F|e%5|Z`!Dt8}9@(}h z8?8)j@?qdH`i&i_SJ~8rX3w3i#+bUYwPOvWE?&FE+Ntn*Ge6HAnQu1e^|5Sg*cy2M z-`A4d^Ne1p=U9`<(;K@T@yOCG4dHc*X~D*6+`p+Sv@WlbDe7hFw~NYa zr;#2*z*`b>C4M}i6&B2GD3E$7swX5!3I8owug%tlGJQUW-MPQl*wg`cR_((u28{Ad z64IyzBx;!h6&U+1l%J*Z#6A%aJzRE1~0|yFtDjM<<1m%t?4iWi?*)i z=@*6zUhnh<+xo?wQx$HjREp7>s)yTXaXXYb48+Ih5V72}d{Dsn*FO=78AT(QEbCH!S|3hibKL|D~z5Kc5{oF5D1L*qqiV7F4Vs>F>EFo($ zzX_HrI7;X{s**DpORR#dR0*(`6fc{oeAKg&VFDEL=Y^iTYPCSqNUEpl8%-PAZrX?} zmSfHrVGeOe1%{kFg>Qpi#<*-wa!i5Ej)3r;JdWF(b^c3PV1Lz!N`!|vMGYs?qj{#uRBt<@Ni zcNoq()K06`ZnV@pMG}{J2#HrTHP?ou4AYvi+I#0|ny*Af2jV!^U?AoY$k^oeX+XvU zm*aINV~LDoGZUTB)_ABhZmE!1wI+|pTU)I3w??zP!dC!Z?j#bx^UjE{>FS9>bdo4vTy|#27{cx0s7yOsET}Z#7Ar473e+}BM zNThN&@`N5qkt94BBCL>O1Mr1J0b~l<0zCS1C!CVgo=03qO3{bzZ3Dby;@Xf-I*ww? z9WI6Wir(;oz+8I|GMNHt0SY2~73g?7UDWN{vt?7X%I{571$+)A8J0%^@nupc5>KRT z$Tz6zk`5=B7*YB{8URRJkZxsuK~+YnmQGajSRe&giR;^wo2L34#(=FUDb-7LYPU1m zn>4$W{+dAc$cctZPxYgynBCdC+V(a zsJ5u2vd;L9O-<=&-vd9Zy7b)Bg~UOOuxevfu-84^je(6b?o@xGu(KGc4ez=1?7D`n z!D!m5P}w`WvR$^R{m1r4hZ zlQ1o^q;G!#mLW@;jFniqlC%tTENr8xZATW4Oi%T6)n?Fb(qlG~j7BnBLg;@acyKNJ zofONB&k24aY*&i1N(5g{7#mAsNdy-lUs$j(z(fz{5*^w6>2^NW+}V-$RuFB{=gi)$ zP0AnF=5ex|BU)uCX$wzXTSrq&nxC`!;}%tAbJuvr);zj_I^uAPWeZ|tZ zqRv>K#im!N1`l0%`2OuKD3g|6Z~4Q!7tcL(i71oOcaLvc->l@L`Q{2yUD!9Byn6BA zu!gU(hq|leof~Q^74fOQYO5<2QF?<4sn%%fbQwv{SP09SD9bW-U#PfHVw~-&m=|SpKpkXn{3! z)Aqxav0!1>rH=NqTXS3zeYlaCF17cjX{0cX9l8=6|Lt{5_u28*!_zhB-$kQQYnn5|t6Yl3_&(%&RS(#g?63U8m3$zl8k8N)#;bs!_9 zQh^8I43IIr*zZOkfGCE^N-iU0#a_mhNDe|aGy=%CyP!zsdEdI0r-aPCl}m)22m>(y z8|%}_px@=NS^_eFenD}LC}Bjgbtm{tbbld0SIj(ou#%4pbtkYieAf)|g8|-2#Ckm_ z%xdU74a0n~=h*e`&f~p(=SC`>L77!0by_97Tw{zj868%qTxW}Bx;L~3^kE%uRTLGK z!H`$gyEwY%{WpWnUEcO%(>2kyK5yZ`M9mL!lg%DadriZ}CY3fHEY2A7daXu}x=^Lk zYO65ha;DIbH<-?E@A6K@F|?qjwX?}^FskZ!%$xG+U=_LpH7<2!T|Ztga<)Vs`!mSZ zZ$V|jccg!cuPDS`#IQwq%~#87-lV?)-VxRaqq=YG^GD@1Z_s~p%bKmr-(miPl`|nQ zBRT6y>M2Ye5oTkZ7u?J8SvU51m44-xeS~}F^yRZ&Us=Q4m{nf0+y&WD+J{1X1~>WV zI8)qDjL(ps93(y?JjBY`9GO2UzKhpxyDwxCmlM}uUtvG&`wnwI=H}{14^pxn*>-fz zGjW0PzMsF-zCt~oc=jp!2&Nt(w-z;p-y<8X+@CNe{)9ES zzqjdksU770#I;|P&~NQnbARk-%J=sY?CINo-y8c1YlMCOUflP_bFbQ$d;?W^U*Q{& zX96x!>W5OIzwejVyi9-j4rh}-t>SaPL%)BAH8;+>AJ3T)&!RJH-d~B<@$G~)cm|Q? z1)31nmSc9pJ74t-tF95B#Xz2A#lt#Ap4WYhDrG z%c^U>LVphL=Yy{Kars?-j{XzzUEV@NUn{Tq>K(tyrSh7$={IlxO}Ogv{RwMmyl?m- zb8C5JZVfGR>07ROnf@c#0BiVbi*OB2ty%tm*|%AWnxKls<_>5FvuCjTiukRGXf$9CkWpAcaflTW^Ch=N2)ziI211FZsL}~w1Fa7240opl zg9_E1g1Zkpn`jUEZB=!lH(b>fPSr*i59DQXWn#m)-=DVU)2K4agymAb+8V2{xY4Lz zp>o)gbJJbX!FJw}AFax5*u5*3%ow?^Sqjb3=3Sj_uZ|bzattp^Pt-SDy;R#V6)kkP z7^;UntwBpZpHP~+L#Vp%ICSlq&hb4GWy4(ax)&ZhP>dA3`pOkq?^wf+4^q!A|G31D zKQ8kKSyTG1pebPuzM1%a1)5qWYs+#I@4sjHTkJ5KM_q1nv4OM?1vZ1=9#ELuP1@l} zl`X2@Yf@gf6?1ga2eDKu3;PN0jl6fkeJsCp(O@F_R`4nD350JWylc9%`*3@7_+XD- zAuZ0ediTxrJ#cs;*>$vc;qy(5l40a>CF@^&V08MC(cJu{j~8m@I#V0_tKfgfI>ut_ z=h_ZF`fT^yiTp$7U{rC8$20m)d@-@ltvk~e7@a3;lKcIhJ^z@+P z&u@KoowpK+3V-x0Bh$X2VU)5zqxDLT)+tB~m>7F=NI$}`014Vbp-NDTpqdPY%mk{_ z>+}kAhf*W^NR8|xP>UASVnmO3y+Wx+16>{B8#=gUJkQR-!-8?BQi&kPpa35uZ*o;F z_oiR{AUSpLox)Hm6y%^$%3UAp=F?DziSDF#d0Q;XtXaTDAL5vD z(WUToKzEQ9`MbY!=^{=2=^y{j4}SLtZ-3?0S3dp8>(?&6dFjpjj_=;NWd?v~Ykj^p z6OUHdWIT0&z961O%0MLPDvp zv=T*6gp-BH5lLGokP)$=QQJXwFKt80uS))sXhxHEDz|Z%f};IR?hhpZ-<)+btlMr(V2*;Xb|{uRzIp7^m*Rn#8&Mv$)>+Y?e*E+A4-=m( zIkK&;;n2n$%lmHYmC--7q@9jByR*d{NJ*B)>K11MQl}a1M9Q98B%U~&o2e^|sf}mH zdxxwoQJGrWxu-uI8NYvn5&?Fbx@MvyWoH!~k;Hl<+IuKzHrD9$WYKua*EE`L=_$v!mrxd&?k*b5%hC-|mpkEU_zja6Z{Gsk`Ek;vy z9QC(&^d_IY-Ve(=#jXU~bBSVs=KDTRqBFQ-`Tbw7jU?w2qO; z@5lVX74N;R+(ZDKTM)7UnopslJYq&r6X>G_uoUP$2gVe-F-asMgijLch1&E+Avc=z zuWv)bq5>`HEHLO0wV54JAbGx?s@w&7Q)p9i=uEHMZ*A~orYAA-x&Z^zQ8o!AfS06Q&gzC_&9%?I z)T42u_YN{HLd_F-iBeMCqDwx;qEtyK;w+B>3(1MDYNa3;0R;~R)n&kWV8 z)haqQ6Ni~qhtwY1hJCf32CLR0?fK-ViEbwI(nr}pg`WFo(XU0FAn|FSl?9Xg#v0Ne z5o>@Yyu^;+f0^Zf!nGOp0r;kmQ(rF{EjoswcSM{T1UDbu$|!`=T7o4lQgW^9qLsx;rtbE}N+KsnAfrl)nUO5o99y zUqW%1OLsS-DG7RE`JD)~niUC*$Ysmg4qDc=G)H$!bu!YED&~}%xwKqovCzJ`1N*jk zwE^3msi@P9f>6LP8P-tpe~w1OEV7@q=OvL#GEfA0KiO`6iq^P0$IAj z-eGVynu3=&yPA~j6x0=JeWtn99V!G_r3ESKmC+53?vD7tw)*_h*nr7&KGYlTI?%W(-!~Y3<0N2YM!7e$MgAhboycE*PyYoSfG3q6*;Vk& z(54H8Qb-NNgdsVG1L7?J3xr+sUib`gJAdwA$;)^A*YI`n_70Gfk?c6b}=3H$&l=5h;N$iiOY?n z*{W^Ty_=Kq^=C%Ww0~}!M1ry&xk}lzqs`OkIR0!;>+#XVcDiQj;#_}QdsN{t^Nc*@ ztDBz8CifrC*b}aBUlwApFj+lbXzp?q-0fFS%+?u2IJRNy>C1(XzpWwS&t1OW*>-$m zEz77+OdF$SmRIR)DQm;l4yA;jd}4CqOP{E7d6xb-g6MEWVbV(_T6esjR|~~)#NLjTuR&N1QwK=kR6MeDZ3!hN10e-qS-h{C7X$c3 zKT+fb$Yj##(w#|3q;tBc*|=e7AQB1&!x6t+?t=SIf|Mn?5mhPvPV$`yMF?W96bBVT zmymjb8pc25Fc*y{e@DweqJqf;U1A_JJ)ZGB9eum=$?0>S*|ct7zIJM7wq>VPj_fW@ z;n|q3THh6&nHao&Vmh4|t?xN7QAirJE(2#%D1z~-u!G|r0b@gRtwy2+7Tjj9i|eem z0i^eiKQcb}!ZXLa5?zsKSJsuTHfi+=qb44#sH%6T`+H74^L$U+one^#;spx8q@=11W*$s8m`4&yh3TnC-i5j=S!_Ii!(x-dA(V<1 z8*vZY?zjNPAkMREeY_1SQ0MQ3oUB+z~?#Zt7WQ&gRbqOk8ldx#6KctF5i2t=Uv< zSIQ);w<4BE)f9GZ9FMf`ZFb~cg{y`2C%ffrN5WZeH5zEdU=aH+p%X21&M`x{HT5`2{vKzZ2GlqI= zY9Ur(4=n7Swsk+;UT9@yO|bQ3XxoUH2r%_hjf)q%kAJ5FGD&0To=oVpnY`6*^2E<&^f!<- zCyh3=R(4cK6x=$&<`e0c;Jg1`viVR4CE9%DScbTU#0A7PZ?K5u-((jWmz9JM%4@FB zf3^HWQMWDskmxqpm*PG@FRwYp{7As-|9|G*13IqjIv2iWdhaus-aBS60}Of@^bQaJ zK@wmEdoLm>k|HUJVwFUR>at{6Rv~3swp=Ayj(dykIB{&}CHehg$FUPTFLBC?S6-4A zN0|RR=gtf;AShC{ob|l8EZ}0_eb2pT?|pXPqz7QhUoXHAzq;_OYy81wo;6zWtaI$I zmU$L|AwD_aVMwhBVBi~igEs-6o}9UKU8Uf|!up60S9tbYeAP0~K2Y)OtLz)gJe$gd zGM>i}bNGVry}m$?dBXhjUlH+;8~37r)qmy<9mvjVVOi0`Xcw~^Sp=oj>NXth2+K-| zPAuV+;8Zk;QINJXH28-*gaAC;J=D{KFrY%g%t0ksR50CAMj}Ex8WCi~vdET4fo@f$ zCEV<81s#Gy+nVL@b{HY~bu{>~#?=GLOJe|)U1wW%SMbUE}I;v*?GEGjD6&>#>7 zrsmswAOR@*lVb=9Hz{o^X4z1|fLuglg;Zek^)+sTd*4V)dMbSjzVAuglJC=#)pA}J z&U8eHuxW_eL~PBfPLo`x^BWOV)`)d1A8G07{9&kPK^*Ly|4Lmfwly>PCl}^MPS*Wa ze7|LbSQH%ZNfZUl@CP45HJjUq61b7l5yt%~DOFo63qa}Bg=_pz&?|C|*(Fp}g-Ea; z@&wAJ5O{{Wx9C~KXuxuB$b4WaTyd-(EVeQf?e#b^l<%m`IN*XIEz3x+N8-PZgy{hw z802)TsICZ#AQm`wkZ2cW$xl=a07(VaQUIcKBWR^=p;}Qe<3F(ZrLAJlp6(3sYF?s^ zJDkqiRr_1J&(%-OxxBXC(IICvglRjmxpbu8;SUDYUW-VqQmfsbz(AvSw7Ow15b>>C z6=oYpqJ)yoPokoW) zz&TgctMrA@Fcj|;b4|cYUC$v&t?`7s!g^xnsll{qyN-T3VJ zpH|?x$Yu+#74f`Qfrs>k74Tf+lQ-fi1S;^HV~3Z)Ltu({@ck$ZeNTc`L%W9Q&ZEILbT-&su*QlCJpwZvgKiRKbsnP#=K#>k!7?2kZfZy-!a;+M z^eHCPE`>EzOVktk5Bf257{Q!!lV%VgX-ew!57IEvgNQx@HlQ^H3$#vsTpI3c8eSP_ z$tOgv?$+@3LyZ$_0$H=e=}o7+9s37shobH(nMtg&xEiB1BT0+bX9*j;PID^Uv~IxZ zZEowYHrCevmx5>It!MTr)_>*s?Z;|cQ-O?MXG*v%kwk7FlU&^tsJGi=DztW#>n-|- zqk6cyrnfd0wZ>{p!IpqNP}O~6V(m9S|4hmlB2BLrRj2 zsx{wpxiYz;ueYgz%9Z`>{@ar)kUP>aX3i4%^Dg8IOqvE%^Hyk{>^sXD$5ir?NMjzb zB@MThHu{)(CC{6@{!ZuZ2_5X|n9QS$D=n(q6Fo|kA|tBO8?;`1Spw00vlm_v--lV^ zJJ`R>8=Gr5xpXuy=VkJZ9y^+_l59XS_bOi=jL0kCIzm<;j0GvNJkZ=!E`hsFNQ{*= zlSxrUt%N8fv@2c{EwUxEtJ;{G-7lBp)>|VX#SpXVw_Xe(>)(Dc$V4tpsJ+?8 zK~FVahKkT-KP~KYLF-zza%iBZtG%_czAjshsjhA(_4MpucMz>hOaeZz!U^fqh%q(7 zb2(yEm92TWYe4J7uXB^(+{81EfK%Bp6GBx)X0hkDT)U9vv{CwFz71%9rjw{Ngmynx*JYJM}={^kZwAkM9}N zn>-RxynkgRl(yV3TiY2knF1JU&<_B)I9k57L$Pih)Ez53(z%mii=4o~fspS(Gr@65<6ORV{PPL!Yf7H?vS^2P{DC5 zT8Z{|tCJC&ErmuOjx?0idQyo%OjmkD3db+plkEA1I`-MfhUS}|lY_?_r^IS88Uk-H zMa}PUVz$0{eoCSft0gOAsl_KJXP{@XA!?pKvi549hWmkB#ozo0H9d-!I_%2`OyA@v zed0yiqYC7AJT6{(qO#reghu<1w+AB6lw|;Nw2Cs|nrPrg8BnlQ@a{RbWeM-Hs2sY) ze+atiN#=d|Cwh^f5y2Q|^uN?@Wi`AAV-*zA3ye~Qf=U#Cp_`B#VPp;FE^EZ3k_^@w z`pRKM4~ugf2LtM1iO*ZhtI;S%#_$>$Nt!^_3aK#T;Mb?4EjQ!P=9o#AIk<1<_D$<% z*G#XRTroa2it@+i#=2}O8T6Ym?U*^qo+L*D9lKU^Q$Q~gj5op7!&Sk!ix6`U+LjP7 zE1G;H=FtGUvVt;-o)1Ckicr4>Av8D85i%0eWW z$lh$LJA1kF@+p`glwO)EXyGa|e*-Nj;XBQN7LIc2yrHWOZz7o)!bnSZ6->;MnbLtd zz(^*5=M)1rY`M&qdSlv*i5DUA)+GMpHoQ}%pAFCrY^a9Fv*FmPP;_zFcYp)nUzwbQB^W{ zSXPsi#!o--{0APW4?Ap`;gZ*PizN$1tngojkMqC6ysnGPbbhi`3STCYk7Y>4kdgEP z1}*9&sKk^&u@NBygN!slY*I=l_((~O7vhm{5##5HbNAeFaOd{b(<4LOops25^tzJ@ zR0D}qNS!Ly*-@EA1HM8wmEhnPWFrmCQ4vRkBe{j1u0$#l@9vFWnbI^1;yzmh3TPTK zBwH%sFFL(yxmfEk)$c;FwY$1D4(rTdvedg8jx}w#vmrW^4adBVi7IbMWkT>RT@>;*Kqm4j>cI`rmO4fb9OZ4<*j_ixLY$k;+UTrnc)I}$Kz8IQL z5*bPMPn6@=<4i@-AN1;%`I7}Q$Am@%KI^X+o>c*Jl9#X!0)u$6V*y6wScK;#enxl}_f}!?n%DC83C}`YfWlC| zdZF-n#z62Y`y0Zu-~Ps;XFo(@(1cGH;eCyNyzsfDct2Od z`*E!I$_@8i=l8thJu6G^xac`=@Y~98}`BWvDR))blP#C%gM7ELG%qIvejoVWhNB3YxwA?+yyHwt@h-Q|( zM|ii&dlu8ja?cUo_1)d`I^TrvbMt#nE&5I$;x{f!tKLO0Z{1{1Qj1{T;PcDwNwx%o z?@eLwyMCgFKJL4P9~5~~nDfap>k9wE??PU~H2W)| zp@*RdL9;G6MrEvw9Yr%v(TF2YE=nse&IsT&Nby3!GKo2(T|7F%qyB}FW2ic5ZOG4I ztQM(jAxUfscvgg3XX2i%XQar5mx`d~le*B5q&jP0db%$$H{N-CV}rd)E0q{^ri{mKRf+YHkgqvtacNri zJghx?VC2#B`(v&8Vyz64`mQDTVUf(ylyIHDKXfRyYtd%JZ z<~SN-Z<_P3|LA>ahf|VIWqtvle40PBEN@~Ct{}SsBk;PQmo1hhYxrl%@}0r}_GSLL z!XH)e9T@PBN_^K@!FR8-pZxXT34HhKzXOP%(?2ir@)O88y(nmSIg&dMGoJW6L>%dG zhaRHRVrx8%1tI)IgLANA(Kv#nbu{tN>_8h!?nA=0jLfH8djG;*=zp_m!>W~GUpN|% z2cl8Z|AwV4RA4{}{h+Ybf)_)B%wR$#LLaJ_VhL230VR((?dM_Pe(6frrClEP zs<{oLDWhAh)vH1wduD3a9s5!dd#tT3Hrn2H-?`l#zMc0 zqrQ86x?}&9_m4KOZ{QvaA2@gU%nnbwVg0dtPS*t*m12cHP#;R2ID2wSOHHKh;rBoD zP-{<3YURzmQ_<@V^>p` z&ln8_lPIz!S+*oQmKr`t2Edns#X~YGi6M(}vSQ1V0KOsd3-KhUmT1Bj_N>HT*AsOZ zSw1tF{T;j4xRnOE#BN!+=Wspyx*_DTiW>%yKKzT- zFPX9q^JKz(S51oE?QZm1(W#fUmwa+Bv zCVDno2t9(%o2ZR)j{Rlf`Qlmee3@on6g>@^J;tmcgVI1?EWCC%k{_~<;I>&re(3N` zob4r|J$z{U)^)R#`V!&l5OD>-uPP7}gbl4U|6 zYAn2u`&$eHUdc}9(dB@brO>B|Sd!%6CB1$S8o}X?iIzMjT9SnF8GH<$I0=|mQZ`QI zOcQE%gaAm*l3Nx5lOJis6#4KK_mPwKT|SB&ufNHoV(<1*`RI}t621W(jTo!8ZQ<=0 z;SkMhR!&Wf#{)q$tg6hQ7iui1i-dGVp?0irL>A9QIHUkm?5Rkaej>-Y>=emzKk;{T z1d~mUo?&Csher9{frGOX6Y0hprCs4p_#Gy*!>Tay;+S{Po1GkAcVsNHtIX!3_tlcmIKhr-K&WZQ()y%W({ep6*xPbK5r!euDgAQ2w z1ziVfH@s`b^3cgn zDa8q~beUzGXn0F1+GtZy8AB^G0xa|B!)MQ&zKb;OT(hdbx1}jtlZ;1#$hg&F7oIJq z`0WAHiT7I6|e0hIo8#jZ<5{wZ}IQ9X+!?Yqn13n$LCgKXZRdsh0#)mNkct?G9PY zUZW#CwGMQ(LnQI}^RD(Mv-jGl@jC+Xh0b(j9vztNX`&J$C2R?0AOgmI9yD z;jHW^`tyEN*in?hJBSP}!=%eFukcS7wijWxSHM)4VP4{YPk@05cQcr4{M*amnIwE$ z#&eGQAB7(kpY@}PXQ8K0an0BHmn-oI{4d!D{{Ia7C4v7n*IBLV35?186l4Go8L;?* zh%d>3N${DPRiX{PRwY(xp~98~fm+3@Q7i+(S;D+%E?p@PR4VAT3WW|mQ*=!jWhWG3 zO)Z02V7n5ZsWEkxQ$t%Wi<;X&O@zb5yGN~HbTWkw@?p70km<2AWt=FISF5!6AY!$a z3PxeoOQpmOt1myIEH3D?sJMu+%xfQc>4k?Mx_t2hq{gyB<1_4MisLK)dxVA3|P& z^k&&v89WChF`5`Rr9+7*KU85Sm(e7Hl#h~*z$EHJocE=3MsOV}jLkBxARJ^!~J~1|c1D=&3)v6JlDXidUt# zhE>5eYa^isr3gma?mzf=r^)*>%qidhtxu2D49)q{VU5ZNbf`5~iX+(?ug;*IIo;QP zXmiSmaxaHDxa;z?zu(_|$Wt9Vx?R5UuBQ50V`nC{r)lJs&usHl5qU0r`(2Qq{Z!_^ z#9e~@Pkq|cP{TZXyD{eb{ebPX^NQl|NXqMiI0^Bnrj{NxQa3EN@!NXa3Rh|oz_ z3F!$NQ!IhzBWEzM8d{VT=4i3kvx4+`MiD-%;4qzm)v}Nv>Roz_6JazMIi=CifwvlF z!jXqmes}m7HPB&N1B)3Ytadr17^3_92U+Ij>mU5s^B;TqsY@45LUq}&ZgRz7e^9e+Kk|1C@M1$9m{GnmP&O7Dt1Yq zA!Z{KY|^ZXcrS`@G{6M%jL;;G23X?w1^N?vq;GXoe)ErxdNNU+p>-_X+@6AqQW3n~>(52ljgFfC9K`Z^XwB6-XX^3{ClDbT>aP5Y!U^u%Pt;R!lJ@&qCSDhu7 zOa)Qrr{FlhJ)RErw$}LNoLz;_dg45ImJP&0mqxQsjmAeEt{z{{rBu(A zi>=j>w)ul~AxGXGvu5vos5`cE&Ks$3#%QzbkwevWd$)#N)hcK6mb-frL!SEnpive3i<_wIk^bt75-u&Q-sMZg4wkQ<|Y0^0u1z>#W3KH^0Th-f4?lA#W3f1 zdm&MLR$|e!7QZanIR<6taaN;MfhkE=3Sr9iWTqugRGURi zsU%FP0+*nB@=&NzL(<@ouBpVrpP< zj5W)=`1}W+ee{vb7mps^wPVwUnbj*NhX&eP6EQbpBNmfV&Rl1&3ul**6hqG-a$dM; z5txuhPEN4jF-sKFWypCZOnF0irkEH7USNacj;Ktyg^C^8A*{@ zNHVQRLb+5vv1j+j4J>oyj@`%i9N)HO!>*0HR;?UGK667Zla5759~bnUThFd9=Ao8s zD4KXBlvNWIMQGU~1RRDwR28>)GGYard2BeX7ap@aBS+ zoZHda+wE$+V|yrZ;I0#OnYA7G0AhrfOqn%(ZHITS8?xs%@`KiZMQ6cq-PC`5B`}P4 z3$>a;;bhd5@J3SA0r!g4Q~te=r1VwcW{=ZN21a-@_S%7vGo(`o91fEwESK6w*Ukic z53h0Cx;qp4>KOW5X=^h6NLyEvHtgiSXsOZ|d@iZt?acwBMr1YmO_nfZi?FX>hrX~% z&`r31EBrfj0n&f>-;26{0Q03X%xm1=75=RV^KUnSd4>D*O<HsN*s8LwsCYq)=sDpm9Q#jG~yksQq$Lk zu2Rz7EILy_^${E-XomuK9?B<3nl9Kv0e6N1Dvul<9nvXI0}De#y4WG_nq{^jRhXl( z09Uzlookd_r1cao(h3ZD-?xdAOudMilklpVeJTf(YVgF1(qcsJ!j*bRBG)ob0TUn=U z4|sB6#rR`1RrQ7nyi%g-#x(;LQ)@PxO;($l($TCnv8l>r)%J(gRZ4W18~i`)5A_Z9 zbTI1oHg94p68=+b2dmlK+9MryH^)h>Hcax$g{7j-yH=~5HX(bJ*62m$5=|oSkB-zY zq^`Qs3A-gM({(&Lh)#-93C0a*oSL^@;(j4gThuy7K+p#$eer{!|BaL%uZdKJSBtv& ztCVnA^pvGN(vc0a^^GJQb0m}*J3vJsG}0rBHqa%lvBYzvO$C{0;Db1R=YG4iWkGFC zBJ6UQ3~0IA%C;6ui%I;NI3$hYyJAh zO?O}EC!HqYRK~lJmX>`Fp4r;8h!?aZe9`T;irEwyO{B5H_0Be@qTp9rrq3Uq`a z#k!naf=?qyCZ`-q4F{-Uk_+GxkKs2k!Q_gOp{|a``fN=iMhA1iW23q`3kYQ` zi>pd+N$y1RLB~Z45y*(Q+Uisk$xlZ9a8iRC(JJ+i>RI_DVX%xAzoY zq;hZ%qS>eNC+egq2Fe4TR;0?+sSS1B{j5h-M;!2r#FW@ZOxA7^f^K9G_n`uRc!AaPN((OIq@aI zlG>hQ#dh(!*9Uw00)4v&%F1Quwq8HWCHrE&x&4huOcTTn&QZu3v5D3zZl10zGgZJ8Bo#0ZFn?0`a8YJ`xTqi4=YL!QbCI=G!XQV)KL5|6 zpYv^C%0tX)LRH6x`a7&*1(%ExroIaeskVY?MI&2SW)OK3QUu>I;F55;44S44M=7{m zLAYFjQGg0kjsb5jkE52w3*tCrX{#WXv=%?OfA`LnlVc-2T`i57bRvc^R%pP=Y-6{n zCCeXpH`L4B$mviqi^pK8Vy>)h5~eQ~$Svl6o`{eL+s-W&1NC+6`!jR7Wy|D>hgsv{ zOrKCGH(?2?7f!W6I%;eE%!SRgIBrXn+gU!*{uh-iq0s!%j@_%4JKi+h_myD7a=rP| zv&^GEMXKel%2c8f_Z#)JZN1R8JWdAva#H3VNH9y@`U( zL&6q`90-&s)kvUI(KJPRKts#Iy(In}AAk6s{cHPblxE&zS~}^=+|Z2iise~Q{;*7* zXmk}ve6_M{diu!y@B83*Yd;;R7PGKAO+bjsbiW80RQ)f3|#ZDjCIEMl_+RZ@)oAr>MD zx}aVPUm4tv&rPr3BDq5Ukqaabbisp;D>#(MmJnVq`t-9_66m2WckBj9bjgZIstcJT zgw4f>AbP4{UMTENeyhTl%((*|qfOmb?dy-FjtwL2P2y|`ggP8O6Uu0xM`TgEO%9{M zVO1gyA~P6_*!tX{qusC7Y0Rb}odT`6$5*;nY}mG=#?R$;ug;mOyeopL`Tr}9wRAS4 zz9%rgVz|u|Xr2GtNUz7!Smn_f-*WVJ#O?aNME>q3|JufZ(^-*3&g)Y?|3GMNzb4x% zLv&E@t+Ju$QAe6EYc-aB`(V~=GkM*Iws>mP8uQ-jxwV4{ja0Ph3!iwZDH&KZqq5K4 zd2F*&tI&k=qbvN`Q+#fXKj5{y6FpQ9CVMSPklxJf0eUvQ%pZafub78GVf_4O1Q_h) z$M}AlyGrgIB(rqLy}14feztsl0iN_j>Z5;Od|&gT`#!$tzMN>hjPFy6t`CT8%j2_zmC~~=VPuAP4g(i@;~L#U%R+h*Z4ifvwE!;) z^5@Fe-{9+u@WTsh#2W77BJiP78dWd;zR}Wm1TB6VUe(gGwu;UcaYlse!0|HwD)YMV zjb2~CF|_a;;JCp2Z_up>-=AE6A9E*jAG#{OkGVI0rkhntGOSAU)RPZhxwLs>OGGYH z9a=ZZOJ&H= zh)9LPsTh0sp?mMyy>rc~i4|ibUHSUDnv_2p4y&d1gjJX}_>LlwLl3I53`A!_Vpy`m z)P@Rah=!(Awk|Jid7OS>wnAWrOx6Y%r&5U(4m)XmXNRxNadV-lL1nkMp9;nHu744< zsQF(@#5c;vcM`qdASxDTxj}$_IdCu$hWPvxoaxGsABd(guVFbcX|fnKjR)qanCxah zL{zK!oJ4wqz?9!q4EKlTuS4@VAb6+Tz^ z2A}1 zF(4##1yKuKL1;H1s{YUT0}1HStbW6auBzA60b_VNy{@sgk>gYKEsb$BkU&<= zwp6cmy@=Cm0{ccT+|}LVw2{{2CM7hZHlt6(1>LPvBkPgxH?e6h*4^>V+U}M>yM#A6 zn#`yN4|mtP#VFL2`f3{8us_qovx#8Ju7Lk`&2*nRnd$bLs2CCGu9F@e82+hv->&jSCijQM6HiQ9RE+SLh&oP=-0jN($dD z!hE|7Ggkp~mHGBEFqEIlcphc`k@+}eI@&CLoXT_vR(0WZ{s^yOM&Q^u&U_}$?U<_(8 zX}3uBB}E(H7E46vor`;cjIA5lkjy0fLwb|b>#G}VJ(ik!ZgYJ{u4VeiSBznOxY{?+ zH1z0TFw{P{tEStEf)-;}U2aV%=hVyFs!yH^b-(ZN7JJGWP2c}vxmkf&s8p`fr&k6v z&I6+-QipQ&A)9H%NZtCD?q|l7aigWp?{6`>qOn{q8}m;mJ32Y8>7mZt>bmin1@y-1{+8|%W1BiWfX6Fj`-tU?@PmHdf=oLqT;Rmr6z zIFm$ZRz=vO59wTF&Z|r;lZuJSr&7w1Q_o;_03!pBh|xh%Ogz96+Ec?Zs)6962M?G; zrJ^AhCp_fCp9lh5&uwDkfkn;}ms1JtVqDCoj%ZLJU7 zf9a9SkDR;b_?_Ff3=MSVTc_Hl>T}7s%V7iWX~B2UdMLZW1{HpwDi!z+EJipG3`24V z;eNueR`Lspe1drb*v1|kF_7sswLVhV7T@0rF zQPbS2CH(k-&Aoz#H4;wbTKZSlII1Z3C6AqHtRpJa_Lj?C*DgH2g#9?D%lAG{lO4?Y z_R$4a3^aFsNu?>XayU@8_Z($(_6M=-pAJ6)R{!``*}4Zt?uTs=Y?=?@t$)b^g^pP}jIzQDS$uVa7!y!GpH> z`vpk=B1GQlHws_p?}L7Ig^lOUv#1Q-S<5433{F{=AKAnz7E~$;PBaN zB8d#{3Wb6;TBDjc^(}#Ni{*^a$w}!Eq8W^H6cr)GAL)P$L8ZDGQcN3Ck!eE<$Zv@f zD%DbKa?&LZ+*Mj?3G1zJfxI1;FP=Dl$H5)j)~_Xw{r=w0j)t5e9<0{Dk{}dV%zLHh z19hlaK)sauaAFXb3U#Om&aN=gj|gGnND!2%+H46lTuh|~^-~U@Q7l29S~P~EHe1%= zfV!RMdpGWk=T*^~s?=TWWBsdbHV+2fqp}eV^b|&gK`YCk7O-jEP@CP5h$z!7R#UR- z>ci1io5_|+jE{M7Sc{C!5nr>*5>(oT`=0x1bFOQ^RfR$?xk1@lf9!P2)>HSkbT^ch zw!ZeLH&uIJ*UBvW*32XR%wz7^Eve~C;hG+Al>@YEQYefvsa);B%!A%dyHdXCG4srN z%-}ohX%BiDZ0Xv%L76<$?=WNHkUg3^(0Eeahmgv!`ck;=u}?%<0c< zIC%v+l0c`#Z}EQ6E&3O7wbX9-#{7Q}`W3F@Y`Dla6~2yhgw)J`T{uT@udf2;0r+HZ zgrR&;#`9D71P#&Cgf$R^-Nfso^waD}V979TK z7-4Xn60A}j831lpt4p3@xtvxu3Cda{j2#~HkC38#QzXmYO2?F(ICcljly$Q!Cuv$S z!ujzS$(T_onS<;>a$pFG8i~}yY!E{G3(;Nh1y#|&YF6Pmp;x|3A&?k(F z@Q5#%vKphl?)F$hq%dFvuvX)U%5!5IGP%iAynDnSNPDctHkVXnYi|lQ#3HLlYq+>5 z73;~=rPAS*L{}5&;Par@>qTA7SNP|m&G64f9ZP^AcDDfYG4|gJ|5Swerv(^ZLw%V7 z%xj$KMwt13AT(FTbD4RxKzwo}7FYDiF)|8Md=}N`00W*Co@pq{9b;(4D)IU2D!%z?+~h3-vi8pg>MztSDJSsE3^Zq_$;jN9P`V@^&i+i)J?|I0vQ}#Q0Nfkj93T&?h_L3=^#I;gxW+TuR$Jh}nPc(p zBmIrB7^3Sy)!!yu$vrCqgt<&Ho2lh9adMH(=(7a?et-mAup-&uD6bC zsHx4)b}IA;Zt}cXE#1{8F>4UKSLXaxfw0&J2Pb-w!k7(t+=Daw*p0rfbY?}f*X%MY zY(|yD9x%%_22FaVBNg*H?45C`Y-6*_Gv5Y@8d zI91Nk1aTjPe5C z3!eH?(Qme?@N$vwUZ(uQGphMbh>-`;i{&iyAoCY_%Y{=1l6d$TAE!{+SeaZ4OQ)0; zIe_`s3bjfBLmdTWh|Q9$U@2xiEs8uKDVT&FluF7Q6?&2|(^TXp8Et(_QIRmO8e!g> zqg>FM77!s1aw{@Q?z?pS$o{=s&ThSDaz#&9Q$tNEjs}+o3~WZK@n&|ju1umJKY`+i z34#a&jl+|O#)2xfjMK}F++%90Waw<4MO258-bR6LY1T2!b@+CqRPbIC0OBv z2cEGvM`B*RCv2+HNSiu#t?F%v>v|s@+qf|v33W#5Cu7YU<13yWY46C@PyNL)V?dv- zkyh2G>emjn+IW#%CAN4x2D{X(=44`Rq_%72u95uxXKS;qiJFI=P#Yz@loQECh~vhG zy*kJK@Y>eI%2eG*>-;7tOW~N!>h|bE-TTj9IuhD)djFQrr}MgGYc$pBPKGi5CEyv0 zG&l3y;KMDZ`dWWxWYQ;+>QV`LJY-0CwdMO8O zS!FN=rcxpnt#-rSNG_M|BRZBqUw;Z3{7O;B(!<=OaW)wx!7|Jj%P=2f|CZ?8%bM?4*m#7YVNv*GbM)VV&2w>`m?^x`F`n2K#4~FrfSr zKkb8c^gebtZ+ZCAT@H~>f4`2?=%lPzvKrEqLj-=2#pMWQ+lcP*NMILLzVt)O%e@)_G@kW?OX1oxz;x zH|1b`(sid}yFEWX*IXeO>er5TI_|$M#vWJcCZ4GN4S6~DOfy=yNC3yjpXrzDfs8N}XU;Tn)y3 z%0?KqhC?f0P(2cRW)v*4Or>%mvL`0CwwTeV#TqDH95cs*w&5mIsmebh`Fc*s_IdI7 zXP$oIu|o&;?j~-iiShoP*5=v_X0wF6?x41m^F!?9k}S4D*ARZDR1_&WreGZxol-nCmBQVz6xX`Bvs=$De5m85t040J36!&C?jyw(p!b(p=_vh3`i{e zx75CP*5gjAWj@!|w58f^&j)#Nu-j!zX=`^jB@!&gVJdZKMax<(HU(c_w`t1j4{*t9 zL&j2TNwue{8r|{j+gH`OBHAsJXdK3wdsjr9b^h8_yY{7%E29BN)}yw0bnd!jz#$u0 z8+0a8#-UTyDzUY;H*2nm*>MzvG2>nJ_H(AVNgdHRot*hCPj7o96mjG-n?kACpsUt| zyx$t9H>XLZgC3{Fs*q?+M!PZCvANbWK3JnsZjDcM=`btS9&HFzStS!#32JifNxLEJ z3b(}VYKc@{rBfRf>h{T%eTKw^o~EM*)_G2z6l3T-7g@J5xbyh&y5>x+wL7J7k3^-4 zKwSgzyIw2o;Yay)W|~=_pG6p4Y_~xVnPSnv03FKEK2a<}aRzOmNR+9+Dcixq(-n_a#?ayY!GE*iZZ62-}T~|H& znO&xsUaphIZKj~kt=D*3U9r`vzBdjnRzaIj1)BQ&txr7n)ajTZX|?oBZ_Gx6Zly%5 z(eMelO~&(g0}xe%QDF%wkm%I-u|!{|aXoN?@pMH_I3Wzn!so zwiaQC?@)mG7*~S|UFzF2RKom48Rj)^^p-HMaMtBvFqy9Otds1|*&jkDC4F#zNFG*R z^T*0CFTozA>)}38xgHV8N5z_9yHXhXe)lkUkvV_@EYTtEs(c3$FB9JL8h7%>_09h$ zp}QiCM0)PTd9pfqX@vH#3+wyqGM?*P@J2k8e*dEk^Cq|dCNP*)TU^guH^oEhu7owe z!Fg`PGykiKHQ(3tdU4G{8q#8Znqv;+_v%=Q)Z+rDVs?xY{3JzEkyJuz{v;fx4am^( z2HiACI}C7`lH^<}p@=BSfFfAA%nTV?LJVF;0nS>#cJ=hc_|QOKZyqU^4Y_d8X;&k0 zlT6Jdk!7LUXkiKwwa=(MNJorNdHPPAwy62_%@{5*6r}=K*Rr?Gd_kYmwEN|zN(L0{Fo6e&-%QxU*E!oVd-$_Odx(CVjPKX?3%mI1 z`zZl)h4TeJ-@$XtD%8w8n>W;=9>9nk4-dvvY-HtVRx9`((!>KTg$J6*Ll|nX^U)$z z4x_0mH~=;N_s5Y~|?Sl}B&YwKL;m z1AS!6Gc_dN*=%A~v8$BWayXKS@I)>RHR#F7M`w&s3!hr-WY=MJkw4?qELmJcy3z_8 zX??xbVv$6`khGA?k)roNuz2b)rQJ!%wCA8S%8j9P_$ z^5lx`uQYM^pH6`Wa1yn$dTwRisM&jLpTR7(Xw0?Qs6Y$C9+JGv9~b3uPvMWT&%_V> z$3^)kz&urkd4*#OML$=e&{&(1dglF((q^ zP~;RWt0YVfW>$llp@yNB7i58e<{VPoNV1?zR{Rlm1SVf#S_zN-h!WIYNkB*MfQn(z z?21G%DNYbbfMs@UTZ=%(_~`He8D&(TOC^0CI|?=QI%1QPV8#+cDGw@pSJYxgk$8X{ z%C}22k$&&ARnuO#w(WKahh1qfH9C6&?}mDMp6^!~kA5I{oAkqRO4ICLu>@vFC(uQT6ctMZ9qRxDc`;ndtF6ah&)~JU{rR7j`qt&7MRSV6EN7D|tbu_G4 zOoz^pL=3T5HYZ0i8OVkVz@$Htc?;7FCe*{9_?tgsIlMFZG|T+acfR(OPk-_wAAahI zi|6k?b=UC&`=+PHM+f`!?X{Ui%;PfZ)oA>~yv4o+t|Qb18B;Rvh<--TB5L%J%aA*e zKZ24^Mj$OKo&>lBB!YYbD(Vj+_Y3AiF;9btH4>^OHb*I_O)@szWNr)MY2hSTSU2vE)w(iHOUf)$OCbK7jgG#vTbpl? zfYG^{uDymuBCt7WS32}6xPV$}E#6vhs4ryAc&Y*#J@j<7J`}8yATdT|QBJSZ*7*Hd zn>L+~+M8Qjox!M1CPqstrBrLMw`8+ptuBtS#%yXBr7j6N1MYph*ph4RUuh@gAq%!w`yoIlv`WZ zI%3mk;Tm@uRTi1fAGWBpQiXWGp*NcubQ!vbT-EDG(yp}K64&XgP)26z@Q3=6^{aPg z6)L{_`1&0COJ|!oHX5{O;z!*!N499{sV(H5Xrf8_bGUWHVYc(KwnE!Z6+Cy zM#_BuP4=5rx6k+G(}o!Nx6S`JXG-S{e*Aw&4#;(~F{`FAJd(Lxagb|w?lG8Fz+e3T zj8HI!^eW@TLFa8q2J?YwXkQM^e~WbB3jeq8B!4$=WoA&p_T{`j0guGybrN2QsA3L{ zfQyOs7>TS>s^m&yN{OHe5TCVjIrYKj>-Z8({-^!)KTa;6!bPNT&rZSoEr*_v(M&`{OYU6ot! z^>jA+6D?KwI};*a!A1@ardDKIH@^Lmt_GwD#^Y%Jr`m0IS~J#owO(zlacM*f);hWK zK-~+kMUs{{38NWZ=HZ979{oy}!sS$$%%))0n1b#yf41+>MJjN^2JX+^YlYk zE?zi(=Yf6e*M@z)Rnd6NP zS{@BzH&7k|&%mX;h#Vaj_V=#vj>YY@ z7KO*)OlhrZ*4DCbI&08dy9d3N;4gF`txK&-L}aG<|IbqET-k5U+8s@f?*1%0|kXe;DdfHXmCdwiZCJ#@=?%hOp0D(I3RVr6bdXda9Hs+ zxD|*zg9b`O8%-;460g-T^Dgn>b__qz(jI0Nh}Aecy=U*ac>bP;&OUVF*nxe!cW&Lh zVcqmp6wDY7L=u8P5MoBRbrup&){Q4@$-EoFy#+iemdy_@I)mBv zs#>wAZZ`N1XYA5rx@u#yL}5@Pht^sn7l%fJOOI^WWg@Xr%k%TEE;^n`URR0c4m0;M zU&`B^NKro&#vGG<@OYfMb0d$6*pa#gMXZgHKoOHb5kr^~=?R3U#7NE|3YiKW6bY@# zL^9(0V&=d&4m9g3&M|k&L0c`ix*yH0dgQL-NA5j(@19*-=4RJS zt{58V?QU(x6b+glZHb6dRh>ISi1KFz*4L{ydC}PrZfj#vyyoJRI27Ut-39u zwyBoeb)`j7J?)XJSyt!UnG5zr-ZhCCvQAg>+G28%a(bm+#Osvq7U$A!wn`bU6dP+Hq6%d?i@;)IM<4;hfd{Vxsr9E?C|w=HYIFkySX|UQj4Tg zi7l9J@-;+49V=!Mxm{alMx0zYB7gg*CZ9&BFc_RR1X&GwlTCvLC1SH0ZRMH{H@EFf zqvW1t-HrB>pD01Rq4lKGQM(qqKy_*)GsGi6i`5(O$W9LmWYX*;j_S#=TM* zN1%A_Bzz*kfTqu}KY%!73*Ro>FM5KvGf%Ro@~%EsEuBPXf`<-rN_iF<)rFI5G37~v z)WDJjgVaDqDJF+Hf`~|Sf;j=|B$dH0b!4j|WQ%iM~w;lZA+ z=Eh_^=p!=<;lh5BeUcCG2umIRpqbF*6v`_!4`oSm3Q5N;Wv9Tu1q;4Z zsVk&FE;?~EVlW*o0HLXnU~JeuXf`DBMUgIHHwBG0SU4vCKu@#L7>l^2u1LJ2&e-Sn zt(%*!8_w+r^C+%jbzQ5|?)G@o#=}Q4xz;L)-676+WrmPWXHhsJ0XbJ4&s~~cU{7(x z9UbXw%lOg0Uu1RYv{o(WNI=h*%XHms8e_x2x;ySnh8)#yeU-;(GA4V5+^+G-9z%Zp z=txS;>;0L0v@sXr5w_$kX|EydiFD^eCd^@x%qW#KHt51(03}PqtxkAn(C!B;~u@;nu@87$5Q!*Ng zgsX$qAtkX{P35e%B?+yd1F0oMRZ^)yM1*{><0bb`vDSx3Uy?~34iOm-6(og7tpv5B zJ@P5VL!O={L*wR%!>?}KOJyi2 zm!`2;M!aMXcQHqq?i+??-;-TcG7}rt zA31zr-{!gXyEg19Z?1-POZ**eE(Dh{L7vBQ5D zo$evqZG8JzruTBA|5NJs*QV(%{}tKu%_lqi%X@tR{3`7A$JjroXCc{Z8dERBkhr@5 z^BViFw}g3x{o=APBm7^M@w{4sK~2%ZvzmD;Uwjs9^K-1I@O8)$0iS`E?34OTG+YvH zDzERSWxO9=7B6IuNF=}jFU1GEZ*osFZq(l6OSQ3rj370w!n3cl-?_=N zUoXSF$(fghd4bkq2zbtNzhsXH&ti`V@5y8fU*jL<|CkFiU!mXTEcXev7Vq#f`*%1L z^zhTX#nu8A3;YCEzNZiOsBXCD95(iQn9;lFp0^6$!%fI_7oPKj8}7Nzej0~P<#VX> zyL`{z-f+*G_%82!&&xO5^E&&Xo842C$*-2b<%igx--L!PmSNty>7GoKVcuYWf7v~; z^1l{fK#LTHd~f7urIzqYO8DNz_08XK&vo`^O!bm`s>}C`RnXaeEHV_~`@=Ts2#COg zfT6QZ1-_s#lzz#&3ExuKvN#a#*}Lc-iS*|j$cFMWxlU{Yf-6j})3*{%HzH7k(@lUS z{CK$honB|ZwETAxnab}>VJOBR)4$}M`^)c4@c!(EdtO3PcVERl+$Z`f?jf;t;Tx2m z^9Ja@@*Y;W2X_7k3V*}5^1aL^<}jTlPJupGGz-rOT;cQ~X#musy)}$h#avXdUyNUJ|DLENoI1}d( zIohGo35hGjc92TSb~Y>p5~~0honcm6PXinD0#Oq&(Tr-A5#*_msJBoK1$9!xo3gz; z7qXk|9P38;oI>2_ijMZ$oeiTc)})2)xc~g#E?%^`eS5?dHn1>bbzcAI`Nlz>@7jCm z;a;`6tyh7L2>$_PW$qTf)+X7E}nIx$F{jPe{*AW<_kz z*`00d`!Vf{s~KGzuWt29BHMPa2fv65*XLiQdixs833w6_fp0P&&wn(^DwMB3{NROi zcON^rfBVLDHEI;=v3mIjFg58JbWpXRr`4BNv>D}MgH(zZ<_Ox6j(q4Ag(*rTMkn+S zkTZI%9QjpRMx)b`8V9r;z-&|_3!`7U%Y->eti%AnlLWczFrIZf+GM~f9{b`KzW&uO zeDjOn{Oo65`^bl`zwp5)9y@i{(ZjoUZr(IKMS2A^HzecXAckt2rBw+r9Ya{mEfU-@ zRF%h%%h?4&BMp*5M+)6Yc#7HvH6VwaP}9lYXgQES7DLAswu5vTwB8si(u% ze8-O1y6x3@M|w+M%*zz{*^HyP&O85wrFMwgs}b=PmWWGBGF_LNB7+lwT25}$8%=R* zV>TqIv`ZfK=e@ori?8vEiQZ_W33C*6aZfa>3R=|Dcl9o|RWeP~R%xYnOjS%3?uvG# z9bS#y!-^F?htw3|-mI`=q*C<3EgLdguL0tVUt-CuIIQyY`t(XWY~pVJps&KLnLnyl zqo1qQ1=;x1!e8-cAsa6;sJPDSHnaafZEpf**;Utz?%|xh&pglbJWqA%)I6P!LQ7b zUl}o-DBMS}3!;U>iM85xB^!%{KVd~RK$tx#9f$oD`C$rioOGItd&L2ODz#+7=-nKA3IXp-` zzhaSq&*iY$kSfH(pwiFinL_9Wm{aC;6V5H^rW`@BVA8KL10buc5d)B?B4~SRg4B0@ zZCKP0UF)kPP2rW3_e}p}1T`=^w~?M+7}JO&ryiQs1@n!`OeQys9-ydAvMoEBXl(C| z;TqpApl?wBqJx#LGysy&76t40kkuk9<3MYlirY@Ep_ z3S9oakP*^=F_O2!UE^O?#vxz4AlM*zDn3nC(;KqQH(L#Y>CW26`ApZ^f9kA#fd4rE zC0Yyp1b;JJGsb?^IE{#8`K9}@0rT_6u{I}R1RJ(2c9SQG# zx$~UQ@_)O)l zVDM}z0BbbE4@NQFGGhK@{W+&a&^oLF^$a;fvJK*RfjCmzL}{~eC+sdfQLR9w{JkUI z%)h>UZ6aqwcnWPo2H*B$$VZEa^389EK2kdBBlT);s_uvb!M>2bl&uMut33DgyB>Yh zLl4|>{`T8W9N!0gUf#AiH!(KYUoB@+k#NAT1_3|LKTbiwu%K>*%V0=|{~Mr$Qu-@g z6|YYi5@c#W5x)gyXOUgXtK_5?)u?)EC$~mwe=Yui!*kr#6D3)x@z9&D9v|9TSlac- z`#x|>VQKt74UQW>s|)2D&GZHYuP^q-jJ=WNuR z>#ds7*>MO`j(BBoGWDY*sd{$jjEmR0wE3flm&zM(efG*z+ZNt&Wmb5IB&+n%Q-@-5 zacug=*U7i=7pT!;5@WE6-uKcH#7XJ`OLdo$fC&j+9>#HyNJzd_VhmJqpNT<1s(z8@ zv>1SioIq&P^bYN(bx1-$MSe>A8yhJV(#e3&VdGZ#6{^V3vsUsR7`)9PMWl^&*b@;F>O`d(|vGF5U8ruF7kMG*G z7d0XUQL-M`z4E}0aOA|k>RlHPk7-Sx%q*6)+JV($Wj_k^i()C_35i0|9dKx7M6D+` zn8>dc$L^o$KQ!MHD9o(xo+*?=$iXn^1BIUDeak(L^w5spd(ZoZw)fPw*8`F>9rYvD z*&B7oeIOs8Q*^ct@wY&GYN}210PCGVc4@UIm@-G>Q08!1&|k~}y?tJIH+K(ov-VsH z5V=RCowV;P*?-i1Ul6vl{$Dg#?IXtaouzs*Gza^#Ic(n#qUV;fFU_TWA8hY?;|~ZH z)O{uSt>-=gs!hAH?jxOVGIc%s!=zVVk``%nzdCs^+#n!|c8sb^ynkxQq3 z!}G%ZH}BJmZP@2J_r)#tp*iY4_)a#5eJAbbVDClGWMM+=aMoe|5O=LXC_ z4fG{bnWB!0@@4u5AY^X|%mnbV7vGPbocO0U`|+)TFH!S{Pu+S8gK<}eINptXnj@uJ>i?^;Vm=`K?u53 z*M!cV>M%^84x&b9&`?IY7VckGyb%d?@U=iDMt=&r6cleDI{`eENK9AxCM7~riC)Fw zKlVDdX*c@TbIHnW>4f{)Uncuku9n!(u6!8@!5& zVSwac)!Re<{kCC1t=2;%l9Duu4&o;;O>!+Nz95u9d0%&q%22p*aAkHPlHXSCf5YY6 z7S(p@x2VqJik_aeWqT)g-(KmKKgUi#e0_N3s0A^8n@i_xQD8?DKUTbW<&J%<{-JX3 z;sxORD5Hlj2#>Trq|%NLDKv;nAmaNX%Ojlj*U>k%=XZ!C`s?**#zM;|+!IGn= zx$my|S*lT6U=^Q+vQzcL2|y(OQ9x&CBy!`?(#p*E(5D~OyKYq(!7Bx&%T?AIpqefNQUa#et@Z{)4p=lJb&92_!w3Ao9w{f z^TMZYhQHR*2DrJ-J+~2V*gki5&5`7%4sV1k4*Gtp^;hCo#RjS|KfsSS&9m?|pNaS+ z@B<=r6lY!~V3F3K|3OXQDR@nz2v*c4f*C#mG*os23B#(nlLE+VAT4Md!+g@ObsYs> z{1}g;V64~wxMumLH$=88nB?tSd?C7LQUnGvnD4#k)CsDzIWsjrI@n*x*(}@z{sLt% zD{&XhRz^e*E^$~(VK}7#aI%vsBoZ`}npkvzU$L}x%4yOpqNB9V!#ZM6u#-g;$2F`` z5ak^GWxWyeHJ4MB9cPDzM!cz9%IK`5P@Tuq41|-BXl!A=*=x}S6RD`-;;BeaJm3x| zt$tI^k=vb*jt9Knj3w(dd;NBe&J;mpMZL%B8Q;EtRhKRog8kLCg~C*Lv0ge^)b{SG zjy!N~a(>x5w{~dBEy9R{cC_dqHE~Ba+S}N3;$YN1wzx26e=$)AWh2gTz~l4nT^awx zzFk+-d;NZUyatJddRgolu8w66?P~A~j-9ukI~ZITzwJu@*kO`C6&Qr?L6}wLPvge8 zBCCoJmH+BKpLkPAk&bI#8A_fJ@vpo0E zgI6w}J9F~H(IdNdOf?bO2bn<03G#XX@yH3H_`aJV9&jEfU%{=wdp!;A7GO?_HR;%t zGei<5z}-t^UJ*6o*uNX2He!M+?&NK@MC4|mccvZNW$&QguDdntCtOPw=b$^|R}f&a zjYqQEa^s&JaYGl1ZAK1DbG4A18{UKj=_7SbAkZJYH73{>%Q}}(JGB~6vEe%^PFZT< z{H(JZ+t%>}@dzrOe2V`j^Se>bKs!c2!4t#?sB>Q6Z~VwPALqZk#hfF=7nFTK=%3{N zn(0-_{-o0>xcUJ9KbTLSY-VkrzA^_seRa-<`M+28@AB!hIaJey=0G1}bD$4>ROsRQ zq4!}w_D$r(>{nzi(13f_-wAWi@vc|C1&IoCU-?#N4)HViS~uYO);@8U@+1$^*KD#Z!@u=Q!po5UmVmy+_ImER=(9`|NCckzMNUZ!uq zNJVRy8oF0K(;v3hwp?>v(4)r#>FDcg)Ls;~e9lM2+18#-YxZ=Wv-P|ElK9l?Uh^4o z=$2~~_(Z&bdQKnX|8Z;h6cI0=&cO+8b>6rW#0#i%UgH1o7IWaAra3roHV5bZVHi@$ z_ut0dUl4^C+rIx+YwtRoVD1x$bMY#9KVCYjby~2Fhriga_puqr$WO1n-)H#W-TM8= zPp`fon?vv*RG6QB{r&hC+kX01>*$8}`waL0{!mij?1vJ2K>_h1eh|g_8Rb6y;<}__@Qtc+2oKDx4FyVY6wStasbVm8EU05J{~+SyeN~+ zFlo=@g&l+`E2_W;^%tIQFR3r2CA0s)7BLOMkSskAejS(%Nj4-)3M545xQJhf?Rh;% z-6+f|nbJAyZOG@$&Gp4c@*3^ptgG%aBn&#c(Qii)6MfKcM;^a1o!E5tGG=`DgYB0Iyb|!B7OyB9< zwba7E((gZEvcWKf@KM34w-hQFy~XUQ{^mQHmxuay1QUUpS?AI@!>-7Ze_?p~?mI>s z`{E7W99uhov3F#=y0ky{LFgX!)>XQHz}4-5d!ls!c-V1&*!r;MPf-8hE!@TC`64Pt zg}mq$B`kF`RJ~3{0V2xxf}#rT0U4%b91^`ynMkw3a}V5q z=`IK?#}6OcySjaGVvO3U#-k1k_ZI#wtXGjDQU_bV#0Zn?6s7u?8Pln z_%o|E%x2)SGFg-*VwGCkW&Kz}Gle+dS8|Ul;tp9hn8kxyr<3$gnGC||@b+A6ep}p) zQfvmTWVgCzCTuda@kRudF^sXHgdmp2Le+yFUCA3BjC;H`w6VIpn%O`wkb{L}(jg02WLS`tGh@n`QO>m@nm*1yJ9&SFjeDsrp{@B=D-=j}G z{kBn9@%P;O)b849Z)S35A<-*{@c!yW^LVLt5X!-Yu^ms{yRVvAoz0xR|DpSCPZctt zNh;10y}_M>hJ1$q#f|g^`sVjR7rrU>ad&cWp1$qS z8WkOyoo>|CF1&a0cTyL4Rl+5!1l_8t(vclYfevQ%B9#um0&W;oF`<=-tnHu(1}2~Y zZMXoOY*6Z`J?|g%mp#_^gnMUqmByz6`AWv<>CNyaQ)D{q3Hg$t;lbX5MPm(QgJDMUiv#t*LGgkT|>gp z8D6h>i~(}n$BIxdlg=a|GYr*a3>rP`Z|GYtAWol${f%cXSA#}oAPwbIuY$A@p%V&7 z&-@r0tOGag!+;xR-T&+9H@)%dJtvPJJg|Rt*N!d#e}aEv-Kqq@6DKlFQj~3D+aRUl| zB7rm7ua_-@BW`=qt*KEs!}_cqOU9T^Ou10viFC>5eKAn1h$9C0|T z>{iE;p*j}O2ddpnpsP6)k;cmUDzXieLtjMaDDt@9WDh}~S4IxcpWVAUH#0psG1l7? zi#YA99{OeevPur=UKu5%Yi9BelWh-)6t!E+dYRp+t=2%l|wLUcq5ZBo2c8pEj#9|_EjnmEj{$H-4K0X zSmbW}y7&m_$9eQK|L3N22KD#u45KI5Sva2C#TebpfFz<1r^tg`0FpG6SZdS?N}3!} zrbrf&4KiIJOX`6kOQ+MH01QMS<|=M+Sb$!A3plvoCB@evS`WDiKR18!CW_ zWflQ!ELui8I>6U)L7|Eaj6|w^ROJ80Gc>(D+pGng+gBBKI_%FB)5dTuiZ+jliLlXY z4JLEDmZOehF=fb3FV%H!y;hVYtM2~Yj>_oLv1 z&BbaVpm5U=HXouD~w9cmsPT&jZrPNS6t?ZZHEnn%m$r`=hpl>`jFhw%WF9Gn8BS5wEq?J|+~IG$Dl0Vl*Pq&tjqCffgfyRgB{v zeh|lSv13qh} zGMsu;Fj?QwczoYR5F9&G{&E-SH6NG4%b!0Su3N)XBbo6Z4TD920pUW^{l-T?{Is(8 z?|pB6$J@sRhjsV4ZZOu z?uEbxwMc0@D~@dr@g6bn=gu5~PDssY#z(2k2kC`A4-i!1?&9xKN?TFXvvSRV0xy@A zNMs?koUGJj&&F`u8AIGmacL{VENnWfXz&U@RK%qw}e*q?Tieb?1?suJ2D5>_QVC9MjPF8{8V{psyv@Le58Kr=vvOB_4T{L zk&M~yie7%_qWs)@-}>9*lSk^wzF_gtY7~tiw3Ykz7I*Z{UAQk+>vc`IY@UeC%)kFR z!C*1@yq3yfbU0iajtE+9e5xS@jO;FkpU+vzRQ8{fIqZ z!**yf!*f^ex$_R_l_)k!Q58c2y*-6YIuQ=K&;?1S<<9fx$%n!-T@oUX>K|0Vi`9$* zM1o%qKxoReu24D9RcyMCbC@J#7toN8Y_l1F9tQJ5R(W`#`Vqt=q(XqLVwx%{OPN zNag53SSu7z9ZHv@umDmh05Tk29sxUAWK?J&8p|+Lfg(wrmb{))DVNLVOKCmHFHF0~ z2}82Qt+dr8vfR<2s_!r+g4?4TV+)vtK)n(Q=f*gr6&S}g;O^LObuk^;Q))c3J3JPd zJ5-)YU3mPb_uP43aq(a+y(?9mwAgCp`rUortWDC(c70-XN4Qa{=ac(uyRMi8-s3$u zzT>TT?G1R0L@Plg)QbuRR?#=wf}b%8@xBKc{bf zQ22t-LM-Mpis7ct=};C$Cm|LJayJY&vWRNp9E1_2s5pcV#aM?}OTxV%5&NNAEy6YF zsEy|OVy#x`%s^IMP7AW`=ee1w(P4DD%tgaqx6@%VP?VU&ZD6+FmrVG) zzM9#O?p+!oJ2oBi$HIj|I5oL&?U|ptUK*SX1q+^NNR$lmMkoYgx z7S-PBn)8%0heMq%nnU&#QEYt?eg$ zpZ+<)fnE}3$8VsECzT5^fac$gbSMKtnzVMUY=4BaOAh7z<+(5Y*02BC7k=eaKab8l&;E~hKmF9(p1AkQ#q$UD?OdVufdhT{Oc3?oZ5F+Z zbj^DZ5C)?x$f#n5Pzp~ls@je~BojXg{Y-!(=BH3#kXe%9IyQPtB3j*Hx5OktkU;?y zik`?a^38jQQIZvl5`6?MGiVVBA%c$$l*k0eYb87jj22ZMN!kPBRYDv(f+L>zZjXCn zWO~e5^qJ61!4@_b%a!`Xg<9{P)sszg(41IEHjY%PS1vBYK0i^24p)rmdBgW?%Vg(D z1BdUpqf|aoFYe2u2@fiM+H^k4WMimj@ZcSNy=U{XRZc9F2Oi~*W{y@@9$Jhhy~DBI zwf%tqa?0H^*xZg9ZbpO7Y92VUG+Hzxu)z(2oG}}`rdkDs-Zj1u>ZQyiOvZSw;&*1u zrhHb^4JXp0vW^16ByCSPR2i<;-|@50FIb{R0G3Xl8QV9AdPkMf_(0rXEH&ft$=cw) z$#M|EVLF}Jr9&*4LE|zbgL5fYIkYllHkNR-@!ZkV#8jmM_zc}2X5D) ziV|PB{ltzc3QZb>=DCL+?v47rD2wY(<3v!D%$&37t0P0Mz}ku)JR}`W29t><%qw6Q zeCvZSysdG+$o;x-pAx+0e({AP2X`dU;$f(P2+6nIEtt&W5)hk0)H*-vH~mOaJe?mm zu3R7Aun4fMJn#S-4WUmcv)!Pp5gLRdGTCZ=1Y`-d^B;!k#vvO}GarHoVy|^*3aQnx z&}_UvbwC7JqBa|#NcbD7UYxL_37jRuh!MT>8i(?Gh^Hglkp9*7=S1jboqFEb{WUy* zzWcxP1BjabH-13#@aDrYY9x&jV#%#8Ve3QM`T|%0VC+{v|M8D~%$yIlo&-L z8Kmxwh+g^&$t^@r@DGJn5osbl6C{g%_tr?Xr>e=Apk!i`APUixXquW{%V-$UCCp(2 zjK^$HGZIe46N~@$g|UavPmT^*f#8Gn`uefdlqcA*Y+!0qJVKiw>aFQO`jmm~RuU+}#*DmP2`q76U=7U;)?`$p* z8b1%p^CeKAzvT~d0dB|k7fXP19~xK-;xVM6jVKD}F$n_3C|Tt_9J;ZRx(dG!G}HDE zYfUHYEFKFQA;I}BasfUd>pex>=|HcO{eRsfCmCl!Dzrz=ApxQIpb!85HlwWR5d=dj z8`sD2ce9R%m)@*H`8VILgUe2{4sXYEk=85x3;b!+MR=fT^zmA;2PLqy2ISBm=Lh@fb9QEN|OqLVU%DA)SzwWgcrD8Vk9Ml=Em=yUv>4&Q?c zeuNyVD~KT3!_r%`07{iJx0VW_Y9@blU%%BZ>k$BvG+M@% zS7PzP#JDqz(oUbjGjpFTi}J%+JWzA>zw2Th&?jg79c(-Lsu_xI5v=&iHd(w?u`F5 zdO(m4LGSfN!O|JO%>8|5967R`@k^*wpw1Wa!lBOidprBk`?lw|-c z$ep<_blyXjFL1xwHJ<7`^M2meHQv5|S$>H73LYwO$WG(`kiUnkb2Hq#nnn|^k!u-v zx(GXyz|IOR>8KbfLel|a0%Vxg6n{gF3TVaJQAmu0ew6pfh)k)o0Ev%Cr-nXF3%8z* z$o2+A@v)KKnZ^wA9+BnlFr)T=ov#~!vMdUM89coGUh?xQ;SZ|2hOwWvXIGN4tmYe# znW@sJa+zRtY&sG5@TsKEX|lTQd7C-tFx$MS(I=bCv1}!jj%h-RabLZXa+|E)-b%(} zG4vn>z}UX^`-Xq;i8uHFDbPxNfRy$+fpQ!b9KXW-MQ6XS3UBDZ0~-fCT;!|B zn_#eZp$%(XYuoxW5U=tWZdZAy-^TdQamwD3{8y&-IML)k={)mZ?nC%Nge~=l{41c< zgNVXA#O-UYdRfvd3K?i1QN!;d%fboR2ymxH^iu-eH4v3v1}L=u&aEsiAg^oJ!lA`O zsP!>aDP_{(pvPr4a)bP!X`K`^A%TewBsfsDfgYwDF)c<&LVRE<6x}mY5`=7*d;xJp zv5ybXg_GulV)M+sn>EQb4WATgCZ}^0k^|e&E(GZC5thQ-RblB$ASiz zS!awn1BJ}cs7I7a`-fiS-5&3t(;ds$yy2hAjZL7vsxuI)H{70?P#ky6&Q(C|E8)Y8 zUR>m-Td%-IO}Y55s5TGf>?vkbnRAu*Zkz*NT5kP-zb;(l#<*(=zc0Yyfs_Oi%)#9e zwIm3`WLRLv28MVX8m6hpS>Oaocx>~EEhjTR+TTEn+EO~{al&gc#*YynRYQ{~0u47q zEVCD^l(oB4OXw;=YZ8l5!%s}Ny)U0IA|=8e44YiFsx1}O>b(Z*Sjt*PkdVz}%@;%s|DY$mW5HXO1lww#XWQXpYe}yoIW#+u1bSJkHMz>E z;@b9#0@rjt9~HiXGyEt!=jZwTErcmBf5EbP&iU3=Izwd+aOL_K)}98}NaLjPleA7kx`IlK zOycl6*h5AHpa_}hu}~GlkxCAv`MgCmCP$h@X>KvIb8lg&KRI3Nn@Kef^v*RK$C?Hz zSd1zh+4-SZrOyycSWt^9-=7;#MPkM2zJRBU%BhLawjUZqUO)QAiDEZs;?Z(m75w3`n$RHKHjsqD;`QV4v!5z@zh)H$%gAV zOjsHD|1Eq9+-S5pG>S-6AA(H~rm5kfc*3%agkx&^+0JbRfP-qC0DBn~S9~RRCRxbK z`f$-nOaNvT@=*|ovaeQ5H|r+_4+lyH4UB6^s&!?_xzrOIuAkvnOPSJ1iHE zxeOZJU_G*DXJ0MlDkSt8eg9J4*gwCmnXUK2YLJTYLjQ4m1Zc#m)^7^`iFmCHcr3{j z=lLtGCsf#dLV?}Z-?X0H0J~3NDXmrMLI>`j;hy5t%340nm;}$ILEBgOlU#{A@sg9G zTLIaWX@~kd5U+*HIK?)1C;403rWz6DcMUujTTNJN+IcP+M?|pAsOL(2N$OAug|0Ig zh2@IqcPG1sc_0{Fe|n(L5pjg)Qkl5RkNz4uheqQI50rz!Xnwrr(CA$Kvzp-^@94NM zTa0_$ahGHWp>%(Or3vh>)_JeOz>K5KF9wxF9R+Ro|ZftA&SD`B&`Twb}- zV@3|G&Qz#o^*T!-91JI#MGg9f*nE!gshW8#IXs^2_Zak&wOov3$CH7E$3Hq)kRjaj zTncdTdH#oxg?BcWYej_Q4WI~u#sw-SE`bkg1T+qTFpYQ|9;0}^ ztTff@6!pH|g~6dpJ_M}8ap__`(O6a>Z=}QRtEXirS_tsDgxDW3^^S!j)q&N#zOk=9 zkSpDm&K7ypp>6~uvsSBhA)w!*iCfGO;7X$P+rTBtZy{KRtf|KzV3MeqBvgcZkzX~B zUcgp2)b=p|HW)hWqo6^QH{OGSSyW1bXbj{Rk}{d%plBDoP7yMhS%CeW>=`}qv51gn z)P=8M4fKscwCbCj7?>ZN@2QmvWFi33f=!qJIIfxq+Qxdab}>K(pbl8prBQ@rWR>g+ z=2iu(;bV!IAX?JZusQC}OzkPBV%9_=AX|e@W6-QkHAaSNA(O?KONV8XK9cMCLrcLI zT1d(^i+2E|t`gNd4W7QNDG@Io-`nR5&CU#2lTIM=;M)1SPOrGk&dkt&UGE+r%}1h% z+`f9=e9UN9oJOR0&a=5%qM*0l}K zxnAgcjtVR97k&Zq?Fx6WxgT$d#wj{(2DLK#i!h96APOK;LnA)|WP|A)SlM{*JK1dyJ$Sw;3N=+8 z;6o+9dE4nrXP2#Ax4sS`_D%QS`fBUB4QKk)cQ>AC;6_U*0{>y+gY!A&&B1G#(E72b+ z?(bXl^k+@Ucy!yGKUrAENoi>9?1f{AqtEq3i-Ane>_vq{gn(qdj%q2)N7?n58awl$ ziakfNS-ADDVg%>U@RQ4m-#|5Gl1(lPvy49aptIZ|T;h7TDelRpBZD~0LfYf7V^b4q z!xD)kQ%s&*%8=T?J(N%)&`C9BWCTG)q=0u6y=-SL*bS^X;N?nm$)=g$=e>2F8yTuk z^-d*Y!GPZje%{0P=y5yH^l;jWrIh&}WrRnQ!VQ*9Ob0B-;~fA3srm;jFp7G?EHHOx zGN#DDQrVvnbXNPSs4>iB7Y*n|uJeZF+N5Vv(3xv~YkYif)!Sc*XR2@7VAJjVK$}qYOAdD^KD~T?BEOV+p{pLHGw#v4>xm+?kh5*-ag7{1lymub9 zizH5Rra6gQ(eNM_k`_#sGzV0t>^=y9dFRBSSQpc%$maJt>~Q!d`D91c?eJ8Pfet9b z@zLf1B+-K5O4rjP>9Oq@XDXAlRw`Dl-W7}wmC5fAFHekGrh)wM8 z`;`6J_*a>IR~dhQ*Z60deODR(K-c&@v+vS4?7O5eviJBQf125MmHFq;9kV??&*XJw z{Jd(5qxbHdAHECkebf8SGkdJE?g9tROnuHlf$Xu$`2F0sI^*ZN?(ZR0U!Z%vlP4RZ zGXHAVcl;Eyx6^nQ_GX+nPVOT2&m6)WDDH-tH`>p&n` zNRk60AY0$(_wZ*R&)(TIhM3Z5M%n;W6!HqE6wUB5xCS8^tRNi)k&ME4Q)UxRE7LSo z2k6%G)|!TNGLuP{Ql!DBI~srzNlnCtY#mIGRE!v4)ud}M6+*>K@DH?~+Y=lfY`9Bx zm#3a{+ULfSBOVqO;EQ+@Rg>Q2(wklJyfc^%PR@ihy3aP3Gp14sdYmC`+~Xm4U=TEa&`e@ou@HDJ@bxL(fi%NV%o;q~64D8Yb0;Thft zvy7qO3e{Y}TSDU@^8%?tqDAvStbyz-nHSwbQ?wYj%6?EDq~QjWgi97+~r$%GRg zV3}CF4Bm~VJ(%b64oIM@eIZvMJ+UJ%ql+wbUa#3HYT`+IWV^wf9xX>fMPrr8irMUd zJ6QKOMrp=s3dBBb2-_AyS!W_7jYd3LeRa@Sh!Slz2Mhqxs@CoBj|I%eXQd8(6;lXe zxTrThp)+^~AJA%_vGn)`&w8!bbSB2D8C_*|al$i6zL!`v=;S}Q9^HT^@BEi8{Kvs% zTmQm0U|Wg8x>83mA=p#EcEPFv@B%{&RY+|!VhB?iyEE;jg~L$V$#j>U#{)-0La_)G|9)U-Dn)?1zn4E02eR!2S)Z>6j?2t zxUc?!!04>qnL@TXeIpEU42RWkWRhO@M-n)wHh>X(alF`Hj}5IML=wFlK{bGq3<1S1CNvNae38pj`?MmKsO!nJ2^Wox#lq`B%V)|BCV1%iQm5>Y2sE-tk=p zwzw}h4RP4aVCCV+T|fYl00AbG^?4jJ00ybc90c26jA3R9-Lf?rk(j8m z;1+Y~g5#U#;(j;sq9wfEtv?R4 zyFcUMol$+DY|?0M{H!Nd|Ku5$Cuz2byWaoyzIaOJJ!jtek-e^5Na)|4*BADU2!Y1k z$4B{#uB@TgapO~7NBsENl0lxnUU!BJ5yo5TzTQT0=fbxcuAS$zdIW2J1}vfV zo*OUoe~h~OySUTb&ov!m$WvW}4RIQwQHObmOR5=h03l8iWEl`qNB?fD=`aGbO3{!x8Nypd386>?LNJFdSQNaq_4M_&!*#1 zkBi&I?^14v$Q`>H@_l4Us0IGeAYE2FjF>dY4v)t#2<0VVSE)IMJG79!k(SVZL?9V* z8jdwm_2UOJdJ_^UjOm{KkU<~vH&Wr1TqS2U88nutzlq%9u+8r6ttMsJ=hJCKqdC== zG{V(AQnF9%JH6uRDVe-AhdpJ?$9Js6LTT@fmsirm?no+V3rs{Jkm%gwV>!`O3YE_m zlZB|sVl}6WvEbZ{-|j0lr#xPx7TM^^1Tql=7bQ>5Y7@j@+FI2cH5!9A zTG5&KNPjw!rWz@HtlFElCu};T*O;8Sfs$bJ7(Jzo&Q|g1qj4|XO)ujpM~4weFq+K` zCH;DHHM4EWD9gtB?jB##X}7wKf%3sw$LwNYu-_g$a?xBH?6n$o>t{{4rJVIW+?TrU zfa0{2@ym*zOuZY5yHdt4ai8g$U+j!O%>94s<4j*x=AY-jM|atJH}Lh3;0HO$UE^MA z`b$}mxs{P#SYQr|^g!I3_n_;J-gb)TPF=h0+S-BTrMVd-n^n@uSj3IgE&e10 zsfbKcA=KRhb5SQy(MLCVS`hO9()#*Q*+i&(bZ^EX0h3dezI9C2>teOYx^t$QGB}Yi z81mHIn-SY!Ni|X`VmJ4$BX-o7x(TuSh8bRu4rMxc9iOXpoI06?OA|wj-zi3VD z_!`keNqUrbh=zflbTCwy5aTu|GY-42GM}tf60!0k41Vd|W3{X|R0vo+4wF0RaYlQi zl|*DZlxyO3;6ML2;Ul6~c_+9JU{YnVZA{4-BoQBh1hB_t>7C@Z^M^f~;#oidIyes0 zP9}mV)|(BKKKkU&`FaJZ@1{_qJ~Vaz@tCXFGZ=FkwVKTN>+jz6#B(gEQ=}QxPz{wujB-p?qxa&uU4;r-{1m+i%_cHL zKuJ^x+Oq_wD#>7YLxQ_inDzNo!{@EWQB*k*oh%FR^r!j;J<+~+Z7S>^M0ZnTdTzwy zt_)|wu~;Ljmu!jNgx#J?Rwk+*R~5l9Z5qw&PzqjO<$j}U{C0&7!2a|M*SztV;^VpT z7~|D^>(5&M!M{g1$t`e`&GDiQZfkb&NZr@M3@hS4AUHk~340vJjM(tkbi^Rdio;Wc zrzVoo=_9y;j##7F9D(j((d~+TL1n2*fB^xD@?WNK=y=s0_UU~_b9rEF#P2G&Jk!%i zJVt1EKqH!Ddo~j{AoHY954j3(#)dowlOYlCZ==v~y+gO}SAS!FBq0fwxs#XfsRt@{ zS1G2%ZQG1CW3qoNs1HsKXF_SC-{$H`+YJ=8eR!2cZQ~r(v%q=%J1&yW>n;3-xC}Pu z9GzEZ&ONQKzw(Dl?8Yn929fRq``{eq&YTx`U29yK(;8Rjys=f!_-lsb}m8F)ZFHlU)zp-xr0 z$XKO-kmB=$Q%e>pLSh>FY}>7T>qTG;fICSVh4Z9qA;kJE*I*K|O2yk1m~F3>C?>*v zVE_Iz2hQxrqQjhdLHl{=PxlOhr z|BB^6Y*zsNE%EuO0lQ?-)~=Ll{oYM*-=A`qB7A-O&S+>bZ1Se#;c=V3zR<|Kibr%-1uL)v8GSwGMLdAdok?v5*+ZY{{=enr-&8U z$1OBxmmy_~N~{+u#Gt_--7_pPxM%n)5i0>mMmQab1h_R4+z>s*qP}vV7uj^lk2*9( zC(Z|lryeyZv}$`Gg%vhfHCkAaq}z@g^^9p5k)+9u`^YfR-?>^Am2^Om# zyhtlgVVs%w!JE>%G42n9Yd^OnI`h!i}z4dzVXsFH9=NX!0XC=P8vhVdWpNM@|; zIBJ$DEITn`j}{ZILct40lk^9WgXA#l9a8@Av6?NiiBnA>Q%MS^;%+oj(AncLo9X4u zLM50I?rnq!G>!ytEAJEH%=VH;I-(u#{d|C@R zx>qq$Fv%_pX9z>XHd+$%-k*-h+G)`s3|P&wArbeQZSH(3YBU*Q`JQ6P8a4ks+6q}A zsp%!j=37{ra+n?Q#%MtAZw^t84Bnr2kv^$@*TqZtEOi|EQ)m1h;y>zmgM6gw{L6EsT;$%_ogs3o z`@p!|dQ;auW$2#B;}|q5o;jn+%awa0pQHNx3)Rl^x&I`eBO90H`?*Iu-)-nRkB7!F zA84T5|5rd^%iN`x@)KXQ^i7_z-;%(^w495CA+(wQHBHE7{KruV=x z5!BvT`;mad&Z_mj*8VNd`iZakm9zGkrtjFS#6ZZl4G;t7E%K`2bF+(R0$RwtwBp1>JFuPv@zG&((nwN`gu12LI1eKYx7IOwo*y?igFNK!ZvCeXmf?s1aec5alTW7Fea646|nB{1czd5@s$ob|JyJ^9)AZt-I%19j=lZNY7aBQo zuIj7>!VMoZ(FTK6ubxc&hT zvuH6zj#&l0EGdeJg@oJ_wfY~TA5}uJZs$@c1f{QFF8Oi(K9sVhthNfWQEWZ2Tv4(a zwG*g5XUUrNf*db50)e;>{u|HKwuHf7o?v3g+}rO&z#3d9jhzuuFWTmhoUYb#lHk1k@i|w?6Bw)-O&+_m&xxpd zOW2Yfu{mAyCH?+AUXrKi?7l79aUW4e*+0scS~H4Gp*5rO5}I>E^mXQ3=F`ZAWqDb= zp);pJcc9FHeERql<2Ts<>W1;_B(Gug>(C!R!e0YLc~g_>jdN9#npaN#bO`t&(jP8E zDuEh6b^=`5dVG>BLyc53-$u!8TE>>#W1AM;a{gM=G&_@WXH)KiM~C1BMWaW(Foojd zB3W{IG68pwqQ^59-nmY&_6#%vf)U0JXdNt|rGb>i9`*YS?!4PGFdm6}Lk7`p6C^=M zI_hDAp&YYkERLen6dfInJE~cktZQb!!Gvb+PK(*DJ92F~9FOrDXLff!IND=0IiT%( zd5_Z@8So9xIBl+lqJG<+gtd^f(lXhWaiO0p*{dL+u)F*!bn>H=zfgxbH;%DG2|*%U zkPv+hYY}ka5k#6w@Gn2i(y@RNotkFk;${eO5T(s$rw95NO6XoAN&wiqlyDpzsZZ=| zI~HIZ)5fEGRm{*=L!r@$$+)758|dz3v~0 zBhPMt;in>P*k*L6gBQD*=fq4P$V0aauA{YlWQ8M-KCegaEG9! zRN7^Im}zCTN+^J25>+cxvpCzBo^^}I_Z#YJtJXnpUdVn znv*BCnQVpFN>ZaU#*2fl)Xa!W*2@~3*;%e+#Bww?;~jkC13lTS7o7z{EAN{LHC^LJ zc8LyWz+Ob;GHE^PC9KguzMO zp58^@#AHCYB&1z2oOLWWdq6bQH2IA1_xQ~?zU z)`?YTHtWB5C?AMmiQ$#44%j|(Q78{!xjfJ)#a0tT@>orKhUW6C>07| z@1eU{CsVk2X7<>KQYieTP=B}Ud?8|z9U;BN;;1^c8hr1Q1|HiUHXsSfbx4l`Q6ugV8iCFl<=W|_pMolNiOpOYNpkO+WaE2GPs==>}Ry7#{6n*!{6_qT*bm6^GRg9) zu?k|LNU@--rKl@roPG|9YP*%eiA9G zud-0I;Bi{D&Y!xbq*BmvXm+g zXWsAWsX1i9sWs;v*0R?#GsWD$2~-9%!P%36rJ3BnVRt&~CX;-?RxHJ|RtK*|u|tOi z(tSYo&le<{-DuU$Kh;cywY+X(cgkCFlaXELkW7jBl%wGy&v15Pei8|8HbbHh25ROR z&g6F|m|NJ|H$IByr-)UI7Q^Ob+-PukCEvkSBN?NZZx--NH9|z>{(#Js z-Vi9a6tltZmEvJQE9mOkJXPm`9D~wZxMJKLbCM|hwe!y!DacB=g`5}(&Q!W@D6YW` zX}lK6NjDUf0&~g@>C%%)XUHo%asSq$djC}?-M=Mw^ZiGM1E!b9mqVHSu4Ma?#ylG? z$>~uqNi+Y>$y;7NfdadHi@|1?8pe5}x5|I;&w(B-@Q*Z&M2`wqN(xX(QJwtnvw?IR5DX5yJI7A z=xnis5uw-n93n!m^Er$Jy}su(GX%qrVUdIwS~To>441>LzNp&>Zk=pRm}rjo9ZN>|E&tAbx~xO?IXB|&a?j3`OI9(JK9h|c3ziww?| zWxEw7nZ>8Np~qd0Y)LGPeygjJQ>*_S*oPw9JP+EyV2Sy-s8|holfKSq291A^`LdL8 z#Hq9KueFX4?12W*IP&oRC;njjG&YPs9%_#htdeg~+2=g>ck2AB8|Gi{>zdDePs;oY z+Ba|t|7?BbaIVy2)(Y9+Z3NH1edA?eJO7uEy9o~AT>|V8?>vv5 zsN{v9`dW(TNNCw8?g+o{=1%cP6$vq8MN^zZF#!dgK$ZzaD+Hn&L)BmdV9ao28OkSE zpdNx4i#ML`@<~tzxE5|e5n(CnYy}p#TtguF`k$n@CSKo@2n1j6lbW!zE2LHnQj1n% z@Q+F2WB6_)C24MFUqpdV_+QhtXLa?|o>RMb?cA|2mydwn8uYKky+yziqrJ~=prud!M;9$+epZE+-pf6LAB2_%@Ol>Tx`R8)-`{kUVC||Q zigt|G$@_U^*QgL%L-bp_1ROk|Fj^s0N>8Cu_`L^exti~^4!j&yN=Gy zOpXuq7xLLmEE+*ZA-99yp~QhhEG0dq1E3qh^A@6oqR(`)lj)x*Yaqy(y=Vq0JRnXMlEQb7TYAPn8(7GPBC1=`I-P7wTER!H}pBXBLBwc3Ve6Zx#mZuW(8PLs1IsM{{>sT_qh`ep24(FxC%Ih3 z$3O4vbB_D`P2Z=SH^qS|-^b@Y~tUhG|zGwwW(#i}WHd4YTS7SBs|-syhs zueY4@IsUghbKb;@t$$T-@n5^X?Q?DX#eK6mcy9%dmAC+!%Y;Vy06c}>yR&a+O*f3N z-8*;kx%Rho=2C5D`lhY-r?dQ=pnhA|8s!^bWexwwo%2_|1GNgSZuykXyZwq#@0`zF z+&2)@21~o}qK%Gc{Vvw=^C9koTb}cC{O@)4x!Q)`o8SXAy;ZnlbJ#im3%9fhK9;)f z=D9ZR;2hd(E^xoF^%_u1Z|esCpU9F~;@;3SOo0zU^k(K23I@(1d|VU|m?uF1Vj3Z* zR+ML6qOR)lDa_Cy1dLe|D0Z)1R-Wjv@^=miV<;;>KRbeI#>sfVhqChU4s9+g4?iA6 z1?Ix0ChW|7sj6R!fm3x|Q(N~eWi|Dp?-TC{d-NJ(qEL3bQ(8o2ptNW)TZy1>L&)N_ z7Agg^h`89G!DFyQTt=JS<;tf+HY2)mM}w7-rjQM}icWXE67it~h9)@NYwjEH2&SQh z#ZgN#H`??%%Qlz8Yq29fKRgri$FmdL=7S-W?-TrckMBb*2;6eAb%6N0datNa&2RLx zD8H-s4nGQh$BintPZ<9qIVL)Y19FP{vA6z{FQdLhfmOsnlpX{xNC;v(R}&uUlVtit zjTjV8OnBX_Ibwk?bQKT0 zR=CDw%S0w$OAIebDC*spkgVh3$;OTYsi;4YbpSMM=1_5{kvp)Y#?59?zwkM#m95gK zzjEL+a5ijQu&Co18RP#yd2b$W*;UnxuC;cvcHj4X-|v0)K7D`o>6Z+ zl8{s-DF`8EF@=;Z5&o$RtbB;OYm}C6LZ!l@*yFZ;UnPzOSq1M{OUP5cK*Ix4T ztvvu^i8idiZwn{4t&WpyX|~tqsIsP7_goPEY}-B3^V{z!Y`cdtxo+?rm~CPBlm1zn z0U!LFFxYGq=!77yO8|iY8-s%}f+iOU8>u0D9a7~62PVe{<_6~)eT7_^fKSA%M`gWX z=MD^zo!jB~9bis+GKDE&jX4+mDrXo`oP}yT>hkV*DBZWZ5f1{cghWIkx%DH-0p73yVHWtWJDMk5Fvm0~1_$0@ zh4&nWEc;?85~ES#spQ0e&a7MJ6z3)zM0tLW81Lqe%paMW7#b|(k_o@pVFOMNpizbV zyu&&p*9wzm1{WfSOG`&^)^mkuQay60UUYVaVjdVaabJ2|ims-z8Lwx0C6!KVw27s- z-{HumEq!%|&PcT9C89mICMuIt;35l09p-Y(pZuH`>P6?b17759RGkjDLtCq)2K#f> z28`oUQk$q*tbUN_7`--2!4oW^PKie}L}$k{#8d{xb5vLvc`nuO4~+y(F1Z1VIW^<= z(3xTD{>>M~^BAE)VNrNr)8@gEEGBAo4QOfdw$S-5$x{o|6kVc9;GzYbu0Sl1@MBZ% zcM|{95ZyL;_j)uZ29peqdxX$~%4cnRHiOH;KRhG~GgCv0!;AG=Iu-N_gCYck@hQmD zIv^!S>g;fVbOo}O=^R3+B>2GaR~}~~J|j1u40UdN=PW_1K2>Yfk|_KkS}b})zn+Mm zoMv;n)*nDI5Whd?k8BjPi92ke--s-MY|s|57Q@lSjAiph1X#un-FfyvP^-%fcrjkU zv{^mD-BH)*cwUl=k=V*&1Vn@{#(ZLSa9=Uf=gdd4g~#SOr#~C-2bewkDCC;#n$MC> zQs#ktyZrh^0kLV!&ne8$W6}^#bZf%Zrrqzwh6!pY{V*n}H9;6tK;npI6B$pm<~e~N zQ{j{Fhw(XTg7^W@8cffP8*8zL1}VpWVQzeFVr^&uX>wsioRMKqC<_hc%jhuR8~{dD zh@j?Mp}pH0{!29c@nWq4iqC}0QWzMI#%q88${}ZPXu#`;nr?R*hW6fZ$H8dmKqaAH#|BGPH?Z6p^3Rl6wYMQFKWU zx$hA9-Yqp4P=6l?LPm#c(|yy$d?f625H*M@%0xdlSJCd!G3Lvjbb8dqP) zXjYgud=M1)@o5gh zxS&uX^O6CiMkrSzo03tZfINSSU_n>1!NDFyjC?BHNp;692>D{SyAjU`Xul8a+p~Ld z9w6*g0;VQNTu+E66yP}<$`Po?YD#~SD!2&!dOKt7 zh`F=@leJLEBk9zO3W5=hX!Duj$q{ww;muDHo9lza)7D#!d4i3(dtv{cSmS&jvh*4O z_`6-Gb6r3+2u);yusxzM0x!Xu_$gsTc&zDgAwnn6)+Vi|5t&5h2}KbIz$gk2fr$we z*A(GJ(E_-|U_c>Ca1q!{u0Rn#z(EC<;b6a2OOUC#gIQN)82EBVrqWVOt{O zMK>lR4T3ft+UV=sNM0beY^<=l0a@ca5VVV|IupZiE%)Ymxxo!UYf{mnftkUXQX!Kf z3UI1@)>U+fd}Flvw0K^i2>dO|59U~7KgJ|K$g+HdQOGmSkGDknQX^55*Y7TY<0aY` z^+mxQsdZ$_0it-(yFl^M2*NTDrMX5hWj0uAS)VqR366|KGDS}95^!4G4s7fyvr9rh zFzK(%Tg7@gG#Yi5hSEUy!e`x)$aDaiYPmdEcilSxhxH<@ASkjz;dbO5L#lt_=Bxq?0Viaf7ksyWqqpme{EGNE z-B`oBgh!foWew{^gjWDL-x@rOAPj zYjvi949N;iLhZUk)GT4U-bI?Pvpy;KKS0KIfeatvEUMutZh*!4axse?2IZnGNHBmk z(}v&(dWSm%dB^{DIv;;jDFIO7(KmyZ*joy7JbE_ zw~;hNV43UOAy>eajfq2xDT}){U3EMBC0{fYwICzHl}*_^NgrxGcu|-{I}q{brNV)} ze7|fq7%IVVxljz$C+v6bHC7LgYIPR_6|;RN6&WA($!1-6WzMVF=Li4>88Ugv4yW-t zE)790-=gTq-vQ?f@ zmxW*I+3#zm>uSHO4eR%7Xx-KCFSYvp(pHJ)SLqj=(O)8*D&Bx&bNT#Bv`*=J^zxieQBUlv z=vg#cY=p(lhc-VVepmXK@U-x|P1k-9fjuq?CL8wZhefl>A~z$LkezH2t|Hw|lm(Da z7zN2-#32awmB}C@R3nDN zg*RS(?PI4;9zM8t&+_726BXy-NN_oXr^TnOFlR^jQB+2;BGrb%!oW79Mk+aMj?(yG zOUZg>?DC^5)`()?!coK0(FO?5PP-dlOl&8^hR4pjK3Z{DTgtIF$Ia$Hu@WJo-j3V@ z(d%^iO;#udy(yRu_ySdLYI?w#n3-EECH5UE1p5;~lhckJRwHNJ{ihEs2E+N7bp-q3 zlr`cG4lngvve`f~?XN~nI&;vI3rA<%u7b^COZek^tFZ~xdyf93QD?!o>MU-(PN#AB z9A?|}@M zgVU>(iItQkQqN=;qwYj1;OnzShU2bLoD-9N-%{3?o{wasPM6*_KA zI3%1Aex-@SPCVwqJIprgFy&6}DMHhYK=_%aYngx54s9nR`$SQ85ElJe$O%D6V8OIA z6=1>i)Q&f}0T#^R!=iBb%;7Ub0~8Wev}K#DjvsAWVbqqg^kG*0BR-;LX4WEYHHzM( zh#?oDypohcT|jggzo(D*nsJ6Adwo|eAMiNAUJ=ZOS}GLIR=s9M(%Q0mLm{p=x0I>L zWi+!?duSLZK3&Wi&cM+VNU^lq8%P>zUMa;{Z*&MoG1>& zOEFJ0Vrbe7Lk6$Q-X}TSLw6olHnq@kdjmdkYUCQsW{E(R6`i^29vC}s6@|U-YG;V4iZ~n5D_dzKV z`2Bxwo$LDjtzV>l0rr`avyntjN9X<5qaDA)@AS#7-xeR1mf+o+6P{{XW&tZ2=@T`) zA_+}U8L=B6JAt2)9wL>C5_?zS$3dR6ULzpA=UzCs+BsXLR%^s?ZqXQUrRnMEx#_u~ z0e9BzPJ6s5pM~I|#_%l=s_t2SHzskhHHkFQA2Z0JLdvx1XA(_ z>2b`(dUG{|K-d_o41-Zd*&Sr$D@2SqU}5coP~sj8J$ECpsLd#N4vK|rCK<;e%3?B7 zkw_KAK|;<)mF09&2rRGIwHP+GL+?l}A8L=5EsgX+F6)EVATG3~B z<_9x(%BEAY?9X_-Hg72lN_bi-{c-1>yZRkAgKN)SL!NTVWe12w)oK?Z*&g&k){?|MOd=+#B zupIZoSt96HX@xxo35h> zmrHy4H{VVb5N&$sK2U6lA3$C3dEx)ynJ=Vrr6%wv#IL6OgPax$?{TEXg-Bq3svJ&% zP|xXAaxxKRa!4`~jt zK5-o;!dHLrBSq8xh%HZA!~9<2DB|}%Ec_8$w{-nC8CHQ`zbt%Fz5W5FoB8!i!iSkW ze-?Oe^;v}X{$s8qc>ly*MD2kkx!7@?aToD^E+};psr`o-cM)Bu`quvwSMW`uxs$z! zJ@dt_N88Utn+sb%dg-h5h0;e}`YL^)@_nC|?opoK?(eejFWdW5#^T8xZSNC4bAz_o z9c`}&U)j;t2MkB&*jy`hi~+;2^D($j_>GP+Cfp3a{+Lp89b<@x5;l*S7vm znbCi1e=kZ45H^XAA8SM7M>4UkE#9l$pFnsN^anYi_v8Kw)@$pX&~N*DTm7hv)g&zt|+Ha)iovr<~ zG3{ z!*Xbl_C`)|%F)?=Q?K^Nn&x!An6DO+C?6G53SRKkUnqOB1aT}Q&4&6gP-NH-aK<8I zLJfzL(XB+iK=m3P9*fw*He<|FO;i)jip2tmW;9`R8ztg+H+#(nV`N~VP#9X8(pe4B zM!~6(e`j_z1{_Gtv+H-7T=j=MkIc(-rm<{;zPAM|6_2*k}XwMgP(A)k3qJ@FY zqPEcM#0SCR^vBIW4Yr338|x%?*V#dAvf6b6_ovgORpCJ=6XYskmPN3B>I7M%gT=$B zSX6*dEA^XmbM*-*zX?;;2Sac4uuw zP6R`9MU!VB;qXaXttdLe!R1hD$?wr?Dl<`kBDK`#)K2ct84ONuwqh*Q)9D$iA(@7b z#9UxLKZUu04jSQeG=jP|zahRIjKt40&2brtvSXMeT1%8&22i(x>OpvfL0Q3|`w$Fv zfNxmQ8zm;E4shSj8;}l3i1prguwjM+WTL-b%u{hT_~}>0)%Gwe%Y_Xrv$<%beK_Zm zTd-vyu!&&qLi|FJ<+d@Vc`lrFq(XX|!4^hUNsDYvxo!EhLFbXpmXIqE-ye@>0?{C_ zNm{ErTT14JqJ#6ht))ib(D^=5B-pfUu{*pr1b9S~N$>E7)^|rnAQ=1Or~nEUdAK-r zC0{JrKOEXPv{u8oV!XNR6So>4??;cb@!tC9t#65!#WRR4-P1Hx5H)tgpW2G^QB4ub z5xk1Ft@vIm|A)dOtUzPC5rp@8kCw<3Y8tbyQlXI38zYpt2{c*`!viTKpAYj1afc8a z#a5J#S?GN1hCgQYf`Hyv&Dr#hWW?=Bx@~S!goHW&{Dr}Oc7o6CA^1BcnMY$W9>!RHRW5ZKz3hM^bE3tw*9_F>uI zdHS#);1yP}lC%NHJrFUXDH|xSfZuqdCqhYt0dYHX>g4gGdpDLA5T~ys zVkjzbUOG>(Z5=c}H*}f#s{9?oNe8DLRxcxqQV>+^(8RR}7iB_Ib?Xq&XZZC-IS4ih zVa2tHX?Yb zl{Oc|0B<8b-`$V+4{Do>;zW;ru9FO^ZLWbslkl?ea;SJ&{yv0*=I?VKY`m^_#=m@! zW58CV7PP)l_?sz2$P+`|4s+123nv%6`WSs z+YA!Zoa|0)gspZw(%-s=RqQ^ve{E%UW}s2bhl5@Zz^kXl({xOS1d_$EP5f?8_~>Xx z%2pL~^o;ARJa6?)xOY+y1&pS9Gk0#n0e>2&g09Qr0@Ob@c4yV|!XKYO)i zTifFN^b|@%*Gh$W6w|UHZnUriV*LnFTlKP zyNhba#BogrMNi3(YP%NF2>UE_dvFh6%NwWnoSvT>9j@0hDS+8_i@Rw8HGExRmf);l ztBb8OTqWlP*X?Y6x*Zz0gx|>#hPVw?(?wfiLts1bp25mYZSbincOqo4WNSlFI64vz zovd;Bji@m`EqjgOg5PW+N5|NZ2ab*?YFFm`jk$r4#h0nf4F;xmgGO`-H17zeG#)M2 zM^NeqZjMzSkm1Qg`$E2%$pU#nX5tX2Lfz$e>FxH~p}IduUXT-Ki#|`Yf8@%vbNJAt zv9>f+^(xe&GXdGh$lceXE}Q@{_iWDCIrz`8*695EPaW6Ex6H3!5`L?Fo%tj9^$Wrm zI<9|RZGTbt*N*GtTS0rs)-}33(;?QXH7xtmDPz(AF}Y|<(a90Mm~!q#WUg= zQsixcyG@zn&6olwgSbn9-&6(-23vph_QWtW0n$#dJvdbd3{wXbX0Fd>jaqI;Chb0F zv}C;>`J0&K2@2x!VxYwv3XWgv-Zc!jC#+i+mOQ`W4~#IDnss21gSCL)M?|l@k-w;sL6a2pTEb34$2ro8Wlc;7N6g5WR%SCM#J2g;alp_l> z1lFYp(^P8!-hlWJGzKF`JDA|9b?#XN5pu`^&#-d&=CkX0N_&|i7ZoBWSHY!=|3E6z z-P0{PX-?nbeuyec4P3=H84wf#m0I^(KrPx9=4;7h#ygozz)P@FSSx(rGez z*;NK2%~j(SB0tet=@D#$qs=L=9^rmNqnR*PkB&RMb`v}zcCB$>cG`=ogeA~`()o#ViwmT`zM)?KFU&8?uU}T`ar5@1*ZB2IsI{#2!+16L^^3y)R<2(mc~IKpynPvu zVb6V6*Y#&O-$qM*czf(y?>PNew39;i{)(B$Bx9#hMaYes#3n)iTR8gnm)*lYFKLEp z>5IwGFKL{nQor(zeJ-sgN)^jN&JZ!|TO~d(&aRUUD25@~s^|bvR+S z7_7dCvkrFbWWr<88b<|rRRX@Hyk4d39?WO z;=cX+_MO^)ib{}8!k5%v&u5E%lRkh7NG)SPQWk!bO##S*V3Oc zoM&?FP&HWSKX_rpU`F{sYp$=O=-5rl2X6lNKy!A)Q9r$2_5at*M&3U?<2Qy@7X6bC z9UDxit80^Ww||J04Gc_A?I))FO%)17sz}n@;I8)BZuVZLt!P0Sm^8)2S z43uNY85;w(Y#M@36tt?6)S#Z>Rfb!>4!uPZ3XO#E$B3K2{iv6Z;SZTG7qWie{G2GP zug&eB-#;~hk!~Q9k8(d|#aYxZY~>%^Jokg8qjyOt#ev;FMjl8lfhrd*IStw)Yq=jY zC!}(*XjkObmdN(b4Z+ytvCfC#6L%ouTZIptd=_9@7orID!KnvXL~hQ8%L$}8psKDE zlFJ>U10JEWn+_Zb5e!x>v2n0<+pZzWF=l zrGv$eta|7>Uh9JPR1Mw`dXQDQz$u%mT)>Xx^%>f~^U4hPomFPQX&Y+u-*7f)2$RjR zD$a1?Iz07CjFz^iC_fI92Qo%^h85HbO2i^zkJ|zy7x5h$@sWr)(m{AcCU6E*OiHN| zd?kugq&u^+V4ky*CH6cr=8H<*5@Xm_wL3$0-;UxXIpo3L+fl&8JDw2D?#y&&5fi5S zfor9@3hi&@6&2L6Ph=%0dhW7-P8EK*Y6*3`x3dpDD9Vg3^pM@*jKUE z9}xbQ)oCWH>_vVKP}+P~ZS%13yFJ@HNA;eSel822-PvaIt2Ew98{i@5|C?g}{Wrb` z)BCVC%Cm$VwZU8QC-Q7=YReL3+3U5xVM~4XCE@)$pS|@Fl!jPS+x&v?+q@0V((UgI zcfH?Rr$4T|-^bhUw>5}1%Cm&Ld`)=I*2nRN{F(d>skQos${2r)<*V{BeoxP5e?8$#G@4Z2rKV*1y-p{i)X!AA}52QATSD$>5zM=J%%tqpKPPxdup9{ht^%x6U8)S#` zHW!6|>M^D?7OnXto?X{*f>;J#pA zwnI)ornb4#8lP=#o@4keJPY&3+F<@3z`~wXvWH0?2xdD;v#x%FGB+Lf+$VheCifJ& z#^!0^C%3+(jLo;0G-;J}^+sVF&XrxL_IbS-T%LAAk?$#i1!iL?3RkBLGZIP}2OQE% zC0LwPVnqWhNkg_0h-{G-L)#G4PlR-o_8eT95uO;+voWY;B<GPr zV32{nq4Z;>rl85mw)Eq$LE#|ia(3+4uCL%h!*7VU_K$FH%gA6}CKZMxE`Fin1HNf` zUj;reJ>aND$zk_Y(#Ejslw&a7sm%uFQA5(IGtGo!`yIKUJN04Ls>>Ei{-t)o8g zNTE2vRGig>tb(Y{>x8D$JLC@q1Kac*YK-Z>VfcAnA|4pMYSTS!wD?E9;dWdF+|;ea zkoY?Iq$)3u3fFqb)J(@bBKEr4CE*xGc)+$^l0x7vUJ?#B56lq-=sJOt5duZP13+e@ zY%-E(4W_G11&k1THBs!9>hPLd`|2!E$^$4RUn=HO$wVmNaf1MTNnEnDHV&AfGy!DQ zlUs|WBjOxLk#PJ(d|>z`hod2bMe$3TWAUOtowjD`PS~jUbn8;plBo@b0|sxUm^6AP znju$ze;x^VGkemJ=D63IL-`|TuwIPeTD&~2$!BASj_(eL_6Qug+Eh{s?Ap~I($;6D zk+h|ij9!-6>!{WDXP>IM7b@A=qBIjxoHqj!8Z&Z7WvECQ@8 zHg=j3<#*sIh1Upw#ar-$8T$CstqhH?+Q*y!lsEzC?56StY<+I)RJ#q#)wlj%?D^<_ zuSw}GaFB*9cGK@Nk^=fnB!g!pnSkvbhYQ$Q}%s0 z=<-(!%KT=05yKDzQ+~-5kDH!$M3!G?G;g2s(R$or(wD~oa1`H9=*s6MsWtUlY4a~* zQFYp_=EDTD{IqxXvHVwHGPUMd`no#D7ex<7kIkScC^}XTERQ&OK@*xZ-ICX+>+d>*9U*lScK7pg%AP`!?ZmK_MO1+XEPCPWW`0DIi-J%F{jb>9IoXHP;@mn?z@j1~8G(=BH3^n87`DmB|R% z_KND#>n&$qcxROXKMhgZVY9$LJr1AFurSsf<`5RZpOAo#vEc4Hei}GSrvY{->Z_It zxoj+Aw+O@HuxjhmN7H|u?i*Uth)m@ae;o}7J0Ct&NT=)GpPUrQy^Pxg>x2|5Qp1Y$s^FZ4lbMlU3X}>EywzwPv-?mO?@l-SAW4mftfAl@? zm%fel7sQg1<@brlw!p)|G$>0NWNog{H}f{M{$?O6kfCpEy{qf`Gl;6vnpVb0?eiVN zGh$a=X4EXZAGPTIH@HR3!UQ;m-q^I{z@WU)UqLw`3OprY&?JDy&><<|Dr{AdPC%g| zHycGJbkcb`dr~S8s$39kLkp)a75xGVsofF>)nmlhEFnaNdr)aEJT+;>YM)%6T5r^| zY0HFlf|vLr$#k<*Di=YK{?4a|Z>N}(+p0SE0i~?hrnOytE*mujgU;J5Jtw~1qg3>I zsnJn{Zn^1f&ex^euRw>1kd!grFZ2mb;m)Ro6!d5=fzlMM5%$BG4KJJKDk9%-SZII> z5ydFQPoiX4Qo$zaDf|X!U;TvgnDO?Ltdv(3&I+liF(!Pqc*HgpVFpRojz*A>hvjXcGT(P&mx(}x&Y}Rp2cgc z5yufLl!iGIxBdgQyxuRJLq^nGa|To@;(oDJDh+ZDyAicDFjZF}=Q@PW0M?_jTvRrV z>7AIg;jPyCs8AYN>$RH|N<%0BnwVMfl#GOZjsD430R2nFCP7b;3Hj9W z98Udb6iEy1+C5>ktll?$nks@Fp3%xL=yiIC8dncFQ5x{GK=Xp^3_td?5!3Ja;!`y+|B19f6G~Im)gcoqW>?q zsL2(-(Y&V0MceiQU*fJ?6y(y}qyk>(#Kkl5&gxzm17-fyamW1isMDqL9o6BzUTrQp zFv20gSWv+Td`G0U=#VR&#UVEe<{SkR5@SS1abcssfeH;{joJR$N+}-mx`nz}H$Y=) zcp+(iXyr?R4zssK=R$-;hTOn#%_^CUFPn`>Uby>_OBH=#@Re{8F*XKDou4i2P*X_^1@8lPxXTYzD-?2MgIeh~T3FVm^>N`Dgr2Ctm1&2iE zH$C&w?ayQKsNVn0{@+tH@$WJ37n50qL*k(D4^4Z$44LhR%x-`|tHmKvY|AZ}xfQvE z4+H@zJ-l5ccNCbw>W2hV(aM41zrbOuuWc&Ks%F^^?UnQ3bfTBz|C>~VoPx1r+_}60*v{h60D!`JUL&Od~i??-f zQgp2fe;)je+m=O7R*TK8Zf1&(!a#itF%^KxGp) zOgIa0w{lb(8bCxDuveh^1s)w%bck zTUwv@`i!1J-Z3!T_i}R6v?xi#a137~z0l50qw82nH_c5`?tK{kV!D^-_}H*Ec%PSr z&v#r0212=hiRV)x*HXz%W7px^`dhq;+7EKml9|fe!CtqcZ7Vm8^^0@sbjKJ_z8AYr9KyfcF$TaaDc2uEo|H0{JeQ2F<9q-An49)F z%1u+g|3Tq#Gw;5w6~Z?pXiDQPNak-wFb z#-6_|CryuHgio}eL2)YO*^dfuYG0S`SD($UldKCb?Z~hC$5wt7>jOT1KrQj2 zLJav;k0OtviTcQn68vE%Sfo>fq6qphvdUMeaaku9(bS3k&mW?pR3VG`L|3 zNH3}ITdg6Rk^&Mb`Jw#-DPZqiDSNP~E~>Gh)@$}2y}zC~t;Dko&Wayi+7xmT|5z}&NWzXj%AxtC$?@vJX^$Ec%rwEU(o z5RVZu(-j`0FKuPO_rD+bi7CjGUVhVGZ;Q(-Hq>eHXMvM>&4(){9Ga=bGNnF)3_)JW=phl+AbLp9p%APN{E&sNmhgk$s3~(jQ9Lr6j)bt2)A&Aq57E>trSgxK}imq11gH!|{Dw5U!^&~ZZjP=pM@u4CkV!+6p^nNt+u zuXJj3xLiy%)6HT&lXe(U2qR0>b7|Nz3LLxzKcq1rKf|!hm>pYzS%U5G;ZR}&;$xP= zOwk!Oc@ZJy^!WJ0QVwVxw#3Aj!f_-LNNJE`|7Uol_A;n?v|K6y%0@Q2662WC2bD zmK0BfLF8A*j(HZQHgLB&r#tJ*r70fL`alJ73$$fxf>Pbrzd)6#^qJY6nNCC2vF zZMnkqLIlY8Y+|Trv;1CYtPwNYUBz7d6Zy6JP@{Nq-+(WSdLlkc!5hlg<`d>Xz8O~!Fi8X(+;@?gu13qEDxZk8INCx~TU-n?0_DRJ=B}K@EH&20Ojz?hFk>O!D zR2h0piL4`s0GV;1@rI{`7?hrypJ?nZ4qScHBmh&AIa9kG7`r67%p3DMIki6IXdZvy z@m>9QpE)q&EsE;jEOZ2;q@ z%>Yf*gd6h^Fcl{N`g#y3eEmA)7YvN>9x9w*sQL})y#ekk07WlV0X%^DUB=3p}ts74)5KiJ$22#*_Hq0pG@$(8=WkREk+be?o>(4$S* zt^RRsIT2o32s#7h=CsRg(&$N!PTyRPfdBd;>a_f+v;_>zVc}y<^B#bP%5DipEVd^~ zB`f2oP8$+ti`WaF1ip)@ov?bi*PfMe;@8Gl4O5=%jMN`!V_?QL2Au}_ni9=B?ZHrd4|sfsV5`FRyz(pkLCesHAhM&&PW67r4A56!OGJP;z9bsq#Dcw>U+ARq|Z zAdPqxkOY)dcoO6bIx18`5t66`w^oY5N4Rebt}Q^5wSu5MhCe{3z?uR`;vE}Bk&WGB zyDQ~H%9a|~wnj3WK+&)99l1vA}bJKZn z7HsB*lG%cPpf6|gC!#J}%vRV_Go6=YZBHmp=~b7{PDY3J9Znf)Lk_ElPUi#7#bh|m z_6dxwf;Hje-wSI(Z8+A1x9Np7p*9?A!rSb?ngCzr-Mm-$lK6GttCmrB>8&s9#+F0o zHO*W}-EFYp+k;?vb%j7yD@Rt3 z%+C_Ja;a!pwl2#$!7Q3-dvY^vqXMmvoi|jvhN1<{@X7b2r#4r9_3wQOS|JxXi-Kf_) z{!de7plT5v*|^W4bHp?D$=BR9>F+yqX;$`G+;b}R2uaga1fde+7m*+IJ4ZR=n0UpM-VL@G1KaZ6cM{zJry>Hy)%H5i=CghGL1g_8+}I zMl*+L=G)Zv<~Tb5tU}yu%uq(-V@=nY)BE-=FV0NY`^eV`C<^uuwq0O86ig82Vmma2 zZ6h>wbgG8InP)o*3rcoxB{);Ku|O4j8#Y&HS2;Q|omDoJsxMqJXp&BICU1>K9gRd}Dr9wU}vbBuwotn(AgeMzji_hsE0uQhz63tI$Jj)g1!k(N#(o}PHYo;Qj28}-u^o0X! zeSwmnHW^9m&uyHWXS>YOYkrpY7|f3}q+?#R&#P?)75$8U2xpXH`WgMV^fteKZK8FZ$%WeIH-!hqJnvJ?Q=d5h5MS*t zNdF;}!R(i7rg6F^5g|i?=OQw9<;YMf;jjs1v8=;Fkm8qHoI?XWp`F<)#*!#jkMNaPL@YK;rXRWm%(VZq_Zh= zaz;~)Cl>r;?>cXrT$wM2!tSAT|HBWROIg#duzUK{K8-$%o&Ia#GnX${T}4N*GP@X9 zeU^PYeHRG6X*}PljQP^mXO;2%EFVw!ciFcqZS?Zr{nI7B`(C03nyv3DW3vh`)!oAG z=GvLl6*!)-5y7NG#WWE`fb>*b{wfBNRum<=B8~(4LP8M`!wDO{LkF7EBSWP^IOwty zQ(8Or0?a*0K3ggS-Q(%uWtIo~8z3aa2*Sv|`4Gz}vA{B8ydI3UMRrAuHk+#tTvLhB zZNn}GLY@@J;dS6X`oPS03p<)VX>{{6!#Qm>u*MCZP@VyKc)Y8RYnARk==UFJ)_EV$%lI9Z z)C-~+mK3uT>0Ov&W>#10+uD5!dHL_K!rqL#{!SM-e$u*@71#!(1Od7kG2JTm-reCHFcO zxST`QLf0xsl8Da-T*|GMx<#&vD6!!ftF#3#xOTX*Ta=vl=&ahCh#QkKzfBj=T1J2R zY+J;}ufM+G*93L(TP}WS^Ltx5@u$W8-~~7>etFmP7HokQvnUCNO91`@zXn_nc?)q3 zeEscfjvei~n*fHxJF8PzR?=(XW~A~nPof)g9Z@(Cj%gj0o`|8EfWaUW2~`{f(~C%J(;~u3)qd6Xtr0;oA^Ts`30j8J z`%jlD8BZnR@|pm8CGlit27)-)XGmD-m|BO$L1htICsoQ~Yn@c#iX>kJ*@0Sid0Ip1 z^CLuq;nVr+UQgI>a2fR)Tczf57lVQMrd!s4CK0eei|o$l;wFo$Hj(#~wK{_@C~M5d zbSN+px27s%%jIMeMNFHYPd7(v4)@gJWZu5s|3EGi)rp3g{TYAF>#fGb{LJz!YPC5` zso}|>v2tWAk~0VGo?5|d(ONt~-|}c||Dn}t%paL=A7%Ff2<_>kA;rnMcz zz$yM+ajc12XC3}sE}{L~-Mq4_Ig7!M?uJVR6r{|>$^R~qmk980MMhC}x7$Ii-U;iz zb)VuLR&FB^{qY`1=(?BvK%6YLy`ti@##(EAWXB7V>@;25z1Z^qm%P}tN3uC*KFa5? z3<-1cCH$%BkcE=4AU@KxO(BU+7_O4LpK)`N_M3#YXw(Zv5XKm_ATfgXUoaZ<#(Mxh z(J5nQmfM2C{=Q8x#%`mJwuqRq#dUN*BJxUKf`sK2yhIaj_1=Tf3VL)7M#t+j0SZ;h z>D0{hV1Id`vXINBO6d{{hgfb$kn+$sECiz25f>SeIg7>3Ln4P_OQCn#T<_|PjOcZS zXKW6~4Z|W|TIv^zQGaOjFS_C*R*RGv^`RE9DpTa&<}&rL@B*`0NYNY}wra0Gv}zLQ}WdHV~(C)Mje!|;4`ov?-&lw_x4f9rx+X0A2R$Q@Tn^PkoVn^-*(&kgpclQyLD%m zY&gw=AuNg?CWwgJ&vpA^_M|2npWraEZu@9j=B# zNfz9ssONA!KDu5_r*)_m177rJEah^nzPdM&D5wa}_)l zsD^^XDA0+bLuP{WZ=(2Tglx=8&l`|l1v3cg-0F?2IY=v(7d`p3tCE2qi;-5);hdS2 z+{^@P1v`xMFgKi6ECQY<3I!a{M?8Kv1;tRcYcQ|DV3E;D^#pvJ8+I^``e#%O-eIwF z%8IbhYbge_HiW(NN=zJ(Fe0mnnBU{8Q}OrDnciiISxr`pM?_&1*&&aN>-!Qc2CfSb zVMV{c+6slAVlnclwrbQr5j2ZQq%WstUIm@9y_=)!O!B|a(65kusxF|kds-S(WtF$PApA9N zCv~>_DTd|cGR@mvLA4dCR-p6;d)EPt_4iU)r~>iPXx4@^ZX_N7^Z`yOIANaRa80}- zoGpDdRQ{Umn?&0Rypei%BdPQk1+p+fN=^WWVB*{W=59<5RguN?g2GLN0}@dyrEskH z_o0EwV!V7}B|4a_%&*7Yc8gITai%;@lT910#`JoFcJu4GsjS7OE$$!ANafj6bN>0} zz~Mn(B~e}-%NoindH;YJw2`w3U!!1h4Gq}sCA(eo(%(6(WQsN)#SJphRZTcs5Z{xCKyqSkb%3kF6{tOXA}3i~II0 zA6+>*IbN&AqwvEliA!ogzBOx%oCR~l@EJ@wV~YM0=1%AG%9g^wcoclFpwbCB14I2@ zN$YTX9NPc9d90$m%D(jh&IdbjvR`ZHo0@KzUdePS>qUAHOlxbv->x(l4}<~x5>eh( zTtmzpSTD-EQjV>Z-U$b#a@t+rH9jT^yH2j3oSz+A8(%{afVeO!j;h#EW!N=CRJZ~< zUjw0k0nhi6yLTA7p-F$bj@QQ|2StHOxiu?oLCsH*+ zS|O|&Ar=y{Vp+ZQ>!`tbp=ozouuZ!GAxj~!OKA*r-bQ`6<)lZO;8mhO!d{XdYM(l;M*|4639^LOzY&KB<9gUBQ+Z?m7B06?XpE@u=xx( zDzUEQf$}QM;WK5A*<`Y$z*eH~Rb;)L`w3E83Hu$5#RVyV@#3874+wvN;Fv+l z`Xg2wy#35){=WN}iY%$$edF5T*Rj%nwrSTZk#mb|60LkcK#BS6js$eFU( zkYmGKHpaH{P@*@|(LF0iqxR%i8KyBDQ%`af-@^HwYu>?iNT$CrROs z3`@lbX{BrCWq2mpHp?SvZ)%BX&*aK>$?!r#r>$rWs%VSTEn&T3MrB7{rqcncrB|V5 zUQ5(56tKs0kg7H5Bt0MRjN*Qd@F1XrQjs&iB{o7`khQ>T*2?|0oGo1+2UXD zm%J)c31nThqOqDiR)fQo9)dli)%ao&w=FX@XbqZV zlZ?o(D}6B9@9T4f^QFYud&>q_ZaGmX`2Ds<*f!un$;Q&YqFftxdr_Aqc(`EEYYer~ ztjlH-Umt1&9R;)9=?QN9QFI}lS>)q}aTt0Ih*f%1nGx#3SWE^Z=IY@#CU!{Os|wr%xR^u)d2}kov0SQa+bXg#vEW zYBn2D&1y|tbEzY$7DrX%=t&{ z&OW>2)`K0h`ivG|-jy$fc9o3w=xAW)h)0IQM!Um)>rr2bjs%0F5#Wv9`O=Hx=fN?1 zK)8$Y2bP?Yq(453)B$Nd4x!xz{(ecLmk^ny7)=`@ONRv<6kEP*apTZIQ8;+lp}Q6r zCdP=rKNj_Sg#+RN)odmk7*;d=*Ulp8sDgtZ+Ch4 z+SAjHSWvAS5qFp+htH!&O_tteBMQ;=yHb`wrGKubcbLM92ky9UssG+{hvz&)uXzL* z*<$IX7iVhzMzDW1l&t3*se^mf>JgJklQvl{n0>v9N4$F0b7jAAaBVQ}veevz58aC+ z$;8=*FI62mg2^7vq~W9o9+r;j$z}k&AMt z@Q84{d89dwT$IC3h|k4+d-rG=;QA&NBv|kcr#1!}KYy1f-1W%$M-Ck%?r-m6*0N&U3&6EBRw7HOg6`e?Tlv0K8lHE2bEZqbyE z9S{_qjsfJD0%F187*!}Ds2slojxms+wD0WI9vLaekFKuF&rXaD50(lj!t5}~Ar&6y zWpPgwvgEPQ)~TNDuzs>pm@?xD8O%L}7D`?Nz>-Qa9Ofm!)??E=l^-^0Eg3KTRhd2g z)e~ojkU%h&X+HNza46k_>_0KSr^ea+HNnJ*y}ve>96<5+!r{Yv7sR8Hh|%Z}-8OOg zsp-*^qv>dDV_&9uBv*Uz?o=<{|ATvnIN86}P@mo9JGPKq1(%&~;>@M{AQQ?Qd;s(G zPfQ=ZPg)Ty+#70X+1&+jKw_SF8yJn(mM|SS<9r7^hMm`+F|zBec~$#-hwxM4A+A%z zL#$I4bCZ5ilM#l1^gbs1Bq6@KVMrVzmqC)*T8M?G z6=xTs;e^t{90TIYjVx?rq&nQwS_lc5R@~P^5(A(l=G^NMlc|KHv1R+B)?_d@cd(jC z_(x{uW@EYH-0szIcrazLxeM8-Yylrm^L`zfPb4!saJqJ0f2+)|qtEtroUPumOpz2i^R{Ch)aLg!Z&#oDKI!4D?By24rxo0TN9~10+gAt*|yk z$Y@kV$gI?=5J4%U*E7Tk&N(DiCRme1T?6n3QoAIib_rTsBY5>q?4lVwX>1H#QE6lF1hLQOcso2b3gFEO&QOk%%wE4`gXjIgt zhu^S6BLA36q}3T&g!|FTXllw24%dCdc}qGOUt0>MOBf){z~isId%6t zI+G4J{EhQ{@p7sW&>FO^xK>y2qXJcAq9DET2C`}y+*^#)oFMqw`rhVeq<3kSfQw&- zuK4*6A2tH6(b_8dk$R^^xnrmaK;re{Rb+3V)KIIEF7$ws%tL7#m|g~tAHCI0ppOIA z3pXR_17S?$n6O>|nh%P??p<@uzFImN^tqi@3yLiOI8Vk2rWU&a!R7IPdLFo7J{Ht= zSBeTU9fH{U)NQ5g+667{KzeU~3TGZFGuN6Y(Hr$33Bm*HwUV6oG7u1<#Tr)Uvzs``^15LeVOAYcK1oYZ5`ix@^snn zEyPaVfB#Ewa-;+Odruq)$D1|H+&kaGbU&Yy-^Duq0n;BBrJDHXd>xB_&J+k?s{dVj z4*UCg;ZflqKfF?fUzcW0sR(73fG4B!J9@2w08cCp4-3vLYRsMcJ!4m-VuU86B+Inf zbFkEufb$>g0{I>&2ZgTm_z$5h6sQ5!-_D-8I-#Oew{<`42`$+Zop%$N)TIZ{-*xWn ziDN`7J=Yu@$Pc1!28;+YD+!XS1g>sqO3?B~)1F`}WDqhXf#2Eg!j7X%DNtIF5?i!s za`~f`aK@|yB4wv}QG0mWR;{}uBYrhk2+T|&LSQ-bxugk|Y)kz;vxWZUK!?e(WZ3t@ z3DJbo%*GyuM{Oyp_ju&N`}&j|qQdmbtQU;F=JfDX*a&QKu6GvE8^R}AmdM%5uVVVW zB`=VvAL2r19?{3d$G7DXJPZsXXM zy>9FETcxgk-n{jCcpg-AER%VX=NCKrdB6A{JNltEU)GR4g>S(7JST;D8|iuVS=8o( znh&XM-Y1>z(a)9k`_LYE2txv!Sp=8nd$6W132zX7wP^#{v-m2}AVk1oPfk2S5l&*a zB8qWnLJeh@P$40MMu18L=H5WDUcrRg+ZV7YvU3;P`tUanVQY@x?(I5sPMP7X8+J25 zVoyB&!2S1}KYAFeAq*x|^R1asDQL;>NfaBA zvpQZ0IQI{VCe)O^$r@VnRD7Y)J|$bi?$g+!w)_NQNXVBsa?mfnDblfG9wa-AWZ~~M z-(`cB z*O?5eeeSgH#mzTtiKx%8UpOsUIGhsv_mWTsJ4G8jj7tDpsFx_<(bbCnr8WSBjCVA$ z4LK|rbVf|%RW#j+Acn!l&WLRQF>dby=C*Ffr|kgdlC{`zJH6m5csjv?U%}JExP9yf z0O78WPyxc*UY~Ts@U1#9qHKbKQdavR5D2_iJ%GmQbCuh6;EipkPUH%eEP;)ECMvl= z>z5Yr&B4Z<`=7D_GG8`TQltnX^KBFC0Bb*J$<;zP2OP6gmN}NMN4pTm>5-H?_nr%9 zinHrW0i$*IeIuTbY4=a+19v=BzY*LxKR)gml9T{+7A+3{yYXDhelBi=IS8zx` zVWZ%%;WADhdO?dLZ71+ZJ_p6iTpxoy?qVj@&29ru$CFOGvVbjRjhGk!5}2jZ1GmJJ zXb7j1SLrG+gh$L|IvOttwb8y0{MAPh7dD>iGOUzy7jyR0bsU|r!(bHr z3Xa2vCiL03+A96UtTKoq#R%ja`w2JP85=|O9G}}$aoZ9uSJv)uTkS@dQESrLJy>xj zojK^qg{#YhPK!C~kMCV|`At?AV(ivb!i3|h-fjXu!)tN+%mH&KSG*$^9dx;@9F zu~BZz^eh-DP~Bs1Uzy0WcTIw6=Wa;wFl1YM8?rq=CkiKy&)qwJ@5Hzw+q2^A%ad*Y zh)<6^Z|>FXCF6OPwZz>NKZdMJdg-vFwN2=aJ!D>zDw4(O(qP@bT-n!K^Z~60sdGtZ zuQdQlaEk#5Du310Yb`*pjBS2Sd<&us3y933A`}W(!F2#88&UFu7-Sbfl9YLeqbT8C zfXf4Jj8br@{OOYhkvM)d=Wz_=KuO)k(&FO&rTq)@&FO*uV$hp0;_%l(7~yEg$Cs%P z3?d7AG4BA=J2>V;tFTjE%V32vNogqHjlVE2kFO|h%rW#=M(9awke`eosL?d!zNqFlcyd|J7Fn&yFD$Evxu_4>_k z!gl~v^yW875#U+*&8uB)p4pn~ZqqTJi-=$%ez~@gOKFY3`XMW`Oq(j@lVW18(y>Vr zp45th2_=7xg6|hEsd#!14iMQCKVn-QKJ_o3c=P6yT@WE0~{#rf7&E zm}t{L{Y*K1%URBM&FKM;qY+3c6Q#^=vGlOXRkz=4iX-3enA4vyx<%I@pClun-_TM- z)OmEy=q;vLvw6I0Qh6TK7_oE+6=9+|nx$eS#O*|3_NyR@KiyIt1vK3IP?}wW6;@#K<-Xk602ZTUT)H_B+ zv;L@PH~!>Ql^_G_Zxw}AB|Qtj>*#k~kKf4(yYc<>Q}0{V)5)|I4>sz}$P+T!^+x-X zIN3`YyL17%gvx|C94yR9NIJcq;HMgmaMorqIdO!eKnBlpq+W2U;l1cOdLaj9XD49Z z()H|xKIE0Z3msWr`Mc1;qX~W;9aVZVU&Xf>9cJT`7$C=uKW)dzH0NRPIYh1F>aDv{ zM|pcMl!$b!SrmnL{p{PHdCQw#|HMNN-h21ylSdBk-@7mmA6_n#4hKDM$o1RAw-HQ4 zP1NT^UZk3Nwh_lBDK=#HX@+b=s0yg^n>+V7BnO)iIr~`6BeK2~4?f!-pk&&%C$~?p zWhW}B=t{!paOTqXTFtIAdcx_oIiEFT-F6D{0UIn!Zk@I0vRD1Sg*iYlTS=H6Bw?DF z3oz=<=DlDGN{1ZfN0$&4mCR}+G^{K>OJ{X#bONv zCqn=Wfq^Yp=vz*Q2ZJ3)CwDa=8eDoyYB}Q?^bp5TJ8yGnGQ|CZx#Ip5qZqOeO;7rR zPK{n0FGsEEq}k;1>jTFRn6Y+_X9u6}sF16y{eP1_inV{g@LDO)*S;HT-?}1N3>T|V zVVd=O+RGk4>3aM`3#I2>balrK>N=kgOnMYQCa<$aZ?HUxps9osH?3uEwJOUTp(T!* zMM+7cP1Cu^(S^>S<6Y=Fy5MX4|6%XVqvJTQJJDKttFG$mec$&LjimuJb~N@K1PKBp z2yWO&g8M2;qPS@nwNQ&?Nwy?QjwQ>sWGQxRIb%C^;yBJYo=M(uX8e*jCwZCVyu8Vq z^AgXQIeG7m4Zh!3)!kSKkf20P{Kw=VrnMF!Xzfoa6rk8TTA{mgyLHO+@0isQwe`^V(MEb+Qvscll3>-%7j1TWV~VO@PLFijC40Xp~N^ zZIn(#14KuYHLLR$&YlXjQLlww+4<1q?bWiXFYL;#RLivu)I<@R*JLytJ15ZGd9Z#9146&zTRHSw-I_S z!0<_O13qj04~n3Mu)K^p7el^Bjd_{!zh(*bf<9b?cyUSC(MYk*d*87ITheOQ+vcL3 z*|r#YC0LB+$Y77h81->Zt-WV#JjR*PmgZ>pvc~m4vS$(@UeJY-Rc^A(AvFK1I4k#; z#eZMZdUVd1jSLsmc{o>vpiun7&2KHeZ41=Ae-KW}r`Bs~PwsD#UR!Kooycx|Ae*I5^d6ct!g@$l(A^MohENXM$OeO!j^mV%_xc^WEtyOnD zQe*aLeQRG+n0QNc=2_^>6To+Wo_d%1F7>DM@5x$Y{ru^X#;g;!^-sRd(87;DV#H;Y zx%or=vcBB>p>$^9=J&}-WliaVZJS?;LutOakbcHU>-9c8QAMIwcjXHeKIL~II+&)ZfBnZl`2O#F z^Q-T@`Nn5oe)0Kdu3fo&|9z)U9zDEoZ*O-|`<|emFn>brlX8eRX{OC;gZ{}q7kQFA zkU7>$^c%9zsYN(gR8P7@4GeXpZ8=Fv?ef1wJ!ybxN&LA|U+p))_X1H*C5;O4ZI#uS zupq87nV`sSV>G}yct_9H@fdGZGGMw7>Qb!C_@)g7?K*=s89{uh4J4~QQ6Ft@2$J>b z1&>j*c+5KU636)^RsOEdtp;EN{Gj~OAL?&b;XgBw_u^K-Ng176Mt@wfIoCLjPBNSU$60UG;wHq_X}; zG3ynGNfj`bA}xTB00Ha*uVskB>vbCB#a6h-K*icIoA)TSR*=w(} z7|gsbJTthOJ1!gr8r9humsE9Uq`TRITA;$9Ggo9|OV*;o{`Lxm{kQ8V>>q8Yu-Ltu zHm9&?o8%N5X>6#W&E0VMLUlZDw;M8^(bv0I(^*ycd8be{SiBNbh|Vll>LY@vH#sL~ zr~mqn^;SXrHW1P0Fc)?PIG{_kwqQPVaBJGes+6kpG{v2wd5VB9NQJf;EKCH+gngk7 zQ_(f*MLn&h(A-7Zo|*{0u$e%Z0bLasifS1VX^!J(D4uWOiQ*)sC0GqS^M>o(a*0AK zC7lgsdbI+6op^VEp>Fyz8+--g|Bf7Q|HbezI5c$?BeX=p6SV%9W!HFh6dWu z4R6!~@-{(F7`P%W!jQT)z@y}NS0Ynm(Fh#G*XhRfx-72=Gw~p zs{cIn5eJztoj#SefnZy86}`|G0QkXvYVDgG-ULR199}8l5Jm%`BiL!gXGHYKBj;!> zau6*r*o3#V_)1DU65&m6bec5BNj{640Vtw{BamyX3;6=px_p`>Ra!}~$rVb+LaM@K zUqe&N`Y) z++ESzij@VF?}VlFR;JXl+Is$aV;KWkpUIx>*_4pc{#>&g8{Au&zrR~;?|!+VtT9yl z#(!u2fH?+^;xqJ-f-padVl$X;IcY{Y;k@cZ-k(?^rJz&^S14X!1YRnqa0&*!8A>G$ zf=-D~fou%q{}eGy1Q==!Hr^`|+JhUeq}_NW1Qpbb4mAiMw86wR101eTQwlHc#&;{+ z#jiyIljzh=nmV#LH?#B1)R}E#1AT?I=Ei(|Wkmom1mu)=&^t&DDkq6~krf7ZnxI%9 z!}4Daq6`&4KY@(LAc$b(kqGjINI5nJ#UhIoXkaTYGDtU-i!1i!Qk7JAIiHN{4UIja zWE?E|0_RTYjA>I49UuWC25V^btr2}iP1<7+^vQI@ZZ)b!rP69O$6blSNF)(fDRm&7 z5LL#SR+GIt#e=t0hbPRKE!J#OuM#sIV!Gz5)nPDm#~-$@$F#=%}tta36TT=ETIWni9z7*LM_gtAG^cT&`v^ACyp)5 zO;3#sb$2!7B@$RpvArWn)cdB1$IF z0&HrHq8WE(pMR_&Z{h-D1i` zDTGg=MM_}+V$L#z&Q7?B-`2OOyYbR7`aSgKr0aDzJ$B#_aFR*zXF`jQ^6O=ZfYMOMWMMi;QD z{#GNacX_H305rKHRY6bG=xp^`%oyY*f+j*|veZ_IAot{TUKgj22RW14lxyC!eDS=> z71DVcVkxiN8!Ds~G%pw&ChuI8+2pFK-4f@V?M*Rn+Ul&{B5FmJRRIF3(H5q%;AGZY zV$~*pok|&MiQPulXv(|v*Q|kFKt>K-tIs^F13Z-;?nTuIg3 zhY&}+8>+V|uwS7sL2`9ZJa*}!Gp800&g>iC+E7o%1O@#zi$uFm`T=0SNgD|Au;fWV ziOCyM?h{7FwbqxS@FGbCE; zcIz$v)=EwN9G)d*yzv(EHu(LYq+X^E7WB`7^WrqB8>5)_AOYuz-{_`LsK@)ur9HJu zqXupS`4;#Z`Y`gMBsFS4;!*<5qn(VD_W*_AW)K;1oDXra+~Cqf)7%K_`-4=30QzLo9POrKpEsNr~Gd zF0EWO-{hDaayD+pIV^-}HLQr^%sL;B_fB|Ks ze`Tm_XmlmFbtbe;R%4j=8RNSrJ>Djd#$>4S!XY=+i>#vMLj6d4PjLV2sJ>}ZYmQs) zWFn8U<8p_)*{@`2Pm9mo(%bE}3qeuOv6`lRr|S5QiE*F9N@A%f`20Jtx7I1;ZQK(c3Lf3j)c0zmr3vm7%w~<;+kUQSrGu09nS{kCcs$;?1&qkf%-f8-e7f|H8$F5Mlt%Ezva;%oSvT{KJQQ&4)Ed{d)!|8kC@kg$nId$^* zu_Fs}+qaF4jtp5_f}u42KV~9Ge4-+RF_hRbIpBj%KwF4elfr^qeoS@{P&9%flJ<<` z6ewU!dIzz9{2BRZ^(UcbwLx!6!~|!|uQ!|2YOT%X$t0@+iJSw`l{*p8kpt2x9gqa8 z4u}=V0ltcmPB7K9MKj%YLB!My3?X)U)TT5DzD$)7J7&sSGx=zy)?*G^OiDHqFMgJ_ zcvE4E@cV|aJK)!fAR^*)$ksL#TCEBsvo+O)z%4%FDt0y*)M`D;1NJT`xLik@RiWim z6`7sQ2CH7H23gCBcO^ZWr@utkFng(Xf_Q9htf@-HU=#=t7-&aO4kE;xC=M`JVV^io zjnY&_CKPl#rCoeG-LB@#g?AFc5q3LOoZMk}Fp0(n&rk~Oa=7DCa3+Q6@NrUt3r9U7 z8ZCA)V|9y46k$xpN;7NHiYC#bMf9xUK^SH;DL9W?sp4E-z1BesdcZ#4ahWZ(9;4j| z0z?&S$OIHIy=XN=a31DBr7HEBV1n0}GJb|O*p(`yh+PFk&C_3{Bg{U^g=rmNq)G{J z6)FR;v0zyQ`6;$ah;q^8iY61Xw_(tPLXtZyA-NrA@#Cv26S1J*VnSg^MY(8~hWvb~ z1wsux7w^4p{|-X7y`Ub zZwMd|;{om4=d<}j3X`4YDuG1vBZLM7p$#qGu9ypEJE{})3Z5tZX@MKh(BDD1TBRlp zYc%p%-=lxX{1ZBV7v)3%Mx)40OZ0sR%cOY~<#!sT`n4W*V)ap^JDIdfNK+MPa@5KL zBn`$1xCU!vIeXep=jb?nJiYW{H(UFwpWzddSNk4wUiuzt>WchL0Hq;IB1r-KN$Jbz zSH8LYeQr9Ie5IR?B{K_FEGd046ZR&+t0VWXl)j*<_yxoGl7A(A$^W?gRf}I2_i@XO zU*bLm-GPLhIvMvRAZsO0to;z?iHj@E5|NU)OJD&H$mD)6*JgxD<&1A zNq5AY_FC1vH%&S*B@G}O9@(H_qy!W|%4*@mqMedAK_t;3YY$XI9a6<=PBn^lv&PKn zs#{u|!Jw(G-k@aN5g&}I%9M`rS|OhE8G@`rX)|fGYOlr898!wBTBHYd{pqyTp`eAH zeFrizr|7rQsn!;>X7ie4lT+nvtFX8oq}76~~W zLPnQSOVikvEr@L5SxI+_wGpYm4HP1<`0|Z5xOS(8D3MHIYhHoM+p4tup4 z&Yxm->9jnK5X?*e^z>kE9!-A=T3ONP zGz9c|zg2q3oJOljHaLn883r}r(P¨-pVm&f+N(&34d3^iP=))L6b>5c)wHv2&PX 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

Ci3GeM!E0^e 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

Ek&TdifBe7Pd^mmY)(962bN_SP%pQaf-0_4xU_4 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

us)Vd6A*)Kr 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ⅅz?iuH&b8I;Pc4b>A5fi= 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�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

a5{Hv&zoL!}WW(FviM|DkN5B)Bs|D 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 h=LR?|ZBKQ1Bfoy9)O|`cilM(h)OL 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℞O_EU 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


ceW8Nzb!0SkJyV2 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≫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

Iv-hkVL><`<18%>AN< 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

>9`tSeImjCHw%065?6*N?v+U9KpYZ?l3SgAD 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�UC^xfO%e^bA3>Ep$3Ud58$-_tMUE!z{g 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

>5nP7`5nD=?~&9_S5Z3XZA^vrei>ucn$ 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

)!9}rLuVYij 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

-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

7zVed!ug;OWW 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 gq+{4~&#;{6k&8=y%)!%InqAz! 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 z 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

P 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

v<~zR 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�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

<~%* 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
QO}P#hUe@IOaCmQ6SfL$*g^x9P+vN>S-gbFe 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%0A*GUg+ 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

C^`= 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

kh2JJUPykvOCVNm*7!} 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

oTR!u{R>(U#n*;fA*XH3J zosHi;`Pqi=o~TN;waAa7v+whcZuTS24YSKJH=LOh!aKTx3&@ZAwhhRS8@8>?k2zJ5 zAG>E?Lw=mZ+bG=8+4dqoPS_40KaR|)iTv0AkGjA)^LWfCv%2au%0U-dk9xVAZCc-Tbv>6RXIZx-{lOkU^6o5TYF7p(q4N6 zGKuz9v9TVvM>3!0MB-b)$fTJonK4D-%$Ru{nK2+TW@akqjH253pJA4w2AngB8ZjGY zW-%K;%pCcRnGJducbDW&E-qQ+Rb^9GyO1aBA5H?I{Nd6PehE3V@9oRf+dF^A^1G~YoCi?}Tr zx$R2vzL0ieBU9({J3>De9}Vdj{Hgd<$N(X-Hh(@>dd2a)2QKcz44!j4qzKP*2QiPA zKH=K0uusV6Xxq7v9V9Y)ThT;h_LoIdklFi+W-zmh=3?f%R+Nv-{=KLWGvE0l2QvFu zk%v!;i7M(>-?<$T!PH!u^$eb=t<~&z)4e#(sO_(oEJgd8-bV+!Rta)i^3VK7Vw~26wYOxD9q=(%%v+hBQBZF znlY;*YXg&s&8DcP zq={NhH71cvA{TO><=TD4Y{RMn=cs;SyEjffzER7o||B_gawsGakB zzCXWzp5BkooSBR>Gw<_yectcS=d9W;S4zm0vZ_ilM|q;*W%9>b$sgs*B!8@2Cix?; zUGm4OBL=JfQ`Js1>Q7Z042g{?lM#(5u?bO*js;)?0sTv@8#oH)(rQ9QV#l1%IihI4}m8zkVSE>e^$tdnk za_!GgGtbn|RCSu?>StCpiw^Lfl#H@+jpP#dbjc+vH%Tt3oGZDcd_9W#V$~hVC{^Pm zqg0I}qwKBf6)j!mBcmKxWtNPxsvjBU@~VN7QC0<#QQB4wBcn903PwvmTs1~AN}ihi z%~P|#b~XEJSF^ufnf<-8YP@LaRg)#J*wyTBo|^q#HBGeisu0O5t7c1Hv8&l%yUhN6 zuxhU46}OuG^{VwnobCs;aNwLdp@u^j-wPwji6=OA%?#s4H zRU49rD&|NYst6bN=@~4!2a!9Ar zI@!atO#KwqE6y&lO~nqqr(&5XkBSL6UJZ54TyJ);=2atTk(J}MN@BZI$5HrXru>JJ znO07w6021dvj$2?mRcF2?S|8+%4*q@wSOy;t12qB1BzszqPsHsB~J0w3l&ex~JlTWTT1> z$wqLrHl*UZWTT31$wn1DM)@2c8kupgG)hj&>yVt3*DX1zWV_KrKDJ0^Dw`^qDX&g4 zlVcz*{9a{%_yx}-<5~Ul$^oK#%EBZwXxgkue)3F}{8VNmKYd?0R4Uk& zBP2hS6-a*a%#i$4)NQ&!Zp)P{Wj9KevIj_(DyuRN*UwdsmRz+mP;!-hfT*9cwc_t9 z$4Qp*%rx7{QdZGDD^ny_RkoQfSzqN;x@31& z&Y(;7+)6jutD|xz+3UN?FtXRx$_U9`l?%yU_bQ{wUR{-OWUu>`No23Hm1&}fDs5EG z>nfd+!?IIE6=h4W?1^l8W%YB}Zt**wh2*fSl?CLmin`Sk<~J+a;eBtBRL>oaD30E9A2;Dmx{g z5!a}g9@fe`lFzc&^?g!vR`$}XbEneRcZ_CUY3}=!-n+6N^(g9LWkaMM2Ky;Ksz|ph zBabVNPz=^ysF+4Sk8q?SmH*N$jO-uF(ZhHe93A6TYgrQ1MO0 z7{ye+`@5vZR=QWCFQ9b4MqfbbA?X8!YZceSBV@b1Y0Vlv0;LVIR;{#I`xv&O!2CJpw%Jf(P1@v7oA#hZ$E6zM4_y+odqXVF>0MNpaDw79is*bsey=!7f2;I?;Z;4QOf$T$-z)Q@2jTZ+{S9xz zLDGp(7HY66CMYgd%#m|$$d&VB$kV?s8_BE&?*~oB**4_M{|-$iBP-PVDNxU%BIp=x zs8n35_*ccvitj4Er&z83ST;v$hmLV{B?gv-8`>4WSG*?U6H$=n zg#n7g6<^{!cca)E%6iPH@S!CGo37Oj}}-y)cheD zafErVeyM!4UjtW|5N1dxRm}Fgrj4qQm2xA>$B`GGEuTbQ9A7?_y!dkY4D#aBilec^nz>W_c1B@pOgso3)gukr4~a zZDhoXawi$Fsl0%U*ij*CFzU)n$%w1UtH_8~5*LsW+sfCH5#!4@kP%~(yUB$SIX&b; ziK(hWs;cFir4yul8(FZUd?#5jw0sX)@cHr@vS4eutYV5TKTH-}P+m_K{I=dRSfg5@%2;$qw1ck7(*6}tQg<- z*LrcqWbLe|y5!ZO>L9bL#kt}%iE)~czQy$M(zgidTZCx7Vz+3%^kDIu5VcqA6}4Af zE^3b$wMUHFD_$+G6EgQ&yisOdi`R+rBbNErEu#FAXUhzeic&;v=H!AWE*dL0o5Xv#P(fiiRt06%AK>UNl_#7@2{E z%t%4}CPc{3uK2E~I*6)+=sAd< zD}G?$ic+G9o-6S~&plq!U-VqbAoN`Sk|Cn!N`{MiD;X*3jaRGCZ_|3OpoUQvO` z`^kBiN@t1+Oq(GpFu#e+_nNI#R3Ia$K!^%Vn<*-gaa15g1=^~}f5%G0$bXwlBSZz- zBFKNOr3=Y_yGo-)1v+HKab0N~`R|j`Bzgk+l%~mSc&Uw^0Ew9mCq@OjR3CO)n5aOP zs+Xok$ZUA2Q)a^00ui#5F2D%6pK`-{R8E z{+)Vtsp=aj-H8euSGuR~Q@mykzK)D&b<3<9BqKs{A;j~-5sKu+lwpz=A$bv!7p=jP z7p-H^e|0GX#Sy2ElN`wizL*g*rFFc z`7+t3E!S@rwn)~rPL`|*am|q2X`Lon6OuKPx@F!j@1e}w6}FK(`xLfIrMGCGcw}pc zwu#rdB6-w0Tk@!NuH;e39A06kWK-*W?Gv7RM{=s|tj0`U`c!(jgv{hY@+&02TB9Vt zrUc4-9wf^`vMgk750Yyk-Whf)l6S2ZanOaml6@H``zD<Z zn{$kY6U>K&h`)AE7JqFYtmgTqk()K|Y{|{u`NpAow|B1OW@4PRH_A9cKkT)LzxG;< zGxYy?QzSztJ(LWc9AI3iU-zyyF43Bx8Ir#X z_elOux*+*GWemRizusJ#5wu5>vp@H`B~RN2(4kc8^-8w3$4RzMHcGa(CrP$;PLXVF zyI?ZtJ>GKDQKMu*?xecbVy3e~&vUu_U$>MgKOQ>NZkR4cCB z?vyNUFO@8wGG6j`dW7U}dzFbC>D@y9zU195`P;k8)T|%%?v*T_zEHAwPJm?bEKN=CPjmW-a;Dj7Xzgw*Z5m&Cc-Yb38j^1An` zUmf#yU6S3scO|=fANV!v)kT`$H~QY9lak}p<0Quy9`?JepDI%Qsp(0Q;|uHk&H6`0 z7ySD$PNvtJiu}m*r;GZdZrh6niR&*Kg1Wt5G@ML-vuLD0D?f|IlIdHDCWz}Vnj)Fr z>Xl4yEtgDhT`ig3x=u2EdK&8XX3=yqeMeEKtd~iW_2!>gH;U`G=1RUVnnS*)l1sin zTC_m&y>*M^d#m&eep$3g@_q6+$@lhylJC=PlJ6NI-$U|!@+8UkjFayn`99rAzTZ<6 zOTPbeQKIDg^cm#)nxbXo`?8`e$@k9b1JmUKC>A3!)VsZV%xPD^teeQX2 z{mD}$-{)Qu*PlECz1vw-iQW~G?{l1z?~B$*zRxL;e4jj%e1D{9J^B7)DzpDqagB;` z{Y6{F^;>t*P2ersf%nfYsy2K_j{iJ$E;(Lkf&*FqE9^&2*bfCP9IPGJWb;+IuSU!-Rca|O4HCTn4euPTNsE>vW_1dm23zNr|k7^7%aOk_T6h{pZ^p5a_K z&Uo)|-8hpPsL^E!ZE7S>#q1v78L7GSd){99E^m9rGV^fPGl7|hyG7Gvp4Br&TM4IY zReG-{l-0cVJ#(}*#Npc8>KHV-XMy%-Miy!7)yQ9oWi`WjPa>V0-+7j4bZ&aGSkrLZ z>y!RXk6qiX-+rr;E05-pUe0?S>E(R*RxfiG4~xdLDp>fX;!(v$ei>%2IZZ`#x#kE@ zDAKJ-d`huR@q*$-y~$IleW&6d6t5}XRP5H9QfF&-RNMpE7lW$%K(0&jYC7M$K!X7e zGxSlUpESB34na6T|H89|Ym~%~>b0KrT&W}u)VCJ}%azKrNv>3$tz4;mp0ix3groU2 zkKuYHF*y~EQ=FhUN%0xQ=M`C9#W61`{$7zeQATEIV>~;!vW@gqb7j*!(#P7*bHMNh ztmXQ4-cx6=!V6sGzV$R3mJ**d*yJ1olmnNi{YYjCJncIgj_Lbww0 zU1fGfj`yfXSE&D8fqG5)WK)N6Rs7o1VOYuQUpKt1pYe1X*6QaxJ%+#Pmpl&*oAt9R zSWTjzD4K70SO2Og%J5J9)QSMZd-|mn0}Su$U#}Q!*rk76WHIa}9?I2KTQP#G>wk)@ zh68&2iqTwS>sE~8>e`e#-*8HAE=n<+)=#XMgd;k!VydBCZ(T8ijy!fbhRzw^9^;;|AxKx^&e2Z}YW?FUxWaBZ(kjpEu~ zUogy=$a4=Gli*=vx_)d$y^$G-qK!ryBTdF!b)=iP1r_jh(H5hZGt*`)*8f$s-B`lN zE@K(bYByH#ti5Q2+M@lagSw(asDnL4M^FbJN6W1IH!H3ftLYhOKppHaYDOJ=oNA#P zet+>0G{T`3oyH^j!J<~*-vG(~+;7n zctM~kh`y~srXliI&>fr&x{9=dVAKbn6zW4rS9Pit^>MIZjOl4O-ZWAFoW6)j`k{hp zrsw#(A*LCO&!%EQa`KDRKQKnaT)MBE7QD8OAg(;?ac=eH}n8tz(RLq6q zv8F}(#e!V4%&}BfbL)+%Da@EP7Edv;!&!kFciL3oW%le?K{=g*GVX;FOht^WHkHD4 zrV2G)sc$WwZhD*lQK)IH{$0UF)X>r5IjEu5;&41|Yrz&Y(XrwMXrhMH3={sOcoE8| zxnR5LQ@yKTm+7E>w_q<`S1Z_W`dsfVID}$qE;z#M+)o7!tf1;HXl9P?SaB>GYEN+@ z9p!flTG3FAskvyV#^PmYsHWm9G*nZ;dDDHpx!8_|64Gy;>PADIDY#_zgICP~`k6vM z^CODCfD6on8SgR&>Su~Q=3&HlQCnvU9+-m}DK?Mf|5a%o#gUr%H|kmA7+*uR02HCy3G^HMdE zsz#Q>3CtzRF?Ql9W~YkXiuA}AZ$-QPP`m@}cDA@0?bcYl&%BnIk?AP74+=w3aQh4A zm_OiueZag&|GY4q`NqcLTIL&%7T1|SQvcI^j5MP1juxLpuWw zt*{b3xS_aPy7&v%NX@5kz28OsaN#Duc71cyFEOGV zzbpx0cHkc+1ElvqwVX=P$A#6*5!96o_PeehEg9-}L$5Cx;n%6(Eg9{1Q~#u7oL`sT zSTYHX`C-XaH0GBjGtii43iqKg+X@e$F@GqmMPr^WtdkzP!bUXakA)}Em_HSsMPq(f zctJE~VF#6^uM4lEH2)GkAEmiHItr!vcC-bhxh~p@(#$HEiPHSBup6a$uCNEC*;x|C z`pk=k57C>4qjUY2>IEecsLt4Ew|_Dk*@*Tm@CNv2>NmUtP@osRgHfQLdWWJw{}{av z1-dGFBMS5j?+6s=ThZH5pl_8dM1j6lB6TMjVVwbF7og}}=+L)P$D>2#(Upp;^x_h! zK2>{1`>)YAd&i+ho!&{P(bXlg7NN#F)qg$XGyMO8_mb6BIbK;^RaBCOGOh7O_;1p8 zc^CTsotYOKDs{IvT4p7@aj4XL-XxioAZBGg@pj&M8Y*>X>S|Q#S6&+`_2X38UFMFL zSqa76`lltLQa?*whf4jbL{#cmsnbxYN4*88)PvqqRI0=^DsIp#N=p5Y>Sf+4|Ks}K zyleeW;EiOSBG5u;LHg?@8v=%L9ySL& z0k;K=(4$Ls1_bNjC3^y%)Kf}o0!He~N)85$(Pxz$4j8My<=qo7RezB$sCPqg?bTlLAXlIS+=)AR}qlwYc zc^gDW=lMiOLv%DmM?-WpL`Oq(bVRA>Xvp<8Z=2}oyv-Uqniw4&Q6)MWqN5=?8ls~i zIvS#*Av!v*Q$t4+qoW}@nh|s~aiac%^PuSHh_#}l>5@W6Lv%DmM?-WpL`O$#5FMSj zM|3nXI@;MJIvQ3gu2igohtbh@o%QHwc@!N@f7ejE;`jjE?>`rdM>d zvqf}t9$m=%m2IMnKnXo!x6 z=xB(JhUjRBj)v%Hh>nKnXlJ|VXy+Bt(N5V9rl0eU=xArJ=xCQ&bTmv*L`M^&qw}ta zj*c~pj?U{89i4YabTpS+bTqGwj?U{99i8VB9qsgqj^cJ)I?f8`p8 zj{e3Kh>mV@4MRttbp?x#c8x(tH@n7*j<)v`9c>?oj&5>IMn`|=nkG8h6(Ty?9w<86 zHCuGFYp&>M`!LbbuKA*)T~VT=WBZAYwg-!jc3DJ6yR4$4T`8iYT^XXI?MFmMyK+TG z+sBBGwvQJbZJ#VU+T}(^f8z3rj<&aoj<2ZQmj~+C5fu zw0nZ+X!~~2(e5dtqutX*N86=K=3n-`=;)p9P|?x${i37oheSu)kD#NQ+;c=n+Z#kj z+nYs4yTe6CyBCO#wzrCohUn%vuMr(>KQB5OqNCmGMMv8&p`$OjH;ImRZxtOK8!S57y-##B?^m@Ycn5h^-5e}?Gj{F!ESv}2Cw==?Cz(Y!u7 zIzK{mbVL(6dTstf(b0}@baYF;%w{&mP7@ss(b4%yqNDTUL`O4%j%EZM?I;!<%?LUg zqN5!PsLxA`j&>{(9qot}9qmXI9qm{qI-1T*bacKA9sO~>Q*^W=OLTO8f#_(5U39d= zBRV?2)Qpbiub`tHm7=2|Iy%2fbhKlQ=;-{lqNDRSh>p(REIQh;UUYQ+Hqp_JO@7Dp z`}sRXN9XSm9i3kzI@+;Sbaehf(b0|_qNDQ z(T*PfsdOt|K~4WVq6Ia5B%%#9{aHl2sOg9+%-CL!=oB>_aR)Ws9?^@MJ{95f=lT+9 zMom}bcZ!;h>?dkEa-gW`$Usrkk;6nyJ07B@k4FZhrt>1lh?;g9QPU0icSKD`ju$oU z3=lOPIoUs1_vQDBnvR@?nm&;)dm%MMN+)Vfq;#VGF>B#x0>D7@@qNXD)qNbe# zL`^$o4@nt8O+(alq*c^(WQwS19z{(<)Ule)U>ly)U>k-HJ#%r7d7o%D{9)g zLDaN!Gio}*vs%=&XB}$#yl11RY0nna^cl}~W4i1@6dFMPnb4%zSFxYs&lMk4{DtCR z#X!X%MRqXaxsNLjQyifftmS4~s8B{US1EC*;>&7;eUe@>Q^ypBDN=DG4p)3lF;a29;_HeF6c;MKp%|t3rs5(+ z_Fm$37AwXm#?rf+qFGg(s7=VuV9k=2olAxE7ujyK`G3L}YUzsX)kK`7n61dZO|y4t zF7455ua>Xk6^dR(_HzpDrE)5))COm-qkcMg_Fio@aXG7=WaMqQnu@B#e^O-sr|gYX zSBGS8VULx;+1q6`ZT2qKTWQ&Qsj&{7yBD+Ho|5F>9y`QS<(C{?w%OKpX$bM18 zAM@xTDzH;SecGpr>>XtrqSY#Xp^Xf;(WNXrszw?)|3^^q|FI26#S2d;o>V-g*rM2~ z*rs?v@uK2)ia#h`RlKH%;^WnBD&EriW;dYm>$98D_%hz3f0^A%2TfpjG?m<;+2>LE zGS0qM;c*mlg$6~VVjo5JyLw4x&xHdN2P!_QI7o4@VjySl5}kz)XCE>Q)gNYGH9QWx z3{NPIfOOobM@MQ}$X)~WclaB{F^bgl85yU@UM9pSO8AT-Rd`}%Lm*uhkQopds>se; z;YoOcCqs>Rf@#?g@C1Wx8lFHHrTC`eTZ++&7R5NlcrDO2(qL6gP+Y2*q{yCL;c0Yn z^En!FZPt%{;ou@D9hv8vdbwXG=7& zCxdO7;a$y`+iLhHk7gO(<9NG)ZVQ{ouuE~b*2h+ixA?WK5^r(Lw#KkuKa+bEhjGrf zo_?h>woQi5^lxli4Tp$#;5jbZs_`7>Z2RyW?Y0Ak7OKp(IFIjbbvTd9wnoD_c+&6< zJZm@)FBras9XOKjY}aul?Y3?lNxQ8FN77+?Xz0+}skvX#+ryoPAEaK4J8927k30Eq z&H%#=ZCK7=!!3>(ic{&%8G%#j${CGQxu2)uR626TQJ41*FEIAk{BtH5*)=U(X8e6Q zQ;kElJ~=aRC;yi-Q}$6~JeXs`nB^am6Jg{#ma`C#GA6vr_>>lq6Kx!;y^<4$Q#qcK zgi{%klP3LE;cJcTxE8*FuB#_=oW>WS&G?dvahbUdMtVGQ3h*%xa!T;EaY z%lHQIT0G59xy^W*hdCSYG$(R4<7v+2-o?|j=WH|LJ9Bp8Y%b>P!P%V8slnNt%Q=X% z`8MY;&Zae|9%pktrwM2CO->8W=3EXH0{&t<&gPq(D>$3;Ih{D06FGNqHWzYwaW-u^ zKAg=@xn|>f*w45@|6lGv<6nsbjhhtTr7vZSk*=KF2htsuJIqMO2qW)leRG42J5~Il z-kd8tN_?I>84vVT?le5m(cBQ@m-^SavvEQVxpQ$sO}X=NLQT0*c%ZLyEyh;8KG%v9 z`YJcY_>F!wHv=d1b#AWlTm4wB8$V>r_2P%t=aw70v=OT}Qv{KXW%4 zd(_B1eRb}3<9*$gyUX}L{oUNXM*2x|_nQn_pWH(xlV-|2Vj3jpALqmwrn8psInIf1 z4xZ^;?j_Su`6ko(z-NJT;+&iCskskuPJDB4PD1v~n@#_N;?s%~6(=b^tN5Jabj2Bp zFDm|?H3ELJ-yW~n)3SNsG9Ny;i!b+tn(X!qiV?;Zi-@7X(YbtOx{@2 zTX2GDF`Qzu!09G>rt?B^TE4tFI4xh^GLwzY(J}ZfU-)MHmM<^d#B4;~B9jX)Fu7Hn zuUG(M@nOEaM0}V$t4KYoSjFrJ$atBGD~Olj$u8t&nWzEh*-d|B#AA9}8XKCmWh~05|p^e4FVoI!UxZ`vBRuiQbhSMf#42?+eXbqUZ)O(aAFcCwFT05uDs9`at~QIQ-lx z`y~9_Df?9X+zI;({M;$~O#Iw&dl-K1lsy7JcgnsHKX=L=ji0-3kHgQMwkP4|PTAA& zbB%Tze(s^&iJv=eFTl_J&t7Vt0;|kZ6`xa_4%g!Idh9z{57%SgfZOY#vt^DNc?E8x zOHm$;#M$q``JJI7C00LYZ^8MUvmZ3aE0Qb1_u&6zJQW_s`AM9sXy;k=W*2imP53_< z&xdWez$SY;F0d(dfO)m{g#8LG@R+?57kJEmhwklWd#`yt$N0>D(T_XK=D*^Y`&jL;pdD`GgH}e zgy0w7bIdj$(GNK0;u>om^Kp&cjwpI;e&Mj-8vpCC;u_y|q~ID`92vOAW=F16UmR{+ z<3ooR*I4H$$2HbER^u8!b*#fRwmCNXeXIS-u|@W!cWkHc@&(5(Tw|$YFRt;BV?VC( zea9hO;}ypdTw}bW0oQoW(Tr>S&e2NW&eM+bxW>DVOSr~Q99MCTJ&rD1;~mFcT;n&6 z2Yxr1FVy_H^u10$T;m~Ue_Z1^=OF(H`a8}c{uA|oJBRyE)$ch+;vjc~4#q+LJ#;7z za!2S09AtgyXdL8~&~Z4(%OU%5ke5OZ;UMcmWd|oMbSe(=AI`Bj$lD=Dq^~`s0S9?I zq}e};xD^L^**QUaJVRwSr<%~2ILMpMDLBY3x^C!k4>^y6eAgL@gZ$1p2M5{f497wC zzBCXAS?^qcgX{{G{SVth+5eE&yo7_i6>=2^`LUCZAm4fCGXDY?>t6^HWoJ!B*jW>n z>8G4obii*3uko++ZFAb`gBPyS4?8_L$UV+t9OOY~B@Xgk=NcU3N6z&)$akHaaF8E4 zx8fjwaPGiCu5?!8Aon@<;UJGX58xmVJ8S*_u8nrq;UJGV8*z|*!w=#he+)m2gOqri zinr^PPPNOT^DGYXZRZ7lcJU0a$3b2VU5JAe?$#rm9XQDI;Y~QmH=WmUkk`UxN2#yF z+i;M(!`pF?64$7>LBHng#zEFOdvK6N&WAY2gD#^#yIi^g@R6ym0r<$TU4!wF^)A`1 zBqF2>AKB;{fsbr*jSdL%opy~280Nd}niTMa@4Rbjz;Jz;YevAYe0NjD=uJ^e$X3P9&~}L9uHdJYU(>uzvpVfiGJg1!-?KVK}zzGJmnt~=sQUA@Lq z>56@AoOH!PlcHI%kM4UeQS(!AUqyOmIp$}I{nevCSMei?tS;bD_U3~0)xsb}x@(Ca zR~)8Dr!6CN+P>%~owkrpTZqzM9;Y#14C%K`yQI-?3+cCAZqw+uU7n;p1JkGv$p|wz zkz=Ln7NYkdYZaC|xpSk$A&RJe;+NI<9JpC}a$%SvGoHj~x8()eYbs{Pu;rz)mVSAa z?86NgDDoTS$Tt-EjS|ztyL_$2Zk)qU%b#Jt861DNFQ<3 zX6-Nf!{wdY2A)fGN*zOI@$z1(Q#Y3TaJ^dO6kM;6D+BzerlqMpt0O~ky;|gS={P2) zRzb`a1MX2H>?V-bPgdyiDE-K3198JzTA+4-_t1hT7Sfd*8LrWl4CzXShZR}BOMFD} zKZ6#~F*l@zQ1NO=8>6+T_%xiawW|1xBKszD41LXM z4xT6H{opU7Vl@S zbVlrLB81x`3dk##S`?A8K*3(r%H6SBJiu51 zVt7+=ks4X79*t8Y?ECQARBC%d_I-ft`vBSZ0VXMCYUZ>fvg$fA6u-{*$AGdvB9@^KBZ^+%zE*6|Po+;WP~}aZjxTSUHy&U9 zO?oK4{G0SSIP!1O!|~$6^Kb!PT-dIkPhW)p{w6&Z=lxB3BA&Y~qXy4?C4CtVyEQ!v zhy8s<3l6*Kg?7UO{nKYWaR&w{ix(e~UWfnwI$d_<)Y8?ioatxr z-x_>ge~^BGs^L%R9mbawXX!s>>@mJfeBBtX-%anvg zjG?&g(-|Z1*~jKhqg(&cjM2F5Q}aS_+ZQs%;j?dLOu}KeXG}HHx&PuIBYSzgHiOFI z?Ti_+{%YQA<9qs#88c-S7LU>a4at@nVN@Is&73T2u`(izti{S$XgmO;@!y|i#Nod` z%Sgh1*Jh;QxsPPnaNCD6ocQd|GYat5hcim?)(7X!#asX9g-+uS`d1lMR2*;4n~%f( z_|;ZD;aIjgv8&KQ20Zv{@8 zZzfKf^NEw@T*+=Dugx$GSFgZ&f{YgYw2+$ptE^+yeHm?3AAQrWQ+@PJ@22|b%V?+i z=*zf5t2OO5mP3^O&(Ycu+pSZ|TJ-*iv$zKobP{aV%( zs-BFSjl3(h4rAVG9P_!%W?b^Q%p>N$umP`pF0&PvEaR-tARYzJ=Ucv`=%qusu zRwHT;ZulIpz*>zN1M$HfnODuzVHXbg^t^RA;4`oE;(&#$(3`i>{EB`y^DYipV%BrK zHj_H2FY^IzxMk*SGpqF$Za1@9?-ie!6~0*-{5R} z(TiCl&F`vsoBmDK1aq~VPxA-rT(Pb>YdTK%(!4D=T_I~nvO>)VIew1$GyP0fINtYG z)&g@aJDrTi`!;4R^81gbWyRustFsdQSYML0jEZS*RuIuEYZKmgZX=@V=*_4&!|rX3m#2D+~AHea}UzJu9=MVtO}ADyA2+ zq+;5cB^A?aSyD0mPnJ|nKZ>fy`<{ww!u$R!s~hk8K~|6dB>l&%hyKs#hqI0TllAWG z0Nk)IdjM|u!>~YqcI^oph8zAQOzx<6JWTGW_kEb$QSU~W+)=MBY#MI3F)W07>W^Ww zal`LqtDW1QTSh(g`{%M`9n5off7Zb~=fMsCdu9~%)GOJtbNimKxwzpUvPa;CInTJ^ zPo68r4OeB4!wr9)Jqb5_FMBF(xFvfAZun^SOx*CPY;nW?$(FkTG(A^|8?Jk94Q_aQ z_Ci@7Gb2#e$IRPKJ@vJj7Fi#|2^R); zuIwb-@T%-I-0=Er8*X?@wi7qJA-e!Kd?LFPH=LGTCF^Fg*W!i`WpBU@*JN+T4Qtuk zaKkm(JN^Hm`@+<2V_{ML@2Z%cfQVT`^J*RS)E{O91g4vW6xsMb^;F7>^tNGAsi(ye}*lH!N|Dia*z@vupet^kdlv@x~@^-N7+|!#?{%KIOCM(*8Bfg&&ua`t)LCD%4a6VE+5&OLiMC-l<9J&z&Ul4w49?hM8;>*oyKOSg_ygOt zfZym#Y$5pL7j3fxo`Q4n$4hMUsltZXqNu`#*ev*Ci_MBNe$$qMGq%_=aKb_kbz*LI}uSmFlRBgximTrWF_j7rqlK?Jg+J~S)#QS?*vR}4_( zo^Tw)UL){liv1OTt~fyP5k+<);h4dS>_)n?odKJQSlkY$%^b&GS;oJ9}S$L7^3*HBDtoqIg=dRq>4CS;aQR^NJS~FDkYxey4az z@q5J%#mkCU6n{{>s(4NDy5dd6TUx(_PCRaJ!W}%WysI9)C!v=f(W|2tX+QBl_2F@4 zoIPg7Zp6j*jNL_@SjZkTaG>I&ih~q?p*UDEkUc-l2JUk+c8lRL{pG}dhM_8coOl>D zCrn5P)7$R0U~ zA%;IFa<`s|#fCQ&qZHp%d`k~aoNb6!ag1V|V!Wn}-Ae^pn4riE6Y)~TB+l4e13Lgb zImuv?ZxMB9atOVw{L1KMn}ocuw&f z#q)|66x$WQQ@o`3y<&&rWyLFs*R;Wj8HVfHh{RmOEj4mm`)wk9vrzhG&oAAIS3Z|m zj#suNuEr&wOI&C4=bUdeJ_5HGx!+Ra5ghQ1#O*j>;p1=@J+wCx_Zpvo`;EVXhw#L5 zWU$_q*gz-kjl^ancWFv&HI9Yn@yE4^myFNqHxsWKr|Gv6yQoZSiFfh7*AgEX7w8w3 zYB=DVOZ})i3%RS)#7#!4VxrZOB>C0f6wLyTo=q>AH*y`>ANTWd=f;i@Z_F2hv|{|jTO zURN$nquODj!7r(Te!nCQN`>U#iP%tc(NLQR>i+lWH%`u zovy~&Q;PUSHO@V~h}mBX&Qhe`i}+RTUrYDl(f_sd03KZ!u6Hc0HNBw?T3Tm{Qd|TZ zO^dZhm!8CzUtf9_=iRZi1LrNY>EADXNX5EiX*d46W9bDd)-uA?IoXU0m)N6NppGe2 z&+@8Ai_}Olk6t&GsAEdiNQK@pajS`0?WH}`s^t~l*2X3oO>4C$lLBz+-z5z&F?*df z7^gloX{d?Ln4}S=f9W@pM&rM)B#py=f15N3|J{}}761M1Xrqa~;-oOsLB-E_bcX43 zHU5R-VMb=+%jHP!a|RpKkxlvsNfG$+j--XAHvRjgXdHP*QXKVZEh))#S3j1NhX1~i zWW#3*xi4Chlijw2ewu$$ftj8a7{KSg!`xTJ{S<$u_;bZa)T6&p@n9AIQpJIaL5f2Z zA5(l>QNBw%%)=E&@_tIqqxid3=HIB1ahf@4t$6pO4d!Rm$g{+om{H^3D9DG-@+$rTivK0q^H#r3dzalvU2R~_+83+Hz6|F zTI2tsZ{4W%av#1?o8&%xqqgGFUr#J2P)ChaFFm6YKon^>w9W`EP@E zoVxGXng0LMw26)WJ2dUtFzVJrC!Umh1U}tg?h*L(Ae?&htYQA_?l$o(PQ7(jusO;`mw%DcfiHhAR`P1 z?$n`p@xP^xz>9BB9gP>?ojQ&x_1)A-`0pL5Q>jm%Pn|)1dPnNaz5{*BQ^VMuE;Tg* z7haLNu!Y2ma z#f1w^ie|+=ihhcH75ixuqy2E+!v2asR~(@Dh~lG)gVphYib0A))%fEo9;P@#F<5&m zxHEBpS8uI&tRHI>(BGqVOs?m^YG^8307b{YeCdM(qMD5qn zBc-!CdMrNM7cF<1{x*6F73gmRTd6<`GZnKGvlZz@WZa>jj#l?i2`ZM_b9AWGo{6bF zL$6{f=j6Q9o?#`&^vK>KunNwR3N$elXda~kO-uzE{z;8chh}^|BjHkeX8dn@XY>Lb zc4zb=Z3~ZHlBzTOCy&O;4p%{2rRof+I>QeXKh^@G6LHv21zu&hE8!une~_ltDt@8( zC9I^^TE-iBwPpD1(}550*{2_q6_XO5RPiar7RA$wt%_$9&nmVlUQo}vsMxMXzEixU z_`PC>di1i2uPFYYcvbP5;&sKF>PXZ?bQTW#bhI6ZE$^*IKNanfDso_#?6nmwci@nB zt83bjUa2BO{(*fI`|?ez#Cdl;CLP+s0g3|^AJw~p)=)o|@xh9C?&vjm?jM5Icm3%b#zcCmYClKzYgL!MZERm0P)r^L6KhyagyS4 z{Y3P2sTl`trDn`G2X9R-lA3XJx73WId+^qL7I0mAl_Qe zHr|?7=9d!Whqu-i55QaZT|C%OrS)4p)UXPUFtB&$;?Z<{Ym3Lx_1$mrBpi0%#ZwLI zh-c6N-gog#!+IEI_zR4n8@%7*h0+baIGS#7ZE+kvTU(q&A9$a|Y4~g{b`m~YTWmAD z$B|Cy17BQ#&(;=~;RL)UlD;)B$f?=3z|*Y~}}^;DWAKCj{nu!&0Zy~Qnbeao{h@jC5PoqHBv zq3V2ZaVJ&hJF!!7)!O1ahFgsE8gAx;(-SU725Ux(g$i^Zi&c8UEh*HY`&u%LztPN=TzbNXS=@N;dW%=~cC(b@wjZ^u zHol}dOACq}CmrCHbw)C_Wup<5WZ7cmdl(yLdiMT`>8i~S`HagRGg~fWs1w;5$e!gmIivl<+(OST8%mC6>`-`o{Al6+^J$0$DgNT zywh^Ym`{9_>UF23i@xzr%UxE)-nTrUl6^Bqqmtbf<4524jhOy8@+&cesAp?2L#StW z#SF)n-;Wt-To1=m)%L|qpsM{KW(rkpU(9r>+P>I@(l;IxN>$qz6Hec_7Bh#cw!|Om z$6^*x$!?BWWUSFo#>C>?zm7@7yC03&gm-U>Sw;_eV@wv_{aB2hdUkV+?4c}V*TERs zN%>ezC9eHw%o<}e&s}dkp`LpZZZ)3LkH_qw&-`diHTCafG5d_)@YfIE+8bkPaqY)r z>ZpZ(7}IFHq<;}}67T+L%vrqqr!g1s?mv&|z`O5`d5Cx49djM;z9*&|?_M3#gLjwl zd-|SOBi_9_Hh|9a>evC&c^*5M&T}nxD4pk8>Ib*Ec9S|Fhv*%llvll+4O$h3bvll+C$US=F_TlV>;}s_= zPSPgD+VJ<2Vv|gh6`xg{qWC+-=d_8jX}ElO?hN&6FRD0HjlZNuW+}eH@itt3ZLAZQ zUmIJ1%NK_0_k-k4diP?hOpBoG=PEH>HL+{)_xEEr;P3Cp*5L2&#T~%kOKgXm@%Q&* zcjE8w$8N*lOYBiBfP3gjmm|IESw$)?Rjg2~)Z1eZ;_2_l9>&x6jjgBp?u%{0)BiWN zh3fm2*fu=-(0>Hhrb{ zE}3g;;K=#Z<3C>#h2y`!#Ddqqzr;%QU3eL$n7TM71NZO0Bp2WRaEY6``@h6#^ z0HKNZ(@d4UYe_kM>0L{WS#k! zDh^Z(QhZDuIaI}ut9TgPXnsP)!{K&%+T|5S>Nl3`qKe=aNIr2lOsE zLM{LPk_Kw|@;>S4TGC2q`~4;7spt!*>-UyiqN0Cm$yF-)x0iHL(Z9XqE*1UmB@d|R z_rz&b^l!!anIrYjWPNkoaAppK ztZ$ARDeIdVXMHorr^B)448=@ER-f}ItIuIBoIveg=+ckIO<~SJUO!(wTA&|_n`8Fs zN8-ZGCHld*1;G!kPF0W*08T51>Ebr})9lE_@b0l-Y&j@gtaBI2J#e*@e^bUtLehLa_cHvBX4YLamf@+yv_)Ab79RMfd z4>G&JIb?R>qo4)MF6@l2XLjL2d=s+^r{i0gUAP_J#_Yle@$JkmbObdryHFQ@h1rGf zphe6sTn>t5cA+}HlX-;&j}2sAVL|*I<`ovi_cE^_Bc+P;!^ivR0GRn$ARPcNTh0C} z6<6tBS^F`su>G-N%q#rEI*@sVGHW373j3|Ym{+K>1~aelzI6=q3g24CGp|r&oy@$# zXVz)VD;%(fFt6~QbvE+~k6Y(5udv%XpALX))+qn2?Eh(@13=g*fsRu zDy~s+13Lz9VMd{zokEZ6Y1Uo-C-jZhz103&t^1i*NC-O1yuvZ-A?6j1T8}WVup}sv zd4;d74a_SvSeuzwm}PBcUSWatJo5?*te2Qqa9gi3uTWs^VqU>+z0179ZtDZ)6_zDv z(g~m7N4@`xg#H1e^)C|!F~=}3VF+^!kqN_@V<=1*DfRw@u~P3(n7|yvqJ$~TF(f5S zXO1ByA(T0W{De7D?@tJ)-v6hB1=RcZBrFOD)vFU?srS!JNR)bi!ZPapLlUy6^#4A= z&K$$12_7o_#}kT~W4N49$s9v#!Ww25o=#ZL?83(ho3xl`jv>e`vyQ_kG+&dutsa z@s|a1%TpG3x*L<}NjUKo}{n|GG(DEoOkk^Ucpf zOQ)PSOST;I2jdrL~`oBCczk-gE-1`Ngj=VTew8H zu#fy|VkW9*J^!-A^D>1oe-p;f5zdiM^DQO{g>pVet55AU_5Nd?n=Hq?sy>(F=ZT{N z*Opfg3G-G9$E6E51_)QE*PQb$am;KBv}>bbv8I0e>YF)NyDdlF z87AC!On6(qQI;$@x0X-j7qQSZ8^-jPUtCNdIeV6Lv+#}YWMrhg&tck38L_L+=neS} zShj43F@0Ku)?^t;lK-jY_x*$y;p z_=d@+V);eHJW&EI_uiJck9?QrYI3e(My`r&eflHhJ%nmMlkpejH7!fz zJS3Uqx07T_k&$kBo#~qVvMh6jF^{TGZSWBpnJRxVW`>-TB-0!jNixBx0LjTw0c9|z zkNUmLkYBoGas+(SAg}){lSw@Kt6Ukkt8@6qo5b@C>T~RKQXaJ?2_Ne($2_XOIg{0y z@1uS-7tY9dl0kS=<^0Rp61VOaUj7iqJX0fahx+YI|54)I>bc3+C623X&7CWg>A@K(&njPJO<&Uzhl~CTKY!?<8ijyh2R;L7_ETxKNIaiGLAVzQ_~) z%_8jV7Iy3xw${O@fPNA`dr|oRNILWQn9eVZ-K4638rH77@p15?5RvOnQ8m?lB6*Y= zsR1R)!5(t7Ne-G$HW>{1jBjc8izBln0#z78?OsmLb)LD8dl&7MZZOd;=e+nGY~A)l z5dU98yMGE8<7!PiY6V#*iR>0mrc?se?r!A0XY`c#n|34Wt}b%4y7461r(?lB?n|`0 z3bpv_GBfdii1hDb*2NnRs5|!u#~4jPzlXg-&B-IjJ^*#EowQf&p{-_v{?LwKoF@YG zc~*itxs}*ofNCSh*+W)`D#j?-{!qS)+PfXpC0Rj9u7$KqaBMnqKiP$OqRVTt`+Tyc zWZ>K=*oh%jMA!X?ED$6MrV1I!xDdW?Tu6O-23#cz+!RkU+9hJhCbh_UzQ&qbT>azS> zRqHM}IFYn(lY?@EqDaGwuuB>B=$XRx%NJ(Q9?yuW&#sUKmXXyblVQDtGsxE&2cPtC z6+RPojKQAJU-sMmjSSf8)gEA?Ar;;9J$jllwyG76S6x^sYAka`RW3_5kr5_Ie!9xj zv#cH2peXsFmn_bXq2@IqzuiriW1LmTnqaD{BJJu^$=9ix?$?LxDqZW1#jsgeLqTXr&@Y87?Sy`-b=6s^z7 zIgc^xw0j#_G+QXgoMn8pK^^;qlmvaDPwA<=f{b27R^Jb*1*6G568|m2y_fiE<0SeI zrqJ%fdFcl8L4QO%?Y{h5-M>1h+ObY`y9d+|lP`5q`)-bBm z?vev0c$js%Uj8il!}dqk0o92#`rF0O-cW^hFOEu=cn12z4$&VcBV4k9_QgWvgH*oi zZ2|U?-F_RR0c^{t!B;zwy7zN1&UG2|dA`vUFQE};5^`H(8r)WjDxc0+NF{EZkU*xMTj)1YodfG|M1Qj!t96g@g$ZSz| zHW+P`24mz?iJF=R+vom|3}IFz8;pF4n`cgRR{+&dLqXk+b01|WdOoW}W-+^b`C5O- z8L0`JQHrsI_V^#j(QXPXV4{w^Oy*(KE8E?`Wd5qK)RF8WQR>I{)s0>wqX&|`%98Qd$jZ$BF8QA(n!f^D zRg49PxKGf2A@6ncIBY#YGP%V=`j>N@{&2?DAHJ2IU9-sb5`T{O|Buws zHNZI66Y+~W=UK&S(`?Z1og$nH_HieJYSYi4?$b@!ot`R%!8jMkqt3O#g89R+kzCrH#7>o~Le^a*@pCr!_u!roB zwOrXyYnt)ZHOHJCwFv6-}YqHuuWXTES!p`K|waBWIL0zm8?Pr{Y z9zef-=MX(_u=lEs_2?;HlWf0@o_qDdXOj_U>bJS*rKdmrp!d?TK@pibu5 zbOlzZdM}iAw>L@k6+Kxa$gz*=z318W-|+BZ47_|VsBKe#R)Mnjz{KwgswU+Y5qELGM8m~Sd~mr!EZoH?MD z_9h>UBp-A9i6I<`Zdi<-@e->{se+{K^lZLEc3;C|A`Z}=Df+%Q1-3sjik^)onN<K=az)LVCMBevVCTv~w8U3>cgE21t zt?qh(Y`T>Gr)gk(sAT(F9q9M{Kn~i>SC24zwQf(gmh1{EOncW&ttv~A!mzfS02Fjg(y&`Qt=@nHAy$4q$3Z4J`c~MKKYFvKXvzq2EZQq z*ED+V;H!K03HO3=A)JM-6AStxrqY)Ezb|4EY_-ZmPw9bVhhIVUqCD+NKC-7lzBv<2 zbdRT9{xYbJu_|@Dv9uS-99N36&HqP#{9j}l#$T;pPrEx;JzaYj8NHnB#PcMFFr#z> zIa_0P0NwK(=nof9o8$B-=D*UaScHisZ)46#9>F%*x02RWn7+ z9#n0J`y@T{Wwd!zMAvIZ&$>mRKlEMD=lPDFPdGN8XEhm`OGbPlo>{^#L3O<^*u&Ka z^oQ=DZTtl4_z7UI{0_NyKWvpXirm|Z{ELi}J-=?gnV#EJP~E9WZs#21JsGtBItKb8 zKBc`j57e)=B})$i{odxZ+opo*MFsK--%D3rM|Rjo&qekqmB+tTcb3v$>tEW>R?!X_ zNR}E&R^=?T?`u*zqz;q#xDUajF7_kOvVL{gS=x8PX~#-6#c?DmYd1YnwEdCHWUXV! zrjtN*gtdnM%LEfbSl6+xxu9;cos3yRYRQw1k7?Isp6lkMKO#R$cVVkPKc~MxRU7IG zf&&fK%Ru8Ys4lQZl00(!LfX1a7X5#|O71x<_CwGY+8@+i>yZ_xmm2#g?NZ%9U#JgE z4b1@6+Gwzk`y!|dwIQ1`dg^R1+A$K1oPX%KxR0Kw*5n}ZypRZ#{f@70lpL7FxvK~K zTXk$W7%#h4-SiWBPRgkCkFZn2X4BJcI@uu#91>E7_DqgnzqXI|QI21QR|9>Xg~CiQ zF8|2CSHkY$dIMB@w+i==dp41G-vM>8*U6%y@{SK-r-nA5r|K|J6_LMf_A~9g|3F{F z3oy?08>o}NCljbed}tLi5l0^||uzeAq@zu5W=zmR-)!k&n4xle0671vN2&x@k@^MjeZ*TI{NKm(7 zJZl(bX?J6;>bE#59VK0~u|%xfEA+fAan6aL-GuM1R#c@O$68i585tE<1RUZ%N`JFh zdTxJ3{`m(z$t`K0WK`Q2{pcwxm0qkZY+oqHALn5Nv}c6aC1_XRT+~G>rS^OY`a^Gl zsbO>I+2MfN!`#rV8q@PYI`ADvMn_A;8t$Y2#jEsmXh{36*rmGCQ=a*z&fW(5xLu&% zE3tZ7ng0LIfZE-Q_9cl%X^B!V=_fIqi{Bdx4t4RpQbT!sPghgW=cx#)p>xF^O3MDB zr;Bq;4duHhxaWatEEQB^S$+Ocj-gimcQidT{d<2Rw=h<1jMr(8y(wgF;P+#+_s%EJ zv3vL;rje1m#GXw5szT(Q+MuowO;(p&E!%>2oUmFC*zqCE2VGAx_QwXW)q*i#qWdZB zy^KSmI~CNeTG5lmS9PbWWdCYp)DL9yePkDoUn^#>$|(b;gh>_jkD|YVMD^N4z8Y7U zTq04ezXW!odka0!_%6CDv&A3Ek*l$H=!s>vsJ)wL$9zv#7)wU(1$(*}TReRoR4*#g zA46SIL)Xz(v%o3_73t}cN*~II>8@fQWk&UMbpw521%%ABo^oBWhwDw)Rg3{(FC!qY zau&7ne=V?gGiad zM=)Fb5t2&>KZLEjG3(U9k7yUo0AuC*UtL-}G3V&7Cb7*J2|M1?pPuBEwB^%*KY|si zZc2O(TCjbRjk@bUJhJr@(C;lxJMlg_cp*9HKeEI{GKy!@eQS_i{{VfF=V|w6{B@kf zS;x~J!0ONu4?w>+6-*7|->M_c$wt&#Ey)ITv);7xI39IzC+TiSUVV!^caPkwK^+$> ze#yxPMd@k8GxRd}zCI5})l;q>r-pWcof_H+RAY06zmseK2DN9na1uQi_mg{Of_|w} zb(ZgbaG;3Bfp3@|xFx9i ze9(pISMRhT-)42IG0b`0lD2LcK~D?DO&6R;mX0Bt)B*irjE^?Xkx3)LMET63e*GUk z-Q=8qABU~}8Ui*mq-%99K+oXCJSI-jK9)nf{zt<3!f(LjkbaEeVab-ljDR-Uil4KKm#e<&*+Y6NRuWbw zpD>cjc?Z-XN5FWGjCub?*kg>^e05DnaH#Pf?RQehf(OXA8KpQQiFP%4_o9bsKV#+U z&f~!`2K%0RBbVG*7u5A6{#};R^YkS>g&DUwMiFqf;ijh?bx(9HryaII$cU+RAJgt5 z?^We(dd9CO4aou5P1*$|o&}oFp87Z0(j+||VJJD3J#A?IuUzU6rY*flca~`DiSWc5 zGM80;*t!#|Bi3D=b_-^vI>U~k%StvDkAgkK#k%tutR`KOd8k&c1^uBNz&DI4pwIJ_ zkeTN5Fz3}LN5%eu_TP-ZPrgI zjPsNOQ$sUBwfBJVAbIoz`LB%pqU3W~$-S(R^pCv->Nv^#4m?tO#Q$s#?XpkEL8U>} zWHs2w%~|Lot;vD+=)ajmX3MN!aHhKcyX5Pg$&wjlDdvx^%HFFLbU8C(BEz|*_rPc>zYsdo$pC4e-)J__CvBeJsk|0^%0IL$#a+fM&~o>Y2vB$5{okZY6ZPq{?4WCXMx zDYjH)j;s+q_%7<^7&87>^6YBytP`#$&-@40kZVenj1YSEyh(1468jB#wVc>(gj`v4 zrV-<# zzMD;d43A7Pc7v&2W@c(w23Xdp2db;0a!e4mu1W3G-xlrS18D!IXcrqrMjodpZyb5P zJ9$ygA2J^$|En;CRfX-9x$JM?$7AC&v~i)l2=zsz)lH$ zpPt(u@%I(7W>Z2X=J!+Rxh?Nf`%~DuA#+U4*iSx515-Vs%dE@v%o|HCkn_wNP1}|z z<$geWzRc*+DcWZl8J!|E+emU_X*&Ju&yv5t;H#D2qHQ-OZ~rK~A^c5vMJVrk`;yq# z$ORIydGldwe<(e386RKB+roE*gM=DXrqtIO#s^Q~&-9H(xX zNe+~HSz48LgZg9yS3{lB8B{wfk&jo?6D|J80PTLvXRTi+%XTEAekKbo0@b`aU~hww zQSlD>=rQ@{I&$uKP!D2Mbzj!3PTWP-DFCWRLuogc94K0ycJxNF4bP)fC6Y@!(k{x% z)k#!Pw_~2@2u4F~>qR^HBigt5Uh1SGkB%U_P9*C-1c$gk6c(nZ%mUEwEkt`QW1<^N z4)heg#;>6N;%>6{x8w-MQx_E->#!b&xTb+4<(I3vcm*CaD-7%}-?Qr;|I%}F0{P$? zxwZ|ct0d7rDA}94llH~Apf5u5^MQ={#TNQsYz1`%`cp&Y3~SENe^c`0taOr}sC9g3 zLmt_f8KP#FCAa-UZjiG*T}b=%J@N#jr!K!FZ?6Y+>(jJfWYaDuu`PFio~MkDx+Cfr zCI=76T0{dwHEq0;3^pvGX7iLZA%Ev&T_YUpS z%tN)k7Ca+LsHRCY(t%v-H zIiDPoKzmk@?8SFi({7Ph9+9`1jcQ&fm>j~nB)XXGzL5U(k4qu_)JV0?BfsoSPP<7i zkpA%ftFV0`gXx*aY>e};_Vrt>!DLTcFe$VKJ*{Qr(@ogwb{IXKN|WuFZ+dV8GPy69 z67~h{w-4;_Hd@!!_n$`Qbz?!!A=f&0ji7; zaD>qV9O5oQ&o9h>b$%MCo61N^i?aFG3Ot(rf*Cw!Bdb_#lk*H_+;oc*WPN6)ek~VN zPuNw|z5?W=L!hqo9_^gM!lFXHZ=aBDw3C~WXIL@O@>Leu4BfghKABpn|`1C8c;Qn z74y6A>F-h*OfmL=sa}cC;{CA8%6GLo>^f}KmN}zqeop(Y#OfiVs(yy#g$9VEVRdU#4^1gWPC(*tl z+TD3_+D{tiTMoqt67Y^nm2}A@FAG&x1gp63efI%oYW1$6i-1=9qdG2 zl^VHxiT3a3K^-=W?9zaqqY{m*O7zr{+S$%CtCRi6t}^E8RD6j017RWh*Z9dwkI45j z$m_dEt2d|{i)!8P(({Q_S?~F@M{vHnsN`z1&aj6XjK;_E`%m?k#CF;!9{C6JM_0*j0=yA)~4WF=A?H z8aaL&m||?C-KZ3pWNf89ViUPclzM~lQE$pDn!H21{77=pFmg2W|2_F-k?Q?Y?DF(C zlbq=$f0cBBp16O>PRxAOeZ1Hnvg1**t&DAGPukr-BI8rRc-LgwJzI(2BHK!|Q_6}b zjBK!+oFsqSn>nMBmKm$$3W;jVn5(uPVKJeMv#p%Jdl!0Q z(uLAt+IJP(1e1+Lv`5RVTT%VGvfELk+ry5R?=_O$`Rbp9r>em?t09fZa-WFJx#)K6 z3^k2pdi;_<;iBm+iC*~!^jD`|s^Ue^Z|nr)-T$L!$7P{p#n#5Orwk^0P9js7y{b3! zQ>Ait@vi2e&mB(B=&|C7q^cU@= z-g#hg<5l`U*b7$3|JC{gzN6YI88wg5P-#Dsi#QAQog6<=vhE9s^CD4s(Nn(qb$2k{ z6%VF{+Vo7?Pmd8t`_&K0M$#Edb9SmBV;d*q*Yz6G6ED##e-U=2{J%0KwqGvctJP$7 zJFd`vs~;IN4UBiSpq+G#+;LSr%)<&sX|RPM5v%zIU+vEL_c2b;9wqr!%}u+a)Mmxi zVy_gg5v~AZj6tB!yNq_oeEbgU4qq6iOd>O)_6TXQ`U8;+Ij?IWIQf-Di9c zs_OrMe%EKTtC7C^--Xuuf}YPr@j4f1e;6SYEyhW`AC-(cD*1Di(NjmagZ}*gmWtx6 zRkd!yu4L3$vcA-ge50qTb%*B-!$W`bM`ZQ6Lgu!rT$ij?gshV9|4RIIz*PD5lp1vi zc9M%{_PME%Pkx`K#^u6}H)Iz3eudp3zn>RnhUlU*LG^t(@?VZQCCs5eDvsm)B7hd)zuQz z?tb(HdXoo4JXa?D# z3AuI)7$;XU)%xFIC+C0Xet$S@-EJ88scVXm>W?xws+scbWO{yfwdM$u^8cq#m4K~Q z^d}p07OLG-GKwQlb}_bUMP0IeA9A|Hd5nj)pK*wH@qJaRo= zi{xs`YqXnnA*akHlk&(kIYXHuv?oY5s?zf6Ls0j5oAw+T)sy!0)Q}@DGt<j;cKp^cj-# z#n^My|5lLqz9wA*!7+wGJ8+x4#y+V=>;+Tuf3aL%BJi%9`R+dWQ{{UNt*EtDjHg!2 z>QV+{-qY0t^vN$1db(a0Pa{z6n=E!iux9@Ezs^AVe`-Ju{R-4g+5dIdTEaTQ+Ms&C zG4wK6*F9xkK959TT_ild&;p=NX6E}M9XX~Fm>Sv{OmH)*JtRL%$+!PH;Tw2#!Xn}K zLiQ+~uvo~hr4v}W9gS*YF9qY}mq@(~p5NzT4(Nn$!CFRRA!k~}u;`EZ2aF5p2=>a~ zUu`S~TkXvzm%T%7VI2Cnb3k2;^`awF$*}&Q8rNMs`@o(qo?jlQxvQ7;#TEr+7nC4Z($sCq{5v1=m^+M* zy7K{fQ!@V5uq?{{J46EBTJ`?g6xiiWZ*MuyyITNDs%XJ@dd; zhIk6HqIE$=MjInRwL6@4`!upS2J`F4cpcQdC*3iXb1zIX$1!AM!U@#6w1& zAj5`%$sx?HjZ;E-m-1I(>+;vg%G1TZ0jfKP$YWGrx7V~UjRE827o_Uh zBYK|wK|Wqip6erarr5p72M5W8Z<6aJV_)kBTUX_)`ZX%0_D%%-VF!fG=`R^dcDV_v zyeQh``D(1|F6{&=n3(@N{1?mzwS$rOheq<%(h`T#AB)ZU)uow@x-@e@m!1TwJ0-|t zrRnL>gm#99JVO=K#l2u3_d42(ijwP}kQ>T^T2^^otuyTg>>FykjPva8v=33`CPsNM zCG;11=KTcf!hAK><)uB)pns8{b`3^DWsIPm@+K+!?UXQyKzGhgcPc{;q$ggk7d4ab z@8Ueg==V`Ob!Z#y@-NAL7f98C{xb_`58&FZ#9J8)g6jYTsJ6(Dg z?ExH5YFH6^{ME_sk`+nmu+`CK;7Hl$>-LLb$A_eXDWU9>>SQ@GDMU*4)UUHae+0*%V}{Z5 z+br5O{u2H`w#p(q`@y)78?=*X>!cJ?u9Il_)U4(6k(SRR+K_583gZ~{7js_c$5Zyk zT0W!cWJXeVTTd2ePNs&rY1fkZ)-Me^Aw=v1>f-mV;;ZqJGYKZ`4pdXee?fLl1l5kg z<}IE z@AFV|Dm@?7BnLASREw2DiT~d*uyw>%;s1oo`Rao^w7pY>(s>F<1iYWalN#QL{sJ7W z&;2v)8q73Zygyl*@lTR#`?~Z2*y_$^GWZc+tWV#8$eC*IC!qS9>!S)j6H4Z9S_a$iWt9Bh z(e$SW$oFZddZiXVJW0>_5#+C&yZXf|9*#tvmoq>49d@#d^U?*Vm#!4SS8Gdd`-F>A z=}&r{{$ta~Uy9PxZ#$XFG3fGtkg@NO-E%;7n={f$g-D+qS(SekA5w{)4y+5^{4aTx z5mP;=f=-@8_LP|(uS~lyBOha&rd?YiR=px@f5fl!NX@FBAJOiAkWAhSs^ff@c!RaC zGO5uR*_V#UuZ35u!{hVvy;Sx^Q2X}L-XfzaT$c75-+(g>Kd4J_WmhXtkdunjQ)NCG z!d|2{zD?e|PET_gXRr3OYe)_sl)qZcdeQC6@W^#v(vJUB_!`-P-9UF*N5<|4Qzbu> zLS$?mo5Q2JUMAn|O4>57J-1;eyJfUL6rjIxeNgw!S7!@7nWFoCdB@N<=^6YBc`BSd z%wu#<4_T0vqH=!#$4gfkpWk6BT$5L&<2`conAM!`VAniwsB5d(%-iw#Jx9^5D!)Lk zES>6A**U1f>F}$%QdwoMz}AI^f^n{Mpg+G72S}Hwz^X}+Uwi6G<9TGI_d#EHA5hij z_^TMz#j~59Ew#wEBEck24CoK%nEer~ZuPQ+kgEB@KLT~RR$@;CV~sJO`g<+;Z!*}_ z(4a2Gv*{+;V3O-YA@xdfeJo_{B;{X^9Wev8O1dQ;R#uXWXI3MmcG@1M-ScxYIvVuL zuZvZ)p0IWGpXdo^<|Mf|wj@s+80%tg$K>CU<69o1zMV>DoFuL zTw54Sb#vsYZbRszf8KXsj6wQBIdWep9`EdTErBUhYaYXT+1zQbl{OI zH-UZ+Rr7n8lj_C|a^XMZ)M2DKQ0$RHDyyar7rsY+br$R?zfMsm-&ai?0!HLt^O-t= zo-FFyRkB5gekC5Mao4x7Kb32k{)mpSbvtIDj%IGC6Ia1l7js69;5pUil4M#IS-%t* z>zV*2g(T9mo4qd9#W<)BnF;DqfPBLT>Q*hml(4_)NofQ6-3!TxFrin-2>T#*r(Jl53ZWXRLS*feEf1w3o40sI^N#-A=}Tsxdu_n3IVvzN(8- z-*WP~Tip@uBHw_=7b%re#{)Y)v<0X`{{UlM8-&bT9r_4VKTEWChS1)q==XB`aqe7t zUi?Bndyl-c5!4}5#50%-R-ngQQ0(%;SIGyH#I8s_`k5&~wSG}6XT;VsuuZ8nK^%mnFBiB^b{H?H) zLXzoUc?|SNFm8zwXC3+{{ex$Mx@23j0;^b8q1L(rqdL;y$VVFdTh%v4$ahy)7)d<+ zh4xeNTx2GwixSVL-NoOH94XPh=%M{VGq9EPPoH%1K5`XE)ryiMUm>G89+i`yjZ!ry z=}!sW3u?J}xcV=H$86)Q{obZv1^I1NRDQJoTgF$P zYSJb9f&NJ5xqe&X;OCij8`hDoHU?Bb?FaqdY4nuXMRt8i|5K^T4z*w>hA`Sbx4hbY zAz!^MW60x~Rd2qpFMlUrmwBcBTMO!z+sN*H$*4PIyBc5x`Fv3=KfC_n@g)t;RQKj+ zb@}f>^ zf8?q#GFtNL4CAR*CJ2+sm$Sjd5bCS`=B#xs8P(>WWnn#r*s?eer#;qu*&hVZ{PPNy%UyNep0kG z?2R2Y@4xw?_SJUHdgM$z)ceGUxWrSDr;X#quD+7zKJO|RaobhU@ZuiBy8_v`m+-E@ zR@^^$XJ85L4ZJh39QW?+7ubb+^u7}~fP3+#2eOPv99uZB15YF--w##@?DKw_*EO)n zJ587-H1qZbGV#~Gz-s(;m%w`b_3XfAqag0*{CyyRr$wy^%)-5zuLZuw{h6}@3&Va3 zt`212-pe}zD{? z!|?X^_BTAgYXbdoXXV9#!5GWJz;KL( z%tBU-!TTQxe1N+qj|$)kOu=4(sWOV3fCr<<2t;BO`vOHUie-UP7{&2Gd5q$lKvj(5 zVxT5Qu{cm4qc|F9!aH;aT45A9fp)k<_vt`qWWbC7pWwYM5QjT-PYL+Kt{^%Jcj#Ul z7>GM`9}f(}9lBQrM&S_7yjQd*83q;|L){6smaTjYcO*kEAYJ}`+6=>o80;6k#dsep%bVTM> z33P`p0qB(>`~hc9!V{){glel0-vNjYnH`LQcAH4t^LasFB<}P4ZeSel+dL{T(RdZ3 z``EdT(b>*zjBcOv5TiTlJi+KLIWI7}aRCFPTNen!xMl_lVqBz&(G|lzvkwKzK%G{B zir%jf|LVANcH2O0+&Oz=pdsq2YM>d$xGB&YVSF>$Fh(;_3S%UHKt7g7 z92W+vV!TrWH8EZ?I~X0Pk1>LX;}3x*h-2SCD~xwSpq)_>br*1!BiGhDS;)1sPBwDw zCub{iZL_lrxwhCjfL#0DIf`8C?3_Zb?Q_l}*G4;+k!t}b7qjW=-1UymJL5dUQ_-F} z&k)(=&P&8`Jo0C8unF>KNw6jIXDRFw7;j7D&#GW+))xG^t>9vvRE0H;ik#Ef~KLECkh<2ik&oX27Jf`2>DaVPzU zPF~o9;5~GehrtWT9}lv=2=1i+Co*Ro^18ft0(xRqU(Dn@~WmYA9*z$S$7oKm5IFi1X*`H zn24NubghZdpdj+sAHFBI{NQHw06W zdz*r923i|cQ6DFqiI@j&Du8($andl4{Z0V$_}Q7o6$Dv#6dAG*^Eia8J03ibtotRn z2U&Llf4d3uIFGEm6#O5u?l-7-2=lmrth-_u$hxcOwKBqTNONutXnP2 zhOVuQ8r&HSiXgbfegt#6B4u6R2#|fo5l&&d}_U69dimI&oo#jT(+G?5I)EQDMi8TF$_* zU!cJ-X!ENx3fkOoCP16toR6VR0cT3sHKQ=H_l8j!*_(?a`7F7yeHbym;+#N?Z#!qPcfIahLW~bM*Ae3zSaZk1 z^AOS9i#7KH(_# zpdnUIE6~iSi>G>Qbz0!59tWK^c&f*Kr=z#EQQql}r+WP1^!BzfqMRf=)nmKU*V_&w z9pG&b4#C(PJ0p=LO`LJal5NgJ%wW4S8M|1+NyFHiI{}RPtTPLp;;8dA@?(~>5dETw zlYx2Eb5>#=KRWBM>we(u@lMXW=WOzR25!R+oSrn{H^H?I_sYw#rY{IuSko7xm*sdD z8?CUW#fR*~NlY&TWclsj|na*Iu;2UQ+X1@*f^#S++RGf^;nhZ|D z(@7>Hlc$L%P52E)Vq^B-q2j&`ZbZc`Kn*UyuH-r@Zeef+DsFM`9x84LsvsLxLpww4 zOytv6MB*gsZaLPj1Bk?LsJK<|@Tnr?2GsR=MB*FN-A1uD(MEnuc5<&6#owlE&$DOnDP&J0*L62+ZM54!Caf(RolnOfm ze|hw{7fw~wQMOYPb(G`OM;%RcnxI!dcUqyxU3S``$NhzRypC#)L619%ddv;}>-f;) zUN{QT`pFrH2$5+*6BRKGz2tRg6n49>I}?!YvChZX4fS-UAU5ASCStS8nSt0~WkGCq zIrF`lMnPv0VsqKa^e#85II9tx`_6jAX0Njuu_4zO36^M4+SOw}h;okVXT&EE7=}V^s@@bJ%4*B$+QyI_5Np_;pdB1Y%BCDo2 zjnEZVqGm@2SD|L#56(u-eu!1HJ8EY!YBo)1=FLOp&c+z~V&B~km5V3VpmOI0zd+?K z!df#95!#8$U4k`pGGarnLY}1|2IQJx6;yFnFbY+?Hdr53ybe8mp?7_70;+feR^XM0 z#AsCUCgHExn{M*n3D$MCh1bqo@9e=-Wq)uE;iY}hY_bK_6fvkjC~eyDsNvxoW8NIBThd1HsbV_{ScWn#(siKT4=vO zCLMPSWYQfc44L%6DTqw^*(ruh8sn5fCVlQyL?(UXRG0lvZR~$cry+XuhfXu>e|9^q z(W93-(b)eiak^svlj+1_|C8Y)VE+^2q+tJ(?exd~XC&&^gL4kY{>Mc9_D3W>@D9ye zh00CGyH7fcm`=?1TEv#qPZ(q8N+%y@d|f1X27G^?O_D_fFpDsNcK6 z-%-E!up@{=6vtpaeSp2ELKNqray`K}QL~{q!zkqXG1P2Q@C<4;8T+Rx=$*f!X8Y$A zM9mJt?tBh%{U6lq`*^QK=$gAxv*}z<@$Bb*sM#6NZ8M_22-P|}*b&t_2Yur(I>35V z>o>t}sMh)LT!I>hP_0Yys$)G}l~;9oIX<&_dSyiSb>|@?iVn8~5&hC$j)<e~9lHZmIyxLG{bKMLDxDF%i-_(+rC-L8&k)h| zsPwCtnHv%P!wC<&j*eIe5xwG+Kt%s=%7x)M;7(;kbh{IUh@NxmBBHyTM##%2P76fz zAEym=5Qftc5&hTcj(vpT^p<@@5+eExHICU~z;WmNk7U@g@6LezBtIeHN_z675ozDADH&Ja5j@3Ig%dI|Nu+=xWIufQ6!4qf6J zDt)yOdn~Nl*;sA&aE}Fh6K$g<;<3Y?f_QASO~m88Jp=LBZqGqHZrSq@kLC6v#ACCa zi3~eouSPufqch~&J?5~p$SK92dlTiCd&@q01ZKL+jpku7SUTLnZKnr9AT7dqVg}#xE zj+i8W@4y$+uuV(m@b$=TabgVpRk zxXyOmK7{LRHSFW4$5{I`>al{IgL-uAtJuS>v+rXMhrI#zaO5=cqzTQup#2z6ZNFnb z$5Y$y*mY1@cs6?-Nk+R2_P z5nX_Yj<=U!HQ#10$LF|Kb{3+$+}?%gF0r!_-6i%`M3h? z?mYWEqPxSsjOebha}nLi_FZ(xwe}-K_ec8~qC3y#HKPw4TrQ%EDv_VK4b+dCrYAQSE5@NJA_ZM8_7aXXo2X?z;0w6dQnG2_fPCbvY|$A zM3?p^+Qu7Lx0+ke(PiJW^3Y}9w>{{xi|t5s+46P~bXjee3OkzjuU#Hpc9~rjT{h9K ziFHfa^|5X>x0{4r%zI+DLRaZ*w?kL)*`3igY%6q?e)d3g zm0tERbd}EbD6a>9I|2KwefGyt>^*x56kBSWP^`B-1N*Gz_8io}ID0;-evQ2dS}n0N z@yx-W?A6d`mc1Uzd}?ooCUbF3dzvs!I30De16N<$+WQdoEc-BaSm;;i04MCT=m00| zOQ?M^6BT$JajkFPMqC@&4-wZE=vu3=X1_q~lk0^#JHw&OvJ=Qxpw@kXbJ(E)k9-+G8V-eGYUd&%N1_J0<4 zv70UKVpmw)#cs2>i#=y?7kk{|F7}+oT`d0=tE0tT>_&^b*z-1bvD%BC9ZG{xwfG%VQoWS!rF$ugtg7?%C!xB32Phr64o~KC9G}e zOIX{`m$0^t;V0Go(w%mViABc$h#rM?4n69_;1BjBu5jp1SmDsAu)@K{3J03O(dbtW zI2Rq}D|-QQ-A2E{H*9104b0c*T62Rl(6#Vw+ZcWua}`|+>mRxn)<4)-|6pVNLkGk9 zhu($t54{WPA9@!)fuVQd6BxJ#bGeM(vIiY(E!O+H=q<<5!LTl(gJE4n2gAAu8|$L| zQZ(6&K5#Ja8v4MYycBCBG%1d5a2Q#opvgdVgQLN0Yh2i|ysxZ@&?MQK3{BQsY0zY| zJ|(ye072WP-OOa`$6zDfnl3O9yA8W0VOlv%dD0ML#jU<${^kLhq~C zNzZ^9pQ3xT3OZH>)G*OQTIXG{RzeNaS_d`Wur@)B=IAQzg3;DCsL|BgBkM*cDx@$v zOfu^85Y~-%t>aiXKD16lnRe(o?*!XhIan)Zp!19hwnm@f>bnnXMPKWx_rtsg=r(q6 zoOKI5em;86oIKOIkI#9Nt;gQ4^S(l#S(F!zF0?q<$$Abo23vVhqm%7{8iVafM1721 z1W_MjmqOIfp(ACXua-yDuc0rkL!F=_<-LyHwIT1kT@^d#-|d?GJYwU!4zP*$zhH>n zDm)aQH?D^lVQ0ouL<`!TjgF|3&E{rmV(t)4hEo%hbu!sxoeVTtC)w5*(c}ZsWRhqy zm717mMH8Evn3t%Dd7YY=w?&hg)Wm!!n#`pp<`dCm0W~pSP!r1#O_op-D@-(5E}CSC zCfU@)Dkz%piM36wUDU)XMop|TqR9c#gLR7=*FKTqB z8dg_P16Mbp2Ci;GhsvTxl&DdcYFM%11%gxUMxsdz(WFgy7xdnaMt3OltGNvwY__=v z9c-z22+E8xk3*TC%+pY2nVAD+cAHnx!A_XBpv*7keJGP_K87;Cn$OX})|q+eVCyUo zI#{+9i4JziDuNF7p;ZbUY^hZq9c-0V6&>uFRTCX-i&Y;T>?f-U)|sMjuWuXoVB=$H?p{j zH?_Emud!x8t1N2{v|4S=hgM0}B6POnRwh=P9@c7T^|rMhyZKetW~?~_EU6`nwe-Dp z7~QXdbpku6)z(?`w>H)#bhZ-Kb!eDv-9~?_X+1<|D{MW%C(8`$1wKRdvJLF@o7iE{ z^SWISdfu>$K~LHlVrSwrU>Wqfi*`lyx)a!2t_bF$hp)m8liw$hYtZqULFX&z)}WP{mr!q~ z<%W8HS>aG`yHyD49kxn9y(d;VsCUAu%q!hi6x2Is)rEQ+twvDqk<|j~UA5Xky%$zT zsQ1+B&QGgWZ>YD=N`iV%tiGtv9o7KU=UHnA>hqvA5-S+`GwO4jH4*i>+nS8}{LD&2 zeeOkPZXf&@eYiie>1(V}UD0VLqpvQ+N<~f+Pnys~FI|bQn1tTzfSaJ_Ty));!FlMq zvw{QBY4N)SblSO4{xsJs^w{~x*{j%LOh+$W82kcVG&8shT@+8EN9SCQ?9RjQD-3i_ zsuwBhMMAy1=$~0w$4WuH|Ij(tLI0{yZvy&cHug{Tp&so`Vqd^+wh5lO{FU9x=m{m$ z%?YC9$51lYoB}0xm?o4QY0i*3oC75noAaUM>*gXTxyQ_el1b)jD4A}qhm!NqV=o0) zpvV3eyo>IN9WlBql{^6@r<-S?%w?S$=x{e_?6Z@WUt3h0WT38#rCO=!w7w$Kq$$yiY`fjbX$NGjPMN`7Yz zhLUev!$rw4qT~lqa=OLO+`}z?=DuX{Gxz%zKXd0={LIbKt`_2or?mh|?zNUc$=9sq zQ1XbC1tob*ws0dxbpT3|7r<;NS;5*GQ7vd$yNq7Ej$}51o{Q68LeK4{8+y()!=dLN zW+CXg+bqHBNM&EDQ7!Cht&p2&X6Wc_S2SwFv;te-t5>*u7&`q^i)e$JUvKPKzvpvn4KVa`I& zoNIoKp1IUqh@N@E%s|gPZLUPm%r@7dXAU><=^wp=PhtPj+=HHJn}_)M$2^Wcx!pXC zKH1I8LA`xrUd7IkG{IY_xB2FM)EhZFc-?%Ab?=4w9M_)@nR(Esy5+$dxXX&fzT}Zr z1U>V-RSG@x7ppvaChZKdSE1Wig(l=0bdCAYTv#TWc7eKEA*j zg{O~?wkF`|4mf5;L~V4XIYytb19=b94@2A7^b^o_MEY51 z+b8`Jv^CPNL)*6Lw^6I!^oP)PK>8DCTR;5;w5?+rVJGq)m|;+Cw#o09zA*V6(_E9^ zF|{%I9n$RmnOes8e#G~rpYFE?y)AnW13(l;L}tqGX=U$ zGW$cfcg(@i&1VjWZllaG*f+Y(53o}iVNT+e26HNuoM_tk-ry5+CiEO_&V`=w<^t%c z%_aE6^{u%a*A>Y0;CeI5Yvz56E^X(1H8~Ae7rsKTo}KsD%!Zy-&8<-K9h1MSOE3@M zli1hhQRw-#c?x>2GtWa$+8JW6LUvq+p5&TfdGz+IU~zQ&wZU5G@auw=(DT;^+nTvh zwSjpTs`fA+K~>tD#6A*y#e9ZOzES2&JjK4G<@VkQ7PZ2?|6w&QWf5^1z;`@iMtw!Ok^RlcK;cfG>tu}b3d~K^^c*nfCR(I@&Jk}5> z{G-(y&x`-qN;2Y6!zI%fLgxYL8PNId^p((gUiv!d{7?EO=zK4I8)~>{`X1=KIQ4UbdOa*QKFb6{0cgnlqqqC36lGu4&GP!j;TL=%NkGOejpQ z!TPlt3U_uQq3|)M6cmngig{sm<8LvIdx$`kJ$bjcS`{wwV5gGPiE2Iar83PSULtYWD1 zvsM|@`5CJsDtw<+9kt!hs*QU7#cGIp-e@%o?}*OQI=oZxv=tpu6W4BQism)bZD>9s zJpq~zPEUd6i_-h!7Xe24U}&C~J{+3AmX1#G-4q+TNBpawaq{ zmOdAnd(#&{^CRg?pm})ua%g@bJqw!eNzaDnIqCegu|J)kHV&pAfaZtNk9w1FhErZ2 zcpjQpNxuxu@1^HL^PTB;p}CX(2%7(v{tTL5NPh{D&}E%I~-H1CHF|6{NuR;Bge zIB32At5P;TSxkoJ3$Q9}f*pY7C$TCW3;vB&=?rpeAvB+iRp~2D-Xnr?62Acns9tX{Dr}K(IAe~nXeo5yQga4Cs?(t2O*&7c~ z+rlCuB8&VG5m`hQSzuWf5fKq9A|fJ}QXna{LWQ)pX>%cIGc(C#CL&-(M68GfyA`>K zrFIb!u_9uDQZ8aaZXzNeRz$WUi<#f|%>Hve?`N8(>CE$-=Q-!SEXI5N*Nou3j+=43*Z1Zkyw~^U61>+rvy2+(39}sUbrNuyw@=_ScAjiy|5v_?~Yvd*I^xM)*W zFCC9NnDcRfHzIyosjdSd-9{d=!2dHPDx6 ziWk=~8tmMjxee@`MOo%qYfu)&($N&v($E*pjxqa+VaGWBau#S>kJh|M^iVS$LTeVG z{9&BgTC`@dtu?P$$IzN3c-f_(OhIdw@flW8KkY+h%0TW0T-qmS$_lc^7O=J+O-U*5G0)MPEW;|v&-xSr2>0Svm(j`wiJ&0x@vUTm_? zqZifWf>dxP;~E*azQ@t=g?4gQ19x;3C|GQ^0|hl^M^G@|>;ej|nB76aM`kZ^Y-V4W z|FJm`6#Um5f~sFKhl^w5cfYazV~zm@ADZJq!FF>pDEQQz4hp_8vp_+EnF9)%%sd?U zS+fWf{9pz_!39(0N&d$)@O+Kt0z6*>`E~%=VHuuptGNQtcigPN^X)U&;Q2l^H=-;b zm^C%b? z8kBDBM}soZ`6Mth2Mx-^Q?|!DtVe@#czRvIML8N2;K}p`7bDOhg(o}$T$G_i8gVFD zMy?okTu6RSW0vt6dh`HouvN@Rf+$3`tb=4_zq|E1laF3mP<> zE33hU8x0y^y@v)pWChWnNmd0KG}&5*2C;ex4NAB6qCuI&MzF9B4a%`R<{9$EIyA^@ zdC?%h^*S09;61O~h-hacqNR<9R2vcPY(%t!=Z)x58JgdP{{1erX1UcKt$CAY-WSf_ zMZL3<>T?LV*oMlyZI3JLvEX79xTr&M1Q+AM#bFd@EjepCxRAKXDn@at$@V$mLdG@r z_%gmZ4_qvd7umQ7+PF}`#Y=GmT)ZA%04`pSF9sL0#v5V)9W z90eDT7^lF+t;SjE?Y726a53Dt3@&CHSHZ;-MuMDwr(_Uz%^R%-~ zCr|rLGn=QKYtG?mzi8(3w1=8Lp7!%*F zqKQ{NmhyVyx_KHb+-aU;7N^{70tNHTD^w6m(Y2L4c?Ve7fUdo5k1OnPrPURUd&l|< z8n@cI2aS7|Zb&zNO_*i|SoW{Eq7V zjME*L@(1rWF~zc4$20I0_rx=q^;sLA#jMY(ad&F>#D=&h^{zy9JdoN87ZXnHop?R2 zQ)N`f=co3yI>t-!og?E*K}ThLITeH!U*(wIB4|Bn==h6j15cUw(I}<+J=s`_vUD<* zqb&1`RVa(kSdG8fXl$VS{kc(%vSb=tP?l#??)QgABi-+H z#tFLL9~o!pewP^+=ziB2m!$h`G}HZFXI!WI{ixXzjJ#r|f{_Zd9T<7T>Je%1!1dkaCkb2Begj<3UQ;oQz(~GpC~$ zBTZRrQe);wC)~`VzI??j!dcvJ2E|RJXM>0W)NNj(33ZDxOE`v%ATe$gp>%Y`QMx6G z1t{IC;9^C}(!^^h9UXF%Zdu}u&_MB^=v{fDCwjNinvUMB;xp8Oi|OcH1><_2e+<1_ zM?8xDe;uwt|7W6l?^&n9ThaeH^ZTZ}Pj7sP^vuygb~&Jf)mATbkX;VwU=8C$%J1Zb zB(Ts49kfuu_Vmvu$2+CAv!=$o(m#JH-XpaGl}_)}j`-|;Af;P;Q0m_jweg{3hpF)q zc+h$AG^)wE_}JDxSUEIVIzsUYt$SJh9Dg&GDz{8ZCUx?Hamcqab{=Ml{{m112rMDCs`)P>_e70V~Q)CXAUOI%r}RDolJ8i z*coGv#&JAlj$;+XbEqMi1=S$4Q0b6a=C!lC6}{|kMK3Z-Ia;|eaoNnocif3qF199` zZgR>>v~s0YjaII*s?f@}?Qw-YCa28nMNYXLg(9cS>q}0#2c23=uGGPl#42kbs=CQ~ z996BhCZMVx*y9>|T*ptBr|eFgLSb3`h{84|no-z4tTretT?umwNV(D6E;GsIPRS|e z9&*Y$^8h)e%4{U3v@}mhPBG6&=fb=|PDz^Ak(}~Z^AbpT&uj)MQS&-ypY621GP;12 zOGfwPU5=hcFOc$!(HErrU)KkPjO58A5*X}SDfRsvOG0Jt_ScY=_Y^WQzkiTjZ>_8 zuQkp}y=z=dnM%Bzl0m!*QZ^Y0*8epvyhf$F%}h$k!3VWT$#>jtwofT!+zIvBVs-@` zub_#F^*7W|v+h9|WA@mvW1QSEh@Mpw`nZt#YXli*JNoz#YGOW`i9Y`Ds^NfQz|O%~6WB?_u7I5#v1?%GC&K}D{xFhl?6j3i*XRItE*hQ5 z5!;P!wM;tT8@w6uy6M5Q` zjSOt!!w_2usX`hGQvFbLx!x5`ov&$6z?OeqrNnj(zE=) zSWb30XsjYT>^D~P{2w5Gp?}5Yw;#BCo6Him4>Qrpa&## zvJ+6%ja0+e=yYsDTdRoO$rl&U)@uB8U-E^FYwYoE>b`;C;sbP+y?y9xgB=fof>HE7 z0;p{x&vrb$j|SBCC~4QMd!CL@4oLYNwY97RW)TWiYX;G#T2lotJ52+(`nkD) z+>tOBqem`t89k91<_h}VyUmK!`_aucV5HvMNT++QSp!CD&8>7so-k|ajHH{pM6=9# zQ1hjE2(`Ly9u@3>mkO}+b8L-`osD4USgb}mW3jDZXHTpa?EDeiC0&wOJ=kd35~Gcco%UeojL`|~JZE$T zJ9CU4VCP$-H`w{s=m&P{j6q=Mq%joi_>B=@CupRBos-5`u(R8kU}Gm8>>M(jVCPdK z8|)l6=761}Mn2e?Wca{Ngjr+5j?5QonP6w;bF0A4%sB?wIc^k#o#94A9EuSKI|GbG zVCT581nk`534@)5Mj6;iGs?lvJ4Pkgc^OrG+a6cg zq-t}3og-#4*g1;+9<#nef6r5sb_P59(O-*NwI|s5((D6v>dgLN=YTmF?Cdp%Nk7dT z33ld~qruK>a~#1b8I4-^%VNmU=^TW z-=IX}(X6*)8OiLwLd8y4HL*$mIE6}VlDB4ftnl)(Fte6|kiW?iztk;Yhkch5< z!F@3g==;>D1$`eGyFgzS>Xw;kR{Dd!EHp01`WlVP2dAf~m^PwuUh8=@&TpMUK zuHt2yW9;`K25>PlHtZO;-{(cfI+_)X%?E?eqK2*feFYjEs3n#Es4vn1YU$6<+Pqa~VEVx*=%%($Is zR^bUpCVuAwqphqRigluTip07mf0?jiJ-|+RtT))1j5h6|_UTOZRA_VqJCRsFuv2FA z1UnxXeZbE8*r4QNiHk=6;$>qT*y(Rf1Ut)PPO$SYBLnR0i)DkIwniq{c_}6u+xCXb-+D)sNj~NajaiL<8CFJ=u~joXxyJ+Kq(cRAC0>WXTO{ZE{w*pehH1c zk9@I#yqS)=-H)5!!ull->h^#&4Rsry_ycu&(CUJ^jj)nXw}-3_s2jCgOmH9JETqHh@ou-1T zkDbF?{f4Tpvbvz5Zzq03Ln|1!1Ivfd!FMcItO+b1M+e`fHW-5o?}fImBciH_0kJF8 zZd1_KYGN;0?}WC3U-a~k#P!%UFgV2=LPmSYaDc>{jAX}5K~S{LMi8A{5JYDe1W9MN zJSLsp$x&H-Rug5FW}+}Et284qnTs!ro)!c}&)Ep-D+r1<*$5ga2#Q{@5j4a`&~O_; zqXa?GYc_($*a#Xg2+|#bAU#{ooxh77X<0Dw&JB&mLN#)X(K2{ z5Ty4J1nK<+LHb}pkUmThq>mH?>7xZf`Zz(5K2Z>)X9$AyOhJ%7OAw^H1wpz;5TpkL zL3&sar0aqpeZC+_FBJsoO9estavMRiyYr@)?CyL*UnL0ASK9~*Qqy^2s*NMV#?b;B zL5pn!Eu%w}A6sGLsKUn48o`k+yMjmP>Y&N9z75 zy6mKyqT4&EbbBY2e#yqpMZu2VocbqleOV9`yDA8ZC8)(dF_Jj(FlaSI4}qrg=uxz6 zTl5rKRu?^smTik(1Wm5!Wze)BdKEPJq6xI@vYrH*-qhQGrh2_SXe!q`(aoKyccp_n zMDLL@*cz($PI=mzs`ul5x7P=8zdPzfx!;;TB4ujg2R)7ZeL)|~oo>)4;Bmgz(_!qh zx)Xi5NzcaDB=kA<-4#c(PZvk?7rhuqBhgI!SC8O{@7Lq_n!)-ae2v6cc>g8%n(cZS zj%KZ1j=t>ED{(X>`Z^rV!+I5tW`Mq#odFJgTgocp4t55}xWXQN)Y!PxWUC@JF*SwPXQZ~~{WE#0AID~;wne|(baU3nJgGNXFT?^o=TWh6 z>doXSozBkQ*!_BUZ$_}*JsO&&H7G(#T^+i;6 zpcO=A2U=5<9cb3SqU=B;TgeWzZBf~Q_H&dSXpX*7cAz_GcYmmO$t>+C=Sr?La>qRtL9$KQ0>f%acrcA%ZqWd~Y9X9pU1lpSbGb$bVz z&JHx|LtS>DZPVF-#ye!;l{V=)xb_-7PwIQUNa}k%2$mDNWQ~9629Bwxz5py&>WiuG zZ`GGk-~U5jK?eC%uON49)YpLM1-k4H|3a^&@AHW+`@=ucWq-I_G3*%UeRi=v>&ooEVoNulB= zRwfR_lE^7)tWC=5#Nn9al=(5dRl8Levg&ms+PpcaaG4-mAI;vv30nrU9l=$)ymjr zTvgB5He7pVY)9(-iQTa}Q2B7I0f)6Ob{N zgS#!k2)LUPjDx$kf{Vc23&ADg(Sv2+ZgX@FxO*yC4(%^l+^TneFtHh&6 zeW>K`!Oh~)gWJTT2X}}^57voC4>pKL4;~he9y}%C^k^}-`z&|` z+j+zp5>0e1tUW#CS(7=sIvG5x*X-62BhG5WgPE6u%ytC4N1+S^Ro*oA~vRTl{)-hxql7NBnxUPW*bb zLHv63u=w@pG4bo6fcSOdro;gBnq8{sIIagB$MqC00CzRf)8Ov)=s9q=A=(7)7Dcas zJBhgV=rwTnqV529Z-v6(ZoQr?u05oSYuDR?JGb6}y!mNpKH2b7y)(FbHB<`jN_5#- zG(hhO?)vL}z}=gAe{u7nrQ+s8%f-#>gTb9w9|rCo*GGc80s83Fp@|dvIB@6IC$i$| z3q3=ey`G7)|4E-ExXT$TxGUV~m_xoh8NuIMi3sO^Ic|<{{uh}-R@04+bOU#XB0a%f zRiqDng?~i)gS+dI!O~ZV3oh`yZa)`rJosD1@6ist66<9 zJhB1YorqL}yXMFiaJMS59o*GLcH*#pi|mn=UXcT`(ks$PZ{xAZ30D1#iJYOgF(z^$ z)qp9eA&uBa8g+@Dq-1=x29M+6z zchvvgXfN=)CfXPL4v!9G#^oQ;A)t6tbhw>2&w=6}qoeR#Ingno_yWosv>uC&2g`?} z)4_5>bTU|$7_+Y!c8pv7qFFeEKSy(L2!D>|f#uCn_6l1^qCw{Gk49Cx=^sa>BeFZX z0OznHx)|rMH@Xa@|A?9|vo=OofcJNz70mSh99_d4@5$&!$+^)QX7^4;x5`}3ygu|u zzKYi3o7Dg|_ zl~&QKaOJgV0v^oPlR)|hdK-{?L2nOEU(!3#Q=g}Im41fa1C8#l_a+Z+)BDk}xJw^o zqpvbj4Ehd6B9iqYakAdN$Rc*o|Dj1&t1KexuCpVoyXL9Ny6Y_wS$EwKk#*OV5m|RV zB_ivt7er*;b$LYAU2lriC7(=uq1A%Emm>|JZ&KtiS#N*j80dQ^avJnK7dZ#|N+M05 zuR3ytthX(4jjZ=s)RBBXabDX+*4rFS27RNVZOMASMmvDMx1yavUv;z_=$jJl3HnN+ zeL&yG(f;`R+UQ{X{U_03%-sAK9f`lc5*;mF+2}a@{kPGH`1`M;8KAFqG*i$wO!^sP zqI6;t0~8;*a&OcP;=EB0i2IX9R|9tu0CA5+*|VDXO*;hQT58hU=&ng`V{23gajT;9 zL0nhutoYDjwYdCo(NfS?7G0VWO#H5K+FD|~b`|tJrd04K%XbN9Q3V@t^$2aqjG+uE4l&n&5u@tzL%m~K%Y0d9rS$=-3j`hjP3z_&ZwLu z^nSDv^eu^=AoG3~Jp=ldMlXbNnCGbMS6p; z{n2Ldl@sX)zK%w(i<8Y;iibU*+iQq)Swkda)(|n~bdSg&(C60MfxdZ>p`fpOWCZ9N z5J|%!?um>gKYkIJ0Q#os9a(d_Ad>EwE4fdT{Tm65{Tq&(HTG|C)b%OJecA@eeOk5T zK5dKSK5e_?K5eJuK5dWWKJ9?yKCMx5pLRlWpLRxapLRiVpLR)dpVln7PrGjCzLs|G zOSN-fJ3IGvv~ynP&#-gf0zu!<;gb6lW`JPKV#$4xWgxMsh*hqzZH45% zNQLCS$QsFgk&Tl3A~llxB3mW*MPyz2q{uGGeac12eUW;}eGyrmenGh`xi4}Q^fg7! zg1)B6DbOb|W?wPvNbZYVl-w7&EV(aoRdQb>VduUiJNLD*b6bKeL%_oY$8%Ks&~Z>*jBCfK=eteyKN;5VD1>2~gOlKYyX z*>>)mW9PnnJNM<=xzA_kzG6G~MeN)cm)wV|A@|`@EbGH)85nGemP-bVR)RtPuH?Sx zI>~*}D#?A(%~T-X=r$XJl_f#RfF-JAz!EvPY+niImXQHRNCqrfEE%w5nPk9{6_No< zDkKAztdR^@vQaW%NsVN{lC6>fOKK$pmh2(}Hfw2;0ZUj3V@)cNl`#8DWF^cyC9)Fc zxe{3kQ&J);VX8}HCCs)GSqbx52`gdv-LaAZ!%30>!)+u3hTBU940n8O8lt|Z?D|CH{bbYl58L(N4lL4ExMUnx-Ws(8I<&puzat5s{ zyiPJ;xJoi$c(Y`{@HWYS;T@6z!*!AY!*t)Q_rr%J1BQ=D1`MB;3>ZEq8Bkjy8Bi;e z45*b$2GlAg1BRO<0}{!AnylO2AHE_PP^*#*7`{doFZYKGs5q$NcPPn{0U4748Iu9E z&5{9?wqWovZ5tTm^^ym*9biz#^m{d_L#8Pm$bijS0~lahgA0{PFt}J* z2L`t*Rpi0L3bhBXr}l8%q)6>?LZSBH3blvh{}gHu&YYH2dPT}HFt|WD4F=y;&aq0b ztI{NSP@(p43{|A|_*|v-;9Co*Jskbiwkb(`>qQ4v>G2L=@Q5mNqo-Aw8$G2mH)<_X zWp4C4mAO&tEmh`5Us9PHwf?2b+~_MRbEDSpDs!VmnH#NBWo~r0Ds!W=RGAxXRORG| z1~mXG*Q;SrxnI>mER(|U0l&pC~?I@SzrAeGMyjT1>h({K>?n8t~uL^(y` zF>QPb^N!l&l-<_P+VqsY)&VUm<*P)amP5@G(DIo58le?2`_-rgQ!ZLZH8rKlI;|P( z(u!#dQhv3LYl~C7e*EB?}bqQgT4?w@Mx;PEm?L@tsN# z6rWL4P<)eOfa1R?3qWz2vKSN>E6YIf%gPE+T&+}q;=d|uKye3UBPbrH)PUmM%2rU^ zQK<#R!^h6sIYNK=HTAQBZtdIR%P;K%IwKrD*E|ww?~R{)OH>Xf0O~pm?pC z1d88LL5_OMI8!?zgA_&c9<$N zwm+(4LGi!U3846dnhuH&t4>h-k(v#PZ&xL&zO3eh;=QU56#La;P`pQtfZ|iy22gxF zuM89)e||M6mMexG7dmcGv zO05FL1Juo+_@cTE6n~-a0L7=&Izh48AShN3gW|pEXF>4<^%y8Vs-70T)>eVyAJuc9 z_(!z~6hEV00maX#*Ff<&P4ecGn&i!Knw;hFq}BlxCuyBQ@pY{mC_b+B1jWa+KA>3F z`h()fwZWkHv^ESBU(iN^;$OAVp!g+i94J1kO$5bTv7l|JOph_8xH(0L> zW9H;1Wn}X4#1UmQh#sko1JO??6Y&NslnlJVY9$jyPf=ziGxw&r@dg_e58hzE5@6=! zyb@;S#Ar5QHN zRIbB@S!zqz@Qj+u%!yBJ2ODOq9m(mP)Gn~0zuFx(+@tn_4Sm(Vtez}X2a3B;hls;f zhr@}d)KPHaDRm5N@T=ox{zRP&8y-}r!-l`BvXU~U=D>r&Y92iBt3@)4q6Xo?C{@K> zgjG2k<#u%eJa|G~%q+@fbs0SPi@E|H6sZ+pU!q}0W>nNQ%&06-H?kUTrCO6xnpm24 zf?2vZW-iAkl&M>pV_BfqvI=+Q-;+|7Czh$ZWWGhMXU6U`^$<+?fPCIEBY}*K%vJGx}alc1GW;vHJ(D?<6xYT37m5 znVOs(F;lb8j?nD0BeX$u`{YH4(&rfFm8)lb(Z(3g5bOQ%2IMsw1c zAEsr4^uF30kUme#XMUzm^U<0ASu3V9U#LZ7<>ky(vWi8Ev+^=oTO{b7JWzU0GgnK$ zedY#Pc{#J%p@aAD!xi9tZ+H!O|1>P;=^YHqd3qES5lJiSlDa-QC~u$-s&X;{wFdp#`Y=~ad0JiX0fIZto9k_6tLRpdOqm5Q9Fw?L8e z^v)@Ap58V^&ePkV$a#9(6**6DyCUc5?N^3^_b-(Z;Qd7<4ZJrfa-LqL!g+dVhMcGO zA+D*(I;F^Ydao;Tp5AsPpZTSE)bazZr<7vmm!4K4%r9jsaq!q%Sp**YDNDd(xl%@U zb|~fG@du?6B(74{fx%`)&Ke0Rn{m6}E8F-Mf*X__l9!b_kocw200!??4wHqem1E#; zgwjO*9j=@v{|;BqfkC-q*wM5)Dpzo_3zchRVZK3vEc}j|OcoB}onE&hc&9S!6TH)M zJWMyT@SpHbE6|lbpl=%9soWZkcUtMV4ezwdk%D)6+a6cg<4WFbH0axjk6LYgfRB0? zca$NgQ{ki5+3|fV88=l$bd!a@!A(`8A_20njBD&Mol~4uqty*(beLqel`YIfEmF5L6Lm`6Nk?_Ox(EDv)C0^! zeW*4v6E#yk!A#T!^$asn_38y?qE@PxK=-F=Gc!?Z)$3qYOyvR zPMp>z!-+?=>C9H`(Xz<(Uu!wcM7^oyF%xw~E5d`{ss&+2v!)6&oZDc=Z<^uIVZ)WM z2R0lC2VleHa2Pfm2i!mDA!mGB1G@O8L4 z`50HWFcaknZ-)(kgm*F%)j7NeHZ+6}z=i|iM!FL>hflzU=I|NV@Ll+V?41c;f(?mq zvveoI*I~o2N=w-Ao019}5=uMRa9!yL8#>^)esbJ`<6>W&(hD|xt@M?>Gs-|R_z#Ml zY}~BK$;Q7baUX9mNWB-$a@FPAGD+aY9jH z%n`+aF^7}|Wbp0EVt5l%mdUqwC@Wyk^GXHm*`cf??*H7gBdgcVYnU>m}QL zm0JC9UyH5Vr>U@NHy*6adK?e-hV>dAY&q)E8*U}z!B$vf@L;T1!-JJuQ9Rg6xR^#} z597h!W;}t+9>#-JT4{K&cfe*g+?s#~dzTIa-zs92;KbJ1@qIj=4{k}^M2%7mx9V|a zA25!?t$KVH>yq(ZyQyQ!a5!J!xazICfjwBaCh;JAtz_NW6x>&%^*!$E2$jlaJkKuN z*D>oS+}B0x81Acys-+?2XX_W-*JbM~eAlo1?r9jg6USxYFq`1qS@jA`I;CENF*`K} zjCn>&hA}R!EwdQAwGOFwFz#&oqHgdeU+ak@`c&(KBg)qLGIj7woB%t(Z@ar!O8 z%$4!Vd|3+__Q8y^;bNN^5tz{-9GAXbcoEFFH@pO990`}fjFaJVm~nTw5~trXybfmk z9ImpNu{rrHuipkU+J<+)jO*b#n2`uK;Pf5g!?FfDd<da---m+hWSH?^D)(VjBpqPJf0WKPGrGZyN~I@#JBQK-W_-jtu}O|nWiZSr zRffsTt};?~Dl4O5#%X07%s8z~gc-Y)44Cnw*jXE_HkSK%B)#+-v_x&5bLMoyNj9LafR2h5Nwh8-7L zCvkm?tOsy?FX8dFqc=lveYpN~H_Z4N?^lM;JRqJ2@3)*+(j#`mYt6i>)%U_2oeES|95I`p@8Fhk-&UO5?N%*7uzT21)F zBj7y;W*opD9E5oSEE*1(J$bt}v`tk%Me9Ca7WXjJQAMu~a|X6#ju!i;?N6wG)|Ju7RA)r&Hp zqFxqeq{-Uy67?#~_)<+c;%LTy=;3^UTbP4pT%m{aB~Hc%GqOr9zzn;SV|^i=97h}J zrqa(b6YN4tT3&bK(9Z7}0T`Z?cG3D?1l z{q%Fb#|s@sGk&o#MP*?xbb zT?1#J83*tobhKwohZ$$^A=9{jGQ)BT?=i#rYsqz(;lqv0wyJR;IaXS@C2N=K@gcd^ z)Nm?YMrXL4umn$1gkvd%B|qXxeAYu@+2Ma0XA-nJvtmK9ZVt0I#`;sZJIs(6v#%I- zqC=ymI3dO>Am{1dQeH(j7Nxjz?RPaRz#dffb{D|sJTKfi%q(A)Ny-FuAbafgS) zo5JuY>2Zh0z?*njP7rvXe$hHRuD5OvPp130h~CkAR*&#>x{t5ZL8`M#!&z`;DSf29 z^lG}ml?M7qtbQgQq<-!NKlaf(I!b3|V9I&2{}A}GjNVZb`F)h|gWl0)>ma?OU#W^G z!;kIwq8sP}Wx>31ce5vtZ2ju$+xohVQE5P6S}gYxu4`bbEEQA#1szY`_r>>y;J#RQf%`gRnYgd-sc9Oe=D>aZ zVC}l!Rsj~|<6 zY51|}Run%rga2YaEcqN)Hrp!1mE~BiLZz^z6mOPmwFt>~klYcH?;u%=Pb8feI$(8 zM?%~QV_w1OEuuTH0>tT$J z(_3!M!s)$94m$;7p2g{*B_TP{;6O-DG?)^S6Ag~z`qq*=FT)9m>#eeooPl`+Pxv0I zIL^R{i#R|!^4zga)Ky8S%UZf{AK2p>dt7G?4_$yU({YA-=_Yi7G0X6T4R$<8w(9|7 z7UB$#68piJmvM#{abiPZOexOrXR8)xc-b;=hQC@G&hQVaoOBq2GlVhSLzh@BcT$yV zyi}zc=PotNnr~t^Dq;#8Rf$hrn&nv2^}h3r-HWj>&|qpbff?gC?i zs*e>T&BfheOh_%38G_(@u3#CKlp3sU8l{;NJRBmPt5juH&x`Ij>?w0Ef<0C4C9r3`yG%M%?sDl+ zxhrAMNcTGQ<_UKd>{;O!y;Z>%Y9(VG&t=*>pA=*@mNdXqTsX67LAid*!izgzTX zxto~->tAkJwY1MIGY4&RW!2Klxw2}hHkX+LYke*=2iE@F&eEaE?IsC+=x^$>==Sznww^aC-yHpe_cR4J4DpywcK9y^)@Xg%-3q85ju<*g$ zEz+UN-3|+5xjW(C;M_g%uc#yo{%tDBfq##c*gdP<1Mn|Dw-Nr0$~_@HtK2ifzuXJb zv&y|BJ*(Vi=~?B2BqXk?vNWd{f??d6T8P2$8w+vR@mA3+)wmz={ZcWQuBVDh&jWFzqyc+3xHGy$}}&p zUbe#nos|w)-bLwvJzNThvYt$qI{(SG z(gAz2gJTJNdM%j2sb+_QqC-ywMTZK4qC?YzqC>X^MTgRY=uqPOpy*IZP;}^?py<%B zAUeeFE(gUf&NaP-(@j@{VsCH*D1ISW4T^gQw}9eka62gO9oz|uR|fZh;_1Nyptva5 z$mtd9f+xW8XTdXId2{drSl$`Dgo4u5Bd1J% z9Fp%&^oP2G<I``^TqRkA;SyE2~4p!SaUCC{X-tXbf6%Q%JtS@{N#u zgXJBe>7e-Ep)A%@e;mpIvu}m+z-(!#2+b%D1<{6=LMqxI(X{r54CZWK3@tz*;-SST zL_D;NbJ2batw0Gjg(|@2{h>9W^5xJ*lt2sBfVh*Pt<)A@hHCLht3$g$+|E!v9!bU( z_IRyT6_TCo64zUQ3LOPm{X(*ny>sX+$Ql~D$h<;H=rXlMN$4usKO>YN`y0hcWPcgg z*yF9%lHxXG{}#oP{qu^+{)ubFJyP~1{!@$w*yH`ynBv}er*XyoQVv;q@gS-ViH+91 z#Y0n$Bz`C!k#dxnMz!%~v8-S1Ry-l)YGP4wddlyKuZo>1*AnZBv%zoQ;yLuh{#u-$ zVkLem_OUvcGVNB^~I4RhD#S&Eg*= z-BJfz?Miy0LvNJyL5Jp-^k?Pbhb4p2p=Bk*Sh={RWMt|C#L=n46JM8%vs|hr&nl^w zJgcQz@@&BSB|OzqEqS&`wGh+;#r&LRxJ*d|e&jG2HJdIKlWM83qf|?U!q=M$g|9ai3SSQt3SSQt z!q-I4;83ZS3WrFwR4A-HRX9qjrQisumI{Tt)rI4wS_-DopLPUgzh`}+@OWxaPQP;o z)8X;;pi?TR!s${u6=q50RG1@`Q&7&sJ6)J3l~ZtzR8B#kR8GNssho&ZPF$gKBAR?2 z)@P6rS)ajLW!7g9WqrmMg|a^KWML4M(t}H+iYip4iYk;Pyg_otGB2rNmUX_ZfFd-FHQ4%@e_h17#U}sSqT;j5#_PE4Pi#kbN zRn%4Ls-hlJR~7XpA8cpEQIhp)@UT=@MT6k?FTrC{V+Bu3ja4*MYOJCWQey?rNsSe3 zk{T;`MQW_zHL0;e4$elX4<+LpYeH@5JKP`YfacYN;4XhLP3o;sH>tNmJ*D0%8Y}fy zsE^cJMHAR}5eoH}sw*@YMQjWWld7vIU8=4kr_H>N@-Il$m48X9uKZ@0SC)TWs;+{T zQgs!i!n~IX+DX+_&=KZ+SkOhPu7d7TbrtlIs;huKVbME#3FY60- zN!3+QFI88;Az@yJ9a41_9EEKI{D-9KDmW!oSHW4Sx(Y5*b)EFfx8{Cca9OIZf~!(> z(Pw+kI_N(uwO2txYA^pqslEJ{VcQn}RjI%{Nm7A%+DHZFX)hI+KOqjVL!DG$o=#GM zdAd@8)d!NOz-9*8Q-Mthw4nl%7_+Y!b~F2vb7#LtxU#LW{j!K0#2AW-6I`wzehUa%RH4*nGvbXJnN(~^HfP? z=GhGMssq_D?`6+6m^a0<1Ll=_>ZCsNG)R5sIV|;==NQae@TdihJB3cWlN*erEhp#!}<6WAtoTVXO9c|NcME&MW22lHMGG)VPU*jB2y z!VZo%(Yz(TbeMO@=Y)CR_@rWM^hw3m#ycJ6z3Iz`d3ipc%(424VP2�`s={;xKQC zZxPI!785mc!RJo&p!(mX87H(u!UC@ z&GUO;;SqlT77q6su<$nT0=^~Q;kSG0e(9-~`=zIT)=y8}O7q*_Ep*d(Sg8Butl!iA zRp{TJy^CRCqjv=?Jm_5p3nj+vD~27-M33&XVBu}v3iPjycMba2#=8*~KIdO8`sd#O z3%&koSa`s{1s2x$x5L7aeb{{k#*@Lz(3 z+5To&_=W#EEc`Xl5*F?Zq@sN91lpl|s{fvG?C;$L zJKqX)ft?c9gNJ(9`ADEUd$qpu9)g|Y1HItokw9N~*%TNk{dmST_PEZv*LxIRP7Dlz zmn#Fq;o_0ND7d&HFa|EJ2#kk|O@Ya9adu!jTznvq1s970IdE}vAP+7s3KYRbJrJa} z>*GBIBTE7*wcWyi0VBtH&%(%kfdw-28(0i4@A6(m5t9SU;AKf*1-v}sy$ml8dauIE z$=(Evoa#$rp4aJX1232P+Ov-54qvC#UWp^Vu5{=h_w|6O#lGG!^|-Ge9NiMAKpi{z z2BD4}eM8}>FCZs=1Ogk`mH1+y26gP>8^N9&r!Nf$+sQYU9bv8jXMiNG_$Hu~{|VGG zFZ^U+mtzIh;WlqKIM>SC6V5&1?E~iuy#3+a`(D{YzsNfb&PBW<;an^4XgC-4j)Qa0 zc_+fT5#9_qm+H-gbCbQZ;9S(}hI0j84{CRhHvs2md&6+9yH|&EuXyLfxd*+aaPD#M zQaIPjyByA?dRI|jR(MxaU;f*>f%@`2Z#DJhR__+-%W2;2)R*sjcT!&lynCoGcX|&{ zUoQ7HQeSTMo}j+0^Ws#k`Cgo=75Cy)tr#b74C6I8RqG=kPSyI*hf^if;8d-*eK=L? zpsx${yzCz z<9zI{v2OFp?wSmry}QO|@2(-fZ-smpsVqaj%dljH?b`4X^1#x?eMtM#cr2@Nao zw?Vfa^LI+wM{JLJ$#}n2>hDT5`If&2)uhBmtB1cgy!q1K55{!%4}vlI{-H2tvVR1O zN%E(q{F+Gk$5L5-;h#Wdx!0dgWx3BU`y(IqXH!|;?VkgOTKn^Tl`1V&S{dIIC9S-S-$QnP*+$e?B|2xL;T?g-41nl<2t+0O+$)U3}0 zIAz80kAR%Aay-B(EBJ%?RF>ZbN?ZTcS|3>ID2KIci_W&X%?cJ>q_cCq=rW2stLQ3< zJGUr-;ud<7SmB@Wwn1^Hd)w35srPom>sENXqPP!wd!V=@y}jw|T=(|lY`NWDPSCIh zdWXXPbngh*|EV_(_UC!W!v5F16F6ILw>KU3&+s~7|KGjYuz#F)4rj~l_U6M~)$4=1 zW!_@AyUZJbyKB60xI4_d2=2b=T>^I}dCTDLzrE#fH{h*=yDPlw;O-}0Ii0SCnbx8F zR8FVc=#|syyk0q-?nAGfPWQG~PN&=BJqC9xy>dETz4sj4ec#&zcc1cJfxAb&*Wm6T zp9AiG=1YdVJ$-G_-FJK)(A_d$XLR=!UpI6&=IaTkU-k7#nVo3x$!^h)eR4Y84xgM( zx85hG)4k!7)9GII$?0?pe6m~gMc*uV9QU!JnwSZX<%(fP(^~6ub2{B`J`bw7$rnI1 zhx)?krRvjR@G;+f7<}AU3WGoMErr1ce9K|5jQKWa#+BBMzEv>zpT5;LgEzq7hkey( z-d5ihG*9CDR@k>4220!ok9Wf0mwkI+u#EX`1jbwWe-FUmslG-zwa#|}wR^^Q1~&Kb zU4qSb`!2v{8Sm$_$$9&QzUy#$nZG5Rme>dvQ_;l~e>-%soxdaee$U?p2CwvYhrwI@ zy^h41)*yr^Dbj{wx?g z(Vqi@pYrFy;Gn+<22b<{VepfF6$X#;8!&jFe*p}B%D)%}oBm}mc%6R*4EFmgU~otO z8k@lzVen>u4GezWzZC|@{k1T7n|~J!Uh1!h!CU-?VDN|jqcHe{{}c?a^q)=bNlv;5 zgFE^!!{8hJSB1g;1Pm?>$oIhM0r?)de+Sy9_D!4%bb`T416^Tot3VGJyeH5b22Tw1 zgTdCk*~DknN~|!RL!si(8)C zU)=KC!Qz(Z4imRLcci%GBH1DK=G@WZmgkNWw>)>ExaGMS;+E%Tid&vLOWg8Yx47lG z9=N+^ZUF9nIX8@3K3-HUZh5XQZh7u}am#Z{#VyZWDsFl1a&gOZSBYDmyIS1x+zsNE z=T?hbF4`h)dF~c*%X7DjTb{d9-16K#;+E$g5Vt(HQQY!e`nrzRbLs2y3F+%PTF#Ze z?)ka&bscTz(${r3+%3f|yQQz2aMRay40d-+nP}}TvcHF`NKVGT$=yXfv%9-^W_K?< z^YL3piD!2A70>J*D4y9pL_BlR9`VfX;o_Oyqr@{89T3m#9wVOFJzhL>QKNX~q7&ko z-J;Vc+@jOvZqezpZqey9x9IfkNxj80yQL3&+8q?nTyzGmA1}HD*N+!nfa?-t_7%g9 zrv2IQ%tg)OnTxL5p1GxXX16My*=>ktb}tam>|QLM*-iJ@3c00we9SG~;|15DaBD)QCm!2$M zIyYaubgmD^ANLl)c!}brr;C^NW{H>f=D>3BBVO8@hnJSu;HAAm_$}A*(q2`(bZ)VD zX|Ew(+Pgr!bZ$hvbZ%U{bnYVY(%!}5rM=6HrKB;Hy>bWX07XzZ2v z=p%A{W@|f6mzWi|$Dc}^wM*jcz7ogJlQ=C);>?i}(?61!X-Uj_Rig7-iPL^2ItQ+o z_;{nlSMQMc!&r$Ax0JZM3(?i*c8Rkel9*wChRhi$^wE zxKmi-=&vLWDw6n2I?;LQjKtsN(>hP~B0k;f8=~u<_Fvf`PsjP;D-!d(@>9n#8UJgz z#5HNei7n(VIft#5sBM(^ahb$D_C3F0CS%tfzepUlL*mFsiFu9y(W(6^S2|b7c;8`( zWpd{;S`H&V)$%d9@{gqwS0^OiEYCfsRa^VYLWwuMPRwX=uZ$=9B>raOFkkMZ^M`z* zYmodeuF+pg94UyJ}QcGD4o_qK4C`72P7uhe|PAg)Yue;3R@*Fyel*OccZPD&x>{qK_) z^8dP8tS36lwo3empvC!aOyUq5SE?c7UUEO3Hw#L0TJ@80)ijBBd@AwbGZG&kFY)+F ziADB(zSM!SYr5Q9=aJbm9`Ulo%#S5bJS8#vZQ|r4!CpqPjrj-a<@(Jw`=-CkINNb2 z(YbJh#Qg&${w`NsGwzY`U+ReYjutXbKO}LqJa^}fSrP}9O1w`{?Y#4UuYW_vdHWJudvwl$cGYV%X4&1m)~+dyTp$2lwHrrQ*%3X8P6JEUy;A)%AQ5cNO8+}_F0KJ zsl-_=?f-qoU*yUZn*}4~{h`!BjS$#~QkL}y{P z#8R7~+>m*NIbF2~J#(tRy<$ z5p=okbx3@uhg><+O~y}LlktCS&JIbED9I&dU$l*PA6iBM5Yjx7l|_ z810()fy55>J+HE##bbAK#Tk+(WW)6`!M%d~aB+t&N%U^NM&X?%7|5Mj|8NVubY-;QF zL|5y15}kr8SLShv&mNOFbBx5~yLavYPFYy`sZqN8x z#^ZH~S@sj3v0TPu1$)j)L7i*bB^h7YV_z3uxMqGNaolC%)2$wo=&)bYPu{c0A$QOD zz*UL&%e{3reIjvzMs&^iNn(cFRo6`WK4;l#HB0V~YnD7m*JJkcog}DpIfqNk*e!8} zjeOU)_I3Mx?zFKn)PDV}47onx|0HIHB=)~U;xqXYox&{Fvv$l{D&y%k@|`neJW1}P zvu~-yQh7Sg@8o?ZI$o6V=kiIWwir)zb$wZ4`rqu>U*d?t5=Ytp#SELF&k7!#dGAS_ zu#lLZVq@|@SLBrs{8z3Q+$!Tog;ODRB{NR5Kf|-aQ)f`H}L+)AkcAmCx+_E}Q7;C5&)>7?Ak( zQxbQ}J3AjfM4Z}6KKZy7!kt@LIn3*C_(|eja&KKNd=gvVOMHU;+Wc0IjiS4D%JpG_ z)v2w8LC%fB4%bbsWIS~aQE|u}P#nUDe8&)C#tm{0o$Cd4uGW|A@p*|i3BsNICBNl3 z#>@DY4H8>P7IoevXmR%bL*hGwBrg4z#1rxwSJ!7`{FVI0Ni76vQ(GRCD>GUWpKhtk zc++Z$3!OyQ1j#e50sDyQZRF{=#>)M4uCo8))_=>Dk^hl+-$1#(LSE_I+KD*NF+i?Q z+b&mjS4jN#WQi+&miV&d6X!YMpmU*QIp?HQi9G}}&c{EOxZrR06FJZ|y_O zb_hP5f7~u{jg8^Ww=f>aE_+_{*guGxeV3Nn)xmQPc?ydi_IaKj$oPzAU$@`+*xwoFI_&?tul){#o4Dfo=LU&Wr`bQ1zmk!hBUif1 z(|5l5tXxUyLVT{J;I_yyQm*?YCpiBpS!-$w8`ZD+7;_k$T<^S0;>{09yk!e9+vZxf z&FgGOH@QAS{;u=BuZXUsB8hDTjn3siNE|BHo$T-+o|b3f`s?=+A9zV(<{62jKDWp6 zS6tb>B)TMTxUzdod}^b_aW=cBN}hCelnmy|JVJc>hKP)(J|J=2&%~)IS7kiyl*FfA zm6-h@adMJF#;)xWpFS$_Zyt%yo|ZTzL*hhxoFV`9q$J^yEB!8FM)Gqqexg|74EZmf zz9A~(zZDR(9e-=H_(KYT~ ziMO|rE4$_0vK*b{%FTb0E7^Y~rl$mCd{U5R*xC36yDoO#DWAF2{=YJAkiRn99y^zO zY>)dBotq>tIrnrYPH3@K#M+ z+#&I3id-N0gv8D}Bo3F)f3st-jBk6M=sejd)zVf~6+czAv?!`5rK%`utE#Zw^?+7O?yl=9jCvCSVKja(O>Yo&Pdbr3e z8KeGh)6N`2I?9uMd1ak)f^0Gc%n0sHyBm9_(-k@74YKP{a->0~{6w~)k{Q9G($EI< zG?`2$oh19S7rHZ*Omp(gWb0FU!Vi+|a>@QT$p+zM<_*%#Jk_0gk!f-T-50jUWE=7< zX@B!cJR1HR8Aff@-^?tvnJvjQ*e`WS#%1hVv=3S2j{Tr+^$wV9@yhA0!C*#EAKDJ~ zTCKQ3uJV(EO330u@+8}-`dtEb@4IBnv-E79MsDT#Izz7Cbrji- z{8@v#(=W6mI*}a`z-*%w?Xv%pF5Xv_$p_EM*GHx=B{xdU zf3_HQvhfet9=}P4e|2dx{~S5D33*GDe?cP0EqzQmK>v=bV4{@@>LKOGZnwaJGG2*> zwEx0Hc+|E!WbbsI)3pli<}c75TAy}yGteU|6OXw7_H={2o+k6AN7if}^9j%VwGsJ$ zCb{u*Q1`t@d;bJ75pl^7@^EOnNi(u2Ts^B9w05(Ay?!_F}ziefm9szM2vZHUgjs8zO67fdzQ@@VDp zhkQr-3;Ar*o3N8)cUPC9db)oU`TSp`Lt1!e8*H`mJlUQ1(lPJT?%9QQ)2_5H z^HXV(Un;)`{jN=9ES1#Jyo=jW3Csv$2I*SCpjyC4)_o)@mi|G{eMXe-6-4{a7qny3 zXcthW0;3;2-CL4%MfsoDo`S%P8MK7{=E-0}pyijoggwEK5qY;FY}IBem|>NrJ^3B7 z{1LKc6S86<>9)z*^~l(HWaY_Z^$7BZ{-Car0H!+rkDlikMQsfkqrc;Mw98DglPDRy z74`(9Cp|;!kb}06>I#|lJUKFw9LmwxT^o{v7%jRhM@?snl7m;nPImGN>f!|Yn;wv( z5@XMY!%lIw=h2^jqrVkLKPiaR?tNsR_sGsNB6T*?ZjlKlSkm$b(e%`z4!VUX^MDmw zyO)t8g-zPf9>Fs`cpZ$hK%S5~cueZ1D|39+&B?UOQrjfQ*Yte1lUy1{7Fy)K)1-SH zxzS6mNFjZf$urWbQIgkNufe11{0=5qyw_}5T~9HZ!d{GD!t(A?GuMuTtu}TicThJq zjd#y89)cr{7NAGQLT%;mv^3>olIqn|wbvZgwxDuQq z-xqkSH|1y{_)=hR>L8;?&ALl!59l$Hh2Mcwj2G#@!7TO|KGMn-jucJ;Uy>)#m!!2? zcDg*)VE9MMT6d1@49p2AY%%sc)*LcW;pMX)V;4NLjmF><8JERI8J=TGl~_9#w%Ygt zxnmv-)xk#SH z7KzRt`Nqm4PhKTPD2~qImsz+nIs3nJ%E9(n^@YtzlWkTf62aMqjE>=_-#9G%ADCx4 zK;0*bjG~@8mMzzsE!R!N9`=SDEdbLTuhNd>Sm?mv271D4k)hI(r!n;JbdkF+(w|X@%>0d>6^u+(?*iF43CswJ2X)C8)REhP-$GoyC{6IWZUM+kD%#i1FRZ4V-wds#oN7iAqtJ3LY z^@?QFY%-3$Q{kh@7IL*5xpFqgF3}oOc!J!C1E9?EK?(|J^PhyhilV)Ec$ z^n{NU7LjFpf@+Q2al>WWds>6>=AU4OlTo2-&85H1+vMaC^tgh+WNR3h=3u?bG&nB0 zK4U|zs6k$p>({6Ls-Gf{u}TaI?9P?tXOpcg`gdFh(_Np^KEQL5j4HG@l_jGZk}+SC z-P@5HM7PiZusyOS%r;(ttrerlV@(mVCaal|sX|P8&*lV;b$qhqTvkCGSuT-HEZJe*c_yx8`K3MbFZ`B3Lxu8eKn)u4aW$K*y*50Wt|q^jx=+n_TgVv9@BbCV;buC)ORo+GF_ zd`ZrgyZidmen&LFvhVJ| z_eu>I19{d}P!HxPq=!DDJwp05stfIrPI9=!-rz>C^DIV%PWnOYD_}dR7#S{Bd-eDP z`Solt!!?!mv(}*QnnI?tin>FZ&~8q}bh_l-&>FClg4iRSMrHD>S83;nVpqG<`zVk}AR=5WyN#@RiLAMrJds28{hd6|HW$eL zMz&mE#qEbjCo$^O+Cnly;<=i9cJ5euKK>sm-$AGw-_gG201IS&n`JN>X9S)@1K&By zQ);gH0?(|;I9FwAk@^=h^dqv~X0qY}FxTKXsv6_Kg1{Ek`DC3h$+9xm(S@*c zWYssu;L#l8dvJ_VAhu*mWFc%-jx8xMVuW=-w{e#=D}x2H=aXp6fUV?vdF7f*JDhz~ z(~f|tMl9`eKa%@SlFg=(t5U!MdD6+2Cks{Qb$E1ALo$PksnAYjcyDr|)U?;O(2guG zWZP0K=BdgrB+oGNRme~<%NPUB2?DQaJM6#&oHW}M$w2W+vk7&oTvZ+RE z!8}9qdIU!#$CPU}j1XJS@B5f%whSRpaGsqY-*mf;vaoeaR%UfRpFAkhTZ*HmA{LTW z7L%hy|4tm2ILSEG_7B)@BNCh<&r?&3Has(Uh;SE}Y|W*;F#*&)8JXFlZFb;$ipXzy zbl*WTn4_8Npn8ksNvG()=S^y|NWQaM6xe%=ozF8Zwxl3XjnDLft-5_8o%C$0 z*RBcXTI7~ezmy8L3uM_gYOWINl37wKQW$|9r2;2d+hOZS zX0AK90nb^ul3XS1{g8IjXfWCGf}Le&RX5~abZcgTj{6-<58X^V?K3dP5`9`Mr6-ut ztGuGjs5`X37)gI?UUQ_Zx<|?rfllRUwwJM1yN>eArR=Gi^CGDGh0?CFiL5jVbQ{0W z-k3thNG)A3fOgsTWS5u0RO1%yflbNzv&rQxz(m>eQInZ3YKCOlcv1MZa`0qWk|Rl< z!cGZX;kRQvbEnk3U9D)3`yA|yzpM@W@t>gE;>fBs&B;xYp`UTQnglA+tF+b0dY}%P zLq_qAy7%8;lJf@b{#l^gB_n(OV|qro$of>fg3(&I0Bmklr9VpaIpc$^E?of=tY%<_ zc@s=F%hI2iPZobo-sukNYAtC$WnVJ?%SsueltTJtrKG+rP5a%pV3JeX+<{DX^0Rty z4IXVE@m%UV+ViNnju}i2V3w%?*SyVu`Wl!@g_D=WYnCcYvSC5eE41HIQ zenC%b@w6+UU0yz0hFa-P!bThy9Xg#%`;=_%Ce2RbVcYVo7PN=SNF}ltYI7<*{di6F z1*?P}x|1AHhD{p-u?G?y{v~}yFWW}=d z%wr#Qkc{%M7hva^*GY@BNuI@Q)%`kynX(U%XXVo~gqox|+0HzxB^WOmq?5+N&Nj|~ zUU_;QXN-Wo?7tnkwy@`mzeL_AnP$YuQI2e})U;``2k4dcv+hmBbjUrj{%&-e}0gW1QKGOOyE*I=hO*cTo07@QpV?*7J`;`tX;2YGa|QArpH&d1;A z=jdb!hl$4pE-*NP^W_=5IIwRlYj2&c;Lo$#fw}U%L!RscjhEi#nf$CyWp?CQY`G3$ z?V1qSpGjv6Jr>7qnY5uu=IA16r{}-BaEyxN38hGCg2!qDj~;mdoGAO5S;lhMlcj~q zcM7&T!|0tDScyIQMUGYjvyGmhE≥ikK|By9LH*_?HHD8|p{H_LwI@9d}&p{$QTT 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�l}JQ^V+vb|y-2s=t{ir^>BLoWZ01 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 z%0A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

m!F4jDgBMrQBM9W;kMS`CSE))DhaJAq% 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 K!!Q0NH3mBy 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

Jt_i)$ZIXAl- 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 #~FZO!4Bqr}@c#2^c|ss_Ad4&bb_{X#lK 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≪Fi&`Ow;^ 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

w!oA!v5#nB|?f%dntvfm{GLq-IFdF6l!@^)ixMl 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%0D|dIXlN){uMMpXj)PqAm7l?c~ zI53=7I(K(_2M9v-;_ZMx)Pe-0yPLEP4T(nNh0{tX7krj2-N$zik z)Ckdg&^4@Vwr_t~^b|4J3j7K#=zR#FX6j@!pvGnI-rQWIo=EN~@64Ib&OZZeHW4}| zQic9{6$4;%=K(y|Yd?Sc?~pag1geVU6>dMKFnH7(LGfhS3$@uo8P_vkd;zq)OwJH$ zhTveiaMt*NVE_a8hYp=J60pG2)G=`EZu@N&eYW(Aal!ciut5`Nj{?$w0IL63_fWgd z62EIOd>f6d&42*#*RTv4-9{E)$VD*D$>apWi~p7zql=5*0~)+POwMUALdiM{ChKGb zw%!BZz)Zvf6R{@2Af15e^JCL`7^|bru*k9alu$v>#QP*{N8o#5grNWtzy#Ak7_Lcj zZi|CM%O9yVzuea#ACPJ5bn0#us=K|teSvV1Dx2CH%X%R`;@1!#_T9T8(Qnx{xizVk zKpX@_=WM-^0RfRw?x1REZP%hbGQc(Hv|IrXOj@vos650mfc4mHff0(5IzZosZPIqO z$e~)v0bd0p7bsf6Mxa-#De?M&yLP>J@#lmbq-iX$Q=YYF5YyIU&Y*DYJgtJm;R3rm zSc*Hrb433eMwKEw>39j0~LH$Q=FF4<1(h(F9>;fTlN!wclf(oSzXnF@nBP(5vYh10N z{lYP&vrVZ3t*qwFLvD{G_ksovw6}Nn3;~ueX+V&jMMsC&+sQe=&5hgEX$U}t$*{O! zcNb5zK`cJ*u0(?qQ!qg>BC-phG6IkrF}`YgAx2v$*7|{EWur$|S1Xl;g|)SXh27mC zj>X(-|rC*i4%+9@cGp9P^7OwU4Cpq_YoW|xBF_&?G{A@Mm8>N!F z!57mgi`J`~>lL^jdaVJ>b1cS)*|@#At)!$AM>S|Dvw}4Hb(Ad*BdaGyR>FA_i;>kE zBP-!N8G{BNg^@K77Gg9;))0)Wg8JIxALqw-d42mWXs<2zqD-bLaN>XgVc$Hg=m8=F zSwiSP_F}24s^o&Is*q61#wPEV{8SJR(>Zt6rl;@PwQUbFg%5gQ(Wv%Z&(4AIx|7nS zIU#z@m-xrV1_$?x1gOVK56*i-xQB$MeDDRwG$)0kt?(K+hMzt?{r%CSj~+eCIdCBB z=Mxt*Daf1AxutUY6$ysF^7E6k{rpOEQ&@4*gj6T3wzGq+@9ws==Zj2l(OXhTkbg-sA$no*UuZOW1pfPs!LYzEFY>8p&$jN{km_{j z&gElw?_R$SCGlq$F9K+L_`-!l`B`U<<5#2*5FKKq_4RVPzCMLhU$2YMr8+%+e7ms% z)mJF{0v%9i=ktt)hWyro@+O3W0l5Q1@dg&Bnv?1T)LtK#R;AL<&&GMgh{1zLO_)1( zgll-x7@#~-Sik`wl3!OR$Acs1)YQz0eKXZ*+O$crBVtF5nmv2kgjutuPoFby+O#=i zCl61e-j&M{3N}+PZ(wnQxxE-R;K%@p5n!eef`*Br-a~u&80}>n+RF!MFMH5lmZQDw zMSGFRWKQ<_;u}}5+^b`?DHP)oO*sP0`A%e39wR(b3_1C$_$CwvC{#D`8mhWv{ieJ* zk$579$ai@Pg-SItE@|#ij7%h5{VSEm8Yx9IWhYT7MYP`E!_CbdE_sDqT!9Uc1@3;K z5zr*yquY_Hjb2q!yddx8tY1BTO%=&xdQE#pPR5hM7hwJVl)iIk7ApRRAU11na>b

76^xO+rvsQPa@YrPkg7mSza@ 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

UZGoY}lYLH4Bs``4z7$o6x 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 *h;szGr8PX3NA&?IzsH#Na5tZzW1zM~88 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/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

^?) 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 z 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

N3^W__jkyc`YQwdfA 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 L1f?GlrGg+8p`&4l0E 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 z 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 z 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�yRmEQN4)0Fp9rG4I*YN`z8_^M|c7u*_zFNGt?~A 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 z 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%0DT=7KR3y}gMzxVG`H?kH7Lr@3kbEC;Fwn;G z6w`Uhl^Mz#jd%Cn`$qb1s^eh*VrI@>uIwd925K-)y?+nId^!_~O;3tt7Yk4A|U=Q1Hy*)FV5Jk3ZM= zV3`ue%WY(3VsOkN@!I>{#(P0XlJ~uu-f>S^7^=`YMq3#@q*Hj&`;R{W()4MuyymN+ zn5C4B_JR9fzZRsS_}8)&RDlw!rIIo0%I0^zc~_DA%T>h(pvYkatHE+3g!<6VLpzIi zyja{t{)K@>N)M5=X%DsP*nk!#bR)UM+hh~_Y9|~y$pUlnoui3Qsp~a=pDRN zhM~>F$`t+E=rZ&3_#h!xVBnTy?@du(j~@X$O?D;2A!oe+lx-MR|FSARic=v2&vJ&|V4!vcl? zS>>xheufX}o+qQ*%{>DZysNU=>3{P@^34C~i=KbyR%q) z^G#$n{e&J$P(epp0(0$2Jo$ zpqSrncyph=vh%RKoe}#%4Fr%%6R&nd*v-%;-}w6>1AdExRk8~up&&LPCSeDx=l)1yi2 z!eLj&m(eX!)G=9|C~dcFT0h+|DoZzo zTV>}N+-?J1*q?VyoG>P8vV_;zoeuoN>Ly~548`cY4{v8hqz)(UIgPn(afh@Z4UOeK z@9%Wr_y)Ft74!Zq`LU!Qj%+z6rL$Z*jK2ri-?9VrZ~B}jF_m))_WT9>Jz0EykUrm2 z%1Tz2j!~>AU2^L9s5_hK9W?JiDI}R&!u%qvErW0qoJ%ox1FXf1dS2@p{n(6i<^Ygk zj~`%pi}ZRe*vg5WQ3xHO)W|6E?G~C|&*E{~f8K(Sr8Lb-1n~PxDaqQ> z2ej2@N;eQj=I#HmKeeKxW5wvliX3gU-$);SF#Onow?C&Y6XfxveFA_#x3<67-(P&F zqpuJDW3aYkGvdXiha?K=9i@%J43s;i1Y14CIdDG3NO%bfFvu^}yOlMzdb4#(>&Y7F z1YT~n-@mha92UL=FFlKwu<+3}>{}@ZE7Bm-OCwq96q~8uR-<&EbhpQM-fy?c`3X`C ziSTe~YN@vLI&CFlS%wL;@MFqH@EK;2XzHfYH01O+jPU@4IQ1#+++A`?HkQ5=SLvzm z;Lby(ddUhjUoN@gPKq5*mjcL-ss#<1dK3No6JSdOt5H$AM|!z{F_0yf5rZ+yKd*JB9AULOVsGxqJM30> z%89QrZEX!YT|--&&*SmY4;nDH)G9ex`U#pmP)eQpSKOIXYLPrq`UH0-mXfSnD@x-f zyGuX7oynz+Q~wT_6{SAhc@NFri)Q}@clt~Hk{3%y0W+=SIrUrISzo$9at|FIN{)uK zXu7AgN^+v~7$rJp#3!8)y2>--r{~g($9-(@o|o>w%@4tgMHsnL>Af z(7DWW!XC`jr*x(`%#=g&DlndH=cgT(;q$6+6S+cojVOgbfByE)#i+GvLKR}fa2}zC zY~vCYqsv>`UOn4{KHJ_pdO}g$F0Ng&if6gAp^T#YV$ShZv5xk5M@PK9Bi7D+R=H}A zb>NlPxo$}}znpsQ=Yf;$i6j$E?&8OowU*ci0O64q3l0`{B;7i%*4OA&8I)$L zA}w_^a!WL|W9;oxnbR3*b*pMx?JY8e(;05{NO;uLgPQhW7-=qUntqfX4nw0onJ~k$ zEELL!#b`@eCt%kv%3G4g2qGG3)$-P)DH`&FuqkfTI~>RmUH;hZe6p<%GvRc$k7GaE z%*Z~5bkF9$RxW^fbGb#51N=g?gtp_%Mqux<;;eVa>q7yb*3=-+$eQEEP|%|_HYn1v zRN@@>x!-E_*s`A+gOkMVrflbJqyNP4Pb&o_-z@!kHkOpQ089A z0O;vFgo>_}T!eHxTP3$3fBFNG2PF?fC8b_*EKIgI>GDLr>5S3r%VlZe$jWc{9DmEo z_euG;Q2q_048O5*_w-->9HpIJ8{KKE$A@RE^62W^P(HuviidDM_#DFL zPxufczJ%}Ns~(?U?pa0Nqc?t!FQUNLukm>kpMCf&z-J;p!rvbHc`mnlPk!}-53bH5 zeTDhK2iM}hy@`HZLceaHU!T&icjy=K(CSbplB7_h>L~a`KoSR_CwOA}IIfJU9$>B&Cc$3m* zQH+(Ft*T6&MXfQb(^&N%ax)}dd`KdfUUAqkEF|`eLL$#7WMv1RwLsiKriVj1krPqXiVSQ^(E_D#D5G@T08 zh;EtbiR}mg%s`+31u+}P>GQN(dF1M3-TJcJE1NP?hg9Geb$WCG2r)I&T?*$Mm&h5z zf??=K3%<)*5X4fU^)tDf1tBW@;nT~MD{WQ`t;wd!sO?IXRh@a6aB632KNK%(5|th0BXtKVsp_b`ns};oZsU{0v7- zT^Dmuc5IKS)p3Y79S^y!cBjW;@#N?im2;d1z1~nrr(0<7E0ti^()=G)A9UeiC^}1c zE#*6Ug}>lOQ27#Hrr}C_xc9d7Zs~=9aZSlat}7j<-2{%6brP2OL3-Cau|EHvYsO!( z$ljMZ`o)q(`A$nVvSKb2vun5kaviULpz2KC#$7}bY^S7z9=t>nbhiX|5jJxO z$4b|eMCkLayUZupkPm8#4|97J@7oNLxXbB63|#azd(g^@`Q4k*r;o zsYy;uwX9mPrnRG0!JTMqu{T&6w03=Cs|^=k2g>{!x07t;r_hcdsZDv^Ft#M!aTFcd zeeL)w7CO)oehTYJCc0uSUfWp;l6yhBL6sr8fO31WCGDoGuO7N$8715p#Sm8MryP_} z6wK_GW<_zc@2+k5aCdiiP3pl1U~4egcjKH2uxC9p7Tbr>%>g)7FLhEbC(E$K3i- ziTgd$UQ806mQ1Ds^3WlSG7%o<-XilLg+Ter{-xS5WQlD?AF6AAvRDoY;@? z08d~{cuOJ^pXl*KCO&{c@OoGtek)oY7GR`Hy|7KZ%KJgNsH{O1J(8ypVq7DFa)RvNQ8i<}A)RF0TXxj<#JP}!3smC+Dv zsQeh-YEgzB*ICJ+r5RMp>8mF(pk;HE( z8m&JKF{xc0LhyvUe4Dr7!_An~)!l;+L(IiM%-@KJ3AoJN4{!5bc?Y+6pbIwOlBwj8 z{1)09%`6~lTV;7}crjwP6y0SS%qaZ7ZA%3TjZss$vA)%jYxTL4k*L*TbDNBjl(4OH zao3ei1+&W>3B)?wMu*XEG}+||W$UyPXa_aj+%L9+NA@9wzq~;9(*?o}{fZj|p8Xuy zL<8Y~8aPb@lmMtrDMToYb7cRE1m(>UYuLuO^4LS)J5|R0yr-whuL-!DivG!nc|s*K zQ3+dxI4xHZ_Ln>RZ?v;Sc!0B(I(Q|kV%SI~l4iPzMEJACthUzFx%A0GE|KsBxjj~k z6q(^<*`~+@m&TJv6>pXjNSb_{W@Qw)GPQM6lw>w<&~g+c7D?ml*;WhuniKH^P2p^J z)YU1?Dyh<2PlZ}D{uwOCwDl^LLMoTm(k$0999t=~OKY{-`uZBVR90K3Qp#`>)_2I? zOC^V4v7@+ygb(awMo}%sbY+ZBXQodG*<;T7ZoAc(Y8xM`;dVKlYJ0@4bvSiKT_?!# z^FY7pK)*1VDBO;Tmy?N~NF-AD4Hpw7Unnm)2-Vg0_v(d)qUYpJ9`75qzVpDE$dph0LmQJ@f;7K4^uwc@7 zqV{x`Gc9~&jTj9PyF1_`oD17ZOi_~|#w|4Xj1696S1#2X^}?9koptBD8E?SnjX3QQ zE&}Dp>-Qo7ap`WL*LuF6Ia+|4R4&3Ece))2K_^xn&W~x<)z_zemV`FV9aaI!%~`uW zi#%Hv<=yDn#oT7e9sE_pM2+dfB2lT%b`Y+*znu-G(O`X}k{otf<$`-c9K_1d*^ZR| z#5oH!)dfuDIANghM6kPfsm-AL#V+qv@ ze<5F%UV&C3Av9gR3!hQHEQz4sN6#pvyR$047%HKj)420-4-At|qXnsXqk%vaC)8Ms zPMbU731>a^d`@cg*~~7hE8!0%kf_mUMEb>e$k*tyxy*Kd1Mt+=+ZA=jV$SN1zqQXF z?haSqqSx^roby|Hr(~1lOTVW28O2v4)EIt-Mc$9xK%g%Mh*#b{Nd?ej!%4p%4*%1Jd?o$t*m~p1{5b zG8(R)UtwKgb4q158XOLT(H{9qt8>^LcAEp|-Ip@ld6M_|Uf7{w38O~^WhhCZvQ2PQ zrmY`XZRwQNoVHoX1GuEeJ>i=B$kS#@b-UUu<~Elb5;4B%HP-se+<9bdx!^E8rX9&t z&s8|mZk+3p@bYlQ+$|#&5B>M>?SG~{?z1-&GI<6T&i8P9kV1*{vZuZ&;e_)g=aak1 zfH)$-f6%h?hnv7hM_Tr;XRiuF{Q$Q{vK=(Xfiwdnln?m}MWZTR>XZv%UpU=AJWT(j zjrn||BcS5s9-PP^=QTAtlZ;aZOd+>3;_-O6H7$igOM}|}c%727alA&a(K|yyc_iK# z3dK?HW2pBk7*veZc!T4iDrYW>8Heb0<_yidfoW&TLYm{00cWC6NH_yZzQ!3D8-|(2 zdl86AHz;%Uw=n?MJSE zi!J(uqL$UY20ooWiGhZrKrSx}P`Qj~pn|?!Hcd&h-R-HS+2x%K8HDo0dg~G~?eq&~OM(QVTd&Z?^8)Vqh^C)KthQA%HE8EOOy&F63hpk$axMMh|UIMEU z8?e!T`IXXIuxZ}R*$vWKe$*ckX{}Vr9_eK@(ougzxSw!RWG=9CTw~>8=|-Nf(^&01 zNt7>O=i*CO zlx^xo?zC(^U8|Ex)pCs{U>UxWa#GGtc#TE)W5mubwPsQmftR~<0fy#6z6cbvpj_nU zI3srh^mqS-XlPy35>G^I_K5o-j0Rsk?x?R1MsK^-YKw#}Jh%}pTnu!00dx^b7pRuz zhrR)eLk3$2%^4^l1@Q`;AF8z9E|trW>sG3e#v6-KudJ5ih+NLc<58Is_iN?eXm67H zl?tXtd4oxH`Nx}devFK%_VUX$9+lGHu<2v$-hCJZUk*F{>f$u>>@Rh)x%^;rbl+r>PWXU7Jo{qgK|K z>)Uh%1)G%KW_v2@ zY_TfpBO#5;$MLmDRhS&pxc8crNesMLjSZ z*pe=g^`}8^wt#kN!N@$Q9#S0`4P}y)6`QD85If7$;qq^OquprsHs;o>31z(=S9`}8 zh1K4fce-(mlUd4fW{bmr+<7oM+MX>#eC7r&yVm$=S#=Y^E)}8 zDFjtR(sIr_t@M)hh6W+S(9;7wAo@bxzpSlg~Fpy)*JLXr?x?> zRmdGRawpUb8If76wjio~2~EBVO{S3pw3Rdka@aUNvO2zcW77rP`r~WXtiJGq3jn!| zTMHLskqr&R3vngqOzcRmLS|KDyc~LpTqWh@JbYBLySVi)_09-!INC2VlUl%TMoruB zKK68?CTvN@=zx|(pcDD(mK<`S1;8c-eUp%64pl$()bU$t8fu?EQ?Njy|252iZ1n;U$pI+e37;P?6U z?z%cBw2jAp_FTF&C%H4Q=d3nTv z#+4i_ni-9qorxK98;iw8?o(uoT(e>JY=A$4^>e2PuBQ^HI7gW~LvKf}4*NLYM2y!< zfTI(MkSv05=$)=J?a8NP}7Lz%sk37Sf z7Ffl~mE;ZyFGbdb*J4so%aJ1hT!H5N5P;Az#l<`V{G>l3ye5Lbw3;>xFYv>NqXJE* zV_dOqQo@5qBH2j+)+|WsSB%LfyQnm|(eLGN=X^dNexyF`lYCoS9>V0!0lz=64<{pg z(Tr})+7l3=P$DnR8t|5)kr;M^f-!5;>8$;AO89!b=`*;>Q`VMo9XS#SS0;=r%SO}? z6hiwTnEn%T(La=b{s(CX$h{BEzZgiz6c({cQPvj~K&)Y?V~R{Rq)Aqk6@9>x?QTm! zTe-r)_vPZIK&VE63_&gVY=^_^bWoqrBbddDF)B3DmX0;+OIeG=;AHdE;|ddSM%i2l zd%RwEq!2jJ9S(E<9*xCdg|a)TGK2FvQ|F_R-$WzVLu+wT`YEmrn%V_%F*Gd;J4=Rf z5s_yhcn0dDDjbDf!KsSWn2dUB9f^{9kHu?_hV>Sc$)>Y#Yy5Uo*lzNN>?XIp0YQpB zU#`(?kC^O1yS~1`-C(h6bkt3G4f=8|YHy%|Ja44a3zQL=7J85~)4!=c8Jsj}Y;&q9 zyACee?jC4v{GR#FcI0#kyyTq!{x}e74T`%2ojHUNXJ=ZANEoIF159VCShaR@sI|GN zMLH%D>68_kl5J1AeSWvw?{iaB%rq}OKCda+nv2Bakw`R(qAy0#`}pxtt*K+P!yx(b*uF?D?Xm9 zv07_tY_+wa&>bGV4)d)i#9+}Ow-b2Cddbaf=~8noI1O6|;E|NQDl%bM4t=X4jTXN( z5m{yCYozLSwXBB6nqG{5$IZ$HmD8y*;z$|jf9oapq9`lffTgF2#mp!VIw}SV_=qwg zvLNTE-+aY{fL-YbJ8KNKfTN+-8Fr{_f&Qnj?&6DvalFS;>@jFptk4>IiWawYoWVh5 zvx`vrTPWQlfv4qMrI!beRdTSZ5}UCGl|bk14TrCo@J&`xAMdWJsJ32)sX<)`#1Sql zaR_jE4Hg`Uj7r8pANc=-%laHkt{N|s^=w`_Sd8awJ;o*)=JZvGBR7r(LL2@3lwX~PI1uH7N$jj5K zsV}kYSWI7|(t90nE9zC{N&}@{YRRMLK~nG4tD^G?ZI_7;%yh7c(5RB5Ny9b<*XnXGVZI@}&xbLW_hH*NPi93Hp5 zdCZu!H|^lwH@fP*cAK}ky*V|;mh!j)KAX*#YELJ}*l->|X(uO@TmmaToyg&`MWS0a z805vpDp$a@-{rUAylg`)5(w&RT}?J8>gcjGhxAqr_k1GgwK-h8v{}mAnmwLodrwz% zAg4^#hI1I|ZW72pMd~P};c+a8=>_z@$g3oB)!%NX5pQb& z@fKeLh?&AM2Jusvsn?dC2E-q>Q7t3KwPE_+p<)wsX|x!mF*7WK%l*O*9;ewGjkeEt zli6yjHR-rDCJP)1Mzh&sYcOIrgwVpB2d(g@bmu)!PeBmF%P{K{dpfxv!at(zLZoAJ zTVJe39_nc;a6eVs!}j`sNoUe^L7YP&2e^eL4?IN>ZYu{(iRqM#p^$LE=P+9l4ulA$ zG2FWjzd^57D{7T$OKnioikF`ld3pH6_e$!m6CDUJ!@D+_&RmaQv!rI|Q{iJS zz>gjF2hmfgW=NJmd86lrP&pq0lC0`FSanU#aa|2l{cd%cCtWSAj=mmeHtXo&zF+mn zP)pSxoVEIohN?e?vQ>YKD&S954_;olaKp+OGge$!{{5=_JM>cdf~+lH{I2|4fmE0O zhBnU0kSK?C z3O8`;`I|vu#LVh?=zsJK7#37V@H+j_fKQrxf_~^`;nDX+p^CE4~K=KaJr|rIc!&{U20!Iy7@9L=r?%OYAC?jwvMdIDU;y{@qn*J>S8kZ zH^6Ex5v5eRG%9)#6@A({vb8x#@D<`-SNLkab^L3}fZ|)nAwIo_wPCoL4##Cs*OM;BB%2N-{Y1MKutw01lCSO;N`3P>Zu(XeP_DyCD7 zxpk9Y=qbWrz!&F=QqiU3bb1IyJkAWWtWs%6ET(LS@EfU`eN6-hv&7R< zo5$s7{g(*3$qI7l^ak}f$8oBy9Yjf&l}j2`PMH_^XGg{-la1-Vu~x6!(L1ULjL}lO z{tN_Hcqb6-$-JE`@Px*lfG!tkxLf7=89ovYsvR}CfZlKB!qPwktlDy~Oim)4+d!-^ z=l8a+%^0(mW%jXyv9={{9OvF{h#8ufM*K?(sBJd41ImMp=`f5y*o6}NW=F2)A8LD~s(92u7^Cg$^VIT;#Wq>^SE5Y!P=O`PwG~1ay)TLD$y!9HT z*A|TM;a6UX7?Ja{Aghhyj04PC02=#YP<#u`#i?f!v;tI@nc1PUiIO4hHMn+IpD%W| zgz(jhBjSRgXfPTINBG6E*5*{3bkQPdYjbm(boM1Yj?swmQtIiHqJy_!Q9X=BMcFfT zCsoP0XIorLlU;l#q+NMuquy5s9aru1OE1B>OMaX-OZD7T7LrwS0;;Z5&eoYiCa$wp zFh&lQL!?JIfU!erGQvvaB#XJXj5?duZlzKRkD#1gd?S^~_?&k*e8E3NS`nXOwkWM; z?yVj}gT+>F0eb;Ubd#I7cd1Y{I%VNakF`BEW~~C*TlpH5Vh#7MFq1qboNVy8G#Zz; zfq=6@6tRam?y-v>{S zyoM_FJm2nEuc)EQJ_`OJP;~_`9kwpEUX1C;2B0%j?Qh4kuj3hAkTAzkw;tFj@@`Ul z404DYH|55Y{#=A`Gm05p$-@fD5E7bA_ACzlqwz6hZ4UVbTv;-gpnu^r^cz1F0 z)r1Q+U&-OMr)s>4tByaV2-I!?T0VzrufTp{e-6+I^qpxN2XU)2}L9f-1M>(RC;Qyf_%$F8nnqI&(#c_@R_GjtQ^eU=Pg^0>L zRXZp$X+)!m3x(2`9J3%~Lvs?DUBvG-`*aOHvpcD-kNUmwd`rY`Zt%lBkuVqZs?dco zk6G^st+cuLjW()C8^ZynNSjRttLUH5*hK$?ufAc}MKKGs&j-K602=%jlszjJS2Jxg zbvGKz&Y-inQN;G0(~&kY-e^`gxg)WbmW0(-k28r3F@GqU@Ptk{(mqexIm*4pj}L{; zGlPP9d>pAOtAv}N2>PKA@@Kf+Fr^#N+*iGNqHX$XxMXjczhU9pDbti3^as zY@w*x=n2);LM3(hBUNpLqDqKNC7+PEj623OQM6z!RMXLI3x&ohO-hwTbu(oWFM<=U zh6m6pX<~$lO5LZgO{~lEW}IAEk3n7rD57Vzz}5S_@;Zbt)$1%ey-kG_aqpdJlFRCG z9)O9ffqRMb8Ku--{eRi!C;Ig-Wd3#dHu;KsL(l&eZ;ju2ga8Q{SdXeil!@ z%pjjFd_Y~B)o%R%U(7}o+wMc)M=)UUV7Y872Q{?}_k=QFw&5d8;{+<6;E+@6RA+UK z?r=vg)!Eu?MuVja|!$F-TXsxO|2c~pMmDq)@);AMpZ}5A+5_~lPhJH z2fWTuIH0rZpzVEu;4th%M1K0o-+=}|CJV2@D@2EPBfM`1As*0xF`x_!n4rz8*z|!) zh2cdw+(Z^aAvK59yv&m;*yB1JB;|$!l2Zq*$!s?3@_IZLx7NoWL_Ex=jY(McYid2t z8d(EhU*DF?bU5RYa7^p9)+UgRt+XF>_9DzO6_r3>%L*eU@gb@?(ImYY6kZoGCmO?c zdlW(<-&<2Juh+r0Pb3uZM$zFTXz16N4XzS2La7263j`Kj z#!HA)FQ1%Tz9u=-0VCp&+*l(s%KH~wxxzRF9VN)8y&k7&>_JD_k%t%$ZasVOYdly1 zcNn!IvymGi1^EVJBoWYD_betanx1jxJWOsPvM=rp2#n=k` ztd2&)7OUSCw!lio7FyWo2-b4yDBmZ#IQMB8<$0<^QT$(Vl^hj*E18WwSr9tS!}OBk8t5oPv@L-PSZI|PfyM>J8^d>Y+yDASau15 zM3IaK3WACljsx@nK{*pDo*;TBr(nQSPdPoziitx#QCzp@|Ev1G?&+DGMK1is-I=Yb zuj!TNON`ppaP^s*&UCU%Hsa&Jd=#(l427D3& zZWUidxz*S-O))P+sAW*9AjPunM(9aOSCXoJqoZc-295)zIiqjTYtnh=l}01_;jjML z9h-6OW&mm#F9l2MulK>Ut^OYP{w|>I4NN-|iDAxYoM;L%^{zy*O~rAXx~-7h4TbC~ zH4>Eu)K}4m&Hv3?BB}z?8(26W;@DaNWte4!{U5&O^82sGEuQuLPRG577f@XNA@>CL zOYkF*VnuRVh%qMQ5mFvH^&keWiJZoiOKC;6b<9-;g*CsC+x&0FI z<$7*uFA_wPucE{B>c4YCTp1nWyi7YpT1D#5!o*Tbrw2;p2c`75TB0xa2m6;&JGy$h zN8FJVm+jD=dST2J(#IEvk=*Bj{{D`oUSh>T>Dv(ed>TGI<#*U8jObcsWCm@BdRY`N zO$748FI44~#>w?7%gfH+Ui5d5>m)KF)+MaZN7@~Qu1LJ5=^E&ZPSP|(&p%JncSd#x zp)Y#liGbZXSWSg{LYPDr5-TE}fP_s_9~n4hLby`5Q@UssxLZ~*H*Dl(*uj~^(IAky z#dta(pGyve?dgH}bg&dsw)uuG992uKodfORu`aE=t(fvw(mq4#P3vJ(#J6^LpSLm+ zbtLTDPQ7rzo%c+XcURpxbEex@o!XHpm$`KSbI2kuB2U7Qsf1%a(j!-lR9TXVtuk^t zOc}+(o?}}##2w4a^(B1Na5&J0GR+%#PoE50J`E$=Igp} z`NEF%U2?WlFK{dCx?24a@cVm!>kxIokR@zg=&_-fmJugRjO?_h15eJIJdl-2ckei> zO*%4Mn@+0_>^P_!xu`z4epE$zxnG}mk$2JX?>?T-ZZ!$F;WB9L8 zIb7O3y>q2@N&T0_{MgjC(XnDdp|@<+nw8^&!@XO4wOF~UcHZATeF;*bu`~d8e*4yK zf%I%~VnHQQEsyo>DMuF{+jseocdh*Bl0BbZgjAqYnc)t%OoiF;_^qO`XTW8r*NEJ;sqJvz~~ zm?>v`Wq-%+`eWhXXgFFb%_VaRqi$B`Fhm3C)OZ-)h|!q~@7&GV>i=vh=kzx|dMxel z>&R8rl6GG)o*GY(iCu52cHgya`pzyz=}t_hXSIvlfvg~U>Vy`qP%*Qnca}@y0H2Zu zDZAGoM0Gx8 zF-+?$j*K^yjaaOuNkAR}F3sS79W{nB8fS!o13X1*1(#rWkYgr(a!)fHg}pdk*ON=@ zZzs>y-$br`N(fFdI!w{^)G$|`8$LyIj#XB>#3ym7p@V4YqUUlZURn_oZX9MH%fTwx zA?Z+NKi#j^9nRW_U;NpY$QGvt4qkfM!9;IbCnasmlg%}v0x#i}Y-(n6~)CKLo{a~rOhJ!@z6*_2lf?n=xW;2M`Fti*tTScsY3kq1(X7u4IJJF2#Pvr1e2iL+791<2zj{USg$^-6-q1|MFj z1?D=f&uH-*w`^J7vc)&}lB{h^BGra{WXsrd&yCeTl^>5l3BOn9jNSJO;vIK) zkxCuixjuZz0jpkwhuDX%1rMtVLN?v|o^z_?`9$J6#LYkesnyS8CbW@`?(&!mJ%(+H zBS$os$hcr_hKlD@XyrDYRec*=NMdBL{zNjC(kI)^28Bwm!Z9AR94DR4<)s(3_tH2f zc!xNRka<$u1DVYuC?jg_aeTk)!trzvgr;Z`HXL2gnu`9%F*Xr;#E84a9 zlJ5PtPUWJhG;)FUtIeuylgaVq(nD8mf9tv3(In%AcY&EE#qgWL{3 zDwf{6A+LdYY7Mhc$4_Cqr&a|ixji{kDom#mGiCg}st>zdA%h|0hR#gX2d=1=uQ+_* z^3L*QhbML=61yfQcf?{l7-hZ84PXqcE0cul@^*uu=ooCfc*B9W&24?#-kzgAXJ|Qb z#q09>C;IlpLQ9IS%l90(vP-X;P^k|e>ff0*sAn|Pc=jl!za2sx25^|=k#Cc1zk2y~ z^`}?{&#NaX^};@q0;=FsSYSvB0#QNz0{89ZpD({aIf{I>o~M66g5Q9iKLo+8VF$Hl zl4s;03zkU3$LHVPKDjrO+B@^BhsoP-e|v3gko!}8I53>gPsX@MCQtqO;aD~s1ZHvk z;YPSuaL~oPjZ|isfm22#w7&vwO;JGi#BY7z1MfU>tYh!YuP?s%XSdy6n;zp{`QgOd zr?#L=^0kQ{o_dAvQ!L6sQH%mWDfC}h_Xt!}s9+nH4ausSv`W(NS^3uNzpjvXluvBm zexl6(T|YK8zin~`$z{n)L|%WK44wMJ#QD9w=TA(W*V}vE*z~~zGjl7HKHxXX1YwhP zji9qXz4*T6Wzsh`R{tDO3(*1orb39?R)E~|tK2@GsYN~jNo4^0oGR>59G!d@JaXZQ zq1{6i`#EHm;8xFD)v;!Jig>(4qXr~O6jTKlQ%4_TaKIEZDK&1rGp%^jBbUj-ePr(~U zE)m5gYTc*TZ`c3vkNRbzC)z*K-?6s)(eS-|!*H-7Ll(z^n7o&@+pb?`t?Iu;JD6)Z zC0G$*1q!_CbTbJfch2|g&vQ2oRZh|L&HK>iZ_!2!4x>+3pkP&~iU^XT(gxZg`?dTx zyKS|oCVE9iey|tJR zlrx&amhcjxKwsBJ;CW9OgZ{=#3Ru@SJYOT@ZOS&YSy~WlZGN*HlR_e zed@$mQmT}i%!q@OOCV?7GAVFkH?r{h4Px@^{ca?y6wiw#9rI<};nTQG9QP;y65}5D zzqq~33l)(Ja9V^F8pfbCG12_ZSopC-E^Q-XB9Y1^y#sq|*|v5WC&tT}w%*=ui2}b9 zd3#%~wr_|$tg>5-GMUk0SAV?z*@q25pR(QSS3mlw#_LfkydmSm1lQKc(D-rD_sES* zjS}4ByJ;jo(uP zeCYr!J^6%CD!vq@QAnjfV;6|f)*_jzO?2(*=JoiF)nC`FKPY_vv$gNZHqn{t+4t+} zALhPF$0sn+h@#3@MBAXOOUe9?{*#AV{6W5d&=ajcDaxz{S^bN`tiH|9Y6oVeYWq=R zuK&cBj!<=f8!N@<+*RT`k>>^ym|pgXE=Rb&Rs2rNmzw2M2t~!pp@3b*eWg*Z{JrQI zc9>A0d=0+>#+1J&)D8jcqjn9?5sGJ#47G4V;A=O*ca+CBYxjjSw4?pdcEIa~cBkV% z%Hx-{`$)6D_3c=Ho3`6*JtA~HSbu+N_P5!(&~`7fcCYa5fZH3{`o%@gjU*628aMH@;s-Z|m#X_pSBZgAi#^2)9pBxLPRc z?LztcX}LgC^u>*xjhEawKXFhfzlXMO;kWPcCl(*t%AGqN<7#t$>kv63Z(I1=i(~7q>F2bk+ zpS0p{jgQ{htY42ODz{qrh?_e@JBp7MK5A*V9&fC_HU8kboBgeC$NJl>-KKbM@)37k zqrXk@-Q*+gdcGa@#&5E9Ng);JIzA%L3*{eY<$#Ch1MZ!CIXRBLy85RXou$Y<7=IJF&OIaae=n;)O|HY_Nck`&`ZDTU_>lZaC};dB z@Sz6y8DX*=Dk_!jh&oASI2@x8&V$N!zI_L%i*XUj#ql`#U<)=;+RK-oXyI9u z{t=~7QJzH6`)Rm5t$qV8QU7D%dt8V%zF))DY4sa$iTXwUd(n-pxIpo=?<#`?POJ;D_a(AuWdW>z9yVzlc{?@l+{qdNmbK{!rHpTFo+?{Xq zw<)IApQQ8x5obc!`EjBBO~{oH4n3u`n75))yEqI8W_nf2uFcq; zn1#%Z9vKdd-gbQElKFUOOau?LTKafmHVXhT~RccJJ@yZN0f--;8Ig;7<{;qROt_atk z?rLjynB=y0_(K|d2jmJDDGx~$LI7_?cU7PFz3~g$h{0x+wvEeWy%iMf{Rv;dhxJ~4 z8CXz*w*9~Y8(DA*W6oi)SGJgGW#j^%n{ZD=|6OL({3iCiy*FH3awHtxlbL%TP&v#~ zZy7fPb>|OV?d!DMGJLJx=&_8NoSGNDn%=V)AwIFd)R^}y-87J0q zZAAQLE`o9}C1P=&Vq&ZZ#)fCXtWu6=Lo5=PV1#!MBUoAwVgMoH%_zT!V$@R$3+(4c z{0EyHD5MgEu@Djc&H8^uSIqnmz zpN-`w5$2b2^!jp0At-DzNaEjaT6+@P_nB*7!BIg5S#WamZ_B6GJ|w_N^%AN#;m!b| zzn*ErwN`%;L5cbL;g)*2@I55(6>GC;lu}rpTZ4uBexo&+A8NMde$p(R-m_Nv_s!C& z!+fa@3m*_lsT7C)$KXV{xG`dc!og(xX0`M@2zXAbZ>$!@0#@r)>e;HDv7TQ&D&4Vq zuhNRH;$Lq?SCc}F)qJ(Su&QTjwYGZv>PGq1J*~I3cKj;Sc39<&?V9U{-C?K|rVfb5 zM;Xmu!(e?ybQfEj_2tmOj?oocUkaST;6-T~7ZRJ)o`gz!=Gs?ks0EJxWAkqz6*ksV zN}*7KV$WI|uTe@{|0C;b0a}BW%?T$IVB!^lU)PsoPP=I@Q|nq|PC*{(e`bAc*-(2D z#uhp!zIJ_&_?GfG;P~n$a6k{iRm)m!FYB4EABB?A?@bh1te=H(Y2Uhfd<}Jr)>>ID zKQf&={TdjVp>tVZO2_&jgM^L6Xn?gQ^Ok07#+R&A`FnY@lyN031y|0X|4r+neE%D2 zDM!*T>5L#J&rpl`>|U$eYz-)v0n5$rH(QB~Z8lpE3MJN~+0Vu{bX7LC*?es%Z((hk zJ#Dr^v<+6M*=9ZF!F`rBNCv@sWk#nrF!)}vQ~Y;sC_VXWl;W1CwJj*^W9UcKww=~} zcSGID+t%uSx}ols&!CQMTcO`=tULLxwYsn3yB;y6P6`{wvoh*K{tWCet6xKHZ%ggT z|Ke*OV6-V^V^Z2=^HQ}vPv^CDeJR=2O<`c;Fv?_Y$^8Aa^p~_P+gCe;B-?CD= zyYQt`U!tWSTGy{k#jQegp!_c==XV#{8V{RSkFaunW|s-QV7)M>cQZ8x3Qp>+S79ym7*WowEU##>P^alhcSEw zs9xB#_GIwYYMCYl$bYx_w>ZcEOY3SWrBXPl)Onb~3qI^()X2|ct^TCwO+tOGrJho& za2~yoVv+xE$!+1Y=z!VXQX_E0I8dlpA@~kNjb&TigDycnPOS^d1|!)zt^`K;BS6xD_LkF?ZN%(3}4 zX^a1^Sq^wc*Wh7m#o7aV9~R1WD1|E(-w$p!Alw+Oxyq=++ALq1sy8kui zhxK@sdbTdFQqQjs_BgseuhNcRr@!8gU#}>?Ua#68UAHr}TU#G~{U}vp{Z8v|tsTFP zv>n!QW4q@1@clIBi38#yPKocvt!f*7!jmniC-45%4$d}Fr#?l5UJ?>`#^8>gx>y^7 zVq9s$f+1Eswe1UMT`p-yycS$xUe0`HwyT|PjmGWLAW}ZN(&hSa{TxOQyhAWvCgEvF z!z@6ZXb}Yy&M(Y6uuQUJ=k?n%fop%A9pAFGJQ4_WdVhUwFk|bvfD81TKbxB$a7>I? zE?%5FfQ#6|?jg;{gll-VWA=g`VH&3ZCxklgnCX9ha%$<1JCHu~*?N{urG%sMB7U<2 zAbJyyp{WxiT=?K31HUP_-;@g6V&dTP(&E9yj*-!&(b1jcP=0sy?z^kI@*n?b-ykW} zzcSGKagZ@Z+vh>vQps1ajBUa(^+A{)GNOLbcF|5|30ZSKfTxDwEXUteH(mW2FYowh ziH!%}h-QO0>b!|ah!Y5BAuGZpSzrXX6Baz;mUZNhg>E#AV8v<;Gb4r;m+i$51 zd4?7z#wLG6<1OZf0%Dp@&yjSC|0SkJ)K`T@(q`4C3dy_ooRd}bUa{*j!Xpoc(8UcE&l;W{~4Fdocm?or&W zYEJ)w|IgDe;em|oe>(m9)=$4bd(NKMH2wF#+VoX-EADAd|NnCJL72Q_25(gYiCX`6 ztN#UevY6Cc+a#a>hgJX9|IzB}vsiQ)7GI*V=)Fqgy4C;xJ^laH>OZi4`nlJ-`s;{) zoJJ6}g~Pg6yr_i?7C&j4UPWfYT>_ z;C~A*qq|pycQetl0p8!d8oW%3NLK&jzmMNDiiuZ+cQaYA0p4}^-AMN>_$`b7TlBCQ zynh|Pn=$Wy2VR~}SHH>ddp0t+UZIElDatwQ@GCy8#WQF@wjHM}cpli; z;v~{MqL1Z9AJxU^mmPVRe|0@awuvyKJ6H_SRHz~GTOH?xc90at!6@@%`S8%MoJNt!k$Tn zr#uir{Ar7d1$O$8u56|H_{P$`o0jguFQyDa@#BjqKX4*CG&t13StjQ~zdlI+i~=H+rHwx@9i^p0~Xg z$skPRf&Z(C@H^9MnaF06;!G2H4I<-zvm%?ZBClV*mWga8Le4ai*C0#&uP5@_S7bBU z@;{o0pbYT*L=nklJbfi*4d(X!AOL6F0v~o0B!x4-vguo1J_=Ue?AB zq4xpUpQRG`l<A7``9IOik=8Dd@h+)HBl?3cfPJDO(E^e@~g8u>$b$Wk%3m5j|(8_sY1 z6AzgzY!fx6d_g_pt9f7Y zR>SUUm^h{?c+k>kHR1Mqq)kyvdnR(9p6IH7IuLj1+@3b^NSh3o@DBl?X8@230P(Vz z4~&ApacHl2@FZL+BY{Y=P4c4gcM6Z;2d1ZE2QHgXUh&i|lZo(4GoL)@Dm!L|WWg$0c*Yw2^UU@_G6J5^%OK^Lk zVqu-cujeA8lle>{@6081)^Www```G+kM8kxMbq6b zx82$`fP^fj!k)p!^Gf5pwoK0&1Gc@#5*!Iw9AQJyVX%NlV2kJW0_JZ1i8OD|5DxD= z88A?(ok7?o`6e{oqZKw0`dnJW8ChNd#zp$_Sll3!>2)f*+-S%-{87D3mZ{X{8LWx)MXN*yK5b6H2Fc_WJ#0@{7V;#g&SLYe6O)bll%@f8y}C3qpVsS>QT0j5T-A zrwt7%XYn1IQC@^ss?>HuL2pdZ&pca*yLTaFHC`xAUx=W>3%!+5eVZcE>GdZ~+pP&t zAm_B0>PL*WZpHBBbG?UR6BDsRy>pij7i!U*Wg<`uzw@2(nkTi~-*+e$JJh%D0O-&F zWWN)F0(^(3F{fi$Mhcs}d`8sVy@r6f6jU2!Hci-GoQOzdGGbmf1T2=gLuCiQnewAy zxuX7J_|PSN+ea8%R&F!rrd3s#I}({*3{PacjL43(?g@~ zEiWleQmu|~=KRvgbGt6>e%p0jdxpbSOQ!16h&g@Gs|w4>(1FDxhYlRL)oyDM^HM72 zp|{cpo{w@rgkQ)sR+j3ZFO#nTaGsl~v4OIf@C-zXwDf+s4GH3^Jo&o8;fp8Yvo42g z$XytXNQtceCvjx7*fHvH4J)db?>%^BRi_?TY67F>@!CwppqkQX0R_DV%u;$1J;_F; z|GozFWP*5wHwy2J0$GI@RThMj(=Qx-*R6#-qF$RoEXR*x@zab6$4g_ZoK1Gl1c9vICl8Jf&1*#8p^KMkh5MVoPBxQA&;ik z6PE&~lTSY`oK^WvlpG_+aA}#QGhYL>k?#UT(hP~$3`77H0+Cc=!|_zFuN=wsFZBmg z<~<$du5dXMPGk_i+-Z%!M7~n&bvX;+WL_qg*2=wu%J#b-O((LMSUMCA>5}nNO2pI@ zsjxk~LG)v64?gOYM!7jEBz=NSmM%X3#+B|+egxX8AY=zwaQJNMyH!R#ay`h@8kf&- zuf}4NYo#(%{h<$7ue;THbUKh>VI;$_;B3+!! zjm0I`UMoqAWpiT*$t{omQQBMS?3GHq$dlM3#Y&|y+J0Q8nW(zcSgFRw!)R(P|05PB z9Ue+eZI6w0ICDlZM^-WgWCcqbb1#unWjwTFzBm!ps1-@)!Y6ua{XMnreOjd50xR50 zy19K6A(g*^kbBn<(tDgDgc6}n^gMz_YXKmf?OJK@fmp|kMkhB&<=&U#fo=U7gM@U6 zr4);z+wcbK=M5}Y{-;>HjmKg_d}b_y@4c&U6n&nHfbTtw@1tD5=yOQA*+w78Q6p{? z_BXCy^-;ygp}72PbuX?rJ+xNFY8`uO*?SZpSA7(-bwf~n61?tZvu&y!cp%2R+qLYk z52uIRp3zisDkZM}iO6KLQ|=L`-8~oE^16YM%M@D8l*$mE=^o!YrBjTl4V{-C+;e3O zL&V`r2lpHng=!P4`|MsmA07+Clo z$pQ2LJ0g0dM~8cv`i`E-O{|=`J)!&ytQ-)KgKO<^m3rT1?NQFRkD>iL5xEZiUm)US zxHb~8>%X<~lhe&|(9b&%0q=K+UET(wbz_R`q!?|yt^|V=T7D;^3+F^0H@aLj3-Pb% zPm|Nhtx&TOlD_i!hZ{dJSD|lc9oreqG42w;b{R)6t3>=&EbNbXN64*+KF?qf8QJ(Z z!HCUwi(Z6U^s-IpWre&G7hh7=3lUjYKSrL$>rm>Wn&$ZP3e{GkMQF#cVNm^;H(&CW zcO-VYCBAhwWObCf<3mxgJv)+GE{>;6k%5KG;8JS5w|MwqW_sy(!Dg|=?EO_=S3asD z$LjxNsrC+dJGYjd;ofLxt@rX>z+Y+gCGsry9ULrJK4-jig<`-D#Akrxf5*jCv;0Ai z)8+BF5TRc9Nn(xPQizxA@w(mIyxW7MgKl^I0T13Q;uoMPPkJ~xxgLYEM8cfBo*>tc zA)Nrc(%TTy_C|yXVBvQQ!YfLt^lwMz zbs5r?x1PP1Te(y5b`{=gU&Ngdy_x$rHm$Yzk{ifjm)Yf_2|n**lmMttI2!p1f8*`1%zlv;CuVqEHrnp&CZ?gL3}mj2l2RFE|=TsqERru4v62) zLo8YK!qNEz@5vR<*8RhQ_8s|YLE{s`P9r0tJf3RSKC4X|1Y@JB_jUws`I zAR>A__2Lt~zD|8EIOI4uAE9{fhx;+MD5F`1{Z!bXKtsrafgo$mK$Fll51d^MIh}<- zwy%^)Enl-Y><@%Pfq?jadym(c@_AF%LMEBzoT`HRts$Qep(lJHV3DRddPw}R$cHi3 z!bl1+426W8R8^qlI_YqSeKd?AQVb?Kv>KUOCNs1nu=k?N8HqkiDu_QAiEq_wInK?A zeKc+1ySbyHoopHCa$^q@UTQZXr+puOa;((VQ_&`}k+9CIQG3M^xBH25HeXOD6Tuk5 z>`CdKon1XnK7}p9O%WoTQd+fH;aoy{qZXvx9uC_b zp*@XX$bg$%UOM%*u*VYyw!bF)#4OM``3M}?SrpAm1czx}oxz)Cy1X(CqNg=P1`5tr z=z43(oY`ZUwMIO>`Eb@D7ss8!pwk`-eJNV&&-e=|o4@9d1h=Ka-90f+)E{zu+ZWIv$}R8pqT{C;2}tm>5W;CiDZYbH?yrU;6>%^yWiT| zed~K^kAO@~jI^n-LcIrqX)cDA>8<%e+H(4?xAfI+c{f^m(Ne;0Tc(%)R@TTHjmlnnp{V=>24n+(D&fB^tICLqrpLf9bIj%-ubRtNyIGz(j?ezG6p| zt)Nj>LW~W%Q8do*77Jo*ScHQw_7y2P(og?K;)!in%;U*LZ2WEKAG>4AsW0cxo|`|C zKmW4%v-3I0!(t10d%dvjrv1gzzBg?<@&4Vr{{Fn3*N%=}yYr@Zja48n``32YTC#J!KDhj+1}+sk6gj9vtkP zj#bZ=_au^L+g81;^imV>M2|nvn~3$49r2MKPo!HnJnYH2t%+RFJ-Wys|CrY@B|u(S z#46L%aS0lV1@@LKgFVWgmhjg=yclSMrh-!~wIRTBX3dyjvXJ8w`;dz=Inm`GDEn%a zvHr@g`bU=^guc7<#77rryE~WX#ueEpxyBr|>jR}wu2-X)%$G*}KNG+37aK|Eld1e5 z0@EfI_VjMsDZt}|T%|#n;B$==I}Jv{8#Sdey`IS@w(epi(*a0PK~^n{t0cO@Xlj1@ zj`tp#yRavbu1rSA;+2DDORqb*^Y3x8pRh(O)1BShEBg8ta!Tzl#N6T7_QCo$#-$yD zQF}m{H}u4ZX;uX4O2b`&$3<{REHsYJR`!m_!%Uh%dd7#*g}ypsiXD>b?(Dy8ThE>` z>u!s|m(BR>)}!`-FO&7TO}(mk(OaF1lOIi;+l55;hwUz{A=Xjo@`t)@wqCbAo5>a3 zp0s6HV^D<0%XJSxSO5rV?k`k#{Hq|aV+l+d*yKbKJpcOqQaL?2F*8>f4xAP~FVzDZPB+5m^_)-~-&fc*ZVM$>dV59@ zG%uV_TJ^DfZ@3vWFYR-t6IN?wsta*Q02+O(@HLPK$d#T&u>?pQ%0sp$Al3{^YXahx zl@rVJ{ndVFdFYG*MlMp!PWJCWf~G>r7R{bH#7J@mnF6uh*vU=Y*F{e3BfKmEdKwza znt6*z^W)LEId9ov?~EKfr*LpQIOw#QOWb{l>GJG~LY8TlUwUZZKt-+UXs3tuK1BH# zgczio4!sg!is9uoBL3oMK7*cm8k;opb_LG-qPneJGBb9@Lg9j>?9-Kextoixf ziD~QzGUDYYyi3^^f}GA^L2EMW4k+XWdvJyCr{1E%C;9?X0i_k%GjM>)uQY zuBHVz4sa40#bl`d_`ZE_-XYh?<=Xb2uKy<{mqAFU_i;1=6prXd#QdpP&+fYDqOLAZ zy}ka#wr!L~IknJ)Hb5<^AVNIE&gr-#FxGa727nmq2)H4SLi5a3Y030VNv6C>CI#{) zh}GvwA?wQ{t-Zfv$fONsAw%6W^Ib8&BX2fX2Yj)TT3@-RC*ya;I&TlB#P^1|BjNs} zzgkf$(@I4kVD{)uNnftWai*wOqll_>$OPj05Et+`?Hy_N8#AeR9>61#71@btYXw}> zz(m;08a6xO=Ak8*Mdi-QmWbDv9o!;KcBGSwv&mFAx|7mRFzxkAIY}@SFD0!mm+i>g z%vP&;85pgAY|lmL;{eM&fN2X3Uvwbcs0h*)goIVb%RQQZvB_UIs%)}0gHo&Gh*(>U z56p%JlJTNeqKZc^?o1}SGU*KW%Qif4mS~LuQ%GTQZQEAa5_X#6)((A6knwy*_BSGzx?S>6Z^Jp+ZJ3Vxwrl58)LtXCr$2DXQ!ezFkJ2G6Tb|i4v8M* z?!?$yj9dYoh{70s(*T)&9UAVuXt=1;D)enqQ@!$6KzlGA9oCn1S}~X6+AjF(VE&4` z3t%Qio$!4c0hrKf!F&7>h?x!Y4LU7mYiL& zK*F4f_QA2F{?j#te%oVGYxO?EU)l|FAafnq*-Y4O2^f?P?ame)zhqR)H4da^qEi((tp`4OhZs>x5uW-JO~`qG$@>6shy}T&bb&2q6O=ccYd6p* zxxk;pvsPUp-ap%M%ff0>){bRk2fOc zm?ymvIcvaabxJUi?XzdZQVWzjH$#^n=-L9&Z-r%-M)z+RDFm9sp#hsRm1ba?kEBPU z$u0R{ks2zBRqj87{T<2pMN^ttDqu_oQ?j?OkfF; znUQH@*KHM*O>Ox*1H(bDF=U;b>6(tj=c~P4-QDqQF7GmSl!DxmT-586b7CZijdjH* z3&kz*j$QQeiL3JGq>G?}&nrwspSHf<_U#lS8GL@F*Mgj;k z4aZ9E#^dmIgUVnJ$D%1?b+Ovhjp8nFw;-jd2@(!maMuDSQtuO1myC~_)wHlddJ zuy{+e)4ObTg-@BpHr!w9?z85is==y&h-*MxxF>7@)y&h7u=8)g2-TGUJ=v)?!N~_p zK+zK`I@aSStM_UG0z?|kEKubv$JXOYEUrcpfB_MD$ypG(xN_k`m9D8Gu#Gm2fmoK( z`8VGT6;j_7=jJig<2MmXFke%#qv#!6>0#c z4>}t~48&M-U8+jtcB7p0dso=VM6M1dt4Oq`^M0xz0T2=55Pubb;KH=hLMwFY>qIOy z7K6E@X^mZmT(TxpHd_b^zngP8YxFj$B*wK_LQf_hti^@jA4q&InnGe1rUTv%gyV!u z)8b(o1wBudO(P3kWI>QLjV!;7^tq~4->|PUtqlhPS;u(I+i64g5PLAJkNN{?`!-@% ztBmA}^((bHyG3O*s#LasBi^A>B-)i`BzD%Tlqkqhc}iF3JOCkYt`F7uqLpB!`sc@< zSpCO;MEw`31{Zu8Lgvpn68r~R8(1Pc1gsV=GiX{yii;=^#KfM-vey|4dL!)yX?1vb z&Z^R>6guMlXvk@cO55J|tK>)jL#8pPWXg7^p)|AJ2={u{EAD!Yui9?~G!)byaiRC9 z+#stgEzO{JwL-V+{^!ZQE`EUI>yllEgaJNW|5l1D0r-=mPY@A+_ps27rw`KHFEK4K z&;N8f$9?g5JfJelt3yLpx5A*1c~zxUSg*Gt{x-3HD&+DazRCOk;QxdRW^SZCERa!T zhS4dUEG{l+`W+Y)=ff6K!U7AL7iNQarTjMeizw5q3ec=#kz1dwR*CV}iKXQ91`P`9 z5xqk)GytuME}-ZJVE~-QH&yOhhmcWaswILq5eF(pV>J-X(lOukG#&G%(QTo@J4+o^ zn@ed>$UVPc3S8Ld@M=RR>c67HpAdJJkc#qPF*DHXMwrZm1o@EII&R^9i{pfd1hLgn ztrFpC;T%Wlm}h5r-)!lbYS&31KibE7?=)5mTAN&IR(iq;Bk_LHmNIE`_D_%#9Tm2t zc%0Ndj8X{gS&cIpe3F_66&x!;tZPJvQ}LOGy)YN?M(r`{vBwy>=zn!aD7em`%NjKX z?2=?sprQI_&Hz}5D9K^&bx?Qw)J()*Kl zTf*RoxJ~AzE!LF59&sBj^;cx=x2fFvQufPo*=MCO)Mihwm@ zu0^a-%_n8@{w_-dKV^uX&Q5dm)a}6C5fh+TXlAyctXX1`lbI!26{M#;MdMHZ;r;Lb zho2ft-tcF_mur^e>6149my=#68*Tm zayn=Fm(ETF2h+KHDljt>iRE+YLAtk7w}u@U+=5-6W~yF08!$>kZX77%REKB?BN$L{ z8ZIUJW#6WYDOy7m2sqo^AqRH`AELrS#w4JFV!8h=tE24 zHMX!H6`)bb{*Ar9w+cyP1n;Rz9cQ05!b6ZWU=B!{Y;@yb{4Od6a_BzZ+&-X)wu(1+ z@6$WIf2Uoyn*hAq=1`j26=r?1Gb7{lCGH4^@bY5J;@fVwM2tgGyhcvc98qATgiYXE z7y#~2YXi{qU(nP3R_#;DJUiq(L9Y?EceBG@_B3E&>^?Mm$%7f$;pf(uhr`khGL%MY~^se z6eu}k17=s>cN{^B)7fEG#fd#$`$xNZcq0C3x7)7Q#cWVLm9mtyy{B7kQD`kOzbB%% z+Kp}`A5ogj8Usaw0yBCRum_Q2gGn-Iy6~W-NiG528o0upN{|N=;e~+p< zl}k%^esiw5^Ka=Vsb~Iaj%Vd~?7aJn5f$#OY99%S^VFSHL9~!kb6uNf5#+h+3(kKQRg-4Z6`62J` zp~VR*U5B_$pNcY42sib-`e!BFiy#atL!eK74@-{d8CXrhI^9g9LiHJw<%24hygi_8 zjCRQTX~uTwmy9qPtAB>|MYqDUxP$CHbIY!Z8~`oHIWj0$OOb|JYiOUFx~6-pLQTY+ zQkK>QxP$aaMr`(9lEH5|!tLs$>AFln*u0D2P2AfOICqz5s(Vs=L-neGojbUFkKb^^ z<9FPFW^xQK0fKqyLX}?`-Cpnk)s7o?Lp1o?l|v)eLSk&JTB`+%u4vqvH<_(9?w37f zXJ^5bP3_;Gno@?d?qFD_j_M5PTaUig=o`9Hi(sLOZ_5z;{p-5|H6$6zTjNn&Sk!9O zv9UzK>h0!!Y0yR0x^U2)4J)VU5Lr{9(-|tbK;HDKfEw$yxY)wAF1;a!AZS?X>2)py z2ft-tn-*jRT99w%_Kflt`;k4l7L)x2R=v(<)9J0`<-vm$-f)ljd=1Ne)nYJMEHr7K zXgfsaP1pdS$w2Jsw-+$eFV;ID4NybOtOjq`X&wDE73g2w&+kfhCGWWhf8B-AG9bKv$1R2y+ZSE27H+0n55mC}#4R)3mJ(DxRXS=7 z>qfRTC)hvL+;Z;6bNGueEsL2=O)vT_{8o-Ie&bCZ4LnAmiwQi|Ji|0{1YvMCF5Ioe zvALiYn`ykFjs$ACvCcrJ-DJw!L*Za5TC_(;I{N!FvA|Hj_qSsMDuoJ8Wm=o5U6Tw% z;!LXP4SKUu;fT2d9k!I;;}4AFVPDp+>cn|?=i8tS6-7Jf6&~a)Ms1a{6qkC!z!u^a zTCMB;C0;xJHB3D)^fYcn;kyhXI=-?JpQ%LptX5OWnMywK1lfjPjIOpR%UB>XWV~kG zzrwZvJZcT@NLNp7)V(~WX)_f11A|LRZy)()+~XZtjM+3JDr>DTI9yM0cc`rG(uCE* z%Ghsud7f0$_S-v5`1v`NI1*pp~DexwsD05|P zRRrimUaAQ&WsL=mWGoON+mBv!@zKgQmxOS$BVC6hk-fF8=M+a(ZJxy#qBIyHwb@D2NOJ0qUpL~M9>=IB9J)%@0*53fq@g}$>r~+o^I5czv- z7;WI4{gzYmFO>dF3O{{R;q}OkMarW1`o9p-*#t+ep) z3pN<;HBQCCjW=EzlpFL$o&C+L^@mREb7nn`tf#$w{IlcxKA_auG$xfni_{qE2@Jzw zu|(W?0NYQK9JH-boN!8Hd41?9k+;UnC^V%OPA0b&x4YfT#oAiE3 zqir$)1E=6}NnHSNGlS!nASD3-SSCylT*BlDiw!~#dPu(08W9sGzkkTp?7)aS7dF4Y z{u2Qs1wz+&lWh?BMW z9>QL7x-zffUTUm>5vy_ETJniyJ{`pi^{)$<$0`goQcjTiDLG9+f$8Zm;xp_!n@M?nf(p2otZ{XFht=zT&wDaqQ$npN+E~Ih-ynBN-ZmkY1p*7hr+$*l z$Y{nqBvj)(iQr&qu57XcUSM=%ejbT5G*L;Yms{OcdJsI z_NYUO6Ovqn8&pi4-5=9Eq#%RD0*lhKCXzP`wrxmeT*t|nRssTelqOS448^-9ho|#3 zr?1=QauQ>bVP-r@Q_%rc5)vFQciU>&boFMdORLfAjNF^0Z9IzVU!*zbhDkX`@BJ(F zUy_#qk_smfQCsu52@du$Tn|!i;aP$0d(1Urw;S@Tk75u z^!kU(`98PXZOT%z;f0|MRyCwzg?3nBhFAWuER)%v`R>^tUVEhX8x zM}!oJUlTGj&W^qnnHl{|_QkdoI!FCIzpv+MHlLRCK0oOHFG*?N#Mtp3l4)i{1m(Sq zym#B#WNEx~DqNcP21vq0CyNBbP2p&Ps}!g%h~U6$^6`C*sg#ye_F`pilUP1_^a?>F zHnT{M{|(I|N#c$Dg6Qg(jn}_TE@;R>wpr-7Rgj*6kzOlA8_^FrNChAKqBd$Q+|3QB z7=piZW|d?E8vm-^poTkg{q@oM?e;UQ7egWm@&Go05DAQmrNQQ~I?1IYcn$!_b|a*~Rd`uD{j1ILwN*uk@qH40iA^RLR1_3jEA zwI%MM4bZ(NaYEkGl7aP3wQ5df^7Q30HD}K=n@E!{OVUgIBl`;9Y6_G3J>GI?Y|vqo zvcTmMBm$x-HGc@SQ@>BDX0G39sj0S_=wtdM--$>w*1TVYUqkbKZ1z7CUMtl_qXDUb@Yt>`OiC6J6cI;czXvp#z zosB6YiQ(gT3Rhq~)Z(-69z7m>fhHKA^0cXd{XGrz)E=uXBl zzLfL~9P?mhz_vZeVOW;-L!33P?>mFk7mGms~HDs3p)pH6~2(bEKzrxW_}X%x?fW8sG`;TxK1{O2iep<$U(ajk@^C6Wc6P0)zm_Ow^R^0f>8#SXD$E4Y5oKLbj)r| zo9xz{&6nOyX=vucvbN8~bF@9{+pGqQT_ z>IYXpM&WA1llS@vIZ}VuG)|JMW8BlLkBWQgU3jZq>@mN^>hoDGezC+B2-xtafo}lI z<2$P2@hwx`A*K^tU0tSlXOp~@P4W&xO$!8e{~&o7>k(}ls9R{U!KY9o8N%r$0C_k% zmP^l%2ZsE!`A~#hk0uJ?5}# zT~TkizwgYzYF-wA#oci$u$q?{up9suaT5SG#4M(itE^0w;q~~n%L+)Daz#e7JhoY7 zQEuYMygjhJYvsh{dp&uJ)Y4%cni}m4_T+Tx`gz<${rV54KSSy73wF0>@9gg7HbgjS zD_6@UOW2emvtv(vH}N7}9$|FYZs}8m3KomJRv5OD1NFZpe|!yqjEzxHo(CvG2 zD8)jN2cncLN3y?5=}+jA^xhdNE!@I^5$Xccd>6EK7fq1^G<~FN*!`vJ zNbSh{myo7B5wfTp7Pmj<@+4F8q2)>L($sYJ)}M`yoqF!iVZYlBuP~KKd3|S>+v@VR z4YUo_s$D!2bAN+%2wn>o{6gp;Pp{Tsu+iHUuN5oJ#%)2k5A(pR5mx7)HZHML@ys8l9|b$kZU%V15K!3?0+ zfKtpj^a=KM?2rPwunP$fa_QXQnZ|Ef0e*&2hEl$W8Fla-XPv88xo7GZjJU?;B0q4Ky*=Hk*vA1?? zyjTmngB_Y4(`;wwH`)XdR3U>~oj@6|Q?NPXri6Db!CGOM$lER1sq(HJ!RyAx?yuBp z{Zd6SFi2gwJ`Wrl0TMWf2HW`j{5*H!)EyA?wBkQmg$%!;N{m0`?)mxe@l9AW!m{f4 z(G0{Mh7jhFURVeJdV2=csUmRY%sgy6B z+f%D1pI0fJ6S=OgrLnQUbvTScm0Yo9AT=5rDh^gUV_`q;%yIT!g|bTL0HY}5{Qn*# zaq_KtlGp;Hu3+cb#5MKnxZHtfgYf%z_XoCbjV+8Wyt$GqU(gG1@G?=UY_|_|+iY7#vpt^Ibsil* z=K?R5`k|5S1KX5@q~q>DB6HI z=PZ7$SEsYu4Jl7?r1QD4rmjNOFkV-Ah&)199dhzP$jQU(RsA~2*ue|L33X>W-KiGO ztxQg?SVjwlQ3%)1ayN^D5Uyex1cYEa3$OdM{xq4Xf0XRd?;aW1t)Ea85{Uw`;PwA_ zuD^fISc=6EGOfNxP?FGtn8l9bl_aVanZ53i!<;f$%w>D3C!2I|M~1d0b?q|b+p_l^ z-`<=K)gJljJR+!Gcr3GeA0VUevYD<$?OF&QM#BM7ny@~kviar&%92 zg~~}icO+Xfi_P7g_FzmW2`B~Nee z%Koe3WrwHaPYruB-W{IQ)~?j-a_4RNw`Rusg8r;C=;;b%8RXv+8yNfjgl9kUIT3vx zT!vTTzrlMD4_G#rzf61yZ|C^YsocFrZIH_pst9<<=P_AIzWxK9{R1$P2Ko}YUbR}| z)k??SSaBJHMqi{O+whZ$aIE|E`klabKqNWhY^;0dG2UaB~?p1yA9$oAl9K2WQ;Rqkr1GaArZ;WvUUT}!pydO&4&AuF0bAw0c>R+Tf8G8ITyT=x#J${JqvF?NB!8$z)oyMqT zbED*H$}K??pj5mKfs@!#JIz}>%w!#xQCy3f+A}5 zLb?&*4Fq%!-qWeDVRy#%+!WtXt=J+nKBlt$ZNcQ!%+2+8a{eRFrs8(vn}gv}&&WjO z?8(^7mE+xq`i8ehTSYiZ^ zBUYzZC8FzBpThxCB;&7k>6qAIWFJ$zwdJ`j9bJiPIij&EQ=Hg8)gP4_fvBH{%EfX*2~&x~qH0E132Guaz_imuiv?t%}!5D0>A1VC<&0 z2v&p^6O9VadwAoZb=T~!yk}zS%KGEvl|xifG1$xA@Up)okgobVd9>I}0Zn^*urD#Y1zrpht22>{YzY@Ldvi{1xQ(EsD@ zI{@n{%l_{LHr}WiTE3O1a39Q9vDQOjUa-#kwdcs4#=SdtoQyMxni`|Gm}#d zYWk7^k5Wn~u|L1l(Q7G>m(SaH($1*Q)M+g<0K{Q!dRP^-OTe5U7HZa7&Iva1JSQY<%42rizq1-w#1H-jacFMHq4xla06@(BW|cKI-{*QE8LS| z)_j8aH{D8hFbf|@4V3abX8g7A_70DYTlKdY?-y#Q`E8m(f3A?+ze9KGX=a_Xq$$t9 zqGOf8m%^t(y@60?SOtj@_!A>zgaA^fpaPuLbHGXHw9WfDSWfe$^urQWPoOsD4ffi6 zez&bd$sd;}BYAsbZQ_)z`jAp6_fdteLMS?-X`-)yZ+d>)rn62BB)7(b_Q7y46mYrd zKm5v|G|N20xrq$|LBBwdipOFxdyHWC1CCA^h8lu&q%jySqiThW8H02LUMKEwQ4B8V zp%4#&BZPU0&pfmYz>y(ZMIzB)Znp*`Sn#+>%BN_SI~1{W))%fRNl%+HVVm4;7p4b2W^>tL3l4^(lTN+S zW+hv^DZM$P7BgBAnC75TM0c4{GynYj-g3v5Mg!~wZ5Kuu^fC_4Y)A4Dz zHXEG|1C)XF!u&mq&juMzi|0cDP7O3{ih-%Z8fBjPo?=TIb`mz4bdS++ndt5Gv)lG= z8;TDY-14L|lAhd1Xb0E2MoO}BHg2)TEP7qHuumop`z&Eg>qtvvJU2e0BF=VP1=D#V zf7#kKYhC6JtvMITZAslSQgRgntzB(FryVTrE}7~N4qeg+TCBgQscngE8gupW`1CIN z8s6!UKB)wwpaAn(W*#UCaQJ!PQxEf?XRBj_1#2f|5j*sDPrl>TOxe&GlSExsjS4cO z6u?B1HlvAhYMOdmM!G9q68abR4ISk!jXo+-d93cN`J7zX6fz5P%{r|{B@!juWjE{P zE~Ui=rCiFPk)E6}jurG9aJTXvuz#VpM~?IpFc*_p#>rX=?)9i25_DYH4I;m}a~$$@ z+U;qVXiReI29>>?pSzD;@CdsBNT7hMJjW_*vh)?TC+==;(kMUnZ+2~q>{_F;{kc5( za-Ab;yiG^s2{aDYnBsVXv*7DJ9?;)sj*e3jshU%(u4p7dmo;M7>ASk(HMeV|Xv=n} z8IrE2ZLmeSfO$kKFwZ;otlbonS!H^;Q74j>B&wSoIh!YI6O>4eMQ+rKWhI&NhX#cU zdPvk6N}J|20YmNQU5FXV1M&kqRx= zWQTHOsG4clVP)auH{)%uvit{#8`u<#NJfVppf#MK!Yb?r1R9|Y$zBQO_$b(?7n`lzm#$50(OZ;m8ym!!{N|)GEm8z5v$&D z2mM?ulBT1~`R>a6HOQ^nj&JRK{AWBF=VS{-p0b6tkubXRUFstqG_oi}$TngYnU zCm9(>egb4V<0Nc{sp0Su7#@x2E2w)U$sJJiLd=doZ&HFILmBM)^U3WGKL0$@#2mz` z&;jE5GPWuILFV9f-UV(9i#wvlVYM7uI-v)@{ug?!$_Jk)tBqOn;MQ;;RCD@`9nrvu zReS-w%tJqHFld|smDMRBo13Fk9hsBBkslAcG8UOM{u@rG;_reRhMJ2Y-2)%vutLz@ zWNzp9w~Um+2gL?U|5o7;SZw)lh^GHy8~NH9+g%|Y?Ck-m4XJZGHyCh~p+4SPr5%f*{6$6k=l zhD=}BYh-T=!R-T#582$vtY*v=*0ae#a|*1pnd3XZwTOGc07q8#9?M9oT`Ur{85P-@ zp3Yk;hJkI)T*Z{zHes*&X1X%PoKF{~>W1t4YAs0)HwmLglcarOINs%!Mz#(aHjO0% zVXs64(*wt*NetN0;z-y%OmK<)`xBP@{ayUe!a1Lty9uVFz>&^t@bcWnT&p>^4NVif zN(}uT6qGv5_wHqbS#X#a{JVSS{~ce%cfmF=5!Dx%20J2o(ZQ$+XoeA${BKg1`u+Ga0PX_Y`XOqt%sT`*xQ3Andbm$sRT|N2? z-SQZF3;sTXpJMkfL!7J!R@a54hI~0)vipLru)?Y#%*zF{V^!xe z(QMMcG!jJccFny^+yN2*#T(i65qix0x}XKmF~xL11eQg|j}c&LLJ0Okv3M%cyT&h3 zDn=wyk$a-{adQC9xGRvYg(gPqz2tspcO<_yIGS{(f<8(Y)jA=_BcUu&w`r5g6Eyie zUYEV7j_5}_JYAkTC%Kkz<_j$60y_dHA&y}<@P&r3Xblb{N=ZdWk&TMt`Y5b`*o+S$ z@%wS5ZZy&{85|{R-}$>XVhfJz;A)N8XWuett-+bD@6~EQ2xJT~dy)}O2;u~v8q#x! zm0c~?MZvPl2CJlD&@kdjg|XtTP56RUo6qNT!(wU<(B^b}6@tihjNfW3NekY8>3L^qjQV9|#p?+}u zJ6JO8VX*OEAh_B>IK`k#$#eUMJu$MVHYr1helA zv=Ev8>G6qRPbK1lENX+UO8*Z(zR@meZ}(Ze9<5%c@0)mDWV5uErBRuPF{rD3H|1O0 zNsC0G9F(gqgB30Po4!g%S<)%=I4x#yQ{*Z_Q{!uNdWl7Dwnfcar<^Y{$}8e%TCI1~ zD7Z|7eusVwxI%%75Wrf5!@SUxxfCASU*xKx?&6T3OXzX9z!kzq$y>yo zm<>1&wi&sw=qz~ZjsmO>LRToH1PG&5)C$*QlE&JoFF(4^qf;AohPW=COG-r{`fuIlQ@(8#Xin zzSuZ#$Kkh>I_&l>w=#7+9Pt6WZp0C`Im&IS+2dn2_1RVnyQyP_E?4jH#JIgD zc9DppniNSdsVffnlfL7E24B_Z8+1E{D|-m{PRYPEF?~>}H@YkW$$-z1mIBHl)#e=D zZoN=#m5A)sKF^bICx~1kl@Ce9fCeHT7fyo*@?~BmPr)%jR(pc_otG8p7`Pd2p~Z zS6!T)fb0Tt6alrfPlU2AlQF0hMc2Bj$#GkIW^Ftcvb#Hy?W4yHR?{Pa#QF}AeBK1R z+;2Bo3>J0Z_;|4I1beJGHr0{saOfSjrb=^fCEFcZ)6u=NDi<~hV5}o^Um<=AV^#5b zKx#8Ec_So8DbYwd4nQ_GvPc$`Ea2!B_WxmG{|n)g-N*R~8mT^J%y(x3SE|fyZGvX2 z(dmu!dAheI4XHI5ZCKqZ^H6=gt_~aJ);L8D4bdkH7ChBKQA>AAYsl}4x6yw8q|Yid zNc5JV$rjXvC(^D`SlmK$dBrQ>Vr$xSYg!)SGw?fGP_YjEPEQx*FDjJrFd zltZLp=lHKodPi_mU%S7<<%_^|MOIN(QSqh9Yipysw2nej8#JbgB0fJPTxEU}@emA( zLSZ!}XSjlgP#>C5slmF0IsUBZZDi|>mWgO?(BV_k#2{bozW=1OhrKJi5Dbv4%ETZi`-gfYCkZnY!5%)OP(MDoCgG3%4-e%m+I zwWn)vU#WU}x3G!+HMx%dd2}FzbESD-fA2b9d~3CPLs;;!+U#!)xnOiy zYb>DP1x%@D?q9@rVcik5ps7RUpcOfZz??etV_kmS-aQ?xWUQSIwS730Ul*^PS+k~X z4yz-qP_M9;b9&xYz63RPM9Z1Lr$>RB z-JmPYTx`^tvm5Y_i$XPIV)nm@FY67-og=cD(STz*72YuxpQv^k`z@Wlp-4w83NS>w zI%|*g2L=5t!MHOke%3z~ADyxGoi%0NdPX81i}pf9kj{b?Bm>75>|;LmcW@@bVzlhb z`5haA9p3(-Kq_T-7~@pP)Eli1Y^2|E)#9mW(d2QMoLWuBWF9S4AhTd@19=OiDeOX1 zJy7Na+X>eKku<1c|rk_D>o5 zA_Hq9xuP!^c3Dyi+O)bQr(d(!*Y+njg;SPpZ#ZDm5}#S!Hr!ADop%Xr1H=?T6R=ux z{$RloK-@@`Ts;GkP+aX)Ydk75mA3XzY#i;`wZ={VeQdMe?VwB&k+>|E4wt(6bEl4@ z1*hL?TyQag7o4Ph^jmXZpL-n^9Cm);k_#7Zz~9Q-t@RDqS*&bvP{Gl7d^DhSZ27EP z-=(+N^spUgSyf$nl}g{Gva)g_4?E*TXSqQi;CUbwJTE$!OvwDsF@t$JlbKGQvB4Nq z3)BI9wm+YZjqBU!^GKYf{S%qZ4h7sZQ_X@th$kgNnUE_+4B~hrL{XlF&!OunU_Onl z{-MYemJXN!jxoAO0s_d;g1_OH_t|GJ*Sp<%_(iC=KeTWnX#(D=#uyaNA!W1$cQ!%K zF|wHH6asz9k{@H}WQw;LV&X!V}^7HQ?EXeQn%tPXnDX6u5vllH;so zK^_?!dxblU)F?w%ZQ6wX5B>0vS*3!$)+#gcDi;eMtE9K$kZj)J?hG@5@V6aM&7*-| zd({@G3$<7@?C)eVSRGeFpjJN~D_8QDo~k?dB8Sb_t1CkyC02EZK;s~>1-W4;?4-on zlaqSH7p>N@VApwlmh1_cbj^z_Z2I3Sxzp8ccFL7-2MJ0o`wt)GCfoyS-z@oe4d6B! zrG~wQsVMUes3k;2x%#hR>a`3tji_w)FxlMxMFiC$XpL9kp9yb#0q^GZypKT%=^QjR z*vYf<0Wy@l16V)2^CWO!(D!+lHhllxZua}U^BcbZZh`$i@9c)}zYB&rpSD3(UWI=$ zh#!1)1B;GwVjmw?M&@zm8T(hC6tC;)StssqiFkbx;e(V^0r5a7wN+5d!xi5ABIz~T zyd;y%r|eE7x-A;`j|%=XSO$&Xnshl+>~x>NgTm95yvqZm5hfObi9LYm5`gSsy6*y% zNX{vNDu6{0q23&gsn#IJ*iqIc8nvB+>_!cishTb*gKPJsp{U(RJ`Js@Dw9ma)hgiO%mQY)f6-SG02zs;mo=p$ zk%S;h=%J#FAa^eM;&nEgT_MRNlbJS$(`9F^FO*HLVS0RmQ|aK;5Xx+USt3{o8Nh$d zY#Qq^uCeruhZ7xY@q|pi4X3s6FLc&UtkyP#GZ9;oGUaW3GxPy2vjrBDM_vK%S0l?2 z{2ET7&3}br-#;aj?>=twy8VGs`{uocQdK1-n5-E?&N?*Hecnvhaq)b@9Hr`MGx+6? zuJ+}pZr$|d%M+8nlh5zz8d&Aae|6ZGqq<$RGLvG(*(Yp0aCu}Rdg@0@!&8))8MroS z9oy7@{zP?CB%iiM z6<@Hg4evhxgvlE&KE=N_d)c)^!|T;jcHn9InkoO_&O*D&I?^^BKFWR~G z#!F5Ktj%6={m|&fg>N4^VTHHPz}qR@3+=ct0KSly;dgEZ ze8%*l8kWCu`p}NAefGTAOk&@;m-Vhcap@Q0aC!1Fb9iCl9N0Bl{Do<$>NDq^`ojZP zrq*XJyymkbJNBw%%ns{Pu)~3o9UZX|cz=f>qFS)UO@&pxe@d$O!j)(K=Fu;7Zt1+{ z=G)g?a4t6iecZBk#y7aLh~5vW$BBi^-*nEZ-VX=s&TIGo>4}4d;r`F-AD2pd+-0%U(Y%B^Znds zR2eg5YDOovC;WqXxFy)Di*SpDtSykA`;cN1>)?;V_Up+woc!G>3E$b?>52wnDICL7}N1O1N~BtE@;7Yyv{&>yiPwA)A2e> z-W7!F^gm-dUT2`+hL#e3@yPq(+$h1^K~ZwfB4{vph=l@wp%p^>O{tqGSmFw`%&PGE zC?);P73>mnr=#E1(<5pt3WXt;tqhItS2R@EjcdjOW;Xf|2_ZF>p2KuzqYshUI(-7u znTC8qSB5$bEzl7<`Mjs+?snh=l)2*;(LdhX$jK{tI zWlU!_`VjdNM{jDvbY`Ou@nNyq4PA%n%tjyLPu1z)!*ph&5AnZSr~ez%nTsq6rzrE7_*UfHc)mf`zvpeXs741jn1F-qwfH8dVUIQQCl4vo*2k$lT0V5C@K6tNz z4>scWFnsV{10URg=?ovd*T4t2U^>GG?=|oNn4$Fp|6T(hyoBitAH3JV2YgIt_~5+; zK3Ie43?ID5U&HNR(|0kQ;e+=Y_}~ppXZYYf{u|u$f)g>F;e+=Y_<#|h3?IDL^eV6b zoFU)?P)Km#%@85#<_#`?=ri-KALIFPPOnZ{U@yF`eO+ z_ZxVH;R%LU-f!R)X73qZdB1^Iev9A3@XGu1yn^z4>b&y)Jg+o?GY@ozSKe>nl_I7y zyz+hnuQ1Ar;g$CrcmAHNd1bJP~-|zXrAe$Z4*C=(L#uNdcsoW9fS_9bjlc{S-id1?bJ~Pv484-pWLG zfr=y%Q13_Yeu~Ld2I^1QcfeX;I!-tR`V;eX9y$9o0MkFgz%&>H3z1P*1Jd-@%tixc z?n$M)&06CI`f@HYtO2ji*K@>Xp9b*t$8#@X@D--M@U;tnYW&Ensf{MeR7)iKj9TMy zsm!#6a`y&;y)La~n!bYjUeqE z$V)K5)&WPeVQTZ^VWR?UkHClkfA&upZO;x@TAZ19ET{FqE%#6NEvh)Qe9ScLY-DrlvB%~3eFsXqcSTo zQhZATBW*h}{}8}G*WiLkusL09VcNoa{}oHXA%Z|8M$YW|_{V)x`pab3bsM(t8|oLS z#obV(XmhKm9!fXVTkF~NNy0ahU9--(zE-;=k`1Jr1*BaA$g)A@(YEO0hImKGpM@f0 z7|W;lXq$y7*#lP}05{ixM6}=Yx!-{MEnKqs%x@HzE>8t2Wa<0n&YRPN5M7*< zd!HHdl+mwI7M_P^r{)3><&>dTMoYw*2ZtwMdz)__`gk@P-IP4Ka2L2XF=x+e<#5-%5ED8dcWX zGcwlSec~GXQxpAq$Omn0Ew;Cp64^p{Z5CcB0%ddEvQf~dAPTB=3>AvQc8ZCDvSBw! zV^Y&^&Rse8t5t;Zo+@mzQr7-_N1sh&Jieo_!A|)GBhf*h#E=x+PtvZX<{)uL&a5S3IhBM`2v)Pa|Xms6Alod+?Zptoz5Wy|!!mEc)qm=SFy6FWM#g<3uPlS0nC5o3i*gWq%gGU=kTL-O1l|fASh?dso79paHCpdyoP6E@BC%&GwWYLwYIwRJJJ1cgBEus_g`Hn8zO=DwB9-AjR?avBGf`B@)WJ0FsRmy`Ssnk$VNC^Bc zt;y*Wikr+;H`#qN9`hS;6FXDL2Qu++Wqc^jlChs4XAhV3Ac?bL$=)NGzMcg&R`!14 z8tHNsdWB--_>PA1snmuwAgcj=;ol8OEn!|4;F8D?VjCgZAXL#%!UAl;jA}j+j^Ox> zEvZ2YnrV(i>gb1;?~X*gu&82mHSLn<-!Cc}g>m=IT~B)mbfY9ay~{J{GM~Pue)DUtw^LUrBgv^JmckHUzjf% z=p%*G*>VPoU(yDc?+APd75*tvroEC0a>D04@Fyl^Vc~~ZCSnJZxsS{Yxa@`|!ANs+ zsV}@vWbsso{OGGgXh6~4ZHZKbcyrQgH)upuyFzAH#Cj}#^O|s_1CPLn2j^SYQ#u2+ zELnY>3&Bgw-Az6R9JU$w9s*#D)?1jah!VlM4T3GhN13y^VRl>v23}T36|FNO&a*=H zj}T|hlV^-8EPbi)dXKuZG&lPudj|L>tZsJkc(dt5qWVKr+==F4^2 z4eXOZx+^3ZK+i8O0YPZjzz>|bVi!cCfvJ<;aoR_IlK!}Ns;VWfkY4PpQG!~}`k^L) zq`1axa6}AL!B%n?^l80Y+XIJ#g=G}vbF<_z=#olpC1bhqvE%e71+n6n~;`l1Vut{IHBa%D4d z>QOa>0a1(A0=4GjqgEJbEf$X$9Kpp6`VPR|>VpRk*Q8Hdxn4(Ha+pSa_`9ebiVJ0U z)-#goSK%)0z(K&+$WM>o4P7_{M!$A4ADtfa)C^D{X?CG@5YgH1lZWWtQ9|s)(hOR0 zNaVq^rL!Y__72_P2}zULS)@=Wj@ie$Z_DE3sm-|Ef)Jb~Jr4pAco+yb@nk5JN(Ow4 z#T2NW58jmH+3_zDQ}o06$NfKw3?!oiFh@d$FRhr^8 zP^IaThPMsrH;yNvE>88)Otg@XXG+>;28n+Zg_el*lNM*1gIg1et zSgf;IHC8Wl0@;1I#)6kdi1v%F+c~b*O&vpX!9e8(A#pl17!)`nu1etO8w@hS8`b~w z5rl*I9IOwdxEfrU1Q=a6r3sUlUbmzuU)%jembeeJ*TTYlIA(7`A2IY=6-qV2W=(?{ z!)FZI6mXTBA;P(ZzMHsYxmwZGSINJT$>r)r(P@4Q%N;&MyHo6ERyLm4-NGMls2U9t z!kzSE#J*M4j>2eOCljl!A7$hX>L1K?@J06Byh3M9)<)9@r60qBqb|Y~!ZS{Pi+FAo zEqr~qS$<4Hh0oG{!d97s>n9A}D+mPC#25Dz6`pVB9DVxXJNjxt z$`OBDMOR;Db+~302$Wwq0&txiVjt}+_K&m$Suc%K31v~*z6t1Es zbBTu+cr9V+$jR{w+la^=S7mwwatW1legC%T^B(${BiFNXcE-Cc?adj1fPTB@ zQz`nD)s(aXd-3M>k#?AehS_ZH;P&SRDk`1;0xeEgx3gRmZ)o^y(fv< zHrjXLwvFGETMNC_{_s?%H@3FqfWD3WGd_dinI8v#fOvI2}Url%*fs`I@;QL$47#sYmk^%*yG*12%L zt>-xzKpH&sn>w>2K~curfrGwIj?TVY+f%wfjX&@ZiQE;Ws{ln@(87+n*pAs%u1>68 zM**Ub>0?)_yDpxhD=|I3)OR@}O7ML|jXY)cI;a)l!;KViGqhAoowZHZzb$Su+jE*S zgwJMQtK0_7pkQO}z|HL$7OZU@^SXb=;u?hQ+66KjDdmkFfqAuIZVu9 zh_BBr!Ni=^l3uZw@U6Wwb2r%z()dJso22DKK*risQsu1xjiE#J0Ev3;^1+D!>z-R6 zbfk!*0LX}4&-j1(N5ILcb}kLpk4Y>Z&{A-yvRH*mUZ|Y1DJd zn9iB&O{Y+<-rR1cU5EH)CTK!R;4nf{TfniHu89neb^QMglGT`ULj2E%g=)=ixQl5HJiQIb(*ybemcEH+!0#_J4Xng> zvh+%Q9l+0l=MS>NfpNgZb$WQGB zVeA5Z(cq~93mwT*T_%7+v=Cy;f3CpJ>rq5p1Gkk9ke@oTJG&(63iAs?RX#+E;aEUb z06wNqLhnsD7BEQ}%o`zqMu<=*S406xqzVPg%m#b!PmI%-^JTLa=7^%5-s2c>`1=O} zf}pb_V^Mdyh;tVPk5%;fN@5-KdSX=f?C*PDNPk1|?pLejv@+;eqEI$38X?41ch1G2;}-faPmoCfY$Bw0e$V@0$912*@rz%~Ty+(S zP=K>}F-*XP+pb~wg=rADnD=pP6u~cigyw;p3GFb*lWsj+muB*$2L<}hNHq&RJAO{s8r#^AS+Brd3BEy~97HA9cF_DBEi2?vGVwcA^Ou2f^)H|Iw|c*#LnSD;+#e=fY^;5sJs%sYi7U{Kf_WXtUrT{Q*H z2!e8mu7%f3#m99%T}Kan198(S3$B=oI*Jybns|t@-+?DluWBUV20+ApC|5!8(QrDC z?H;IKlTY*>+Z|AZf?csOau9E$9of&QZ$g7F3ulQ7*Ei!;OE2kxUvG~OX`q8+3)|n< z>TU4})Ib(F6q`xZ)<%NTm0^E89*D7_g8(5nbY~OGg$pr;I-qcb+Yv~T?RoEVq%86v z{q`|M*nY}1yNA1-np-qS+wmS9i?c|$w+a*l1`H4nvU6k-I_e2*5)w5kgJdoo4uP9x z5Eld&wKFwveNOL^D`cqosmi6$DPps4kp8n8+nM%pJx(vcO;20eD(xa7&TjCv1TyB7 zs3sGAl8crh)VLWyCeMPlvF|h8Vu{ykxOr@>-ZJ)Du1zc(E2}j$i^V(p25}C22Hn8U zBbdXF!YWv*z-=UI;+(VU-KZ|5FC(@s+lgvF9N+y2_Qeaw^&ka7!o7=ymRPo-VBNAy zdr!rCT}<<-)HHN%+qr+au2b&bDART-?5emEFoQVn1mbo0xCO=VIoYvnd^CZ~@pX4dGj^_mmSHwC{bVi`L2h+xL1J~6P+Mi8JRB#We9;=*v#P{KQ zdQdtbt$>-AF$J)eLDn!jQ130d%P}f-dXAGlQoM)0g80(Dg||35m1VCl{&(s*0^l~7 zUzm3TX~1BXALa)Dw({_i7R(ON#rxVz1y3z^Yhn(p*rzc5@;@tGnush`c7N`HnNstc zn_xSxsbM8ymv3RZgcqIX6DNP+`R7eHpgR~9Iw#QvEy8Q?di<74iO1nB7Dm=CgE7xb zA4$DO4>5Is>(UeN)%omGmoC?zCtxVrLugL`?)Jbpl&~XiaHp1aO|S%~m}|qapqpFd zjO5X!0Wx!|#2|qy1n5r?ha`&}kWa&X0ZsgB6KUxqysTh5oj~>&;s(SE%P|A8I1nHF z3wKg7#Wey=2zOFSuhV)QyXc=2pFN#vqSV|cXhuzxVzzQ1LVOdS5@?@DTm}0NZsI(z zQC#lcioyw}@?EsbZi!z#swRm%-sfr@hD zwtMhj;kQ0F-$>AB)CQnA*eDT(a0V;DQKxRyZWHI4))$oVL6;9sAcfK(i(3on@Vk*qI(#1e%s zkD8``MmC-MMRa-8XPGObe*Xu2fz+Z)qv$Q{O;I)G;wUWYoaCGE(E{$O#wEQW-Q8H1 zg42eWP*vD}XDk7-+r0m|Z#d z6q{jsjH&NGQr;>3GV!fHts>==IGGh#t=KuiEiK_{Xi#2D;%Q3kh#{mWo>1H8ohZ<1 z67qDFO%>=5mgs*IPoMKid&Hog2~=ZxL!#F&k4sc;MJ@-oNDmfuL3Piz=cVqLDG*bm zXqwETbxY{?l&*xup7yBvoi>+KA2y}+X&2^g9?=PFg>E+oHQtyLiKGjzApjSUyn z-+~qg=znJDs6!m4zl1C~pufgGe?RXlnEpFtTmk)WEFCV6#PsKoQV06KSo$rzn=xp6 z5HG$F#A1?HMqP9lIv=p&4JV)(D!&-(3ASb>v=$$RbZW~qx_&FqUV2t{_<~G-IMY6+ zJ)HR~Oyf8cy@?z=Cx7W)-FX+9UEZ3$Tq8-5aUvYd8-K-B!_L&(!?A7RNEdrXE+u{l zyl7*6faP=#YqTI$hcXagM;nZniQ72i1zP#IBZE-L+`5W90P7=w zZoMNgx)MnV_@HrM6H&8u)|bRbjT7+;GP>pURe9YvT6C zyN3vxe!mVRv1!*wNV(3VFY~IzXV|6DF-7618h}f;Rivskw09nw!dCm6#5eK#V7pPm9(L;&xwy^EA>uSOedoQ45vtVx z`u=hIVw4IE@-2)~Apr}(BF<`F4OSH-N#SV0EKx=@vaX6T3Q{lna^O9&BSGU<28oIAImxA&qD_O8!Mc8?oFfGk@tHK-#Z; zXv53W)h7PZuT~$*1CKB%c5kxnqzxGO1bzpu;O@BMFlvee%5I>493j^3$FgJzT=v+{ zyY3%d2{J=_@CKVqBH=;*JH!i~x|f?+F~Qfy+Ut0|(DHmb`d?n}EnIppv_o2w+6%=* zKVArOL zhH4Km3idheixOr1Ut!DtJjJ((Km8OEX5F(lk%Ai+8vOggsTRk-89)q-@8jxzTcwiXc6hIx55&c7_Jb)1`3eiFU~mP1mh-<6{L*!q#)?)zRS4(| zruU`|#B;UTHy0x+GaS~k{;}M{*tmKH-_M32QPf;PjRX*bR%e75Nl}7S!~(2Ahay+x zTW(D|zo~yfFE3`&eR|LF3Kv|Q@MIe_VYU=zvhDr7b|rN^v5x)?AvzVh>3anBn2`#X z+s&o2PZwbCPoO7dT5)bixjp2!W)vc@7|0v=Ph+|CDoR8Fx%48EO8})k!a`;*A@3dN ze_-hxH1;HNnSuUCmi`>?YW$vZqjL-SmD8}FC@*pvWgWotFR{;a`KsT?v3j@oWrj}n z@Giv9{}PAH-D1d_#R*^(@6(t*ielXGo>$oS{Dvn5dVcOX9JY3g|H{&z$N81r6rCj)H$=5qu@34#7k z_WAo+`Y4LY0sRe@4rzMqyclTm%?0l_&OL|YTyF7OEdAr`dwz#hDZJ-xmd=gyp9H?_ zLi`S*!;Nhh@lMC@x8lf*Tl{bK`A6qo#Pl;8^$zR{+=`6pyBP>oB4nONncbLsV_<5AS z44whJN6XTIPw_gG2{6=w4%PsEelJVk%|Oo*CBrZ{YHm8Ge&ML>JSm?7W^sb{0Gjk!(Z}c?w5{`JiJUm`T_mhyiIhN8LE-QM#LW^q_mdw~Dq&u3r1CxNXwx*2JdZ z5t}Ai2Ylo(GlxgmHJW1Qb_(xYkk;U-@pWJ-L_h~Ysoj#q12(RK%ooOytoJm6>u?(K zAk{yc&qR<|4MuYy*wQ^cfKm~Db_sFL0Se_omJ^T%$yH;vt3;Q&<9ZWivkhgdzynO`(7ejSeQBU3u|anWAP0@Jd*NR|rUg5C?9CxU9!pMl ziuwm_NhAFnkx7jN9fKV@btx7f(i>+F@@2bbUuRqI(SKXb{p6p}E6ss*T~d!;rxEn( z(jjNesq_|n0h60J2PL`xg)1FtJ>uo%ur71MP)o4~uiW+lsj5&%Ot z-YA4z?D_)0>Ijz)WO55etd%H(+DJyLugKw&2c@%>98k(Kmfm7dm)t5Aw(4azv&m?V zN?PCL43;OM!)2u7;(TYwm0Zv&^@bmF9WK|5PhEJ9RMM6R8dD~h+@Vq^6cWj&cPkZ& zjzA>A=Xa2#TB%S{O7Hjo&bCy2ClMTB=^IQAyaAs=ZKE^v>K6 zUN0wv(YheSaz6M9On4<#PnJPEz#ThE$kbrxzC)ky073$RIP^p`mh-#No;?;+8@nox7*wof4ptL#_K*~l?Mtch1V~W zW@NHNfQl&ON~MyJ*bQQvjHG`=bpEVOOzn`c!y{R`-F0VqZzxm+HNJS`@2;2mM=pf_@gp-yQBI#i zuDL^hb&uVoCj#`tq;2){L*CeX0{>*@1}n}`>N^y-4Id&5vC zyIDXJlkwEs+XF{g$fTk22`#v*`OiCerD8%lS;u=CC*&#`J^4 zRUfoRG~lvuxx&A&_K$=1|L8LMANmihp#O=(EHw7qu}{3*S#D4QT%HNll;uovioP${@9KGcZ^rAEW;c^;r z6MX{lwqYu>es}#?mlLsJ9dY{yVlN2I(WmMx+yRcKLQ#vB82CUe1r7D*DB?|6Dl4=D z=CbQ?y%A?-&o{?xZss%Dy!h{##BmM~1yv*{Y|Ey%mIw9p_len)Pjh5F>Y-d_+++71 z-_yAzliFPB*NvVU?sD{JGNT@wXWNa=zI49Z>^QSlyRlVe(}jF`UBzgnFL2aSxh|9a zQ};_G#xB9iW5uQ-bFU|a0|3wF^bu5`EcCE&^U z))XaXgGM2!X_J9OO7G3MkRx*$a%7gh`x?RZ8n~+*ohp>#n}+LAa6fp0VG1;`1alwu zLN-}u>6J{XA)|H4KKiN3?&4*8UDSB7|FTnxJ38|x_Bp7rj_QTG21eb!aBA2$*fYE~ z=#Nfp8^?M2Cp!l6YX&Xn@6b$SCPwH>K$4^NKYOcY1g(ECz^s2LK%5^9TBFiHA{;?p zFvx|EzzjmXDoVQLF0HLQqsW2qtmKa#`4$4qRvP|y=eNe1G;PhEl4v8=rr_#>dH<8f z8`O7%Yr(H&Jx;Gls}=~FI(4alJ6=~QXE9rKgqy?h31_b~Scgx|(RhillgmD?X707G zJCm7J-FcU;fDl%i z?4s5>^+~&W_m;0dLy}q-w-O+B5UN{n(0v$)*nTz3hd&JKZFG4M7v*ctr>nIUHPiA2~ z(!A}M_d$Si5_Dc+9FZ$HA7B+cLUrU?&YQP)mjM3z>%j7kw zs<#jE#^(OP)5@RRFUhP=TFVi5B2rxZ#Kz-y^i27j+W`v^8Dp+W4%|Jr6Y+-Gsep!4 zb>5)A8<^?Yye_X!$AT$C6URaGPo*rtL98m;hS}q|qhb%+yol$_0_-4bAjM$5A@;)K z#6P$y9?1=#)pga?2`POeS-Eoi_S1&@TZ}Ean$2o=YcxGt?O<=TU_KpbEdNwx5%$*U zsjIB)uD;#-ESJ=3cU31VYeWPQ_L=N%2Y^sQThZ3h>+Ez?r!Wq>wh0v?`*~$>0+$|< zmE957vgZRTTG(t0;39-WGGSnZy+N@6wvmwF;ey8ez6Fc&)88&SHqGSyyZ-Y#vwOIF z0sTYbjqN{iIyA~B+LSV(yjc)1*qw5-LMYDKyaSyMb9N|n;*N5+zo3_E<&}25a)AS~ z976dARngy(WBPch93r|)pGhbk5^Jl|N)TSX&ZQNQE$u2_DG2|g`jdWtP}uqU?6SLLlr5 zH_@PajHV0mD$jH<@b9;O2CKZtIGTOK6q1UYg-)w0YO~6$?$9h3)i#;my{9FC8lt9Py!Wb5K%T{|UXuwHz`Z zv$4qhtv#2g-HVqxwUJ%w&U~@CEuBB5SGcavQwq1|ggIZt8|ig~Go#FnLR&}&EMo%Q zQgKWx!{yS!MG(!z!=|7_yzE?WBpvm+h7>`VtHNbfX)W45>Py{Mq~Y){WR}!Cv%n0J z`IBo>jl-u@=}-C{Wx)Hth5P{?csCCO{xJ+4okBQhX^L_;gMiCWpa|GQhCM%g-uUEt zQ%KT2Kc%oEu(pReOozxH)Tb0wgzU5{-R~xe(AELP$RHrrg&oOWJ3*-I>R6jf?6TYQ zai6@RNcW6>srzF~XWV!^gssW^DYdH!N68Z!2$H=mS+^}jyyETg=|fIYx<##*>+RY= zhr=2k&RVcBu$FiOmP3sku@wsxk4BuId90H90|;UiMm>)2!`nKBbl5R&D>j9g1i_;c zuH+B@&n4&o7s-e-1W_CsI$j*h5<=DxghG~)d3@q;XoZ?UsV>$n^e%Eu{Wu`qLicCx z_H9p&K(}cSX~m2`K9rWG)QMt0T7%Hx4}1Z%!@HWt-Co~7%vX+xbFJw}Fczsf!~U+2 z7Bl=_z6CSN&SRS+Hfh)}PzDusEx^gaTV|O^Ls3{NkY6+UB(3v;AZQP)>Gqy|CTP{q z^DVp2otzr)1+D5+_$~BlBB4no_q%lpwbm|$7!L)PDvIH*E4fP@t2nb}M<%RxUZoF# zK)bB4Kej~rC1*BcRawX(Rhdj4U+SRrts1pNYnHXETiYgG0i~AGP|da1 zi3_l#ev7;mb_$iCLao8E6rrLUKEU3T&ljVTt|tyxjM}Q`n7pR*?Om%VNZp`t>C|Kb z2LIo9icv5I z{$kVC!FHU2^aV&61}Azx_`rx&4~1MNev`pAmW)o7B>65$yUTr-;M>lGqg|ye4JhDvB`BMFwP+t#k^j+k;H2_)d6 zb|Wa6We>7z2sJcu=R&^7>INp~enw@_IHz*{t}XC$Qb{ZigdV5^;p=AarzoY*p~=m} z*6z(Qe|F}&&7G4etwU8)>WgCr+vnRfQ+uqdWWsz3t*0K=uBF-U#>Q3T1i2(Av2y9dzH#u&Ig_; zL4-Uei`Q+8m?T<%P?s2X=Iq_;VjIiVX}?V`(n-@*n^Y3Ll-ny*4Gz#Z#4GCI$vSq) zjvVF2aQg-(ILhT=Cfmrk{LWqD&N@Fr|6@E_;<_I$m~-X$Or1NO^!unZ=-Dgl%%?ZB z;-M{`VMmPP#XRwGuKFDHmO>fcDeyvArI~=nGXx|a+%98#^YPrz4@!i#Y` zqO)svvFp4kd7Gkbyprx5GHUhysyDgLW^teLTI^8tHKj>DNv@-Z+jVNkP&wJ>CWt@& zsn{kFc?@p9%&e>!;L=;?A&&x@^Vz_|+Gmeg+L2caFwsUBofIT*2Y>=R)T5%|%aB3L zXgM@op~u}YR=^Pf9c7Y@m5`NA3FQg(XYfEa(tR+Hk<6~1@);u@l~*M_%~_x{dVjCC zZ;d-+9JOa`g_Fha#NL+L#tEIwlXP5ItDR;KTiWTLI0g#&0S7@=_=Kpv-EDFOmBE-J zq;C$&f}I|~Mu@;6$JcACQNj zQSW)MW*Ru4Wu(;^?+64V+wslD;QhFN3&ORKNP)yEH~?TRvDi8)-AF+)J%}F&w58z? z!O^`^7YNk+zoWa!^G>Cov4@Sy&aUa8IX9L0SSW8C5vtT@CkMTbzKkRp_J713&PXNv zLfcD`0ZJ0PAxYZ5UGo2!x({Bo?a=ls)GH2XJ8)Z?tytkOv*ynOvuu? zK0j3&b&pGZp7G?6*V~_PD+6Y&`PUcfUTSwl8v1;|Bud`tE$PTm+H9ZbJ4DDFJ~<%2 z-oC1Ri#x4T>B~`_9$Q!A{0NLaic_(WxXp}OPwLZrEoDo z{=#2d^sT}clk#iPjhmC<-l#S-nj-E217rI^r=2bPvqtoVinBTxBDSCz8@=LoNi%{N zK~l;^uz7e+6MP%YDF?B5o&a4&z|09)1=~#s9z|`mkp0T#-LQ%crhqj7Bnq!Qxz_Y( zTuY@l^d#5DZ5`frg)e5x)O6O4H+PP^^dp_IsiHL3m5h&%*#?St=>p5m@m_0Jbtqu3 zb~ugMfIDhwcR4-Ms5wqT!h`tRp6dVW?MZ+mxvEq5+;`8_ zJw4NN_T2Y98qJ}RM$+h7t)$hicfE)0cx^4Vu??)j_`-`14jWQ7c5I+x2Lb_-P+%|> zb0*k01qO;h2*HF9NT8e|6c`^BgY8z{??ZEFM$(!jTeY>de^>qA`|tgC{dZ8gGwU0* z)z~tXi%wS;Slf7cqg8OHX*z24YAGY(NJp$PU!IX$9eSL5ie#L#&3^#~e)mn>Gv$Qc z^r`CRv0&?1#yMGi1=EsFy{npb&240Z;e%mtoh-JLQA^rAC3?9y;lL({NZ?o2Ou&`* zBH~gGn0qbWw0n5TQAGT@Z@JMgHsD#i7kxfju2h2TfQAX^&fRkx_rpxUZMBVeeD3Oz z>J`nUz?!dgqP`e#R5Lf%mgX8pR;$*~M#dkc*|f<{mXQpJ<{SdBNQO)%FF2k}Emb_e z*(&!-jLrl-wPa|%6OK(+##;)-1TOQq;Azn?Zl(Ef_nI6{(}|2V;jI`_mqUVqEbt-N zClY7!iMHY$^-JU0MRE!MhZ$FZaEC*%+Oyc2B^>kV>U7icLBNd1t z;wI?xFWl6kbe-8+sE#geb$t7nuoGbAeT}69rK{G=#k6nSYU*^*9G;0~s$MSzV%Rde z&|@FtYnD*XD4zr%>l&Rb!1c;yD^AEy=i}_?J zceGlN66$$&d=Az2@H_Bb=D^lu6|e`K75^5e;u*70K#j~EcmVVL9y@nnptC1f@bLZ4 zz_(>vzu$V5PwYSwc_QFm@NaxD)LJlop)6h{_`Z?B{sC9wD`(c8bQOITU~%#ZlTjZ& zA(DOV83y6=>eDj9PaD0&S7+X7vrtCT#Zlp;jbb`^h7VDL`P~7uY>;*e1r?Z3=mwD{ z!3GC)AQN;0uLMX^CZ%{o^Gf6=2!LVlwb-+@DBH4|N$o+rb7t)wnKg>|wbG!|2Ww=; zW_DOTUQ=bNZlC#)L!qQGk~Y!=Nm}Cd5LCtIBRLv1JD+$(8Tbvs&AEA8PZ8PWa*KNYUm5tXh`wkjz!U!KZJ}Z+I zE9KHe;9$4mCQQVmX}{2g0+->v-B4lrICepY``1zZPG7K*c*1>p+rHNNbm($1L7ft66O>Tfrqi+;1W0)xEbwBAvMl$L#-dq)uxHk_MXak}RWl@;4e@ z$>dP=_MChTP*Op%Xdb4VUNQ}J~jemIcn**IG8aro4Jhy)`Lk9&JQqV}#WZ*>ZHTN?1w5^@&tVWY_{#ZQhYgkZ^|DDxiFgfAKqBuDr znMy$B%9a8~gWn;$6*v$|C1s#qh0>=U%CO<^%WLrq+rFaBZjO-AxRYMD!Hn>)eC3{* z8G~+8txd81MwnfOR8sV{H}YRIp$;Y8?*TEv^bl2PuSrV1y!KfbTY^TGxQ~&}BON+P z=!^kVD(j}u9#>NgLy>OxQQtyvZce3`l*?1mK+``a=QsPR2)b_!)ei#rg(19EDHif} z8|+`{EoZB|ymsNhh7HE;Hkj^^mou4yB8xd0w+ll+4D9_rzdv9xR*J=nmJNnrIy!d| z;GF|dtf*m>;8FDnVu}?8`E~mR!0Qg_;}T(QqQVY zj^^tjp^8IbMS1#q(92aHeFuR=N7@AoRNVlSlM=C8h53d^>v%?K(C!WIHtGLlYMLi} zI$;VVeIo&v^ME5Bu)sT39mTw4=L_x#hIm_HxwXxx`vHD9d+ZO90Y2Hp5FOwZ z(f{RE6|}X|@BxTO2jY}&EReNF+6w+J$STQo135xc z-#w5^rXvfj@g3cgc*Nnwr$WgRGN55YtdYsE!k!E z`Z&!-2|0Us5qJu1?T4+=I3H;B*~?RdG@^zBGB0t`yLu$G43CY1NMfJTw(M40)E5mx zCg&l$Ry>qkm*4k1m=Ub<-F-o~Fid>Bup6X1xMC}al(_6xJgom)-u=A~TN_J4;w)Of zue)x134?eQXh^i41VoLX9~0mjLk>_^Q*=9P!Hwn}7-SluN?T;|wdKL7h$m-3oy^#@ zhI_(nIoO#wR<$jW^TkBOYJ%C7$1pSgVy*#+-k_IrrK{OFZ)>e}^NA}rvoUww*Aiwb zf%25#(18b$K}`dCJG!9Er2RtmpS{UVV9&(^V@Q3VFT~>bCV|^8=I4g4J&H zTSHNk#$6ywK{8BwvLVB?(e1VbEWuh1|AEe?*6Q3T7V|l@8Wm;wkZ+M$n&*W@D(S8J z!Y-LLm!u+Y84Yb@d4Q|i0E0jB+ClCur5^_V#*8yX==6S5I&aVo2Y+2+nNfJ~iYYUQ zM?>mfwAe0NX1$62ICHQ-Q!=!RGod~SjZ9VG6%q} zf(Ta_jcf$Bl0_{~AeU0Q`hpS@gFuuLwRPJcF4%p{WJ;EvVJ@CtSy^fvo$+*BrCKnY zOnWUpf{NaUy^T9}^PadlXl53(n!mN&oLsHH^@QulWvK`o@o6*-8vFJ>(B$K*KjTRh zHa>zB4D=qlf9$ld&Z8eTex|#QLcrWlaa56A7(4iyl89to(?fJRd8Y-1RC{rB-V} z!dYNC&T*kmzLagcBdj~zm@N|#pbgp&h?Dh zw%l$mE2dQuHsmD;Br>@taP;JgT30Vi4|BZ_!$@;bJ)t>dNdt=^gNi2?T(C%m=fA=G z#m{U(ljHrH{N(t%*-)u5yKrK?kv=v7bK_?=BC*oS!P{%4;^|tc6lCcz;i5|3&f@Wb zfiB-OB^>_5M83X}9Cvh1O+XA9+Lgy=8Scxot;)m%x>g2V%V1irwGZ$}J%R=k^GJc% z7@otu8&bR7s}X1&UoTXTmnF2W8g-*aU{+a)<*Df-#V%%lHS|g$9d{940^E?DI}4Xe zBm-*0D2f8n04ob7u*heUfDnU~Jum-=z!)=oK@7)dUE`^lIp18hc;O}G)4y0a)SQ`U zl*th3Oi>Q9#(kDeEUzGnmTu%JiY4Riu-1oGH>ljsFTxK!(rsoxtn>z83{*YQj30ztlcd>4IL(Yx4^#V$csM>A(YuX1j-;~_eeOm6>ggcmtvLpLxTv0> zmsK$M2hiA!XGdQ|i)1UE3&sWd@i)@ufE!t!Y|jffvUXWx?l9cQnZ{;1A6!agvpqNR z@Vq#l96LWiL)j>1|q)!3+3P?k4<{yUiZWmQ8p?%j*w8v)}og*uq*lMwM$;86ZXsmRfaAR#O z1v-$ije8{>I7$2cG+>V{4adB&7>wI$E4eP_Kj>_P{5~54Qw5qv)6zt1x_Ekl$NdRB z0Jzg|bq|cK@fvZ2>;!Wj>G5624}Mm^Aco9B6*fLpoc>PYmI-acyfHRfg)qVu_I z=2#VE*21xv%k{%2laF&x>=dYYpr3VrV=pq{EE=sQXfQMqU8*#U#@J^H}7ZiF?`mcS8VhODPbpI_=jf0s!w73U{%43{+ z9d{!btV$rN4?L8S$`BK#BtO|cohY#jSvKHuLq(;_mUGqHi`+|(L_ag}o_BFKHVV0D zi6(87PE#`)n(0adQ{8@N_3T-Qv|Y!&6{5OIkoR*?3AE$rGS_9Q)a)( zL1dg0bIXmzYeL*8e-JQj$;POpu|HcJ5o^$L}=~E$Fl$pHz4mn$qhZ5xy(~96$sB4%V^A7<%Fu^6ftBP_&gI z0!~@F#kLm~k0>YN!GJ5vTxT-{1J0bw>70ahhWRsb`^U`IdZAF4*A$F{beK$sl(fn2 zFcEdaTFW_;+Q$WO}X6LtnEc|mS56DEy1qto9=8a+mmiX@5p)I`P-{gHr*0#KnK1}mIw4RWlY zZ^h7uN!~$#0zE000I-ViYt#_@-~>d!xd*+MD%EPj6(<-CX|j@R@-L!AlJV(BWA;wJTJcPv*GfXMu(A7;frLN@*1ts^#BC=P}t#~?ZHm7tto7v9V-tBi2 zjKZT;sMTs!TB}+0dl?o>U>Xhh1nRU_eaH&YR+fpHYK45%ziBBT*wA1f*PScU6Bo4iaJG=EPoTCArGy{X5>o&DR zAD0PS`BdYikMb={)aLypb7`${JV3>kGTEgV=|BGbN24Duzy0mpKZhKXwAV{dQsGNI z)=7uW=9sj4FwfcRt5=-i@AhqwWTb@ja!4=|CeQOCktcw#4fj)1(2|{R1*bjfln1!r ztpXOGlgon#n*LIilF4qBj^qT)XQ$wMN|bn|5I!Kp#DS1-sko0ll>SKlmN(z!wWH>i zcJG4^{pt9fcRnCCOM~G0A@0^OJ^VZx4x8*dhcdbtUAE}$en$yAeWGXX zoz{TSY0J1KS{?3-(smc$n|}ZJTdwAAZ4^q;lHF<}b()sm*vgh_*t`ft`nGcuZ#v6^ z@;31Qk>CqMPQ@;wZwM$BGLi8xJ~uo~8XZK^S#2-YI#;lqZxE8(OKq>iMp-qQ7LtdB z`sGKk;7&-+@`qxD?5!|BGDLj!_COSm!y$>ue42G4F?r|U=90XeQg~dHU9W$>e`7gN zLoRL{fule{*CAUElbpSeA|g0OM#Qq_5ueAIab9UPdA-gIP1AK)cQU^kgiaEt zO@))PQYO;{AWp5MiD-%96jS$us{n9m(EO4x>Y$WQ(W2>lEFWgt4->3I==zJDGPYdV zO~lR)Vl_n8hEvL2L@frl+(*H0kujBkCIhsP&|De2aO{%Z5#5K>1-q~BdJW;HpN-dQ zDQDau2;gA)6MG9_yeoiZ+}z+%T;^=2l35D@l9;rRA^R=+kirI-Pm3&lBztVp& zNO(L3Hv|dM0ka5+%^}qMXuo{^n?V2{>k4X&=-&)p>AABY_?6&NSilAYt3uJ^M~OTS zoF-b@2!ehw&RryJciA1$yUSNzddV&Vy)5pYyZ!duRaf0GRIKwN>m6X^BYDni5tR@x z5nmy}ZAIY|K@y7qJ|_zIhBuS(f^h$a1d}K!LCUksbwSEM-hToZcRlw4=neD?iqxO< z)C%#Keo1{t<-!A@x~DXij-|~$$`UraoMpPbu*SU*UMi(xlPvV!bepugmQlCTY^?AR z^^fo_iyfp6ysEuML%!cwr^wH4`yb)TiSb@z{e@m1%WwQK=#4p z#-^juw);(IQa7RiFi6K6Sbv~ubpQgixZd8>{1Y)bL@O9Th>GFdz zXv?s&zBG**f|w(2?%MMxUCx#^qka>kb9s|)I%JTm)VAbIcKwJKX3ySR%ooZ^buNAg z9>XXoT{ci|)4ocV|DJDT;6lEp5Kutrq&-fhpfM=;H!+M!3E`xkC@e}|>zQRM#E~Ef z3q1|2R;n7mif=&kC8t}bR@rUeCKxTWpz%f+kG{7DO=U6ZYS^t+dU^`=p`i)rLu11n z=2FlRHkfqK$NBAYmBOqh+#2py|D40EbE|Dp%+BaYpH+b?wFFy<1j|87I~wq@2Bj?K zDhJ`7o#U?MtuWyW20U1v6UJg%aPq}yz3 z&h5GS?DfUVE|txD!Qt3VbMs#Y%X=t4QEYnapOU-Kw@~3V2#3VEc7vJDy3I&1nPD zWI_8C9>(O7GaAIus<=k8&2UcKVuu*^TDS zr^GC!tu5)}Fm>bS5U^0`@55$Lb``&V8_KQ{)*-tJGzVxm1PscqB0#5rc7s$QFdKU` z$aX%!F!-AC)utcPt6{l|9J-}ar^6~-Yf zxht>=9@ul+JlRA=F|VB`dmx8XZP78pWbl|maH_*{|9-d2Nvo7ixjdEx;FkxOa^%6| z-1?qeiHiPFj^~l&smsTw7D>Z~(Q?hHsW)7*5fqqm?qs@}_vdWRif{QuKU0cd2c~>h zWXd?tlxY2Oo+!M@IF5~&kM;+lJHwg zqkspVlz{mIcv1rG=P)(U4t)9e{y_Y&+m3#~?q1s;tO_31H~%lPqy#uRQ+I+en>@x? zMx{P8L`*(A`kd9urb3=hn1j|+0~|T>*fB1JZ*DyXs6Yxb#2F!e1|e=K;DZ!Xf%mF< zvs5AYqWWth=OIE?DY;a~8k19Y8IC!^-K5l9SOZl+-F#BEq&BPE0bMu!)Ce0CEPSTo zE0C#p?dVL!vXrTaZ{_iCk4*uM=kbkWyKXla9j+4yo43X~(5Z`J=(v zU`MF2Nyhw5l%mvMk4E$I1Wr2~ bP8{DH*!3Qx*^5pE?@&(P;5vOK@_`2(WtS2HLhYy zViJup8e>Vnn5r>7COKm+cZuxV?>BE3^}O8wJ79L+o0&KB>t)_72qT1?;e$c#$@v*+ zaEFmdwh3xcT5?Ki{wFa<5kCDkLY}{*c^U;SbIuRL7*{7bfO9%uYen_}3A# z7Nk!}$a8%D@@Yg(yoQj6MRtBj_!f0nAVQP~<}1%HNGO;)e04vfW_|?s=PMReXvdr9 zu!x$q748G8=2kRbye(r9vM)!7{=EwNbA^L8&=2z?hpGk5vhfoFuOKvLHQbNXG}g}j z(q-o~K%fZL-&6zREk(b3!}w33|Ml96rbgs|6afEuxVNdDv#93i%*pi#Mf4(^Q&J1# zuk~D=hp5@R5qt8tx)~MK(&v8I3?v})N7X@t?s}=FZqMpnVrL4G6WPyHYfxQz^boU zcfpz%G0b|r4tfx)Vy?qO1IC)Vj>4%8PfUewBg&vgGB;@RBkgI~*=hJZLI%AN1`$WC z0+4o*J|>+#4V4ULzm6`D7RugKJkS<86!owHD1zCD+62#{8uoqEfG?mPss!ahiD&AN z2Ks6#JCsjtgf>^Sh57|KkTxhUK$!uh1WF*3P<=-W#h zKqyqmnF&R{423BAJgkS%SY`&k2Xzup6GDHWJzNv|B|}*RMM}mn?r1Ty7e@&Wpla$p zluZ8-hcf|NWizoKL8c(j<%8^3|vp?xByM@jJfB=#Ok z6ev-kU>uSI?IU@*6WTvj1iu>3Hkwj>v$ajIVG|Rx-vxQ zMRW%0E>lg~uTV~WzbicRE8!umckJn!or$PNZAM+w5}p#ej@H5&)GFM98X3?(q64P7 z)l_dLI!W~6zt*6yyv{sT^EwQ?`(JCK>%6`ZT_-#?={(UpqWe$Q)MkKlBYK6kHE@Lg zMBa(ajp8&4E8vqy3iS|bJCuj#z;z|mzrcMTlm%crc2Xi{CzcTzB09%9z+5X09Q75{ zYeA2WLA~7YD|N>30k3CZ=NNw|dytZs7l4h}II=eI^9s+u_rP|UY#i9LB+|#e2Yp0u zdQm#DaRfg>IoLa}Z-NTcAeex%iB6Js<}T9G?}EK1w(AT!z}x{HfHsx^yq%C4*#Ab- zPv7G8;~4WIn#YeLGLvrjjR70N6oC7C3-}7WW+Raca}({OKZWri_w<{{p3KRfgZpB` z-vwr9uOJLH0gm7EYZ1MJe$qy8WIqRZ0cX|&WC!Gd;7MR5GAmqyu<(#+%pJh*K5`_u z@;do7)Fyhdi;xAGOYjo-uR|zXV2`en0_$91cf%Y&uTeUV(u%iXgjO);D6PmCb~PFj zC7>&!EVyokVChY$?VyO!1n}l$?O-Ao%xh=?vlZ-m6VPKD*m2Np_6}m`&ruTV2zC|< z;{|0CvIHETXKmn`;Ql+*CVxV|j{J!{vM&HF!56R;^nHQ`gr4Y_Fc{`&Lq1@Wk1=Oq zod+mEum`T|kr!`Azy^@D>0g27#J3pz5U~O41ZR+?&;!Q87#;>9^MAm7H0a?%nA@Ze zPuIMBkg*8mK}5qBI@K_Oi;)`?SNso@K(48)d~pT&Phf0OCzM4rg${!(ZZRuGHTZAf z&&Hx0sutv~7EPk>fxi)O%jrn-3inr#6DvU$LeO==3&76TKNA-QMV;bZu_#EbZ1^Kg^ z(Gc?^M8Tl9pkJhZllNCIpcpnC1p%G-n%ETq*axDcY$w1r59m3JFtZQz^8>j54Pd|k z(|Bkna}hmEhWnq<^W@o4o{rX|eu40k=i_H+A=I;2Q$4yCu}6e1%wd#4|BO6{T_QYx zRFC>h6Yn1J5bO=nd19YEd3M0_=3JrFE*eTvtnD_&BTEI*JyR-|$fW(=1(K2G6 zg?`|Zy-}ku1WgpwfUb?8i7-dD@TS2axQQ%94j{uBFrOIs;R5_P1iTIdJ{&>y#4oT1 zfM$DuX8$cdGPVc(fBOG3u6k;|QM&#gbqUZrc0G` z`$sX%BmEuKppbUHKx{EOp1-GeK>TFvgJ<|L<4p5S1wKPQW>^Py?-+?ah`d8v z0EaS^qC#FuX#^43~}T8!rCa z`mpw+bxmvj)p`UE(^}bN4T8@oj0Cn(xIhkFK(^Wu;&gEB4D|<4u7a=K3H8@dE1?MB z`WVPCxvzlnD9P~bR4A}FWPp7KZa0*7jl}?RXYewWRH)OTyaeSu6hBi9 z`(6A!8JiE~Rg-*AgxZ+*KKA)U_IbY#wF2yN6U68$W){%A7fodbP$<;Pm~{}B+96xO zeKB0u{Lk|pfwoGWDsM)STfm64pYLEF`di`W-YUxm9Q_f zuduJNm)RdYvF8NOZqJ>b_dOqY{vn+t{ahxNImkR^UNRq9s7xgrCySFM%Nk{iWo@#R zvOd`w*$&x0*^umroRv%Dj&hmYOYS2NmX~@_UIH&`FFP*>FIO*5uK=%fuX3*$%Bw@C z4(C5)9!5Qkdl>&P;bHQ_EY4ui8z9EuF_fX*fMGbU#MOY|ZhQ>?02uyBIh!zi12Fsu zFhsP#grN_;957r%@1@`2F~oqO6=0alOlQiOE~b}R$82DAfZ+we@NG}z8SmK+81DA` z)$=zVLnM>PoMbW{!*JPH6Nb&QrLuOwaJ6i+Y%gGV=qU_~O&Hq#8-~?@;V@u`9*%h! z0~o3wCOu3A3`YP%Z1{)auHiLmnc)H@He4_qLnqM??ncvyZsA4P)v%UZ&UJC~4dvJz zS_GIuzk!zC)Zfrw*I(n7a0@w&et?^#-^PjcuotY?L;07!R{uL!&mH4tbG7xfX~1? z^Y1jlzNyn4^E;xuMYr|0|GfR+_T}5&x8=88ZaaTjaohH`)otpFZ@#$s#kEiC5GpDY z^@&~-y&yU(IwLwQIz^{b6Uol$|MBzsfAoRP;D64W>i?{cK-2U8+5A7YEJeNi$Uf6} zoZ$=R&+1#>g;H5Th_XC$>K!| zTNcc3Zqm+cY^a|*XZEa_b+t7!s;eq1%F9ZpmlRLa6iuB{SdgEalRbIT#H`GW^t4nz zsg1c=AU-ZOPf{e!Fb@hu$IZoXDGmz6Izf_7$T#Y;17tdNZjn4IuP7ziO)l5CDdak} zj!~wNQc>MkHQJ$pDc~u17N*F`S7hZ*E0U%3mGe(QOToY08T(_%jC`NzN=GFX6zNg} zpq=kA-ly^RFwl6L{#19yXtzS9LpgnY)yEO7glW`n$1#7wCaux{CK`pVGC(0$6wQFC zj*F0myr4V@t}I5cuq+K$ke#(bl~AgtD$Zil)wCj=th`2(4xYBzEDW4EL5cYBZfDg<*UtAc zd;@=91z7NH#z8NrLGP;0QpPqLe%x^%vJmu8(8Cye)O-)LG0-M5wzV5a`Xk7?`ups zZex>_)t3Z<4zk7z*zpR1PkBIJk&cKQ5j2I(I1pP}nNg)kEr%frP#gHmfTpS`vT|Kz zc>r9>Y*PE6TUJ#;MkB}L6sAw1f)l(NYr6R zBh^zBDKh7oeN~D|kU(`#QLS5zrUK^HsTCDEMv>@toI#18UCtO#N;!@u2LNtaAcNTf zImMu)gc!2EzGT^PHRDrJRYC5P<)HU{rY=QtGEv&mCsJg6I(0==IgCir@PmT_0ffF3 zMTM*yj0d0#l*?DZ<+N#Jm4azSeHPVs1e8u$RUs4Q1h8XJgqKHXOPbVCh{da_NCNtOd(GYQmC_hl+ls$m2v71cT# zq);xa))++wV&Y z$#g8#vYHAaT*U0=!20l)1GXQkioSe!77+z<(+R-?)Ktt+$icWnn}(+=&puc^6C|Wa zhur%56n#1jASzQ~Fih{G6ZmA13jP`c6csaoiDW%l#SH%0Q~;N!4uQ`tMIqO~5K2kt zP6!9qqLO@6^?@|%rh~SzO4~lWKH1nluv*i>;4(f{Q_8_D$ZTY(GM?2HAjyOX8RSj_ z6B!4ZfyVOB!xRLXxdF$g3zd&spi!x72rv#7@v{PCc}2P$vMBiz@_%qKFF;2*#Xu)v z5Y7Yp0agJRMTo~LGl0Bm5Ir~Yv`j~VE8~rZ@%aq$sGF(9^cb}8c9(cf@GC|T#720H ziwem6It%{KOsNwofzdh!U@&$I2|A;5^49>g@fiRKz%?QO*RT}vbL5Xlq}+7FD1q!S zAMY9o0)+GG3efrrh1*%f`5ds3<#1Q7&}hi=@CRZ?p5UkMGfqs%1v88Ok`$(ujEjqv zIx&nQC>R@zpXN#(`~gw`GwCxD4wir>9$vDJiFyDPxdY1abmK`!9-x&ygb|>mCcT^C zrmNEgR2wG~7^@5!SX8jwRk?h$Q4HFkkPE?%0R_OI$#nSv;6!-bdiW=NK*Wi4AX14_ z6(|*C$aH}mkq#-+G5J8CT8eZX1-Fl`6elQzMT!_wnJHq9Q&8e$1Kutmrm3Kabz_KTfkx?Cj4TDU0=kd^kNR7{5)x_|DJdd- zeUCZ`A^C?1wLvxc&jkS@nD0NI>J$BMi-9Qc+|-%zfDmisBO-wP_oZkfgEGkiU|cC9 z8kqzY76=VG-Pc!D0TI@8E25zmKDN+q2RMxd)W(`{1KKPFymQFv00SV*-xd@R^u-_q zyzq#j!v^Sh!6@2d=(GXEFMvTa!F|?XAOtjxHj)nL3-j@EZtCV0gG@%AYYEW6RVpdv zFe;T4lO~BxT59o>)i+IVCU z?)%0a$3h>|0FX!XX?)qM_?1s>qo7 z6nqO~^R9{v;5P@WD<}q&O0Mn!VYiq#&)eX)msQ~QNSyZQ3 zC?~Wyi%J!XAY4dN=wz}IFpA*n&!S20n!Y}8seKBPS4|;_4t$bMd=`bellXwdGLOc4 zxI?b?WP=4v0Jxns9Cjy()8lnJ9kcdFUrFCINEhX2ktbQ+1P{5lawle-2WTS!NNrdgx2SNDW68G2v~Y|;THs$Q&G$bn&GR=%bN$+-IerFdHq?`S4bn+I2I)klL7Js(mu4!} z(hP5dG+kkkrgE8l-U^ z25GFjRyxkzARX(TEsa*c7F8;ZP-RQQLIb4!e%Vq#2RD}zU$-Es4=kaya&;;3b`6s% zT%=Mj7lTwTt(D4PR;jzQV~MA;yVS$UAa!>%NZrC+q{YrLj?u-gDYVcq8f&JF`Guja4OWHXaPvZ8xS$Z1p+YN-xkjM5DfmS| zAx#5nL&wlBh_M0x87?ZM!>K}%hSFG5ZPYImZG&jFn#E`FI$c3P)>)w;FH2{ZQ>??i zI%Pijgv3QB=+&XZX~jjyFQ={=w@;Dj7PfKe4=jj&yp7cC^$av$7;N7K| zJq>3upfKsMPmBz(i)Vndk%k{QM>yAV8cuT}!;c7|1LzRi0>6W(6MhfF)jYHdtwjf+ zx*v~2%b{ftwEv8{(L$UKpNpYoC(JXHv~aX$>)>O!m0R+xPr>}B`B`rFZd)QVQ1RcJGR{XDF< z5G{ipyN$5sA{a&bHo?k6g4gK9@K)O15JT;xhXAM1AAgjFc3~FJz#rjzl!O{j)l>b{ zA?hXSL+VF5fX=1+>D!D8>;a!;-e=?3&9KA$tH4GuMvyMpER+kU2%i&vCbAN#MERnv zqI04fq6cPDvq-bKX4}m^Gq*7>GaoSjMQkpP6qkvI#h+VX3vY`F76lgd7JU{wEMBp+ zwk)>XVELJqhgH7S2iBI>D(hL+yRA>yV4HB8xi+uZif!X;SK7X6`@qi4uHJ6D-N$x% zNs45Ox_{^Xr-y}yr$?Aawa5D&-+27X)7;a;GsLsb^RnkH&mTSYQY%o~24|0PQSY>NH#&1Cp#s(EW0K9QKpw$gIzC@pO?QY|4RP5mk9RqXM44Jt@V1&YuM|O z*E?RHdHtfm3W-9gh*o4MiWPGeZHf(w0ma|FDQ|mkAMY6NOz#r!I`13ax4nN=GD=6K zpE6cCNm;I(qij{KRqj!K>?8FF_eu7d>Qm>l#Amh7Gd_EKPWfE$x$g6Y&wU@gugEvn zcam?J?=0U1zAJsV`wsaI`+nv}`PuvV_=Wq$`{npm`qld#_xr5Thhx4R^E0TFZGd}#Z@}1qlz^sylL2o8d=&6Q zz(}A~pe!&VFg>t1us-nBz_$WF3;ZPr2iXNFgQ9~nf{KIY2DJsP3pyQ)f@cN)9wG{H z4G9d156K8A2{QsbFfLpWZWZnrUKKt&yea(I@crRO!`}=4B>W%YdR2rfPL-^BMzu@zc|>5ugowO| zs)*)@?uch14n>+p&WPL|`Fm7q)W)dG(cZw{5_5lS*w~7( z>&AXLE^^$Waqo`%dfY!_MX@fi0kQG1?XeqTKZ?B_`(5nAI67{6+|Ib0ad+Y#jCUCC zF+OK}(fIQ5+sE%6|4Dpsd_{ay{MPvQ;y;PM8~<)ic!t>e~sC2@MG?2_Gja6XOz_6PG5QOcEtUC#5IVC+$x9AnDI!D%m4hnH-dy znVgrrH~Db#+bKB3CnZ0nFXi==f2KyIE>As|dLzvzEhcSYT66dl+v&e%Fd0r6V>040CTEmoG-fQ!*pQ*ixS8=$#_ySanZ=panX5Ce zXa1C_&+5q9lr^07PS!734=378oG`I|;`vGLliDYJJ9+%%?UV0J{ysZ6`&dq4&ab(3 zxtDWq=6;_i$@9)j%Nxr3H1GR-ul(TrarxExeffv-hx6YpU<*J1T?~vnmypZ&!X< z`CC~(X*bDZWV=A_M;HAg#V*PQp}TFyl5o&*59l*Gzc4N8qPQRG%jyk-MF(+H%~Zk^1Kc6ZfIHUcFF{KtEm^hX+ETlv1xtIEzS=5jb!*kOo^QR@`cdl-ts~29 zmU%CWSvGN5`LgC^y~}niJF)D_vQL-&y^U#eZVPNvw-vP2wJmGg)V90rNZTuIZ?}Ef z_MlzR?$RFAp3q*{KC`{GeSP~-`^)V&+wZjh)c!{Y+hN~iS}=o;UZ-Br=m z)YaCts_U7qyaOYD+5OFmuoXos+E=Vzv31416}lB~ ztoXFYqes~j+q1A|f6s5diM>U=^}Wk`2YPkAZ}fiJ`|HYaD-&0)S$VH-Qr|$|cdKkx zxv%nD6|pLLRl%x*s~)b-SY5KZVfB*LJ*&5^-oN^t)&J}_>v!u9>R0#Y^;h>V=6^{R77bULJUJ;Ddp02lU$| z+ojtBwnuMI+Md0=czf;k#_fx?cWz&`ebe@5w-0VVw*Bn(3)`>m5bUttF=mHqN8FCe z9lbkF?D+gy@w4^M4n6zzv)s;ropX0C+qr4y(Vdrf33thMh40GRHDg!XuC2SC+jVHy z@UC;aF73Lp>ush!4tO01hR}yXTMS>})|jL93qfI!LdFwm6Vrqrjk9a|2t(v3OpMD=cj&$XWft#ja9p0cXul!mAW`M*x6Y# zB9T~ZWo7Opp#-OTIG=KjReB<=?sl)o|`tMZrUW3!R3a9ARDlkVb|Zo$ERfoASOmI7>VXR8#66!1nZ6s7yj(hCd_j~_hv_~Tz% z4jw#sTMr)G`uLZH2M!)QeDLsrg9v!hV7SM=$zDfF6pG?dfZ9dq z8BHU*P-~G7D;A?5N3qt%TpNbq;8Z|35$>@ePGf;1JQ75-g%~)Y5OCSv8CQ|gVwO{;Iro4l?%q#&Yr$YpXv z?9S!AuO@N3i|6G{Y@Iigy`HtYs`F$fw?KWcYWe2{+@0gGny``+9kaGBh>4iJB(r+W z#F2jl71d9k-#<;w1e6s{Y@eLcF*UmqWC^qj$MV``K8$(Ax^C1eUZaf4gkW4AcaHLe zaW=?&*peX%2%0R3u(JaUL7?pHoD@D3m6x!hX4m=+2_0q6)~raN!VY3J_FDW37y6Ig z+?(9(_J!CD_M9+^huO?wHd`_qrDah_0IX_HQ9?zOon2%EMfs{6?d&M?gznmB%R3Sh zJ1Tb7b|+A(A?_mgRZAQ8!qL0;;yCQxwuJkFgTrAMX{Z&9Ib@$!$W3j-nh6Q${ z3$Z}dj!+1g3!XQ$5{^j=Y1&t!jAm(Sl@DI!%B}cq&#A!!zjD3qxZ77?&own2^W|RB z;A(D%2B-KQYr_4oLM{4+@ng<|L|dISH#1`eD1;~?Ko0i7R$&Wv!B$1B#yhy`m0UI6 zv66P|<%;luUVI3i&gcGx7egj#jx2`Rc6cux0wydpOzC6=SjSV*c&?>gbb@@TgP+{| zXQzz8p^Tj4N7H%Q<4>tXsu5&Tbew+`IeVJu2iVbC!#ySd zbioG6kj)tnOIGW^TJmyFbk-ie>;vKrrpJz0bvxGHj;Jl+qmRN%KrsPP&1XCIelWA_ z{pa_8ST}Mve$~8rt0u(vH8u5(r#?HuefQdo6FB$hA8_ueVeZ(yYuw*^R$!a!Z({3} zE4llCAM6TKHvtk$J0Af9W0dj>cF?*nELSL++ZtlS}EsgRUnu=HV zF&43fX-Zj;e8oH*26N2-pP&G{qfb|V=@^Sd=(*_Tpo$z0UH9m&^Mj} zoQOVyB0I<##YiIVnY(%N#)UKY6l%t;d{)!*`s|Xy2JSWL$5pt${>V`E(ysKx#;}Qj zrOz*HzI<^mcM*;=VN?P%bcJ<;kyLHXGVbnR0KEfQt;E7aNiZPbfr$MeYk>hLYXV(~ zWj9(uAB7?ku82Vd&;Yh5LT~z~iM=JyA8Yx?tIe0D6@OTL|zH?+OppbXd%q}tV2Ha~hzYTML?MY0&BHh$VQ;B+8RXAYd5 zH%E>HPJtuHImVQokkL{`f)g-7>WSDZc%jE|C%26N5mpcyF>^lIqaRP5J^BgPMKLrM zNy1#X@i?D5it|^~UyKCc&!aVyQoZ~%3VjFAWjWBr19&S(3bn1Pi;JV96uxoc>BeZS zMNd!$7U5OR#EZvtF;PS4D6$sQ5Ac@+Hr6~H5Vi0P{G1w#rjJ>F$ zk-PLw{Snr4Yx|#9!IBV-_6IzrAdhj#Rc#gEEQ(?fyyeq|7~L|c!xPR-AmjrHB9BkH zF?!TNLu6q^8C{v96R$i}ItbdN&g{}>idsHgxBb?BCZig=a-yN!!aao8Io9bFw>wv+Lf!W>d}P zTwolX);;p^zUgA~b(Yr8VTYrkxnXs0tbXRRg?W4bj*Ff@w*Elgvc$yRrZfUEZ?oZB zm?S>3Ipbh0)S4{!)3zH-8%P-#1AzIF9e>)M)92D-W7Cu4<6-6m@HFi(GtptYGxkXH{w)YEv9gOvkS%lYQ<%FXheakQM}{T;?36w`E=_3==30S zwdeuk&wKzj`1Ifr(YZSm9~0-50!zR;?{D*09zBj zz#Bx5l9*ZITr(tRG6p>E} z<`=A`tw-*|g7J6-&caQbIPWrU3alqJd_~9cavnhJy;Q1D_=~j`5@XZ`7M~;}d|dX} z;`3IOH~0{wIs6-yWS&_`lZ*XUEUp?z8<%%}!G-tZ>a!A4U5_V5gr%f}MI_=a5jjoO zF$u*b33UzOiWLD-uMSP`nmazGP!lib-hJeKDYU?lCOE^MLcrkoT#y~@~ z0~zSe`(|%dIAe$TanTaqW(fpm0*bmc)9b}%J{xE6I5_)ax8^{&J*Fl_Cl!YdaQAh` zxce`aug5M|7k{ZK`nc;pcj$D>9h~sy-*DE;4}YFj+B{ce;gKIy+cu8+xa`#WDRVNj zYi}M|akItKj+?9W70=0 zGt*D%PY)lV;zs8BJujBgNy`?s*6Y{m zKik%szhDALdn;Jxw|I%QIfGn49&F4WMOt1YYv6;cr})Yzd-T{v7kbj0zCKcUG%rWD z=nL+H&C`c5d$8d~esby%8=3#?=c~?g_czI1HhFryfb+f?#F8s>1O3;@LV)f-4K^33 z0dF(F9@z*etu1S$xG~0K6mme5u@jQ0PGPH(!SIvZ;Rjq3e&Gw8cx<>!f94-IaWD>{ zzW*n8YKT3(m%DKP5+L+&E*?Yl7*?Q3HZDdkY72px83uo)HOHn!2wzF;WlMr-zRWt^#LbT~z*bI=#fGK_TfX8h?-|DVKQI2I zG$Hq5-LRo&!Jn6^){Ns0Q=C55*XK0O{q8Q#dnw3&lOlW*_v;I1xcgh2Z18y#Can7? zO++-!ih=NWl<+2+04@+|so+z^x*yV`Lx*T|h&ry%hWum4<}F82V9&85Ie`A?Or`Pjr)I2E>%c94;Q> z+N>$Iuh{*`W2&meF*ci$m%p;0SON;`bIqD4p$CQD*=}; z;mZZQGzkbcPRLztEw*sLjL6EI(mL6Q_=mzlb%}qFV+H6dfdgPrK}`|`1*Wq&2N5G+ zc8=hiLj2*M2N(e@;;dOK{{^ekN2=M=57o^1KQrkA30?C8{`}3j9y5f5ymJSRh8xu~|)LlUM+B zo;?Tom8~(qvZA$)qryl`zA?Yz6D;0_KT5D{U|T^zvFD~7{B!>y{ZRfU9CY^<_TTof zdDbTf58bN!>EWSIXH%aY4tFRa5w54f)_-7NnP^iOi1UJd4+!I{+mLW3JX18d}rJk(YqJ39*t zD_d)@QdTBL6FS(D9PLp~r~pGTN)1TNsQi;ZHW&0x!t3AQ2DrBm;f}w3H+*oIJ*_$2 z-@LutRo_5W>UXlIH|lS0ShIO4k>r_R@iADV5RhaW8)P5o=OSRdJ!q{3W3ouRB$Kp| zki(P@lDx;qH<%uc0bsY!m}|h!pC`rOj_;n$-?TI&>!StrTeB0lEuX%oJgnutmGdv> zM`j-{E$v87Si7L(WGU|MJX3Dt>9|)K8QU;9Yes&EJiB^%;rt;@pmKveFuFQrQcZS1 z$joO5q;?=9`9L2b$u?jU1vY|4t**)DLIfwLRvzXem;^40m2KGqPrU%r?Fvsxz^_Qm zD6Q2KvQ5m5LWX$5V+>$yS=ZK)SGfD!*M~2?zTz+}H!^wqudA@n@AUH{lU}@9ajc0x z3A4fv1NH-K5Wr$aff>?LMp@1;)LN zk@4eZRR#xF&5otd!tSQLx@hvQx7DTTasShccnym<%vtR-Z|G5jo zU&L$$IK{;NQmk0SU~^)B855kN_7~s-xZsc3dV!nIHJrlVa!d0{yoT&F zUvdz32xr4ALS%J{gbDEV`w)I}2DFWL?9^;77GL5%!wT-4;LqMa;Y+5*9j#B`DdGkB z9WA35lmH!GpuG0$zc6wgMyj}T_z%oBqqOfo@r--C7UVmkgOcY$*RaU)SgF)6_ zUfeKcN2)6GJWe0Fen4Bg;YDVe?tYBOxbRtpG8g01OGM^~@YeLb2Ii=I~ z>;VXmfu(DLJz7V2!=Y5$!@qQJFxT2iq*7}!{F50cClL=LzYRw|$ZjMU2%(B(Id;6M zfLKK#1PLU&Dv#a{;6fo~7IbL&jej&=Th%!fWa+gKf77yheBbG9+n#~#+$BlN6qz;L zUGCc#xXy~yjRJf9x#=&hHM{xA?YH0m5U8&O%58ve)p~%1vIZcW5Wj~?ToG&9@OT^n zl2nVBDiVTIHJiR%*8Rigylr9O;ay|3&tzq+pF4H+*ytYn#ecqXS-)8BvdUgo`O2#9 zb5%;0P3~Y|D6$$82~==0Qo+_-YlF06bE#Ay)Jp7~osEk>Nd?x6vbC`T5FDLUu>S&4 z8qYRg$Ulr61CXf5w;%lL#?;PInFS*nT;U>=mUT_gZCG^%zQbpa-LW$`X?gIZFzFmG zeCCgPJHm28`mS8^eCPI$Z(aS=1eFA6-~@X@pt)}F1${FcvDVonH~h92FEfq~4)R9? zAP$M_`@+i_p*)zP3Rhp5r5DpL9<19vC4X&f^Y(3@STr-=xPoapOi9X zcIAu9Jz}Hm@xrT~exJV<3^A{7X2gZzSGkY4pL&Niam@vcp4Wntk`Sj zimc_wHTzmS7O$T$2&xw1m+Lhy+rL1!S|3Hdy0Ulr$xi)6ScQTUcL>+9Ujp^5LCY9( zTA-zP){@;H;#DN0n_R$KTsT_9v$rJ+uV|u_H{f80WNL{WPzur=u}ENUX$h)pF5tz}7F_Nlav2jIa0w*;!3D52 z?2zk@=Un8{@U1IcYxjPE{m4gtO@Xd8QoNiC)UT$5i#cK!d9L6oa78>ASPINjh)-u# zc*@Yw=orCkpsBv_hSc0JNj_yjqdKV z!}{&i8=3{N(~fuO&oSxS$4>T}URDO1(I&Y9=p2Y#SqrqR6_|KiGXme}D;7eirvT!i zpiW=B0-|(!6IoX=X9ZL8>U%~py79XHH70#0NS4V`k^hHa%$7W1f76kDWUq}IWX6}Q zL@!yRvF4*?&_Jdd$m%EWZ2fmOBt>rfz7`ZcI(x(0q6o<in>4Ym^A?>vT!I&uBC#<%*WE-#f@&}Ks`9YwN|?s)AgH8sA!rKUFt{uc!I z4fpj+Txam)VBdOwE?yA6Cpo2vx_BB8_4FnMdE0RLh#sH$j{ExfsaGX%V<1DNz05cl9iE8hIA@%qZH!4Q$l za?YiBbpo|+cwoyG&Jlm;Tcey<11`q(1+J?$^VvUcP~}r~U5fWV`SHy+zc9%J?ZeB2 zi`o)of)@#)@G;4Z5W}fhMA?d}6HSMZ}vu19~zjLPQXjV+}Ku*(=vCC>}x8&l$nQPO%<=f;@CD}nK z3BG>W+TvB4edXOAeiIW_iQ{~Ia^c?=U?el#qYksFAUBXvTG?4TIM`T&@E{Ny(1(EV z>##>dG8XU?#!Wrq;K9R1s~kw63y$5^e~Oz&ZP?T`g*%>2ti}o4t7Xkr<{g%H<2Q6r zeYpugbDjDnwKcHTUWhDWm~`;rpnFc10xiwh*#X;)W(16ZF@%01=p!3Gro4-Z>2)^q zn$t6}Q>Qtwv~BTvH8H&dV<-C-==!J|`uLSSCBvOm0;~f+v;o%P-^U6C$N~dGMn7%b z34yeT#3~?0639PxbLA)QyF{1^En=MRpWw=vbp6caec|Ezlc;ANo`w0G5hZYAGJ$&l zw}Y2}w(|D?F&P7L!qdpOm7}B~1Xe)WMfQCq5EH8)?~<6VAn}4UC*Y!`lf;@8GFB2t zt7|WD?;hD{#y$ysP@Lq zuk~?B&CXU(OY|#3>neP_su#vn(*a0;(ic3Y8DK3YJ5FW-$d53bAu`vp1baS0F-n;+ zFn4i~#sgb6}w*baB!%@-E)QMjmyxm1Ys|e4phdG7MjCD03>8_3wyyA-! zo#Ozr5gQ3+(TRFx>2O(0eQs`jO!aU}=FI3>^^J8=GqWIPOItG=ho?>T z>%+cN(s0D={?uM-%#>vAy}D)g7LsK%x$DV=ejuP2-{Wkk7J&nwb%AjVAuoC$ZpQak ztr9r=^C3W-1Q1^th1lH8-QB|j*#X4xIBbkQhFD^PG#ZXs@u2%gk}XAIz(H081a?7E zW?l5`xeYU;>av!eD2r*x&25OOKEa*qqx=h#amdVN5)1ofbvQI-ia+kfsr_@fx6=U& zzbUEQ)mdvu_FYTmGX8Wvasm2T*h?g|xl=pjU^Y&WFsk59kj-`DSqIGT^9Uo2@$Zv? zI5j4%GGuIb!v^6VpV|`I?d~{1rd+X`S>eEZuxAxOAr&SKp@>kccd7;?Lb-kO6x_r&9^@o#Z ze(A6~N+3uE{Y+-x1PGLBJ12?6(Niq;u(Cpq77!d7U*41Cmp@5hI!iEW_Q{?C|8fUv z!tF>nXhCF?dcHxI8aIA({-R~Xiuon@(9R=hd}-w6%QMchZ-#iS@Ca#N!`*57yr3b; zacjR-^1|ZVZ8&V{^AHPBXb~1LPRw%vkqTw16>?8cKL=-LKR-7|CnuTI&Dz2u6kgqh zhMHMfS~9Ge861h5pbELc=Nu+5ZB;f;-IId{QPIB9aAb@)u4pG?-XU}nLgE4Wn6JctS<)A_Fj3tczN(~09^k9&p0+A%_^+GBcM= zn$(&>y*HsHtbf`Hg|Dw-#kAF-EeYyHVSSnvUcSEGJ(^WvEovB)Ngl|`T1IFOXEvBd z&?QF{sCGd1_O|9AO*Vj>t*r%iV6+y1nNg+4@k$bw!Y@b#*h)fr_ywO2nUtP@`(oX`z&O~ z-=y_K???X0S&jS-oLOx6C%snSiK0*n*j(!nxymyxiFOhNdfS*`V$DNT{M%)qG@t4H zM~DE@GMewfj;tpf5;ASbQiSqO#`AnWz>(E8NfW2sJU?$|mMW#cymd~*q8W8ta?9c~ za=(3N-a&OxbGv$bOW^#uGq>ig9oI1{DxxrUO>2BP?LT9g)VHB<@fu&xc6Z<8c>nlu zO6An%g1Qw7<=mWA+r6dh9DJQi;>W~~_wy}inG>0l;wSMaON}bX^sy-i>BCX14LzHE zmp@@(beW9UEh|0xqkZF5cxW${Ty3297Wea>J={-M8?nzH zZ+BmxFY{=2bvr(=`-rQg8)*h!Os6^AgI2neq0Twd(ttDU4SQ>Ct( z+gKPMT^k$_(fNMm(rNLLb<^3)^(|cd)PS*p(~^=)!WkwcCC0bi4Ei70wkw{=kn^Ywsq5|=@WNsI?D+NE}_V^NXyA}%>Z`zT(l{*P1JNWsH2Pb%) zWxQ96yh%Ii@8h0c_&;KK#?y+F08R^nQFtUNmS7vkpm?$~X(6(rkt2pJP^~#?4{&-? zV2p>3;7v0*@gkHcXn4DB)GdWV@)x4y`;@#;6EM4XN0s`geK-3W^2>@!<}UvW0owDF zs9<-xwQG6BJQr?0IrND?&P$z?{P6l;2~f>{$O<<6DX?b*f{lEv0so$8bcdG_Jp7HZ z5ZJd7Uof98rv3#QV~yP49J>uV?f7uKl-qK{!N@m}3cEw*ATEzN}H za1x)`L|~iBbb3z}2`9rI*`90409{b`T~1A2NMc%u zza~7cqcK_AoUxC15+$8N^}|Z!9gKxQ=;7h&YHztvfnd4tufqA)Z)6wFC?6zb{!Q&CL9k zO|G7cWZqM=CZ^2FOG;1&C^SJ)1g0l<=dsA*soi-8NJ&UE8;!rUPbnz$Zjen(cNWO) zJ#sZU9?m|q=fPJaU|$6G9FzDMU#z{z7Z-zr?HxF;)~HGTQNhk>nn>=rAVMG4y>j|+2bDlpU(Ag# z)A>CtyVG!Bg0^LiF4Fi~m%Pta@W&l^XBVZCGt(PBYLre^ww|3)|3)`8h8qza{Ue`F zF*B>Ub@Js;OA%=L7I^WyoX&#(3Tg`iPTtzM!@k^M(0WH?b4p@kPM^1fQ)k!0O@~@Z zY+}q0opNhKIe zqzmvJ!3D5+c4{-RIlNk;7FvQ(e8rzq1n`O31^*%RRpL866iqoqc+5@2V!?%xjZ~EP zgz+AdF_KB8QZu8JY1nsm_~77h?m+#b*49M}7cYeQCxL}NXtK}{T~KD`mO}WK%e2^> zwSZ&RAu3{?fz8+#<7oJnFkjIJxuIt4$$i<3HCzLCXg;}~kEc*}TwMzM%gOR&uFmc8 zC9$oEaCF6Zg4-7SloCa$-5oqVot-6KZf=ft^#7ymI{>1(vcKoP_htqL7#LvaZK#Sg z>7XEp6+xt`Siz1BQL&+7MZ}7V#uhu)Sfg1Jjm8v{7-Q-tZhAJG#B7==8zb}he&@a! zoM^K9{bPV(xO47(=bn4+=|^;RtZ{PG+e?x&W6p>Sg;?Wq1BOcakrtb#h{6;jk-$V7 z{J{bQIgH|ZjUnI>xX=i(Oe;>?(6+J91JpJOzsS?rmZti8c>;3~M28Gdaw)clRz`{6gFuYxGXe zI!SV2%*AHKH{!Y6LO~o@DbAX*)3nmRU_HiL;`H@x8^aL_&O8!0DXeBU!Hj|jWoM30 z>e+2=>C(-qRm6;}i}vjr6Yb#^X8Rx zk`f;yiZPBg5uG3c8yqB)4`U{-dc?*f%SGW{e~NzFv+*zsgYZe0p~CF`bZf@avo>GP zU7pda2^?;&mBUR-?UlK99Fc-$t5^z!6jnJrqG28nt9*72!YZfd=JfVCot;Esl}Xvc@x+2z*09Qi;6H{{ zvKUKPrBbI=?WElxgu}On<_@YH)|pL5R)ja)(5fysV3DX7UHf#3?kMO4sNbRS0E46Y(RB>i2lEF>~^wX z*T|n3A(|c7eRxbQJMkA|2)i5(u>00uj3LY^b5*HK9CIe4G8xBQ`_EWMBVQ5t3GH|L zJ`PDoL2#D+J_nZH-)2m$s`BA6?Kd%Ix|UYN;jrBHx`)S5)P>MZODj_5s*-Q<6*+k; zlVL^R{psLq6i2BCM@CGkBiMkuyS?W*%Jm4TV_>ja!6m8_oB&$o4FfMNqt@ zWvA3Vv_zX-2`{V=$x?I<+z}#Y#S4!*<9La;?B;WP3?f_pa!jo-gpcX;$QZ&Mhr@DF z|C#2Beq;=-M;TMdiujoLN5&9-mGxAqZeWb#x#UP?5aE}pR^VRHNiEQ7L$lnp_Dr;M z5Y%=$Y!32*B#9!!aS-U6VvXghkL89vK2qMzDn`jW<^5w=g}i$V8!ffqr@Xs@jh6RR z&@DSg-U-gWu>Cp2sr?7?F6IBFW%)(Yy=pW@M|tgd7S3K0+4xdseG%jR-OE{H+mE5g|VZ;>YOv*kr+%UR>) zpus;oz~ND!57;1K-V&&YeF>5nt{|>bg-8>+H+;PR)X}4FAd65iJM7-@^zaL>UK8~r z5w0jdt3KbZ`p|qYqhb0c%K4*+m0gHR=&mwmImD!~nnYcVkE`OkQ6d%fBDwP5G@|Q{ zi@3JNpd{o7DY^*k#9T(jW$q#Qq?eYa`xoT)t4bSrWJbk?&zdrBKtXGySxiVS$x$pRaJ+nIn#$|MktDI9@-P|`MXsa>YYfMSfzyUGILx!ei z5ABszkUFHO%Y zGi>_xWvVWTiDZAmsx=E?yY8yWfCVoh%g5fu#VcDA76mUj3YchAXUVv@Nns^70-@m=5ErVonyBb7VR20 z`tf<4qNi`0Ja$+4^p9IFE}Bxft50I?OJkQDj7WMyKCCU=QTSB29{in zn3#{6C%tlw$Hb&e9@u|MH$+fP-CC@+>)SM=YsjLAr1EjY#+$DwVO0G#OcDH#>>abE zh)!{h>`rk@z!p>_x~JJleos?`5#qz}em~2;qXrXpBiv>;9v)N6mi)yS+IJ2I`+k^@ ziFz20ns$}OXjE0d(yk_Tw%OJ8-|&~Uv>p*rCm54+h*qN$$i1cPI|T=a+Ki~pcxXiX zlNeE^!CE*BEpF&Bd@U{yptOI9F@CfbWsIsyMiq0c#@k65gt@>)W&k_GH2#nf6IG@x zw=hW^Dw;F_L4o!j9;#?P4mbHg;3`0RJ@^O?H@C5K(@py!q2bwSV6@VE(8e`=G|5@-KbA>@vFRFEcmy?YpVw z*uIEC3pM_Mxm_B^&l&o){Lh1z<+kN>Ki>A(2XlOrJB#yf7H*%oA|TD%yrpE{?1_7Z z-g+@}`rvr%J&)hv=dF7aV5Tm&cnkugLoGzPTdMY|K3tPG*uL1v=L4ExnVydq1P zJ0gWt9#96!TmerA{ge|WfuM^KQ_-9=jy;peA=A0sl--j2r+ z*xc+7Zh5+C9$fL^NiHg47o1{XJg{8r>W;fUSsK0I^IZiEX+x$~WaKdCZw9VTEv>HT z-mC4hw;y{uY;-!}P+EL^sR$0aReR#z;}FzWygVH>_Py70jxXz@R(W#TEdvXN5;^Ob2!-X zcm5m>KlwBUyBR{e8EsO)DCe4cw)uL7^YzrSZX8Y+w|Ob&kw@0RHsuHVuqn$G*!R&= zNTjpA#y%oKiQs^W!=srxu#J!!OI`<$5Tyt;SCN}cDYS-edue9%D~&^zBOVeSht^gE zGY5@WUjEw8$F}S|zDZbjc0xmr5J5pT`LV9O`+3PJT3JpAtn^1!Ecr9}o44P3;knRT zACG$uSmjT_pOl^gPYQ%No=b>O9zuCiJQk8*ZUJLl^JIBAlOzQjZL~pt*QzTphTq35 zkM~c~o$X?CW;q;fSqGea1l$rF&qv^V*#ReC1@|q+MBBoVGbxWwfdid#kcdQCJj+Nq zQ#bBL~e&Ip7syGv7_zH{d7MJ0p|_?kadt;E+Vf z;Xops#Nk9e1ZO+(a=N#Gr(9JlUw`Bya0)x%3>3=#d_C&VI^Yas%^c2uTh9PCp2G=x zXgw`9>lr}3_<+v$hy%fz2e3>I#|TZ_20!X*jXT!Um&OQ*=m4rxIh+@| zI^!n^FSG*|4G|s^TCEZfd<*m+2)!~gi;B~DLA3SJxv6R*bQ%f~@Zl`C-aRX=bzE|0(=Dp%m-t6t=ALLY%cRHDEc$S!j@wiXFx zJwzo6oPlf;hhr-ZUB{_FZlVH*pNayE!Tlg-qK^tiGvanYp00a{tHBT$7~a*-&qLIO zJJiH@a0#=^4IVF|sDO|f6uYq{piA)x>ID%(!+!~$7Tx2cOJ6r z6-em3wSd9K4%}Iu2mR-g{Z*odU;r!Xzz1^Fb?^s2j+HJJtSJ1->j8gg2bY$zwci5z z0A)=3IQAOWz{pPA%+~;ZfdAD0gqDj;LsdkUn}ej)>Y1mjySoY%9&j<*q@p2|f}BQ_ zAPEB!%08L!#aRH7MJb-*`t|FSEQ;@DP_tPjB{lwr{~GVVO8KK=-|wK~y3?w_e}Yx; z%_2qxE?%c#RgIfJvPSq_4o^N$8&PalJX{0jXluC(QfqmL2`RX=3RcSgCimsh;SG7q zPFbVFckIx(KfUNurve0sN0y#mV=fnVAVB==QuDv0e=K?$SZ+rckFc3rtrROEMpWM z%OCOe){}i*?nb%4SRLG&bV5)=m*zc*_YozJ_XpCmNDJr~a4jWN>IWZ>FIBy9Vg|L= z)eeEFT1#jrH`3V))?8ttEBNu4B*+!)>WlJ*^`}m0)slO(8(Sy!ll{y)*}Xb>8D4%? z^mwdqiZ^=;bGL$3-{-PREUjBrt19Ks=4fLDUXMKr)qaQdfwS{588~~ovktg`ZJtd; z{xQY?4n0FPJ=rp3nl0o{hELKHw>$GE#)*G0nr?fxtbHF*t1GmXj@$ku=6%fiX{Hep zAs%9k3!U?hy|jgd+h?FqVxC4g#b;}9GWnY6eKy2Q8I?ZDc=$s7vJ3(fb&?hlAS!SN z2Mc%LXiYF66bx4qN?yURe0_4x6Gxe;m%Kx06okwfRidXk|M=WDE3ql{~e0UXYY5m7=|0i|Vgs|P;IDG#IU3>ZXb_>lcsH>mXoPB7e zuYJg*6$4hB8row~M^=nj)3|c@nWg3{N)iUrd)gY1B|})JTl^W$Y2)c!LGO8-V;zCo z9p{SM7`Q}Oq>NGB;kzATV;kUbIHy(M568$u>CvDH;CDxoR8=%udv`?gMAHxX+#I) zgKLms8jesHdQ4ox6aY@)rSuw@hYg^^{bn?gfq)lb3H7w8;b9057mbM((W1NgfRJQ< zRT$p(OH^gz=khz7HnE6rmt0zqG5MpTspC6!u2jFOb5QDEwAksMVa1<)#s*z%Dcbqb znv3#}n+(oUt&1K^K~>%UZ*3%UKtmC6+Kn>XOkrX0m3zQw8i4G=s3_P;QMr(>m@gVc ziA7u2{IGax6VgUjjZ8t!s}*wn8fNYAFtUTEwaQyNZibE%wF{!hq@&zAlnefV0Zv31-r*^^0 z_9xG_t*D!oH#u$f`){ndI;Qf{>UCEuh1R`eHWymXxO9{A79@gk4fF!1k{~4MTe&#S zxERj&w$w7l#HoZ*3an%37DJ{#s046055XNm)GT+SOclJ3&vIT5-?qYAFfZ{IJ}>yj zZ9cEJ&AeMMZ!(v8@ma{c19FHqJ#1#>nf`qB6jns~^HL5a1lg(Nt%k#a{(OYP$#?_~aXNwn2^=D;?re%J6mSyM9Z;Zf>v1f9)(MaxkV~U{ zlD`iI2OK;+>i~2zCJ7?$zsx!S3O?)`HnX|{^GNCkbduU|$7T`iAh{c5$>80=%Db27 zT~~18Vvco;1#cOk+Q?_L7Co9%z9r`y5pjycoPEdxkCRZuAc3XHFA00suphT=lbzR?N8y_6$mtO&>L$z8 z1y$=@k!j89jUJjB2?^IYUtL~9jY?y=K`aY zr75?;-(XRrIu=I6Cc^vJIZ!}iqaid@)aiVA2rK8KbQAoA{!hv54_CVo&m=^f;tWvw ztHx%J>{8pkD3VS5LjjDBGLyKPKWRetqKSd7Ia4b%6@OL|15~je){0!IpMn)`#lVi^ z{Qw+{-uxWF_JnhkE4cFANkMT7D^KA$Se$#6D`VI~zB?&4{0ncuM@xJMx(2~f?dEWd zRv#_qQY^m2cet&Tjhn`)5 zGeC8cuSfSV9F9YRgBt)t;pehKA?Xe5<9+y(T~Ogjr9;UkE?e^mU>gUqC!*p7*P&xt zhwPb}Q4tXtRIJ`SWBL6GX;0&kd{6yy2RDFMT?YTwLplkA-tH1)GC2h3^{7njoQ%=$&^8 zwyR(D)h~50j$hWiv@L$|&OVOXCOd~w^TZp2Qk$Cg_f<(0v7~m@9tZagfGs9P6`tkh z=FOY}C4&KapR-+DTuMrq7BLzWq0ys<)yWou=m$)%xNuNb1-0E!S33rU-9)XMO)RuX zVYUera4QHN@#%FH70c4&1>@-_%zF?2ll^!`=k4QQ=jLkA<|OCjBq#RD3JS={^tf)w z%qs|y-t`{Ud)&;LaXF*C?{{L&@-!imo%G7i4e?D)jy15Htn{?Z%(S#@*5DdExIDte zt7qRFFDO9VYOg)4qPiN1i1*7^C1&|(!ou7F0;sr#T9=cb-@k9)&PlP|Embx?qH=va z#-|5D5*~i z*yEnl7st*G=#}a5|52?&s>(`9$<9tm$r_b7s^|EbHRH$DuuhIX`T0K1etr7~!lHn^ z)-2&Cbd_@YL@$0Kd>>f66hA#bp@)?*!bN_v^5LkravmOQ!{KbVj49`EQW0ol9mD-} z91cFuxq)JrOoE%vI%X0iiwE)yBnyAyeG?$jJ&|pL;nY=;a5P?cRVLLqj@te7~o*|6ONeimz66m zYq+BR5?sdhf{R_fqqD>${$xDYK*=3V;9)AsDZ&+P{;JWNw%Se9#1F|#8Ir11e_1%M zS94uzy3w;+5?1~aFW6AkUMSnT&sJJ^7`h{MtEz$(1=EugAzLYoVI$4M}xu2&4yq~pSaV$1+%|{Y5%?TF6JcP<0;%s;J5&7Z;_dDq^E>PvN7)N9+ag zCgMoKLH6GL!|d-Uv-O>OXn=#GpUF+WgJAhn<0q;I{{D#=)V-!EHg?jqw6^ywE95>j z4RB7sbIFUZ7-Ep}1XSx1PXN;}I2gD1pz5Iri8_>4B?^MQ2~6L|-ct9D?oNfdsV#Ao ze_0GrDmAYaZ~xaqh+@~xn@j$8EktFdR812rg$3S%d$M_JxXl|!2iSZA*yOe6v;ty# z1t-NTqhJyB;S?02l>QaLfTH%s@E|8$K)6vpb53xkd;{^xjG9S6-i+>T{SkA>_m}Ef zVvacLoZR}U;nq(Pv3n{h6mwGLWL`m4ElDbhd}Ou`A$Wo)ugmh4BYxVpUHGQ$nz+8D zML4r%i!iOF1#?+2kGbNlw4}BNY;;(;pn=UCfN`tBphb=)o|$X7E@dA!8))U~px-~S z;AA{sZvuzW59=!j3|I15i4G20t)rl#0)b9WC~C;z5sQE$iJF!WuYjkB7HSHHm6D<6 zNP@}OkKK`j#aGS$3LG)Si~U`8AJ9@Dgs%~*h3K{07&CulZV_5&N4RBx&kk)LztfJO zb{(Dwnh9_OTZQ@;Zn-n@s1lc8#=Jef#F`MD&gA4s^u@WW@||eRLxQ9QvZsV}glt02 zOtSP!@pLor?6z=m*;mYUZq|k$Pal5r?z)Vgn|?TP=%pbQFYh?K=laMYFR5QWCvCX< z*u>{|jS@foRIJ?n+}P>YwhR`}$x8mt<1{IF_@ zieakh;3wY!hyJ8rBH9?4T6X@PFfl37t?^u-SNN=f!dr39asMdA6Vd%8f!1kIf0wcT zhqH&ye!r&s(UC9iJoNaB!`0{Iz-iBIDwT8CrLxUeC$rCG)AAFgOdQ{~os}J5!ak$f z3o!d#oJY!cbym5HH9>xUfr03fqqFQDZX-pz<>l8X>J{w5MCtn!*33iMVGhK57IXz3 ze7~yi&c){QY)<*6vfZr9TYqO!J4>5~v0C%_B|H00`G-1X;a7Xt{rLK@RV}@qYv1__ z>%4!j{NAg(+Ev$bT2__c`f1I+uj(wA`d_j4Rx02T`dmN#3(b;jzb|QKfCn$cV{2G( z2x)1F?hho%p|B~f;UktPBVM5q(Kg;*vchNc5zCYjJ!yneEKSj04|7gWvnZUtScdM0 zF$R|hx+&Qmrt{liBZpFgmFS-gNRCuA#+!=Wfv*=a2u`r+MxZBWu&C2fp)aGB&m0JgxQPcuAH7UT=dZUZiXuMwFYn`)H7 zJ*_;Adzrx?a2^%K$F>ayh#d;5Cq-Hs6s47_h``~@^+Ta$)f;nmZ#jQy&PTguAL!k> z@PpNZHs#F9-Xz3q(G|JHPEe5Vle2b!dPx5hU0*u11| zU8lHxo2RVpwRZc``lZ+ml|9z&0MDhT3Oz>*I*liMpc?Y8@K9p9D}lxkN;C6~|j?SAr7k(6#el2A7z)HG{Bl)&wY zu-YR#lj=4lz@z69tPcq5+F8SU48ioOuwuoz1S5P$#=K3?xgzV*NlaEc3t27nLer`j zi~0>bI-z1j^8B&$PYhr9`S#{d>!)2?R4}v0t@Gti&K=l1e)5)q>op!ZotH(W56Mg{ zEJ?}Pd|}?+k7rGOZR64xR)s}Z)aI?(XzuSZ>iFuB8wQo^ow@D|VThj+&}9_y3s0}8 zC_ylU0_Q_vaT79Bd=Bc_b zKUzO_v+7#6J$yM{``RV)?RE%7bgQ^yR zok|9cD8%||mdU$A1 zLZqALD-NQ)>-PLm7HFCKUX@|xN11cuv;soi9FJ|KeP-d zXiB~$VR^Z_N=64(qqo+@vPf8vu0p5=7&Y*5W$~_VCRbOtU_mqqg4BQP?bE-1KlZ&7 z_kWfR2X<=BbJZ<}_H5M&D|OpNyEb{}Gi)E5*T%*?EsweX1MAAV%5Tay)S;-i`2~W? z{PDb;7ve0D)eG#;Y9YrXDrwCR3SY6jg3>M{ef+8t%2yAR`nBDgFy7g2iIbt*re&f7 zI6Qc$gm?nnnD^+$Z2uW2Cl^l`tqOoA+`u|XPAL0QqjmyQQA}$Vw`>TDuoTXrP*Gf6 zD5?t1k)m+G@CaU8in3fC+52h11!bWrM%Tz#uW@yyo!KP4f2gN(h)y38;ThK_!MM-S z-_Jv%bxjMBf0I)84y&|NH>kDhKFu|44&ia0TComUDM9_x*~_8DC3${1+w;ti)7rsN zkO7Xh&*8T{zCkbVhwN!^7*x?hH9>2|CthjNpp>?vj#vrq)En#g9YdE0d%MM(vknwI zd-x2>IyFWus10Atf>_}z@5@c{iB_VnYS8`Tp!@Esuq=aG3ILytgFcSNRdyh>nSySv=Fd{Zbcs6y& zvDL-9o;q}F(aB+h_e`5qmy#E~+msR%GIiSWv%^^H#GMm89o+g=7gR1D=qakj)k`7@ z<`qq?sW09zV$!r^Pmk;&>4SG=M~@mF7TC3myXW{rbn|mhExb`0^7-QFys_iI0BclF z&Bf7R6kS|UPK_#sSt_dGCZUpt59+BUaS;|J)$mxLH)*k7jI&Fx*eNsQ&;uX0NPXT< zp5>%nZs)ROF-ptih?fRrHJQ8j?~c3c0CsF7kNykBY|hBps&RsG)yK!*-x`*T+g8Z~ zB3nR5oj--CdB8pT;I5KJ&U&w9@a}H*YU%Lo_qVKlyH*a~wYB@MvIAQ-3Sp>B+ci3D z?NIq0$@I6M=Pxz?^u|s3ctYasciw#mPffh+09F#Na?jHFxCZDYqosTvvJ^P0c)&p| z_rim%f;j7%EG#bEk(QXUu-AqC-FB>-v@j(<3Y!xgI%Ue>%~QKC|F<;ULi=%+Q*990&itJN0vt6p9vuvYcZO1o z%XBM+LaIl(Sj0opmBhI$xS2F!=BJ0YelmYOb9jn2wA@)Io9+O;O;jwT~ zVjpHJC{Q78kV~cviyjr^Kc(BKog?J;Tcmz#&70?`!`# zzi`{ZvGVisn}j{tU7d@4^vA7)IuIVtHFln!!R{#02M4_)=l)!bqi@(&Sg&|?86+QK zT2wrTYKn4^n_Tf0#f0V5=Z_qHaNOa|b*D$Q{NA!}$9E02!h1c-ryU=gK3*ywI`-p@ zEl&-#7p6b;Y{O6cuF3KWdpUx=Z$Iz1=UbVZTh$WtdizN)Y+QP7BzWo%p!$K*AkbQH zmaCJyySJSm%3b?9*95_mLBcCc+g(tn1#9G1Ko3thq~*I=_$faJ;HM~lCt5gea`LIH zqVE1JtjB42@HOwatT>+-SC910gR66cw#(bju$!m-b5LwdZ|p7&N|}@|uMkF?RkCYV zac8x-MB|V(uaq^LM~i*fOM?b$G|RL)+9zOgwZ>HyNO3TBc3!B*>0E<)*9=9Axy*zL zsQhs9dK&zKkAT6|28Dblp*D#_7o4dG4mubVw8^}8-|in)9vIU)UgP@vB;AB-o7R5U z)bQh~*Jbk}dpV5#Lo@q7F9|{B54N8#(W)OKel!!B<|WWe9K0}wkPzoM)Gc;&=-k=P zE&$RkkcCz7!i(^AU`HS13G%v|N;Z+wM3D}N(t?AZ6&w~JLY)(t>{E8EzGkh-K5%_? z-HD;T$&p90GU}>&5AE`J%+MbFC#Gg(OZ`Tky*PRAy)~nU4IAC~pF@)`o*A`4zQ6y~ z*ZV9eVCnLUgXd+9xUh0RQ*VF`>TA+WD4RjiOpqmY7M#`bT)2;-nkf1UKL>mi*G*Ja zCK?lMvZy9Jlb-Wt(t>zA4m2r*lIqTyY@%@#4TrQKMZ+of=X#RWBL@D?@y9i(EkGwM zWvVM!jqYq$;L&Q?CtKIAT(5&=iD^}Tk_(QVaK%n!LwgRQlLeo=%FEpy0b1zhqg85B zDREKUri8NImRcl=n#7G9WQ^dIhv0G%-;6Et3hW&dKQeRvM!Ej5d|Z4%PGRd_y?xW& zNw-<2>oj3x!~8jBFKTiikG%Bc#+P5j)6h!I0&!A_A zkVK}2BBw$Cg_HXqZC(fyB2_v7#%4=h(2gcfTv!&ft1mPZISOx^Bh-DCU0FQ-TdByAN2k@pp6gYI48DE+b*SR??hHh6L(}5Te z4MmbD>;Hr03l@t1t#?~H%K!@bO$G3fueE4m01grd-M}Tn*RCec)m7yWce8aXxN<-@ zr{{y6NJ)mQlY#_z&gvwpVxX5$K_bj@bA*H}3+d(SnHH4Uzl%X19NyU|v^L%PrK(*e ze=k2FZ*=rVS4F*V-ePh2rmGi*o?BJxsn@O7=__}Y^?d_nR-*Qpo2xF)d;Uvx(9q|u zJ$)#r>Dq)NP3y+YipQFcol1IjUu!aO!lmQYR?D1JwDWc0MTh85$!bs8acuV1p%A02F*(Udru- z4kWo!$09qyQi|dRkAA?;QO_c!W0Acae^Ty#RQUd|yp%111@SX=0OrAeJU@xsw-x+L zbAW#*+`M!yJUt;DqsWET6sc$`0Ewqp2t;Fw=pc;i;xKc;=Wl&i@uU2;`I{FH4m!RD z;ax3qr->IAyz;39#R`2tu%au!lNDXi(0Row9PwniScNlI;gjXad%qw9RMKkD9rZPe z=iv{?@ND#i2&PQ-5mMA9jSk0EYB{&R&2E47fMpZ1?b%)VfPH4goSvvOgl9J2VT^1yNq{7Ud1Jc(5pa09!k>_ulsjRr0v2ZLRWotnoq zqq;XP7R4rj%NNVRcU-wx5epH@%+FsE5)TN8m(0%#h0mKWA245fUid+H(cE2lo_}>S zI}2Z!ed!DH6=2W1!CK0DlS-nmuaA#INEflj&B2B#DVlso9U6(m-HyVCiXFyMw9MKx zRq}so`?+V9$nupr@0Dk6*wX98*S>xC%~v;E9@V3msH`sQ;Jcf37K8nxwwkJjg0 z^O9>*!n*7Vi1K`_Y5lVGISWc=*7Z%D71_J<2snEg<(#VXffXZmMz6JVb(2(%?sgE+ zh%kWR}}a?Z2!u5UM~jzF8=!;tn+wE&QthPLT2}L zQTv0JplG48Z3P zSRXvq=n0Iig!e+(%^NuJbW4Ttp#GiX zzzEMdp1_EhPEW8z4@c#qAU?n)Ji4F%WG1|O{pg(+?~MPC{F~hV!;{B~TNnRb{0Od6 z%Um1RtQ#}4t9c-~y68s0jM8DtjGzvh57Sv@K+gjst*nyw#Z9xr}BS(fok zZ!zEV=gUtlmfJff>bUoNfcvfi_vP|nfWN=ilUhD%MeFh4K2XFM@OIBi2~~yp(pkX? zAs>v$ZjU?GyHDx6H7A*Pv}C9J(l?7wmz16!yYki5{Y7)M@P_@svZZ+c!JO_(9y1=Ln6u1 z9LJXGHlacUzX}beWW^EG(V#97y&|bK^5=#7eti6v{KXbKdHd0$FsN;1?k~T^0yp1p z9dmQffm@XoH}~&*eJpQPcYX3n*5h6CARubP^DJb~)AAFaJS~5}g^Ji*WcucfO24`o z>`Pzli=JD8^djU1mEeLD6DQsV%t8m&USOm#hjOvRU@=7}BnUI)V=&N-Mn7E;Q-R02>KElQ=&SB`wIABHdu+8H= z19F!M&3D*WULjEpdp)EB#9g`Q zH9BTAYNdL$PSpc}G{8I3r?GnMfK_mVt^vUfhEO?_5QW#3GwSRNi|zP1iD z91G$w?BxaLDyNLfnVLQJ#?JiJ)scOknOd^4pifiPrg>`*FP&GudQi7Aw1Ua0A3mnm z#}47hg~Ku1}8=g?weiOdDWm%MTKF(E5gH-U6jTGFFel9S>s{{TdfZ64o*|b z`nbH-(VCM1Gx_KnF9>BfcA$-+`S@!0N`%mH*faSquHJBZpsiTTQmLwyPtR}!`)FH=Y3eaZ7FOJA(-7|(Q z8R{EnaPoJF9*_|irWaOOCyR~KSnXL2~-tUcqM9BOxqH1am=uI zGkQU^)r<8O%#6ZJJeCBFEOZhPtIo1D7XHqaIOV*c5b2mhhs?Wx7desLxKDOl1K$O1 z1+uZw)2`5|q-YW-PBntY0+f!Q0!-@NYJLik?ms2|t*x)Jmr8#foTy?hqX8B= zch#^Q_Jx1MhzP=P_(n8;3=f5e zh*A6Ru3Yltk$wArT)E`#@x=!U1|3+mYtjCK^BQ-#mwxTt)&oDU)61dk1IM*Lx3>PY z)`>l1zUWYOe(~Z9RgPjw+i|BU=NDf7J60S445HHrRy>S9`$=#&;x2rz>?Ir_gqGFw z$M>;Hs5m%Q=`TULy{~OftI+$)u2~Y@AW*Ai_HaI-$pd!AlDZpVb+| zWkefGD@m$~OMr{A3T|2Dh{kT2>xNYC9j3)q7wL5PK)1E2G3k4YcHCLE`WN>Azm49Z zMXd`PPqdnht9(Lc-Fx|28G$>zo1`WVvwL7aA*<@`?WGWO?t?c9`{-+NNc}-p1!oSo zimHkm*y5MsjwuohHE}cF-O}{>9DDi0Lx)(He(sIc8{V1ScDF~vl*tV}vQ|!>+>j-N zpKVt)%>CCv;(v1Dws&h9%x6|#9XIxBQ{&|^V=mL$g0b<>S}4q7&C@fZJzN7yUmaz~ zNjgoSU_lCo<{XT{w*)#1*8KB1*1dOa|F=%CFAm9fX2(M5Cd4!=t5mL1NP=yUA)1Ca!;CrzYhvVhvXY}_+wo-B#>!Bq{^ zDKK*Z_p`3$c##Unvn1}qN!kOej43i za)U&g2e)pcYkQ5(9zAdAW{AJRixVrv%Jtxqhvde6$`y0}DY*eK$ZFuI`JBr@ z0u^RZ!n1EEsNhnNRs`l7^4z24QTG{XFMmeJ` z9i1_=i4K(vKgxPf=TDv^C>1c`9?9^dnhWL17oxs>^uyoR``}%KmQw?T4AsP z$0k!yfkQcd%6h8UXuxqi*CRn$km6(HIftBUDJ!Z{y$VQ<=duzNP|7I0^@qx^IV#0# z;rvL}Aw3&pJn)Jf)j__dj=V$Q7M)4NCxmL;$abe0r9VIqhs&=>9L_%2yqU0%5!yc+ zp;blz&z2Da)JDJ;(Azmf%x!-LFtzAB!~~5R*$}*=DegM@C+4=D5eL$joUvf_e452q zyvlmQa-l=4CsWmfI8YOs(V(u^d06LAc#HDrn8S(#VK2wQLStmG?uy=! z*3&fCIndWr3v}eR9_*iY=2Tz)!UiwG-#K1%7Q8IQ{kFwBItY6=SF*M2~*-CE<~ea zsTCO+6{*U1;opNN#l=;Xl}wJ0uLA9~wEt7RAAB|(b|Mut6hzzMCwhNKf&AzA_J7+^ ze;dm7^2Og1cyHyXEYGaOKIu+1o%~{gooaj>T{S9Sv^nEF5vUDCJlcX;TSYOOG$F+K zDs>zoaEC$9b^EKo{l)uieanuP9UC5N-ddQKS6EV1DE4oAr&;VWdCSh09UHf8+-7-O zn7U=h7XC(2US3ggQK98IPbzn^pD$dTj6j~qT)iKK_~X1xFYPd~kX`}?_v zj~qF6~;KP@^Y|)CH!d|&IztHc)lJKy@Y2Lmb7hLCr%?{I{uD0HX%=VUb=&u+dE4~ZGrWY z3hs3T2b~ zLi4CZ;$|apQ-ok1bOz3HW-cz0lRcCYJ2e`Kbo8I&-REGe;T89Jzz4)w`pNXCPKieI z2BE+C0?U%GFqb+hvc-IN%a3*P55#+6hmiW9??-2{^*V%w>4RMZ0-Q}IZyyg2Z%0du z!5(yi6&_)k36Eoq%~NJFnxIlz^CU==rY{^t;Y{_ZUfr@b7tdTqeVFi78QP-@H5|+t z(G`WJXns(?sSOuT;T(Hd6*U9Ia3hz<4+d#N!vDP;L@>u z+}LmC`>3kM*iAXxbJF3N1-r8{AFJ5^^?LtS^;zW=vd<|4>c}?CMx8DT48T=sJWNPDC6Jloy39QpmL0tL>dlVi&gf z#QGH{kF8&MN_H!$7*SR{x}wDV%9a;K>>HOfKHL;GIHG#ml&MLTogyYG=kWfvgJ;hi zI(YVU>*N*7r%YYCl$9MgxnO%gqw_euVL@%}95bj4^9IO%3N)u8s;yh-+B z)qR(bDOpnzTN#&#ex-}Y)vg|Uaz@datgQT$`sLFqYNzff?7e--4+ek78TvpM_HEg! zLA%y3|HuBW@>f&lOHrdMCJvPc=DZKgzW|1G6_ig^6T^@*7oO!B6&UX2Zgdh=_V(nm z11CTkRVr>_db|OmC z#R(d@ZOE$p0~>~{8hEH_SV{5lVP&OoNoORkZj2Xmf6tX(N?y~H(spUtGUhsHM|JC& zL621*K3hF^=B%2USu?3$RG{#MdIi=_HIPC7zMh^4`4GLdXkMx^dZ`7$i{B2h2_PDN zUQwA`(W(;M+{mFp#$XZuU{Zlz#RIqvLi5=dZ#*$yV%oRHzicOn=6}B-_`gN{GtD=I zL~|_L?OEwhFGEV*t>AJeny=TBZXBdsjU zvs3xNDYK_e%NrXMTwOAwQE>C>o1U7PnVJf-j#?Gg{-egr(s`6zeKZU)R>W;m^D7 zja;uZn4U8>~Z{~I#Zs(!$w z2dAcBL@D-1y|0X{pw5x0y>iuqGP{O|Vppdcccal@K(N1q*nKFOixhTBMM<$(WpYGaWciL-LnMWr^Tj+#DgTw;DehKYS6FL(FJ2yJ}wgwRF^ z^oauk%QroOz<~vzJ_Ug({yz1l@X}$0Lk)HjtaZ{Iwf*|~b-U!S{~O{!g(HDEi-Zf` zdmQpiP#e$S8rY?)Iwi~-MYg=1YV0-eeWPzEzw2CXP}E!pruZ>LTRE`VKf%aC%;$kJcz6O=-rz+vhD68N3LvY z$bUO=f@&P(l6Z6qq)Kb>v?h8*L>P^#SO>S7K&9}X;%T+Wt>hy@HaNck(fEb#Y_N_P zyn)LwQ*c92FTcH^52L_O)4cr^kx?TyzPz+ycTQ;D{Npo5Y>XBJmbqX=#@eLdVG}|} zHV*AFVnT7l_+HK)^VQc&x4u}jK>p8fFU_8IcGAF;hgTJr=X!K?U2(QND&%p4ufcp| z%&t@UQ`cASdtpr39Pn~W)<1Z81hVeNON%bLe|9g8Ll}>JYWdsG7|-siP$) z#5JID19E5G0uVG7?Q4{zNG~rbRHuuRT+zjpOTciKTW?h!h7tZy?L&Tu)%-S7B(N|p z%HW0o*HlO6t{6IOdv@kyLxwcu4QLozwmqxc&QZ(vn=2Ei^(`Jfd`Pcqp`@}XXIe@^ zb)TXN;a1tkvZ`5C)q~cJ9I~!t(#(l7o@g95YRgB;c*%+@L7aY7|}s15%vO1wi)bNfA*Z58OnOfm*p$M z$HHgk0JG^O$XVWInCzMAeN;<%PU8S6-t~gB{hwCQ38!=t?0t&(oPF`0g-dn~(C%~? zJ!SMXbfg-$s&~$+3DX9ZRH188qx70E8@ouAS0Mh^Lsf^l4_Ah@pp%#)%(jo|7C6ko z=T<>zV1^qSHl($d^hMsPP%Wr{t8Ce2k? zrcvL<-_Ot68{OdD9OnuFO52@8$p~CE~ zVxy9Mt;kW-6^O)2Ew)OkZQ6hifl&5U zghX7`g}!VhiG$u;FjRS{O5`Qbd%gqpJ3uZb+gl)_xFS$vB^FPRg31y-U=8n!sESdj zFEJMtjW^&VqsIgiw*CAZ-Lz?GNl7L+nZXDZTY&W^zZTE|HY|x$3V5Mm3P62%G%BRK zo4y!*kuL{d*4Olt*C4@rN%TIxkYf!rJ*wLx0@OyvM1yYyaUmf_qvaI~wvq#8ao3cv z*emLrEN<#O)$}WB{k5s){>*UyQ>K^iGQD(RD*n6w9CK-ln?7BD0cQ>~{C;>k{?o|# z!{dt^8Wz)+JhNx-zFAp)d-r6Y9-lTnCMr5}>d4m@^o$9OjO~`&H7q=ljf@L&333nX zx^TL5nZ-@NdUd*d>*_t!=y`7H)aT?kXd;a~efsZ*Vc-^+^Y7iJPGyI%gj|}fEta{= zW6tJ@%%y+Bp+gOg2M#n2pEPOs@QD*&&MEHN)6UL5t@ogERv8==?Em@pE@45D^6$Fw zqB=AlW$9|hji9@$M82v$3a%llD7zU}Xj7Qr>D;9Y{0_0W1k=)7sXLXus0La)THtE5 zpf(FqVGS{g)>K6tB~ccSx0SS&iQh!#bQ>6PX@AX@Qli&J`JCiTk8@h$A0T3npk zy-?%cR@OFHJaRuaJ~J`4q%x;*n{Slwnc$f8*z~?h88ZfTlfUiPqes8Ij11yVR5QMq zY95NGaO_Z{wS6>r6zW_c-oWZ}vv@6Fz*}5&qg;x#>tzUx;>&oHF^@WvIR7iL7K&%y_JolD7;iG3OT6r?(i7UGaWIcqrHF z6pONlXN)NHns$6qq3inPg3z}w5P69>gko}D>j zWg~OH>6PXo&bT_Sv~f`5h@wG@`U_K!&h8Gbg#V;^^)=k+$o%*6Rf#@``S-D_aZwsj zcj=;}bij|pb!p43u0@zA&KOG&(n1F0_Vn?~$WQc-a&ZjO`=^C@4J6+B4YBZiOg@W=C$h^!ixyCqk^)Kv+if7~+ zPt3_Mzg07C?5tUp6KY0hrKI)fk(QDL*vP-oRO0Nz8U#9V@-!NJ)YNg+WRo+&T?G$S z#i9z`NeP~?ZcxUxEA54Ak_)LHg8E|Vk$VS^nOloCv#5WznoCpDJ4)s7;DGwsEwnyX3gweJmG29w}!@Hw3f3_Hn z(WX9`-L1R(DZNYPxV+%7w#&UY&79TTyLa>KcBvTf&n;hsNxR8C0AWy`Ra_yf^f=+$b(cJ zi5bYpRr_T3_C2Y0j4r4vpZ)U{`5XDeV=rG{c^DZ2*B$ceijDo3Oz7icUbEwF6AS-U ze4=f@Q?FD!Q6rwG6(Ijry8!>!*z?#Z)wfy=_TFu=(oJ8kFM?L z_OyW!C8t&kH_Ta$4L7d|J?1+OtfS*#R!dLGGc_CGA24RwYeYx4E0*ezaM^O96gD4t zYON+OGUDPwk!OzVZ$Hr~e{g;`zZ6&Z)QEXY)wlCY4bx9Jb?w?URE;oP?J(th{?884 zN`@8X$e!lsGY1|gsyXdv&9DL-9?!(jFbrQf=Q);+0k%DxaLzF;eEvN87h_lkKj+>y z@xO`fzi0!Xy>>x;5SKuAcOQpH7m4CA!YnDlR;5oJt`i{8``~hcEawK#x8)ZU%}79U zUr3Ay*VtDjEwuyePw8?-Pl?y*y9U1QXmk=zYjVcVP1lwz>L;F2k2t=tC1Ff?u8;hQ z!zNbF7P9r%FUgzav+@^{(;q7lqWW&$(BqW+n0#FR`^f}Uw@LWCFsivlg$)s?4BxgpX` z`Gs<7HG2D@duH#9EbZ^}>(;CVW3w~|97|`VX`DjB3_HAi#Y5^oQ#0-I=I86A-0Sjc zdH2zN$IlkY+VQ{PsK@Vl0WFe0m=w~te;7+0_m8oM{o8M^mw(|oLCDjooEcB|8qNQ>Is)_iAr8>Rs8%x% z)B|ymBsT*iAtau>TuLw!sYo;}LLd2k#@&DqLOa=UHbUOdvOjot*mH=+|M_S3u6&av z)bHG+j`+AqeqrY}3h%ts^l{r8*7#1u`XFZ}3|^8*$kj#%KR+ojQ03_&A}O{;YgZF$ z%{^BvMO=tcqZvd;9HN-=M=w@K%C~y%NAm40TAnd8SwG?Qy~nFxF6`BJf8~sG%LeI% zXU!Sv-b*gkjX72_=#={@mhrB+5Z>kW8@@d@f+cj`7?Sw^DEkihrjF!)y{D&QSuV0< zN$y3q<=*6mdjo?p7#nO17*kC#U0|vK1EKd034zdzDS;#qAQeJ-2TxeJ$em&;vp zC3lz01?&0$oqdum1Ig$2zZ?lX*0Zy-v%9miGv6s)d3Dj=hu+;OC4WP&P|a9z0nu_+ zyp9-*K8TdlXhIYU6~d!bnh43GUxaOuUFyj%1h;$^z-vTlnYEfsd_rwC=o3o8G{r655tH8;c3%UMOfhkm+_64 z#P1G1^04^r1-`LH=^qfJ9mX{@c$$nzQG++I1Er_%OL6(Msbt{5(0A^HpcJzcFa2KW?l#v-3! ze~Qip_Ff465(X}aC@PIQdL(ub>l>DhY64qD;j+|XQ=m?#6@U%kqt$xrfdB{wG#YO_ zU}4~-%$Ou51o{({+D#DT$-@<`S0D-{KjvBS`#lfu7yt4!7buQE2G(CWd5uc%AK+8N zRgch`{Pj#Q=Nuz==Pzi|7Jk9$(7b|@s1JT0UXYgu`H*FWC_JpRFxc%zCy)M&MM*{; z-pIFcvWRDJ3F^_wp-WVHCx`l8kqM>T+ox~Z_u1b*^N#rG@#Ea2m#3>d%t5{doT1Ps z2(j7_++Rea>lbt=nfqWtVE-X8+YZH66oNOTei+8h3Kgsb9_Dm6JMP;E5T91UrU@h5e1{(s#`ZcN6GzX z#X+$jxYL3=IV2Y%3n%Wvc|ItJxC;wWGVUa)^=uJLVh`pH5kSP9uv~m%Zri}{)u-Bn z@|uP}T;G%(vijtzh=I#zi%-ad5W)bMtjXd5&5)IK;svg9V6DaRKVB6%e4u!ls~Ns> zs3$jV@<#C*cq7fDtW^uVq(#MHTx4Xl#S)6sBs`pW3Y?W6ofw-9ux%2 zizJO9^k}Gaqx=6KfHIbZUlG2#g9-oOi1Gb`S9h#7Bn67sjvwc9#HTO=m$_(~fqj~) z6>J77YAlYsD4suLDvF z3N#5R*qUlbw2vG*v_iuYLt!&gj2%$)k>*9wW0dVhBf%WtJdwP?u&;5-Nl$p#om@9H zGU#0X;vV;vWbm;!KxgtHJpyLKv|u>p2%H!hp04wX@k^VNa_QQQM=rfyy74!A?F-`v zPaUzcwXA+>sBzYW;@QjU*BvTtc;(nzFZ}Dh4{mLLaa`y6wwFc@uX<`uWNmfW()6Vn zu?@}2_dOJ|6v|QMrW;%KUO?{uh27&HnNuhT5t){>JeA5{cT5MMnX(0ghRrWkD7J3f zxx5DsAY+Jk+{oI{fQVVyX=7pVA)ZoPCT~{^L9R?*aWKivS65mJxfK;javNUP-cUVI z!z_Vx7Mb{elbSQ*=U1f$d;9@ObZ%1P?}nxOXk&a+rzS7mI(J;z?6QgP9-BThX3*Gy zt6S5`tNjDUq@^t1Hfa7sSrsR@pvuvJtt~s3Y(KSTam}7#dBscmhYaW+vLtd_u zIIO9*Cd#rlC`uh&T^Se=U`9z8_Vin!0x_IL?yfy?ZH9Zi_c7Xq3rEH z%w$po;Tr1ax`sOQNbb3X3P2E~6(5QRFKnq1F}&jWdx4o96Ce9%wyG;pJ?rBWhd;D? z%0JNk_1>%Jv*HB=P5kHd>3=^YTwVUnWB-DWk}7tiUO8+S%H3gkCqV{-V8)fx$93g& zapivFG`g{*0%Wb*J#*g|%SDfwTPu~0naaW2TOK{^&F}UYvc>(5xz6EubY$n^#hoMN zqo3%Ub8r~6j%<|y%##BzvCM=VX(i&3l?=MUuOAstgp!L|7I=2RDT7l*-{aB|zDh05 z3==QiaQyu#uE87?qE-9jusfGrV;^rRGMiHsS$S=f@BR@e6=mgfC#A;>t8cRLVSApc z@m6k8drG|vg~ABMpxx^{SK**k;7MnCv5G{y*GVf3bclen>;Z5 zJi3_){=&N~vO6kG3din^*)F8J83I?NRul1q+DnlsU=>anv?2`?^&W?iZLY(aU4(Pd zSQHy4kIc3CBq{BYN_!}D&FIp#goGk`p~JxLQ@0*hhcn$g+6kP9dz|eaT#0POkm^VN zbl}jR4-Q_>8Qy<`^WAdyi>8m7387z%nJSTf@qDIvZFa| zV34`MQaGl}oc{nF{iDk(@&f0zW0&}^CmiirQ<@UfkB;D1-ZeGvtMOE=Rj5-&7d}k) zT2Ze)4ee!!S+F-7g;S6Vd3?4g1!XMkgB*INjED+FT_G9D3Z*3{B=~4qB@A3+d~ewj zZjm?C7eS?zSp{p8(3b%TLVLQ==*KXuQPofSK-&{9J!DETE=GC(tP0PqpX{n!%W={_Fe-cZe&HqI zJoXPlF4jj!hJ_h)CY3!oEg>yUqhbrzIUKsAVRSUTST$_vGB{R0=g>lV6(O`re*xDv zdsm?`qtN?H&DYm^6l7%Od91!M)QC3N59)?N=r)2FmC_rk-u``k+#^_OyjOUKQiy^Y(s3MB`)-%^A~;_8W#~66ZTtZ z=?dKMPOFP$M)RZ~3db&Ybn*2_z;Y&RM$W>c9p)c51sv*-6#sa5etmZSTzmTvUqk)o`4f}+<&MiM46%mT;S+NZH5fpWFP|Beijs_V~1EFNy!?JR^Sd_MD;u zx`)YSi{Q7r3X8`N5}!(OIaL!q?ZZc_?7;91*SA|NGPNq#rm{De4j52c8qb{8OxzEW zwKMpzSG-m{A-D1wB{u^GNKJSAa3r=QcA5&V(bF)Sj>-!tBAXlG&pqS{}QOQwDEXkI< zqL8ebte~I18@%&_byqprx`?25W8m*Uns|6lUPeD|p!lpc%{1-WnvZ@TXj&B%v94Qo z6(tpi7nid7iOe6S(qmu7BNL~RZ{(Vp?=72Up-6kTm2P>84zxi$HMNo5z*+`Ex&#l% z^6J}=OZX*x9^o=%WBVFC?0_R>b}7OurL*T=g~k0UnE{bT$t&l5IHG^WndY|FwhWs4 z-Lolm(Ps{PdwQmA{4<=so`|ZHB&;Du6NlyRfY%oL^ zn(_|pp$s$0$KTTqF!7$F&%JlHO&HlEQty~xgq^OgIg*i@xgo#x(9oJk?FF?l9jo8i zRI%}Iz&{PxYzQCw;*QqvKv${nArWbC$+KURUhP}bjSp*zg zRW$o$)kkM5=$Cx|yl1)a67j1KxX>c;i)ZZ5h+hMX~r|$E*%@@nzLD#de_R1VQt&W&QDLI{|i@xmY_$H!?|{rwp6f9217u zeip5Q{-w>EsqSX?`6KtEqIvSf8Op(` zAsGdw>aI6ke>=p6#x1Ttu^$!s_4(r>#pEgDXM!#@Rd-!cOm3doqH+?FUm7)~r7p)3 zmfsaUYRdF_`knZfhAAy0axCF_a?Pmb>2>`g!}7Ur?r+EadsH*E3(H5SVe>ThvrN(} zRVx)AB4UKRhS7K{&ykfPXA_c6(FBxa3d+a1sjksV}oM8e=uQLKl=}GZZDyOzcWdo{`k3i>(P0{$!iqnpt8%1kifm0q2qJa-F^gn51-6G8RlaH<_S^MH(o@q5%RB7k#RVChvM?DZr!01X z7<~|*^6%SE5CF;9w+{oX8gL}ftP}b6LxWWhdrX=!Zm#B0_3)$OdTt4SG@BypJt&mv)Wk&hg?DgFvSj`I-&Z{Rx`nOD!{b(Nl@dOhQW zf{9BxN=ZBOcw;y_H$Z&$)!%f@27=XJ#5so!amzpa?8RqB1Ly1d9`R4ppI!Ra7sA9n z*SoqLe~_HyJbIM@smK6dIrZ-&(!quTCxR=r&E+D0u#bEkXBBUA z#d}_AYJB+-pw>KsLM`ucX{#RIp)~w=rQ=Udpn$_G|9kgqmzSJ*nS}X}fG=)s*~LL} zvsq^}nREzJ(CIX&WuwsmaEQT7u@^D$Le`V}Kg>2%VPWCqC4XH+xWLioZq0@fNC5yA zVg9uFt&_HAEEw?I8E!LY=G0x?=aPm-PiuK7zwFv;ZwsD_-Y$5g_62Wm2T}z-bNr-G zY#w&jvSjS8?M#!5!hCkFq*GkA7wTK7?1*B}c-s>b5|ZNM1*_E@6a*VY@|0sj*#E&K z{!e%zg5p6{=Gk&8qOR4~@R{@3AB1 zO=`E)4zO=7<_oqi3QRRFp0*-AZNDLTXmX-GTr5PC{Q8Xs9uI4@LOaoKKl{k#1vZ(O&oGG@nDn= zFmlj%Q?#uVBP97^cw6%P@H6ruj*7^m%-BaOM zg>gB4P-w0}ce3OIKfOJMlT3A(R8Ik#}R15qJmi3k?cF?3yz88rNpwlPUI{@W6%9{$%5CH51F5yvT(qXYY9cpd0-ISqeMxPmqqkEVkGP1W)I7&2!Y6ehg1RGxG7i=& z@mwKsz#lG8mrhy#`zPf?&qkN*`87|zxFYe&aF25{WO?IznOI0DSor>)^E)mLOrusS;vq9{ya(#kUYuOxjf0Dc%T>$B z7rZief(PFtEaZa-uK=Pm=!4^}5@07}lk4bYvgyI?WZJP#D1t=1p|L2ThH7e9S9UFq z8&=QNdE78(g)|Ke1{8;k{ILdtmg0U(FjH%u5Z7@_T>w*n_WHY6@Aw~i1K^Qo_@Z+3 z0R2;XddoeKOUkLe5at5JXnND6w*pETX1(BWfTIbM&N|}fw6^l|dND^)Pqp)IW*_8H z_Ljry+c^91@J1|v9GH!s3IM36T__W7eSms2B50l6@Pn3d<9orfEfI{;zszI}Ih^cetV0r|&3doa)~vDoM* zvwJF#kfqT;9XVh#0Xdp^nxxsqAP&4^n6BWUc3BiMypKVaQ*H4=WANwK+!8 zj5qK@W!p<6r-R|$8I^spB10v ze&)9`h4N)12|Yk4u%H@)aeM-8VpKgjfl&pzl?yiOeyYNggi`jBs6CDZ@GcI}P>$~% zH%XJ^*ETv4;t1394e;tiyQ+sED7EmZDZ13df5Q;I={`CUwjc%0Tek97hw$_6w3!{$$KQ6 zKpA>ZxU|yQB4??)1b3`)h7izH;wW(9Z8}ev2;g}FlJh6=sWT3l#3za#64PuS$BY50 zsxL(x=@Re~i@bRN#S37Omx%;-h9?^Ex3Q~)n3eVxnK}kM#$jdZ;Lw5{6&n-B+oNLD zI2v$aaG@nal+d?dI;bSCjZ^Z%C)U>NL*E~*9lHIs#ZAle3s(#nyM01h!J-TEQx}DI zI?B#qVB=J(#&bXHKmKFK@Icc6Q()QZ7nZg?-(I3tJJu*de*OwPv2#m#7UQ+ZqKoy2 zxdwNU;TE`3BQ<~)mJTi`YVWzv`1|E^i}XSWwNypz`ud@n&nz4?J2`Pi>9W`d<#{xhf>~jX>P86bf_GD&18QM`(Qx; ziZ5jmNH!E^nD#XwWin%r;@HT-bCxM%9v4>yNT;8s*Cj^xd$P6wze!IrQmzd}#3`Px zSU4cOHa(^y*e^9Jc--NN^i}0Y{?j>f3m0;`d_iGWF7Uf}0urug|yzrp!*{GA*1jKB8|jehu% zueQG?{&%fPS$_WYX{%mXUNHF&FU~(TI&0E~;gc`!&Q99%ETm!Yeoc5AHYVNek?EOZ zHp_}=vr0_yw1-7T#yR~MB#+(zOcI8hUrLe*OHhRoBt7vt<>c~7Nw0ditis;x2|4G+l;HkVrlZOl!WHu&frd)}faxsH_5 z2oz))5n3QLdV6e8dj09c#V^eC6iTlyTXuA4)nhBRzSU2wQ>oUeRq@d}^Iq|h)gK?M z71!oWubOcffPZ_@cqdmWwM_#K_!cAVe4==`SKdUmd_X6LuBxLP2b z0fux8kYhNfJY)>km2RBUy274?GlO<4e#b@8CX|V`#~HwU$iahmmtmvAYKRlp%MU;c z8693j5NHZHGgJx5htXja*li+Hen32U&3;!@wFY|h{yjCl8xiZ7WVylakyyUz7+;LwhcR% zo_?m5x8Hpl{5pGrjg7o@0)N;?zQEKIbiQh}(jVe+R=C6d zfEQ(H2SYv=?E>h@ZAkKNu@3n>z$W{O3li%e|1Q$zrS{E=WH5g1;vQ~hI}WAYqYspn zJle=lL7z&@DPgAj;Qpz@5$7TBz_7M^!JEMB{B+5i;4+$UK1<_*)g>0Er@3#$ zycf7x+?-2dKKIaBb~rucXybq8pLaaNS2!vhk4W=w71s$Rn0Ki!tXw$ITmk z;f4iW)k0alkR9h#SLZsWlYq?@WGS7pO3%CJ#Ref&wD8}beyUe<0jN#KEGR>J6{NjB zG)r0qh_a=CT5&LJfZ&ior!}34?40RKUHDIzUAzIPr~`cIspE9mLYFspy+=5ZjxM5p z3iiPq@NFXMM!g=ElM)Hrb~z_mGqgZ@?p^4F)(G2PdSYX*t=nOUvCmA`;&PYnX&{N`(laDdn$qoiWNnl%q&Fey*bYW4l zkzu`3JWG(wRvZv$G9ioCVDP{V&I5@T9$XNvP7F0&ind{oG$cg!8{&Y*N!LvB7~?Mx zdy9X=uSLThxNCUpyvJMf&TM?7b@=`=7Bw|GI8g%($mHb4&0`6$ed$u*@pP)=1NmDt zZg3NdaR+RrH>w?v5-DA{0aWxOm0?>I#``{QKkw4;UMQ8Oh4-cp&y&%++?o<$^Uc#b77tL%TVGM!x+K2v$;5O2Txp8(e=U*^vjzAG*H$N6rV_Cn3_{_rhp+KvRhOkPwR{AptDOJOH#D>wIfx zK+C<{)AXX;88cdld4$ifcZXiydE}vh^_UoW$hOy892(*2&IOOu4?i(`;kAub!pOx1 zzMdOYUO6Z~_|VP84;}I12jndiMz`JBGxg^6=;)o%k^MKkxrR%dP#Ilp^v#V(&pz_b z9B4T6H(*wY>zn)~Cba5nLwj;9B)ha8WP)g7``Pz~LkL$H~&* z`_OB(dVNxo5E5dF3zu0v%Kc!0#2k>oZl7#$*0*d*{DEq}V%UFwE4 zZ?(D2%b=Z&$ND>G!9)MhorCU@f8?EMJ@XP7#*6zEgV{u2CEzC0r;ZZvl9W%gsv=k; zR8 zCq&~0;<|wJ?A$cHSW{e9`U9P1J$DecrEtP)j)%Mhd^&zQQ8Rq+&BbF@78JGDjN0Cu zHF(pt)IQf^|r_fOHo3+2#*7nTO0zWUu5&Ug(PFoK5C)$bO zMH6DN_c1RT&X}OkP;*Ft(r(t+Jq4E+t;g*g?R-*omN{X8Rg(9Nc{M_LA$IB8O9#zK zNuFI+zov4`<89Gn<4&IBzIaB=JoxRJf|vid2w<`1sK#fv?Ydg;70%nK&H`LE%$Ka90`m|1NRNw?5XHZ`y8iU4 zC&VWK;<>89g({w(8tuie+v@n4j(URb1hlwvrCdJvz@NE1Z2Xe$pvns{8*l;}bvnJ- zfO<1(RAQl9tE4n^>R|uw=@9uZF4uq}c>NDYCM?e{SXuevYm$Qi$KP*07yqz1z_i~S z@Nbcib9oBb+-rq#7$w!|^pSeQNKxVxm2Sy><<_6u0Nwf%#!b6qA2cg5p{00Ho8t)F z1`}|?-MRk#tkA$c#;D65aBoTgybK-|D`T}nvM%qpd9$8LKOH2*~93}D!R9dY^JM$y-p-p=#v+yKE z0&+9l9nY*kv+9D&nLy4C$@xLE0y~UZD<)Yaau@vkU>k5oc<2QlH6N&U0d71!OC*A< zFx!207>dW7KX%H^5Iaq!rnuMcDItU2$OngDdg=utCZm08<|26>P|>J za{N#qV+^RLD3ZW6Nig6&#u(|`YE>e1E(9m2UK_;8J$&Ga_49A{1&oIDiU`1J+Mf-9#|%Gn}*2TJ^c zsODmni(j1Ri;;iQ1bdKP+<_%!j*RpO(IZ&Onf%K196Jy_k^wHomM#^$k&HkjsVDPt z7FdcbQ~v1aquYw})}EMlmQy@2dPK*+j{HXa?=r!rS@ikh&9@e5x>gT=Mv-lbHXibi z^ly1x{L8ts;&-pMJk3@Ax%|vO+wWE``BTSS=b%uV6j6yDSzQoD3ojzX)dr%}zhBQ> zV0JGU6ghv{(D>Kq*97;YCco7lr)LV3jJ-6b$6^T=s@}EQ% z(!LW=+UVs)AC77IeEQm_MooKt=Q{3>j#|a#b)v7w&71A7%|T_iWZQssP_ZRYMA z03RXnLY&5m3?)x07ZMU01U>>Zh|||m4F;SMwC|A(s9c$3{=Twq`ze)3HeyxWwU5&vvsy9P#Lk1-tt%;AN~j#9NU5 z5aoN2{*xqEu8Mn%X*RHldo&xfCrnmMK%4iSZ33BP=I_chgyb0=Hb0CGwB{C@pM)@p zkTi=DC7NrZg!#cz(O!xTmIz60SoJlcgjZ?jRl&B4GW&&nX+B@FQN@l_ne{) z!pJ&;$HEv8;6=Q(E*cj-nD+fWi^+#}TcBfTRR(@3H+ds#tF@>AVFWe?O{Z z>tzP!J-a>7^E)_^9%K7(K@W{Rj!f_%|1PFbugeGvOE68k->JFoU|O>qGyFZ?P4N#B zM^om>w`GRXwx#wOY;aujP7q82Q^3xnwfXaJdpJO1C$W_t|M5$7Z9P|j^jEdtl0`JB8gnty6 z{jNRf2iWZPSiPrR zaFxBsLCMg=+3k&-Pt0%0ZgK2x1%6;o*>o;mSQA0Ec=puAov+?lek3uiA{B|0iZx}`?&3Gu%xfF+1nOzcf^3skH^$hjT`serb$Oz3;EeyU3u-(MlUJYJdSt- zO04oByu-&J%0Hpl6eF`oSgptxG=-?_@YtBZs8k6ZN`{e_=5)OGeB-{Exm?c7!&BaTW$ja=kE~pBX=q*c zjXa1P5* z@iN{NZEPhF=LY;E^9}NZzmLvUw)&WYU<8o6^Ucs7!KtAX+Rk_<(KFxKy*QxU(+i)R zIDJ&vq&$U?GQN8DtP?5YwvTVxJ|RP)C~2R(W6|0}%jQ>a8JbB-Y2hJJoa?KqO-GaeTcHK9qU)VP+OO?`$^K^R@OYV5@Mff~QknYG91(UD6nZAjcy z-BdHe%8KZrMsPRksS}DtGWk-}YA?W3*rP)|umMQsx^xKkT~W09v3?@F6%X=c2^Z(g zpKCw$;pGJvo5evM27kn2dIk+yIn`1g5|E8L!tp4ujvBhy1m0S|c;z}t0jtk%mv>Yi zIsVxG_5C*8n1aH>TJK4R>nq;llw875+LgVqipal!OeV-q&**snqdX$2RSpoFU%0-{aNFtysHi?RqYUR{F%W z)QNkW`TqC2zhEsPi)RdE7>HG32;}W%y&C`cqm+cdx<`<%jr5+~$t6qX4T;bR|C(!` zhXs6j!BdkRR%9&ShM3-7ztpu(t1s-}vU^-%kP2`Yl(3$d7sS8?YVl7n62F5rb~Uzf zydBf)3#IM#?Be7>x=%!znh=T_|d%kkfdZy!I$RsXQ~o5qr1?@zz|I;&{cI8uHLwvX!3QSbRw~z-w97%=#%EoASpDe`@*G zjxkp^z4y*1KfHBy_`%Kjqdr}C`F|_kx-@0~@cF+}+>9!UTbfzCtaZfVlC7JzZ{K2y z4?Y}go$_4!ffr3G-;vuV&FmNlD`yluTU*HE!mVOfJ}1so%*AY^$bwPnFP685nLS|5 zw#R!>Y&tUM=m>+5`WUjm=%lBmqf`o;qg{sfxnK3yr@5Q|zv#IC`Af<8hLpWveG`sa zEaMhI!9fNfImy~B>_+m7+}^*vNsP)5kO7VxL89sG11p8@?{g=3K;6);ev%yy$;!l| z?zm=xN%%Xv={Jc-dvVQxBx(|H!=(1Ooq4Ig!tFN->Z;-!g#Y2*uDJ-%c_^rK`<48V zJJF`x+2#m-Omi{W<=N|@^S+CYe3I}L=y+X`^FaXLoFjpzp&e)mh02vKT4=Wuw5T1b zwQ?(a+DUx%(wi*YancLxLl1AX@R9b?o7_V$^L~2jK|TC63%_&H3-3dZ_zO_}w}-!G z0YUGKzpMw)o7h8dO3!!$?xiQcsq*ciH$~Xtq?gi{9?hF-yF^cBmF5k;k4o7$xKnE` zCb-WB%_Si&vMSV8w82~=6Wb(g2W`#8tb6B0ZRp{1s_<9mxQ+Mosl3s{=TzYlC!dLZ z`6PXDqc=_X%m0bqGy&ToljDQvHT3W|{nzNJls)`S7asc+dK6K{^jY2_eErM(sWd(G zT7HQ?HZS!OJ(-mo!U^0QCTpxK$hwcep5{gIjYN~$%C0!)Wf^Ph?zw*hZGR+x2X+yh zfS5Z#fM9*t#iOjQH1nae@9?MLJA5thztcKJd$vw*Vq8GkywCqm>y(asTFbAnexu#= zL84RTqQlk5I+%VTcD-l4)A_7d5dJdJQF1k4pFC^KMaO*Kpdz%WXm!R?Pgun-fE)NR z4H6k?-yk{-Y;6)9YIPR;XfNeUu@g=|I(%gqSud^0!gV%dJZI)PuC-@JAg{IFjoM`4 zaZsb3gEVS+PdnnRfUR_iw`SpaC%u3^^oYACw$df;nuX&|dP(=vlmDoul`henB0S@y z=XW1HJzMD#y(t2{-V=YQgYC{A%{*J_pvP7^W}dC|57|sayUzq^16%2!35}|hby8bs z3$y}r;;vEK@HbsdLy&7mvya?f(hw?r;@Zg<;cxz^goeoBm1Aw}jE)C$m`JmBRXobk zOHhmqbVvi`@OeN3AH(0C%QPAF95I#{$+^vRP@+S6!|2E-DVAcq+Dip-_xi5q zF|A>gpo6p~SSzN^(wOh1HJQ<(xl8iqxTYT68qfHm(?+5;nNf4K>(xO&3&nuM1~DAg6ILAwSm#Ixzoc<#LSRE z>ZCT@2}UPPdQNc7Z67)=gvj(?p;N|b8J*Po=s?$a#t(FD6I&B$_tAl_@r)nrnv$-i z+(!qyrbLIU;cD5q3ht#tyQV}3JL_S_Po6s+@hIWCN_1!qDVDm{3ZbYdgFvX#7j>U52RBD zyi2lXVt$2A8E0m6;_jnE^T_zYJdR@HioTBy%_HLn^Y~jvC-y!%G>?o9<}sY{lXfp1 zHjj)B<`H`?c+POAgLwq5tVD;+OO0z@2<=tkfz9I;_8nF^iy)6dtrRwoWL;stT$SnB z+Y_TRx%*3e$Ny0Al=eupXLEFljn`X(*kQ7j>e$jA$zGc<-pPzli`xsBM2Aj$Mh9b= z$Hp6YFCBK;6CIrPnKarIH!61Vmhc{pR)&>KtT7vc zD^(Wp!zSA-TjmVgILpwguybL9hgz!R`h}lLn4URaxNWIVORKk-W9l1|k{at{ZlsSc z_RpQ306+BILjqzydwB3Qn%jf)CY&y5vs8(n=HC0<@mn4arjJjUh^9+(_fDgO&O z#LAM24bhR2!2vP)>p{gHe#&;i+Z#1A7^VQlyxd~aNblEA%0wWj0C%atO-tZy_h9il zejg64;_>n|ob`urH^{>dy*Ve4^2#<~m7Ub1}K-^A; z#J*Aag4+aHbg^$jLa@aY8y05r@YA*{l~g1Y68o&*YgD@j*sTiz3QAear~z_VQA- zYf!zCTm&iUK;M?Yw`imx52n#&vndooN*6rIp zsJ~$?8u5p)ez9XL14~0(9p==2QQVkr3@#lU15gENgsA1=1utD#vDRb=@ixLQg)T8f z2|lPT1tVnZr%#{q2dc_F{eM4ZLS-h@B(E?#(G=_DlhDfs7hPVFo9CI- zQiw!vC`64@Av_g#mTcMBHo}%!%Ow^~$c6?$5f(!q(rxg*q>6>yY+wWt5{nK{!)!UF zrkMcrpUrZiEInSLudB*i^QTXn5SAb4n;Kxv_-F2-VtL}K`Y}^Asu>DpI;e%W@` z0H}FiQpv7+Q34-CjnWrAQ~+#GFUfEz?Iw>Bo{tku=JS1?MGr{6A?)0Kz{Nr4686e$ z?2#(jQtY|3(}$xLT`F!Ex30H6 z#YQk|+lttTBXl3d&kaR8%|(m5MM5-Kj0CgX5Ff-QSqcKEy1i*E1U@@5PFqwvg`sgI2u zegXyCU*K|=G_5-Y*LZ~IlTcV#xF5t`CKs+RmQZ>ot~YNkn0;9W6UfO z{t%FVqQ8IqlEKXj|A69-q8D^-_q?Il9Q%dD+(A6*1 z0GRmbp?$|6J+iN(vA(`>blnJf`L}=g-CzHF=hMF}K6&=c$&=?!pL9|_s(fD-ihEc< zv1gdp)5phZT&!}Ip<%D-Y(`v2o+_aGvEi_#$ew%&f04O&SxpA+PS^mmsUl|1s$8Wy zWM18peS%?$Yo-)X{1`79RG~m?@Q;czn|(bNhxW3^GSnoEq3xh2G$XsGfJ9G? zXF~6Y;p!UqjI@sHTx}U>GM1*zUC~dW32qs_djF}-Rg*_F;@uTy?J{Or1^FYKvP zD;IcZ$Lwo}E!nkpZRhN!#+nHU{jCM#bMRL7Y4>;hZq-&q>#QYxmv88vgSFvTtP$iq z7valsTiJy!BjW*W*Soh3>f841d+4s~p4Ce?x^LTe?rFQ$oh}NQy753Y0)#n?U-&|a zU)k?_>BhoM*URsHZP&ZEjr{et>tw&{rJMNcZP&WfjX~SVPMKlPd|h0Ideb*?D!^MG zVD|9|k=yZhVoDF=rGfLpZU7i9!##Sa|X^8AF1@tCO=P6r6Zw z_qob5>q0!DR~{Mh@E2{_Q?`i9yuEgKXyYa~$lrhU?CiHTc5PBzezRn9zZt(f(-l2w z_xKdrDc%rQDvGe@DmhP#kCQzMdH$QdDA zGih(>5*MfbeK`f1-g}S#ZP}R-rzn76r)Cw--TXsZnk_lmhFT8J|8gIjA_~jn4AGV4 z!4Kd)p;#Xn9&SjDDUMG}WEKI!;tdk}PGDjf2F?-mu?-}%7W)Cl5y9*h>GyJGS(4qv zzwLW$Q|}C{4%nfFE-5?tAB!lWSDCGP&{R&Z}OsDRFh-Uviw8 zc`tvdB-O)f$by_i;u-qC1nn zf>1Nuw4jehY$XAmB2kI$e7$JAR}YkDm}r=gZf@8h{^*)|*MDg(JuTdkf1@}7oyEDz zX|)Ou53hE)O6AFzVpA;LUi@)Su{eKa%D<@!PkuQ$BKdl9c%|Y*c*hj{uOl35H5Bg$ z*OXz{I|gB`s$_%sC)sI_?|66V{a)qvUFG(@y7#;Ct)A~zi4N#hDS$I8^`pG{fWNP% zzh`^I_ll9&BNBi*tGB9y6^al+24E)xA}XBmCoE(QkEK|VMUv@b!tKX}``8QcgZSfQ zoNqX3vAYq%;P2L5ZwnVcU3GIo%O9SY@$As*8)Ke0a{1yyuFzbwc=+<;)t!rfP~5E9 zHCcRBKKbgJRd39*#2rdVdu;p0Ez7y#nSA7De{O~q^e54v@PQo^BSQrf zFM}Zf%nE@@-X89J)J;LzN-}Nq6f?yNVoG-~mOP0YtsD_{@*Y#|mHu`4p}*(aE+aWS zGRl?}txF3Gt&FJ|KPdH6F`UBeEZJH5w6GB5Z6;3~>iCww(>23UIeb)vQn|v@t9(~0 z@85M?(DTg=jcU)8o_e_NWiP|(1w;iy7qhZx9uI&2P*ncY`>8`%_;Y%ZlyS%&pY;(` zX&!fdL?AJFBCbIn!E6)&d!aT5vj;3Mb7#4L?(!84Q@0Iz=)1$>`>0!BxOD9D6$cl4 z@rl}#D;1ZoULLu&-dF8AV(YYR&ox3)i7VPxEOcyge7I+O!@_*&bTG*8GK)NgPFGmu z^b+NHnKMBRWOS-ITd^}F2KzE=#ivTGqB*x#GFaj_wIO>UqGjMD8Q-ThxF9 zz^rRfbI}te=Uh1al(9k^7KO-1pdOdbiakN4Gx0T|va^%>xwCVUMd*y4G%5OS1L8h7 z2Gth|0rIcLUnm_kfD41q~A#tNl( z-`aF(6joUk@ko9``2i-ivhJUmf5{Jwy51aU9E;rAER^kFZS-z!P)n9SL;h%q4p-TI zg|!KAYmdrCVb}kWp%Knj;DFvAoKl=mI?BR|dyLY>|Cfkar;?Mu5S#as@|L0FRH4{ID zQQq4(H1`6=UWd2~xlH>s9;~Fid1yT>HLk9s1AoI&HA2?L7ut>N8I?>*ByqpbOOcw& z1Y1>bSaEFmh>qfiM1zlJy~eX@vhcsVo|Cs%QSTS9r*$a9U{$VQGWrMpJX9ElKksJT z0fiQky5W%bv*1g~XEoFPJJ;=%v;@3Je$#4dAzKhBrgwDSu^5dV~r7>_8`9`BS7%U1V>gh zMHaCDWNZv<7FF!>Nb#ZkglWwKXJs`O z)Fs&xBU62Y`W3(O;*xN6^5iw+COd^G{9DQof~-SR;Rsb*Rx{bY3I!D#bNY&E2c6B5dzC3OBBAyttY#0k=$VSoE6> zo^pL)e0+$f-Otm9P(9>8wkDqpc615|lq@U6;n}j;e%yPB&V=zS-J>a58uw@^b_)oI zbd%<@<~^S0Xot7!hOdToI3mQ){p-Fx9=yeAMo(rk!?ew%eM=Sb#?ph z9((xx8BvypW0TM9NevleY#7PKa$0OMnOmm3wCTOyrB2v2A#L|_qojFp*Lm89Uc~%p zE|$1yJsTfIL9lh9;)bxBq~>DIeQmz%X)~0=KIguAu#&&&{z85N794q|{d88V-e8CV z{$c=US1G-`NX=P>0||-ANxB(j16@MW?@Z)>K%1FQ#1-krz~AU#Q>}Saq1wjF2iOYw zzx;B|p}9rVV-q6l6330^e8qnhEDPJd*qCAp*O{PwA9pP#h+tA}@f**@mNii-K=V_)GiKOB9u`TT*Sk5_F{ zhVBYTC@)SdC`~Wfdu`Rh+w*6AaB$g+>!PEpCRNnTtIl-P8=Fq9Ie6*H@u|CJ(A+ug z329HpZfft&<6q&wfZxho?5PlRI(3_AxtDPn0`9*58WJUol5k6%UL~?^X=flK_l{hy zida0Tea(!T5sSvn7=N@dyb~>ivvH zR5ESzR-%)4zLq+18#OD@Z0!ZE&C0^ILRhtQ0A$2)FReZN*t)t|p(;)}bCkCttfgYk zIKHuU(xi#p?K7uOpU;msl?I?B_|=I?B_kFsG%R1cbHRd5G}f~26ut=D#6i=ra&{MP*P@cS zX;Dd&Gb)Eg*Orw|%+xhaH0m1-;n}G{aaNN#wLE+HXtSYOXHK?;#ac|pwEo1Ce|HM^ zJl_oMM+J0GgF)xz?d_{;lc|WOe^b3c`Ui{=`W*9Lu>AzCV?@d#QkQE8%J$Qjh1V@= zo{~`V-g^Zr)yg4on=atirCPTi7%DC=WVMOr;a*#+@WhJ_ki`Q%L)3!I&tr)_SURRz zdX|lWW@9^$+W_DWpb5!9!RbqNTkvnF-#o8~h~P2B-B-CA-eyfs%E`bGb5jY&KO^Qx zjWP#tuN6*jN{Y|*;U06C62^!P!3;%NSRKC7^FjtJw8qxS>=s-YsP z%uwv%;k(ox#Bp$(7h%a$j4eucL;LX(N>%`zrw0_rrEHm0xpUy; z^#z5s0lt3fJsaiPg>!vSNDx_cD!@7q%n2$S5ZCn&ib+oE{)vAW{l&7y(!dkPBSJ%)^`QBE@RjKvbqEN~e3PWJvu%g)d%&r;ou&ys?JY*A(#CYT~ z&r2KzL)}XFm=`(~o8?1(?BtGG_6{1(Lndf{-Id4?b83M24fm3N zbcC0$Nd*{<+w}*t5=)I6+kBI=LZU~-2Ny*;tP%%I0wFYhKMi3{s$AoT05E=rF4Je! zbe1?(On1R6Ct>VkrSrE*gFZ8RmZ^VI@`_;!6})mPl_4Ooy4X503q#(!*zPSCl*+q{ zX;de1_U?h?vt<6oo}tl8?V2TaKM9x{wv%+7#XbV(E<}vyogM}2>AF|D*}I`Mc>du5 z?HO64!mZJ#Gc%$W3?8~LIxjXRGk*C%L!5tbcHn@vjI80o;SpwY*rf8THHP4@u<`we z-CE7Ba;)6{NpW&Uc53BU%a(jv*)KyOY*7dy;bD{dSG}=(%Grw1tK-5W!1*!mLvAqU zL%@p>;I3)f60jZ9QE1btj-6h@eJIayjN4D6j6{xnwIWm&j+?HB5ppGM#W5ub(8^XR zCXHUT`bd~R5f-US4ys;}TpME==pRrT7vGpZeDs?m^Sxq*aMe!9It804xtOHw3a5i}GVkStvZ7!@ zFs$J# zgHCtQ)88v9B)G~NJE!o;*-zwUX6bYaCAY&<3s*Q}IA!|$;wS5O6=e<&D?~~t2Yryq zcPK-!60pCi<#L76xh!Z?$70l@{3PWC%jMjyaW6WmI{Bxb8^`^P-^D#D{%gBqfrv*0 zo??E4(ahV5!~5IS|@cY_=i{#-?XT3^**&Grbb93SWI#!)`{p!aS5T5%Ni+c}}I~eSLVO z&mQ+P!Nj3Ac>SbgWCCH#NdWdO#U9P3YT#2rBGvUfQ%Ya1iBM4a{a#MADep zb8=R8wuD?l`wjl@(taz>HU>}cWRzV}@b`T4mgYe-BFq8NgLC8u8#^BvP`kBXW-T@q zy*_MKRm)CnKhX)g%0kP;tc)SC^)*1IX+`zzb>jz|YhHM5PljBzO`#HE<1EwrS3Wzh z;b2M2{=|ZA zWazrA^qSBZD|)u?{h%PzmX@9{JAc^1C}XHvv7DlES+N(R=c{wne_a zVE)ADxY18GRNAAhDIN*|$Ve6a!unf>EQ(6aNr{aZMq|sK5EoNy3XiBR8TizM;ahT& z1_#B&CdEaJ&af>r2yhK=)M(P<6E{>Q)!9aEEi0cC;^P}1k+8CC(Bha-REu4~a{*>! zK}`C}K{L;17Uac5hc@I?zq@+N?V)+~fpFDhX${q?}jG723z=S^aHmbYBjuI6IOLY25 z}KsT+248K>@!t?VBWTN#}?GFqIE zAW5njV-VJ`{zFM4g93wtQD@l;LuGqwN(v&~A~G__$wI4uEJ9ic-g19`4(#!r7Jr2? z*z0`PXY!9ODa`>YwbAJ97=K#jrLvu@Hx8ee#FuPb>^SE;VpL$@m?@*pLFn+$cg-|* zvOsA^3BZZ2^65FzdyPbPn)fP-j(>XQ40FG5>w?9}qxKXmCOav>+e^N8;XEIl7%Bw5 zC}9^?7c;w%dZ@)4TN6gda&SX58h^dP4>6FiGjIWfcM$8G9fdYIogbvXSm%;pBbDqS zCfn^3E^h5&USdSAIdx@m3VZF>|I(-wmnKWggD*EX~Z?HnDi;P=%)> z%oo_fC&qFq;s@)lRg@1iaN_5C*Kd5BPjlRw|K`Ysb@36n{cy6_?k-^(+Y|hYJwi26 zQGQG9cpf3|CBvkoTR|pW3Ni_f70=rci4j{S{!cy#vN>qCU|I;ZSZ7EMj!76;88tAf z`P`1&#xr0q!+RoWClZQr+$@1|FOpKa@SCrMtrit)TMV# zmG50N&jQXDkiKom_%ZBLsd z*)Cvc^=(6RCb;MzhCW^%+P#R;^Jnxj+~^H+r{~r-Nw$yCb#FVbJCbgf==)9blM2!N z=M#pIx;QOb}_TyQ5=UIpE6vd+w;`sv37yLNS6@359 z`F#{8$9Lymi0^P_Q+tl@ejMMOdlbHZ?rdKn8;0-B{R7{>aJH{z{W@1YzC%}u4(S-$ zJJ%V$f90fe9EcGNs~2;c=)MfS72I@@Xijz0+Z1_>%*ymO=svy0IC|Fs z^w!ljNw)WXy}d^dQ@F3X&qzGcT@pM=`jf&x!~y-lWk2A%B-0eWoV$+i_sTSdpTJ!t zI@11*_Mfvcr|{Jr`9SZL5#tfx@0C#s-rdCR?ydmgw&T1q0xxl8cUeY;qaAVX{_M*_ zM>4%hh))Q&xf*3SUMVWYCi>E47Je^wD?Y=Qn!B&DHXkF~G*K}DU#i44?8{sDsT{>O z_%ehF3}Q7LR;XoD6kp=Y&~EH0p!`RLFBhoz0KK<3u(Hr5TKH7YKtyMII+?-jJsQruCo4z6B3EMl3L9x>iNdQMNV`H1sI z94{Tc3~Nn_#gSVxEj_;zIb%_I$autZ7wR527M6#Mvka>$)F~s9=gzR2Luy9V1RLCb z3*IKkUy^N5T$ZVLMfU)3!Z~uqqoTZf8Q!$jPs%6|-t`uPy&a~q<8XX#ZhS&6nq_6@ zWM<}M6RLD~wrG$+j*!FB?jSbmF=C;t1F-KvJ_YQRm8>w2KwmzgVX&68j9c~=N#prmFA@7 z+m29Z3JC@+x=-MS(OaZdOv{>%x}TtCOUN!&T+JR?WEkj|9*pWtfq^lx6-dY%DeUUb zP&@@cug@g_xXW?C-Lkd$5;+{KQs_zL-GOLO8!7VXy zaWQf6@%WLj857>*WK4PuCw`NY6OxiOi}46f+M39pLCisTiyMSpK_P#>ev_30{khix+7mH8PQLBBkPg zT#HO1k~vAHIoU9h@F$o_NhXKT9xs?3|A<^fAs40vS-(-PxUicWu{KaJ(0C zn3it4R1vf=E+#%c{(>qx=ouc%{j~4+i>m!-_<+Pu6^vZt?JbbL^>(AIs)PjNebi7i z>f~&a%zpx^0CkX%n2d7Zv4$IB7VRe(Z{i`NTs3RIevxRQkwSpbS^a#(#fg1eLEkFq zE74Wuz536R4Yy0>(1Z0>2I0kgxb_;q4YiN*kTs6-K$*WwR(&!J0}J6}j2ig38G6d? zRZ&CelSq=PnEtnrmA4o*UrwKnsT$$$S+3MZTl=AOU0$(>S+7WZZwZk?SxuHJu`+`O zm?T2%&`-g-?OK$9%PVr8jP;a0m95J*osgiPG7Aua7*BRKYQOU*Rk;Pd)h|*Mn(Ws7 zzR4IY{)d;^S=0|@!dtIkYmczolFc5Ia;u4;+lw@lZfyd+r*AI(FXd84 z6N*bnAl)*T2{Od@Mi$Q9uSF?~G9)NNq>!P8(-s<8IPe7bW%ZUspR)UFtoo@wW%n-1 zuK15-*SD$A*jU+^`;;Bw(~X1LZTvmdrr#S@O8a)XOSPJ{o($Vy9K3z<H&5YLTwZrygk=pg(MpmiN4TDK5vD4S!x3< zp5}hH7$wb9oXo4sF<|&v#BpwZzIH0!*QlPIRsZ%?m%p)o$l_i9dg|wj?%)3T?6ccO zY^kf;GMpZI)j0WaS=qlyzt_%?DQ~=H{Hp;k`QMYl#Qr7mzUe0890~^(Fd7|;d4(rd z{@vVMT`lfsRP9dh|VG+LPOo-`&<0nJ+c2dQeMs=S3of7umzg(;^Yglcq2B=Bma2B zoSZ|jlTY9D(!bVU{HXr3dGmLdUib8*W$#}7&pXyXHT%wgtb1|#j48*r9X_m=-0@17 zOVI1v{_!ae<$Yja=9udiEMA*^YwAxEm`IKsnTzXU#h53{Tiii}?ZG%-CW}5!6b@~{^>**PaNxkBxY5ofXjF(Xg-qYd ze(mmmxA7u5MSdAuzaSyGG|qX4D347jk6_ekj21J>J2WIDC@2aSVn>GQ-Y%C)L~438 zF;xM7ED%{c{y0;T!31~U-3K>Zec`#fPYcF=zqID*g|F=xdFSAnIdre{&G>|kY*X2e zo9^DXHaYpB0rt`Vtlsu;fJZicX}dAT=BwKGVAM@4Y(epDi(g7gP>?k)($mvw>8%_w zMe(k{VN^V`FN%3~82rMUNu_$D_uXmolcNReXNSJqOoM zd+eO?^h+<_{xl)e|B;t}V|_77&KCouIQQO)9Zf4PAEHc0D$R{I9M22`@!fPz_iyYw z=L?p|?VCHlf^NMGr9A{Wj6yAs5UYL3DK7oeEjd1xX!NR)xKu-K%8M@}F4?K{wtLfx z1xwnp9VX$>MzN%e^ zH{s?b@e8ghD86OQxb;PMUa|J>aaRT`{MY4WcU2`MFTZJi&HYoS+`ne-b<2|aS8Xf3 z{Iw<5<*%DOwq{PeXX3(jlg6#hr+cC%tQ@~$^_mqED#xR~mLoTDf2}Wzr}a|Pk#98t zUhGnv@ym`=)?Ub>_-@raX);)5YY^4r66S9I{o(%AaS5eq@BO^k>JeG8Wx+o_sHpq? zmX)txH`egK{>j_!Sbq1^q$!uN(bskFdvbxB`)!`ykCK3w(x#?Ye7<%2!41zA!buFI~zAv`!-@R+ko?YJ`7J48Rs%JSQ zd1`)dx#N;3+(nAnk-Q2IiXF>-moz(F{tUHH|B)%*Pa`jHrT1l(&yNepiMV$Sk#-I< z(J$H&Qv^l{S9jdx97e;#F`*DTOK5c%OPgw4v{_;A*xSA>!7;48dm*`J<>n!|Yi7)T zVfvi%U$43Rl_g`glp1>|z5fOhGogH0;i&oP`9*cJCr-M(bm7*^i}#AXyP?K?u+v;@ z>UHe?La%$o_s2P?;$v#_sNx>I{x^yp1*Z;=RAs2r#U9Gvyzsfl{&DJ&&2LW`_sPl^ z-(B+hrp;F`dve)5YgXJhXTq#~SHIUtjRjj51X=^0z3+w{0SncRB?+U#>$aqSxK)DFL9*J9^d~h+E6}lbwu@UU6ePh1Jpv1A&B+l71b-OvH zO2w{M9DCe3kv{+YF=HckGHpJ?1{&3I#x>;1YW7X{1oHOCs>+bLm) zTkiX=VnFh}gY89ISKPJTKVT4j^G>7C!wWfIhgO_r`4(wO!_KO=k8g5vAYPavJaH$9 z#hkwgt64dw`P=~5%t9xqA_2X~aQC9uk9h=_0 zd^l;i?V-DFnSIYfk~(!gU3HKY@2({7ZZ~_l-()oWIAYGAm0#X+*P+Xnym;EU>y78{ zc#6;|o5vK~R4cT5jPW9CMEObWE|j}Cq{Cbw_cyhB6V2~#W?wtsHeR&2Zd=j$9rSxS za+)Ib`(WI=89K^qKtGpkU5oeetWDEYR!!5yp1F*v)1e*vYJ3Jw-ZR~RmNyloxKR`B zl#bc_NzKHoCoj5Z&idWA-@k9otXpS{-8g#9XCD{ex}xmX@ni4ZxZtWnGHl)5V>eA2 zx32gu%YXi;)&HpRyPk$(7ka*W;XtT)c8yf-(WatD-7Pil(-Y8Yqp^pGF&XxtsJfVN zo4UM4o-S?bcys!xHs^Yje2;$mla5cA^L+OcIi>ykR}OmU*i~*WNh`N5_~O^q-`~FW zovR8BpW7e2=hoSGFG!lak?h-NeE!u^54WwJUe^$x9}4CTJoV!p2QHib_&GBFtw-*8 zjEvqirSOKDd?+1R`u#CKW?1!!7p1QehRyaE%q>G))kInDwUQ(f?62m_C{sV7g8VE2 zexlI*9BRT$B3ICVtym;x&5!?Fx%j7-p4^Q|^N5?*thsrlIc+BMR??SN7(dC$^Q&a) z+0$gIoI8JQG~aMN@%g4_?u@Z!3|dAY%F(J%+AH2a?tx0!CF#kl1icuuJ}T)cZh{^U zeRcr)%&JfI5ws23BTqh`wolMYjC)zPXrKD@6M~+B_yf?#ton>!1f6fZsC&uhGh+me zQvusHqh4KQe6x=UI>k6nAENc<=-Bm`2w}96Be;%Nz7I)GhS5sv=vs4h zl$-?P1ieLaFgi+3ApE>RE6veSaz+@(=*=P?F*-_)ko72HlJ7&3GX$ZwNk14JCC84K z@1(Wn=qNdH2=xG6Z;p;#kD-rF)32e}RY85bydrlnF*U@zYZ__RuetF?F{(`=2gog0 zll6oTcPtEiDkhJ9xDyUDC%@phL^@^Z{LLk$%a(4QQ^t%Jh*!lb3wH7V$}>7%tT$pNK;c@R=-T z`GF+i(4o>phv@CUl^#7>ifsj|jloBh%k^TEfekCLxX(an? z*|H<0rI0^{htTCDA9=zE-+hzh+)S5i-+@!7IO44qXY1lt8b7S^Qtc(|F+7I3E^eL{ zE7?9iUS7E2xYotR&o3&f=bgjEnL07Yt!DBDSxsaWOBE zuW$cw;r60y78-|tzK;Y|+%o#!g*zWNaI@o@uWxW(L$9d3ZCvL!dVY7__-z&JY`5Q4 z-)%rj*3dnc-Ig!W!-s2`qrzF#kl3uuL~nQ36dZc&rD@@TDLe48l$OGTzQ$`QPM#3} z|4hZ}3kwTzV6?E~XZR-)iN(81Ca^HsG1r57jMuS%ZE9)y+v}fy{o-XX>EBiMm5nlI zslhRJgkqZ*fz&hZb(ZY4*|& zPIa-2Q@9uK)e864QY}4c@X-cXb|}6t;%QL0pEk&<@`&xD9IGlr5}*yUu2X&jwGq}= z6&|EzS(_Cetc|iID!iZOXX_~wl#gwL;)iM;wrvW>T8!->g@*%wPT{cdv%RSmXf@hu zZKGDJRchs01y;zSaWYDpbkW)jaLT}$3_oRBHL&Sg31A(tDF{=etpIvU5ir81l^sfZ324xV9bYChH;kO#TqNT5mfJ+e~8ev5)L~Qjk zePz;5CHzLCY(V!bttikGFLV5y-}8UG`=hs=@D^P<5$qt z2=jM73n538OSzOf15^pZ_T`$XT8g-%|3;F?`=#(AA0qsq-j-vwoAo#oWj(m%eM+To z`zb@(2O|X{4>iCS|Sj*FyR7KN><~!Xc?kr zssKfgE=RdeM#?AjhB8a{zYEio_nv+-4RMM#R*kQ!${@wmJhOq7%5oFsV)CZr`6^KP z2vLQnJ+MgI0H31&^l*eGGfQ9S46{Bi#q)Ph|Jcj_&c~mn|DB)zN&a6``F}5ofhgOa zT>nqL{+R0j$>*O_|3CTd$;JQV=YN-*zn0a1m%qP;`|or7*RcPaGWcug|E5&_8tSj* z^jAMU>H6!FNwU9*-cbdODcW%*w9_hR5uwkkKrO=v*3*B)tX}@{2QX&;&7ZyrlT1n& zMtvRI&{n)(;L0VeUb$l%!V_~OZ_Nj5;C|R455S665O#?BX_!mkiyWK<1{;wmXo?uD z<;US&JON)JC1GSw!8&7qSW*pyb{LEiHyyGwH9IWsvv6)(j+P7kG87iy!?8L(QX2)m zlaHB3p;iP9G8(61kA-#cc(nJ4+9YU|DbPyOpeJW&Gok-x<4o4M+B|JO&gERFEy5f1 z60HQYxyQ9@wd=GGV8wS*yI#9hyIFfsdlqv}i?)SWwQKN2zYT{v+=6-BjoK&LFPOtU zq&=ry)LOJw?J?~|+}-{K-hY;&^lnF){s$$y6L$`NhdJ&y+PB&%X!u>)_u3Dbub1O| z&VOpVwV$+~q3zCSjoM9^=TvGdQ43YjF^{11*FZ~(If0n-tb?9C4SjSOM!CziE43@M zx3x#Lf8egG&DvF3gLYPXm$>7TU{B(O`zw7kr)Izq*pK*QzQ^&YYaj{2#YzMQp&0tvsiZ#{Kn9XQ*w;%V*v=uDS|_m+2gxGY zB!}dZA!H~SMuw9SWF#3y@<_gRRQrt-kU~;Kipgj)2KVocBja)U-9$2pOvd-&Q*rjf zD>#*RI+;Ocl34^dRFk=69+|IoY2Df}?RT<(EF_D_VzPvkkfmf9DJ5lOIVmR`*4 zD@m2Oehg>nttM-<_ed?NBlTphb{yyLufrMX>&XVPkz7VDCs&XwaU#H8?TEG?=V=|( z4rzzAecG=$Ie9a=id;>uA=i@Y$o1p~awEBkY#}$3t>hMRD^9+>o&1w*BX^KH$z9}b zau3-~?j`q;`^f|3LGlpJ@q2_kN**JRlPAcNOXOeVW%3Gn zmApn?CvT89$y?g}?Qlieyk)MB!|c^X(O}w-hR{%og?So5BWVPzK z&@3F!l%s8>x!BJbN{7+mbcD8@j>K&V_i9bJTYa1MfcCU@n|3EG6yKqvXdca{1+$=`1>%&Y^SZJUX8)pbP0Dx|lAZC3Gp) zj!J16T~5ns1y-L{(3P}`uAYCGylZe)E!ujx{KaT@1fi2z4ShMKh~li z#ERL&^bxFOJw_j=PtYgnQ}k*24Ayp@qtDY9=!^6v`Y-x2eTBYCU!$*MUF=Qz7JZw( zL*J$E(f8>G^h5d)-9i6NKc=7HoAA%*=kyD@lYU9RqW_^^({Jdv^gH@J{ek{SchR5d z&vZB4L-*2sbU!^n57I;Q7y2tbOpnl`^f!78s}0BL33`&AqNnK@+JLW5&(bE^OwZBt z^a5?67ilYPqwTbVcG51|O`X)B915N=?9?+I7dl&E*6zYwnHzIw9?X+@F>mI>e3>8f zX8|mb1+ie(kA<*M7RJI^1dC)*ESklzSgfSPvjmpNl2|fJVX3S?8^8v#L2NKfW9ck| zWimT+uq>9%a#$`K!iKV8Y&aXiMzT>XkL9xhR>+E2F&oXsu(50$8_y=NiEI*^%%-rZ zY#N)+X0VxT7MsoHu(@m=o6i=og=`U9%$Becwv;VnrL2rCXXUJdRk9UqC97hqST(C* ztJxY>%j#G?Tg%q5^=t#%$Sz}-vn$w@Y!mwj+sv+FSF>x_wd^`}J-dP3$Zld=*v)J! zyM^7#ZezEzf3j`t4t6KIi`~uc(ROJ6X4~1l>^^osdw@O29%2u(N7$q6G4?onf<4Ke zVo$SY*t6_8_B?xmy~ti-|6(t*SJAG&w@!gT`g4JO+-5vKcdtx2gTldj@bw8X95`b0gAl!q{PY=Oe zZDD%29-&9-QF^oBahJeT+U7{y^zFaTIPFtnELSLy@>8tc=y+&WH zuhDDuI=xl^fq`epj%xKHRxeUttVeY1X*ezks$eyx6;e!YH!K56EJ3AA9E zZEbaBT3TM3f`zU%>&j~DmetgjnVkF#1v3?ND41)@TUD~Gwx-%vVnS=)(%Q0hW!4f2 zYM3yq(qmQ&{|~1SSEq{=u5)g%P-;jXpxX|{KyQZ zXP6mJ&&YHibIF%`#U)%Hv$UjEufUIWY<*=_X_>WB0^3-X=1P_3v1Xbp&4L-LQden0 zI(8hbT;V?MQoQafF5zZcGP4xS_E=e7TUJ(GRZ?AAxy(ADWZByKGHaCt%1ge21=a~> zwyPx2Cy4A-;m1133{~AHl-;b=bbFR{k{PPnEUfC1)irhXwKc0N%2-i#IV-C!w@p^r zt5MmTY-X=U0?)}6YpcskYS*r+Dp_0aS<{!YPBSIf_L1yRS#xAtrMFX7gCW)3ftz-=C?Mm6QjdQnSN zO?7#lTb@XZ>8+#}wdEB_maU{rLifpaRV8&5CSG$1S7nomlOn zNs+hm*h9OO^cI9iS)UxaAR%V)i2O(_V6FMQC#YmvWO#ikyj#je<}9UURrMt{6_^1W?3n-Rwc7$CNjT(RQ+rPD)2YF3+iCW$ zmE3eCS1AU2x{{l&T(D;<`I$<7rjnnj(+m(E~l5bb?)o@|AtNh!Qe7llwSMu#jzFo<;EBSUM->&4_m3)Vi z>riqXO0Gl6b*Ox+LBsA)ave&pL&E>*Lq(xp|NYt}-OiaAkjU0JDhRb{mp ztn12_)l`?dmTg#u9uHq;*z980lI4|^X*s#}bnEJ}I;aS}XlR?d@{;n0j zdPPmmN?AO1GZ6HoYS#|ct{jTaQgoJT-&v}CXQ}p`rP_CvYTsF^UuCKGou%4$mTKQw zs(ojv_MN5LcUF%))y}h2JI_|~vz7d8B|lrq&sOryN=(CN1!lg?$^@+$0DfvZ8evy)2q~sSV`9(^8k&>^J zn!Q-bFIMu4mHc8QzgWpHR`QFL{9+})SjjI|@{5&xQ;DY8l@hfVEBU69O>-zc=TOSg zq2`4SH7|6id7;Bp=J0RIcc^)x!&K(roAMo|G6!wScc^)xL+MdRnknCrX6E0a=7$b7 zKXj=1p~D;((~Hdh2`I}4P?is%EFVBwK7g`(0A>0BW%&Tg@&T0T1C-?hDANZh>jzNQ z51>pRpiEzSk=Z{1m3*^*f>!d){s~&iH~S}OCEx6ypp|^He}Y!>&Hf2m$v68aXeHn5 zpXo(r{{&R|H~S}Om4CB;f>!xA`zL6Xf3tsrR{1ykCuo&_vwwnC`8WG#dXd>b0agCZ z{s~&;-|U~DRsMShVY7dNujHHk6SR_V_D|4CzS%!PEBR*sOfNF~C!msV_D|4CzS%!P zEBR*s1g*;7?4O`j`J4R{v?_nIe}Y!!Z}v~ns{GCVnOOZpjCd& z{+N-Lm+yaReL&7VG3#2|hbL#7g6DV1pO}XH$(vl|5IiqAsq2l&Bzq(AluvuYn-6<~ z`t-~T#q+AN<@LTjjHQ@mf;ZDtR_SUolddK+=nZlZMypg%`BO?Q!;$MLf|o4CN~1`l z@ReR{z7nJtn^lVWq*S$lvd92){pCzFKQ}EiEe8%SqiJb>!%P1YFY9mo37+y-0Oj@P z`2N8Av%fy^_4du;ErnWSxF&1CuXSz0xt5)BTzt}l@%2`{lU zB-cMA=_*Kx`3me0iS`gxiiMBfNI+!wB`!suW-mySPh@|{FkjYDJyHqf1mT2}6*)#_vqZ7r8c@#(YjEgA0Rm&)2ztb&`| zy4OavUknH`jpxW(Bl4YGtaa zXr`Ka;*dWNbc&^ARW<8-1}!X$s7QL&{c>b|q}g*!A@&?uU!YCl4)y-#Q15RJ_5S8i z?{5zE{^n5cZw~eT=1}i%4)y-#Q15RJ_5S8i?{5zE{^n5cZw~dI=1}ixj)H8gP*tYE z-=MlxB~?|fmzCAl3@WXzS>=M&BNM4#Z*tt^Dw5>6F0WZzt1zr4nf~f3H%P=yE-IO* zTv{?cR#&PBZBjSF zs3}Z(l+pwy+I9w}Hwwyb4qB=cK-oM2W%C4-%@`wwqPi!Xk}qbj)luoBFL{oZgqDTGxW zfgM{Fey_kk0z05v@VgDSxDwd*yp7*?wO{ai82<~r_?<_}@LLXRFakTUhw=Luj1~#3j50L_J0k~v z$I)@%Or#U>JDE29M_rflTjB8im^)68b8p25IA~uUI8`jDQ`3TR{An;g-3;Ce_pGLc;w$vf zDR4+f=#!cj)`Snbg5ex+cWYV%4Ba%_4w&Fv`b&Oclp+MygPSbVXWw5<6TVE2>EFa< z`4Ei;$x0!bZosHclo`>iqN!UN3; zTPsBpVNOeUXYW&xRK=s4F>97?cYl#tA(v`agU)yX9Th1MQbc&?dBz}(a3q2v6&66N zVe|4}-XTHG*en?q2OL2Nk^=vhi`^bvZ|U}sV#N~`6WM+yuR?hjZBjqfWXd7?!R zL129Rhvz*{j58iyI)1$SQ))fruvu(-9bP2lyo^GXjDavvD1x%Wi8RRIjj&R5HJapa zN57U9+ew+LzJ9D{hc0cs(A^f4fHD!Kzzxgkg9gH#K7dLQzm$5M+HVlr|CP<1_(buK zQbb-+B!=O1_v3~We!5`VE6TM;ip=28evv(1P^-|6?>z*A(pwZ2Z zX4cY3QFi(vtDDow7=8`LTs@i7=|uc!a56`t%+PH3$dfZmc{nd?7&xTEmyc>q&u$3f zHQfV-Ulirr*Ee#`7k`yDCNP%Q?U`8b;>Yt&#T8n*h|uUZxZY~etpBN;e@*KFj~_;s z?)UZ%-Zd=k=Cchhd&ZY?-8E`&*2E9IE_UpTnX<)ZYY@Oif}7o~XF%QTDZy56%V|(s zeJ!W=kC}B?KY39Aiv&kpPPBkJ;wHgSkK-3W9rZeX;c)Zeu!h0o58Fo^?T#)2a9Uks z0Sp(Hlp{I$Ut7+09?f0#sk7@hfX}-+jvR9oeL*jD1AIx&bslp}d&O#W9m}5dgKKls zvD^vYTh25b&mQ-^-gF+|2TSugfFD^?Gr%sFv!EuttG9Imd@q?3z-&5>aC&3I@xlo| zvcnB0?BlyE=gytT%Kw_TGJs!a{?>eA*1UZl`%a$p_Ko&(vXj9hZfZ@4Iyt=RHp6P1 zEG#2kUHnx3%wM`sHJ+Nh?z;BK0jIrvqr46MbjH*Z+&2W^l#6%p=}DD$cegmtgbaMy z-7liSFZ@|o&wz&XDd(K--T>#Ro0kAgf(tILo(oW1yaOH+dc%?;&vWjb=hL%(ayiM*XN=j0)_*=@Y)9vX^B4M$p5p!Wb1ea52X;CJwgiS;b-^pD zC2YV?t>FU%XqVvUmY7UXP2AnLC2V8_y|70B1~9euhUUWuTCHy9e)jZi^&c~!D{D|| zaPTKMxw195|0g`atu?NnpJDZB9X#gx6S@uH#%5}19WmynbLaIo>ei*(EYLH|$(`-g ztNn}!u0eE3vgG{BLDfGB{Y=lml9 zj&=ElcMx)px_Wn@?_cBrP|N3tt9NH$T(^Fq3jjvi-6n8$2F8=FPTmeHDz`fRh8U)RA4@9D9wU1lP>yxZF?=b|Mzf3eHk%hPhcrOPLD+u4y7UH)xtmPTin zzwuUUw52OBzRTIx+!Y^x^&$7fZsOY3K{~pb_aIAjYPWYshkmZ3+dD)zY;N6=X+|5x zz~$u7XwZ}5lve?8Ag+_R5{xNM*RC$s=5)IHJDpy>PMq__+S;5Rot>=Zv0`y-f7@w8QR_j?O;P909 zb#o_x-i0A6AhxZ;=E^BY?pioyHyJh$4!d~bv~p%?bveG<1p5HmT#o-_f;|$P5YIYX zjtk1EpFag)5N8+Hf9>X-F3BIH?4Pxn(d}tU0nulkCDJ1 zlaB+|PamKGagFCa{n_q!I{b0p`R?5;JE}p%?u)0B( zLApCw+c^pN$3E=|>(OLdyKHU%ZJjn({oF~^=0!au(KvYah^6TmYWkvu{~JCxSa-kE z#fZgv`XE}?IqR8&zjgRV2+$<~uIbQ0q0)%;%%STzv)WGV>13@^_|wIsB$WNq!Z9g`a)l za%#2Zli~0Abz^An8MwtDF9z;KM#BZ)fqVvUZ1+g&od%eb0P(!K?bkCGNAdN31Ah+* z;CX@PPlU`cng%-dM2wQ-x>ZiG#27E)`_A~`{k8r${{;X3H1cat`NVzld3y)G+7i#i z6tj2MrycmLZfo0xPqn+gs(Rf2@KNoPuQy)r-E>sD{fDymJihu-+p@c4+l7l=+O>yD zZ{^3&Nk{-6JhtRUPP??{j%ObwZtrXNpIm-J=aD_yO%3zj_B-3GJ=9$C@*#R&yPXgF zdQVQ0fZy)PN)T|@E=RP0yMN4x;G5WmMGf7{_`>i9cXkGi#wa;^BoQq25^o!g%%~1mlzB6};B|M(b**T@InR@U|Una-8*y4@* zz8W&kmN}14`Z{eG2}tL~-;A1%n_76vx5aB*yIXnTcg?MV@k9Bf@1`su-MBaT`=JwU ze*Jm>ABtAH7@fvzKg_xOLgWa8|2VX$Gj%R6`f++Gu_PGIU9oxXdGmSRuHyM^YyvL; zWW=A3-8FhFaYpliU1Q3-{F99KpK~Ty1N!s&pGU9ucK7F@yMx2rlMDI0-60kdGlP%b zJz)%WrtBe!+v zdOmUA$a&qK5fVB9hwRIr!-*f?u&u8J+{W_`^dCl3R#+G)v zg!7Pt(fv9HF6C1X&YISJA(}5cxZrZvCMTbMC~ukJ*^j3m8ncXe#__5{Q`YzsPd?(% z{K>5sQjM2?$r{m=wUQ72W#~d@SSkh*&7>u zl6lQx=U9?%@Ck=w(~N%o`S`;bd7Z)OeAwZU(+%#$M+oTj!1Mf-?V(A$_VBn7{9>Yn z1hDS#xG~PoIDYw&z$_LS$|oJ^*UuO*oi9HU8QJMSkdHl*GOjx)m}^H;hh6ADh9@5x zw4u|lfqNYpoVO=uG4}&(u+QhSj|`sW;~xT;R?!(7!sCu)Ol*x9%*&4qUECVppHDb4 zVs499Bp-2P#L~{t6yt>>qe@y*iutA^3paF}Y~g`NBeS~(=kfHTL#8x%L@BrsaMp0T z$Bow2<#t+g`G#Yy)4Im^^2Nsj zQfYWJpL{IR%f)q&gl>R-#|AGrWgo>C9Lt`-4Hv!$(CD`E<;Sw882$--&avT3nu6nu z-;Naw=C0#-+3yq9pTj^Haoo$NJ83Q7bUb94XQYi!J|5Md2B#W793Px})KSVSkEa)3 z#7oFZKyLNn>i|1FLipn2*;QTMjITdFX@avE?d5n)MboiRUVS1t7qbq&@I-2HcW^Xc za3W`VtBa5E!--+_=TUBBPUKDRvPJXK6UA%VT2GqL-Iphvn7O(wdJ3O^(&pWjn8O#G z^dHrclf@UGOv~>gZhYa%jG3Jl#w$+dtZMZ%`1q5fE=HhBc5cI5jBCunKw*=wLn{ z&}j+c6@aa75rQtH77sq-RNBJdVq^KDQ^Q8I*;0%>r$$Ua8{**OPWz8EQdjYbr^8~} zLo+}}#o8{Ri+#fL5Q4Jo)s1VNJ2adE)6o@olblKIgQ3aRcga#p#^I7recA z&6$9_hP;Wq@JvW+XV6r>{!CaV_3`CpXTpYb1$gs0XW|_l-VuD(natu2)N8<*%tei< zcFxXZmRd71j4#eOkfl81y)(IvQ$a;MzQN0d#uf7vz|MZTe13ypa(8SZU)&HF>>4=0 zc%>mY;>4(xJgZ^gz*ZgYs9|uX(dlVSX~@n!8#fDYsH5jN-3RmfhFK$w3&V`fjowM; z3m5W|#=rz;KscY&7#iLgHI%0|hKF|sW%B-j9l>@%5A5!j$mcZ1B(?b@!GA)gZt>xn zjY%Ok%RoM?F)6CW%fSO0lk#^>yPRh?4qVa{70jnL78KKVZ(e@ZC%rp7h-aLQjO^!g z1s{7hHnr6^o-a9@I@GYCzRnJx=JYD$%g&A{cDl!d9x>hNS-=-G`6qQnCGkm30ofPh zqWH9?z~DBIaK5xDC>k?r37vpdO+mSBi3xmaQ)s9Y^)t6AG_oz!&Sy1+CP49X-=@I@ zXZ_;9&suaQB${8|lslX=KVH_9JIU$Zh48~>cLsZN*QT+vPPz@?c}-ImxOI9%?wr!b z69)Hg_Vw{vj82V|m zf4)bA3y*CM@-ZSt@!)1$d*qkSH#YZ6ZI2nq2RDbrw1o`f70n^`j^JS4zd2;p@q`vW zy*Vt-2+!nGo8z-Cgrp+g)Wjw?=%ePGc^4B#^VxtxFUFtqv~`AL@oDG0Bbri%@U(Nj z?w#R7xbHb%|E}nvJOI!&B8LY7wx^Eck>`fYZE-sJ>hr|CJs}OyH=;dt1YdJLwjbBy zdG-1D9PSa!7oQ(&r(HqDFXuC2+XE)@f(s<;bRqidg`oJh&_rH&A!FrU)mJ*q9BjnBiIqN_&)FKUTRZbW^oXz6cvdc^Xii=pA|7zcLv7rF>O(?ZPERC zd0TXLXP_@%)Rvoj%zd!Y+TPlJap)}Ly7tbnvtuUl741Hb2749{YY$90n>&q{w1*7l zG?b^checfQjOOL-VUc(*fWI(Ddp|F}zC9}aY(KQ0_LOPuegpWN_Wpw#tWkV*d#2+! z2{-n(XRc|QTF7JCbH|_Wb}@EzxSl_kR?Zi71g4zqKa7`kgbeQXNa4#nGRL)9e0gps zZ*v9~8pk^=LmM+Ac|~Vna%W&TuT-$AGbpGdB!VY)hTBi24(GL zkNHNE+tAV@F&Rd;M`TQ+cQSYJ;+CIB%;)QT{0jERdh$&^0VA8)aX!QEvu7F|v-sj* z;(0QyfG-|9Y}hYs5Vy?^Is0trB01N#VXoM-{)O4J_Aci5iF@~JA7WY`dGM(6)3ZQm zF8tl>a{T?9kCtmUyZ!ps{m17b6xNV!o2(k*bMIqYNeA1_DTu*ywcNj-Mn?(ntYmf1bpH*5e zwwQ<&$g76m&Q;FzG1?Yh{GaI-R~PMWUhEg-xlWA**2TLcO&?yO~ekx5#h7rTia>8 zvafny_HYF6w|{0sbf$JM58YqU6g5nHmJd0wpgYh@dxS4JxY9WFJN#rEtUrI(dkQ(> zi8N3BWoomxpLQ!x`DJE9$`FK#`lYhd2-U9TMZZot>K}*-uRS~+%fCqcxFgd}ghivk zCmbn1Z|l~s;tP+gZrycUdxmEnop2(WqXsAaUUl(@PejZork)B2lE}1eA71PEUvG(&-kfr(P{5Mh*;G= zWxt!7c7xI4@3=LgpLPT9=kItbH3Ch~Y=CBuVe;*CiS|O&%5XS!_|HKE<3i z97J%M+n)C6YQyD9zZfT;jSNY|K_SPC<1dlW1nn)7YFzh{>)8W14&)H8f7$>0-8i`5 zE2H5R&La`xTjSF=+|KwSL^IEO`+~oxiM@BhU+{MGsQ1si_0!(h-sRIi;%}pRwKw_5 z9f8Ns;#iVB#=Se5>=SS($qjtj7oH!U!lvprUc9^IfPtrP^Q`?B+Pt7kw(voRPn`+J zAttZzio+*%wcoqMK8+oUNqwJ z-xr2G&R6m|+D9SJ9IlZ{NK}w0X;nqWXdIYwzs+m%4~RjBGx!e6n^s2{SrcV_NxS;zDjRmS>;sLVpAAb|4)O<~%jiv*-#$QI>KQpkQ9LEiW z&^XrFkVvd({>sOO;`A8##~od?4f(qXddGMUr&Nfw5V3(Hio~M5mbibv$e4!R?;M;S zV<{}2Fhh%mC1I5ojgN?NrdkEQqSm6TO6tYQXrecWEiH4sgbFi5&1==lRV#7wjk!5! zZW5XsLvC6qyg1QaujlVXb+rXL$z5rpN48~efMDOxi2g8OSJ_^y5s&eOqKlH8fraI%gRV8NcUB^tZjj{suF*D?wYyQk~+)_B)d|_Pzh?_p;p82~-ss~O5T8%SqgvP1HsW;-}9j2eP zMgh}A&X7oy4)(B9aV`*}Bjl6!ajMXAJYi%odVdpxLXvX;8FgN=lUl$8h@5a-4Q_Jx({uLArGKo(3xkroREK0_kPe zQW=8}PC61rjX(S{YdH{+VrWJ|Bc4c{gfs%D8O>4gh^H|mO*|z67cN?J6SRz7(5ae_ zpxJxCP1-7GDKh{(VCu<0P2Y@yhn0c2yH~@n2W$XvA1!$azyEK01N4|4n*?d8kdHW~ z!7YWWg}WLK*J_Acn_>SUEDSW9(4*nxA{ZUOp_Py{xMH{k$glVl=?IoJ!kmvNI@zSr zpUvmEZEG{~fjTqkFzq2p+xSNa?}Hlu8FZL-RB+Mp-v@U&=v_pNCAm(}Ciiv8JtDarITBp7e91j0xUi{t zNBR9pavMy){Cdd^lHX!_|?G)MSYDzT+A2>N~G=<;otd~@u>8l zEL)bpW)obE;>I@N%g=0YxM^U7^o1c6&%?BX`0Z&8LLYh{ZlW!v#VG0jy=4gu3#6XX zq@FUZWT>=2u}TXRe@N8Ovo-W>4MU-Z{;lCGEe+b(bl(F00(Ta!9c={lO+4VBQ%N*j zDx4i|1l%OJIdBzlXnW*Fxb1Myz`YIkEqc&goOta<=4oL>^g2eTNO~Mq zjt2d(q`#H4X#JZ(`>X!REtN8EU)9dv$FpFx&|;jqRt0Ua9ku%*&ObYi#ubFK#)jc! zunL^ubt}%m*7>6KpDKmN5I#(M8NZBPZ5^z**GTSi!6ofhq=SIU>1(G#%V9Z3uo5yXB~6>YmYphH=Z6(wDak6{ZzQ zUoKYMWGi*g2cW~Wt0i|e?vgZhz)49nYqa#`DZ}b2jSu(wlKJ6n7Thi><4Q#+SaFH4 z&i8Q7q8myoOj{`Fk0dSXdkyF??Lo=?3UdN8?5&bJRC0f?>{Hx2(Ec(;p-YBn7E)@N z16^YKFK0BO#wkt#6c&b>v@i^n7KV0dVdy}Mx&+I zI{w`zEevm$7KV393&Xplh2h=O!tfqxVYpq|7M_*1g-z17@SL;~zJ!fufMOV|z44}{$y{Z!Zu(l3PFAl)hK2I&vN zZjk;cECy+#uo$FG!g>!UuW49O(4=kUd1yVMF`?~Ata2HE`Eb+VmcrG-T@AMl?lHJm z;V{R89@5A`xCXdxOpag{Mq}YJ;1C{`lo~~NitzMm@V3D{0|zTlx)W|M+(|f?zcK72 zGH7Zx3RZ}-fG@|~1ook98>}Ut0S{pqv@<)_qoEgU_@jniQ1M3%yh|)njG{qh)?u=sn0=g$E;45G_=2_&4=}<(CT=y30AhU2b#Kl zelUKO|1lsJ~BBa~=Nqsdu=n;5s_Upgb^N(m|dHt6&DsxxG)d- z*RGYc92e&81l?y`nD;j5&Eh%cIR78b$oSulUrbw~i<<*$k*9l9p8jUu1{=+B@Fg_l z9{38=76`wvHTs*`9A1~;ckVFw+ACw6Cnbomw}Zxenhg7Qb3VjK?vpK^3Sacxg3NOzLva$5e*UO)0&nzC^0_L zLtq&{W*m(Sj~t+Bk;5Vc$!_2y}`tie4Khd^P2nm``JV zg529D%!oNHcrl%^Zn2>Pi%reh9%~nvqow$KY@xs=CQrONc80)WOH<#Dt(MrP*johz z?}=C$FR-sBKc#q=u%CK)zw}}!d$IF9SR5^YW)goR561bKSX}tz&;NoY_VUttu!O3F zb;{q6f#C`(9AEqwY*H_8PA^u`i`DkW=pz2&uAY4SFWA;z-rYS|&NCAiD1T4Iy{xbu zak6C~mi=STE8ZpSSTFBv4_09B!QzY_EZ(I6qn-F0MdSOKSnl`Z9{V#k?(-gA*6|)J zK6Z|5|C-hZ8_>(k>cvLIPch?*Uy|&lu+`(2{23d6Z7=V#9<1=w9xQ%K|E(&-eOR%Q zfAN>FCwh4=^A-O?a-S77||X z<$c)8+u6(ev4=MinR-L5Ui_r4Dyi5N6%Db`G-!nZf{)ZM6{o%O;Lw7*^x1s$(@UP0IDmRbUD0WTDsm4CvS|M*RWc>0!vG?#CrXezQ5t?w6I>GMa66|Q}NAjoUEWF z^;Rk>=1Yf9<<(nf$G>`8>@i($hm*J0$vf)gopbW8IC-X>7w5P0;v((5E{EdkTIF_| z(`~5*#WhM%eIqU{MfHuic6J1g>uN`kxL!`);P{p0sNdP1x9S(zF}r?$dnTzr$&QW)@|BlkKwtlgK z_SQe8plhn3DLynl%F2sRidPXXJ|{j;y7SMR9=xOzIF*} zp5fJ(mB*_ph7!g%?%KGQmB(u?3u>{Zg=(#Yz6paZzJx-%RTE|=DEkuTXP>kr5|$(` zSJ27?TXts`6^9ZII}#;{MxyjgVq#)SVm8Yp79PQ*ClRC z+%F|AB$imzd$F!T%?6EBUS@-i3hLcppn}FUD6}A6uc^E_4HhYARfF{k+TLJ~g3dL# zq98NLu%M)HyGBVhlTLY!!ZpD6?INSRm+B}8ZA+I>)WcC zsnPX@%2K-*W3|4gp{fU8VOSFP`g5bYjg+75{)}sb>^7$qUqM!wf(B)&*}2g;2P(2H zXtbu$M#bm!Y(7ld>>B-De{MX!@f1s<@%*-16ttr88U=mP zc&CC6HP>`9WB%1miC^CJzMQxhcG(|z#O>-60zv&PQy4S~> zPG~w!QE_!*L42j8@`{`8QWChrPLI6KP)KOm8@DdIi~F)mDeO$Md0LnQ0L?V zMIF>GM?vF~mFDDm$*R7|>ylL~B=1hP^*QV3W?Pc4DcMrIELHwB3u_jsAY4aT5MQ;a zyaIdO#Mf^sZ+f$N3R>Q5wSuck=R1@;uhI0R4;DP zzr{#PqQ&$U3l-$dNB3fE)}E|O7B%Z|TaV(qkXBbgC26W2Y2kKWT1uL#M_O*0sz=(8 zG*yqZX=!sT*|c}k)+%U6+HnP4O1oo0Ez7m6qM+E8Neaqnsd{_MUM&Y$dF^_&9Iv49 zEvG2HqL!*gEmyW&r}DP7+^wMFEzc|HPP(d5dT4rtm6slu-b6t;>3Iqokgno*`U`es zNMD$)Mp^p0^lgf7f4Zti`la++R$ePlt55|+wTe?vYAe;-TjjOtqw^j2y_ zwOZLqS>I|~D`kDFPCWM~-`E!j>BGgNzIG|EU*d1~c>E9;IK`Ty^{j3F7SWiqB^ zsFuliCquPNMsdb2OE%+FhU#G%rL9#DYaP~F^|027tyK@pTw_Q6)|nG>w^ze$oYiof zk#-blGs&KD+RSUS#Zuj7d1vK~HmjYy-A>*i+Xro~**?e$w&(b)n5;xgOICW8(vnq> z)nDa}v|~=z1Uu4XO>^>=I(eJymG8Y>jlUb+S!bLPf5#s2ZL746vPx^4)HYQ?Irdth zZ7(~vw;kZ*IXfL~r?*w3vF%ESZ=Kys+U~Yzy0+)rs+Mj??Sic`+C|vwgLbL*OxLbg zJJr(d#UjBo96*T-o z6;&Rb`QUt&x8lJy3flhQ9tE9y@QQ-WY{P=G!?SBDs8O~WjoBTu)fmhkm_1xk3$te` zXi@eG1+CBiLP5?NJ^M;_iIvyh-#*-ex-7_1_2?Ft6Q!t$c0X;OV)xzlnND8E|28k* z;p^-04R-QIJ9#hI<+h*hl)KR3Tj}uqUEW5AZ>Pg|*vUKN8G*!7B zR(3e5N?X`L_1OFJ);W1w9KIb+-d-o~oRe45QM2@Qtk|)d1$8;pG2Vi(-=3_f8TOt> z#~gdlqhp_rYQF3^wBsSg_kxpGV)|>zusZPTr}G%HthNJGm@d&25JJ4?XDz)=*2fE}ycWkIj%`VE%_jdET^zSmnDy_?eF4GjG z_DgUN$XTEA-5`sa+b%c1%Poexdb(EW8Y`jXTot9d-h;qrNpvlBpnL}!=s;s^D7Rf# zWx+kD>l~Zfb!pdCN?);^2R=29x*qMS+LG=2&vNhObqlts_wpWccKjbAd*8NOM6RXe zzTNX~Io*0$nfG>o@9n;ITboPWHZi^1E=TsL16{PC+|b;p+$83^XF=}3+%dpsLfqVDCo*X-V?dm5mQ-TUXc^8A2C=GE;!y*uWu?rQ*T@4g4n$?i8S zYF>C=-Mo~%OrpHpyg_;6^3aR(=H;!-+nBcv(Ehv&c_ls2Cwo-vQMX4*5AgNK?J=mw zxE|o^F{{Vo9;gJU}(XVf<*;u3*fziT?ME9u00+~en|E-B0wG4d-&5`N%E`=pRkN91n$-p z9!;@~yG}d!$Bb*I+#9^yM!NfLMX6`q+r?Yhj>)^l(X+OY<4 z#G2o=HBp*HF;_GQg>4NiPk1Ug^uA1YedFL^5>K^pQA6UbY+PB|SUZ-8F#sD@JCwD| zsSR>)dB#cW3ogrN`C%)1$X&oV-pdHg5}+43SGYW3I5oy}Jhrar+*@!Ykm-02V@%R6 z5eClV?lTmev=nD)EJ_59D`rT^SXDFp;u*_`HxwR4K8fQ;7oa%@mQ`n5|CcMf>Y0?9 zXd{CyPYH*Qt1`tUPjIFfu=!oa@n%StJN{4tepL@pQT*iMzm29ysCE3tL|6}MaQqs` zS5@cukEn4JZPiBm(+sP2j#%Re@9a8@5^(Y!P*I&Z2{`!=sCAub2?tRZ-P75<7F8+>$isDw{E(_;%h+BeE0@RnS1Kv8WC}A<6D5t#B((X&JyHETV(0vJZ=f!WA zQ0sU;4-}wW$@3&+!lX@4;?o+%-$}{~7+V(Q1x1Oanv&Ao6P?hjF6(XXiAw02fU~h$ zbN7h^^cCn$Q9RQVl0Ct&s*qczX*znt?~;-UFSwvl7n&!!X=Gja6;M>uumqeY7Mgp1 z)8LwZXnev`U7esED&?MljAh^B5+Ch8p|6xB%D$`(_C(iPjr+71EAA8ZmP<-A$vK!U zXu{85{A5YOeyU@FbF?Qa{uZ7%1LWQxe<^wapivmJR=r2@=n2PYp>L(!RL|bHJ@s+Y z8MW;fUr?_dpsC&-ahvKdV#vKEZY@f6tJa=lrpK*q0^NE!@9c=Kzkq(bZevA!CMi!&_9Y$b}Mx%X=9b_)JE$2a^$lXX= zBPF6JxZWZ3*txRQ(M0uTNx7Rm8XNKxV6qhLCUUvu;>c@pf*#h8Bfx0(b<#=bn9USx zo=Lia*`PJ!dL(-Ae4NqX7}%rs%(`Ka8SMV0_B-{4%DmaN$KXi|k-*Tx*;MTvjDI$$2+BmdJJ8cEp1g&o}~gLPC-LD z?y%}~7kOEdI*!M!Sb`eNm%3g@uGLF37>7o9sqR|P<$Q)WrCam>B})Fb-r3$W8v3F5 z)e{|Zu~rUBtYC(DPl6A5W?0C1hP1ZcBJU=VEcv2Bw$<%}yvAmWn0U$e5uj|z*BGNS zT)<c&r@c8be%$RaP5alJt+& z8ZE6|9Hv2htQQqsvKaeGYTDnR0c9nFKuZjV=) zqU$zA*Bwe*Dbv)Z;J2Y|nbnfg)}gd@DCe0XS9_MfqHKzY1w~Lj$jDJr<9sb1FXKET zs6cN5D8e%$kcDR+bnR8-nR=A;;Rp)WtH6ilSnqv4lGsF7k?IN2Us&$zhk%!HRs)J*h-CTq;SDmASKUQhY;qv&wsLCYq+|hu()*gKG~j# zVoohamFHESjdAErBz?S;bb)g``=mkyES)7O^_f!dA}IBhOf)^k6mj0E{dulE^?}S8 zDf5Pu;hyn^l8L1lNqJIIa0Q_~$>oIdino|4;)HJ8Eyt$&i`rlO5&NuESW2?iyRDbNs2c}&5( z*x~KE*TBhk=z3+~xphyW99%h2aOH!rEtDzuwS$aL+9>z_$T5}IL+4=6i0YHDg5$OR zh{*nEbLhc%;I@sGy*fbqr1o&KTdX$Ye2wy53jG$67I7%Xah~lJrOi zm+@JDK-Pid3(p<_%3>~Uxx=MPd<5D3Rr*ca3%XUmy$PfbCJ;{+y zkvTmsI!8)MtV4-alvr!d)wbFcZL1^G zk7e{Bj&>OdwHXfQ42M&WBk_mLDKc5o)zId2HFP*XV2U=~rfAb0N*hV(?}=3Nz-t!n z(3eZRBgc>!UafbuDZi$zu}l5C5){IC?}7w~nqYl9X&vBABAR=J8Rm{{`Sy?B@s`98(wZ#_Eqb zz{Bta2i^<;`Cz1I8Y(5PGNqOYirwF0t#y$$T~f}0a?dxfOPS{+Wfv&VIodvx6g+QD z!FUEGnrbkP2O+V?;oSpY#7KH33Li*JIU{vUV+c4~6iY26&k1{u(N3u79BXOQsz~j* z&^}diJ}dD|;7?jOd$rs);DaUJSJG?J18S_#k!4myUz$U<7vd#nF;i-mphm?GC6XyR zuN;DF@>OEAnq9y7O$6r$9oi$tdD-K6AvhHMJ;V2YL^DdQP( zD9=htTlfBmq2>8{i&qo)=}wfhiPzngmoTKb18R0Im3kV1aj$-(fnlR0H*7`xXkD;7=pajv)-1J zB1u^RN|8+w*44;pr-et`6ze%rts>VgY#ZuZQBh*4GHb*2nXmFRAFm>KKR7J9BSYp( z6m0M=zzWGz&2v_c*>JT!ucmZF({oH0o82=MU5*N|S3IGZA?UIG*WJDMP} zab9ce(k(_AT_w-kN+wp_p^4yiLC6;L-f&5;;?S!xj;qPpVP90`Yfa&a4%=SoJp0%a z71j9x9*r&SNJZ16^deYbtpOVX571vScQ)Cc?JV(s!Mfl|Y*UcLw>WgG%sF=tRGE+Y z20Mv&4}?d`*1RD(@6BdME!>ej!nnq3wcr}pp!t1?4{+$;Nc@s*uaL1#`@^CCCh5Fl z3$DTAzewUeZMuk&IMxCch%M8Dy|aUlO3O+lrL8Br>XeE*VZ+Ow=-{IjxkvG}keoHK zOJsZCbLQ5gxewI9`cIE`C=H~Z^|p+*-lhoIleL*{e(wwKpIf%ibm+BM(p}w_bXQlD zL@O@4Lb$ZZqnJrT6eU635&94^!N`lHimXFhr|7ZP9T+W@{SmnobeE*Jbm$crcfDkn z>3T^~5>%|>Cyc`)2cm}GI22+T?Pps?`&m(9si~yQkTMwm+PxWZ08?BiY#G-HC6l1; z@zi3O>Lz$}!xYy6$43XuO1K_M#(s$OxGSH1RE^s|Us9^U zIvH2*UxUlJioLTL+R9n|L#_qFsx5_IZaVavlJ4a)b-(vf<*nYp1N5+!%j>G(Gtl)2 zAlSw8PY}0_t}S#dSZKlmXo!~2gX>xisSUH0Rs+8~7%Z-# zmaSQj{<1Bjzs&Uw;`?sFlEU{5!vcfBQ;lm13*uy?3kb{h9#}Kil;!p?(>>w%RT%U; zDU&RFAodfms)(j+)`q)`_S*X$bp;Sj37`aoY=|hz zQJU2YdrC@0E)92B?w_ZsNXiJOv=NR>9j1s#v<2%32unNsDDhaevbgU`#gUYeNgE+c z>xI&6ov~!FPMz%1bmF=hYf$T9OtDsP5m^6e)8#D5`w|N!<+?3{U!J#X_2oSoyt3&2 z72hJJxcI6_jv7}sx34w`+Ey|}AH%jiz|ndPx3BCiKZ6o#^)tPiEvZ){yEH4}zbqxE zptP4AN(ZU49Au=og*9gXRKM30Eoy@vpp(p{b%1>E16kNJko`%^bhy$b*D1->*qjtH z#k&Chmn+T(F!zWv>=EyBv~w!+;Jp&4LwG4eYLw#rV4##!t7ncuvi91u>}78@`eS9O zJwZwq!5weW# z(kAZz-K9%POBr2E|-K*L{-6R3G2Cl`J$0c0c_=?6Y$)e>W1s=MpL(RD`g4^Hu!;+zy}r^JE7u@()S9Y` zQ)U-s4Sr}rO5(TkAlV0!4=74BjggeUTb=wvQktoiMzqL~c)pUXZk49bw@cIKD@wF= z1)yFIpj!Y{_Y0MT@*aDu$4#kSJFWNHNi`;q~N#&Rg2ro-&0Vz3& zAt#zu1tmbT&*~R!dHsT;S5_8DmeCG5lq^YkUCOM6%so%FmXw~3jB{N~&r3=K zWP(G-q2}_6L;OZ|pB*dd2OY_SPXB2MN*xtz<=#?g3d-!J=yCG=N|f5mo9aF58R_NS zljfee-a9TopsC({o<1mt^Ir6_hmmKr_vFZ#xw+@I_nRVoh9*~6}`ZHLG}fUzq!}r9U^fALRngG z_fBZz(t^FYQgXbd39oC+CCTIM;a(vroh44@#xVpt%Ui^+7M`Q4KL$%%D!P}0d z%;TW!X9`LvLht8!{xVbaD07)MFNEj8!Ja5>p@;pB8fhy+*zY5GZ%Xj>`U{e~2IhwW zbV^Z1;};2ay#~DB)y=gYiQl~Jivl^X1H5{PA(YyPOV&oZPf(^jV>1%CT&3!Kc3Z|+ zy$1i*Ye+AYw3kcL_>5*)NE3!6B?FWfCFK`$nZ7+F36uhOesoAIpiADf`cl_SK%+f# zaps7x{|fLslpHH{y{g=Yi$nZQlp5aUT45CyYh8g$`WWexQiom$yqwi~pr56DykA(? z-bD=u(h{k&17%8?ek`L`MM+jY-{pGJTINQcRnMwUJ*#qU%8f+X4Xm=bp5;0+x16yvLJ-pfvd0AIRmt1fwi_petn1xq`P-Q|6U3)|!5<~p(c$D` ze({mw3Q#=bawQZ=faFRj)i;3iFv_g*uYe~&yyE44h-(U8BCI^jI95~r6xT7yrORBL zB?K3rbpBJ~N$^Lo&yRZo7QGeOb(JmYdInQ3CtCbCJ@*RwUmsY`P%!#- zfc&iazB|H(#4XM|hqEs@%l`*w5aZe?XyW#Wvd&0IoX-$NS(+towa*TR-}1*!-~r-K z^m?*u@{7cOa$4diXHRYoDB)J5zW=-k-~UC+L{mG^10q<;JNJ6EAIQ@DfLgEZb2RT$ zlxS=1<(%?~R;M-QIP^wRC&yy;Zgn+VAj(KQTGWyBd;7}>3aHaB4!wfJCo1_UCErxx z(L$~Zuv)f#Fr4{iZ{qS|)!mGIoaM4SDSLy+M{MI=ivV3=e&8LjK4x65KSjQ0ued1j zN{Ze?9F=$%3pdlnQDc>q>?(>SbptU@VSybohNC4e!*5EgWC> zgI^afYKxSIX95qKNxs`Hgc{d@8)~2 zQyJG>QvM5u$dZp1#1!$UlCPyA`Dao-oXd9?LH+|NKUr}_%hh{;K9;h&yP_()EARkK zuyV<^P+kS%_wsEE-;-R$l8ZeQ=Ef|E=U#07dQ71ZjZb%SpBpXtH_O~8w#apd@SYXM zwaLIEU6&XlzN;kjwAwgt)))Q4!#pHw;o@IvUBS3Eh0AnpWQc4p$at;Ick0JcIY3`B zzmlI0e5J&1N%?W0*gY&@?GK>T8Or7ZQhu@IuOe;EhWyuzi&80%mHNHwaO*Cgctq8? zmh3M9`b5e{NO=SDuS@ygSza%J{O@GjFXOcs;P`A8I0N*ll&{3{I@kYuDSu7MqyAXY zD|uyE8>jx<1_9b8pz=utq^#mj{0*GD4!Ry&&4J9+{HY^Jv~^@gUkZPwXw3y zEQTP%u`HUlTNJxY+5tRZog=Y)jvcW8tzj;_Zh_0h%3KisWILnJbD4a_^bqrq^pkc9 z_#0B@3ocXJ3z;tk-Q1-@HyJ;F9?T_OJn*?xM2Z6-bucuUGyHpfF|k(3!B%d7^O5sbxo^8!}Cv3dwyhx}X2B}|s*y*Xjp@}iQY z^iZu8kWab=tW#lB5&Xfpato+uZ}tL@Ku$nikMFg$SSJzP8Loq}7WHKP>sj$fuPwfm zxzSXJvci>besDh`a|81JQ^1Px+6-x725L0J(Jgz9_MWy-@?%zjmH_R+r%u(Sh3xkk zGFM(r3HEGXB+SY@YZJe{L(YHJxeOUG9|J!I3O;oaj9EAdd;vNkaZ8G|az9e@Pep|`XxjGJV^0sKUGj6k{5&H+FUika1BMQJT4)1D_IpeiL!Nx1pQt!w=rd1?@FBw< z8zLg*XN>%elb=cQGg*G7$Y4td#I#Y*3?C(Cjb{FN;~yV6jNjry8WN90eixJ*-~6^kx0AR} zGwuP!g1mtE-B}h7%OdWAW{o<=YXTP-cl;SDKd}}DTwZ?qz+C&nz^F;icym*^#~ny!QHT=yAI z82*zz1)fEoO`fCpzvH=s9mnzBi{72yL-;H)lJVc!SYT{4_6Ai6>K(K^=zLIVa8xkf z!yxqv>U2#OTXiNv?)COWxSk#MRW5>}uvpaW#j9Ias;IP(0pq z)d){;WTLO&89gt7xz}a!ByNb`iV}{S^AkSVsGpUX1qV> zCibfC;uUgUQA0$D#-fRMNIWVAicw;WctN}>mWpL!x!5JHh-=yg?Q6Y}-UM&ocv>H- zFK}hK+Pd1g9&}~9+PiY_q4MY?Ejp?ir56y_o5Esoo0Akj1ozj-&Jv zlvqww6yYLL#Nr(`jYNt_7g-`lbQSrcx9E>I+6)z=#duLDrioc%o>+*t+pG|)#9FaI zY!TbUPO%4fX*AbR*D!nzca6a3NY`lc>SN)rRM=MFddT${dh>JeUJF>-%QXPlXm~OW zRzK`|9N07PYD?6hw`(BYJSCjn)PuFB9A@}p3gunA9XzmT645Q zYt*=}YcQ}>v`8ju-_P|FIG=SjceQbKa`kr&flZ@a&yc27)xXAjIu_{5@VU`70ecCP z^vU`Z^sh>;&iD*-b-`z4S66&iadpFIRaY)P!(H9+`G6}ApAoJe_zbx6@mbB)6S`Af z58<3rK>kS(_N3?vy}_)WrfX;;J)|l5bB11KV8EcVaf}i@KFVn z(+2CK&XB8y_UMnj6OJ#egQd8y^hUxPQ2^r&TrwvI^f2h-Je(7{@BL_qT-MvL5h>kkNKJKUy@t zk)!+XSItqFWvm&do0?(l(s{-%k7zvHHBui-&tXJ8qczh~^l@5qEfq0wl!o^aVqL(I zUPI6XA3mm)9vKr4uLbO)xD)&Od{J^X~wrw@lL!%=W z@HM%JLCQsX9O-$aH;_I?`W}G+GbBb5X-P;wW6ErRgg%QIiS)T>v!*yt3ynr&q#j6< zaH&#Hp`K=;#r~xk)B0*AL#&IYFP_uGZJ)H!m7Jc7bNJeG#lwd zc-dQwMclo=x~nr3!jKJHSr+I0pLllIhnNfy9L zcxbW`&yf~=aOw@1HQcRy6uT!ec}-+1Q`62K;AzDU2C885#^LgRU}6Ks4L$0`^5*;t zTN*rE_WU0ufALh$G`_TwGG#-*UgN`?z`y=5w6N^yUnU!`(cByL_T`tQ-ubZHl(P2P zw)#cVDz3PPtBzN7PubH0d0cIF3EKvZ=I48SQMn^=^@XDgDqETLPVy7$VnSW8{e7)! zlRb&;*4&9~@O?tl&F-Mc19irpsdn}s$6EF(x@&|U4-KC5SMp=WL!*x zzN@ZUB{#y2t48Um;LA6!)^1UD87JI4H@xL8|M{1=c?Z9$RHvlQ>K}to;Om>uEB+z} zzEvCBXYZRQuZ3ru`^@V59(l&xkFVaN`RfOK9W<+-=rz*((X4*@(Pz!WX7#K2L&4c~ z-y@mu1$)EsaM{yk4{ul&D0{JN$k%JbB-Qdg`;9kU-Z7uu`W#*gzoM+c$>+{O>+sA^VX_`5C?}NrIImz&Qy_v2YOvk<+HS6{t+v&BPeSh+t{+?dhIk?F4 z+ijY=Ysi~Hr_S^D(sDojOt0=5@>a!D=jgRvLza2Y$Zz0hXwkQimU*w7l-~xvr|jvz z&-44w^!A>9ft!`XE+Xdmjs_UO0&-nSm(KToHqUD zYH%)ZAB}}={7!MJcgO)_zVU9_Q=(3N^T>OZLTWwplsWmMpbCN9=grEWb$seVi-Bg% zEzO4AdU&k4U~8MccN+IJZ+%(sNh7VPnecV`$Q!+0G(Y?%r@!Zc=H}<$bQ^lTPA7BA zuDU(+=2_;VU8%X=#=XpS-=$V9sr{_^i<};v-$dgl+0_5A2;V8NXxuY_aXCx1NlS$3Q07(9LRt6 zr>wDM!w>Wv;Q76rnRDRbw$~~THrM{pe#rG2&CDx@Ql4~0Mw;IpN_pmH?dshQx4UkPem7Jc}U34ggF&Eg|GJI^=jE9jPRF$Wqh+r7HNG$Q z7-QZz-7x=Z%L4P=)5-1cG<&S9&gs-nWxnd>^3&N*|I#?$Ja+cM;bnmY^U-s)s$5Tb zmcJjko-)QfbFNm4t6iQmW6ssCb0clE8HexC(#@}>A$q;cA{=i^WZN9152xRHGjU)z5iWb^|D46tHs@kOfpYhjO$(+Q`bCjvB}t9 zqx|Lv7u)5WiyLUZaPhIB$3>#q^|$n4C%O(dyIyM6{7S8SbHJsXj%RB0G7B%4uk%ON zBj)FqGu!2H>!*&8+=t4wZ3`Z z+UI0Qaig*Ux4f5Xy;EeKxK*j@$rc05 zsU@X>E7_gQ-6aWG2kK^+7fZ6AI~Ui|EdDd-`tJ>%Fwd8|TU>4&Y3?a4-{f?Mhxt3> zbcZhHN2TST*gm|kd9^gQ-=6FovqapjdS<{Fvp~CZ{nPAG=02@K@=p!=nwQGeXu7XO zue-OZv}}DMGS@s(v)qGk7vv*KaYW+ik2#%Z0P`TdZQj_|-}>I)-~5r5n>T)X6!;X= zcLJCDjs(vQEU}UPb>rMu&zXhve%-UX8$uiFvt~7(RNb^e_{&C4j?}R4^Kn^~Pkqy9 zf#_^L{q=XPurkEFE}3}_mcfL+7ES(nv(#6~0{#NR60 zEBlq+qK)q@jQj33?Gb&8-P-O2G=&cDx)Sv3e(dx-y6fE|#s8v>B4N*`hrM?RCLUPq zKK3*HlQtjNTw&XnbX>$9npo?NE%bqiI{DM}&n8OX)Gge3J|fzj`}+2Vr8GmtUYNSE z_62Mtt^IAu@#E#_EfIQs!LGC0VX|dDM?*Ec(5vRp#S_e5vuU;Y*w@eLm>H&;Z|@v= z!#9%BCA&QVShaoKoW5*~zh)0wc=yhGqk?MXi2>%p_q$yj`Zb+0=d5|`YRd>(XD(d# zVrfJx%oopZc*tEljs98Ial@dy+ zidzR&HR!V0x%ixIMfj1Hc(Cg-s;=v{LI?)z$ck$@UsXb|p zIseP&E=IPYz2@3&{jOy+py_vKeKp}s-EpF_x#jB@F9dyoF0o}tp1XW0fIZ&~E3MTI z3UhZhzTGkbz{Z^e{&GjtHuIyM&z($cOY6!y{_6$zwYxC>(6^7>_0^=K=GJeA-^8!m zN#GWMB6G`kdAAcYXob1qyJ45H{CmUPuxI$O#D^L9e)v%U6U{I7Cj9)w&=c41RshiW@St5$IkeOK=*Z9`&04~T!;d|5v{fR#Z0{KJ1FxM@L|@8ToJ!)ww;Gv?xeZ}Ogo!txi#pS$3v*=6M~ z^*yco(cA|v7hEoPgK2dAvOU+uzk;0R&+nIhn=5%`L7cu1EljvOB z8+k-K>j%-TZ2YbvU+Pt8x>^oViGQ#dtGz@~xyQbXyEHPfQN`;Q%gs-n@H#N{2t6 zqJ1K_?3pP+hd!crM6`KpYK58+bXEv+(e$wW5wu3sx%<@&Pp|&8U$irSpBZxHJQa%; z=7+ER6%j!{iaKR&=SP0|4K{c(%xC6@y!kt{R5oY77F4MmeS?|n%LTV?+{6p2Un&cE zz1s2Zu%)#*_>GITGw>4il(PD71b=-@G#8c3w-)O&s?$>R;KfVD?FO`x{$v`aKK|M}L>mFr<+{W~-E?OS!b(N}b_?8&zStBNJ`)Y~;zenAsygW3JP z>v260FMl#Gtg0Sfo3@FH=B4*Nzx)ZPz4_DoSIx6@g3g*L@89{d61K!+&6)52_K8U! z(7Cd<{h35N zQ0^D&{=8O7uOeVXtiM$iVN)1p&Vbw-buYeV=|~meP4x_1MO<`y$|tZ_IZ;yAzQ}pVDIU z#m{~_or`kkne9K@oK+rMvOCQIo3*N0xJj_NY{KTs+sqwF57#K4v9u(<2Row zt&G=^AGo`G%az8xX_*K$muxv*D~8?^k!H6oM|+HhpSPD~Y;|9_Dxua}y}w*hkWWEv zwub(EN#?cLT1i1!TdSP=jow7d%-DLV79Re`4eT>p{|XACHSo}ct%oB!i3HK#+_&}n zRo7@L?JVn7?Ds_i`q6y7_-d1mfPOCPRQzXoH=wI!y^5RT2=%Kp*St_%@<(f_@0H@> z=sNJ)WwW&S<_}kd5MgHT;{6Aj)4S-W|M+Tm!*u!_;d1gv#3ORv#y=D&8H!-H8zMH*J=zb%^zzMo9<+gmjU z;5N%1v&XlmcBjy0I&K#1K7YId4z8awcYb%dY7Lr9E6urkZk11`H|d||^*y(a$MS?~ zzP0E3m^hSM-dw(CZ)AOp!RO6kd%nEB7v-)pw|;;1_fXm?nwABBfBRqSFoUl&zuaHu z?oUfZ%-wYdmOa!5`VN*Q94I+k3h1tc_MsOqGS~cQddES_JLbM4x1-YOB}^Dgk9e*m zq8`7Og&)8C?FxA9eY3)eePO-mBlN4qCy#yiCoQ8>WkJ83{R$JFaGA%hejHj6)^ERi zvE;qx1862qxmy(adf0G8A&x^lty^Ik*M4ZVmGsJ6qi-~&x6I45;G17>$IzQ*D9yiK z>4QN^f`c0eHf!N?Q%op(bkcii3y7gdCcU3MpWYW4WiJ-bzr9Clx5}_WAuk?YzI%t( zz4gqke9SyG>C>+sIgFb?(iXPF4w)|V2Y6xi*I#cAzuOmM^vL0a)bGruSl`q?z3fsp*3z_Dtky&7w64Ap;tdI8$#cURP!Hcca5^)B7lci z3oq1tplqzj6yMxky}$O;WzW(tV)5N&v5{KY3-qCQ-F(HJehlERVxT!9`nwHfFQWTC zWlo6u{v`atcCiO7uk-cx$9OpX5t=*el224Yhx(>$d{Ouw@ZIBNpRnha(5Ge9X~smO z0T!ncj>QVo!_N7cQ0Ug z9XX935aw(8d%kj`Bv083xRE%DQv~fRyH<9mtOVTni^iGhQRwKnt#s0S znA(?}qvZFoGygpAFyS6&p?h-hlrTL=uQ0iyFoY3egaj3O-0ni0mz`(?d0hYXUn_J^ z^0@im_i3o^n{F&Oz7H{s-;6Jf3&z`q7Ch5eWbF4%_02H08XqCeF)kS|8{hff_r2_| z<PqcZzAANj1P>}#+$}Y|3G7| zKiVJSTkH=QC)`tvgYGFFH(T%Vc<{Wg$7LK0b%hj$Y3`}z1t?mW<|@=Dq9(7nUkQH2 zcug;KPb@bP*sSstJR^8^@EqT#zUlY={VwBs)WQ1K4EY}tB*8fadhfh!s{KH=#1DF4(#RvX?Z@Rb8PAL82{Rtjj6B1;+ z3yZ$`FX;k2b$@yrTHo=lfYqM+lGo7u75u*7nTFd}yyhu%Y5un8i8K5W!DLMKhx%6eTgg7R z%0JBb4cgv@t(vdM_qObD{{*%Ly>26{%JDZve`{%+gCBB?#r{6%Lm9>xL=K9ksO!Q|$>JwvAg^9**{&-`R z@gA&24+);>A0FcOH}p*@KhgLcR;|NWSmo~wF3sQHAM20xO)(burb-*xs_%`L%THvh ze5<_^LtOsHee->V#w25Vs4%8tB)nl9_igg`Fun?%<|BV2{0I4a`n|?{l>QdR!bN{y z__2y_vF}yiKm7IlF(Kp+3-KD)e6x%qjGz_1O~w(lju-vF?b{eq-nRl80>1ZrOZ-E* z9qh#Ifyn^>Mg_x%|6rqBaAEL7e+&0C_e;WEp|Db6@Z8|(!IOh01y6O)Ha_!c9^K#A zBSJObTK^ybfMB}=#J0!&S zxxdiwsX(Dq{N4N${mp!neDC->`CIzaLwv>tf093yQ|NTRVaziM{b{~=Qg)@WIiwus z5|_W6zoIcKXrk{e<3nS%?=%0?{-;7GhfebMhxgGzr>~gj8#@V^4ihl@4mTx|1;T9gxmeUBpFFKnjnV0>+~K4XcL3y z$#`VPu&>ZdE4yE_dY``y{i_O5O z{taXOI|FyI4BSol&wqb;E8p+7DH6x{LzJ0|*-JO(Vq|}XG0B+x51wT#1NUdX*WJ^N z>BeWqH^wR7dfyu3W8a6y*T#=V`QVrFdBzAeb{GeI9~gW6gWNA0zZ*Xr+l)iTN&iFs zCw&`?!~OyO!ASDow}$`!O@kxvA0%a2(vdUDvm7LTWR1QJtjqSq{~zD>h`;~a_|+d} ztT$dUZn?=gYy8Xj#W;FD-G+Ui`15=-jh~D^j2p(~kWi1;xPlpe-+%qLCGP(gx_h4b zpXrwWMo=Z(q~)0CnP~9lB;N<-O*`w!zIf8c4j4TMcl&7U6N5(MOFTKc-w>P$woU`Z z%hNG=)E9Tr$6;v<2C#(VL;^32`QriVS!ltUh`_US46_e0%tO%7I;upl6Rh23u9q8yJcx%tgm71`VO|D^&M4c={F9Ey3U7_&$_+=t$UpJu^~5;`CEp3w@Ga9Tg?AbuKU5mA*D zL{*#M7(DpG&*30@XQFD;h$3+hI~sVc-FOTy4ZqXB5)W4v;^C(z)gCe(2jcD6b&*!%?P*bXN7@ji61>st zFy6fd-T7DWjw{d}9!m5`E>T~2sb4Zt|DAAoIie>bhz4~fda@nS;7Fv6L{Gtnryw`v z4AIkliH1%m8c{$rs+4F9${M$U=s6G31e8BFIsgQjsj%YgSI0O1;#bDd-Jkgv? zqE};yUi*URAJDUC9MR(8L`yP=-Yg_ruxIsgqBX@xD06KN z(K_URGMH%NCZbL8NGNmbNTM%OiN1!fzu8IjuLz_yNF_wyp}ajEiS~lF54IdIh<-rb z4#EFND&krO^*Rcj$0re;SWooRc%oC#c@{o8-<#;-aH7kw_p(WJ1@IO4;%Xie%DILz ze@ES}gYWu&qCZf_KcM3V>Um=U(M=E17$oqNpsbQw$PAlo41BaCEh5pj91_ZF3tzPx zNg}%<(i9TyVMlw^vHf)tIfIc-k?4TBc7Xkz!bx<7-JRj9F7Qj2#U#2yuIn@;=;=0^ zM4m<>ANf6@A3+5qN%XIVG>gPzgftxK9EkyW zNbu9+X-Mlx41}KsE+FxQ9|`3>af`&Dk(gQXNjx==#1ND_WDL@I5>NL++C^e$IuiUe zECvZa9*(+=yhLJDf24yXM&}@XLE@QYq}3$GL?JC8F&2DdVf)w{B*qOQ@$7yQ6UO86 zejtgdLy^vqn1*tv?I7_I%6JL(O|MI0#(EMjry^}4@d|Vm!S>l#NX#8a;?+D7uVs>0 zfU+0vCGmP6Bz!M|o<*l{G-xo=H4=+a&ObFI{zm?ic1XKPEbWT4fyA;%q$wm;G(lQK z;%y@FPBs$i`K}8Iyek_a;rl&&uR28Hec18-3KDBj#}C6ueAJ7?df2@lGM~UVpDZS^ zp$bwFiBAor351`|A@K#;s<6YE|U0m7m4rA;RsW2r0paQK>ol?5M%Tt7_W57g-o`0z$55^T8{kFzb7cSzhRhXkAMoFNT!qoyq)&D9a<3)0+;kZzFX!Oc`7326ZmPNxPV`TCPq z?jUKQ_+2o>0u8Z1tJH_I$}b=RuY&W*Ro3DdRu!ZPNYEdiOIBBQ4!eTC2mPwMH44;LqGeS{vwWv!ArA6eQTt7W%W}k>-)szAtGxICt9tx;pM8 zt@A3pV@Mp*V$z<5U!I2kq432})CuEA8wP(5gRR4l zk~ZQJX(RiPhVi65gL;kGP1;zLHx6Yyi?W_;g0zXW!i%I$L|rCLA#E~josx>QjXJ4Wx?fvL+Ct_-JCgK zTXog7>nf{=4ba_HY^W$m4InLqkU)A*W->FGKIeSDGq8VW_kF+jy{_+@=em4J{}%v` ze#`w|;rvcQ*I{0DppiP@|b&G5{<97h$d-&3Xm%ySj!jEpHK~ZICeS8vu=j=~x87oI7#P zow(<&IKUGCe6Ra10C3lXx%Si&rnegK9bx)_m%d$u=}!T?Oqc-`0N)+N@q?JV6~|jK zS3Az>+(8&OA&due_2HiUB4Glz;P=B`BrKCnSVcQwH5P)nFJVn<2pjn+VPoDPY~1^V zP3R_U^3#M(Lkc6kfv_X`37b<0c#E)kB4Njv0Qh_?0Xz&CB<#4`09OcGfYO)(qz(#a z0DdIw_!7Ww!WLBl@P0AgFUI>Nc)w&9VM|j0uMxJ)0Cp9r~yq+5Yc#fc92!MIcvk`Xw z9e`$(T(1J0CG5g^fL{o^s0@I6UX1U8r`RP?fENh6R0Tlq$5JO@m)!%vJZ`uJ030u0 z1~^676~NPq?+Cjxm$0hg!1*@eI(OmNyK(({Rs!(ZmRW%P zguQnT;3#45$9>-q+}w}3{BbW~AKFCNM}fn~F|WrzChQZq*C+7VpT+<_C2S3@SF?+- zd?sN9oOfFZVV}bHpT+r~e}S+sRuJ~(Zo%_Th2D?wSC=wLeM#JPYs<_Tzg2?S%aV zIQirhVL!!nKmCTVpN#{2N7&tIfENKS!tS{ZP)pdog#aA;MK<6$fSs`az-RwxAnZRE z5O&`tz!k!Njk$bxA7OvM`C;?0KjOPTO(ELqOR1i+VsZQViGcFdvsNy7Hv*go8c6`$Fb5!U`A zVOU$TpB9(({N0hlW^&` z0qO~tF$?e`;YJh!-X|P>8G_4vfpA$-fNuzwy%JDMxSUA<%rh6)&&8Za<^pi;JRFy| z0f1xit4iFc2La~^myh%1zX%v4+~|3LPYE~n9>5{OjcXuWK^XvZg6+f=Z6aK;i*Ti{ z5U#w4aFc+CDZ2?*ag=bCnA@~F2seE{;b!1oXY3=~Oq^>La4 zo^T6sUm-Y7xJ8)jqL%?UH-1T+Ta0rp!FQHC3Fsx<(glROVJ9~FxD%Mt+Qb#DUU?#n0K{rLVL zG2e$f3HK=G^*C@*(SD~|gs@b$_#!o4~N0DQa#+`W$ZyrBTRPq;TD0NVh~ zgnMTa;dZD1n9mN(;qSQD_ZI<<=I%Z~Rg2>5Yq-iVu=W{%# zS;~Hs+I!`DDtk zuFoMmY(D0CU&H}}!QOTCmtTIl+GRJ8(>&GI#%r(s`t7&h{(9A;R4P4!`KI%y*Im6z z$BkaNaN+1U`YIXCQwtaJ+MKD27A=~Z6M?8*git}ArS^PWLH?pYaKM{1^??T-n4080 zK#FLop1No~Hr7fDihe9CKs9{h6z>EYpFNvM&rsRuSA!>}0> zhD|-NsRuUoVc67%VN?C{Igk47&(5@v5BNVb>(|g?B}$uKrOS(P;@9~@EQn8TmdHqU_lLgSe_@+)3&A}!KE3N3_q;U4PkiZLT)D&a-f)!q);ub@Z| z|7Q}KYc=Lt9X8h)VRPMxxx!B-Gs5P&G;FS^_Aak?XfQRStHm74F#1@IGe)*F#U>5( zh+o%&!Y> zJXbq3)PA75yW#Ybn@$~^dqY9N9gW{slXRZ_boug&7kLVxym)c>@=rf4DBvl8qM!gD zefp^|Q*=ps@k8-LDNZVqrb*d~?eG8d4Ts}}3h9qjUEO@?9%-I5QMyU=iVfm%u~&Rf zd`@~?N|uz;Z8a6*V?3K=Fqlj{;$^(jWHK0%lH%ie3ZRIO$45y?LV8DkV`F!3OS8xC z7z_mL13sUv-|25{Xz6Ka@V7U*NCS^lq)f&#C?yH$KUSgODFDb0AF-^EzI^VcO$%o) zT#+1;n5I^zTzO>V_<1QQRm*3UKTts|)PuKHqGsbSZ1%bbr-1ZcfTX0hBh|l`CFvR~JtK6kT2T$mb@|Ff@O|^NQ&GSMo|xhQ54U4 zIF3^Uc!kM8(=^BN@pW}aemPQq>Qr6biDRcuojO)mSJ$S~>D*0qyvo&Z=+L3&AQAZ* z)5VJy&%OTEjvWa}aj_{GnIlH<=@}!kGghp*X+>vyYjb1m$+P6`H@;~f)+J}xuUfUR zAdcz3BJkYcU_(Q%$SXSQE?v6R;pXFw#<+r+$wrmY=+TZIJvz^5G&X$j!3STq7%)Q z?Af#Dh?w8oYpPzodi9J*qUCFf&Yrv6_UM+oZu|7pf1Vs<<5DwdIwLj0^vnw{zPMmc z<(MSZ`BP;5nlXy*U-$03>E&1UoEtQiFBK}KtGY_a!!AFC(gC3~Gjr0|qN1_6nVIDi$BrF4 zDmyc?v~*OeF}Jv+v~<~w%*@P;($dm}8#ZiMJr4&P{BE}!`);lR_I*C*P;Ym4zsb|* za3g-^6GfNX?p87yz18j#5#9?Bw?|}+(Ghy9-k_#~!+pI%$)ZJfO{=IV!B#cZvzOzs zbkU;9%263v<4OuEE2ou>8Z|1jva)j7%{SkC!))wrGkF{yr8B^9+xVJs#t3tSUfFL? zNzYAJv%XQCa)(A?3{(bIJD%P+q? z(a9cw+}!BU+csj(6%y5{B_$=9 zY8x1@Ups2{?AfEV-M{|&Yu6)>Bqq*4(d#GVr_k6#US=P~qC7YQwSQldv!U@Nd4>DK zf&~li1+w12r6odHj1-Z`u3hKEktxqf@WT&R2EGx5Se9j24uvKh{y+Wn_hjZ{k3BY%9C%uw z_B>T3-7XJKpTSybqBBC=|uE%L8lP(pEhLUwjGRHNB!PEAzX z?RHgS!OWR6i>lP|OUufpPoF-atQ71pp)4yRA|ktN;cd6wwv?>IReU%dVJ%vt5n{z^ zwYrJYD8!1QM-~R6LiCG9BPR~qY_@<%8HI%WiIXNxnvkECnwpw9CJ7c_VtysaX~wPU zoC+dDF53X1zG2z)S$Nz~g*jC%g}eW(JgECZtjN>D@+FlPty*m$1F-aL#Hf}p=?Gm? ziAyV$TCpEu%p(%zbxrsLc<@hQJh&^22N7o@a^Eu?ee!Rs`rR-dteNb#4Gs>ro>8dd z6D~Dey!=B9ELbJXTKqGmj7*G-ii$F;IqSK@hYxq*M+L_-eNc^^P6c#U3~AwcJ+08P z3hvPHOD!!O1AROlV^&zSqTee@qNFjXRSX}KogS-jH6A^B^wMBqVZ1Up*xZaJutH&q zE=FF8*$d7e+5g?5#Z$+YzSq)e*X5aPZEbBAe%SNT{tFi_bW#2hH$M2_gEvobe)LyU z*}Qr4#^^htTe?U-Z-i71`mAjotJW@>IB{NlP(O@$^@xtd_{w>_io(47hEbSFR2QUf5Mj7u;TjvU?2u z9TT^2|JQG}^o4m$!~X5U3Td2V7MsOG@{l5>a`6%IX0cdI6{Ey4;u7($pc~I06JHb$ zN}NoT=1hxkPI~y!EPC|6sOeqhfK=;%a{E_R-W!1^jb32N>}^UJ{uIMSwo99 zYfs;>%)eGqt%jr1;~P+DBGkf^mZrM1XU{hDU%Ytw#Hllvn_A9aywct?=;-bmA;*Q-cOk2FMQWkruN^R$AJ zESdcSn&k8-lVpeJlIVn_)M!Qn@fUP*oJ4cEx_AZa<*v&RHDri7OokZ3WQZCvL=73D z4wE73Fd4$hz9c!yKgG#@Bw5El74jZwmmSl46>rO4Be{wvoWzJkfhV%J2;uP*Cwq!; z6ARj zsff=Tzm|1E-1vVK@1=@%liJ)tOZ)mBFlI7>Xwmyq5CV99~d0@i~1w6%1~R@Ob>LKEE4U zG~o014f{OgBCl1&CdZo1k#TBTW8`Vt9}pq}0j)78dO#(^5((k~f(4!`;@@#GGX&{(U zQ$9bh2>K+2M$PavXD|wpt5)4~(<&+8^>{qqfF!>Fj($oYrlv+r;%dv4-sUT%a12&YcDi4 zHP!!i^2B!sP6OwRzpa-BRWSWNCGBuJedefZQJM_kd_)+|v%_$XED%8k{y$<~MPWEM zH1_s)UTV&uE~Vzgn4&WUgJ_kiVTZOIA@ZWo76h%QM>o@fQws4qduPobZ#9 zBYr(^`|ZQCw)00KlDC=0kJrVnDE!Tp{_U&hJNEAvkY`_jqh_nv4Ptfd9&&b8IB%8!wCXlMJIYIS<#Enf55#o)VR zh+FJwuH9RWjV2aI=%$ta#O^)bwuiljYZGuCvyOwQgJbb9h2c6DxHbXTCi#==@kP_` zxK=7C*r<3Y{9W;i_%2b=9j}k?b`ZIJLVj@Oy!xT~JZ@xNux=!$$Xk4B_|)QLMb(eN zAFGsP2FQAobgxtg*d$(5h>VdD@#QYN)oZo4AOPqNz0l9i&Z<*JT?Z|Kv3uuXPA&UkbQAf=+KR8`WwKKR&>bOkU#{5*4_7 z(BpClI+kJ}=wJpaIn)ws^73L3EOHHLa`Oar&>I9x8dWUKBSocADSHP{GH(wURM+K| z5}440t*3t7@9|bl`-O`ajvP61?&8IE^4Widrd1vfMS@T_(0{0`_^*((-e^?o%&_&%I-QZk{%0&& zpOFz8pAJJQJw85z6#egF(En{WM22Amd2?a_MhsyXF@#}+J9?Ob#)cKJd6U;m*2;Fn zZt@u-+~D4~cqY2PKU(0tbfivR7|!qK1dh`)L89WBAm~frY?p_WWRPbxZns9@+JElR zk}HtJ9Ou6#4`yJ!s>0T5W7zDFwI?$%yP09Ln;$m246Ahj%0-I^t3kt3ilFu6$tEW; zWfc?@j7gySE}TR>kfDSApoR6gX_wn#h6W#~gWG!1N-NWfi;I&OAuTyMDOO7yop5Nn z97GeFyk*Ps5v1|cmtK15lLnHtVvE3t2)|koa}_CSn^7FGZ1d*L%SMQedtQC@)jf@Z zY4YTWMH!|*7o7DjzbT`5a+Mr8Aa5~qOm*95IH1F7dtSVh|bNFHY?t%heO!-!8B>JG)1Dt z4yL>Nw>M|u)nrK_4$4Df5uo18ynUuS6qrkcW(S*5^`}IG7FSbgMOf<$qhQ5=A8v3^ z5;D5F2Apn3XCF)ght1y8(G?61+nkOb+*C`K-4hHV-lml_Mh!w2x%qyN-(vQ-qzDsE zV>BV;hSS3;%a}1^W_5XfW&&t3F(ba$P2{74`$Cgf6vc99k6<@miu`0L;7|O?2md3j} z$bEbo9TBC$xstPJ7!Y_+w7n0ZfF2vIjl{$JZ%LI3O3MkOv@v0nmIX>n1*N5iQCeyk zr5P_LBqYSg#U`evSq-MkAS+&7T|H~ov{~~P7O1xC{{%BPjD+;*c0!OhX5@?-O|^HSnWKs~R{ts2Mqy1Y(X*LI@<3S{!c3B|=@#uXGRfK6V# z@R5zFYEDT!XSQF{brt``p$o(Cb~ErM@A6O)hPSCBf)FN=r*Kco~-`J}E)# zwYI`4>va0}?{AUuXgDGI1B^Ba%vfG-GOI0WiQ*{EU^;mCu#hl%VBo^VW8Zx9O|LmC zC#&xA)nLxJi4_$UlSakMy!191E%1hUg(V|=SH6Az`RAYF>zjrwYS)m*VIS(c|E{}) zgsJuQ`@VVCVzK;8GRup<`r+vC=!r|#u3fuk&X`J&EJaV1mq78z4L4169eJ)A=^lAZ zk_zabj&)lUE~~Srr{jDT{J_0ruTUYjQ7tXA;EivT3M4~lOpumHkFj5#Z8-bcZ0Qkc zEkfgo*Td$y2$DZe9X*P#U0XXvuQDbrDNbo&6LPXfm@RME^D!k~+^&N5m zoD6$|p8k#j58m?o`x+Y5YM;Ee3RTm&#=#+cJ)qL~Jr*@bIUOx$>(DkTq-Lp9afz7- zB*&`!0hcj4JDp<<@$vCl#S^-_v*fimD1u%;5jm5|q;hq^WmhwzRh5#F4ek?Ct7BtF z7gjG_x^&t|GjV6+RZfVDNka^2;=<*pPF2gqVNlrn?2@EUPfw5ZT=pmg)o`nROvz+O zqifQ9188Mk7>_*`Mk~*PR@Q@7P%ugUZQb1-Ml0jGyW3mZ+FH81yZhVi?PQz*CH;6~Wa+EBZkx~#XNlNDUsoL7wb|)8`l9B=ws@J0# zQH00Xk%$ozoiHXZFC#G}B@KRiMkGg^cKh%^>w&-i^{?O5pK&_RwjTTN!w)ZY+k)oo zz9Bm*PX&!Zt7IWLH99S4Nus4qx8Hf^os$#2a^M?5iFn6_FY)acU;j{r-2-EUsOsv{ z{DOkQs;a8;H0{t}Z|`8sZ*Npd3+17#`RBgD!LPq~z6$myhW^v5eQxvkwn0Z~dNoK; z6BnUHIU}uSwJM9en*rio9|17*YvTKV*u8r<;&3CazrHyA+6kq(hzQ+-G@ymV33KI8 z9wJZUpb(}=CgdbBpaf<7t@*7g=#r756rx#;!W5xGNOj2O@L7`FeFIJ?5NX&h2aNFyE~9LxX`*5ylPp9p zjB`3|cE2CUwYyzCZU!voci15xyZc?pl=z1c*B-F-TYa>@tGUhP1X*h+w<{>CK^Vdo zy+7#3l2UGe==2t?Ld8HyO0X$Z9t-gZ!yk4V&Y}6;Cgc9osgmU*uWrn(Gf(G?JD@#LDMzE0h)kt{R~AMwnMd zt?2SvNUspJaN&(>SFE^o)v8s~M`sphvaE4b>B=goXNl>$CmX5GtfVC4DR2grk-^g$ z8J)Zyd@#9sdgav0%JRyB9wCMsH*V)nxBI}jaooPWm zPs3RJm?U#Y$N-1HTfN@)&dxeyB3j$q+dKL@Z6c_P zayt14rxOVQL~1I^vSZaOtMMp;Lfp!tq6G^yn#n~)D-p7uGiTPUnR8~%9Rk5nS}i;> zZ6c4-5WO35PA`STdz4;?+dO&l-FK^0YbH;fGzjkv8e&ePnpepgxRbO1Q34t z@wYxEF*mm`yTp7=GS0?2&kS4VHDQubuCADabq=qtSP&)|M@XUNFSdW zkKkpjYRJ~p+}zgPe&*xno_p@|%gtVFvyqT+bfYMaiLn_N>}rD)1dc4#;WSMa}BKS^r`alD(w36 z0r?w!2V@&pQBj%|s}Yd%nNB{0BK;&Zo>R?FY<%aPciwvQQ@&CbYV^$M6~ZhK&k`w0 zw8}$@KoH?x?k}gCn@?M2!k$_nB_XecA&r(EVui21JoZB+>MoS*zrOqN?U1djK-A68 zX_OX|dtkr`#*0cb8DUha6*`_(sg!D37}44*+f9SkZoAFl7;xGKWYgW=+}8~0gv5ul zy90!iAWJs}xoV0+^cuN+M)C(ekQ^SrhiCnMDJTjfa>h-9xSvoke)Nd6wCwQ{N@pUM zIBV3n5$U5wO`E3IM~;ydFN>lJtIJ|y)uI=^^+3Nzg2XXsRWg-{+s*k?mLa{rXj0jP zQ6QS>i~a!su z+FdT#CSC~)g&zt_Ei5cd;v9|0A)LO@3;IhEQwl~#Lp(@gK>@UGsrkZ%OTF+WTrOk* zEoM_nOl|Fe--xtYqCsa2w$=&-=g*(7?_?6p%AJoav#P7cQKIyn9iSmh@dd z%YI)a-6jwEYpSRk(UyOP#yiX(#)6Dlufyi_TVSGB!=qaP>4>3!&oFc5^vWqyrj(9M zF|!uhH#}S^yK$PeF_&I^@x?ED+0+{=5t-g2uw7jp=XcKr6=zGCl3G$=Xr**1S9(Hm zxc*XI?cSQ%(rSoZwb&{T&~*jO$@}TQpXi#2C)g@X9{9$M(&OBB&CSgxKdF!&4Qc6u zVCwk1C|OSi;L`d1@gw2;7(f`Vem9Gdt`rj2ekYBmYLmvGQ&Pfsk7uy0seP!UzoVn8 z)7H=-F^p*I?(2f|Y;S2F@Y9l~uMM1G?RQ`uJwC4kY*C=_^ba^d89skdzEW!o144uW zE75*g^ZR?6y8ZrP;)1xPTrDl#4!Ssw=f$AR!;mxzY*WBE`fLalaIj+mQ>DOv10M;HRIL(fS-vQH*w-3q;{82pHh;W6g?H2<31w~ z?Jd&^H84klvE#v71x(k)D>j^#Wn&XyH#7Le<;9JuBGi;@lBiAk{{Dc$0L*HFzMhu0 z{%gDz30^aY@mgXSuO&i<%X@F5J(B#}>WvBGHB~{0(P+2J3{*o+n81^gZHk{?XlTgH zTqx8~ue`#OAGeXuE2R0%&`@P%1$kNa7;7qJY0Hz>v8N2u>QKn!-D)_G9dP_#5YN}p zN}}Oa4QC|j;>8v$S&dxiNSxbL1nOZ@fL0Q`3#pysnja;8c zT-&bMCXeI39uK>(9bxzNF=U9GwfvC;l4~)N_0hjD`n4)va z$0XsuhB|xJ?oq&`ADI!Sqr1*Z{m2(L3V-{;?-LgKlTV5c*(lU}1cT_rss5BAl|X(Lz4B4Q^Mbz>E*ehl{UB4s`7 zaJe*VD}5Y`&g18@-QYr`S5;cG)?!qf4Ms&ko|H$TN$Qd+WMnYZbIrr2_q_4;r>BCI zFyl9CK4?@;SaHh@C8Yj({?lr%97-;(G z-M8QU?%cU^Uv96j|9F;kmo!m!GT>%pN$W80N9mXL*H=h)voE7+;3L_;*a&$z7WF6c zn03wH)deJ#Q5$p(bPc#A24y)xXIGn5)F#Go*bU6-wZw{^j?1lmK8JNEWI9J_;7S-# zwJJ;*>gxjscJ&1ZyFp1#&(MGsPKD2Lr5p8Or~-4jY)%)v#rB2^-Gfe-eF(_$x@}jQ z@LsoU_(>8%0WNT^6!1~FxFk{v6$??wp?*@X65`ZuH%tZI7z|>`kwy?jx77)+Mwl{k z;#AmJCF94>o{N%^iG?|739y`!N91OuCM6|B$7?jvqskBrUNSW;BUY!$Pk}y<$|;;W z5ARI?f1zj**>8zfpa_N0QUObz#F;c4M-y3dfv5tqAwg({RmjId#xaoG1muoN4Pi>* z1etcKtEz9i4V6u$+2cw^Ap(^#x-dTzsxdR)?>Cgpg$uG}esXRk@fXKK?i$BVU3w?p zn-50jb&}r`U^JTGkXP-rTeNO3c94P8gz*AZO?zYvqQ*xVtzaZcr_(C^F24v9N2S+Y z_e^99;*K!xw}f&33*i1c{>y@RIE?$p_w_ZMJ=>=tK9|c)>jI`RW5yRFF2MjF3d!T< zI8UFu9`!0$T^vk}oROJE*@9r(f4eA`kP%AGWY*R?#*7&m1Jg~bQ!|pqJk&8zR1~d} z%h0-p-3~6bNGO2f&xrE2wl-e6)Ohx{+8@67;){PAJa^{YMI;GZh62QpltqtTw{Be# z+x8_)&5wTS6bj@-D1y0E(6`}MIP{Z-PoF-G!2HF=j((>PmIb9?UwY}_U^MK4e66qV z$gY=!%<0p|#|OLHTQ8kEcj?6WAOH5uGtWG~^T#76&Y`re)o+Z>EuS6_-u;I>n9a#; zFHO5cP6&OY(k(K36sN`}^>^XMcz9yYIgJ0V#*$mpbhM3(YD5A=$3^ zdw0&3EnDWr23mGiB7C?Q5#TErS0Uk}rS;19KK$m#AHV(kd$YjGI?;xZuR{zV>@-)} zqIl}Z&d$!Co}P{1ObaBV*c}=YgusdrnokVpgo=KJ>W>~Kv1JYNhlPS2v47*T`mUR7#na0HELLh37}Eh z2M(270aIMG7ADHvxpQV#Pnj@wG<@5#veFqVRxVpSrLeRp2V9svc3gS&?75>6_);Z| znX(in^vZcM^VN*gMH*2v4NmvEVY6DjMx$IksuaCQyWtTW_81IIP!4^wDk(se27$io zuE#5p>V96cWmb7{R#xt`2{Z4k!d7-*hqy;J%$r^z*L{pEE1ACXw!6k>f_;pIOSVo! z@qs+HGn;3D?UM9WtLJ3k!nD%b3lF2dD>70K>qPCd4MY5yy^cU^EIW*H538u~dWbIe zngvk;UMmUXwURJiLl0&s3Q!WJX-mR*Ej~PJ75*FflL!M!Z2IoK_ul(Xh=)^t=_0hm zg-dYLB!&Ch(#r z367M|y%rsa~Ud~6`p)DfUydx|x8+3Y;$=Tb28upf6rwI#pJu8fI=^*)!b&Fdk zSH;{c2K`=dTbm+f9OAX(QWR}iHVc>sl|~Fj{$tIiqqIsMugY7kMtI!A_Mzj)soWV) zJn_VgT{*Q%=vkne=XiBYv{oB`f`AQ?o?k`?x?8Canc)Wvh zdYL6I&#=5~z1Np5j>Wb`D8ZKX8`^DX+0jM7$VUQv%=NUhTCzLn-#=Gvum` z>iqd>5`%GCVjy`h@`_ZG{?I{XnxH}hO;?voF1b?pyhtBVenBTqACb-!0u=)&&HjQheK4@4JsU%KD#i(};w zF3lqQgrD^7OX`dzEPm=1wbC6)9Z5{;$>J8ar?jUunO${Z^oN8TpN0aI<4`;oS-pAC zNots8(%e$R_z_}dGb%DF*0K=>#{gl|R;8_agmqXWbk{tJ|6jOQmdeOi%D8XQrS*uZ zv4Udg1sVB6f})77&5dfW7szmhv{WJEe^|!-Qg(Och`OHyQdc2q(7RKK`b&e}0sVdp%1SjZ%mAHbq6t z>orl=alab4UmZqMd>HQk2;8p*?pKB3e)aFTC!-;QP?y2zp*qpY zUJLJig^J04V4vl0$XD`!J6CyYH7YDag}LNu=GICTst8`=$vr5=RXwrg)>YNH)aAcb zBhn#{o21#)xgJ!DdsS*ylQeNd1*y^96Ru|3SBO|Sm#Z-4vjvv=Ql=P!Tx%Ukcf_Zg{>w7gm30$#t@&6*8* zh@OZDg~}2W5u2D~X22Or=~^RUNJnXf(GYehJQ(aj9lX=g*FMl&*X_2#<>>79SqESj z^z;ll2B5+Q?6w}#$eRP4s;BUy4q_)qSZPFRkeogD#9JTiL88k?=74%NpO+WT8B zq3fU>VJRr{K+tXTxNXOeU+nkCCnQCwC13M#Y^udi^*M1)B&*Ek0RGvXND2=PxrPf1 zbxsHD{ic2|%H?5LrbkfD2DC05JTf!{4EPzW2@PZ$-5&R#>=^i>;$RZQYlW$3=hM&u zgF5K42bKMB9MBP?8jWB$0^+fVlp^eSyj#*|Pe9i~S(-_oKV?c$Qk>R{yuZ^6bH%JR zWn@Gvyv(g>nKZxbq0Af}=8HK{l-P1AZs?uzpXQ!_JDVzjCxMPEmgm21O1FZq&k zDi+L#H@P6$-?Z=j_uoG{G^`uH1YxmxStixQ)vM=brl|WMcUpR^LrQaU=F+8wrh#7( z`DIha&smCj<|o8Q8KAc>pE%Kte+gOHV-V-f&xsn7te<_)J@?#LlsJ6kU;p~o&zGr$ z>GxNoWKA9dc|JKW1B5mrJ2NRN3MsIdxKZHGoxR9URrIwxVS5sjNj67)l36wYV`5m1wTlI7*ap z5BY+yLDd>#LUJ66lZ;-wq{4yTr0fy!;&W036eV1$udln%+tg6$;wfbET=NwaaGpDNr&x z)#eK&=5&%IH{76m67_yefN5%SqSz5MHf)s`TuNa;RKO4VG01!5q6kPydp$u;p)hLD z2ZT42{(zk381@L$$y*pNLul8Kn%KKHY`kObtf?r!sF<-}(UQe0R-lDy<(&^tM`H9{ z)P?Ov*!x}G{d1huFFIu3HeJTfO;~ z%?ojJ@((}DAdkIhG&@He_?c%6{4C-Q)t~O3s6_}f@wS;r8|)^B@bNkP{X2PDxjqNW z8drMjG~Cn6c(0$CFk$&U)v&a`3>A#*|ALg$2D{eQ z8))~DUc~ZSd)*=>@wxH&sjkzf5P`Sa{KzE?4?Bm3-EvDLqYff#*KF^FFDXe*+jXg% z52+jOfmDV`-3mxu?D<7ThDqH~VNy4W9lG!XVU8YP+FLszYCAgGej-013|w3sD#G_K zxnX+g%$*z*Bwh?O; zm@@}?mro9ST_yby#ZwW)DpW!i9H+k($vngy=ZlYnyAz~%99I^~PA@{w%u4D_7;}$d z0%(lZ`+V3qtZZ~#a`yP~IkXUEANESbXLk(v{B9?*S1z|oF2AN!DqfG6u2%9Pvf=Xu zi56M^990V`r^XkUqv8?~To^No!*&BThzV}f*pYy>b+u!kG&^=CsEM5GKSnmV<}FD~ z8j&|@yxAKx)3{VYN)U8YKI~^bMlPhpjCv<(hVIvc(Bg_v8w9tM2Cq*=i?N}aZ{3On7F-` z2n1dH#!Te$Q=l>HJm$2N6d}hJkEGL7vr;&Y+K`+zxwK{o)KHOZjHJ6 z*=L^}awX!n1;*|51uU#mr_v}a5oo?swtRzZ+c5;CsuD#gOF>yzvi_! z+B6?cb5nBT>MHQFD>2_zg~aNE)bYG3n1C2m#J=mfHTJp7@uZx$u-!qs1ErZ-`03bg z0cq6ex>sjh51V~KcF2QUmp**xi!TIndJ)1|$>Pb-xPpjjBnBs5zTV*2Dy2&^uwUK` zX$}e^FUv!UlQz=Onlq)v=%qRl8V!g{&xhmn4)EpD(sC#^U>~NnYD)wJBWscc4hzv| z6FDXN>vJSeKNPnOp=Q)1AqJs0NSxmTThHZyo#>Ka3VLajAK`QwCX|w*Rg4?4X0*DX zJc2+N$&wfC$LJCkastuWD9=g*=|zo#ftMX)3iQT}fjG_8_4f8gjD=}78GW%6aXN&A zH7c5j?qSj6vqV5r1OjR#P82XOJ&0l{6hf*lIs;`dE9Vy%FTG{Mh7F6#M(esu*PtV6 zX&R=Ox3&riObqs+rG?}noHJ%vABA%UY*x|bu|!~UR;LCUjl3m^`7TTez71{sFbk$>FO|cCbX+#J+ysoAYQj6oEVr;wO+|U~sdDF!|AV zJ=TTcPw0NPfA%&*uqjcz47gJ~R9LkOaQuvYGR%t7nvE z$FrbgHYR)2uUbs1c_fL=F-XiHPwxu)2xHMBFsatEu$XC4tx*fLEM$Wj3-w=D))bs7d6 z>veh{XMEV`LiE_s%pkYBZP&^ra9C1QmC>vaGjCqS*vvp6zhwHnb?as&v%S6UtaVsH zTCG()sbR5^4VW1Ykx!@$)kr@uEkUO%sN6gaufD)|ikljV%ovo-7f`;>@^nC@0^&q5 zG7ei?K$h9B@xKwPWDMi~xG?^Y!73TS|HiOYGXB0wzxU`U+y{pby1hJG-ko}cC~Uf| z7;2trMk0E6<%?^-n@hSBEBU#l+iq z1_jvod15O!$e}F)lO|lC&^pel<{3;GdycIbTsk<1XACaowfV}`VN1g1yCH18w_?8X zFM7`k!}!eKF-}I**=#-uW%(iT;BndPnt(6ZTf2Y%{(84xkyBJu2kVn*Z`W{^1ngEJ z7gnN;v8)n#fNZsN=@5ePXD-7!i1`%E+uJrESN(u00}OS!hiFP5i9>y{%sRtwpUVm9 zP0}X%Q;;ZAT8auv)-_CXP&+)m3ejKW=H_{=#1Bc^-S1YU zr?j>QnenoHd~NH7PnhbSPhbPClh)B+kVKwYwMwhCu!H@qlC@A?-*i}bH(zgq*us3{ z8~J$kb>{n!yhHu`voJ%NBz}Q$908Rg=~nh@h}p5#0#|P5c?zKo))>k7{gw#P!x@mH)M+FQl3hWhz|_KsREJ~8 zJ&a$oMoC4r`bDrC!0Hvq*gBT|eE83RZx z3L|E&TsgZSH%SQ@tW8TRshqZG=9pBq6_KQ1cEy7Ax534jg^m@Pg;|7r9-1Q}D1}-9 zHGoR*{$9i;yg`FO7*RTB&bXq?2zir(l&Mv7<}KWK=e(%}1c}jJQ{mD%D^`?}`M56y zEVy7m&aFkzswfS7$+$>runVhUvq9NkqrLy;_HbT_{@-wWSUmi9ZjV2xI2d1dxrU_j z1p5H}wAHrtr#a;{A^w#afuoDh(U+ei&gL}d| zqr-d9{;!?U3dO;Lq0VTVZR=LDiGM28Qby`3$+zTr3wQeTp+n>aG(bT{;|H?vBoOHB zC4G3J({*-Y3QvWy3Uc3WK^O-YhHuIX9NxD(GK_;GZT-Dq5Sv{a4LOX;%_bW; z$7_*yGc_TveQ5w2doeC;lv&W_rJ)N9tX#A(q zOs(*AHuFqhzlTOMaC-;**|ttJN&9@5M^6{I96D0ra>x$uKnD+fNaM(h&GM1$olQ2J z0V(U2tE7WRXhNwWehWR=Im|OKZ4}q^l)P76W*E-Hd(p9DEJ*{-)5D}@dKk_%2Xq|= z56X-GIrfKmkk$SA72Hvtnq(H}`k!Bg2g?(qpx<UI;7u}cEbDrmVAo@11KHiO?tzOQ!pf`aZt2x^3W1@pm~H@Ge19?Cw=g1 zcZokJUp{n5rmokgA%{N`M&l=xg@m?gp}K|y#&P=VpHZ_Vn1-z|e^K?s#ZSAT2gw!> zuI~(NqhqEn34K1c($U*16D3tNeR6(38Hvw1rNF3i=Pu>(6I7;^PYic<%EZcyD!FfI zS4c8wjRK<|T{)FUTSSO{{}&z#qhB3x`G445;CiY^anL>>GdyG4TD`J{+`%K~0t~Ew z3@G@Bhi_IXo)dvTFP0EYUW0y8CeUki)et|==(_bwutZdTyO6(1?TcEJdo7~Iz zGP8biS=lyq{l*RJHr{^w?KT@48x2{RKiqjI9KRt%jPE2j@-@??yF+6NtU8@QZP*}8 zM+(dYi*Jkk{x92_~)KAX>!M^8z(6 zAaG|}{764I)blkf#3Nrw9`;?8!E9Rk-Sks*BLn#LK4^_>*9 zzTrC!mR^^Y;SsCCu=S1pI^y)%GuIY)k8RLu$ArH|$cpDGD<{p_aJRty^wZJrcf5vX zyJyvhZoTE!jkjD|)Grl?JV!@Iq7d`h8nm?Y)RRw6Lp{t!q=oK4pc8RQY^eAVwupIq z`z&%=dLCr**U-K*|FfP{tio)9gf_zXJ&k4D#q-mp2^f>4Vl*bq#aVvCXd;)%QMCJ2 zA{@O}ee&d~6QL!noeAgf3-NQnwT+uT!@@m`i6eK;7B3OFw6wC+juYD{$%cefsN7t_ zMij{OqtqNbQ}A4Lbl%u_rNDJ`T)5)$Z;xgwhU_T3l~?QlT9h;@4RXX34&1;0$A5je zQ$R>%RPn+^+oKJS4ZB>3IeK)uchg3U$Vfv!9;_{%dh^X`Fz8mJAE-p2Z@C3~m>K)&IwzmwPAdC3)V^A5prf2AO1&gZgVp>ld-viavGVFhWp!_zyJP7^AMAS z3JZ3){n+>NCI?U!G(2{MPDBxX3moN^w;*b8l9clD@+^&D9yMz8C~QjrKN;>fYswls zO0Lm)PP?Vd+_w*f;SHuzWDlRK0gYO)F_YX>ik@%*dt9Y2`@UNc;%H>KEEoM zCrp?+Dc8(6`eFSH22BN(6RJo(#;5dRGm`RK;nQQ#`%DYvu9f;41O%>~5#?wsBVbpt z5;=LfFEpN}OUP%_u6cvfR&q?3Ax^?rC%%iWt4L`o_uNq!qW=$R?*Sc0b^VXe%=TU+ zt+eWGC9Ake?oHjjVKBJRF<_e#gE75mc4R{!KxhF11PFv)f{nq(9ruEZY|Bl(cWv)G z^ZUG&O*T2_pOf$TYmTM0cC|Y*@4ox)yZ7_?++74Fu17BFNq!nrU%zz@{%b&v;6Z*? z0gTg|E%9hDf1xoRJzoP=p*w^2sSVzrvfbU56BaLDH;+rg06 z>vK623Mn1(Apq?Udjlc`$!%iFS<~AI_eR;Sx3X5)!bj-PI>%zvos48 zvg7vHgOuK6GU;W*D^L-vEjo`~5@l^OVQuKOf#)ge8j5;!lvhX?LOJE)>67&ivZlNC z?+=Exs2Iw@HD_gUdYaZkEy${vFag!XK0YRY0+&!#Rasd%3vf-czE?f{bcOaT(pF(2 zyCCarYraUN%&dwx-auV1mucGm1}9T)RHzCUVpD#P<|~$Ed#D-s z%f8EJfBgYfX=@oV4k>j0rb{loSc-HJLF&Z}XD0bJU<{xoDk1?uDRKt~khgpi1Q^XQ zGEc~aXZR;rBO0Nv%dt@bvOHXXSget72?Ks`K7iXDATdE7@?w4$M!%mL!iR@x4S>}c zb_Eh|Vlg_0@nAW{Cg1tLkN|2E@9gI zB}yRlS);i1SF zQR|{cZ#_m2ok*zb$TNF~pT8+;^m3b2Uvn-7Y<%yFIF}#i05I|I&czVrTtuFr98$&% zZ8fV+`e6@ai2L2c#1Ido;&Q>+6lrum3aD~|QHGoG2R#nrW~kt>n?ZFg;$}ohBYEN$>tcn33Mgma8lEY;cy(9s}3jis>4AA z994@H@}WV^$aHeo9mf+ z)%A!%Zo7NT9B&#C!M#`(^qt-edD-xTMv>YRSBL^AxRbVnf2s15-E^xZwtJ z0QzMSGWlQlQ^LrrerXQ;QWfyR#;a`NBzUDQDBI9tQ@p}T%Vbu0B#Ft31re9X1U>Lf zJ)L&%V8l1^63HM4cmrWX^lH%i35ZaWA2~Trc8RDGc6p5p?t*77R<;I#!X0+B-L14w0XtZqwf9!>i&W2-T zxV0`yr;aTW4e*MQH$!Xj;ae+(3S+-Bgk=n))v+=7_S2}x8JPKt_ zyYZ2yC*@_2yKNTW>IWjnHtI7N+$PcLg%%jlUslI z>E~be9&Pbk>Hh92P|U9vRz!}+<(une6K9o{OdiiwVC&;Y31yj#eeYmvXJ^xAvxP^n z1||^@B93?{M?EEbXZN{=hAaEuoe6#Il|lhFMtV?zZRa9~$xp26!e2`A#p! z3vSgFbbA6}HXdM9Z@>@fY`1&Bi{u6cYKe0Q#VZtqQCvcWhZkG5j0n`+07Xj_fR~Gq z>lMTjkWNs_0c#y5wlHxA0Cz?$>?fJ4w0!nT*rPj)o);v>XLLt;+)g!24U4Yc4~ zeNJss;W(<8rPX3Cjt_+cBvTvk3Vv5WYRt?@(JDk%Jwy4)ukne{0L5EqxUtE}v{P!3 z0Uy$I#iJ?!U!`hNf*LoGhDx%hy-S*rk)#OqBd^kMrNgC3#@u2&O+8i<@-$)%oTzKa z>u^De(-3P^(ji=i!i`j>LL_FwexKjt^$&YUf-qG_t?|aF+4DalOr^fF`;S$NCR39s z@x}O@yQWl&-o!?W`6Xjq8IUGRs)62&{Hqku*Np$GFq8jlwMdE&t_FHSCacB-3{zr@ zbGp8`8Ue3@5|<6FOKvz(4OPVf+gQFFX7YL3UDR@U0(C+Vww z`}VcCf(RuF&{Y9i=T0l-w#p=Jn8zoYeKm1#+|vqDNYwP)bI&bI3ZB}wZ5uTauY?LF z=&rJHld=D}aq`3(1;j=ck4vLa#xIYE81E51nAG`kIV>7SH7eoNOt}S`4|+5=SpIm$ z)h)*B^u0INRPk)&_>^}FMbc_;-VPo-NO<-mP*D7W|06kI`HS%u2e)6e(!cIyWd}}T zM4Ns+Tmx~Ye$bmeWYaH`ffq|aibzyfGd>#Gb%~#q1qdV_ZLeyeN@+=pQAt6F!2Zau zODlpEQCWCxLJWMp3ab6R6`p$Nf&1^iZRHK~e#M_1VQXenjZpeLk2K9M_*YAHQx|H=`5&+?UR+JPpyl%@ zFbOLWzF!ZN>11IPzX!Mc2b{*4mO-b-+23@gMt^Cbj}mndo?8Ea4Q)EfS;i=35?%u2 zY>j@RE}!zrP00yKX{nat64*(N{N{0%Q3az$Ot`s5KRsAU?Fvba;Fpb@Qt>o39Zy$` zj8}@4iDRpV@8L4s!~3J|;a{Te;Ul<*OK}gEM%}}uQC3~>?LYd@UubA;ZE0%h9CFnq zn@)K>E~KM8E(aFtUFXl9I&u8OZ^sTFav=w5l|TN_%2_2B0~_RrmWcYglbOEnaF(Y>fTH)i6LN#n*9kIXA9E~Q>bKHGX{(Wp^H zo$gpXnX`)L*3_CytsRxbc=#^Gl*^TdWH04GBOj4rwiimfdD z)Khbi$9W!q@&d9qA7dx~8PdQ_s<|^4tX#cj^}2`GW?;|g$--A-+#=q}K z69@h?ZZ6ic2D<7w1Lf=3ZXz_tXA5Ykf4wOV+<;^M5fZGgfy{9DM=}bu`%X& zB$%zrbAG*SsI4!^*w1syii!m{U0=0u(Yz&hvWk^6Crz%LS(=|;SyRy2G$GjERNsuu ze_z|hj|1Mu%k`IPPo6z}c;`>s#7E4jW*tL?ozAca z>Y){j(tGypW))lid6F(&dENNwYlde-3T8vJk1vdx4F#ADDVPl@QL`Z>YBp$oqOWX4 zw}2g&d|Q74lZB=7N$rWMMU9CorFPRPH@pw+f38L<8?XEai}X7@ zHr38m&;?W$^%^Z__>jMnazMN|nJ%Eyt4ry8lJKu$A$UsUQK{2hIsY90mavHSD@ui% zXpOr@+3}B$!Q!0Ppe;P zKi}@DKMhaLQmv>!ut-%=v7DwaxAVIpW$U+%+M_?CzQRJ150*}$;*c}Eew%RDQlflF zO4MCT$6Z4gQOXo`*UV9OP1!6(U@H<~dhBJ9ZzXq(-$<7amSe6#7YA4$Osv1)K5ZPn zYUTy{zSeT;0@9%kpj_ce7oNO;C-KMP7iI#__a*->GLJJ!eYcwKr%L&ESyDg5t&nb1 zdV7XQs}f3%)CRc{{8qA2nRMMaqcJ<1>VnoGTGx=#@NC55LRsbWV`HaIMf!C8o4eNu1gg)n$dh8QnC3T_&)NXBj~`xkk)}c@_7J7GF#_R;#1+Z;efb5Z_DlI zqE_2n+bj;MjZO-LDlNEIBEMHki3e#XJs|cPGzi9q^lrUdEO8BLsNpmF&sx&|NpbSf zVTmZBIJx>>5C9{Jlb=(cF?KsF=y%0Q-Yql2D6T3_YNR0%CA+3L+2m3<{-rp1wAax8 z?~0R3+&AU_zx$R8`x~N9j+$?Hd`ipC$!Vy96Zq{Jb_ zlECJ8{USVuZqa}^tTA};njTq?TdWy$A!imDPr{9gi#o5wsM(o;@g%&o=-HY5FFS=a zR;JXQXE;x0r5e>Vb*Y+@HZ^L~4+SQ0;NZaF(Z_wtQsHsYZ+X;5toTeY zc;-y0FoHV6F{fYpW0{aDBrz|X!c^?XMEw)(bXJgbyUXL{#mIQn~kjW6N%)LPr5$gsQHyBrF=@&qY&}|y#hhkcsRrdkuj)%_P~Qe zlknhG>;dFogGJQ3)^_UR?kbg&y!cSDw&ppR% zE5?6aE=CK^8Gyc!qNl1O4UCw}X8Z=UPX`!lGMqBeinT<2dT!LGr{UB8TU@IA;l~4Y zjg3-5*SEsJszuo4`&pE2pur5e-an%Z_$l!4K*fu%UpzfqX)UF`C5payff$82N~oEI zNYhDc=rnTRHg96?oo=+2(&=~^bb47}CxPSx_}Jdp+SD}Q0JhmmHM3$MC1Lv#^lu2! z0;g1HBt8^@d?*!JfkYLDy@C>g>d;965|C5&G@abLef!V5PqnzMkjaNkDuunU1e9)& z1UTjS1E0UlvNeDH=J)^tDm<+ayyR(#3ObBeN9jh~r$Q4AP+vjuHSW$9vl7>t4_4TxN zbUD?i7mdync%Md%-YbO3;+Jvh88fiwh=ne=7ZQntFFe=?<^-LZm6g=vi|a5gx{8gE zu9}_D(LvqCGD%4?s|XOspfyPvmoa)oUT$2|o;`c^|7uK1>K(94GA4t|kniN^d!H;H z&SoSf3=H)3_Vo`AU?bIza==mFh^a-EE@9$tiBDBfCnCo?;s-K+`whnQA}h+xMM_kJ zoqPaK4idYp(3CFB4#0_Eg%6cX=} zZhGqgcA+27gp8y(a!i0Q-!tML_w3t>6rNm|Bl$ZpAwRrXjtz=jkRybE2)bD82%;TI zfaj88%`}CSl$tPXlamZFNKPR;!Q;}!VQz%ei&_GxZZ1lV&L0>KFG;vFk1bF0nJ)uY;isAAL%s?imTC!3S3<`>n z>eZRpHz#Xl0l(3Zl56k+de!5GMjd2nM8Gj47b6C0z-kgRL2zk#2lB_X7kepGll|bI zSZVOT)mk;ka1+Z)CXUXES8!(CMCAO6ARz12Yhq_-IbjJc&e++rsSNU-W(kX3yM(ba zQklS-AmTvqa30kDL$D5~&5up-kasu^S_pey7-i3oM%nW!*z-cz^TH^5j@Dw!0qp+J zq5Zqgw{`<<)!I^fbnn4qmvH;LYw^tfhNcj*zB1wv)W^>s-?y(GH_Xp#HC84zC&#K8 zIWmdy*_*(l?h40_Gx7m0;`;qzVq^(WJvy6M)QNsuZ7PDMb6J0tj`*$ErnE z#!+7n%OgrPUj`?uZoH~;!Q2*qyi|CWlL4e~>eO#X|2hkm^l?{}s}$HOKOp_v@e`-( zFI<3#mDIW!FFXEC6`+23(5t{9%@z7S2cpA=F>2no^v60X&1S2wEM5fut%&}L=eQUI+E zDwC2R^&keDlMiw^&;r6&hnLcz5}p8wi-FdTj!;NT^)%u4{i;0V+6&RUrdpk!gZd^Q z6oQ|U%d8BDH&*C5XvO^@7r>H1oCcSJ*?95Ng~ot94P#hr77INW>l@_qY*jCwxipY5 z2Z#J5*&CrKJZ}Y*@crQ=O^Go*myytGQ{Ic zCHeH*&6_tLwW~7b0X(yTBxB5q8l^>JN47DLI&SX$rPNE}xf4n!{h<k zRd;UKaL;st!%)!jn8YmPpAr;h!g}FZ8OL#-cgIWs1b?`#$IsMnbbbPw<=i4XF5Zrm z(-znkk})MHh9Th!xXe7^4(UsKQGnU|`b+?FDv?ltXM|A7NSIhJt`|J90ko836rk-z zz?6d54X@YN8{%si7YMaxDQ)W+Xsz$+?y(V)A4%u;w6=D5fKp%+z0N=kO6e$~hmd6T zBkT-OC}Bt$kH03ZAU^@=HDz3?AuGGMG%q_QfK-)7k(f57uyAw%HkVcrEpj-4&-Rk*EvCQxAW}s=;f7$@JG9Invl4CeVy@HFff&TT8`3vdiqM zKgs3%)(XpMu06hg_pTk=A;mLo+Qpy#x%roaseOCl9DB_R)~{c`2=0tkD>TG_%;5T^ zkG+mFxJh@OHESlwl=WYJ`DLf3cnz1f`7CVc-0m$OzW(Pw{c+>Qjce8%d3oa>-~N13 z=f|IZ`e{4#`JM+ogB*XXhTB39kho-+QEpyA!Nfa}iQ>dgr#DQM5vd)~3Z4F7ISLFo zmXwQIf@gLkd&ga5_{0V3z!>Hufl<45t)7p*`0F0o-^_P$N^o_ z)shb|P=7NzWUy(S&eeXFGk~v&{g&8yxq#r2-GWBU zMH8o#ltS*duyDfcS!GivYV#(7kee45Mx~60|3X280X7p7_+g#V!5JJ5yPv|IIzfr1 z0y^kDIJum;7FciQSEiLU`gI!LTXTTNe_;qhardbYfvDW8v3^^eBfc50iQKBORPHz8zFE3Bt(&CBF z<1!L*OK|GzH_Xq@oeY;eIwd9uv-D|_XFv20FX z1yyQ#{GmfkcDD4&A&wa{=b@@$l|UHSL28q3=}oKGt$S$6$n-GG(w|&Puu}V|Ba(CH zdJ=$gky$LGa&<2pn6!!kvUuY z#%yGlCkrY_<2n!n76T*nkYqEw+-}rC?qFU$URwdUhaA!d6>w&#CaXX$Mp+Zdc&CTw zG{$&nQ=q4@E*SLiO3ny_La3)wW8o7}#i4n<7E*fQp@34|-PJdQq?8s55O^jM6f&h6 zWFo8@hfSiC0#VE>mEy3U%ZM>1U`YFWsrYp0WrOXEm`o;4pxSJAA(lg{F-V$n8L>ulT3XuKQw~L9N={Ck+#o^~S0YiWhmM~ZJ2uw@ z^#bVZ2_bhdI0(bWo(3E!zfb5LfRO>L7Gu1sWJ=JW6Qk^DZj?REhCPwG{P-w)ni#bf zCT`xppNKERhP>VF4JUtVX>M*i1y{5ga8TM}VWk#}!IfnYS(Os$xbfiRjmm@+dgA)0 zpSIgoDoi6PE_Ko!_f}TSoPIL`vh{$q(p$E$(k)v&hQu_3Rq1!X^Um9EzkN_`GI8bD z@u5fC7__)hO2sO4O=a{F;HeXhq$dJY=THsRE7UOxO2Y6mxk5n%kx+|AVIJ+;XtlyB z3StbbBDWVj#YBE^P==B-#vHHZdje{WLND$g9OOxZEToB~ayd<%u6J0G{M4drik2DJ zn5b@P(dh;T@HdvpP-M*+KPD|vjCe{7pf7DSvQncF&Qz`6WA7YF@ zj2h!zQDb}pWBfkG_-|2T{9)7>mpBQWK&^!|vRbDnJbRI+duXVyueNsQF$CJp{oUR5 z*esl`J%9EL{@>sZp`))(;`i`&!a%Io^ah|6}qi z356Yz$D9=htx zWNz(lhag>RTMPbXkk%XXCXJafWBK(J6%{!OMwCLN1}9FPG#%C9bgi=ikxZK_m^89{ z&YU@gnph`1ox?N^_`D+YN@q(LF@wlWE>j^#C|BuX0BbcGVq@D+*Y;C3sONXvRq6S~ zz$c6!nQfw~swO7MZH@T&D;>OPOjTZETIi0XqWUi$enlqnV7! zW9L8k@J!@&H)1348DaNQugLBjl`>+cSvc)RPyF;- zDv%O=mmKo@${5^SS;gbm_`i=~lgzT#5~# z{{=7j@x!fHl6Sql5KTAMB3PU!R7H?2v7nX@@1)Ct_gyc2;cs7j@x}X_76I|F6g;6e za-edvQMf@cVfDuWRo-Ht_g?<;1a8{qnTR%LAebb_4B-LEyC4<6iG_bR%R*984lgQI zfTExPUzfK|fQ^SG*rE|#I}}e85;^3kp{~M+LH_py#Ud%$v1qkY9%Be{55iF~xSL!F zViib7pr^1GK>-Of!Hwwagse;u#aE|w3|A&N9lpaEzAL5;A-@hrX| z20_DP2*6Pwp%8`?XUWJ+1Zx>tnfOXe%Y+gocy*?xXa;0U%EnrVgdTM-%NiM}UqBOMAE;_!CcwiN@$5LD zT?3R1?TjT1g6ojikCh5v0pvG-t_ zcNCj7wqioEdD*fOayApns-|S%6|Nz=Xd-4*W!8!{puDVJRZ0Lm=vJ>Om5=*H!Rco@LznKnkn}ir0D?7Oh%}9SfbY|1StJwh}fW4jC3Dn~U z0K>Cz36U!S?(fJ3Ejdq_`^Co>>xk{gS-QPGVl?)q)fFbne66)z_>IRGUXyS zvV8gSiHY6@{1VbIBvig-8qPIaF#gfZ=V%N>4#uDK&CH4# z|D34tSCN5kZ@~t=rM=I}^ijtM^-b+X(@;esx^X8eyx4S*K^?#NvBw@;JU$6-Jc+uW zrA(~aR8%xV*^kTXSB@y+%Am=$Lv;D_+znUVvTVcLw5Fz}G&twCSjxhxE!SUPZfrk$ z_H4Vc{CduC;>4v(XD=c5S%+or^5rvxy~jX`7#f-sxuqgX5OW5t7VR8GNCGlS!k*Ni zgCj~2YB&@TP3~kE2|muy+8P2f4|&?5!2wLDUL>FMVDNOQP;*bYCJpG@fvt5()r8 z3Fgt^E3CZl+8t(be~I}2$rB`cXz+ULnw=DG@$a{rOHE4jzyrJ7Lx>PDn;xvh{r>&l z#e%VrU0RduTGu7-JTtY#(VI;AmrY5|@X@ zNdG?STQu{MLOtl!FHk!mEDGRx9H@wOh9A z_z2BXP}j-o+@yHsnP;BZ@bJ_3Zzv~q?Q>MEbjnlDJQJx*{)*SHTfT7W)CJRLnoJUw z-hFD*Vz^Cm{ETwK_i&(};h03{(aY&fssJc2JjcLomeNMzI1f;t%O6^{?2fzFSS)ax zuYR#fj-fn>)(h{vT8Y4)7JfkMo_NWQ6DK0hu^*q9rZGyT+Rk={8N<>U%1y8TD0uvYd*yYqV;Ue{#RdVdYg=5r*?DOa?$Pi@2^Afm|R@m3` zlFM@WWvY`MX5x}+)ooF>P#t9pkHHp5wJMs4urkWi=I#3u?QoFUz;cSrJ4q1&$veE# zo;iGA_m8{I9NoWb#}DXWLW)&_nw9EFsbf?cE7vFI;!)9rB6Olg!K1#LB+J^{yL=oC zi$SsgM;dZHF{5rk7>x&X^5|J>BWv*utL}eb-MY1_*FH=TSJli@)OuDFA8$~x(!;-C zLH^|gD?hyZM?Cs*?=ev>0CG7jj4uqZd-cf$mhv%178hlqMICGx{xCd*r#Q}Q_Aln zYx{|V2e-dH3%I&92-0=Psf7V&`~+fap$Pfi#7aeE8DT`M97=q66!4>=BvI5saKkV@ zWc(RU6O_P44*7m9s?^!qgOnF zxFQSm>(#{`(KxDSd1={sd3gwFC*_+FG9rUv)=GteNOS-_dbFdEDm5xvVgNQ0x&aQH zX&7gu!I=URj7K^n%|QtOwOG>E)mI}fnS)%^)#1l~?J|0ioInzc{{ zYbUI!QBkX4G?y~I;moyYav%~+5)=RVAn6(HL+FZ}0tqBXm|3aUd+Jner;m%jd+Bf( zNo6nm-E!|=gIE&giuh3)i68fzW~C+*>?4&J=U;%-8;%*FGiA?zXqX|ro!DX}Ldy3L zLcU4;8GspLeE$|P(r<4j2^u8Ab1WR;w$`4$3wWS=mDDM3u=x zN5G>-BtF@TPpiPCn3X&5c{Q!6_-bK2O zAV5r^28S)6pTIj2C9*U^Ln-9_8Ahuh0m-i$;DkLr(FdM)=c3;t?Wl)sAJ8IaCUgk?E1Y6NFR`KwHnAp0G*e()j??0TKS z0niUlvIELxF0^l3SST5*Uz9mqnV=wLMkL7W)1 zxJC^YSyCptg-oGBp^VMQ89Q-kD4}O z^4ohzR;Tgusb5jzMr{!5^O?g3_a3_7>N|S?|Gm)D?a{(Rl4`dEb_L?CHBFOUT$~Xj zQJ}L1EV0X1P>>Ml^>@_5-fBC9%mOa|W>V^|n7{1S2cLZEv8QoOcKhuco_b>az44Rp z!T+ARcdFTc9Im1hbs`B$j7k~aHaOVP(N3h0Os3r2%%u45zdvZxX-D3K()WTi_2Bma zZvIj7_=*)PZhepdfM39Fbu+5n+pr9h@7w5$7pqVK{|=9T#G>~XI%a+qoKNIAe1BWC zFs2cm8qu~+c#PSHYLdiafqp!ih6K7XnFlWOyu~tc;@CXPa3TDo);QBFf{hw(`0&)2 z*e+5FpM^|q5#K@%r0i!259t5&&jZI!oy6Ad!iD2Ujvn0ne5r7Y?2kVm!EbiHLeyv` zLN;u;)mZ`D*8vup7vMKUXtjWBk9fow)&!EYNUI{!bTSF76o%W^8H!PG=x>Gq1#)m6 zl%XY9^W-d=A&MA}4eC9lk1oTDd_?iqjff4B>=N4TwPFr99EQ|P)&z+f8YzGHL`6!S z8*Y+dlllW(KCjIHVMNQ&o}P9z8YjE9uFj4DyGPHXB-+~A9aJY5gC3AUDoi48h!I<* zyfh{z^xH`;7R{Mt6tp)5r`?WSs8gg2xK&)fI1ciD6VuhoQ0L_f7ZK*md@dYpkm zHNjC_?v#zFSOppCxu`VZRP7ML!W~egr1*cWBd3ZAz5-)!6b-escfz{}T2G&8*v1L- zbWxOz-x6ix55mR?^K?O!jW3GwpE<}!CB&K2%lV5$khUeY5Oa*PlMI&q?vHY&`dXHmHM1ef!}4?q04b<0mj&oz?* zz?CycckbG?XZrL^hQyEuY$3BPiNvFhnJ~d(;me_T`VWdz%upvBt*)-VV8C+n4{mm(%1J7nV0$7&8!N1m`~~^f z{hJn}L)jSMeS&z#1+gSMYU(r4At-#c`k5`Pm3)NQ@*nW72O#wja1MyY9!MXB0pMVm zI7DuMbtBXoGR8*s?7d+w2LZ1GeWm46EqXsTR#Yzi?|%bXfvy-%0}fT!P2#9g~gMnlvNcJD3V5^ z1UfETM?=qyEWXvqoM68hw2GtxR1X^9TkYV zrpx-Dk=f!XyDYsLnT?6E%YTc^4xFsL0JP^xmLz+*GGJDe7Z@vEd>t7!28X%Eb zc6NGVJXe9D)N2qdsi7Z5Qon|}4_@<2Y)d0P5z*O0m59u~fZ=>beN;_7O`@}`9MXGs z0hoE@SkHWUsf7e+Q>KhBuz=ux1H?DSfd7z>?D+x!G*+u#|M4jCdxVI8Vf z87LegT#B@ZaDje6;xh&G>u646AT5w2QiCZL*(5nDlgN=BS3?~}O#)wr$QZbLx)5^n zd}n9#0OB)`AT`EHU7d|rh-?tbhW%Y#-9xB1;WLD=h`2FsK1>GYu#MilsH15w>ph*int6R`7hT+=mQ2@ez9)%d=sk$eIpxe^{G zTHQZ-M_Jh2Z9`HJJglJCqerq%%gZ$?See&u>+cLuK5qw>f=exRCogqFvYfH|1#7mL zI(`@xs}8>=B{4<=%{!tF9^erO=jFxoeT{9sLq3#gQ8cokb%@ui%ZY75q_($~K;qzY zO-Tin>4t>l`NREdIN1X?ESd$C<$RV&2X!|)5W0;>H;>hX+Uwi896><`XBR8`=g;tV z9ZX`;{F5^y@QeKf zRR-&+5&hv7>Ux$LGty+GJ%LK>Fki$XizDU6Z2jPsE2M3c5pF3-^Oq0dzb=V0D{okO z{hTQfQVgK8S`z9pPf9*M-q?8f)mg|7kBPL(5CNG{COjy4V?V-?zt2Re^hR_~)Pr*~ z0%%G0Yougc01s&Gf~M8IL^ z3W-9Sz(fBAnZPgtD6tm03b3@W6wpMhtY{gA+DcHSl@fRvL(*v3s8$f&>43-9Zv!q& z3W*I^C`E)?g3w^l(0-TQ$rYmUoGv~VrfcuyQ_-z>OollD(yufl)y68*Mwm42CZG|* zGJR48!fOU<4OR^;l@L6TTnAj3O2pD=6|D2~Vgl$SU2uYauvfXl(W8yLiZs3NxyX!0 zVP(n8yc9C6f-+5>t($K3OW$A^_&9$%Q3419w`r%N0&Goq*j zc1h&ttMn5{iGIjR?z``yM`O_dPaKoEWlI|ha3<51Eh&}vL4W6CnBw=yr5&I?Rz5K` zn-s$1;&SH9qB?MpqzL)hK>=GqontE^N!6{?PCDIS)ygv_Tdk+D3Rx^x>%wON*N(KJ zy%%T=A`Lnn`-?k-hZLV8k`;^3?bx@kjA;Le!4rLnDiu(dMRox|2(8F=3TmvtG?2Kh zey|41B5D+3MjLO$WvNuOUIV-%YB+IN?O<#W>ENw8mkmWZpAut&uRgoLB?jGS8sMc& zN-UHfsDTgF*E^k<0uHK;g<`ME4SSI*5>VMP0-pgfOj)YZ!zFrbh#)oM5%J)VyU(BR z>N#*gsYLA23-guq^z`-P&vcsXu?9mLbY*znV970u*3qLV%NgR8EVYBW}ShJXzQ5g}mBY zxz{#0==6(dgtAw&B=QxLlif&ABCCJ`h6tAt#Ke%OOs07^qg~sbH_S1ij`0EYfr{_A zPk_;P#qk;7wAW^WJRK&Ms@F{<-LKHL}qZ4VR4!5#}6h08&ND%I-wb=UWC03E&>0vlC zSuT7YFW4Ru67Q(hVoF2+*T^kU{0mZBTL;fK+pHon;u#KD>E!gR%#5TsIdSXwG>15z zbiG7g!HNL^q6wrUWV&3Wu7$#UjWR21>Wo_NM0Zmo8j6ankkO zx8TWDtGwPXzrv@V{pw4vw}w_?GQKQ-uzGq4iWb)rqRchten4ty?uES16;}sq=VgJ6ID)`7E!XwnWkdTSW^2;DhklQzE(R zudkABb*R^)@g$UW0gq}FR$~}C@&1s-l@=x@>MmYnm>Q{@)_6T2-%E{Jm!N_GR<#Od z9W!XN@rAiiZ`bL0pgNTrwXtYiG5Y)_vR2vHTmXkP(`RkcC528m*nyr%sa$&f2pvqO z8ZqY+rOwVy@k8)7xU0y>61K?AxSL$m-TX(?-FzB%^Jd)5RZ(8?)~J0(;oz|oXU?5J zd%m{z{H6NsYRQ3)&X&gJ1|sixCGho;qlXV1I&fgmjvZ(J{0{1H`TU9{C8JQ7%^o>@ z$x0*y-S7SN`y)to?fmw$Z{6hw`v0&CxFG|)ex$e59e<*_weo6FLZ0w_CqrDzM@uG)_zXq&5mgks) z$DW#t{I(V4;pY(u5M0QM5FLJ%>Zav%6;+1}-zz|dSgC61vrj(x+*b#ji2|T_6ox6$pjmgU5x%sFsXP`^a1Oy7RU{Z5&EJBCG zyM+g}-)#?c@7ey(Z~yt-w_kqp!TSrLSy6_q&mfA@_1MfeL4v0i3XMC#xqpkVg%!RE z@LFE7B8055*Dp&g1bRW4kz0_V)0xw=M@?oG<4Y5p2&#z?6uiU8l70v0*!~9Cd{7R0RU&&GP z3lPw~Eux)!_DEay%0VQO!Xejsy-~2oJ73oBXDnQlL*bSjar8+yUDZ+ zh;WwLyOG|Hm$lLlgv&8BCdy0u!8~uL+c5JlLu18afwyCT7G$Y+HzL(cyX$8Pcfmr= z3o9YQ)FIr))O)E?eh&*03S+?L75v|gnjkNye8AE;8F>)oEF^WXhvq?Nr8jCa72T>F zu|t`!=+jZjELkihcmm7iMol4qKp1JS^^Xl6hQtNhlJPupj^LKLHxA#ea@?)!qV85S z=6eb5RypogS=8N{9d)O30W`1RwR=&4%y7n6tZ^^?%(i$lA}TuSR;O< zKB1nMKD73}JEvxeDlv0I5N0?=y{5Ty<&CI!->`Jq!qTbaU7J`js-$JlRUp_SoPwRI z8)Ge&<>LtC37UkFg6sEq?t8rD_uwL83#jyd^d>te0OUh!Q922|=HK^w_f7x}# zp+rr|)^haIKS2$4JtlZJAWBR~nK5SExM_Mw;Muz!cxzO7$V>?Ylu9lwE-fP~EdlL} zVzr9c%&fFHqf(~P$aPxi;zC<1g+;cg;d~1kH!uNgP7x21vy1F5=&-$2#HEEUHuVY` zy}>lLWO9;DotUaqB5wi&83J>O83!U0x=3f@|FP?NiGhXf8Wk;UG;vIRG5>M@Vvv~qxU*=XzW`1uv z4xaS=El7dVb$69fPHJH_^$>`uwBhsNp%X1al->Ree>| zihUjC2oz@UJVjm0elPjg6;Zjro$DkiD*}1vBi)kQP%PWK6>OKyhihvOk)K=l{)SCW zwO$C?yC`|A+1%OD>!A{~2*$@2jmk=5mDmnqy=rebd-5cg8{d8jiTq^v^6j^a7tNV5UQih0;x;}1`I%O#AH7NhEt64v^AnGAxyMhoAp&>HlF($6G(mM= zIe7f|=?362y1-1}$Ce>PHwY=|A@WF(YBb78%QYMHZ9?Ryi!ox`Wbt}J#!(6p0EVG3 znC$1eDHR%Q$Q0U)IH?%S`W~A<4C-U<;r1)o*X=t70^ixwiJ z^7H#|4^wZm7Kzwp7vVfm@bHOftlCHxfUFu|=s1~}61-w`JQj(DXBc5S%cFdDG}~DP zdn9aUd6Yf=C)=5+*9`&VO)&*mM2tU;ViMl|mJy1ma`>~=d@UnYQcNi9Vgjgh=@=6O z<~vhf^eAI!8lDf={l}Vdd(?a&YsP<@4|1{Ckb+`QnvylE$#*q0?p^}1xR!o`Pqaf z&E*Rx;cM!Q($X1I$)oFMk?9~?c2i|xMv76yn!|(bO=q`%{y9Z!)APYd8$0&IiPIMw zE;c)A&|s|LH}Xd9{rx@U=Wh*yunbZPB8XQ$LV{V2eh5J;I?_dcQwqZM3d{s~|KpFZ z7@GzLBB)k_Ov|Z%Y}yoOic!+V)8{N+{Oz|}_8gXY2l}~OWCx{4miXH)UFsk|DRoSY zp2#KjUHEn1zQb3@BWWULf+YxfWQUtaYLiF%V3kg<(}VgYlLW!x@}Q0*L1SY`bLK+u zmH-jLU}D3x0S88cfQE4*`(e`SV@NMbNhlbZ3Q80e4Js@E6iE3_UjW_D!Xj}{@B;fA z3@|bZ8lfUC7q@eWOj5*u9pq>4m2>9~T_y{L--p(R0I_>Kmkv{rso>)Sj;Qx8KO4 zeY+!5K_t;A1;!4X~SN6!FiVVxbIbhWVPjg3F?p#zweDEGj06o7ME zsW6w6XGu#i$Dqq-Vsh4akjBbNXD?VVx3X-;2ncK>V8e$ddIGe50H>kIe+au9pHh=l zT#$p-qu41Yr{>SDn!k9(@_Qb9aLsMYZ!AU+T%;T#e<*;=Ef!dkj|`!_f}DoHRg0-? zj4-;OU>qe;K1~uejwlDLX1Qwge!w>;`PPqbWUoz>{iD&c`BBz!4K14!^{&xqSwo<1 zm+{wM8+&Y6U~D~&zfz}Io!J};B~PfR04!XLDFDdox#hQ>TC`}Ci9rH}F^yUTW`%C+ zR*B@weyr^KuMoDVgQI>Ro7~s5-#qzbd1??nc!R0sPoh1VZpV%hBYF>g_0?C0dR0hh zt2jeL+lB74XPa7^VO>qFjc2JHU^qh-SX`lGu{cI42S^3{ zFEQ#Eh<|%}q&l3tTFM~#cCCUjANO-!)NG6HFS8n>G!LT`%@Ca*HA)urCF&j&(=sVq z68!x0z6PHS;6k6xZim1!$xu=H)Ktv7YEuBcA;yj$J$iH!+LCqwy?FG9fS|-G3&^#? zpq)ojJ}xeARI$QG2UAHC;w5=f4ceia_3`l?9gtA1tGfasHdk$uNkiVZKLpEjdn=VT zYvsz7cihJZd~R0m^9$%j0I|gy#kg^$H{CbFY)QU>(5r^?dT*L;&dZs#bm@{A6DD+Z zHJpN2-`SR~F3iztkqTWeD*+<9Tey!L;+IeH`S(>KG$O|*)Hab(<{Dt-gZ8k9$ApsA z%*KmXB3U4hC{?O}KDkxOZG#Kk@#0)$BBo;IQW0)wiEt|p=x0h_-HTOl&&y?``5iV9 z=uKr3cnJmwvk@pET!YVN9}F-c9LhpUJ#BM|m>LVZx=BEBL{U->bXbB(6AQwoppQc# zH6|8DtVPbAsGG!LW{M~uW;wciIsEVmQW_}%tBjU7dqXisdZQ&ZRi8JiZ0?wmDMW|D zuTIaJUR*prHwiR8vk~=4@O;yWR9_qtn*pHXP;*s=-K0{_i;QXk+N>xA2o4X$*I3fi zQ^pl7x<1dM>_ytS*%zBPas2qgvD3mT4e|kzf6X2;utQL?AJd2_^r3zI^tcr)bF2t{he#>zn@j# z_viylXZ!t2mv%8KhLc&cDwk%(58_@jSA1dr}>s8DDEu*3sc` z^kB(BatYsBTdDK7;m|21)p~Ud@*INC>jSu)MTIF8z=8m^cX_bJl9`v2H?4ehau~NZ z6FT+|uirgmhTH8WKy=bs2Lce(%`CJQ5Z5DymO8qcfuQjE{0MZwbO7Pk-PhOL?C$92 zIg6!eO!30ylM|eXJ9BdI?Ml<-B}-rw$T<0i0AThZ410u)#YCaRVOYJ}e)w=x6MA;r z`ukb+U`Ku1KvUDHTIS20 z2V3mooWhdsE8XE|o>`vgIQ|OZ$K#N_a@?M{{29`Sz+yXhbc-%giStvMbUTinAEb0e zQx>>7Jh)(ci+kaeB0ZIRZ#foN9O8R&s7vn>f*ua~-Amkf^xX3J`n&pidiyYLt*yl3 z+FRT3xVN{f7q{DEbArv=-ESue5nEqxZ$~rf2AB`kLfUQj;&TH|^d`er5rJq}4u}*; zZb}H$Aczi=MkhX=jkrLxGZ;_2tipg$FrtSqA<$t7nr;DiB2j3x1|wvav`I;ETHrSE z#_;JHQxZB*79&}MO(jF1r6|*T;P5D^SfUVt#gC3i0xCX0P4aR?nF!FSAWT0b;>H7D z=(TsDLrRd6NVO1jg2_PFR*kL=LEqqD7vurJlj(M1j{&!erpAu0HbhA5Scx)*aB>ks zNMw42R6>QE?x6sbr%-9-{rzqyGz5mQB_H%tia2n%W98&V`guZEim7#FoY<)@ESs&WV+J+Aa}{e-WdKNmnV<@bof;D#@q@^1rvY)e|P% z^Dysj>hDL($`&k$%`Qrlfo?JB>Z{RxI_A@u+a;JV2*1T$- z;m5I0x=*^d>tSs26bUU7v;dW~BqXquzEoJIn)FcNhQbYB+i~;|byyU_F0qQKZOMnI zL&%D) zic%RhadB2^N)^x*Us1D>zZp%vBp*GyXLir%WB+^@@`efxnn6=x1-Of-sgQ{IKed^o z)d2rTZRUC%@(W^-p~pjs3$7r?AoicFOryjJZzInj7WVz2h^i!+hT&|3nD0(UY8oAY z!Y)9M(RoI!BUuNrH1lL1B`z;Q=0VJl`MPoV{N98`ycrdNeh}qh55gi|hll-3ltpa* zmqkz|sF;q*!S-7fve|nBjF0hw=g?zszubZhX4jPl5H`XR1>n^xg^1Q69@p@ym{@&% zeNSJ#I3Y7rmT8o#-SxP^)g=ITgaQ5~6Gj+05?j5PKo2_JyG1gd4hO;lw2`6bE z7>XVWeUsyKz^ZjL_d2?IX?21)Eh$bfW zlzIt5ssX3hW3%}%FZaFw{`+4Yy3*J+Fn#*?MB(DT4?d86@WW+)>~!idTjJ~M9vpJ@ zLJo-bJGT6cV*Qm~M^J>uuYOPxRdTfvdfbq5D4j|a3KF6BHq<}l@`mJ~PZwIy_<5l5 z+^I9&+{nhp=1a}Mz1iJ;YE5HHeRw8{ZFfyDWu;<^5SvKw?Fw22Mv$?A zHa9axuQ%X=y`p<>xgJHq5pgnicT@X-N0wMzK6g>M$tUSNwdbc_x;gowLz}nmfoS{J zvoMiLB5*<;A#|1SsN^fKw|{zZ0ix|PP_PLkF^opv8F(Bb2g>k|N*Hm*3urlFS*lBn2`TN;UY#q$aO3 zAiyB-odD_!8guc~siVhCs{&scw2VoU0c@RGK7a9|B{$tLC1u3qxy#C?7bZ#K7(dNx zxDqVPHaDDjW1nrHyQAOT-VMh;G>9e#NHg?6z0PLq>lr|sJIBDl&=3|Z=!y4xkx;b_ z2>lmZT4XJKE*DmnGiU&;SIe~KRP1GBA}Q^&7VDF9vJ6tngVK`%xfrZEzyP7iUObvq z7!)$O#;Db(<)%afyuUl>aMNPs1WF8stT9lSH>c0Ie$|@wtCv>fqSZ~txVd+%2h{Y| z#miQ&UcG$UNVCZlmsvbx#Xa}jbMLK-rx1J4XO-S~$K#JnAHTD7RHgwgyHqvqd($`7f#y{24$T_)zRW%eCwpPP-MBEp_9pR?u~`b7@;7YU$;Lhut~?~| z;Idz=Z)wvGK%KCTa_5NOZ^3n+; zA@mYDq|gym6jY?y6?X;H)!k2aH}Ab*+jUnzTvylCRk5xe5m69`AfPmVlAOLFu)_{LVX- z!9>)uCk89uQLD$@{74B!nk4Tj9=Um(nhdig#*RjU$mm!vlGnY`Ye#Z>dvjwQQm*S7 zo7*>S`tbdC(XQy-_ut<{{%V624&4Ds->_mEq}L9!R%YK=}7wg^N&9K1X}1PAAa=t(WCqJ?uVOf|K4woB46rZTcU+d zaJ?lFlOj%Xo!~HU-u%X^Z@}=v_s!2g|HS&o`;eRDkFS6HdHnMNTOwc%laphtgW!oC zAi2&F_4z+zx3Nifn?Fg$@iB~}1LOE7$vFN=GLG0HXaXRL$P~!ufl0%|B$h*XL}Y5Y zMXR!=#>u+i3WCl9`&lC++63wtPr=fSxLWb#nwSp1V;T~L@Bv~aQNZmZ3Y7vLnE*Zw znNFcdPB!8kM!pkyPBmv$Dji@!g2?+fQl%{(L9a0DYHxBps$^s=eWdnOs1!W4u?Dm`4Lryb<9-Bp<{CI~&iP175ffdLKZwGORHw2TG1GAVGiFUWf%vKZbZb0PNLL zp8{Z%=pINYvX5GYkV;xwl1V{AE;#9%vHcLF^rtzdVOh}^?iu-k^wwdLo!N)#|4+8> zKOfPzHaDJDj~h46RNo6^{YXQgw{iz+fj&Rn7Eq**#*Qc-lc6NN=;cDGLs^pE3MWUg zu^xqbuf2|J&}x!}sej9AHsF~uWptK~MB0u4k>yY=yr4n-cJ@M1{`D2MvBjN8xx zKNgb?mI@+#NGYdvj`UYZYYO=Th!-Gh5(&}Btz*ikd65kQ`vndjY?TxnfrPz4Qi6xk z=at1}s?`cP#birTnh~{2fJK9kKmu_j976soK3I;l6N&?c?TFS&!{kaG-#B}BICACf-l0#UnE)iQsl%%Sozmu5-yUg zd?{9KexMaB_XN=FU3h^LJPAG+W{5!xMI->PQ&-53X#;fifh>Gru|oI&NdYk7VC2Cs zn~^SKNNjA3MUK1lM3s*GQ6+Qd&P`8IKAngo56 zV*MG)YM%?AYSYA4D1do{F{}QeS)aoL3H!$@Vz%uUdc}+j%jD7==7Q z_dABg{-R4v8er~GCA9~}0m$w8Vlx^QFTsbNMYUGfafqzLXFE7_B#*1y2ATiP>m5FF zu2p0|Hm#b88e6e$vpI`Z8V5Ccsty_kVuJm7WWe*&QZ z{GDzWAE01mzFxs3$A>DBuq#X`pwqAb6GMMGIswpT$F7F_pycGNBR}lJ1e0+peUwwe zIyG5hVI?c|p%8=V7?%=<6`@VYii<<3xQ#K(ZShVj#+4eDTJ;K<20w6c2-xroBTd)A z?;ZIOq%9^G%xPwn8$c$;We*%OWJsKaZE8(FTt$f_rk6 zPOkxI4Y>DsBN6(cD%v=KcEu8HpKQ!YDLR2P4>JpMG8=O;OEM>==maKb{Rf*qsCORU z_1FLX>#pO(ZZnvf6tgnZ+;?&?vg{HlQOM$Avt>Zpd>lP0eE52tSq%-zYcp7;=`9J3 zF?}Zo6CP56^tl?KY7Pm{gwk+|S;suatV5RGdq})nXES83O3uhRmDzW4m_i3DWEBTP z9bbIl{P2qoU?TuRnW> z_-#$c?$6$Q=Z(*HL)9#kEA_-3w27y3b=#3mA8$I+wh@k`)o=mb$Nps_Hu`1wB&CV# zg4`EReNU8PxEmz?1+8R%H{yw+`iZ)tYt?DDFqUwpReR9Wj!)DfjmyWUKR=CYVNG~6*3*q64~9i#r{raiL%HxQIHWt zA-M+y?%~HGU$k*Sxea}_@y$cOmC$bw*vbW4-VW{_k;t%e$tTr71n`+_|&rSom~eb!V}~V76YY)cmLB0>x!2?U;tm2`E+yfQ`b0=~l)M z7=V<(|I}yxLusKpOM=Tq_ZTF9D0?GVNE`(#4Rfjsx=aFe8FD#=C4r|29$hYB zrYYbL3j{7GGFE)BuxVdjTiLg-iiYC~Cz)TaM#15^uc3VIIA4N~ps$ORnE%jJsGjf(G;bJzQ2znWk2|nqda2A}1OENdm=Y;i9exi<06<07Ia}MjZ}cP+F)0MU@u&WfYUTx-ftc6Vj|HwM{5H z^S5Ki>Nu1RRbNn6to_Q$;HsQwHp5s1+*->Gy$}SF(BU_4z{|voR-6I`Dn&T>AathaG~LA{<3X zzP}8}ZNkrG%;Cdj(3eCRCcl1B8H36LD$t0$nAk`;{aM_DCgEbL>WDsvpl9Xs}&s%`e#Exwl8Q~P#kwY{~6U|Jli z?bSNcLOrKZ8h6GSQqc~!sj9#+gr83avf!b~hBI8bVZ*Ci_n+#qTY66I-}>qXqp@ZG z+vVluZ|`q0I#PEWu7gI@cx=aq|J<-)!;2s6ci<&)X6%4c90x^Xr ztw4Mp%6$~Zjlz)@<>l0u54=4Z>kWpYKu^`0qX4ArsfS@=1$d+miZkXHRjD6*#L-!YI_O9>VRQLD~o6ra$%xj3ViDl7`EF+M2?P}IhhtgNgI zqaxV1Gtw?1sVgsd-lg4c(lE}ni%6VgoZ~L+9U8SjmXcO0L*bTWWpWFrK1`YtwTVr= zz(4Q*v&w0*3_k5VJy>-;xy3lvc*_*EH*fH@hrNfdg%_O`f&7iNTw}or%|A%xEU0Y^ zymM>#Q}|lNRU#ESC8HoC#e~)=buF%*V2`UFq3rI?mdoqb6$S5lRcv;4 zb{wMN0h2++hvByEX>C5tpt+DO>1=14Tc(S}j*_3N2aqbuz=)6ds;V4G^Aw6e0}?b3 zw#$?A^PN8Z0D$6*nL2Aa9soNJwb-_#qR|-|f9DZ+Ot*a0uFCaukd68U(0}g1f8TZelpJ;U{+C~V`Q4X0D4;v5igb2! zt5!KuH_K$-e*6ZKPd?jzxY_G#IrjBdq)NQ={=2Q4$)`3G45vVslhD#>0GM)&U4?vu zNPDHn<4Em7RW=eS5P1zFQtL&}1t6RH!wQ3}3-w_s(2L;~=c80tz=WozDDoFH284DU zshtcHn>7#uIaU|!bs1SDIsgOj_uQeQoy2Lg84%A*&?_x4CM*f^s9hCMM!g-iU0sgU zv%S5B6e~;@SqQmUq}zA)4E#(X=l(-yk&1?N6xcMP45Wh~Atf znA0~(#`s3b7%#yXFToh!AQ|H&k})n&_+ZMoy1RR+l z^?NM_J%&6VdL|S^G`>VQ4$oY{)YM@M10+0_C{2dvD81^ITW(pic=4Tg+;PY3c~i2pveJi4RU%Dk@T9qO2bh|gn#}1# zOJ~HzjiD1|5b^@i@4(}Ab;GPt>3_clmSLe8`KtSHqv6vZz4+pbZ~Uv*U0!hDJwzei zd;9HoUV7=Jx2w94YeLSRt^gM5*C&DO@j2W!Uw(NMg$jHNW>G#q3otnh@w+;DFwCe% zq(F$F9tysOSCmk@4x&iTI|{tiC*VXWI!=6#6Of+KP!9z%?LrSPryFLw2lg>qnf73k z;gh2bu;Sn*gi8w!4>%|Ae;gmeq{Gh&Mnxqk1^}NNM223BF+ZPf;;cLfpSnw_pv~L~ zAY0(nUeXcJa_I)Rdr33O`%RL7!KqK znjS}+2FZdza4n|^A@9Kp{v><+~ z?m*izuWm@m&1--6$Rm#kkXHD1{YY~MJmg4}q6Mf>;sK(MU`Vj7-f2V0(EKGRL%roX zp$rw(YpTH6Q|F_DufA^3oW z0%J{pPDN(V`$B;#lvSBsha^%D;KwmrS(yWc$qehr2!{jc6WQI`6okVH5Z)963w|!f z)zJyj2IT}vDKZOE9qf7lp4C!WT(Z-gKaJ6>+0(ukU}AR z^H8S<+#AboXqdn1p<&G33hjHs`#kNSjqgI=$125E&-_~@h3x6R@9aeKMF2vb^sT@{OX z=3M?p<@)1rK^=X(n7@PDhe3N5|Hg5T%8h2ewe!)qBgc+aR#sIZI@3x+2_4-{N62=( zh36lY`#n(|Fdp-f+h$2gNz$339oU=Nylg%hj<-yj^e8e)0d@9h95N;g3un!mk(MEE z!ZWV->t~Uh@s`=MABF3ezD2N5RCt;y$sPHsZl6_Srd73tI7)}gyx5U8J z;Z$fN2XK0q`Y~9fSl~JlC2cs3!N`hoks_jume3n7p+`|VQ6_-D6Vh)HNo|m%bLZNC z*$@u%VZvf@$FQ>cDumtXr~BJA`nJHW`YgI0upvtjbtmR>!9%BtoS!CMRVN%F4_p6EPha2g{=^ zgB&>A;V62FLw|N8F-#YuK;9tR)1!f(SrM1vZF0gLe;inJA-j$X_0sMvzA)F_Xp=Rz z_BtI*d3g!H4i&Cz4S#y-sXssc=M7K=${u^|PsmA^J@!O7DdIvl#viroJl!o_a9Nyd zZmKi?*^(JzI(!&R!(?)I)V1Jq+H7`>Tp62@ zlRYSVWL!CO*If?ewQ9|&lgy)_Afc^q5&uWk-{1bnOMn08dxy$t#qnbX?6U|+%VIL8 zbQMC|LHK_d>h!0Askx}uUx3`nCFIR=)6t{IP_3ysdp>MnSP#?}1N4pdrpD&h4qhAa zL>(ptgbD&sjM|tiXWdXkXf55~+>AK188hS30lf;l76vNdX{~9kg*su^uqMuo2_zm&M2M34(st};gqM`)qtI+`r=p>^O zessCfn4B|v_E1wVk|KMI1+$S7p43Id3CKwRlVNuko05{kc2z;ytaPM|8yL5(MsVTfH3R5c2w+P#wQ?q}Xil?Lq6vaCOCp z8*Dt^Sg~>a`t`3>wD8#F%VOzVmqU9)AXvr+@dI*H?I`n2K`mC44g+iojzNSC`X5Xx z6icD#74sWE;0k|-14;;j0ojvoUnv%g2B`O_QIP8`7QkB}tOdPK8E~SV9H3m#SxLaL zN1_NeRvOcTqE`++O&SCZc$GFbIi!_Z}pEOnlr zJAZQF$ZHll*zsP3|6YiJQ>wbA2KAZ=9fs1ZMDUE?c&I z)qN2CTW#f{czTYCr(eX19s)fxDhn)#de)uCBb{Mqi|0s3Z5NTw94<6>h%7 zw7ggg8ykD_BoeCY08vp_R}Y)^q8VYShrdX=ZC2Dpt~|^H2jg1Pu~{(las>RciF>U9Z-Mok|%3xM*7h=K#mW z##$^0o<_Z_5}pZs)J+pxR<2yRV)?RbipEX4X<|_kPzED_tpPfx%tiA?;^TTcP&i+% ziOI`LO^=U>%}8;?=yXannFN{w(P)kx=#+Cu4)x7Kisbb_l3DnKWES3pSx7wzH%VsU z3dw#pywJ5v4ng4ulzA827$LHMKimbZ5xcP|9P+r~KMVOFP1_slzkwKPw3Tb+3PWP1 zxZyc|*qc<&tS+E+M&B7>DbrVk=!Y-^ZoIJsg#a&;r{(MJp~W(!9H2L!kP6I}Cs0xS zIsn9XAdp9o)2NlNVbWpoHA03|f%4FKD$@dYuI?T*7(s=~f zn}(i1;(p7mw=O{^2M;-i+WHRw0!NQiz(g=GX-p1~H@X=UGmM$Y6br{0uZ>R!aQCm?$Zu9wI*jPyT5@`>(!S#XxW%roiKR8gR54R51+q( zX9+S-nwy%MJ7fu3U8K4?Hn#e!&$eyb_RYaspIqUqKe2!F=FQs=p9_4Ant$-v-QEg3 zBXL?IExsE*FNaYD&6Ub_pw$vS5GWtMwbQi|VxEC%tTkKFeFg=S0Kxad=JB8$6F^EX zFVqZ=Kj>o+F!y6J<>zH1-I*!|&;r(psl z#Hm6G{BrN!%GOSJXik0i<)>Ru>_1qs4?FGl-6#L{(MRYwwVr0~`TM54foBXR6$>=) z1XEm}zbvT9?C2=ZdzaKbh2*YTGiT14Fd}zgX-+}G2OoS>UH#p6-+lSnTd%(S<-az* z_!3-x&rvYaU&)_%;RQ5vF4xB7XQ}1s@C#!RBmoAN^?4|&qFg~*u?zQlo2pJ8^LWG< zynl51XjXhSP2fvN|44Fr{y+o@+y?bzEJaWiU6A)r_sbwpMMg%i1}m9 zMpXb$*Nwt4Xq6uLMifByZw1ijS%?^eUL&)n!d`L=g{mVu*qjmv8$K^HQ$<~iO4Llr z098h!3UXOlKA^U!h&YB#oib&@gmEJ#LgV)j9y@7LW){Rz#*oR27mpn~ZFV6*Z>}CQ zX70Rs^JWeiGHqJH451{RwrE3Xyk<2uUWW{uI2B_437f-8eQ4LtMFY@Oc|8;-2pM^w zZ_XdE8(G1L7wGVNdGa4S0Q2i!ps6t0tlO@gG-1Ms@r!bBLqo5>_0~yNI9>7!XWYDe z=)@bAto+^YfPC_p^1l222w%hP*I^~U4#2WKfF{YuF$f1eTZG@gPTs)rGBzYwi_D?hm*2VbxJRyKS`WStMen_L-gy@*^_^ENY;$tR12WZ@^DJo(Biue|*7 z8wZY(^_b9H5G4$N&U3ogCopmf>!DOAXv9$mcN$RUyge@4Ww)GZ`=ji4^-UBAq3e7L zVm0+h=5EB&X@c$I@^!T}v{CfsCcvmdrn*1<^vf?RDga7SQSlYPfwz3RRrbz1*q0qf zc;}GUL=`^<=mV_1K*`ds9w?inUThA^vaouQmUFr7Y8o>v-PKryRv$;3n<>mmUCYUn zo)%0X=so-Q9ywW4B}`?l79GVp8m3GchTdkV4aOG|ccx7%lnu%y18wV*fD4PwkdbSW zaTA!l?hwTSBeGz*S|34KhAd8_vt4$Z8+vGf?4zScjvYT<(^}mEZKk36^UoWcxaf2@ zoj6o=>ev}-+n(<2g=e6u#-;)CLJz=WdwOc^(8svyN-U=JgIJW?VYvm7B?iEJIASAu zcz5IquMcXYr6kNbH`wkH@B5l?Sd{r-PH z_i%oDSak*fR@1j7dGdKJR)sBG@&xpx&qDg1}w#_Q~H&(|X@ zq8RUeMt#E=3p7c~7{ni*!PfhnO|$j6w?C^mc%Bv1q|2sfq(&IK9G*{++Ucglcw9Wna`L?nmUS}(a_&AC#(cq8t1s;)a}h#=$`iXriNJuQ%?XI=W_ z)D$HA2@RWhjVhMb<*U^ejS?At3Jp>-lWYY!d6{XMS*ZgGatFYQ%g)Nc^s%PqjhIka zFk)T$qm2UNOtdpxyTH7h&e^5e{>hK3-jkH&;(io=b_&d#?tQv3z)DtcSdCb$#dm} zEP&}N<$3QBXgGLH%#@LWOoj|zi68p%O$si|9bz;PTENy9>}Oczr*G}uNzQ#*!r#ts z2L9grZ*46vW5$fJt0uH&>Z5+!=5jN7PA|1k=^Wr;|fr)QO5lF z&vw=GBlfNeKK=B6{AVfTE;1OgW&&SMCm%4mWD~x2GSg=Rim|L1W^swVh`))sY9j(+ zyc@>F+_FpWx0sW0TiK0aZZ@yL<@=nOd!K)t`+`RU>oTDE+5s-Wgpm_(d1bWGsS1G)nGS`U;#>RPEMxV$QOVv&j?SvFDnmRS`wd zWg+pamM_=uXXmY2HEPstw~ZRLD!O#(OmZ*0?+S%OXEq1Wy#{fF&aA9H>GESX&I!>2m2hFa{yhiuwN`8c4NbegeEpRH}{Qc2TLuI;nhlXn3DYyX%K! znlvZsa#SysY59~Y^D(8#l#3MSixf`^6z5Tj%uPQ??{bn`%H^f>h70sIh&}TSyyf6I}dR+oNqd>2zkKS&9 zo<^W27wB=n7(I(X?}R|_SRcKZzc4L?aVi-&oHII@M8a78kg?yd3~Aop&wZXP0=;;F zUUDD3$X}RN$Z8b$6J}Be;3b)R{Y;WbZz@Je+TU85-9mj*Q!sv0B;z+vvi{Sn8tdSi ztEoLLB+T+P+qYL$ZQtI^!X=Ryg}V;1e1wu1drU?~OADc(C>a@0w;NgGph9&1(y_=bLYun!fpFY%vX8qx?ra7kw=PW>4eSu^q&MTVSByA)NK^e=k}D5wVb8C|k7X z-~TQ_tQ-e>ljfUZfTt`3+IA5n_RHK#;dqTt< z+@K$CAcR~6{4*>zRObNk(O^IX$N=yiyigLva}Ff6&%ElYt574U)l$3>g~v00KDzQPEJ1_X?(US77?#VE68UjDSX>01%wp2hT`poWxm@Y#Fl$^~Y?4WgOZ*g_P_^=h*E&35 zSnF|*(6yck{9mdsJzd28mdb3QAut{XFl}O(s1+jn%Il$DX8)M>8*HRBpB*Ud6Tc?8 zbe}-Gw;W27p&C;$suv~;I|V?yf2o}!UZ8r2Qf0mnX!02%%`QPpTSzG~3w|+rDFVF@ z1bQ!v^lp^WTOiO|`is%)66kdZ^qNF^cZu{20)H6-z5M^0-lhAJN1*2w=(UUVt`X_E z1bVlMBlyaN5ln|%OO<#N(k0%6A&_h7m}=<~xt1=GYg%itCX~w5D|1xmX<~>jkV+cV z1Jw;AJ#f~cJD?mVJ48lAzmAOL96I?CGCJ}NH+ACJ64hHP&N*eNdE2%fs2(~% zQVQ&YtRP55-eB!sPKqZB+ovf?e2sXm?t{gb5P{Y8~kX z1w#umECVMO&(A>de<&1|o3+tEdt&~uf)`%cda{Vv6{`y^9a~-yS~sX3Sh{te+dS^R zBJ$@l_{8k!hM?)LZj=K90X})V!elidx@}{QKTR9Am)^K`?b_?J$e`t`KYjh#XP^DB z){!!C;Yi}g!xEk_&3}#ud!EIPRzg$^AY(t zO+F$|$?Y%JnXfKJnBsI9bYOw>`LB<%4Gk{ZOiP_OINpU+C$e=GpuO|R8u)H#p4Jxf zI9o`j%mR$~Cww^^qu88qtRvqzW^u(hmUGVm+c^n%1;1B6`^v|gkH9Ii`+9T+h)2hg zz1)Y~n|Q-B+^_N0Yj8ZsJqKsZDm3*<;0|*SbJxh~>c0N>biDI4^7G>PW$czZq+JZg zSoqvQdp^TgeNGfSNdfW^7woZ&Xa}T9^PU}gMAgE*$ho#=)p_BcFz6klP=TFnjkClj z8(FOh4v{#c$pA;ECB}#vIgL4IKyncCYGte$jWXZ_>QzyDm%gLlszm(aMMB95`)P}H8!s&W$|1`YAi&MxZM9)BkCxZ{S5>S#e?V+RVD zgWf?|P=w+EFD+m^pPK2yYB)k=0x{mKg!8G`Z8cVa6Ou3jF8jYTxH z9wrm8rHR)T?iy@scG7JtBN3$Y!;oDw02__)SD@W5{=r@KN_N7fT6;3R73LJZ4Q4mJ zfnvT$AkNfuV^3wqQL@ZvO7OB;?a!r`A<+9wp!b$Y@7E%|4uM{=KyUtkP4CkECMeL0 z3iMney_KL>53RkM2@>YU0kBGn(K=u;lW~E=pJUNp`b6cs@I*-z`TKaL1l0?b!c(2j zy+AdU<{tV~ZyiIQ>NQvOKh;a|BBVXY=R$@TLWWB-+N2#*QqG(?cI2#k_im+f_ipa| znccy#F*7sM!0kqcTA9KdP{4ccFhEIF!Et)tt;j$pQb$T@>8z`l-mz|7Z|}Nw%jT4> zD~UPv#TQ?=#;(IcRC+wU6rRmtfP9FcG0;?N^dy|z4#m=?EACkRP%(N@f5x0TC7jts zbCwp7&)8e!uhBFy9843sSbbK8j6EeA={SRkutNsVX+mFL7TKyo%{JPF0f%D-cM?Y} zq*@7jHtpGSa#ivf5?l+`_`bL9y-V%&XL!1b~1?wHi3TyENwN6 zT=J`5{i+m2pf{ppfW}BGJRa4;t=-z(9n}ErqEBx89y|4OlAU^sWT*ZNqr48I{0GTS z{RhcTJrz#=f7AXITefZb_nY`(^Ug27L{qfG2fo^M7)220&bD~maKGb)7+7!1kqRU* z!vpPWX*s?99rB^g43VFjnWzr6HMaHm+?~7#x6l zc#^8?+_}@oj~+RE_|Uf%U%ZM?;!E#V*w}+7yX=g=!?A?P!ZDB;%nWBn3&#xRI_4^7 zHdDyt2?yXrNi~eae<01_uSks8fbF_GZVtduie^GJ>A$=2cl-ez0A3ul^BpPaKZy@wpDxoR9eyaDa)rV7U-SQJ677eI?! zh2uC<1&sV;L}h4nhW3q0LT}GA+)m;628$sAn|3^!kI-W*p9Dw&p}7#+2Q$csc3P@FpHFx;6rKP2l$4x32h=AnKF%uEVP2d&1 zh#(;;9(WQ_;AzL(%nDbBpOO1jiCKA*CuEwV0eiZ}ke*;fQYPbpYdH{6nqm`^;$zG) zagfzn1LJJ0DZvQp{kXfA`gS!E$)SPdz(5eGZ&xLe9A#`9I+?(!`zg5%C+1c72%e-D zPeGVg;sRYQ@Yk!51c}p1l7$oX?EV-{>QDZ0nrJ;pKdw`x*(uT#m7ArYT1FZv(FG#W z>nTxj_x&-dSLReBQavnE{jQ(W9sQhoDADmE(TP8aQ>xFYGJygh(dV=heXfkH5ozj0 znn@QpC42FFkqS(YBmyXHXmL6%L;YyDGGyWEzvKC0&wYbPKTf2d+RyU`{X7RK&({b% z)1u0s#PyY*bhAh`S)^+1r)uk`YNS-5Ceulf^gYd|u>=02=z`|FT{4gNV;(<)NA*|9 z4)~O09#3P4udSu!o3HELo#&Ax(BtcD>hur=7xGZW9i7lAz$Aca+$vqj74kIKcbY;T zG>|*iL5xNd>rx%uKXhoe2?a>NEOK@C0?!qaa_={Q#F3kGDCp$iKu3Gi`KA`99(aDk z@&P*$2%P-*V8Ec)lFkNfl#QG!KVMN_?@P#cunQL7S3+#i((S_@{LRW4Gw;0r{xvsF zm^x{AZjwoh!gKtyx2qY}r+N5@aie6GoH03rr_7zxW4%`FVN-6pefCh~U(a3k;6t&N zlrd-|WK2vT62JWmq&pK7fkgV5k+5dCROtSCyzUif@`Qb?JR~bc~q}z5sNI<6nx0=jl5-7M2hP zny+n@hl83C81BE>R09VN8>rd4cM2kH!tof{fXrUI+*y72NUJ?gn>Bj+oRX3v-LV&5 zc;R0!Wem>E&0Prpq-y!VbM?)}2`fvGBY{JEUv9_7jgbixRC_i$Zs4|XuW=7>3%TpK z>#z+P&^Buu_rKg)?q(bh!AkxFZIU{HcOM6hZ~}k3>d(*bfzos2e`f$YJ5xBW=O0k~ z{cu(F{zqx|&w23Dpv@k49H_?274JYeZ~o^ztS&}z}dN1%Zj)n zn@tyrqE7|TyHRo&bpT7%*Xy$v#3DxoxrQEleqiVnwK|3jUAol@M z#H$_C+L{`Wjl?m?|#2DF_6&TAB(-sugx`EYO0>j|M*d~c`)dk+)p z?RNIIcBlee)tTBR_*;xffL8+EkAnAW(PYgoX94by1f_r%5i&HW%`s!^^+zdo5Za6a zF((SxDr~2UP}3>o@96a^KIG7W28z(3D;Sa(+XR0|4Qm@X`${uI(<>NbG7?Dikw8;D z+E>dhCPg@urt=|RsKd)y($f6sZ;Gm*5CC1#6*r21=|yZ8ZB4OwKvu1>7bw_J06k0i z!?eSZ2gtN^3+_ZgSO_>EG+#eLdryVJVU3nU62Boi)oSHJjIJ;%JKJK&MD8N5)0?x^ z5qrKjk_aWu8fvYp>T#;LWGhgx2CKUc9XeFg7D^gCI6>tL<>u#DNeud@0k#Xb(*Odf zbmwq8;fUF2&sNC+mlgqR7V<7xcULDZIPI-z;etq9i9)483m7b~K)@0sW-?y7^GK_h zs613bHc9u`i>0szMg~M(2|#Ob@{vbyVxEOGY^Oh;$1vh#M(11_KYgkUAWfIwWu;Uv z7qz{3XIG%01E2dMGVgJE3SiZJQQO}Gt&&DbL!^0J zq*--==EI;_#-4(F1+|eP(R@nu^1Gar)5|^Ii>c;_R5y!Mw^OQR4Bg|7QflW#qBBLJ z6Mqt?m!o;{m~tY`kVsQ4()?FH%{GzdGJz)A!<79XRjIb7y39 zM4G4iX(oy^{UXg&k!H+Krm4)lc$HrKY}-VdDI(46ewu1ZlP(t}mdj|7adQdToeo>G= zmh|*keRJzcC@M$l>f0f;HL3t^Q%}3Z1XAL)kzf?!EC-tqg;?7FuWL|VKy0R01nc&(@Re!2aNW^RD;NM)xx zcJwXC9lmvJd=tf3JnBbtXFZ_C)H?Lq^#Dyo1#)s@B27ro8Zu_Aaqp%buFCKB?m@9v zBxcYov;!Tg4c8y~$}uQ!%-B&$rGNP20|10wI5syS1Usq6*;=>vt>^##kMr6UBddTA zKk(-1_v;? z-+$^OQh8|ao|j(Q70#Fnr>+3^s<fa5y`26QcVf?|hqEvR;;M;J|& zZ{Z(Ne1TGcuOFSwFM%O!;M%xzFut339iPOke|kF1@A&}2d5phB`PbdB`*%D!3oiMA zqQi-E!bYD0g9 zoTKeEEj|=q7NTwo`YDhzFsM;LSczyYN(J)%6|#V@r=zi_8i)|g}SYL-93napamAtH~BLI8?ck0*_t0B_UbS4;8QmDIVG!TYcfaTD0f_D@ak1d)z`P%7YCjjxd zXjD$73F=Vt#JQ8lOr10P+LF2Hx>=KkWo0YsQEbqp$(r+9bjP@58kug>E3}9KseRhC zw0NTeP2@wYpF&w^t%GvoT(w_*c&@Rn3#vsZ?DF9*h*zdn^;h}-*d9$SH7!>E4_j&h zz$HUy$^mAGlOWHjDMmg)Q)Zk5vn&!tLt^2|Y(OrYaFs9wS3k)nRzVU-b%cwhPXN(B z5Ppv2;DjR8GBT%szh2F4v6aDF;HGc5RnQLD2gt&H3G`!pQ!U}g>Bfq54+(VH0~e^? zE>Jx#Qk^1Fo%YkHUT*iinA>EL>W3oL4=L3$hVGuIUnyg|M4}5sqE}I(mwm!gE#b-| z+$qxR5NUe*IVEp_DyEV!nnpKlGvO+GO209lxe!-Zq<=Y{FV+}nd>71lMEW6-=V$tP z_KQ530sgfNgjb`cdYSeG2`7j(`DA>7h zjhMGJxwSPpDajD12NXqpz>t)em!@{XN$gUm?hn<>#NO ztLtIok>3-~_MnWflcPXKv0Ud_N1E50muHM3N)|O{0wyn0dJVP6x}&6I#~W{aS>;E$ zj=$>5H{5Pr?#yM&md(u7xgCff+=Rp!9*)vq(WXZ@?#1=}aF^2Kz90HMByy$A3QGbN z$8KjQEpKo-yY+hX+<@~8-5~W20PeN6_V$8DcW*njvjF!Ge#L7HkrmEM+8su122zko zi#9PX7y2m#0uh8N9ce)3m_IxZ91j|fP(a~0=`}+1R@7&4KxuDngonQojo}g!tjP&T zB~M6BOK_yc#ocqy)G??98aWk!t#ju|uMxtxBB}{UFd3n;G)z?J&xUI#1-S0(B6AC7 z!%E3)kam%wsMEJ#HmsD)hFc`FVfdLdE$-g>W5>4C1}JPzz)jT3lwNdK+_me#@d4>- zU*j%l9P&@LpYG=4((y3Zuu5&ujm=VZ!^8|z$b+s%kDhRWa98CK3r%^qg!Ki5p7TIE zsc|`mj~_ogEhcO9xT`W)AD$|2QH6rlvcaRq|K>M$Ubp?A&rF12pw*hopH{{j_kL-j7(xz*CHa1qv+T*)UAMS2y;$qW*yfxvf={ZG3d9f28DI$N>9oe>V z2#HnY^k8lsj%d_z96|UMR`S2qys~*y#i2?#7oMFB$NFqO4GMt@Kq-E>+mFjCD-Tzc z!iisqK>sbwKPyWGC%gx!&i{O7I{XgH@fVhB$8`PDRz^GMb|oCaF@*Oyfv=2)El$Vq*jSUrnl%Wq_@q=+1_G^3uLsOSOl)p$b~?{!EwQ=4 zbBq~YkZq0AsbF}NF+DDOZaCcTm!Wwc1+`|d&EgwK5qOwsh8naA4tfh5W{%;bM-Lrf zHOnI*PUuh*pPH3Fc*6LcywT^+x4LId$xY$UFI+f#Qf-SedDyIl2nixGuCl9Tngp#P z)&OWNEBX+}A@><=Yh1A?6-*+mE-lB~19b~s@rIktdW|~L)53*aZp?F&#*&JztjTfa z>gu|-F~j0j!RoPNhYmPe6;Q|JjfELs#%M4L<(gT=vAOZY2?ipOlhq!VH=;6`A*~t4 zhvHx!2-V@RQY&V${r`4Fr>G5lENTPKUa(`=aGzi=)}b62qI@NcC&cl6?*P(kGO;9+Bv1k?1%|^cUC* zJ4Kpik)~OsxuKsXy4XwUtb1oj4hDX zQQlU@wu?@JL4vu?4k82bOKL&Wn(mt=bfsATt08r7g49JDSkhnXaHB-(4yma*ced(q z#jdZv{dOOk`YM(9ws-HIonKcrw$)^0DBVr?ac_I8*O)=0@<8LaYYaJ~M-NEQ!xFS5 zdD@Tc-u+!0)@hhegve!EgJ&RbD?1%Sii>AmxBO1vN>OB~M;>uH@$I1p{^#MfcP*V) z{OPBS@pIPUH}jJN2R`NBdiAYtOa;l%2CB%^Wi*Cnw7axogtbpf5B^-@+C`_|LXU15E^}pdUoL|rl1AF0mP{}eb*lWVc;_q6unJeAWtyAUQ*0I%s9=tORi9fp7Nj`RLJ^u;xbLO+5&m z=JGcyUfz#Cy;%ymT+Exe9!S|ec&td#QbiH|j~H{|pf|E6TdbZ+TRs8|c9oXtZG#!5 zH8_lZzsnW!!ELFKE1(G2tgw}67L&i%-{p5Y{h=_eevHW6olbZ>S;p(Ps}#J;rAx~m z2&+$nI-q%UpgcVu%|Pw>|xj64;LgGVigW0`YUT{wtwMZ z{Z<_w1VFgB9-jiTTIa2A#kN{??t&cs?^oPuam5YpUvabgSKRykD^4S>xU0n#_lNIS z+)v3u{;`UKsE~!6B-Bt1ExW24JyHvI)e$;;R zi7_vO81piL&nKy5`3QUpaa4}RywqaME9U!{*Z-GGM&Pnt;F7&8my-o9C;mcQhD9!G zMJ`+Vx%{x7%P8e?h{)yO@438mFP1*pD_f}bWG5BP3i1$rpn0IV%O-lVxo5dYup4Ut zZ;m(Qp=T~mnPkBa?Z%hV{qYfP6?xT&ywXlU7*T2)7Nc7$jZzCkI#^`(I?Aj#k1ie4 zpPL1j-bJ(SJ~Pp*yC=mg=qVhOMC6CL>AW31ozB~9mi^GYm0HDDe!2t1*hGaGo7hTY z6C#iIAv#gU9;Kd6x)l$mr$y8{y*!uF3YPwi{U2MO0|YK#pj;O7_lX(%{DUH&T>_u8 z1wL>2Nqk;;?;kAkxl!cvB{2r`Hs)CRF24}De7KLx z@!%5Kg=RP7BuwdacpMmTsk*!r`gx;i7P;Ija{1PU(fpM#nqhG?ZxGqM?Ux(PfdZc| zi+rx_)0O#>Mc7ep=jPCrxf>P~Dm^HVG@t&-A6lE2N}wP2&3y}X5R-EmR5$np z$$qLs^{q||RcVl35~6QdDd@+rLl9piW$+de1!k^7qOVH(M$q~>g+y1Cb1d6E11z2wFT;F3!;v`1IQ)pZ;4(%!B$MmJ^1okWjc?q74tzgy4B#ElHVB zJ1J&EG-|a1tMl}kGbU?lW=334190bLnXCmtj~dzp#~k%Ip-1&p9XL?m!>6S5^w?xQ zJt-+ROF==Vo*X{xH#6~Q44Uk%IqVpA=sf%mb;r>)?#peTBQ15rh>t!32r^!0KHIc; z+upSH3Ito)ljj5O;cEEcZ04}50bZ*5rsih1DdWhIu-4@|^zKq-ng1+V&===Kt2eRK?uxV3nu1%JkyJ?e6?sog5$Tvoz8#}wT zz7!d*ar9vS-T>r>cY%g>tNd?B$9QHAa$qMQ)1N}v`H&tcG&2ND|03b47wLkBanN%V z34ZuOl3*!+51)kqzu4?BgTGtx5{mj>#**2CTT(Ez9Tl7boUXk|g$7DC8H47sHcK$* z36db%d&QZNL9ZnKpo4KMkQa~ldt68b?(JpSUbK>x%h3;{yVn==IeXwSbGbW%$bX;a3IUAhpxIYb&PYqPYpw0TK$vux0)nP?$D zIM>;H`6{|A$r{Nj6#UOALXGZGp+@&ju}1d~+%76>P!kMUV;xSlfQfhgkff3B8&}>P zfp1L(iBpVbheUh)B}@(>DAFQEvr|M>Jzh}NFDFlb?(Uc=@VHT|eEy?Y`CLXTpTQ+6 zk-_B@fy)KI5SIxem%BwSkBMBq($A$=j^;MpktdT9deeKh0_oWk5z>vhLiu^!|)KLzvg4XD0653s^~I^Rl)1n*hUbANH!l9W_Y)-+{B3e*U zLG~+v6r6-PkTz}_gz3C%YHMiwIpS&c#TZnU!AR4~HSOO&qCZU!dGIt%&k*Eehm9Jz zabsx01kK)!j+<#&H1?ucB%6of$O$ObaB(hPk396H{945(UlR60O!04*LM^mf8-O=mkv%(SMb zqc4k$_P$hVYV14KKX~G|FgL<XsR+%MzLiNdc~ z6n^7=P{#k<-8vin98rHBqLx9qRj>^Hz^$kISZgz1up*~a`~Xh zrCQ)}hQMXXFT|x$qaI3 zbCtm5bw7#AEAQ3{k<0HyE>DPDiaX~6;IjmM-AH%)y0P&T?xeXp*X>+4K_4hYp=n`&>?NZDm%f#4Ce1};pZwW}mp}Y$DcQ$Aiz>jS zdf#G#!w2*CTHmGrB0Cs4STP$_?T>Od;_Df{g4@9F;jRY?KC1^@3ZuXDKX7-9s>|c^ zbg4QO0X3TO;GhLu(4eKaj*VQ8;C9!{v7^V%>}sDroP^4iAv{Oex6=2~r-7=o>Iddu zJ^z8~wFqf>%F+JUK)fDtea*v6Um(#;S4%Y06`1LlqKVIwXr?)P_B1xa&+zrW-P^bB zJA3jlveOZ>@wInW;kRi2jG}skK+DX%y;f^`O9wJWqWHVP7-Lf<4llxM!Z4f6YVGYU z*Q{H|aj1{{&BG}FEKB~~s@s<=Lmw{$boiW-dxXNt-d?8@k<>DCO3Klr>#o%xaYaFQ z^`OtD`tKn@DWUJU3lauVb9G3r77PW}n3W*iED zzOqyAr%^be&_mhP)!EtAh3WMK$mHd1-aNZlfq-NW+z}1us%*31^tg_nA{=v&AFbl! zgFd`+B(kQZB_+Wllrm_XO*J4FsWby~;i5t7TfRKUZ00zCD54c|V!U4L5{*oLqEQ=w z*r?SaaZpPX_$Zo@+0zL(g@8qgJQkp?Q6STf)-LMlP$tgWp*f2Q(uZKp>L z3;`1g_Y#%vM&wNe0!VNSz}rCYieh4EoDqwfaw43uN=mn?yY zXV11RTfVAl;ps=A7I1*Fk>>d#fQTR>O8?5x7y#{0;|7Dh6c`6)H04xfSW#UxqHwfL zMsK;#-*&0gliJxo1q~}Cphal}w5ZrVv?%jmsMG^m6tt622bFprf4|iGv3Sju^Tq4M zJZg)WN1cW_^Eax7q?1?a$x4JA^@klUQRdpxjcpi9t{GIkjMhUSXAJV6?pUs zJTku!k71F=7?H=gejYU0T|>GOsj_c9FvdkwaReDU70!4G)kPkwc5fA^Sat|G$}YhU}-$Z8%wl6H@@1Ptl)i z(F+_WtO9y+kq&zD0Yv@snJ7Pp%QCiawibwdj_v2OiEN})VxXzubcoc^(;0!?Ut+d$ z!bm!Wkv!cul8667qe8rr=|Y>34jL7T^Gl;b(kQ%C54p0vupi149_T7ChxiCpE{d^0 z#@ou6zmOuH1{eCPF*|^HkDvVTyGyjp|DN)<=)w)kzXD}M!9~h{V{$?HHBg>GX=xE{ zz^R^8&{G51*H4*By&uBb_$g8^;W$(;QiDwsiWfNt4?5H?Cib7y@8(f30m7tLQ|Xt| z^h18PpEr{(u34d){07QVvN)5X;!H{tXVOorS-G6`aIqGDj>f{v*jRDJOa#pr`t|s= z+{>^YyrP@R>40=*Uk`(s}zfHhD5I#3%zOxEQtJ~3)<`uiCz`AW%D-8`JFoz3Y5C; z-m~l5gC|+s2;*mMOhFHAyytGO+r9hS1IPT167-PRMULqvBhuq^-hcnvhkpCp65uiX zi+s#16KWE=C`N3_~?{@gXc``vGg@#)*iKtOHF_!r<0i#NPkQBhe5Q2E_^_EmiR zZV^AIj6NQQon~W(TWvs9s`C!Y&K{7R#X91=yt^rA1lT-MqV+nUF>oz-hKTau%WTtf zTz5ERvFNla&JkBv*ATAl=!is6?F2J3;;z5_;DKoyPL$!FU-{*6+RhP%PE5f$o( zwdjhUCQ6(eelnjb@F}g6xtPyBEZ`!M&&3z`911?m*xi&<;rY(@;rR;8K2i4l^OedQ z=^jS4k^gwUl2I;W-w}94OI)-cIzC=aE7_C!0onCYPUEQmXwH zywqPI)NgB)=i&|nNTKc=NH}pXU>Q6n@uHm-(9XS7-IGr46{f#j#o&paDJXVUsgmm zVaRG5?=2$#Yb%DB4Klx9U5p&lx5{;A&NRTPJ#ysP=Z_pI=4!Yah|1&mY_F%oYg0td zI|1TWt_UIfF$B5I2W+yI7UAxkQKr+TXsJ2bA(xk%5)zcrgan3Jw2Wc$^D!^VWICqZ zWK$$wyCNnWE=Ry13D{7Tm0ux;G%k+fsL3p;KD;3*WlXZ$Eqa<@r(D!uH(&AuX^-Hh2oPEd3DN{97HqImR8Y~~ zwP0EEW}?5}y4GC__FmRr78C&m6sZzAq!5yjUMEvB{k{M9z6tW=Z`+^dewdjIlX>sl zd(XY+p7TB5v%9ty^R}8U$+5CWn^eXcc_5JH3IxQ$gY?Y5iqB+5SF?YA-Q(ies_?Js zYUEW_69=oRs_1OAF#1~ZTwO*l1rHZGD$ z| zvrKWmk3vhZh+g!HOtIb&Q!L>Wzl-b@2ZO{mLrcLN&x*${p_%<_t29}?l#+3g?iJNc zatL?c5yG9Hmc~X2u76($c%B^syB85y%}-xdYAcaW|P*&#{44@o+b!SE^U zP%(p{H6-Xr2E!B)D|K$am+nVeiH85$HQB9xayDgF%P^QQ!QuU+9WV)};5~l_uKW@A z0L!aU@Av`MFhs@SX~0XK#BrU29+qYk+$g#7N~|rjFcW4<=CHI*VS00GJ*fJc&)B?9 zXYG;02LN?fC_bU({1* zsAElGi#kz84JgcEVP@hN8%h0si(VR&wo-9nkzX`%PTb zJm&&Wild@B2-_SSAv2KTtv8FQG zaHKvd6)v}o9jQ!98W4-&2kvOC-b%hjiLz31IRBUGNW+J7=(f~h)cVMT`=>9b-LXt$%#pb1H*-!n2vd7$jHbXMIz8ikvi43ZLbjW z#hZoOtn%h&4=abG@|qcW86y$i`IwFKB(}mWlG%6zX5#|P#<`N&IRE@APBAXOz@;)W znmDiZuI}DbqI>)Bci(LL;=9wwNS?-lgJ+u@O;${t8>EZ_ea)}~>iuccSBviLCD+|_^SYZ>FTH9Ney*MZEw>tOyb&3J zD_5P}jii-L-yGx&QBg=DNkSqE7~jSh#nc#M;?EvC)_An`E0ml4tUKrO8PtXli63+7 z)cSeIYk3)l$?Mds$Xv02t52MpczlpqfR)lZlX@38Jkb|Uy+OTAAAEfzJB9iC%O7)w z%*=@sCyv1t)8Zo+F37G~0NlekWC6}an<36bMW|#t-wHg$Y~g;*=kRWyJbB=o9UGsV zjS5Ov3zGnu2+(Ub_~0e{DWCulw4v2 zkB=z36C?nn#5&x_Y7o?sioU=}!n=V5Pe+(<0tn{wez{p^Vf?g_GZJEe0C`iNl%$n| zcRtG`BRqEzvDu*g9Fwl6`fx}L1cv&1`%$l*HDM75Hy{#&;iKgq)TDF{wsfJkp~3{d zTlmcZQ;_q1FL8QjTYqd3{BN@G-jOC(?bN?V2H6amwn_?xX;x9({g=skVnL~}oGj)A6g%94_Rj3(>s*%@UFFu=Atx_txyLz1fSUGKNhPi*K2(h%uRwcA|GYGDA zA?XFtU=&f>P+0igcWc&gu_5)O@b1%3zp=fON?nZdkbl18ACEnaYq&?{Uv*VE)kHPX z*IXk$8?L%4F21{KfK)W>8|=ue0=9fBRWG);)ss61f<7NS-4)_x%28{5DLZf8>#vt1 zq40f9eg0wy3Jc|r?Ew1klZ(J4Py*tYE&Ow6TLfiwS#T@IxLjUN zsZxRV3 zX{A~L^tDVD@Bns1@MVZP!eHP*pvuJ}hdJN{WmS-$7@nUUMI-y0F;5yD=Ec$}q>nEvn>Vj?29?b*;Ev&Ntv~?aI4>7Vn2WV0 z%1v^kqat;bvwr}A&OxvoTG{wiuRk;s=FKZ7wjE8LF*D+|`UwT$q}N$f#dt&Skt0W3 zIa3#`x$nN~7sD=lfn&5xW20g$lW@klGJ&jFpFP=d{`iNC= zFLdEviB+*dq6;5G7w&;B+$+)fdnLLsEjv37J3~inFeY3BOEx0b=az?=h6g>wF!Fn2 zV>B{0BG|Qk`}TwFPGt)0i40SYp{sq-;@QPG%o@C22f=X;pTlu7`7`n@=}HCe8o0uJ zpX@m6&Cl2QUCl5^TD$@unV**@ClJp(>oj@n)P)Nd&Ym|eJa$}pd1<;jAx=wclg&QR zAvzV&0xH8t8ItDSe*5j$O-U4py;Dc&#>|=D+S296ieQM1O(dAkjB}Vy=E%E8Ea_mQ z4I@$PnKxfr5c|Og&Dz{0Fkmhn6Xw|U!Ja*Yo3UY!Ri2Skarxz-qX%(h(vmUev8APD z>A{q-8Bxij<9*1UcSntmkVhn^rxo4@n1$Hh)LvH*-2BWl&wR-nW&$B#mH+#lFFUAm zPMMuukfq8XfIN8zv7<~*2-T4_H@S+3vhBM6$~Pb)D6gJ1^+kxZJ+_p@T1YD^VdNS zhdI>8@dW_*6p-X<1Jfd7Z?#*}8N^nVh`UFn$Llcjl~e$nfqpNqRI8LQ(m{17Xspv3 z>QBRvak;@{0=nP!!9G+Yu=fv(M1!>8?du;L=xucoLPpvHx@%B%bPqQ4x?Bej9&eyd zi{=OxUM7eSXbGtz9Sm60opwr1U==KoyFBOyC_f=WMo}M?-0$^bm0$y2>$Fjs$)sF! zY~rZ#nd#}V30ZMTS-Ht!8U=1v8xfmVke`{FWuibn?vjV65Dt;iiCOWHQR$!*K_m=} zg)|Q{j?g6Hs3BMwV}ikwuGKR(!h0~(-iuseqmmB{4-E|s`}~x~h-D-Y&}ss>_Vk6Y zy;74$OT`SSTymrTeVRhR*n5Y$E)o;;>>a&d7{oDYN0&L&Q{bj6AlOU74?jZ0j) z>e@@Nix~m{qT<@Ez`n`}TOy+}%Pr|3wCX~f0c1~o!>Al2!}Xy2UUa$~v{Wvymw-h@ z`|0=EGN}YCMLWdELCf86-j@q&0g!^dRx3sh(vpb1HnsGRvDY-nb%I59S}a$`?4<6+ zZ}dZOb)}NGo5>;h+I5m&-~u; z%oWG8UL4OoWIU-i3E&Omc~TtDB5^$D{6XUx9+GiaNXGX|6x3T zuZ(FvGG{l-Nwn*u5Tfv2zJthkpr3d!XN)6rwkqk5nX@q@fM3lV3S~BaO)bW6B#6&9 zledqCz?^xMcmf#*=Dv`>>G#T*Bg*)^DC0kgjMS#Gkc{o3j7vlr7ym&rCWmDFG$i92 zAsP3ald&%(A$* zFn50Gn&(a#Qm^oj*MeY3&KV&&_YpZmr;NW~GzkU+xt&BeGpei0s8_3hko5PCW}Y~j zuZpAjv^bjEMn=;nj^ljHT3B^4s;I^ki50y<=)70dRW9WU>lvUPLtXxibDa zvI-3=$tqMTj_E~LN>?Fil_F_W^xVvq_V17586OZi#U7Y}q&XRMyA_$(9tyv)xy*_P}rspCogj*0lUh_*~A6E3aBKYEIV zn+3?~m%?J8AfFRvgZOhc|D1w$D=7fzI2DSb%PF}N2|#KifW}5Or^*mA9MklL`f&=g z4FhH~b4U;`8(b56N$i!1v`!;s>`dcAGL}L{DRy|7M8<`Xu@o|vN@OfOFC&%Y^X=NT zw|3vbgZmrnj&;Ep^Lm3#+qTu#ZriqPBf4I#sIOPxfPW|`SQILDFf-FMz$x7B%uHKr ztyK{gwtoHUb%3HgOg*fFM>z=t$bg~whp0xZv$xlY7)B7@M+0lCWmyGs zmX>q9rUuCXm}D_$B%b*fBUUQgJWV3Y(G*SG`zdJw-0}A)Mtz}o0G#> zWL=xhhCuho$@%xL1$wcn)qq&lsw-60>Q+>>!dl=EvvlIpiA9oinRG4qIg9q!*F0ay zqGdy|H)SZ_>P@WgpAqdJ2{LL!K}O>bvA5qVqfV63CCb=-zH%32bc-^YMHw^yAQ}0P zjH-}~Oh`t;-!94+2*np=AsJ17n2cso#@(Wf+kPaYQX$?tP5t33VN~sd1y!8)~(*GlkeD%DPcZgD|LQb#`|?eaJ?nn#Sr>Y*r5tzpjg8G+9bm&89C9HP1=i^BrrxebywTd} zWf3sK>fPe>N5NA^^>LB5uJhT~sJP(aHBN;t$k8^3g>r#R?JOd<2bw)K`2_`|)6+&5 z7LJNHDUsIP+#Q%Xxv-$JvT|yEBKSF6_uqg2{CI!u7hilqP2?iY@#k}_hkU$1$&4ng zh9k^x$lz6uFF`TT%StBJm~X%R<`q}}1*FrLRZYSE+BuL^4hQ&y+Iw$bwrtrYw`?|5~jAYC;Gv19X!FZv;mdVq3t@|l&TB}G(4rpiK_iaC1eT{D0YCGDT| z^;g$ih1m1Q{0H!uz05zwKZdq}e;)3xPf=Zjw3qq+LEFs#8}EJ0b7Fe~e(NGd_2I*Z z!4x=CxJSrAE#r6izmryt3XEKAr<3GId))B8cx`PbzI^wi?lW~~s9l>+S?HbHIpwzp zv7w#Wxw|Hx_)3(V6i{X7~{^<4sZN`Gm+XIb4g_ zKVYf7USo0*cvq-&F4kxuDbLZ7Q4tXldV@0P@dl9cOvQw&EwnbAQ}&R-r1{R8e0uN0zQxk7rC8`7%@=k@Bs zz3#t_erZU}NP7QL*!C1tM)iw+v32}>vZD`*(XY~6vZEVLpWD$%-pBv-6k`$dJP?@? zK}yvqMOj8iVx=ISG5#^KWORpcrBkSI^4n+;czNy&^K*FpbGV^jit?$&+L&iXYGb-W zwK1tD%1|2m;l&y9Vl!kF`9S@l zMDbA35O~Nk@xT8USubRgIxEVWF(PaEh^&?oS$joUQ3sR;+Vd&u2Wc;yNk0`UmSR~i zylRG$%%oiga!RaQAkL#){vy)5`wyc>DU|B0!8NJNkbNud;h(b(e_dx1LbM;Xh*M#% z)DmjG(2jdE|2ocys1!-wpGhqxPxFb(?ziu_za*(ilyt8s>F$uEIgk|C2=`&+i&8fb zNg?q{BB?xd&HvWt@Z&SFG9>BIkfdABOL~JSsWT+$l8~g!{y0fTi;{jIO1d*7>5ZW= zZ4<|I^~jiB^Bc$X*Dd~xkffi7B>kL7T1~$PjS(}Zx`|PvZ@G(=A&LZ;-Klj|TR_ewXRCS1)RtdJ$4m!LH zfylqJH>|iB_xT1#K(BwMpFP4cb+jJEL5F{pp#j{dJ?TNJDrw!#=!e5tl(qW5!B2A^z_A&o?a{I>08m$1kbfV($fniJss(@wX`{rWZi<(_tB$3 zZ`BPU&czvNMy|nj92bWNRSa{;o(9n?-;Jh z>{2AAGV*Y95vtH-XQOcI74ydB8;H%}KY>sB{dlPFumYOod*KCCg8S54Rn^)WmY-xX zvWm3?+}l#OoP$rCfe{8TBGNar)dP z)`h@kbpuF9LY=J$;Tu8aKA$uavlQlt?FQ99o_OM!fBy5yM<1AhIx$z1MnC_2W#|YD6G1+Ptr zGZ+|HKhe>sjNa5R&^he)yBXGm54N?Dk88kwf{quAxTY=!bZYRKG&G~*nISvElb!WG zpWV^e>8{DXepN|v)vW17xd>pRKty6x}F>8GFWKJmc^J9l;;X|b4O%-OS0nw|Lh@T2G7`}qA4KgaEur&h^4eMK@)Kf*ly zE9U7Pl6ksbGEY-Hk#bm=T^;QW4GrIX@{PRv^rk)Ty85QpHWXdx?{6QnMB3X=?%lh$ zQKd2^X6Mz{A3xdD+DvWbs&y@OEknJqfO`j9>YKQ197%?TBFywaXP;ja6@Bz*tIbDv zmTWCYJ;Od8{5>ifuu_jz$2130Q&Y!GtwL-cclJ;AFQ*c)gS?V>lkSSkt0qmIUYwnn zG_^QAJ-uM+jKzx=&y0_ci;j$_gqQR+KnnZ?nL{r=h%)dsZoGB(_ z3?e&j3vTMQ>N4s}u9~D^ysWx@!bMkKef7+VE6Y(!;Z;snT}>4hmXjI=@(tfN9{KFi za^VKy(wM8So;x8O(7^NwbFRL2)n#M#sNBcK7caclN-+yit9#~1n~u6l6NP-SjS>og z68IaxhuKU$zk;s^EHYY112ks}AOj0ff@vkbdOGkpAu#V$ye<{0#5P?hK%0Z5c7iZQ zNEcfMV86LSK2&Tyx-&l`Qp@1P!|KD+a=Gl`VajHU$sUtpP8eH0dsa+L1Ynf-(M7}r z_|!Bd54ThR>_^rTmE8vyA?50aj`+X}9dLl+i9vlKug7H{=yQ`g-Tf}G6e|3uPaoWU z@B|Kqr;Z*y2}dHQm7%&Z6vgdfSfn4Kh(j7+*AcN%dYOM%qhY+mD5f;*Q)rqy>gqae zKxlWJX>7KZ@EIu}F-S-NTsJvBdeXvCva{+@Dpgc+d`wav(A6<%X=w>@NjM0_MMOku zc@%>j@~RUual)-etZO7X>fH^qZTDNl(mmL`iW~xa=d0A=ciII9;UES$+bj9Fc z`{_EFS4Nhwh$t9gvJqW>6}tYGMAx@SbiEzA{u*@sWr?o8EYbDS&J)16yI8r&#CV-P zjHAX6UU11OBfygB_W1lbmU{-8z(7VPrKiVtdm`JT7K~I8 z$zM4uroFv@6vdiUkb%V%HDoGLYOACm4WpfQ<&{@ovE)(!euI7=@OMmnywbwL1?{(# zDzFrw!fWIilJ>eY44fh7YP;q+8X7w70ayFWXS`H-~unEw9Wp5DFzaC-DLVvXGE$(d4=*(pr?KJK0wA;J%8L&D8z-+w>*N>l?_ zI(rgM_>*TZS$p^0cV9WX81uHc3Xtgs5KFL9_k(fP=kvN8fD?cr8&swY&#~xspCt-a zUgyoIDAVu9*8ak?iMiRJSv5}k(@1UCtSa!HxK(i|hZCoAw-**>N2^7vHog$9E; zJTf{uHX1eOt#eTBd?L1F(y;S^L@tGtKvz8Y6shj|>P(?hkcn-AaH(*g>_1=c*k}Ps zw=i4&8bHXOJh=ju090tVfPCb3v8@ve2wjh$!}WOY7ObyW$|#`H4aWuoYB0^BY%Xnyk}-ZS))YG|X4>r-b_6h~VDwnB zJbr+r#*WF&%`GUJFrlPmeBsz4{8Bh}T!|qpCaZYLlu0ut#2TzRgARV9iRGme3(}+2 z*4XHYuoH{oWPZ0vA2BQ40YkCH5ix6)Qf^6AC{YW_AX5^*krK5QA-lS`c-*)tRY^&C ziHH!Vk(-N^bLbU01O1bsusaZ;q)HzMZu`V~P+qd-47$gUAD5pA%RFn;xbav(bMi++ zL2~m)6{~cyMRQ<(E}s=ksm>#$evgl2R}D_^R8JZ8KJf;zh%=K@JpXafPEPTvxj56( z%e^?m)A>JeSY3Fom3j?+{RAH#V$2&x0qO@VA_++706zw`kV)=s8#%d0iOKzpLF70% z=O2;gkV&ukTYN#`BI5ffL44C+hw$Ecd>)a}Zz3}0Odv8&zvbt=6w z+zc*BibRe0DQ+VLnoxTnhJ0WgY8{Evg6LqxPm%Ith81as-mjgc3AV!r+!g9Bk#C(C z0-Zd9gR}@bX%B%;E(?K9E;*0NBIBu8E~oHAc1%ioO(N@sNU$GcBf$3+f|caq(&qD^ zlQjUHoV%lI#f}hjtpOnlNt%zVj+gAP-$MorQpplj+kl({&uqM@as#R#7{^X1a&^4y>l%DAujJZpDf# zmReX^roh*J!^tq}tQ>y|w>HnAq9#Yt_?s?jkaFN3gp*yj;?BDe{C=Ez9G^zrQv6*H zUV(O6$;kp|PMqNpt(8#%ZDrp7_u~~fx~&z~Djt63lg&GhwsA84?Cu>1Gp|LuE3$6z zS!CFdMT%D_=^9;JV(#d)w5S*}_!%^u+~bAwC=DMC+8qo;KyFO{Bv77VzDD=f>o2_Y z&O4uMK78cZfCK5v6z=^Ue3a2>@lh|hvfcP-fL7G#wrqOuqp!X?)NrctOj9=}cT;MH z0`(uun#}m9)8QF%kZ+|lBPV<^7DbY=m?#;G!e1E+cGw-HIm5}ilSjX=J^bdIZ@v5B zhZu}%69`>p!JxgdzR?~G${2yKVHGGQ&MB5&v24Y4>(*6~5y80Z!T9W`CWFBlkN|`( zj);s<0If)8-+i!kG=ga2I5AJV}iWg!ukTt09dhL9^u9quZJ^eG+9 z_^8&PHj+F)U!aCXS+8Nv(B0Z``dG)2?c29)+_Vk3oyb2AD)3R2TE@iSqduo66irZJ z6r^jpG=G$=ad5T%hzU{RjYTbTY$Qjiqm1e#j!e`7hM$XhN`PKi4^~plKdFB*IM*|n z?u=hXF+nQGz=H(*kee|jhcuFS)J98Y!Dz`W7=`QS;QBcdjm(i~WY`wW_GTwdwX~c$ zeYy?RAE_-I)79s;Xb=kOZiHK=p{vVULA`CDyoDb`a04H34 zIAFX!e6FLjt=ozEiuSI~0Vl6weQ?W}#B5F!gh#LAdxfA7+OZSS%Ndeh&XV-Es=N^DQlYs)Nj8T#`Sr(L|bBCPG`(W7l)6^pG(FAq~N;PqOVVFdBCG8tw* z0jg7i%&L_0u;u(Rr3Dpa)tnaLJDQ{bVk@PsO1ldNw9`IhL7lg5@}C|`4e3#^9{<@z z(m=YqIxI{(b%fI*FObsVKXug5NG;0o=$m3m-xN#whA{bz#|$i%%)nwv-@xLH5IlCA zKx`fw4k*Dh0I7!%9gfC{92t(t%jM1~rL`hC3}h5rln7;hJDxUSc@%cLFNBW2N(>ED_Q9)2_Vo%BlIWF!$o~Cu7Ev zG}36l-;`X0aBfku$v9{qxYTzw^%9E}uEYq8tq5-?-*>>P{{qZ~XaqJK-&N!}Abh z)wjsbh0t+gHSz*xO1 z=)fH860@lL`i3!WOfg7GNzz-nSY6VX@dbJL1w|6cxepO%@Eos~JUXdHDplDdpp z1<e#VFh1^5XP`e+0DA&cL#KdKdpPUe8Sg~T>>{+Gb^0KQIE}~X)vEKO7 z`IlUB$rXRX>W*h}#I$!qoskeztq~lphxdQ;+1oE{_}>}AU&UC;?V5kQ^}**m4>#Dn zJXZZ%kqu|>>xWLDZivGH<*-2?;B)0s+{9WPN8=<39HvIC#Ga4zALK<+JVmnc6&J<7EUfR zMn@B4gj9EDSdQ`ff)>f^2PzTDcn<-M=P9f5mNhv!*`tcaSCFy+R1N!=t7cYkC>O8R zV)J+p-vJV9tS{K+7>nff12gF|v~oHVo!dYim#tZIZfBEH>FF$=3E|})7{$5T_3vL_u0IOxB zemi_byv$^T`XghV#V<;;t|r_K&xFSgmqu@Qcb`UMGN@PuCr5R80d$YJakWk^pm+?D zu5cePq+xBd*yd`&4<4*-cF-u7si%kfzx!_Y@lJ=GL#@Z2cIqIxBF)Hf5hfxGSj}_4 zgoi6?%7y!d`^}aYw;Va#($aN&^QSMp^vV~r&$gA=%Wu=2`9n5!ad5A6tlskrcfqcqhRrw z-rmkeyQao)=+OSX`@i4+@yG9c^wlmn^s6<&L1e_iy4!!oTVp`AM>rwla&z;uk`jmk ztwDtV0Dt5xfYvqo&p+R^@zak!eC@UOKl#Hpr|MS8N z?|$?N$mfNt@BtQ844mN8fOBc&v@#FMs#5Jb|bSrZ&U^y~aJY`RoYQHmDD!n?fM zlp^VCYnWQCiAYS`xpVW|Pd)OlPvLd`^k1Z`^J1~xMwhP~iMgm&mM3Fz0>3uLr3U42 zhbd(WIkj-%xNsNr!WBLaxu)k|TT!A?xFfy#`7d_w-@kkFJFnIqKXmBO@w$dHXU;S{ z^Yr77KmPPHFTV21D=$)3E`7r@FTVZRmMvShZhT|I)~y>iZUoQ8ri~l7Zrk?x#?SE@ zTrk_LnbFY^CY?s5VxaW#(eO+~$0xwqoFI6hIY@oQZpouaQ+jWAUmr}C!S=SEUaUPf zF=^N~G)U^GkGvkRW*#|mXz$LgJ9mD!|H!d#cVYZ@eY*!qwtK$W@zqyf?f7OFaC^G| zAWAQjk2*=`gm|)Q)O1x(+X>~no6*;0~G+dRl^m*9-U03;+1S9?s1{- zO)0sXUt{3quyRr3tsFImqrS$|1de(hPw#P*4Nr(}2k{gQYJ5D6=cw=z`JrtZiTqN2 zeo_9EAImRAv9Jf-pkF10E!o+*6zIkvJ$vtJ>K43$?7=aR9quqH-zxT0mz~a~*x{)F zf{1_9F^!OmiaVeNck#2MkTSyPC>ezd@8aL$H!`>ja3$h3MgjLxMpig-Cm1JcOc{v# z^KnGRn1$}dI~hqv;+=F)qb~iKJ26N`;HTz;T(bJGTU}5z@{P>JwGI4(+f9UHI-{+qo-no$Y0XxY1Z?7@{1#L!OZ+opPX=0o5k;Ab8=BO zK^&Q?)fC)Rq(AIrWWXp+?!noGLyCA0{8YFU#r_zYMy>vt{`fWh_|aW7y1^tY_QyQZ zABXT7BeRzDMmb*NPL7Z}S%cTO6JHnc_mJKgno4Ej73P(F8mVFU!yJ+J$4}jfQZh%R zn#!JKaSX183b0ofQ#at1*2=8;Gw$gjypFUovdOrQad?fZw>AQPo*e=5t9GH z8jVsPIpH^!V?IdhG)iYCRs^nwLq*>_)@&9#IJwZ#cZ# zoN25(yyrU&1#&~2M|E(9-%-*T0o!5UK>4)XXe19@10hcf;m^71fwN!5st z&;K{q`FR~}Am2+AN7NSVSLCIGJQR|Lwdbxv7}yp|=Iu?Ac}oy`#6p%L_AZs|QCV_% zQ&V$uTQ_QNqJj)8SHacS*1ToQ?&cvj0hk7vt8MQVgz1zmv9T@iZ88=)9uR4@kg6E& zMwo2%PAUmdp-hc6vZ-nI?EL)E`N?LL;KwoEFEeEpB7MhQdVy73A#%wYzAV9rS)i5jAc^fy*3w=E>J2KV^D|Q0mGYKVF z{4X$(0|Md%lv6pW2}lzbs#uOA!np8HA@OdyT)N*|0%je$sYSWfiH*9*a z9NfrTRi90pweX7TZn*WHa>`08s%bbL0Lrt>0<%>jAaApPK_RbGgrWy$3rqNS`Ok$Y zfafL(^MuQ=C)~tZA9upsSX^Dkzk{#8d`@A6OqVg^@&`@byLV{V;qLa<%(%WmO2SNh;;FqY4Q&T@eeu+Tp=i|a8?8-bNS5M(7;t2??jvu=$wMZ2 zn2OOt{24P#fte+z@I%Ig`sq3GL-i}H^`f0bY$KA-LcaMf@_j+_5Pxo_neeS9$+t#G z=0G&Xf~X#3_2hcnLsyk#q$?F<&Bc$R)82u0O0k>jOosPXVT?B>7!z_8YpBBAAXQT6 zGe|20bfcP?_Xb95X*Cs5#eX0)@@FX-za8d{A6OWK4HYT&cu$f&Ty%?3eoE0icW6pW zWj;U_tcp@n)Nzc6Z0P!iJ1 zkDTqKcDqs1Tgck_|4!KY^BNL7=`Td z#T->T1L<-vp(NNcvN*_up3=a z7#swjUp2Ewn8InX2bYvg0`oTZ*ZuQSV6uUWIEM!_)07$!e|HszvvDL;bWE@bRG@p>1vodwc)HdkE% zsIN>|$<4*eLE6=**Sdm|QLo~ClIj0`4efH33D*LhUe0gjx61zK;V;@c%7jbk&K(5l zK8Jsue;q5$+qeS{ujk-F*J$;IfD^G5e@%o|JD^tE?fMu^P;HZ|(yMGX1X@6kNuz`- zJ^`x&h5~+SB0L^nATV`mW*R$0d;IE@{IW6va%H^ma3iK7XDMDrBd+PKi3kM38Rq)y z4eHKgo%RNIap^6$03wNMK#Ydd5&%04(_w;$`y)<0`^cbACJ&4703r?YQZyRJkylrq z(*!c#eh%gI+jc1I3FHbWjzg|PHmcB!8&6)%J9nL{ah+9?^@)?rxVtgqNM`O*$@;YP zyv9+Zwr+jpHMj!be*TTETLmF5BMKdBh%~@n^EGbYzWtQIgIDWSv{eOeJT(;n@hxY5 z>4lFPsk8+vSG=@h<-8=m?t>Ssb47;egCLGXl|i&->O_b$+CZ2ZdI7XO+hN1)Pndxl z`J6Q7zARsb_?hQrRdDJejP__X7`ky$ncoo@cDjRBRnXQAh7vc=BH!maVYRI0JAV9K zm4Lm!EL;a_;OAtw7Y25LEqk@~VlnYU;J1mHydU$Q@dr@(n52VTDO{;~t-}k?v!m{r z3i7LPrQ*eU7)(c>nvGw`XH5JN{3U4z1+AzxxC@P1HrO$Uy9o3&_bIe`jf^wP)h4~n zvDbg83% zSZUHR=u%^>nfG}}mj?Y#7q8Z^Ob{tNaxXq>9c3~_CBhXPA01{gX|;?$2a~uPQ~rJ~%8`RS4Mw2nnnYXJ+MUT+!|euz+d;aiEY}M=2EX z`GA>^%8phjva|JGKkhgXGyy)WAH+Zf60#MFxRSYZ=a#0ytqCiek_8xrg0-q-2D921 z1SuwG)*uUp9~krvYleMpkf6#HBi_{Cr*9vMn)W$)r1Qul3Y|jB#M9;gd4=OzXdk_h zz2zE-zFh%*D~G<7OZ2T=qHoEsyzJj-hB=ZW2^eVoM={nu%c5^bfyQ`@SnPVl_T+7L>y=H<+sJVy^6C1)dl!r7W z@>gQC7?c^*X|Zi&u1ig=5dZUC+0rRfrofel-Bd0+_0_K9hdBA6x>gh6V*d zRVum8(bQoi-|5E>7ke9(2fRl5z53^%}q5>Fn+r!iIs{6+BLq!S*?@ zz?1D#PDdq1C=eM`D8dtB)tt-}W>Bes(Ncv+YHE@Z!ycU$Wkh0=B0#_!1bCs+>5RtA zLSW5_t6ttG$o$|jl@APfh2gWDtg#IlL7c3wmk-p{BqRP^lBEv@lan>JvrSD+2z0a> zlaqtN^m)jSp)&9V&4NiwlRKcz30i~;8xJ?xY_Mkrz4lX~J?K)b+Dj#?_Fa-$bUS9z zrI$0;Jc`H*%TCNTp$n8UPk%2YX+OAiaFC`o=|Dv%@G#I+ zB_&z1!6Q3%AK;X`ckerJs&Bw!0rtH2+-_pu53o*sw8PBx`Mf)!HXU?1?S zSr5-CNznk_BY=m3_rYNRq6IA2e!0>UeSh@r%k(PDah}aRl;MX(gNXS&>1yeF3jZuf(mn(s0gZx+7Wr>lwPgb09tpgHMKZc zhy1t>8R*`%iJ8%479~uWy%Gh{u3fP7#v7L|y`>UX?H9Of;B-`k2T!Oh2uXpw*^X^fd z0M^Mv)g&~57mrnorNGH~=EBH?l%?(5b(NCqD$n;WRn2rEeuyhwk1qln z9TA^UJ-^6R)1TqucKjdH0$)C!@~B4gw3N!?9{6>Me+p0kV~P7hOc@y=ri|;(GiBT+ zGG&YuWVush$`JYYeqh@9eG>PCVllHJF=82-8UvaJ31 z_XiIiBTzqL_-mD?KKS5+)7p|7xmcAp0>(jXe0)rFR8&l~+I#D5cj4zwKv87@K=y() zs>!N7|9(;Hg;l|agS6?!@ zMAx`|D)8R>+?2?CgAH8Pdv11hXIqe3PUC zd6B$t=ZEneY6JWLKZpg)(}4lC5yvukll@#A z3c6v%rND28W3oJD{Fq35#E-;60{K$OfpkU%HYcfAH#3J64jDCyWM}1NXJzLVj2%C= zARkMa9{V6~asyb0N+SYx6QwXjb}5wPmT~%l!?kUvF^ljcC)Wa~C@9nvhv(0_6eIzq zu^tdJ42?}fpO}lL&z?Jb{v``0j-4n@v(nN@6DLlZG-1N@s(B0M%qqibiCwqT6XsSC z)Q=G8;o=NJ7wJNl4U_YH%O@WmIYBHZn+-)0a4mEYKVs=$4-H%`(ZIh;H1G*%;3{a~ zYKaD3FVVmvx1;Uk$&)Sp{SClLA3N39c6`?^cx?hsU-LfjRn#`O4FZT8sm2x^6max4 zQgx_)f@0_>&I0JDLaV{2%_&?weErn8aY;%=_vz!uj}KC;8DLFxja?Tz&RUd`KOI~L z3$D2052JRI1_2`W%=QtjR zAz1k&LX{s8x(o%z#2%e8rxHhf{EGIEuw~gtUwGk#P2S1t)=h4G?6Joh5E6#7E{GGV zMU@aAslv5ggW$ZtwMp*y4UF~6_DbqOoU{K;n(l^T-QG9ecmpOPv*)QY;Rfp^@O0;a zd|`{&Y(gB&INM0&rg|Y6hlzU>8~5!)$G=}8tU+m=RkBwBvVVJ)aF)3Yq8{{vc`R_!tu1KCKAmMlvZ99TDYXmz}VJs zJ94Vs?oI#_@#GJB`|T=~C7uZm(Q0I5B3)b#%dMvq@YQZR&L@2^$+>K~EI?{cFn}Br zZS?l3)w*yUqHfx7&5#dAY#N7XT*AU?7zJ-F3X4g@P^2Lx7}j{4f$D2-ZH1Z!2gG;0AgYXUS&nj0`dqFJ$L7C`N0~L8 z$s8YnYQKMfViPD?j&FS8VK;C&)tWo+ylegXo*pDEctPo+n^H1yLh-nQ+}trX7$LGK z;PiP;9z>p2R1`k0zHbG(WA?=>)<;>ZkoUYD$!9xBnv=Ytq5kACR~gl;y>8j%mn>Lt zaYgCuHkcJ#Iay}^!0^bIWMH^N&AJRkGW zLr6zn2al@Ym?PYcx7LE;beY&L1+T$uvC`!ME}BV8i~>`EOzvrCm=*KOi{j#nr_a5S zvBr8ZCFK}LxO5bHhckeJ1fBpZw;@L`nissTAQHd%Ah5wSJAkUdAj^{T*4VMwZKI-c zNM^r$C?hL9Eh8g))TpeB;oGcMgVq3UA33%mKcA%el(IH~)e?^CZUn=3laB z+;s=)oC8jOD^{g_2lsum7xqhYzs(WA%<=`zghEB;YyI{MSUU&XY(WE1pdKu!5o&de zc}68vBHO^ALX|t{w*?tXJS_x0e!0$U(CFpr^f(pDP!PtMlU;Ty)>=GnV%743wB#|< zQ7>WnpO#)Z7oLy8#4wc`G24z4-<>=SZD5_zOV+PnzpN<2@g1s+9YQ=B7c(h7{q*CH zKR(cE=jHk^V_1qNSQAU@<@WxrK8GWq{&L6RA>-)Fz+AH=-_Wzq%2dp_9W^#&^Cym4 za4RW=N7}7wyz;cnFS*zv;4Z+!tHtD`rKERf%c?Pc}lS+=(=7RzTa zr&zN&PE(0FwH|c2Xxa}Cbf{t?!xaI+>#H%-JtvOWH+B#8*vyYT_i1}<`Q0PsJY;u_ zXZOF1avXPpn**LTROtxAY59KHQwZj7n1jgsrNUU)ET>2lXrTk+uiT;*zntMkW~oC?E;k&k5!otunLqjAauZP;NyKL ze2O0h>kay>Dtjm7jXxg-C zW2k&CLJ$VKJ4p2n-WLc@jfsq)JKUII?qLw>!pIuvI6EZB)L{m`w~M3#4f`TY))==j zGNE8pg3p0lJbkEXFlzkx@nh2Bj514X?AXy+iI~2z<45zDZB4Z>9d_(%s0H%)(D7ym#?i$vE_5F4Y;QcUr=|T& z=P69j-E}xt8hfxrM6eFq85|Y9+2Q3au^x|&MJkUX2w$DYg9^_L>b3|$ideLP3d=pqPTKrLkg+Phkdv_JgmbZ|m zO4?J*4eS0!=)Ye^`ybQl={z*8MJ7`~uH=iZTwM+di|5%j%a$S0?s?=mkoGYB7hL&8 zPB|CGSa004byeWtdroXGQ7_R7+(96gPK*EvQbblh7%x-fH@vW6!-j8%(&x^FPil-X zMp^yF30TXu&s~J&zDfu~DhntTpg=e2KSS>v+PAMBDp3D=O%?Po0mlKkkSZ*dKe7W+ zlh@0Ho1jp3&M1gD4q8F5HFk%`4asH0Mx90*rY9*dj8YX925VfQM=-}a2GJ0JNRYdy zkw=C4YaLTmWKi{EWf77i!@{$& z5{;?xFk9lmorVtSA8^Z}^9u5!m3^Qpk;TLEF~H9S*O#rS760!NRMuF1zzF1?YtYe6 z6g6PC6R(vb*yVJ>iY303E1@4(O6-xpN%Z4y(2u3i4^-IxK|iG4*!=qX&W^N_IWeiF^Oee$mVwTr*p#+^clf}OdH}8BP;(U!8&Ant^ z*#zJe2|>#PruC1${0@Hp{qg3vzQ!SX`%@L*ldS;+C-peG#B%JC$)d%sQm^I z6Zav={157ZYJk=vW>t(!OB+35Oj4X)rH{)`*VVuMI413#$aPpl%z5DkPVw|N!^X() zc{A{*kHNw85Pj<+>&4=s*9CtkB~q>Xz&GNo`k_eP;exQ%)2 z`|m6GA$~}>QGU1+2aVS%h0AfcR^TKs0BvaH;#%EKlGNuKatkVBN}@*A-`L_&leJsU z>GbpecI!BK&bWB3QZ{TwVbT8n)~0rw-7(}uktU0hmASi+72L%c9gg}s8*E;ESXhM8 zjc99}If$>d4f+)fEg%vGT$d?K4ciF5TTbV0-e21%4+I6zu${N&XJnL2T5@qYtc7Vw z1N|Q2rj5ucxoB2C=tNL`)zgmw45Umg8Jz(~ZJbUPsZ<7s?R`V;pe*1-Jd}3Z-Ckn; zb2=1Db;FE91WaQ9%pQbxfcX7A>kfqR*WB~x`Ii71TtJXaKRu zCrC74fkXplj#%VH5)Jr~MSlADLGY&_-_6x?uEy)`Z@>C{7d(A3@J)Gx2olD_r<9i- zOG*)lbzQBotFF2RMTKEY2^pm$wOm);bn{I&!Z9dArPeSbr#!fgRB-+F5QmZjSWAFC@W^&BCU0#BI~YQn{n{G8I$ZY&VV%|JdI%t#M;ywr{rpDFGKrg2F2% zLd;9uraD8G1^!5<92No)1wOd&l92GUO-ss${tSnT4n-W8{BeJ1V*?K#>du-qn z#&rhIH1T{Js&J{yQD$--#1#0E>RZz=zSAV*yI3;5mtuUUVTGF}8Q*CV3n20M@xyh! zB$grP`x}q<3NcaJw>R|HZ`&RfN5gB#gb7|tq{|c&0n;SDw$`1JGF&@#YV_b>^i*r& z#TQo=CK5hAyDD+q#fkl2ZMl2>#mV#Txo_L{LF8sLJk3}lSwSp4>%a6;?YG}*FMapj zw#3A?cdg|Z>l)1+i;GRz=Z7MSfn%s)i@RTYX(qLg+KvDGf2_R+U{qzgK7P)enKQj4 znMv;z5&|S4K&a^usuZz+GzA3|727JPIWvjqD!Q)NSJ&>MxU1MuQNSQAp+gb^2_&Sq zNoJCnOgrcQe3P&qy?g(A@7*6KOv;oqbH49;zqdT^^W@&j1z`SB z);$CtK!)aPm5P_3;}F3$B?Ug;lATpb>H+FW@LzF##GVFAlxlUm>J2U znUNxz8G&faI(hlR!2<^lU2bc)W40m5u5|WY#FkZg+zBMU#NFw!`z)snhM35vP4_)w(wG_67#D0Qfg?(e@3ENQrv5^x)~R>pTMAM^v{#Sk zAZwpgc=vEy>!;Kg)P6cH(99@fCni~>=g*(tZ6*|~H~0y<3P9eqMfUXfDAfAX{7T8e zOITEp3KYzY@7m82OCY*+6&^xrrDPFI;2SA%@^+*}u|1VB13eDj5{PZ*%AgGcXdm#| z`{7_9ZC|QL3Bsbc+bN$}A`gi#3q-E(qR-9S?LMDgLKFZ|Ls0T55r`T(+wmwy9iKI_ zBL6eI!lzsrs;obgTXdh{mhZ;xFjBUS{N&=whJBm6Fuq$wz{KD0iu0bDt^!T|;jg8lkS~`HiFI8#A z%>eu$BLn8b92At1M_A3yfZYcUC@woaWX;Erz6Olqx&eSk zA2oL7%oX{FasNX7MKbTUhl>H|h6X9ThgWgDZ1}@1%d%91{b1uNm@{YYf|VO{sSir= zA0WSu559bs{41B(u3gJRTk?mBCmwm^k%u3VgQZIvIw|kz@?r$YD?rVg=O=F4NR^do zHQ`11qYLIt8Z#!nWZn835Pnwz6X(Vr^EQgk7yPiI4&-nKDI0vD7pP~|i*?;Cc?Ans z-F@%oNAs~C{f%;z=F%#zlvJ7u(Vv_?zlJ$mBI#8s6X)^A5))5)QH;X zto!CrrAYVOPXcUUh8P?sOxew4R3y6IwcJa)t1jDIu7TF-Q@dZd6-MfAXlS{XG91AY8+?lWd*RQrD-T|z_7ScKS1V)AL?!fd<%AtLS*znynAeur%Ilf6EEra7tCGz&p#Plo+E2@8M)bvn_T`g@}q~`Xvxjk>#KMSRzwiO?2F+ly3YMy$KXm5Ii3=T0 zXZN+5gO3MIBU zUAZ(=`RNCLoQHDSMjY8FmDzB#;~?4n`N9@#zDOxZB$Y?IOp%e%F-D|7DPMVzOmnWL zOJJmuA*&UfhguyEDkmh(^I$s4)iKJ`C zoEeJ=0%$IBQIqmlBeYyskTz`rn2KlTfA-}8MAv6+fm%;DmB9t->48Ck_d2_qj_uj~ z*=M^+h?zoM^}|kosUG-h58F{HB}Mt|Kf*!|0(uOYYe8Fe&{$4>wE9L_wmn-m#(y88L1doPoLm**_uwjH48PL`}}NS8%BcBf|0cPL)te_bOh(+ z<-Py@`v=^~YYSl2|BSlT^8pXtI6Dt9ZCZAEWSD_v)TRK7rn9r^E7E@Q&hcowcue{oob&e=!?KTsgn0jODir13e*CxL zw$Fd`!wtOwp60<$nCJm6&^<_N1Mu@?Wr+f_9S{(rQotJ;0uYBFROx{q zYJ(Fq;DBc;L7*E5@=t|CCb+y(y&8@W32Vb5(w@FvT9+#<&!dwPGz8iu)ZKtP65A?+}GP;Lz))9qfe{$ zY-gWKX$lPpKxN&h3{ZOPwzk&6VNd!$+X)(pz4y0Ol;Eda-rx1&?+2Vt?g7|**zyqm z7%^kUGLhw3fGac^mS-ZdIU|;5vdHr2e>nnQ{ou*kR_tj%{>Y;StpD~~@F{#leZk2< zu5jE1pWW7+p3W)L(<7YD^z^o?rx0|%j4bKr)K54*kv(vGK0^IG;*ZfP6-PxD`OW=s z67&riy{|agop;{za7=)i37@rhFQ?qQw=Xz&@806u?zGH;7d1r3(Gzf(P&|H`$pcO$ z4+M>NsR2fNd=VW&hfogxF$A|N1*kuQzW9Rrp3aCgGcz9Cv4dlG>}XF)+OZ=a>-Jsh zQ_EcbJbw&bG6!+&=MV9x0ORW+2mA5Id-mAv2a6!Fw3~17AJy1W&{86ob08$d%+|m! zLX}I7x-N8r)N+d!(L8{qkWD~@0w5{ob~j21@MQp#&=5)i3h_AYvVj>_iTnnRwYApTFX6Y7^<7R7k+VqF`Xh81guC3vB+jU! z$yM?2si{Gdx*8bz7T%C*Nt`@+YQfwktJb1owt6+zTD^@mq)e7i#BU3eHFZcbR%6cv z1G3C4121|@buZj7j}jjgWgow{4sA_7cTwL$gq$tUN)yuSkE&EF9K{*00T%0Kgd zQeC-nrCT>HciofYw-pTkiF#MDc2Wya23M&&pyPp#Oqso<<l zS%ru)UiBk?K4fMaYM!?gk`$y63LpJp_4e;ho&=G~X+(%$7a{+-77lbE?!8_5IzHal z#eP(3qCZFJ_LIs({6nTzm?NR{UfV$0E5SaAG>uv=4+`l964~Pe_}!A|blUp{ScMeh z%rN*X&A?bV-2#lcppqdu-Vee?XnhDib0p@QVhAt*fgyE&9{B^S9e7eC>{+PGCjyup zg`MBWkhDB{EsddZY2(Jk>oF%~p$XYQfMkQ^LjvY=vkE+Mx=;d8@OUj+Oh&blpbx-) zBiCCJqoX6~hRc`FH(W-fN>cwolf*{{_9JL+mYA|Y&y|G?y2NA9nIlzNZ9oWt00Hbp zFewU!Mq1yD9A>XaH^NxF6thpP3b$D_`yR&ZgM2ErSTy^Vi)P=bp@D0pv&7Q|SLf)d zlgCdX$KP-@Bs>JJ4s>hWgZ|>~0Ghp%34L7_p^1sqYixCw8`|0~HM>#I#svkxqXu2- zkp{s5CO1t;*1S z2GVfDM-cHw-g)Pp_deP4qWVCn4q zN%8SxCXS5^CC~_^%9I!$nS@g893cw@ODjS<8PrXeOW#NG;p@flWzrGpb@N^RgZRmI zegL-wLe|R<0Pj3cSSfqy7r1rbl|{~t)eGo5aSZt6s5SfCT@B4ng_5_78a;YkdUj!cs)7*Csq%BufvwBQS#?uM zK|w)Lszj~VAR^UAgMNfdfQt&iKC3qQK=0M(aJdJto?Kl`^({SpeQg&n+5_#@GSj4- znN#N6x+arCwtFys(qvTjr<6di;Lp-0fm_}}x)3*3YtSkW=9 z-~QNc_bCFyKzWE{EIMkGw4=M}QuUc0VI(Ir3-fuF$g5u|n$N2-pNlb{XNl(XEYW<9 zzi^@EDvHBc-a~fZ$&(jqE*v;eS>Nu0jWY%4e02w?6Iks&uQ{BR4z+h7AD5bHQV(@s zgq3Mi1VtpECdyml=g!Sdjnunv=?A3x+ioiTpl|0~8k|P2FyD zxI_~Y9v&JRdg#zE7emsQz<^FRYI;ej)^72KX{vkXX2-ZO6R%KHW}yM2ZtK<>v+s|{7<_?Eh3zv^Kz;^D~@y224#@J66lgq+s)XG0HwSpG;FAQ6sM(XlmMtCe}`0&sYrQ94!J6fDhhYdwrejVvGLG`#J_-1)8gV1vnFRHgVZE~ii4R#^PcIGUq z5hze--DzpzP78hCefcm_I0EjTzj*PQH4v{1#;TH=OydxhmUE`ypMElw0Mzx+R#*mD zijer9e(DRh&>J@vjMT_q3|O~u{bP@<9IthCVM;R0IBE-Q+6ymCC)|I2#Ry>iD%1%< znD?55oEKhbPqHi|ouMRB!Z96XJsr|k*KnYs0nBWyu#^R8rMDNXaQugyNupHRQAh!` zFZ8ZZl-9YiJSCP8Y=hWU-5#JlSUIJFjs%j|Ao=7>@cMmyxXgGt0tvD8xS(3VTc8Yy z0n;Z$Cr3p^Cd5Ssp+t@nG_tv+K|WuQ7Xd|IFG3qqfB}M5QWkRm{V0}3^T=e95i3EMZN;@R@fgm*7!vfF*aQDft*nzF zG`Z**s%sfS^~V%+?%Y|7Tm!;-&e-2!cRB|yAbZ~K?T7NF%i*Mex{6Z~c}_&+^JA=jZI0OIsApbKwZ45I8n#E4@9^Q%c@{wy2$(areTicN%T@p!aP3>750jTv1;4@=1 zFj@#adaaHD(x>P_3Oz*NH7XPizocZvo z;R3`0C=WQBR2#%80=0>Uryx+J zHW?JG(xPM4P`77Ed!a`Hw7gmFhH{?Aqf|nlen^Rd#6IJ3gTIpIN=E^>;&Kl0bO4Z* z;A-&=4ERt)5`0J!Dp(Rf(kQ;sTGnkz>u!bV0x|({vsXu|e<0X~47`@?405*?-HI$N z1=}p}5DHG^RqA=^AbMx(ddv|riL=K_wkF;==#vS^+B!PC?#>p6M&YoewN(+(A$I^? z*rarJV_sjn(Af#cU4z}q%j#e@n%v>xVF3zikQ+Uql(1B5W52!EhS!rb{S7VtSN7Qk zKzWbi08C`{$v&AzHnLkS!HQTb@`tvGR>Zwn5yZb=BHFE%h*rd?y2>9u-&JS(>`?W^ z+B3(G?BBQV;K_?UY@o5{a-8C7Qy1!HeSKICKa+W{Ntt>8WRoY49)&k_>J*RSoc(Ie zL{8;cJZs#zap~!J!xlPs4MDEFLcKvRNG?R(g}5~3lsR(ieRtopb?f?)jIptSfrVSH z$TKITj!h2|gy1Y{4JVC?3T3(o1P-9IUTArOK5$3u5d5M&iMRqWo2b( zR(wPf7C+7+J$hjO{=G|4=4s|n0U#WX##ssW%vzY+pCAJL9gOWU{sPFpj8HjC6E@O} zF;{p(^~2A#jZMvMZP%)?pMK5-Dik^mod-d){%#@$28-%58~R$h!Tlf&1OtOwqgAUE zmQfmT6bE|j*h4+eAtdyMhFqQ@d!OCm)5-<{bP69(#UOiyu3#XlP+iv?@Um*rTuOuH z6(~sqZ*KuOkE$kELj)9nYK`h^Z)$4Rnpki9Ag_u{NR5vlJ0U0Dpx_-H6799CO;@hk z82|&}FUh=Kmz(A}Rr{ipq1M*cmPVV`Y*5Bz9OC&VMu`M=ShQT~wT$X&uRV6eJ3sv5 zu_jl**r`R6CM~#W_2fuBW&2{t)KGW!*vZQdM|USEzyjUw-j7 zvq3+8ZUYZqCyaftDOw|Q59jKNFteA5X7(MTnY|V>yAU(GSTwWei)MD*zI}Dj+r<3+ z>Z@{h5<3$}p3{=~RZAlES4@LcJegfXQK)&NFAr z^8NM9XJofyYnwWGHe9K1P;Mm0KVXBAThm2H2YRr6;nvRtK{uw>F1+f>Rk=ZwJ1969 z*u6oQAaF?5g3KQdK+?ihE6WPN2m^_C>N)9}HEV7xnN3I1h1Ib`|fi0)VKLfuYfEZe8NE|FOQ_4*bhq!_X9a1v54B=Uc zi68-$^HNqRb%FRvI|xY*r38f%iUGEflL3XyNI^*%6*YB3A%Z4yygBBXM74Z<9{&^IIDT3+h*&(?q#gU%zH#M z^IjLtyd9W%>oN1ziDuqIqM4WZ@khJhS^RMH@X^!N7aOj&*@%xUlgocOjH!33xt)NX zzx(dHeHB%gJFppabfPbs1yB>Sjzu?#Mx!#v3|PTo2qJuFm0TspwywkF>HzC8#8!KT z>|Q5wv`0{*sh;4VTy=}$P`BUQ1l<#)hteBIVHqD)#myT8>g1#chcIAUx zHZMmGa~?5+-vF`|7=RF4YGwkE}IW~jK-4q@fo0K%cl(L`*o(DO~sQam> z={0Kz*kGH#p`85nRq4t&?F16etmK#SC48a(SPo``eS8zDKPH&yWVk2yXkR;ni`{zZ z%+Evs_?^Y5>felLH_Cqmpa~Fk8~iyu>uvrX{s#ZCk|+6@@xYLwro#6RVlx7g$Q=GC3)6w1dEP|sKT~l2{_$)&XM&&M}wvt+2Ij%mA#K-R0aQobn z+4-4c)56Fmr4Md}ch{y%nYw8C^5y92D_VZ%-9;E2e{UFW|5lm{87CRmKdu+ZW9@dU zIfk5b2=T;Fu%N}}#|)lxyU(?_KpoQ6MF$LyL~y_FBo-@z{ri62kxt@KnC5;~SC~&A zlF(8d41`euSB``}NTNEAj1qRPpfbQIx6vZ=dwH=N$Q@p~Ii_zTr>$)b&r=G5ksI_J2~z9slf@{{5(m zJL3OUU%G1buUv4Y5I{S!Bw z+4()&0V}fW{}c8Bg^LCe?nNb0wfo9OL%C0Qm_I-_QglZ@?WX8E#{o-`2kUkxJ)-ec zjM*gi&hHhSaUFJ&BJ3n+fu&%|$t_hR8rS#(2dYk-s62kSo}_g;FQ3}8XJBAxsHbPo zp0kHO#=jp?#^ZE8&o3x#A8v3ANF$J*W3C=)Ssw7=uP{$;*Z@tn=O_#N zz(VkjOoVjN3k0&qWM+nh%<P)MA^Tk@$-X;cbvj<~ovR1H-_e#03q zP~MS4z&U>AI9iYu;RXIWvQ0hBE(kE4dGW;;K`#PE{^45|X}wredQ#a!c-fW6RuKS7 z17E@K;@^QV@r@(L7XA&{>#x7_4o&Al{kxHV{qqYE8D3#sFkO5_a1`JNeKuH4s z`r6%YJ03vpa1hQ|HT|ScZufzCd~hNnE&(0%paNmV(o||zPN4D`5v!8oo9&KpUHzn-Xo*Q1F^a!YX)lUI?oJ zyQqHW&JT~cqoTh2@=D?oB<>!}rAlc7Yt{-ruiHfwxSV}YJ-yQ+k!7M>^abe3&d_;z z1t2%8Mu6~4Sgt-My|8eaN#U^qSl!t@;L}f-O1qTQOfDY|$pT@se3yI7n3rCvEhxg9 z`O1G(P^ZzDWLCk!a10D#b8K(VM;8U2U_s{}MC|X8d~*I`9%+$gE?@j%dkO9eK{EeK z{y7}GP!Wwlzh5OV(}$m#1*nz`C4iUtC-`TvMy_DyKa8Z3+ zPg}Rc49t=-P;N=;8elXAZF4gUULZ5;tVe{<=CBdL2~S_Q)z;ly)7%AioIsSy6_D^# zDitiLph~HsAu~!uB;jk8(o)*(wIq#;*9(2^2?;GNebVSLS(8SMnh+JDBuN^XAv}Ck z*4W&Vi2y-Eks}~9SfvUI^7ar9*@;XI%FsiC25uolZj>6OC3x|SFxRy!)2G*7vWL!C zRCw!cw=FErNl=+tQ^xGsi*CjEBGVvQ37C0caBy@Y5)FZYJvH^fwY0Z82FzNgLkNl_ zDJHcLVjN+>`Ogp`Zi4%ek(;TwA#@Pr|1TJKf4{$p z*>(N{HlH>>o6nG+%_qdq<`Xt-O~|ME@Awn{{ihEx}4tesX&M#RQWZ2gj_; z-}$v3XW1h1$X*rMkk@eSHsIRbF0vu_i1yIT?k>^;H|XG1#?Y9=*kIj(118&5WHb5$ z7^bGK9!k!a>l@n-m}1cU5+5FMfGERjdEc?)kVUy*GfZ2zdMw8x#-~+oo7tF?lRIbL ztnB2(0I+->t9R>S6B83HhPVi$ULUB{IGP$;u9B!Y4=Ji=gC1DF2?eONg@Q15!J->) zzU9{C3nsuJl`jh-JZR(5&iO1hKnn*cJet1m{s$j?a8}x^%utntW6`^sogA$+8+Yz} z7u_{=S32Fy-FM$TEn3-z#JRBIVsgUBlZr#9;~3bRqJ*A0WYugWa^? z@ikLpRUC_!rnQTT;?4PfeVmQ*9Upyn*AnLK(41Z02(XLs9`x`wWSwzfTo5AWT(_rO;T4R&isOKV4Wzr)?O zd(RhNeDUp9AGaZsgK!GqJQ7Utjo+hv`ZnPX>T}W@Fpl?GyJ4mRG7_>^+%=<|01M5ieN5Z@z%5g=A|Zk8bV8|%e0ob}ayX1F8x%5n zLRLoBwEV)EQ>HYB%s~LQa`O81iKE9PMVSIvRrnO$>?fXhVtsPw6yR>OAoTF{lbt9g zf7Hy!P>rXSb1dvE;6wvu)T(^Afd8Pj>u#DmO6EprYV|1zPH`m1O!yRMidLW)&qg|v zW?}`-6s^Doq7@j!vK197)#1aDF5tX-hC)=Tii*P#$*ALvj*UMI*)cN>Ub25KF-=mE zcxlD-^=;c$Q?q*YoaqIq3Fm~>)NI?fI;|5PZw;HZ8eYDc&dB(6y=Z>#{SI<4e z1Ozi~GxkmN_@H~&BcQ}!iGiykYiY4s_nxRiKlI@rT3X;*e(?<^>5u!q=)=@A)8Jer zHP((6uf(hw7$B1M5}%#ymlnuWb#@}-HCmlk1Sc`SVCKxu&a~7USFT*SY(_#F7`V;E z$0bikW0c$sHbn}via~<_8EAA(wzd*%hFN*@&2;7+NWedSqyKklYwN9J?#hShz#)BN zCVMMI^tH`2=oiVTwRhT_W(_i`B%|SjB7xI6oWD)SteL)A2Ime>z`wlJ(owrdex4D_ zQ0bU8>ExaR!}q6)W{v6GxjlOts&?(#g)=l?-m}NyKqu0-Tq!$c3f7qfJko45EH+0^ znNp_L`BNSvH(0V1h+y|4{qQ*nWEhYift>JNbRbO#K}e%{1+)QyI!fKKZy)sv_g|h| zM7@tF<*#t)5T!5x*e%7A5xGo=%cYK^;;PEc&5a4BOs8LZ3AuzD|LY6P0VnwD{7(L1 zem;)jz~mnOMak>$(Ybt@hU7POCMq>tr9vgi)C;!dhHIDy7({Ec5`c3VG%N8zQN=>H zHApehateA-$n2GwWU^z&tfY4u;lWVTv13=Rps@*bpDfx`eLj~R6r4`jLk`HvGE;o~ z!GlYXMNPzXm^tR)!Hy1aRcGVDIvq~e-^EFL1Rx4ITBrMOq64x2@UP1!0-R0}m+dfg_BCW* z!q|$~`sPx|kWhy?c3EBDwvQ(ylv3x3G=gO7E@F0s)pSuy#zBP7{8;PE;7nUcOvW(O>lwfT~s23fmAu zQp)bEpcuTB9Iy5%2(Xzhy`;nvom8Qf_baNjcJ3!gy@G#AyhF zz+g;gr!qbntxai}or$vmqnMl>+X==RGnO(E&)|?i(}-=he_HYCJUH7g(t7M?AK*ncZajaUGn_xaapQ`JrdsON zS9f)0tlPNJ5)=qzf#0#ju#Eg;3TTQp0+&>$^vd{-3&*M=9@tWd+W8*p3T3BNFd-7m za^k1$rvA#@l`f(3{XD#P(nqF}9N+HJB9xww!L~qlfqxtDJf3eo_iizGtL6xW{5g=9 z6btJlFCDrF%qdajNx>Nuz$R&RELytUzz3pWU7mqM1{LQ& z7eMs}NLISK_1PJeN)@cKcad|&$0sMxo7d2Q>H}pOS2Sx*ZtiGB$CWvl{G|-p9Xa&- z_V%8==+sgsQ&tM!*xNhem;Pt74DGl7Bdw}9%rdd&_IS~XnTi#YMA6hJ(TWlG^~sZT z#~T~pdFQ))C?~HF9#d4j^G;*q0VRSyir-H8o~8FNfcep>sk8k?X&!Y7TVpj8qhO-& zS2WXu(w0CLD8+V4{%pQ*KhD@kFIqI4PNh?+=jp8yCH*w@8u<->&83=YD9O-|ag=5| zrG7S77(=(!%ma)*6hs|*ei4E&H=oHDli$c+C5=v)vt*LQ!2UDxg}n$Zc{V3#0MUz1 zDZGP%;BraaNP5Cwr+9po`ESdEqI*Fl6c|{Pr_0C*42+1dxj;DwPKA+I!b53%l?N4G z+ee^(H;z4Noa%H&L|kw~CaV4_)F(J4q+2K@3-N92C_<56fXgqo zKz*xOpVqp2_ihx;C)$rcTL{_(a;y^8N_dsh{|-i|91RddXyy0%k9uL0uu8VQs=fW> zo3j9WUyOc?U&sN9$K~|TKhH*w##jL1{cuEqMe6b)>483b%jbo7aK2y!WabB0Ay5%0 z41(Jw@%G!?=15mJL<$hpplu8W5<4VF7zq2JAv!8rZ>D8R%lPi@x+6#GNa4Jx!3rpW z#Aj{2jC{_S>gMJn$7=w1Yai(I2<|>aCOy_}^vyxnT`FhQpxO{X`ZZ`DB!DXPOThBt z3@SYuJy7I;hJ%Hcu$J*ory(GKP(lt|JKosc($d!2)`{}FD`d=t3!@c-aLT(KHJ8t| zw|7{<73PGxozm?DqlF+-YUF06pinD_o;mRPI{4)1G$Cvw5|~e)nHId3@#*PFqeev~ zBqYS~C;Pl;efH3bNO(Nqijya$h78~#5)(Tv9B6K~s|;bu>Dcm=L;Zl)@_ycoaSD|^&=ApGwQBkbBr^jJNW8sKx%*Gm;CR#)DMOKTb-26WJnj~67Au@;_ z9IM1S@a)=!b2T?MG&FuC11b`^>#69y*}}Z}%~xN6G~y@hPtP!GW|fqbD|_L7t-E90 zy4!301ix~ug9yB_=v-K`Uf3`*$C0$ycIjjHYg#{{Q#o~h4vP8L zj}K4_dQUh>#O360v5-+#f}Oj8K93jq2gem-8GK0{q)s42J4_w66r-O$6^ZXKRQe|f z6Ur4Q;8Y&3I#E?M2icGl!aZEr)#~` z)m2^!l^W0p`MkVaMxg34^ck{h4((waJ9lQNt*)WL!v1*77LuBfP>#$y`3GFq1eFT) za5aS6ROg{{hX>!W?#>NsmMyce&pl(dytHdqd5Dfwd~E$TdvSO;DsYn~=S-Y8yqQ`Kgv%X6%{1! zWBUTgxl(Em2iyKEa=r52ZQDpf$3+|^1U*mU4&f!Lc#|xOwJ!vn<`^{#*;Ql~ zO~QE4Iw3zYbwU%-L!qP=(1=qWi@accYb(iopcv1rIf>c~c0LRG`f;B>_dEkvL7e## zYoE`16Zu zob$Q9fSGr#8CxE+uC8vu4NH+UzIDNbxCoO!zdYD@wWYDXzW(w$RMfe!ojX6;S5-?= z!~aYm7mhBO6s?hz=OT-7;J_>ty#9z>->bvf8;T29oG~iSpE&NWu5Gw@rs{A79tnXe zva*T#`TeTbzWjxxc7LA>zH8o->+|AO<;6(kKF>do3Aza`&EtXFpWpeniVGL5Lqpb! zReRrm^Nm;jSO6l7dxbmsav1o9oF&BFT63ZCsvSwLkqmC#5$hnU*ObRJ)YjVjIy-u7 zkj()oO@Oc>+Muo7Esf3H_6F(-o@~8*vCU~CT_{pyR$;S!wwA;1e{{AyrtsEVBf^Y2 zm4fCKMle4~q#(kLiw+KpiBCu@qzZ9?c)q8$>h#4{((yNvV$~^+SJw6N<WjB=))4y^uyo&ao}7xHh_@?YN+JxxA&YM9A25f z_dvyUoqr!q`TK`&fg1|;BXaw%RPzY;-S5xxzl+)Y(G&^S{*8+1e|DB;a)Kmslj8p< z{x<1tRg=Wsaeoe;pWlnk>P)Kmj9`e+<$f!f00y11Z^4&*Ey7O2WgnW+hLpSpy}NJLV=MkFyt!z^lyG zhaP&8Fcux8&Xg6P!1X=yLGNnso{}Go?vbplsDY!q5oFoba&27Zgq)eTKKRIo_&8>~ zVtk0gO#6Vsc^6Orz<<0(uTSMl=m+T4bRx=WgizE;&!=Ce-zh8N3s0;?Fqob)TW<&ObwAfGx4Te<1x%F6veoIHi9-J(T{GEIFKD=TlNX5pbV7x0K{?HoI5 z5@Mj4Q{cGlQJgsO!=BS;5X+8aYGn`2R=1uwfxB=Kp2D;C|A1=q**cCbT7j10^{dK@ z;1CjKiAK-?&X+%jfEan_zZRhpDGN)G-18k4p#@MgpBq6E&9PEYPJ0IJ_ZYF z*G$4fo7L*|(iT!~G1IOAjvXMbhfGp#lE=iPrpLsgo`PgTNO*EwOpF}Y8;_*Tv=pys z>&I(29p$EGoh~*l2(6A0SQlP81bIa0G2@X#3}RS;V_TYG0s6YjhsQvNG0=&|AVf3< zCX9g&W1tg_!Ee-S36C%$W%dYLp**aqPdFwUH~N-Vv%XmrfyT z`O^cK=DTqfcXPSEYD}a8ShQ2VYrc0miHp=D4hgdQ<{uBEbr)d_yV2V@HF4{v;rp;Y z7)|Rv3-hSU=xCMnq8#D(k&Sr&5u*1WFM9t`c>hMcf1~LAhyFT;lnQ?)lzarm2`yU@ zP!(2v4y!_jPl0ujOMT6x_iY<0pvr)r{v*ugc}|9pM3x9WgI---gpYNZ`Wheadsu6K zp@n=l{Kr!9RrpTe6BYt1Scm#-pKlMAiwvI<3r6w&+k&jR{vThziy@TZv*LX!=CAa2 zjt#s0hFh>~{EtI6{Km&Lt*Z<3fpdS0T8XtI!^i&T>LK~(T+t^NGqTRbE0Qi#afReJ zU8Yd3@a)^yeE558h)0|DwG1Fl;OXhyhw&>V7*2mhT;sO=rbdDe&HjEruZuh(b@rMy zYbHr^saNHyCJ-}RwrTNmDSFRK2}F}XNG6Vo29!`-FPS(I^*}lldR%*vMfwK#d~%di z592Q{$ff{is$Y+486Api_#OvCP5_vsa&r5UqIm3Bzpb3e&YmR#i8tU;Ce%nS`wsyD z>~UccfN6df1fcNqgiZ8uiZqp%f*IZq*$4?|_}|n`P%%QYt40?cjF3M>1JM~QN2!8Q zBQse_fRzMz(c0`|e_J}~>ob|^>f~scM0;I&ZDe|EY;0meXf373vlNOlMnLB4x22Q) z;8A|?7;Uxeg>Cg;eDJ{s|EOx;CXx8_kfqeac-}up8aPEDgxX>Lw)>F}q%L+t z@xoQBRz*Yq`dfL*Idrpq>;vNXTe__+4>XFE80XjV62FeHU%!$ddd>q%x!n(SxDn$U zg4Eye`1+8)I|NoN(?7>|ChY7X{sfMn`JZ8DpT-N4Q4C|?=fTOKX;4<__1hyzaLyVb z%;?ieWM1eR5#du=YU=p$SoCK92)FnY9K=c_D2@?Ml+3>ive064JQBQ%=!_6BzBH0bW7wM!>K@Nu^BTKk3#`T6K4 zGW$oj*EYyOzc7GZS9V|2xMh3sGL808<`bKiW7&Y$nj zRaCd&wL9wTDv&V~jjE{D=^xdr?GkjnIV-jud*`|5o_qC+otwj^uCGs(&PJ5K=H|U-KXNkFy}tJ%mQFjuCyH zTJ+0I_t!Tqc%greAT~;jpuf5qLPjtqeKb|U9XomL&)e& zn>`;{%{gm2m);4BwQBj2PSS%gGIChe*Nd7uGID(K666u@n%f?~EPuGEOSUPKYKJbE zXy|}|u>1T>Y9rasc^JEeqLsN$GvZ-*hbLn6xUmk$xU30jf#_$D<$&1)G^L;hl)8|c50FsDutbhjTh*bVSFQ}0(sL|H z3l~pIQpQYOQZ%y=u!|cO7S9?N9zNxU16ov^jrzn@n|>%pYwkuHAMalpmdM0dzw_L)?Gl?Ed#!; zim-G6-BbwN)8Fv`R>=1+c%58s4ADaP3>qNLHUWun$QKhqadoJX=)|_SIshzg>wtoR zt*fcW+Kk4hEA71w2thD?E!P@q&YpF<&z?GQ2G~VT2b%$w3?TM;8m(H&YYqUdm%m~z z1=2;WWQ@a?4D)WP|yLxW}uPLb1bS9zP_V1<^Vy1rQQK;yKbW~I5-G5!@&wuYLozWS-U(;I}AzCcfV?SZfS z;UI%D5~GcXiLpR)pv#Gi#p~&-$lzagQi=p<`lSY2LMB28C_6o4(!{aD8Q6@RX_GRi z&zP8xX!(2UE!CP#<}et*evxFZ$wNi!dm>`_6k~&8h=s|@O46AFka>$)0=kB!an#j+ z?A*EY?+q5^f(1*K&6_rJ{^D7~D7z7~oqW#HMMZfx-MXLv&8?9TuYX38=X@z&SWOPe zp9g1>mEA!{mO{wrDW?6W4?eIkix*D|F#~_bfeN|3Cz0X=&9x*Y~cpQk|nUk`pKKg z=fWXf6nX@P7GgItv}w{qo-)UezxN|HN*uuV5{PfN7ZVXEJL_ZO|6mY|d zw-o|l(da+^%H-{$R&&_IWj;2D?Hnqjz93xX1l5m?VV=!^Ym@|Tr<4BrlI z7qj`}I4HehrNzYw2xf!vek`S^CsM!9c>b4sw`g>KiyW%t$~fwF++5Ff*N{J` z$W0tKfUe6RWiI@5GnBgL&rM;kOFV;JX>9^2d^Q zeDd9QU+=4|sk;C^y|XO?)|Pe$)5!#b^UKlR+5{HgLnj*`kr3%=_~FX~O)g({W?GEK z*L~t(Wn~lk?NA#VQmV{>+FOK)BG5b3|i z+)Mt$ri~l!UcYR1!PGo>KGPCI4T7~bN~l3f!x}t($)*P$*t}v2Qr3~0FbHr)OX;Vd z-TC$>U+irSPf3Xj$C64I6=9HB0wnT#?pZd*&<NSd0Ii%~su0_Xoe zc%a|J%KZsM>Q^ykKgDmKqZjEL{PZ%#Ngmzsz=#i}zjt<4qN1;9inRrhO>LE^UjGjylAa2oPsUta17TJ$6Y(kx6z#{o+TmPQf+?m_sJF4Sc6fYg74)d(b33Xe&4pY50pl-+co0{p_OsN@!)J?gUy^$oTApF-Stf{RQYINu?W zf^$$C91$KO?X(94g_HWal(s`HF3{r(AW2g<0oMk{huW`ncq|hbCLnvsUHMKSefj!Z z7vv@fo5G9)pNh2VAS66gIu*n861GH%%-!!+D^Y*~1xutXBy&n;hzexy8dF?K=B(WK zcrEGav-i8Z`^|w4E0~gOUA`W8uI*iNok7J|CIHIadhD_?$YgY$*z;Aj)dpT%X;4H; z3byK)=!mc&9ZFMU5yK=$83gEwb`P*r5*OL(@IqWhU_y*4!O`!qb`bqL%;X`LQq7tJ zUDh_Mb->G$Y%l;g;4`&a)F_eFzJ1WH)*IVDCi8u3a#deL!M%zxhfh3(`NU3$KkWK(86y+7P1G%bmacq6*Rzlm^-?e1gwD2r-OcTv~7+6N(WqQ?zM}SaR^p;qz_SaNn9W zn*o=(tsuR>KV!x%8)|E%X+KmF9>PP-d;R#l zW02@$g)F+JW|oiwZB!fXzr;A*8n zxA!w1TqA7xE|=bbya%Q;tJMH(gh?v3s9RbZFJ3$k0s`;?b0OzW*0dlwRI5;cy|cc) z=8Qsd>Qp@vcuJ2{Lh+Oe%?D-_N_dtffO9vZKHf%F2z(2VC290%LW7R$1rbWGchcnX zqYDeiMKv`=PX=Sx^n|9SsBwj;#VMtrp23URZLV_gRNI|cnwVIgei#0XO{6Sf#fr&! zd0CKaoHKWwLUI3+`78YXk8I(@y1Ig!iJAoXJ7int)zzheu4sEHwU$%5Iswz6v_7ld z4E`Zrr5;vZrD?03XfTu$7^y0JtL=}HQT758W|5RA0uh<`gKYa zbqXEsZ+<^l~BnOc zYgay=PkcqnolCtUxkOzeTiz@3M;DGydg`ffGxJcndZqMVyih*em8*QWw4trN;!lOJ z{*NHxut~U2^3u;WxqO4t4P6Ykn^q|$oKzoUbWXULEKx^)!!DfGGrL~>AK4XEj&nLGnCIhCTR(W03w zuE*r#(%vd;(0}&ko7L47@?dF2b@iKX?#9%;4@wd)Kibm6$$|MrJDJC6DWc=)1#~=Y z-)XcRFNAtonZ$eAhjJT!$tQoL{!*GtM{sm-5b+A}B?mc-ntWMi)BTbubU!Vl@1XA> zZ9~*m$-t+BMQA3(FXWH31W#__=%g5q!t;YTIVg*a-)SVRv< zbA{VzS4ScFjr^5=3u%Q?j+PjR%m%*XU?R|xFH2CDx2GKmAUoxT;uRR^2iwq$O!Jaq z3@ImvH|+ni1SPo=vRF1O%*v1Q^oAkDoP~ryDflT->L6eE!Huu7pn#*g=~in(LXC7T zeJUZrYAr;_K|`iFqSBF*RX$9t52i`9)Bp3x+ z;sFfTV~(OFRMipejSY5QO$tqLVtn#oY?H~!4*QUW-hB5w>|n#3W`7}z6{GwP{6%uS z7`Jiu)Z{?5S``)(4ajy(Y;@;qgXe9Y;2^N|$rKDPfeV1}GeCo|O=XHyDgRSE*OCU=JYX?)2%lX7nPTZ#V&>XljV+fMlJc zAMDRat~ssXIk!YGtZM+ThzJ!#RV{fuD}WCv;jq?wcXhRE*~$e@T!%#SW=ygbgVU9 z?sbs#1akf@JYfj1cU!M>Iuqrbe9?Lm=M8eOp3<;m%cpj!?2^4?w}) zot=AF7TcY|`Q~dM?>kY61_$YbTNaMX;3%g>{@7!WJ@UZj&5?OXitLwxfiq`jE_z`> z^o|+-89+rvv=+>HHOQ2{3)E_GFjoj}+-%I3O~Pi}4WE&KvHyxnLo+7MH zawUpyUr1_e@j@Q}2vtN!(P&G=i@B+OIw^@O=kyt{%FaeQ{uGXC z|3Q)l)y&?S8qB;8ATp4hHhy|uwglT_W%bb?PY^_-0aF4~fdR-JMgk>_a5HMl3f}7I zy;6&$FDGqpl|-75Ft8Xg`VCDj*FvscLs%r?g%f}!H-ZDI@(i*b-4^MT(I&m=DI@42 z+S^*Mtr|BD#rdVnZfsI0uvaPgi8x z!&6>L&+}h${4mFV$;y#41BuT@eC|?EU^?&+NeWlB=o7>uqX6l^s); zqlPT_(kPC8RHdq`Qz+`{s8;e|Y)>}wy?=OT%EHwV`<=z2t1}%}hxF`;E0kHHl@xkV zCaVTNdY`p#$Oj!^MyWHPBy$k40*44}Of0&0K!JAdJj`!ReM=uaBg}PUWaJGC7cW^* zlq!QvctC`Dprzr`W!!;rdzs^u`}Q5XO43`528m1M7w1_cHhG^*g#>>2q5T6n1B z9PLe3at?v4!FE~V#H8zLpu`gt+r&Adk<7(Nl4>N1e$;hj&Un#C2EYG4P&F58YQMKu z{(r1}2YejW_4Ul`%=Rj+R=rDZa_`1X&4pqxrrA_OY%ski5FF6%%0Pe*LMMb?W12C| zy%*V*EnBiBSgN!4yY2Sd^Qrfgi|@bpAynmax$>!f%pZvT&_)24 z`NDOwl0DVcRze*Q$L9)Yh8DaZasIon%{Ku&5ICeDi(L^xA7Vp-Ox}#n~=%m zqw=9&Q@OwPO}V-GpmNQ%Ur5MpM8wV>kUJgV_aS}lQswcZ6>#32K79(4v|(V}+;P#MmuvBtE(ZQFX!tpEdrFt`_RY)y6K%_O^7pkt7Y}s{k92d>5sH=_*(Dx%-rq2eoIhHSv_ZwP;jPYXm?qXv8*o{n{mK>y<0y zK^}acJT)Zm|8KTW3$bu=$lbrLnxw^y*XDDW(&!NW43aBl!i?8q#v>2%#~H8v=}IBF z2||@&PsSaP*Okb|;To}59C~c9phUJC*N1-iRq@(fQX+d1SEhikV~sNy_w9rAIP&+jLPL2@^i+$}zD z1ODHxc3}9stf(diW5fZVzO>#w~ zR^7wYKUT_F_S5{MMxjE@`gh-b_mi)_`3B-A1SO640_4|TL0tFkj&Hu%Ue(&#T1I^c z%v>OX>INu%h{SJ1dJxMAP-DhtsiS?TjvUWBUS8*lnkU(Z5~B74Yu7BcMnKR$raq1Z zpA4xq&@Uf3a^#Zx;BCC?!jXmIo@nE4T()f4y}0y8Q1(`w6kXEdy)CoDuCG=dB|UZ z(~PuF={qMBkvC9>sb?8%=Ab-={sUGCWt@qjO&OVSz#|)zM(2WpCN2)Xhqc_gkItBi zo+zeJ1x$Dxk%{-%$L5>Lp0_VSEu2e)Nk|ghDz+{VW|L<~Vb&+u-7splktojPq;XH~ zL4lpE7ou|O<>H&N5M&_f&W8mGyTRL5lrMKX7=wTkfOo<9_#`AAfGBBw8~Hb_;ARY1pNR+ z->6qfVXtOrnH&=5_3?U+d}E)GnVHG=F$_u_lEjqU*)Z;9 z?aj^21Nt!xlROu`?3vVPd?TBb#5bJ{3RZ;>K+0}{S+E+g>B*w!x_oZA+uz;AD~D(J zFD1)AMDHk?;v{SSS0Z@#i3_P-Tu5SCzK^V?6mrK}hY;Un$1_XT(QhH7e|5(T$q%sm zwjGdbDF0FaF-n#+_?V{T}hRBR$Rihf#$HGQe(C#ycmpIMJNO0Kx;w6qYxv^5N>B*g>p~j^QZ{O)OSPejrd`GDx4ln_bvxx2LlZ! zxIIp{8}Tq?zq(MQB?=Qt#rJuLVG6Cns?ZYrp0|m&$H5|(r68e{9iIR1N&MK=b_KV#;hPsGkZK1=;*$a!sE-#?v^iZ$mtCG{t_d8JuI(KQ$33g0{7;Lg%LMkpH9r+plcK&*?t>XX8e~*mGKY>tdG5?MD`UcQPtrpvJ5N6Zi z3Bpng`n|4z4X6+J9N|dgeIAV+1v&eiA%L^O{eX>xyNpH`S+xVOca$h`k0^A2mf4V3 z#dmjO?S*~8ZhN9iRXBGBV$oA)7v<)T8&|ASEw}{N;Zo{iC?|*~8VwqTw`u$^GzcLs z&1mFy?ZJZ=%vk|(a>t#Id%afKV+RjDUJSH@h%rUD4y8Nri;xZ`vnm|4X<#suY)+b2 z#|Xn-qgfc?d6E&9W~48}2+za_gC3DOZ_&<^jBqk>+308oRFZBFb3icyX&9O2182^> z{WejlK#g;Ll&u@wx6@c+RVT?$NfYwMDtX{bg$;ercW=M?}cP+Z(f#5AO{?Z-J_#m*(87%i;mrwqjB zG-t-e@b@lX`B?oOcag%bXv+KUslW5idGnCXLw@o646wpeOh?tRxF^3jw3kl8445RD z0rMqmd@*LgB+P&bk{Pf-G6Uid1o~=`XHj1rHv;L6w_wk-hC@(jkj z2vr5P^W6d~M)MiGX*&k?DJ$w%46kXxX2mfjtJDazxr5|EQ*N*axE1&b-7^4VE=uquBX$Wo;^h-5L_W%VnsduRdZ zzeyu?y5D0kv_&BC-U0RLRl2^O)IE8X+JX7}k(Cf!4=ri@rZ}8rQ4g=^VvJ|8WIUz$ zFG!++7l@{cB;#2u8P7~pTw+>UYJy>O{-Q;Ku=vsmYK=~no^Ce8A;`;G(ntn>iV!(; z2!r0OF`HXkqnNK#CkTX-$mN$O#+GL0PqC;}abw3ahdx_BVZ!Gd2gYTL9!)DVFPJ=e z=FFMJi>VR#4o0))CKO7TL7zRFnd#iWfB&v+tODq-+>vn_S!wFc7bkOE((Li>P4E7- zu<&mmpP4c?H@Dq4arNE5N4TH>C;(dtDim31Hntez?u{X&NZfMz(4lG5&Y@u2Utf|N zfd5F0%Nd_ss`%tcM=;pC0)2w12n^J-&zn;jw4Y%wZ~Kum+v z^!nBJR#e<~%Vjx?V#RO-Z9+?0X8@doSW}}&PjoF__~#eRWUZ1vwGh?t1dTp#fpok zV#?*D#?HYRip5=2kIs$l-SGVL&u{3pFXmUG*&ubAVYki#!S3(4^72}U&uege0}9qM zcx4xu99D|J>Un||c%vWqQe>BswvOM#pT+FFKv)JzwZK|JBjyawB5-jfF^JPBNOd-7 z@<9Ud4+JTg*$RbPVISpibagrd?ygQ1HZ7H^tJ~%7X=w*jJ=FU?kZ^bP!gB%YV+X#{ z;R5K|3D*21(62>}1a_^`Fm4}&6sE6|lw+1_?W3klnK(KpCB|TCX^BKyT0n!5k~4bZ z6t6d8%$~9k#JUS6XPX5t0#^7%P~}BQl`G)Lk-ureb|3_>JNPL^ra}UeingcTaKqIX z7tJ1%kx^HN&9g2mbIk0*i>|)G<6&|NuYa5{!=owwbY0;nxd+R>ghmik=ITcR8gTW9 zkCH4=mop-ecq!OeX^^2QSz##p@=MO0V#%B?z?>%dXDRAOihoYrA&=n+h|1S<@Ss9b z3%^mhLebW+o2+Z4oB@?F;39f9sj!4gHwWS#wEA?;??~m0LZ# zx_Z)02)C3_OYzx0FD(<4a9*R5R~Mgz41K()z% zVl%V5yxz*q1>{h6+Tn$8JA*IK8xs&L!L+fe!LFo$ga=+N#-3<&R}!Gw zL0>RJm#UFtPbygA(;<6er#?s#R;H8dQ&TUxsOi9g_STCo+Pm)n{L)rs#OL&c$Q!Nr zP}qSBg3tLRvCjX#9t=NJ2PK5*iFl?G=$~~Z^ar>mmE`{}#P0BLJ-m_Yu*$6^00Is1 zimZZkTrH7~f04|jb(l#6VX{gh9al+q)=5r}50TAi6xG224(#qFuw%$`2=)E@0|9J+ z2M+GrzWHENH7Jsf9<6AiDy^gp#j$eycc#fQJ|BOx##_OC>vURUozA4Bo^w4N9oo z@HMQyZU(rT?fTmgV!Hj7)rY@&?X}n5{$i6AS!qd0R)o@yA78taVAN5dC>jZPCQnKz zHKZjs9Xocas-_%1i!yr7y+!at9wm)Kq#uV;!be&K!iIxDL9Z7v zFGP5g_E-7_ikK+&OTnb}>F|>uP@e+kd^v!}q+N*Ql>4o+Z@w8d${ITg4&BB1*Z~6$ z;9OdpYA?HVWa*_yj~fj%z#Oz`LMDnv$)L%L4P~Y-)s}9Czo)J)9ImT7cB}wwR3j9} zjvXsMT)yM47Xoy09dgkF;5{2^?Yscl`aQ0EBq)}X;6jnXInMfj8K(3)SBE!VR zr=v7t0+iCk+-bnZmQGSDW8&gW@FS5G0PLI|svmrpf*KSM-Q6T%Al4Lb(TN}d#8dUq z=m~f-N@AHpR|g+JdO&X%!e3Z)oE25L8OG5M#RHWdolY<6j5z{8mmtk4A;FTCF$&^h zOqw##-PYCyemqo7IeXS(f&6K0tUcY_@8PhFO{lVl7&+J-QLq7tRo<=vKcpg}$6zA> zVutjDWw&)E0%(aR*ofPuiJ~VNi5VkC8L58b0EN7-EgdH@J(m~#8~PoIu?x_`$H zKkTdTq{QFgRK$U5fhijFD>_ijIYkXif z7c)BvUO~EsrFey3tLdbWtfmqsU91hoIFJg0#an@S^a4590q3>>2TYBKQo!pn@}D1( z;Gs3V5Wl)mvWBIs>7;()0<7T$k~Msh#*6)>gAw(+!QetSm~GW|FyYkUL zdcA9(STl*!rA(fjV^ig zVf4~J%*aVFFDpdAekZjLI%*-Z^vkF(Rd-JvSAYVzxo}t7;uNN|5!fn{G|#;O^>`0A zZQ7wjvK7U{5bGBaL`YPZ5=!3Rvzr0y{$?>UHLeD)oD#WO0$EAIO|mDq*3=j9r}$H{ z#`?W4Ed>6ikgPYf1Ysl=&LGYk>cXHKdk0Ja1Icb-A`zvMM%g^S6B~3Xi~TuD}kub`bCq9;eaq0%fA zYld=T&K);p=J+`UQ^zI>&c1u@>FEt7Oqw=t^5jVqK|x|=Svl3wV~Y!8zk&QhKntQn zVDTj?yU)8$&x&`q8&$~Z1|t`^5tLYW&8PF zUISSmjV(SR+0RJ^#WfU7T_ceNH%Vl{n953JxEmt3&CSNf*48%nI0pzqC(5%B`Iz}} zm6ftA;5gH$9;v%CB`Onj^2iqV*md062R@2G0$&hnP?@SalB<0ycB-4wuke)5=J zM9-jSAlvmdc{+x{}JW>%ayvZJnU(CzX1`~+BpEf**wkUxIg*0%e5B<5}g zmyyIhn}T%EVW<(fmO~*yu98dqwPSexqD2Le5EslTNK8yiHE~f&1&t|&<(2W-BlE`2 zV4AJ{fzzIcw^)X+w$7lP4FuTvL~!637zZ zZj=N9Ipo`?p|zpjF7l^-^6;mxSkdCQAWojD@SZyL$RmS;k34eXMDGnZIQIYTZ-3hl z)Q-|JcI?>EqMsiiC9BS2nLJrCcf~9q_4=NXfc;F+pWCp31W~>hox*rzKL5N<6ykK# zr-jI0Lt{P#os2T~iYuow>E6p@B!*4DtTNpj~Eu9dwWsph<7+7lPx_b=gvEB1IGK7 zRkzQY)zJ}&bac#}yCx&!wg;Yg;)#br!%#w!i{S!d_@@zzkWQ%Cvlk<0U?akk?}_cN zSl(Z&ZoRdsNvUjVx&uL__4JGx3$S9pf-oTMo05EL8%_z!TqjN{=y2qeu<`vedhoC0 z^l$TsiTM`SLP8TG0QXS5u@iCRPDAeEhGWg7`7|tPG@&ER_C&2KGU%3#!D^@$b2M1@#GjHH`yT~soMH7=* zBpR5^BUJA2@BR{EUJj1|!Yxw3vLr!<=*#3)Oju9SFmHP`{WtN zs0-}u{cD}ODV{{c&#mQidqCsg($1P&fS zHohmKi^a4e$79cFC*%Uri{qhl)ZiSA5?T0bh^yZ?$DRZ7F`Y~Y=#!ZApOAxAth%@%EwDhC!M^}Jc?iThSOu#A z(8j~Vl-9cLf74f1>}!|U*VOZU9Y569sMyyiqrQfQ`l>nK*YVQ6qU<&L+B?+O zSwnp_|L^+RF80+V_Vv>9eO)=!SC81&Rieg;Mi+~{iX$?tz9Ma0lI;pq`i`V{94>2 zXIA_tprIMoJuK^fY1RE-&xZXs&c-V}8=qnLY>@d&agZM(X{fkY{1RtulV^dHhk@%q*Do!eL{)>O2PS&43`v%G?X&0 zBMpsIA2_^k`_}CU9F)j-mIL|*c^joA8t7FNear7w-*y`U8#egWt$6D?E)oodBhg|+ z0N#Yc_Ad24y7949{lynwo<#cfz==&?*tJQC$uX#608fz~Twkn=HK+la3q&}XUF&j^ zvy&DP z88}h1RW0y|3CM1bQTm6YDXF*)QeMfCl5rx}Ar;plS#llHBsQ~d|GtAqtEyNPyrD7T zg4jyuml1OGP-oZuxl8l>rvJcjQ$Fa#WMWZii;Pm z-SEX1TTZn5c{_MfD3#fqkdzQ-)Zv0ymA)vDrb-n@m+E93Lm}?uarQesxFA49=n_*> zQ!^4Y_-Rfi*BE0>daXt+`ZE;+RR<3r-gCTXoh}HfQ6#1)5WEs_K{O20(H0Vfo?b!2 z{CW^>L>@|;pZh5%q$-b(5XGNszpx30Qn zB`L{?nDEVb32|vFWXY4oVs72vFc)8!gP=7O42f4?&AS_ReDTGG+9=Xvw177AltK}c zoS1-XU!sW0H8PnZ>RYGfRBAaL2nM`vA9SP=B@>&GnwpXb(j2WptJ5fD3bi4|gqc{P z2-oj9eE4A1z&dTbB|b*0(wkE*}r4kcCtRB5$bL9S;k`4@hlSSemX2IM)2Ygbp%0ieTcNtmb#9_o)x$ zSm6=CH1p}H);NBkauce(e0d6x%AXGH@lB|L+XH`vv%OVDb2=kdd@Oj=Fn<+(0o-e> zL1R+{qMUfNE}p^SPXey(s#8e0Y8s>FWjfqbVOXK0;0AQM> zqd`BXP^mPK3@R)X4Zff5J%PYUqsOLTyUWF+b@6hQ&JdH3VgVFErHeuJp3Ib3trGiu z9HS=*w|rte0vItkx1qz~`AYKNqzqJu;rv*0auUXhUDSZJw3vDJngPsnH`7K28UqzALFTl$B1%%LN)OsR* z5CRp4jSzI4hWOdhKxoOt!y!qO(A3n3nxX!Xr@t3?bgjh#p=2=`FmP6dpNCK~DnmA< zcqEFa1eIDTV`L$Z)9L2qGOWn}$mIr{uwY7*yfy&?mTHm#cq<-?LMs7YDP%3fa0rL6 z*(voVq&urr3KH{C^jAWDl{fipLq|lCC3svuo>OsDBoqn^`oL7B;~>(a7(K9-w6{X2 z1$?MLK6LmC`6jhIr1DLT(Ifk~)DHN$eA@>3mJd9bDB$SHM8MIIvE7;LMXk{6HAH2uRSE3@eb#*QprUFy7xwwL$!mv6slUMjJ}{)}|g zXZ}3&+DpgwoIL1s9z40{*h`?Pr!^3pyk^jArM-i8otIa81v4NIYCzOsc6vfqCghRZ zDY;!YH#ysq=J%&rvXkecY9j6DtVkyZy#~#w?7B4*=Z>Bp4o@FFcj6jQanW9lRi^P8 z$g76o^+R||qzJu9zgRz$aW$m*qtdLy_|x_Er}vp6K3~L0?o9j06Ubn(%KDnqW39^A z^yWUnoY^v9Wd~X^&4N9CTvF1wnP+2{< zpM7@k59Pap!Ch74uKWk`#710ISzv&HgyNZj0HuhHLKHL6SVd_(Fdn?p88R3`4sz#I zk|*T2&@z{|vkz#BPOpnLs1swYY;2<1K-=T9F1R3TbZT}WkZmD%siVmgdAR&CR?om4 zsATj=I2aT{R#`|GgeaW2eEGzAqo%oB)3V6jsCndxB5DavAqH8%GBqCqfzdAuSebyV ze^|fI!N}xD=4qZ}WJX|~j=;!_kj&E&5^cyZckUP+<*r3=uhvcJ#>};s=sU`R3OLeE zrA!BV@U&#RVbiAaJ}PDkIPIpyP<`c_@Sc=;OO`Cb{A}9`kK*2TyZqgEcMclI-&{z6 z1A@qYddHC3?n` zmX>CcQBg;0YwJMNZmO(2GvM;cK_jd1dmLvfp?etU*z}ByjI21iAHde;7Kh!Go}OR; zp#lPXf=Z*0PbV9=-UkRkU!R-Of^*Xxqqdt;Q)5^m>Hu`NFC?%rsbI}3(GRxcms$rX zV+wvbSwFPqmAIBtz96mSS`rI@=u!WKF9`a2-FKAL`eX?+<37mucW^{109i{2$qtS; z_esz?9&m$LgDbT+rPSW(eWwQKRC- zr=65(6nXcrJZ(=_rGqgdN9C-mtLxL`VJ_uqx(KHJ(MOY$7XmK4o)9mfeM!B<{_&Pu zZu$K}?0Me-v_aZ;)GO@$Ky=-A4XB0&kvfQmoZxzD@32KCw@LkDP(BfE&%MUtdk-AyzV$s#*Wfp0~$q zGV$Tj8aJ-jfMMFol`E$i&fz+C6d<#9A3b*Ly;L79!`@Ar8g%g0qQCn+c)y*rg)R`A z1(@(MguO^RNMA=kK>uBAf5hv_p3LrbrQ1 zSV3g7-97=ZOcoV4ag(u6KfR4w^w?vMEuywR{m-7a(_cPa2yS0Az5PpUJN=cPAHX^} z@a2oeB;Nq-IsS9H-f=5;o6fG&@Yc|-2w)lgFAL06!(p8`!2vG_UzaK5w{sd)~yUnaW?!? z*hbN%3{BBbG90C_ao}Eo!Lm*U?ZMVr?3u5z7JK4?m?a+QAqT;0ZPknka8Ha=aI>M0grNt^iRH zc^0%Y(&z0-V=o{<#IYz`k)AUi;k!u6*nF(P1*=sf@k6m!-GZ>s%~vf#GQdSw6`?Oh zSKf8`aBTQ~OzI3RI=H7enT?jP8yNHgFdO6k9HY~^!ICC#K zbA=5YLVBv7(CSkLH92#)c;+lPc$7*FQpY@=0J#3i^W=|1GL`iCVckRrc`2>i9V?NS zM$9A~_{D14McCN7>pbo%AXtUYQ<)yd+;y-)#*tuI~`xD@Iw9;?BIeebKtelr2 zIZu+qg?x16t^IVK7Rh<4n!DC-p>VPg$p8}JZ1G^HAGo&w;;xL<6l>YJ}x2C4V0awDB&lxG<2v@DAd0zOYY$z;jU-)F6I(|oPT(jH@{!($6k`LU5Y z#*7W)rK47P#vO_2IW-w}WvF}?ySqF@ZMVuJy@4>T4%?OH)a=9&sb+Ak%G>HrcDS7# zc4cqV(em=9Uh+Pt3fPrMtBj9Hi9xoRyso7kwN+2rm1j?!IO}jas2x_hP9f+0 z@>sj__~y;W`jL6&SUD9d&7-)+3feKZ+Cm&^qL#MmpGL z_%)gkJ42Ku2ZRH7*a<#tJk-J;GpxyySe;68MWxyoiLt7%K2(zRA@!1T+o?$eKK>ME zywd$ObjqigzT1!F3rk9-cHEd=#BDk^AIR(b1b!2Rpmt(*?{1B=dX zx#da-V(>%xk}t%Tf9~96D0p@~F%LjKkD^M)b|QyuPZi;!Pfm`v*r`_+A)R-=*cPJ5 zH^6e*=XYYy>*zRBS6}f7OyH4LI29FfRyp{_0JM?8KBYl#N8907z&-%nTa=-I?4W7r z6mU7fzabzo+A3FbkjEj;iU$&tw_5^GI5kkEV<<1w2;kJ*F1H8Q72of1Tjj`-M=2kq zMZkxNZx5S+Tb(&`<_NVHdoss)oi1+_F${cre=qh==r9Jg6$v78xpLU+8;6leU&%o{ zVrJnlQ6fu-^o+yE#F1Ba54|4u)5xe*a3K!=sp2$oLbXuMRr88u7d4BT~#6`$HQ+BvK0#?dz}o4jOl{^W-gCqtCpBMY6h4$a5q==E~Rnvil&+=pH-N3XAy^!nPL zdQIi2sQzw>S1BDZmzt0b2v=T9OJj9^ze<&modpEr&@C$~9*`GnoLoI?CXzo*?obGX zhqYiYs5^4-pjCh5=xLO0udU6_4uuG6akL>eW2`!&OJ0by&;0zM+n*l0CnpElcTtA} zbymfjLzixk2V$B3+uvS){q;lsnKN0ouu!jGbpHc)-DNf0`TP3{^!ma=mYq2>V@x7r zSB#6Bvn*9VVPO$uJm}L<^8CRE3x*$yApj3T;onQ`HZNL~krCtX^Tx+}#hW*CKAAfJ zTQbEcFMZ1p=0^Qu^9?s>wX0WKEX#_(Ik+C1`B&CL+<#BKrM=2xS-o1Tz2OGUs0`M= z2w9u6K?@jyW~&xZidyz8bie{qCjjYO;v;*gtf~>vQ}FgekyG|mR?&2oc&pm=0>b}T zcMQXZ8HG)+O^!w}ag|`%;HY5GY6x&zU2H7qM&;3H;naA>p4Zvk*;3!s*xrxKONT?e z^*P!`1zsxdS?%3fe;YVjR1+02=fCMCI#pALJFamRP$<5h!w#74N4(f{e87>$E`7v$^_`9yR#zRSzDac}T zbsCLw`M^L&N6qOzB$F8Y&bG519RmY$xzV_N#~I$9mppIA)MZzXOJQIojvY&GC#owe z8<#Dst?dLmcV}lfOm5*G50V*B-USeJ7I^_wcT$o@)7RI~aHhSdug_}e>+5W8Xz1(H zXp)k)e_a_F(iCpSJbytl&)=7JQowIOrcUCeFiya)p!_1F{S4YoH2WgEJl08=aI?1VxwFaUZa2AkA)F z4wJ8sPNWmbBU%LfSy2i^wlD^RfHfTfS?(){xR3^rFFyQjNj_9ItD>i^wZ01WhE4U# zE3lM}&0Ahcu&Os~n6el)=}l|m)HVg3Jb%N63ReP7=Y47q@H3=!K;tWjTF2+DB;Q@pcfeUJjNzEB!3mJz#dp0S@*E{K=#d)B7kDhKl$+PUg&s zW4pdV(GObzaucrO;Oj{``u{-k1zHhsrwNbKS3Fouiru4uWuDG7+8EjRHR4OmSLa6C z=@ZWtBb$u0n}t8Be?XR3Fj$XFukWrG)`;z0VGu|o(BII{%jCp6p!n~!YYgmq}eAb zl`ys<9C=?Tga{w)!)o(2HkOrv^WylSy+_J`$~o8!1F#et8!S?k%$;7mosowz$=av4oc~; zPYevghHa@mQF-W4Yir}7L))wIslopKni}k}j^5Uu_Vz(N6XfyixpOc?kQu9>b!v`~ zZ`e@Y9^H4ERO(i^iScIxPKsh|3ZoG@O>9i-(8_xdEAM{E%6nC^@?OQtdjKo%LCMPd zy=3LhG@Al_8daQG8|rCAdTTdH_AH4gTDT#?tAXr089GL6%`aZ(5)7_)j4>)8N zdnVHI==a}$>7|$6+wHbkT3a0vii4um(P6j*cIuj2!A@ZE_jYt7C+oCyu(P$*Vlgp( zyJ|wtm|TxLb;5!N3K2TnjuM>N*$ao`J0!^gjZR1?#6Go;dOP)&nbT9^;?i=)^xglm7SfUrBO~{6tJST@X8$GtH2E~2}HK{GjDD$DJ%)|$qe z##1%T=i1<*MM<32mezv@yLvm@+M1f{>Ka=+>grot`uduXvV5kg2?uBEPb1cx1V4{E zOt9--2MFdPk&sd!tK+yx#Gps&W-uh!OtI!jgyXbo9jSAIJqy8`nVOV&S6p|~I3p@Q z`3C3A0Yjw|x4Cm&K}K&*TyXW(#TLrTYc&G{@Eef7fdQ3X!Jukzra}>MI6X)Y(I`78GYQcd+)v6;%e^+N4;KP@$tPpxETZ)i&`3)(da-;`yj+~tWJ$eyb2^` z%YoblKzRU@RUMz3U^68p`$3ZrGf;^tFdB_niyA8mD7E)urQR!9srN}%>W5gV_hY3# zCt0cQN>}RHvu4n~cJ%atOQ5UA(Rlc9Yfm4NvBEvghkYIhkdQ0nb@&8OTJ~T+bodB= zwmSgpr8EVK4RC^9bR|r6Bjcx&G9Va;`bR1O$+{+%&CG`Dh!Y6)b6W>;YV9)>iqAev zOf<;+khor%I&sRBG+9q&Wo4%$Zm?bw(mwlShdTLnVFe8x~HqnJ~K1(*=O_f zCnSUK!_Ov<&VT5kOOtzd@7~>&eCb1fDQipvp;?M?4ERp+j9%=--inHjE)NeO)br{)Z@>L^MOOlNfoINcI9*}S z=O3e=eeYWSFZ}&z?*jB$EpVjqRmiRW5YI)>I>0gYI=@zIui*F`w76S@CuAu5^Y&ul zF4R)F7z=j_QU+%u=jnIs%UiZ=d3B+f5I92^k2X_Sf%Q1eY6tcM7hj-V%2`xQ)GB3qB)u9~2D%*Q^LY?q z#M)yxCGtj8uR^E2kU8}Fcj3?(3h21HaMPx7^ND^mov(+Pcsy+WR*CV0ea!p%V~=0L^}z?Ve?Qj2!!<*+bFMn_$6tuq}fbeIW?mLuSvGzht!z=GZZ=M$e z3(tZVDWA?Grze)wiYhQ=UBq1-2}Oy)ENEc@YP8U_SxpQn!J$+HpuqEjTA}?(D{P?kq^yI`cC-D;uoI4khd$Q*)?Kp^JgYu5crt9spCDS~;h155ICx01pd(yzZ zAAa~@3v{U6n{aU4ynHd7UOur!k#|mX?AN#lQc~tFe}a&?p)uE{V1_&ogO0=;pH9E~ z?j`A%nWL92|M2e{zM4I2(zs{--iYz2`FK}t7*MhL>y?Ui## z#t!isIhGeAhg$?2Y_PY(P2!SG=Wya6rRa5aU?IA@;GiBy(>~NqB>Rc8*Uza@#tonu zna7J+rPd-tk`1e9tOSLk-z{Si2ADl_e!+-Q8R=sSFM;EJ%D9;`=N98&{snWVLT)A| zBYk)3WtT0UKN&n1(=J1OFHp20FW%{~WrqS37Y;@OV83O02GFNaZ(mcRJLu&Hkgp42 z)79T>pOBS0r#R&6XGRq)MEGE2VrFLEEF2Wf%+g{Pu0MlS5SyPrbp#Acd1gMq?_)_0 zv7?QI90&VD$j6U#_qkjtNhHl*783+RvYQWbY6zVO>+uhVr)y7Q15zmJ>mjfpO_1CVd$*(C8N~7oyV|jE zI^i0$aoe|VTmS0IcCNU%VEKJ0kx^A;i|0e&e+C~U04!8fQHxwDeHUj$Uxc=ZzL>s|zTdt8+U0I+ZC~(zs zsc`O;^tEfRo|TN9BYD= zw5B+nlnPc3lovdxlp2_Xv>GW$27^kF+ov#$_6(d}VA+Co2hwgrJGOJ@=FMC89fZGN z=l1WuMV*b!+qWa;w{_bt@)W54ZCpb`O=D}bof|oF=F}1R6==N>?ta2+=th2&2meIH zq&Z&Bl6_=Jm~%tk<-K;40>*&|td}C!dZv6JZ4_3OYjND4ol9MNmh#x;5V$x!Xi=RAw z`cx>oU;-lBu*_~xu$VWG9*t~0pl}5oR+)9Uh)W6KY`_Hn@Jp_F$=Gvtb zoE|@({4Y{5Uq+6=D@&EIR1TF6X-^Qf=@Mz5E}1diP2hL zQRDFL*iqjO<1O6YT73XZr1Eqtac?-oeek)|)YJpfaA+H(@S&46eGpOSYUSlyw{G2s zP;IG-mB*&%WR1w0WVTK2=y1`r$s8MJQVO09?9C`11Sh?cBb952Jx>f)PTud}IU}q( zRMT?UnR%h>0BO>}8`a(2;|Z`i!K9@i;d+sM=-O+qeRwgX$2-_r_QIb?+E>&|>c{WA z^Uk~PTJsR(;u1)sm#7cm`y_2MwF7S;#f7(0pHP2cAI3L4z5s9dTy$QRQ=dZsuEVH5 zjono7+TY)N`}McKIA)tXZd|e^(ArSb)JJKO#)ZQwjT)LrM8Of|AA`kEQH@3w&Q4c{ zo8gvg4y!Wk^u4YE6gt!DKwgVH_YOakR$*DQ<^if3hJaYlo@$}o6i@5uYKiep04wGqARp-ptI*yhsXfzizqn-Xr=Bg5Zz6z}1No~L;9J!`K#fx(cz7u78%3GQEF^fH(s7~&42Es;;hCSyEYxI#IuMj-h zDbaJ~D0h449GzyLKYsoDStyuzvg%Zw6GYbChYwfp!5&uK){U|~E?4iVKIn~JPlPy9 znod{2#@+E90d*fdc?8Drp&ITSCR79BewSlX40Lz(^f?$E<+DwO)fn-4P}?IC0S+7Z z`mnp-9bt_$Ai07YrXXHLHi$1whlv^E4@SfG@s*sq4$7KVuQw-;FzIOs3*?3Hy`GQ? z#Dz>0){Y=(^|T&6Qp-X%bFV;HIRvU7{!f}yz{_d|mZ4NRdStp;tJfL@`{Y2t=Z^Ro zh7bGQz>tS_8rh&(Yc0fotUKC-miB7mrob=?dd*UWdFHF^x6|p>;}acu+1= zvAmkpwWb-RmQ$lRu7Z>i2+`IwTptgrBB3r!5KC7U7I~846KzN#uV=SvXi3hH}qYE$ewaZVR zI(4dzO2hcXq@*UNrNzajC)p;$Ysjk1DlJ?_0IOlA;$T$@f$ku7V?P)2`Wb~5gwYXy zNPykJYH5DBI$aqg(11h&@e&DC1_^W!-Pj|MKnJ7}XqI=s5)LXASO*v#V!J6Og~AjE z>%qcC{a%w!%lSZ}<{B7q0xam##e;Wee0-b&EGte{6PJ>bm6DP@E*(K{rHa%P4)>En zl5$l#-j}H6aRq#kPWJg21Gzn&^*_HBd z39r#9$zbC%>l6JD28x)(M4rdoh^UgLO^Jy~9bpEpX?$$#NI0o;P~?n#7;4ZT76Z@p zF0f7ehS;UxlYK?~1WH`pd-v@R!wg;mh3ysCsUVC++X`j+Yq8+sHb{+^*gxPKo>+i4 zdYkLA&tryMqziT&)_+_ffBB&>{Rc5|WY? z2u}#VpC730mB+^N4K=$y`Q($mCt3FRCJ51O+l~)X@@U85^(auh{*zBWB|p3E6FB#_ z9zK2w$kx-9TPraS8|uuSLjYh^qyg>N;yOLEc6|M8n#Kd>BcM`@qM|(Ho2W{<6 z=Q&8Mt{&JR0Y_g)uM3N;6Y)$uc>P4awe`7Z2J6cc@cR8(epGOi6R8v$1c;;6*8`p1 z?{CN23Pg#@uBB#ybd82vKNQ5$q-f$iv(1+?AcNzOs7Bty%RswClmi+4?}}yh&*XBC zMbRJ+I|c_mN(Ip+WZ>bosNvR)iDA0CT>(A}oiomqmls2vi)|j9y`!V9>KL3>)$QHA zy;;5OO-&6@InK2LyU^6r=_XNwPAA^i+g<}7Z5<+7>k@bY+X)aVD)5LAf#D7z8A(RT zf~CpYh&xQl%qk6qH~i<){PZ~8*3NcBv|LdqvTX( z*ayDAKJc|%7VH*jIpZ^ulap0yQjR<7AeFN93N?6mM<;0nTrWQn{s=P3xkkcN?TK8%XZVYD4~cyAQV{0n!#kE^h$4UjyoYt}#*O9}*sDgQ$L8fFs(j6LC+mB7 zRYG1MpiqI%C4y;8CbEDGJsxbeia=(nGI$1y<4jPIW~Uzltn*cpNfDcB0Zfn^#4A4Y z*h^NZjdSL#y5qrnZus4G*IhT~0m^~%{Zee5;G>t(G4x2tYtmxyT8$WM{2DmkzhM?^ z7}nAcQ!d~b#)z$mo=VRf-Vb!x4^9k!TNQQy4LwP0vLWd{pJgfG)>Sv(d~-nxYGj>m zYwJ`h-+VI*nm|g7NzMMIOgH_C+DprANY>sVgc$j3D&uR0F5XkQiJJ#TY~>gfHxV7Pj89|f@KR}}Ff3A`2(_+yC#{y`#v*FpmS z2@-g%L;|msNZ@%B`nK^-ZeXCcc6Ti*S-AWy%~g9**P^2O3@&)5pG0L(o~%W`4s1eS z4xBiNdUo#ClZP-6yNL^cR2rR9>%E~Itr=DcjTz1)I zw=afdd>JvbO~XFq52+{B_uq8WO}AXXW)(c4mrze3Qnp@fU%+|>#gy3Iq}H)_;PVeG z0LbsX;m^J&ipf%X+cxWz!_+^jy{g|b^a=E75{gw{BHy<0*s-~D@4cUHiITe(pHf^PL|v%o}es@A=}Rk3QO6QQgoC3~}wQ8t8fr zU2V8Ow13w-@4U1Ay$_*^Zrn|*`S12t!E!kS*|h|}j%@Tv|EOdRIDW%=pSRl`C`)IP zQ9vVe0KUGy`qnNV(L#D1AmSe293-+E80>^)SJ&Ty`~LoVZ1fIP4)OaLl&7;g=(kRa)XYWQO$Y`$N_aOp21TwRjZri# zjuV^^LoUjIZmZSSDeSLkbu@6x|I$RC_erS!X~QVFT%~G0aTXF`*TJ1TcOmC-e^m`G z{lKBq2pBY%Z-GI!_tZgTMjom>h3D%k5A4~q=QzdTx52MAMg1$-O4Op88BD%EftSnOmrWc6!V^hq69CWX?(azqW%4|f)kFVQxq$?6X2_dWb zi!^E_mzOsoFD_J%4>vhO-t;{C%!oE45BW)BN2C~)&IWifYU)}Xk<;IN^uc@Yz5nU{ zuI{?Mduw{UOlt9saQe;FIFDe5{kj3JRL}#2Jx&jzW)YiN9iND>b3EJubFaU2%Ba95 zFg-t+FZ@3CoJ){x-CEYCvtBQSo_;mP4GZxU67&wxSifO>Jv$Z~KnF z{N?%Qp8J3A9z54s1tN5(Nm)>gkjMK&9y|4)rmGIU``in!ABM9WKOP+D?CtD!25o9t zY|hl#lXIY9t}K9DdQx`%lHlvb!rfx~gK&pB#BegJ^|Kb8Y5H)0nY(9Ba%QvDK86|W zAtpx{fqkV}51$qSbIMQ{B#r?T@>WFQbP?oA*il-y12N43> zXpe`D%Sa+6EM%TAr)LBhS~^%JD#VDP15-o+p;<7i@!&BJBODAb95V2G&k$w7-P`2| z!OCG!`9cT>1hO)MKGrut3PX^sDi8(E5v4#>Frm7AIu7akwnU?u=|9u%#5Zwjd9eSS z14jW5al)X~Y3G1UYh&T-rTnEcV|5xt7-A7!(yD>xLx~B@ssN);N=`{hjyI?n(8M#8 z0TqBy9+y$XBEAx1PK*WJ5Q>!m@B>d@>1dxbq>j-L8bMyGQ?Te72zXOXifGv9;}seu z&Mh?9)#GjR*~cJx8VrGQIg4s{B!~hJj~sqBke{FqZ_p$2!=m%{x(%Gb+thsl1j<2J zkcb!wi{E3pr$$GDV6NcdkBdaL3M!;lqHleDewQ~4PaRl35^$c;K#1yRh9grXN+IPC z_|IzGIY?{*NkF)#S#r-ekm$s>_TBa^`+29GK+<)==l^CEdp}=UcoJ_Dv_BKCW@7(TK+$2?*SiG zxwVV$J-wGqCX?Pf2{oZhI=zF46amk%A@+ibC3|+TchB*7RF0woBA|j)3BC6kN`UlU zr`OEh|L2|HalUiEd%yqv-Pz1cm`QeBd%f#j>simEN+}oeeLN+y@4j+leYwyrf$C}Z z`g6xVEEo1_d#V2YB>V;$OaJVr7`XILMvSyXAr%iV6v}Uq6yk-{DpjsZRa3L2=I6RP zxE7)9Y#^Nxj~d18-fe?W4Vi4?q9SupyRK$nG3HnK)H`&hQ2dDUDD@>cls=@>sgPfz zE&xbDpHC~MoYZ2>Dq`tEYJC0tW!0g4K z%ryWXN;nxw&uwLXA$~2lIb`*XuQ`TA|pfglt#Ox{lq1X;tX(`U3>Dk3yz{ zm1;DfsMY)S9V>*|-LY-ks7;_JusZSQdcC{4x~m_x6YLNVIcuRDcuMMj?GRV~dDeve z5MLiBXp0Kg4QZ>E&blV3H#h{v`zh*L5pKq-0`N@>yf-i7o}vU1Gadv@F-2t-pv}9n2W0 zC}v8##$~bP!Yfx&QVOZB>C(~)MGIst?vY=ZTYzZ3T)1=Rh!Kc+g5NYl)G5$-?ob1D zm?;Ou8u=xmutE_VNz*B@Ir&l40DO#=42jNeuTY%2;qzTS@tOGu5Ig0ltddY)SRvkg z+~?c3sR(G;$@KRKXeQxHv?NI7+1V9A%;V!Y(iI^`x*}w(d>lu*0!R9I$dNuCa-?~% zL4gF*38$mmhFOf$W$!`hmlmSi#~^id)*u0ZP=1C-dT@CGam!EKAA&c&mgelSV*2X-`c;g;__PMeuoz z&qBs}FkiKH?b@?^-n@D9(%C$K%9I+JP$WS*g7A(*omMUq2o*{xJ|uYwzaNdy0);{< z5z}~w+zY^91N~riA^MM`0)!KY1V6li5by!7$LGY~PysJKfk-N@3MZDDDIc4MW)v|m zlZusKY*!#L0tEvEg8=4YQH84^52BZA1sE3v(3`=f5eEF|uN@kIn;~gG{H7RED1Hw{ zL@%mGz}5$B7;zi`4U5HYp!Sjb48j#?HV-pz$h&(zR!r=IV`-n?i+B8u!-=vJhL!+0 zz>v$r{$ZaT4yTRkW>i9o|VJXO*uv=m_k3_Es z9r_#?wnV|Ng%ozz<@9<2e$o>g+%XAVBu(eD zxop^i*w@+GbRFsL>$h)SfGwW52|Om@J41ubrAyaQoC}zhv~YMHfU`qleSSej!jJ@s z+buN4xJZ!LN^8@L@4a{8kgV~`9>rr4HHKkm1&~Sa0#ONQXpzb84wz|YdlB$;uS!?1 zUj6Mwi&j=)8WZQNuC~Yom)GHOutS(J@5L7%7&BraiS&XU@YE-QWz+*$n=Yjk=)iNB z#9ZzVCPcI`Mro=@kSNqfqede!ky8U*4G-jjku0D{ zE{0Ph+SA}2kq69A=T8MlpHT@!h=AnsfG|ni$FXr&Z(O~8{btq48sdu_RJck<>UgnI zCyHp+I@YWVSgg21)S~V#Hw~IMiAIOL;X7-+{)&Y2*DfHRR&}u>XaSLVSviS`u}S#} zXpZN&I?`IA3bWgOV!yK8{5)iGU@y#Q%g&1 zY-cBHxSf5EUT>VF*C(Z4KVr3ZR$8s~tij|w85a?V6r07zN(E*6V zEDOG`fZ>+&tLSUjiV%doiuXeP34qnEG6t_m30?+h4LKp%0L5>ePN`&#cE9`jbz3i5 z=IUAu_~IhO#lh=PHrRMNiEc5I`{)ff&IKYDNY69J`DWMxdIfQZ%z#@CL>8-pzO4^LWvOwpYwhm z0SE)o7bOvTDxlX2iFgh~9y0RVgsD@Yn#%rRJ@7@A(uQXG+L% zriI*l{~bS6PRPBdt-5i$OBe_L?sV|zJ_XLOwaa6cdkB*X+)+a-t9|CFrGo>fzW(GR zaCA}_6j(vtAfs6xo|~74##A&Ev-*|KFCIYGZF={uAvuX$-Pu#vcfpjxShHL|bjp;e zNCr-s!s_38=kwq12vc)%!^8a5C%<1y{laKLKZ=9#qbH>gXSUDJ>cg}~17zUb4m6~T zd0LDJKr2SI1Vb%wKtvo-DrWU>zx~eIqfK6)uL@b4%B@?#YN@qi291eykJZ`-_v?cE z9={69YwCBu{Ce}=eILKSdd<2mKOqJkjo)qV#HbC9Ix7H!Zm+f9Vqz`tH8>dPXW6;X(NiEt*6n8Rlj z^~d}}6k=19kgcFv@r=Q<7taZJPQ^1A@Bg39F=5^N&sk|=$eNW%4mQ@;$Hym_R8m$M zKp7i%kr#|T0alrnHE>jM@ws!?tE;ZC2$#_eh@^vp^3W`V7;+1y&G_h}wd>dX6Q@{7 z`)x!XLky+}e0$}})v6n}P{gghbsY`l(68m7BS#C>8VSCYN^y$evk~;kfgn<%bp}}+ zWQF=@A*GI<0pi@V{v#K9{So{5k^(RmM{>vs}cu$h= zEe?DgaDZF+ZahcE&g_u$8#;Cl#2NX|vGc#^%(vgZtPKv&N#*(xxW2yRo#i2=#=fre>=vlPYBBGiMmVnKOb4N!67j zM-J}ZUtwJS#1n08GTEgko>-3g3ku{y#l6&H4B*v_VE_IohGc8I+J5`-yWc8}tZ{v1 z<)up|)7i?(^@toVT)2uZd1?n^06`*161)5QF#Ac%Q8>IASsknqI11#8I9M!#VssYy zJ358vY(-?r^SBuq1#V-Xt-IG%Q}1JqPMb{zWn(Wwb<9;13W43~1YIp{G%{MF(ZF%Y zE^{7{%;WTgLwCLn*|fSkS6f>*R?_FUUb=LHYGeSU76`Oj#8S9ds!q8i-DfVT?wr)=P zbt{;I0ezN{PCZg-26bPGjzbNsqocPXapJ_MUwGoNNB@HC>i7X^S;@&!VR{!z2weQk z1rJ5U;KIerzWORD9>|Pn9l?+B{KJndTefU;ECnau*w89t6aV%%up+nLI)z%qo}2Ba zs3__6ONU8#UgOgn)mmK6cmNeJn?jow(kf`=>}eyJN0Cg970M+M=vwRU_PA}GT@46Q zk+A~a)F;Q3%WiM!Xlifm>BU8k2X2o5sga~0NDklKsaOCS!{DfvaBQMX*4%D&+sG^r zg1^m;jqRW)A(Ns&eN%IHD=vLGx%MRe=NA$wJdsSoW2YcMhZn1*ry^0IxB$dtQx`5u zpU;Y>kZP-!!iX+%o;Z89`U>nJ-mg}ZIbgualLHbdBzb+STiZxafi zeHIa1IWAH;{nb|twXQX-2;vj1oCRIKH@jWPzv)esy%p2K8k>wj^KszALh;5DfGqz+ zBHu+P-z``6qmcU%$!vb&;F6M(@l(bU3bn*A8Z#!p*NK=apc^n|2G|nDCeXM&gmHyO#mh}fp7}t~z!4KcX6bI{$jko%-!~Hm7Ha~ynlTSYR>`PBQ|NQgI z^7RPiogSAJsd#_ngn5szT)FbTJOtvl_|f^ZUVQPziNnG%l}o|38iou2dVVQ!m{N;S zLKd!%2?On|R<4vDyU-$u83<+ZOoQ*rnO}cB+aXEKNECD&`IXJDxq;T$BfswlZ^h~A zc7kg1dxOxdhF;_$yk7gAlb{~F-C5I(9cj3A83o^qFoR*}-vmgPb273-9(M;aYTZ5|!Fs@Qhmrjfi6|-0 z6Pg1N3h*Lia)7UqGP^MO(Vb$sBw)R?GvH+Xk)rwWR9Ud6wO^aBLVb0Of zX2tG0YibD8w7#3%IUOxM4cJ;wFA14Ca8rb#((gwhh3^yh!6Sg-2(^;%TuTMkM9HaKC#k9Wxbp@mvbJ&PA9 zCT{)f{4+-%x_&Y4N-^$AamZaM4!JAKL9LEe4J0qa$;&440!&6ZWg;(mc#%+JDP_oA z|LoF#*8nhM5>mB^G}XKGPY-5U`lmL;fdhX#unuj>0>MushGPbV@W20sM%>!}BXU^e zC-h;d0XsrM3;8c0EkgP?=;M()f_jmYXa;W4O`}*X4eLejzpkgPF9xUVo;JxI*FAz9* z?U*NlM}|xQ@dNoyx=-q~^@IcN?v&bly1RSq2zSUDaK_3hn^|O|H0Wo*KU!m3O@6ZB z--j}!gOQnr^E8Y5d<0+x1~|7H&J0ZbeUJ!+ck`L&-5Yv~`2OgMK?RY3JuX=5jH(^g?T+bK!6PGnSqb;?K;K;C;9jh7x}DF+2%FNxlMMXz(HD zg3+RfgETA0DP+M9eH%jvlBr?&(WQ2(gen4LOYYqSYFMfbST@A!H$P-oxxP&y-_dZdKkY8ISQ0 z;bZb3mHhq(vX-l*ycgwPKy%EfJwUj%0--m>`#%YeBvOn{(hyG{s&p*Hng2g?I_mq? zRB!gHsb0s(^cl0dTo6YX9?J!O6ulbsaX&Q&)8e^|!-lp{lLxAagaRQ%u7r zchy`uwqu8U#{~$Ty1Hw?E2bf0+W;kwdl6XUD?t{}OX$Zq z3#9Jb`V}+EN=r+}pjmTVNm*%GT>cZ2(QWcRFnMJ8qit<1^$+!{_mz~Cl$8~gAZDKb zQWm8c7F`z3h7Th>lxpnKYs*BaV+}gFLo4n}4cAouZElWK;16w<5~`#3HDdG{?qt(>0y`5hrp2#Nr18mt6IGHxN2N!saA^XlL1yAQ#MhR1&^HJ}82ilUhZgf5PDu z$}O!{bH1&qp{Ks3w+kOR0-$)toWNOAd$ro$3SR;R9f8wfZ*BEbQrMxKvUT=aYa6^e zwm_y<0i*-Y6g7+jd*Nb|H%g*$Upe!j&o;@?AlDd$!LH}f`$%8 zP7x?2Xx^MJ#8$&pv>zo^FC~aqW4?d+^!X0Ig(%whz(f&IdEHXE6hh%Xs|`VpDbXZn zlf`I0QcHr0yFO=EOYNQ7t4Fa%N5GxGclXZY7ZfdD0=Aa&FJNo8VsC%kd{dnP10E1> z14`|dqiQD_iuQO1gV(H{)%bjhXfS`vWNMUNIvwWxo@+-AUas%xCEOD|j)8hy_#GQJ zojAMY3bJ6`qJ(Gx*ICyU;5n#F$XwPQyC)iSj{WliQrn#w;^&rz__;;!bN9f{L34om zBkx)e;^z{Yy8D;S+30j=I@Woc1fMnYmr&e(}_o+kvIZ-TMFEL`>S8|ZOks0zS+-zOvj0M?A`6XG`kjCOJNm7@|9RJiHd^_%{He$173Pf`H*5LI8Ccgr@EG2v zYH`n>Mr-b2^i}M`^D6HAcB;L9oer$?CJHB@z^2|4m7@JnVy4~Q6TodYhwv0)Sp*mL ztnlkAQp4K|!KYCKPQecD5NIfV0rUJ<+&XRz2${aX@+G%{`w7pVxnH?GTmuy3??HR+ zWT1)Wm(v!ikb94j<_^_VegDLcCl6IMxGErpi$sXX?eDzPh*4R#Iw3MVI&EnFh_T~F z7mm%(ADlaEXk54!1Qse)Obpct`d_Kz_O*7D4<%+O-U>-PYrS1{{z|LBWRsKRWq$#7^mT|GZ4R-cFJMPc!j3|-JuijWQ3>c6pGTA3>qAz*|Ni@HHf`Lrb?5E_ z2aa9Cth%Kg(<)izPd}{(<<`%KPN7WzopxXSu;n=JjN_H?X)B@4oSi*nXtE|g+zcre zmBO4P(WDF+2rLc0$jXe7yYRbL+Q*D(uepq$0`i#b9CjAK*fZ$y^l*T&4Z%eM!?*%N z*@I@pt!PMDM|~oH94yKO$>1g%H3`ET3#pL9ZiOZerv(0(^M? zSczXNFQkhh`&?NGhRvK5ty!oyne^tQ^qfcw^43;-ajZQecOlv)r%uyorp;Z9pYF@j zx1PYhoyKyBuB5-EKMgLg(o@l51F}5u7g?~Mx2a0`>mU{z8wFC4`SUScAt#5U$RZ0` za4unIK>baQTl%+5|UYm27kwr~94 zgLd*oTjq2S2d)b)YpAvK@H5d1;}dUw%gzd%4V(qnN;C&lCRw-$ZU*-n z?u=@#6$E8=jEd9b?*aU~_lJM>^_?l?hDhH1bQ2<<@|pZ}K8@=NF0~w44sxG@$YlbD zoDmiimswsI*bE_Rq`ovsX|YPP5Us%ub5c@zik1d#8NTpoveGj#B&es%nKLDwv`VI@ zrfN8L_@zr{tFBYpt!=n!EMZHSo|{@r9+iu?>=Kyis`aq!1-5o^NPvtm|NhBhj5c zZ1m{SgHqy6m?&`_%?-eU-RN|-we=)8dv75qsBi8-W(jeiE-^U?GT%eesWeEEVI8*G zsye$_=trxbIqA;TI+8mgU>p_K(r^pItG&9jv%1lZpX!?0`=o5lGtVr1_<7)69>0Ii zw2ZW@G@;*zaG=#MtgCB;Kup-}>qnt6QQId3)C+Z!k@N2dz3P|2<$eECfBG-JEo6>(MrxPa#O*6t>H!ZevGJe!Xea*FW9FPxa@jy!!qT1DIFD*neh_ zLJ=P_-01|~_P>e2gEL6cPNLb{6x4RL7Eq+DFk5X|$fAxv_Ly zzi;_J%{2aJ&0bHCJsw(v&tVdQ98@9Uj3;|i#1F@;rd-g_uk0ENbZ2m~F_*dP)BfMK zi(V13z5?n+vfUNf?!iB{o5iidcGJlet6b0uR(-rxQPcnbZkOcfq#=w4W0NaI9c>nP(1+=D|0^p`xP)jMuZ(X30{@7|Bu3TQobsZk!!H46z4#!r9 zhir9Z$W~2+KtL|1{fHsKO$^APoc18EEm*X5Z%46e0r3=V<&>R zo4S!t6;kh)Qwte0lw82m55*nFgX*>SDiU_u9Hfd3yy@jNz_?%XZ}*h8pn+* z8keaTJ9}Vj7D0GwUY-VA#)JcK8}%>Y%P%Y#R}3)U4Qi8Mj{b59|0+L=EQ0O2*+m%0 zZj^&{_3q{Xa1ja3BDFC+MTJ;v$A*7xs-=dPVhHW$n0Z?;ocg(hpB-FYqt3A7xp7#Q zfvU5EH}Hkx4^AQ2-Zul&I2{y=J^*3oqtGQ<$SvZAb0fGyZX)*=ZWcFAaQpVoN%$o_ zcN|n@lY-0lkUP3x@Y`(!i3vEtDxJ)%RvNTaH1g1pRaB`Zj3{u&>g{9HcGA;fwNM6F zsY=b}BAeh1^tnBRCa@2Znl8J?(%b?<6N$rV0j8De16y=wCx^agIfBS?q(pJ`gc20S zXfr}czf8@9yR&pCv+z*#!N3)uz!VEaGn-pfG&I2!pJ)WTm0M(ti%T1npEoc!J|<;Q zc3x3qqeYoGY%1zuqY^asMk*8Q?rnFP)%Nyo3c}4W6FDS-m~dJLST98Byhw4NNJBVt zr8JxT?6V8T3?4IXU>J@^pEGjg_&Ey~%$c1(c^^e&diBABXX|@7P_@OI zB(A1|P#zKZr7|zO`~f2-bt*P&kY3?DIWR43rmNE^&Z9~^>B~A^aZ$q_ZeC#u1FRu4RD|_ z(4#ehT1)3`s%!33X3Ygadrqd(a%{_%Ep=?zvSo8dq#9hv4v15-C(Rz2J!nuF<-y`Y zuk``&xIMS57;~Z%(0^H&+WB2EVs9+M?>bY^mw5trMH3@1C~%Q}s^MgZT|ivZ2BuI_q{In&XORw|pj#IpMFwKcPRy0M{FEdNZSjf_oXOM>+g}ti zE<6a^C%N&`5Ze#MnIyHh*R>LJ-?H=Ybp*+GYOGLBksLa7sMg{(z>10fj?m+GIvEJP zD2xdSl!auw%~DAtfsoaEE5LS{j{&e0M!gl;#kJH2#)pwz%!|KW@Nk*U52NLFDAV5@xzF}ADC1jUb19*DH4vL)l$%4EHtH2-S|4!~hzh4|+UET@yjX{Cz)@WO*U?7i|Dw5LDhJaYr1RR4l0{3J_N|Xjc2b_DrlraK4 z5C}`kh4z+qFC(M7YwEfj1L72B0OlEKcsS0tC`@0GGs%*;wo9E|>v8Iwn6 zAVCK>gJSrc$H7}cMPnU&dlN3Iu=#48M_81jHPfasj5InL&Pot%>hGbM4zGHDh-Ez* zVp)&DvL?c^CWlzo$3=$)czaFmi5_;$zZflQ=Eu$K#CiG=r0ge90>gCI2?w+oW zUQpO#&?-iY6BgBiQCh@s%a<=+{Ln)%wi66QKxN+U##;<%=AC|X7%f&tMowAu*kg|^ zm=qZqmz)|G&Q757ksBBU7B?vfIo42Xlw9+b%NMI|+pM_NN|0zKOND5f1WohB5CZ|7)S>uvNO1?$R%wD zy=f(!;vFm`eR^|!(8 zKy)j_BC|xTMeR)|Hp{wD-~z-AK-W|O@G}zlIu8(V?f@#KB!)nJj*fY2mDX8y%x#Qz7Bp*5=XaViVKT(h{N+evEh6MVrWk z_9dOps1>92l!3OSt)`|EdxV>SXTg1j!Wk(w_dRtMHm=!T`Fj2Q<);iBPj z60;6zM4KTG0dPvnkWnK>0NgAQE4r#~xmBRH1a{XP24eEQz7`UjH@2Zr3W<+D#`^zM z+8P&Pl|((AC~bu*a);(JQIoW`cB;Y%zf6LW@V?5FI$;khRO{3L1P1~tjSho-lnJsQ zc(BIY+)+b^bk^7I-@m`!*VAzI>K&;*B^T&HXG^0}X|>o|NJ{j~F*#&<3>+&)i@VeQ zei>ZTvtaTh%aioGrECuyPP> zpo%aVc!W;q&n5idZZ)KW7~JZ$t=KAcico*IQ`DJ4>X+bFE9zhynm;ZDALQJ)infh1MSn~D(q>%2;=9fWNqa1h-8~J=WU_W?!75&p8*^5x^ zyU_aVf49}p&K#1C*oF1cXW%clkRN`)4?p~|5%aul$j(KJx*w0KX~}mRgdQk74K69%+fRb9Pi(g=CK?;v#xw6#2j1xDp*y$+q#?He|70BAC@?rSHJ(L2=~U=$Jwidw4l zG1C`#aUY`by~kaI2I6;;S3XcWX6&d@d3Ci=7J2TuMPn196V)xJPu#cY;YXL9zuv_u zA@T`e({u(=7kUXfPM$sU`O@I9@^=&zw+cDRVPV1|iXUEuWLzFxor4ZjD!s?vEkdzi z6s2UvwKuNaYO@xj^nlW&@`Y)or4x!q-mJb=U0n=nBotkx3x*FH9^ZNVP$?Ko|3R(A zK=PsZa;qRbC8v=35hs>qL`uIG^4@g#_gGh3|A>DAXtE=wT@1HKi|DHh|@-al+GkFmfDMZSY z@TE@f97-B5A`p6pTY)fWD(JLJxshBEcR%-6?oCMS?&59&0nx`lfPp6+yEd?Fw24vW zJowbC?CkW2z}jC=w=uG)iOc2=9XjW)qZq}YStBs0_Z(aEHzk{kp~8nEBbYcaenUR@ z0vZ9%U%!6g=-%DG@7(m=_o&oW?)zou;nNo{`yn3+-6e@aPTJmtoX>{_=8M;w9EeSX zysH<~10F`%gl7f%>}-;+eP+Ho+7@$bv_F(P`un8s^&Cbz7G9nnGx2Mx37CVF> z-O>wylk~@yKKiti)h4ILfOWxX5ya;Y%gZa7Ni2iVWmizE=@(v{jcUPG(7+tSwLeX@ z(-h@LnVG$2Amp3f040pvbSoCM)o)WDnPS3!(xXK8_BQulG%W`x3Iwn>amY5VCo>F-KgAYFV z$P-T`8KA;$C|dEzBM%kDgky6K%0;U{$0HY&&VBS5xRv8#r>(Qi(pL=n-y_s_id9cM zvEnZa?#muBa_o2-z<-o#_5>#-p9tpeDJi8-mw6B;d9dShMj8?1zfm^}SNJlJ4$glpJTe6M5U746_UgI|6X*o>y8;JXgw zdSe$Z1ob>pSU0XOw0>LyAs@0V6CI3Lh>^Zrc=>Wk38N?}xqKPBSukQ~98=uS6fIei z*t!ixQmhi<>$Jmhf6&wx@C%53I%X0JcnNoatKeP^F5f_8bOEBWUEJHjWdqmFNAn9{ ziu0LrkR_N*4?JK(L~j-vB595xSVk(~gF1qoO{lDNxhgA<9{u8rqep)`aU7BA@f}CE z`~o$X?c07jipZfHg(xU9DlppAA>?ms<|K?90je-yx1dD8CgkL3G&wnOanq(DuQ+xB z$P>$E$CWI*_uhLK&K?&>O~e{Tj2JqUQ4AeAVgv>aZyzsa(2d|in-ytyViO7q!ov#+ z;^NB6;^NxlW<2n~0}qXh3!n4)>#sjP&=QAYPq{EEDkq0g`?KF#XvY-9veQ-RXz=A@~Zy1s>lbf4p06Ib#Oq<6~(`+QwpK3{qf z`B0iAKv_>njYFGU1nR}8ETl!~P{gmS1S+_(5ygVMXm=ylM3m62Sny6K{I#S%Z%TbA zd!&%`^xAAgi^x~fd=97+j(UnwW~HV5`sX^h}W#~c-E{zUo5^Yrc`2@jZOk38*j0AJQmA2a{D*kzR=O(aCCGWvsf;jKzZd164XlQ2;zK! zj?M!Rr5e0H93%jdcmm|6osE~v!^7qB@dc=!ju=~(o({}bdZAoiI01$;iJD1>b7Z6= zS*ceFI5X(O89B6KFwdn0N(mdO)kfmE>M`)cFZk=q!ot|t!osJt+Gk!YCO8uyO~uuuY>LL%8w-|eLtlT2PX z9>tYRRp*^MMx(T|im)i06o@Nw(Cyvb^y;e?%d4-VEtT(c`J-~x{x*l9@PVhEi;R5X z#m6Q`dt9pQY(s#sCJ3!JPo89huQ@V-Y=)w*|APDcEeow$DCe;a(C64-*Kx%K(#^2pj-eo|bO%XJ>!<>9wLVtfik5 z`Uoia;=(IRx#iqu$e|74hl-CLy>Q{^(IxmfhnI0@khz=AWe2(fHv-K8H#Z0>FE7L6 z+4x94fs5oK`9zG&GTd~{KYIZAMFSHuyHcsU zwH+Bf+8713K0gP9az)PXm6dxd(IAWxUgiGX+qUlfb^A~M+VsoT-}aq2dvg8y=&t68m>R+8@?wP=oIxO_!~>XRPeu5m`=^bc(9uCU z7RyQ}&Ux_h7oL6k9@dNIavzNxwiZqnxn@D+yQF=-~y8K_h(ElKIarz~DNckz=&h)&Cm4?i$x zxGCTqJ=)?_XHQ*p@8Sm@m^vH7>5o`@k0mUO6^DnXr|EgdB=H$E7>yD#QxJ6-dT$W& zx77yk2skbB|vkbB`3+zX50KWBy93-d$ng{+LI*qkB9j!7iPjt$Ap%pEx_ zDS2cbB)mo4J>$mpblNo;38|^6nMtV3GeScGn(*SmVOn3^f)ODQ7&rtq)^JOGz0s&@ z2iW4oi2z+;8aF&|Xx6G#R_m%&8Ce4|Q^qWLw7B@5LGy_j{z7f1$Br#V@^=@tPQG&b zj3-vDT0V(-5^MK%)YUPNJju@=jiJvZruXaxK=+n9KfkVy8wU5XMUgWgxWwyDR2{< z;A(*moz2e`17mvq^yx*wsZHghkqkTm;Mp5UVXuUO;9kt(Y>{rJ82KG;aTg_S!{ zv_=Cax~w8Fli|Qa735#k$k9F3>i`%=6ma?~vN99(GDSl}UtdFmS{I!^y>wjJtdddV zvJ}pqB}=+`-D*H>)6&w1Q6sQU9_FRcBR87au=*+T4DRF-(HR=fmR1g;;!Uh{Z>L%bdKhVM9a1 zwo0o0;K9SkPo4a#rE=fC0|$Y7H!ZaT4j*MI>VHXQ4$D5EFR&%u7q z!xoM7+_^=F3~Fds%v6w5Z-*uB!vyIVFn%8)hTMqx=oac%6iyz*zN}u&;AvKE-*M7E@r~{?FTy7ExbQ%p94(SBHDIz>fhupClI@k=J zW>7D<+iu@UNN8^DcA$NI1i5@n#MFX<@#F8Ix%*0sr!0E(vC^sW@i}8B;FkITO$rQM zUmtv`eJ4*f$D zYex%&r>CXi?nplh*Sa9&TF(gaZe_UE1QRnXh5XZ|ZM(kyx~gjDp1!6X zM22w3_opCJx(i5F(1Ovp^~h7@1~5&hQQW+#R4Wy15w64zdi3LDw)_z!OUs_~ijWX5 z9bK|`?vpPrpNHdIk8Ur9K5``ZR7F%*-`e%VUYTsqH$Put%PRoe06C-?rgN1@oYZO1{V z$gPA@ksfKJmHbMT*}Sudf8T6=_sdN?Hk5+BW-83!aefspvx~um2@F%grwXlR%A6U0 z@pzU^OBb_Iv8k~-pda;7dTn+?ArwxxVhEsYVfrG8}q{Ujrq2FGm!!$BNuTis6 zvglM)Z=<8NZaN$~WwB}Kf8gEV7*B?Ypz?^PSqXG-bT$-YO@osqY*d&e6+|TICGN~t@d1&_d$uBM~Mwak1>Mg-af++hf zcfMe-9~aVIWZOCO#d#4JjCt zP9Zd_K}pLA8(NH$gcil%Qzm1f2TVmJ=S}+Six$h1ODEO@Z}27-D^)71ak|edA$$#Ua)=KE%@$A-8mY{8ww=eDlD8HQ%>@ zanpkQ0i(i^adu#BW%MmB9NF?$46GlJQS zR*X`!={ZHPplVq|%#>=v=q; zIW9CF{QVRmLN(LZ!G}hk9uEuM3rZ$a4V#qT(o(i?l$=f4yXnlY8#khDXZ4t7E?<9Y&4cHALa1$`1${)U14{gD1 z>%UxA$tVD}pri&n^^bp~VFTzI25EZ)UPXwBMhfRXxO4@{q4iKbg3Qb(O3){^4O4|m zd96Sn7uI_zHug#pM%1@pct&jEqEVy@!zMm@=WpvbGNO$?{^OmGz*!s?sg@Zpq7VsT zU&_SJLSAGyKaSUMb(o?aM&{%v?h<#KvtU|EI0Q+D$t$w&cOPm+#rN<=;#QZ?H8sWD z3H}N{6-M|EY|4naBZ$C6emC}&K@+^sMYje0suz7LUzRDALna0e5#tS7%Ravo~BUo?B(4hA`!#dQPZB2R0vIVbqvWV+VzW4ICH&25TjB*C}CSu1vP_L;}fYi8}?D z4RDM|Y!G#kJ?c;JV!HvGj<;Ot4Lm{|P{} zEl~)ZR+T#|%g!bzButJ#qgm5Cn|7QH3>k9dh%1Zoi<8%N%vLI@?Zg9Lmhs=$SC>?-@y&T`iVswT!6!O687SjA+-cLpM7axi(y< z(%RFuZ%=1u28Y~*nD(V$c+~-J=Rxix6E%r@QS5sLved7u*6cY|F4;DU~JvsZc(A97_%UePJuEeBLXd)ER2!k)(P~f1YuzsHree4Q>n{t?XIhDvhv7Y zNDM{;G&Uq&3y74O!u*J7!SdmDb$8gX0^m#_jf#RFyr`T&pU{CplE1=-AD)6D>L&K9;hvte_yLu_t#h|Ohg+VsgM zUwr%BmY(Lus>+QUdwOb)Zrk!*yUnFY=no849UZ=}PE&huSlK>K7j%cFl&ma9l$8ZO zd`4tQ95iqsfie=0=z`S{NX2zHsE<*JT0{LLiq0N3eq|9lk$x6rWGpH{ZR#uPTWX6Y zb6{$8Sbx0Oo|)ML7$^M*PT+BD$!^3!62JJ(=Ra;|MB9H{^J66=a-2troRth3L|kJA zdoR5L%TD@j`f>Ut`W^ZwSSslgu0v3;lwKP2%(WyypwsA~qB&1KIC0<~QRIYR6d4&z z^^K>uQeHUAPqE#LCb2r`EGs_!aT6oj^wXE`e}wHGM?}I3r%(UGUq-QWxd*Ydar?NB zki&SAn~CKm6f3?4RummVLDL?9xyECF&HR0B32JH2fgf}E-N>?#m(uUOTg*L;MiM*h z8Bk%d(c0VIVP`~;tarE=5ombr-3;K@j@3{xBi_@&W?sHrS6hAM{PB|~&)sZlX{oNh zR%i2betXx=^ZmhPO>fUdTRpWG>vIvY79}H!lY8A{eQpaE2X7&>_4cx$(;!~d#b%b3 z4W6@X(Xt1hTE1j%VQT6<_auX=2Hg?5FjIe+IVvvxIcFYKiZ#{?6%pZZJkkL}W5Z$9 zak;5dMq~kLs*DBwHSwozs1}%71zMR1)kLE~+}SA-wN-;~#@}J(4E+ITY)$Q~?|qQ4 zfK%0m8N<{tp-dyt;*by6zT42;)=h;SKQ0#IiLB9=XTc8x?`m^N`n{_m zGLjKRM(TwgMkEPONJ#J*){BX|L#3!?l2;`v#z=t9e5E# zhY|;z&CaJ6WBG=Dm41$9=-23{A;owG?EyVN`7NQB1bgE+;Ql5e;$(2seT7u^Gl)I< zBhv}N$g~WqjK5PA^k=jZHvU)Qn6*-e-M?!OBSKqmbtfazT8|w#fDXH~`|cy| zIS~;-6W0Xi9M6j}KXPE^a~oDI=VRcY=VDogs8z0x<&UDy3+Z14@awYo5()YqL9gTALbbu2x-Z zfRt;ePb3z4>`proVge>v++(v{7j{t{#A$N@Tep)D!P#Sa46qkyiLmNk^v0nf4sM$~ z18indQO2wlE1rJou{kp*4U38zFu=gM?YFPoLM^vHeof~2C5?$lslsUk#oj&(qcMvgm0B2h)bZANPqm{q?#LA&!4$+ zrgHD$!+R?)T|0fcNgScm>4f$!3mTXb!&Iuo_$VaJ#UN$qQR$*mGqY0^QBlAw0;=r* zP`3cR5bo$`lpz%&l^kW&0PjOo4r~l6752_M=yJVz>(;H>+Nc=hN(d33zpcII%DK}g z8eLK#yj#OsTf2OcD9G0j%tlcGP)@O&5%>8WT)@fFD^``Dd`KkQ-xR*|^wY=yu>~&z z-uukTm9GMK{nY&8v6B~rx^Ln5alf-o5P-o4ZSyomu{yyqqrXV39Hr7U{hFq>rCoM!|1tNTiWVn2s(io8h zJZL6FP}5TC8gWE7K=9Bdj~Xy_$&w|*B6@II^P=htf2 zrQV{VqhYBq*-z_SEo#U_Su4gPB5OSlS^jJ7wdI;w1De$ zIWz?aWWAWm}!|kWvE4_;VUBW-8~6e&`vWxNP^6)a#!0y_kI?_k#&kNs^5 z8l1wpZp=R3!{}K7#MW-k#T)tYvhts=T2NT6`Eoo82uhR)u%Lpr6!YhaK%frgEWzH5 z3%m-6nH8cV4$rO6ir|x;7k{#D^X9MKFGad{7WN~D*TE50G6jUXpST+uD$YWgj_&h| z{OCUdbH7rnk)bmz_~67bK(E5DfJ}my=?xkc`e8`(jxZW@{{g84U+CiFOf=>6OC_M) z7lAN}XAA0Dy4u^@TAQ1|kO+`Fq5}(PTtwp*;;d@3P6ei)JuUqLB!ifbJ%4dqZLrd z5$nShJgroq{;DP%UJA7kXf>f2bq~E!Wsq~yIAu`n6nigJXwfNx9Z)O4ipK}sAi#EY zbvJeS*>qPonBg4oqV^6Ro&mC`BCIhiE^BbS6o806fg$srsSmzU+|PP2bmg$H$XpPw z1H2oVYSN-bFlW5QG9gtLfo4fP?dcV%V&bEt3<`zA2{u@X04=LIG#G_EAfoWf#0tvi z2Iqf33c5}x*!a+e>BY=Lfg=!7y}dYJtRet`K(IxDby;MN0gVxQwF$+R!0$tW6AX`X z2vnrz4veJP%p0f9-nen)@};Z$cM=usaI|xxUDBvhXnQV$vf|uLw=S#nu~%Pz9YOlg zr$-IWPSkjMaJ99maj69b1!^=$)2f^a6DP*U+b&nub}C~{21Q?A)%BL@T=&>3PS9xE>r_o3~k4}@uMhXV+v{)el#83dM~W&($l(*vc-nw#A`Fg6NHv;}5B ztFc!SU$Dd(WZMrw<+2vHj4EW}yzJQZ2S3NJJRu zbjJ1e1_YSwkQlUAEYn3rn^Z#K^;-?~ZJiK)V+wGTt|&C7M#`Z(CX|60N+b|zWLl$6 zsStX)FqQ9wqp~_uQW6pp2#u=L;qiCfsc-HHDD@x$iUBo!r$8Qs5@<#`+${(tfCc9R zP)zbW*!xh9ByenkUi%Vdgw>cMe2W6*w?Xl|jmU8HFYE5Q(k~01E4lYE^x8c4)H9Ql zk}@(964H{g28=Eqm21SwH;h>_Zv^%uF%g}egGY@VIdayFSsAHfbWKT=VG$9_7R?te zxPS2z6k%~HFqy)`JBS)Nt&(Zb9gERf3wbBX4&;thLpq-@o@vzT?c33#PR{PZIzigZ zWs4Wg9vLI;ZEiL+1BR}5RfCpt{{i$|DIuN?Ha8KJh2Hg6KWcRK;w zPsNbIgE`o@BV|xd&cG-{0QylQ?Q&62TLjL0>8cTl1a)fI~$s?SfC;zd^O=_k7lkZO8m-Cq< zTaQsD9JQQPpjuu%o-euk5t{J$*F^`~J5GE+Sc_f~fAYin^`EaU#i%eBxzhiSwKoB8 zs@&ei_uiT3q-mSZ=}22jX$u8P0Xs8`41yydqN0fNtf);>MCGW*`FQl`5j{Ad$D_vq z6f96$<`yWlv~-@QG|kY=+55g_EF;p0FfTfse2#||I^=E$Wj47r*)IEx=j@VtG5b}UN z9u;M&l(P4Z;I9+IgCm4B6uN%~B>yYIJzj|v+y>U(zTOeHn?~l=GBg63G(!P+afl}Z zZ=0VR^Ku}VbM*Cs6vAxri%H}KO9hr%Ns36gr-+OYddEjc%;tfvVF#uU2E4%F4aQ~9 zG7`oM1PTLMV7J|FvR4)ib@dMq51A~(EscY)l&(vcS_d%)o4p|vdT0jw+Pbu5i1*u z9B!|bsD0SbQ{(o!fLie)!gqo97HB;b7a@Iv79TWukn0f07PUs~vxD{01Sw>c_oE5_ z+XT^l;hf`67Bri1%<#AoX=y5lu|Tg1kByB<&WIH=F^Dy@5))N1xcbwyvVpVb&!4Yv zb5Fl+!#$5Z^w9mA*R4-#K6RONsaw7AnmM5GTAn121u5ZFfUxHz#QFP<nkJT~St8 zn2|FrLoJJ@iVOur&0^GyowhT+arZa~5-EioO+Dk#^8r+pm#{aC3|as?js~)9qMrgoHD?<(xnUs)QE6I~n6I&#Cs(?J@idsP;*Xqhs611Gpm`ve z@zg*aFjN8={vr8E6IHfC_I>$7NcMk#$CsJcA>eLy`H^=-3LdPiQ__g^P_+5&9{vCVWmQ$ z-{Xh!B1oN-0%J0ixF>LF1zPe6ABK6vH9pYYEt88myH}!=b+=hj*7%RA))gWh@?7NTt zweMc5gNhK^z&M9hCZmD=bjwg%MlMD9*t*i?E9U5MCF$lZE4rhQdV^lNp%|;gcd7Tq zcDEvXS+>+_E^rU)T8f2BrgRC+kxX<2eY8j&=67+|DKGx>wJa|Z-5F^3m7U-^zywY879;>VC z6KJ*k-a0fQcXgRG8ODU*p8ANXc_Bml{`KjT&)l7_S^DG?pMLtY2?j$t=p!aO=yf4? z-@RDW+A3On_m^LeCMQ#;zBFos`{uK+-jr+eT~jPmR`i&m~!v1sm;7=guB!Jjbge0~>j*?&jC{S&AvFH_^_4=kdk)CdMOVzI|kjMlA{+$#9CV}N1zvY^}LO1Z1cDf_j+>fFO^z&ihGSXv=s#x$fILpTO& z{3gHyzXdzjKQTUKe}s`8GZ+|ALXlC+gRlpmbB{Gvt(Y4|K{*12#7aHDq~H#5P(pCf zINcr^syL+K&c{GkRp1AJ2SEes7)C{;Ld1Azr7ki|1W`L=pE>AF8uf{Z(Mlmiqg;Gh zG@#G93rfl~p|R;R5_R$Mv562>;;Ypm{zjwd_Dw~}sZ*CcK<14%r9)njhOm5bs8(&% z&zzASA?0RJ2YtejD1Gwu+|s=up+MlP6Eq9{xx` z{dB&*uHk&+#fx6gL@%lXL>V|cd;0Y08A&k)h0}Sl+k`9qRE<`_xt#@rN3NECk|DzByiUm(C#(penet?-(gT?hcb%@rX>tzI9e5ds8+qZ03mKPE^ zZ8=p)iwwNX%rqTTql6V`P8k-QOGs;>{ zHJMC3VN{hg4St33>OwR zlYDaKz>(v}>s51elI7kjv)un{_i#PoJ|oNs`_MgHgwyE=bPum)kI`U1Qy|kr(IXu= zf%HCiF#B0>AFuS5Um5i&(#I=||G%+;orHDnD5viVSk?|?>li>OU|tz%nrQsxu7d%SI`xcdH8T`T}zh<$vgy; z&i;$FhYuX6ZR#E+k_+y^{?_9M>Rxyc_@oa%*!})Lt4SaHod6O(seJRZ?+#T}9sX(m zw_oi2x(cwRClG}Mhof02Ui?Bd6`C1fnsPdi9y|a-$WuR7;o5682NnwF>Q3R-&?Po% zmMppE>ih(`m(X83`1;~iO9Ioi{LZ|1$>jqF4zx=3bG9tO1a%AWS}mY^*pFoLZe&Z| zWuDx2!^%Ks%_#ED|3ba!J>(n6cr);m^uE7E{gu80$9LdLKpJ4KGKO>1FKkt9UlO{i zj_~k=xtpFY#$nq*y%4%EK0G`G8FSnyG+UtE;*oo##*#pS<`e2I*}Y4rOGx6=o3t1# zj343eEg1Wxk1dI9$5(ETTl~mIBsE&7pXt3QXKe%oU{032Ft*aCJ2`Z}hw(^w@a*uV3C6kyc4 zo_z)ktl!~PB$s^xv)ac1w%-Z%$z|*;ba#9R!y)l{W>CCN{X(E6M>-Dd7Yswm6LV(G zTA+njvJ6_WCk8PlG)!q8z~KtiYHg@S3K3ZR1(JHI5R&JUAis^3wN@i!_~N9DoEg(o zQ$RWyr%TArnU)l<1Aa9O3{COLaY^OW6nu+d(k(E||H`!GfnX6>7+AKY0pw6#+SP?c zZXl&TNfi$kgKnO&ASFe^`joLzD3>~=5o(V(WnjQ1*Mz2GDW0NHtGom5a~(sh0^c>K zV0O4d93G<(04DE2*2LkW!^){Rda>#&!E|a%Tx9$W+6m zgJe7X0IM-B!0O=;=R-gRzw)SCfANct;1HaYB1zQ zq9Ms{wt?qKr4*3Fkc}@z?Hf(M9={^;@b}+*^Uc2Ms0@BG+NkK*uIGybT?OmJ zwfb1lkEmozN~t{ox7R{_#;kz+cP#Y4@Ev^6hsJjxO?pC92N?XthYse6#mM>|LJ&m8 z;Q%GnUzvH-$4h{>D?=DOGcbxdBsjVIm>Oz6i8K!xOW|>nxj9&i-6r@Kq0Fw@g1o~V zM9qnTnArqy@{b@xCxEb~f^sg=_CFLOv z=5!)OiN1AY_>KAKx^HS3BxEnHo{Q%@Om4I`dQhczpmrp5H@5Ve9kjqTg5;t{fW&7n z5|7ZfmN27KlVRrgxR)o5N(iI8HfUI*$|PbDPO%EDf}uR)0Z}Ffxl}h4u}RY!$3oN4 zz_0>|F<&cl*!*a|bvh~9ZWd}|X6D4jf!8u2IzDrHD1_F*R>Idob% z=P0-%KtUQ zYVSqaRd?KW>$Yv%Hr;Z|Tw@UlVRR2e0b=%y8A%D63DjBn`uG{Svr02to}RvWMbgGIR45msvle?l$PPGO<)9L@pdvN~uyC8xs`+XA~V1t&i4r zy>EDKArM|S1jgfB1@{C~t=+H~G0<)V8TEnjZ-i%`P#cU(!M47iy$B#p25KP-up-_J z%Jv5YFIQs)_Tja-lJ5f}!%93e6|Yc%m3n_5Ug+XvC}q!pTUd!D%st%w{N2#)+p`!i z--z*pge<_93*7u=AacK@L92}k7nS0z*_7hWR5mutSO#Y zC`AXMj4y&7C)l{;Av!r{85#4?6)E7Jv2gOR5E0FwpdnPrCCI^!*l-A3V-^P|RBNPI z0YH4s>1Ckr4#*8p=y&lbho3NY@qBI;;4mQh2wxgaVuV1U1m6Qr*f=XLE~3dqm;ThjmFE!j;jCptTw|SQ?`|WxJKAVS`f~MMn=H0HK z8NUF#XC50fW4&H~?9!#$6YVzFNYnA-2*F_e$TNt=ek%ZgEnVZIj=s;bPYV;5S6q3Ce%V0B~HfE|&W%iMAC{K@L(i*h3wjkI!o5X=oOlp#nwUV`SCPUK&dSGSkQpa* z4x9rn#vhe_;CbEWmG)2!1I0>dlWn`uMsTbD{&%hKx2TdBHq&OhQ8b`iGu=TJ-dN z*A`93dbbFCt1oDuxM_L59yQvi>@|09d*JEStF~@^Vj=Y+W=f=xG5$&!MR#3$_0rP9 zLc~rl8PbK(#p`b*!R57Z)vDd{AYVg$Sk z7T>(}!KVp#!pkUZzl`xJbLZMErATA%#FxZ^Oa@X~^vfY-mz8y08Impkx#BXu40&8< z@5Oa$=Hl{J-F;_7Mp-^y@G`P%L<*;Y+ACPAlp^vk1JX)Z&*VoszAS_Ln|wWhJ~BJntypnbLUKx!tb);}>MOSf zbYi9<3xviqz>b~%Un+x z(^$FfV_!tnl!eay8vjv@HVDvUfpBU)yA!k%?_)i;fnCVvvI2jz|EIt>;Wx1vU{!t! z?`=R77KfGIZbME=Qc@zoXt+g3MPa7b$0sCUr#Zi8!hxbL*4c1TEYOcWii38`aL;%} zicAwq7BfSaIw3@Z+i-{7-en^9+}`fXBX~+4s*zQQ%pC)0T=sAV#$j<(f_Eeo`Zi*g zQYK6d3rkPX@Hs{k8ELhe;IM5-YmM8iB+ho)1PIQco=fz)pjGK6!gffEWrAB!&N(bV z2wD5O2Zj)X-JE(gm#_hIoIE^v0dCcK(xi}~&Am+=EM{s)QHKfB_iaHQZjvs)j~`hP#%Li zScM3XJGB@opbCoFQ2;;e9YG5$w5PBfb%jQX02%cN($dlq>7`EvoFO4hg*tNbY_kJv zOBYYA;%UQm=~3a4Ap-DvWSYn9oFs1QRFx_=J9mCj3ACiL5~5;t(x{mDtmKsGF!{W^ zc?+_zI`&gD4e3g?$I8LksFe7Rm?v(kd9ousJz%8 zy>402!i5@*K1`T(2T9~WvnKknTbF>xI-B0t$2`9yv5tQii*zP>|x!UYOJ? zl_5mx?HC`w+=e^A6RA>?@Kh+(HCiE3=;U^2L8Fau#A&LW%-JBjbYR$eEZU z&ts0f7&J$=2F;O~j$wScK1^*SwqeAW>S?RrHE{ma<;y3}bUVFcEvHTeY}_(B=I~bJ z;d&bHz6ga_TL+e?hfcQi6Br2k+K<+?4*7Ax4K$oQ)94tvbpCWL;8e%YH=S$l8nvSp zEdBiX*0%Q6mdj^Ow{&*)^!2niov*2>K6LOPDUl71jG=F$sp<4FV6Y6is8V5>ghYf- zkVz~tO5hzt7hm1^I+N+lxwE*}?h-`diK&@DAfjGD3+3VphBh;mnPNRot`3Q`QOv@f zmw??e$3{oTPf0`gqT$J+6T?$_+GD>;iDgD13PR ziY%4eNlHQ$@sDm=IwuJP1eS!Q%h%ix5u3Ak)m>PAJa|*-;zd`@o<(gppnGbfzxi10 z#s03L{=VMc{(%YU>eZ`O0wW6JBxMaOsU&e_w`^E#$aUL2lDGuGhWY+aKij)^Z@Wa7 ze?92DZ`qWRvgNiraBpd>q#aLu`iY;9mnFnW9QF!^N#H7}4P@5)FfhtzaxS14Oj=S z%}@=TJzIiW(|-|NKd-+3#?*cUAD#sTYqv<%(^hXPLx=z{JjRdI=fX#}uPVJN1asZ< zhLF@$zUkb)1NGw_t*wJ2{X-LU>OxF+WWw8z2@pdDWZ?WfgfMf;%5E<~5^*=``Ujw~ z3)HYZUlv5xWDDfEH=z)*+d``Hlkg66P`)I3|Hsh8yHP^=4xTT)6&d~9?~tU;iOj|S-x zsKQlYN+71>qHvuUNrvv4q@?O5GwwM&d^w&_hO49%NE-n4U%|B3byOCZt?=qZRoR4V zVjO~`fJ%G)(zsNuHZw*-a}?-tLP9hem7IgfC04bpeQadhGtl1JYe9%BO&749vC%Qm zT{&Ei@sV~YaG3o9&e1buw~zIJ;|X{uI|SR!0GXtxrcMDRUtaF4xwEq}kU>q)NJUOb zftditDnWHo92OA~7ZawGRPdn!ZTD0pd2OiZvFz9{?8RESJXA%x{JjY7@r2iD_f_yc z7Skw{aA~E#vH*OWr6p_DUwiF3c;=0_Y~H+iT}E1JN>bvqX&EJpa;N0XNYBmBpF1T~ z#|S8BirOqrG|Ko>;-hpPK*YP!N8PM4OrIc?Dl`#^nZ>wk}iV#49CA6+-?H(01t}AuSk)Ozf0MysH}SZ}cmT^brX-%03=8I4+tCv?%_;GJY#Y)F&_J2l9!EJ%;WQew)iyuA6~ zfLpu_-19)V$3YMvAtB}JmDv&L)3dS`ESL}eO6k4MN4 zPtfa9lzvIViU%k0=+E)*$y26oFTxz~PeoW*s6s?xN#|un)YaIWW32Lpx88c| zsfMwV}B?;{H-(YU%>xV`h;Xq)T6um6Adrn7v}I z3P}E;-X27NXt5tFL;dIKKnv8h=sS3)(VO;oDf%wRXarIUyn${1{qV3CqVttYkdJ9# zE7-fx8~6^}0{@)BJ;C1($FhGhTKQw3#3I46MTw@WXl|kC`JXN$Z*aiy; zs4&MPJY>MT6}b8R0Hz8lKgr05R2r~9_>hcAlLkM$VirpFI%0966$V*cFyo>#VP%7A$J$7>M|hD zj0BCGn6v~GP`a33tv1jzV)-HCEE5oSa#%fIu+Vvm|Qd$e*O=g$Zjk4gcix1^Me*z~;2)F=)!@`N~=h}X@TlZ4)8kw_a4 z8Dm2fLP}Vn5QQZ$FHTG-5)%`#Ru{>6rm;$Wd|YG(bPp!vPLDRiH8z%4Cn=Kg*|QlsEGY)4`(M2Bboi?2zpX8B|2HJURj{1tu$<{Z zmNP5JSA~U|y4oF%=1ZorE=hPKL&fQ(B0|>W*BVqQQ=G2YIEh^-?CesjhlY(|9N|mSHqE4 zL05&?b1Sz1r?tDkuY z)|Usv6?`0fW+ChD(APh7lhap7hJ*G1VLfMpvcDtJ>ucI!E>m*UwL2FpT1E*QWBGI#2d(? zE1N+-H4z{{$jZR68e}y5`0pS2DP(GpM*p+te*enfKZ4-G|Mos?1uz?90m1a5%L#q= zm^*O`yz-YvBtJnGg16xLiw96w|03o zLt|}iG$o1uWi#lYD6kUZKre*x;4QnXNQ)_z$X(j8jt5O8d4#II9sYQXb-8g~z++>= zBsSps<$YOy_Qt?VQ6w3ge5nl|0Z#VGR~j>3fBnrjUVrzU*WY;ejW^$Z2jxYZ#W68% zaoTKl2Wh^nI#%=Zq2q_Et82kMAz%fJkCPeZ(L9JhA+Lt6T!-0Wwf}xA#>&6!eC~x8 zcI$^Ueiv^;t?$=O+P&xkMl1n@5?*PeJjMcrT%iOH zni8U=8jTW=0W>KhEI~3)B#;WlxHcs~l}qFbDUoymt z_(2*JeSv%Ui-*O81Lp1k5E%sC2$%3Ei%22<_C~x3Z$w>5M1n}NQ63sEv4?0rA@LXI zG#1p?_xALg$J#qadU}v9>2=wWcC^_kJK(06Fh<8co`FI8=&;G`^Qq+8Xz+Vzi(Jt(b~t=5YjwXw`!n4#8yDv7E8O)bI!wwgXwH2}IHO18oqwNc$<}_EyY5eiZFS z1EX$K{sJ!~Z?iLA*Z~O&NoUU(SR`N)_(MRHjx`n>J63(P`sb>eqfJM@ID825T~^!J z_=FwuRpaLFuC})J=F6S!=C&iv%`hsrZ^Gqs3*FtIP;pwY93QjiScTRWv+3Benxi#U zhXb2Aa^&zK(9-Vz>F1y84}84;$Ig!C%V-^MZy&pSq^SwOzo}SeAYUpFz_9!ji8VlK zNw_}o0oW%z!UB}w5Bv;>$#ANP+8M`(()kP&x=3#+>YD@z07(S$CNw7m`h|RGAwvDh zhc3wcC4`i(U(wi~bfg7kz-a=mX3}9|X-s?+4FCC_1uSOk5;V>=Sl3 z%lT0R6idXIBji%?=;*l1sSb+>cT6~-0jCHF)dB`eK^a~bE)n5^kN{9XR7gGE>IcjWYGO28G#$RY59DZ585KgA_3S+JOwWhfqaeWtDszC0$TtFygBpOB!B(YGQO+}<7=t4~K_5s9q^ zRJ8D|P&Nc?Hl_R=sa4*C~hk4N->2!cG3~l`Ia&Fs%8x#OyblwTY5s`rVhev4D zTClkh;W3{#29b13Or$b0I$EOEpi>t~9yt(xF=p$?kl8wJHIG`rjy!4_H$jFF$N-O< z#R;Yn5kz9aKQ=lzIzDPOjhco~7=|}7n;6c|8HCVBC389mj~H)d!8hkFTs-^TfB*C2 z!9EmIMRKaYv&TnRl+X_88zYn)Cr_R}S%0?vJi12q{rCd`?DXM4_3hjL!w>uR9Z>$f zZ{MhCWaLuA*K7&ZckE0tP>R}GIEU`mEW7-w`8RO6!< z7^=wA3jpu*m$Y&y?5XF;G=)+{m<85_H#zTG@W6p{ z=js|R)}w+Pql%7Cj7D#xDqI+)(?rDTBz!E!Z8nJ*7;*zT#}WbflFGm^po$LF>SVyi z0Am>u>UKl@LWMk=lM+cP7$;vj84ceA4|H#k2YNQh13e56MEIM6Im2!W@<8bg=i%CW zJKMXy6ADk9I05+L8QS(HL(YF57Zm)BkcPWUBMzh9-EqaS_L z5c2TD7g$z1ZN`i&q}Nf+%7oyUc+0Pu8Lxfi&0H}0u3f)>;W+MU+f-9Q++)U*>&(qivZmH1miBY z5<q$#^N)k=cVE- z&6<@vyHhSls(pOiYAMy}D2*<1>inzVeWIsiq(R|XL|F`=c_8H7Wxz!~4t`!^F;2{n z)LYEsk33>jOW?&36Qk9SPg|`6CeLJkXBDhJSbHm&z3jm&*1s}n{#_Mh{i&x~kYND( zz<-58$ef(6t7pFX=ED~+jv?KD?AY0c_TKJ2pM80ddJi-^u$Ft4XJ;8?PUl}<{o>du zr}Ok_a2dNuXoQtOHv%MAWf8Cm-wU9EJ!d|0O0SD8mM5Ql^05c*jVU4UOd!@%WW|b( z3k^$_E-bsMpr9CiEZ01y$tjLk97DJiA!-VjE{r(5udaKsw%BDrS9 zvSrIr5m>ftSz%1&A|OCNMi(g=7cm;e`)`cm+x zKY<>tVzkjKIXQ@N&1lb0EH7j~GEkskI)3WVf#Zf~hKY{NoRbT6XRrygUf2bpmB8u` z4~=3QsS3l%L|}%*jmPVDIy>Ez%?##snyA=PDn*D2mPvs=a$txT8ES}zpXOP*2grI9 zKzDR=30U|E1hNt_V@y5xEs2CF?zGQ`h@qpWN7vKy&%J^v3+B&{43RND>)6SYr+NUM zM%=_-ke3`5VdVF9S^OqL2+Yvqv5i?QMCrh5u|S5xn0nhat5&UAvvzHlSd6fEc(7+< zR@Stuw4o`vvoTYL$0a8q8_I)t9mT6aH-tbyzTk?IOf{6autT^aT^0+um~ox=jkvDF zm_@Mhq96~yF37{*1REzg%%UJ04`#~+4d0t@R#!8vwXpDJpHOJA2!;0QYNTG#|K@>` zbGfv&H8d3AJ|*=yDiDFTwo)l6zsUX=_1m{^+O&OpPWtRcixy3X7w7RHYqEX2sIjW5 z>SPaUg9 z8yg*yjCx~eLEcCPZ`WB!3YSZBpp$@}`qlIE6Do*YLJoE2Ofd+LF!=XnbB$+=bai!r zd=$SI0cVqe!e+o0VaGQL&YZb$;mnyrZY!Q$2z*W~ilZ1HVqOG``vzh;LqjxO!BdCg zC)jF+hM@F=(-@HaG3r@1BLnRC9L|S}8g)8VDu88K7HLAPmuv_e%cbbXGMqDLcsv1QdUa`jHW>7LDD~7(jEvNxl=tJY{4gVkR(J+0&>LY`|`pNU(X3``{Z$ zpwxra3Tz`F_+yM17#JQN7)Z@rylK;>4U3hKDN!o(1_lZ?7L%epRl&P!A%#vMsmB8y zC=;>}ti{WCOq2eR^p%zc+0LpU+qwBqY-eqde*~?|N$8zrL=gpJ zuR@=L))5dxna%on1eR+omzmAcpa`~@Edj-!=xDQ<`c3hNe(=E}Fn=D6e(*s_LgC7l zD;MX)3=R$q3=V1^d@y_rwV5#@qz*CKbLW5tOVbC$e$Jf(g>|sl59zY;V&J!GTonnk zRaj2e*LQW**B>k*f29xYEJnu-2D6h$3(FQPIB)>hVOefQyqu^9Em%OcwL$G?ZM>z; zNFO;;1d7nL_`Mj&u1jdCnVh%3VVj|LQeQtZQeR)lN$`9bCqjPwzk$&W!zstMd7$yf zy2lMUKM4K+xz3}06a3M4cKZFDod>JWfJ~*~)X&Y$r%yLGf7{vl^Y=h$|3tWH!B8Ot zf1+(-Qt}6+ZgT23$shgj@OR%04<{wWqU5QIPGlG@1Y6>UhvQP=@zV(rK|~N?=LBJ?|TWEa?_lQVG0J zNst!`?oduRckV=8y~$xWo2nrOG}v&i+Qx-OhuOw3&4u&K)nJK}szI0~N(#{bRI0*& z02?v0-R)g&?NnlH33KKwUN@H?pO&|fkbdUPo3njsn)Q-BiQft(u89TP0lk;@^mSi$ zUp`WUP_|MvjIbjoQ?oz4LtdS z?3o)-U09ssKXT;A%p&R|>IWPlqe0qov3h^qhi|{XXV0EW`3R=?>FN1*KfEQO=i_3O zTQDGvM~G{H2t(D5159EDIz=Di5&52#VBU@aIrmYNR@S34Yyn0NN_KMaB4PlTeH(q0 zDrA2$h`8QCa}VwD?^G$^9h~kM*6HK%RhY7j2_}=*@AcTMmNCNCX|kI@Y0=x=)@>!- zxBWu`R1c-JQZ9}FxC*yQ6$rzG;B1p4*FzCTGGoH#&3Q7pN*fXpLFhU2muwy$73M4~ zU0ibgqmMqiNIy(%Ge`yYzTTSlz!IlY#UUwVv1nWXa!bgJVN6)FCbIKX-N-;^^WdOd zp0HreVDq?s#`;YK*8$HueQc1r(;%WpySq+X{OnE@$z(#1zP_aous&QjS8VC-KSXWs z1liJGU`yLzOLqm?(zYP4l-p8&-*E4fPd)ZH08bXnEe~yf@}Vs^FE1)8TD56~HZ^;(Ztfj;=BX|7 zB1J>37sKe5@4ox4AE0kTx_7Lv&rHJ=hli)8CPov0yi^w-vmngwp}zX6W?ZSvybcrO z?HfQyu?s=tKX_NmTfagF{9AzZ?hPP_z6tce14)FyZaHGNFJP(PV=?k6>eNJ_k&KtA zH-t}zWfVS^y|D~2UjTT7pKmDFq^f%APGm|ifA!T@Ch7r$A<;e1+}!CvXGu!RoH;qr zLrVz>2~{hjhX?IcdHFxPL&L9Mf;HBAfkC$aEj0kA+rirwda>MC$la#ivG>Ty`a1Zr zrlwQ1$B%xqYdKIrS52BQif zCNSo}oi>w7DKG*8NlvyQ6_Y1VPE_;!RNwha7dMahsg#t6Da4fzEP9I<|M89VulhrJDYn4`#^NtKL*W9kdA>6$*PP< zG^7%MES5X~rO;lAp-gtt0|bJ}MyyC4jyM=u zGB7sDPQS$GnMjb0;hF9}8!bynpO>0L@R0e`am!ga(0WG@&mc&7xq-unLIp&F}JA`?5%BWSW1Y+U7f9cW)GtW+$G)Nj*`;@844)x zwY2oP`08o%*5sDm47kcd@j?>~XFJxPzLr zrn80Y*8(Xgp(LC^)Fv7i(I}b-JQ5x{rVOI!p^zc3!lJx1(*v7CiH7Z=c7;?iCzPBAqAf+`f6%_!%b>*{DYj$r**-MQ0^m%F;!o0_|A2z9`r z3ctw9%bPLX$ji@1uAfl*@DxgMrR>CUgl7$dKAt!+&nVrz=`k|r&YQP=J0Wde z>$*oL#S7j=H1Pub)8C=$_~gC!-gDmr>ldUU?oBNXRB?GPzPM|bQStY`YqhA2O_`Md z_CC4-{TGiu@%ZD9-@8WdX!-0#%*VQj0&9k|=;__@CUZ1dMZaPwF3E7fGSE{xFXU`?o#v6XSa z%aGPU)@wIe!At@dC<)MZis=cHhxHiKdQDh2_~gNn$T{S zmiG78|NPlGuMCkVZSJ^Sdjf^RmT{XT0ilqv2Am{tbYh(`4)sqrobkw*Y4pKjSp<25yPCbz8@Tkjd_ z8i3%Z1-a$u=xC{XAQ9L9@egg>@n?XBw;Eh=3&GX$Yd_EoFyBlAAY_)UX6eD7YIJ~TG^L;{8s zD7I~T@WBUXNxy&j<(J?1JCtCI*HHh$Aan4~uv5ZMau$d#GHT%fw^Of4pWU)$!!>iX zIN_!u<;=mK zeyl<5<^1_eM*!4sx;&26kI;0ky@M#=Q6J+AiA14j|KMqq6N9Avps%B;6@1L?<7(`g zI*fdwfDLBC27{IDih^vADBESj26KXDz?|Ra45}2z`)2NAg5A~}I8go1e|B{plB6h4 zc6I&ppZjruuYq)kzqVGX+)1%7EWZknD7q$a9t-|)~uiU&o3 zKN8{^P$=+44?cL|!cI#3;u88P_=9}<6nzS*z)|XN^i+&ht4gU}&d!l(U>uK%$zQ3L zkiObF7x}f+PNVi(a~0S+}Ln*bVx`Ua@*y6)?$Hj8ggpnpa04S=%&|A866D`od=%A z=!>4xo&(X*PUl)ET$S^EV`CD`R(KEod5H`dC7i5&?_HP-}A=~+Ld|L~wVFlD`mv$Dz{2-jYF?I36&uq~NE1o{Uw z2g<^Y%V`UfPrr|8pQ4vx2SXMDC&~~!;Q{$0&0s^&b4$?|5iSEZz-&%RYT_@W z>ywhq=29q030O>1#6E1~pJ){1?Bw6%Rr~+OgW&=eVn;b$42Qde+<6*zJ~vGAU~pw@ z6?ib(u#5%)h87+fzeM;xJ0|C>KYp?($kGTikqDM13i21CAWJJ}hCqXi51fh*e4T7~ zGdgFkeD0lq-<2~qTtE1GEW~y2O94^vE1w$=3!f5X;n}zRhC`eV3s1o3CIo$Ma?s~e zUl($ZDce5&xUbJa;=$@_D=MT09&t@Lg)fw%F~v%il4uJ#*Re@86*s=)VVpKGaY86a zz95q#p@8x{4IlthLj6QPOFePq!^ST8UaF2|$>iJ2P53*b_a9LKgOu2P*lFvsgv zDzhggMdrbZ$_XbQF%h|u3aeCXYFa*R+NxD|Oe%yFQqPrB*?5g)(rbhosiexubC`@{ znRSbR!i^j;YIe}E%)vQK#;q5*bAh~{ShGN%NY9Dtg z5JWr(S(^7~ihh8;*C5nVm8p~pq4gqM33N;YND>CE&o;_>Uz;7Gj|0s!34X~fx|BJbf>%ck5Q>liBaYT${ei9hfrtWT2(l7R! z+YLq{o_)k67oLv z6wDu?guv^iV5wxvg3P^)nD?Y@6B}oi!EL-pP1@-lzgaH5kk2E=3SAypEyb&>+`E?) zHi>C6oDP*%qUDSOYcUAp&1Q5dU}u#EOe!iP@ceE!j8sDG72sAJ2cZo?DvXraD-uCC z{Gr525ej313>3@0@n8e>7t)c3<)IQ89b}+l@r4V2Fwg=6PZJxf`OQEBadZZb;f$bTI4|fJ z=HVD-z& zF;q#wP|?6f)@MiXj;N^mdg4}zvGVHcqoOL63ZNPTt{83r>BS{TGLZjgfFpSpWN}YY z&r)X?li5^AFDVzKee;Xaev?MgCr%V0b9o(p6Vp|2U!qAOTzulhrAtg;y~cLnBMCH> zxL9JoxXa^JqAemm9t9aes6s5226QwT#1rKr0zf0KmRK=BZ(eU@Xitw^-qS<1A8+&Y z^bjN+E;g3TS`wKI`%R455YUXS46Uu5GpDxJ{{5>zI%;dJC`DSWq|k*jP-rOezQn5G zCKZawm^cP!L?3iUG75i-7}9V?^naM;^g(BY+Fi)qDgVd7x8IW1mT$l90bv;NYIJ`7 zPD1lFEPt~9;fF!~Vte>u3$+=`4MhHcfWP(D&N3Y9TAHK|ajlk6iDDUpHwqSXv{m zM2$(P$!PNb>pqA6`99OC8exs9?of5PD4KE(I8URXd+ia#jYqC70`lx&xu~5A&kbLV zwwB0U#ghRdy=z+$)}3FJ^Q)8a8Y>6t14%@lfD#`o>GpM(q#Zp{j+h$9L5zRO?JeS#?N^JUf!U>?!r{bm2>AIw zRt%zo&M?Wb|FL4A`)zN7Dh9&p$TN+R)yK{4NEGK7_TN^mH^+(It*FiY)-5yKPk9EXOVoA1d+< z7boQu4=+IC0LwDiJ2{00x&Y0p2D(4994AqUbNT1{rTZWD>(478ID_BTscH@ga01iO zqb9=XyYA{EPt6hF)cuG&J9P;>xV&8(w(TlHe1D$+XKfd#A?T))WjI?|IA5o@lWd{@ zr%M1ISS}Qg(za2t14?hK4@+hd&eZI*lJ1+xUeY*UBAlkDuioDBm;h%v}@s7cE%upZ}2cC-wnBD%y0Bf=$ay z0rJZj;$t6u4Ap{rR>!-UzHk5Xm%lu}(?Gxd_H#4{-cWq_0EN+4=_f!o8_47Gp1$YS z+X|_2_2zBcHkV{-I)3`(lTUscn)@g!%H_OA9(m=J0P2WoY{X|(8p_pv2&hJ7|2+mNu`5Q9D)i0HTHjRusxDA-a;B23}o&5*K-`RWE8`(^Mm;Y1$ z3xV;O{}SA4B#3=Bun%KwVrSzK<8SbP>3=&gzV#1+)@K#F8RUs%8++J2e6mKS3jHq| z%0tk4z%b5nmn?Z|R3IIT9tD{;IYH{Q`jA@{iwtN#c`l=~^HTM{_wM~Snn(Y;@6fS> zM-CjQs;xcx)7PJW{`n`Lezor$$VM(-Cd+E-9YcA7OpJ^yO3OHt5 z<8D9NTwGjWUVSd3qy+G~+|^6TIZqTjC1R}>6ac!6y!rFz-|)~wYnSDelw5y3S&U;L zS)SkmnUA%<)2e3Cr3g3*Ghz<>!J=|oX;9omL7iSGd``4(UFnS2f;(}R2%gX=e`Mq0 zf+Vn4$IoAN!()UNev)eAUFFkPPc1B1x9-_z$#Nb|t>p=F(xW+I8X0Ij16`s^ZI^2Z zOW5~c9PBV-hrC{KsDV}}o}0X$iDJmrL03RyO`bSy*UC!)c(b&|&!> z$_ksf+YR(9uaMHhM&#RUsC-=pQSpBEnSeg+O7gTAAokCZ71Mr>SB7%Dsq#k6v z3VN%vpbjPPLsJXN5~R|=-eibj9Hh=LX8w~pgAlP83Dp>5LSNsd{r~=OH<(}c?mu$| zFoXK@=MH@I(MMl=UDetLb#GE_*lUPkBM6hRh%S!x#OpAyJPhVV+5gI}0p(Q>rTk&Xw6r>dg?QmXqc=!Y)t>RXKhk+!# zE0VY7sXP~IS_#XBdE7;@(gM)^_s*W7T!4GR;5T?f8G-b(6sh0R~Q22hKeZ{7i} z>K!!euZ(xQ{`L-7c=sG0q!QOX^w2~1Y`rF3DRA{P0ETjL#8dy*;s7`1eZn1Ibg-Jj z`;Y);9$Ta_@?Z^57NdR*LOuPhcW-^*f%{hHuWjR8x=LsXtQJ! z9=@MIDn-US;hCLnb=5&n#WPt+uvHI}1EMAlxUW+pR}d;iaSCy)#Jt-HVd{&{sK37NU` z-uImMocEmPJVzrlqZX*w1x7Nu5A1h$;Lz!zAHQF^yM&tN;qxOMu|KCi)jc~DDWFS>oNu8jd2(>IDCWXsGJG3J15)}3@_YL;}_a4R` zsPNZN-7`>D7Z9=Gd@{d+`JcWn%vfMpmnqxJVidR)SecHMmsk^T3S`g{4TT>AH1X*0z<|AS*tfMT{kP7?(Xi9j#xZ5W9q0RWdAdl z{cid1?tf(4Hp4@AFI|v94v{0LE?W17F{O3mR!crW*@h6z-H~Wj~W#ppzXPK`l3}Ao;1obJ=iC8 zMqFfY$ZTv|_oeU+`FWK{Y4dV_|5yNDXDwfn6dOByMY z8?#UU0N&E*|L(ir*E1v6Z(bQKt@`F&iz0c-re`x}uU?yl*!j=G_*}bXxTd)tNun`H zX&auH34ovnUc67hH~g92E_mPA#l4?dGi_|jL!w*0F)OM`` zljtAd&5YF*>TL{)NhfJr_3w{&CO-7+1BqS7UL=jrsF$*V#l1)9*0Pb`&iwHxR^a%% zS)f;b1Zc&F_{Su#yz}X2z&Sdw-P!D@>jgn3DEA0YgOrE;N2M}2l-VQ{WJw7% zr`rL0h0CHGS}9W~A!p!mv367N8}MoHD!h)8n0**9qo9%(RAVRDV-tq?>hxY})F!D^;AM-848Tbs zDp4^CwM%0Y!NtuEm&#D8uhUUd0E#+0yE~c(&}9vu5Cy_?Vu++mXjdId!-Vg`6KHHH;27$T}doT>`%L-;N2FP?N`Y-2yRgfc3rBV_7ldUNUjNO<{)lrjkzuyYDrESzbpr*aUte61D?wrl$3iLeoF}Vc8(mFQiS^$FdI^GT7h&H zSy)j?y8xcXKY{c&0eobz?62- zhMK`0z(y5~(w5bHE4POMe=Vf|viW>VU3o2kp20bu0?7sw%)j$qARR5^85$vWCdPI0 zLV`4bQS4zU$H#yuzB&!xLtz%i4A||FkEfY5HJ5rV@OR>kqC@dMU8{7D8Qf2=;=w-MK zrsH8)9u#rlcwEkJ#)eOFw48nTlEtm5rYPZSm&{%9}E13HL~7~w8# zv+Mo+!r%_X^HeOW2PB^3vL_nka%%Ej_`wr}kHg(hUMq)+;RfL=W$jSrCnW+q3GRLz z`IkYhj}zT}Zy@PG#zOsA#pLDX6&B{@0kV=K8#%JCk7KDLh@JQKjU1T^3II`74NdL4 z;G&cGb4EuNwFCD1P5i$jhyJ^d8DVo)D)IR{n%v&{n*KV}7o}0X^!+tiX!%!8_2U0) z(B;RdNWAI@s461yL(Xll%LMZFXVNb)hw7Ta&qtN@Zhi)L4gc@Xk*Ilq!iM2`yqfa1 zT77*1Tw?64ola+28S3JYIs(%Yc*BHpQ`}^SBiB1R+RH0CnraQ6pX?1zS8s0!a}Jv8 z;ZCqffyhu!Z8YY3r=|u3q^45WhCe&c$7jL>5Kqs;pM{2^5|X9dtgKgxY}cUtr(gxd zeH`bAx4?GH}+cgjdEs*C7kPW=Cg<-@-hR&5aJgJR<-WmO*Kn+HvS^P> z6|FJJc>k+C&VZv@={|I}I9TG?_kH=HL&$EtK$3M-0=Xzq7g9ISSr+N~^`VGT{u$gt zc2c%?cXSqT#XnFFQ_WN}a)LBrNT9GkAXPkxmDT~PWsz*(9+i$rxKhHo`)2~!wUY{= z6X^&T$K~{Lyy$)w0If7Wn`G~Za#9xrs3`S=B~t)u{f%EiyHsiXT3Y9r!QY8U!TbCo z?w??ve+J9+tdNwhUjjG^DZ;Fg${ksSz-KamZZ*&1FIR@u{{SI!!g-wL~?Z7}L~5vL?s| zW3k&=kTpqTf#>ql{J?nKY>{r= z+W#OFL{fVUuc@IQ9LSS!klf7=w)6PPC&mrVGcY>$v|HFxvQy zbOqFVE8SN$gWrrc1Qq;R6shKO`MCc-2?AncRZtbg;Lyo~vlxquyErtF=Mn02bM4jD z1Y!x<;8_)Fj`1H{c-ms@?Vae`tskXoHzfzS0iXxQ&P=3jAXfsG#$4mTz--+G)l{xP zlc}$X1-u3jO-Zf_>0xmGNC~*h;}zYW@r)EnekdgW_AGD6(0vzYc@17pS3!Kk#qt~l z@$!T$uXklY)O~M4e&2;DSHRQTLbANl;se9lvZ%koubYUN_Gd%>9@c>5d1rA!{Nr%k zKfvvp&t-yW+DMX~s(vBSTht@H++R|8{UQ(;@co2DZ+u`+vhvyce0*{g@c;Trq8Erk zdU6M;2Q{HgeJ_3YDqt(%3zAf?;0@kB?_s|(?;w%9g{-~lS&QfG)>18n+JZyJa}){o zgfsTDDvB9>f-x@ncyu~0{$`Hikl&#desBxZs84BHnT>+?Ix3Q;={59%9Ldg@of(jq z7=r%A#JBO!z$+}^A42GDH^@aE%uy&L3Q(CL+k2*oJJofu`0`myoO4Mz92z8PtLRK* z$TE;E`x`xddX56%3^`3@Cysgk8jWshXhIgEl+*f}_m!u-cW-%>?8UY2P7#HuC3 zXe5i~pFFhgRN(2;`}XzqX|;Yv1~@r=VPRo4r|?5+rvQcc0uq%80R@(iw-*bSwY0Rf zrZJaZu_7Iw!8M-+3knO596Wa(L1~n9kM->;DJ;a@xsI0#@Kokn5nfT-#4^Jtf}mjf z)q2#?Khlh-l7N{1M><1eD*)f(tkf6c+dwDCXPvFan^J9&nmL zhRHHA(iNu9nj1)L7nuCrR)<86xDf(iE)Yi}bJmL22(Wqlff*!SEYl0xF>s*f1}YR^ ze|`LTcz8lmcw{t)OHC&Kpjbo}sSofP0rpC}5HFVDIz1@72m5$#U{%#$|9a$zN)-~P zC#?mMz;z6m(6tUedyZ6q!O{+?nMPEQsjnm9^|nEOWdc@KTm>;hw6X+0KjF5OogiM> zqes8{t{2`9BUj20OGMRmm7PcW19@#3;YZQ122h)$=M@l~K0P?1msi^@^yBC@-AFb1 zY~SA8>_&$baBCq5pW(+?!NWlO3mLdh0H-uuY#@Oyt)HJF2GNCBy`Lo${`_aOnpUe< zt}G~MscNr7c7rhCVlZoys4@a9q+wZN1lAI|w3Ib`eF4S6)qycFQA@zVJ2x%{O|+^p zNCQr6tb`{YjqfJ%_bJ}M>YhA#^6e~e^JMZS@-JB3LumQzbi&UtbP=wcCM2G&H)DC- z*cAgokZA7&xk&)DgSS=+gRgp1;B>4dS80t;JNV?p>z`%!pIrO{{A8SvkDfCpeOhih3Z1{v zUAWK_zjP@op|rKfjvdSJP&%nLCnhdk8sBo^0@=3lCdbZ!L+$YK8CAp!)hohy#%+%C`1OsF8sC7s}LTc)qd7!6A!aTZrtae{;WUGC>an&BQ z6a@2TZ+B~MXi!jkdh&?CK$EGbg+eeMnF^`N6c{*qdV0F>(w4R^YXYK<-r)f-{77YV zx?HVIHRXdko`&_$6z$&PGs#k{e;U>w4Dr;BQ{i;c`iB)1pvj)Kp@DR+(*o2;v>ZP) zG}zEFg}}h=Y@k|3;rvVfLap|-+kLyP7B@CtzH}YhE_4wIaX1VkGcqPjh&RYMkGe0O zFd-vjgc=9_hsnuAda<#;pEY%mg0FTjKR;FY)HIVRGc5*6pH4MU4d{V0eAUxWFIqIk zPj+oc=~WLeTJ-eOE24ymz(H~{3HBV%I(Wg}Jd368Nmk>e5KOo>Tg8U&Q0#lT*(yjrO!VJ$!Pd9Z- zBxSWE<1Aq~>;YlTXyRDc*xFiMUDeb~l1|tKtku=6t&P=HRlpv@(F#QWGajBlzGS^+ z9M|fWV{ZV`2fIO7aPYWsP$B~;fP6ybp8WtjjlmE&eB3y21(~&=%mcY5dXI7gJ{ndP z9Hy50`7siuE;r2Ed)l-p1B0GOn&{CZJsShiBMjq{IBgp6Rm2B3NZquV1R(eT#0>%h zTz%2ewr;!o#{NJMykc*9s>lXRhJ28yLA*#l5=8RhtH{qkc%a}sawGWUU6%_E=I1N0 zFR)Bq16fOeyqy||dsyHON$0cAlCEoJ`e|fbSu((;W%nJo;^AkX?Zk$_GVuu@CJ6Os znc`DO#vDDqgDRQ@6xe+(NxL|dRvxpq3T4g z(e5yTjY+GMlV~uOOsn@bp!o;ROHvE1RI>~N#!C=|@9+gKrK+mF2A>By+0j}JUUxWO zctg3=jHorE_ks0OYIgYQ8X8K@m6ZUzf-S?^RZ-i}prdT~LxseQ94O0#fRDjj@4LgZ zW0Po|T%@sb(TaeEl#*jb+Hokax91m&Sx8&Oa@}MIRBW}d%2n)x{ zqN}_uy2?&mWiv%nTSQm6Uv!n^Yk6Pe>z%ju94yTL;nNR4{QSt(lG2Kr-fm*#B9uKyx{h6XCc@7~1^2!_EP7n38xbxY;N*Yq#1vp|_=V zJ^Z9eaq3o}S|(ZOMNiDYQj<14-@-0@MZG22l(8Zk4)a9{X9w(Be+pc(a9U!FPc=Nf z%hgk+B5f8O5g$Kl^2{X&2?7(}OJieaKvK$CY_3H|u3y*80|N)4-}n|y#WP2k z!<;RkSZL@|jF>(>D|zB9U^~Y8G1QxHepwnid$#pW%N?k@dl$rMDD20vZW28fSm*sh zIsDfMU*W)kqxlXT&|mX;e#xAwuK+sRU$|lU>eZ`fOkc2MjIogOf8i!R%Xk4DNDiqb+#sSRcQ*NuXZK81BUh zxi5L{A@8|!OG(-*8)w8XxO>nE9E1Mkqj?Ci3>T8}F9Vvh3}Y?#H}vRD;$QIo{M!SE zvDaO>dZqwNbn4jGALnEt$n3}2&`x53BjTjp1)zz(qi-C*+Et7+R)*L2R;CqnUx=?O9;B-S3 zHE1~i$THzaZv!_+paMxWFe0mmO-Zzt*lew~P$QbqbOgl5$47#t?6+tG*_6YC6!` zsHSxL&yh;|Nt3*~Q{SAcF^75kBcY}74@O7z@L&V_gUC&OI%J3g;v>B(br1CNUXfnjE7D88W~fUzJqHf>$@v*W1e!Hg@*I zr1kWha+7y(GVpv}fq`K`nu?0yOP4NPvq32{hdSD-E6PhstD9(z#!adHi4h10Jar0W zHB8wl3%zRV43yY@EsSR_qef!miZojpFx)N>Lz$RhJ;klgURpr&!u0Y4mpDE0LGXtsO+59&8oBf#}6Kh69W;itKdlrSZE)D`fAz#^J9k7IY z1^I!Tu&>+N>vHv2d;7rH)YmUT|3N$ts4Zj4ua#6*R`L>CV|Qm&RV^AY^z`&1#tns1 zqPH|$FS*m^;CjlNImw0dMP&f$gJy$gv>+{j#^~W{grc_`{u&KgI5fkU*4LD0gXe9cr#l^-+d7kbWsztri}Y2B7FiaSRrchDD>#hBK!8CNRQrx9z6^_+A7kc zM@4!x@pk+6-uqvD)!p4%^9vJq{e0m~6ITHfHy$R=Xcw6{Y=TH^_fv3d|8p}p^QM_A zfbIB@`Y;IK#*y*2+qx0srrc)hrVZMuIPHGX{Y|BKyQ@C&>5Ao`{X?S;Th zHO=(m7vKIUHhw>U{b_C%6!{m%?^TcS8>f@kiHx5_j*h~h&?Z2Rn+CAw7X~o+b_3|f zX%Y;QeQu{~$OfWMtAx9018u|xj_b1OMK%zh8@!Ud6vgvHcF^?;J2>%nJJ{YMNA5yT zOrigfDfBjY`-BX;X$tkk6pquxOcj~JQa8@6D6}GHkelYP_7~=G;_c=ze3-X)N{UIU z)eI9`M6Fh5G~Kj_vtbd(BWfMAP-GFy?7;s@6#jl3HW|1~;5ot5vhQN=*2*wW?!TREBx7y0%M-Clw-?WS8*)gs@J2>xdwS(8{vEE{H z2}r$4b<;Eks(gZeVFHbzV{f&XT93ti2JFD9+l=EFg_pejc4HU`cK=&!rcy>VHQlt2 z0doJSFjL#HTkM~IeD<%I%^8Dcb1&Rpa(I&e(nyA>jFQSzCx7}$Yz-%k#^(PE+o{vS zu_`IKX(!WhZhp%2*{x>q;>E(FZ_I!hyw!%zyTyj~09m>SWA(2ZOLmluF!v4_N1$?q zA_=hxl>!bmaMNCnYpHJ|Dc~XVC`11Yn8#bpXkAB7Ps>eXv*pWkaa?+^GtXcDKwWq6RPoF+pWID$HK?cyb%y`38634ffkQR$ADgbIg zIo@JDZ$E=FB7KuX-{iOp|N9yA6gg>b!2{`A}!`WL2b?sJ%}#1Z(TJh2JuIYJaYa+ z$RDdcd?61n%<_U&e;rpN&Hik@BZr}eUt;ziBzfC7!@pnBba?mf-T(8RMe6P4?908A zI!mu7NiBLd9ZYp29nda}N(6fHP}*`9j|BDp6}4CS+`W^)B*Vn4&W8I_fb)L7uyI|z zit*$!1XqE%nTgNE2*1YZ>nV>y$9aR&CPw$Y>`fk z?yks9<35nS`tpmptN1jo48>T_3FAYq7ywYx&3!$PqfY@&ngV*H0hGM#MF)2>zUBJB zRDX~1kB2PJCq`iDtLT*w}uY;FOm^TTx#NaGDQ&HB`R9Dm5 zs|-LFfU&8ulG<_)pGuF)5KBn6(TBk8?5!#70AZa2pLvi9uD#8v@9!P}Qq#*|k-FR( zU2f9CYo+ydHs2B0iQ;_*Y^~r5YVHaM9y|B$yYHT^yZHSPlniLK4GoUyN%vD(cNLwf?H%gZ}oeD2bfl9J-<*IQj?@A@NO{^Qt*6AXjW#MfSZ_nSOm4pqf*LjYY(0^3*{l7pYvW1r_T-j4vVne?o1_9}%|vJ@vBpa%7{br<_Rzy=J-;r{>&sn9P-$*~d z0e(PcnM;qrh@kqYH%u+R^AcQxaar3|NTq9XO%HAGf*$Cwd*aJ;4sjk ztK&B2#kc%ST1snF zG#-l(Ncvwmnm1>3Ih>h5Z8Zf4`n%Dc_zUr!abk-^_yB8@?n)Rf|19$EE_|Tc+$`-`Q;M_m5 z6$Q9i@v|p}X(c-{s6BKD)hm^Z$jh6F`lna0+y50%GBQ}>k}<<00|G*f>b9%J6(twZ z(jJg9$ej;+GjE;&Z2TSkR`pxo9zS0VtQ;)ps$EhE7L{(gEEWKP@Y_;|E*%2m`0e(hE z%z22dy|cNs%UVI;Rlrp!E&dZ$E}S$e7{ZJ0qeQZ4iFcda zyl@?1i+vgn_iG`MaWSFZUNR;iCJ6UQZt{;$9y@YW%Jht>n+bf2B+o3=-7uoQPfQyZ zM5CkCz(98=1Tk{5K5X&Ba|V5fDUd-i+nu-*#7xK_$>dHJ?Tq3~Zpg83-YIL9%hA=R zr3>|S0|V{>De3v8(;WlkQYz%@eG(EzL=at<@Pxwta#3j=42va;`j`#`-ueyde|$nh zmMpsC&V|_ta;w#C4A%5ERF+kwQ6ED#l2|FalpvLR=+Nm(tg1r-QZQEa3<_J8jnXrI zewHlSm;N0+2lwT#^!V|az_$>_=|6itu_D_Ck=%etT}SEpGw0H1U%cIVh#D$|3Duoy z=gyA+&_l;dHEFf{35kSIAIhJc?yZVJUJpg52ZdbkX(7Y+ym7||M~W*Ou(h-|)|H<4 z>g|^xO;-GWk*pkYyI6QsK3Oz0nrz8rhVYmGiNq38bFHJf==ybp;ClOTR)EuwN*NNL z>#l*-z$zi14{p|eWGw(CbdnsP)7}SEsU^f%aJjiMAt4N<1#V7lLKkp`Qu#;5CL|ca zFh`PoG-;62)?&lGrTVLCQGwRS7`=9cXyk#@5>ryVAw*JdoyptVpjG?Cj808U*8rx4 zS3=Nm(fY~`T$FEaflzSXVMr7YX7`gJ6XNWh7@IQ}GBF-9FG;xyop z%Nv0? zu*VHNe3+Vp*PP?@X7vF76wbEW=l7jBVWG#4%{6S=v}wbFG4mJCotrr_>?gC?ER^7b zcwcyyn#}}KtKdV%qUdeR*eqDoDgr{KYNhwnd-hnsahW>PiRJH$*B7w(oxj|UdCNxQ^x^$_w8Lf%i z+dW=ZdpjVBIR-mePVt2VAn~w}b+zE9+#u9GMe4o$C#0vR45JfZr#=1?Jb-Y#=q?in z&(2%hX@lHYb@Nu#mQcDu(LB8cJ?k=>aovO5c~zA0E=F?vJX{Ur!Ui+Y3~(d*ctW=wD@Jq&gR z0|3!RdqE>`r1D>boVIQprKxuCg+j@(uUmiyx7MCLe)QP>{Ri{U6hVJL zE(U_J)>f*RHFBe(wRph*qbB}CV2aa8v<+VtX87>oDJvg+ArlTD0aw4M->_j-c6z#p zb_~!9Ef(%#NiPhM%wA6Xn4-f7q7zw>;r^|BVHUL)<6E#z7lR6v^fB3`g;sb-$+m9? zUlGNn@ek^M{}TfHRp-y5w_x=@UnaW~Zf^e#{T_z(A1+$|F>8lTt0Nw(j-a4GKszbx!aLq(A%s8Xjsfd&>*5p|^7ZQG5=GMS+!v=;%^Vo1i7VlwcH$ z)&_f9-H;wy!5Af2Y8LuRZs`u=n7U4hV@T=7pqq-v3ez54yY(Z=R%hSwG{Cq5e-BZ# z6rg62 z->)S6JpjIe0p^y!k$TvCj!^rgQ?iaelSciZB$PfdmH;{5@|OZnj6mq zyek1+jIdouOG<#QyX6(2keP)N?<0V4zX=AQHv}S?7nCSUCZ-Mu>RbLgM+Fw3dbhp0 zP1y<;7mzVTxScEt`)X=3Glvgv?36h&Giz$7YSxVVK4`iS_|CoMZRCU`X#QFh1xX)% z_WBYfb^~Im2%E2PcgI0$CyJz2j4PahU5l_Qj}_fraUDe9>9VqrkY55uPZL~;+RN+2 ziQDm_J0vS)G6Ljz#^;xC(G>(*qP}wF(MNB`itZqN(;_0$agAFwq|gOw0$2 z*yw_aqb4fLCDmPIv*ZPsDCx}cD=<;e)p0Buh~fU=sKa&P#M#tkMvoK$CAxCu>eau3 z5|y)NH4ki(p8~#3WGKrd4#R2OCnT3fB2GwblgSn27al};C}bh!K6MP$4YQDK;m%SsJj ze)-o|u3trWu&$1_*7jqB))BoX($MjS1zZ_W` zVI%y-uC6rdZCUiN!}r~nj!4OM&5U)xQFIe;{63s;88&Bzz{j)&bwp^{#uBMmAOz~XJ~xfeR2LQ&oIVXC z()sh>Eym6=9e+Z4h;4((`#X-p9@pk4?k51z4swV1IdEUVc*UGKlULBF4tz;C^0JI- zpzP@3bLVnFm>mKugHt2V!|L=iOuvRFz*C%Ud0s();_0)IPkt3wg)H)G-#&X$_iGX5zG1 zX=_JEZup%pB-IIJi&kq34xWSKOw6n)2!W-hPMtRG8pJ7w>F8*zD6ehAt$Ck%-*c8_ z8GFCIrxS1Bu?ABiR|`dQwMryc^B`BmhefpwbtB53B9bel@cC!_4;4U8ORg0k=qwau zOd|QRsDIBM#NwZ4B?M_M%gO>f4J!k3BP)ySus@(hrzMkKOD{zbxK6%tSVsB?9i4!kF4e1iR z-9z+B1W7)YBhvZ1b?as#>PBMcZ$qLndFp-aDp{!T&E;)$G#!n1-9`$n$O-mW-j`GX z*=X`;0eAb0=rQu~V70-|+)?g0cZ{FIFHoKb6%x7~6ko|i$zwhd9|+7xEXq9KDDL{; zqQikgMMu>ae`Dd{po6B{64c1q>mkWK)*f&Nz&$1AL*|6)V7)wt*w!)}rir)TcC8(R z>xg}G*rwk6;G2ISz3Fr~uJu*dRRTBfaviUgq9G(|l2{2j!^-B4b(EL0veMFy;d3o; zb3kbvJLG0=Gxj?x%`-Fk)I!`(-2?5`87a(;hS$**;ilX+5E`$P;D<8 zJip2z8)B^E|9^QVCT+;u`>i~aa!3NnA%d8TF?eZ02k-VWttnOefu#>EoW6b_p|G=b7oQ z|ErnSdS>e5nQ6$4ng0F8Ol@SQiw0+E8Ja1P9Pv!WlJnar*<9oyQ9~v?zDFJhdhkfi zB@g}N;eK{-_xe{7`rFqL-t`f30rZiZ&f@nToDiuICj$oX2NLzB|@vCjHlVw`;&` z(1i_)jkSNj3m9YT{{7ah2QAu#vy$Ykt-T|*Jaf;z&l64@GR%gJ^Jb=?o}yvT->*g9 z;dgrPo=l{ZE`sg$bwX^PCBPywL12mR8^H7$(;i?C<63b?|{gUjCZ&TAi0?;d!-1Ow^`ipxj%A0 zz=26eKgxsLAGnufmXdLX!jLKUtF__e5Lw76Uov1hH?{}l-i+1%} z;EhxBrdH*|mzWC<5@4owD@7~W2okWS=$rE{>e!B1I>B6tS z`4-7xP@pQ~W@b+t=W9m&15NdG+RX-gD+rpb1InJBe#T@{IC?B`)s@wC4GnFjCr|f> z1R;^B)2NkB#P6l46Qe1I&*+p%*De=c2brbOWC~4LI6fA94w9~lD$=3PY+&qg%B4CJ zs(jEPsjJ)hzu2w+45Qyj^nVI@@L==>%)YQygpywd+}L~65e%hWJ7l-SScMy$E@B-O zbGitItNS>%1@awrKdG2)7QUyaJ%bH`{5G9`jN3qi`i2;}ekm=7A!G@d^upzT=U_)LV#D*;J zU_-hDY{>f2v_C~Z??=aY=1H(2safA1s>s!5G+hvC&9u@?k4kn#&Bc4 z#77a&_qW#dRv)Fs)72&$8@tfe#*cKh$)VrH%GTo>Ne3KGJS7NCZ9qbiBajObJCKI! zifhuAitGUCOHFFhGDUVEQ)GL>>*}sm6Q8&p`#KKRE=o>P7eN8uQBe~>cI(8UWPG2K za`n5-Mus^jG%am&s=^S^?VCKAMDn-akHf;a2rtHlN?E$!dI_yt&sJWou12R*)bfIP zDTm1ekQjVZW}}3^4@ZalR;L6ykRCr1^wwLs^ybZ3)H$%V3-Nr@6HCTKqXbhIYH*); z@4fd<)m?6GPU9y^5oh0oclt|2s3O8&Me1*}QJwrPN}0%bN3kZM_u$^Wdxr_E__?!5 zFq?mcPxau;QLr(V-z0nOct=P6Y;5u?fokdpqay|~oAc4MEoh83-r&rJfI$sf?D zfH3tkc91Or5@0quoGv8DoL1|ALW>*&nzH2v-E)s_!or0M7i1;};}UNF;bWGf+I8Bq zCCxqkpbyd3CMKf!m*63s1Ze3h1b~dsshz%S*QA7mOkS0-WGcY&=}RU}m_Q954l(`_ zz>m`-hw)ufrQGZ-QEl4O8U)-lguNo-%9Vq=zeOhW%+IAqkCv32___WfKAgPb zROR*S(qqTaga{-J-Oh+HK@z9gDCc@W+v8|$=l#9$R*gusMAX-R`&kiWz49vUD(~xS zYVYs$1IHY973t@UlP9ST;5gt5$Ru^8t!8gVR@(-rr>?fkO9vQan@)El%ktman!2ya z-W!>Q>PGCnI5+)M*n98h9wmFPT0-_-w~Xw)Js<-avZ>;|SA0JFOZ*hiE*caY^J`f#Gcl z`I*|qdd{i;=~Zs6O|8Ch0nCbA)>p+gKjxT@)>Gg@%u=@-Gs{K zP|I)Z1OMu}zc$-jBLE5TwD88MR4jQKMyMx+k_jloq1!nU)`APfM>P~JhOfJKbq~oieU8$v+WgTyZ6Ry7kg$~ zCai3#XRaUqU(L1AGglIF6jt`?jkzAWG1p$tT#cT&KKyUbRS|J(v`)0w3P)}30+Hgb znM8_x3I9|nMFEX&AySOdNIB@$O5!eTK!$)C@)yLcvSNSXx23oZ;AH5dFLe(QT_a{{ zA>ZuAOn)T*U`5X=JY`XG^7P!zc(N8&MV}_8@I@pQ46j4@69eqF79STdKk7#AMmuCx z7&*a5z~gH@_EjfSB$<4|%S_LCHjNsPJk~W^^46nQ%+v-Tz~~Ig`l}D1UpqYMAIxdo zNooGOADjoON22bxo8=X9&dK*koHC_Z9?-J$BX_t&(JeL0CpG-_XYE9ZSBJ_h*gy1& zqP#_)RNTqO8=utcwomHyE1$IE_>cWeo18GV+9~?(XGmu$mhN6FCuFUD6yXc_k@lxI zqMOgF0#mEBgo?qbKVDk!w=b@x@xbeYe+x~vs+2H4)p9o|T0y}o1Fp;s)@9Iu%bDwM zyrcAzt3a;B4X*6%9?E~ZC;t2aktSauW)ErFE$oTUaW4~T^7bNo;+kQ?F7ZCK^xxeR znFyLvh}QMiy}u49A4tzs$i&~tH`DRWY4Xh zthK8b5IMi*W;Mv0o{{^)l`Iqi5jO{fW&45PL0-gliRY z8W++}evs9iII($i3_8(o-hARjI>;{0OT29#fDzK-??+;UgI|JHgYy z^#ZskA`2}$c<^9;iIDNWRoZS+hcciJ6=cn8;1t1avErTEgvJlv<5w2Gs`vGxpZ> zE4zzoY-JZzh!dTw1Ra|uC@3t%KM0TeHgXI=8qxfvAp%q;wx%XZeM81FZj-Tf|ACB!Tb-mH z22hg$R4$0n-|OY`~Xq+tLtd(++Z{4sK{(o0cQ2C1m%t&^*lXF7&>Ynq-*N0 zN!RWCs-i7y0Wf-%0E?Gn)FX^~fxC(lAHv{qg{wys%`#B0K1BDG&E_|N+`EWh#kFzg zgmIR;0`bc8h*!TIflZmgm$2w+5kfQ~_=W71TnX`NY;J391sxlDGIe$JO3?g)SHhK} zd+}pW2LwtGFO9&~!9l!eR*Oh0^c^U35Z^$&YRUo4s%}K>G6Gczs#blZs!0hv5S<@bIw**xQdwzG5Ktu8o9J)8u}B)r`{xQfPbf%^@1Q4PtfCXC zD8hg&<-co03I^ARi$m;U2YF6MB=iN~aI(Q$jqfZ}cN+hIu$#=qKJo^iOc=tz>;3}1 zzk}{qr|}!;Zuk{=F}Ue)06<~@s$OhnR z0189h&>&DCH#C?`gb^A2`>;a$>(VH~fQ$_vzWNIloYBP__-(B0vblXB8iC_61EwzT$d*RitKNx={SK<$*r#4K6z z)mMZbnf~f43sslKKP^(l`CJWG!!O_pZYt`NbRE{_2n%Nc5NxD>@k9_6c(Rxr4ngfe zS4i_j3kMvKax96UXNdM=Z3YI{W{jX-4M9OQYNBlu-BgHYZP0)modv;V-NTZKF_Xfh zMps;}!hWJv6BU${2OvJ#AN!ep#pr0bU`${ zoi0!w8W_|(v5b~OooIKrStXUCIH$f%u9RB*HK?HV(`yZD*36g@y=ILR`7LC)sB!rF z=JV&uv0a)~Aj7rU>WV8{?H0vdF}P&(gvBIA@~Y&%`*4=SH_FHEjKJ%%sC)4`>zP8* zP|~bIg$SxntBOjk|0mh~3KGjqBo74alg8zfZ=K`;zWVB5 z;pOWR3HHz&hN}T8waf+a?lFg`gG}%;IcINg4;pW^Qn*z{m#rE7&`w^JSdu19n&RVX z&(F_C&d8qMZV4`hKW4?tWDg43eco6LSSr%HkL z37VWXb=C@iJt@3hjehL!2+l^J5}@ZMS?&}t`b}tz_YdwZ?h#>ZLZ|3W-0MK-7Jvn| z554P>P-yy?{7a;Izk6{8(8W<;{=&fT7s>we(@#I`%Hr4H*Ma1h5O91TMniBfP8mx_ zbelu^tbO<-a=+Mw5%FM6p+KdD25$*IBxj|xkX}qOM?1t7pj@ZbK{?%Wol1i|tx6q` z2>4}~zYo%#UMj8L*^g~2hiP(RHTiayu8^8Tcn3+vIeI}Sil!Qb@?-$b-e6}?KG|kT zN>87*WX)>aX8=?mduY*J3#X<`O&yN+iyW6dXZiBwqlbIrRmS-7tCugQ*5J)YlEzv+ zUD52Ir4p&y$493jJpq}(VM$|>h7ZTaq-g_>X*KOjn!4$MBgtZ!l@TKD3FadEPYID$lwFjBVwyUR3RkRIIiHSZSkUMwIrl))pE#m<#NF1oj z%gf8o&Yl=9wJG#ekE7L{#Nd{eUpSR__|X3Ep+bQ(KoBrHsOcvtawF-w&NM`!)!*`| ztOhVDz^=Kbg2U(9%t30s35SWmknr%t?8Ve)pOx#TV1G|hsmngIWKcWEkZ&H=1!X1W z*JOM|{W)-Dcw!{u?5gi#Y{;UQo;!|fe)`D=AAFFJ1r+>oVf;mz?If4)rygZrMy23o#2@Y+lPiu&c8bkY?^a?Z4J@HNskM#J$m zew$^v&_7L!<^}tqRrd>H4Jakoa1Y>E_c@TwMO+7{=T*E95c+fZhh%Ty?Df_hkZ#XK zg*Pmu=QPFk<;t-Vaj zzC-=?XN3CXds`ifpa-a-<`j892T&jQV;uMC@k z%sX)s64xV0IVh7Ih$U-lV>OZCKJaZM{$o>Pv}TEtLfeyshu3h#s#U9IO<;ifi7V#X&Y zC&yAR;DVE7IL!8kvhl|DvKCCpG;(4jhzH#usl`ud1BX6VRa9W0PHBe_JH!3_13fy1vA;6$d}j^3{Nt7l-eu6MCC2)+Vn-es2< z0zyJUFryA96NovEM9(BTcVcy&11BO4`1FH=g90`7>f!@$zx_6(+FG2q=grsu@|QjP zjvlF~$j|@#AO7%%BWEj|rnBcS6r;MA_12iYbP9?fAWSKD0l;zp(y1)1aGC=&fzeTP z6)NQ~gI2}QUiQOZ{_>aIpQEo_Zb(FI3O0Z_W5>?AYyG;lizn!MkARnB>(;Gvdr#~l z#0A^=XZUB7uYT7E^rGv^pGl`F4E47coQ(dbqE=CpRZrPev-A|4_QL3>}=AYT++)+bMHZbZxl|LwPZkrk}!gS zBdWvCH8=#H=DtEKg+-HcGFA!WHT-5T_Y>Mbdki0g)`oZRo9N@mXQGE1_oHP zGvqmi?beq4DA9mYj=-H#dog;PZ7AN>X>*b2f*lKEl9~fRb}a`A1=6fkqFp@$3QD(k zP-vJwcjEQ3s~0a`%-gr`=hFpe&!5UWa^e_#%@Ze196NFB*ohPQKNnoOc=G!7@Av-< z2c`sM9}-trOC5+lSZ@iVW?dAPEA~iekXp0i$Wd2Wf{gfH#*` z2+@Yt*0ye!#0z9VUP`;eJ?MWDo63r`cc(~uiA{X~+Izo9dmj{O@A$5!D_A0UN#{-; zE4*4>-9X%g@4x?k|FNs}ZM>IBi?T(ymoT-UzwGU3w=%p9XLlUV`rSPCTQGCD9Zf}e zgR5<aH)ZszY%coHlRUb=bxuM^N-{q0^Vm2L+IapZR0K$Q}e6 z)oHjv1qfWcD|>1#a9`N~(PB_MsGz?L+%~$e74En)EGi-*IuJ)R(}d(Pqx*HE@G;J^ zx|o>67-Ild$2%lu)Ur&xyI{QOhoV?%V#bs(vtQ7dc%`En&NFzQqq}}af9u_E1xLhK z?!i7Wmk$D_3IjCtp2p1nybNI^H`j_{;IFuy;DaV(g)lZElKL);??Gt16?iWd_^o2W zeEBH--FGwi=b+P`MyO->yO@^_m6e<%aFbY;Fd50!fKAB&-d4E!U`JaUSqbQzEq)Tl z%SVs9h#)$;vg29p8>~@EEaTe*PM^;1Zo8wqt)c9CRSkA@MCa=p>p}BdQA2Vm?E?c4 zQ+)LRFGx8$f!)Dz1kgbTAmUD2zeIz0t4!`>r9CzmXI7HUW59vSn_&(~`&6D*p})o0 z8oL`_G=5>VQF5i$H*yrBkqB&!PEHE<^$i{t78n%^dK}b60E_7AR8n$37B~pj*w^WB z_9Ok^>}~G??{iZJL@+Ykq%`}=4S`{P$euXxk}jdj&Th3cx#N8!BH%xUf|8RXtzG>_ z&RV^CHGIZUqhI{|Wz%C~V}mtlwZi!#c!?hA9o5ZpFF-Lct@Z|6rxUGLJDaLn5gBZA zg|brLo~kypU*m<#9S%hL!C2E*!AY>!TiZLS8<@0Z(9Sg??R-q6ozFu%mqI(2iL~<} zk#;6H+X)$v6_u#C`}z4Y8CofaMnr^|Owmyh5LIoztq#-`!Om`)w0 z4$~DCnf#r?*vjmwfkbrVWun?*1{tci4!2A6KV4}gP3aDR)ty*M8BM9w!)`JZ>FiBs zf4pfMciym#%Li@aa%fQ~Ea7P~pcRpPB=qN`Fm`dfxVJG1gi!}9=F* zWqQd>GU>f1BqSm9Drr=)Q4||u$F;N8wJ?(x@U!fG>#kzMU3*#GwWFe_C?G1*YZ~c2 znPg^?>F@o2_q|E-f}pY=|2#t`F`4_$yXTyH?z!juenUt$BRS>i>Trsyn+g!ouv3*$ zi`6Y}#i~`8UP{1?N^tVSvazwZ-FDlROU}J~{P>H{TZuB}vV}$Z9!oNy@!WV*vV`#} zB_n{;8(Fa^Q*7k$vK3?qKRDA%mM!MotNyeIXNlzc6SmwoYOVOMjh#Dp&6;u%+u}WH zqw4l~Q^LY#TtoKU?-8_a-5>u@$o84c>9eUKj7HWeTBR10gCZqS)UP3| zFo+A*`q<^m(Q0am);O^r!AfKC)M1_3wk_No$1#)V-@9Z4fRO|x?*Uwn^c;OghtuIP zt5zYAHxLz{oSdXZlq6(i7v*`i(HO*RGvwqHt0gmxTlD>w^>IDfBgWIq^ThWUWwAJ|0PTWINHFf?bH;Lll)kn4{!fPW&a7 z0<<3iCMAeXbdq2Ulr=-|Oawb-<+U%z1ken%i&0$uI+!Ljz^{R91|$pB}j4O}bE z9+w*!3;|bfp9(0eHj6Jn95L<&^jvTygZ+b`{K!q8FcJM<1*xez9P7o`)HF7pfByN? z%2JHMD!ROuL_uY4>_)_tntuYh=Ft9+`GeK=$@%C!q^Nj^Q{!5|BHpuB~rqY^<-X zYr+YXI}iXMI+%pwQnP?9hf)oz%2|g^(s5~%WMp{9%$X$%mz-NMIVUSZ#F-<69fuv} z+1IZws+w^1)z_Bin6W(Hci(*rb4=aXFJE}k@)eh?yzH{eFPM^+5E&j0x+iyYb9)o^ z(6!Xv7{EOh+oEOSwx}vm*oa=@Z+^s7^nlfy1@hbI1-|gWG=` zxj>+-Swowm2c=CB6E<#knXm%a8pDPc-}~yP1I=FXCP;eZ4GH2wb<6n=T|GNhU$qjc zKyp3C-_Eb#Cy7@+Pp<3mlQn3FBhC9CA>z6bpSJ>SZe7IVPrmTU&xeoqL04+`Zhi9~ zFFsX8@IP-BZnTyJ19%oZS}goSgGj2ObnV{Rz+u7RD=R~+< zRgr`QAVQJOB^2@$a6+eFw`!KLy{WDjs-Zx2My1Nv*R<#Rqt2?-g$w5|U3CM1*sx8! z35tu4xcK;(h%mL%=VBtmSesFyR9R9IEOF>t%%m>H0Fw-`prIZlHDfE21zj>KCd?X7 z%aH>I+aMqC?z-T;w5p$54Qa7e47N%aVCG0Mij-U;$Zngkk9r393V=Q$S7HiK^};oR zzqeD76|X=R#T=P7E-f~-Xy#l}O7tN{ZRv#GxiM;|uQIv6ZGh(!^AZC`KKtmSBN8lL zFXG1t{^cF2f~+dhmM(!U-6XT62W7T&2W;tL*wPA_EnO_LCDhaGtLugr!P)zk@AlU= z*-3i!6c~BmP#>d=pbl12Ghkzp4HPP41x!fZDFO4!L~aVJ;+pf21F9eZ6S!WZ9*@6u z^@`~!u-8*!=sjyCEu|{|G_oa`Yhy__Wu-CT@zK8msAr^&R4WW%1A{Ene0sKc&7!l( z7DRd1?0i%a{0h#V5$EU{8=Za!&>+c0-R>Pp&`0Xx`*M;dk=w$fie#7a;lmx%KEUB;WCG-+k^8Yl)!1vN6e~viD&EdOE?f zHH62i33`Wsk{1ze7{=$*hK1{Kte4l?T6^>WoF96>4jwsvyzT^?Po2X#Nc=Wd7@+lm zHv{+}tsp5^4FNh&!D0vD^^hHe5cFbo0npb7bYC#&$JslVmy(h*trUGpNZXdqE1yx2 zSA;xVa#DmUI1J>ci_6H#%S*utv}%G9n}yyk8=IOOsjZCGMCTL%)elrQNX1L2e%|n; z==FIPOKRz5$kGBRqaZE6eC3rFU}F*yhDw29jKAn{lV_KdTBvJnsx-oT=1U+vxQ)G) znvQB`CeOFj^^O4kDKjRf<5op&CwOpjWFCkpLmd5!qZBK+FZ*mb9PGqZF zU4v+S9!2~+2;+0qj;7M!Zw5k`e~G~S%TRS8!;I&Yp&Ho#)hJpRs?M!Y*^!(W$MXIV z?4Jf_hxyFG7him_OiE>_u42A=^i=47=OO)k)x%|DlUs_g+?gTpzojAmuD=6CbQM2W zyr%Qyx&=SE5B#S%e&n}|AOPYuRExr$VfOugj}yfPY^4IdXgH8Zr9@RCqQLIf7G!~O z@Ym34AAr*t0Re2m-=P=-A25wRccp?A1|=A>szhWWOV1|imV}<)e^fz{azx zChFldT{sC&kE>KDqOv7$vMLsv#kZB0fDHAckArN zeGTH>0A;N3y4)dPK&c+M6q-;f^Luhsl`EkMCD4R(WPa~FnI@#{*rCMJ+J2xOT!DVX z%3F6FtZ#AfNEGkbp;A%Xz|96EK(~{4Jmgj-j|X^Pw*xSNARSM6;DH@Gu*H}f&SSB< z_S$Qg&PWVb_Z{A`V+X+sM2~}>Kmta)r^1;bTPis-rQhulfENh1aS0jl)mKBRp}Z_J zh`_c2-I3&apL$-sDzo#0mtKAKRS7%r*fEqvst7({R_chix;5Qqz(GYCOg(LGdER&5 z*{Cdz{_)34#C+#bl=mFvKLq&PEqs}HP2y|88vV7(8MRTUkf_osqg4A+Y0>V*Mt|F9` z5FL$D6Pcdl^={BsS6_D>4*uue^iUb{gSb>zUw!rRMN5H^WTPI@+>7@l_=1@GKjTgi z9P<&~Qp&+#?yc*@=Ck=gn+1XSNS5I|XwgM7Et1zN-U2N;A6j&tOpD~JXO_SyeJKO5qx_wZif3 z$mt#lW@d7+M_^KyU0jx*qCpfMboaz&j1vq={qa|YPBpZ*R7{9y-tpZLFajyd%hSeZ zM^q|?25B`KD_!b^kc#kb#n`(^P*k8&{|fnjP+ModO*5a)k(H*ZQ#YHZS) zO9^Dp0r7f=y*z&J6Q$sdxu5xnnr8z{5bCvsN=07}t5sFf9_KvZFI<958M$s}Kl6>l zgBMSp*;|;Oe&QAi;ea+K*Ms~!=-7=CE>nDtwDT-dI-OhtC#WhG&QoQpHTXIW|K}~OQ5wnM#L2h@&RBM_;{9y zvXG}w4GnQwq)}Dx_2_)yOmgcdE-sipasI5##l=i(YimExn)7DkBe;k^zyn-!X+^P#oW!Lpx@6TIVEIM1TDR)l$pRci zn{oOYGL4T?k1&4#F$DHS@r+{#m_>R$&N?e26sANIs0yOPDPa(^rH}FZrS(_j!VT`0tL67*KeOOE-Gz5R)GVn-iDWfy12h&dpaSy_f|j_(x*n-L#9g zEJ9FS6zJIX$tNAu6r1wmi{~zy5nmbS^Q&T$NDXM@zu(5kmIh`D!huWkgF!B)3x|F) zGA$8mM@vf!6Bibp65GQ>rY_T7u~)$0{oFr8m6!tNy-XEq-r zqxBN@GhWb}-k^97yD#fJFq=8Byn^Xk$cHXok2zt`y)9J6fy&f`z>6`2M+2Q1MQscT z)KL3q=CnhI{rkN^kIPdTXho}LY((6^Tyuif@elIC% z1|N_S+U)lSO_&e8Vqk#FoPq3OMr6{IR3mDS&6!gdmz6JDvSfO(v9GT$eNOp#D=wLV zz)NYj_Z&agTdB~RwH~y%^Ikns7mHa#>Li<+q0kYFu*JN0?W%>7qLH6vVoR6a`lk}= zQQdtPO;2?|QhoU!2z@#dHuNI+M=P-tl^zZLaX5Z!>cH)}>>eJ;3O%^bA?HB9Zy4)i zB6P4=ri1dBYY}vCB6RR{XqK_n)hLuY+=d8(hgUq()<(X4TA^<*bAM!^ zUgGe>F>6*;Y;iFvEf(cRV0D3VEiQ=h;5axgj=BMV@ys*98HhfxJ;3=R#|pt`o~Z(x zdx+p%c~eO^&I`&#_JS{{O`4M6ZoGd+1_b5^njMY>kz24zE{tAxsd$P=Hq52ue^o8# zU*lgBx6Uij6CQdn{^$;-=*jCj#c0 z&^m0P{zW~hyZfdqN^=p7BlH3mf=wH}WlL}dBBv|MLy?mz;PDCsE?_>|k3hCSK0q7s z5_``=?Ct5i&=pNpQ!i<*D?qA0RSW}MHbvIskB>%7cjt!ocPg^Kd;IY%?hgW_?MR9PKmYo)S!aK&3%l}=rV+)ip8EYi+EEtLj(B?Omalj0`0^7N`VOGy9~7l;CE2Imy?fgUpRkre zuF#gKFh-UDBVuYi1Hhv8c8JOh)MIPAd(R%NuF`C0}qZ^@!5 zC5y0zTz);gTI!@p_uUV@Uo>;h#kbvg=WPpfqkLGGy6tvHAKV5XCmKA)VSWGm*C(HR z@{87BDjY4Q!<(`I-sR4Re>yj*8dw$b>(H#r!4ldNKU^@$oc}LQp7#f_EU3l9SfAYykfg9Hdz8 z3c!`%GW=z)XZn>_UI{{!?g_Wg3x)b0q5FEXl~Pt3bWu?z4a2In8ge%ak#mmc>#RW_WY%6~CbyT}+fShuN;v1;o zt7H|uN%`nEIDq`3M7RqJ+>x9CJLM~N0bdXZUO@_n zNgIm0dwP4iptrSc2z7KBFwwkZ{6)Buasw!|pN$Pyz|TcZo0jOuPOYOAnK_#xFywT5 zEA>$^F-H6@Je^+6DSVFJE_IrW>2r?AFZQ<9OCQMzlbis8i<|OE0h{4HAMAX}q3$vgl=Cr8`FIcgnd}hV8WE`RA z78Yg^EOc!es?ltTuD(H@!D(N%o+k{p7|%crK*#z91_U2cGXOM!aRq_`%Sw4TC9Fu^ z*)2z~`)!=OJ*bRDL!bEXi{xKkgu@!bOQ4bCpKM#me_xMr-&aZ>D-XOEq zHF9e`-atBkI$Byt!`QDfvg}6K_Tl%i*0H@Xr{`y}DMRg7dH3F00d|Xd3(vg-yR%>A zYPr4wEezzUrQWm>I_R-|Sii#GVpEQEW_?F}sJdYwEQw8s#YxfGg@tLE>6uu) zOrVZQj0@MHXIV8&9TSt59G#GXw0cDayogJImV&WOVjz;yD*9`V)b}G96C#oc)BRYl zNRGFmhQ-37ZOo7rH@%{wXyU}l#8s3MTAB2;)VMI(Kj6?0)5_!&W+kLgKr(&J8l*<+ zy+BMCyM2b6$+(zEL&tYt>}bZS9b%Y?W&iONpO<4(HZ_S2j8cq5SnB>Li;@0EW@C53 z##X|{R?2MbGMSC#?LBe=CvGRI0oZ%=s8V_4XhWx*aVE@Q*tQKYS#NJe3_RAj;`2y4 zoj6V5AfZq`TGtBxnNZK!5|r9}gO1l1alJyljKtYLLkrMLV5Pb6f~CvOA7!O!t*@z_ zPtIg%Ex9NURSV@FcTyJ`VXA2$9Of)q*egvBVFz*P#Beax3^&<|tnROosw-?9-bAQI zO0@`I*I|*rW|MeO``56$M)_;1!LmJ{90=3jiPuZ?LJYj~R8~b;ZFYBJbOl&#-owGv z>*P}YsVow#Heo>VSFCMbsVwyPO&OMs#^fTk?^3o>Yra88BVVs{pzi!*Dnwr z7R&dx12lL$(1drxevZoRM;~E}7lEb4SW<&iDK+oxb3x6;4qYyD7 zq(F)@l4y6~WXOr_D^?x!we6SN3|e*Laa_d`@J+)14wY7#MGj3A_#pk7_t|^ze)7o& zpM0_P>#x50DlacJIYP}3r`ipPsG1*du^^53-ByGUqup+#c^3>isF}z83SO9WOADVo zA%nmPi(S0q_HA$J@2{?}Kd}$ZC)1}#niyU=oNbRSm|jv=ZZul0*7a}V40xSn7bC5_ zxMOGk5V>Ok;bljM`J5FqcwXMqdvf2p9EtH%7%gM_<@aEBu-?inBakm7!B|Q)K>5X2 zLNfn=&B{bzYlPqMA&G!5&r;{(iyC3nZ;h*jC8}kXI2IeGTEf=70LKiWad!hpSQ>XC z^ubESav1Kggsv;xVx`i4=eQ^1HI0?GQ<67tRNkjX%C3)ZaujL&(?lDQ; z@uTuSF(U6pqP#go-Ud-#=6}wTw5^h~=Zs4G{fM;VMQL?or2X4}E$!IZZIq-HF`^}{ z`p<~8mx$8F5otR@v-|Mbn%yo*-qKNd2S(&A6y*&_^6I78-Eem0ojN+ZhezbST$DGA z$U7L4_l~nAZ?7cp{84$2j>tPvl$Vv{bxZO-ewO5|k>kT1+PZ^c>!x4Fxi}H%7=iQR^+D5Ebk7z|N zi&jjsXvKtRMGqgTm-$G&ELyR$d%`ijHcG=;*%j3g*+zA8h{YS|9=P9c@NEsg6_V*H zssyszs7Cx^L@OQudiwCvvk(u#Mp^Lk+4JxqY*dPrRnXwBLLJ3jJ!acLa5ot09gx=WM}co(rTfhsezBaWftBK`tjKN& zHxpeT-%0V@Z>=J~?#&y2;os^<^r1l12aTi;jHC~b{@402*1ru%`af}0AHEyWhbu&V zV2Hi9hV=j1v!(ydlDu<9_5Z|(yplgxOY$luc^?zyRZ+8lbG25>v~aAfj$g>SV?@?f zMAi{8uNK8T8}s^0Id_f7nJ=H$ke#2cb*o2`wP18!-x!fqnpZ8E*Y?o7K5(|?H58SU zkIw6X5qXP5c|(5OBhBj*XK!9*YxD;rvaS~AwK*i_A7%6U3y-#X6m`o4-|_1njV9ry zmC{sM*{&53)=G6&NnS$=Jb@}8eoLy>5Pbqvz{)yE0BWTK{LO44zLiqr<#ZB=f^0&{ z@cf!bGr-TPQqgQ9)9|r=)=#D#j_Snul1FPVp}HlHW~E*#5mt&Dlnpe+P77DA}k~iW`p%q(eQ8KLXKTux&aUXy~+Vn1HP;yxZ_eNJP+U=Rsi=6ke}D!$PHgO z>PFl8Q(KuFv+7i_|5(dzm+%>5L_pFK>L)9~KbOW`1hxb#qbE0F#j$J>zLW@8At*oH z$Y&<6U6R))$vbIO-bJFk*^;~+lDz*oy}V~OYL{GI=HXFkXNuCMOVW0V(lS+}vYw2B zCeI(9iUH$fOg&m;z}PP`V7yNlFsP>h+Cn!{v_WLRh$jpfbkXnTzaZMImTB`?T?+AE zI3!Gag@kFp1t9_e%4pbv1L$Y5l8nYt8Ob`VTCJq;LEahfKWf*f(xkCt2FZMqH`n6L zFB+ZBh2nH-rRj7@)47RE=P7OG%(OQ&o2en~1>)L>_Fg2;XOuLbJt6Id7aOC!XGz+- zN2OgLN~@EkWh80;c9x{=lyo;cB<&Y6X_t!9Mo7|1xR7A)lu1kS-*WujGnv~;GP9ME zoi06DRHY>9pd{*xr?=BHn^}h>tB4B?Km49d)@7osVPj`@txVRFg&`LT10?bL`SpS&K2$?W#GcNpD85Lnt_ z|o0Zv$79FTa45cDpz6ISKSt0MS zqI>ByYx9|n+eQ6I-Z+oCWq8~tK+|MpzMx(vKTnp%{ZYh|E)lM=QY~j^++&iwD@Ntr zBg(s3k~dr$cSlIxRcB4!Ba*xqkIH*kl=m|c&yz`^B8b@AK)*|#^95ES_ zss#Tcei&tYwla;9v>H)b=DJZ?r;D-{5m`z2FbCnoyCb;qzsHxKeoTiXsa}%wrcp@; zL`ma_q-4z581o%5N;;Ld_^p*|tehc)d}C-Y0u!YOyh- z#ebD)u~L*)Db1@=n%Dn5{k)#(xQ#?fO(A*TkjX1)u~L#(C&_C&y}YN=r_;x{E@^Hh zc>!EMY_sS)Ct4gz0(vEB|9O_BJ=N@lGb;YZFW$S)+}lA+7W35X>L{0+zv|8 zK67T$p5A^!oB@{5+&(6o+XbSuD!J8)sw_tJCr2d4Q>^``&v~}TLs%&yneZP79Ljk< z!~6qcivdX~T0*Zv43LR$NkC%gg#1!K(seGLffSJZ{SrKf(`Gz%vU?)=0f1DG$q&fz z?ve3qjf49_JTm1yJc|ujCEjJ;gA2ne;R5>WvDK~H#zY8|j1jZkj{z@P~;>%K?(S+8g|EsKCQP!u3 ztRR7tWCduGC~J`@>v^KASDhtUJ(8>&hh^pPVno)7qO9X2SudAlT{9}{$t%>EdCx}R z0OQ#uqHO@rcrC`Q3O!@sWu)L4kE29}j1G|@gV{)y&9gDPjgrKX!xG;sm-u{9;zUW} z9!cWIM6GSnI+<+CLRUUZ1r2r@+;XW(CE>AP^nMEO;lEfxaV&)QRMBX@2-f@z=PD$SPPcQG8joKs0nDMO4%y(f00%YrTvE_ zZK-f?NLsxlZMZ1yB2n7w&XTkPlC&QTOZ!*3w5g)B(UP#J@Lz8D%7U#D_KrPVl4FBJxCY3OFw%20p^}}nh z3k~>^)YF0gOqK>adF;K^Wb)-vYDq}yGu18Geu2C_{q(;`^h$kAJx(W6rSu!r3Gx+4 z?j0nKPfG$c0(~eJ9;F%2go~7F7L}D@{Skf%^>oUq{n0=Jw77h z{{E3qzZ?HqVyij_BZI9p$obmyfcGZnYhiZ6FrPG;oUbJ>k+UGmeU{u?{QVE$+!~o&&fOqv$5yJ^P+|`cJeO##8yV&vE=cIiOHGcvTLjB znp?YiJwu;={?+&2cX2ia6CN4P*bM0W_q*|*%j@%kB^@Y<>!}Kxg{II>wRP*4TR!`2 z!NLXeDrU|E_8dBMo}eCQ?pr$(e-FO(pkOnw3S(4sbd(X0=|R4d5;mxHFKl}81$@i{ zh-V=nLGuCeISze^MuW}|>h^~perVMS|L7YiRZ*E)S(#BPr4nskc!R{cPPZxClr??9 zf_cRWQAVA+sm|H&>8P!3=xT9tQ3?g6G*IBhVAU!C&9VUoBS+a3Xnz5cLL#bohx*!^ zJ3Bf$+gsYu>on+cyN56^4=K4Q^pXQR6pbxvqZWEjsSRp{iie_meCrbx;ikysyb0r{ zPoFel;v}6`qXs@hXJ=z$zs|sNQ9RFh9ex1j2)=;8@VWu)em)fXdqd+JKBJS z?Fa-}H9G2odNX-5QQPKV{!3)@zg(8{AS?`XPMZJAM{^ETVq9EeMs~*WBgY#W8>yfl za4CUlKp~l@*ILkXY}NXPJOK~>8}be70-1apqw@KyB7xfQ`R2_P6=kI*B_ilRQ23um z%7i9YXw9O)|=(G(qxOGPWFIy75WbI}3+U|Wmb-qr8(qlIy> z%Lf2zvoUC6-4?vHq$LE)@nV^ltdeQT#n2LhQ6$H5yk4dyxuRbf>nd2%Zr0t@;uq9t zo7OSGA&0|Fa|+Q(4C_j~=r??5Mb|0`Jfgs;2^gDJ?HuxPO3`Ih*ivO)C zHP=imo(c+`PeLGKPm6;yH!rS4Q4lbTu>`=_e7bp6hv2F+!+&|RkvKiccJ@!ttvURlD`v84PV;vW0&vZ(?1`I=bRvUp?GlhYii&Kg|>eswj z)Y9wGbausR;Epc`66B&~m#jGd{ACw#aiaSg>(MX;W_5(YX3$3H!_&}cn2-=|F-g^{ zmqTOa=%Z_78hZsa_6lh16|!}$Ql_!_HOFcIoh}fMMhD^K(z7$%9=Df*#j04pW6)sG zDYeR=ADGNWPT@t{FmZ4ZQ4x$S5%8};FBN1VvxQ*JM?t^QJ3j=R_EuMwddigPb1Nz$ zbhb2psBi1mZ+8B)dqPouqK@?fX%A2q2lm&a{@Y*(GZ}Oo+>DBNzQ92LK){v+r=w6B z^@Lu<db@oP3_e@leQwipkIe@{H(47e33CDEu?Q_o-+cD& zf8Km?R47hl$-e`_YOdnS;aq6_Zq@?ID zm6Gxda`_$)tHqu3lrjJu3uTyz@w9h#wu8kCc$Q8yt9bFcxdDiwZS7n>4+M0N$LaGs zx;lV1+tJk6IxqnCDd1xDb~{{72apuH`kXEY5PG?M(lrNX3WgrS!>7{1DZ4xb!^1ZS zGXiX>2jC!nte~vV#pQ>abt;V}(iEFnFlo~4*(D`2CwqMAsQApn;t55?Q>V7gO!uz6*|%`JJe4gG|={ho;r;l-E6diQ$FygJO6O&t=9s^ z=0P~%=RqF!F{0b=aqWid{R#{8!*Iuc!NN^Ius2fwK|oNr<=e+!QKX>`S{ zr`BPKuL4Lkm#@+5mGH@G)t~~ntA4d5Toad0V0(VU^lI(#}o-2sJ~4GYtUDY#gd6TZyvauIgA zfNKblJpt%IzjBC+ZHII9czsmRIndtStWW^K6CTXj@8n|XFxVD=9tk0qmiGGwU1; z%%$d-yKcC5p@=5<13K!%tK56|$q(Q>-h-)s6UYirQ=7Qh=0+fG z0?(@!_g~Wtx+jAfvmD){3$4K?&+ROkM?2Nr&XajG`P}N%+TLy;g~rFFWaZ|LncMbW zRvSb_qeMTwIJa?u>Mz8(1u)9A;_2hZD?nu_2xI2k< z=JxF^pSn8TO---8@zV1zzBp!9FJ2-Dh${ zf5yye&^4qFVon1f(;S{v-|(zDyg*~^>Fe!iY8pGM8rl!kR=*#9)+f$tLiUVv#92+X zM8>8V&1UbAUkw7RF|)e=uzCQf#cDmE8^l??Pny*qWwZJOX0;SR_|ItWU$^ekUig)`PbtG@FZHsf%Qmda-Oam%vh&z*3jUEcFK2Y?@@2irI`bR+{ll zjNx&B?@f+0Yrz<55$9DCvf1`tPz@MNdZ5>^tlD4zAce{34_2AZnJb@RCRk}U#>Du2 zZp0)m76EF|%ZPKW3EA;^i@{x?0BsLVhesIre$s2$&eBzKHa?ei9g%Q zK#zh;{p7Qo{`|MUJ@uNX1<4`XzIcg3p`z3j`k7gur}-zsq_hj54qV1qg~$SKYk0IJ zGAfci4Z}U{Lb`KY$*)z_ANFb?nNtdIND3r&1~A-UshkfFs=RI(M&3=d#D@T)(5==>vrf9UKA_wMrqd{E#a^Ytbkl% zf?yVlH`l1R?3Qk~DSP_t!lDe5y05RJtIx|QfY_gqmX%jjlx~SID1iaf*UM!)2I0TG z4u^pChjR2ZH4%`#e&`{-dPVF8MC6@4Ty|%-W5DP2@BtTAqt^Zbm$Tn7VDIiE|6+60 z)$4Hf_YT;(Y{rPS3Bd+{tIR59P{1-p1G&oO0)P!!+x(OgF9x}6o!XQ-p>)pFDaq*x zCeVc|!_&r3o<4Qz^x3m2%4cN8h8c}O@6~YGc0jv(JM8veXraR{z$5y6gLXtUpoLN( zv}e@-@c{4@bK4qGIX?i}+-?LhTY=T}9Q6c!|2->3F!ld|UJ{h!e;|PQml(>Bpyxl> zZ@w?Kxj%#d|3A>&C#Vfn6_*`Gda7MvVFBPCQDKpc8kis!f}4dGIgyc(@x+jlB176* z2yHEtdB{SUwiZHL^P#PUGHorCX=_wQhF)9ahLQ}y7LgbVx1?lHyv@=dP*MhWugimw zkYyViF&7gxJlSAQp3(=1^co(eiZq=2nib!|pEv^au`s;+Kt zop&REv}4$A;JNN=?`WweznzzY-)`>?^x(Ja8kU~FV8Mb(TvT5l%XoQUxeN@UQC_EX zJ3W2KqFV^7V{ov|;lNZ3c`*S#pNF%6Plyle#@zZ`K0K_T7er=U1n&(}E@Onk2#5$Z zfR6E{D#~sLCnfQ4{s2;Npu%HcBiq*%58Q?3_YG}MlrI&V4%=2`3$(C8KovFB_$;zqa5l(t{3R*k(7M(Bv6rI;E=G(7pv@c zwMuKs0us@T85MMfcu~~bR)Qvf3LFrT2yz(UBg$aF^9*C*l3@mD$_MZzi<5}4B+LYf zLkA>|sJ?zeXbp@S!k?>FV~U1cs74)wwjp9_U?a^%ojBIvaI|%_wx0kD#DN2!fByMr z-xGM0G33ew8-q|PM}5ELct^(p08Q-z0nI0$0AjXs6KLkfU|-mjPNztpJerG_pN9X| z>G0SSmkz0p_B?7P$p+Vwf;%xGFI>exk2JiKQj?#DgPjs*;nZhVa*8}U?wMr8$Bx?r z1w~f+517_}k{3yMafrNlohlIu@PZklJmiaCJZLJRHdsMCIeNx)CK9V<{(y*tY8}#( zN7C%f_R;D%gIEg~YUeMIs^eCjzB=yY=d4OaPDSR0#*V6xDq43@nPk*2Nn&1l&ZH8M zoUk}?!g8)u2zUdT1u-Y9OC8$}te06H>7LVJOnF_ryiW~p&(f+E9CujRo}VBsX`ZvP zwXZ>9D^(-)(Ul2{c{`s8hbaEK&qXWo>nV#NJxbC_Nwt8L(p5<_esYz*ydvPYtKwAT z5#UXG$ul5dzr{nqtO8Jei8WLc2Q)#kCN3#d6PI?)XieNac%gYRFC@=T6O`b2@IvLX z=U*Y4^)$S1Q&Urqqo+5BB_|skmK3(AES0l!`<@fsbS4@IR31-%f6$<-j6#;NqeDZm z`wG1tPfQHm2)MC+E-fv;45V`v6S87>U^@QrLw{Tpi#0Or`&Fx!PD^wBgomagoJ@M} zP-T=asGmOFyKURHFFrO##5kSdvj8#-p6G=u?kyvjH`HGv{%JohE0-VKS|f z_rnmK*5S8xGOg0dw2J+vk#rjXaEHDM?&~d>N`Nb&HjCfYiQh5RG*yC=D=VevSfvpz z%}Pz-*v4a20$zDJw#7qTBEAyseJ<`seg-37X)ACyb8$CwWp`5|yPIS%&c{X_IB={T zs8A^YUCW3KLx4;xv^s++2%~3HQeud9hbN?r%a3IkEL;JtIVK*dyo6XT`RAW^ZQp?t zmT*JZfo(6n^wJ04{)EN)(BVUS_f{XkjVFS63g=)7#y9A5_wjvh%q+!#HO}wzC{mB(1rK?rw(%?2eI))1m4okezlHLCp8K2Hh$gZ706}{@35`-hJT5&;I@X zzu)=3{wPWJfB)^5TfW%(*(aMhBx%PLfj~7UBQZK98X;a>QWlt;(i7q{Gc76T;!Qy4 zZ3HAMak!X7G#X+Or%DVEB}u$02m($WcOZa6x3+G5}; zo(s}OKo_eia;)X282{3xdHew&$sM5bmvVGbQe{|7(IQYMpF5SXB2!a=iu^RWn474Z zY%yN1j^gnMycFYIxiT)$`0~pyH&F>IxwzwQNbNoL72axd^|v2=^wHPH>=?p9eL}{= z4iMH30v*4@;o%h!M?raU2*Sf#1YLeWYr=03WMi-2jbEe@6WF3O6oDHXf~_i*8k$hw zI4PYHrxAp)1|)s>(||VuJBld(2|!cUqaiH@N2!EqL;y-Q+u1q5L}0otl)aOS!x{lP zHz%Pob34o+%dxnQgG}HE;*c1na)=^XDx@fo$PQ<~HO0CpBpXHRy$aTQmCTpiE}Og6 zn7dV&yQ^f@yIMAPg`ES)DJ=okNj~$>lr{Vw;ACFB za8_jQnk*mAtpL~X~{T;a!`y!HC)Z+-NB9gR~%RquhF&p!L?+u!c~xtAEE_we2Z z4|LDhwD$}6F&v58#*>AB!rqA20e&|C4e4?VWH~eF9ZD1UmuSjA1cpAppC1a+Tp=?= zJd2wJ*_+O2P$>vBrCO)eh2fBe?;p@;2+g$y2LVt)@H-J~JAaU(0a-~wOgt=_VVTNE zWn`MOy4{bn4w{q%;6sU(r%X{lsj2S>5~NYa>jo)KZ?BVA@=lT%X?6N^ zNFu4BtVS$rN(4vFSNI{1!&m#=*IU2* z^2g30Xbj`*>nD6OUW3WsR|DRWdIxVnghR@>B6yynby)Tdf?ubDZ&PWsMAel%6_$|| z0mxacP6sMfP@w8e+R&c-3h4S}GF`t$rt7Pq>*Q2zl}y)H$#lKI=^&f~NB7kY4Gawo zI6W?B5FC~|!B6PrAU=Fnn`3}PYS;z9cPVL&xxcBeGL@$5Pe7#`hAb9x@S)bIsPyzO zrs2yD@}DV;Ns@{q@%`9v|-o=-MC( z+DXWO(_g25eey!=(ih~j4#yy|C6AZivgJUp8eSto?QPhxg-e;a=+f1zS6@7TYH>12 ztVSga?Aea2(xDR$Ji6pXH-?yJboZ9!dU1v|m<7eQ#rfPpM=#EZ01tfiwcu-=8EkEB z!3g$#oAJdLcXk_arjct5)_m|HSJ2S-H8@6I{p6@?5EiH42fu&)l~-PS^Rs>3KnQo$ z_d~mVwYxug>#esw{1I9WO2&>B+JU>rN5JcYpX=(dMS&}US0U5M^BzAr^>X`Z@F#Eu zO0uyP!V;6hVo4Ux5*A?q?kR0B8OhYEhyrK{g&vMpbkJ#F+4=1!^l4F*5i|u(Y9xbb zxJ2AKQhmHlM+b-j`Jk`Csse#mVzyL*$BDdEXSY8b)PRZcF_A1;g#+F$q>(!Y88c31 zO$;D#$ay*>7~{8Pv55KZDlpv-Awy(jAOE1JcwmJPXCYyn_=XchEle z4o-*k@Y}QCC%b&In_r0Cd?a;iNCg1j@e0JZG9uQ7IPuYwhQ&8sj8|g(Ky>hQd5zyW zwiS>B3rU9I6oU_8lPe}2=*Y2ypN-LZDZinRMo$_M{l#I?MUVzj^!Sm{EkyLQF?vuM zJtTYL$mpAfM|Y0Mo-i_c{;dx^^w7Y-B{%<;DzXfzuH(ow} z9D0Q;M~@ykP%$5I*t}&o9DL)cr=Hrl@vj`x`({)Lq6|W}YO>IDlru*eT5D>KeEad2 z|9%c1H96OnQ!k+|0T*-d;5}u?%o9H9o9-+{!NOzOhyR3+b$2hs0Ge;U*|Gg$@_}tG zv+k}hD^M@8SiJ6{UwqzX_W4XEk`RECKR#n-bn7?V1%h6P7qUb)=M?O|eSmNM0Yqxj zN(KZd8ykecl;q-vr@_1u=M@Lt8Q|$><{BQP+2l`=peRL zdk?lXDih=5`u7~QnN=#USEWJCg-UNJVQN~jV^mR-sgtXO@;W~`n^InvhpgV<4*0pTjY1+n z#piGw#kYd+(>GskerH>EM*{+an!0AH3)NDLv#r|}Zm->qy;+@k*e)2xHfkAWznkHb zCnVAca@Va}ck99;1@&dw{0O^t33VG7?A3ZzQBnS?a+s0GmB_3vlv&I@5pTXncp*kD zW^RVMsuYw0e^P&exE7A$_$!O=AeTG2cbWJ zIvO|5xVphoMG{NKmV?J&l3=iP`+92j@2>MAl0#__p@NQP4Us)PK@~|fqGT;(I+2m6 z6CW|2lxS^Lo+*rE1+XdVWTR&x1-o=gaOXF8Uf3o=ig31JD6SA6nK4wM&6dTQlK1b| z`TAg9T9s%%ecQhs7?7J!4?CRGUIRT}BlG-gWqSTF^n4BUe2r`$GX{gdAN0Phjjerj z(0lZFyB)-7njw2H_UXNSAS_oo`+BgG=`oqYlXJ6NK$>>+am5A$4kP?uog#gX=-^*TjFM0|R}{3VlB4$PNB6^HFxT#^Q93QbZG z{C|w-0I3)6+FW?MNezzFxZWf|XZc3NOEO z=~7Pn?;pAc8;)*!_Z1X|+$UTGqT8oxPrzB9s67h0pQ93?*`tp>I-f9`A!~huc-^Jk zx9|Hc@4X@ZZ}ySr-uZ$nZf!l-(sBfUbfBf>a4U*YT3euoO|4iMWUu%9^wXhZ`@!jc z=*K-=u?kyz6#8mB6k{~PS3q?YN(xp%X|d<#jan5ZMTN@jp$=5Fd3dFQD{gACx3`lL zkb(AgXH#!)U;h9p2k9qSqdxM|F$fOEy2jqty58O%@EF%|#ag3Y&8jszmBC`xtCZv< zRHtOIJ7LZ6{*lpU6UGd~UxMKiC;C4309TxnB7mO)SvqQ9z@LIOC@C5Ho0KH79F2J$ z7n6_>7ZsnH%oUrWEPAymEL>3DUuA31`-L9Q6)A~T*}+KgmB0uo0Qj=qqC z5x8QQi_CZ=o005CvKh&KCZgsfJv~STQR>GP!(3#>^GlnN?5B7JOb3=TWh${8n2XGK zB%6`!N3t2oeim0$luVlB2X(vKje~->6gOi^<>pgL%qQcQMk5)}(yL%QFr7;;hv}3O zYtcP5YCz~z)=O3+SZX zhr{kh5eytjZ_|jyh}J_aMzWr!gEh@Z4jedo;6P&&R|I2`nT}*JlJ!UyBUuj^s8NF- zj?&`w#g0H~YAWS$P|#u8aY}oE9VNvj;@48s6JrySxMG-!%y1-ok!(k@7s+-sVG&UY z35jL{X}>9M@uIK5-_qhQFE1BberYcu+sVi+!n#zPlbVwsvYO>sZ99`Xa40TuxJDWYcLaL|j#*6^6^1HLJV(bapXk&N;KD&qB^d zuTyb3^Gv3Br?ZCHvr0=4zs{XGw|q92aKjCqopCdlFJC@0&U^g$aqp}vz`uUQtOVqX z5-O;jxIPEzg;jOm;GmyUn_vo0(x}3wo{T|0IY|p2s!hr#x#f}96*w?`63p9=qxNmx zx(Y;kHq;a05EXWCop2pk%bHK%?BYZ-p*L!qFRT+D5N;8#2T1Md|Nig)R=)JoTOVvi zh`Dp?NAGeu`#L-Kb#=9Mb>aNAyQ>2gPiGW72^i55m48@5j-`~`Vhko#26R8hG-~qZNa{A;XK}dH`pWS}o z!1nDwZr}dH;oaL0aH!T+t5Fhz53>c%#u7_*jxn*xNl8h`lP2XRMW_iiqe9Q+6z1d< zrl)6*8;1kE+;Q1hP_xJ7im$WMCl-&(pIB5>Fd={3L@p;K1%;_dYAFOYN$MLDBH`>K z6EfiVGrGGw2iyZjquvw|#^t2N#igOfDmDS$Cq6b7D^PrFy!bjMGASV zG&Fu(ZdOuKclWGWr;CS(ZkLqKnmxN5YB|d^Z=OjW`N&^$IW0Bcys~lQc`L5C`oPiO9_i@?Cf9auB6AD@r@6+?%cO; z`&S>o`{tW8T}mREh?Wk-z8x)%2$33XRp2+PvQ-EVA;KruLtM_T9ea-**t6&0-ksm= z>fE;vluyITDk&~${vnDBHPuC>CMPE*n{XJ4oj;Ci5X~?wj~Ia0>aZoyX<5v)67Tu* zuJ4Z=J-Tb(@jbf^HZ>iDf{Mx-Qd}sjq_|v;S?TR-X)#8`rH>!4*C!;PuO$MXCY-~Y z;#0A&ON|F#U0ec}GjVcJ5o)gril$7Om{SO)9Z^9i9D+F z!eLtBdXRGJ*pwW!$>gNO!wlk~`V+Df)3dVDvkN8^#-*j9rg>OdCB=;iDQ?KKropqO z%RFnkEFMXRo~FaIrpr8Qy6i;4)YYZZ#rE@zxpUAL9Zf1^^s4mqloaVxRb^7E>CQH@ zVaOR5Euc!pV`Jyw_|S%wx(x(O$~hcPhP2HM$q7Tw!hHN6yoK?O2vSTTeMa2DnVx?7 zl{emL?(B1nD=Y>j?e{jL;{*<~k^Ls0Cmfuqv$Lk*fZyTnHfum&Ms2kjTU`weEjSA# zpRQKUG-Jl3qCyQ)+4a>&_wNVFp)o)vI`qK=IMedw3(97zD4+YAFFt+e9pt@?U4hot z_IBwr&?Q;57EeoFy>&(i0rX}RY288+-D{9y-794kOQ{#>nV}x;CHyle9!r*Ls1R3? zjHE*BJ0^Y2C+FHvHMVLsMGfcL$5v8prmVvw9~>RII5hHNz8fP);_ZqmGIFOlGO(}7$PMDiJ;Ng#@VpH&?UZvU4A)M{WtJfXpj&7&9=Ekbm`3WQ zup8ZrvPM#%B|dVz-b-GilI!nC1Wdby{r`F&1QmVw zJ|>6mW5SsG7#O~fRd^n^$eza&GHd1V_{dqgyesbtnY9))R{!+P*B^fR70!LW{{Gl; zyH@L}Za{~Url(P@MrW?OrR@kZjQD}p4}8)r9B}Glyg^2ZWD~N8ilMKuyzlL$6S0M6 zBO@~4xu#^9Y^){D$a8eT`3sTg*@R+-V`$oX2^Gt@VjsBq`m3+I>Z;Wjl%^rGnm=>p zN}AQDPCECtGBFsjsStRC7b2}@%jn(pp58mi8nFYx2fyYz9Q&PPZr#3pd-CTWz62-# z?)STFOo!4?MbCfmLiFi+s9yR~dJZK}hs0|edW2p=z5lDIr~U`EN&V3Eld!H=TwaPk zfWIqQb>yTA?<1wLKa)#|fI1oF8q~Ko8{PN@5Ha-Ou0BspV?(OsX8<90~_YZ-a z)!|{d0*hJbvv<*nSe)#!?Wa8lkJq&z`Pw|-VYCKw+czr4 z<>+p0>2x@{>IuO;9xZG5)TZN`Y7lqq*|$F^RI;A#h6J5iT5MAW;AI zhTBkTIrs8=)~#Dt3d?##qeXzthQ-BOZIpXH3K^}4-N|*oa33@132@Zy)nfaPsd(g7dU}$YzuyE4cDd{Ft+A>(hMleJ$ zt*@5~chYJb6}tcp@gGv(QJ;y|X6j2iUSG+il!0kxGHQ%6=L;1AiekkJ#H|dT6Q`)& z^WEk*mJ6%+4*nP#644UNck|W!K7Kc>WDBk@`JeG!Gw%kxK)i4b?O=c^t^0V}p8Ce_ z{{EgOs)Ya4W@A~c0nNLtAJt1ZIY*TSJPA@2T6iTbvNR~Vr0A+#mEh>MyIQ*lHJu#< zpDisY*>CCWX>+oI!{G$SEy@qnWL1M&>SL3VZOLXKNJAY_^GLK(Ym5@q>M%8ONjPH0 z2bUYPcefo4unuJ!s@qbMET|3|?D54FD4KY}qoH6Iukc83BA-YaUO{$NNVHa16qr!Xk_{XsaSnv7l@G6m<7H?!No( z^WxkGckJNQHHAyBzWVCbcbB4lW~2J%<(FM{*(Hl+l~Z3*UkWwQ&Xk|aBy*sT6qb>n zlAj$clb|gWuMOr=i!oAw@gj#w(dJ0CSzo2Z);adbQ}aPDOs;ovRDnx*b4uUVci-ix zLl+8bgfNkU@gNT_XCVQXif@7rlgkhNzlr_fheJQi7nTXpSPyUsnZk|C4?p~{Kv*Tj zLG{VyKwsx7L>&LNRVsAol@)ACoSBglUg&itqc+nU7)78yQygS44-@F?!>ewmn`(h5JZepFI>0DVFTqqot1B6_18yK)#{Bwm?xZQ$BE&FW zuO$;19OEF~#NBF&NA4j}gLhFzOq(_>D@;M<;ifuKoT9`{Ih^c}8prN6tEbq$iYL`I;;MOweLXv4QtdenD@_9MS`ntv*kLiOs=GdjYd(u*jUnM|!D zUs@1Xg!%<80g4a7v2&82hZ8I;nxc_9v7Y)IU0%mBJgPj-92;A=h!qsf6f&HZo(=c; z#_+he@%Lfe781*2K(WB#J`^#Zx+CLMqpD>#J9g9#X;c$oGm<(%fJ{Y71xkf;L^7j6 z3Ck^4A~Tvr$c#=c?a4hEYTW7R$5l)04XqM;!&fL|4~=?<$llP7LM1$7t;F7tLEU(| zQRUK}iXmXEwAB(~ei1>;x6=7|#(yTmoR9$Xfp0~=bBKWXsD1-IfVlpju{O!PBH03A zBSKng2-YUkG>SY~Dk4v|NXU~W33)PY6nQcUzBpUvi;HAYM-qH-5}t38Y+jROqZ&Vm zj#et8qd)jy+qMs=9aseF_e@N;vFQ`{)Fb2fn6kTjaIm|(0<{N^VT)s>fEfKp{MLC7 zZurQ?ezf7i^YB}JO1nK6wA(AFK3omB`m7~@wz5$Vmr^ea*HV=>s$46DI zZNqy{?D@qrFTL?dhcZ> znO^sItvx~K_&eo&zW4m|&iXkHNoKE^z1F(xbziqz$TujvrBY~TX?J&jKcQu2_@=7V z5U}~AR+$XSQ-B^@eZEttE?qhWKoP@lXp2Z-_z4kh4TEPr3->82=sryex=#ePor(LD z6?C7ng6>nO8>-Ud6Zpd7A(?7QpDu$7`OzZF6ym|Achw|VW^BybG7!}!RdH^73pB!kz);9DUk1gK!!)aK#_aB5_~iK zVQYOK!$*7(CL(u62sd1C-}d18B!YwxVHHF{t04Mg6^OKlIX9nU za6TnBUoSUbIyWExzcybhH(x9_U(w)v9&SD-H(wq%--7?ze0AJ>I&MBx$#Clz`XUW8 zG}J)@>FNO?2u0sGf!F_)^>cFbg>m!c49@4{=0kA;=5uoM)&1Az^KtXFaq}tvVLmrE zUko>&?f3cqtTTe6UH@56orcVYvKR-U98im3tEq+waEK$u=4m+9#Iptrk?#o5@}KME z|DATU1ZE8h7E&>u1JvZv+Df!>-qJOOO-5*%b zF@Nl$ecUeE8(7dKfd#GO7Br82pyXfgqyMyf|8d?Mfq7T_F|VDQcYk1BVgca3o*A4s zFKAvF^u)i5)c(05Fxa}|A9jGX9o=dTyp@?)UNl9dlm^~ocTsutEqEPa;B^j%3Vjr> zhZy)F9WXshs7#arPNvH7%5UKJO@S&7?CO7q>=QztVM|iNAblqML!ZGv{f*%H9>x>) zGkN(Ud2)~^3wb)h4Eo#uw_5X`NqK*el+Wd){M_HA{QtY(3bMTsQr$r~V)HD7BX-`2 zn;fzK?pytV!lbC1IgNi@t2(kGtMEk3Gd#n_!Vg^JNkX0g%jD$TznkU1w@aTmn&X&*))I5-X^gn%X2^}8z z2UV31meSWt=+wbqR-D^Y0uXrMFKMx;1UPwNv)|v0hFv=XKb2Irke>!5ZyHW#O5Puz zEj!54#xZ*(95$bHHbvVi!EXI)N zC_91_RvUrzKK=C5_ZOkZm_fdA7YQ_2izzbA5xzPQd1YsPdA3d=FC~PY}SYf0p4@|{P`*$iia7#*X8k-iX>hh z&trEPLwJ4!#(As&SzJ<4qm&`Vr$JEG2eK_h=n(q$xjlYEh{a?Ej1Yh^M5~*cn(A87 z>5P%^g-$!E1FL0t2!tC$D$XE9a;B!8fGzu}S*#~m zLzV`Z`Bw(ILP-AT3bBdn3Q-q`^WdzPlpsLCwZP!MrvY>B2s(eS2c5qIIDZU9Q}Ek= zmkmtN`O9svz-#O5a8=e^L3-}&waWlJS5~)|!^^etLAb|r5nLiq=0WDp57bPn(`%9r zn2#Jea;Zfqky2>8tOtRkqo<~-wQImWVD1EJyP*NTqSI+LGyIsCXr&>_+1&})r$vEC z?}$v+?*tVz)zgfGpG#~QJ7G9LH&Ur;T)~2+OP4N~F@4FhWs3?Drvf3abD;*)>GqI< zgT6X=*mPWSa&)INtTlXo0c9jZv~EUZYb!Dtk>%wUzdU+q?!;k{3RNf^*@VRE%JS%F zaVbGFdrG54VTmI$GSkEAK_PYgSV(kqS8u;Cal*1?%d#wnh-u?-ZhJeu6K1S=_~C~) zty%HlmMsq~+3;imIFm4*6{^)=<`={!Hfhd^+bhRfoH<>nUTDbJz)W7pfU zndxLq$ww_!E-mY)Q2ij1}3hnS3XUJ-jIyM-H%0GGazUB=#maR<_e zYuRz2KPCh56js3|;P2Opw!eM?8MHkliz490Sau2fjNtEwkN$u#jf9;k`~X?7Z~s<+ zYe-lLqQ@1C-sQ5{O7V8FxhfUPnB$%Irk;d1~;BnHf`0?1yO z7|d>VfzL2?pbzg5$Z3&>kkLATz#0HYo5g_`gvaHuQVN+085W*{Pp*uQD-(GT@$Vwp zVL&JB20g+StVAUuv|Es^mcKDF~;Za_@msG2I zd4^np1MiVbyb!Xus9YP4k13N5(F55Pmzo?Ksg+X5HF_0E042t##BNuJHa1=Bz|QTo zNz>CQFbj}qO{LJpm0 z?>F^;&l}vcq}bHt2w+M?3IAFi{U^CgAQSC?Ok59OMr1@FmC&USyIi*(3klAWwwpj# zl<<6i^t1i5tpDH1-Nu029TJecq;&Cha{X39>ruiB2{aMC5Rki7q=hIa1Mh?kyemis zmITSb5`2#pkb%K<{=v1+Bie|@_DEwpI%{AAT&b#nUT$bQbB4vniI7=cBq0ugSJBpD zhyI6@4kr@N+V23YnYI5R@f-|4D=R&;REcCdHfbX)n2Y5N4ny+9QGg;vXAK=WbpdFT z7tNZvboufn)9$%P0>;8Vi;GX=6cixbiXmAsA;yMn2qh3s1ezvoLebEqFx4LdEt~|{ zY@SjjEtH3c&%S-*#*J$h&kQ%n7SF;gp=pyBuX=P)Hu9c+_}=Nrl97rShPsQ;zRCTq z73CE*O|}7;C^xHXjN-YmwTBKJBJ?&yY^BZFl1IIz+Prwm_&+39D#J&z#$77p$+W4d zPftUw%|33tPd!IJmTC~b@FqzAUnv4z$U|T?Ud}!xeC@T@UiqJGa}ly6z|Y57gTEG| z3&m$9qbqVG&Dl=hZI5;63kga zsYsy$udqf~%6D1pJi`bxp=Pu9HF)|-ZMU_j2kD<~6VjOu@Pc_L0cddv@w0#e9U>Sg zeM~r!GPKX!($mpx50Wy^iOkKdet(0xlrNA<{Du+kZX7IA-F1n8g3zFZ@Hc7JtI@PL?{i1LCj~9lP66rF3g`eGD=t~hf*F09X$thMKE&0iC_>8T-kTJO_BVE zV1Qcjf`8tiU_q+T)(cB{py{lCFb;b!&POn|XKT>;cpK;AUYw7OK{mp@K{i5;CN(}x zD~E~P*wfbod%@D(sR0i{WO#%=MMv?7bmn)S!wIPw5QggsUP7;h#U^z+Tbr6dD(T~w zs=#t|1;?Syp^T44I=55@e4TU1kT{{O2{NzQBcWon(L)S5WoM5ZK6n^R7-<5l-Bev| zqkMH=3W&2MEt z?7-u>m!5xX|ABI(#jD4oDswOO8ySjcr$*H52UutC83im*X=-ZRh!Lr&WJcQMDFU|! z91AkUi?p_ZMypj?D&>U@OD!$^xJ@&sFz`F-bp9w~WY&2VIp-Eb*E zU}%W5n2EN>!(#RE@dvD5fJ8BH4g=A}C9brL#RLOyD)-WR4m;p$b$VwN z(7YghR|4_XV*)o%2)N$=srM1=3H&F`Tf&PDcs$1g9uFFdLC=w1p8w$S>Z>4Py-rmF>2!el8Cb2$l!+Vd zRQuqov(&3_?`jx^H+tb?`N#-`I{m< z{QK_K!4fLDWMgPN&YHn+R9xiqG*f{~6TY<^ve^mH-@5o1eJ_AM0y;1}`Yi zZ%}Pi2OUk%=Eg93*x)M_^-D<}oyIWqQrzd0E0h7i* zGqMi)etpmxSs$eDM_oI2;|7%S)oWKypM&L52Zm%q1H($=!^n+|jAeT-9fG>AGjp6) zPO6eo`*L!IMJxD#&7<*!3%zNgLG$n8NmUx9Oa=bsr zIguOjNte4chNbyRUUzGCd2MUAlM;ON*?}hABm@N~$SoJXF;EZZQ3m?fwbKF)HMI>! zuu*^43LM78W0OKiO?2h{*FWD6Ziuf=>NPoqIH05w>ZEjYT3Kmn=|`<-uSQ7=V3=-V zpOL?R_*%a}7?GgYNN5-|GO?q+tm5M7%hgpTacDkZxDWDooRiHaAWRJYOkv$edF)n0 zA%KY;Y%=?#;Iq#@`*6n$Ty3P^;=jQS4?BTfBQhRC?5_ei;m3rpeT$;}&k6xB%VZa_ z4-39Qx$+0o@t)*>VGI)>6Po=PQ=$|rRghZfwPAO=Y#u`l>vOwVzK~)Oe1X3#01(R4 z2Zy@{JtF`HaDj#%8rcC*7qm1&1jH1L0=JWuDEscF4pA5as1gs@muxmxN_m+QmDla^ z(IP_X#PhiTJB>jb0g45+Kg&leBm_UfHSb3^1ir}a^`TBvDyX^+O?c_xrA8^FYARZ% z5X7Tfl;j=2ac#L!6GL~wc5#QMf)Q%+Xtb{_QAOy$!!C4&>bXIeM&T1~s>KL5WF+pc_bkJGVBXm<$ReAMVR}&l%+!fb= z6+Z%rR3lR&Yint5Zf=Kj;qfyfnh@vdHQV(-)XkZ@a8YsoxWd9hlwz}y+4vDWqKSCR zvRrU+L_(1$rHrVFh=Hn>?RwM-KK#hzPu+dzytQlB;t*S-=i*0gZPZ)_%Ia0=s?4OM zWOxKR6(hRv>v!LMckJ4B3CICzYicfi_C_(xQ$W%&rgLMH_~j$`9in!5EXsOhVi6Fo zG1 zNJcQKby(b>r_nRHH<8%`U;cgH|y2lnM!VqF6pyvyq843+6u`8MJ1jv1SBalo_;UnL%r& zLwKR4=0@GsGWJr%HIcQd3d?l{)2ZC8SFe_zI_>dz89L0oT?!*~{+wA0isuX=YWI2S zd2!l;g$uD#&*HBOb4H}33{TBMK(_41MU_b_t4q>uc+(5A82PVcQD!JT&q~VOd=rw=Q$=ju44l zAdr|%G#$&(I?;9=?f}+=Czqo69eCQg)ezzjTP#AbzeR=vsLs%Q)pk%wAXMDn5 z^*z28LY$7IK#ADJ+5p#=3P~n{9-z1DAPd^NJG))(Sl^9llZl4su zux5rfi3jicpDUz-BTK~Al;W-jXTgG_>%uC5pbCtiJA~Nk3#e&$ferjPbq8KxE7qb` zV+SQfk_JyZgxEB_03`1aVk@)*inoKa>Hl1J8O(RQ8S@jw|H7bE55_@fRGfmUM@XWv zu?4jlaQ(Y``rEm)+E`tA{Zd(DZRPcA7tW#v4Lzh-F(Z=daA0FX88i{Wi}=JiMhRiw z(=`B@ZZ(@i;0O)8Zy>xg4%^@6eP~Z3oMW*HE%t4+UKuZ zzjpOHcuWsI{P11W8ipSpu9Y*Q)4$=sAG*MZPanmLA5UCll;Pp=@sZ%R2#?9ghzU0= zWHtUi|7mVq^pnxWics4^0@t@->yfcV{px4uIH^!qRdw~?$M3#Sgfil#2yf42W1#WA z24WrBo)Pg#Z34|>#C$@Y>hlU2Xc$HcL^A9mII{#=Ph<&BI-kd4$KvM#bcp0$0cQtd zM;~lSG>-(X6Mx0$LFjN2M8=3c(29PCOGr|XIQJyO2RGKo8ZyEnum~uVOpYd!35Kmg zND&M*{v58c&5wft0FRQ=lh5gKLf(>CGV5AkaPdkeQ=^K1V_J zjEN~Q4N>+Kru+9u4lyFd|4Yg?BdI)FPIfJM-FAs1nlE?4}Bd)DUjX zrlwYpA-rHvg;0^Bf8TY}p+~UW6gTxpWeX!zVn@I+4qvkv`UAV)9z8R#qwZY4{&px4 z?4*#Js^jQY1`yTg=m=O)bfKDbfi>rG`DL1T-G}+*qnFnk>C=Fb_w;M51tdLs9pz0LtJ%cMV8!IzAXk}&x z>5LUv8B#?tGe~;O4qBO%-T@?Wx;tvFSJl))e+UGP)m7JmE;4RjVf|ine$=;nH@px+p`+q)|wE44;rYf5F^^+^S8TvtVAadL&*i z7_I4tfG`2+L~;!xerc2o7}7T@;J<6EBK z7WB3UAAjU7MIl~4K3!4y$tRyw0QN5k50}e?rBNVV?yz>UY(-p7}o{rf4Yej8C1Gmt%HMNz$zHy`)|2X*uVLA&G$vs+<$Bt$Qb2-H? z72?42B4g412;c?<@dM$AV0pWIa-l)xAstk#9v2@w1ixZJ5fP&;9v?9$d^{(lrVGX{ z_?~&Ry_7J{$U?%fh5U@lh4!+nwjE233tK_%l`JI(AMZxAhub9mrarq}=ECb`{iz8ZnzD2WK}UK@Ajd%N0gu2>eY z+uc#wC}|mm6g@tZ!zaXrv|4XNnHWqEK3(2)(SH+sFwZ$VTLaAU)el#~Rd-^f*!T}YUgH#ao&z>?#u zLt=*Nl7h;$oHI{~i!~dcMSWnDEw5kAn%5pIT9QfOz#QadR1oQ58 z!+}6%Ar!1}Vln17fkF z(cXm1LsNBKzuwqLxcZPE6hiJb!_yUt?cw1vJ0tRV!o%%-O$L3zjCr@+Hg8O{3g28N z)5hO%$FgOhv!0Kt5@B9mQL#c?suJn0Trt5rQ7W%o(Prcs)EggoXzSLy=cl7dGYG2m zBk~EsI*m95`9EGg4Qu;(Mz~?ay$^=UN>z%azyG}%`JC|ZzyE#soDGJ^Pj+oH7)sxG z`%^@^c)aFo6%{2V@Kyf~RrVO5N3fGwgQ5wy3z2%P0o`RY>e2BMuzp$^iVuo4mcfGI z!BbaZR}fkQ7T-=~!A|g?bdG2_^gT#nbX&2vvqVh9B}p=FlL2FQ@hZr znWT|~q~9?k5DG)YZiC)shpdzE^fK(mRn07#L4BMTrGrL zF7;Ugt2Y<&Cz!4C{vi3Y4y!j8t2Z}j^@3|*Q?Y0i$!PN>wS8ub)sOoHGo-ery0)%L zXz6RH!Qn?lv_$Wt5qeih@THrZ8XH>r38kS2jRf2tMi?6xsgn4NQMgB}y}Q%oXnAVt z_+c4hxFUdaJoW6>rw|P?3VMf3eel@=;!9D_mr&2(qB37w*~RjP?1hLJDpy<=%k^dyj3YSw8REV_PHUvYT zc7co;zlo0Ms8NkhJu;1fqh!E{orXJ zb`UxL1mB3)bN<^8e=KWY*{Jl{>+hV5`z0JcW_VVzo)I=)xnXzmjHx)4em9zlSlxb$ z&0+6_-oc$hdpEbk*6(o95L5!nhKtdVR8}W+BiLZjD45vUtWu|y32BB{o-nVCsaP;s zSW@bcv@p@ow8Z2*2-@k>r;kWZ42w_CiHmY!=UAx>T+E}4O3aKFK(^U?E6-hQ0eFHg z`|(t**^f;rV8KgmRO4cb`0R;=lj20vCXLBiKgdlVg5sK4V@D+npLENxGz+1S1Lmhh z?+hQ3Q#ecnfnsVn`q@{Pkf7!L_`(OL+p%LEVydOvHHfLr#}3W^7aHmxIVMpa=RG6HauvSp-4D7s*2PNHpWH z8ROg9U{TZ`J9^~!k&CUZmWJb<;?RV+SeXUd8)SeIT)=8&WjZb4;0G5z@!PCjbw|JW zr4mZBA!_w7QR}I4* zcqK1#zCMH{VzJ(ILp}CWN3YrG34t>n6B|dAJcXPq65@2^ zmv{){bl?b$A3o>4M@S8{kql|763x?4Ax=Gk5^oUaJ_s<~1Gnbo#DyIH;oW!NedjF? z=JUD+Zk%I8{rzrpkKJX6^kW$mTAh|^hH%59T|>d^&yi{&u|&dhr=17JI~NBVp>0 zA<1&Dfb`fyVLraR--&JPN*U9JB$R>(5$ZN`u9r*hf2ah!H$rYUr(!rz+ zocj(7Gf2V(S3FL^PW^LCGT4F&Md(-t-c2=4gI%x%Hd7O5 zib~X>;n6Wfra_hHBhlW~7>W;5edFq-^B}=pv}DbC@Tj03x_@7kMp^7%8FdVoK=ON~RH(ILN0}5HxF`ZwlD^ zFrMIT`|HcbVn2);STaCevtpnUrTA3E{uYcz1d^=y4+Daz3^TJJsg=XcfCLiqltR`R z3K7xK*3#4fEn_!z6BrPBCzPnsyc~UJh*^c!jc#-Y3Y|TB_LAkRHr^+Zq@+xmUWBzE z2?;eT)T$7_Kzd z==BOhGgCs{0qHRfYx1u;q^-f46hZ4u3(`8%f~?v^Kn}rl3ScDe4&U$bItR?%AO<4< z)ETCV+sv zYH@t-^n2E?S$W&)HEY&XR^}7Z@)9bSDWUevU^lQc*#$WEH}%ePwcSlJQUZa?+Sl7( zcW4homz80O1HI8E05A3^0?_x0jVCH9e*5C1*JdMKuo~J%#F3Q0>wnXK#9u>(01RoT zVdETNO2Pzf4Lzhui$n~^lXELXnxs4OvCaNMPeT+aB*d5q7uhEj^WfY-06@(8Y0!7r zZRmDov+;OhF?IzL3F11^^1_ck^ssRP4=f6aBH8W6MC=JwW48-EZ4pCo@nk|@Ty#=u zdiqHCRW28T>)}jEC>t|0h2+jee592Lj|Mg`Y{%t;B*MKVFZ#pWi#D=>&q!2I|bdfd1{E9TGGN?DMd zjqoG&Z>sC@^{}pjx<P=ML044j23finC;`K(IQ<^^Ia=yaG$6ihwWR-`ucit< zMj#hPvQ+bfq|36Pna5z}KWC}N1?}WWvMu54f%_$HYBjJ#)`1?;c{3U0@s0iQ>`%ajxVNU(-| zT)OQqZxZ?Q;d?I@BYnCBh{HvQF5ik6@*<-Y2*c~O^;S__+#C+h^&|BW_@s7$wPrV7 zeHJJUfw}$*Q$hrd59q|P>{Rsa3kauK09vmC<5C(M2d<@N*x((=$F>+FA#3cezUI0q zQw|+EcKq1!b2kW$dNsL@uEL+15e4%HF=m0I_WV^V?QE?uMgoZpN#yl~g=s)t3f^*_Q)$)O(6C5jBykqCN~Pq7AI_dFuPTRUd*K}5D9Blq=)Ue4 zo)Lj=^iVW>N8QB}=Z+u#@oQrwOzt5?xl?k!{PN<(=I-XkhKe%e@~=@xnUXyA$&kv~ z1?hSstvo`@>961aeAgQwqJ463m;KpRUJ$g_%dysZf3lVHgVq{EG_1?%b`13YE~_BN zq%6D*OM5_OssE5v*pWiHmXT`poaG!79c7H~?-xWyhb4^8nN>VJAg3V1n)pEP4_h9P zS87NpPE7gS;O#M0o@AsaKYQoh_aVXder${ahD#qCnp!Y@87w!+hGI|xrBXbakd=U!w~WHAdsso0kIE=ue;fMjUuFy)#9ob<^hnm5G+JfS+&2+ ze-fS-CzS@}SONXYjsonu4eaCm&u)q-wFm5<#2K(O_opnLo6KjVg1V~>F31Y0)EEyp zUa1tZe!J6Qx1ziWh4vx)%Ks2dgGl9X{?{~SJ18`ngBuW$-1!#>VVxckK=d1elShG?) zb;9JlS##$?96?l#(?rKcC@lf8q(wF5ooL{bg5j7BE%I_#E#0aF*T zNZL?&!97d^R+|%nNM;Q7fCTa#kq@68omZt5Yo)3RAKiYHV=QoT-Lp|bBK zM7#HLBtv&VV%=F1N>UMCvnwGtH%$!+SFIQy32bwdFlIx(-7SA{=NGWm0CC#6qjWuX z|5P^7Zv#TRY><5jj6@(7N@nx$n<>DnOklIwQSb}X(AQLft<~YLLq_iqHxBxLMV7Az zoLeDm77Vn{n6WGymOgy^*x@>CLk~(f2p2`ayQ|6@9VwIJ7|3MYI++^FfBNF@H(ci0 z8k11LXAR>y4o(l3{>S%5jMHVeqKt$*`UkMD(bE($XISnYOMv7Z7q&WF2ykJc039Pr z9N{dSa9H`U^#NkxiD(=j^59H;9$%;;3?AtIhFAt}%lO!s%q(!dp-q_@-;6Jn=@T-u z$K)a5k)J&x0Tk7Gy#_r@1!CQ>?9rfO&rC~6%uI-Y0w0SrW*+d;J~W>6IR{7w0XzVZ zb9VU^3iR_*D#&Mr80@=p_{a^bsTFJ;_-n)X;plIfhOjnp)9`swP?J6;Z}FlHz$M?k zWbT;Zqq8$IqO?3(D2<=FWZ~Soa|@;;`h1;LSC1S#QYS-$#m@GI23Y5f zWleTVjR##-NQ-d@6P#UB^S6I{^Vgo%vdU%`NWcRA0;#H&1)baAKC3sg>Hnh7Dym;# zP4I;vgxKgv_0o&qIj-tUEya zh^b*6Fp-kVHYBiHT3VJS@MfLQ_K zO|%8143GH0_)};|G~vM+Ll~KaZQ}e$oFgkiEIOQ9uG1kAOYo_zoxOIykz}%mj~EiA zMKze;;#4^Yx;+%_Zb|`WjOFvJNu^>NLWK2Q; zaq7gJWaJ!uU2UdroGui1*!p-Gqp~xyh9c8OLO5~aUXQ~sRl}qr-v=E_&;%Zb2o%X? zfyXKxv}Yc}-g+!(Z|w})TYIp#9>d;xENE{%7PPk}_B-+I{2r$b!)}Ul&Badj)}p+6>FnXBPmy3eRTyuR~PGh?ZPmv5d3vG(?WqJJv)Eq z?78#jFIWih$1RKIO-~nvjD#D;GmZB6SJe0;?~38eu)kH@fTlx`%MU% zXb|M<;D!|ml@i*~aihXw%vd@Seup}4cwQFY(RTji;cxJ`&@v!TjYn1$eB~)>M&09K*~Q!TrGG5D7$VAQ*W99z-R{0};EC+a5PfK;-=pQ1sJ&XfgCgwRnvab_#B5h1;LNf5_sYxlBxr?WTAuZ432*nbi z52+sTx(+zI%{>Afc@iT=K9ZtsDB&QwlBZOwA|u3pQIAU!k~n;b$~ZAbO^V)?5o%pl z)`-b@Q&HSnJYn?6bX`bNLKq^IVp4(X=V?Qd(BgI^FquQsvPLg^Vs#uf46}+AN(p)i z5A<}lbq&Q0{>5GS#;&aR3ZKYMyaz}AeyNlp$r$?2>A z;6X^kNshuvjtV--(LpDKj!AV2|2lq`qh^-v}{0pw;FRKNGDC^0Ajo zOTf2RBBA%}f#70KT8&cBP!V~ECw`;lEI52`aHOUCsTWEpI*(n)A7Jpl>^JxmAtzWQl&$@(HK0BOCj`wz6KMs3O(-FxR7;Ck z6`?28?|4K<8Iqh%S!}#Mb=;KY%NGyl@HPLa|tz_Dbd(HxEPL(y{FeHqna;MTxNr={B{;h;Rm5vS7EFsjy%R) z>^%liU0r*_IJUJ57n^u3PzZH%>273|z!hm#1Wyc_rwGr>z0OxND@5_q_ zKOJJ2INS?zCj@e}E-psyqfqYI-`8XHa$#SY+>j&?$W#Em2+-Jrh2nxdAw4vpoOnQ} zL5HILm|Q0CK%ht#qEX6GXsVDRtj~3dB^mc5i>2yPWv$uDc6ag8hoqvAxB-dxbbW}c z-|iJ!yBa7BZYWJs>39fa{QBdk%Bv`=^?JRVXe-j!2=tdpcKi8X&R;V-q}}bBxwp)i zI(2Hr%9Sf;+3U<>y_iVgp)8_j(Z`$J z_Q0nvZ~M#Z@C85mG7d##sbt@C3i5XEADUcOj0v6aT%(k^Sw(zu$$)TuU`0 zV_b$r@;M}wG2mjucBSKn)6)r%WFsZUH*Bx3s%mU*t7~W|Z*Jt4@tu09oMc^nHU+EUs|OxB&jU|Ex>>=HC%-*8|Xoyl)?u0xy%lym+wKe zK4;p5)RZaf?tk!+M;=+ZvH&{-L-o|HbBZR87_LB=+v%o2_nKI7_So@@SFWS;)4>Zs zW;b3xd-hCAcRvgaRg$i1{}0Dn7kP7RZnJQ1 z|0N?PRtO;@{1-T}c&1uGNv@C(znM7jrAV|XfDyu;ZEhiM*FE>35QjVfvDQi}TiiS+ z>QL~YSzBwR)F44Zd;fuhzx?#$3@(5DHylMWI2=t0S~qIdN3J;pC|ALL#+yuKN7RN; zK#baYZ8oc|xdkzydQ`ts`xq@4dnCes8=$(bfq|>#pcFQQl3UIt;gkxwjB}unQPc8J zw*qNNLIV=HLWW?7Ar$G9-cG>q+OCyXRaaFKv`HDGbqwH)1KfrzQuB@Ky7mD8wuqHN z6A@Y4gx!Mv9j#P7qwVkX%al45Ksu%?hmW1A=`@ueC_pX5MibvIVeQ%lBNLAw z_~e7#5Mb}WPZo=3?X3Oz(|tc3PmEFuct-l#wV4QyE<omQd->)6 zdH3V?^qgt8%$*9L^zdOrhh&m`S^*J3l#xGw+&j+|L+q@FIt|cZuV(KA>Q+4vi ze8{6mL@&HEZir6AH`3pKzZy~}5e9u=q(jam!@9~q6zUGB2libK1;{Rk5PT3co|=(v+B(`yT-J>*l*RtY5uy z#oRe_R<2)PJaO!#S@Ra(Mjp$TE~D1rQZNfbhBA7%u6T$91R3C0MyH~SQV508Yw(}b zX=$^;J@X9;HUr}$xKr<=fb%u#CEnwYg682hXp!B*&C3?v{?OwyC<8pMz<3EZ>~qv} zCE#x^5%l(&V`ngW7<42eDRMwoc*BNGomE&6OPRa+tj>UZ*b4bj5~SBZ3fiq7VYhC@ zZiVXkU9Xn}?bfLf?Z_Mwe60kE3n!0Hz#U#fa6zD|X81xtK}cj8((P9%68Jqx&9>Cl z)qzFdifRx>&)IM^CDFxT({m_!_&Z)6q76(O=Lk_`X;8gIAwC^2IU^MmIyJR48K#En zLS;TDV7YxARhKVyclSD_VfeZU6LP13OJKsd>|vP+Vf@zW3kMGzIB>mdK&nlhJaZL* zVRz1-o-1y8i9E;=J_?UW*|9COAkde_eB3FF_Zuauag-DODKsWvqTVV?lH&G&!&_!H}&-bwbUgR&(QJ>Gi!MX!3b->PDgEv3M`-KH>{R^-!-bat- zJa&_2=g+4b+S(DQXhzG;uC8kzt%BqID8j(8tQ66QKKRC+gQFF>_HL;9T%^!8f?gmI z$BTq}Iffzd6chj+gnox|<460CKxCdd@XdB;{tAYfXf?OjwYvC19tCiPmkSli^zoTP zGc~@pV+U$wTA0gbr@5uWQ(j(UgRU2f6>1$iF!nnPQ(aC6Y6*#L2Y4C^7WpF9V(#iR z!CmHjX3zz}%eLEK9GcB`J1-TR#bV2|S>HwiO!_=tQxNx)v#Xi=hrX=xrwk|=|xH$_ZrX~^ZIVCwE zM4||dN=q9_N)J;a^btu)AMx|8AXS!8W0=W^2DxCX$Q8;+y+kf0R*K)>Sy|nI?azu7 za>{H5&aJ1pmnZdxCnso#k`@WYUVC#(kI67KC2L5mQbvrHsO;=fUT=FjJN1@FpI(NR zmf$|f9t|cGd1T7CaWhakvN$I`Iew(d(ue?OOTW(}qeheY9afi5h}dsNrc$f2+Fdy9 z)klt3_1k@{JT!!DZ)MTB>Pn+P?M@w^69bHvMkZ0X%vY~8v<&L4iI4+7K#}A%tDq_vn^ehjt!4bZ}bn%;j51`_0#cPcEI6jLzqJJ0QAC76N(u z%)_%nE#T)$PIhaW9~_xCva7=PJqE1xJt0O}k( z_OAtxu1Wy25M?ex=9jdKdx6@H$WB;3b&)zGc_O}BAaI6G1N+S@f(2T1K{kMw@Pl11 z?b!e6OXvszYXIeoczc6m)d#Q{l`#(;Os+RbL@i7E{m-TnZMt* zlYWS+1-l9Pq9KIDh|w$zy(?8T+(MG~ zL?dR1Wb~vFaf!U&-u$>6SuMSw$7F`Z?fX4Wm$)qLPUGE=xxXspn{DY45Xini1y& z+z%&Tzz1l@=d_yO8xd$rFTu17V?YC}yt2CXN_nd^E_?B+l^gC}2UnX+$>UwyHVyXD zBM8!y@sRknFPlB-s~&!u0Fqy%O7xxGeKl9Fc0h0nfZHaWBi;R`=Gq1e&sfX~xuHaC zKM|4thoYZ9a-{}eujb701N*=F^1H*0CbXw<)|@)H^A*Ev#8e-GIv4{SLlkTx8AP0g z3|K_x$sN{2M-#*fxR5BsmwYy>+sEUJ-CeC_*4Bt-Ee*Z6&y-Ap;%gV~FuX2Uov=`7 zG);!JLL!7hArHlL!~_`yku$sAyffx829}kik zMZF{t1TPvkHcJ~xSyDz)yiz3eSi50bqfL*+Z|ZgTHMZJt3BFV_Z0xXbzD%o7h^1PX z5x}i5LwG&`AEAjT^fea?kY+;+Q6N!fj7(E{&=C}06P0|ZakqNK0(#phWVrLjj?_uT z_O5E6A!?B@_BA(Hnl4-={iA7RwNchIwaFx9Uer}&KR#<=S(upHSkT*YdwZJx^|T5>noSsz$` zd%?&Blhg{azz=r?Hd$wLrz$pm+?3oIvlPWeMMV>{Gx-*e0=+|+Tzq`N+O=!etXYsh zJ{|=Lbo>5K-r4!)PMpk-zCPUL(~T>dzwFj|z(iS5iDoj}JZ`InR8%4~+27gY5YyIH zc;u}XV{BHe?MC(G%N@}Xq zgG*4Wk$hLYUZVtkUJs17hVq7(oaw9Yx$o(%Pl01<-EA}F{k|ybb_9!&P!><)A~t(q zgzuq@l1;ad(Itp^729XRsaZ~7M(~RQCwmjf&t9+bB&>LVKyv>I{)v(V#1y*Qkc({V zbJ}{k!KEl*o%Xh>x_(|y8E9b3x==)P3n-ml{`C7phtS&U0bDbiB~^-T{!3_O)qwB| z87K^4<#2*F0pYzCfAetEn|pr(nCirVFZO(}^KHaXKR$2;af#;UQ$Oy$g_8o)Ap^un zeK;TiI{o$B=td&M&&iSz>?}xyQw#%l67DX^^!0S3pV3x)p}WQ(^YXQluH%O~aqOL4 zEiM!|A`ruMj8ldvyyiX!-(&G$Pq83Z6L^uaK)6sP<_V3tL>%DwqwLLw2GhNL1a}8C z3Ju`_*+N5jV3$jUG;qy$JMpNntcd%ecnbgU`4r$&bUSU9E;OkiVR8tSTx@sTIS^5e_#>^V#$bMJDf!35D%Yd7zie}layXTslq0tXxD(iY%;^)$(3u=N_9v` zQe0%(l&Mp5rw}|}QdB65L-j;@X@2^PM@;)si&WM`ib>0_2%Yh>%dqO z5f!2Fz!z<8XmDvAR&jKAOj=4RVXsP`earB$#33mOsTrayn2N=V){vT{uc?oC8xY)O z6od%OWkIMbB76G%dDIINHjK8&M^BuQn>zx+ZRFIc(Fz0vQfXEoRVdN4o^^KH`Rep6 zBHVgR15Tfq@5{J#`RXMzMg;uDQIK&3K{Bo|NX8XH#*KoE8xvClHsUIUOkhN@l`tPR8zXvPe(oq_k*C4&A>%c~ zZqf8~MLv!TU<@RZieKXPJ zk&IUADs>V#z~}L*6_=>TCBQ)X;Kt<(b8VLeg5Q4J_xZkqXFH9;{rhR>r+=FZJ8&LQ zt^`6e3FQ%F>3611o)bAR^M&(nK30P@V*Mi;c)> zbhaT<2U!alnnnReN+Zb%xGDjz_}mth;W+)q2#bYpy5UG0pNot*D#iKVUu4Ju~9E(-D|G~^L(%mBaRI=o5X^>+5S zsD3x%RUyeU7f;B@k{bhBYZ6wpC}>54F`i4YqLZ+qlY&;XFi2~~Ap5GM1eM+0b|hn< zqR68bvHS9x8W04PM7FfF;*>WucDPZGgnBO$OA`xOU$+rdPUp(lfjnx5dgkmDoS|o* zedg(Bo__kNEzjg*QT__tCzVHS!!_2fU5Q=1dD9{t%C%TK03My4?frb|Ory~0eD_OB zT^@B!c;5pf+8Y|?a*p*eFku`;BH{@3D5 zPHY0pEEcVzs=A_Gpnlv)cXt;+0K3?`=$^7g0BX!))BR4c>>(@&QEW$2nL-j;!iHhQ z!`>Q8Qp=F1=ra(B+;2V0o)Wq$t5K)nb0TNk*V$$6?=|9X4fL43$n#p^519~uM#E=| z3vfY1^&EIBlzKGGT$H8QX}Y$#y|dTkAh}MD#XXLZ}JT z_`%THS-*QXk9WNK-1%$g&o%&b%g{2JQ3)B^-hTbk)r%)joW5~m4!2GALcY9#u=`v1 z?_+8|_p_t)4S=M-r@qIQ`3$9eC^3%q_tTE5v-u>_q7Vpno%np;{(YaG_a-MXv_@l` z%|%F@*d$JLgI5yPZt4^JLkWGamil}C~-F#g8KT4B)eD+P!L#? zJM-bZ=7l_eq|(B*$NJ(dQcciBk4`k#)PFyQ1E}pnq~85Ov{!?Vq)ekMmhGa z3unSWlSnKUp_Y+cABbO!}V{N)lV8^n1^QaQV27bgVmt!N~zg>XO6%M+f3-)S>- zc6LF|0;Em+$_P@S$3+ffW4WBg%}NPlG_usas2qxb=>mF)=+sH`=gpl}JR1pYQXdg< z^5Zvlz6*5m`|rKuBVM6zusXu10oJQCJ!|;zlr$(|UG}uQXCS2TJhdIS=u}acMM{S??m`)g#rwf@bXX@F@VYlV<9qXWUSzQ^5M&Q>{H?$-_{Qd zoO|6c69u9EksEQmtt2lvgjK+6&@Q6w0 zMOidr$_TCjQEP_YAtBdr4_A%`Yl-+_S5swUpy7HIVfo=O!rG$S%9A!*2{ z@!8qgAY&|vU_;^}6l6k)oETdG@Unid$Icp~5#H9{sO#gY-Ccfv+3z3JKeuA-gOS8Lg5=7hSo>SC_O}MD{pz5#&vLuV z${Wm95A56wP3|6D=V*Ralo@B;Nq%^Yp0K%DsP~!G9{@j+tH2Eu~3MY=&(?Y zLP)+oJS4LNcOQ;7+zY$iyN%ZA2rT5UqRkW1L-?$SL{mxmK?(iDX8zYK+w_U5X4NF61h#()7MaU{;lVW0o2+EUt=S7;0kQshs7_y zcdDVGuBKrjf(p(4ul#!e6|O-v>>}jZCBWjZ;9uR?p$K5GQtZ*A-2IM1JSW5pqo~=N zHgrfb@joHOkG$|92@u(q5S@OK2uh46qfAq;w- z?K|^Zbw{sfTjces6K4j7jt9$9ZdOLdq}ll)H?E#Nd2H;;VkpgDup%EK?*2UX#w*f$ zrsk$4kD9ieU_Mj5-lK<3S9D0AXZQZx&sv*ENEG5cEIZK#oLKWmyN_2jItL>OB>EPN zwsOqAeEkm%d`pfhn-(3yzsz)f`wm~hWf@ekaYsin52{K}PU1Z7cGRjRSW?{BFh zbs^>D6_t&!(*TL0{b&c=+G`~%6o9$FLjyuuBv&yStv*oW9BoCe1W_BLPnQ&B#mA4H zI2`!pNPSdP;-ovDe0C=6@{jQS-$ov48>As82MKjVO7ZMvt7bqtlH!|PP_?hZJ${AS zPH)5^*}=pBZY91GsP}?QIPW{%oV4}yceZx)byi+rG{1fF_B*?G@BUzKW~@>G>(OD* zuALq$lZ_sqf+!Y2CaK16nGIY16Y4D0j+0V`g@E=B3^CHhA#)bp{m4ull^fi+27llr zOu`=^rU`QczrUZA7vcgOi6gzKun;cxGV-6w&Sm(V?NvZgS0Db8p>`J|^?54}MIhy} zp4}iW92qW>NqqeVHI@{i$EqW*zWVB(UoTvEWeNUn76@)eqocdi-vh|uhyHi{Kl;yd zqY`F9CEWUva3t2TTV&foKe_G2zrMVapec4UG5B&`LJ`vZ6CyNxq)2cpQ9KeeXUnFM zETbWKY=KxTmHzbWsf!mYyL^UG8qn&AR7!HsiJBA3(9T*$s>@*Zd%bXG(NzPSMmRCZ zKFC#CkYSOvCqEFn!Dw-#T zp%S}l>pR-3E?%k~Z~~F6NJ#kq+WQXhHma=cJEPuZNw!?%-s2X>PIH>=^a2Sb2@n!O zsG%<(%K{6#lE#$XZyRMl7FZURw)Ea1ke-n4^u#T3;@)jp)tdR=J96TQmry=<{{MOY zXFVBZB#q|I+;*w0a9dVjW01^200G9a9OE8D?+*c%i)9 z6r1RXwJH2=(@+q=CNMTtj<=f-#XZCoZ>~q$+?Hy8YHDhN8G&)9TfCn79lK7+O~r`7 z2S#4yl35lh0CE!5 zI#bjw%d+C(qYOlJ4_bFiEzvzj`~WRq z<|JKUzU2aHJ)va-pneZ4m`ey#y9Si*bgD4p^mt;UC%4>w2(YB&S z+9gg|a}SlJjKRS<*%ec8xo7e2;B$C)_aeN5=pmn=2RLedVJn3^+7aY=+7*;LGyWFF z)8>@LFQZ(S$+>`Yk_F`iKLV4)`hqwkqw-_#(Rl7XwnXkRiQeP#Gxzv3y~mqJ?(wp- z_b9YQ?(vr4do(hhR@~#h$UR=dIb{nDpSi)`4g1UJ=$)_1=?|#@*jr0${f&Qs(GiN$ z^fqdmRtWR>e=%1<-v6evs`gISK3wJtcfacrfLX4CA5r`$_ z!aYug8Du&L6V7245XK8{(qAL=Ir=%368iihJsUW|=m`^hJ97l)zz3LhgggiM3g$J! zXu|aQPO2G%3}ZP^F!Gc?Wh6ayw7r~rnWKbOVSbwVijXiM44795W7N_X_trBBgvm58 z`QP5+_dVfgo}+G|EuOv%EizwTPuoKku7k8agi)fs7&~}U1%&Yu6t@0W+L5+M^L|E; za~K{?m(nCFw7uv#%a=-L|gPM*hJ(L$H*mi{y_`j>LPiTM|3SDcA!bW9xR^dXY?L+JE} z^r_HITV!U?7TG&!i;rNvOlL;N0G%0&#-K%JegXK>_x9-zX>X{OwrBb^rBW}Y()Ad{ zd-<)j#a?kPmd4N)S59PdMp`@{o&J!S*m(pkQc3wI+9o8&(<0?u&4amOHp1$I*{D`A zlL<5Z9_FgykyNGpIB7L{B*ExoiJo~YjE+Un9b+r8OduZ<_aKP0mb%a7jEbpZmT!GP*@yA7da)@_6PD zw1F#`&(Pux{5IxeP_f8ZhisIw+9omA{_p5#bf1Qg0U?MOU|VOJ2J}GtaJXa=E>+*`a1w1lNd+rxyG`yIKJyANnx<^s7g5s%XthE#`@K zHNIFM`Cig05tluEC*fNakH+7`D8wT&momVp$fx`Mfpj79dxaLtta#K@2eIa4JIQg^ zgCbSw$WK{`v~)nrcM-Y}SvnuLNf#mlU5MN<2k+=YgqJKtGGVIPKzh$EM0_2L3=5Hz zIfO1mJai$lxSaeUvJmMi$3i4Rg+KNl&s~YMw2Ajf7a~h9Jadn9A#%qpBlmcAA(AO{ zNA7WWA>z|8GAu+=8Y1^d7b1(R#f1oN@OLBYSLrN~>gYd2f}O5~uE?x@fO!_o`&p`@ zuXIwO`7dTWl!ZZBWSPxD-C!no4HTcBXJ-0(Ks-$16zc9tK{N>HbtV4^^E<)}1wl59 zDTYyjCr$^?_*U*SniG8A%nbI>tHzXpQ0c1%?cD;dJ|xacRC8qFY8JP?MeNu5+ur@rccoa7Y zMQ6YDiKV*U4;j^gX4=CAD;PPU-rLvELWQsj{1)pF@LMQ*83mLP6)MhXv-FAe=ivzS ziD@58Il{S5Oc&hZGXfD5{4c^9Xhztp!%tZuWP%U&iakz)BB|*lMS&X;j~1`NA~*8n zlrw$TeNfJ%E+64c()$pv)p`ue1A0Vn<>528axGRgz85+AL@rtXN~y!KN%X)gvYj7|b`v&akTotZ1_4}`OzB_f`BG1#S{uT!du;*bf zz*VWW=)3Omd;1^`7urUzyomO}zwoXVyA1mZ?B9BQxn!n&TOXX$$2MH$81}ERkH_xA z&SF<$|LIpx!&N@O{v!4Y>|X2%*!9?d`qkrcl`pYBj$MU4j6DN;EcTy%b=t?Lu^+@v z2_=Yq7WP}Q|MaVCag`SA?_*bE*I*yQ4pRIXu1y9u~VWKuRa=;T8gPS5wmh4X8lCTT#}-m#T`9%65xX-vpqR2Ik~O9A70kv z)ZC(yq9P91YQcaD>7#JgyCug}aTysY$Zk1)eCOwHz5O;~XOUX)-uo{-_TYmL;zzK$ z0~8)@qKN3oag_zJYspDTAAIoA;}1RjFrxcwYii~ICgBcvnlD1)Ct&sQV|d40$T3G4 zom+BT71xVgr~3Lq04E_Nqhx%3N^P0?R|kAoD)^99abvQR99dc8 zatfxPfy~5MVCsy?&Yw^*YZiW{iMKN-k%pK+v=)^djWvWqLHEnIlbB^R%{ z<U9^1lwb$ZjrrZpiX)tSWud>AA6uePrv}i5D3ng6pM{$%oP{CI0 zQP}O+DRuN<7b(L5e(jK4IbFi59H0y+Qs*EMjSC2{hRy zDlL!Go!knbj;$wyX=!OePWRq>Umo+pwc$JV<$K&5M0GEuhyvIU;Vpk2fiur@a;Njr zuY26Gp06Kuayokq+;%p5Jkm;HIUU9g^`WtR1SAfp>!IO){k`po!))b5AQ&2l1MDLf zH$jVOW#<*4*+R~xRuL~;CVoL(wGeK)r-wagf5Y+faC_73Sx%=^M#(*JFnMGaWkdrV zEg^nXe^YKvXWx44R1S4wr<~*->|&q)q^p~8mE+hqW0zwOVW*tXk6pa_7>uYiKekvh zqTiPvi?j}ZZxei~wRQFNDC3SWdKHHhb@U-oAtjk6IrtDP&vTZZ9uiZ0!37u0odK}6 z3FF6)HTK|4Bb;SMisO%Xd|$A$w!WVO<)_ZRXBLUX8$U@NQU3-2i1*&RB3p?c*e6b$ zXj8+72UzMJzG3I~Q=Db|`25^-By^^xrl+T;0TE>Ec+N5;2PvR}n*!AWXhBrO<8qcj z0Ch8{?+=OdT9gTadziB*!eBPQ;Ry{<_&KCWX|Mv5miqlrY0+#SJGP)?8t07S5fY13KyROyS0FG`Yfwcf zWpr(SdKB{mA0 zirDVPV{mi#=u%5?W`BKcXV3=#YMdj8UC&wWz4x+ogyO&(>1jeNntalVdvWHe?K>Oz zp5ERNj}&7Y`rOW0&=2`VMI~@P7LP+jW?^1-3cA?`|1e^w!ze!jZ#nv0&RGyN&_6KH zhPV<0Y9TAJx2GT7j2?%JQ-vHK;G9qfALcBRCe2$?UVZ_}IbFJR*|KGeD#|8t0R2*` ziAn24`n*3R1BPFq%2HZ7ZT8HWm#oRRs~(a!^bZ&7Qb91cf}QOnudC@d0izY`J?VzHZaYJXcBXUj}i47CGx zpckpMj`Yd!;?5tVsKRdW=4J{X=vcsU;P?EHNOL9LZqzfQ{)M4 z^QlvZHgDa!b<4J$oQ)6Dv?`Pa1*L;oGQh9mdCry;4-|jY`LHDnczS(^hNI!+IGabG z4c;I1Nn8HceLCy^NABx6Bq#*M>R zjFpUqw9cOikz0cpR)@n9?CS6;buPJ48|v-hVrXQ2A0&hfLEH#rGMmwXZJphmGuq20 zfJFOR045oeY74^ej0)n%hYyu?gxXbYeaAehUTiP*KjeOj+%X_T}o3)d*!LKmakfM`J8ms zAgAzpDTmV``eQnsB{W~8R(P)r66p&HHIGM51XJ-~;+A02n0DkjNp ziHb6tlauY)6B2`bVP4*ZNmC}}a|(pkU~amMM*IL!1}fl_(HOL0+YTL_QpxC)N=By` zqf>;@DVB^*sbr?apuRTL6qcfW6UlLvnI^YJu(puofY4>ujpZ&YgezQp`8|O zksNdOj*i|wijmmg*W2Os0)q+S8$;*i>_dHkUFaK9pf?oKW6qAEeJyS1I6xBABP-TV z0aO4y-^sM8vCOtj-=PkicA%*ov11!9@Eq7hEGR_(d21Bw}2OGG&Iaxs{?fap`9KBWFEL~I>aKWG&))mSuZ{2 z%7Wk;7<14&%_2N|C{hq;H8NvGvK5c%>GULeIyXklUOO`sbl!m>fLez?rf)D_;A!~W zt)`zx4uSGthGC?mNr#jEojJt+^b+`^pPYF!d>Y=6vrR9H9;Ec2<-lmWBizcLt!9*X9}t0qZ5E0f@_MCHiR%ON}ZUZJUy14 z&P^Wd!zlL+`f*vmSUwrqRkZpbtxW)|DI6m#7k2^G1P=?<@9c3^8KTnwB{Db&K7%aM zzCIlG;SjiVNWiC0Lb(M{Muv~2r$^-3RLsb!k{LNwG9ziF!Ks*$QzbKUs$@nc(7qg= zesn4#krCYq20@Rx1QgssHvXBRL;yP`AqJEpY^u2gKSIVdbP6dn;uMk|a|tH~2Tw@n z2jsQ&OzbV=iH5clS;yl>@`4mS)$}iNGb$wWvmb#sP=GVsmtbVv_AJJQ3)Trv^>G1kZe95vc>xW&;195@n> zQQ%KxnqZ*Nb0Q3M_?SxuYzxNx1V;TFZrCnz!*-0i;?$|GF0a>R*UK>VWcui|w6tjH zF_(-2>=^r<82$6`wPZRbU|~urBa7mpB+zPsG@MEP0h9W)Yl0h4whVq=cK^x~`0Ff1QT#6Dl4h6v~Z;PJ84?LnBSuZKywjZ@{JC z*1?kiZJUY&FkpNX;)a`%F;1!~ zH{IQR6qp@=p54PUq7*aYe3~MyR7drAX}#_e$y3{hX96u~JtS%+Fr#6d!kk??1L!fO z0U2Z$X9tE|FerL_!$vhl^d=Qn0jdjN0uBz3)FO=3 zA_;vilF;WOjMO5G6e3Q^nbq$i$w;Mt3(xxZQA?MOnpF2YM`ERG<#;0SD=2*C^Nwcv zDE@U;<2x(CC@)Lbvlv-6!o$ux%ITx|*clz}9Ep}btgBIUG?+{VRg9i>E@z|fMP`VXGsmEjh>8?)t3xOo zfu-TUlS}$&{&q%lI!FGc2dSB2FgS#J7()G-?ru+jR)PjF0a%I$*g;T{xb$=RT+dl$ z=v(CBcSWQsK~qZ5)OSS{G4KMYn2??cw=#nkCIkO;wASon%j%)-U*d} zz$T5V7oZ}Z*9wq30i>)MjdD&4RRB2(MqoaI^9s$)&0awbd9UWQ3Wbr*9+T0a;55{5 zhP5e3rV3xsbs04RKw3~W1DT27Cjy6&bzw;>xFJ}zEao3Tv~VKMf^z5)B= zWdP&VDXHY(X{Uj=g(5m`0>(2z!a;H*93%(N3>P}Q03#ekYUS6Su>^pRRq2|VPM?OE{SxxK z==LIx|4E+0c`&2+u*Rlba`-%oDjLbFp%|lddy0d{$BoXW%rwmDAOhm!AwT2e;}c-N zr`ArnN{udu8{)+mUwY{klx%+arI%jBcPu)Y1<*=Vlm>7zH(;Y#V7DUWg>DpmVy$pP zq?bnXS!rc!%4Zj%m!vp{=kQs8d;+~*Em}#=^cZdnm5(q+7zpt85SNaQqN{Iss5CGg zpk5AsgxdzbD9RkbAOf7BXfD0w1dzxYTRI^Ox&qW-=?Ms+3_-8N(<}8BJidiXZ)gA- zJH7-ON5jsYd-v``sn~t{_U`=Tlh42SYQu&NUw-k$CtO@j^~Q}G57e9jw>=%`g?iZ= zU}3aiV~uX5IWDcZxHy$d-?3x=!DF?k*Lk3N$7`>>^X~hfefHV=@4fTdBai&?&yW4> zZ-4vCpa1*_mrmj{+AN1b77Oo+6n+;zg`192goEfcQhQ7L;-rL+Bq}m5JGB zKosxqZaoPnp<-Kl&l+O=n2 z^}&M&tM~2Q6``m&%)2 zC!IDcE3W`!n4dQ$3)4|D<+RhM&z+CV=y`KzPscYHf?@L+r=?K)_*=4M@nTL($@9#- z(t;#u4JVVyY~~2;U=W_@N)@O520*PabMM-<^BXWRusl{YeSxFB^2+OPqUg#SufP5Z zM`(1#=r}y>>Je@F+v4yf(Jo-E_y=$%jd;W>7~e_pXh_BM?T&m4K@b3w#~YZ(>FIzu zL6FsecobrpKu3hjqvxeMeWrxtWnwOm?)l6Si9^omc`&>Yeiu61^I*m+SB|i|bGm+k z$nE}}*PSy8k(2(N(VaUWQa(rIX9ff;9$fA$lhfLu;FzQB@R-`U1tO0-4~L_&PwMR* zEeEK#_Z&H}dL#x+T!PTzYiCzF5Cv2aIJH4chBHf@bH#vD>y<2a&MyX>T3Wa?f{Md@ zhZt~bMZPgC8%N0j6l;Jx571sJm3)*O0Pej=F(4PG3UeXED79KzCx=QBOA+w8)XJfv{~j4`a5A00&*6cAStc+Yw>Orpk#%Fhm4NcLI5DXAK@Vi2_?Hoo2$x2%IV8m`tlKd z3DTE7`f|!u^`AC|eTM((s}Vj;qu>v~tuejEB@hIa@N% zQ(;W#L1cms$bovS!xTeZJ9l>S(SWbcixt}T?<9UezlHomZbi@=V0}nX4u;rMFcdbi zsuUDkamcu+l9F)+X)y+t!j$=U;EZy|N7UrYPqN-OD>!{KHbL9)o;+0UNUb<1rUo4v-hU&tVB2$ zHrbQS=~q<%6Z)`|%yP-#(PZ3uh6Osl2*kk;T~-+>Wyvld+B^%$4Ht>quMqVz8wheI z0NHOwIr$q^f8KZk3*h4~&IFA1WEgZ#u+7bH&BdFPVfbGG9zWjL-ql)vq7y1*puesD=T76XrF z`WP!|KY#Y3ntE-xqDIt6U9W~?9(`#4+0CO zpJwW#+@2caY9N1m$cP2VXJ352`$(;f`Q*b7Nx3i^jo0oz(C$IiE^X)`6IL=OPo6q) z^ngMQjB}bzph0zEUIlo`j4=cJ-hZIg1KQSf15)41D+@3dWvvIgL9}3R$LeVDe3#Y>v{nkr<(1U>?}Cb!$~z zAaJ7b;HFKRya~mn#aIby#!a1zV5|8PvnnWFwydm-m~f3n<0hmB>p%PBAOHBU>u6n{ zTjTBX5A^r7{MRkFRK<07@7nVr7H>zQ%a$zMd7wd8dC`q`-+lKlSI@3sVwqUkvSnnB z%c;C~>53`dZGV`B8Zva7DipI{f79w#dV4%=ZA}L&fj0RzdAkY#QuBoW0x)FmFoJ6d zfU|!ge``ne&X?ySMDtSo(t@$X2C&x4gu9vb>nnhuQtK?|0f(pT(8Z@G#Vg(Ngq-Y5 zi(A9$Vxr?5cC7xZl6k)NcoUX4p+Ijii~<_%JwEDVX|JnS0ckSOF%|~radQ`K*)nBHjqsfio80F|UGCdrs)`#!c?(?jDZ1TMcSiE#cn3mQc&@K`pC6EvqHea-D=)iuUgP zX6MfBd-v|$U*Fw&y1l)zsmrT|DL@nUx3{B!1Lj$vwe9Gh9#2o({=H-m%C9O>*NY*5 zN_IO`vK?5M?K;xtQP3p-T&eATZF*^G>9|}h8HkZ9Dk@4zPtPnUD9Dc0D&SEI_P12O z1u9k;_ZdiF{!#MP>VIvV|sEG4ye)G*Yaq0B7 zEsxF;7K_{U!flK^#*Jv!g(<0{G7?Aq!x32gI!l@FRD~|G25XelxAlwpthqe7ibv zrLV!0m%CI*4;Q5bEuIK3a$^Wg0i2&!L9f~z}8_jDXBx8HRxq-($5tY7f+oq zVJbrR@*H-XEgY6dC+AgSfnSy49d|4(OB(7m3kk&wE+p5xGG2SXC^?VE?DG;GY@jmO zfQDoS3v63**567SiTK-SjM5azTq&2#m3b)<&lB=r$r*o!G=j`Nb!uE3fGLxbcpkxO zQ_Ch#DVMA9Ia)6$w^rYVFk4X8ZjUCIH%T!pDD~gDP7~L>@Q?vg=ARfwMjMAj7=6cJ0`)Yu6%j z{lO}Zd*rzn%E|jqGS}tQZr{Gj@4x(VR7t*k9^_mZs%>rMKf$&Re6NmN&PADFouGo5 z8Y{#-@3J> zW!<)IufM)+8)5~wZri?n&z8NN~N#7~%#w`_iQb!|W+j zuD*K86u{x3tm37Y&ZzW~%kT?>A(7`Pco{Liy}3E8P-q4jBWJ(i20^%D;=~(npgV8~ zVadG&sd>xr3#-)-3<6=_N-QtzlBMP57CO=_5ewIRjOF>X*6YCc=7R6dmyG3w626z- z)O4bzrl$5(M+>mrdK%kkT;L@k$AqXNR+2r@5b_FT`9((tRC!YAEv6WGsJdv7u^-VWS2UAn# zhcuH!rK4GG$6xmU^h?#EGsz z^9E-n@KCX-A3xd_8+GX5^yxDZz4H+=ykEdRDRZy12&bgqRqeM~;CH1hlg{g`p|NY(*C-%&To^%8}9y~LC-X3UK@%9Rara;HlP z%s*LZFyJ<;&2k$3TYs$A2NtD5$t$_d7912JG`AKscbkNNNb&Xl0GhiIG>5F=v;5;m z3C)!N-Y_*)(>~A(TWW7>sA=<-^*}Y`Lx}n9>UXP zfcTdijgAud;$leFsrEyMjs>7qsR=ggTitspJYEDI*}uV25uCvnUN~WMrqL+s?gqi^JGKomtTCoub+(?zx-y-;PY7~UcUCK zRaf16?=7n?nM)o)xt)&ywf6}CKwl?+viblOOZ7PLUFCS=Xtb=m}i1|Li z$~PTGVBm?iUW$V&g!{>1moD6N^h6Jp^pM4F!>Ja#-NJ&f;XMcm?x@b=Cy^)O_W&nS z7_2{B-y?7(2)u^JKx=hmW~N#-a&JdxN4HODHaT*0bCYcr9TN&z(#y)qvaRX?JX42X zP10Qsg|BCTx^v|yObWGB4p?}xyt~Gv7Q*f*IJ3N7tSJ#{h}0!N;=H*MkLSqeAJ*E_ zW|WmpE1M=ehQFF7#t}ajqQ4|HB|V1qq|Crle15vI84BUi9s^l~6r%TCPwsKsST+VO z$XIV(Yimn4v=m*8HWYA2LBZ(g5X>5j)us%D29abCnPXPWF{@;b#Y$v!0%WumbIdB4 zV^+x=Q|F9PDp6mKw7Z;4S(%GWs8V-*rc^Fod><*rM^8NAB41T0nyYeh?zyKNg#gK~ zT+Rx*!grA;tCTQ2L1MDxwOKqMYWUN_ll%cEt0Eegx&iS#ot>?)YB~{9>mvPCYFQe^ zx%5!TVB}J`NT^E9R5mndwWo;@A6cy~;;V}29d0~RmE@UTlswa$;2UtU;`3GJ5tk<^ntdc)m{DY^`*eM z<3NOYFE>NU_aacJVc$3V>)}!kATBi?y7>6%l_dy$9g}2Kc5Q(p=Cej~+=S)VUVH75 zY+37ux88cIRyQ7L2p6OhVs+61QJ5msS4R<_MTM5S>wtks4IyOJs`(kZV8f10n|C+z z)|`c_rj;fMZChV@>7{M$^0e_>nzHo}zz4U!_v%O60C#>OWJ;L`;=5?|br;O2sHm7- zq^$dUB@lnH$^U#XKKo473y?v(!z7D2C<3-^OB)lootU|%NY-)d!;CgcH#FFRC7dAR^kIKXO+#w{;FYL?yxUpHKOb+z@aUb-OeZttr*4(EGIPcNiP*iT43Za}U; zReG$u6?&6V?ba&*ag3PoU?@1q$lVSl>p|J_5O7G5WUeHE-majQ#uF$_It9l-R-o=nk14hy+;L1YNPH6^n9KJj(}A(G{jcM6aN%ER1g4 zjDpe}m`ake3$s(8|D|RZOejYa<>eLET)kkyg3|PHGp>ZTcI(2}3?p@;len_Q*U|T5 zqoK3t#t`7ayYyZ^42T*z2_k$-aOd-YMwCGV83<@S{RClegQ&`&jYZ7@o(gq0{^ zE7faZ5IvJSLG_BY68_+l@Q1&EKimZVaFc{T+$7--C8tjx-m&8p>!s1`A$hMdJ3Fs1 z!$ic0XCG4A`2N!H90MAqI&J73FT!*#%R4-aP0IOzgQ|AB;lV+6iM<3nT zZJR!0MxHL%vF(*dxr|k-E}RgH${0-z4NV94Z~x%M7ykM3#$yML(2)9WWqiiei&kYo zbNPyHvb%E!Ua7=t8=L$upZI_eA>aSun;V7N1_rzL~<0h~Wh zSc7TX;3_t>A2^1(qtt~=Gapm}5|H{qT=1oaX}~!_wHQ=5pq0zRyxfPhKdz*|KddpU zgK~q#VpatW4ANBE1I!Szaj=Gxp{fXSqiFKiTx;pzwhpQOncuX)?AtniiW|_={ zrIZROr%Hg#nG6_XYm!+eQ}ERM7bZ4GoKeP=tei%sxr%eHxqtN-w8W^o+wkS?+SphNq@s~{LlAF>OA8qt4y~9X zCD-v`xj8!2 zhRlxilId7z7bbN>)^sP%gFu`|3w6bX!Wvr~)Qz}!t0qj=t{tywhLU_*Gj=VfD=#!b zA{mNiUU>a|!&5MNa9p`uE`u*@P0hxw<%~(QhM=P&tdYIU zdT?0(Wvi_hmyF$j?HTg@F0v(xVCj zs)7oF(Ge@>5qXSIHlzzMzN$nkG%#A;a)rCm0El{_hcbiEpeycaLeyk^L84key zLIq;f2%J;1fu0EGPX$F}ODIB$N>BvdDiyj_szkR+mFQNcf56$-fEqlFr+2g*_y^hI za_QzRoHcoTDYO+C(sALI)?lUub@RG=Yj4c+fj(bRIqB*sw-Dqw(8;vqj6z@c*2lAB|)VP z_U?HHNqVAZvI2cMThf;+C9{i03RIvkDr`V9|OZ6)hnu7v8QmH}21Pt%k03K<_J8oYABfY-DAn{T-Ix#94RZJS`Y+Sjkw zT4Ikk45buSqQc0MB?~LaF0zB23w_g-uqr#*I@DDC;fpW6_|KP#3Ny~47J#6@+-xb%-N%d8~ zJsSnxXcR9E-MUrhjl%>?Fzd7mRa7N_I^PF=Pq`ptdV1!;hCfrt7fWi75hkPJ!+nb1 zZ*Ohi^!s^;{#}kLB-Hqxf-`U?vkCa(GH8ZFxbt9BOVDiB(HeqUn}+5N4~1B*Y@ip) zJeSNzM9KakH!{HI0Xn!ewWPuh)x;k8 z=#w1^#n_2-$(|V(6>SWw&032U(aBM^IMmH_(8X|qA77v@Y7}M=R>FSVfn253qXa3^ zL%8JVP$(yV9Q?*(q5)QLitqQSRWwRfuhYHoQZ!NH0v!lHkm+OK1b0|~3*V?R zN?+IB9-*N%prJJq8hSuNLvGN}8qm%{G+D#;>|MKmPdBPd}|bF+gLs5qI3|V-v*H zCNc!EB;bl}yz#2VbLLzG!^P!gDPvMu)|R01Beb?fP}uDXT>zX?kx)FgRER2?w(3Sw z=_)8GEl5vFOt8g7Tj4HM86UU{EPrmA$qVZYR*{t%@}_m`)@}MG3pSJdB5o#VEJ9@u zJTMd09Ui4y+5<}`PA}Ez(lU&vpMU=Oui8SXsiANkeiuxgec=jO;fMkolz!yT@ZQr2z;iPS8GFh`?G(4{PE`zk>ey2T&OF@vVMO#d4x$#T?FtWY{Kv1 zkD3GPJgi<=9{U9od7d+yr~wCyV)TIMwqzIcHCTY>3#~#n{x1}_0=zE-d%Z%~%~zZ1 zV_|@%AWVI_=t+rUyYLF$=z&E$Io5qfvb=l(HVbAjdjO7B!Sgw|g z<+b2?K-_gSkxi-2cD>58OOA&yOIY!$(?TVqSTrqP&bVU%P7I zv}x0(=Ns9+rl#Y^n%2#Pc)Wsc>UU2L=;IF`o;6$--W45$yt_qB9-F~{V3 zOEioj3QZiikphTPT)IC*voYlwnGw-%0N?;7&)^^*QXm5ZAqxhBNlU6-snm)HLqDho zv3iu3sg)sG5XkR`Z4Cf(fgqG2`AZ=k2QVb9*3n>N=V83g2wB4Hs|eVKUbBVgJN?A^0x2Lc^~ zE@zxti^oJy6&3;6sX%@F_>t4F2n`_ll#5auw7Yh-1@%DIvTOBb9?r^fuqk_VNsf%X zysRY0m^oKmxpMj3iDUD#(47v0T;}g+WUC<&_lIK_+;r1Tt7a$C@H4nB0M5?4EKfi6 z+10L_%wWYeY&p-PVUP^u8MQb@jGoWsA=fYpGdfEKhSI&mq zeI3DN?;soOVbg8bU$qQbDYFX_Ww%mm)Va0@ejX$w^eRm9C1|2T3R+f zJRcDkDX{-THbRF{V-1!ktWmtz(Aco!+4%@tyb2zAmanH9XncyWQdafp(U!URJPXC^ zuz?>g6>d?ySyx-T^`GU!FQGv0agAjLdpu$~8~lQS0Izr8UN9K_?Sq8I4Gpxx?&#@9 zl2d>nP0*lXxB{Gpgh^WAudS`8xf}QzB-q>0g@W;|Ep0tWGY)jN!V%Ej%hM%>i}hh` zF;*UBRfBwkk^HO94xSg2h+#(T?Z@Z+T^^{Qj1ROZ3!<`ge~24rFsKyPtinmtr%#(Q zIoFI#E4eKtBNs85Gs_BdldMKV)>Mqal!9y{Zk;iwkcFvF8HYyAnj%9T43!Jnc+sA5NP0SwVPmbPbzwRCnW z%!U|yoKXn&ceZy%W|s}K%PyH+Ns`&+fPA)LcG)DeD^9}G)p{Ul96GdxjB_bl3k!X| z)K-8#ZOhDDzPy~co#Y~y()P+LF)`b19QhiaCFGy3Tv<+Dbb^nNB#}?bGBaOJ;?6oP zADhK@5)HpcaPyxlf-=?{Bx(h!4;l=5@}5hH;lqq!IkjU-b8~vSfn>YbkkRO3(|S zw~`wpb!8Ijt`z;38ha9TUk>{$hdr3wG?rMfPRpB!I2|yE7$rYQ$@%d14c{Drg{P0b z^2&KheDgXOTE6Ns=U;dwn~!zyoVZZKXZYw4hfr+-ztLGgr91CjHzxH|imuE4ee0>` za@but?7ZZZ1@l%xXM#!R4~VjOEc$+&ynK454I0?sp)a>>Iz~g*jFl)uxQ_foyCO6A zIoR3Py2@)Skb1g~DM0n}_2TxZW^Rgd3qp%dlO-?xpRC}+vm?e^Uw8z71T|s{b#Li#ue9IJxf#b0+8FeB?yVU66#b0 z4l@g`$=O(&BF=&S!6|vEaJS{DUC`6FzVy$RHyl5H{EI&{G;IIdT=1t$5IZIpw-jNy z%=y&jhH~L9`O|RBzB?Ccz|Al(O%!6qZ82C=H8l=Ny_0V9IlfB*4<(Sz{C#a*)L#h$ z26a-Bh|7|jG3=Xc3wO~~g9q+!nxA^cciG?T_jk8@d|epV=JwXXkRMnr2s85c)*Z!1 zO%UO(QLf2z9hWXxt=x8aD*kr}G1Ydi+WM6kS4t1x)7TGtEB zzEx|BF2qM^SfaZ0G66x=GF@~6@Or}TJecAvu~zxu>DB;1&8b@wNPd1kDluARFi`KL z!q*odfj%FOM>L7+CA_Xm!UO&rJm5O;fa@hZV6B7)6l30ZhRrCTE+ZPNIdM$Rm~n;i zIuSXO56Ku`XW-p~qKHRFVBuvk-gEzNfBW0ZjmM7Fw^BE%OlO1L$f}pU@x}=@ zA9a0ar5o83U%$bnAxw2%(m*E=V7iVU+5YNdfByaB?|f5z9A<$YReavei!V#PJu;uy z$!^XJzJ10s`NwyAkvX9@Mki7n(D-Po0&gd~#qG(coI{6BQz$8|Jqg?@Ju%u?A>1Y0 z#U6~gawcLJXqk4m{DNG=?*G9&<7SDPK^SqwzfryV#peC{5uP~@(=H1k$tO_`*#phu z0^ttDvtYa%|9dv3`BEVX@y7Ltntus5`ocV@*;l}qNxht1Kp4(JsXMAbK;zfb++#ij z%@VpLd*nzPh1SwWWO;z#CnH5t@3bK+h>&E02R$jV%=|wXqj?IPXDmgbZf5MEJnReWDLf-hf7hinw z;(4Xe9g1uSq{D}T!ZU#QhHgF~!A$Wvn1EV?Mu|+P)w1CbU^oOBAA*mXGhcrBvL%(1 zi?Vb&Tj|7UtL}RM#`ff2u9!0&ny@~#IB)!%i!aYJft+kbyCovL}!K>ODkuT;hx>Q>paAq3074Y&vYEx4biFc?^d?4Owdy;14L_2y#4lN>7@4cM<0Fk zwc{jn`R$x4cX8hiI$&<7l*pQ@GV$q`Vm@7(em4Eec2(J+W7@PSrD^7&7O>uykU4Gq zv`Shpo;)pEU_Sg{B?JyOS=B-FA}ZoGIZ2{Rl{!~mFD7E?P_11|um#rQV(J^`LT^^UqtOIQ@c^^~f=YngB5+wD&;BD=T6=s0 z%^eUe1HJuiO)cT@V6SJO4bOS9r5}bVQs**hvyHui)}+NcGbcaf54ofKUcmw{yUb+f zX-REZHn=Q@=HfMT=FFWnIX@#Fi?)R9{NibI0LGS(KjYFXue@?uMSi?Igk_$odmuBF z)#)izfyv4$6^J%uSRmA*B&`=|@UZ==ZT@d z+{9(Su0*+IY^nz?n;7S9LZoX(Fyu&JEjBH#nV89HG<2dfY(ItiYU^cnkZ9H@b%aL$ z4XI`INS@}m*3DQwLZhq<$um`~0@9}nAr0gKC+hW;3tD^@rm4YffTTvgNpwbHNS z$&C2c)+956O%q!?Mq6X|kOy#O`EYAJVrxCLHTF2DZ8#$DC$(l3TMLSx6S zt(nBuqJO5=I>pwy#n#Y~cs9jwYcXPLDzUYWpQ$xoY%M`-Emv$Ud$={d*jks^TJ_J= znn!FcPHZhxY%O=VHI3MsQf$rhGqn~JTT2sLbBL|w47a8bTdNmaYy6p7GmEV?h^_g> z)-s1%>la%yi>=lDgw~|<%`di=Dz;`9TeA+grWRWhX8@gvKg)aziLF`0)?&ogGKO0l z5?gB(pRIM|+5QuMgSw)$Yg|wR@v@e_{4X#Oz6T*|bQ@Sop%GRKjk=2EX~+j&|8M4& z|GyshAKPCtvA+yre}%>V3jd(~`myc&lyOm}{5X6BI_rbZ5#Wu8y#20``QJT_>RYMo z-%xo*$#pe3w+5AZM6Lr={IRy8# z_Ej#p>Z+?2l=n3SVZ$>F^~UGq#E1EzQ#CbRT8^VubJ)!p4$CVyb(I2E3hF42;0_8@ z<)sDKy*{25zNt6%}2546i|4cy`ona*<3Ia&KMK5}A(wpy#>JEcZ7rR&uR~sxf>87fiCwPcOu4zGg+tV}?&Awf zb8#zrM%&-s-bZA-H7+iy%2ZLYbV0BO5%m2-3ofa^P3mRlwwjt2K}M2tauTs_fyrHj za}y8H-3CT9=*t*hq%h9Zi;w}o0GkMc2YPz(fO>_(3)_QL;iKWSRVKKRA`rAJY#J!6 z1)Mxy=0f@mJen9Sgwu#*3%wthjG$k1z5!=|8{-VxJo3qY_TI->mIE;sxL>Ok7_`W` zF>dvU&TdbMAj-zA#<#;`Y9G-dR7yJA@TbHRG@fWYskHhAeAZYp@&(fLCXJgkPFW{c z$m<#;UzmycvYRivO}Q%?`Dokm1@+~kbKD{(rIMz7ARl<-LTCYgwhlu3LNW{oggPp z%6oK75^>7Lk#XbX`qM*)aC|Gd^)~tV&i>bN%;Fv}>=;<54CY`S*kl+8KyCV(yBk$y#lUB$ZEkC4nBq`@OKQh!#$}q0N z3+gS?Lp6QrrZ4rb2rATUjO=pB$lfO5As6ClC^CAvWMt<`pC)F*Yft>;FMokWar^e2 zTemj7{`wp5d;oWNCBhc4$=y%9)C6Vqeiz4Tlg79d1(`H#$gMy^-m&8cTk(?hN+VG0qLN@f+^$WC$Fj_9%1#W0}jiI4c0cqW-iXEMa? zLxygTGfSC#=6YQHOBW|^+xY6_$+HoEaj$S+BuLQ7Y~4CL5=cZIBpi7Htxbu3$kx{O z(o>HE8VCN<7yk8HP0gl{KX$ul%I|&R76~xC9XU!5Fq_aLD_opaWpk+2W(@_tGh8#a8sVZ)Ynn>HXYdDHP~yxDPR?>Yp;*4A#^0TbT#{nd>pYL3+& zISp$SFvw5s+qZB3VX<`$CvPExKA#IN$6%n5sFA9jlZ;W7>rvE)*UCL7;H~fJK3NaD zR;MovVDmx0f|aYe885tG*!MKUAbjqV&p!2h)Z2|ffZqB&HM@4zH68ol;fEi7?u}Q! z!T{HwXzS}gu)DgB&&jRBQg*(|yzQD6D<>dXHdw1+`74F!vyS0__Rn0}SkXMwg z_nbJ{($jg0dUiV6Kl})Ev9CvGx1b@K-6YQP_fHxXlysIu&Vj zw}_akx8VOL*`r!EkN)@||aq+x+~e zumK*zO$~B#L}6$&h$KdI7P9?WWUAl~;En*uQ(`J0S(R7PN^c6e3`vXt41)c0hDMVb zYs|_5$b>y6+F_0bqEBqB)&LA7lR=NzA*DiV)YBAsqnU!O>WzRguv&~}D{OvIdW0?` zE0m*kmQd$M4$ym^1wH^zGj$+w&!1WQ!qZUzP?2*BUQi~T9{!WQDCtWheK~!`R`|2E z@;JThi}b}pUrwCUN<8?I6gMvLm2# z$rMJDqROyu->!W%rx2%EfAk1>7hi_^2f{9yz$#=_29qhus78(=XR=z_+*HTbW4} za-sO;Kqw;nM{6?D8raf%;=g?uVEnfc zLma7{KDtdQa_qOYsgdX#PWC{g&E>RBs_j=GtnIHZC;LI9Q9xkR);5TZmJ3%pX|vEu IF`oGQKT7FbbN~PV diff --git a/src/PdfEditorApp/Assets/Fonts/Orbitron.ttf b/src/PdfEditorApp/Assets/Fonts/Orbitron.ttf deleted file mode 100644 index 1fc54ce7116a6ec549f37358466bcc92f9a72c33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38576 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�zVvH{7dD)NnEr58QuB9a!#XS>j&CXU~MsA4`tK=x<0xz;tdM~=Qn0xGj9N?QU;>}B=}X60UEOR#eO2G;v&?rjBI ziTO|tcsAHH&FIPRz{{_|)4XSA#GRI3e81H9-WOq>^#jc7En{DS7eoz>`#rGd6!?kO zm|g7zDV2-aZF*yyR^s|%hVyD1X~ugf=z0X}hze%%UO@R6dlTiK@%4U%EoS(>6#EP2 z7HKTc5f_T#SEj?4(KqHFLXGT?;HCk_#T@iTZ7?cptlP}5h@K^UEDf}veMi)5NRm>QNdyht)oG&Jgk{k-( zrFom6v`Nc?k|M6rmL$qxL3PpMPBKbdmE%v$s>{~FcK_yRBFp%l?Xaldaml-GjCu7N zxseTGanV**)J4|o=ZZK6f_E-PHL=J&K;BKILwsVe>7+^h`=_KA6^ZL)isQ5$7iF-R z*y|Upi9~EWBniYH(sSY=(VM}P+pvx+dZ%A9w}IA|L%Yc$6wb+m;{Pkr`HnS%)1h-! z85KG=M6@xgu28)Rd3jJ~h{<2FFL4QB{p`Fx^*Q$^t#7_Oqqw;A9+DR}LW1TI>D#SX zvle*iQAxnT4XlI9NM*(RF40pBSuY8+hK-qs5(*|txi*KQ5UH1 zs4Lag_&*ky!EPus+#vp!g)a?TjV7bZ*vELSaiZ})<6`5>#(x;UGwwE48;=-I8XJs$ zlWOW<8f3c3G{tnk=}pu7re&s2P5(4)Gjns2*==rX?r1JGcQ^Mk4>wOT-(h~-yu|#j zd7b$e^G@?VbFI0~l5Oc>x!y9(@`~kc%XZ6gtHBy=O|oWK^Q;Bd-q!2z|1#WVt+YOA zecrmly573S+GNYJ^|6h$Ew;U7`^L7(wl~TWl@jHODvKHvH8N^a)NN7EN3D$77j2I2 z5j`OKhUlr$cSk=S{bKarqqjxZ#Kgu_#Eg!qiuqg2s+bG0?P3SV-WWSG_Rq1;#=aH1 zEcW}@EwTGz>*8YLisJgjjgDIow>a*_xbNfk#Nqc$_7Zzf`&Ib){#g5D`z`hd>@V2g zwXd{)Z{KL&X5VAq6R*bS#m|j@GX8b^{|(>8{~EtP{$v76NK2TT@Q;M!iE;QKNcY74 z_t^{sy*m;L@c# zatC^O^*NvATs7N!`Oam_cFL!qvuxo)c}`K&%Xrm7(M#l=KXMM;j*F$P<%aIL>W#5x ze1^5c&psaf@yEMb4UVlo$CkC)F$l{{5jb>5>Yd36bA1B@dOG6IYp!X+|5szSDwXjK z`*U{)f(GX9Ua?|#?!bY*^mEl`8_xTqtkw(*8#E}7ZQI83^78ydr(aM*ZcoWbvQ#OS zqzs?APoII<`t(`oGvd1X=($SkvSrIY{iJW-L4yV@xQPC2qD^2(NJ_-Ke1C(_+OR)| zkjWV^z!!b4TJ}!8<_Q>ZxF(~JhvGF@1}6`;cnyO7i+cEDypP6|gF(Rasszrf0vd!y zT2X*^L^1Xt@l%T+^JGPa#TP4efiz(t82F=)H|z(L3@An1x$4gZ(qP^0HXuSmY=-^7 zrT(P@y{wfF|4EYQkH$0Vu3dR~Rg3;hYEt0pY`|FHsw#>NJqz4eL$%jx$tceQJ|S$f z(4Q}Q;K1YStkx2XW!>?C1FI@|t5!bzcBBMY?N}i3qAb?O2M%0V$stNvN8!q6Eo}Pw z^y#H`p6bQkI4XjtWUj zx{w_t#1jnC4@B ze9V6dYl+lZvaw1S6?%Vsp-(ATw#=uj57}somKL*+735{U@Y&(l9PNj^W-1J@>T1@m zJTPAHrx)M}pPocM{8*EsvZYJ=^drySuMaHQz|SA6&Zr8y_^L$z=_CLAC;a@%Px@BC z&-dt&9HZ(y624AYlHz4Me7qGi4uZ%ANe;%4A4mLwp%{;RYqvDjtK^w{@@{LgMQJ?J zlE{`IU9UlSvq~kdt=(r>x@>3eK%X5N6JV#2**9H4{)dl0gtQ{cMo&X8pc{(U`sqK{ z|N7`h39IV{RGQCK?_9?4PqvN2oH>PmYU(w@vX|}{=rf2mf-fD&f`Y29>%4B+>W)^I zvPcu6$nV*sfJV+C;$INj_De$Z8XJEXT4yBq=|PVp%o_!nLeL~BOQ|v?b?i5wU&kb0 z6uFaC}(l*uAe{t_~Xj>wDRFS(?S38 z<;&OZ&M6u&U|^Nk5^X$p79QflX`eX|*9u!)z-Kvq-eO~C&zYiqW`1f1wo_cf&cGyV zv`!~!j-o`9&lXN)DLYpktJYZkN? z`gg9nVINdBZ;;?NxI|V;x}kEfsr~WKxAc3qpD7S1#6Trvr8G$7n>YImB`a1K3~&}d z!}C0OzkqNV?pc5ODG(_B@WVB0SkJ(Hf%{B9{P67g^RPkL@(I5GCp_?%svtKhmRDNy z^EdCU7(R36Cy7-HjfW4jl9H10z}-~>s<02?VHL%sbAsY<-XQ6xC4_+k&%F3zP0jMt zaEHAx-_Z^cpRJHw#pqf0(PWG8(PlOv_uIHbkN)a45gZ0kQd2M|79Axc45R?|N2Qn; zg2zF>-?hBLYcr?h?ODm{YAa5-1a6UD?mv(EkxzHh^F2ro0uU~T?m| z?;n302yFd0`{RB+k?qV_;1x}C*vNxX&rp*}vn4gxRgqia_F8L? zontFj{Dv{Rq_rc-N+L(i1+Kx2O+ESBiqy(Db85}GK;T%7>o+_IYKcrn1pAc6TBol$ z)d?^g%rXEFnZDOtap0_<1XF2jtPRT&8Hmv!6xgdm&W=jHLdS<@B?yaMdD0>xW%0+f z(oQi55s?J#HEzp}F>lK@P3_$^Hy0D4g0GaXS4LM~z z{d_i^ZX#avE}#aV@S32$#2;TX{zyvC>auR`73oo-NKi`XQk>8wf5XABG74>quDi$% z{&QYNKG99YM`_Q(96}nc;>}pn?9{}{cynUv|NLE8c2HeH=IxVKlF%sBJZLKs7VZ`n zPSPh5bsD{~(!eW%7VcBY!ozAOWh%V`o{4;xFLzejOwN#NT2E z6I~UtCg~7#o$SS!D_iP;KuRDOAqH_BCA|)L1Yj2rsWfQPJGgMBH5~N9>f4jYQFrd# ze;U>k+gQ7aw8Ed4ml=(x1vb!sns%d4=!)yEjAdpBOD2Pso2~%57WmREshf7x96NgS zXe0Imo6h|7`s+W5!d2nrhngyrwT9!hM^0a062*q~si~*-u3EKM_7IFH0;-}~Q!Nax zqQaHi)@w4S)UlNzU2i!)Ks>2%?fw|L=e3wqh_n_|XrMz-5u&R3b<6vqYvjDljMbQ- z@f&k!yf9bKg^^RhatAtpGyn9$frBegU&iVvwL$2<7Xya7bi2)=R&0yUR;X?=nF@@? z&1xY=425i+k9EQ*nicxkcY0g+g4h^vlAJSn3=%N8JtzqjnA~2>m@%brcSIg*pPVe{ zxs)#sdS+US!dPOmkNf=?$e={u?N_e!DVr)P^j_ujCf&YWG=~HIBF!fpunW^hU=qPv zh8SVhX2fgK8JFa%h-~x}5EuEm*H*FXW4}Mp1gBCFRfmbD)A)*aw5rdkHOoJQ_&)Yi z^nr*4T_R@#CLvZRq?rA(j(ry!TeI}h&E6;}XC}BIaS+}KIAEj4fVw~h&R(^1ru1JhlnX%zCbl!iu0SjwDZKo>w#^~CS6y^c}()mGd&TdX2(*i%p)j<}1Z=yLR zIume27IS((;2?TRoWzWyc%BSfpK&y&?mOM|QN>3eZ6~{c0a_aIe<~M*qmr;S1uy#R z8xcja2>*H6p-QL8q5zAt2V9hL5GrI#IQr6R&YV5(kB%Xpp*psvCe{V~4*&C?hy4-q zA{r4O2`n-Zlg}J4GZD?Jm{V$e#)wQr%ics=1q+a?c^rObmJZ?nDlUt-C*leC9_0DOaWAH^w&~Emz3tkm z#A#J>tU%=2c#0mSX9XOov4-tOPeNuFX9%pqCsWSmNrHrkk&h!u!V{)U5nsadCLU}E z1THk39&Oxo8lGS3fe!(_sqVnOeI;xk3nC}9@c%Au=8)VY;^uDRK(n}M3(je&+nC?2 zu0(<>aQNdfOT-*aV?*p4vMJ`=qQ@NJ&!Y#XP|T@4Krx5=s@Q!#c25=a>Y5-U&Sr`@ zzqE`v#VsNZW^7oM@tV97{rdH*TEKeCIqE+WH3s2HB{k7f6=O+E-L(AxqW#eW+c%~5 z#JcmJO+S75`s=S(RFns9P+bL3XP+@TBj>=8b5+K3M-JpJIL7@T_c4`7~mbrZ+S7Kpfm%4!-n+Z=+R9i zp`#9Kn%mt(!uh(k5&zZgDXew`M^*js(w`f?F9c2~m9Da3murW4_v@FvX33H@N7ujo z_Ijkyu?Z<#51lx1;`G_0M~)mhu*vH(r<7BF+OJtz4YD`gL&K+i_jvmCFii9$0kO0_C zoAfv@JvPmU7(U*GeAuve6>B;qaUX_PH1kE=6ilRU!`zgHOFv$dXVksYRNqvY38~eF zb4Gy#;UtAx;cabBG5MPsPSlYc{b%dy>YG#|P*A+Z@5;_TM~puwaVTRf9q;zjM*RdG z5l&<_la?N@oNHYB=9_ENZK~=>-%?vwSGy(m&9$^dmXg#7P~&QAkMmj~Msy>hvQ@|i zQJEk^k_+Ui+OZp$(P>xBrJL+g{nA$1BNa!rySAik-OJP_z=i7L+u$ zrtv({M{ww$B+URtg_A|Dw&}nT*OE10qSs_UbO^*W`pk{B5tJY*LV}38ydn`USWqYC z^Gu+sQz9$!nKi9@cbC)bhijpgGrX-3IZk#f=RVM%gWX!plO;;H!82t&@y2r#l1$ACUyJWp;WrvrD_IY@%0w1*j=@2nx zNzf^SVy~$=79cxizn(bptEFR2M|)#thmw-meV;IX*mUezQZOfL7A*w}NmVGxfKJ9) zQV;*rW>Zd*4%VOgr_GySPVvVkB^|RI*!=U)r%@fmLr_kW1oUTCcJ5TPygbdkvEg)T z>gk4!0$0e2#b18;sa?!@@?@7T$?dN0g7+j+eQ`hjcxLnJnAH0El$h0ta^b?!>cX;5mogKCm{eDH!SKnl_N9IL{IJAT<#W{6ckQ}*bzB_ha$mi= zYuEaEpSixCb)`F@c|KODZnxPwR{0Et7Pj`RtjAcB@hw|07O`0|X!*g%I_eRmh}NsX zU1>pJGEqmYCMG)%9z1r=za5!t1=G}&ef3REwfju%54Mla&uHJNQ>U1{tA0Fs+V8V8 z9Wuf@CF+tCa}$x-CMKUuK1+N`58`rZLvhvHW zxS}jS(L#wXybhE-$YacJ0YTbCs)!?WEupco(HGU&m{6KpUOuV3JhjwoPe{3NHZ}PW zLsv&EZGsU2QPUnL2Mnqzvu;I+%RGB_-PyC5c|CfRmG$URnip5$YGXZyt`9lW8vXDM zk=hGmQhHSMPy;KQYcJKGWj)l2mHLPinI=)>W$8S3r+^Tu@n2MP?4p_@Tw5-l5*aE< zNg>L?Ax(=f?BjBE8Zl{-ZRbIJux7`BGyX4hpP~C5VWb>Ev!XaLXUfQuNtTmaK3__^ z-cDMo0BGbK{;s%}_=*08lUqIuKB?cM$e<25)G@_yYT2paYK(Xr zL;9O^#)=9Bmk9^(Mc)8PZ18CMiLes@7XdD6V@86BX6ZI$B$}(-ri6@*sq42Nz)vWb ztPv-N5AXkVZK`{NyMO=GAK|zwv3h!?yFXS8e>>JteXP;Pj#tJs9;^Ox&kC%fq{Pw! zs?F}gyk}GY3KxFBC3Ha0M?50)lm}vz*G?Q#ExS*gdH?-i>}AHXGmzKD)I*ilrbAyI z`R1D=sT*}Ig&)8=ncPf=+2O+U!erCV+?d>*r*s~Mv@@iyt>HWD$a41iSy4=Frn^gS zW^GJimA$?`GqBTU>u$5{3S`ySe_5~lG`$b<{)*|0aZmo9{3uiBll=m%cIkaYL;x$Z zs>MeO4-5L>VKIO5wvVT!RhfVLt%&`c9d}%Z3XNtwHPxr4rp`*GyT@a**Rn$WE_^(G zFQY^yrf2wUY3}Tl__(;dyePFQVb`v$n>KA)n&@`BTeWM~?utXZcInT&jc2SFP=8fh zn;mOWs;*QlvD_RJhb_j;W5a=yS=ts zw+Ehj8{1P4bZc)&!-mDND+?{!&nIhZ51(i_awfC!|IvrqZLSiP5PE(KegSPV2Q}rmg&*`ul$6v@uu&qo_QXvDU3b#wCnI z*Ug|pQdA>#pre6eo0}43GhQRc#<=<5vAV;DMe2-%+45PnrDMnAGzW92$!9r~l9J>| zzn~hb;tlGBtK`H2yQ*o^rl!_X_vV6IN=kycDtFK7CTu)9Ve4;4P8>fD;=f#<)~;vI zo=cV-IkI)@FYDKDa`g`U2?N?ufj^mZawv7GD5&y9nd~V|O@WyDeTPn*uX12+aP8W? z8&+Z4u$K+Z%WK5_Dd3?OXR!l*IJuo5&zSyI_b?!sJQ z#Y%49wr$VJ?MF`G$NKJf-`&{ceplii$^gi95_`yi=ugaJC!|E#b8_raxq+=)1IP;# zzx(;OO^2~<`t7^#;^Pmme&v!Rl#wxgLG>+9O?>)sn88w{AUS%m2;qsxt4}7azZG-|PEyy(KF#A35@E zmVbBmB!v0iy{Gr?t;5qP1)1dfsMIMhF#ZecNR(CkTx_9r69kH>o2?={eOQJyCdZ4&fm3ll7 z2wE%Xrx!OT`gFX+wVU;7c72xp61>JdEeyCSvUM9aBzRZB%?0|s);PDfP6}YG)~%2? z)z^3Fnw#0W%3f9V*KfXE{o@Zm{J8qtZ~t0_O-e#Q=0V7jki;E-@DAue#tW}{i46R5 zF+-@^Sx65_fz0@v^asn{X_<#xkDosS2hltgm-zf&j4DLVhW8q!HdAa8NI{>GKmC_E v8+7guja2@d_33=b>_2%sfb_reci%O@-9PXqjNXbkqh4|)9(^F9Q1Sl&CVCBu diff --git a/src/PdfEditorApp/Assets/Fonts/Oswald.ttf b/src/PdfEditorApp/Assets/Fonts/Oswald.ttf deleted file mode 100644 index d1a3b9cb1325bf20b3a06ef9849d21c411212a3b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172088 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 DD2WNO diff --git a/src/PdfEditorApp/Assets/Fonts/PlayfairDisplay.ttf b/src/PdfEditorApp/Assets/Fonts/PlayfairDisplay.ttf deleted file mode 100644 index 4ee80fdecc384568f6f020cd18b00fd92f906eb8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 123240 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 diff --git a/src/PdfEditorApp/Assets/Fonts/Roboto.ttf b/src/PdfEditorApp/Assets/Fonts/Roboto.ttf deleted file mode 100644 index 5522a368d9072fd88c299916e61fcff369949061..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 488584 zcmb4r2S8KD|M=Y-340F#B?%EwS+bWxWFsP5*?TI>h&XU7sBw#fAtHzi2LTtLqS)4I zhqh{`wboXAY>gI zm*nQLXH9PdLikIVH8&}FTJn7BnO70@XgpkhlvkT4jaV*W5%oD-qA3LxdDV9J?&ct5 z375P>1+_K8z~3B}AvBrvD~qd3Dvq#gJrEjq1R=wQVz}S-34bBnKLytCD#@E)jkJ&z zz$=9DdL`wHi(P9Hsu2pzMY#TH35^+h#eHd~YyB8UYvU4HbO3d5Oo6)TGRA<^^xYwa}1~a z2ia(map>jmja^CoXmdRM)LQY5w!7ARxYR}zX@x(yk6*6TgQn?Et(DWEU)}!v$hwj- za6F34Q7z)bokqwFwZN*M8!kXJ^fJs^ybZB1s)hB0DFy19ej62&Wk#1m=o3V#;*l@| z8iizm$hf#jBtb}};2|YK#rzfuI&eGbV**$?R6@XN6X31+!y_<16v_y7P}|T3<{Pw- zS%E6qk5C!&6cyuQR7zb$4b*kyNK4UJMuukMMl_D{K@QYdw2h8MrZ9d!lw(k`q2xgE zhSCD19?DE8^Pm*s?@>MOMH3lg6vY&xCdLh|qpzVDz8k7w{m?jO1RZ6)(IQrYjxw8| zl*9FWw1ho_j#4h@95V-bvn;g7p`$!97TVcWXd$b|)s@V*(03UnFjtWWI~i?a$Dnb1 zD>Rj5PyllS88WY<*^~e^($Q!l)H-x3lF)k*LoG)BOggGymZMF~WR%6M0UUx*7Ih6x zg|~NPUcILL8qZ2UNp+2 zcLL1AsEDaVD|pkP{TSLxDbN}w66I0fp%5s+)M`}6Y(TB_*C>p#L_2|}HPBv1cR{&~ zN`Rj!JZ}`w^GDV6YbcDrMD+s`j?xJIm_c-yxq>$FuAn%k7cFOYph%c2li7=QG1pKI z+lp-QGqjhfL9IZ0F*ON^*^Q_Z#_ZsCpfY|K%7gVf*mWqI8dQD8u0X|1Bg$mA0X=_0 z8z@F~n(;#g^vkH5-h#Fe`02T5HK8eW5-p~jkOzGg)lnlryL7Yyp^?J~DJr3sL7fG) zBh-GB0qSS;kd)xZ%tw7}7ZS2kz%3Yg0L+Vketl3!u;KTVc&6^b%8r9Ox$i^D7{mqprm2E+}ygg_M z(+MS1^&u|`#qbbvVvA6n)(+&MbrALO)}SEvG?KHr=m3vFp8QZ`1M(P8;9|ScWL68s z@?20d`yuLKm!LiTbx6*?jO08MWXyXEV_0+m=G)14MCU+u)0qmC4|Lo|X9C^tAXlCU zSujQ@mDz{dm?S9sku&=p+Q+oPIkeFqpb6{^z;6hy(@`mJF>2$r13teZTb>V$ONBBM z74p_YT?q6jReb^1B|Ok=-b1)&gGxc>;cKJ4JZH3unXS6ZcSil}@1V=K(FBk;L%tq* zji-k$@@}C<_EWS+n?>jNZ-Z=%NAdJsG=uO1bT<=dV8JlRjk^X};$xU|JX$_FH|v3F znJ9o&iNIft6hi@DpeTX@_Wh|f6epfG@beph3*caFK(}QePlc$H-VQk3g+3n0UnjER z^+l0c|wJ4ZX!F?Y9PB+0uoJKpe+=1Rdqa8rEc|g-jpmP8- z2~Fa=ATKrx3D^s053?JUvei(}MQfqnz?+PMnIY9ZZtir{$|})h<~yMMDOeNa1^9QA zc>-$?yA*`>5j|jzpi(Gv049Hs_W-c>0gMDq0$$AK?Lz6iN5F^K$cJ@C?#y(Q#Au<# z{3|G&SBrxA&rmn76K#XBwTvw)W>2E=tO(?~2<_ofu=Y=|wiD=(2vsv?2x(0O>#nJ( z0kGvdVAH|Nfz3q}cr)Ayh1mPI)kdH40^1D*>})457;N|o!bhg;BO+=RwM9Y@_k zWzDkJbou~{{SGBS@qv;FWfqh` zC~;7x(|#zP`b}N%4=5Q*Je`M@Kp(lM4vN~2{eRrgfX(F1LIU1)bXcnv`1=^noj^vw z2Z4?W7%_4JnVIv z@UsVSZbV1GCIrLy0!m-i!>k6oK>U_5_ysq#7I@}N%|K_sZ&pzZ_>G^Sy$T7Ljc6+G zj=F$Pn#yZM5H|szyikUgH%A+SE5SJd^m!JPJSZWIA=oP;&^sfL2_vw@>e38#0pJqF zI3WWj8FbYg`b&`+vkWa@9KmJ@Q5eXOjJW{tXMsPtfO477&_ic) z><{7kI4Y#yfSTOrh1}^5WI*@8HJOv#3pKp~1u-|_zVDHQEkSv#CBXO-ss(@S$Sg&9 z{17yOACES&HL(5-xHlcn?ZHOr0^KD5>l0|33A`8vyCDRBF%hok04)*#uH!Iv9MWcg zfVMa&OTm^dgnAu{XH1YT*j53v82q;m6km}2mjI?5!2Jl|o)7E8JWw{WFCz+kdN#Kn zft%p+5QS>l!Cc4C1fXv)lz*1TJ>WynpmzFm7#jfVy^IRk8DN9QgHD@)ZJP?UA!=k+ za_|wqu@QWU8CJqQ2hnPaP5%zGP|Mh4B4=Fu2=O4BjqFJQI$;unQTtRs zleq3*3&eU{oJV3kO`%*=_aWBnh5BnK?>vw3NSya#A@SV{g^TY<4EJw^#B~Ix7Yfki zWuVD!sBc0Ud>+q{nC`^_u^fr#Mhh3qK|DwBBJ2IFCV0VmB$oZh8sb~l3SvxxGlA#7 z)FcKby!h7|;$YC(%|NfSfJZCTZ$jM%^%JPy26|fJA5~AG?uHoV9Q_g60{Y`kWP^*R zA*KaA?8HBUyn_#edKRgv_2Ab@eFNPF5fnpdlV7Il+rHiHk`b%;7>} z;FYS2Tp@NA^#5NA*hFGWUM%=4)djG*TcCawN*~b`PH%|ryjX}Gf3Xld|KeIOH?g_T z3)rL=*BL!0cKuHUY(1>o2&Eg!b%2G1vW^B{!1;tTXbtfXqlJTy!1z}M z96$bI2S;^i)UI*yFywy>l+pX1&rNbR0>fxc@=;<-M)Qc#8uB8NyAZk)I{dAMdnF4$J{jsR;B~`a?dJ>E z5Pz$#yl}0i(I~A(^X>mu|J81813L=&`DmX0Z}q5b{jKf*8xC^K<((S(6P+RQJDM{Q zzr?btJETA#O=qeUKtEk(g6j6DJQ2O1VUL8<)pBIQgPcSY$NaIE)QFlP-miyPr4Z_M z&wb&jUsCfZ0BBA2ZYF}h>f&e0?=>{@1m81@I;-Mh2JjtD%wd%u*>58H$L%)}c_I5w zq}KS;QQtUPYkXtFbA1|Jo5Urc=bSF9echVpzD?u1xL9Qj8b@pn7o`h<#PL zh_m~4s&-bWI#1cFE;CnE_n8t^3Zqc{%Jo6~M(jOjLpl2nF+IfhB-Vd!w@D5_Y_cX_ z;Cv69bAE!v`Cz|EEe%(Bc6K^qIjcJ176)8_avm1Li+0W{p@=TWlL_TW`D1_6OUa zY=0NT3blp0LSv!1&{k+CbQDe&dI|%CQ-oo{YT*`Pm#|xST-Yld6kZe#i&&AV$UTNc`+z+tss{VDfc+M_ zkv>58(u4GC^xJ?vVjP&sOav3p6fo7y5@tQKpXp}$nDfj{=6&W<<`*NT?$;5}FDvg+ie{VDBOH*I-{GJRm$IJO{ z*kiyR1NI|;JxGJ<7u7@jv+4@|QZ)=a9(SR<3*{D+x1f+`2Unq7Q(36^DpvWM@-f*d zfrl4G$}k+Pcwh0J;=1Cr;)vp~qEpePfW1d#4NolKPXXgpPe+s^&p^}$p@1xsJ<5>| zD9uo|Lw^{QX>gtmPY0Bbh8|UYdizn!Bl=O(qvi+mAJja6{jCQT56U0Rd656vD-Y5? zyZ9jCfx`nawCY3AdVn9GhjTv}_~iH}-Ji7I-}%YTPfG8<^6~Ne1NZyy_ufBwzw>^> z{i^%r_ctPRKg0Bvt_km5>SO#Vrw0VcKmOo}5Bdc#6+#Jkp%DFe;SVpx4KG~&=@i4R z9Nf7SH^EV^?!xdS1)dWi$`499lsQm#L+OM9l%;^$)YpHS=J^Hn{`1opPAD=Xl>hw? z_SXOON3~LWsWxgK)lTh4tEfHHG3q#Vf;vg{P;$u9*HFDwA9ad44Y~eWR8O6y&Qbl; z05wRRM-6Blbrtme8p!->)az(H>{P!&y-D4mZc=X{8DO>%ZGyOQGo=E3z%&Iq!NBe{ zOY>+xtp)m_L+jFdXe;cX>C*;aD~xDk+JrVmus=zg(dM)TZAp)ztxzM{Nl&0B($2IC z?Mk~*%~T83L0zCD=_opyo=!W^j`Sqj2{g8c?nH9XwJyl}d%=?)r%%u)(J8uzmZQ_4 zfqm!>2qiR4buH!n+ECg^ac7NJw#tZFVn;H74!;y87$zd=o-3? zUPG^=H|Uqpo9G6EAcDF@zlLtpuhVbPZ^E9~9rO-*mwt=E@Qmp_`WAYhzD?gjAHc4} zhv+W)h<+FR#69{w`hEHX`a}9I{Skc+eT?qYAJg~I*XS{Ng1!OI_AOZ2@978V2lONQ z3H?leivB}?20Jpp(2vls^ydske}O6bOE9fp(O=V#=_i=MEauVQFf{!w=3_0a&9pHL z!(vN323uikhR5(3ZAJ_1)m0Mm+R;8>=aX<>{QW5xu}#Bn$tC*VZz2FW;u*~RR}v+!)3 z%8X;iGPaC>5i%mi4yWOCW)IWE_%ePt183qaoXvDG2XPML&m6*4xEim1nC6XQd=3CB(gt4wLyL4=oKdfiE}ZJR zIAb|4RLhRbrfyPzfcPgm-GKQbfNr#X{Tp~^o znXIrE(e^Nn#HJT>Cv51(G{7WHEYEimi^Qo#FjcP>(i0`;hQgWN=ouD9!V1EEBa{!N zV79m)YtGVB<-*+Jv?v&jD0?~gN$N-5;zjE7T)D77D3tT;#rg56GLanTifuI4iK##_ zoM$5wiABP+w0_m_STb5Hg1IOZ(ksU66M7|heNuWVEGieSPfqQlFcq2`lGZyO`cnIa zNG{=8Dbh+B$q*sAKrt9N(?@A><8AsSNWPNmWw-|Jx&W}?+SG#vBw*7E`YCmr5jU>a zfh+_)6!b9a9tqb2Z49(&soPenM^Dg<)`A`*(ldZ43{M>i%<4a&5-?Jt!%DOy+7dlV zp8{TxraovH1aGR1(J4Kwk8OHkPQU<~`|-+NZHWy)3p1&k2JuQ5N!nIEZv)85uootR zCDn+h{DDDAdg>`Xc<^Au9brTW`Ezj&@1gl=0#~~VJ^-@x`e6XA{%j9ubG*wIvl1E_vY~&a-C$Uaw23zw8TaMAgHu` zbb&Y`my7^Kflo9v70eRm%JXxb;8bW7A%kvVK^_^6EP5&0z85q0I0yv+rFeRB9dS{J zTvr_OyeAk1t9y8)hc6D1V+%E%!^PpkF=es>aX!eLBtEsorZ_DR=9Wvud2&V^V$;i@ z5YVSF7?23>MKhfMn;4L~IH&jwP)mZoP$ml#_DUFsyn;M(9VP-zmub4hVPQl~NACz1 z%H)!~f?OC8p2iJ!aRv}%;o>}DA(#t57ig6vhST(PvPyD#s!Xp?Tqp*bN+hy8K-)%G zkY*!GE8u7h-~edI#hLxX9%;-GMYP_&pcoFI2>H3LGdZmH9%M&`2C0CI?Q= zBB3`jSI*i;%2yWT0Ult5K=zeE3&Qsu}-CKJo#7(ld-fWa`mgPi9OO)B_QJBjm(fQe*1VO|k; zZv=qLQHQ{16D}5|!4S%x(47zt>_a{|6v#jtoS5#q7-(Li1ah@K6(TPUZ%d2vQVeSb8$)kf2z zxeZ!4OH2GDcoH=Tx@vgUi}J|)ay{;&Z7ofI;2OC+LjM$(;kx>U#hr09TCw zoWoMYvyl&nNUr9Bu?Mole4H~R2oTOo@<8kJ#5Vn^%kkiWbKxpioR&tGhYyGyxr3Wp zrkmdiOdUu1wbh(&y`V?Y5gXhM0C z6Sxfyw{_ed4j|&hIuNPE5n>bpGNd^{7D$f7QIPwHqY$W;I7&{zw%${733DGT{BP_`Pob%!4c2{7!4obZ7nfP$*HUjLo^FCO1@Cd zQcx?P3mNdde<4^xLM=5VwMd`rc_$$xcQc_js3v!;b<%?Q{(hHC>wjAeM1kX`T$=-g zSR)550@%MV1sf!ULDR_sP*G|$rV~_HAT;Q-OjeKwF;$iU(NH}HV`w)4ocsYbe+_Ox zo27tvJXsxJ0ED^A2(gA&8 zK2FXx-JD{O$;f>Rozmbef|Ohs6+wzdlXNv&s`nSGubE!WQ|&)@il0wL9KHDYjO3~p z>p}R-*s!pogU|@b6~M910Wg7USwJu5J7@-gL>d8_0Wz7cSnX28#QYCHo`JY<5~YE4 z{&RzT8L(a^)6)Ov9<9HQ*XM2^$`4%De_oSWH0q!eD%TAq@e43eu1)NaEAV&OD@5Et zD!6ds1$W3b0a_YmRXfQsg!VvaxCJO)#Thd)aFlMvoJy;w`)g}*>M~e_Q0f&RhLIdY z%{quku_2`6WKIs6QRS4T4!M>Q*;vh~)M_W8ungj?Pz=!)I7&Ddf;E8AS`M6%lR>~! zmItmG>=3a#X=5OkN+j_x#Qb6-A)bP!s1qTvTH=zx2Qc=jQ*8XxAd~1D)7G@}Rx^-eOGdK`(u^(a|P5)gspXgYp2 zIsnu2jH}7%|LO+k6q*e7svnh#7l{Zh`cbxcF@y`DV!2S52}TiIeLspFneyJ4D*dtUs^{x2gmno7veAY6 zQOQ3pOGFN5kR$iuQ0+(Hjm2s}7zfSTvP@YzB#5GZWJ{LUz(cML#u78m0n|tU0{u`e z_ga>+G)N_=3seb~OjQXM2TBBsrlJkQrl8nUB`9)N2?{5x1O=0i z3GyeG2=ZK2f?U^?f*d!MAlt1`kmaHhWIC$^8BQue`lL4nX_Hif)Jgh+*%MWQSrb%( z6vy#`WJec4l6|%y(OxA;usVYWevu9r><-;0-m-BF4`nob%oZ3Pdz z@#1(@JUW<{!&?DQ?bF;4c0*OLvqWoqX{FF!REky_l_sEaD9VspL460?auNv(doSDM z$xbo-d{ttMTsuBPj@QfWlgJTL964{j9HpdZr1oOGC9Qt*W;8A&M!qd6wGSR9jDs{D z^7e$(UWVS1HopcrAtxs%QqQkhKrYCox`CXjud&k~|6~9rAJPRU@CQfrU4JXA-PW8kfOc#)r#!+XO};GHFS<4*-Uz3QUORs9Fr&EfhnLg*s8jNq+M zG>G=Vzaw|mfG(h8(9(i#qf@9Ee}Z;%S4Xif?3A8F`_U$}3w9Ha!YlrbFscr1gy#q! zbM0;DtY(%j*f;HjdCtPq6?h*BZGn-Us1N4cj+)`A!zna`uVV!_cO+^87}WDOqjs2C zj#i<1n0F_fpMm==Q9LR@i_kK(23ohl_)dW24*D27!1@~ijy7}*Cl+OFEOwC8B=(!QqsxsH|26rJ@t=XK3=({%fF-_>LEob)R6 zTJ(nW9_usuWAxqiXXzK~FVX+hz}ukC;D(`%;dH}3!>^5ujG~Q}8f`OrV(egCZhYCq z%p}UB-Q=bz&(ztp+H|k!`(}*UbhAve17@F^^UQP2k6GwhBw18gs4Sf=yDXoM;f)cG zxiIEUD`aJFm1#9-b;H`g+QmB3y4rf3^()qITYqZ(lMQ2&Y|~+LY3!J>31d%=n=$Uh zxQDiWwwrCg5?Bjd1-XI^f+K>5LU-X_k-aEJ)GYeaF4}It-F@*yah$kW+%JAt{PB1+ z-e!Ev_}cM(1 z6Y3`1o2WZ+!Nj|hoF^4e8lLopQ-D*q(`U}^&UMZ=oRuy?en{DmhVd6KHsnXto)|=mH4gkxAYJ8pYPw~e?5R75D`!pa6Qm5uq5!x6r(9~ zr<|Vh^Hi&;l~Z31qJuJn&IbJuJSli-@aqy+$(Cu%v?bGi4UvYtA37;CH?%2K5tbQ_ z!Vg5~M$|-{i})>aLS#hbyvT;gy-{9K^-&#B7o&cUo)X;={ZjO!>B8w5(<`U1n!b7Z z{^=jb*u>0=*%osk=4{LtGseuAJ)=EVE4C_jb?mO#S7V>f)SoGwSvd31%#Y%x#I?kI z7C$L|YJ7bBy7Y1AHfBYAu&P`pKx;gc5>Tv2uslR}I9h){GEjev| zT3gyc+AC@Aqpgrwp%*sTr9W6&dR?dNV%CG|sfn6lXeT zdS?b@MrOumre)@5&dsdJT$b68c_Q;pmP1xn)|sr~Y^&^??B48WIWal1oU6GwcSY{? zyh*V4bS!T;?^fQIdCL5P{AKy_{Nem31xpG}7n&AI3Z;czh3^+WD#ArJMUF+;MJ+|Y z6sHxRF3Bj#C`~BcQ~E~f_hl|+E6To~qcbOc&b~QU=T4ZLKX=L8%X6QUk1LNVmzAF^ z|FHa*io}W?6<<_ZRpwN#sO+hHt@3G=U6of=M%96;H>!iGH&$P({%oGuRnn&|Z+fU}(WtwKla$wVP{)YQJA-yD(#6-N`uwbXOz_N8Af3s}~+?1SYl z%Tt!`SblH$FDo)v9A44C;)j*Om6ujot*Tnpx$4epX0`8X>FU#KOxJ|2$zHQz%`0oZ zUTeHIZtc#s7uSAS?_D2MA6Xw?pH`n=KexW7{(OUOLsY}ghVRztt&3T=ab4fKXX`E2 z7q4Hq{)-Kv8;UnnZm8X`d_%*AEgN=k*tg-(hLao4ZW!8db;FGfpKSP27A4y(>y{}t zhHl)wQMoB>Q`4p=o4q&h-Tc+&AGTy|S-0iRR{qw^tsA$#2LHFV*=#G^*0t^Wc6R%i z?M~Z+wkK>a+P--E*6p3!&uqW8{qFYfc2GOacTCtZWk=kO{2dE+tl!bPqi4sJ9q;V; za>q!cVWVB6cVlE@T4P1ys>VHy-HjI;-)j7{@t2)iJFR!R?3}hUX=m}y#XC3dY}?tp z^W~lI?fhz|Vwce_@h+cTQM)pBRqlFu_l(^+yQRD9ckkKVz5C+sw|0NJ`#*cM_So!k z*(2GLw5NE_;ypK-rZmMh6o98qyYu?t} z*?hYB)#lsH_nUugVOy+PTv{Y8Ni8KUbuC+3I$BP&479w_a=+!LR(`8>t8;5`Yhr6* z>%vx9>%P{$)>m5JZ+)^C?KRzNzt?YX%--z1)qB_M-MzPa@6g`2_kOnb*EZcY+cx*M zu(s5;xoykZwzYM(ooTz)_EFpS`}zN)>k z{ZRWr`y1`|+aI_8x}Vx_zJJ30fc-P}=kBlBzjFVk{q6hv_P@OUz5QS9f7W5pVb|f^ z5!I2=QQ5JoV^_zKj`JOFc0B0#xs%sv)j6kgS?AWy&dxKPuXcXW`M6VgApSu9ftmyB z4zwINd0_a!odaJSc-qBwS$0k8^684|%Iqrbs_9zS)!22YYoP0mu1~st>QWsvJ~;lM z&%uy`$p=dhE;-n6u<2m;!HWmqKKSU6*P+NmX@|-WtvIyfP}iYzhh9JQ-l4~bREJFt zI~)!?9C|qBaMIz7!v%-u9-e==?(mw!8xJ=gZasY9@Ug>}4&Off`QhJ>=pC^=;&CM4 zNXU`tM-q>uAE`XD>d4L`hmQ;%xpCyd(V(LdN7IkyADwe_+0kuBn~v^3dgQ45=u1am zKYIJ<-J_o!eSGw%qtCkOZryIvZijByZlCVO-K)AcbhmZOyZgH@ci-v$sQbHP_?X!- z$72D3k$L)@LACEeoalG<)?eXQucN{-- zyzltX@wbmZJpStmof9S}tWVgT@IDcBBK}0diP{sg6Z=jaI&t#E@QFJozC7{$N#^93 zlg=k4CzDPVpImfu)5-lOPoKPY@~xBapM27Tddzwpdjfi9^yK!;?^)N=+SAi>rRUwA zuX}!!^W@fY7kHwUEH9DQ$+yTmh`HG zPCY$sa9VWQ`*hUl%+pn;H=RCm`uyn|ryrdD`3(Pz^%<8l!Do`rl$@zMv-M2pnKNgu zowx;gZ^>-!Tovt9sQpU7!8CCEE(t-I5+V6!0my%1D_2%9{6eC*&scrJ7_xSFz7!x zV=!lM{@}X7*1?{^mj>S(d_1T+Z+hPGeBk-G^BL!>&aXMY=lrqrm(Jfl|Hb)d7Yr_l zE_h#vzL0fc-i7)L%@SFl z$dJ*{_#wZcu%Y;&%%ReunxU0Ln}&7{?H%eGIzDuI=)%y;LvIY-8Tx4G;n0(zpNB>+ z8C?=z^0^d!DdAGurHV@nF0H@Ra;fuD_oco|gO}dC^vH0aOBaVC6nOPvcoRR~meL*vzM!*cx?#=XV{dpYc*|4VYh|O;LP(T`8iZ5cl7^ z;WpVF(_)(T^6~VrFgN3g?Hq8K{$T^2uaCFCzqgMsD}VNwF@Ji(B`CBoyp3vd0RdW0Mq?3Mw4mHFNx+fO6r!NcP?N#2y?!UJy|ATe$lqtFKc8=ADYU}!Pr!G1v4XsXc2`CGf zkda_7!A|#K;>(q8J2}jrNFP1H&eISQ-df zR_dWoDC_aEhtbO(p2qM$+1*r)jD>}{8hQr@UxE#R-rF0{CFtS*VT>tu#AQ(pnc4MG zk@Z!LP_qkMcK?8K2i-jQM|;E%3`Xs#;~x_qJQO@)6c^(qq+o3uVLaeY#30;%@J zx+Z#hCc4JDC3$)#jl|DPB&~_+YX3}EXiapR=|;xTvCp=IFj7z&RIGZ!`~>d$&;OojRQ@kd}|tz_i*xX^YCypwj^Bj1suIN3^@jZl8y2f$N{|Mvj)IZ zLX057Q)u8mpdk)~BDm$l;PA}kfcOc{Gd-x@j}@=S)P`nsRnBcq_DBm<-j50~4O)?# z+`c^KkVD*5Z5{2HyOrB-OXD`u6Iz{S&j`%(N%MBeEe#mCN_C|+%BD-(5>qxNMO0-v zzvrDh-6FC!GIr~$iwop?g0#nICnU@nT$H(K3Bj|Ju|rBu|Fn8((7mg`M$kD^Z>9Mv z%tMvRZ8&EIjB8L%qIUDbbzJ|LT+zP zcDDyvAsBmmWADtQGNH5ON4qj!4~urr$nzmDv%z;C1(X4G4pswx!8)LJWDUwdIfgpd z)C428frYL`x4@q2oT9bCI6Hwg^?ku4ZwvJE3nV4qZQ3+9SBZqoYpPm9gT;e+wfo51 z7H+{XF-S3OtmtT`a#{KBx8d8r6q*lup$mFp3E%n$`|rdPn6Ofw+7=KS08BFgJLXCQ z%Ywjg+0wMJmn$u{1MxRDv!#jrGrE#RN9QDOnHN84+M=UnDO;=KCJkCThtBp1DGncR z=^8TIJFGa|j-K)Hsb6-7PRiQ-?$(b_{n#j(nAUhlxd7Yb@0t@LaG!I$PWdQ*cSVHA ztEvYuI0nr40N&W;A-yv^MvC=_eFA`h`mDD-^}&F0BW29?KaFDEUVj)~+rtRnb!0pN z7Xh-8=ouO5nX^(_AfU*N;3=Fyw+Talfxr)q`2sUd>^0G81B#Cs&yh%cFE!6GP@0gp zN-|J>r&acHnNv)GpK?i4Q$1yxzoEiEYC%Ly!|b{@7U%UWkgQp~e5x{y$W4yw3H=mS zABzIfB#DL1SX%)I!MJfIo^Eav^`-jy+CW)=#KVo)8REXchX6jDIsGSa#A0)A&XuS+ zK+KHB_>$3h-P*hr!G6`VW-bgJsD8a+?bS-px!nu*?b~>^%qe`?k%FAVE29QNm!+iC zh0fTRO?yt87nv*#m|8uf>TG$|x%Ixw%EKpAg;cJYR=ls$&!=Qh-VAAQ;G&F-1^xsZ zZ=huY$PbA;#z_olKA%TXthSz1mj#0gw$jAkjd(yJAwW@28gpuq@a!SAX-}szfm$(u zziz6ae^7p;$fmE7=mR*^0@CIRXA{Ysj@sJPI4dhteJM++=hV;z=5#a_nTu$RE7jod z=t(>$;T`8$aly`L>an8Fc|u)$(f)Z;{G}%rq_)+?>d5t?7R(GOj<9!#DUZm?q0Tr^ z?;KOsSWXCEdAh1hz9!1OXisrswZH4EB{RZnQ{6p??9>Bf^oxe4{VqdX)!2Baswep&Ppk{2u_O<1-UoCz&Z&$IGd)kudX^V4wV-`o^ z>h>bH#0|&NOHQw!k=J>(cy(PVgZCz2THPn~M-Vs6fOyRg!63_%9Q+T13{J1(G^ptl4B5-)eq$64%E-yULII-x;kN5M8vX$tgwJ;H1t`;s|&ruet%^h)t2DDg=-A(sjE1%#JSLi1x;#e6PRFUGzq)w~Zn_0fE z$UQ)Mv}&2W%4=Lg%dcllThp5^72PjrDfRKpTpB%XNxr{(N_k*X$J)5$O()Vy&u*Mq zc;r@9=)AA)9L|IH#p}VwmowqW0h#;;7PlxzoUF;P=g_2px~PqTj4F*o1DKhIK$(c(C}JyuxGHw6A|^MKO7mNL!jL3=uqZ$ zbiiHf;C3p^!-O3j zYN@$9hyfHyAV%yC?;0~Xx4AsLWSW(hXQL<2bb{xYDcRG;GyI8pd*9!<{GFqV!+Cty zl6`NjOg%HzA>!?>8X{u1y{6c) z``IfSA}5WPx;Q7be}?UjcVW9H$1;=mJyd?8im067I4-C#A}VodvQuzPM?qQNrhLy} zr-HGQ{i+Xwq>Y0F(H1Nhkzai@QDVmM`8xXgJfy3qM`_U%cmyrA1tNaZ-yf)|rYV>- z$n+c`-6cWN%Szig1((0#Ov^RVG`8;Ch7lE~YAN0c!nM-u6 z%#CR2c*JT0ected5AjORy^dNVEXBk_f>BdjH6I^l%w@xsU-zthdv`)Y^ZV-#K3rjV z*M zLjyh~r70fAL2y_c2h~v?mz0y(1PT)|qHr9heH8`N?+SifTN`UiA`-=xwl+!%LPB%% zyFH&Du!DS#($UogS>!~K!w#eas0~!Be(aX&qMf;JftAf!B`c#$l|9ruipLWQqO(q6d|=)Icx5_k{%fn^R>w`3y<9hc z`PGe4Vs{H1u@|s}?!%WU)I*3qi zbYBUuJqLoih?`IE3~V1^P9ikKS~RR-BaHKgDESQ-XG&rgBRxI7wv=q^fb_VLO(GDW z(LiD}+NJd_*WPSsc&m0eZ1Kz)izDz+hX3sMZC6V&FKo@M^_#XzgAL2APVC88i4l*l z%j#+ICS{^#7z89I zX@OdLA$0`<=Sl1w5FL90w4a~H_wYv-6!IO41qW>|v&_NEut%VHIs;Dbc01SZ$b_Vmaj?!5oR!VN#gW6C1PIR}|vmVd@idJ5%ti4JK`2iUH4s zswb=tNUk}^E^x__H`bVz@`%A9S^#rEB2Qe`pQP4=ejZAV#!{?KV#|B=tKMsym9qD} zRrT++CSCF_Zp=#GUgGChwmm(2N0ArJ%j{B)oXyQWiy3&5fa!C&x#yG$70OWZ=s*U#HDZQ7=J z$|J*+)xn3gwGXMlwy2efF>4cu36@@8wdraJaH>+J!}0)o8vKPD$s~p5Bn)w)bwE@R z#3Dcgl7d5Qh5uJd&^xhowQ?u^>Q4lDzl9KFM|RrwQXt5VG(wQW%DaoOh`ReflSLz! zuK``)o4l~EXJTWmP3!6D>Y}k$W3;3e+-5EjE@E)hp`nONc)^wN|Lo&Lpb_Rr@uyv% zElk)`=A#Ux@T^i!{j|37!9S1`ncXuak=@>IJLoSkY129PHOXLueI7ir3(4-TPhm#P8Y?s(ay((Lr;#B{`XfIXyM8lrYQYgJnc&f0GR%)8-Ub1oM% z=IMeRsdhb$vevi3L z48=2-doTseF%=#yd;_N}>{A&6yx^UT^so*kH8n9{wAGH3Ge!h%lGuxBQ&TaROJbBT zoYB+-EZUTyyuR_3&%G{){tK zTFNN+#>z&JlK=qZ2Ed?;tR)6~Mh7$Sq<~Ot6eY4VqD_G%geBnvUlz{B*$5YpLM>4?;FzcRvw2c*VlG3QWM(Ofaf{YoQhOI@& z+}t#q3+7;#%|*tP?xjo0^}Ll$zb|Uy_XAE7VK2{L4ND)UU}F*X@>oEE+Mw7kr*fC^ zTz7G*c~O(gsq0#m9S&2 z{17_;L=_Mpd=0;?VFNNUQDW}oZ0l$n5Mb!&t}7j5r6bj54f&k6)a*`p8gpLF-gwk} zh(`?yXqlzC*ulZnl8b~jItRPkkdPi_M&~4&Z2qwhq8}r4Z zo2`_iw|YN`Kk8HY=IRu3)1Xl|z00qBZ&69>oM1h@;5jYD#rx*^4cdm3$3>Jxx#${2 z*JZ@a4Hfdx(_6PF2lLwNI};-th8AWn8d?__x8wEg<_TLXf+r`G`2G;FDsgH#x093w zRR0F3?nwL{?8%w&r3}afx7n=TuLKzf$LjlkW*SsbNOcq|XBS?czvRrqz`%uPmaG`6 zfQD&R(^KY$jvE^~f2~i>)ZBwbvv$8!F{$FE-Lp!1t3%7Dh0cRiGE!C@O5}s=qyF#$ z#q>oCW1$N)<4Z9|FwThpJfMGKc>F|C9`G6FnuK{Y?^FaXjLvrjAH*vOrVG zQ@>F#%|Rzb-ha-{xF;?%=bc*GxFDaR*TEq z%wjiPmQGrGbKCUzt;5o!JqA(hQ@u-f=TC}VR~!%@n&zE51vCikJM}vJs)aGwcG#IQ zGv`V5d02`;-ZZi%5*w>`z18~);B+kkEZi}WvcFO|O`v1$Z5^26{JG*Rb9_NZl9tvU zmT^lDk#5-n+{sg>&_4p+rm%+_1ir&?vc0Y}z?v^L;2BC0PqPM*=s$cOdCtS_avT2- z?3#Y0=H@!TJ=@*$!gfWcu8dSn2&~#y@CWbm+NuKwMB%`@MUiH@E|I0cyKoT`@a*2! z*UH365tWIOkX6}qkn)xPfsqv23?lalXP2yr$1tWWbof#le%6&EmnPl?Z(%yR!wct} zt$}nlVqkMDmeh3Q$FIzoJm`@d5k4=$1@sPr{E-N{>f)wYr|eyG6@k>NDJ5tV1zyWg`jt4hJZHhXXdd`3sC*Ls`ye!8m)DoLcHks%*&UAEB3>FG6kVWe7cQLGO zh%fu$^A%}AEe3XJKn{pk949dz&9k)O2+=&8f}bZ^+LWWOI?sw6q~nwml)o8X z#PR;h<+*r7O({r=U zK4WFJ*MNU%L}F#gIO^h3>|e3JWcIqO$%FnSkyEoJBD!FtjR{cdsTrQRtytkkT}vq@ z3?Ju^*0nOmHD_nB!k@aHQ8aN#_U0+|fxR zC;kBAZ*rFje#jfvBsrbYxv|E&Qb!)=Njc~9hk4TMe#3))wZj3+rM6a?VJpwhlb%}@ z7Pjh)RC;z**nmT9P3(;MGaMab=R+OqKp9&uxV|eXY1j1ymJ67PdKL-w)(8J`fpBAsfehH0e}gd zIm%r6`#-~}_Ct(;6hM9MyRosa=l^2be2ltBssgIpi;G(;Bzn4%infx%_NqXDvmz$5 zZn~MS+w`)C8I_TC%3N0Gt)~uj??0I^AZYv=@I|Fb?vg5qRXKU0nm9Nuz<=xWw6$4q z;Lk0KCPw9`X|LHy=JVBY5(v|2_@xQUiPn<*Fh`!3W8#WbGcS7ENHr6{JI>M*q6z|S z^N-iZXoFr7&wK&a@dit&Yl93tChAHp4Kz}u$?C{UF#nd-X&#S3^u;~N^YNi+@!YxT z+lzes%XVh0?$00aE{cxLaWePGpHY82Ik2iZXY1ACK_IpTQod$g5axxtddHBr_ z!Zs4ofHeT02T_+gFjViw17uX9;@s5%J0F3ir#`lb^azuNG67q*VE(h$ef>KlL>_m}|A`argbjd{{BG!2m*S%9;@T!dokJNiJ0WPU_q0dMhOuXU_TVP{R; znrzPjk$0Rt@zErvBFx^O;$4F@>H-i)G{oRJM(F_pYh~euZW7>=d zJ91cuCnbp>H?cYoj1}}vOpeWful%q&&N&4h8Vnr zM$$l?Z@&LPxer&o`}FC1xLnx|2Co*&6kjVo!n>7osPU8q;f#echL*#;rm!Od`e12c z4msc$p43naLKH4>AQKa6amj$AqdGkC1(aY*=OT8ws+?))K4b25i!cNDRxLj`b*jZS zY&E%FDTSY_e&R?L>31jh{CRH^-?x|@Xua+j>ExLI~?<8R;2ca)tgyAeGna7pfg zq8o{uN(j&7${%sKCKrAFUI}!p)~f?XI_3nORO&-9$-;Th%F z;WlewWa@@!-z0ahSSMN=$F464j0kh{a!(JYW;PW1PM_xC?vo3&*r?otiRv!kT;Y(P2r(AB%^>XJmYIKc;UTDUf9j-249b%x&M`;9!Y5ds}pA z{*tqhy)F8C_QpCWKfyxyjkgC_kpAB@xeSOFOSxE=kL<`h20WI<0t;5Er>{>@+zUP2 zGo#VnTM>DClN3`6@nqmu z=U)yj4+@zZ+=g$pVOp^!`@lqR?WA&NYPsyC()^y9)no9U&HS zL!QVN8Jsb+V#VA`58OkU(cniD`>2KCkJmdeAHrHv9DOah;uliWoSNEPGi{o>4mqB6 z;QhL~_q#GPyGVT?i@EvQ+Sf+zzqaNzx(m*py$@$pZuX&Nk&(*|W#@E}HygTg>K}IJ zYV(Z^H=ez8WBr@TZaC1+|Btk<0FUZQ-=A~uNL-1#PTVH$?n*)k zA+E$oG6@Nu;85HHlpsY4v_)DZ)RGF_-O5_G-fp{<-R*9-vfKVz$lUzjbM8zC6uRv5 ze_9}r$-PIu^XdD&=Z%eTKx>;~T|LmQR~}7Ib{we-et83Ez-jr=>yx*E-I9vSNks z;qv7l@Ya)$@nw^rM)75u^2wXL91^|<8lgZt8sn$HMWaCa=);d_dIt`yIn@mXV`F2& zcVHhor7_@sz|YJV%%w|!M-7(LOPrG}OOqr-=3gBV8e-~ZRFv*C%bXce6;spDW+=k` z*K9F?!uVPCI7(}9XZ$?(bZLL0$Lxn%y3P$I0uj`6;Ddp&tc{Ir>r-6vH?{RVu{bGd z(MjQ}(#~*~!p$Asj}72cPj=T`-#>3GzHu7VWVumHhlBdg>k&33TWWJ;#|5w_Op<`FmaMfy}Z(985;)&$FM{_ z4VY-^kVy;Btt@56)G~13IE*Y)uf+m;{p_#+`lJezT3gUEk<`Q8)0^Yp*!ARr_Cs^# z9BM!C)UMj9)XJcs%G9bF4Pocw?MJGr9(kLcm%fEB5wd$XAuldm_@Xeid$%z4(n7BM z@Zp9h`uh5wXn6Q=V|nVLy#D+}spWrN_r+s%b&q|qZvAKHYHQDZw*Ck)d$qUsRpFZ> zM}%))SF2wqXw>8+ySb-$Gf10_BvfL5In>_X*xC=YQJ3_Lc^GB;4_?xhV#Oq)l~Sj6 zXb#bXWe}-oi8&0wV?~`Esp3ixWOCBhhwP0n@=i$hpBrmon$(!S zcvas1UcQEu`Nz9Ngd3-~#V0PU5^jW61muyPZr5;E|1f2=U5{&e;Ih`-)<__JnkD=A zX8w}Io9zBcBTT7Hq5m9PnYMN7OsZPpan@^#A zZ11V5UZJfS5f7zG3%&8cd!{Q$?s5+-NEE~Z3&awx)Q&%pOvJs%z3P_}=w6h*aVxQE z+))@-mjNzAbA5g1S%-S{^miKYX_|ru6Oir0#4$n{7Hh8w=8L0y%OlGZEsYKIxym(7 zkzQ#wX7+W~;W-((4Gcx)!mls4v=Hx_17Dy+6=cfNJ z%E(xh6_uMC6`h}tx7SMu|2;U7Ma+Z6RYP=_OATlTL@;(p8^Tc4O_e$S{bVQSdz$nm1Dk4j(UF7fKWS*m_L_~D{xlH>BSMzhz~R1T*Hm&cvw9fmuJsb6Y@bx2}EWp>-(+sb^Y-p$l2n!tXuwZ+$*H}SN=fY~Suy+qbM8b-t zT&9YE4ZugK!{|W_%0iRfk~3oR4(G2fp1U?TWm!dcchhiU@#eXCo5~Ltr)K6TvqGgU zj-jpr@nQbyjghLRoQQc5UWFl*$vF!mLl=|;CM1UXsch&hh_TZaZW+Gi>ud4{=Qw)xyC)O}&Ff3H*JNC~M)Q3)HJo~UTcL7J zI&o`VooOG{w2|9$)0>Vn9fL@L)isisT%n~iu`vc?MRJ!d5tTwWKIQt{BOmnkesF}C zb9zhO+_3&lVE%|?57$YS@Hwz8kZ^sdkvnb5o>&o49?QMUAmvH0&ys$jfSg5z$5LW` z#n52bl9M2$2@7Kqq*5tF2(^cjS!-kgM%Ed{)++OR^AtgOf$mw+5eE5lgA1aZJ7xuV zxOrQmJcT=F4w0`h2RV@K!0sbD(Biula815`_#M)K;^9BIc`>W{Ayvz`CwV2#9PME- zyF!~*c(nus1|41wT zsH{A4tt6o?I=U{QB%b~ufmUvn9N?Gmm!XySz=2ngJ)|An22+wbh@^MP9+xP|CsXf% zomENp5?jEFFz!_DLbwuWsG!<^{>8KpVJfXsWhDiM{%g3ZMCv5q#X%`A~%plXSJ{Tq$Jr+n|=YK@)jGmVFR!u15+ zUGot4ipEpsaPxD>NZtAK!p4yinJq0dYj%x{a0^j%#LCT+yup8jTau^-HF{EtMh;pM zh31S>5*r?9hu;nIhJ*c+-{X%rmhleDC%@qBmrs69Px#=}BQhu1Kk=0V^cXT;kWT{- zKvIDNp_LR2oBGlyPg`p7Fi3n++&8qpGfyjbVwVImsjN#v<}_)&o&RbHg@Cj^wR1rf z1;w;q-q9TSynAZh@;nNQ@yw`SnoVIKvVZ<`Ri2}<7hxcYgXi8~BcfyImw&EVaAtKy zAVbHron3>k0FS|J!2vC;#y(Kw3h;5JCMLX{6o!dn1?Z3|x{?0Eae?-+)Y)*4nV^}| zV`J4sJ^F4>&%2|-1WD>#myocoQ}`PL32k0DzHI6E!u>_d(=%5V;{?;{X1m-1cn{=R zJRBnRkaO1~Y6qGG!}~=45e7&0yKcXmxuAY|J+jVE9Zi?nWrm{$co=!OM>^rQiH4(_*H0KM()D+Yl*#w>jo}1ZWeCM9f%K{pBdR(8%OFK z7F``uADJD~`{+XM<7Lkbr_yGR&XYYclOJ&HVLde&?K$4w#Vh6x?g~q>u0ME{v&(Lc z0>gzx=0HVA`PpH?h#cP%H7`7*Aka4@+hs>+Q(E!vhN5M20yW*mJ8ujG48FXhh@=fY z)ibcoC4Xf>eEXK-fRe2p@j31r&EtY0XDhMmLFgU|2g2Si*)Y=8+M4(o8LFdceup&; z&}xfilr@b3bm@Ds!~iRy)CScvDh!;rH)X@0iaA59f76w*@?1;X`Js%oC6CniUT)9u z%<9a}Q5X6uk-|@D$?l~-ujCz{ZDVm?l?W4 zxaFq!gjKICO&qL`P3YQP-gJTJJ-5tB*wsY3u=`n($E1PM>-dU#aF$o?EYbJM(;VH0 zH^R(r=v=EAp%p5oNYX%XVO*twllEkT&PM9~E^Sghk zE@K*;)to^KGjhp~b&8{tB3j{og_(%DyZ~02k>ck#KJ zJ;%v!P{R0fy#{qD9)6lcs>90~LY|Cq!vUQurpji@3m z(%Hm3)ifZ%l|ca$)i+;IBMm-@c3p+RLAfG$ZURQV3-yR^S$)nA`qISF%2e%*`t(*~`Xy zqeiANfN2VEbe-yrF*O=hn9M!${#p{U_WdJsZ@#0Gju}|~ddx}!+wLbxmXxDk#}eJS zS@8hq#Lu=fGz?X!HLCmX8rDo3~=-d`dQZ4b9p!;Z`JAfJ*T=N zC;!UTMfT21XwLQVE>Pz!+#8k?di`cc>WWLfeNU}ONm=ovTK(jT)a#x(Jp~0lIi8-m zy#@I_IUZKGjd9kh3++qy+vlvfZH$uwSB8{x-ZK=tSbC=w_wJ;m?wJ*L0_HRcw}xSY zOs>oT1F>jPOjk@pfk@@p?EP(CnO?T$flhHHehdR-q`yrj535e4v11L;;TFgzv0g1x z398K!dw0b1TCbS;nA5B2X5}`+%u@koiG5g7<{5BMIAeSMGEyK-oLu8ycUavp(iR!f zb7A@F3vt1=?Wg;We1E#U`s91Fs-F0MWcgnA>f=i?%J#n0Q`7s>-m+-N?PeiftxpS6 zhiVQ9Q%^Tb$keAo9``KfiTi+(X}7tRQm%G!cXxImYC{tf0|l%9Vc)6fioZcM0(N=V z5jXdUP-(NB)9Yfz)xBDz}x2r<5(D09RY%d%*EA&*{lrFKK|QjN#|5MfYH z=AXD%=pts|0u%tM-rjKaamT&cv>$`@M7~%Y`Gfc}Qm?)7TNdZ#*i1(KcW>t6!XxGV z@tvB}GsOPBKogEeCvqpmd~~$P(8vrBI$LpShZ$=PNxeN@FP*OUj-YB^8%WEBMoX{m zZ|MyXI_`vP%ek%N4I9$dn%)bw%~O1U%uKoyZ#O~RmhLtn`M9S}?QUWM?+?4Jg~Q)5 z2HFARaWBk(boI8FZL2B^EretD0uM-ccJ0Yk2i8qqzCVh9Og#m}SPQJaIkH9+E=EMa z9y51$oq@;4?vQp^_^uh!4L#5Z{KJ>hVrW^ct@*53KtCD+{iub5XjAGe&Viq(WRVY3 z2Vz`=NLi~6K!qY<`f~LtrZ0Ir&Cy78MSOFvuQFeq*R?M!Cu~ew%(UUa4TL648;;mz zuPlsj-&!0{ytN~NX+wMl=~5Pbn8hht`PaKLQ2yG@Coc+N3ojNM5#ce!AB6k z{ris!>YK8uvu6#2e-R4(i!OY}AZ6WZQI+ zr(!xA!%3D%FLO$H3GjJ#s2kZxhs_PeSF<11Mlm#unVFbg5>uZre>wZDF-4_Hp}%CS zVr!z8md92{^j8FAWdsFhWzm_1358@g^p_Q$u4g*TPzcOf^+KpCR!OvI8mdA`c&>k8 zn1{bxxT%R2Xu^glLq^=O_8<$CCDG2vyymXS%3wq(OXXzqm-vGob6)bJQTznB#<4e|adv57u@ zv9iAz<}8eN@^VTJmgjUQ;foabX0_7a@d4O#>QS0JMP$S9(y>vDu?SgTH+1ik!7qL* z{6|PSd*eOn??|xld-{v!TZV*o^48Q-+6tYi{;(CT$gs7rnXyeX*LkQlE2F6?Bdc|; z%F{hG)ZJ6{@0^;NoSe$a9QV)=53jH=37I@CeNV_@UhZ93dCmHX(P^wa(JYj{H)X2* z+;py*f^#$rZzrp9A=yLtTp`w0AvrmT+OdRas_};1@_uAL%r4L3B*VZ(uz}OS*MnBx z>EVo`hZpoEnjhB@RkE{vP`tYWzKOCfR{GuuZ|Y)iiKJtPxRw^#RAQQsioiYYvh~o6^-a7Da*%+X$CmPXhBRxPv0o*L&Hd25heEHE3rEoaTB^k(8p+O zWF+Hg^+$AG821LUk3dI7sfdy$N;%DEH@KE1vHS&TVjKcwz#m1zWy z*%OHjtqyuD-5$&(V{MpIJx$h>Q=Jz7rK8{~Ktd|G-irW<_OA3od zrPJNBqPfA=vZ$SmYr@1HSPQnr7)K_?k**zwnFQDv6IyLUKe`cxZ=f+0+e{@>{2e(A z?1dOV(KaIzp^~Og7Vv8(>$oA!EB)jX!KHt6bW~&2m@J8C z7rbYdl@&UQ^wciS&IX1)H0phw$rJk>?_p6}I4bxepNU)wo(vIy;Q{ZRAuMR5%7;C& z`ppBgcM)>tv7tX4DBB@S3g=I*Ia?M|yS?^_p|f*>>vj>Vi3>$Lf4$`Rk6Vg%|7z*+ z|J!_|?)<>K?JZID=Lajcw?sNWC>pK9{3Uu#K$w7YCN~#}Lx4x`&T}_yOad%qh<#oBmdtP0>;`Kcx zIcuM6Pwgu76W%4C-nvNs$-ULT=+csege8|2^$*|JT57!2cq7UY=#J5r!WDJte)@*-EqfZ94tGXhcTMZa%UO^WY-SXg z)1H&xk?zWcA2zaaGBYq&*to>I2Iq!5kngRA-#j!YXx`BA`qIVEZ_F;(^85y?g7qyi z@vUpKQga^aPDvj)MBbhJDk#>?Sjs(QZRC-+WDe&;t?DshSXzi3aYP50bFxW<#9OI! zbPRFgEyaGMBrW2Rc~aU&Rwfd#v(%pw%fcR(x^E$t)BPirU&spF5>B>z^NR}>y}q{a zz{!0wp=+(?ea>r;Phzmy@tb%c)~6o& z+ehw%9Z$uRjc55J@=}$vq1sSN=wU(rox-NHD1_s|$j!5YZ*wb(nlA z)JmjqKCC)3P_#0Q1nr(3Qx-HUtTJo+Gu6mauxv%u{tA*(9g^sogCs?Fj)z}iM{2%0 z*Gu~S{B_w5PDjlB+!B0e1%-s#h8}){yH*9uo3D{VNrG%coUl%#x6wXY*4 zL4CAg-os1Much^7&RH1Y5M7z{I+xe!RgmD36yg{;H?(3^sZT)JlKk|xY_CkeyoRWP zMMb^=Wdpe=r3B~sdBlMipK`?v^DjY{`Cx~vlJ%{)03aX4^de1-FtN2F)K$ioXvsqu z+7Y8wGVnYqwglRP?fd--Z$a-x) z(h+q{BU{=pgTftBlIEzV)4CljDkO7eHWH_XdfHXQr^cw1?qH5)BXlfDq6m>#AED`FKrj>XubI!KjB46Lao^5j&`WOj_$VlRtmYHzfHp2R5#&`0aG`BXFX?qVj9mY zC*PG88j;6rgOYu2opn>16EY&zbDBGswJF}%^V-g>%g@2zX3 z@j91#_l6%h!1VMT+YTApg{qn>Y;-U^YtFuM^r2AOESA&YQ9xIV_3;_%S?SD$&QQxN zv(E3zTz+hR|Kp2dBij!(EkLW2Aymt(EVMRtX1F=0w&!OyCOQ$|l0IGa;@Y%1hu$2v zQa`^XKYi7eKH}wxwx*co^#xXQ4-KSe^sGskbivq~g@^dRU~GXvKs)HmSn}pIrlP3z z6!j-Pd9bW^?Ir6hNaVQ0CC_zTi0mq%O_)Wa14S!xNNkBmgNvWFYkJh-cY2bRT#y!4 zonMjGmCU+)E4MFjwF;awJ6v7wROS&Gt#tObH}cr@yDh98nC=j@Z_BYmwvr%881<|D zzCm*X zy=%P_JBoR)KokGXPjy%~UE5K1Xa8E>#`gI5_KoBfu_pse7yNrnj%b&yfy}_1$`AHd z3k}gq(9fiYe{XV-RE;@>z@;(w4XOyv?~0Yi?%Ox{W@N0DnZX)2%lNgO*qI$u|KR@* z&v&LPV5YEx=CNZB7bQmPtif!9%L?68(^d8zW6n{z{<+BR+Wxb6nl=%81P7=;EC(_jkW~q^kDBANzX7567$xAATquep&vC=NfVzTA1Qz zfAb}1raD0>LoXIq#GS6Vn*!_MYQ{7&twq7ETHbe6DB7-WEV=JsFd{Yv2ELIla&@G3TWEBEHJZ5@+8~8`SKgeL3Sqn!3&g?~6R1$wH>{!bcQ1G* zdiz(8be6BL4q5FMUlJT&7H-Rz-1^~#_!8dKRh1JGQWEdBI;47i`P?_CXXc#%r0CQXQ_sq+c=#mIKuhI;Q z`cutj5`GF0Oli05S!fGu^r0h4Fw@s}@#fX`w$=!rX{!~Ywdn#6b+Rp~PpBo*L!?cV z=wwrX(-~HbT2oq);?|DO|H3V!G~6T3#Y^g9X65Z_D*Sr=nJ@g;3%@aO_p&l`m3g?t zxrdeIa_2QA-1%HiFSo?a$aF+1Gx2cNRC3&3G~fJz<4!qyn8>92O^uyPFv2{@jRWL{ zmv~AtXr%8g;~hiuVHjh?K%aVE)bfZ@L>(YF<|?g^&fhIX^gFkuNbYbm zM4I@bXM(p~_?&^F^7U0zl!`-q;{6?rr6rRoFUHU2jUD{seL{-0vQ#)&7GdX|B#j*z zq0&_K*zSc1RGfagMTIG#xN|u3XVP@*r#oedm-tWpM|KGwuLJyd56sZq#lu!6GjaED z)>C_MY7C*_W{2udp+vc6GXi8_!~Tq-AhcskceF*Le8g zsJ!qTr|)Dpi&y(f_32<3Z=SY7f!F;ae;#FOjN}J2=eV0Mn6CQriB*4~9D46=Jo)Lc z=>$0RdMJmUQ*7mu!lk?N_@Kjwg=1PGy&VT`P7~>Edai$0`JvUd;RU;>jSEAGA`UA? zIU0gkh1$(cKgik|H1~RHWN19Ja0HtF5m!yjfAA(qe?&wjO2N~Faf=8(NPrtO&28c< zGC1z0aEq_oTp#WeT@vGICFlO7>EZRr)}!yMlUH6{toe9?)OM^(OkCF?^dUnMb@1DZ zebI+`sei?mS2uEJkwki}|2M1ZjxR|??(D0wbvZd}O6j;SVcfc2A6E%D%#vAA+8 zB)+UIEp@y&qW)kw3OY_!`@hdvrSm6$a+#32-Fs|&3{q`_4Apt0pZ{b#&s?;J#wEm?blz$tdfE2vVT=8G7KYXplqY zP4?z^+WO}B-p)2vSY7Kt=AjPwxPgV8*%4Da3xjztpWy#SMt~9g16I5A~KWua>A(%d2|g>Khgpx8a4@v2suENIgRu$yuiIaAtWKwd-E$wK=_bg zO1_1(J_2oa5zmpqwn0D0ot>qer6tnDv&_v|rWiRKrXDaArXTPuEqe23doOiEDtR|n z^8@VkwYztkWtcVRJH}Vl9a)q_$5Aw#gNz2fZ9*j+lu;HjvD<*&HsM7j)6m@9mFE>W z%HVo5o5cYv!z=_F6Mn=0Vs;WHmUqJ)50sfx^qhGU8H#PHL_SL9e(RFU^F+3vd;WxG zHSamDshn_@dq-!_o)=h=XrGp*(nmr|qv3ds0Gesb(NVVNSJwXd+RnB#lf#bfXZ~{v z>*IjDeI#2c%0EHx!@vlw&GoV95>wMzMxewpF~BZRKc2esVjm0Ren6JRO`$|!#WtOQ z_>5thxLnPTe<5p#h0EWBdEanO#7d1Z!*PU^J#2P!HavA5q9pG&=n~s`lD)>UK zfsSnQ??DzkBHWp75ZhW$7(Q_NKGgn^`K7D-I_}Yx3 z9WO7cxw>cGM9Gf2g$GLfOP7_L;+|fXxG+1TFC(ctyLxY1bi{&#EqQC3V&;U^ZJkfK zze8J(_CN+QmgJ{3Cex?@Q(|(>I?ZJgIR^$Usd%=jT(f*TcH5lx_YpN@dP1WbA18%U ztc^${NOeUBr27A~@2~E=7ii{pT zCK`9DEV>5;@MvDe`)JoUSjB9tC02M7VCSZKT5N?#O9DX<+rG7|G-BH~8X{JGq|sPM z7WU1tO*N1kCY#2j`kH@7_J$l6WaLx+^;>DG+S~vce~{yYvb?0*CKo+v1PW%%v~21n z*{48?Tfr9zlsF_CxfmJwqZ8fVj|a#zcn0noWbfL&)rHJ9)A=b~mYv61aL2!0`S!8O z%42V@{C4GA$L7sD_SVWZS85^_j5Pdv_2pWywKq78$y|USU%mRB!*kf5pjjO0dTCAL zQFUV1%WE3&2WkH49XZRXo)?bEM%cNb*+{T%qJScmg7T9!U5HzOQ;gH=5h2rREZK;~ z)O)0Hnl}1Dl9{nHp&NlZ z;`=93*Eca`8(QDGDC^*d1AOlU67@n%?=W<&z3Hf_J#_7j6XX??Y#@&ppq^00f|kYD zW%}rRGsLS{jYNbHitl1ZkPiOB3*4YlnjOlvT%7;!By-07z(IxJ3Yz4_4evquDdQcHUd?s$Va&dwO#z$1T+H<(+P zN*x_dCD2KxciAJ5vRU0vi<^^QH<2wzKj?!qwpjDY__Vd|2Z8&Dko9u~&e2mV55=2p z#W&mAnHWlJZ4Hg4S4uR5)Pmf{7E{egGVX0Vr2m}YYk&4y?rVA&=^p897-d{Ay62mJ z;k}Xfe&;=2h&|i`UHhLqd^=}-nXkUu&dQl3sdS1~)GRa})1|lJPQ&$Qtl>C?qU-GK zEzQ@Q6Aq7?wjZbC5tCGQ{j}X`wl+Qdl9VS1Yn0W%_AeG4@@b_ z>T%L$Y^*i9+mMe33xY(VZ)9W#^GXY)G$R1wJ(>)py9&+(79BFHj}AgwhjEj^)bhU< zT5CtouK4RH`NM?p_0eNlTNaQE;i@qDI_c!1lwrR;xb>wL4A5d^RoUA7SWPqfop?zD zG&%BQczZDV+#pY}?jbfd?h>MQ7h`QE$#^qO{VPmR)AC?_H|TTXseYYKhOi<>BFA*> z9d!;qZ6v;RRYv*lwot>7tkq9;7WTxw-+rn;L6;=5a4_^*b-AczP4bLvk=(qYFVWT1 zqF~F%C#$N)$gJmjtV})P1()2lPqy8zb=ZZ3IaVI5-CuL4(mG!(cH~>9FRelTk&_@i zk@_MUq&-FG+UJOazpt+k!GEU4W^%Q&landS1v8IN?2m%QW!}Gzs}(`3*n%sXl6&%z z;|`xq!eNfMm-ofGrPil>HAYUgo?MjZQ>f0(7AmVqZb6Gm)lwk*l_Rxj^Oh&abRHxh z>~T*IQ^qMRC#$5ffTQMzR;2sOHDB#h=BQLT%01D5f28L37btPw55e$dV;&-+LC)w5 zb%|35GoLLOA*pg;vX(`@LBfP|55A&&qfXSvb+XmBwsx=teT|iwHiyI90XPNB$AvGz zD?Fm2;5%9}u_Eku5dIa9naN`-yW^^G*?MBQhb)QPJSGGQ7p2W(8sqE8<8&PS_;9=D zexfYxJH3SLy>)}%uF)5KNs=&u(L#{rQZ{a#2N{xVL&sokPTfeLX=W*mEG$7#!Lq>& z?F@0F`2?62{0Fgv2cf#dmDIxG|0J~hnb^MLa9OzVB{@${jPW5ti|~chyTsOBczKXK zLEh#Xh2%#p1#7N{BIS{jJNyV4*FokvNd>ZskE0Iegga!YAL+tzadET4g3yX&Y6wmz zoIIU+yN@5KP14|C%8gfwn1^etLc5Y>?9m+6(=mY%<) zEFgRTqRVMrkaNhtuU{98(LLkETVcDbCjWsS zg&v?!`Coe!+;lw(Xm&=d2T(87K=e|X z0Q{1d%GYVW=bjkTe01GW;Sy1_Fgw=AKf%wz6!In30yIA?8CzSbe1zxS)7p2{(>dY% z%S!P+^t=Ka2>c23s+@8z8S+}nB^tL-z3N5l!XT8TrU8P--6B1g1m|JF^-|;*f9v`W zd^(-Z?O(bTBih+8bc>GF9jr>MOM-c3Oo+8{IXzZky{7Lsn?GDg= z6k|eYVmuEXyh8UltPcLik-*bvM8KX_qxsNbjBmzS6jy;h51J2-D1TA=EVHYiR@QZ= zglP>Rjl{Xk>zo&*jG{lZZyyarn!twEhI45Rww6@j`706g0oN_haW*%ftx7ahs}$-A ziF&TKKZzYw>e13siP6@XHLIjc6pQPrlhqs*aZX}J?i zFKY{H+*Mb!xHME>KeTk9sBlGXlIs{4A?HTN7X=s?1r^3+HYPdUdW!lEg#~@ZAqM&( z#fu8-b~UQ5JH*vx#uo+|83Yz4WH!V(5G=C+EzA`7&+f}69~Uew4~lBpercIi=1@m* zfODvWW~;T*E~W*wnwCqz%HW!!0zs9(bZ*czio!X>o~w5Vbq0vy)|BGtk9E|t92TCJ zuEzQ*5E)a<7~ugJlNeBpFFL$ggA7|0s>P^N8^yf+!(-&T>%$f&x1wNK!ymtOV?%2 zj72WU%N|-JZm3{7V&!Hz@A5+=UU;dpC&JQI)D<#{m6++><2Z=oiosIxKqN8khhxNB zu9MAUH=h-UEDoElz%Jo=c^94}Ltbs#yEmZTJ%&xQtTZQZAMak?g*CX9^nD3~e#aWLW3jJ4&Tu7MG1z+fPCT8p3>EKl>-a3)j+Tta++B9Fd%$x=t*MYyJFc ziv>`;!N1=!|44J*ng-NtCTn7=!a{43FgvO_hVbqg{=KaP7p6?F)r0x>Ubo*HK8E+! z`T5n+_g0Q^H-7e7&WIge>=NG23+(O8zrV+uG3Wcm7591PJzj`;0@K8Qf|?{{XTmPx z<_wy<1$m!D{|*C)_tDtdLsys3`SV&+hpaNqnb3XU^b)$WE-oJLR9{$=c zE~YF*=V7LsTSgZN6pZ;Rk+q5S)5OI4%NJbiM#(b0XLBYaCKjFrk%m+<3g12iW25>| z>)U(s9A_77BC14?A&ONx3ZkG6vQ`o-sS?*hux|UOKd)JG-)kn0jgc{MZ1(nnV-qbA zjBE3{H#jy67}q8^H`U$4pN-QiaEqQ$@rKe*a zr?k3F^(Gr&%oVlLfyLUilSyle{!0d|%WQun!2#tR(7L2H+?b z$@!qDSltQAgw~nZC6Ns0!*tEh$y@0L^WN8KvqGe^scELEe}b#vdM{>PlB-!mZfHK4 z(Z(R3cVDtz?gg}Lauh9#IxO9Bf2vib=o03P-E0+V23Zjk-8u_Mkiz*d4B1yTZ;@vx z&)Rv};55(L63UW&9xT~;lqK6Kt&dv(CE)m92-bL<5Q%&}c2uk)0J~@%6eRIL|}KM}>1laaVSnuOFNmGbtA!m~ssyW9?H_;jQ}`1*$zt zsMac>TI()Xhy3=y0imgUUv1X1>TsyBs@RIafZ5>?LF(1XA7yf=0MZ$wwqlh7o)r?N zJqtQo=5LEtRctalL-)}zS`Q|aWZpxkUgwU%tzqDddku*PzmjB{1DbNV7&|*@S)k2D zV2(~EskOVe1m2qqn$&65`~n{|_ln3;aaeemdCR<5N07+nuzvJpvg=0Zxr8?e_ez(I zBHzPbev}&S$wMQ8R5q$LP@Lpp)EWm^4k!fDY7*e0ubzb)cD(IPv;`$tKpi(Xwc0q- z)N0cd32>8m{&a2k_P_Gp565@znmcz-SHcS}F$F;qyk&06L zzm638p1Zy;qJB+b;hOr$>-ND(-tje2T-;d0xz5}bRjPfC;hBEEnc+^5RiB!zH9}qTPW)lN@2L}T~qBfXz ztEt2?O(4oBloxYZSXvh`mm5269_;*7J++n{AD!_f{hD;{%eqq?ZReWh);CutHAO|V zW^h9g4_MQv%^yt!9B}C$yYz_?+9KxxC^_*x$lNB_vSV@ewOY3<25=}oVXi{Y= zbDlJpUYtNtbH>GBVo|fVjukcMEiJ&!V7Jap@F`G8+wXHh7^`a*?viGTxj>%Y@+mu} z)tSK(&tyxCI4D@I4l;0ag67ndGTq4{**ix4U)3iawRH95cJ42CtI(xG&x$HEw_MFG z8qi!Bdk`(kUttc8ltw2~P|3i?)4YH=Mh$`;Tt+^zkS1HoNvAZ4vu@)0O)QV&9u$o#A9+Njd6!e-U6jeu z3#UN$Rv;PZTM6jh)Mg;dG|;}1x)Ln&z~0A;*Wc0iktyMg=g8AriMjAf**5ab2b#yp z>T8@vgP0bC>Kc-Or?`|xCY{aHBqwpQlmW@gwd zTRm%3d<+Z>Q76z=YLag2V`vO*$oKR4(;edHYd+*R-)kK-b0@gUW5>Ab_gW5qlPEuO z$+PfuKVuf+_85bZrO}Pf4iOC-F9yhz1%-PceZ*GjXQP|BT6Bm0DgtDKg1!tRSk;Vr~?e4j-(aot?eCr-O@&hliz)TyAMe96iymqf`=|%+R6H zk?H=M?!0Eo0>h%EY4FBaF)hI&e;qF;DVykjcZB@qz`Oku$*UU$=iNK`i<2LdeDd7; znyID22{Pfn1ZC4J<3xSzh4S(jjtSd{df~FLfs@iiRPwRalb86y$)B=t4`=n{zj-iN z$!PsXmM4v4It^ABl`G`IpwqluJv}Xb*&Lj_aC3x@&mBUj8$Xo*H)LIrZelZ_8CY=! zGp2z1K*e$^l6LLC+Du|MztS-l(^nzfsOXE~%`}Cmz-IhTSk&`xlH=4P^m8#|Cyq^& zmroo!aiVvHO0}Yw-+$nMW{k_!baA^im$SLuf}!SVE(6~8RUi>SwSdVf7$Qu`v}1g- zvzxoSX8@;G`ujVCn3y;?K%8X|W2@j`(4vdmF;i6NgxHZ5H79d2up7F0{o>9@znSc| zo8W$j{n<}GJ@9VdINcwoT{HGaSaN%RCisB;`?=m6WMcDYT zZk5DjXD@dTkHA2MPe6b}sCKS2tzs1tqOUI(b;sRv6*o|Oe#O~7=q^hCJn399#+`W3 zz2vG8qkKe9&8-^`xUamVSjgnhD%L|TlO;J4|KwS=#zx7>68`}GjI^}W?3Cdw8+Z>% zVIOImdXrd~#rTHA3p(M}%qXs-fAe<5l~pEe09|GTpR6iGLG2!vy4K#cBy7R?;VjhC zdv*II3qgWIWJ*x2`Smz8kn&#-zQ+sijuAUtReW8 z>;f)xtIAtdAK8b3drD`r=0~x_-W8n`7LgNVvfRF6MR7%Mq)$#`YRBFU9_Cz~7F8KtC10@HFb(^H4DZK1ryX@`Z;TbW@Hu!|@l>I%x*HWy6j zf1C6w5?FI&QA+aQsg|8v>jop8ajAvy$1OX1FDyw)88})KT9Q6J>wPW0an&jA-npGw zThYgdHt1W@Sij=F?AV4}-#(x05Z5SQTj7{zW=m@RVqE=t$F%JN6TJKq{bosP&z?0z zg22jm@|%o8zqrryt+EskHo|#yCAfCch#aF-UIN zAbUwmw?^+JoWZV+}&*9>Au)o-EsZrx(%%i&74g-PV~fJE|eW19Da`# z;u?A{kcFXJyV9XusWg;Ww*yX^ONIp0bt$n62I#wt4m%c9hdD*qS;=fnXZgAt3U4j_!#BChgta7|bE#+#)idA2 z%dCB!Cc(F_;e?l%57j!=C%q|;(CW!3_;6+%r&RLxyjr19spPEe`Z^T;@?d{k`sWJT zi~|+V^x%Uvx>|$Enmc@lKrs=!7sp0~u#&94`D6jS&y zwuQElK$pQKqP_(Hy3QN{P?w=$<#I2^_B|cB!m4Rg{U98QjFd%Ct$6#Nw81PwL<&@v zIr#X^-PlzVs7f3jS{UEnu|gQhck>tx$rK(>sEyLbxYI#z`&HfKaoZe{;w?)H@=|!gFD#cbKx>W z6Uu0K9Nl|X&Bc!Vx_NXo248A!sL%FB)99FffX2+8K<;y~^rs*ND-k1~m3_xG}Qvc zP#b`5pu#B1Ab^ZEZdM+O8Pat-FLIx3NvQA&?@xrwj~Y%((EZaU@{!KY6&?Re>Vy|F zC$fudJ~85a3}?iS1aboZzw@Cvl?gf@UU>3R#e*bQWEq{ELtFl*1Pdn_5Z2<( z&X*-_h(l0au(mMf)m{>bC!yOywH&+U97kU42BbiK@Um0oziEXP@jVBh>%6()(=*ir@9)Fi=GjA!)=w60Su`hD zGs%Je4RyxVtnNTPY>dLn+(@AY6N5XUi+RT=Xk~%ftvgzzkVK=yNT7Zbx}JK`7G`41>eE*DF54HVJS(|&(aFZsX7^;5Q=AE)cSZ2M8ra;+JozBY?fTCG? zMakGNkW?smpWhO<4B^8okA5QjIh}aDE_{?pJf1oE1@X$^{e?Y`Ek7$fPqv*~c8+wN zTXBx$32o<=;rWv-(o<7P*(4;#>Z%+l2m%UtV0jq@FEt>%o0T%kO=ltqTD#R&sRPSRvA#8V0WmphS!B%VX7J}w#Z4;i0<~R2iXC*a-4tPmy?; z&CAQT^y8B!@X1};Pm*D9w6Oa_aR-M|CG0w$A4@LFK6p8$e+$CGoA$y>p7B=eyg*d z6UH-0b%Xhy6#nIU^S!C@Cc@)#-h|Aa^xkZ=ykS56jYu2K4x~@|Hku#EkeW1bBs1gI zoJLM~I*YO^T>{enDKx=(OFjUfic)fngpyREkeEq_rk;Us34sIG%t$#gC4|(JOZ>zA z!|Bf*77j?Sf$@9bptfOP{n`4E0-`cqP)h#)@W7>9CHXmw_q$3wT;NB^ZT-AdP?|0t5)%FhJa)Q(H;%c;ZN|61_ctT}ON?cXfo; zbOn*JU3CQX(PQMZmWU2^kiBK2jmGDo44d&;-_Se_xRK$VV{h$qYsZvwo(G5Xxas0;of%ObH; zfbs=B1Gs)m*B3KS^H1*3xHMI>K{)F~-~j|`KJ4TkkzE)Wp&3lflv_nRV9rdQ$5g@F zA(5?^G2fYQMR9*dcm2KJDncl^SV6|kxy}y>5@AwA?)42&+HTQ3^~AW=I;f0mqrF{6{M*tM2|3#t+S_SgTz%L)2w}dZtvx0K476%nX-W zJTo{UN?P=>q^pKsinW@70k6rgoF~A{OczPyqZO0Ac&?P{5m~!-h3678&zh&`G4 zhKQMOkhKdzQJNPSP>(|E1phn0dN}VFgpU-j<6SgM3@xLluRlx6NJR_DXh&nGo$6>h zVsJ?POwUYFqALEodukd?g|S!NQ`yk@37^U7t&8;b2S*9(4s^D$wWV6e$x*I$xKrz3 zn$*1&H4lYxYe^!g>bVUiL|yCP*PDDRcejVubOy~k)GS=qf(!4hgIJND)oF;Ncj`0Q zBZw-}DB2~)$jF0|)DjY8!-74$Uz_$vT!9;^v@SgqFTI=qw^nHh4sZ{l7-UR$5ln|2 zoa~XOh1WkCjO*NARlR>ECeq8Fc>#)&j^_`IwKbDvBU|cMZ58)M^ATHhk_KR_zUxq zq6P0#ZNTh-oScEufc$MQ3@*I9I!jf(3RhYM*!mUsW)}}v2AjKwy1ItBnWqhp?L0j1 z$e)(C);!#ol)m&tZQGLHJzS2Sr4=zPj}K=b4xZDW9#=IwkdoB1uc9-)tte25+hjXx z4)-Qf3lNKQ`6D~M@!E6wHanMuQW{R%2|s*F&Q5QY_$lu5yFUdT8!jA^?_sA`AG#L% zt#53s2aa)>nbEYmqxe6at|NDJI`LmkX36Wc-A-?yJrgSKySrMRc!`Vfyv&AGVQ^O} z)eq1O#s)ID0t$thltHMNP-#yY#F%17ZzCy8UHn9=(=yq7IVZartFi#AQVVRRx8x`7+9isgasXwi*8cI+JzDHO5b96zyn%rg zSdp!yU{`aHGCRP!(?qj}^GNjqQXG`p=B}ri{r*Uf*l> z`uegpmBAsc$JEPDMFrb5jY?y(yArq5JU;1J_2}oDe%kao?#HNp;)jvm&2H7lmu6%S zpRW6<{>*R=CDab~LiFKIM%|Mf&hJgFlgj*c=12YnB;AOwjlY}3vI8$YhKx@-8% zwotD^OD_j4ganB=dXK%0U5k#CaG&&EU6Wb3{_Olkk9LJmzRh*>&T;iwN$vT5{-CjM z*r@9D=sL{Ls~_AjXLNF^V9U7LZ|!e)~CVIjti5YpXGWdKR;ct_w7wXuWrv9iEZ0CxA{O@ z1dTin2^uNo4WT1q{oU49`V>EJ00)!+=RuLlT1U*EA@m^kZtSiFt#zE~m*eJzA(`<=R;ejVhRp4D%PU?VMn&4h#cPP;N3(_cTQxiey8oRljcU+*ry`@=6 z-$rjy_yJ?0H#e9fhQZq;<_4x}G$@M-gf8MQzH!$W`Sv<)OmL2HGBwRG#;py4DP?}~ zN6*7da%;{<2&HR9{mW-DKX2M4!q#e|xC+(=x>dlZsDFv;t??=5Um~Vhb&pTsS@N6g zS)fa&&yu|?e#!wDpy_oV#i#Vxv;M7p;~&LO+2Qu7>2WXP3>*# z5;3ZFVG--Q6GvsD2Xb&aDq9PMC_cgT&Sa*LX;ED}Dw=4X_MYw@RWm2pFDHE(5Txup z_W6>WHBWYwpWaY1mNh)5enWQt?sl|P3}{aFlb3|3mY27+jIu#>=Pu99Tw2(^Hi1f5 z3{DVb`t_DvOqU?aO*xy4D7RaJs21Oig~ab?((unB_T6(^*>~X?h~Jf&vY&+O1>cQ>ytyK)RNE&hsNMgOmd>yIuY;xbBey+Q3vJvq^>=x<+?Mqf zWkIKysnQMAae+il=~I(178JY1pUQmt5dw61FKxeZxj z7tp%K=%V4gZ=+gELQ)3~2tP`nzm<|)7fGTQ?3&;7YE%8It($+lF`dhO1iKOme}uB6 zxPsFU7STtkMD@!gEKOe>Yiz=tKunTB8kt4Z!DpZ$V86u}kyoG<00FTjGzaoSj2fKv z`QANW^1_Qd)SHvtbNWhz1Eh8F*oqYA*f~A8*cEjP+rKCD7FjGi+2H4q78GBTj7q<| z^V9bJ9GA2F=)C5=rQDLy81+7Ld}egh=Ejil1nLEl-d>9xS=>B zG(P|n-BBS<^r1I4WpJrGsr-dbeJ1@oWZwy$V(`2Y6A~OSRbxLtca z(f;F7qv`CaQp}ywreX>ykwwVw-cSgob^$1TO#eT*XUZ0YhIPylZpw+#rstcyvO6+3 znT&TgBUQvFDtbl^iDf<8%rA2#Yr?q5y@gX%C9-9xRkn8(=azj6Sj z4lzez1?1LW5@i_i&F@SvI9X6|ytwDl?kHj(Tb+_0lJ41&)}II2EfwD4DT>nt*;&e% zY7!fh6kvn{?dIxA2%>$=jRv?V?ob~`x1$uHr;E779mPDE>SYXnR;a15{Y3^>&I0lX zvgL#0gWHl5*LMkD5z8a*^*Y7O=}zbM6uiBixrzCyX9|s-?VfXXkS7mtc2%Wqt^qdO zl9BlS(&GN)k(z58qw8mi)x`xnnCNey-95(si@DJt0f~a?t&7qDp|Eds_wF$( zG}r59^_uX*o8=%MZ7&x-g>y?;P_T2EQhlklrLm9KLx)og>}{TRu$G0?kWc29wqsgk z47(K;UL3fOI;X1HDIsP=$sso7IWaRM1oeP5sbG-QAx-ohQ*~&rmEhPmt%8)9 zDV5H_hHTtuI%64dI_d`-IoMXHN`!qU@wBxhlJ?8$T1$L|S>(0rHi3!C=yG;qoSvjw zA)|j^Y4PeB)jiuwG%nmH8kdlw80WC6)g`s#HKcmHe(1TCiM|z^sVtqH`a4^7nt}D8 zxOr=96ZAt+@)`7b>#^vUqMG3{v4w{@qJ?B__s(@81c|z1Nx9q;G!O=} zG*IuQ1zmx!ASPwwazg=1p^%6$2XS0pa2WsqWQG@>tuA|~qx{q6@VJt!5)Yzpc*zj8 zwT9E}16NljCoVqUTemeJ;QulA-hojZXaD%k?%t{Q-Vy4(o_aa;-U|Xr2!smi1qsmv z0tpO=W~u-qz}OfA#x`97V-r{09mk2CxFk;O*Kv9X1ncha!v2qoZ+9j zxhEam#uI!s8~2)aY(NbhYinZ{8d;*XuWQi?hj-_}-Ifi6hi(m#zg)M)h0SQm_U0%v zbPC|Pf{{}T+7Hd8wT`s+vjFGy3v9v;GN(RgdYX0zR#ryNG!_I}B@NrZYX`rOPJlXZ zsryOugkPaDrZR!y%~{5&=)D`NLE_flz0x(KqJ>{UM|#mCMMV#l_B;xfMDYc6fPgPk zz?WIzL$EN(W+x|eoSiZ(kngoHkxZ?3RxF@#T{sP0&e5+_?*@0ht9tjdPfyI-TpJou zzrDKs!FkWjKm2^t>fax%$ldk^Nq>6zb6fKZcfPv%{_pO8rusnL;E{Zv@{yVe-h8>6 zYEfG3!fam@xavOI92VPgxT$*Ug7AvihLOCc11-w>3xnBR$*7JMH8<4*Qgx`9Cw~lQ z>MetQOr>W5{uDe9gj9VMx0Y$dOxiBT-+9?~y#E`l+KWACyRXU`MAA$q78O*)nAVtQlZI&s136bS3P;-l+aTgI&EzHUbZ$yH55V z`+lKV*+e2kH#C+mj50^yPqPFEd;08zSTW(bT(l1BIU%H8>7{SR* z#8&<&gFo%s!|_83x?{)JDS^UVv{?p!RNc<+R=11DTw=2>6vD_dg*ECf=szh(SzFrI zofU{dg;N`wg?@$6Ey3YJ*z&~nD}!=UM@v>=C!vBZ$%bKM#%HK(1Tlg}B9d%;s5K-^ zAsb3qzcQG9XqeI}Pw^9yAiFs8Q(iMZmB2m~da;>)C_8maNh>~6gq51LE8!d4odj}_ zvZBjjAuZ8GehS%e$!Ka$@XGZG6enARFzyQ8$eXO!2doqm~|NkOxYI>h1)T~6{ykagEC2RGfFA*vN?!0h}3@C zh)PFBbOyp3T7n@m>sSD*HKeoF(RtWh;}cww+JpZIy>s-cXIFhRd#n*`c-sw0iwI7e&9o7zsD`N6aYDy zC7ECl#dG2H>E}MubNY9_3XmnTQbbY(q2s#|#c5PqpzF=(UsS4V7{s;FUO|D0iTG?f zq{2C%oV1_45*>->%Gwa4!PTu_ki=NBJtVrPm*_j06xL6T=*@Lj5r!;qIz z2zq275#Gor*OCuiK~?0O(}FOdBELRH{u{;+bZ1USmok*&&01euyCG-PBReW8Yqm#L zv@*+sTZ}(d4W^~7nsfJ`NNM`&%K7WF@u@j$(wBK=MMY(LNS_k_sflgjUKH{Q$~Kmk zZY(P(q2I;}f=eSJN`nhR$|54l)WwCR^l7Q|?MPuTo|c9bhR`vC|K)Fd!L4nnLNCS6 zcG-T;oxcDNrGd;6k^gdpfaoje9Sf0a?fWPRk05s?=PurQg7^#&`8M%A{({&^Ovs2h zAa;=TCYWa)<}uUG1Dd0+Pl<@+?1?6JHUxQQHhS|2@cO-N+lbE-`^ipXBCg_{#g%9> zL}UrFF1}4p>7MC18IL#xDbf^|1HeTBbL?UO<8N%+z{C=62RAOi!s(HZ@e&8|B#Jx8 zU6nt<>2dMeCp8#zf<1u+h>fYllhg7^j7ii!iN~jovoY`xu`xv$bC}M|fhw>kx!i7U z4|}4bPw=kA+;;9Wc`^1X#R_s9)!!*opn4?>o2R!Bx0?G*vzTlf5kl9kBeOKg+;zNZ zF@KgjAw=Fy;kgqUJYBbr&d*0-#KUZU<8zo?fw?L5rWc!1Z#tH%(wyKguUq#OK7v`x z$#!y7Q6SMS3k9u0Dh00q#i>t(c^Hu0!dfoD;);V)4k254iPt z4PG6wYJH%$#I@6|e%}qcQ_Okjmvd@qyw*9PZp2-bil3C zci_rat3?O<%ANb{8us1*0A(w%;*vMEivoE+r@||xlX8F( zaXmLqfD;r;#2t9D5|R4fkmGprH$1r?PY}D$ogz=-$zQcklEn?&LHdM4nI$$R3S+L) zPf^@rPiipc1bYJ9VoxgZr zmbf=Nc?1N{IQhsTUv}`W7UTci<EbMoeznJ?%e&|7eOAj)^}6@j)NHweQ?3U8Tg+rYTASWmHd|#r z+uaK)x|5xyyw?D{!C1=Um2Auu&)s2%Ay&4MJ%ZN}X`RTcV{yXbTmKdeGz_$$PfBe|CW|x~+!am6A--2LJpY)V(x9w8kXya^*~Rsb_mwvVrwoeU z4i1Vp2M2M_++dlF)^b@$=_;i8DvV5#RbpacD)btf&>b?LUaV#8^i5>@fJ#j9l~^dE zfBsBi|MO?^nClvk>({xz@{d8b`oq{5)p@15ueS~eO;jp=1a(q)tVZJ}gP<2!&h|5L zrY!}i;nCPk=rzT9k_!>#K4@RdnKmk^x}7BY(k;M;Br&$>9vqze=b!ft`1=p^U7sK; z9)5NH{8#xH&E@AOrhBl2rT3Sy&3a zR!&a(78HKe_GvbdclmckAGIGsuL4C#TSy`OfPb6H zQR)EEi~kFG2b522kPKOcEPRikZCLV_y_oSd+RyiN}&1TZI>Or4qntTOofsD%`7k@2=UP`~t;nxfn={_>(zX@XJ2lT4v$E%c%zf%B!HMlpiu6K{D?#ARh>;18 zFhJY_Tmh}b4+RF^M~J3A(bVaPluJ}NB}($nGhEiwWe46}A5t57b-}KN$St&;f~G{$ z3p8a_$3*p|1xEV!XKcJN!Yw;1zHrv^N%4gzf#J2FwX{4S?KNPpGSauPaYYXfQ{qa~ zou%t1Wu^zi)<{`{R2mfF2v{AsE_^XDJ8j`${=A)wVJMAja;34hzQ!$Pkx9+lW~j^2zYC4M7V=JyjpirGKLtxf)IK@7G7Ut$NjToOIq@1 zuXy|!&hg=o`};qBQscqJAIcn>leMm#HiztaaqX5DTQ<=O^8)%9d?6o(j^GaaYX#GYc5YTqK29dK;pLmgRRfPSasQmVr9LvCtS{HE z`MsBq);-Zb@#ee$zXWe9rr()I1h_}&|rU#ce3J(!Xmw0=%KRdVtABefXBv=q)_9;KtKqJA;Qto1sGOw6y23vM~syZkgA;V|%ye?C$Da{5~>@EZ5B9xs3%HS@f2|+AHE`d0S&S=g7@3ERIa7I`Ha}zE=)ZmF#@JpSN@rFGs}3 z^DU_{;upj5lOL4%kiSj6$8Es(J+e>QX z;mXm756R7f%b$eO$6CcmiuwrVxx|{|ar&WI)h)5g`PCujUX{JYollHZ1^SmR9joa* zH<*&V{IQ{eo*Yll?4JC>o?K74cV-7K7Nk|}?k@>2b+p`T;bxP!{go-%-uSNPk1kcQ z{*Eo@*XNE!*R4or6_2x4pIDgYkd+>cmxF8-AbbjpgQe~Q4M*mvuE$b*fl3fNEQC)d zHPMsuCw^Wj|LUfdVm)qGrue;Zn(-J!%25C2jPAIGsQyliA5j0M#Pt{_W)cDoCP5sR zaQfEY`8U<3oTy2x=N4#=)Gyt)PvO09pZcVO`s_CDHSX>0*x3ngl>g$Fc1HdS^;68w zNIhUv!hY;Ss?TGqGBhwUG8FXnS&Ip1bByV-Lak^gz5iW^~vntWNZIvH$U)lpHdRz|&rX=wpccBJ72ZdgBv2&KCEW0OHm-P(#4XAgI@{5HY@j&I#3ZbE z>9MxXb3+*uJ_X%5SzYC^K%d#MCo+f5b+pl;#uz$qtiAp0+KdU`{I2Zm z?(#S~G_I^0LkoO4GpCN{4^&lb*t6cp-)H^a4HZ=fp5N$Hvb{4YxxRhAqrXFK`=aFJ z&h5q8aeLXgJ=$@_+dGq!7q!d5WKO74APgB=sKQ)_JOhAejvs_Oeke6Dw}RC- zBFYxk&>>)HbrCAk&Q|ch`j=)BvOcA_Iyt@~H)T}_30akrTM?gJQ=Bpq`m2B8UV17b zo(q`e>YJYMR79MQ>#P7SUG%_@^r26B!Zr3VkVDK6FB_9RfKGJpFd5becf|xc7D_jP zoa><(q%1_zMy4f1aP?_vdb{RS9anKueT`35UlR_fxp-a_Zyr4=EpnrIqEVPYOw}&iGCo=`^6eq0L$EC4T2Oz8##%#A@tg#q){wisXocw z*s4CstFX$G>c_-KTVEi=x>Y=}jd=?Yy~lsRD3BSwYluiQ)q`;vKw|fphJ{0RVs{ON zy$M?JG9en(tpdr8l@`b*O*LIH8#QaMnXEw4T=z=uPuzR!HK#R?jf{W^m#^3OX#Ai> zUXUFp2Zf&?8Cb%zdlnQA-vv)#SQodPgBP2fk@-b5u%HFLsNBXD)zZORTgY=;5RRBk z&?Jalr?j(nYCf4G`v#Uv!?VH=49hg@m0Bva4v0Bfxh-B^-xL*HOw5U0mRUk|Sy*R; zf8z#uqlyeTl`NOT`(tHr8vZprH)k0dPAW5dg`Huql{Iot6a-~`B_~w?comI;W^$wU zYT4KU(v(t@k%J4qeR2UC?Pbup2e|IqH|-o83T@ObK-TL?w{C46q}{upcIy;) z65b->_3rahumhXk`#s@$$L{~7IfdQ-I;ih_fnNhY?rDBZ_B zuetQX4BJmePdY^h@|URKx0ah*ht~o}7|w`Zzcl{{)Ka0SP*^gZGECMi3sX78hpQSE zR2%h@j2x9-uXm79ud6xqOlw1Jk8K8js9e;dM|)s+z;L0HUA0y`>f)xR?C4)uujDZI zvPRETWP_PYXZE9?U=5*75y3!f_S3i@G@m=$G^;c|qHef&U|-p+3E!&hsv1{sSMHGJ z`qhcq(XMupCd4)?90o5j+M}&)-u;bHu`Ro+*IllkP&Vci)CJf?)#tB2T^`@Hzi#^r zO_M@#Uu=GJ6sKNz@=!ryOHp7>-+f8xi{q;@X$_CBw{5FZ?@P*X(idPKOWv}?$TuU_ z#ws$mAx+g=6<)KyHmD*dB-__D#AmjJYx#;fSxYNInjV~&KiA7QQ-)htE%xetEk6UC zrg<_H4`@XNY6A)Ze~m_GgJfhdWg#AQ3G7t|WG7@YD+q!%9_}8L$e{3WgiVATv0X}} zT`Jx2le-1}LG@5t;U9fQf7bnN`Z=EI0i~FGkA@HfbY3jD56&>wFhgew0l(H$SfjfH zMzFu(2WvZPTXft7Wu>-%K%c74_y8m+YMF;nP3L>HhbW&@oO_W(b=|ZOU+H;HF<*T7 z#V)Z#{G8aT|0;e-tm!}DjjpaPO(;|j8?{T1P)>g!JLs63TYGwX^mcW9R?}8o)lnN0 z>KCQ?-CnXZ9{;PYyP8@TF*_xM2%NF$MChi-h=|Amvd`35FCfmfMI2ev)Vy}6sd=a- zH$|13m!irM?k6sNed6DL{u_yZxu@r45yb?06m$A+_5J)a_ub8#H|O_o$v^)r*!T7I zslQgM$+DX_#f@t9_hf~*p{S;$EI25-H`C9@&s7ZJyk@0F&W`aEtcXB<$P4uG3CSdK zVkLOT&dx6)+1(3QtXN3Dyw#mvRFvMGQCNr*uF<@s_b2@&xbKqX8)}M`0mnx~M$sBv z40L)CjFnKHh4==ghYj+ZZFu~v;ji*ft5XJEcJNEDe`L>^C%IQR#DB#qeM1smZoIsP zhSm-9Z>Yo6VcdriNlspCONaIiZjBCAMMf4ly2llYS5BVPWDA1f0YLz-q@vs@eim{M z%`foI&PG=7xM=HB&})c_R@$>fX$N|=EV2Tw>QkDNWL8k5ohm*rYdm|y{CPv^A(iou z4-K^wGyhbjZD>+{Z1&QuxRxAcO^tFVR$2+x{0(md`>=<~MnJSDe8y{JoEb#<$7NF> zgRoP)R@(#S&TMjEoO+OozIotXQcs&(aC2kV_EEXBWa>w596P2SVB>RkaP&f;dJfEp z`JWgG&{+*&KG2dzosX9r&l#zjyFNE(ebwBN-0@k7fyif=l^htD;6~mY?cI};v!_@3 zCjN9ht-{Z*BJFrurN4hAl`ATze&!DfhY+y>jojMR)tiJF8hfvvsgci26OdZ^K#!n) zHnuMYLS1g52WpA0Io%ZGomvr^vp71uDL<+v!;gqXPYOK^OKTbX2I9m zNRn7GSRRnSr#-vBGB~)hKPi4rSlFES1o{hCoZ49u7+BJo+Pot#Z$~G>M+1tYqlyCq zizSTZpAohKk4!JfiDHn43SNM!XCMhaT6=EXL|)P3!#HNTO-`fQ0nZ;c?to*5-qcwT1blRndcsXf8eYkkRrS+{x+M`uFe-L&bO6uNIc_Ozb-zT{vBds$vc7AMQ+(1dklg-`d zTeAlrsx9B}#knTzZ!PxsJl@HJVwSss0q0<0B}fXm3tH3Td*2g3%x?-=VWPLAvlkv@Pog$$z3Qbb*8kOoU^|#nsg^(%;Cy^7gfnFmc9v z%xF(Q@z2BNc8(c!b=*!Vfd_^xSXtH)6}m7twJ~n8Wnx+Np7yxlh5HsCI<)-3IzLt4 z!Rm^!rRfv#ZP|Hkv0j<=iQEGrrON2yK)<|*+8w3--64zk+vgMFxnG^=jS~<{}&n?Qul4iWxLgw{MCs2&N|dE9!A_ zI={lBdr?)la>p*T%L4++R|8bCY<&3} zj-O`knaG?~#;6;Cyy8JUSW2lopFvJ*1ESEQ)~5&${KWrFeVk8G|7RI*xHL!o`!Tpk z2XB3`O0bZ0UQ>`aXUr>Em7G-O2&WeSAQOFJY}hL&^tJ?8NWm$z6~lBH-496Dn_@wa z_$lde?Gp331((SuxF*=3rmPHKc542{0W%4tEtwFG6)5f->KO_|Fp%>y%!`ZwI(FPJ8f@-xF`be)1tV{I33?`1%0fKyRRWgZLG{_us$|SZIZEE$qxL z=<$FS;!^0cKoF^JGA$rkNK`L~(c8q2NK(l*5tTdmRyNN*@qK(45bB@$RxrYkHZrpd z#uf_MAgq$fQm+9jLsAiNW=9((UotuP*6QImmR-tNRa&+(9ees=QS_~NCVkqgAfOjX~v0!_#l2tuJbaNr4AIf(oMl8NDvM7E&n0# zJ{DdrLql(~sIUNgYcr6RS0h+z8dWlY?7yxy@G}zCw0eVwLqcoG!UwwIlX{QTZ+WqG zGIq(_vd*Ykncc+;_ckk&`;RTEIyG848C=?$P}Unq{JrAC{H^ShE4p(s`zu2h9$gq; zqYTUsogD+^**>+ZH#?`lG%%=oQ%ziHguNfk3!H2-&chq;>j0{Pojbu|W9(>er^PkA zG;Lm>tx^jswI1q==*T=A2}t}SHk--G*5keL8EfZ8!+}8jE4pK&mdyKhl6yz|!?Pq* z*cvi#q_T2-wY}4rvN|?-zEW)rk|ctb0Lt^GqJ%2Ijpn$A&^rpdS3rQFAveorHSVZH z?4@!pUMQso$?7f|qO+As@k3PV;jKyfp!htwn7!djU(c0Ixw-dU>FK+=A?I>n`HF(P zWfeiemCN!9mX`m^@(a@VQbyPZRP9dhv7690IRFD)YJT;j{@|Ql27gR_zmwaRO6+W zOuzJ%`?4?5m(E>Q0cmD=ZXt^La?QWxg{AkMi}yuEhKszuoapIrf}--Yr%RYSp?L@; zRcq*7;M>)^aj|yu?Kn@sOTG-BSAdG4J)g>eGc}YOqmUydWAJ!JL{Q8E9it>N0tphd zRFB20XUKhI!x_=+KF#ZgoGuGR;}e*%hu={To)ZQs z!mz*%$_#1B1wX3U5;Q^S_mA}R(yoL#>?g_->}V|~Be}7@!jMQCljtjDaPDx#N3$N& zBz=NErO}9g_52gr;wfgV^51_i4EMY$;QXKmtJX~jA>3!sE#0Ie4P4)uEQ012bN~c@eQlSd@!<-5^29@ zB}&AgZ$U}`ml^LwPl`eUJ!4TPi|4^G^o2nvBoucfCml1#&=;eCc}7#`HNn3=!Hw?U z&vA4jHW^lI01ie02mR@p`T6_H9n4pIQq5*s@Upn$3f@`Eky<>Wl?Vrqa%j1*rSJOI zg7o31mhFDN!|algs=uamMTt*n^_rqpz4mBbiDKci3S;uNzcEri{Q8c(y5nt$^|4Wl z_taHFZi-Uce!W9FG3YwFw{ujXX8;=RA@}|^VZKeA={vH2=@Z;_&8yt7W>9-nQ)6Qs z0jb7}=~GtxhjOa*>d8`Ir?b*aO7hgVi%=*cjJR2|>|`=KDigBE4El{m{p&PAidA0! zM?%i^>_O$Htp6J|moE|DAYnJ(qF+D#zY=zy$8)0Qd6f1@7e2Y;`zCKdX;Ww7sKE}qtUoPiM0u&rwC z>57Ty>geE{aECGS$K}gch@Thl8Su>1Pn+KqKx`L3*d4#{OkYJ)kY{!aWDiJB{7&t8 z8Z$dDd^Rj@$HLmszycR0BH1#Q2G`Dv)RCNYI!TI;N7Tg!8V{050-hCj_IyNwY`PH5 z=yaKLT(RQ0Wy`kzQmm3F#(M3_rWf=Syd=*ujg8(5iaWrYo0?q`&PdpzlUSsV8|V(M zZ#*cI%V8!#$46{d5|*fd3ozQ;mSOm->aWQ|cgis!M6K$*bauXlc-~q*f};9@LTx6of4br1!4gIDLbS8 zDzM%4nmn>WWqjWBEyi2o7ITJ1gFIC!rb!D^VzgJ7&r^TTy{sAFUR8e&3eH*Y-%tJq z0i1Cb0RkMmzeeE3hH^AIk@0j__@6Ezg>n-{>dt7oP;_fzQrL=;Jvu_i%T(}=-O$cr z4okPCiM|1Es4zD-)f+VAjCpBi^mK0rQ{3L4)>F;jP+#Xw)NgVIVnRD97N2O}k2C%O z<-=Zd(7dpnTq2jYW1kDb3l&(4MxD?MI0IXBmmhRB_Q%V=2GyVKnVLNqi)T6#bN<6C zO6?!h8Y!hd+=jWR4_{us=SKhB{+ITYmF;<{zyDZ8#j*bC{$rJu$NEDj1^a}7Grhe} zEK5opc%rxW@qxsHDWjd8TT)WDc6M$`A?6aT=jgsr`+`b;E;4xO5w-yl&&1hO=Hg;P z!HIXLvX?~tBnBqM_~B;=scc`ASMr*P;eVg8S@YuN?1{jt;VPR|50;2ufJ2EdT@*+1 z?*GF^5+lCUaIh_U;g$6yhAq#_mSXkQpi$IY5-IahSp`KJ21gkBT3Y&9ScHd%87f>P z-JBi*I|rsl-k~(w*#y%*0+d{7%~^WNB#z)F(%Z=Y&ZlHmWyPuzA5V1n>^RYvkUsp( z%9YQIq{sIjZ?9ewBiwO6}H_^iL-!=6bpUOB`HXYKOT@=P3&xqW|<&}&JYQF3>N`A$~C3SO9cQP zTazr8;GitnNo&R8pHL5wMU$y9y+e7Mo@+@*ihXKh+U%IFitM4j+jz@4@3(QcoOf(048WA@6bE$C4OG{ON$$pC3Cw`!tRrvvrPrtUmk24e0fJf z&f4ax`&(mUIw*DXg+K2Wpkx8fDu~9k`uh1f2fC1;K{sbZB|(KuR&_F^_(KnflO$kUQ-3CcO855AMuf>T7~kM|4z*mwPnNLTdbU@W#G|@P`SRo!-80QDgOk?Ij!PqaaoqjZ{R}#_cB;B)uLI zC3NkrGRf!R&ibZ1IXb!;xecPcAB#|=#DMNpy0Q1(AdMBI7gauQ)Agn}-Hz7vMYPWm zFE?qHcujEc{$dXWIx!3|gAOVW)?$_uqKAy^fmT*C@Ja_P3W=F$g++A;^`v?kSu~Ln z)58#IBBr|{dkruN9eo)ElrU-T`BCv8X`I&+2_zC^qv8P}O}j3wa0p&!1`4gGXKDzR zM2`w05xa*lH(@QElufBD_xvO|#t7}@i4oD3d~U51x^=XM>Q4q*=wfE7LK&GF0=_y* zqkAh{UCFvngPL*h%<%7xBBwUoTycVA&1sM5TLjU0!<0T<()xR2@nfyxzVXA#t0n?N!2WvY!3u7Y`G_|l$n3|da);5M{ zWp1V=z}ObUIJ!USKS=|Ss$N-W;0*NE;aca%cakuBhDM6Lr}K)|XDmGkenKtxomGXiVM41@;9LMWND$XKq~HKzWc? z!Sb?vkKNNOfB{dEQ^iE3$v$mhhkejgEZBNfNwG$1-lGUky*~f z7a%f|7DB_2`~{&+Qa_*JJ{#6Ja1E1_>c3A+)CgfUx89IICdq1u&lh0z!Tj|6z%kjm zL6R}xAv4^TWav5RP6<9tNsG*w;MZzC|JL~$88H{DJ2{wL=-trFI1DYt6r!~|cc3xS zR_2CC$mI10X-g=|lc#wKyB{+sCcjJbEcdrb&8bOSxpQRM(qc*-6a5|0(OfJ0=x8C& z&rWaMvxssI5BU6Hgn*xh_K7wmc7rykv|y@7IR||Y#=xMYQ>AaZn`<;ofqJM@Ky2O- z+uie4wK=33D2!6f!&3q*|Dx$WEY_0C+&k*V+<^>%-%a?S3{SpK^N{%G5dKLRzncV}zEh(w7##vpl{-(8_gV^nOk2_>A0e zEPmy$42pJ;5YhXZ<4u`;Ku2XT%RQ(D7uK4F7MZc4qTll2 z9lW%v`U+k37f{ne&Hy<6C-zp36dzE%+|1I@0@^k;+i1O1ECTIrIxTsB49Er2!pL+- zM88C)!3LYIQw$XIZjnZw zCZ^30S{LwL;sH08Ew@PwpCC38)0Oyb+wu9gSw8SS4-%8pZHWo|$XVaV$jbRPnZpf+ z5J@QY0uR!bTvOiDxIf>^uVh)#{G~}olP29a?(e%Y zl9{>oV$Z(UdQ8YIh)e|?F|n=pS2fq}Y*xm17WAKQEZD&$sO<$!XA$EKyqfw}Vas+V zb*V(pt_v=uPmD34()@?Vtm*HfW_LKorJ4xjQw4)BiKUom~pV zXi!bZoy!wnex9U|PsCv}QwwX})ReCsh>htSZz8Wuir=j5Ld_qNiH?GkTxJuXArM6K z+Ra^&Q?h1GFlD#xRWap3l#UwV3+4QhRSX<}me9s0^mJ-Jh?`dEr1yl%QuN<(+)B+( zVyYRIZa$=3eTaw1CBu#M(9TCIf>S9mUggZ0A|=jL;bd=bV`*t_W^7}*)sP=*L> zTE~{IZ_1h+O1Lqd2Zgo4jcLjPg$%MR;bS1X_v|T}5E37Yzo zvLf8EB7qg>3we!j1aS^j)*vLr-pJF#BhG|U695-qbV)CFsjIggqW`6`v%F@H`uWY- zkq!6P)a+=CtUL3~{iE;iFG*ScNK&&Q>zh+GrH4P=<+kCCZ8_tii*`44-z zpW&($dVoO(?%}SKkmwgKOF3On{yo;y$q6=C)f`;V+Gfz)(%3+t!UA=HGhqRo0g#@_ z04Z6d)P?$V<=-=rq0@JgpP2ZIdf=D*k7@NZ?p2Z-Xsu&Nc(l|p3PqbJ^enXk7`-D5 zTO~}TT=pK41bJciZqD&;X@YkK#y-X9>MtbcI5wNgU-5b4A)1x*6i1*A|aEFdZP#ySNc{_MZB*jyEdlwfAi`ho2gFr2{At)dO z+A2}Ett#%*!4B?HfXD3s6&g{*?;L(}XF=iU)vlpuhf~$wi}p4|>{oVF@b0<0dvaII z2??0DyIWfn73Np&zX^1LHfMrZPo?htOU6kK(iS<|cc`#-E#yS483q}^EmidI#W~kv7E0ZcOcFa8P_jWzeB#+tuI{T7;i|IKN^ zJ-TAW|14iFCXK-%^lm zu3B?-<<*tfhEgp|cbgjp%^jI@ZO-uAK(2H7@=up9XR;&6^<&tfF2m7JWr+;OAeP-Y z=pSV0WNFFKLLjV99yPp!Fa3Yca_rK)o$~8hju*6^VUmZS?I+6W_f=Nzt1nwfznw3O znHv!?H>NDQDl)Q)=-=Tw#yx}8P@p;i?L-0Zkdrf{b7bodnlcS|hIa_^`MtdE)C9*} z()4iKVJxC{H)<`CtZ~aV!{p&HRYO#4qe_hkl7%PQN;Wn`&)v5V>n0f$OLMNL6Xv(TM zD_f)b4Qbw~{{Bg`v(f`H{W*Ug(RLL*F*B6uT?XB`n%5#r& z4hfi>l({UoU}aXp)&|}qxWRFc*t4c}+v$6(@iwCpEU6fwYDwim) z=;U|v8Y3ba^U~|1qUvKj!knDKJZ6VGIfavTNwpCXwMkj^5fSwzZb6Pwp{~J>G4$+E?s&zx3)GnySh4? zKJpF^$Em}1!9NZR81-lQwmFYmt+Hy^mIwn%@X z)O1eUuS5rQUH>1JXX+;A3KqySwFGCcMsRwB%CWXi(d*@HZ*QhbNeM11Gc%LtMw|7z z>sm4+5JGa-QJZlr&5N2@WsF(y?onmT%5K`vCg2K!K}L4;G7*gsL?mq<>zv`+Te04#Dzpy zu~OhoW35TXMoDe^n;Q-B=JKB?)zVu)Q=c@Tw^AFBh^A9Rtp2f!hA*US~f@P?^ z@2wB_h{XE1UQ^Gw?aOT+xmsxK>iB}Iqat}J*MBI!x3sV?nO3r>yS%Y>XQQK&RTt_$ulFrVb8v8~ zt#Mpiv^0gvo!G0~6?>Iz;j_@GL*Ia-_HdZPY5739UEOZ!cEN^bDD+FNqczz^@uVw+ z$LZE&tQyYD#$>!~7a(GzpzBeKyECL)IzKJ8E9;dk?yMoZE{1~uDq3@U{sdnrriq{0 z{*lB-id*W**9zH9*m1--&6NY>6ilJq!59AqY zYbi+Ypj`p)FiTS+er>djYY5ONkMj1~0w`|P+y?Yk`>auYj?RyF;J-tq`e{gMp+w(; z-1!!aJONTLlg)S!rRMzuwsXnmC^5E;OQAKK6!zk5&E$Ua7+yoROVa_|0WA_{ffi9; zJ|efA9L+dlYQ}64dZe?oS?#9Ud1^2(QTJ^|(?vqSolvn8d&OV3|bg)6B7<6?6ydmtB za_K~>?Kn-l z*brK62ZWJ9dB*jDg#dm=s;NO2;flD#-4rla_S39@(5cuzw9 zw#F=RV;ylQXo(JKEdGX&6yF7FQ{%fH;H8ZI zy5uSH(Q=X_E=6MVdwDlmKA4ZhqryZQK&w8Ua0fcMLfoc$MYvok~g-#bVK-p z6vJ#LNZxuXeSKargc>2*xma6cI+X|ULXj|}g?PSj^3mtXZ1KRhtvBR<6n{Q^nCLww ziiE?yT7-Y_Un$uG!CKi_ZDo2AmX9P?fQ5=XJKAlzW0pXWPU#y7(0(Lkhu{`zs zb0>*8`DzIXjB@l=`6yHi(`J`N$iEPOo}46lgNSl>uyt@TskIA;_ezOJCl|JMmf{as z+ZEAI$YIbkw>MTLA{FQqJ0nBEo4&bY@aB_CG@UpbDurR>n1_r2Vm`t^5iod9* zK)*>Uj83B0-W2Klf;p)P2cNOcBU5eTQpo$vhST?m-h2p>mxkEZAr#K0F22^v{oU_tG2x4Y-SEw$pvJY)q6(}DP=!8 z3nt~!x-L)xMSQMIyv&h|fu}|?GS^+`5+5XWJAa;B-29X{CEj=aP~py(R|c(pWoz#E zq6zWVg8>hUw7@s&eMl9PKMxU#tI+QII`YyO38>+|Lv8b}K)?pT*yH{Pe>z78Dv z2qkJVhR%I76gc$ZdHUn|4^Ia-Jhr($vSiQegTakwHZQ_YZ-N7^o)Xx;ct|cvdTL(w zJZ)uJPmfwHX;} z&wq3>u<@}`y6ZPq2R5FOegd8y!C~G2-&RonG%p~&TALroc$h@1Xp-EG32_I9urhGv zM@Aoc8J|RbDM)HZWVGvmAzb-3tNB^8rc?Q-{hh@NXvw@3TSM=SWJ=Z}!YuWD@7W$-H|mbGDB5!ZBI>L?$3 zZAI%#t;+nzt5-cazwD8r1a1-8Io2<>oAqBC8h&{+DtM*f~IxCfJM(46cg&Q_Vu-?ox+h@qF{<2Of!#x!g!PG34V z+yev=))Vm}Ph(pY$Vwp;DQ@StY14wg(;U6R&Cwv4sO9EPc`{NwIN6Bs9``mR0W-Xb zpUT3*+}y$4-Nwb)*~`X8Mj1><1h_ER3u7$cFZhm^o30cnF&C>}W6g% z78j?+mfs~lr3AQ#$_^6-~j>0x*eMx5H=B70AQ^L8z ztUDl0a!RyWDOQ@#sxz8IGv==ibkMr1KvUU$B7dzt(39j>)SDCEm>=Mi- zl>R;&w|a#Aeepl&?=-gC3N%i^HGR*1$KPGq-&@(|qhOuM0yGue&^7w^)rdl~m7k@O z@Xz%3`GB@F`+Mj6^!Fb8-Aw)*iqAQ-x_v)DW^`fmHJ0P=Q|IxPO{mbMkUc>EuKOM1 z+3)l#sSx7uJHo5*_n*ZoG7rCd)8C0g_Rx!nOt^^B9Wq&(u8Za!p8@8NqN3$ZU^tJM zq%ho4Ycp?e6AupqCp1+OaEYx9R5qhq~e$&-KN0bN|wqasT4B zKfRzWUo37TK6X9@tJQxWvzis#kdjjDwb`$DpkUdFxwKQrGQfNjVEUVKvwxXdB5cYZ zz1G|P^wz?{E!VnxuWc!q2%WnsFL&kK(6D(cbMseLg>c2zJ3ri$pTFnBow^^+2Dcn( zi;iwP(t;m4qN6*GfSSO*&c6*ANFlSL75$ML(aW<+y^@}xrIT-Ku3h0&8ZY@1i*H_* z+k;N>vMs;^C9qh4#uNe@uc^DOUT=UA4gejTX>CPRBw}{Y2n#4n68A!=kur&jG~Dz{ zp|BpaYHpcyILbeo)c0Ux^TF0+W8>u315Hg2ElHa6&hN?3Y|aicGS69Ao!67+4dc=8 zf6w{YEWNR(G;71PftqFL zx;QwX?=EVbNS$|SzoQT;%Ruan{;w7iPL!Ed)wj}?A6wY8zYV6)o|F=|t?tv#_&+x;-1eFxj6 zSb;3}LRcI85P6JxW1(I~y>aLhWvV~{K^XPfKIzFKI*7TjZ_6YWzhT!6hmw{*-c$5a zQB2a2!iLp}8tas0#}?rg*r6Y6hRr!;(x>2#S19m7e{bvMSJ$RRL~ZsDE85@9>xs|* zmiIxo2|ztVYkfAqbcfM-hRJ!_8$WGx)`l6Ha`Up*U+(UmSf73NFnK>C%Xr%$51ru!I8(1lgVYl<-tA z?Pc}$w0E0WpeEOEIP*-0qv~qa!11Q0gB=L}Q*|6_Zg_Yg1^Zl*SFQ~WiCsG(W!HBSy)o%{kq%zJ@)BOZ?~1DrOW|$$x~(o zNa8L@$*8Q)n(i{$KxDZ`{DTX_fZxqHEP>up+)NNEA?j+ig>3psc%FA8B( zBvsnD33^%_piMEEtO#SM7ihX23($>5ZxU zfzYx@f$WhRKng(*UT(eoGWeFwX^IJp5uvmb5+U!j}yx0Nd0Rhhk=DIh7h|5gmw;km_kv4iuBm=5A|H29?DUBfo&`R8@*! znh&@6ZOx0(^OQx~>lSRu_fGK@-|_J^30;`8=ulVOiGnOc3#0sZ%!7*ClG2+i{GWEs z_KeId2=q$N@Y57%6G_H;sOqycqo&Twlo*Up`OO}SFawU?R8BxxnQ(6Uq?lJ5E!s@Y%#4s3s}0$O zk;9Q$r2%|hm?e#7nl3CrtZoh7SzO>a+z}Mo=)^~>6&T29e5IM4xmm9PuNc%v%@2;Y z&ZLm0Iw9lr({(0LRPZi^WxDdj#7xD7Rc5$dhvL?WZFlN1+HQ8x11w||)4lMnpFk3I zgcW?Y3>^^RZgrXM?hZZ3%$4hP(Pxqew#1@pDBZcY6U~%kwrN0sD-qx1Nbm!1wj}gD z(k@;m+1tN7Ra5iW_u}E}61B4Re2{7{jB=olMw=Gm>W8T>xgL26X0m}5 z6nPaOmc8~4a2KKl1{E?P2~)E@!#&Jo1zD37HkaZI#$`98Q5Kl1 z{m!{OrdNDe_8f_)D>`GYwmU{CG}EJ6Wj|vslS=~cfytK9VUf4@ziWEjF;YxY**FJ` z%ergaZrwO8mCPlxX;(^tcS0ql%Ts5cU}GZzlVxI>@GdlZZ)iyrCds&lJ>>>^^z3nSu(O8&GkW&K zUNPhB2avyRs27V-5z_uiDT&1>E*Q}VMLKBQJ*uC4ERBLd_3NX?WnW68LNIFHopX6j zulTU+e@G%-F%F~V-Z4rsH9e}8IAbo8OFWl?VNE*tGfTipcBf*s`}b$}fY>AbV){-| zd%?_6{bW)aWs6YeUmZ1$GpF~HIAE^nvt)Cz+aj&lD*J)m7LEj9*zMb52AsXB7lk)S zWIO98n@AL$%>c}0f$lv!U?cckA;YK)Y5y{uFNH>;86jJKZB##Llt#t>`Y45Lyo=40 zgfaW>m`VPnc0Gmc;Z}jJmV+^S?;P{O^qyK}hp`%keKCd|qr(_IkoI0PJ?8Wv3?9pgN=pw6X3zs_S^1tp zEk_Hr=NLRlFwS!tYIl$7C*{(pz+WE)sG*4mPALRqrlH1Wl2eFC>$S>Y;K7@6Bn88! zAu@$skVd(PagseTeN?1#QCcvrgYI73-{=`*`kmMqN(pphrryAq!09o1vhgXeDK?5y zf=9J8O-*7{I-{L*H9d42slX_@D@qA2Ov4|4<^Rgg9AZ6;Ko2iuXYP+dCw053kt}N1 zd6^cXuQOP2!Jrn?5WRa;KLM~P{sjK|C_r>E8xw*t(-37du|3iCu%|_APjMJCjfc`0 z3Uz5ut+Wmn!><$!n})h<6R_a}h7AbhV%*^cX;-cw6-RV$c=xD&QYnpc{`FDV`vSIi zH;g%T$4m?xr1e^5P*~Z%!Z7U8G~8{)JpKu`uUfXRe&Qsp=zwsy>3y+LY&JSdA!|j` zI(pZFG3fSOE>w0<`~$F%WQT6qizFG4=go17$8|enHxizEiJB;6-5vV$bSN!(OE-qi zgeuOunU2c7XH<@-{I5(mN}B0U+L`oZM`;aEI+qG_t!AU3Be;l#Ec#E1TJn$usBBO< zkhgWgTcfdFFT`iLoTCC71S;yhrFtAQj6+tVTHACO6JbH7w0f*o$f9a7_nheZJQuKr z+%LNDYq+3~(23$`Za`tUM}T{znW;lTd`XwGR~~ZnEhgcG{6FU21HP)F=^x)c<=%u6 z0)!4BKnOjwfDjPrBE5;I6e*zwhzO!sQNdtA6n!2nfJBOjD7}k-JR+#5s0h+k5Ru*? zxo3ahnLX#^CV=w1&-1?j|Gl3(ch8UR9M~p8} zreB}>!}_DIH^S*?9*1|Nlt{)d)oM+P#U>{gXwkO7=t{Noj&9VraS0r6Zx;v>ujIc0 zv-;JBG{wbzSpReb4EfL@#6kB733y)&PxNs25UkVWxqE!^4Rd7Xtvje)>!FR-G=6Ya z|A$u$E?jt1RCJuNuG8b)t0(qudG|9N%uc~3gJ14Ba_;>tpI$ynR=+O0Ym6FA`zF=u zSR;9K@7p@he$y@{a(*NcOC zUa0ZAgZH3>b~fuVRj)mt(oFGO{*Gc zag#{>$DFiKx3Ihf=~V+I-!5oMC48M0}l42z{1QDv$$twRK&{F zu^txQKwwwLHh~1uhOp$1=8tw^&@vlJ44ynJqSZQZ8nmh~tu*nPYzr*z%P#S-bc;hZ znOYpwE<1eg~M{2ZA3bSP7;VBDyfDv1CLA(jk z2)Jf}s~QcrU>WqJfB3xa4Qr9rIxAFZlX+WcfN?bxG#qMVh~CZ+lYF?<;Jd5Xv~Z!qh4UsgiW*Ix-0E1LrhRw?X$`$+3vS@i%`sO^ zHh>RUhZ`@KG3)r?s%Kk=dwH$8BiYSct=qWv{nP8FRY;vt<+`lIba-jw=&H|sGqo*V z(KWi;Kcm{D_pCSMAN{L#cz#fF=N9+Yd!X^)>+|N9DCw-$j#*-XF43YWQD0}Zo{{!b zi9-7y;_|G6^7OTTJS@e2wiMM^gJ`VDmZD~O?Pl*YTZ(o}X(rk+=zjB(VYORRN?A{ zlk5l{#Z`Bub(ZCB7Jy90d05;hV~f(>#fp{9K+C{es%3(UrBRTaTc@|93g0jB$abW3w;9M04-FC6w_h@|$tW>r;npT=>!ghyyr=HzWOM%tJUg*>0j%b1c{HurY8dBHMgq&TJnB1ORkDBdY0XxhbT5{$rh1Yn=G-G6 z!Mn|M9x(@hB$CpzF$eG2Om)raD2H+hb$}dz^95-Hy^h<*5g*{r#2{HP%~OUbt$E6i z)O-uJ3O1VF%gR_-eUxYb8)Z8MeYN&jeVQPU0^&Q$a~xj}y8m3T9;hbja*|KTdc+@& z3zEY;d0^dvk<1!Ps|BdPURV7@SVb@-^job3P7mAWv}+O;^z3!#3iQk@hNUyB)$g93 zy$qiS)@UHjPA*sI@YN#Kv7(Z!Lvo2g4e#a2cN$6|Dfmxd zb#}3e%YPDYG~#&B!&=}3tkTRI(*kd)&ihCcGNwB4PcO|LPC)j67tp09f5aLJ!jtsE zvM@Z<0?=FH@dkRktj)w*!63NsQiZgPMciUCZ@}uoEvC$G;*N)fn%kV}9=( zaE=&s?eyj6am~DeEmzSLYP7LS>xiB^0)z$K=c%59p8+ipZZ?j~K<}ErhTc4;N zW5h;QnW(`kKgOJu2WS51Zyob*yExD$)yFPM{Ko++*~=w+ZURSvRhM&_CXQ=6L;juD zJuE%aqTU8NKS(ca5RV&Z?C1A3v=1oSr!-p@)!rQ%^fb#!iEKAfqTa@9TB@}{%eUT| zRs)~bJUQI;?vO*N6%k_(gXW9mpsCFhzk?c$j%dKi6^rpmL$-5?*XLBn$_Xr0BR1R% z1gTMNnHuDO$yq=(CXP$o zZ#6V;RN|VqS>j#ITReF4EQlBg-ga<_6E&3hE-vvhVI__?&780vVqe{DZZ2Qu5|GIl zlli_n^g_+`oJ-78vR-%LT*~@5qsAY}=cYAN{8Q7Sv7+y*%Sj78_WOw|*$|Zc9(xze z(>}zuS#$NMoP|0FtYoyNg+0CK3%|~K_UmY_9+kbdU#EVRFuzWhP-ZwS$bO77gRD!7 zY9#x2JuB2VbS|74@aj0P6W$$Fa+HzICFz;wZI<{@=aNRTJ$>FtVk~>&4YE(;TsB57 z{XS5gP!`QTfKmgJDpDNe%%sxR_VHzpv&c}EagR;CuAUlC{7d7J2Vu3E?cvpNI)u}M z-}_aqixFrGymn7SIvtF+vZ;wj#TkuNw4e|%9{;c;c*_^HQOp}gCmE7FjRwsa4E3-g zG3#+6FkbkaVK)0k%0WqsTA%kl&a|(T{KgGgf98r$wcj`%{TF}EfW0Z~zabw8{5SV& zpAvHE`;@e&lzbMNQkvMzJ_}hKlzg9srbM_U z9rAq^niAO_qC~dm1ud;|p!Hf#S~QEHX}u@gp`SorvvMGoJ&VEA0_5G))ZT;b(caBU zAUBD~vF*{kQT^8R=E)Y|jp!8xy?cB-(6jQgmT7wP1m+IdmXQOBon9DP8(60^-ueLc zhh~Ve3O=@?%xjD;hEpm7yhlnUfHqHE89xzf@O=_3;z+0)t+EB~8`rcOb{KgYAUlj(Qj9H|C@i$b#;GKcqKId%9i0m;1>Abm&JuI3Qw%TY~gtfwx zm*$IfU(=d}ccNkzim1NoQcGMD;LM4&Nl6#@clLosl5V13zFiYkd$@ zV?gD>KrE#;ji|qJKu%K5XnNs2Faq_t7!8#8uPpOr< z4#$Rdc6k~mW+FA3^`-6*C&#*{xf<`|y(carmxM<}(}e^ThWD7pgQS`ZN6>1ie$HKV zCN<(Q(nT-*Q8`v+A^t^3>SLA(7O0|>TH+m&l#`ruy1B8&$_5%M$DD3XEXbreQzB1? zuRDyx`K9#WXCFA+=RU;reg&lT_LzBhpKlvi0+bH(dervkoc zF4v=`&w%1IuP|0iagx*Ix!n7`+QBD9g<*}w(PG5EL0#{gV$BrKYb@&R=fWbsbc%Du zGt8GkSa_9EHP#GHk#niBhKW_2OA}iqq#WbPUcb$WIXma_{|%?f{RL05*I|v7eKi)% z<=zAf8Zng1sMK{h%$H7Y80I)gCk$B@XxY+_LhUWhe4S#x$Olf;%qWc6{1myK*k8K! z1Y@Yw1j3>D8SYw!1pALwDBhFfs~!fFSu(9YDM^o;m2u98s+ zXe&Uaq^&?&Qz|94IesZ=94aM^Gdq>&9I-ihT9+i9-`g?A$uJeM zwk*1MS?_ch?C-Mi#$tEt6VHp?vJX7x!7)a`>xwda?WKE`Oy-Bz6{Rl`mYUA(ta~`O zWIMTP5)Qu&h|3!$9Fm>+AeUq7taz7JzKz;$0J#^C9BmN zVX_6@D;kf}c+z|qX^`go&$HKUP^g}ccgsSzQDfyRnsf5Hg{6)XXwAcNVgYapj^!A+rw&O7;ad~2E$3w5v!>%|?w@#|nqrvtrz5UGI@_qE_R0~h*P z;(}5D7rpse@`Cu!Rtc%>o-6A`VP|%>hhwUz7u>@odqF*1qScvm6cuhSsyLmqX)zy7 zud+B|WLHNlW2fyWNxBvgAb7O&LIi#5wMGB4RQ zUu?x?Dmo8(|J{LkuJ=(6zs`!|u=4BPQ0eTy&X7a4wJ~-*%UT2<5v;~c zcx^}~Rw;~Ue9MuuF9R)VLO5n&^kj14aKDK9JLoB6gu&wiAZ7Q8Fvo2k=JZZ-dfB}q zj7k0a&RA^oG#1U&bBe`)Xi*$;xpi|u#Ck8lvEh)n*V47f5M=M|g;v*9$6fZZU zOj<$K#MMsq5^C!Qfjb0dJqMB$K5~9QO^8}U}9j;fx`vvE^ zDD^IA@8kFy?(@e`@@RQ1PN$jo{58xY#Ri(-`MNQjj%toFfH$o=Jaem6RS)lBq!Y(@ zx4ZN<01vH79*n1_cx?}?xOIrJ*1FVMGBvY4avetPZFS!GFfax(_>5)#v8sZVbkR6@ zz`$Ijlo>=YiPqJ!wBWA{khE~U04b#Nb%KA5IeOejea3wr$@6s+@4g+u*VXxY71EFYpOzJ?yU_c3pR`*rx5J^t_#2WTEb-?ujLeN-)61B?Bk0rFwu zntd#M|8~B{IsS9$>SAbrk;YHk>#x9YZ=jD{uod5H|!COmE?0r zSj-K}1Kd!Zlr6M8XcEVlt9U9B%t`2hvlnwLk zkhZtxHPX;-(7MU$Z90X;s>NQXC5$&#PStb90rWGq=K%gCo<+dia6|IP>bLqvj>da^ zO?W!_a2xn!F$ViL-v?*}KDHs9 zxt#LZtiBtQQzo=ddFd{hR<~2r&)k8{WEHgCUT7u3CG`wFa}^=2u+X5?MbWCtBwR{kW5_Az#}L)Odcf!aczD!<3l0d?w2UL|mVv1W@sEM0?+`}0-_{H>+pGGbm(M#vMFEnlN- zaZS7lPGz4?Mb^?~2(`&h1y5aPpTg~1Zu>-3C8x5|Pc__L@!B%BXO;MV9cU8G4|(=0 zm%S3ao|0>1E5_$_H++2;U(dkv2K!re>pfe{Mva3#pjac*kRwO_xIbh4yqU&}GtEANioE>o=muN?(LnYFbSJj-=smsRLq2cQI z3tsAa^)AghA+NCFvpcbupETT`ak@R%+(S#Fnx18?RaR3eMB@5i3zN*9S=F@Mab{_BJ*aH3g>NzRbF7X8R}DBE{(}nVfa(& z8Vf#9%Cpr4^Ch08xAAmP*hVy$Hm$^IYVSgMyu-ZCQf>4~9NG`!_cv=~ zVVMQld9i}KhSWzJ;S8r0$>0?>0jbUxUofU=G^tHP@ohdP_`8MuPuddFE-7sZTgp^z z3G+d+z8{<|59b1w2dTCc*tI~VlwW2 zvRiOX|C+Chg3A8D@95W;;Iux(yx~=7j%gGrEM*N(b5thq^4XsP4|)ooJ~V&8>M_DA zfpu1od3d6i(=MVZuem@^0;S&Dn#$>nbJ|7L=G9y1T~fS_StLlfv(w2M&TA9)5?v!z zzKu0?=&v=0P4fMQJuzBcWOabtPP?J_f?G51ql5RSj5M)%ICoHV6j;vkok-g%T=PMQ|URnxlh{v=I});(!z^JJn+ zjU3ng{ag~YZ+X_8s0GD5F$Wf#Ej{r5;p6=inzoHcaED!~MY{BAq7ReJ-4OH(=nGHjFAL7EkrkA>DL zc_(U`SpZ(v2T4ejDqGRObHLJ8bfNXSh^BU{F$N9qcvza&7LS(E6|1mnvYyiBY1g}{ zsaYEX@L)5wfYEix6_#W(5PQil7fo%WPpzBy+^ronASPoq0_wUuVxXhO8JkB6LE_XSq?)Vhy2!qmuto!vXoyupII)b0i~O4Z_J z7Rlk%z}tI1wYx`r3C>O;p0_2<)(j#_F;yw%jVo-MO)=dhl!$_pjV? zp;G1^7Rp5=&^}yxj?22(aue@&LFaDrsvd^FGgm*S`Cskxe-GB`*3i-jm#tgw6I}j- z#y#-ET=M0STe{iwI^QC_&VNNOg8G-bw0dF{UK5|ckvZiX%l6RQ=1K7Z`W(Gn&t zk0|QX8xDG{eR{lnAWY8>`t*i_UICvTJCMRkj8+Ni662kX;UyO5mzclTF|5RR{XUgg zCCpvE$@R`Jvkrclk;?HpX8q&>ybF)~sNOD{Mb<`~7z2NEVO|CNlvksBLnpA)2za{J zy$JINWFb%$SsOgO1+aUqgJf;d_XO_?tu?YM>a;~Onvau+spjiGJk@+nZK3rn*L+z6 z6Bd5W*R&FST64uKvNh3)1ufs(uXg}Z9VA+qlew2xa>`^-VslLC5v3!+Z#+t{AunU+ z7mWa8K#Eo0%(o#5{Tk#Evv@j>MmO=QY{S&ZA`SNRNUeqq zInOpkQ|op=)n=Tk0&3Y>PP{!8yzEo!j{S6%m>O+^V`r4l+g)r!G_~%%$c7lQHmGIW z5Te#Pc*Li6H>ef#d28kI=9U225KZmwUSvZwZ`n44wS)bORa_f_vnJRUkd_o%ZqqBR zR;#C0^|1WYC)^Syeep(VWJCIB8$w!BY`M`uYt5=2+56P>bJV-P!unG~>yMej`Xg-^ zR9}DI!M*)~XTUw^k(QZl@wP{lI$`-9>N(Cr`4sE6rnSgS#d$r@*&uWMq^Gl!@aD$s z-8ryyW=F0AMy@(A4y|M!9*tp?MpCfRa{@gqrpi$VdO5SLdR$kuzZh>agANiNCT3Tw zbT3`Ki{KOFLepDl7nFA)7e)=>`Mb%uU&yVbrnV3@k6XzaNY$?^MC*2z8`FY@AAv`c zdJ;4n%!}(;i-_79)^MVRRIKsO1ULK1ofjoA?7OpNSf6yJ+iak=hJu z^;p9-wQec8m86Xq*&43%dCI5O9d=yLRMRr6CLT5Rvv*?+*VMWX(yb(Iy~x&ZO>Lh~ z?QT$u@Oi78gIYaqB{j9X2kBOlc+1vsE>rLP5J9aZ&iwGp7OhfMXRNIMu*wpdRo*+(R?km^Ycy{vk_?VGVpA^$Z~7G zygr+G8)*63sQIF?ou)Nc{K~t|%r>CK6W2a1UV~4xV7d7$53?mG`IdVS>f8*Td(o5@ z*^yl5%-ey5a`Ea?FK4>7)}qmv*YdrMJ_UNP4dIr9h4S!Tax!RjI`A6mI&5K7Nj9N` zE@uyKGVIrWcr?7#^NXymx~|jGy0CQh>UrwvYI+N;Ke(rh!B<#MSFgn}< zI$Q=?!by@mKr2v&t?gT`X8ed=KI}mpX27|TA}r9dquI0dwu?1@y(A{irOx(j<)+nA zw$il9{}rv4;(JZ2^7XW+P1k%av@N#DMmf;(Z8Gx}7zHfN*Fx(x_{GrYuLN3edwQ+; zqBdRAnk#;m)TSGW81(yXy3QkcrHK|aW5{Wulmtrtj+U34Hv?q?hEEBap)Qk^t-zY` zbXZB+(blUjE$YXnYYnP`6vIjqC(2vvSu<{Dxh}HS!w&+@$j6%Tut%>b)*mfq&FHQ1 z>@uo9rCS~|;;Ypf508Ch!L>+N(_3h*mXuSO2dz(@j<2^03@9P6Ey}r(u)*`r|d5^!SWHghrjn=St zEyOG}0Cvl|4a3vbY8*xdw1=99mf9lKao!By@nfVKO(92=TwW}N<4!DTXJzM2a|ui5 z5=jUC!>u>K`X^{@V_Ea)7_=OXRi=c@riIhm%}=bx$j?=m7HCq6rLf1yPjM+|)nZyp zG?u%^NJd&=e7y}?ZI~~fi!oAN8<-R84yT*Ffm(RkUehuIn14Zv$$5nE)`Y12P7iA! zweMK_$9Xga*3$#4A#9U}rT0L>f(Ha>VQmK1aac?2#e&`jiq$uzOBF|6^5Kk;y!>u1 zS_sQW5z@Od_~^uP*lLpfUQjx+4W6i%-`zL5>65D;2_4!b`wpMjq{+nL&O@>k-X7R@ z_{Iqj%o=+KjuJW9>FK-f8h@9OKqt@TOd0RA_fpmg<7mqNorDbm9|DyOrZ*!+(WW?e z6T6#jW3=VJ0uGbTMatpGJIb3?E7W|W+(C!k&7}9Xg{FadLxpG#4PJMb23{)!8UdV> zjrX$QG!|a3`Ayfo^exoGJESiw?8R@^4wAp6z6Yp+I_ITd zqiHcKFggbd`aN*WK@JA0K|~}VaNxeKjW~GVx|hN^l|s+n=*4h$Pm&@=o7nLK2}Fo| zI4`h3K4}Hbym`&6otkxqbLaW~kvsIlL_vWwWU(&Tu=9JzGP}h@FIu>bUQlJqVij-}E>1WcxaJ-i zx4{|p*fCkT%45z5vrOpO=R$jpisQ^XGC#-3yBn_obft6*oO;76Xi%DXJ84rK#9>P- zj~Nve315{#lA{wiiZv`mx$s}t9%+!g5@a9Q=dhC`fBMyV(|Pk(`ID1mPT&mf#5t=q zL*S2}NCe ztn&m~7c`0C zT7}Vjp%D)`BVVNqFkWBCv30N-@Gv4~yawz)wAsPIu1&_PLSuiXcbAK2Fg=4^96mh- z+a!-OJv~PK(D;q%89bEr={YpV@Qsa`NO#2hp|K5XkZ8nCL*Dm%{`BaGdJ1*jbf?NB z&Ib)DyZd-`QGWH9KN=lTe)GBcrD3JdpXh=7ZV!_D>brO~S$?KL%ZGjW(Yi%rI@7}w zM9)ld=@kcmbNzI6f0^j%{_=;`5T<9yV(4!8^h7ntZ$H!1J?0NB%cVzMW}lvF0RFz` zm51ND>mZ+o_ZA)>__b)gU;=tN#LpsYtsc`;A2P>yV7gU~$62jiyoGw)P}d^7;a+_s zdRv)Z<(%}&V|PXvy}lSXkZ0XJLka0_fL5aZ*5!VcKVG5pD#GYt6?=-_rC*up`R6k9 z4P}MX1Kv>Hk8L(&db7j$X>wJ{WNl(}5W1z=%8t2>O!%2{2o5+81pI^67X4WPiKVnTP=wW9ZkNISAm@t3* z$ZM|bOQ42TFpTv&G#)m%7AmSg?j{-I6bWGIdcVk8t$8cQr%3pDc-C1&r$_)#*ZW0g zJG7b@4bdBaS1W%M)&)MX@KY8RS=*o)7+u|7jqrS*SYKy)_{j*+f#0}sT=NSO6q{b@&(S?ovv|T!ie6U?Ix>&zqj7#>Fw&=6) zSeMcIS)m|}U(p|d^yZ3XlE<&b(Kh+x*K%l^*4e)R>poy%Bv$4cjSmPXyJdoeLo8uU zX_57tmT-QyJidg>p~li$S51p7S%(|q-45+M$@CgAXN&C9jAxZVpDwIcRD*VY&-Cth z@w(j*?;h|sp6NBwc&-I?Ypu`Uz2I*d(?cJGwRiy2%Z2A)#i899H3nMT8hCQF69Em- zK1Cr4`C1$U2|s9;!rrNlC@HL?RePO%FzK@(Q@o*3V8>cxj(2`{4k8}qZoOe+uai_d zUYU%)5!}2?_|kFXBN+c6c1xr%{uK=Bh<+u;zZ-OVa{MWm{tS-4jQDiBB+`v?@$Yc< zf^+5*J7xmJC$3)ve|Uc{t}!ZfuRrGN7JQAFR`W1j(;fkRpLY@kB<9O;jZUuY!uK8j zKJAeT&>ks`Z$HA<*Su@@`Kx@*`+=}`CP4dvT>5x98?KQ9T%*6jds+gt?*-RU$X98; zkNFH-V;!hfhp$i5HJ_w)D|>sH&P{e(u={}P4N2!?!ZIKY)QIri%Q>+o(w+>%W?dQ! zuOaQEFd|@^7>zjP-9Vhv3(R>g$=x#N*sErC;2dL=3A*6Xx`%g!K;mo}E9$)-)K%mK zDTGx4J*RxUPp~xSWcFa@unZP@`8ck4twpVKJ8oXi&6G$#e& z@9|Rs)=e}*Yt)T2q9vySMRxNWt|7cjmE=mhVsSsW#^lftjQ84Lt=Ny&3~<&&G{?JS z3zwCK(WFU{JCc%`)~cF!bb-7@p2X(Rud03ZHTH(mU|laXr`JyKdqnsJVnr&ruZJL~ zMZ|y7ZO^!o(4U73fq&Bl@)|_odZsFs4`Y)Mjg%J@nRnecv13s>QgOCte%7 za8&)a&%WQc&07<@uCZG`*z&$7n^$O+(tOIkHAeL@)jHL$+qq_Z+vIlRy4R@K;n8k5 zxW9Uw(m~GJ~_7}j&IX|8I zi1$Ynh{9_`Xya@24(wv~-4OmeBxnSk{SJxy*W`SKL{@%I0ApH=hv;kp)V*q=c+30!k8^&_D69o&=;g#c8yHx6 z^g72~6KgaAm%daMI6ZUB_0PdsQuMw+D;gf$79OqM*z+Ae(?18+nj|bSu*jz6?(s)C zbYy<#U`CH^iqnHF8QXc}V-8l0Q9I9laqcBx%s{<_8}-HEZ(k}VTk&Qld^{0L;7_kf zuaV^wiS;X&>Gdhb@bO=a8~4R{hLgPjUE=v^u$;}zk5OkMmPt_vej&V&wOqkz=11no zSzT~bjD%**wKt1sctYav_A9*qJT5vuqIh)ah-i8fCY}64yA5um*BuoEz%fPe6$XMf zMc`lJA8!B+O1?=kBkf{^ZqIn)I8XNegMvuzFYTTV5pTs?B)VR9}r1)u-<|VS8?2cRH z{mPb0S-kaFL=TH7K8)p44KBjm5~>t#Uh(RW91)(G~4(YY;KQG0< zheE|?ptTY*#Ya|z2Nr)EPJlnxcEgq6A&PRtl@Z4FKgOv7NtblPRiR}#$d2Qy;mOKw zxH|Nsh8wPdXOrA;B0P!7Zn!4sVErmTTMOx;>&W5Spo8^{9Ik_BySw4Kh`-MbCt)Pg z*A3T$XL6Vut`9HhV{Z61aR0m;ZUFz~8*aEEG%&*rW2OZ=uytCEpf@xxgpX_tI$ycr z*2wv8H+&~@e!>m65k*jcH2z(p7>y?Q*|wr6{2n^oP87%b5gl$XV&nsExPvGm$GG8+ zphGQ@v|s_nQkmg~rO0P=cf;7{X*}SDO;Oqy>4vSau#JA~3vN7odj@&MiDpnVHNJAg z@DiK(+;F5wFpIn4yduWLK4`|z7Z%Ph%bQ)@_$X1|8smmbWb=m1<+DD}@iNbHf2Vd(;gFMYMI!4M&IwoU*E)jTD9O+9e&%Bl6g#-Ed)1 z+D>r8F`}~F+zl5IvGy=GTvU{|)7@|}5oddR78mjMb~nBR=$vxH7z^P2Q97+sA~sOV z4P%t==PN-J3UqYiD~Wsow_If9Fga8S%X`(ZyjKg$d-d!xl{LcTkQgS1nqhLN6()z; zVREPg9#UO?>WVypN8E6dC>nUi4c8Op19-m>m9MNXiU-!Z;oGwHL^cp513TULhRFK~ zH=Hbr20fWH5^=#eH@>kb9&GA{TZ_uUo^JR~kraH|4Yv_hgUj9UT_Q1fzzw$*)gxRz zgrB%pL<2Xzy{H^9#0_^4bt0y^VZ6&QV)H#i2aXxiV${fiDI*_B8Q5{u=n?%=?@1Xt zc*vOULxzrQ^~jjf{o2zNgRUuq$ENlh-63V*(6J-BrHmNbd{pW{`Y|3~r1l#y{H`(m zQil%cI%-6}kzGgiA2nuF4Wi`+vq`!UnzF`o6L9b7bleLsIrowhbAx{3-Yw$64f{C@ zW|+T{Nix-?`ZrF!<_+)-wdY(j{)W=#6N`lm6^^M(0vGP zM@@VOgF0c11(ifRHA;-&*ii@#7O9{#2%(X{c?j`D-Ak=cOy2 z91N<2F*?T`;yL_Y4_pyqP-I{Tz zyt;9EW5hU4pUO*Pq~d=7_!;k{ZdJjz*ZugK)cH)nR-5cS3m)ZXDWmT^4bO z52sKa_j1dzHsnY@tt&T5*W;$2co_T*<+AF}WgZ8PwO(jRw#Lc%T|lWHcuU4VX=At+ zk){%dp04D~Un003?dtHq|I|I8?A3sK5E{tx(b67?p8O-YrgA2U=z5YJ>VRhlB7Q71 zpc}#?5N-}`QW5L@XH)QEnzJMZ2wewtxn!4=monAQ-1o9+W%F<&yuZGivwqy@`S5(* z=zi|J-U!Fb?Tzkb=i{%i{z^_Axy-5Fr9z9x@IPrR)g_7@nX5*7QVp-mHEvkCIWe*& znKM3ILOJi`mQBvPUVd}NUN4WF_p>FDGyZzn-Z-Dv<7KCKvm9Rk%&lYQ)Udzf`R1~` zo`=7d?)CULmiP5|+48v6C$h^#py$IMH4OFsMjwf>Bl^i0ffv9?!W39vKpz8xd7~HZ z-3z}$6WnQuvrQ%1R~jRw;VWTT#sW^jSK?f*X8|YSD{*q&WWX22KLDrWtY(Sb2JZpR z#a<|hGcXq+l_fl0T8pztB-S;23b+YhiIYOM0B*%s;*^Xp0l&sM7*c#Iz61OoUy0p? z2LKP_E5#9fB|Hd!0RAa50Ymsop)iJ!(!}UN$_N<=SX5%PiFfRk28@&C0pn#QValqK z&XuVvF}B3&srrD8FmA(sNZAtbPKj|B&QI9%zEBB&ND726hgi%Ln)tHQ_rAP;>Vek|Ogs3_;aR`T`|X3H3y&`Tef9CRf3E*?%c;*#eQ|o* z=^bakIs5I|o#(zk_rv)g&+j__)A`*O_FUL^@qjw$9J+M)@-LTvz5M%?V^{yUdi?62 z*G^nJdF|A-)0t;7&t{&>I+#zvNnET1PKU*&vN&8qpU z<*yl4t3aIsb))M=-&U{z){-|W)VNU7nC527BCU&bF43h#SNp!w50n{LHZAaAg>mtZ zR1`&!ca%1AZyq}#PfO#X5SK5@%Ti*tC`&jrr-W*Akt>dr24iD^BuXwq(K)w~kt(lp z@`86%CoM+R;4?LBr+B8ac)zY#kR(1x63cHBhg!)xeV`HKOCx!k!kQq0S(D5_=tVma znkoXJ*YJDGwnOg2Y%UO)y(yRDgvz%2|@I!bN!mAa2 zr7dS2?yt*dIUDfS-cRw{h~K6Qrn4FUU*$EOgIFARMo3H!WBv^DE#QW8FRU$R0?wCb zEcMf6QysW$sADG_2t>%sm+`~@HOL_(9F&it@Q||cAEBg*gn%L=g^G=EWTk>3S*>7} zY+L!7LA%#|>h{T#hB{Y38s{+CaVb_A5VE?8x}J5|P+1UNR-7t6Lz$REw=N51m4$RZfYJqtL6M5<*4Na(+6` zAA!(>B9Vbm`q_dJq4aY`5Wpl*5TNLVVCW^BB@=qn{4)S>0;OP`Fi{jIjLZz<};o31#H9lXZD? zrwvyw8P0}GFu5T!79gtx;<8EtYVjhB$sjhFM_@^XyrY`jtgm)C%| zNuD;G&6#;EXUma}0cXq6j<)mp*`g*uF@WlDb zDq{e|8tVA*T9!I~9&u-PwldYZJ!LI*Zhu)roj=svQUhx2xNN0G|9aJA(@VwAl}y;L zB?Uri))qTtWS|nsIrrHiXYLocoHxJ@g%+R!$wd_`M=eHml1q>`wFDJOEhz)A^bX5$ zmJ!P8@(8W{1)=r(O@ONel1#_>q?+ldE#Kqv*j1^dSjNids-Cc)jf~8)((^=y%xRGT zZ)XKV#@kRk^X=jU$^=8!+jW8=`)w3!;GIGdA?uwo1Y!YZ(A^nzB187fG9lBNNjK(Q z2|C8S%%CIZMF$;oUg-ehN(UWlUhSY`&o2|+~g_lrA z7v{y~!eSAQxv(1IJ}e&Tm>(4b_?Y4rHw2Z%t%6Qq$>jjVQ7Yh=OIk(XvNga`y0MHd zSI%*a(8?&htaN2jpsXxu6QEEP+p*U`y2ctCch{6O9dixcUDwif0-I3O=BCn)VQz+G zt=0M%rAtk%w`x+{+qq(WOKsf^S4Q214$M%#1fj#8`ex}EMhP(hk z0Zg6^#C?B){4$yIqeU)a}R>fS4o|Fm$+g&eKuV&GyCR2lhpqbF8fnlf0IC-E2c_` zylSdJm#>(i!2hI7V6l`yC^W&o5)8=+MIvA`o~;vs`VEMhKWWkTc{44*e3{ndUp7W$8I$`wfhKHn z%6Or!Op6{2Q!=gKU@H`QBl3GIB;UyMy&01KD9{}-ZzjMb611GqJMHreK@hT=aSqj8 z&PYVF?9Av=7Y*So^EV5&%KFU=sdobbn_v)d_K~i^kjgO7#sC&1Xi@mRvI*b~&<2dF z1Uhr&7gora8ylo>Y!G+nmJOnG<|fBuSHRpx@j`{>{ahM(oF@l>w|S*0kMj?QV3y|p z62c)a^N*oBBIi5#Y)8&l`H`3T1&P}Hf`s}0K?j%%evJc#1?K|5`QUIlgcrV3KX0bF z=-UzqFT%2JM=gqlPCJWYp>WPe-xfgpN8d&hymT4H>tm}Nc>CBQtNL-CDrA25p2gk8 zd(VOX;)_RNXcxy6L5hoG;s_Qgf?O<)yB*X35wirZJBF2(FfeL~6-mZ=ODQ}Hh|*d5 zuTnw4A7Vgr=}(1`qoqH^5Dd{%OGEV3Ql}_A<)G;TL_4LHZ7v;=WiH!U1Wzry1goW% zT_#SJUFN%2WAN0nYv4*P%QRr|m!J3n#%lSA9|>M41^nfODx<8I7p?+smls9LsFoKC z7>-);(>|E{6(=VI9BV}k<%7Xk8OjeCuG(4?DFQ+tR(-nzR)5tWA*8$NcnGPi zI&+$E&h@gL(5iF231)tW6jx<^X941<7ROorJKA!&`UKj0x%%o(++CeN66vnSVfBt$ z^V=@OtT}QLDXuwvi6NQyHD|5>e@)0BXdDKGHRfTYxW@d2VBS2SuqGc?hRL-%FF-fe z?)e=OUV8~$2Dz3vS8GEs*J^EaIh4q{FONgQ>%ROG)*le~>wZGH8|(I8C3xT}#T+_E z@bI5#D%KS`4kNfOrZ?7juU}CuB4hwYW*O@xx3Ezbq_jS&JScy1h2+0s?%v2Od&Bu9 zXiYX;-UzNXIE|q{8?3z)wjY3r`E=)2G>D&`$^wTQzb=V74hXI`?%?oMD))_<#liE& zEXu{kh*A_2T>+eI`mz)-Hyw$CWHud*gG@GEOakVni}eWFTOsXDd1G**@uqxe9n_}i zPhm_q@7NXynVWZP2Uma;K4JtMV{;a|Q*yHz0~v0%cO$LM_8x+f=oYEZj-V@He0B~R zC_g)ou8{mpl>p|JeZQlmw)}bq@&CG59K3!0eGk<1tveOuw(ZpWXd$3YrT*3h(0ZA-a3v8?<`z z!gpxS03juU6#l*{#qXw=i!(9AF#%B*F3#fczBt79IbS@}P=gQU$ui`S`1}Au`LMzdV`r_h}^lmcP6s zGAkr9rf1rrEc|6z_?s{rU6L&E4F9ReR{Vj=s2-<3Tg><*6Zh1UpTWwJ??;cY{cfCk zM3gxe3<>b}k5d312}y4zb3^yx z-Y{Iz6ZE0cKZSIMnf`5H%JNI`A1~lfiH(kh_awGxn+(9_aT@@;_CBI=6)+4ro4k7Hu z2|4BkdPe?Pd0>3=_~wakCC0=rt{9P!9Diui!wJ(9rdMlFu`&H8BqwZd^mA>IJg;K; zioI$~snw(6<5jLD461l6{`F2BG$qTyHaDy?NP)-)$Pp5^j@9oHcgmbIiW$1dW&mTZ+fWy3-K9E zI>xuHlsed%P`=`^Dl@ypCPgJ=RXmoouhIuKqAFiW$V!X>Z%DP$v5LnUJ{g};V@iD6 zY7OX{FrC6Wk2*fS`8^MiH1O?TZC>?~@%P0~ith^8HU6vkt|T4(O`ew+6aK9j5r0U3 zHJ_TMhh3{j!l3YP{Oj%)QuDqEQ3+9rF$sgbU&RRhrSbrFu3y6R_zl@9QAz2qj;DK6 zCJD)vlDuF11^On>qi@At;3$g9k-o^?eewN~!|*S~>939@Iq0vB?GJ4^q;pxT2Wd|H zp^A^wHAxj;=uGmwT0Lq^Ntj-%2Wbc7pA>(n;gcGtT7#uou2Nmp zU8xu;(*$UfQCQz}W6r!Xexq5A#O2X73*tT7gD<@&hZ_gu05CC-Z$>R0y? z7WjYsai1l6Sob8; zIX*b?`lcU0tuS8H#q0d2KKj&YQ58IR9HiRK3^-B6ty07*V#D5q)9dmOS&dbfP)F_lV@%^6t75ToU^dIC0f?uI`Q?No6*Z<2fPPw zRW=^}fAa68mD?u$M>MCWkNi)b&;6|WFVf4MPddFU{G)PM!tgu)v+%9do$xf(r#aJ6 z8*^U&J6CG=_1Hw8+Elv7?E~f|)vEM!9KQ!)t$d?nk|pe#H-Cx`^5;E;JF9s%83X^tNPGH+_<7k`B#7 zxO)0ah@Yg|;eT}c(>`xOgy`pfRHgKies~z3^Xega)9`V|r}yUoo^kr?u$lzC*Ep7e zLS0h%vah|6#|vGnPt$+k_`(Q>^@Y_BsK1Y4Y(w$e5iU5{a!%fMLH(RQ$ER~gdYl)g zf7K{GK|PprJfga!qvrnoN4<)AfwcJJ{)dnCc>D-ks1D*sZJsx-46_Gh%Wn0fCT8mh z*_B)Qc(#Xlp%2?&*l7MxoA36AIG)BxGd)QtXde`)? zcB4%>k-nMZs898GpRhJ192MnzDE#`C!(sI3+%<2Eq*fqIeZHOU?>GFD4`KN&Q_g{? z%4Yiw)ZX+ja@@Shg_job@?ZJ`tj;)`13a!AJhGt z#fLxp|F^JOgm&O!dL7MwI@avz4~>cF&Am7Ks9c%{e_3a?U$C_|`Vc+u!)=@P)y+|J zb*y?7Z3WuA>poPM!|F5Dqrdt%Bf{#(-Ft4UtSoy?xiTK;wFBJ{|f4}k-LOF@$-q_PW*Y|Zxc@eBj+0UNYL4b zA9|A$&)|1Wh)JmXlhC7`R2;wZ_*F+<;EL>Jjp_7vTC&qR0LGjTWXmgvE|CGO=N68G`mh*3syqqs=J zu830NLEZx~+Ngs)5D)S0hq1i-;bGqWFphUWJi@yl9_QT;6L|N-^Vt0$#TnByTZ^-1 zJM(>6&-}n#E2o+3&GmAQ`Kh^4&ZWH(a=!Vw`MG@G{KDKO7nom~JLE#_llWGCZ0(GGhr<{BNW`PO`+leNU!XmqwVV=2u8wy-T@h8?hjMh4E2i!|ogdF}kh zTVH^O@+#yK*}5uAI)iE2j(Z%IU_ta_+{ioPF4bc>v#gd2h~ryf^25-kZ~l_vZBF zy*X)EXeq^myf$9;(gvWYli;s-D z(6Enrm(60HxjM4QQoU8?6@&jbE&VT9XG~$l=lf^qjd`9 znuT&LYL>Q(+a=6+DqS-HbvP3%ck*CgLlGy;>@ZHkNw4+AZFmcHL+od5BpT!N@g~?GIvD!#EcWKSBwi7(;*^vn zuqDgHafHv zkKv6FHLePe;~fw9o|&{$-AWPEHaHkKGmjb+AiV}-HP_`%p^>^6Qj z_8A9^L&h)0Z^lvMm~q@VVVp9~80U-&#wFv5am~mw94u9qunD#qG$XOyCcjz0ENI4< zMa|-7Nwc&WYsQ)7&3H4xtZY^_tDA{9@UV`VWY#wun8{{ivx(W%Y-YAFTbXy7cbOUH zd*&Q-t~t+~Z@v%fve5j{TttV+n2XIN=2CN+x!hb~t~6JftIaj$Hgh|y%U9;t<__~4 zXvcSCU(6q1Uv|N|>^ApcVf9{fpSj;WV4gP5n&-`n(2{&slvTm1V%3CIm}zC$73_*A z`7P`Lk>Zm2@u}mu-Y)V!bqxQP)b1hE@qa&TJlYRgnmw&jo~0HM*Jr(J_Es3c-}uyK zIY}*ksyM90c6IWpwH)_8+K{t&KctYCc#K4t7y}dLkhZ`)skS}!9H^fHRYMk})MP5p z5^I_x853t}$TR%hS;92mp)giKwdLpTr&%YYf>w~?M1iMTV$~LnYwqXy6-(r2ip>=H zQTx%DQg&cZ0`Bl`o@R{KgJ)Cvu}{es_p3RB-vQO`PZ{9-?BGXm?)q6U*`E85Hl9RZ z5&OCG0rp@&XFrl9?$h{!o+n?N)%uA}F6{_#(qs7)~V! ztnECbc9QdXNiBTx8G&)ylj#yC2;(`t>FWkqi=Q0ASp9Qg1tA$4y>Cz#2bC9}bGdG1 z>f1RFCuv;gmUB={Ag`HN!FgT9lHJ0%dpQ26It1KQg0LLAWWm><#xjy*B;)8gq)y=h z98OVx3`zyR-wzsuC-(3TvXcbmT_hXXmZT-ybGSdvn#h4v8b||o@kCG7(+O(U6E9H? zQU-}F>Oe}W*s6}Cd?og%_n&wTy0kszfb6S&P5B(#$}Xw3DNRWZDLui}Hz~Wo)m~6c zR-IF}AiWtW+rb-j25*c!2RK5tPuYd%Jc+MHx|h`PClc{AVa0K7lBo>w9O*DipY-zy zTAdhRoy^O3CNiAFFrDFKhA$8_FEhNtFq0rZy$k<&6`-8Ra1z6GhLah-KoCz8yuvV( zpiX<>M|k?;z>n}WL8J|cv;mPeAkrTA5v2`?v;mPep2{PRs?R{>lKKV^@_M`tWV8c( z+(olTC=+Oc>`&fglnH5Fs(Kf21pAlsiUw-;!0KWr!(9YrLx!ygnpGKAXPC%vKS666 z!@UHdmA!bJ(}&?HE{!CHEg5pW*_^^A$C#}-e3YP7h+!PVBLqPYW&haY;;P#7SUTnC zv1dpF2K=0@0Rz5}ZRjrP!GImP^67)k$`Bk6z^SYv-+&}((Os0snf@oh zG3jAjbrj()96y3%(kKj$aTgo|!kQ(r#b`*-Si*2A!(|MY6Er2mS`6zjOk!A{VFQNA z40jN;o@Dqm!~Fy~9kM_TNiUEN!KDnBFaXV955&+(BWaL-1*a z`w3z^vPXS{|Dy;A@h97zljOe=r@01%SVtv!h-8p$Q)$-VL|Q{7Yq2G1!0}BPwj~>l zHsEK#zT|t7LzzMyElRMYMu?;&OXKCyz=A{%~uMCpN^!HKVdH^%{aE5$y_hm z(o?c0Te1P_D}+-Rj-Zx6j-=KHEdfStXer2(QCOZLS^Di8+065#$3_8$g&9_3Sc5Q) zniMvNP}qE(!`vR4GdN}@LF)v=YYamK?Sh197o{+#N%r;(+qAQ6)6P?_kS4*x468A$ zL6#Y5A|7cXj5I0y4n2!BDP|@?q)G4^!w^BF2~4DkFl>EK_U7KtEy!EU$7;T_hAqh! zmi>12F7Dwr_$bT&68Y~?17?2w981t7RXK$<=oB-C`c4c+_-)aSUNa#yvt-1gR8-KGD3{26d)yXR(=WfS2b( zi2sV`>c3`*aD787SqSmRNrtcwSos8w2)3nnd?5eSR&;Q+jVyJ4YTxBRYR!>zx;v8P za)~Io{gR^OS?Kfle_9rOo}senlSXCHX9JZ*pQPMn@$i$`W%2MMR2GQQWlCjGFB&pzMbO~>5ZW|^&FTyj88)G(%%%+I zGhE4V4MTbtyf80P*otEK62mDBr!t&II93LS_fi;Rux{!^udifrhM1@AHPzTkVdD#i z+Zb+V_$5KJ2*Y9wOEBEX@Nz;EI_Zph9rncoCVh{FV_vEndOOIgN{W#ac31lP1B(|@Ud1hd>`W7+k8GnO1 zHKvXDlvhG+Dk& zVY2$--ZA2U`V;W5`W^A;HzSOG^Meml8}i^lXcTZ@rFT5|u)LFSs1FTz!#*@H(T4`+ zM52$fB$&<+H3Q)n2%6tfis-jf_zJ^Jg3vUiW!0p+R&9oL8P=l|tv47RV4OqDIhD=+ zvAho_)>1iNs29}cHc z_y&5IQ|s{5UuYffqV*^EZ)zR(j5T1(+L*_@J30IVhj(#!53g?dnPc`dJiu1)B!|yY ztASh+tV=PlY&3#y!QoaM?#$sXjMJOLgBXrtm`3ries~Jjk67GUWat^bj~!U53*L6IKooIm>C;Xw2K2N4}ph*_gb=b@zp>ryysaM;sldg=hj zU!-`n-CDPSX_cjT*jUo)aNT~1ai%bw%5WN`i3pi@iXUG*JI*yRTgloa|Cd^ zY7O|6a}w}tCj|T*&K^+Mqq-t|6dp$!E6_TMKh<4;C+QR>jE@TgUQ$BIh5i?s6Q`TG6#S zq_q`rgtK~Bd-1rcEED00?9k;mNNY;h1W0Q(ag((KMUz-KGo~ z-|R$BnVlJSVc3;nH-_CA4rMru;c$lYnZinjYZ&h5R8Dg$XBnPnc#-a+Z$tGcio-84 zoWgJ_!)f#^>KbA0<*;s#4)IeM=OF%fO4m9?(B@oYrm7U#Vn_~J3dvDlp)teTskMd; zqxc`#s_)|P&wO`3#~k3E#8HZeT&WLHmtjMWX~E%E9PUi`lKZ~!NFYUwf(Z`d_*4#$ zqA;u%(uM3n6S60m$gl~=H)S}V;Yx<9C>2;QdP?{0_cQ(hj=xCpkQ{IzISLo#a9M^m ziGSEIf^`|b#5hwJPGvZas6npu>|PEtW$O@8fc(0^!~ZnS8ztDCA-rS=L*9Ven~7%; z1|2}81&C(>kzc?|JkGho;j0|J#^FqcS?U+y{6FsA1U#xLU;ABq$gZj|rK&PjRT4r( zM5Ga!WD+pO7y&~_LdHs^s*)g+h=7QQHtm3jh^QP7B4V23K@QS1Z6hKgMnooQ8j+?E znM5WPQ4u1In0)X5-HBiy``+)l_nzl_o|}5=S8x7n*n6+N*4k^Ywf5SmwMNd+ut5-Y z1$Z6Vi{!l=)>IVx05V77LCF#p&@zH7CWGW%;;L^JZ6HU0aioXzlIzLONYvl(gWfq1 zA;F)7Sm99Ep6o#Ol9Wk!$WP=dPfC^(smy`(9_{itlb+p)b6uqeXlKsg6qJ@7gC&p<0~W#(dRUh2yOH*^bRc_^ z3&_>vN94ysjN)63wb9+U?-io2d~miZZTv2}5BFRjL=U0mE_{)ecc?cuo{3^aPQ?u# zgRAiA!9#KVO^@zSABrEe<>4Q9xrhySxx!iG6Xa~6zC(QKe<630e2m}1M(Pi!w~)taIYZWyKgiZ`Hz52`h&xnl3wHy;u4Ff|2l-ox z$NU}n2>BTKIQazmB>5EmKTSSE*3o{L`ZJ*#sIK94Bejfc!JLiM?VU zi^fu#!Xz?4rjl*RcI3_E7@-~}BP2&<^=fMNI_fK^|3I!J|46PP_mTU_10=7A`e|zR zDCyr)^Pby?7i}bx$>i>$X!N^+KL|C0Od~VM zOfpPHNc5~C?cX6cknfV{n}z*7@)Pn?k|SRFVd~Gw&&lKDN%9NwEAnfSEh(KXDcx>K ztrNR(ggizvtf`AOon$LAK&FyB7PAvINA*nfLc>4P#4M&RCCkYQ67PS8A0DrHFE!pG z3d{ZEgXCKB19FQHXW$yn%eap0PWB`pA)g}`kbfrEHf}^X)HC46VnG=YCXoR$m26A4 zBX1_h2vG)v5weP`CYO*a$Ul%P$v={-$bIB~@&I{=JWZYxs>D) zp$v#0#)dKgjWQr)%AgF0X8NEEh#p1qSWpJUGM=13P9!IjQ^=|0G;%umHn~TrzZ=~f zyco%@OpJaReWk*TsEXF%(-p~;BO~3S8><&oovFyEN(mp07FG|a&WXfF=S63RS4EFh zbdKaj2Un(7^op*HPONf9I!32gPKfl6?x+}4b)jN#MPWs#@={gT>ikGrbYXN**oqFW z7**vA@2r?uF+I8w{$^Ipt5{g^N@Qzfcg4!8t`%#;OT+8Jo5K4d<102srdI5z*jsTV zw5;OGigOhWA!o=FN(prcbq)0mWmT^T<<@kmc_>s8UKEOk#)T(`rqsmMj0s(+vBE{w zhpP94X4GVcW{2iiFRAGrS{zzdQxtl=`ci0pbb8odGqn0_^{Gh5(B>*&p z2z@4Wp)wIEF)>oTM9fZ$bglqanvLks{ez8Y`vF&r0zm@6KE0Ok1-^xzWwGo9qZ>VxMe=B>4 z4xg?ZP?=LXvT{OYer1rq&~gSUr&T^GztJ5y&z|OQRZ3Nd%DI&b_`5w4TPfcql`AUO zRMt`NsXSD9s`9L)QS|_v;a~Yi;&Ik{;i!6rSB0&gzkZ~B`|49ye!_9pmzqA?tL@L4 znla6v@FM$DGs_NBJfr6$u3AMTCcJ>kr7QFti6Mb&G<;p(P1!;`~f z!jr4(s_ViJ;XA9QefZhtZOCuULp8IotrhaY+4vGE+EBd!N3k@zH(Ve6GQ3JGRkNGR zMzjz|IS=`v7jy1Tq+))RC%g|nk4i2HpRSs1hm3TKC@D>mY=oJIbA1lE-~!6fAe4@C zkyyzcC_{rJ<(j{ef{~60*`GNBIUq7VGF5U0To8M6ev!NoDT`F&19v%(%u$1)gCh?| z=KSpI${hA9cJUi|K2m!*mtC3Tumy2L?usn0*%?_K+0dL{uKX3dl;>Z34@6ExzKvXz zd=fSP>DxM*9L9jEV3Uj#RQrUkg1=t7KrsPkFv#M`Z zR#k3QNmaCJT-B7S8CA2Z=2tDQT2}RX)%vQ`@GgTL=_3D<@iPh=VovM3C zZC0IM9jqQ%J)wG9^`q5uQI=0tUy@ve+&8Ow3I02aT(*Mw>QIfvJQP>c9yz27{LF$| z9dq0s)Hn27W7T9LY#j1vd(=+7@!wGRE~*K`IvIIOKC^0`tyxsFv}RS!x|&TjJMsP- zT*->@_AU}5M!2r!keqv^hER_n=aVmxZy(rtrf(eZy?_#>&W-WPsmTngXCcnqhbj4IeDBsNq#|oMSe|wLw-koFErMX zN62F&!=kkUSF~1yt;hhGO7a-dS`pViWC6((Lu*CsrDQo-K~|DX2eeki&wb?mtV{jvi51koUmj zw4?Muqu&!eLrXo0KGHr*q>mJIhy}eU!uGUuAiL7ijqE|9?-c%@qJEluhI~%8ZlX68 zuB*w9$dAcS>3Wzx*&l{ATzfa1FU8EV#;w))=-J1aQ#UpKVc1s51*IOz1t4+(h;t6^ zrvIiMf9m}V)!gI%72?4)4KZM*2Z$VjP>2^qjsTG(K;#GzIReCN5counfJTl0kt4tc zq2ve7PyOI~6`^cWi9Fk#MB`?4-fV_o%Zlx<)3UEam0kr3q*rN`} zBk+$r0wRxq$Rl6{!(tA1X`0O8MyTe|h+1gOLV>+`Oadt;`KZ(*c?U$^0g-n=_QHZbVjeT@KtgR$tMTUlPq@REQG~umg;=tAVVFJy)ux$U`PG}k+VSLEbu%- zAy1WhBu{~u@lu_So@c~{o@a!`_^c553$DmtAm+os59Y&wm=6Q?lvI))dbrME*tz69 z@;TWPnJoi9$ZPPkgm&aOXyiB$IS%}kJ~5*PabiXd^2R9iAboI0Z?xEix06FiylwCf zC$2EUJhGs1M$b$&g097l^LpkqJy|oKmKVsk$*trz@&_T>1;S*B0j&ek8Du6ICL`on z@_@vTRsejW6(D?+%Lz7)u($)zYXd*X_5Aqu|(8y zqEW{c4w5&hPWpqMnI_TXDwU^w_P=`3y!8RXiH;EIq8+@K&D3mH_ga=W_fvDp^ z)Nx?F%wLo`4jOeFh&m2L9alI=>NpT}9O#pMlR6H%J4ZfyaLl9^Eq!FWQq$R2J@`RQ z2i`)TS@d};{ji0N`VRGjTnFI?bsUH~4n!RXRxnhEp`zSwHLtnsB|{yDea46@_D5>B z!a-8IfpH{iH)zyuU?xrTgGwustI?5N!k_9IDE%#o6?hvckEv7n9hQ!aBv<_(_vefS0)0@dSKgQ5J)T$d zj?L2srBh6oPHt|`; zQ!m@c3`Oj(vqJvsNO7jsHq`s_~*AP13|WEPoC=8$*>6R`~?bICk%4)~nvb6hs~>;SUGCg!sxzXuasXHwlaEp*xC_O!c#)A8fk;>`Az8rRLSVNvO*dx!Amy*{ZuWQ-FyuNu^dAZ^J zc_n$#ym5I`@@9nQguV@3%$pqyRu-1!R?aLd$(x_IxNKhe`n+Y~zIm_bteHUWv}5Qhfk;+Jbc0MX~Q2K zJ{P}BhOZdDW_aE3?ZG|6_Y6NY{M7KX!!PAq`EmJvEZ5#8zjuCS{?PoQ{BZu5{K@$b z<?&1|7hYVvDLN)gei@Dy zo-1q!4hZIqaE|aqk48_ANEy*#MAs30M`Vr29Z@nOI%3?2DI;c#m_1_th{Yq8jd*>; z`VpH$Dik|n*NFWij)muk7mqkI;zD>?`1R&*<;u#n;a%bVMS4+7FtI4Ts8dmoq5(xY zMfpX+@P&w8G_q(y(X^sRi{=(Bh_s9(%C~4q(TYfVq?3G$*5F%Lw7qCg(V?PKMQ4jH z6<#a)Vf7iSg^EiNj{Dh?NqDV|*XQ1PtdXNwmVFD+hGysmf?&O&DKPJH$i zA1yvzTpz8EVmcZ=v5~rxczn_#he|p|7eyD9bSvp!l3jxASyEO~9o8>5+}JMi6GdZhHr(sQK^WzI5BSxRJ0S%18uf7Uz{MEPJJFW!c)0g0CIn8D)DVrpm(T(Xu0mWt_xPeg^SOjP8q`F8fl-Z~28v zvvPV_L%B1Oh_dY|Pbu$E-nG1Mc^1F9vI^3CPD z%J-KaL%zLGIVz-rdaz|kNe&Ap2GfI`f;}WR1@nW!;K<;F;I!bQ!MVW&!6m^J!8O6U zAWCQOQ1DdnZ17TrRS{R=uV`Pja%^O7sADKTlqSDdenZ_t{X^NIJbueU z)uHjBsiB8Mb0R%L&xdM5%R{R}8~EKC+8sI&Iw5r!&WTysx-z*kqq1{2inQ%jIjC}Q zWnpC~JcV2=XRUI2<;==?l?y9hkup)av2sV{-pV7DUsj&0YzRBUo^VRIL%3_WZ#XNQ zi`pT|@3`=k@Qmrv;TG~p~B3!jnF!xAGUrAK5yBqx#|2}VXnCPb!19*xY6 z)>o-$7`0Xx)NJ)pt4g7c!~c;b(e|j-x}bK;lsYeRD6%F}7ugS{8PNKMPqe;4w7x;KzCrXbAZ&9CozLLG<|zWd8#++U6ko9}pJL-2~Uj zb2lKKy8+Q!4{nv#I*1;LoSo7m5!@&}5(6JaYaQ`OzXWtTHCpTN*?~mw#5Gf-cLGH3 z1c=^=;CktufFJZuARhEifask7(K`{`DZLZ$gVs9ypmzdxwAP`~S_jcu2hlqLpXi;y z{-AdPxpWG8Cy<}eJ0ZNC96}Z}epMEaz6i0;Cto1nCbyE?$RC90e-I{1C@qD3mua+Q zkeOtdjF4l=diuN|#PiOWL9aWg<48U|srRHFO1>kZ&|e{Zm#ib-Be%%b(O)6lMs6oR zBtM~_PsxMiVe&KbbMiQOlKg`Fiu{`VhU6L|m_LJkKz{|ch5ibmj~pTUX;hM7GD1el zDsmio7df81o18-4M@}X0C!Zi^lTVWCxb-@2aWi>@mZQ|isCg9V@xXqf$3xhP43McL z&k=e&u>a`s5I;zB=swg1B=Z1zJjAt>EGJQ#VW}i}PSN8bVMmi=NgN|AI6CkiauRtj zL)}N-Pd-5VgVbxu^|X9Iy@mWrjyep`_LDo5LSxm0?CF-P$L zSV3NyyI-WMoyXsy>qgE(vPV%j%kw1a%Dlh5aZ^TX%wUu_?Ps&EEDe5%0ljfZC-lY% z|5Z77jL!wkBxjLNkh6v8r9;?%nd^7R*7d)TJITM2yJYL=;TQf-`C58 z_96R`17+(N`NRGj8)(@`%Lmk3NIU1+dGKk`Ab0g+B_L^0h-;f04V} z(DL8&xShMZ(zP4egZzJ%)Bk(^wR7%o<%lrzQ}_t^82LE)1oan=rxZ}rW5)AGg=17cSxA=2eKA@c*e~RI(eIG& z(RDZD*-P5bGw_LHv_Nq6LknaNc$z*rlB2$*{*L^fJV%}<>p3!Zf%+o(BiX>!VX)$O z;TX)27P{Ee;*O+)Y-w?|pPk_NkJgKpKC*{slWYR}(=vdxpRCA|qr)>S z;^#KmbF@i>1@tq5EGC1b{q#kMp`zRedz7qNdXvy5+1<7!+9cbcALD8fGs#)x6Xa|m z+9XJGeY3=gQ8gR|${dLK*{~RKq=)p9on#NucPQ*a+VkxPGL${*-kxvYJkuWSJG4@; z6=OYP*hrrrNzWzvb0i-7>5k9n`Z;-=eon~I8K-FZnmj|hJxjly`Ug1*lr7`7EC)$2)g!9hPlEEILB_p}MJwtUMujjK4UFrV@>TcBCse4fO zlyhYErhj`T|5LQv^ZB2qwrBM}L;ai_FIqbiY5_ypv;9|7e?)#veoCK*xc`S4_6YT7 zqOtzq)iT!rvrDDd@H(ebY{>HlL|_RzAI zmQOenktluL>EJY5?k6iN~-n7<1@n7=D*Ew1Qi71u zy%@GH{q!dXkb}rfGKoJLM3 z=Wze$lJm&txSw|Ee4cs$@>9AVB991h1Mo85v}!^%uN>PFwyUwGq{%fU zW3i@WFRWYB8=rWr4Kom{1>LH$u?FSsShX${YljY1Z84sT5mnrA7piuu2%oE^BMj?P zmZ=J?QCW%4b!s*~ow3sF^H`};R+;UBwI|;|>~CVt$sSyd^hWiL+JNoUVQj1~)*}4? zV;Ebo`s_fgNVywxg7#nq${ckBtIrnTPW(GnrRs6dU5$I~OIX*kK~rip)*FpcH(}-*+)&sx|RK~8tE-smU>7l z)C$!Mtw<|UzvF784{Jd!q#lvAdDTp=qdQCcUi)4>sh!vA)g0}Dc0tY6e$;+cPwN(* z;GBn5M2D#7^jtkx&DXNP{-kfv-&1et zoAnRXJNhntpL!qbT<%vpu-4@P^%tync}VTVnwLk^U$O4xS8A86b*c7awaW|YAXdD* zs19M(%S-AoR=#XdN3imxp+3Xvmoe%nR={+q&#?-oOC7^Xm@U+CtcK}RCyam*P~RJ= zMyfhzv^CnQ^H>S9ld8vRn4Q%RSP`=eUQ6E}YyJEKt6|=(E@CyzTT}y9#Jp8CVx8SW z4fk3`l@@D^HpXggj0wgB&0{=lJf?Y#CyXbxBxAlYAFnZAf>l!kSTpl2tsPh7y}_u% z3aZ_>f@*iJ$lF6!%*3j_STR$(5i4f?P3yx|cn5J6-dnH=@8{a>#&P46HUz8iexnV; znwj5e!?AAW_gcPj-ngI@7(Ze~-eRuETVYzJLknR&&6ZjiYicHG5v<4?(8ijnX1aD4 zSLD6N>}+<{CYfEZ7Vl)UuNl=IFssdK?G?PGJ7xmVj`?lbpcDshCzVt+X#<+%azLORUv;8(XM3@(W1!cQ36r{qDBcO#hNAzS~PNjVro_CS@ob>IjxlVc>j$)KrezED5&Hj({*TiB zIrTBxk24gH2yJKC&#%cdwAYhAi3N9|*e+Viq8(z#y{K4Pk!@%RP^Xg231}mW{|;nF z**f}OBvfbWt_;_PUX&pz~1K(g$hPewwOlI3ItSxGXtpif5PA5D%Wx#}DGWW;_C zIf=ZNq3$E^Cm*2wLF(U1y5Y`N_z3wJ`8fFm`6T%i_xWk^8FB&le>J(5v8`v!b@cxM zEn7%Dv5u7am^{p|c5C@vvzMsZ1N1( zMUPjrqb6f+UUizK13v#D~o>6GslJ`TRe^e|^>NetEkE6v)eI41EmfuL6`t`K* zq-Chg{m^q6_8mDo)E~nCKL49*{-WkUe-~;FAy>TBKcwCz$F6f$0cr?|;ZyP;`Tu^V zc!F#NHG$Aa4wNk#+;d}??7xvm4kz=;07F`oKvate7LIhDMhe1e=!K1p&NAY-1KM}w;Y8P8JBmvdpf#O*F7?K$yvJjRVY zM)ol_&5}P#yFFL_I9*Rl3L9sr>&YJ^7h(3i@JAu)B=|8M;)>cxv^|Hu4K2KbGuiRA^_-zJ-Dpj9niQCk{cyIDu8r4I3Lqw5Z?ee-qW@)pb0*~UM%Sc6swVn91X zXo^MJ8CNaEeTCFUDUC;4tU{e6uIa2@GN?1j;q)J-j*wLhRYQ)YWdi*?CP#`IOE`;s zf}BnMpQ^FAzKQ-O`@-2*s=r0e-esMA_WF8S-jQQL-6njOtRvqe(JH!XDe5*MT16mQ zMIc&5;FWdT$BgZ73k3hJ@`( zy9Y$O2mJqUZ70WzmKlz*xwaF{aX8d@;)>Q7EXSyu>pZdlvd%-!M4c!6k!+N+gPIRM zf3EpNx1zvEhwST4uk%+T2Ng3F@~GSf#l63=iZyFA54xx znH*0wIi70XK|jOD;bZ}~#aaTjsl;4LmXj4^CCSn%EjjEJT5=#-av)lAAX;)DT5=#- za^SrTbsu>@iIyDf4^sd4+LR^BTuWE9%;56_>Mi8|M4ft4#Wf~cmde!vcagXz;Vx1*pMG8-U!?2n z+{$Y5ZQ9?VPmCACKgNqewr|kG6A!(Y{6XxfafPiUENWcQehG`ZR&)m0NBm=iPb{}m zbNpB1_^*cXP}m=r&bUyA5bp}-z71E4E-L7(Q{~~2I@u87(E9+BzH&}>VF}3l7A(4Njl(e zQMjA?^D(!zhx%{Sd#V3U{Rv~^>cyx*CH}+YXXNMPaq=Yj1<8?L{cGxP$nVJSg@z_M zN5Ry4$boV!Xlvq(psgv)BZrguWC2-7 zjwZ*DW633QyvA~J9rt7dV`ggOxhaYN16nY456#xLv6Dx^G&Bx!Zx2g~pI+2k0}EWZss! z0r1b&tYvNhbXUgEjqE}8p}jBT>Bo5bQ{O~AfO;VHAnKc`GpTQ(&Z1_iH?yg4qdkZE zcIv^@L#T&R-$9*AJ&Zb!dN?&}39LyX`&>+xlI3It$$1(kOQ_6VfX~q+ODpPEv2bn% z>Q~X2y#U@za-IfOFA>WFzvS@;O~82LE)1oT|gW%4-<^Q7cJv~)qVZbAIDo*{ITCg~^dBBz3QZya?M zbquwGj3?vBY;rK!l8hx=k#?vO>NeyJWM{IRtR{2GC|OMAlRe05$qcd``5RJ^-N~Ct zgY=MhlcnVCWCeK#831*)kRuDyiy-f$i^E69Qv@DmV3gomjxzMXyIp$Y?NlC&EZm0G z)o;fqg(C~898*Z+m;zQw#^)*(#5?QSb2Q-^jwW=(IKpbg^bS71;hW65@EvB?^Bq=Q z@eZrMvgnW)56mSFq;|CZ)!1w`15Q;g1P{I*}Qj8!xse*i0 zUlm6XYB+W<5@QD#zu?%xXx*>-)j0iH{W^6Q#}OuQ9N`|0BTVEt!X%C(+{&H=pOpY34an#^ejv8ch z)L<}24e~f@FdU->Nm>EN3o1EY5aD=14aW=aCypKbnPUg5Id-syV+U_?>|ia&4&LF|0Y(lmc2LK$gZDUg zu!&;_A8_noE5{DDaqM6_#|}Q?*uie|AjS?p#@NA0?Gug~9OS6MA@iJhPCLx8gCj9` zC7t#eM-Yy31mSazARNP+y(Y7KdRRU^ET4XsPe01%)hMeS@M(`xyle2>M@M`#lr<^0 zUGQ;Y{O)?(3v|UN3FWIhTzlYiHOg~uyfvf`K2D6~^+kE^hfgv_^kgLUCVX0=^bJ61 zzZD+?BZ}GRr@0LuFUx-n%fAcdKOeON9)!SN7UI*IbwPl2fdh3x5aW>*_&882gfJ2* zql~RtFKDP2{)Bf*$lEeI;vIK?#=fn_M`umpU`^p-P0^Y)MLO$9un&K+d6b-148u4k(`r<0q7gw>q&{1C`D@*ffK9!>R(O2L=-O&X; zuh*_uiCR~!tI9w<(p|-AJ+vMw0dLUjsamm4X~jCF6>5`P;F^U|$pqFT8tRcCLRH{- zs5mWzQON|3N_zM%P(Q~eJ$xgmpS6siwM;5&nOKfcrfHW@*Tkc)u~Y}$p*vKp?!=g7 z3)VaFtasvB@5Hj+X~BA@4eK3^^^V4R$BlaD_e#h6`|u|7-tOXDZKwn--3}&3$@ip%7Hig?M6Hw>mS4C9?Uk-^}p$V zgWjv}h5oz#cj$c>6K$h^qT@L=j*Pa^Kh-~lmhsUx`a%65w2YFr(GTl~p=GR8Lp^vD zd-b{gxr)Kt0*^r-*N;P=&`&_0)K5a6(oaEup??AWrT!)KR~TW9(a-DWm5a5cleJ_k z){;rAC6ic7Cb5=GGFoFsw9AOYjA)l3Phq?8ronjJx+EA0%ECJb6QPrgBO zSBtf3fVFCXwQ7L1s++Z{o3*N&wW^b~s*|;DX2k!%Fw9b8DURz^<5g^Txv?Df*NoRxd%P!c z1zi7N`~h2BWvo)I@UBFZLA)<CLuz^GZN@glw%ypS67g=uoysZiS45m286T;3c*`Pk5#F@;F}AzM*aJU!qbvM> zVtj%verkM*EgmqCTa1Hf<-76r#Y5QQVdJnej3dSo6@#nAQEcUN%sFpu95aq7FGih@ zW9ui36Dq+tX&|>4r|^Vm2CgV)VE@MWMkUL21;l7Hc-}aV{jWFb;VN(K^%y^*pX3_j zC(KKC84X4Q_OQ`tR0gM8m~!n=F}U_vD#di5|HL8V)~b!!%50^)7`<+-TAFRlHn6+# zY+#(}F+D25jK|Cs-AphO5Kp3+2%TgmLHkX=GR=S)K%A*&8rarsi%{uiIznAzUV}+a z9nFr)lIt1R#YA0%H%?x!+Q~a=v6UOl8=&!~TIlX(cWAt?7P_z57hCCP_QO{CoBg40 zGH-$&U=DyDXbyxPWDbJ9*}NG#)69gv#k>VN%glnl)kF<%W}Dg2x0$y==a@Orx0|;^ z4>s|(Nppxf1bQf*Ow`Rg%sZfS&0OeV<}m0yGY@*WIUG9Q%*T-ym<2e-LbDKhggFAb z$Si^`HjAN4%o1okNCjPHmO+=B<)gTBkW3wpdc9{O(cZs-Z-1n7Ird!Q$p6QL)Wlb|uH z07NT6Ii-~V&N1iU{61wqg%qA^&V_#3d>VS5IS=|7^BHK&KTvM8A^u$@nhWrhL58#> zlnX71msC356uKDpTC-NQlJ*2btu|M~^$k3sshexeHAt&B%{OseZ<}vpPu833u@7ir zr~q0R8&!Mree-?fflcNnxMHRPxXs*#7`B_+5hvy=fS9kKlFX0rM1#xx7*8~~%su8F z`23ssH+8kS*W8O3FpmLoVjctb_MmwXM|a3Pgj{_XBLfceh{r}Zp^M3!U_;hYvTy5q2R~~=WehorN>RkSlW09kf zKg0fMqJ8|ojK3Aar@5`d6lF2<)0nvWm}u3eG!X&6qmOx@rb+F)3JBI{7b{0UEb5n z@fr+c=a}XYl1B1(`E1#tZR@{g0C`;Azvw|u7s{{wm;AH(*P;KLzx?Df9$%> zF7I|YsppzMPSkVqap7YkMDy1!byD)|uatma`!>5b|6bm+e^yuhv*G9eo6D%w7gF+@ zzdw6`klDZg{FRd2{B40___c2${ItZe$yFfr=dZ+kIW=RE11^7lE&s$ISJ|J|$mQ~J zH-%`nON`Bbzh-N8yZmeWvj0y(xsi`u0-CoWzwNOlcT=F|niA{8(PIC9<<-qTCbUW6 z-jZib(pGAD2fp@|zzO}!dfz@XZE^0e{IlcIk-}||FQi7duZ}L%q4HmI&0rv2N#*9R zq_)&;^49@hgLz8+lTh*}HM?D>+jXdfkazgXb)-4}iNEIjX4l)c#m*~s4v{$IxD>8X zuAjel-7eSh=D7ZMf19`WuYc`*XwIL%{(HI1H1B0|zO>JTr2XZuoi`0@uv_SamFuMA~}l+c$;g_JhgA8ALq_?0s(rRZ{v zDYftA{~&+yCpELY*Z80Rep%nz8|+40{;%M`MPbkWs5mXWlS(c++!D)Y-7jS7qrJQt`?~eO+UH2G6Qq)L5T7RYGWk5q2`e<}^0iVU76>qfN1{%Is|{xx-<0OK>4W_VY}&61E8diHuOxWWKqVp z#)~NzQW{`;zwxKGLsKq7{fAO1_4F4~vF)fdFVtDumNwS6J41C9)R$C9zji06UW4r@ zRRV0CQgBbG-vG6THm@?$_opCt>m3yutSQLddND$*7gwxrV5ZMWc^KhzsT>~if`s9Y&Qlh*371JZW}_KNMNA5%sJc8l$& zv+3&sJH^)6m{J(n4mI+pOR1s2X6)$)KV1s!Oq2Z^*^rYuIIvc14LN~zfz_gv3asK$ zwpOu$6;y*8vf2&^;B0BcB`* z4MWnF2cl2|uzw-?dlmavMujsIu+QMtjrD!Hj*Ec}ga zSQfC-x`#xXD>?tJ?y#e%UL; z=Re>-3iTLV4+UCd{~Dq8(;w;~U;lEKg%k@E~6`IbpI><eLh3F;orHV^+k%v-P@|E4^HavtX8Gs&QD*efKV9EfT|pDVV83;x;ud17lg-V}Bm!^UH;{=u-wFUEsV zGf~YWPeMJ+T4fj1L;gn*wmZ~}fTXSmM>L&Bbh2Tze=3io3a*m_o8%}P{>wkXKL!3K zH@xJZ2zRM-=KCl6rEVIDBbtKHQiCk^PYuX%EJSM9*TJU|^8|?x&#A@w$1&!o5%VZ1 z-P#4H>OdI#w-73f5^U%VP{F`ZC`q*vmeAHvg@N9%y^oml{NfMg&ChbKpHjFznP*<`ON(~@=WP8xiYpsZXSzF{Y zqtF`Il;kZ9m_0O2)-v`%e*3B97Qdc3w`_?U2#YsC>kHS`)id=0hf;xnj zl%bD;I+8jIYMM2~KQcqo{c3AyhVn<{XsrGIkRMkO^$+X!e#M;Wi;4ByY1b_#)@Pry zA7f%O=6lZ|#HEEMm)_Y2e_E{hnQuR?4~EvkJn!4I7xFKkAhc{X*r5Bp+thU@n9iEv$S4N7MDGyc;W>RX>N4Yq^U(6l)j6QE{VL)&^X zMk2&CxW0n6A!=kR>Z|oFg>Aky$hU+?J{xI(k_XqT5wqP=S`9VN_dNWyG|#7QPsj1< zx#sz_-fb^JrJCnbdnd<2JqmwziTxI80%OUCvP*0U)F|4HSv!2yRFhx}i{fzvsp4TP zXq+Erpq3o0}G_N%@@e*CPAP?DU zsTD~)LmQ4av8nwFe3C5YsWyuB(cnn49!NF&&fbD^MzweXT5n zTF$UBP`ujcQ(`)%$1>)4D2plqu5+o*LCvPhfSO5l5{fNheKyoXw7re(vaZr6!)Bl9 z+o9|;T?u8M>2WxY{t`m+b7Ed{8OqETaAhmYn1SP+%J^EtW}mG)5px`E)wo|>k=PPp zd&g``?wZ^SDOu~NZToQQI;fW&_a}Fhvk%+hw&Q(8@R#IxEuq0Lr6S`!oOHsEI#SQJMz>8*l55+o zR%X(nq+_%#YuhsEh?ITn&bHl>4p3FK?U*Dbv_JgqNlSqmXpK(ok+vIZ0BoDnP;=`y z!q&~-jjATKWAbLIYm-(6CPURaMx`xHmKrYGx*=^@Qmxpmo0AqLOZ~UZQRnZSvKlJE z8tw0!HkG#Z{`N_d8VOd7ze8Xb)T=nQ2}x_A;;r^c<9t$cEpxo?yOcDF{>ps~KG~Ou zdt$peNm4$>I7TLACM|>NfmjA4N$DBucquI{X%PLDr==(L zhpKg~Pf1Sd4b|DIN%5nlEVh?Y%p}xOuw|!MsWYHn#$Kf)Wk6kr_|lTahATwi0O|(# zi;2bEh=SVccr~Rj&)|8-(v)5(D~6Wncr@_>uBC?h(HfL^F7YDI@1*#6Kh7%7!u6>u z5>L}MD_;3Rv}L6(NR)h#=op!}Kk*1kPoZOB@~A|dEiKmS@7PG7Z|Le*1v^^Mzq8=4nwtsQbOxg|yauZwAhIV6OENzbk`X*Ym z<@%>2BTe-et(y}rBuMGG5m(q~%UY!FBFCaYuVmT3AFY}|w*;IIkFIhFd zISG<#qmUYYwmJ-?Mq*M2*zRTnhq?DNH{EJI9(a^_@>c7Sz_jF5 z@RwzU6K1i^d8>6>!lQxqu-$5H4g?dB4-m`affC+f`4A!(wH?}i*5m%?l7 zePKNwKi;=n6yme5_7kkfeSLi!;BSI;zpraN&Lz@nm~W16CRMfXVP8JgIN#Lx!B9@b z(#1DN6k@U4W=`w=cz?W^+04nWX(N zZ@n*>s@i)x`54t^?@=#~2(IJ2`@Gm^eNaqC?@l=jhR1rO&HhBmYYEmP$rlsHQ9a&f z8Ou?;mFZpKeVw-Z+syZ_gc{?h^e*>GUb`nI*1Lk|672);GEvf+^S*+y5~T*s!2fz~ zOl+HOwu=?-o#%ZXwzg2uCQ!lm+{F3V548Bav%T}+I@U4PJ10T*;~vLriDRTStB<#C zNt)(GZpD>vtan;ME<&K)?VaMC4%eBESqX_uv4f6TI8%~Ca;+QUr^ZVTxi>~7b(TFq z{eP`D&s&68{%92@CVFde_AXi1cyqjnPaU=fc?Z*9s#W04_6~)=OICKm>t391)Bv?f zJrdIq%a7LRq^{x$TiDx`Y4Rgt?i@cCu45c8Cv5e0WZ2OOQ@kjDsFAz1?%_pPW16Ej z@!^F1P)}Q<6CaZMXdLfrNlU#>sDqBzyc;|XP(87Y#h!~$xmKZfm8TwRi+SF2miu>? zqmSo|=NxPf%kBA=t|2SpIm@tCjH}fS`dbFuG0&Iqmk<-{VSCH?Psc3JQ7>|c(bBrX zbI2n(q}CDk9D%!BnXmO6^_+q$?iJvMR5QwBT6m5yzOjy3iI+U6@vwi{i47j9@g8v8 zNPo~?-wLmhNX z@@(?RIQhgBplEU7wf@^;hdQ&svX^I<$nF zT>t7A=~?gDC^qXl&j!yXsMU_&HN|`t!fs^!KNH(MAYpN)Z}4vQtb@Oq*ylB#)3jad zdEK*?wt1e_;tGGc-dfKZ*jB;c>x@~BZKdop&hJ>yau3Re5f9r6kCdERr%G7q&4S9d zwk53cydpNoqJ)JWqzh~{35z_7XnQbWre^_d*$J~eC>8oxXN!c{+^e1lJI6Bd9RAgDJJ*FFHOMk=h zsQZ+62GlLqZ`{YcQ^cP&)P028$TH8n4~UXGWA`DiE7wy19cK%cQKY#h;K(cV$pG@=-!I!Fls5-HhCq#{1LV~H}Zi##v0__ z=-vwTl(;r+SGnsL%QZ1B_j;6dLUgu9yH|OqLhW_bdcy7%P&Zkl zJwcX*TE|3hm@#Kt{k%~(bBW_YZ?*e*`0EMVNH=l`>d6OPyWKcSoc%uDF>d4ooXg3c zxo+eGoauhAdqmGH5csI6&wpu?=oLkcQMcCTAtD$a$zp#5GR0@tG%00#1p4%?x z=&5iQx+U*MV9S$wL;5V-L*4mMTcL72l78pmZ?IePP=#ZmyTm!acxKg0MHiX5Yz%9Iv^1 zd3wWkuT|;p=IH{39v62P$#vQS__K2zt|{&gl2$tUPn@qaKHQVJlhGf{dop*t+YeW? z2i=M8b5L`U!#wUZxL&Y&yIZ^CVS5@!$@@9&9~j7NDX|#n)p0xBQv0Ak22(>5q0qmB zf&GmMiqhl3qA-LN49_@v=MYQ2AJ#GP22l%t^stwp?(}ufS#|)|=uuZ4JvBlZ# zttr;9xbbn4|Kg#>#7#h2&9Fv03K3dbN{`1y#eP$*GxB?yhO09#pH7z%ApxJjw?L6wM-o-Kw|>iQWl zsGG11-j8 zsVFUHL8rPOjA0+7OMOfG8S)(Y4QMKf*;KKhM(tAbXlX-Qpi|8PUFu%YP_pNiQnZ`^ zP1TBQNlOLjRMV-Ck;$M#$tbnOl)-EvXeam6sUD`EL|PsqXMiS0m!0ajbd^zOr}`cB zcFv((*F-JT3NFTLA4+a@L&c-$2aiA)Tb8ze{x| zSA!P!UsG;sJBKf!>l|_f=v4m!#`3(FO41z7Zd&9FDm4ytsS;{?&t(ststUAt_G5V7 zUCdoh^(_4t(a%i!k#gix?@&wb)szP`c$P6|7h3UnE%h5}Igb{%hIiuf#B-0-PmxcPlfhW#Y8P{UEK|wFeRitRRezYRNw? zwTtXQ7J`<_r!Jr#POVc*9&oAt)RMbgsw=25C%aTOExBL}(_d3DwEUeG$wiiu{NQ4K zQ0f-y4?suLS(g0ZQg#WIJm6ANaxKoSajFNQW1G&`XlSh|{UujB)qjF6CFL}x$v%*F z`+U7iJrBexKcGuJ0-D@U7ju-=R4VP99HRe)^!XNf9cZa?um$&_g;LO%2?t_j1<=79 zZtz$ftPLDWa-)O!(BO6*EGY(Eji!=#8~j-68v2xTZK(`usas5jiX|=87Z#T~NNxm; zrgA4|)1?lR>p+Wjm(i5|lDjZ>nXdM++xgkfEpkpx`gE!r=x03WRF6@=2^uV|EtKQ| zyqOGisUx6MO#>}eK|Kt_{8Z4Tc7skODdu9HcPhI!I6%vnpryLdkDLVuQ!`v~XlV{nfG+3}GCulY0hbN(3EPYNjhFZ?GOLe0k$q&w^dPz#9OWi@vq`e=R zN~V)zNhxJ6)taXIJDZMo zJ@o+cH)K1|;`Pp@-lj$N%BB8D{uf=_Qr}NbBuA02l6QfY%Ay`g){vi)pOBw}R?|M% zX)9;k$@1l5jhQCEXl>j11vZ&+--$I@qPQ+<0o{mT`>rQRncFS*onwA<%5K#N^YuZNCdy=18#&=yk| zuVaQbxLv1uf_8gP%BcH+G2E_;vtgZ_d+KVszmR<5RFZ#ON_@K18d~lI9ZJ&BsXCLg zMHjWD@}RAzvSXi9`z+Wsyq#yJGL+<1r|Li^lf|HmIl-x}f_CtVr$sx1JOj6FfQ%SC~nrf$8Xvqg%yytSV}RrgOEr!L$%v1Y8gFfKBAJk}>@tHogjf^@ATRvPGy&mb*F%fl)H zVQrK)L7S@0z-j^Wv;|tNwoF^4t<~zZt=cYaAHPSmQ_5e}ZBmuCs;cU)33}h^aij0l z)>Mzb`z~$$$cd3EeJ~6WZKF`n95?>nyR@z2?yefA?Iib*`^h74oT#0+Tl}1!AUr$i zuBr*zg-MgT-k>#r-E+kOU&F;=lIWu$S z%St2kpF zt8veyOu@aFS9-5Ze{n8(aZV|Ht}OnKGc+DZe+s@BHqJv{oReOhC%iaMDm}CK7x!r| z?%TXLqLfbMg?nZ73;S&^&PPkn&_e+#0BL#{W{6>04Kvs<&4vjM zf*X@z8hJpW#&v*U1{$V83wavXUWVyym_CN-YnXn9>2H|fh8bpk25X4-kT4Y72T{D#eD0k}HHHl0n! z^>FB-n83!fiEI-4T&)J1w)n2NvKp;cQDfAqYAk4#z7IHx z(kIGysFmL<3zbFSHYn(T9*sfJzcHA-%Z9L2W@l+^3Y*HNu`lp69=bfnu+P{hY!n;K z{>8?!WHyd{%06I2*)aAV8_wQGzK61rECsQg#23}SvKeBHNEd6xI2zd;Jlqn;GO<^cCrX51q>&1pwp(E^HP?8l;^1<*E z2s*;xI!OF#@PXtL`E8Tr1B_|?PdP#IOm(Q_}RG zKCJ)8KIHe6|Km6m(^QH#3H5+_SYsxC&8!|bMQClb&YHKjz%)!ft)*!_wLsHYt)lj} z_OljYs;!<^FKIERrs_5Irg~Q!qK(jMYQLH~st>i9TCx^r>Z2uS6SVDGb2UfJQw!A+ z?T~g>%hIy7A{81cOq1vl`x?4my0FgB1Jjx*sDirUR$R~=<4{VJVrY|jt`uVLi)YX- zlc(e=Pn9Q1j`EmIX0v!__6?iOJ1K59lg(ux;amPEOl6vQDsn|0)(z%E+l+--MG^C0 z9{9Sygn2SA=8YK&lWJzctQ;%PDnJ)ai0Ywws^0j{zak4`;j9viV390}Rc6tw3X5Sr z%$NBwe-^+3S#K5#y*1TY4K{T z@V>ks@6X@n1NcDbJQ>6X^CbQ*AHs+7Vf;NloG;<;^AGrkd<6f9kK`Xi7s|i*X#NRL z=41F+{wW{FKjY*1=X?U6$S0{GJOz4EQn{U{@hN;NpT@s{u9WHgD?WpN&1dpid^Z0^ z4d-+CT>dTer_ATy@df;QzK}2Ci}?@yN4}IVQ$y7-XhFCy9*Bp~eehfqh(h5IPT_)9 zglzE`+7B$M71|GcR9_aV`U|(v@rtUb3>$q2RaGmg5o)9wr3R=$YA~y>md6Z51+^Tj z$Evbgh7@C_3FKgmeXV3GkCcbX1LeMQPr0kyQEn@@{;x`$LxssKS>kL?X?e@ChE^e? zj8Vd+Wm~qag8nJv5TxS2F5CaAJnNxE>!VC3vv}5sy~Yxx_L~3e^8G(3T|W8$xqO%W z7bR?zsjMBPHACd1%w>r`7e%sGyeRoHWy~rXrL4(%VsL`2A6}>-;0M$a|9>z4e@g#l z*`ozjWM4#~PKF76AUI@iL_wLjVz|OjaGFa+Py(Ql5C41#YOh_FjR?9@aNQU-8gw{afQF?9s7cB4p1M$1=Hd@|wm|!WdCqT@ zZ{avgxrv@wW3-TXufwsL)`8k+r7HZOe+<22u~Y+^#TrsuYDevnf;Xur^)lQV^q}qg z4E+pd#LxwPy5hi0BXc2L57GA%Jey}jv&&G#i_t;EQ|iyg@SPBw!Dc|;$Qraua_1ur z?G$<{XsJR$)lh~$2wKmP&}k)Ov9J`hkut|*dxm!MWh;xe6KyQBy=wntYbbs}sEUT% z(3%41ZEA@?D*!z|4ZRf&y%r6<6Rk6VUX0cq=mDS{H1u7xKH5N-1GOPAhiITi`#>87 zbCfm~=2&e4%n4d5%v23M0__WJCd`@IJec#eg~YXm+EVl{INFDF?N^*PXq&ZdIB(T< zYWs2Cix%KG&PTP=S|-ltwJX|9oU^pMS~fP&dZ<0s3Nf#zE`dCd(t#A#~)ZWw;9HmOr)DPS>4A(GCBTS=B<8TerG|7}^nvQFj zrrD3O_xkrrn{zWQy%Uf znx2{pO-?8@Gm{221e)2?>~Ah_MsMF7Yz{R?nPbhh%?)r@(;R0`FgG{1F?S@BdAhlk zxxKloxu?0Gc@XYX&ArWUo0H7L%_Ggp;0ZsHnkunh9rR18;QR)7JB)`mJ8x5Y&pE(0bCF`s3|v01c$-WW!OD>^N!>c95dl^d*iu^fivUw15^-Jvxb_ zA-D?qZxC83pUeHVIzbB_Y7Ii|PEr$IDd$74B=w=b(1F*V-Zo;Hf^erH)ampULY+-> zXdZUd+73;3J82i~raiP5`)TdRj#>wx@$L})O^4|S9i?N~UF#uY&BmU1Irv)dDR$M$ z!~WLKu&;F?blnx7I&)wNYR zDqWO*Yyn#c?Qg%ct?UoBjs3~CLkrwawu|j%d)QvKkL_oFK^NRXc8LAW4znZdC_BcE zvlCJ$9CX2*gWR|X9dB2m&+P^@xZQ!awg=G6_Lx0kxhx;r*`Bjv=720gHRpnB+{~@q z6S~-Zp@S_5`qnBy!&(?Lt3~q4yb7<%tMMAV7O%tW@%p?WZ^U2YO?WeCOlt+bXl;3W z-jQ$Pe?s@z4!#Sz$M!(;*gn3W{{`J+2l*lB3CrR)pdsuQG=trNMzDL(1oi-ub95dWP&4TwU82i$g|0%s;dRQQ8+4OyLCfJC=s3Jb z_vryN6JlpHXdrwI+DuzQ`{3(J2c?tJ8KVY$m47LlFiNmP*)6pILI>a?wwV3Emare$ zQnn0w0DodXvlVP5Tg6thH7uR2g+9RbYyRF4Sjs~p?fcz<*=tLPwFj&*3uGaD|Is+8u&Og@0p-+&jb2MeYhXA>jguTUPT_t z!+8XcLc0~iW1&5-CbZ_&g|@r~(2|z`?RZV06)zEb@LEIXT|3?Z8tZ=IKl2sPR=0|; zhMu~$&`-CXZ{WW`H{C|Q3A*VvLnmDZbkS{vCOYg&#*fHd$)IZvdgh>I?liQ^orPAp z^UyJx3B7WcpjGY)w8>qACb(Q^fGZGI=x_5Dl|?mZRr?;=xt8M{vWjv6@}rBA3A4L$ z(P%HbD3^?LcjY{6J1SRT_E9cNQ?{Ki4!ku(M;D{@O!{3T4#{hA&bZ!Z*k3fRHyP&N z(#B|2*Fz&0-1ByZ*}*XJ9t<0_=?G_!VeW^yUL1h-&vPtKnqs5j#%Vk~DWCG{hP|X~ zJ+yf-N*7s%eM^{YputPp|7Dm5rAuhJllG^i4XpZ>s=VeV!~VEo6JglI7&bD!>!EcIJp`UB?V(Fd+6d$65yR$~VWY`wZZ_;s z7&eiHO;y9@l40`{=4y_#Bb-}?O+|UlLk%}OaJ^2*vRjXx@}zy3VZYO`mnE{Et%aG+ zrIxET+{bwO8?ILiXd=W@=wO3=fnhU4+6c7Ev{uZ9na+^&@aqk84Kzo}eAtZZ)zGgd z{mT4b!wU_YuceKc1#_+V24*^wT(O!-9$3SkOB?Yn%(Y@0%ymMxS8D|N1_*7OVLu*b zx|jfSy%+;?jrbJiYVjG&wa`l^pH76iUZlcYBhp~57E@ua73fjm>2#Rug&pP^F$Lyo zF%9Ng@g>Z3@fFPVY>~8Qi(#%|OAPzQ(q1%$xmL*BScmVfrJJ8&u7M6e`Lrj@wW2r7 zbn!dPb!-*P)oeA)HB9C}x=4b#Rt$l;Ui<-b9m{~Zno0L-n6ycUZbJFA8O*gpK3&IT zNv&qPV6K6tK>4&6%(c)CDBW*`xsDx#xtbkGFM;YsGe$>zL%s)lBl$ z8eR`(x|j@ey|BStD|W+N$JW7I&DO(Q!+wF84h@3R&2X4&p?god*$8tr+XQnBuM0C> zOoF*yU|a@nB%SNTS;&QS(0jG?3`rn=7%}sCY+Ol0+Qp(RAxZ{z!(u!{1;*sm3=G@< z1*I<-rSp;XUfV4n|MN?v#DA{kMd{OjH?#h+C#pF-@r4_V&dHuWdh8_JmwbwJZ_g6_ zW0O-K1$+Wb1Z==}s!QK0-1>3u*3U9szoTG>5I~pl;U`BOqkz&eNF%&0oxip?wsij9 z?D+ky8>;Ki9$#A>FgzUF->_L7dj>9m@%a_a4a4L*&~d)mc{n^Zz;U?g9?f;QRf^Sd zCh-Q-VQ}~Pgt=zt<=FWa=k=Uj!j)Bbk;!>8daBuZtIAZ1^MT)H;mSeB(pm5<#SCMf z$yM+S#1v=;Rd+!&jH1A=HJ3AgiR$9kxtdEn`9gD<+&^fp$bxB_3!1^P8U?u^%K$l{ z4_GzXvsjg-`W!k_ra z7uO#>inBW0dUlX+u|6!jBK!_}90I>%o^X_3pQlz_kIwUe-%0u5un`5%kgkda&p=y3 z!86d-yWkmo^~beCA64)SZr&@9AvY|jfOrQM#KJ!Lc?H;vDGtTc2_*{5!H#TD+s|Q^ zPaQ!Bzp>j-Ub_SFbQC>-S&dOd4!*hiSD`7g#In}?47sJiLjB7~aA$_*h$q!YX zX?7}yS`*WiLj%4;W*-i>TOG=YiZb>SA6-!0?vqZ`ICfIl5!VGrn%SXTDxQMtOA)Ek ztoju~xU8WDvda~|gn31zBi`$GP#u-)#i?+AW71a^r~B4x*B~bD-u@0x@3upX`h(_Y zAT%EIovAt955}d!&BLhO5GRk`Kn2!w&ZEw;oNQEFC8uBk@+XH~;%+5JzBB1L&2jC{ zZJ1(mx^r8kB80qFGjLsS9d(=)JhQ`BL2VntDHwL1xn0kDY(rX#n=J)fl?1_;?g+4J zPTg7eA}C>#P}yC=*DhSTsQe9R&_>?ny4%wBOV#DFygfs>T%IBYe*Nn~^S3)-+*;;# z2F1?<4Y95FlJ2Uu2k%Pgu46}HccM-%#f^Tq9RK)7c95!%P3z%Z%=E}9-hR)yJoy)L zeaw{VUd2N1JFSy%5!Zvh%J+M&>K(tz_bF2KHeYA^;WTts6EFC~$-9W@t-gC4s1MMS zzfS_U>ysD9dzLVHl1{WGp1uegCqD%J(U0$W6)W!CrB4HJH*#5j4|qskUdOwH>-B$1 z^hIE`e{Si6)9b75`xL8s+w^SDVy-8rhk4=D=$E73MM59)OPq`dCvODi{I$B@bEbFQ zG!a5V@A+GpH(cW6gH!yLLoyVcd_i@Oj7*uZ$y;lIe{iZTPv!o|^F}fUZvV-%MAP5e zUJvzF@3}+w07*S}G?oMo+0jH=j@)VXC}Hk1yG{od3ccE%c<&-bAG7zm3}wjP=hDNw zd#g(iI7tsddpnma^3ccZyKZqHTlZbJ!pWF@4i9)3y05$yPH>VQ#_Z3Mp-kNW4me&P z^VbdOq3d7uJ&P6n;{!LW4xuLs> zcl`}1soP{-kkR^NnPfy0vT93`THkmg^X&5*bH%;p>(+!EG?67aT(ae+nrHs z^>(-4M9ZMJxpPJq+-G<08+6_Ylj$3D=R*(B(*N#FX*u$4z6q8sA3T&-FZ~d@DW?kSzChN+?NB$Nkm@j*iER_#)t{Rz~V@B-m%Q-E5i*&um z(_1pWfw_N}5pf%e=soh<%1lnm8*6d6^w07$AYySkC{N+}xw7UY zK07aynfUC1jD1wWcC;?KPr+STow5sZC11xB1F8?Z!{bWm`X^gbduTyweg ziNQ@xI5h|flJR+mRF+(qSSd;tM`9Hp85mAx+;y!IsX1NpWWwpKn9(MuLuavBvNUm$ zVSW_*OhsTg$)FQ!)|D=CGUL>!R*p={zv{K;ZgjlrwHGdjyQqc3iX5!cq8gsLpCzLF z-0oZLt+F`Y=-N@Zo${o*obLT&T6&h0V7NyPG!smtD~V3TReei9z;mm+L_gU%@VNSa+FU}M6oKGbKV@uK)vrFg`u}TKrHL|(SRsl zP5)~eY7R})n}6w3L^NGbnBj}_Mg5(xeT&>mknT6r|GCRJ2Nb#}MV~j%!y&h@E1HMi zKK8>96o&R$;C>g%M3z`lV>rEEO@a5U(IeO!IweS6k-1L*)`3E$E##ui9 zLZ7tMT0-=-K7A#aOX;iETjf_&Ld*1|HD1MT`bMw2!3X{}=|j+g{xPJRLy6PtUGpj~Mm~*1Bk95<4rMFkqFH*2$KYmK zr+0a3g*~$3nSx>9sd`+2v|p@`FF=LBb4!7Dv6D9FX$5Ad6Zt-*!0K>hyJOL>T=Lb z{X5KZI+UUM-=PXN@?E0W43q9|=xQYo_B7e^o! znZD@vRFmWdfq&c4etmoZ+Q3e=&gd#xq3$#q+7~AbLqns z550~*TJ4W$r*8L^O&^j!OZNLFA>ZHfd#+$?cC~I{dOnp?YvTnON_sI}{RRe&E2$wY z7%KY5VG`RHL!Rx$T&=2>h=I_$m_+^W4z;pYfe#Zqc{fFYiheWm6{|4?wGj&Z{}7+^ z4y*w-0C)o%7tFz?33Y*snDW{Lh5r>ARiHHK$fi(NcO{J?xL>DQe5i}$sb zm`3l;YgCjNp=s5s9niGzvg4e znVT;Ut-5AX%q$AqIQ$FSG;|gdMQ5$9*v7oYGVu#fK)5@&3Fe>NOMJx#Y4vbDQ}pId zvEf9RR*@yJa4el@fK41)VhfFQElPaIstc2*V%vppL<*~~VQyW7CHb+n}2;4$z zrFmcypo0>DH7*VLKvACui`vXfB;cweYbXM+y+tj}TO8Irv6;jyF`I?3x;XF0QnYtO zeXY64OMHyw4z;v8;uEcwRzoc>G%StKlyZCs((%1$##`e2j@A^*LZs^$-Wc0*{F7?( z#)1G}Y)JoqPn7DqS+hUUA%({Xdl&TGKqs?JS#8C^O{(M;-Q*NnwTf%vuap!Qd@kB z$qzp)KB&$6%5AVjqDeIg@f)^skhM-iPKbD-7Fw`mO{#_V)*5S#g{U7nBgCB5x;)7ta@^W#S}9bu~@}NyvqWV3gSy_n_<)9*lTJzEk>+WRdI>;6ThNv4a0Jh z!D<*5bHoW>EmZTKC7`z(ULu2s{5#bhj_`I&{XN}?T> z!dSI1tqGKeEyrRRf8I$87q4mDWYHp2lj6yuu|Z5nu~%y*`l?=9B`sErg({dJ@fuwD zh#DeQ4A%U4H8oU=ew9b^iff9WQi;{Wb}Z9aWrajPj?c8k&)6)*lMAIh_zAls@jfcY zl9_tE&cFK>QDO`>dnqS^wfdMgZz@*F7Fj9J-xa$>Qy%f(ODz_xFih!K<$*Z9;FVbr zRHwDaHZHBO0Su<<#HTz=drfPk_=*9%0rKQ)7RTSvT0pj~M_t(j8D#mlV>M)+abVKN zI1Gu0jbe=B5H?hk#|pW@%d3MMTm8xHyGm&RHB!#KJbn_!0Vy{WalL22jPq*9$g;o` zjMxZeUH^$c#HWzLuP^};wF6>$g(|#*NY)hAfCma}GA`cWRsIcgK+j7oMN0brgG}CE zyu=#bO#CNg4!y)7q~kyFxA=**5L?9xq)oO0E&hQIWbm8f9W1zMBo@nUiOL*5E0szQ zxtWwaSRBgc<*^4`jsrX|{dj_ZjDt0L=?gs8r1TKeUxvWjDxqQvChd#^H3P?s5Kjvn zSiWT(phX@p;*e+742!#ZqK@G}*=!UOkefZl3Wm+Ogas|(Ml8jUcH3XHfA!Gvtq_f1 zvjWn8hj<6>dN7OVk5;KSCKhpr9PYsq#749jYfw&TKUrn5oz<7&!EPgD{s=Jvu}s9q zNvjcFBk>+ez5)E9<&^CqxG4f{WEE~zyfGy`ROa$a$lT^#)d*Dq_lF>)BL+_)R3nUS zT8NbFEKnqg&1g3ykFCJ8W(Q3}JJR7F9+V{{dF=qEvzy3ghU;%Yg@oi1*+xjT5VKf) z(C`A-9IBgOniu%>B|rb~p8u1#|Kt7zPgnVeKg;s!%j*+pxBn9_`Lc-`g*N@)VeqEp zPhcpxxuc|?MWJ1d#FD?davLjoXGkpMlZXcw?-0ktp#PLOMlF=}NTwE)OKJ^DWeoxa zS^~IbG-S(A1E{A)ZG2fHWjRUTJyGVPjanybo2*@jLJ453jpfxf_+lBIank^#kFWr~~! z!7D7*X$>*1ai>%(b6p+lOr#rWUqh*hYq^U8Q)()+;cfdr&uT%l>q~dF*~>X_QtFg( zQm@BV;2q<5?pGogX93@>zm{SurEk^6oVSGkZq5vCF$I3ce^XVwZPVsfG}YL5#qYcyYlUw4as!hU4@So8cC>&^$~m9scK| z=Qju+zX&XAj|G-szA^{%m32`7o&cznx>x*GVq>F@z^@4R3Y6tyj(}8fFs3BaBAKmDk1* zHAb#B9zoP(Dn3jG-A%Kgt^;nGPbW&eP1FkCIJ8+#)D|>$K$smS5p~>;>>Ewg8S!_) zi)Po(0LBWs;aRtvMBPW>!&>-zL!Pf;ONWOhz7PHdS?hx(n6wl;cv)E zqG3_^I9LF~h~7U;^kHqHkCqUP@+BHQo9L4RL}NkYr<;gAL)f2fBO3pV==0q~6DtCT zh$c?}5S9(@?Tv}jVu+^pA^HMo{StJ26$dOQngzGB&l1f+-p)f@-_`|wC0c+yT7Vg~ z?~#s$4Tu)4Ci>wL(GsNZM?7De0Jw>kBmU)h_A|o!`3vAa(Ta}1CZbiyzco#Pr$p;| z60P4%^y_e<&0UEyo)K;BPPAXi zo#+;5yNz&f?$_d0V_(|tt6!bzGv#Z z7u6SZy)lxMH;C z20DIDBxNPSNzWnWmsC1`=l*xk_QXV4QN1I5=1|8X;BOB>`jPyO}K}v2-Qu0A>KGKkX6XLu%u#l7j&`{K! z6bIsWw?+Gi6-H?M8P@SKOE57HtPb*Y67xPl%y%gV&(mTQ2z3gtsCVjSpzV#pI-IIez*M}8Bkme*Vl~r=)dFp`P78#1WeVdgl5Pn^zt9mDqRi zv*0YTMM&FXq<_gMVn0R@TN(%;PnLZ^Z233#?QA5H#gV(a{Y>BQC# zA@&Q>@@snlbZs0A? zN$hXj|6N4vFycEJPVCquV#h((iPgkTB2B0I5Ic=LJ`+srY;9uadlSpdA$I97vC9LA zU2zh-hG*9kh-Gypc555}I&YsOcIPOudu@o_pF`{s;(Oej*ps@%a_UY&xm_qZM}CWao>@|rA9TWF)pAY05?If zD+fJg6*du@^MqE`8W(>lJ84fH5t`M&Z z9dK2<1Jj9Dn?bw=R+!d;ma;myujeEl2bvoA6K}YVcs$}sfc?J-n6c`JfB>rhl zU@CyLjzhfT5Z1W+#6L>}76Qo6@jZZa;-4drKSw;DZzDb-7(l*HK-wn80BOKA;***J z@HYu*n%oCK+$l&)$`D{XaU0TTL*Cmmh^K<4RM3>Vo46e`*~bIt(T$D+W&+v7r?dr@ z0tjy^(mEA%Ohdj*10B;4-WTP8Wa87`CO)$tfN*E|1EYYW#AjCrK-=sq#J`CL<^V|F z9E3Y(3E(C^w>JPf=Xs+G4*I@F{NE$~@9z>{mwq;3R&m4**(^ zgVy6CfCI!&gagQ{Q%KV(gmDV-p>M-agFnxpT+So`+liko4LD|Ete4XWepevY$JXp5J1>h4iUc^4IsR$ zNY}M^U=Hyt(3OQSZy=l-2jaEbWcU?2(D z0F)5F*A_sy_pTAY5Bkv`$^$d+ctsq#R6Xk2_+Ut1Fn!@-T-!A$BJjcp{a{wr6k8S`j`T%odqVY z1avD1bsTV-gjN&4wRV7n3HGM(0PM}MH_rg>lCZP_mH_xp&l(S;0=G$cz}{mf0DI52 zz;Y5^4Co4^09how6M*@^O%guMfrUUJ3186V3%dNE_Xm1qh2M4({=vW~0BJ(|E1>aN z1nead7z%*K!1E-6;(+M@=n6)7!3Yn#i->Zaft4i66EFxs*cFgw?8qW2Anc0%z)0W_ ziI6A&^o3-S2yFl$o#;D@u%5tf65+^)@Ug&I5|wHKQvuK)(G*xfA`-_BvAwTRbw4tUK1DuAWgLpU#)q-QxfQRi`qzk9Xzk|Hh?(l`T`>W&{+?3 z)*A;PzPK1*JdjDEemsCM>VvihpsfMIXh^_7U>k|}Kwva*l0>6uU;+St330#@poqk4 zJ%9})8fyS(YrK_26U5yFaW`2_q8a=(UrM4ybpYj=2>&f_lW4V{L~GE7_h0e)Arfs7 zS6h@(Tg2NIX>Nx&+Tp%kI&handz4#y(A6G!(jN47K)f9gZ%0pH2!K546by_85N2n@ z*Et11d|m1SGXTWfwJ|Us$RW|KJ@7N&CeghQu!+PQRv-xg9X=bFEAWHTKh%=lYsLi`qc)e0$C*bCjbk8 zA`)-+1VG0C_!}?^Kzsvh0^@-F0K$H!BY-r#bCbj%gfr*^U?q@8VsLX{I)FHmq5#B~ z1Ulbs03Z+E%_K1dbPNIgLy*Ry!2seJiu@a91`z)+q-WSe67R(Tqk)}335nrtfjPi6 z67N?hF~So#Kw>1~{TT6nycj?lMj?z*$cItz^RGTY28q$$0O%ZzG<*WOJ^@{yTp^L1 z03gg{#5blDumE`a3geKzakY2TZps376Gr_2!d1=TyD0_QG4YL_fF28?@`IF87r0gy zEU;l2jSzF^E?Ok77d)qB%jo$6`p&ipQ{_`sO~YsTs*O||Zf#7(#UiUkVXBIGcgDB{ zYis248XR9ziiXj6`E>!bcmZ-D6TXv3d=;OX2%Fudw53pv&5li-PJ89z3{yP|-n(v88y&#Zlv4~t38 zKYjS{;nVygC*8Nr^)qS4SE%?*06(E%M#Gk7bvvC-H`ZG#ira26BYQc+@H``z4QsY# zF55H^1w|I*r{D=g3E;~@%xx=-1fs^rXsTwhSTq$Yz;%W^RPmKfWt0b6S*j306jG)v z0tUS*3w8VUlV1M*EwQrgQ}NZINnqf)1*o5Teoge ziOoZCXJizE)Qk*=Vn=%97qyt5#{zf_3m#HbuA>jwkA4y{13DoHl>^iysJ2 zwoOxd^|CAJ>2_M4sDG-gztl?q1d9hJTi32yxpLLYRp^!f0Y_)g+Lc>_*bAGg-D z)+g&@^<{cLTT8v4K1}iSOw@;^BOS^~=>=YReR)6|7HhMF<*!68fMF zSAI~Ygd%tC3JrE%l_{kz7Z;^F6dmh<4|wJTQ!4(!&znsaD=D}9nYDyFVDee}eI z3m0ycco@HF)0Q4A@TlCbKi#y6TXAu>GHo82H=Mz-uQjU`8t$*AmQ#Jgs#a~-b?`?Y zebl9Dm`85r--piMypiil^>i2KW@n$<^uye_bAQXUw}_3cR4FDVG<4arEqA<4`QU_S z9>JltTXydJ+i%-X7y8vt8b5yg&<18pWI{qhT=m#6E%(ly2@^i-UO!gZzl@@7{>3I! zadBZ`v4@s(_SltcH=h+aQp>rV4y-sm|NBor{j}-a6IQ8y`DL*1E^C$%DA*GWT3XL!U94w4X8m)q%rZ->L-wBf@Ix7$(CjY-H-H*kcoVXG5@ zhU~HlNdT2*mXRDJ2$c*K6bUl&NuFd@;p2CR75LO`{t!qqLfA`rf-rSdeFd?5=ny%m zu}(y++bp^h>l7jX(Vtck801%JtsM_eo)p2U3pn{*aPqJ+ocw;7TH68=N-cSE^THYY zF5G%jqFT0W*|O*I6IQV*ej)71mAzZQJ`G~S{N!phrul`%)=#*7`}R{ySl#x$dU^Hg z)uAr9^!B}bQBf3Po2%uW-L-4inOvLZQ?q5umNk9mYPp6@p3NFq4>t7z0|Rq&?X_we z`K%&O7(V?savb^p;@Zd)nJq@f;9N5=&lwU^CB&KEqD9F~RH%{`SvRshf&x9Vv$AT} zu3as_k$>^Pfm5E5k=fZn)0O5mZ7g?hZd#BL5-Gm5TC`|UOQExSk%t}>8iG` z4Hi|2mf{xvWnrNlagCIy(n=;vu8NbPM!QMHT04yC!69N7!ep^np;E$RF`H3xW=J!W zmY7N>QxOxhX>bp&!q@-GmuT;eJWx_OEcH}B1T32i8K(TfpN;fX zvvK3b&&Ke?&SZl!S3{1fNH{`tp@O*Fb2TPa2?=Ji>V^%xDN3odm0$UO4QbmCJc^ky zvX^OD(#rDa#p06S;9&Of%x}w=FJCZg?jJqP*78-VR0%A8a6yWxdGpqs|MUCl)2A;v z^uQI~s7;%5=PukScuq=@{@|JLk_(1%=#I_%v`f^f*(NC|>CJ@Lr~oy!YQ0)DYSs*r z$@Pw^*|0&wR=pc~=VTt+xMazaRT)PzGqVaTKHf1^BU9DfYndlbpSQPISn%xV(W8$& zD>ZJ{u3eWNZ+6?VeeaoT*RI`nc?MOfgI~P{rY1v1j2O```bqZfYZote>Cz_F!^f@M z%F8@|_B7TU?MtT*Z9eB5MfZ2En>TOXssk4;T)ukAR`>k*3l}e5$^k8fH_u->bL`Zv z%jWRlYTZBl@WY{fUQbAlVyhuyXy`{Nf!mUIzmY)Q3PQqqD)MtlFU@>Vtl2 ziWU-Ue`Lwwq*=@!U}3Ne#ubESv0AMjkh7`=o<&<~^h#l8wcr-(F_|4KNgg(IAMIEi z3f7z|`OO|IX_Fl-0@3J4xul$gXtimOm5`Q-T}aXCP79PKex)wZ4a0{Q;IPU%q%L}K zlCMhrzHlM!;0glWrQ5-@ z@TH0T>8W9|^>H~+G2ua|W?A`>;j-P5RT4Ddr`uCxf6)(h#1D1E2Qu8NO#SdF(;G1z zK71-7HWoej6#iFY;@LD)c(~vGef#J)a__Rje`W8W`Jzxm4eeY5nJeHnk} zc++xQxu+$^Hto8W-K3Gv{VeBGPc>`%pX41=JIG!kKR^HOwR^6h^0BYA#qYJ)@m zGn=RE7J!c=E0NP%K7~h_HQ**n4UqkffBPZxZ0PMH9>u1*(dBgM5OiR04bmD6@Z!y> zY<|{3e%2^cl5u78bN>AK8JBZz6o|kI@)s6jEx3_$Ib%Mpw3RD)8dN*RoBrH&$K?6c znRUlpD=z!mu1&}66`C|@(xz?05XJrE>Ph@=6bdDzVcRxM$YM(g&Jlq@0f8Oc#swAS zP~pWLYgR(sTzO=#aQN`ybN6&lAD(knHvU(0gpa3w@7!V9Z(9VOL`O<;_ZKFZT!rc* zbT*JOR0Y&2n}?B=9Grx_wF_jLTc3{fq6$07X)9;68F=AfGHdVyZ_CVPc9X1e_{dd3 zBQnK|Is-@e%Ep$0!jTP+rgA*7nNfF2P#*|wg{%kBC<2Vu;{Ayzx=ij>E|Yt{;Vsym z$QnnEi-%ht#Ji5uU7L4qWb0eUbp3Q*@7R*~J~i#W&S2dy(!X1a&I8*Gs8zcLwX=EO zzkS;SUsM#DZrr?o;@oMwuat8xmuz@tl|c{Fmg0$(Szraykz|FZnPiG&8qv@}NWdPn zBZt8}3h!o~+h_L}HFD&e-MzU54K+p-zO`ASZtPpWX!*}8|2P$8$0q?0K~kclUMV)K ze6N;8xf1p&SMaWF^uf>&_kjn(aRM z)iespjk3#9!;*I)KjIchAov4TvKyMhapx9NT#*GUHINNB zxY>}2Be#1aH~N){rCXU;>Rr5e z@y4UPyu9abRrU#3ab8|-_T6h2@y^)0Z7oaQ+4OIw;`jC9j7xbw32zLLufhJeEg}A? zRXxj>S8n^~T+c=Z<=@UK5cvgOwYnrFCABJ7kS|2e$={YNS+e6cx7Tacs?}@ND+GAy z`44X4_sHQHP(C`YX{)ts*Z#KmvMZog&yVoxJAU-w4zU4+$1~Pav`zTkaac^LQqy7K z9Y1GoVQNT8UOrt4Q_dPM)Ia@I9CoQ7s_i@IyY-24+Jgd7*A$a%8}VKs-%3yloZ}7E zG;7--x_fl})Ry|^`Xuv)!#AGi-#@r*3Lec14UrO3wzf!v(d~zUHv)O5@DL9Vt4T^f z2olw7@xY54zV^Y81eo4}E(ki}kSUNVN~(OBgEzD+5VjZ;H2OTKF;gO?z?E;G2t;-l zj5;Oj6}m)59|yf3h$vJnyyYS!)TJpPMo(3Z_fq3U7$RLtVe~OlWfP@L!E@Pcfh-vy zq?(VUSpKA_mbP{&pRv5ihST(5HzT*B7=0Uj6v*6I5M+{_7@k(jk>$WE!Qd5)o*FeL zunezwm*Exjwr$Ot`T8CO3xMHTLTlYrrJ~br{_w*yXPnOWQD{_TOVr+z6c9tW3RbT86sFW5+60sub0rO`A4#`1Q=+=FKZtF35fT^nty5_io#;YSlDJ z_7a=##{EYgc?H(*1wQQ*C7f2PQEjNa=e?Pkw+fK^?x$I2kL=&H zWQ5%xgN)!L$yNq$;fomt0q^NpHgn3lT_+wCD^E}F!Z?dE_bD>y8|hq*U`W^U{Z@MO z!_WZ)4m$QaG%i}vz*|zFasscToTWj^V(=lrAKt)u@(%-k!OH&lmKtmU_Hv;Olj9yP zM~YQaA(_u;`oLsZhz)i{exvsfcADZ*+U^^HfXB=>9}~zy@4)C1dgdJbU!$(e-mz zo>Z(@@yY2U*9r;>N|=XlSa_h>JY~u+PkbA^``Kro^{K3))O=5zIB{3_RY*)ikyX-l zFOSp!xA1d4CoeCrI=Q*I%va0KEpn&&I$fr~z-PN4c7DH{ZN~eZy%|2=I=^ezE)1_V zN=i$O40vrSBNvp#+LbZQW+T1sx8I`zQ^{p$M`pWD5A_hm~A zO1f%XTwFNi9bS%N-grmT0?-Fl&?|Uw^I>6O;R#fu3RS~o%}@1pIMl$vxW14_gA%-5 zStm}|15fQrpJlVzzFxWQ@SQ@u31%PNwqjZb?VfqT^r`K!AQj?#xc=* z)|#zNH1MCp&f$^uy{x=k->m|Jq@F6k_B|T3B4b*`U*uw!jxSY8SD!g zDY*=?5$pygMYpCrgc^R}EZNVLopA^`d2)e2G1P$ZU9cVo+aT{CuV4YLll%=)hrXAN zARxuULLr8Ymm0%BTu|u<35+wU02h#G2rLNfjHrx}Hgx&W5e0v`$RFZfFD^nmsK~Az z`k)L!BP|%H(Va$Xh&6K1vxr?#z^N6{=2k2t;eyM^5U+xQu(0;GtUvDG->w}vk6&!k zB-^I+y*SM)IJly=FaGzjUAtyvfG>ErTesRk*ma_A(^~37^`ZC{a>1;hN@mWSKi?>* zSzczd%Y_e$Fv|x_Y!syUN5w={bScx&b3*!9s!=U5ZK2w* z8T+(SDJ?aa^+g(*Kn`|7ZR=V_4)!dQh8pY32jt|eS}SMQR_6e>S z`qT2?Z>eETyY}kUt7CjH%ifF>Dh(^yEMv!R+k558mD^98(=bxxb7KoC(5fA`$gd{G zraQN=*C_YnhT!1nI+egA#O`dLx~J<3H^s?>BKD#x(ijlzANoZW|?JvazmcFD_-eX@Z= zd6#nX{U;b`R8N5?o z)4}RyO$tquY!Bs#2No-6=z7`EcLTRhf&4Vd&b<_bGAJV?Fg99t$>8{7PzFJvYX!D; zVJJ+pS81CqWvjysK66Q5N~$OL4s{5{izjkSf!VxqC!ZNV5Nfl^yBENK0jxMCK-@O3 zq9UV_c;VD8M=X@m=2?UMHAdx1Uc7fq0tY0613H3>M}dn6m*IfnWjH`9#3X^~E+%C# zMkEiPX{)X%0rfle?c29gT`l{>_bnlSCWZX5cG;Re=Z+mYm6@4&{_%*j{t&>4WRLndbZ6$N?Q0ee-JoPYBP66qD>ud+1r-NSoM zMJ0`D<8K%K2?_DT6KP7^_+j{Uuj_BkJ@MzpjT^V@&nhw1?>~5SQoDo}Jvy{$2i|HD z6BrQ8??S+z@NC~1%o7_Buxiz+lUOGF#M-DY#?l71tKw_Ae`wRDP5bZY-9uekNJvOz zR5^5B%sIE7hqM^w-r$M(&tjDvTIpuOc8 zm}$j~Hs}P7HjdA|X0F)0KPz9#ug6$ADmyCM5-?+{8G~uEpC_484v7hjl0t%N;315m z$x&eZ@WPE(O<7)ewL}FEL&3=(#ORBWEQl(}pOO>6d8k^Yqg83fSgahIQ0x(vj7|bv zNPd%bL57Gkx}OGH^9r)32p$A)LE0Jf2)K7*I7&~2TZcd1Om!)uA;j^(cqvOIcPb`% zq|8n6feofk3^L#ZT~bdO1Kx{e*Vhoq7&W%yfk7%d4E7iWBTL2Lcr+6#Qfo15au}h+ zu*5r$OqTpjMJ+T3G zsSu=c0vwZvX*N=(rQlvEDoQit|7_6p1?cJo**Ot(^)6F$`V3O(<*a(Sf`VuH68ZVh zONtAg<`#?_*FCV{!h%-%D0zf_f1$vy>$t~{ALU>!T2_|ld5<1E9yO|?Z{C@Otx9W~ zY2lfCzfPl&HkO-LoLZ$gFZb!=d$(`je(>}@h1INCGmP#ZUk?$x{!gG$xE1**S<||h0$q$GhGI8R>VetV^ zcdfvSRdj&*bxU|cKRNQ9P?+=h>C>l=a|)$AR20{})9caQNk4JV9f9sogxek#3XXxo zXGk^4n=oYS3>)KuC+Z)IwBw@K4*6_aee9v*;n7voF}W4OO?FSfjuKfEH0x=2-9tT)wNQ33WFG@HNY)G$uX)T* zc3$xA1cguX-3)i`RA_@lEz%u$(F4~bNM8^p>kdxxkLgNVc$hJhgb#UT4MrBBBX6{7 z#!x@<34I>L7>&a-R8q(R_(a`-BQUPFth{cgTc9&38>ckQT?Az=sAdN5ehS`|z3ewp zr#=Gjeo}^aN0g~kjU8q+suLvUhlAS(KgrxU&u+KR+j#Clg)W1W2FAohmh&_P1bZPj zG_~Z>*CGFkHNzCa>4bf9%1qIe1DxieZ}#doE*E4Ti>^68Ah5ij%52rBn%qg3N;N!)yW@p zZdBEEHe=(Tf9^ebub3%?+1c4n|H_qp$~EYYU*z3Ar&KrCGvS?g-l(;I72R%5JGI#3*Ed980`qI<i>D$z0`{7OYVE@b~hIspSA$kLyPHn{hnu<#Nm zhYw^A7~N~*hyJ#sysRo1gEE*G91byUqyte~!2GblE!i+Gh5jZi+%`Nh_!RtzTRE{K zBh>Y&o(!CgAEu8`7421#Mip8Unc|d#2t^n*NB>{WCSkav7_){T4J2Z~!2_hD@q3Xx zgMU52zgWXc*o_rqe^B{RrcEd_?nmrNK1yH$YIip~_w=AoakbVC)!&#Wks~6=6N^$p zsTg{I{7Hoiux(b5Qq$o)5 zy+i0VBq6;|l4<|Xb0#d~-o5*~_e>_4%$zypeV_h(pXVj&`MIWi?-fV_XMjnGYAbDC zbf=~my|k8;7j5lP2=O2~afUd~00i_`9z@3|E_5u&$cTx_Sin}y3-M1PkP@#}=*}g< zSsIgaX{z7YVu)OUj9vz#m&z6Vv;Wm8dh|wBR2(~2F`6fHVo!XoxVYcCguv+09+?k(945mE;dI2T{ugUSA4ns11CdywPGmz2j3`%! z8|GnV&Ge^&c_fl$mm%f@*n+tbLtbP6?88{L7z}OPPOHCtEFb4i9^+2>WvR+tQ1iVL z4C}BS^zF_G=6_fc{l3o5?%p{ydjL>}%+Q6^Gv9kRG11<5;n0eC^X6?jw0-&49Xf>0 zuIHciXG0y7Wmz5GJELIbev5&+6Sh-FOJ#+*fN3ft|CI zdHOxrP>)bNxMR(lH3wRf^6vYOmku2+H6~@>_`m}XJU;P>#~wa#z?e0R;|$9(9#C%6 zk_QdyJ!Dv3w^XI%u!Lo2FW<1CBac1;C5D6H8T)J`#;$ zgQLY?SIySsU59^J{P{0CkJkl)=Hol3&HVnSV_Tz};mwm8lIfH0oSi4h4-BcG}QI4i>x;4Y+iHIzP^J1iP4eTrz zBtRu9CB^brjX{JSX8?%Aw_{@3HS* z?3b6Fxn%K=D|a2Qit9J#{z3Wqy*tOmrFKeBPw&_vrBha-p)I{*vddVq^CxAv)-O5U zE~+C?ci}`^+lk#9)~;W_e&^Y6a#~ie{Hw3NdT{^lq)8gjY+t!@<*HSRaY{borV-s- z+iY+ps^`|=f6ZQUjABr`43xuzDY@%o;g;Ymp@rT$V))rG_R_j7xl z<5i{R_`Y2`w(mM{y4J7Q6H*E6b?gvp)@O$KYP@*j5V_8S$1gVc!xl$gd}81JeY&SO zmCBO`_El8W`ziX`O?&;@_0)Z24S%UyL z4eFcI(^YxK;*Hg4H-rn27B<*E@QMhv^k+sjv3TwGa6e37lD+0rF3t$SbW*ld6! zMd0$#t6UHTF4$7_8r)bh(! zu`ZWW;u~@!G1$vC`N1c3h@+;1B?Z9)atZSU?~Qj*=h`4~@Fa`jbj9jlh{4h}V|4Nr zvxKMF1RG+(!;+*tI-g{GS2#lMP=ao<3FD#Zg+*kXWV;*}CiF1{nVA*Ykv$|iAsePr z`>y(-3?35GGL&)zMqM9hv37)2*-_PTx)DLb;n_*Pt$!xR(a#%6ClH@$YYSkj;|#Yy zL@WqWBjnB$JH+3rzmGk_kNC!14mdzRpU_`5tb<1M1M2pR?j(ETbSnr!AWOCGMxj>obIV zj|9;~ai0^T?lao!9~hiB zZ?7_ha8zF9`VT+M%v`^A?K*_QiI6MM_-UZ?*k_-8_O|q3j~?c;2M?V(b?RJ=QlvSv zvyrR2YZLPBdhWUB02rwDxVZSl6fJ4`^y%O4uc~DS_9!X7SXR{-@D5CHI4UdluUN5S z+xfbo3vCu738RzATaFY}rGAY)gGYFjzv8^^QC4xV4|sPjhbAfEs8!wq@ze zci(;2YYq77>l?~0RBK5uzx?uJS0%O{<|cbJ?=fZz5e=vL3haXNFNz2v=;U{Of5C}GaVR{%0 zqqG}tx*qW2eWM5qJ|PkY_Jj8UNyo5sC*XRf1xnP2n5pU{&N(?wycA&_IE+t_L9m?H zC9XA3Hu0^sZV{qJjg!d~w?^Nf-^=74RN6Er5<~bj5?B*JFdIChB}I4*ev&=fnawNt z1ljcQ5O%`}=f6mP#9%CRV3CM;;>sW#ydxrAay;P{R03yG0{#}C2b5Tdh=i55bh990 z&E5-L-3MJg1^?U!UEL8yS9eG8Pp=2}?Adyt#%D=LV@ohqo!+@+&z=V#7~ng7c;%OW zWBYbXNsYh%L)@ULrsia+o0Ta_PxkCgPBNuK_texO4?|jy-#)nK$&GVnLRMdI_4JyS zKeW3Vt~$1F58I)WC6|mn1`qn^s}+YY*{^^6|6_Y%R9g7ZqOSn-nYwg|H@dTE`_T1F zIW%H0G+j7(a@#j=zy0>?EoaVjO&f6kAO7%%@dNRa9}C~l^A*>%*FSkW{2HIFJX$MWVa?H%bEiqQ!_$QY;d?c56isexbIIO~!v}VbaT^>i%|MFI z8q;~;@Qr(lo7{%RdQZ0Mw5XuwNJO)N{j%Cry28;T1y!R*cSH?YkXUvtHWc!;vR7NP zUv(wMTiq#wrIjzJj>IIF8t}Cs(0o2muaH0qG0gPYMx;VYZS-A6YCuPFsroOxZ%MMS zO~MqMl%f+)DTVjMDowiwW92ndk`GF6BJi4kZ{Oe3OulE@}I z;3hGM`rz88>a%k>Vx7e7NW?lRikFkF@UmV|BoYXZvgOkcGh04oeY-+sx@OGZ@tkH$ zik-M6B{nOzx=?vpGj1F3E?V#zV_ij~c*}J_cI(0~O~ul(%7TOzYoXwljA51aD7Yiw zi@|^taIxGOe!UJjG12|Iknu4FR3AYBp`%#nC>A=B2t+JbnmXZ%=NX04uoCmsH_L~a z>7QhNlB*fVTzF2iOx$u!UTj{YW?Y~Du4a%cdo^4Skhnhl;$*H%KrI$cNA}4PWCo11 zz}9nLnnbJ+@Ji4WGLh5un=W6|BU}@;!^#U>)1zF|gHhKs{>tbneXFYK%F4sGj@h`w z{RZ^zsQMdgEB^56qkYu2V?Te*wqQ$HDE7uzUwaL#Kay+h$qS84mG9iHF#{4+cSmz_ zR@Q*KMH=2SX3VbbE9SrmbAH*-qsLlL-=RbMI~!W7&K@U?b+oj_5a=@W`fI-Xe*Gm| zzwxj97u(Y#yCj_dan_6(J|O0rX>emhtEaos7FW}(Cuo{T)o=Tr>a1@!oUe(?8aV+D zdE)lbXU`5sFplGKPxv|4UuP{TYLIblIJ)fXsW*mS#LyoXehBgSlIzW{mmDmYxLC!3 z#k1ZS1qVICCl48C&4NR2rfRD>1cYQ9acuwk?~8Pa=$v1Bq#28cbCL zp>UblxHvbUrgdvsu$E%5Vo|rX@D-pv;*-lJd49Pi`iwVfCe`N)c#!6x2^o}*W^kKo zn4xP$Y?BX=0z7dUgKB%cMWTm-mJ_O%*i}jtg{4gRN4(_<)j#mbhnagGykyAV;k6XI zCT_`nv)r(D02b*z#@dR;k$7MCheu2%j%!t7RHCt1#}*x+DfBM#MeY|nlkB@hf;@~8 zCW3^+)VFj#lvpE`O8*kS7ah+uFIX^isB#Hl-U~16-K*Tdi;EYltCfQS)#K zpz4$a&6wac;bw(G#mnK8rI$R8*|Pyg4er`0)?ZsYf(0YrwZ1r{Q)t_4B}G%RG-Fnm zSa*zt;|zIN$bXo}FmiXVFVK;dR3PV<`5p1-hGGmJgw zRYes(JVNm(?-*Y!czdhk%l;aKC zHx`7)Ve&kvy)Us^hr^}<2&6zUmcm4@xQbjiHU>tm1Gf|;AQo;bdK+g>@tjP4Q2P++hrNDADqNg)L6FGWYGVT6NE-A7vgu54qJ8XdT7!ve@`S z=|oDsDxSPzN87kntR%&cl5s20GIJrS5&fdr+tDRGId2Z@&sR(h>;ZB;qAbQUd&VV$M|=l8laK>WW%4Vwk{( zu?Li~lazb;iCAZXeN5%P)41;xkuOpAof385j-y8>a=V!yJ@Eu$%w3?=c?!ZQUPpHJ zn?g<#r%Zv>8T%YhfpQX&5)rJ%5k!RUGgdTKNHI^rWYy{9PBhgk*#l}3-^((~7l zj0(Bn2)GrKM+p!bFxVR!G_}#?;-cNkYL7BBlFPoVbE&6i?O!6$QCEC_)D`z7#k=G1 z`Ab!;W~x47Ep1ho&L7^n8Q*e5j`7l-@7|lt_WqnbmkikjcOaG2;p>ZP1GpfyMeB#> zC8+K+H6d^P@L{(;_R>o)J$CD`;p;ap|2vheRDXKJNx-Hi;I((DqJx49a}kj+DJ^AN5Xf)p?7HNxP@4vZfo_S6$^E(Yfb2L6R&zFxUC7jZ{pL# z=v{QOr!Rx!azJM~I06$N)ez%~MWi9q+C39ukplk!`tHzT@d(6s#C9;6m@{u`D8yeq z=!0d-rwBwgO2};hCZw7u7@pJx5~V_-6``naycxBL11NgmD`iiRjyDxo7d5NPP~EEK zT&N>_ioU`x=qAph>UBhs#DjvN zdS6hl{tNmdyf6q}7z8hLhZpj)kO32}NZ0-o{-JA?j=Mkobazc>isw4l>=sG8d*h;S zzWHYHCS`->?9&IjJ8ewre=pXW*KA8n%FOHI=~(Y_)$g1MOl;=PdSRIQKuS(dPD((@ z)0|6|P#YLmwrA~E66G-0pWL&1{SuET1~EhBR?#xw*MBcA=Wo;xzprTI<%IB4Z^gR! z3(I-{og|GY)fAVNm7O|X?4LGm&@B^*8Qs>& z_U^l#{`0mC#l^}UnmftlNN|{A(z#eum{?IeM zT&~W|n<(K}+t3x3es9tEYp+#q)jWyeVDY)qvrCr}0Ckn0+V+ja8H}}cCaf zVmzilUbIa9XnI4#*MAdN^cnr}2leB5m6c5e;YSUh6Ja6{fiS;I`zkYhIRr`NrGy{3 zb3JMlRt+{hMzb~vEh*Rugde7r)M~pK(@BM0Bql^uh=`C(sV*MHt-)bI9OH+(lY}xE zTRp-k(=Ai$W*R0H%8=_D-WcjxUh)QZDU}sibu_PFlLj!VKss6pFL((0>s|sKB^6Y; z@&L2(3bXM_)NH&GH5=Ex@y1Jc^-W7j0GJg|QcbPCP*%o-bX3oOhqRpX@%l^0j+Rh9 zSyRm*+x@M^j0fJp(sxyb(+3ue9(hflp1Ikb9PYG)jxjMk?qs&^9+aDI zsy?=_sIx&1AAx1wAR$xq#z=6ZYJpn}N;X$5} z;otE1olE;{(T39vjCuXZbqlB8h>U-V$MZa1cg|e6c?)>WlUFA<|icn^&zWjgM-xb!q@YI?E+t!-vP zQEp({hzm4>0qfKqskDdbnSOU_a!z)3P6uWe)!S56+Zy!OSJp!SOfqPKh<1i5JQS?5 zi7O{M8fhaUgCl6Lcw9?;Q?RMNS%^@Al4PZ!LtgL_8Ul)`6OmjXM@ns~tg5PP6d4l= znep!dFT?;J2jU^eBOt&TkT)z$D&a`&s$di44>h$lwRHgaYHDibFYh$B0ZwMAI>P0| zNo#6AG3X)+ryI)GKEd?!{zx#UWu?7s9H7h2V60PaHCZ?f&?` z^H1Wg*a(;XlU1YJ%w%Ss)6^Gt-Pv%HMgqyOVEM@KLy99jk!nYSJ%r1sYQzBj25K8I zgK5LVxe6)KnGOatI1`q?Sh!A%3;rfyM|N$)6bN`0M5He+H!YR|rX`(l!8_9f&! z^7`vaPmSOj^N+5lzB5$33?^7s9P*^jy!P5_Z|EP_QhfUK={MeZcNCW=@Oc8$pZPKAg8 zG!rN!rO1N;Qb3>!*%8m2Y~>{%Gkkc>MuS_7CJv@!cdcgdF1kz-U#BCZC_S8#8O7*2 zujHsvRE;-$_jfa}d-I}sEE2U)QxZ=Ju){L`YJW0ivNL_sl`G5JYAbEV|MQJjFR6eI7&zydzG zY;j3#Ud1+9zgnrm7Jb%-tL?+p_KA|9xlvbZHeFj*u{;*&n7ZkBu5xFAG9xCr^4i0R zmdCpGP_i}U1Dww3xMqLhNe5T`U$5npPggwm+pB+Hpm+-n^N)>SwZyy4m8qM%=D#}v z^JXjoiW6EvXqQ%C=;SU4E#SG-TM*jB|LI=CD&k51Wu3BqyJ7!^oiSs={a~yn68*!F zL!-lk`TH6QzJP4l^wh9wB$-C-fg!9~Tu!UqX){|LWXzZ?#SCm2L>q&{Yj0r(foj9E zWTF@0Zo+eBBvZYnINeGuKVGFy!@JbS zvO8m$!B}=;EHfC(=(tIAPpE?Mvz9Xtto+-CC#kV`SPcwNm5o}VWPNQ6qF1KJ^{1E_ zW8N6^Y0T?8KH8zA@#(D^@({>2TG0?(GMaTD9|_MV06NjU#NhZ@aNAF7@4D<}laoL_ zh3Q;&3}54pnQ!jJ;B_Gx+x%@%1~<;#N-$iGi9jG$TurA z#TvOgpglTW3+g=KpXfR@ic*+m(t z@=*Tq)I#&iN0nYo(n!`HWNl+Z*gOhV`5Q#T#HsYCv6@1vC1fu&2URZ0q_Na4Ye1r* z0<;<94Q9d?CZR>_R|yxI?E%G%;MM6yq`gF6W3yBxF$+9@l-&LA$U$}Utj*m%H9Yx+ zTg`hV?^t(r*EJ{dC~)4fqo!uZ4ubFJwYSXpq@sNo#gMhoV4^!)`#b17L$J^gqH zF9w(295N}95&L&B*JymFIX-^I3}rQe)%6=*c?B^(#XQ$x_)_^nVy+Z8Gh@VDk+IAa zb>yg2D5*UHhP(NXdrjb86Qb@lX@Xe+Z#?AfzAkApL`$%Qr9jnL9RxIFCN^9k`lg zMqc9H|4vpreDgYYJ~6x@Ztp%wx9NO^VVY9pRf;A%_6E#H z_RKkWc=zYZm%4logE3bX3lL6C;W91AVgxf0e}$e9T%+Hs_$O02io(&c#zMp3VcR0| z*~%4Kxx#-{&u_iLb-Dv@TQMejvmj^T?~129~IY?BP-@LD>5G8UJ4EA>E02T+fz*)LLlG@4V9H%aN1!%jzJ+K zE1sDiTQ0;1k2jVcJ!&4G#um4=>C(j` zJ9g~a<>^h>Zq{zH{o}`P+_>XNNv%I2i>+sF?kDd|e)rvFhvTK7_2zWn@i|^Z!t11? z{^a`jrwzMyfLB?$e8XYdY`7jMJ0d{Tb;r+~sSO+5mbTimo^=!}{W1D`J5u&<1mYK*T0l>Ia>n|p+$3KIYN=G#-JZaZ4# z!z=koMqg0xsnZa!%Ll`;iO8MwETnNbHL|=h21GA60U}kuq7ulT-+%EPNUoEh&4N13~alVD4ipo zf*1Y+UYGzc+!rMWACKaN{4O(Q%_Z>c0QBhV}TGdc@;qcz=TerX_*Ja15 z#p{;d8Oy;)@R-$;-}Pev zCsfq=@EfS|^GJykMuT2QBBlecNv=Rc`~vyZ39w{)!G?sXg^b0o;7}nyjcz0%u9^dG z7j~tzHl%$HE{WpKmcAymD}-)LA)30hgfMEc?Rk?8>W0M#ju7rRZ`zP9=aO`-Q65TchU9Dy-wA3yk_Xy zwObCIst)M`rG_d`Y+ku`?a-mAj2_%Ctq&0iBKKvMme_O6-#-U!N;{v1DL>L-iV?7rB@WCWTn?xD#G zso=(XKvm6zMUU-;hH?_!h8QQHDyQ3)m@^>v=)PlBVUL58 z(a1RW~-)*VYHD7H3Llq{`oy>^xeX+P`n#etptgj_zFg_vy-MT`s|vZezlb zR}e~Jgp*-Il?V;6fTe3^^Szm0%^BGDx_b~B<40w9@<0B#fB(5;-}i3YzIXHT`STYq z{$c*|&3m_Q-HXI}@sVMPzLP6wdc7aaU4PD(T=3Y7Vozn0K46?cj@6$#RMe?^msqc0 z(UOMV55V++F=OX0{qbAG)A!q}Jcdb=B&PLWiq~!SmF!(R|D78VLQkVgpCCB)O8VPB ztld-UQxNjC=XbB2|KTLJ+xyn^g=_bmuk)c?f6pBq%^isFv6}4hDdjc3pxat?bWiTl zy$C5wTU|wmM0nGfl$-C#hloIr!oA1{TXIIX?%lhmCsB6^Tcc>vs{BOwOk%F!ChTOb zMfiBSne2(Fm#UjZ9TJQW2{9ptd^Hsb@eToyqS&N%RHP6@Dx1h7+4P{f;O*1FTOev8 zx)eDg3KLR_{PGj5!Eg&;bQ|2U0v&*qM0W2McM{Q_WxNzyZ;@A#DAERmZA76U-`d-c$>wtkhJ1Jc_w8a@?4AoUN zxic&do3dkv#geFOLOxAja5Q90y5=D$^{!j18vNc^`jfOtRLWnvd(EOxKmt=tMJ--O zEV~bWShMSb9+GT0w|(W}&p&cc{bW93N)v)QnmZ^j$!&`5+$Gs#bfm_)t;xLyMO2~M zRCeHWgV!W&47@#1R5YTLAx3D4mWx1|ATQQr541?>fs!OhT=K6>c!2tK6TlpkN$X&V z6;Z`|5U3boLHgpM4AFGDED>>qT+wlcLRdWI4`quTh@^oQCyDWNG#j8o3ykpYg6tF5kQ?!dFvN?VWC z1`%Bi6jVb}z%OWU>~s*>5d>d(fd{;)<1y?HR0i!G(sS~L4jFOx`0+R2 zylKAaQr&dA zzEh7&#U+N!VK?1$69{Vx>CL`NC6)E{wbiw4W{Wd9je6oQf80@2m6Vs8o12s7E86kn zmme$2MNR9_62vej?pQZx9xSo61iOX$-v5IR7{2=En{UpyR~$c9Qr^LTzUuV)1q&9? z==j*F3#GLs2R856v1!}k^QGrc9xDRc@btLe@xe3e=FVNd`=S!x_wHx^gD@PIk>r%> zI#WyO@TXw5xZjK4*6#*^VEall@U z=!_PHQLnoo#nF>J9`D=J7p>b{T-SomcolLvd$ty+(8b-y>)p26vuBn6tqvJ(g0ltF z>#wV#5Q2Co>?A4$BC#iDbnV);TjyjuIrT8suWWiBTD&#=AIT7r8X^sYvcky1;&rD+(yq`hqChqgFKqsZ z7(iLW{?aCrc8sEf#HW+@5Jb8PN)llqfDz2?)>hG(+_W2&*4o+$@Ow{YRYRk-+FZh2No=X(Jk_2AU(G?kptY$vwO!-Sc)z0%{V zt%cH>8!sJQzvSEZ-6O@E3IA6N8s+`jOE#UjRHxf1U&Kq@Qe?{bEg~h(5;lul4oNYM z_&1tJcL8qeyD90CTtkNFx&Q(1r;C#CjBFBt70)l^m01_(gH7a(H=gXav z@OpseVaezX9SDO)5@CT*yY5fVGAdFj^^a9AqQ*9D!arhyw0#u21U+Oh+NNi;{POo- zTH=;^)SD+xyje+j@x{Z30f1&)_uJq8_PPvZuQEdOI9ihO^YfEhPOMtB>Vzkus>+A| z)?8mhPlg(jg-Wrka$(i)2(&L7mXu=FJdm?nM6PHnSwMmEFS$d;pE$FJQ9(jSXjorV zg8hhi;G02vK!FIiwkeT_*HEaYfII7yMO6Z_HYZBf4v4z5%v{oFvp)a&>!nMU{kUxH z*|^-?9zC4Zdw>4<=e^a=9$;0b#+bhT5(D|CQe{wv+mbPeyPkNnC$ofl;)l}P%FgfJ zb#QOd$@3*8XV1p>8w(zLY`^%kN&&S0*zgYSl%T@6us!qGuf_y$APfvW7_8v2d{wQk z-g&uMZDr@)%nV?b66g`N&qxT|ikT%WBtaj7mqu+0nM-{X2)#rPn9~6Wh=XE`$Xro0 zFGR&xXr~Am2(^ZH6a)8iM2ov%yU;ihQ0vq`G#O97``o zRC;RO>&u6rmHR<3~dP-t}Bkr)~!(Lh-1Pm$> zYeTz!{^uxsbSH;jMd7DU&&VJlG{r2W54le<3xPw_Q?UAAQks-PyF#*4P=4Zhv?HHi zWDH+m4DWy{A3~Nr5=E8K^#r-oFp)n0v7#{?swg^j`q-gEhrm*e&hB75yJgvtzE_VN zb#+d+^fUsgqv%p8kEzz*JUql!eq71bl$v%~=aG6c&1D<>XhhWYc>aL_iEfmXze%$- zbi41lXP+6{r?V&brI(6|o_hY(S6+T`;$sipKI;1GuZJhrRNDI8|LpT=)KmBB-Yq3Y z#MMXuiacy@{ajQWaHRo@RqEU2Bj;l7Txa$!jEKjNS01bhx}n$l^P27Kw(od%#%D8d zmLhZq*+ZwgBGZ+cXfQnc7=K-Zuc_kr#$|IpAoQe8nzQs|1uw8gZ^6Ns2-$MXExtsAmIW^35fd5j$3bVin zxGLNOmtmme4Sc0vBT|nS?H3Ii-HN~3k!ruAq8Z%ZjX6^q|WzI^7 z7nS)dof(hL{FTzQxqq!RGjydXLoI^wziUmH{aw+GM8smqf#yEvzhXak3#U~`-M#$|#Wh32}+HHk|zs)~fY3e=p z5w@|tjg^Pz(+dz0SEQ-F7$;d1t7><~_?mnHcUr*L6yq!1s<+kJTI!4Gc+K5UKKbO` z*L3t`(&6~nsY^aHAzj%LRA2eYW5;wvN38Gc(hnqEqd)8)EIaFq1?-{JXh;F9148x^ z#24@#cWg+xR=RsWbZv?uT&@TDW^XF@NLiv%e`w`bZZWs@HevjJHQw{(%0sMKMqs0@ z=HSYCAGk*o@s2!Rw@&$L<-uy2@rv0^q((w~*2J9rNPH%dIB_J%M`OBU`{d&!Vl_GW zp1wGS_CTx2X>XItz&5MX(BjAMOHX$NTX8R<3VU3FofuodK7Yi$Ggc=*#VClAoMo%KMtwWb|#2h4oTGi6flCUDQ(Y^`)v7tC< zi-Hg!lEQCkLM($s#Wo6<17fe}r7fHW_3EJrNjf7FTQ+$d*mUfMz7_6bwH+?S{pAG?ccd=+t{&VM-J>9TfO5KinM>)+Y*~T zaOBvioQ1J=$6rT;ANU_q7AqJ0{fjTYn7gjj)APj_j~scXPoF;h`uFQIaP+<7@4tWi zJ);NlU*A5!;=bM75TA9!_}8TV#AAQ)=I-%L+va@4O?#mu#4&V`dv*TFW5o^bRK%{T z*6$MeFlX6{1&=@UgtTiLmgZ4K@7Mk+XR)s2j7$MZhQ~qG`MgF2opd@;}09r$&>v;=zY$W@JLeMwA z8|sslJ_sQZA>wFAILTX(w$K+7GO-*A$u0tOtwC9D37o$dy&qW+N0(}D><=&Lig>5l zV~J!djASdC>mb91X8h&0uxe`qk7u{L;^VJGqo0A|E=QxIEtOwIqsNZDZtGT}(P;@W zs;{j0QcX=&MOCY6i%*qk^w*2G9j=Ja?$M)Xj}DE8xBd9_bmcJD^6w%M>*hjeUl5JX zyIQ&hJ~%SN)8ms*mJeV-nj;5x?bx|x`JAuk%=v2evMoD>%8Bufzb>}n?27kCNI%S& z$$#H)p&@?Qqc18A08^^mdO+U8YGg&nGqSVdgy`5hTrZsgAGz(0AAVZGay=i;-BIf? zPMSnZM#6$_b4$tIbqfeD{60D)J%8QaNJv@_FH9pO?RiVW3m5*!kaR*MBwbVqnYGqN z$E2xowCP$Bk2w448;%$P4nl>U%h%OMf}D_fmT*~T&6c(rgnV5k000ZcL)I|Ik1fk2t;PCUlR7_%)Ue=lv)OiR*q}V@`j{=*IqYdK%d?{ zQf%(j*z}ByL1K#B2_RdoK7R1fkz*$=)U~-|D)w#Oy!0DbdF2_;kZIH2|MKUJ+qZDg zjl0iOhdTA{J#E_jBUPyq+PvxdF2?eJl<_;7%TDgvy!pmaSuJ%3=T0MR<4iDLI=FAo zfurY3DjHb~&=jn%uRaKDfA6LGHcNcx?tO>!qGrP6j7uAu%Fa3bhboh{OQKl?c1-I%NsK z$*(#6Ee#DVe$qc;`-lc;Zmw-&hX7dvq6Yr9FyT64Ejmmb9_BLeyc{N@zp<$;B0w;T z(Jf-`7*$6`pKIx-M&8Nb!7mbSm;an}|3tzQj$~KzPhwhAoK;`n$nm+pKucAh|p!8JVAd{`q&Sx9{I`>f*%`lQDr766LIO z`oIH9Muu`y-VWZH)wt^AnC5#?tkRYd+r{V-Q9m^>sF;3U-;%5 z#bUYdiQoR_H@|u6DLdt>v0d{#scY86##UXtc=7asomouUYZ&~RI(hX9ih2*1R< zLC!@&`JV9W_Kz0ss%x!1xpVzovbcXkO>t9tWQ*N&pI3;QgEB7U_VL<~e$X5dZB|N? zfkjK{$H&pf|J8E~22*U9j#uJb%jd+rH5qu#%E;o+8|l}`kcPx6nq<@GM1~mAEQG7u z2a|bi3ro9R+KCw>w3y8J3Yt6-TKu;NMaRq4dr~J~IGr6M=;Y~M<@3qLxK&S%R3?!P zn`-Wr_{(`^q^1;jl^Z7;woU=4ZQHQjv}wZ*m-03^MU#=j5;0kq1rXB>H-Xr8$@zjVn~$NbMv=H@IN&WzZS$eqAD^JI$|7A z#SA0NWMHWB1~eW)mjkw^xI#t|=m&lp4z3Z28x-ymJ?wKU7Jg`apefCfd}S6Rm&M2> zFmkENuTkUC)%Mm&_2akvu=mL-+CQtV{0^wWLS-KCY)yGaK-#8Py6hZRpnPn*cYCK7 z&VN;^#ga(m_WnrtZ@ks<~2Et;{RHROqD^MCpg2(-DYe`eP1 zP){#xUQ`~@=tDsFWqdqWPCo_^cDekEJWjimsCC zHRPs1TxB|8PCWqUcEZ|XvSJb`{_rHtLShSQ2v1@>^u=2w*Ue}V(3Ns5J*FtyQ861P zby7{(RQmp6=wepsnQ`Q-e1ql%ghOb$jrGk&I>JVYy*{#+(d?;N|IZFOy2*`5tJ$)D zVJJH$<#?g_i+hxBKnB~g8-`9O-Q)qr+H~jjMrs#-LQvXu{QU7h~JMX~SZ)xw- z&xHP)WW#L$+Ud9e4cI6i5)sR+cRXH(A+d%Oj@q~D%EZ;TPq)~F9u^)Xu0vaP73S) zXr{%Bw;uISH)CD44B+F@;%3ddc=0d0k1n3Y^#0M4v+`iDD_ct7(xpApF?;!ngDY3) zFV+`bx)ex}4-;z0P8V7>Y^wmBO`Nn(pH$V8#8Nd3yXw1m{J0dXsn(Rf1)hX>)5f@9z)oAs7EWqUG-P3$Bu254_EGh5R@Ceu}62Y(uL1gcj2g#*k|~%5kvz2 zXq_@^@zLGue)&Z+mmdWVyUb%x>DND>j-&%~619ZNgIn2(TKlE69hFxHD>Yju`7pmf zl%QYV6WOl&WL@+R<`OIoua>A+Q zr%P)SlFfCcrVUYW2%u~=-^nHdL<+aXaE8+Do~Xy1;hq1;`b3+ zonjXX&}o7yK@^eS%Q3Ok-D$E*Fklo4jTlODwesbN^>Gsiyp8$0N>P>3%-_{fd^~J| zSy9&M)f!6IJ8No!3Ei{1_sWh7loYL9vLquTwzaI}()qGrhwN*{+zIL^v#g{!E)#%A z|Eq4HG5yW`(mFYsWudxLM>qZQ%P*URr=Lk*yLR<2KP_FoZU5;SzcZ^>uM;Ouo;iQ< z_@SLEzyIQGS*qfhLY5cHOic-1Jjr(G&@L8{+PLq`#bAd___}xRs{w2c>FK$N9u~Lr zxEtmFV)&2AlV^UnWYfOmm&7S)t~jx8{SRMGqfhJ~`S8*3eT4<#o3y`or7w~+$|H8A z2il11q5%YWAah0-gm@cKFow|WL`TRbh9%Qy)tf5Hj3F)bp7Q!9BKz@>z&COr!n`c$ z%L)XnYJ&}^Q$+h(C9E*UsO!jeF;x9+pYbYv!qoUe)57Hg0TM|E=5Y{&xK-4t2_t&_eBNWhIDXXuYMW zu2Lx_uZ~cVz>%bxsO2_WD1Tvd%Zu3D)ZN@88JehO}6}TcNG<#scf>OvaS+a z2eskUfuf?j?&@!BxVU8=uEzB5x0WhREDfBSs~pvANB@_Y=GnXZJ6d4u|XIeTk^J@3&sMl0{PKMGBc_fa0=RNS1ZS=Ij?$e9Knt5(VL z=kGtz3Z+ZOALHJd^Yiv%Ry<>w)(hKzp7W-xIP_Xvq4xf~pSPZ=me@eenQd53f6$h6 zOcNTCxo6ZFdI$jW6qR92vl0rHAaD#w4n+kZ&omM6Gub`V!{X40!-5+wqKQSsbXt_} z@sJ6WmvUe@#h|83gL;UaTD^$i!&1VQl=u-&C&Gzrx$cc=qJ(5YoQOGu>`L#fA31VZ z{h)9}fd4}9B95byzy$UN=ncGoggb78VjdJZ zh90^BiWwe7F(ae&P>x)%5H%NsW2Be9GW=V`9Dd&ZrTNscqosA{F0L9uf7#cJpUqo|iS$7- zc4K6AWb*lfnMpDwIYSQY5eicnENokiFUPL?QMcK7Q(KacMbP=oFi1Beu&g z4<0BfImyxi@?J@avYz7`!HB1j0m5?j)k-ILUvL^dvpfdMTq#>`X_=HnI}$8KnrR?E z#N(ts(?UpuZLi$=o6~8nR`QcOa6VnU2DO5<~Eb@r5dEi!!gJP4gT!GQ5T0!alYD+e&1PFkN zQ6(b3>kK`<`-PS(e;nwL}w+f<>fhQ{HE_| zv-X<(Z|8Co=gu882*201(QeWftIpM%&0AJ) zj#~}FoIu0$RF=1pWiCiN#Mo6c@tF|7IeHWlD`1UtZabu}a*g)aBO}~7#mYS0M1|1# z#D(~WSpsa2N))wd6krt6j3*wp$pcVYf7>X0B}+pXXpo3Y2~JZM853v-3WM0Ft{dBV z<8r5n7{)TXmiAwCu}k~tqqMIJm7{L;!X0;9=!#!YjUKBKn5A`{A_|xZ7aLyaV2Xkf z4>#+^yvCfi*Y9p&{!TN0Pa;XbLz2E1B}rFC@#FCN`h@Gm%o`Zn5Qs?vH=Jk>G?W$X z*>l%j*C#d{{Ej5;^uI6Lv}xD! z*FBqTTB00o+}P`S_s-7Xa7lJQ-oWtu^XIGlN?gv+o5tRBLw=^dh=TA-INa%`C!ToX z_FhT0hI0pZ?>kP?EUsIh{6l^EWX33UCwHx0wqgSd8W`(ZLsL4OUp@PaFTPlOsIu9a zk(1jaBgLlpN>3c}3_N>w*P<`K{BrKv^KH#lCFjnaBk%9(*yrl2Nhnmh@}FP@Fj`i0 z?b#=P(4av%2@QAO{p@HWZXfB7w-f$w*VWhGbo-rm-Z^Gi-yZ3#7@>}&to$=&QilmR zI0t_E>8EvveWc!n*?B83Zw)#BhksyABlwgaHt}b znm2UBsF4LDZoIaC@7`*0ag8ai%T+htb^rbM-g(PtXTf!J+qm}X{<%3lNB@4b^06{U zf4mv@=#2wAS~1mFgX~fxD}s1>bT<(3!lOkr2$onhg`kmGI2a9s%wXD0W`+LrFPWB| zX|0jP{(cjF*;rWjqpZ~SbodSPryHtT7EK-jD(VIGl%ciqOX8{KDN8n;leWcA|NWXF za!d}xfpm?ZX`~$iayO)PBN-yEz@Lyh7f~#@AIYKK8B!mkD8ukRY zCBKc%{Kiv_`C|%96{dm*@@YhW(^F5~WH8+F^wYN}N?co8dXGN0-+p_a9_ej&-~Id7 zg~z_tACpY4|Nd^A(9g8gHWmg>Hn&xwf~x{nFg(^k&6zW2YV<@WGbe+{XsXmvAi#oB zAR7!i(W~48W5sX95koEL}G-8wY51J z9cii06eFh##d;aXSUk>Hj7M5N5;YdLUm1(ud7MbjE0Z0y@t<6>PJp}?0Eoeqr>5i= z6y&FQp8Ucn=e6y$}gi!;fu$j{KOiEQ-Fsg4~wbZ9rFI?-@u z`}Xa%ji+|5+u7(GTrjx1b82Q621chaeI~dH0W(8ZCWDoyYU-kwaQFhjhBoQhAMiE! z8ylON!52dE7%FLEj_a3BX^t@jLe5I?l;J=J8WcIaSr;*IcO-PeF&S^+CEO0RFhdwg zks3g%mW7gFAb^Sz-w+0phRM1Fgpjcw^-Uk6$z8K_ro^EX3X((0D~5;@a1)#XJ4AM+ z2M&cau$BxaEqmaE$OAeP+Xc!ePA?zGvuA_HV+JGH+E8|k#f1+XJTUBroE*cY_1}H>-IkhgT24-%zFkvNk})V#=+{!M<%h!^ z3s`V_kla$#7N{ZO(mkg7;QaaX*Pp7$?INH1s_A!MyJv9Y?k zSxaneZmX`Y^Rd75z0woOso^lICd%6(-CsRqJ_j!@KOk; zXd)P8oXc=Td}nbP6!C!iF#(Qj<)MoL1~Ms7Yozk{Yx_16+iNRd2-3y=<51 z>+xZm#YEY;F$Gs5XG$MU*`^uJobi}W^iv+y7yyr{ZI|+iHivkIqZugsS zqO||0y`|d1HY2&Qpro<<!HFfXaJttdSo$`tM+3n&sQv3v9E=F2_rlyvcSNg=q(>I?p zRT0^@Zr#pPjf%7T;DQ2^$iPqXdWlMA-XlsD!V?K4TmcCXs1kB+mxjh(t-*7pH4V+- zCc4g|>;WLr01wInWf5pJvk?9$?3x zYQ$Idj2A7eSoiQs=bPv{h^P+m+y+_=?r1D=tZNMn*iI@#x5SNSE$3#w0Cj zOyaJ{tVkz+IKom|x-bhMlwr>R&GXe0gHXb ziuLPtfFw=gUf1505U{>k=ow{*F#y8AD3b$SexDXnbP)UMH!JPl@Vs?8 zDd4ILpcCn-K8&j#5_Q$lHCA2Do=r{d*nJ?*QCj`MAAU$qb}7xJMf>;f-?jhr2lN$B zUl0tgK76jpn%JL3s`~P|WZYC|LP|nx@&Zqn*x0(d>I=ugxz{Qgg9q2wH?_8ylRB{g zUrggYtOlU;*E;5;*bRY(5)OL0rlujlOew8(<)x+P`s;8JSVCw?%oDmF|6n|{Yt@OM z#lL#V_I)i&|CU5_pZ9f9aM@Hc65x?{Nl1ifB1MFZs2v^tpbFlVIg}VEV?^QsI)ej+ zUL!MZ*F^&SNy{Ns?D=54>;mrzmFZke6_zgfbiYqGc4FaZVN{Y1I)mGY%|VAqIJY=b zkuiUXF_#LWs~Pjh81s=)V}9Qi?okG-zPN#-N006vKC^IPDlJuvt!0?!r_UCX2cR3| z`Sa&1gBE8(Lc+XxXAIrwcst1DV=7{ZnpK!$bC`$jTDI<0v3v~)HIu0eBEGS{(TC{8 z_44@+W7zDh2qtyu;u-8nG*y#OYO{42G>AfRv&of_ot>Q;-x+<=*`An_lauZ=s;w0j z0|unWD#gXcwQ3?0*8#kn)!%rAS-a%->oIZ0wV~N<6Xag3%nHF+OJZX80Rsl~NVK&z zHhMayiI=I9Da6W)2&aqTl2&$V!-^ec0rleIRVT|%u2@jqY7HOz>AClyj45G7IGAV#nV7JfrOGS?bnlD0N-X*@*I1h?K3X2Sc#&pj|U){?MC`ObEPCN}p#S0Srf~>0(3$?fkuEhLY zQPg5Eg$lw?80KMx{8^*uRY~`l&s=!!QE7o$$&ZKNsD5L>R&bd$pcEM4+yH4#G1=s* zO@%OpE*Gxnj3YT?KP7@p>k~zzIZ(>&yx82@Tw7aqeEZt@AN|$a0_c}9c~$#5iwbZgfn*~kHp1izP63HPu!O}j z3?wM0#>=Gw?3Sq_qs*L76((oBN0~z=lHaiuii!2W6W1%~_gGnlOP3w)SbD-iHZq#> zM_Q2J`eGLt+(-_+#~TPWcVvu3M<->O6tO>(nAzB>azFP1$ROkK68mUDBRe4(2}^OG_egC0vHQeK_OGb zx9XT>)GLSuL)B4Hl#Wr?@hc3KXb@pmOQw0_+>Pe-mi>ztD?m2Y=H?#5A0DYpmWTP_ z;XRs_|I!?Xs%V8?b!a7(AuByDpRc~Uf|87i>Uy7Y68scKkaSpt$e}q4kruJZ!r`f+ z2ZhZ|7EBzG)S}MdR#pXX=UV#Xp?{HPFe3J2dtOs8bdtmE$X(=c7dcUP(WBss&yZsL zamlKkY`a(|@uIayj~<<4ZTNtiw z-UBeIDsB9}(Uip@o)^KFQ4Yd(H$I-FNr<@111k&YfG&d3yC=asMKe+Dr1Vcm)Mc04^t1YjM}& z929D#Xb7ej8DIVZHa_IUP^I6IbklOe$DsL@vk6$hWSz!BF^4LZ-8?=T|f*J*dHxT|i! zeKK&L!(H9yb65A?r7fahi+rPCj^RKQlLY{biHi%lePs9UBkqv-^XDJA-I3*C_R)DWb`(wgAS#mk$}T7>w!V$z5xi+WgT?PuS7z(7wH$GsC2IL(a#t6q)G?9mKQ%SX#JM}R|&$fXxw(PsS z#o_}WCcoV{;YONDTWf>(sM)Q3$%jEgI!0pM(_DOL2It7TbWQ0VoYl@*|AX$KnOoN! z!V59VZ1Z2E?bSz_+y^E=sXMcU!W6`kj)FAQP-}M-TC)iTTL;xbHv@ob|Np=9*QRcv zGV~~OaOovNUMX>#Z#rgppG&l5qsbFMqn=T8FmMrhHwt?tfnj{gxJaE#mc_b%t}Dd%4aN zU_x&nOz_PmZ_$3~(ru^C?p`u;=FFvsZ${nQuEX->8&BReCSaecmzvo*yZxq3CtdN> zYlwH9+@x*Rn}vil==RJ@&vc2nd3Yfd_~)w_qNE3w-BbZ92@VgiwZusLY|oa7P@hDn zDR}r>@7+(&t%-zLe6CGauQ5?iXVtGgcj2G^`18Y^TSRiS(HayQ5|pD&)u!5Cf2=if zXzRyb&(@|&h2>_ucOTxm;mGmAs(=O$aq9j(J9LN^0${X<1(lt@Sa^8HI^W2b7CY9h z-?;P8>6=(VZywveYSvd@efsJ2RohRL0mzk?jvv^$WA*9{n|IK>XUFCZtF?*xqJ(%k zAK(nQd+`nI1m^@3%<&#-9moQeHIW2p6XszPLTR>BUlVqLSzaQ{(eEXR3A}?&#fpVg z;i{s&LS94=vKq}{BJ>O5@kVr+U=u!J>|jz!PU5<`O@{;{@kd2kp^{AmLq)P=i)ao) zt$CNPN(`4ZIi=i$GeZ0xs`Cz{NeGZc_ly(|jO;-a#@)ajFJ5J);QfVeO81NwKuZfB zXz`5?mPot0XA=6!gN9U1&B<|na)ahak)M3>=_gaP=bgr0yQesedt2q|zwNJRE#qp^ z8f0thgX(=)bm91g!q*NLUMMUK)GC~&%lB(<=;l>Tv`>KVcknxOqoV5Hi7Oj!IDY&Q zca^(}@QK&Ry?T-VcggS%CEfTf`b3)8>+gBl9;^Nh;*^ZHEHVd1W3b&!ny)D$DAXDr z5*~ym=Aa5Fqe<%`ldg7GI|}ud-3i{}O64&AimLLe3f!+I%y8nVBE%)0si6=CL{%JM zc!XK^F5)HzO<}4QN?qHXh(a}HDh+vKuam*VXfRP^plC2Y+J_QG`%pr^mFVGVsr&X5 z$a24@rTe)1gr}vv+$Y?}oqic7PGlTCnx0PTnys?+z2s%y+uCV$o5whuS~Y?>L-3wH z&d;n_{4BKwf9R);mY*O%MJ4$`;#Q%u1LTyBV$`(a4bdFFuLI@0+sI(zVf_8Q_RCke z=f7~zty0WHbZOdiKJf6=T|TO{`FU-SWz#0rY3o|K=69#n*7>7*w@I(99<38=?ljx_ z@ax3~?sVI-7lnrxc{}{r-Q`#Ids}WL82w|K({rompPu`z>DHF+9)-_#<3ihj6AK}1lIctvlz4)1D%u%kTWU$S>8 z#pBK5<49+MD03>B5MiH1Y;X$IMf7&2rYKCTqgCDyxt^k3qVw8J0ae54?G7WXB)@Tb$j4GA$+bp-Q!KT@9_+`vja-NEn7JuZhI_oqOV@^R059 zER;)=?QG)TP(@y+JS^1+LQ)G1R^ z3tTr(k>N}5>69t1#2)?o_wSMD8jBg;86^=rRhl&fCnK@QyGpdMHh3hR3AqQSF-vk+) zKe)883Q^?bv|{X)W?6aB?H`wv5b777(Im4&Rt}`0ca}3p`%L@H zhUwhi;ECb?dPJL|EmN!Ai>8;zgZh3FBC`V$&^`bsckQF|l zYx@={k^Y*?QhV*>sr9oUAU_>*;$37wnH=S5g*0N~0X0SVwb+WQ3iofC@!9Mg&!0X2 zuzva7{=)~pfa(snE|@c8^7kt@&{lp@YKm|Y`A2-UBORbASL-ji z3>Jx#P)DH>U^TG%Nk+6X>oencwq$k%#Q+=cg6~#9NC*<{H1X5PH@R&@5_U1r>A(?B z;TMJ$1|UUa>I4o%1c-+#SzrmR?~bh!Ii5RE(uKO1ey698*UYV`4l)NGI^hQ$;l*qZQuv_F0(?)1s^vvB6YT)deL+Kie)X`05_=kJoKGcH2@F9DV!Z zrE1Nh>$a4Ka&vS0WCV;&uO?oowe8v-sj@QV>xtuIBCzipYD%tMy-`NquEAYZd=34{ zqbFO#)9-oY5kg(#9^l|7+C^#CPOP1WZEDK0NP~+wOUjs*#I$_y@5)LQf(I%%BkRFo z!-o$)e=+N^x4UYi<<;e#p^tQqtG-y6oRZP(-b6Ry0+s&tvo2jYbp%pauy_AeyVXA& zw_9l`@sX1c+GE-efOEb6T%UWQwW11pnc>hrXI|j-eRC*bKrNZ;(t5IC&F$-21V!!( zjgjeH9)JAtZcQWnmDSl`4Tgk9Mno74u9Cu&qmm`oWZgQe)ljsO6U^RxO*>iDtS`9p zU=L4mslnN_i5Jq9p;R$DpinGca35eC>SjhvQm|k!#g1Q8RHR6ZJA+daVtQ2M?aL_LVj*J)E=4TJ^4-Cev z1fF{GA*^1YN92J|@S8z_e zb({ur00Mg)?b<3ku?Y(^6iX+cCYl=)jA>^}ell-RE4Z&g$Vn46R2=9f&K7paa zxp?tMY?k+%3t0Pj?Qz zS+MFy%rvVCw1lR;o*~Nng%^emGUA)_H>`*PN(0?wE84w=Rp;@ebREDdpn1ui8 z(vznS{ydXHtlzD>tOaHMiMk?#dNv4;aUWm1;A~NCDaAOH_#})*0Se;>1Ov=!+JLT8 z$Jb1h2)|c7e>E?t+W4(Q0?Geko$=GLn+0p8OHk}z4I{UbOJG>PS$udePbLFYfL<2K z9}=Yx?`?ffEDNC;zZt6GA6Rr`F?g)*8Y==7>2L}LMk)GSr(!ar@dAHHCHyGo<3oT0 zMVCk`XL_0tdTd$(S8Vjc8;_whX!&F-f}(^Fc}7OTJ2;CM{?(ZXovn45=@O0XgD@Hk zaKk|4ViZbZE33HI#f$>lxILrAvcMu28eiJA>r!L+xYW2TbbsIL2bV5AXiiUeVb|^5TT4n$FDv`ym#dZ(oM|bR ztH@h-*HKXuVvZk=DGkI56Igm|_3G8fT#~{QJt<^;IjyqBBaWwdIb#{RLdhFoZtbMh<^DZW80Cj z?Fygo>oc|;ea1F!=T5sFT3Az6eC4d-dIbeX&s-_4s&RD{z2EcquyJ$uU(p)%LL=zk ztC8o*{<&j`l_8p1xBHiu`~MG>($a&2j~u~??5&n20bEg0|1Z_j(8uLUh(!Ny71LBk zDg!UD%a~aSY8Ch~qrcm(+W7XUb1&?1hf3&0ayiSO{Y5b~f=kPOqPLl!-5(|=i zNQkf(;mpw_1zV-92C|igK^UGyB&gM&bS($YK`@OAvXCVt>KT+k09K{8iB`)NnMM9- zMC6FZb|j0WI)ZEh9m1?!4pBA4vtV#iyn-2Lj+J9Y(&W&OF^?YnB5bSJ|rT~~fz!3+Ta z)#`53l~s#pO`GB^Vb=25XSZ)pO-)U&pPri0{sC#a(yLv=wDk0})Ujj7ezodyUDK6e z4>XUkTwVRmSnVtqVL`^dTfU66E-0%{`Ld@6K3`YAEGAlhQzJwiop+JgNR#1K71L~8 zx&b%i)!7(z{PVr#%WfAhrEuBX6D1Xk-DGHG>J=DxN19Eh1iL%H4|4?r4N+5+UQCuu zi^=3i*qW=_LgPHPtBhr4S0xhRc;H|J2%ErxNDih*lF8M?LlK#K@8WXslLc#~?#Ct? zuy7dxM;*JO97rH1n}rxlyr%rZqBK>5&Ke3Vkb|iVm~;}rYPDgY^o)*x5=)IS;7zO{ zQpUt`rx(wwbyT94X4VD(6%Y78#b6&Q(dK{cc`zjG2s%N(hEr7Rjk{k^gnTPQxIQ{ly@Sr zNv*D_u{fkt3*IrIEJm+7>!nECn-C1Jq3$;M3fV{kp0I-`*ySoB{g`RUdnCd^YCNsaQr=u3;>2ItksqRY4=7FBxW9-2iLuU-K z(I}zT=*gFpg12&Bdlgi*##2>G`*j4Td~ZY*Qj!%h4g4ce#OgBFdGYUN{!d-Tu^dkXSRQXCDdzIo5>+XrYg^sb>`FG-NtPTrwhGvN^i z+NDTvvB@t0sU#oRfQS&9Nk`3EJwQ713c;xn^R?9cAtIcx@O;`ez*zV}(8@)Tb5nJ- z#X@cu=~+t3i028Dc|xhpp`s76@A@EPeV#Dr;>E(k&6_{{^rMerVzdI?e6dNBi<2nU zGurmV6BQNr-=C9{!y|rSs;bgD=;nqcB@N%ywKqrq77l0lDFW(jEV)ka?)OGfutUd^ z4ggPm~%^ z{sZwCN`KE#pQi}-c?!Q1CvMzWytqvpZ4ZK7mo8&WfBti2rC7zBrYl#pS9Mc^qM`<) z{Wfn73%hjb=1trT;|z=!s0)Z#IL2rkBe%$Hp}+Cn?H)r*60tjTUl<)(F?#PwvIXyD zWScXxt+^*(+pTYPsf3KLzs{)sI{6>}pyF9ga6&>-a#CVga;IT*C9bDCjgM*zslY|6 zGNNZDPsW+}<1v>rVb80t?x}q>Y2G{xv-kSnIES-t^PDv+7tWifrEyS|W^)+(v<}O+ zz5Y6NY@dI!58|+r!G(746ohYKv@I#>;dxk^s8bgD9Wn_&7~K{6`Hm<1qXcr3+yDAf z%~!9HOXo1TZk;|bGQwo~>MI;7Kc3c(SUW#6Y}l|~NoCG^h78%db;!UWLxv6=@TUhm zcWB3wR&%ys?UE&{r!M(H%JfZ{zvYHs{T}@W;(yAAkRj`Os;{5z-6||UELWCi9`9Ya zcgb|-aPGF7&giH+GA443upY)tXrTR8WmWN+pJspJgbeu4S^4X#ALryxTC(Yyh`09$ zDPU|>D1*)4kJ({*l*h!vFo^&w%m+gbN-ZT;B^pG6SUe*m5bHaUXwNrShJN)f8vbD{|Mt|eOVR)kn#LF^a{Dc{6 zF6pMYoI$TLn)%wBx^Zjf$2vL!F$==w@uhiB&QLB8wy>aj!MCu5cMJ=Rz1*cB=?IU* zWA?l!>+YKIXgx>-s7V})%A)wFIzcqSi~PS zQhY#mc(gkw!z>19q4R`t8nLZXy@69xfB_O;Sy5S|iz93#tj<_tuIn|t7Kr!-?0*mJ z9|J_p_QC$qJ`fR+)9J zU~X2E=8!12ySn7c`3sVhcHsh*F{wx2l{yu?!ai7Vyu^NQUui+n_g;I+@r56taOP>* zI#BSNK|3uVu0f+m9=UO&?2iWRnaljk4PGTX-CK^lQY@ymm8u^3kC?oF{Cz$0h>fd$ z_zt_8)uQr;#^&-81$jxv|h zqOIi5w#`h5u$Emf>Z&>9752tsO(I+eev&i(bg(9($>VPVig`5umSRi9co!8>Z8X(n z_EfH0$1GkIQ}(pwhl`4XJ3fOc`^oO5Ww2)mH1I%(tRR9TN@|@C5GT>^Yn|WI6vBXH zD)0jYu@JkdaECAaf%77`if0dzxu2(*r=zDY&Z571WWAod%w6Pp!+jgyNdn(HVbOb> zJ!0ME?h@peShKbI;v8z}jPSf>{cz63>Y8(NqzKqwji1ilp6xE3*Swh^j}o%$t}1H$ zokc)dJhXrz1_FW1W}?tpt$_hv*Rx%!=*Y_-Uo;{=jfyP9B3Y5c5%;YD9OB830K6Fu zt^&~%f(p-~@);KqUkz7>?llqGDU?^xMQYyQViJ-HzTF|RSZuH%@PjiLws&W%U>IEm zW%*63gt98EBY?@F1|I^PtWK`t%H%gLCIY`)oU22e5%wwJrh|%*7lTga1NEC|G+vVg zq}tY!%)wYK!{8L@_}n=tz$vk;8aAWv7I9i$x5$@QP>P1p$cs zt`kt9`&U<1*J97W->+;Vl;V?bR4>H$E(Q)o?;C;L8DMuL*xeA`p5{aE8~9@PSUeD( zi--2^*mP+7rje4-}d?E!1$b97oBz*R0~XE4Y*mkdD)5`7Yj#6NQxZMx)Q|>)s*NU)B~NJ5O)|8 zHOMBXzaLSsjH>{&pR}`JcKOdkg0aZFyGh9v$dfT=R%Bg9U#2NfI-Kcd_?=txKK(GB z{&k+dD^LFvPye9L)BDDvg|+YTU=LinZ@hscf3K@i`^QG~MDCtl_nNG|ANA*cJtJy^ zGde!duXpPP)C)>#(4w8zK-ZHiuN>O8b!$e3c6H-yyx8CUa`NVVJ^MWiS$nAd+M{I- zn_pau`)*RZFyBs@-s@1pFTUui<;yE=#K0B-#hYdj!t}}16$OQ-*Q{CnOQF3suwLV4 zEKSm*s9cB>-y9H?@aUua_8qM5^lDe_eRb>uX3%=n}j84PPkVuK@R z$s53m=5CnnMXt6=dKff(gJn;v-(EJX&wyk_Ixo0uizniI&WJ^WUT? z4uEiQO?73#coYb*Mcsx7T>JnKIg&Vyg(^mFjTlYrmc)yYkXK1yT4fbLmKCMe6iv?w05?EOwn0D#;r1X@iBEO=ub7@Gp?fkk=f<<$b`p!%skYgAd z!bl+ni=b17uX+47GC-=2sBvX>^*Rg|{1pRAKH2mvOkzI5U_KXfhKTnc8m)dn9HCAm z67op0&lK7-OUTQj>^TTS^zKBGqH2umH8l!^aADp6LaRR$4`CG1%;XS&2XsTFHzN37%;CS7L$Ue4hJ-WBhYGymGl!Iiu|`KXf4G1D;W z>~{a~!;*FXW0cuF0hyWYy4-hP%lH7a&(6&gql0RTFP~>As`QUeXq1)nz>FC)NZB?- zH-2n*H;S>Tm;bxZ_G}RC+P7qemZ=AyII(N_ym?!22CnRFsze4}Pk~1yxlScWv0PahF7a6db=)W(tW=ONg=T^09&fLO`Bw7g%;` z@yFdTcc_=&CreJ11-5(ob+WgDE?+)I`Tp(O_ZR{a2Fp1Hk>?F0A-C;E5ZPlbJ=$_d=JPA6zjRMaopVGJwc$f)Vl^4kmHm4#Fb> z2oY0mE#y8gB=rE2dH_k1jVTe1X+Ds2U-n%sKh-vM>aq)}&e}gHgl`NFi)n!1F>~h3 zO%-8Hp21eON%sp1%DBH@KXwX&Msr2TtyERNuoT|1^a25)sgFK7pkI$354B7E8a=6V zi;zkZIZwU!-g|@Z2`O3q_1D_H(x|-b^xnPKua`3jX^8<2V?bh>Zcn4>)0>n_N>iom zm?W>TqDB_Vf4`@dr!mv~pr@T@i03KKEA~%juRd3P%$Bv&LC&?1uXB$nUT)~`fIavPWwgZO?$ zd_iRk7OeuWBQ#s)^50ACTiI9aH6%0Zcn5`Dk!SY1qWfNqN@GSvkBVkSVL_U2b$~P< zjEV@tQ#)ZMty&lSxM2E%-IYN>+PC^>>gUx-d-)NksU$eGLrP@r&0DUM#n&#JKCSgf z(-MQG?d6w|;D$cln+$#hrVPHtUVbAXwNbNrAs5C_jY#G|SPzXG#A(K(5#3~UVjF-v z>Js6|Z~Re%k3|wVNCG0*0xH47!Piw>1q6;uf-_L`8*I9Z9t{278w-h!oNH zV@ny@yKz)V>E`dGR@yJvADpI*%f24n&GWAJRe#jiOE(@Usv%HM*SWV_hc+&o`jOZ? zKbpFHucP zwp_2kYjniN$t(&mGo4DYVujgZlQ|CR!h)#-3!+FQLW1N_%|&=F%t;Rw@HR55O3zYM zjhhpmB)7udi4{n#%NBLJ#3Hc;6^egaaB*e!!;UOK&kq(o01XaF$wla>iy*q+yjTgq zLNKr(eF$Q*?|QMKedH0pFW!Iu^s0$BZk*Q0Ptfhxv7ToH1O#7qYJGFGS=uaH+h+Aw ztgvW3iNdQaD?3Pq|9t;_^X4r(SW;7Sm`aTw_@jz3Y}|&+CxzH492vw5<`W5>7k`R{IK^JmArn`KfrHe4G6HI zgOEqTt>IPXp2=J0)<84Z1%5-te+(Mw3WBV#7g#-$qVw;?I5MF%3wLZ`l;O;p#b=a# zeXSI?(DQZeJ$aiYZ$a`_EpG-rU(1u6dZbpWUeH~b^Z4e)#tpg4^Fw=GzI=nUxv;QB zi}u%~_ab63xPtFMuU1iU9u2b)BaFZ!3s2(r@>A_hC+2G zYKSys9$7F;Q=n2G3k8NPT1c2hg=7PsEIj0#!rL;4ITM#K8QdNwnzHvM&3o69t1aGA z@df+lX-D|nwLqt6876CR#j0;tRs3YN7ZtU7Q^NY2Mw?D*Iq>&-6ke=H zR>9e`D0fj9XsW%O+eG=^5)*tK%{^yzEQ?A*C)_wHRgzX>fwj6Pa; z!)7ZydEs=?r6R%tKyi~Tn8Fuy9WuBhBZ;7d4A6r)k|NY`AC4WvGWNqyCX63He!_s?f8bhMwEDn6VD*TL!=*h`HQ7ZJ+mQ*s5()Gm_qR-F_nyz z7D$#Tb{JtRh?sf)tQg510m;k(Vs0gJkxZT{FMW`l=T^*HJdoRxx%16V|6PZdV?Qtd zaqir?KdfB4cEhF}$1j%?;Fe&~=Ic?%HP`KHmoHGy?8r%qaWrfgQd?eh))}*)UQ`)Oj7=&7~)AJs)RS{CLt3-Rf$T|tdLT2lQ1(2aaALzk`A1Vf!NE`Kp9N| zqT9(BGCH+>3Y-yHpq#-#hfq<*P7L!NsU3!!B|vr&^;s?o&dcw0QlZqJkj_XH7f_v% zn)*OcTOU}DKl9aB-z{6eX4SGq3uaH6bo%t64J+1d-L`GVfin=Rm-RTBUW6njCN^k^ zxZUZVjL5Qc=guA5MR?{`XF_$`wp99T)~H@wQlr+bX~b4*A-+B$#8RzA>v0rYkorZn z)tI~d144o*RNlB*%QkJ=q&O4iOr1J=$uFDs965KTxCVCUCi1ah=Z0T?nghL=oB)BK z2@!5D1Z$zxVnvfNwOJs4&L|l`H5y)BMUe(P*>z2+6u}1eDD1`HW2h6IygHDPWbnO5 zs(LjL92t0C44aA49q2z;n}B5A_{B_st56x4GrqBanc~-sVr(VXQDPOMfW_Zc6v@6z z{rs%$SIxTjZPz*a59Dzzo&S8ltd=9*-F~rceeLf$6q*b3;q*H^ck+&!!`q9sd89Yu zLADWVE-Bl0kE6^EbWjuoeH=vwKqi9J2v{Ab?kS6V%Hp1aQ@p(beJO@d-AgU5bLWg` zJNlPBI-_%HYJ7AgD7w&Y`aXDY-5A`4or$~vJjJ4IQAnlRlm{c;SI zNSJOVz=#kdb`UR}k~4!Nb@L`!>5}&zz`RLTdVml23-FmY)4@Hh-gM>}5)<=HkMupa zoz-jC^0PJF@a)UJqgV$_0CuvIfBHm+y$ zxt>qu8KHUx&Ge^77Q39@x-**T^!XPCI=y9QG}9Z8-T#7fw6VNOgVEt3)r-1w^WFNhdAe zcyM1j8+op6yZZ+`_uO+&bgZA89PaN&I%w5dXJm2lFKf0PIe){2qP%0r-XrHPoj=Xy zgsJb3cEUl%jGsJx`ma~55apOSXJlF$*`cNydh!()$HvA)hX=>T$BSD=&`?O5!S9u~ zp6>hN+wTtPGx+^TR|WnS45j7r=~c{dzUk7vS~w2#A#1V@^ayZ(#xP?ObybCWAS095 zuF##xDi9xZ7oAXm1Q4TXornxh{E7l_^yU*0T5g1Q?-&yVuOLYJq5U@qGS2Y}B}mFR zvS3fP=OO1fTg}Az+VG0XT<18$Tkqv)3$$+yk3OBPFD96A`5(V^-Oa(KY z6!Jtukvo!T!(iYf&mo2(tmC01)Bt?zd z6rvpP=j29!XYsbU>HYu#r#ghVYU^OU0atv0F-QSArLTJvpKDEcvUd7y&_QTq&g$v}^SSI+I*EPlcQxzxnJ#b$i-xd%8TtZO1tVkw7s2vQ@drqjGhqNPdsH*v|aWO=Mv`f1TPEtn~ zxwv3}HITuS+FRn<){KEj8#0~}31U?9n4WArp7xloh39J#4q|w;H=X9$hJf#eBdTEPfi~NPLlxV|Y!1f>?*dFXdzuN=^tX+HP(4k|6B~>-n&^S18a8bGm(Xy?U$vM?X=`6v|!jSzAX*90>J=M>rr0P%-kKgD7p z+Q3gjJ)m!>IQ07yiCF|o5!Nk1X!O{cr4HR6+(31HASwjNi3L^VGWdez8n#n<}-_4KkJVM8z?vGt0?FG;uFO_+4@ z{e`_L`4y4SikBLHl5rF!N->h>Q?r9}0(H{2gg_0PSW<#OoINHlY)M?W^zn>_Z$*MX zkv{kn=>uBSpNJ$>orN!%Vj6gsj83VN7m>NqMu3b29^Bx?&&(CD#tl+ZLI zx+2twPpvdxEA`e65*|w%D=mb3l^Ay4NMIk^0!q3fpGIrt;h>Fv>-JbDX|sZ~mo)3K z6sxJKyx97t7Qc*wJeo0^t^vjQ9;t5d)~Gy7fXC0{7huITOavXA48w`$a*_OnG+ygd zMwAJV$b&qKA7zLuG_Oo|r?RqC1p8yxi;%k%57Afd&U|R_xacc+5IuA2&!77FdLCpi zhj`t-h9bI(bj>#hk-8h02kFx+Ua)a6KvEfgl;$K96mDqXYehv}<)(%yMlCbN%m4mp zCCj*bb;)UC@q(uoe(2DO72CF5yEb|9%-gry+`c`N*l7w-S-;d?dP#erm2RBe{@Ia% zVzc!^xU58U%*xg#7+!rfTl>jq+HA_ve)1IO*SBL`ft?zU7l*vZUhZnc{V8rgd_{~RALC& zgIQU$U--X3g`aNm!%&3s479ktQ4#}yj}e@$dx|%U>Iok@Ilu>&n=S9$JSm1k{LziO zE!lkZ^r=&)PVDTwyfBM!;0NQ6F6kDw=Hrh)o_8W)$&&l-BQUmMYHBLA>_R+JPNuq| z${13wLF$SXD+=5p@ogWc9@Dcul0u9ZwyhYQt$pN|o)AQxWtTawQEx(IKGVL_7HUh? zYmWA%mactd8_)!`xqgRX+1mStM*X{!>rNdAULP4oJeZ?>uYGR}2tbzjUMJGNVT6;VmQ+;*QOu8?9w4|^)q|>wSjFvLtVrt<{?0PH$A`nZE$u@cV z$_n$kZzp&248?!`nCG9y>EGn#Krg%5#!UY9*P5eW&!9HgBsqr=OrXO{FV%|BGNUoh zE{0>xAhC1)Mt?u3q+RHpzbODJRY#CyZp6yN{@8OIb*5?rEjgu}Ms7*bMfRZimL7#j zCt-5 z!y+@Mb{5^9)5vYecl-=i&grUxCeqA_Vu@D!XfF=m2LwF{1Z4t2ZBjHX-3Nj?`an>< z=cq+^*%XnO-l|jAu3cBIT)E}EH6c9Xq3534z5A)BAaA;VXmX|ma<*;~AIcZ&ty5Aj z|DrK;v=-B&4j`7%f@@-s>+-=J+qZA0!S<8w;-~;NTl>h^J0>Pao32gAx}m+s$@=wb zC3dOi9Ude~r{9pj_MitI85!#3Fg)9DG~vZ{OioQa!^|{Dj0BFd;Au0K7F>6gT-^WD zjA`#rh9Y+#PXTGQM6JuB)E!GH&uuy6biPB=%?0ICWF@H>jh$~PJ5i<$NV0S~c zG)-g5YBX1#Rptwd?I5d-g^*hvz6#62^a%?DAB6KE4C(&ZzPw;yw(v!{EQKFgyqOhm zFawB1bZ0e_A**Rad}iQFyK?bvZMEM6+Ghud8xmyhmc zNVjj@cRMB~qJDP2n3#(g*>~(9=_3LD)3^@-PJJ5FwB_cp-K*!-hH8a{gooNpjxZBG zRO^L8EwpytFT0Q3)Fw^R4U;D2ck?`>UT>SfyBM7Hw;nhY*3`Y`B>t;ga&n6X{^WQR zm(|*XBa<_lu!NOgudO}&RSxBHo}tlvLISyF$y%hI**&Rx!(<$ElQ&c+b?-gs%@M<2 zd!=7a`|e4ReqvTK`b8#nZ;ZIaTbYM$c2YMgMO6_^VI5;TwI~^OfgGgW>0F&y!!qp}dK*D{_D! z0zM+FVq$3V=ut=qQmBdWSj@hn76X3%{<;96zYf1a{}tU&%!}v=N_7A$$6}9U@{weiS zC2kRcK;RCg(4?oPc;Q_++}R|TQGg}aP_|Gb{#SLF2w%w7-czVwIh_&nh#}N0l_{$v z_fK+QIFxF3V$f4Hs{BYgQ#!^tVDf!nvKKJ4+ekR&l#bib=Yv zJ+^?bsA$4br!L-cS_yYrSR5mR*N0mALF-mhi@H+jZ&rpy|N} z(QC|9AqloR%$A5I55I`d-8k!5xg(bTUXhVyTjx)iGG)@|<3H=$tJj}$b94LmY^?hq z**xb<7}lo~u2nhAH6`bc*qmL+{;P6r69ESEt&@Qc? z^VS!eoqkh@N!+Z7z zMn^I4wB-&83rp=f5TEAbjXfov%7O(FZ@aTf_kZxoL3mDw3>tX5#sM3ux@B=vfuDH? zY9wz#SODu@(+hxPGOYP_G-6~kn+$|K>`EC7%Wmd>)thiZ7ju1tHh*0a#)ZVyu2|V`bHrI&nV2r z5{|(F9}%RGg>VY8zGS2H<#6)EBhyj^*Mxtth|w7s5r`9~4Co|$*O*6UU8C)9*%01dhn5nX+$Uw=}^hRm?=C6eYN_Y13(srEx#v1$x^LAHH&GH}?NSm#(nt z-x}{o+n_6lej*D301K~lCIXTL1xE^L-QuY!yKrQ~Pm)?Sd+iY|kx*vcYz_<$vN*z5 zuU@^UETTd0+}zymq1Vozrb2}MaNxiJ{rYz5RL^sGPKnHQiqN1@#m#QtBS0 z(`4Mb=*w)+3w}SY+<&?J*2%R$P6A#Hi)LnfM);5ZcG=eD`iy1Q%FYwZJUKm$Ib&LZ z9rY<6QmKyf$yPbP(U^vJ1JD&}38e;hxt`rmz+DwJ0Fo?rN1|8@plDv`Md;Bm^Wab7 zB*27&dg+2@BF%}V5ESH&5!WEYKr9K~aA{7!xqu3RP>vPgC1_tAhGZtvBoHfrDu71) z5uiO-oNtesIeYBFaZtrfv?Z zL76eHGaA=j&DV-Xg*^J`^5qp1+P&l%5o4dSUyIkZ^}1nwM7|a{%Cdg__U)_3WPAQ) zU%%bFXWjN7=`~LrFVw*34~xV{s|yRH6{Xw#L7)WcAV7lS+$n9VG1=%0HX_m}ok8|E zt!gqwPmv=q1R1>=?3X;tIG&|H&*I=&bf0H=%}2Tk!pC{*%o&fV`g|)v zpY+S#gD1q)a{BazYh^C+pOpuuB-b;QlYIRbd4-Lhd+3^}#pB2~FZ5|-^_*MCWBo@fKx$|!sY8lg$)|E=`&Q~k@~c0*dVIv+=0D&PnJbGqe@E7Z(lio!kDoW zzhAleIG)+_hc_;r+=F^RQYckkBjP`ryK3iUmoSFXqdRsSD=J|C$}VhQHFvx&J+{@$ z?)-e-@-62|-AX%MGpe4zC=Ny&sh4JpRH{QTR7MjCuEUT%GFh+<^pq%d#3wIzfj$ei zl1}2UGy6_I?BT*rz(YVl3QLQ`0f>MLf|39VGKdur5*>!fAjO zHH+Py_0#zQqJ*P?A0Q#}rl=ondetWz%t78Yk`ooPLdwE*qF9qu!r;gtSrQ=-qewr??BgLqMAR%eA0F169}YMKy2U zJk5IZ$g1zBPoKVM|Mly)T^>h6cXg@A@WoQbmBM+bDm*9hPI!28RYtQ}xbf;Sv^Zy; zDI=r%bKUXMe4<`@vteDE$6en|&CT4W9_raX*^Z%ry2crdJY~&j{L#K=pQoRF>7_k; zilSRQ{BAet&cN$K%fAM9&(N}@h6o(0Bsiscx5ufk)g^kY%I+8P>0Kx%R$F=d_W3ol zX3bi<_slg@B<@t|HF5y~Kr{ko1A4FYY_SiS%)dHJI+CFd~Zr0Ra#oUU592NbZa4$Yta%y;lKlPznrmK~s?G_NwpThq$mEm*MJ!HZjjD4V;TB8@g*R5VCma)cKUeR*p^jxKYcXQ#I3d`N)BV<0t5b+*~J~l1QWR zmLUPHGqY{`wwJ1dF>jeqt?z*(Ez4 z<@lDBbEkgt{`+G-{bu^?8B#v@iy8A)?KoS)XqB8h5d6Uh!P>|A!Zg(BfIx^SrI`>$ z%zQ;GmjkLBL5ZUcaIOnYwQC<$zOaCA3t~5;lq2jZm+9%P*>sL>gE;8d@3A-RNgGQ>G71t zbRCeJo7*F?%$cm}8r(l{;NZb`>KaV(Rx(Iw-{bz@Dj9?jZ;8ZZIJxL+1mD?PZ#sje zV#%#y{!ed`Vg+5jL8<}y`T64}%~`Vf)U{&8EvJQr3QEdAg3`#DyoY)ua1BOC0Rzdo zGhslG8KKDtqNEy@VCrY7L--J;8HBM{Nuw}1w13fLynk5T6&;jPYr=Frh7TE4qn^)2 zNAd5p*Z!fhz;H(OpNy(hk$90&ea2^0U-Xf%+5wI=rL>Q{RaQfjb9+!^LJCVlM3CKn zb=~)qCr_pt=_}84t7os*?U|QZXUohbJ8#k003nuu{m=&cFA<32XlOFmT-x6tw5HMp zDn8OG+`4n8HMDU~-(0F`tv+z2xLLE}D+gB3o#ISNYuGyHL5W9xD5rJ9w8UUzCHCEt zN@H+hTBqm!*;N}Wui#ayR;}N6H83sU%HDOXck^!69OgHlYO7`IgwR?;66zl~aiy$= zYNlmZP8`5A4em^su<%SYCdbUgTbpN1c;%J8_u7taIeK)#rjsVDmgfiyB zFicjBTE1_4-mvSlH@J>&*m&|byumnXBIOqU?z!!Gd3;(bMi%cx@yVa?3jXC?FhRIX zDi%D^BuP5}EhIn7 z0rWKn`si%Wr=~Ub;R_9Ya9X?64FjFLUJuUybe)G*Y zUrwS>6m=blV~O}ayGxgr_hfZyac`?ctLgYp-+!;Avt!@fmsy^Fo_Kt6PSTn>BdP%C zD<=!~ZQHbA%l<=WZV@E8TmL))XADz>NkmGnGdplg8^_Bt%OY7}qT@NKM&^|@g*%Fd z$Y|8CqauvnK^2y1a7LJf@F{Z2AdBcLA!$ejUhksa;FM9Xi#U|ZE>AHk9T}BAj7l#b zoP6A8R2o%|ifw!LMtRlk>(`dA*dMQcC(V>-EiJq-( zbWrCy`TUyM^G#QN#=`LJOc+f-Kvs`9?Y94Yxw*N62a)R5DD3qED-s&iZ<>|UtyPQ6 zcK6-awq2{VaO2r!-!Cb=E=6Mw9^StGL64Pi8jKRv@sA0xGsG<-zeDL7Gg9cVq zFigoU6RvDpvkF81$`$dc4V{5&4F2m^T|Zy2bIYdpNA{K?q@LGNIbP&7%<}@J4PN)W z6Ef!G@vC?5KYHQ%4f+z7-BcuVZX+5cXc9>T@1O*>cV@6sNmXd+D~04N<8C04S+kOz z3WQOalWD=VA~AQ&6f+>)$7CGkt%xXy2!L`S}Jp%i}&{=4UhW4>R-QnECg7X8u#3neP(WC_T#JzOa7r;>ADjF7jNv<}pV$Y~8wb zvlNnN%>J^WdMBd#FP`?XVO19{6kfVj)3f6P7#jya)4xZzcJ_PH)6?rk6CS3=l|MCb zDD(eFqX4bs3iUPW*RP+N5FQZdXLdC9pbYlt(W6s6!`Y1sCV%_wjHP?FpRvVW*tzY* z#mhHJD@cX(7Z-=c>a;$c-K1Gg*H?RJGpI}=uX);-=*OD2YuB`CqXwKbEjcdg-Yz|| z+O^Aivb*M_P`kXwnBREmi9v65MZecIN6Z_&o82tAdgjcTB5S>9JE7=EI`(AkUwT~e z*pEL!jhV4_`&mmef*UFMhc~a?cJOkABi&t9T1pLojW;8k_j~=#w}%gXpmW=_KtqGH zCiR11toD$^_#oZns-WRtm%O~u6KBp_cLELg%)XW1fA-n;s}5a8n7nlGm-#b4A0-=B zpTSOWVbj7HU%c;dILA%=YTD!pI88qJ`nyHzPTEB&EG&$+Q2SJb@M7Xi+$%zeF=i1=4ZLEO0e<-k z8G|Q?0LGDka-KiCDO`Ze!^znP+Q;1>nGub_`A`HLV)tq(n5fu-e5jlA5=+jZG#g4B$hY zo^?Yi&n#upWMq_{ES1N4gHcV9Z`y!SZG14ww^L0*RaI2fym>8JWUpSmdh5w6#W!&4 zS<};K(T+-7#7lgRhW>#z&i3}; zXIdkc;iCS6GtHho>fafWNO;`3NPEI%E!m#IX8&_VA4yiVA8G?Y{$2=W%JgZdruY>7vH+EZ^@EH+i&~DG|xue>wRCNAnnX@DusQ4@SbOC z-!$6pu&Uzo{zj*=Lth^D(yOn(`E zl$NGJHbJ(a^r*l%n!m4&ko%|nnpFfo!8>94ekrxF~aSO^wtF_9F zOJ|8q;Vt_|OOIEU-@dhFJPsV|_}NQ0U%7b;lfoBdm4TmLld}j2>OhmEa~OIbCwN;(65Af<)p#`y~u1`TRs z^ITpxgOtDt3lA4w-#vHkyrr9V2hph^BcoADSX!#oV2%v4!*ofF3-}Ly>@4n*Nvf#({TM7!V-?~6T$h%tlj ztKL?4tLRqA*lafs%8ao`H&Rwzf423r< zDlTqWJo9tHQ$C+IbMCAuWC>0Fe#!Q0GVT=@wjlD12`g?h+xCKikU#BN~gB4zzK#WphrQU5Fwy1Tvb01 z%MXSEF|2YRcG8+Ws>RFfOE#8*a3NV@s@1t6y`J2aQc2`D(QPD;hkFqgCWM8ewt$aG z*JFhAqZBB3fT5X1;AUTw9*CgKy(>Ud{KXrsBwYaB1XjeWJP=rU$cK^-81h?$tQHIJ zuC6Y-e(C()MZX@bGyY$v<3@Q`yrjIs#>^|YZfgGcFqX%go30nk$EP~na`x=?>)IjR zT;U&JH|YVUv>sGR>e?#FzsBWAsHso|%A}RY4^p5kzWw7s*5mEtwcOnNG#U;cJW*6t zboTP?GdIL`<8L=qT|0hoA2BNZ+J#mfpG)GZy0&L{(CGOmtHV0q&w$PrxTp# zaFH6ARMzqmJx1{p3#TRK#7cU;fECVZvn{}iGywc?VXjFSj68;teFfAo3rS~XvEs<7 zDNZ6VCge>FuX;29D8_jhj5k|Wn2f8|1r$+-Uy&W$vI0nu8X_drjmnb((42=`RR0Qa zOv(6Y32bEoTglL&X24cM zAJ}T{Lx*C{kZqbaZQ8WO1-EYBcAqKKj_VK1tbuyoe`tm2cBY24?I*68!(wB# z1G*k~c()q|?4Zyh;wwuD=#zIo=bGvxrDtY^AJ)tp}T)rTK`IOE6k z`splbiGj7{myaJf0N2t3Z-v}9klp&Xj{=#n9760W%c|(b=PJ8JsaIirK#BklR(Yde z@y;ca$Bdrv)yKr%zGoc$6*biV@llEgGKIK~9L2y8b?YAh86{7ca-2x&Bw=zPpj7FG zA`hw17a&#GA%IWGS7aqZG486?Idd>L`)(e~6Fv~zG9@J?rsBZX zA3h&Ba^$FqzZQCunxiLnd!Xa3!c9Nm%wM_h@&%X{D&vs@8zxVltSv@<&PWS&fai$T z`N?Hh3U6p(L5BXh4}@Ji`t$dYz@=xkm`+dT=H_;*hwm1fTuAGjfA-Yo@cK%fs=h&6xO!qbIczpQ5FnyassQ zi27vKucvOquS!lI*n9jM*-bZ2{yJ-156?@;hw>WYdEM&#a@ z$=nMeR|GdC3B8ahBrT=ac`NQp6+{+Nx6w4-C#xn|Sf@-p(*tZUzbtHk05Q4jAf*8% zl%-1eTLu1kg;dOUtVmq4fQT%L1j;+fIeCy%@d;sv%TEM`1?c3oauqo(8{{xfl~181 zQKr1&S3cnb9IB$-NuA@)kgn*QV?n9o7R7za;!G624n+XJIiHGVllnZ^g#e`=H3Fu|@{Eul#b zQzPxvU#+gF&SU&|iKN zc1pA;vnOh-$UJmfG`QT=QXdZxk`NT^SKzsu=F4Jsm80cd$buXjA%t0xW-&YRCs0Sg zDK18XgIFl=lrV2EFB8vjK65Bh-S5E5M)=HOuFo8HdGT`LC5ok9yjboR8WF~GZrHG4 z&jl^K@q^F3@y76%Q>Ra!IBC-KMcXb``Zef4#wuW1QC{T%qb9GFqP*$_o!}*?jJH zrL)VThRw4&cI?=`d9>y(xp?yANgA{C$%@pjZdvr*cQY3rfBa8_2My}i>)vSd&E3o3 z9*Fu$VO9b?_H09E+*v?d5M8JH9X$ssT%6f2wngV*!;)J)@+=WcLwluC-6zRtN$B*a z=lTBZBdwB$4eQ(@mTIpQoh8ef169dIpo7W6N~>I~Mn$C&SbBOoQ%Ehz)46jeq8f63)9>0D0)Fc$qHs&ib7>RI@0UCtC!Q8wLqPQ8zTpgp8~V8B#h;Y~6VUV~{F=^GyJg%|KwZWB``b>tIJ}Q{-^~Rum#Eyw(?F0|9YvUE=3- z(e~t&8r}}|Sn9HjmDpnecIo;li~7yXJ=f7R>VOI@6WK)61qXX+c~CVfI&hfPV5cO9 z)o7B;fehe#n@SJ z?sA!3(y9?f=Iy^6(4LwT4|i>1x_o@~Y?hguYY93k(%ZS78A3$dW9=F>ZxBm^NWa?a z7m6?5;xQ_&T_tRpeZ5{^y;ThVj-n+xXXiNNc4x zz3^ZZ}_@|PF8Ctuh)b);l-@$wrr zXZzYC!LamB#EwEkM3dv)j0}U=CjvKL8TYQRzd@d7t&=w$*}3vZq8k1Yu)3!7;_Cbv zKW^T;_M2{)Qaj}IT zWg}ZbKWCI#iW19$DN-%96g4(F>Tyd(R}EF3L@*#b0)~Uy38yDMM;@)t`Y0JTBBgcK z%-UnX?h`&z+Mj%AantSFpLpW_hD}?x&*|L0NxN1Vu|YRC%{$!c`tC~)yz*${K&|BB z+3Tl|9XWUT3bkdmt9r)O^a3K+2~Vqi<+TwbM!eR+^}sWSnmqG>tAqOb3Vo^F?iKUKVZrHD)>y$R%hk=`-`;Ixtq@GRe6_53|1f84TP&Tm-p>(yH|w!pBs_@wx-Kx63@ zWU{~MKQvVhNW`WtYNv9U0FO{-i{1oJG%~zYswY@J>F3Y`Jk? zVj4D$ttY`QYJxFc3e7_c0-8jYf_$+cEIG&~By&nk>EbSOQ0GZ@#_EB%#2^3a8})K9 zxPxax+`M>J2k4wfWPji{g3}{ZRTBcEqy&K8Rm+K`sZ?GJ%|^gc=_Q9L%;Wn1D0>gU zsLJgB`%W)OX3_|d5C|>wVgTuq5V|5Npn!;gU9qrhT~{}ECPfiYx~ODDKtU8xX#$G$ zj`SLO4J9Fj^vT@+=iCW0xa;rT_f9f>Zh4;boPNFs*d_quIb@X`ItO~02fYl2*QF!7 z-wNV&?*`F}samz1oMa_4)=C8eN{O$m!sHC4g@|?a>eX9v%A5@zeC2+9vL`Uj%Bvf0q0SEM$Gw3`F30Cj63#WdX~h zaHHN@b;YIiqzo;y%JXx}T{;9p^p7iU5<5zuMyJlw>63w=?0-}>RK zAAbIM-8zYYJZ8j1P1f3}-_T4YFv%i0nP(Z5wu9DKxnx2H;Y1k8WPSZQG!M%?pq2S@t>ojz9c#$@X(sN}3I(A(d@U z`}TYC^K&kFY`&sPIf=DG&7PQ;`qitqA12X7aQjq^j*rfSuju$YH zl?BJw%%9Yg6p0~x@+1!1zq_W)|M_4p)OhRq>0Qg`>tL#*(vr17>XJ|pnk^>bBDiM_ zUaIU##D=X%1V*pvVT5sQAyh45z}o1sDeIil1J*d?kq*T`Gfcl&AhP@dn>W6eP*2qc zHArMxlAHr88YEUcTar(VN6g~_Q<)?f`K9Pty>5pP-FSOZM+qe{8M6EyNotWK0$pbL9Z{+Z`SeEydN55#e^b%N4FWNZfAx zEYYe8i_bv+(cN7pg*;E8B*;w50Fp%rPUit+VGCU_?}!Oz^|q=H<)Opr9%>c)(B;!g z04ORg6;FL>Suy>^Xt4$Hh~fq}@gNk9XoIvRfJey-C`N99Cn7tAz|;tcj@%43qFUG$ z1TWG;0dS#uwM0R-nlU?}91G4DU51Ev`ypsYx=(aRhO`Z$onRkWy~iFKH!d?XBI4lL zQwMkL+O_xSsk4tizGu(bko%~+x-aDHK~lj?KgGuWZCX;&2fbkb_rvPtcE9$#>4THXYSk1oZ(fYI zJBbC{Ebly;+BVLS?iAkhKx&7^xMaMyk#}|WFKbIw7=tNU8)&?7t>_`5m{I<6|1tko z|6czEmShxS<3Zl@`S-xhqx_qvR_%cw=~E5WfeGQ~CTRqzl$REl39G;dQHqkSvS;dJMbTp1Nw$>VFnO~4 z^@E#Ck$#*rMAF3@tB8Ka92?3_;222tGwCO!oD(h7=S=F*WzL#2XI+@HHbHY1jGSHP zB>cT^-$?ZPm@F+*tydSq+zPxkY>giHX{GNHq-o2!PkRbYodF4t%6B4$CuiiTT z3r79&U$^f~?$|Q1F8w9SZ|SlgY$JG`t~lvHS*d{bw_#6jnU?-C1-|~4;pg?;wP8w_ zR(}E`q>m1BA%m+ExiL~KZ}dh0O&#EU+W^vXLE8Ev6W1|INn|-Q!Y^b(^@cx;G%TAeOm98MD~Aq|B; z%}{hrFc=0HW)auyk!kf?jUf&rkRO#a-vfLENdzKB8hH_tPlav)t1$8)`e7QitOjRb zeJ68fJvlSMEa(ia1pBz#2FZp5zklk~+OIu z$K5NKCjus#?Xfpyn ziOPr4hyGuo2W_Da)}%0CS-!fyt}l5Gq_cB5uF;Kq5d9uaQ6QrxoS`TjYk~FMepQ^{F z(9a_`t@&-;wtXkB6qT9HWkr_`?~v4v9_oTdqP>}c{*H)}X9k0dmM&5)Cn<%}frk~1 zD5VgK!56>)m@T{)0h=kGuYg2i;xI+f zs_11SJq!7VS!5C}5(l$~NtI*z^p=b=m-uFNnvnSwaZVssnWSfyfG+u7QlTp z5CBS4syzk$PH|9BR;k>PsePH}rp$9|<~b>7o`d7-hDLz-3^iSvwf=gt_K=~pmoyCc zJG~lVhXX9%{{C@%Vpa;h(B4l|CaOw%)wF9@`{t^$EZx+;{jOcAq4~0OL&%|IWwGhe zdz+;ulbm;Ba*A?NIZ1!h9)@m)SmnBMTG?fIepGkml;IOYqqJm0HC6diHFfFo_oyfi+@LM#cnMtlPAw3?F9oBn>YL73xJ4C*?5z(7WEFR#p^ovqmniDU%E z96L+*o2SC(UV_g(6(kcM4O&~>3eTS}P8@}U`q?B$?xGJrjE;_q40Bj~#hA8be&6{* zpH`010ob%7EFvm8dfd2$7aXmg{@1_$^>V-J#pl7kR(TfCxw&dv0JNL_;vF zy25Kje7q;ojY8U)Zr#{kUjzab8}E013Lrc8e?gg&+Q~#~<%d`l`+S zevqUSOg9fLfNd{4T2N425pe0sx{whKY{KR+PQv0J#-~2Cxyz7ygd#I9%||eNbsvQU z*I>B_L7W+^iJ$f@P1asEZ@ExvfJ&b>dG`I3Ee-cZnbw;taG?JanpmnmJ)^!`2mc5T~+)cr?``Q498oo&<0gIBgEfrlo|INha0^cg3-%cZ9{)A`+J#=we36 zMqv<(ohvaZRpp41HX!cD!0u6-txcA4wFheM1Kb8{gUwfO-MXsK?MT4XD4-@kju3``sg-&a zdzMwwG8h9DAoOy8v%E@KR!BKDnGQ!8Zcmo3lHygCR$(2rICM5XJ<#Xqzq|BMK z`=w{Wfo)hVrl_be_axvC2RJj)5HhRGLECL}5Ro%b8)(?ID6QTsV33FxQ@{&I+eg5Qr=$RCfbF&|a&ayUj?X;U~{z9y4sW?KW??2nrb(QShX; zP+H~+nwqr#%4BXcY@!Nc#ruh`Ll*iv(NzbC1m6M#z!O#IPb8Q0LnUexP~1&b5!4e@jFI(xItb7?^Ub1xA4~u?SzW&!O+n24{QCK4}S?gxGv@i7lnN;Lu zm|Vo)JYhyl_80J#@Ah0)rqu~ckKOZ4mq8D9PKL(+Ze%DfZ`PzS^;{$bVD|Ip++*^-J$P#h-Am`Zll)EN_a5o#*Ty+$dLLN!aMZPS`b}`E{uMTT{@Sw@ERKq^Yv*sg>M`Fsv1b1C zUU*ywV(ZDRpElB}PXGM#xpSHQ`_vz3ge-hg#2oin89IBEJK^_m$=W8+G2IdFurSsg z(}n?!7e54S1o8Hp-BQ*sdYyciIb>>85T5X?%N%2}!~l&htX79jk(rk-@=#5@q^NkX zbCCfgmHBYLm0}(W^A?^frM7T%7`mQnt9hd3IP%ZitVof-JW)f1CG#8oLJS#A#<4ck|<15PUVw3Qwk`BrGO!6}Lp$OG;Qah~ zVDbTs5vdUAESx9-oNlh8Z4h5?6|_>~np01;uB>*==;#`8aj_9jckMcf&71RXbLA)O z;ph7&h!MK8($evz7oN{j@>2tV$4Yw4Yoj{HyGxHAEmCaFM)e5K&)@XaQ=61{ zej3^^b-;iD{kpenwRZEqW2a7?x?v5?qM-piKo-0~oFGNlew{D2%2UP(|DN9+|Im}# zppQrhMaJty2NR~tyx0-q<^_1#8tO^|6-U0nS(!a)Qs|?b0lM8T>b@9%*asw^shH2u z0wq2Yv=n1Pwk#@5crAoRZkmN3%cEp(lLQ{{7MqMjj^Jr9cr8E|f@SSuJgYOFf@kdt z8qXkvZJSl{*%2PrP_@D5Da$vc8D~NS))j+yym<26wrR$(%2-d;m$<~@>t5+j7mh2_ zpP6Q1ww>YOH2-40G5zV|R$7v#Pd6M<0uY*#W^gEX^bF~UQMQrev$;Y$|(ZdQz0N$}hIW)WAt5EC05=WH7u$TKZUzG+zn)*l6nR zFT|hb3O;Gyht8;oP=}(QcqD2&Sh;fYPSO5_TIprVz?z|0XcjNM*=Q4da4rO4#ii(L zPW)Uce4`0hA~o>AzKdWTr1tjh!-k#7zk25I;lnxSujN1Y+=&zUHTsPjHL72Y{4+{7 zRT-^1M*oH5B0MDIrI-4Z*ptYV=~~ZRVl<`@!u=|wI!2TrLf`Da0i#Zi>LTcW2y_8F$Hx6m6wr5Cz?Phu0~l52sK5pgRJFTZH$c zDbwBV^z`X#3t*lFYo~vx1H6hhpP~MR*C;F8yky-~zFvI%mnCb~JpTBSPkJDMU(|1Z zvwyP0{N$7C*Hcvg7Y?JWD!_JGS)!M5{l@>|D(bE^NBY(MxVAkc3`cHwxQlFYI3nd_ zq!T!)fFK3Rfy05-7FhM@hcf((|2QWZ4wBbeN+eK)sRRmUC811w4%o0#yeJ12xMf{y zk)%b~Lu5o?fyun-Q^%JgfaZ``5K@9C0H?sM^cnD0If|;fS_zkyE-a0ifqR&Ndq&>z zC$my5q`x3_e7G{sY*oYkUj`dnaYC#WoJjGS0~INVs)Fgk zhSi4-{$B<;(+vw13YQs_;WE4K_QRF`*$F3SBHz=$&iIGj<$tRhRP{Dl>)b@@^#0D6 z_GC;YO7?Kjm$W%It{6}7Oi+cc`CTs^mKlDz!_@vZXWa|eE1 zLW1^!C9AjZ%P+r4oVC{BZru*&=Wm^ZQvUfj8*&npdOtQA5B#w9)vMQ!@z~6vwGwkK zfy-dHlmm3V^U4)e0!y6Be|*V|-h@6M5wDtldyvdE?{}My6ou845{ZAf$9=bH+y3L! z37@82Izxc|@ zglcx7M}u1eQTiCmy>7$=!X9GyqwJ2bZuS@7I&Ge^`n*;ri&cN7QR ze~t%TtR}>)m!yio`7x(5v2udk!&LPLQ%y37^nwl+Ab;qC!vB!PTDgnBD?1Hz-9}=I zVS!B#-)Sl3@ObM3N8~G_8gLhI;LC6HGr_#a>0!Y~Tq_WH6&M;qWKxOC+9&8LHGHTK z#A5-EKx_1p#;McP3(%C{iDW8fb3hvj`Rn>_ier#hu3v$8e#U- zFh?|9*R5;65wE=R%7}hlyRF->T&e`;EZ^X@jT*Iaquaf4V|UJpTg1CB4I9|IU84lH z#_f6!95&`%5~*xN-wNCv2R}fp|9l|NW6L}6^WukkHIMMvBAWN&Su=UotQVgi%=Z}c5B}^mNlu;G%4&tt zQ|2HODIAM37n>v0O&nK}10Y`Jm`$pQc?T;todOAk92;>y!}w{JEB(Eha7H((r-@H|Z zSp-_ZP5%egZUz#b_+q91W=W+$ub3)JsxmiIpyOW9aSQ0U4RqW(h>kl1$s2dak8|=k zxw1>g1^xW^LcxOJX3F|vPAAdV-!y>>4Mcp~wsopUfQ{;e|J`dUIEud%|B}&bnmYgA zA612f%;{6Ib8=F&u3A@T_CazE{M+YF+Fg-?`RPt0V^_6q-MVw%>6;Z95=LIN|FG7e zL4!-Ga><*ly=vdN`#b}7W$Thu9XpFSq;1Jw9Jd#DuHs|!x(f4ljMwMY>{@2Px`YE# zS{zEXgU+<<4q9b#(P1jfTx`Njhwvl@ol(pZ502j(jh=eDC4(ON!>7UE5=cUc$^uk? z=@Kbq)I~k}(8ZT9BjH?W;kwTg79(INq!w80R`vpE;TuAA@SFS|org^4G^R23Ly=1p z6Yj>gOAq29Nv(J9K5_MG&hE9#03hOma6(ix>D+qXzT+3f-<*4y#>Eog0OaZ7g)=9Q z6(9Lhlu!NUp0xB-acFzV!g=-a_Mt@c)NU;vc%bL~1CvY_3-a;`P8~UY>CCw@dtTnn zqSDgymkOkAp}gSI`BKGQvqnvG-hct^T&3p^|GJRkhK0W#K3{4#HclDfO`2b)PS;27 ztzdCTJ$~#=WvwS#<@uxPHfzHcP6eLoPsC>|DYC{EW}vcB>~X8}xkw_3VdF;=be5K^ zlsGYqBP~?dB#|(3!>h(zR#h~S*dd2xf{~X(Mwox~>jln3ye4usToYHOb2~W!WGf;# zQtVZHoZ>^F@ z^GJdV+BO!pQFp}X5F`GIa-7)udU=ucGKTdcSdh=LUIqo}aU+6wRl5s6{Z!&=nVg*5 zHopAA)T!00U&z_De$ARS>vkMRP))wzZ$YJM3qLZeKCQyz?k{NMS8nP{()1 z9N)U{kSCvfGTn~HB_ce6BndT|$jjorSADVcAOHRLLfnQ0w<=)drr6lfQ?sggVe@g{ zpEkbs+L0rap;A%hww0be03M_1^de;Rj~7hQ(fbbj>QJ^p4L`LQ^adqh?zpmV)1p}v z)dNabNph$tH);e#J+wo;kZUL8I}&I#WKm} z{p%{$n7;f4(t$c2S-Je)iV*iBpmi@l^*uQH@Df(iZ$_uC+nuRGp)NPnWe<{sLH-=l zKVLiqrdu=2851&ZUgO3gp(zyhy=ExH zV!;eIhAHVJ)5XVz+sIh>clM00)|JG2EpNP$oy{OHG~U>QFTefnvz>g0-KLVr>dJ*P zmS>;+{ddc?_ujj3L60#Suj7hT&B^sDa&M@H7wBQ8DxWLU4P%nMmT$fpGe&9+OG>=q z$Mzj0{DLN7)G7)tojQ3?&n+-zWE>1hl~dC70+WeeCEA^eHg7_oJUp2-v$Lqov^ z(p(@G0q=s1@0FQTB`{AAhBXCARh_b4U#Qck&f)ZtH^J2W(rHhDQz-aA%hCj12s4tH zB54CAuPWvE3^lw*QZDtK%RM_K)`jm$%pz6zvC~QYkEN`Px^F2+t?C)qfqA(d#ZO{h zf@3yGL2}tTtd6&4Ma??N+UO9=-`A|^*6rl%^QQAulYDMI`9Y~-QI(FWY3I(4%~a(` zx~XHwojX-Svm@z-hF6l6C8lSG^dFh5Y%tXNF@<3LX+z(>Jq*bPi*iCasBAX8`&@Tr zry<=?GcDN=qbhS$Q|Hce=)!X--85%T=gz9(_e1Gnt1T7FXMVcW?EZP`)GxkB(VA$l z8>Y|b$pp03nqoh`q18!C)|wN#CvyQ$mDx_%l>lp4h{H?@t-}>6K^)>MBu6kfmFX-z z83{vWy3~e9bdxkIY%L9k6Nxd{UV1;K{~Ej}v=bw9h#D;wzjQP!!;20}lQay1_ZCYz zd0JHSmX}*BDitDu2+sSA_FJriF04C2m>(6i3PuHucGvSUG5NIyp~gJcz;|KU)TuEs zQ8r)c%{(-W{DNyS=db4FQRbP4sbY(eu*i>RE9(vB>krq+kKx=pyIkm^Cn_Ub=$O4N zBO^nRlf<8$Qv2!x8B4ZX6-Zlyzv%k)eLqq_y<~5`wINObZ`Zy_NtScJVx;UStC=+N zz4y+azglW^H}29$-;(vDzMB%hq4CB+<s@y8$U-zLFTnwOX7tpys2a8hCWh)($$zC7XJ zVwuFPJGy@HgikM*D0_cO|MBR$C7-J6_L$1|E}k)Nz4!C_5}!vEk>Burw!ppYMf4#g z2oDy6NsUKM0w_Tben2L8B=w9~32PIew}!*qvG7?p`oI{qO;+2uMZ=D9R>m1BJpVh{2NOgWj&HE*UM3B7OscJlbcH&Vxw~=cP381DJ$gB2@M)dnDFSDHIFK%h||yZ zCTpXz3^y`TL=m@UWC(OBEb$F>0#%1jWRz7kT1nVbXyR&-AibnC=|Os8y%w)hkrm>n zyRg|@%Gj_-l_6ebULf`m&zfn#nyJZ|#>1iFgJe~F(3)|Bw(FYoDWu{SsbTwQkSwt0of|f$+fvy92Nj@N>kd-7g zrB!QJS8G@**!r@Bc>s$FojFrn7MeHUn1f9Od{nVeiS+Q3j^2Nc2So-^iRH$al1*{B z^aF5+vfQW7rcD3@C2PYcS)3oA?R+c=$B{$y+7&Avd{AkpD(_EHW=T`J9=6ZEEQ0My zVTYum;KM}RbWtZ`0f$h)gu(6i17YTZJQUv~dmtr;wJ9+UAV}#6XP%U1^PBC(CC1WH z6-^;S=`<;z9nrm13FYjiXLcwwUM)y21Vyv%WY#vCHQv3f!$w2*v+35;%Ahs%#+^2- zZZUx?yq2(rAtCB(@3_G=*LDwg()zW zw>v@0+58`UeD9o1`w8RSOWSWyMrT-083(OtF#eP>EyJYV3OW~X4HT!zp_np&`v;>= z0BbU=8XVKeb)%>1dTB(0k-mX}KHbtk&>6HE!bkp*;eb&f*P>Vi+%GrRLseHgSUu_H zw@!^N94c`v#j$bYu3c$qOvgm^BeUJ;(5#X-O+u#6fMh1cP80#j-ShL?($au@UdKG_ z=lCzM8fUT^zX>}2XF*idjqWd(F6QQ05XI zD>@;uZU2#DsH~__vqrV>@?%@pu3NWZ=gErjYPD$Rj2$$4<$*JoZc6_p|E)9of1W+H zU%$-8A5Gt*$6uH>XI^#{I$m_R z)9f)+@0*Gmdq}HIp~#9WRMgz*nDpf|&kK(Wf*$>nvbv?Dq;%`t;oiiUFx+mI&}xnD zZQrR&w-i$2e^`IQSd$_kGAByxH7oZopAQt){)2~)9lK@-i>XDcQ|;QZqqPq1+l$w0 zc#qn~sQL+!k+l;djJ10`@%*MuPdq`4$srhfA{iS$m#QpPj%v|b7sDrqJfQ}&-4zj0 zd34oRTz*dwV(a@a8f?m5WkLv84o`FkgwJI+8$5>-k6E15`JhT|euyuNJP_P+D5BXZ^Rczns5p{qF@|k)Pe^ z+qP}wFo8{ug3pvYY&JQFegxJM?^PL{a#T*DO{f6A!_JImX|gJ1TR22`z-NKwDGpj2 z{t$_e@+TkCXi$)|D#~!}8W_0%w-ru`=x6DgEajEy;-Eth6+Y}~7AR`RgccP+5<7h2 znI#<+yHi{eIujPvgDoQz^1mJDtJJ(Tc@L2+-;_-r&_GaN;M7%28ZC;HE6kQyT>;_e z@+JJmT)fBu*ggsg7vw9aMM!!z(O&{5&8Pa#g>z?x%h&iw1g5?NG(r6}+6gPNN-ff# zu|5fwlN~9eElb{*q0g(z2zybU(8UlbB(r7duKT>3rIjLlJT!{HZ&+GdT#y&(lI(cG zG#)JOxQay(3Y>$%d<v1`Im1Gr01M`#G&?2##misdR}6zWP4uU-@=7U;z@j0e zLdFIf;}JDjF{Mc^j9m%v)HYmC2d+mXqgZ$?f_PeRo_5Xk>wEUh%QIFKnoIpO1*SP) z_I|TQ@OiK5jS6}Br4gXEcWM8S-~Uj2QGWhSEyU}3>Z$G9OG;`s={&N%36>~EG&kGW zQ6p2U`$&WFMkQ_Dxp)8m{d*3a@cT~`*Cp+@V_RUuf)x7R`13%+Z1<5O(}Kg3mDB@u7uzr;Wj zf6jl2xI+_n@?YHJ+b@0Wz`8VJwvz3!t{Jpx#GdExO*4*B#@xw&F_qq!HoiOMK~1$L zq`#2NYH_*#NPnTVQdw!5p8i7S2vdtKL=L$@=2n-LqQOfBOakXr2U%4oh)#oYweHS< z`Ds(z2V-Y+UpxBL%s>W=oL`D^K-p*O_}JEw`(Dg>BN+qzMb-Qw?#D5AXTWH&M7rAk zaoWwaCLi9(kTIAYZifwl?gU`PlQ>0VO6WVVrNP=QtC zCo#rI&rLNzyOJ9t-idp-M#1oF7IckWg5+`Sb?cnYO}^rMjNDwZ51D7Gp0LVeDTFWZ4={t1g-VL9tcdA zLID9}GVOBxK3RNLgU#vtw@*&%PGo(A_JSb|#Ms9^(Xs!q8X;%?iSJuAD{(r-O4BVO zHxj9<^hmZT{Eo);Fg@x0jfo6brExt*6kiZR_t7dCRh>Eym>j(Xgu*4lCo6$574ipj zQJmr!ilTZuao@?35jDQ)`q@83o_HfQeKMvVxO+5h{PXVr*v)_)Kr&7s}mokxz09qYUW@ZbL9 zx14b)%5mkmv3qxdvtOw8|31=LWK!H7XU0SL!L1e2Y|gfzByYt$&%6~Pe;Vz8g)4b5?HKL)jJCujTLe*g z+n~{o{mao-PXE@@_ff^Ryn9r`?i$mI zz=+0or|n(R`NCY|m)+gJ%p58qHu7#TMn4R?nIh6BBMOFA#|Q z3l}cJ8bWCrG;7xCOBGR_hoIj+|5(R}I(4uS3su|b(NA=AI%`FH2$eY1h~h#C9$vpt zQnGCx(Za9SoKbCcdJY@CrE%je-h|weCW8iT+qQXsZiy`%5S^$9M=4QF;0p$|)~+7> z?xWNI)|2**as0ylDFiOwH`T4HY*DRrpV@rqP`)?8WcC+3a2;|KExcK?u8*T2Ki0mQ zqxkCfZ>QQWU9x$r$3U!n90)M+lp8TX6oE^nhP=J&y)22a>Ff688%i&)`*ED-v$T`E zGo9*cIEem-h|~8VbdCa1okUZJmZ}vRm4lwijz!NjIiPdVv_Q&HodQvUj|z4{{DU`T zS7>FzN_4%K9qK1Rmm*v|(eibIa|BZKm8LsNe0p42A}E0sBRvs0Z_tcsDlaPz4VMa6 zEdQzvd2diftw(-S$HKSy(4^W#Z)5$Et0F5eqnfCjx@!+-gn`D|<)yIC+dVkmfHGdG zqKx~Xj3FIaiz~NJuZ{X(bj=sh%;=}oSFZ&aF z(TDl5UWxw8d*{<=@Xa)c#q?{PI=_0s9hQy@HnSttSyDt)x5l3_hii7wF^42A!C#R9Ok=r zb@sxGu=R-u!2HpIYsmN-034PGn*a`9+4wca($^cWNGlvj2LMHJff8hs@ibc&7w45M z`?fo|3bnN+#_8Wp?nQ!UqLxCY)H~WFt@h+VDY?!SX^e(Kf=NTHDmsJ|Ub3QaEn6+* z8{(V6#z|AO%n;^H6n*jF;yaatGP{8pmJ&p|Mn$(5#FZp;&D%x~-W zs-H3%GxyntyBLjK8k;VW@q50!nv$Rz>etVRW(w!5*>S9piv>}5!?ryKPXSU&_~MH?b=KyW`id`|ICUzAk4KCc(X(#EjXfLbY>MbE z(}y3`YL2uNSb8em-1f!$>pBEexRestqNc;BbL`b1ZeQEB`@BhuiFG7}+_9&_% zV#SSmq@UO9D1zq{q44Eu1l9(Bm(NFa>B708-_G6x-z~-1sLOZ z!xsFyXuOmuVwKN3*FYoXj_xB|DIGKmE5RH3?U(o<#xMh9E?Jk>Df`x}`5Gkl>gu zhM7G1h!ktiJcEFuOfzR7o$1K=k_+;L$g+eqGzpgz+~GZzrA`R&W|0`2C>JdcczuPb z^PETVUg()2@}7KCq>w5ZZ5G-hl4ar4KQ1pV_fadLQ_XOw<~gWFx-0cbxEn{lXAsr2 zXxlbC{LHQRE?qZn+;Qa0O_L6d8haNG$WI3#!vfU;~_!|06A^F zdGq{rkFl(;-Hs+^_AkDus93#dT1L7g&HmFp@!QoqFO@On#%o0dy9jI+;Y7N}kDVA`l$n>8BPIm^`XZ@Gc2+;LjH#5`gb8p?oA^ zFCh+e2ym^~k5I6jjc5)$vy%KDU7>ULz$wa8;q@k~AHTT;cNl^NDv)La#Fca!cp4gb z5*m=$Y7b~2IAdmT5Dhe{KJ|<2c|UGAbh@IVsJPPVj;TI$sM&lmKE@qNK6hk|_@P4& zACB+-W_Qv?xmn)q9)D4ZBbFYBuSDODuPCDfCgu6dSH+|xYi7xw%l>*DJ9hN8{;o@> z&aLakghyXKfAaS=KQ8+IJFE5h@sbPvCOv!hY!_E@Vd>KT{V(iZ0Sj5N`$CCQpWO#S zG10d}F*F5G5EX;&YhF9llywsf>pVnl8OrJ4Tc9%+ZSux3Tns zddky}oKzeC8PG#dEsiRiI38Wo%oq`U(_cH9P>J-H^hjAWOn zfaJT}uJlNOGEzA0j!;H-D5G_d-q$&ZG7=g!nl)?uc(;2~MN!_BD_5@FD5>bsVcD{Z zx)NF+T(@GA*L1jj`@>${s{Jq1Za95ftu+Xb->y{$wAk2K=Z#&f#*M32Z`Irh8MwUW zuG-}_6=r4@dhLHPvA02U?(!j+C8*=+PpRBJnpL}3pV1z`76#@tiT7PqikXZc!^J4c zALAA+At3DEuyA)s2!3aArG?-}&}Wii^9L|~hz%*2)cPRHoZ>aNm|Tpqf+AK*dT2S0 zWciiOF+9-BZG0b&q8~~=;FpmSNfN@;PlOp0cSETMULy120Si%|7Ja=YGb^H1HG^k& zU{<;WN%~H~v+{q)^`%QMUZjDL_b(**>F(W6dlUW-xt*A}bt}a!eg0(FRl(#<>NnR@JNtgMD57DgY5K%RnDPoq!|$B!F#xr>YBHO7j^i zzUo(M{U37H=kwsO@&2V?jf_Cz>-<+{UDl0MPTeg-nJ`Q%Bqym1+;quVh1PQ0vssO` z@n_GbEBTLzo4A-|qRrOX4aK*)!IW(k&t`|&YX*&PaLP2s7wp+I|GEsvwn!qPkWTt6 zB3Mk71`@-p(i{Z6p41z(Kd}JtSX0BU-u7xrSK;@e3i0?2fGYY1t<}eas3Peh7HHlr zpV1y!6D^uF{jb(tG1ln(&_nOTA+@MF3H2K^Y}jz^+O@kbJL`0M=Kc4D$2#j&4-<)H z39DX5b<{EJS@hXwpRF#H=M<3q=lfnI@;035xafCA4QyvRfw$|~XP+JY_~3!P8bwA9 z>Z#n+ZwD!-OS6o5piN?8VlQRBe*2P)=S(Hd{La&Z20`kFRn_!Fza}n^$pkK!7|MC2CxL|NOxKa(PJzut-6?tlE@@nRm^5R zbi@m3B&4Sk%c6z=&>7%NLSks_QYHoq382x4=13wrCLh^9?1XdHNlmJtd4_2w^dp=> zrkowB=MtF+N9mw;SZVP2;aWECaW>T>%6@2gu<7dkH)n_#5q z+(i9kppVd~AYSrF5Y^O8kYN}_BN$jd!>DJPImT22Tus#+z=`fVQ=x>=Uj9_m5@R&T0RtE1UuE`-JpuCD*t9GP4H`{#dOs;n0DG3F)bXXZsSJa7@N>mmkRV%h2hw zD3kcdGh&;2xx|2JxD#Yka3#3n@7ZT&d z-jGdHe@``u#fUC}(HJl$s7< zbH0KYC{(A@qRD7SIf3*zr0Vj4_D$t3z_}%$6c(l#tOhk2BmgT8dAgO7&rKo~*Jf4j z_yxK`bqy0hK!R7b4B}P6sAKW-at`j^v17;XgE=*8PM@A*Y)55yJ7dngS+mGbz-apO}*j_f;8Zj7i^pRJawH22WnBS)SZ-PxFXYNHt4pMJCU*v)clr>CVv zjk*xq(axQZ-a(6P7bLoQm_2yHj>c%!o9R;|><4Is*fiGsbe!UmD6HYCZREOS#j>g(P z`I=12AHV+Oe$c;1@LqkSfRpdUkP+L5cV4xBlr1HjUrqD&09|+lOSp*^W0tBlv=p*4NAX~+V?s<6#=4;|t0~0grZ+k?WmQ5^Ky-GlWxzK;qN)tcX>1QcQhSeU3&^3WVT0tRo;YAJMMfHO8 zi^L!bQKnFp7f~Lz`Tm3}bAHRoIeq%mPwUiy3>0&^;`5k~^z3HS!EC$F|xp zeyIqLnLI(@)dg93U2Y1X7m>Y&7Kv1XLv3oeS2yjE6oL-Y6Pb=&fEQD@am% z7?ujIn^EydVX+}A3gIkS26AKJNli08KIApZx*0csi6{$Ra$VzyHg04*-eWwh)=GR4CZjk$$pfPfK#UCPUra&cf!PI*@KY})W1)|S z?a!1_C7sMiQd5uIO)*)fx8F`oOkr65ZMk`-u3{UTLjQ&DLSKBbvhtmG>es*j{>6(S zo$pk0!i5V7cau++Y1*`0QeH zLWer5y41kCL(O)e+?}on8fH0ME@U+Fz(sxs8C`c#S5|cyKa$R2>QYZ$CN&ZKOa2n& zq)?La4xxPnXqL{riI2mlbz&1aLOg~6)hX?6nybQVlb(*LjBpYoEQk@o6})%h`t09- z;J|;>okr6R?1=t385l^L}C_inylNq2sSXp6+V*N7*@fTl-ga9yE>Aa zknCNwn?=uPs;Z@CKu?15`MiLx3WF7_8iUVgxQmLb#`qP+cqC)oi!pwfF}^=Y8a@z2 z#rAQeq8d+cp8Y{8QsZH{h2-Sq>{&5;^Sp86Zr)50v_69w_tdlayng~Y^#SATOZhss zgt4%YA$U$z9Z|RTtY_PED@qNEim6M%VAC2=0>A#GY8y68d6xgJsl{nk_TF4M|` zH*Tb$O!YOMJqtocKdoEHCo@maoHX;wq)9Vpayd=Z@0v=fC|+t%!U*}}P7VzX6Wj=a zV6iwO!kkVQjcBDnn=%Q(T~6#kUGd3mJ^%l_hDRFm5rv;aI5T)GW%q0Z+R~OT;B)h04c$)lSt2aPkqm zBE3b3^BuEF`o5L{b5uhD@~{-qK{=cS%wS*yKe(fz4~0^CB$$=KP)h$GN*OTn58sjE zn24!jFS$BQAS9i>wIPu7li4*ND|DCl}2<9#Os*3X-599L@Q`ohR z4=DWW6}7vnuC85sl3LWiXVRAILRl@*FhmR=d5p-j4)kvAGL zIDnM$FiHA6Y0OZ7FhpM$*2;Z;K%dZGb3C2P>FHxxX~c zg;v8B$OwZl0@T4(O4yvd0hxWVlx0tBkXa3RL(W3p1ALAmDn^5doFz?~n9<;ajlwxJ zi3$bB9vvE$0Cju>A9*K%ehpB^umnYUEQmUS(F#*UnXycoB(e`(#zHAr&Z^lxA(PR7 z^fi~8dHM3?-%jemTeG!)!EBypep0knS}ViJqdi%yy|oEiOA-~{HLTmFqc$6NOTZg6 z$aVGVt;_hInGEhBSz7wFi^a^K{PD7CJe)}<$NbJEhqk`|!DLb>jSt?BDmTN_>y<~! zQ&Hr;px5Ra(=$)R#wRP^8p577cnUrC04v(B?3dCEZl?Xhe=Gt1qZ&>sL`UU7GRWea z5&zxojrY;}EY~mOeKBv^Aevjo`*Zx~Xd0$7?dUyNZMT$gW}48$fj+!?2dm)O$clO?nhatMb!R);Ud$-S(&KaV7>eg-0EZK z@gLCR5a@9f+$xwJgFVYB{_FnhmfwC8Wg%H>%PcKlG>fh+y&2bLT3xxB=FXivsUIu7 zH(4=bxt9h4WN^u&VbOt}%t8z86@LY@G}178TnZkw#>RyUA;~tX>3aYE*E9Zi)>f}> zfF|`p(buPtiM*=X7)jrN#rY*m zRz8Z2_%QLs8Z6g`c|M1gIGdgajkx?LLDv2f1z;qP3wiat=J=vbbhOO0-|vP8+CxGk zqpDFN6G3-|h{#Z3k&%&Zcc?2m8e$B0g+xVR6va^bMSVGB@jvj!0ObpJWNiMEJ=Q9Q z@Ng|w6c-hh(ESu$m4;uX;ut6?FQRnY6Q;AtKXXahErni;zP_FUoH8&8a-3QM3JPsP zwIoHcCWN2TnS}NvB-=z(h^2a)Vd@-H1&0Zid52@pheE$ao<75R`xpvM3*wmRLGsky z@_~m2JU|6*|3@C`Gi+F&H+ztGuwB3XQ16`wS`O>;@WB4$r*v&zt476XbR|HwYPCw~ z)3caDzgXU}=vHy3Zn zxdQa-)e9$%Zr^@*VGkCIG;MxNd$Inc#W%O_JW&iNU1Ws4H21WRgNA73g^S0L?l5cN zPkVp)0&PL>hv`iJ?B|`^m;bn^MT?69#FwNcrQuHVbPK5w7gcsyxwlQ4R%P|s z)29Bo>FCkT-%qGQ{j*K@c75s5O-sO+csBr@TO)18vMmSB6KT4VbLi;le5mQxxdU64 z&&;e+aNHT6F5P@|-%nFN`e@P04kr#=U)tVGMo!gPB zBPd7m#JZyZG;IRAl<(uq-jF z(wvr=MkSkd_Xv_k(7O9DXx(*-1}x|%B?g7$frp1zHXKYw?x^0i4bkD0n#c#| zj{Ls+&>Ebti&m^D38_`TK?C#g-MjOf3?`dzWNOXO%J2=>YkdFxUOUP04%Ji59$l|- z;|BOR;;A3F5z)Ba{gP9Z+0+~w!E%WHk7c%c_cbNDMMn_xD|VvrM?{p<4!dZ@-a4wON(9sdZxv`sxiDG>GyQUfa16oU)Zae79lM z!Y@Dn{PV9@9l5qIJk*{-uqn%ue02PHr59)CjIJKxyLKHaM@m?VE}h!_E0K!Krh&Py zT3YV#x*bwd`#iwbqaBU9ORiH0wDB_f`0CZ0HhLQ+D)3C1b259lM_UN|%fyOiqEiLW z5`7cCS-0=v{$Hnm`}@UxYv+8p>A>;woKqKzjpdgQd_Vc~{nr-F+q$pl!>_^87LTPYY;G4Q;h}~md0#KssNg%5UJ3yD8hd8d!Uw>AmKCK&R;?(BmdRmwPXV@x zvk0srIeqL0UdR(UohqGDA9eYRb0OTq>Ej!edOrD`IfLF_Ul&((z9+1m84v8 zDsuV6d&<+nC6HBRQe-NqWYit7XmaqZz^alS&snUhmswSBv8rAUT2*6%{0N=P3NN2N zB3aMJF5E2hS;K46_NsP_v$E{q*W<@cnL2&?h!IbYdhzMLv1K)TjecR&$S0qiHg)o( ztZ{P=C}&lGNuAYO2CxI0`HOS+>EMCNE3Z7#xct)D<5c{d&#h?k$SYH(EIMR}s&!AN zPWLu#;L2Gt#T#3%QQPkQ2eb9-)VN*^hp!OJgZ30L^*W61sd$LJ25!^CzyEIG!iB4j zTI*Slt@-}@MT-{qsA_RKRheRb|A~9iPE@un`?bP$4T}!_A0l2@M<8 ztr2}|(^r#TeRX7N3~n)I&0?$Dd-SW`I<*PLus9fO8GU_?h#jC$8+WD@+`R*wmrJ#r zWxLPZxK&h~isNn=y41@C&kV7NhVyEuHq=sFbn8~Zo@A|mX7!4~OQ$X>#YfK;(DA?~ zNqyGvXgB$hB=%E$DjSd}xXA-_O;FV7X8j8i1`DOKtX#;5>18nph#)_)69mE-fI^sm z>L_&w181q$#f23fS3k~PS?Q?LBq5SS4_s3vMde7V@*7w3dE%{KPx$Zcs}qUC3tPE3&U5I#AU?-w* z%UQ^SoD=YM8Q_;71L6i~49a#`oTPkDdvJQO!NcTJ_A(x<`%| zH+isoa$?IiUGDF$%%Sf(V2#y)qXf1Ud5R? zP@J_O@eai*d!4GemFp}UR&S6d7^Br0)qp~S!kuIX;jofCa)()vt3pJVLPm&aHPTik zGZHa|;wu4M+>pEgG)V_Pf_6Zm=Oe&xfCkHqL_uThMMg0*WCtNd2r8*2E8Z!Og>W0D zmwZvz#%@=`B{E`CuN>^-500WlUhUkjw%uf?xLR0n`oP|8s~63_giUJs{wL~8kE`Je z?!QMW&C4ufUVh_^H~#s2vPW5vS+gR0?wX?J&6_r?TR%KH6m~eq@Qx*9_C7+W$%@CF zIr|vbXmsj5M<#uc<>Adt^M+ZUP0s9vT<;L=lCqFFB`_bg-+xD6dZrdA1zl_gg z(A=d3uZ>`*?&Axwk#}$9N*!vrM2$UXIJIlnGO@`mPp_+j2FcKa&<;cNdx_kvGpvi*p%!@}EP;tI*Rvb#Mv<-o*@}=Cc`Lf8B-D$_Y6(LcBV(9FbUB_NtzbHU zPU)(sD0!9ifT}tc`;~*CyzxX18gS)tkrf*5{(!W^5i7D&|0%zQf`|)Qsl+i=iOMMQ zbvYK2TMVawUsTCbOqFc6cbZGLJA$e1|3Qkc5mn~IG?9Skc5nT{FA(_GHxP1 z`gUKg(zwr1wmyxu++HLr%%X&3l|pr|0%w^b}cgU{CTJIDBFqL5(}Ve zvPGCnuH+m&N|xpmom?fSmrhP4sHfi?lb4+?admoPEa}4`m7jc4`EFU+yZ>|fom4%@ zG%&fk2*v!DnKs*(tzEVjsaYjL%@cQ2o`e6tWtzNd+gVbKr%BEQKeURm3^DK!P@l{( zPNUPPRmn~)AQ+7la5$x21Lh$G6UZe!YXU#6r0K{3WjFGG#c#$ZAP!}*xIlr@ z<66XqP12;y>ofonWFcFevO8T49EV(;R0efK@`+?e65 zFq!G5{P^&vM+`^~>(L7r7-n@ILwj~H9N>=(;k#3Ztt z)MJAO^hsswGhi@L?=$MXTekf6+i$=AvU>IE-*BF--^ksDOas#2hbq_*Go%lsK1 zdz+GJBa4D9usR@5F%-z1-tCLl=fz4s2G1w#7F^ZuNhkkMV;{XWn4 z_50`f-ASg;x#ynq>9r$qNgXl2--{gclHE6U;@9sgBiu<$z8-W4xX%#d55alDmlEAN5(5m!j;46jgU?|qHH6Z zis4N7J0)>M3Kip@Buc7KSIve~2Kyc|rh1z&ljbr7D1o4q$%Etq1S2JHTc#;*qiKPI z67Xe9q6P$rEcQj7NQ4znIIqON~)Fj`7v z43PxLcItiXain`>W|$kuD#?_DIf^c&){plXPM*sYWnz^FvRL9Ziw|hQIe8UxQHx+Prl!*rL^q(H0YZoM{)|^$I!ulYQKJc zsjZ`qzWw@%NuvL?YuBu)UHU!OQ=6nMqe!ZGTc%CYpVMA9+RvDQT%OP(D=Ui>_@WC3 zxI4CLM%Pxgs?}+LMX~8k_D3JRIW|A0c+>QW6DQ6j6unok_6_5m*)bF^h{>n;$D=@L z`L+C*a4cc*&iID%g}D7Q`S$cp#WDHbw*4RVr}t{y__o`7c5c)Drf%K3Wn^UB(6QYO zJ$ol&v!~)$jT$LQnVL`Y)%oW?U*~xF$@}_tt?LDH9(w4Z!S~5-f2*G^5u>+{-cuMO+pzJ3~&L^%ldgVwxZv^a18m38}8XzUKwaQ9yB z_Ut=w;nL-NTw9kfU%cR%FyWhd%X;2^|DzK6u0q=_DJdBh!SOL+X&rhl+fm?|;PC{{ zZeG^2Lt0p6NWA&A2s0@D(fe=jxoqM0Urg{fY#?x}AQrX?D~3Bka{x!H6C)*Z7lemb zFx+mq_qx)zpb}Hgg(%RshD4rFM$MU4zkm2Dwo}c zYsqdGo-aY_L~9f4N|jH#Igs`R-66J-e=+gPu(~rTN63nTC95x1#4_L@=5Y zO(7RfEF~f;GZrU~%t@uIpbyJcNYz(GqKctNHLxm4k~@>fsLK^Vy2{Ei{9&$kz*h`< zzOe|FViD3{W-d3I3GOTPQoQJ~%GPS?zwc2Ps z-6B!vkUnu$VL!k|D#X#$7nR&;P-%!*3lPQd$RkUDy&{ku4z;X!DKtJk&AdAKSWd_F z{4SR(qKK3dB9BBUgvS1BMi*1SdV%5o&-1$O1hVgj&WgpXkM`Rf)Lt1?agFtnD_v35 zM4C$=WToifuES5>-?dI;!Rjfr@)Nr1?cQ=vCVy@r5Wyijg=T4r;LcO^;_}7?u`-+<1 zLs#<`hW4m=wSWJ)bG0uF?RjcIU&%XuG&L#4nO)6Ze)8m=A35>2TWzUF3)8v}e*XF7 zKp=-73hzA z#f$P_4%%>OiReA1EI^oI0@Oz|WXL4|0H|PdBJlu6qii`T4HUiNRD7-mRj1{pK?=%NDfor-w<-t6-L_PMh2X7>;Z)-`0G>k?t5Vw9@I z$GEkN$4{Ji@WG6D?aZ<%gsQwhW%=2)YkT+BHj}Mqgp>%0OZIp=+&|PT5#l_u=&Okn z)6ypTtH;MXu1OvLybA^P*jg>xw*C6+^}*OicRk-#^P4yQ`M!-aN%Q$YBD%>hc$#`@ zr4=PX;#EnIFFCJS5~LkHfvQ)3TFjXeZ6s*HL0Tu8^1Rj8ENkX{^A=WdXZF<9MXP_B z?|YkujjWrnLm@FDq)Ed@9)r5ug9eKnX>(A;yF3?h5HbSOMaPrY#UioFlB;D`;vLJ5 z8IuSU$pDmPmrazin|3lz*giV&C@>JS6B|eXjM`MbiOWs47hRTpgS*T2V_MW)OJWoDtqJ>9Q=_{t_}L_*%BRveWZ&X1ZrO72;z<-Dk4OEV-)_l?p`|xAIu@dCwlWd%i;_)jG+K&XPj0&XJdBQxP3j`PL?H4j6{}5P< z-zm~1#7~m*kqRjb|^qc$Q5rwHtIZZZ~eDlH6_OQbhDne zhn0$gN5_OfxVvhlY*yhsnsZZF*xz2h;l@pVXR~IlTcLuI;?ksUQaX7qpxaGZ+FL+n zPp}7{&85pFB{>3S))A)h5^IGMs8H5M>;t7J4g}*!d`&a;Fi#j2*s5!Wb zp2nwIf|rjTIC0|Gv12r0jy|zt&jnHj{WgMCHl541oVb?lilicB$21Hm{`iOs7fL)x z3mnARN5)n2mR`6J;a3o>XG89?T@sxvww0j2t2P-;`d!V4cwy*(9xYoE2+--~fkU5r zEsLbhN!n!pIO^*H-~>b2oFph}6niX`O5ALrC8&z1vJD7DHj9V26IKh{uu)i?jRDr# zO^;i=mCAFdJ4M<<1F@*R!>Y;7nmZE3T12rHZq_0K*bNU^i;#K?n!PwRb?v%MetR=5 zCMMSHx8Hf&ZFk?@&u@2VDJcP7Kl;imPdzo*KhjQ?4GM@Kifggt%Dqrwn70(0yC@AKLtkCOv?J+ECGIyC3MPiv3dyg4MTUE8xK=YKt`oy0)nKV-GjoJ1HOrbA4i z#($C2PBNDrA*dp$z09P9H?gu(F`#+6Sy#7nMiu7@?RczxlM#F*d1~IucivffIt~UF zcY5WRG1aTDTr`z+ocgnN(ukURu;zs(O>k2j)MK0XLzv95yJBL~8a45=*(paZzm*>z zp1*E(;Fsd3xiL$;ga3_Wb=DH~cbF zYK{mBfH{K3kUOhJIkQKD&sZl+yD}{!_=IiR`GRThWf9>0eDJ=psh%jj=oqnGV#`o% zCxby+kV2v9jP4=91U?|KYvS*Ow%Tktj6Nb-qI;0lv7I0?sC&arSQ*$!97U-S1;K!R zz+UtUO(BQEq;ja51~NfxQL3X)xC6E$6pw5qq6bt_4Xxd!Nrzj0@=1*vQ^_`4vwq9YqZck;x_Ggm`09yWTh^^!4fDxr zl^k(l?ZWx<=g(VlFc6W_DytX4Io1zm6z$Jp5@qxq)Gw{2E%*RzwJ)}h&aRF)4HxTr zAI9Onotw5=FypJw*u-y_p7J-G=ZsnL%riT8J_@^Q*1TDhR^9sDclX`*_3hT0S52FI z@WBUPuDBAFe$#y~XNqX(d7*!&w5WpBUw=TXj`h(C)>m^x-iFgTV;Zz;xqr{`E7>G> zv&#AFzn7v1v*-UX=)MOY!9;rRjn(~TwN}{$F*s1mM>d)RF%X~N=QPx_8dHle;b(Nr zUVg3k+S#vhns{>F`Fi%s{b#RSo=pVLbDtp2^AlL1D1BB@ECe&qT6LEr+--3LX$511 zsYcbz16>xW0Fwg@s|zB{dMI7jTn55k^@n#*<;g%S*8QlVK#T2)txr zNSUJ6se_IO{9pu^K%fb*ML}6HYVs!R2jDT2>JTQ;BGr!sb~s^<2u@;AgtLp)E?3na z8UginVkL5tSQ#7<8!Riqpe}(eQZNg+rsP}&ZLI9n5&=aHgMWsFU~tUf>)gzt)`gV1 z($@p;rv>yObso>Qx0z7)sSR=Z2W`euMd~SnNS?CfU1PO#?G)*91}KBB+lZT?1++$G zLmC9q$U-ncW(xl-(hE&0QaOhxpjqbd2i;<>&!OP&g&!py)`zwqnr-hhr`q7vEp(KN zY|Z=j+vCPn^zs{TjJ7+maR*rjoyttiU+tN%3+Oa*$e)#-zedCUS5KILd8av6|<&cq@asYSOofj zX1MtYBBWU6{KPs6F68i2Low*W!ffe}g;W`ZUWJia&V%h7lSLJ z^AkvGLe5N zItg7Mj#(ht)RyHJ*MAkILR^&1LFfePmg=R3!YXc{@=|H+rzAl-DQOPY*ufgRfOc01 zw7aU-Smu;TsMsJQQ@dyxY-9#w$f`#^jMJ(cxjYs?!{t%tldDE{rT^C>^SgZQYa=&P zJ8ij#v0DaP%GhDF-jOj&n63F(QaLuWc2&%p`bC-}gl;*iIH1g0TTXJj<*=qDO0c0- z%Y@YrFf86^KC+Y)in~`1b2X&BG+mvPKI3FuXUMqDs&Sdq1kKM}EcNj4&52@}TDIllVZHy6BCK8C#%wbT{mRxS|MY*(?9$${nW^jr|J;{^s043{!GkR z_gSa*(|$Jm_~G;O4SQDBu3b%L=epKE{q*|Yk37vi#nzI^BSq-VTA*)e4WHoAstcERW%$O+Jl)fB%*|LK|Esxm7 z%-OMMKCzuvU!wLcXAcj*c+s#+Z@k94b6xvhd~x61{rlg&Jd5DESz3<%3ehuKiS^~_ z+CTVm{rYtBv`dq`O*?a4MHEBav2NXt5eN(RIajXCUo=NLv;LD6d5x+YQfPy!I5tNl zJ)GQ*um~qB;%7ztcFZ9`OS!os;vXxM{)Dn3sM;)A$a+9W@vRX6Db}R`Dl{1$euPnU zZ1T_T_Od_)d`JZniLDj8LfzlNN7~@)yjY8E+&D4u+izR9UODx!-SX^nXC|%Fw!$Q;X3R$7G7Njl@@A~TEaCuq%ai+>j}3FLGEA4)UTz;Ju1 zLo2tMxYDWuSN`2v)D3|StIv1lOeVE_?yzhl9rJ+x`&lQi zUHhe?9hR?=EpKI2?vX+@u(+@=ha;Mv9K^|bBBQAQW3GyT2)kXLLum>lQmpuec)=j% zFgPyvH>;xO#3JlrfiVM9#NojTSoso7kAK%=5yOn;1Wr8ZHXi?kMp-`AM0JN45>#ZjLSXoIe}e9P6LK!Hji5dyQXL5x{Vv+CIIQ zP(n4fwPNfz=1sXiEuOKH(>1Ne;3{n~wFiXt!y4S`!UnHy_TdE^wUKFeD2P#UWKsa& z^^lf>?cbo}6vZy>L66NX>J6g5e7)i-Ttq>Mp*kR)b7+NV_D3YHg0y7mq#aWB9^j z?RC31aB}Zf^MD{1WpDHQc6Ih_e1l*zV}V37X*_f7Sf~Z zQIztsxTB)N>5filZFoB@N z#=+jfq0a2=t5>B0vFfa==ZYyW!I)CZ0dpl)J}Qca&eZIaBaEF8Z6p|!5@7I}KN6Zp zB}r(CO1mJ!u3}p%)g@wo}G zab!b>6R0!9N4#PTJN_slTS#{=DjH?t)M$2VI=dw`_x=uT8x%qjMuhBE7do!G6Kip# z#JXsRb5T5JSIS(N*Cb6nE;c$cBIe4{Pv7A9WbwuD26sO7GRNb$rrXZ^@)b&^ecb1B zcG8k4{u3NqrKffxrIq64DMp?>ef;b-zmx;Lxnr8wNFO$AXy2YU>v_LUAvCIp^#+h^+P}`*&(|K7ZHu zqeqXX^o^xi_aVbxpsWjvFOE?B8j@H}9W)FqWFqL+Oo|)5V)^v@?gYUM1?pPSFY5tU z&Ys}PIkT^wnUIMutFz^uDMHNJd|bbt3Vk&V|_7cw|Rg3zaq;VdQu#E`RZ-AP?p;jn1NkU-M z@5OP+pQz>7nk1Ynr>?j&#V@B0`2?cF0rQg&%mdNY!PPLPjR1Rf7B~tkj`EJp22@DI z_e`60V(6q29l9+H(zGri-J{^TD)I;41Rp*FA8rC4UH~7S3c-heRB=eH%j(tpi#-y5 z8R;%BIDcfHWGoy!Q&4Vkg;PQ!I^2cqn787KF&v-HJ6c|? zkNsrYQf;q zfeYuX&F_5p;fHT;s-HW#ecl)2{F$1e8Q%N5c9pVB{RTb#!asZBU;A8}R&kpIEMxq@#XK8DSP!(r7Fi2E` z2>pn-xJaV`5+&~w5F_J4SZmi3vZ@BIIEP7Jd4c?*=Ar9elqLn;gdhg9C7M#LjzD9X zDxz9a>Qhye0eJbtULs|>m1SJoD+)po@K6!#YQ~x3)Z`R$sT_hH@}MrARik1QN|@jj zf1J%o;7%YLgi;8jLN|FCAe$WbwFM_q8CMxF;v}mNZfzsenD@)ns|r7eSPlM2BDaT7 zf1kchTOva7nJRhwNs<(Ox`$?h}B6>FY{>;A8-dCySe57R(n2-N%7-k9)UvAV@z9uR9=A&ww)3yUN6VYYbXo!_!4ho>;~*uD|W1N z$d26@f707zYe8qc=vWu`Nuc>@Wa}j`?Yq7Cw~3)lMWp|VNtCe zjvwz}#D>-FN>%e)v)VRavU2O*Lx&Dsa)gaA8=SIDEYk5J5v#)?_f~2=j(vycHq^t3}AjR-IA=!#L#LE z80IK7ho+(08OG#}`(f_Ja|r#^#5}fk?)M-1fw;dIlSobtk~fHKh}|96o%qYpOdTT9 z*$Ago?BEaDE=NkTk_cW(CIZ8FCePR;^mTbm=c^x2*el(QI;wJ9U~4 zyc@9}&p3=c$04vr=R95UbiK)Q?q(CYu1b^xjG`ui{DWs0tM%pQtHh0!FQ)GublN= zUIEsyw?G9&6^Vo92CRy^0}!VtPPilB^|@i_h@4ESEE{x?Ln+Y69q?pUnh(_4(nl#^ zDe)n8g+Gm0yc`C^)WLMkovW8?5L1tY?4L z^Eu%7wvhE4Tt)RYZCw^s!JiDioG|j;cfVb}ZuEy={zzTCIX_MNcIw1&69MT=Dic29 zr1)n1xu2(wxfv0wqIM(o8#`ilc*#9_;?~oeMIPcn{5i@9$nWcKhlXpOZW_`#@%caH~IqI;?Z%e2?Q!>L|WO z#f<0m1(S2Sqk_Lsar=koo$1Tg?mBYv394! zOMrtidw+lS_}Ri7loTOL7OPWG#Y``O<0!n5UDVyNBq8m~8-8^1n4VM+xEB@w07WZr zr4Ylbwn>}zP8i;kstmn@nG_i8hGpi3V7rOF_NM3AVWICcUPcb5=v65Elv0($jS&WA zN)FMfBDkl9KLtd^L57xN5yp?6#SHvPec}am(uEX@f+Ep|0u^F~!M=`HA2x|%C2meW zN3BzeoyF#>2H;^S3J_;jBsvhfmdb09Cb9xxq9PIF0Y;17hQ_3{Hr4}AKH@CEi*#8* zsrd=-)BxtGqC)Xgq43<{_d{f+Rs!6fBu^jWI<^9f$`&fI(v|~BUb+&Hz6Z%xkoz2v z`*$E0JzskQ$bBRPa_guRL9F$(^`y!;W)sa#v~T)sm84z1l+jJB1OX4eR>)v?>afrW+F zqC52;I&^5SW^vJxg&QTwZq#Q74`0ryyQ!>m~Pye~p6u?kP?; zFY+Rh(_&*XwHh>eYTw8qr4!gmEKm-31-uqA1n~HQeofD{qkk|`HceD`5E+2+gpxtZ z0>Rvx=|ZUZOtE~Kz04I5;AzFQeFzvS)T_n7C^=(7A~}R|GlY~LDFe1SDbw^zfh;no z6mOC9DHK$x?qa5>98xWk0yLq+7CjZqlmsa=tQrPbR*H_O|D?$H+!g|oMB51jv%^85 zQXTcZl**|trwNI-0*SW)iCvHdq^odd2qg9h;Yqb|Ql`H>b3^{w#_QLg+5XGYUnyC9 z@a);V(i)xm^trul)TJ}GxBlv|8_5hw%*%VQfBy#`d+f1ihBPlKv0UA^diB~pWo;kSIvY7DQ>M`I zWHNgd8S5!Zj66PnetLTA&ef0YUiSUu$$l$7&Z`;0A=VX_F09E2K5g5#Z`Nd=$l~{^ z8<_#t(Vuck7gW#6F>rT59 zv$`#eay#gXEH4e{u{f~7nwY88)(B|uL;--V$KhR&|+!5u?rL>Bcn>kYac>U(s8dwy*G2tj^p(-WlJ71&zVE=1UB6n~Wv7mBnEn0teybRT(G}gB zu3Xvn=Cx}Z=e|=>doscpJ!SU1FGlC&_&=JzQ8SFs)1fGqaLgZ)0q#(k>~aIZNY@A; z4hM01IpN}c!`UN9z!GM=;0^2nyW$5Sj1>Hn>w%@Hh+TTMP#wWCV6(TAwRN6_4P57*(X`TV>Qsk1{IS zUq#%4B|JurTqq-p-Nqcb9rJAi6iH4=Q>a1n5NgmO1d5WQhYx??fvsD&9=Ifn7%0yV zruM{8H+*j$r?I7s%(nNPMClR?uWglZQJH1FB~{<+&J1v*DTtv4;;8qyU4Fvw>I?NZK8AB&pwM;?2-Pxmo3W;CtM6_D5Mt3YPA&PWy#XeIpfVS zh6qy92qG`ob(AP;Vk;I52A%bAbnY-0AVLWjXE5C7A(R1wt%Nh^hBS9p+erkV!rTb- zZ_$&Kl!{N^$L1r12Ib5YHdJ4ikUBY4727f)3&rqraY((OUk zQl$NstY!U>wG8dAm7Mg^M_s#8onp=26C~#xJGS$LwQ1L`UGe8o55}+@JvxGAtmyiz zWo6|iuO2-3!w;J^YnFIr_qsXXd_CiXsZ+*N(g@!TN||A4-rUfok+Zw9ku%GPfUlSs z>nI$G{)RLkaZFt__lMEB5;FOg(qVxEuFt$gJ<@LThyn|T6hS}e@u@IF!UDh1h)0)EFIM1=c&}bH zaxIY|xC2@G-N^sVe8*)3Gi2n%$JKo61d|O*bak0;;Z?y%0n4iS{wJq=m!gvH#O60%yn?=G)F?W$W6kQ- z_3CM7fBl*U2VX8aaPh_-10EtY{ zzdz92dwIndZ*xqVxAVlIB};x@wC)hf0;TgDktua|AGuTvDYkjzlkd1=%a-jWH$0Oi z9eC)$GwjCl-F3BJU@im{QIzhDcT*EQ7S$L*37R6W2{01)BM*S6HYp2_QbzDm+owNm zKVO;=>|x74wdJQzGx2ZsbWH3dK_pvigO5&5DEi* z;7_dPF2mqVx;`RREH{Xmk|!vK@GV%1Qf#@3oazZ;@5dx0zgP53&5Pg0!ncS*5?N14 z3zCsdiMrA_kxFnCiL{DfVUDV2H&bGvh#$PggF1v|36Ycc1Yh}p^Dq~16-yFFaJY0q zBXEmYLz`r?kmFDKYbhlxuN4(T4|7Zi>I($*27)A?zc=(PD}=sfh42b{X+fd2Q>P4V zLV9VZ@ZkRC%a^a)dx`EZR)07fCmv^}s zLogR*gdO-1KJm@^yr@om*RK~pN85r)wY}aI#ojhuqzvk9odBGIll%9-^2(rA@r4`a z&YipJWSLj`WrUB9jI2I(Y;41ZHKVxJH^NfyguUF;B*J?6^y$+?8;D#cWY6@Da6(Rr z0+A7X!LoF%G-+BpkNBb&gReQ~tvq;DE1XAho>znOgTvkzAEnx6MKxJGkt2lxS*+Ea zk_Ie(Gl{>}gAy3ZE)#0!qX3SL4P^7E8-+_+_J9*sO+;-w1Ea*!4%Z{yybwi5w4-fK;zCuS9;Upiib}v(jvZ95|JyhpZxUr+|*d=PcIrLQz<9 z9ae|ifrP6lZ{^O4PH-zb+aqLWZ~D#7QsS(0=L~IndTHl^lUryMzj6QNfbI&9iW)oi zy90r09VzbA%vsP`?QE;N?z&i6iap=lS=|UbBt=`MZOn^Ajp*aoFFx~hhL+3D9=Paj zm(hzb>03I~iuYVQdEmgyFF(*SzHk%ibnDIry^?hlJ~2GJ+6NybG-*=H+}V^q7=HUV zj<6E^nCI65QrqNted!u>gMZipYkvNUuAru=<)8Mk-_Bcc=!!wC&*^pZzI>~qxrJ@i z)WvI{^TUj9D{=*7LuE%LPu#R=SrdY^mZxF|g=Z;+WDjBpU;}Mdr-9ozpbUo~rb`f9 zst=j@rve#}bunL=yTsPUnOjS_1RMjE=vuY6@KLuid8oK-;6r{WJ1mQX2CA9kC^)uj!_xV){kE=`E_HpV8=h~) z95o~Ap{^p2cWvdO9d%jt_L|)Yd+ae1&K)&d+;~4kGRNVq*`ibL2OpEXCE!j>5$eIF zEk=8@FTQHIx){6WtJcNE9t)4E9jgLxVXQ(2Bb>@u=5$3!2!}NqlZd3*Qny&rs%Xb5 z0}9DiIHrdqMq(Q&Qn3r=MWSNysR1G6JJP%r9wor9bZ%=nAkQ;oZ*U5Cq6>7x)8|uzt1i@L`FVzT3TV8+pAa z4)57AUb!RO}9di|n&x+wQ|BFJ8TR;rQNd zhYND7uQzJ+dJnRA7iqt$+ahgJ((Bu|zxd+o&vvh0zkbJlFW!CMeRucoT+2LqYD+?H z>$EAp42$+h`)24bzVJdOF$-fXPe0v*>NfMWed@Mf`@)KktS#aO8+$!lPI81z5<`TE zY_WB*rDB73dn{Za8dqBy#k31{#zfwhu*F71dUX!A`zVR7JMzn_gBPahiXe7Vw0A}7 zMz|h9Z%vH8ULq%=V;n-Z1R9{05}qa5P@Q8F&?a07x0n2rxg{Ydc`9kP-1wf zwMH0N@wI|$*OU_+fhM=t=?V*XIw3itos0si-Uh1f1gc&Is$L1bIyE2*RtdI$GWqLPO*{8} z^wCG}ySbs?xm_|Yr>#6IOkr#_dLdAMEdT6*ZJRc2-MVqpu2cD!E?vG-;Sq>>^}#lY zfun0?%vieZlr^#4;D6AKCw2Dh+ivUKsk-I(+>b}npXAM&>G+J2W1W_>Yv#h%ZPC$T z4n5mdaAL>04N-{+VcFHG(H0$DGh-kYy}P<(PMZ4N=U4!~+gRMla5c&tBu>Dr#L*Ua zioZrGaxd^g2^O)ourY8nh1v2{oT8iF73<+Y!bUFHShV5$-0X4FmmJOQ1q|LAOs5)I zV;X)Z5N}wM*8_u*6B;!X2vj2D7RCOaPf26XHz{3z!JGxtid9%Q@B{9H-Ke0{YVtvC?Hkx0?=l%dh@!} zB)Fplq|d8twx;}Do}I`LrZ~PzN!)l*S+Pp>6VES6McHuzsd8#DWeL0IIxH4B zGly7**Q?w489F55SD?OHniEq`?^BV}bL)^FGt zUoGzN#Mt)Dx7)Y7ft zTgT=sTDoe@_=W4&yxW`Hp22tsI}-xgNfG205ab@b`%19h27+EQXm-Cpgu3MvM&n`oV`YP^v=0|A@xnQ6l4U9Jp z`I!@Yx=li{jW~Ia_-p{1!knNR^&*^hKL~-38md14IDZK^m#%;>1LseM!1>cvaNeY` zoI@S5lNC?onK@6>&B{wAPQioH^hS8)26l=pJs{P~kL80C%a)x=??c~^`%a(I8@9{n z*1dc8(p@W;6(sgJcC0Wuwb|_tX?l1 z{4pbV_vD5R%zYJDVyNqXf|=@&4HwuJ(oe2rZBCEj5)vish0qXGZ@}8-pXuWpPt&xtruA#3%Tcp-?OI7O zQPt|UZdk`W>eg@2peL^3dE{DE+6704-@R(ps?%Y2^trW1j~)>1F0EQo8udzie9OK= zh74iCj;Mr`q}Yh)@3mrS2Lag@JJ zpPv`D)i+}^-*~OY<~FQN91q_!2ulGM`Kie2NHmdoTNh16D9cVNID6*wnX~84o;ta0$&w{=f0}*f z%<0poV(Z42lo~PQ6vv)AxN>&OOIv@M`qRwWs}HwCj1dT`0C_tw2!IiQ1Z{=oBE`h4 zzqn)J#J4B?yxp>W#QRHDtl7Ap1jK(>bKV#|R#d0lQSYKcy)vOrZ2>nE$W2Pk&pC8B zfxxl)Q1{isp#>yq;+9kht{~X7*I|tWbgfPTnMeqhxIv;L;`l9CD3C)bE2L~8aax_) zA|NXfMUYhnmwzebsCWZUL08TuGPFqOCIl)Vge1#P2%aMBCs1a`wF#)I;43+cc$=|K zWrIjgG9ejA*ScWamV%=~>5*LoM@+Ft2)|^+$ZPo+*@v`BxhI(2{7Aix4Z{G~g_@8v zF8LpRymmsbnV9)Yaj=U+&H|%=KVb?jE454b5VxRauke)S0Q;kW{VZVrZ@~U@AvFAz zDjKeJN%XkVvL2`6@#9%(7xUAqIVJO=%uc#Wd1=rcThFVDu#$gn@A~z3JoJKe=X(Fn|ph4M*_VD=X)w~wX>1x@!MZ3;z^YgEj>soOc z)FuYfrCFjIwq3AptvfmY{DDpD7x-H@*|sI>^wQb0XD>Y+RdPP6db3Qz6nka0Z{EB` zi{>}pbh%N+K*|+AbpLH#x_mx&H60Jv?>N~_o2!~+Y0=>8om=ly^Lvvlda8M6-^+Ph`lxj>+x*oYxs{oK0Mi)Xhh*fnSRoOug2 zoM=a@Cm~G=IK&nvup%%c4iJl5r1csruUy^u#kemvTJ?=@Pg=Ne$?{*dU^*gUB$n0iOI z)hF~wKv?btj0KwIDX3w(2RIAyB4uTcQpTkrpb^QZydmVhq(r{y_b^Gj#Lr_(G%X%O zfba)_@IFBJ0H}CY2!!7qLfzYR_~FaXzL>sj&#BVVYh}*J#5#?7_AD*E=N_7F?mSuM zPHd5J^UXaoGDQttyy=w1U90;&0JUMeySL6O!pP_($ zv+Rs$n{QGFug$h+pL$|oMx&%;Bz(Ya@7~>)FBcb2pN09k#G?&wkNzY)Lb3N=3dxy!yX3KR7C1W!P zUPI@WvZx@5f&-bBNYx^J*?jR(B{9QGz=BkXDJdn_rnJb1tZD%A2qQE;w^&C+D4=3e z^2od-G*W;tTg)VyWq3toCUXX2!4Gs&$eo`QCNpD)&gaNFZtP;Fds-jOwN=nUgh=fv zAVsVg1EGbXU4H0UEflEKNQ`n5&HnD#Q6tApT5(LHcvkG8d0$SPIO(f7>xc>7 zy?fVg{CA}z+pZeW|L$HlwQSOYl456fZCJBfHY^u{Cr{5lvmxb@m}! zw@0Q4!xrRZI}~qH>`z!VtIc~BTlnGKhc3AzEQQC9=k9ycxE;~>MTwRt7_>2pRy*1w zH^TC81MfUZidoGGM6WTDoIt^%8c>Gg4YVFdiWtDuM;4sJUaBd2Wpg+pqrBlFK;qRA zu1Mt?1w8n9q_9S|)NocRnhXXAK{-qx6|+SuCEl2xit$2;h(|#kRg6+JY5V~`F>Db7 z&dpLT!3uJ1+#qredCnhoy5*3SP~=XPvm`4=z+X^{&j30`DHovPEB-KXcS4Y9bW()z zJqC@#^neOYGmjiu1yjoG19Wu-y4nL>9f7XU%86}5IIU}PFgUrv#EA`TS?I0YJa2wE zXXODxyRPJ&?@rMh3Eq|4tFHIIpR?f-DGHw%*7fV#w8?b^HcOi1H_J_$LnOQ(dz2$= z#lsJ;m`1&;4sm4%r;o|Pi1d2!^(db&tp;risz>N$$Cv*wO}k`RTen`mJlEAE>){H* zqI*)CNXQRs!j@tC5Dl57*3Oe{WywE#8=F3mt+xfeq`o=>Wf-8E@%r(=<+m#W!q^$L z955I;tZ{B<(BYO;*YJpl*!bwEh;X+n)>3Xo{|Ci`!8at9f|H50k(fs>bfH{!v7of< z8U+&!(Lr*kgUfehNHW2IHi1=NlufKa!U5?}BgzhvVre#>5tlo}I@5!FxSf3vU%%uQ zhvr(`8iM8Zt6`QLIWj!FMh$|NCrzEZbXRdSo`m>#UVie)lo^Yc?zk420$y8pckH-( zMC_sYQzlNF`1NlQx&F+Vc6+a0GiT=Hq@*OrISbBinfgvnPEKwvFO!pF?N`ojoBm<0 z)BwxcvL(x3fvk^$tV4c}tWjx_2qyq4m?|=Y9ExLG?IQ~FOW!o^z#8~C)d0FwU}yUZ z>}*VjIKfYUFzG|IASwE5q*YLJ0zSP`y}?U5xTGCMV%@;XLA4Jb%Q=!PdcjAs2|>cZ zm{{`vIVIa;&VbFe+9{2~E|IgNu#RN0;?iPbIf-}@%#y7Fg$$#%czgxLM1+y+P(%Vu zmNz7noll52#o3N{st`&Q>~bmn!Ms`%p-j$x8#~!2-K@YTwViusRQd024%x}3rMB1_ zqLS5!wUwUVze5Pa@g;&OuPq*5nauuMMh{&(pP9pA!{m_@>Qw0Udcn(zsmor2TvX* zg=#1%2=@ga9MhEbQlb%xjPj+6Dv!}tf_J6cr@4TNJG&$ha1`}9gx>R!g<8srnxci% z3zs8@*a<_ykWrgYMAcxI)n2Pd5y3cQvCvYqQbrS5PY!spgf+`9Ql?bcu#{q}7z{m2 z_;PjbWs6xP5e?;6FnEz8b4I&@Xy?+Somy|Sih}gB0E~g_-Q3xmD|WUuINFn)?GPff zbqS%BO-q|RLfes7UQ)B<&K8}L&XF8rE4_LSL9Vp)*phE1aD2D&lwj(_NlVUug!T53 zM}`g^dRMzx!+L)04-@^etFi$cLQE8QlnazANK7fGejr~T+C1gL{;l+Qp~l%APd`1h zMKkMj&o%TKdRS`1TwHTw-+ucGL%;Dk30;6CDY$T&qv~q8=J<0)2=RR-_-go@a{}w8 zefakKpDws|VWshY(@K91n8|+9`a@!3g%1G~*lyTc9>H9S@DW;PN;Mx#$qd;9qSZ0kr|I&2G9ZU$SZsX{vWiKz!zeK26; zeCV>BxNWvBn{B2BtIZJNo8zQ89O2{+bI-c4XX3e)dYB#9vxXsi)+q!Vso79k+Oy~4 z#XqmydA`J*-lAiN_AOfeAkBCe@4QqJ(^{+|KI?TUdQu2SLyE2?MPKL5Bgmy!yCm0{ z1>;A(_137-4I4IS*syl>aMz^`3y_(8*6T9zla(^EC)KYa7a>U^-pEzjv8P!h=l(G1 z7I02lXg&bxyakkdHTY&Qb4(f?XE@B>9a0z*y6JR=t9qDT5;=5(#8n^Af|RT9rb5b< z)3EgBmLlw0K_1wc$iY~3v4$Z+$O68h#4O@oZ~=>~iU6Vn4Z#@+dNz2^XRQ=irK=Gg z_)LLS*9S(Q3S!m|oH<(>-=LMO zxMj$YoEYUHo4&C)uFg$;ZqKL_7wOVRO1*HIkzj`WnTTQ0<4Z~=v?U(>)HmbDPxzER z4^6Z)-%q^ii+H<{)+qD2=Q0xl`!;RbM+#F^8kA0crX+t^d8?H|=DKIqk{)2gBapb~ zU|SDB^+t_bk`Wv*hME{+qlQzl`fBAd!BZ9kUWF$Li#(a0=F&%-D-X$GMP+uHWu$~z zRv@uCZL2-13=|L=#J?2nqX-<8OSq;Ag34<9`Ej<4kjuKGN3bc}Rq!sKRmpf!;_VU5 zh~Q?~PV(JkQA`Q%9rj}c7|;_8cqU!bo(RE!dqb#}ogyIln&}D zfB$vsHg4N@=-Amy_$KpCoxKDN%j4;#v&RnY*}QID|Nd>YL$i&p6+io%ecXopOXNL8 z<>j&b&1&d*+h>@ks!1ggfG4!)^Z*s#GL zG5PZ4{Ur@<#%_3X!_q^uBt8&Fe+|6yr;Z%jy=Ey-ZqXme;Scg$V;L)N0gWBM5RN-m?tyWDL6;CY>AP9>tb{Byf zUYjSh)&%e{o=8x2nS?fBn!rv-x`KcZ@0XRA5WgnoNCwRo(#^>LNNJD_xEjLN$$gQe zL=(hiDbmtI}FHDk@`!9tZCvdiQole-ymCHw5nnh2UMA*|R%#cV({O1Do|A^``KQoF5m ziorA}CQ5Z_hS`vb;TTk5i(n0hU=NU+g0KR?mLN}LM)F7m5jey)9xU|<_{NJTQ>CDp z6)`{-K~n>dt3pLJu3U;j7KT%MmcxgozLeZvwY@QS z<6&02i4kclgTC7iU%7Jl^i@hjobyMYKYzNY=rTF2M~>{;z3%WK#2HJ_jpUVYIP&$F zI)Te){L#mcuV21=zf%h6Ups%f)Tym8-jl`#>SAS+JW#N3I#m)&66s-~@Tmb*0qQxJ zUt(D-R>|-#5gCwc6;~k{s!#@tMh_9Hoe1F-nTJOtPNEG*h|RtOY#*<==c8pH3y%Q?^G_%pI!4t`Jz?s{(Ocf8J0)52e7!a$X!tG3Jf!v^?!4$@N~1DtwhHDJ`UHF!AzIJ z3pB<4U}j=|C@IO)k7LNGdufI~x4xEzejEt)%hp|14-l&9rCO;j#MFg8=>)|%SG&u`lzUnOS+3RN^vxw+kDz>HnYnO+Rm}0wlUQo_U zGD8n%=9C-V>K1y?Q7_{hLM!#|}--m=-t?d8-Hx6mAhuysqhloLlUARd>h zq!>rl-llV2?5=c%k-i+7mJmXblB(8F!(d>$wtJ~$!u`|c_xrW449}oGx3};F>Nmfo z_aHwKwl|?he3w43H0=??bHo#skPsJMEx~cbFChd%M(x%sWGNTqs^UZ#B9NA7%VBsh z?ueZSF~;Vn2&2$-${C1e8la*J7Ttg*zI@(9I0dE%R)*y81|-;oPy|3NxnlK_xr)RP z+L9b{6=C@7KL2HRYBKSJT!GJ(SiRi?Ph@ngk(3igY)Hp8H^f+FQUm#D|Bj6tx9-`z z`EU;21~EC=E|GP5)>f+UIu!$QzJ9|&V$p*0LAvS|oT z!Y;S~Njnhl6THpD3i7r!>YSVM z)tdRe4-XxB_nr4NPfwzLw-l%GbiH``$dME0j~~0z)n9oH*Yxl}Q4Z}+ge9}&=tvmq za78+?X+yBVbhTT^(a3$s6-4L*E9M2zH;s$-d$0pBf37uX{nzzRWd6w^>z_FIIwopi z@s!mYGivi`XM8;CZ@7|bbj*0-fp*ms{bAS82|G5V0{*pYRL3@4hc|EDvvuRf9s8NP z;4nf$>G>-Kl<8#N0E|u9uP7|&vkPo6adGK0Cqp)aJRBE*qc$K2RLL*c1FnPM9!>Yr zF@V%c6T=1f{+kLtT0XTWd>O%Xgx6qg*7zeM*J?RNejyKDvqq292oIMYjOYH%=#b*d(JQOaBtrw6vGOfKRz9>EiYEkex(7+N;1-J; z<`(;yQIt(Ys7N#7FT_{B@yWm4-Zib-g^;Iy50G{L{f{Wf>aKmMP2u)2b>7C?A02T2 z{r5A~sYZOl#WP0^A3t~G$d!bUr~U-;ol0~EyxnswUY5R$rW^19+Tj*X@YQup0v5WPWRw6d~nq#W$1L z6cwEpgdLgCSdAG}OSfu~%pj5(M275WRMiX=NDEn!Cu$WPKeiGR*@x6&|Sq$|0H%A`Yy<+1T^0 z_kuybkfdb}u2?i+iy!hPQaryEU0B}oIk4*x#G;vNT$$zapK5YhYn`VMY_9I?43Lip z5la?PGm)S%hm@YfCCFmsLTmV|us}<`tz_%`yWF4GeF&n5F5iDhMpLxyP9^z=K1bt9i)p}M_g9d<`L7r58(dg^xV+O@9d!lq4|E`UN7 z+GpAFuVo8Y21{*L^f!_kH5(&?ZZ=>h#MZ(9W$kb7FF=- zA2nTD27LdW*?-9FUkRE0yCG22rFrw_jnm>>)SST;>xxTj)O_E*eW$dz`dx10$fzHu zpWdgw6B~is3HwU~osZOag0b?QmVBvRtmX7RvTX^!Y*sssqjs}S8JRaRqBXT;_XosT z^FX(jH5|oPueNBR-E6$)$ltzX$&ziC4M${?%*@Otk?%P!t9Q_%;#%@f%ebm{JQeT6 z#a+Ja&&&}0i8TZC1lVA%PzG^$@wDRLLwEyADFQ>~`|3@3p?9fC*Y=y5)~Q)@;J`W; zFJ3HZJMc<;Qc|3~=n7}g@QpVW`}J9UgY@&6$A&4NjR z3xQ+QH%{VtD}4SbM2uV|24Ik7%bv{OV}WB+JG7_Ihb)Nr<-ubB&FbXAQH)|^P04|vg!jFwbQEjX8lZY5WMFjQ{DkDsQZ=nUF6C*6uVGES+ zN&<{b6P`$WgyTtZ1Uc}Cmb{6`5)6zGc!7T8GJxR_@rs>k+XhdJT}~?}7dNMk<&YQZ z9ZnA80ghM-IkEXIiyk8e39&9JIg_Dy;ZKz@6-pvW3k6kzoA_sx7blm?vRet1C=Cop zLdQ3ulNTgUk&|4YEnj0sN>{+Br6odlgfmG6_fRQ2E`;t_=DnY7d4HZCrO#amy)UG@ zkK66HH0owp&vt8cHe0J>xDW2%zyIL=ef#$B_j^|tS*_cPR&Qq~R~e&8@GspylDppPc z9<_*&x&Edfb zbM;=BJMy)B{V-a&edbJ5>jlOLomOYc5F*khfjL&xyYdPe^FO@4ITE953(kyPrP(-- zmTy~B77;d)0QYU%Uio!{4$yU56+Egp9 zuVu*fg=$j?1ckUuBg^(Lna8ns!>O`JO^>Yus@bi9GsU&rBGW~@n&m>lI5_$pUlxZ!D_)QyEELk-FtIubw*|=%%=_|!$$BrC1 zu+uN)^{yS;we`RSVvdXQPw(Bj>+r=A3$o(41jq;5f(ae@N)9qI(0WlN_`?+hTO#H| zf;Ys0#4f18M2f6DBsdnEI^wfiJ&0YKbbGPFz)(PRsRAmW3*+H1D3HJdl+B2Tdtgwf zJswY(h6;-(i1uIBuqA8QnsKqP#c`dnPH;#|C_6U z5=Y~EUSl~!bWDPfN+H?5Gv9jWe2RCh8 zyWqPozM8-A=cTLs37qEGHQia3hhhB4$xAf1D?WR0w^~C{3n7V$Eee}d{y!{~h7Wd& z4-NZ_EDll;G6$p^qYvy*mRAm90O`tyI%0_76okWz<|p!jUs2dj1VFy)G6!dLR1tHz z9m$WU!X)Xk}uW3xVH1+y)7`zU9<&Jr)*BiWzqaI9MgM@Lk0cqQ^ShDAAi_Wb2?JEc7Y zdhGT$-8S3yEt~KW?aRlSr=$%@pF;xj(vJw6<=F{eZP+*QEva%U@~h-%Sah#lldMl7 zN(eLYf%bl7VNs<}Su)lU$AIjtZ|GIvH zk0K%c(e;P+wllQ-NRI%H4XKZZsUj~qO?e4hkAd6;Nj165e?R72bIg2m%mp$Ib|jI( z)R@-)H)GEE*D+oHe#|ypdkZix3CwE&<~0~>S&C0Z9W64dXi>G_aKq(Cs+eKDnqhJ6 zZ_cE?)tImc8r7;>`}EW)7fP!&YT>W;8)o?bu=XB+QB~^#?w;P#3n`G0(0dU?K#_zl z0``J>6tRm1J$gLeW67Qwiii~}O;A8Y6c7ZYw}2ug^eRaxp@$UGliBb4*8~~8o_FuL z@9oKy%7zYi95h}|!v{;04p-<2@5rm=XoYKlaL7pgPA~MS1mxQXxmy*)0nSN(~d?OSc zN*~7s(dw$If<{L<52{xE+J??qM`o&h#=n`fAonvhQrxdsns(7JE(r4rZ`1L{E-~7V zD=Rv7Xxn*2CY@tGwGO(WX0b-A`n*RBoA3yyAGyY{A=u8k@`xNP3KbsmpAF`Mh2&p+4J z%wM|n^C>eItQ|*qQM22qrf_SMjZWvrpCclE_E|c4JRSRLbF_J+GwN}@TBJwQpN29U zv2FU_dh3=gr()aQoT=gKat#?06C+QpC8vGi1+8PNoBF;mdT?5jBn}wmrw$!j{{@{# zzCG5}>FnAz5NI1Lh{bea)WCQk;)7UI&D7A=Y{n?ZZ-)+^F3vx-DwEc;uh^%~TQS2r z!%A=EkAkT#vJ3zztWj(bV(~CH2n%>5TM-!!rPCuk+Zk{MT-Zff4FSo3&#A;d(xIsP zAxF#Q1a5A?4Lf zYDvq&%bM#V;_&q8UU6Wlu^y`;KLO zwD*k??S0eY3`@5g6Vv#qCA%EWs_#T0XEK}n8_n^>%9D~a=2L~IGO0V$Wr8~<5EBS@ zI89DR6uO9+{t-^yRHeBqO_io9lGtl&D=jh~I)#TwKhcnjB#uS$hh&z~`^kkD6A>ht zmT{MST6EB}_aNhah4J1E4IKnrhgMg=_3C)Fjwfc$JYnhk+;h+MweYc7vlEANDaw#{ zc;m(f4U#B$^X0OQzy5q6H#e`g#+{Uets<;dD-7(vX>o0bjU*o^-WCy;+_aT;&pld7 zO2y7O95U&n%1W=fro7zev32ZdJGgSys#Plw+EiV8*O4Q(`2M3tjp`qtsZH0Wn}-ii z9jp=_muho0>EQE&HXE#%t4(se{?A+6q^8md)U{?!-@biYYiD;%sjoBZkFUOT_UJEb zv{|z>yZx?*pML78ryhC4W%imQ(%blK>q|=3&wHnjq>UJFy55<$UP6x6&n22!RZ};O zn|qhhn#VtRNO+z+1{u9b4(g1du({Ec@+8+#Acq3S{C;m%hLNH#QnhwKD`or=)DVLz zVy4BMK-3AAD@Op!AElD)k>MnZVEpr-l>xaH3dMm-5*&vZ?@dY+cOZX)Z2SqRDZDeA z6A{oUBu#WX2E0m@Mxwf;)mDSV{DN*I0xYVL2(a+>U~L>hvmmyr6V)SL5+}zRj&Bv& zR<4ZUO>TiR*lUS>s;w&bx(TeVB1@B?A(I#1i_!(I$O->rY#m)kcIh|^@7M0cS-}`+ z?itvpOX!>GDp?ckDhckgmq;~zfy&2#%Ikp2USMIb5G)Ms8xl8Ykjo{{K*S@-?v=BS zRdj20&&wIwLTj7U^F43P&_1^exP~gluKYfI@*_u&j?~8K+AF%|_i2;()3ulUnOcsP zV{*H%yi;+|+^X%}{j@TT5G5^Nd*9mr&fX=b`VxNf4UqV?wNu5umy|bRpjN7#<56nr zZR*COcUDGVKJg__>KTFQzKp;uo-_IXaepSAaT=N;BGh|WL`2Sp&)=W6rFzen9LpfG zAnwBQ+?+7&_l(DR9cg}BdVIFlXHrE!5RfM=WrUtusgcNwn;0f(RD$U*3&7Gb`-;GY zlT53jvyl%2m}d1irWhcuJR+n-fDoe|1qk44!qtEd4sh|mDvB>cp&a7_1m!Gs{>GJ+ zh9S>dO4U>mRm?#u8?~;Q2KTkBmn$MHEFvZ{GKTyrEk+lTQs|?=uNG79CmhHcJ}GMm zCGEo+_735gp}7vtQfGht^{g+y{IW%h775y^Lz5?`ZoK~b<;yGVZ9wLA>(*_^&eo3U z-Y}!)a$!Zqh2)zbA{W{RC{CL;ZO(x>-4YXKGx@dsL$zX4f~m8qgQ@%=dW4TBXqOdC=b&E>Jg>QFm=!}OxJLo%EC((@$qE^o8}OW;d5NL zKz!m5n(tX$F)>a*c|riN2vvfSf|FumuUb6YOP0TN%*4+YQ)%~k(~tA}v#>*<4BdI{ z{9%mYB+Q!)r=M!RWj8!}q>ur@sc_jmQkD)Bu;Wq|vf)FIXThj%t+UEw<6@P}BlKK2 zwHVN#7FjV;>l$&7^&u8foKe+PBF&2wQ-^v_=@!M2<6^mG#b?!Bi!X!!W2s*u$Jc6v z+*C<*o|-_FH0m&EwUzW&G;mR1UPC!hc=<4E`Z#Oan>D=&ZgEq{nubb2jf9MxFRDiR z!t{(@Z_)x)m(FuXwYdu>_Qe6C9$^!|&t13f>{)qg$Mq=5ToO6gsH-e2NQrY<{P74x zPdxFrn>wTv99T8`^8<|<9XQpd%_(2QTl#fqc731|(p@ww+1I6Oq(Qp>M-pljh_)HpNykh@w_L-xb=FooQc^?08zV+c( z`*J^Ved3~Y;-{*#q!4X9A;H7N8!6MDK=mDoVdQjHBoY_(&K+U|bRjE2wsBYDBo^N? zv7aozWXG}U>LhR#_;@|^H4wjzh&q4?C@L}6%0mtS={D#-zvymw1rSOyG!+SySi}X! zOJKHacmZ4(-`T_luk${JJXV)$j4ID&jE%3)Xku^b#JWVP5UNoxEe!!4GSe(nGz@l~ zZ5sj)*M&$AnZ`h4pvmP@@5wILPk#STM;zn{I*$C5mF4mLv|uV_f2S>k>~`(4v$KzxV>{l78`N)e#^66~SKl{Q@h%ZOxnuQ=OLM2W-7VY@1@~*m+;QzQ zGTO(rbFbKNAa`-|=4W=Sea~kr*|B~7VoepnhUbY{hc{mO7z2^G23jI!Um((cq-FN0 z!r6VvDjaT1H12*+axw+q)Dj9fa745SWP-aABxblHB59z4Ng8yO&~vL7PfK{1f*nBs zrr#P?ZYrlX21}$>RaQ`9K*Ti!IRXhZRX&?r5m@0$T*@3}H|#8%+@_EiBsVv%I$E9+ zl2=7jCdy}ML7cpeH5dd=w$QBbO-<_`!YeaF)_}y6m`TwUkN)emT_+95&FLTKw2PkO zBc9qpyqs_Hsue2)F(=_8?VCk_NYw70J$Gw0RHfK&ifk`S;B{C$(al<>q?mQO1N)O2 z#@5-F)zuYko1*Lb)SU8~@bW-(YHDidr!%xK9Ycqv#GS-^s@qD|tSQk}dL3oQ_pO~l zW`x&KTXDItByR;#9ox3~n~a;_cFek5c6Q%N^2*m7Ew-DBkNh-y_Uy&G&Q6&kKWZQ7 zvzmkvaHG}M2sL4|+X5OHc4X_*2bw;=;nYG3haD2e<_SVJnjHIz{L8%h;gNpAD@}Te z5|CIZHmDM2Vm4LDN2p-69wp!{ia0Sn$^%*FrFx;l6|Y3ZsJ6wN6C4!!8w5Z4L0Gvr z(N5si*a^{aC=_dP)|hI!dM$l{rJfr+n&1^hNk#7N!>UOy^gl~D*Jb>!XK2z6`8M;B zBg+TU4Ot!{Yz{+W_=oAIBbmI9vb;BM`SMIMV|$wt6Vru(97wmoM|(sR?H zef8CnU-s`Iz1e#7{*%9EW?(28>`NUyc>esuufP8K3l9w&tolbdb zqjaCMygb4~R*;yA3FjZwJfgw5r-=PBC!S}OKlP=aI#pQs2?bFmFWhzN^o7DxyO+%T z#@9HyBrJFjeGbTFH<05ZR5^`Oxh=@Qyo)RjpDtxFZ*TY5bG>qy1QY>1j zFI6gYV8|y?T2{$Ws|Ck1ndFJGs|y+bg|Z1&LD@3lbiG5cDs+9)58QX(eYa({@l+lA zNh%;h(_)=p&{#p2y(`0sqt zW$1EQ>7{dL#?d4MXr<_K+!qyY`Z*8vpdU;Oe4SJeiBInKaMxO8iY}LfoSK!(m-enXz0ifr2iOz zwxAw6$r`dr*(;QBWlkBVI(=aQ;L_v5gZLEWKseYqjI)UFQNn9W+4B}M54q&}m zi@vOd^sBg*wFu1z>=HuZJPTZ|1^Y~~v9WbI3#2XZKO@cN1+z(Zf9vBpD^_3u_*xHB zOeN16)#)B#DlSK4RHIhy;$MF~-sj0kPro*$|Xdu?R@ zOmxmKE$Qjnn|jz{7)tZl!ko=tBQ^M4CBNnTymGPa1ZW;nOOjU3VHY!FS#8IZqfZeI1f_k62Qly9iCh4OhyCNq#U@J5ftgi6l zL8`6@Qm8kX^$E=SaAsYy{zioG_J4#>sNOC2>^X4aQZ+=bqN1+)(usq6_Oxv2x%AtL zuh^C!x#Vuyy?ghrtx}?aPEs$TQ(ASQ9plL&S4yWrq`Thbxv5i%r}$(+0kbPb2XKeI z?ee6wYSk%I0-WF<65zD+--I>w-aw0SYuV|ezsYvG%oY_HxnaZMGJE5;Y^nCL!yEGQ z^71d#c;Z#6pr__SULI{VTF2Iu9+D71&#p5yVNE-Phl6TVE1-UZ<84=UX-Ub^4I4J> zCD1CW9dS%)rtvAvz1pq>D@B{MqP?$B!vRVijNh^=J(j4 ztZ2C~(8rm?M=7^Y^gLgvO`2mtOM>=0`9QX?6j_&z>jiY1NTN_}*_-edShV8bh`U1R zEtBj>=xEAjYBi}}*aMre;<+P$=of+LR3Q3xAo_+7h`u)jqB|87RK>UK%+?~N{M5dc zbEdG({BG@mf`T%4l0@k>aFm=nxRDk|-+i}u-F}UL+Rw(cBvbCnR#94RqG8{(Y4bN1 zR1`Wp+;sQdcMoiDFVw0JF8<8dsZE=@H6MG~K3bAr8`J&vhuLoHY{{N6W7&ZV1SFSN z)R>*|&Dv9Kr&Grc?X>O~3MbRcb+GYBgSTfBs5<}455|w1vGsyACMG4Na?_-7;|Ccp zkmEgopf-672AW>6ymiMTuVqrzZ?X?r6gLIHNL^Z7uVHhJESfX*vl8dbwOe*gnuu`- z!=SJPSrR34qL|3Sn5;=uTeeyq(!~!$rJ7@U;Ssh*+BT`jYC~rYS54AI&rs^76w`p2 z0A>O>aw4o?F>nP<;6v6?3=)6~)&???HB6PF>+&7dG~_OPDl9MvBMQK|bt*>7=9A1k zp;zeqo-r-UD^X#gfKn+-3c#sR8vIjPc3C!lr-qo@Q?Id%1O}c32D$+QV(%Ol0t2^) z@DkI}qk2aWrtU)i{>|7WS7qaIC1e~2deY)Uy?$JY1dHm4P+~WnOm{Fw2a`9k>x%>IGj-WMZ1D~S3Yj1m=6rdHFE5bbtGM8}e? zi47A=5G9T*jyk6`Dod*yqk=j_5yEVMnYxC`+(FQ~!tm_WjZkogYLiqUGF^4GfPJ~D z@?BL)0x=Hx3UpQzh~)!Jy9)*=KlT8B`F1}$2IhnJNlCSDBh zV6j9;*VLq@5;t^A&!WbS*2AZ5^dX4rJpIy7RqjpQAGa9Z_U>*YTR%IX{iE03W{r#S ztgEixR87!&^>2aS^h|06jCQ>B;r#hO{wOx-7mX*3C!8BM9y@mWG`dKJ@v#0`3^)b$ zNl-mSgqTCI@CREaVE!Yk$H&!lo_@TDiYdsn(Bd88PN=g`(;8a4Yi81yFbl=;r6Q~K z24ASTU|5!@DcBLIUBs-5){`aKSCShi(Rfbq#(5Q2;2WuKb4^W|7X|CG7q4b2qXvzG z@4?yqJu-{gmB=h-##O&#NMx2~Z4h39--O8W{w=ij#GG3Wk74W`RgAffsCItA8&u7^ zL~t8dV$QFeKkR=xe+wiZH%DJ^rE77-w_jeJVLX|YVMNFkEH0`8aRsd1>Iz~xyK)7( ziW4<&A*wByc@a7ScL;n~otBf@Ib91MV~t9M4(eJM0iqjdHo{f7Viqb8swyG1M6}gN zM~y5Cnl1a8{uHDCS62$1D{~|5ginhcV~M)43kK;Q;gn-c6}z!Ra;0>cA+wViQ&%!- zWJJ(dQ9xc{T*%Uk@3P+1dZU`e0M@X=56_@$As9EmE4cYUuH# zwu!DTla@?IO*thlX>Uj-oja^N@5c}NN}XYO*gyC&w>-MDzovVR}kjT&EsQYLESjjd|10TVmppv0b$2d~N&G)Z`eq z)tic-0T&C8iJLoj$Z<#YuYG#aP!rnEWnTh@& zhkH2{1dHaC&@j6y>nElDDE=oVL6>N}uuv9H_^>E!iY{6#zGhA9NfzT#H^Qj+AVU*7CKrZRTO<@*u!FAKWH+&i z1Q{mh5-u)ht<8!wLpm^c)zLf;fsR_S^o+*0qzqbUABY24DeCHSeKEGE+u^KA){`68 zr7FML44=9>_fK#ZJLvEQUqiUPjV4Z_gCYgg%csHnHjklkm=Z8e=#^q6Wf~>vok(p7 zBCo2K2vCoR7!Tq#ah94VgfhimrE>KVs~N`q=G<|f4C4uN_Q-5qvuBb-HOW*}V%{=! z3pD&OZ2yH7sCa&Bw98>a)v^S1Yh_KHR*6<-)@@eh#I_=bX?6%eWqpoc8}355Ph+S{ z3+|#t$XzrG!9_=2-ij5Z)|Y0|rQ>1e($dn?rKL-?Ts>mCVN3^Ku(%t>RP!S=0~E+% z3V0%Y-I)I7KZXs<&}N!1F1nbh&D5~_J~K(94XQJ|iW?tp3|9u)M~p}C-GBKdRcYqC z-8M~{Bz+VUMoz3$9map56dMb1K6aL?jv58Jn1|}5m98?@)abAQ_>7n~g^yTt%-F)b z0Y5&B!NLYu;M1}Iaw7JL>&dCxoKkJjpw*&uk`8QDruJa<>OFn_o7njc2`P zhq*qW*QgcU7fY@A_sr&w%zPWxzX3C!#>}UM%zS9Jl4%b;h@&Z@^eu|~t%%oaE|{^l z&{7;~+eIAj$j6H*54X6%;>8VoMD$Y*YtiVK2inH%2`eibI#l~m7ZK59I`%71Vku0= zrdYn$07Bjn;E~0cV=a;Yu-2ZiEUnGh; zNrqVck!Y~`SHeGhthH_xyD~i7=?Fs&B&ZTCkJxIG=mLIW{p?s7)Q9#n@@Ok*h@_^i=ggV2=;urBw!>*YuUp=H_0>0d zZ~W4|ZQX^xESfWL;J{(`KJvtqk3aUvqfb2X=%bH6`P37S4j(qKzqVC9*5Oa}hCeYN zv9_p$=;5N8!~swAg~@z_X>x0p_Ofm*_qgeEZmFxPsL?HsFt^Pc5vZ#0lwaDtWcu{! z8%h!z>JbI!B5xcya^#Q>F`jb5IlLIk!yLMWGOKmo2x?@Pdty2aVTT(d&lTvdhKVH` zICRPGOTGlePQ#hlJiU4Qo&yFC9?-KxvnI_GokmR`ZM-~U-*|f14ejDgrKgV{KV52$ z?{LGgQAGNV_fVPimi}E^v~HOiW25w6bZUz>Ev_9f?6!>?H|{uI7n$1ars0o0{q$qQ z2X}8AS(m?Kqn1hNMUB;E^Y(~t-abW(EkAy$6uhMMM~y8h^O09xd1chyH>AaCrF(yz zOz)LxYYJ*?{Kzh)r;eA$YANlTM|+bga%-z8STl`1CjYp%REtf!;qFl!`$%Szj~)?wi z3G59N0OY+$jd~2*!>!c3j1KGy97Z>Y=JPPf#DhHL+f844DR_@|fJ}-Hliuju0r1yb zu_RcLkRJJl%Zf3=29FO9lSUI_n_yF=YUv6OO|Iu|;&@^c`>@!;q*5ay4e_`_#(b)_ zIni3eF%VHgKOw8TOgG2GxV$izuV#XltBYe=BsskU_ba+~RY`s4lecY*dG?y$AHaG2{9nk39RV_PB1oy=T0aGV!CHMm&4$ zzS~a~;u~Q5ke&Or!|bER5D=%2Y$(3@#E4J8-LkbP*{is z=PRk3AWUAsl}fCU z;3u&cXlM?WM#(`Uz3?m2ivnX>9tfNOjlWy)MPl(Qp$8BW9*Xi!=mU)<)v8H_1HYq6 zb(|kVE5izgAkcfqn>*X^BO4PjY~*K zpv7yGCh6(Y1UfyP${V0SBI-Q=&{Vc2P1u3mxW0kX++|NxqyR@)uma(ZoLyJ8-8oQ< zE1S!?Z3lV3Y$O5f^ijT#8VhO=4k-*N<3Tfq8kln?^fg{48t+--CHq@P&DMo8CratJ z(Z=)UWxLK0p7AlYoLM>c<{(M!WRs6_5@@J3Tv~TnDWv9*KswqWvp!@Ih;iO-azw(B z6~z(9u83RWgrZ<1V53QRh%&V~6)I*fBNfee8;)uU`)SFC!12p;wfU}Z3yDl6;lxy>0{6UG+H*qSi5^pLToh0vkM z?^9CT?v(F&!h<4UE7tx8hW)*3hPK*q=ZN(F(+p#pFY>=yw=O7X{ZF24+p?Ti-5v8( z)505nPAlmXaj&l3>x;xT>2Tr)%7HLT@I~J7)(swPl)UG}&IA_F zYrdNvpyqG1yT?Ztt{EKmx~tO)=jU;!9%y;bagnF-j%I0Z=u+^{cw>B+YxA0Qf%U7i zH;vu6c@4GsEUU9MpFSy?L_C{aN_{{+ZEib-Cpa^aIXEgc%XpkXps`Y2f$bVqRlrLF zP;!>hcE*d)A_d3*V`((1BoZ(2kZv6-P{nxVmyn!7u`Efo2dU}d4jE&pWyyT}Gf2?{qhWOehbjTEd*mBn*j9SKWlP)McvncMP;Cx+)Z~Y&uJDT&gFZ3~4 z%+nLRndY-f&&vNciRk;i8!VKY_&zlgotcRnn29u2T)M%ghs;Eqt1F=;FQk5Gx^^xv z??}nX!efUPE-Wr?(&X!}+qBVE>AJa9Lzma%wm$PRRn_}TX!UroJ ziuShajeq>@)z@D8``?R;GquCoVKa{H3~esQuGw2m8FS0Wlkj1GCGpYYlTHxOeQe9J z?`d%N**D97J#pg4A6>3-}I6_Byv!;sy|3MCXKV z_{3i%l0Q($u7vDUa2edLk>YPe8`j}1mqlXL02IiK%}X-_u_Ix3>uHHn$&0-m%BnYGaD*G7{lpJn-N?Z(BQO<3{kuRqM6K50^T_=E|+{%W&n zGwSCJu~vKNL1F;zy}p&-bk9A0$NlTquRj`f&7giv-AY=hj?><8yn63_58Qu$T3ROm z|70CFFeiuU8_y|r=a+fIJ*lm}n1V~_>vg-eR;_f?tXcksGKqQH*DU?&{ju+S{==HB zhfkb%@4c~OWh#Zt=+ia3H%=sKcUT1V!EvNv(zixLI2>Zg*U?9OzzInT0+tk`W@f~X zfR@4(si|Z#Jy^U%prj$RR-NS_a2g^cN)h};Ee)iK?}Vi=w+JXqvkx|8_z6k_ha{W^ zi;bBaf-1j)$orYwzcaUkz)k595*n@h2j8g7t?lHF?K^hl{IYHJqAw;*YTlgeOajVk zk7Tb{@#FS2zbs!Ya}8tHu{(TPKi^>{W8`DO=>|}}e*wGkvH-g;)VUfoYT2g8b(y!{ ze}AuDIXM|jd|Fysk7tHxA8B*6&Due%2P?HD+GNrJSQTxdw$Rj}L#8RwlxTkA4c4cC zOBP(J_J-BgusD+^&);4Ee0%=_&1(Biv;;lJxK7Y-EZx$|Jb9lCE z?0Z9u2he*v;i(rr_sEC3fmR1 z>5P%(ZvKB30BWN^DSaxWAri5l2o9kN^2EB@C<00VwFrxdij4^OgoOh(Zg*^~#{)Hs zQ53`P!GRv67a+CwFKI|p;#E*mFr|QAZqlqb_#K?8tLSlo7nU|f0M%8Ha@CWVdLq-} z-vgFXQltkQ&PD}V90ExF8_@bUBq>Pmp9aGI0fgNEgxvv6x+4U_9th!*_F1!RwqrR2 zNQ^K>#2!C>^;YiYcq)$g&29l ziRrjw_{fnX@4CK~Vyk+@U*;*<8aB+yY4~&>?F)@O0(6N+-COmzg$O_>*S@+;x-GtI zzWL^e!SXAQ&$UU~H0>)g5GM24?|Am9KFR1G_j6U~k>>)5^;5UBUcnNjPXFT_D zqlO$Se?pS@z(+WVK&hP4ZP)Cc2sk*frbn2p5q7cB@fYTz<^&lCa3B#ZEjm?Ol;Mq@ zQw@`Ypd;siWD2beo>5p-GM@W7GAB{ipeI#z64Xa%pLl1g>2*ZsO1_73)n_MhaxsfR zKkM%j(i^-v-s;cG`BQKpq4$aeE?0ws$xdQh;b5sOm2OiOD-7ZmEeK0_ z9Gnj<d+gwKE4zx!t(Wy_x2)1}t%@V6#@v-`Bw-l?CqLBBC2CEa%X(BWO1C`7+4zwpeN z>R7m*n}W%u(ULS*P*Ax2Ya&1=O{yvf$7(NMJXacfP0#DE>(s7ovv{XBA)*l_fo>l; za^x*tS~ap39^SKe|Dhu%imScu^EuhsOQeU-id%?xAX z_T0iia@)3(CVjX6VnQ$4eh#=H)qJiNTuStmpECJ` z3LDhU8-!WHIczDYU{0%+Qd`|!PcftKh@90Aap?C_W zJ($?&o;>>SxCzGnl<`j+M)dJx{dXBLJn($+i|o-8=H9|cBUvkkdSGEj6rUPHoz=13 z-g#&IXG^nlOMu_9f}D*DJ{mLT-FGMduyNlx!iHgkA*3_eo%#X}SAFnO|xZc|fMPF{d)VjM;c zPvhp9?`tA+t>`{g7TLHZp>0*nXHvX)O^6i6D5cdf z1R=sW{@A<;LKanC1N%c>Np!wgB7?<$C?^#3vzUBY648?gRZN5`N@dm#S2-%CRdzxx zxw=I)N{Wb#SALE^zm$DU$CSU=E`LnJpuai~q3D0Hee|F0t+bZj+nwOW5kks^=o;`aemh727KQ1m@D?fbzGxN4x$3B!oVvF>Mbq7yYy5p~*^=hYt zgebe$;fRb&jEhcK!R6V9OMt>Acz;(c|brN09Kvs039VF07C$h#f6+N7>f~AwWZL*YsSzzk{9C0FD+yvack93i>^fG&*I-VJ#Jxi%%Wy+qZ9*=*tIxB-3d2(gUSYUHWpfmVnu5hY&l>fy!!cY;~o( z%+-bFlwDk9?#k^87cSgh>1$4$P=he1wOZmZs;$njgw&%)kDjV@Cbh@oab5dFXT`~* z4AK&Hp`-@dU2-AHZSlrh+?SnIdB8_rmGiPWh1lK{-1rfoD8m-W;N4=4Sa9gHwdTyW z70VA7)Ryg7@~#kR8~z8gpIApU0bdvpAZR7{i4%|6`q0UOf!e&{UKHZzcOZd5!k8>o z%c#~DCa|D3KB(}FNs=KTyLef94kopUWml@J_%663zU1!4tFj}|68<#;P7%B0VInG9 zljf#)o`W*hDAwWy)}lMG@i=R7Z-|Wbc!-SEwbmZlx}Svp5A7CqVaE)(=8SEp!@Cc? zZCLjkTecX(1#_~D)V&LDaEBH|k4|F}SkpzSD%Yua~oy>GwCD|d8nZ92T> zr^3p!`IXjMIte+OHjPZ^%1YmwkeA;uUTdabL+_sswWq2Yn{&QJ@cM4osmm>BX?tVJ z#qCYQDp~r2IfW%P%veI}l$s0kKHtDszOH9Z?p!d1WXAVDo3moeflDx-;zPfznDxnf z?@pL7W!W!B%2~LI!&{cme4nz`<0sAAcJiDyR$od*O=g@a7W{=o!=07=NB$KVo687; zB~?ec$X()N!tUNwm>YCJD7|c8hpe#@mXX+ln;-MDTIsQk8VafdMx0D7F|RhhP>XJD z$W9!=DHY_%Y2fYRZYFOLTOoXsi?K5ZEuIL&hZ@p>l(%OOkNTQ48NO;Vbs8^&H+Iv`wS?1A1KR! z=D!Kw3hiqDw-Ag^x_GhhQgP|!a^!-ls*2LW3+FG69z8g^bl>DYLFqkp^1jmO!J`Wb z2oo%=RcXrq-R_@!j<4)4$u{bcaWg>lPL6b|TP4TO2X1hdli7!?(1Jsr`+XRKL~wdS_<# z>XH^~y>#;A$->&O*hcMpWX_wnsWi6RV#8`LpPyf7i*4Ss z@3-G>t&Z*ZHv%UAW^W%`z4coF)M97$yuAXNJu*I)n%1%Lk*UtS?Ck73XXr}umZ9?jc%+DIe8AtV{`n0@k&D!WA(#UHKxb0Vh_cW+#qQ;U+@p zr0chWWrm?OPL;V4PqU(#BCjH&$)y>zj8hspLmaQ*0j4-Psc>$nEZ#4#^eMw9fiu(Q zBnp6s&rYNTd7~D^VPk>s*m@2d0~L)4;b@T|RMfd`+pJD^;9fb7uV;X6qQ;7|Wy?o4 zzEx15HRG!#y6NMO{Z5}R_sl!kp2zAFtZp~81-y_AoI^Sb?YAOTN<=8`ISe!y2mOc! z+^$a|z;Uz&dF+$i(KFnURO1-Q9fex@9tydmF6E`AC3VM_kmCE^)aA#uq~2saWW*L7 zS@`j1-+Vc5C;#$W33T1ea{8R5Cl4MpH|>~W_gQ0m^yo1vLmS)vzaC?|rBjUO{HDc=7q2_z zh`V9LV|}h|)8meT1Cisp#K$FCPJwpY!v^1?HP@TR#m$>HZ+D&j)X~~bchME=&i2uP zpJ{frHJ>ISUb~D9rt3_4l8kI)3u~ zx}9f8cB{LPv*z0m$m99o+tu4nlnG!L?OV)L|JX%bBC2(i*zv@zBya-ED$*`2U3EQ_ z_Mr7t+JyJ6DX_{0q2)`VMoQfhx=v7}kY+)Jw}3Y0BPmfZjZMH$bSIlg5Q4GPSysxG z(ifoSQW^jW4n-i6e~|g)2ml&+(+ir)NwYAYC`uhXp^^_($2PfZ6*ml_fywyIC>A~l z2J~9`UKx0MMMmX(l#8eoe?H)h6axK5IshwVG(m5gRL~j<6txD5GN9W%L!^V7LZHa} zU1CE$ZQiG!tv#?a2YAUZy6kM2o<8U6-!3;CNGHGkjm;-l0Q9C#4Rz1cPjB0cqx(Vy zbxpicwb;UUL5An=sf_7Dzm#6S=1u0U2n%a}UCUM}En6VA#Re|suKsrEeM4d{9+*3J z?AVz(7b@+bi)nA6?wK*|_=J=wZ&X-9g9g_N5xpiRK$WA78-2|$m7Vi?Ph32+ zbM1E@=(_&S+%?+@Dyxex?OyY(N;3U^-R=Tb|7#^k$ufy?Os162*n{JU^nkMyQ-n-b z7v%4D%GK&-{`V6|t*DHJqE@QnfE*R1qlC9m7EAcDgqq<^mg3lf+GseVoIWV7v-A?R zf<&mi1po$dRp7ELI1fQ{lMY=Yrz4=_NL66O(Le!_O8}=*Hekl0-_`S4@z`SFM&h^P zxz)7f5L%QFvS#6zFUKeJKb7$1#*G682&3HDsnapt^zzPe;SCxzv~TRa=CxtNmM&$Y zEw>&&-k;i6uWPrC%akfh^kkkj?faT3Q@;9&se6xPYyi_PB~rL`8p2APFtjQ#E?jEa zNV`{+Y)sK;A|@D6op~JOL68H(H$sAiOk<9vNZN zh&9b%U|R2ZBX!8*k3W8AYumYHpMBP-QA(U$D?NiZ_291kC*tGdPi+6?5QRpHY8>GS z$#LRNTzDb8{cu_=|Lw+jgE2=T*%w%%(g!~L@WX>s2+_4*?bK`@tJ#jxpd&US3g;AG zt`2xvH$o@Qt^iVhIB?07)VgCwU+>hGwgV(09IT7({D5SEUv}FQuD$u5d+y0-)AD*C z_xeT+djS16U)#Xusy>mE^YqhqcTI5}!w#2oA-W|qn~dEpqV)KNnXvco4ip#LNUCJj z>uS%OEcUujKuuzsrwX`uqXXu+)~)-D0Jul?Z<$bc;lv4F??XQ?o&LcGA52-aVfR@g zY)nOaH~#p=dzdZXpZU`k6yGh&rcdrXYD^%2Z-bimMA(V83oW5wD~!@)b*d({ zA`M&Nn&>J@8t_u@Ry|-=I^#=EBk)Qt2>|2R=UNC8N)hHw#9Wg(OZo&u5ed{lkd+sK zAPL42(E9{82%CQZj&|&FUI5EZI1{yvh~is`4Mw2Dxt{Hxm@7#9+ZX zFjM@m68fQtEe*UN!Q{3fA5bRVCnv+x$Dx?k>lEjgs#gPnRmngTpbVvup*086a&j6s zPHS-;6s}RhuK6E*l$aP*sIKjZS6<1@J$>n-yM3=-y>95>IG&-c$^xV)0MYR7 zj`8NpdD#HfjMb!Om&tI7j_mw-^ZMnZd}&!(hVj$;f$MURoSR`GNoISPJ+67z&biqwfRs>CJ&rhGySd5DFJ z$qr6@bdB&sIGe0#P(R7yN1Z^+Ae@kUV9}U*G4Ppunt3csT)$bYel8gyc{D`1!nFv0 z4FvoSAV3IgeZ-YWVGURdv2#ST7NK^I(7LKlsqqjIkPmx~gg^Q!;^p%dJsn9K!|y`hMal#nK_Q@Ue7Y+nC@rU#=it zU%|x#+{**pi&(jaa4)xnP~p(3OYPy7$IcX&l-Ah9%3-T1Eh#?z+kQl;Vb?~K?3*t< z>aCBy+gB3NZPur=aRo!#a|;I6wAp<(Vwtgh4?<@UBiM~)mhw5`3|QMGR|L~8NA zDqs7)ef#!kofPY-hFY9BaiQ81o7B2T-}&?BFUzTjZGY#p|Hby~o$X`GcP^dJ$gM4Q z{Z?4*byOGrwyQ<5$Kp-2c#==XR&AXNtjyh76??L_{hbh?JKNWa4Ft4BekRDuLdQ)@ z#F%%do-?1@Gwq$3yQ)r28vCy3ybdQNJczk%EQl>>?XsR2uiz8{OLWyx8jOIG$RB?7 z`nHM)1)_X3H)DAbVVuI>lx8|66`4nPDlik2w*&&%Nl^v~S|j$83{>?x9tj@MRX-EV zg1tqFWq!mW@Y$FUqsWs$-xWYZ>X&>gpD-$ec0d6M`J{EIiGuaD!3bXIQ#Q_BB-0ui@fJNf8@*(XZOUk>MYyzVU$H2sXM!s4jX-8f2Si9 zpB#0B$ia{FKE^*atMR(c(0s0@jgFpu^2zPnwQF_!Mvl{`wZS}DSEo-~ zooW2bcp+@nM%%{Kn<7`O+O$c!e?`2K;!7Ut36vmvy>C zFR#FR^}21HIc$>~7t)(ZMwomk6-i%0@|SQDh{h%`ZWUmM#4^4bco5@4cM}CqK8e-X z9}X*GGDIBb6V>Cnx>g;OkEEV^5607q@w8<9T86+|n~?SM#AcS~FSU$abG)@>c!u_& zJN8nyeU`X~uW6(;)4f^~uU6{Siv7Tm*2M4re%eo&Ph2;8l(vcjro)YUY=60S49#Z zFu(ITbJ3da0w~~kKd>HX0lU@Xk@^-Sln_AWCAC>IjaO^xC%ppGw`futLN7hpm?BV^ z`2l0c3XKqxx<4Mh91|K7#54&^P@7A$pvPRMM7CGE%-HJ|@sJ?Woq8+@OubmirQBqJj775LtaHH#hfR|N7VcZ6YtPpE*-YW&iYKkJs!;PS>63 zJ(LluN4n2V`$E)Hu+d^w2yFMAtu8sf(rSHr$I#1}I?WGFt2Xs9{;q`?Z?Xas z{VgHxPTendmA~kt2Y;9G0C9dXtOTjaKUtsGSf7F1#Z#`@Hqm*Ewai4F*3Cr47Gi zB(&~MFRpg!sSTqY-b5FXhfQu8F=E8c?Hk7#=ML{hY`9cdR9@>1tGICH!iC*SW_^KC zH9=qd`QEZcjjCMvyi z_wGHqwMmI}qOH5tQAyZP7myWdlerqu3n7ws0e!?+kVEK` zPte37TnSF5Yo@mu7b**vW>a<}VO~L3S$#iOw0$!tQnd#~0Ago7CYUlUCl--g3Eg8w zMIq%$xt4-9n;U^o@vn9UKD&b@JwqtnwO6r3OKW5eQGEe!{li+zjG5xX>v2{RX+ILdaS*c=|yq)RU}$se{|4o@HO=s(yV>7N!>x^2-c zq!Z_WHWxjm;bFK#93=6EmzI&4n^;#>7G836j z#Qn2CAXEzSwc8UWGmi3EZ<3XFfq9rJW;Kw2HBb#ZxsXWci2Wko3*w_B*0Z00FO2HP zhBz9Dn&x;e zr56O3ZA`pEdd|S6;6!~bNFNLkp@*uKEC!$#2Oq}2D`%&eca2gn@R~7&itX9qs7fM` z4pP?wO=&=rWFB-5kqAQS+iS@O=gm7<)r5`?O{xw~o!YqZ!JVrqJhgn&ZrY`Wb?ywH zopL61x@{zG2fHgSF|}of&c5U#x4UTT45~rS*jn_^Lz_1jRmU`I)-1_YskPL@mMv@2 zq)GVMo$KddOz_)FkM7*LWz91BT`)CR$RU-;2+p6%e$sy`s{Dx>?610ndq|)#}|sg+F5EWRh5#jOSID;HSt!=-d)Vzy&<@GcL*-F-@0{c&f$WK zB>|5(I^0HSVZq^@TWJg0yQQsg-=fLlAfB>l??nrZK*2-ne}IGSS(7%&E_21HgT(RW z95_{Bb|$s%N&}|vdk#mderEXf@#fR(W_=3&S^opviwH;9R6Gl=U^6>2jHhj& z+RwAz%EV>*qGe)kRW6A3PNRmR|H|abR0ZF8710c=qBe{h>=m$;Y-805f+!aFs@3Wi zG!Xv+W*Jia6q+d%3usOdi}eAsL^1z&sKxJ~7J&c1Mk~2Nue|t^f;=<`AAAu+H1$De zG=fS4*$1eTIG#h`u7!VN6jcicHNhUJfwwj;$t(HGu#Q6#>zCrv2hO1U|jIOmEqZRQNlwqz& z`jU0_=j^)35&uon-}mj*#z(TW>0WEB=b_E^ENzrmb4{2~R>qxIYM+qq=Cs-k7j@3O zR%RY+2^kx3D4}734q1#}!A1&mEt!j{%ylE?IwgcwB!$36qyWaM50~W~zw_~z1U!aPR^wyqgV&7DO3Ba`nA_2Q-f!8w@A@ISX?wNbA~%)+a{hX` zG$+$|lghw*b`THF+`dePssN0KTs*ibIY*+PNGWja0tBE6+@MQ}6Pn@$*t__Rs7D=L z*ssiM;#fgJ7NrFfr4`c!i=sx?j?qaUII)AYNYk|DA$+9q)mhcz@4c6l{bPj{f#}AK zr%d^7Uq#dn_eu>C=`$YixdRk_%Uh0G`D3onGjCp>K7BeS#hOYbUF|LHEyoj`Vyl0d zN1-kZLFOUXM0wqwW<7cgeFPHs;4QxRsbYElYSp%5RZfBjF8{V|?Ke~DTK#F52OJlh zu@bmE$oEz&rcP)&3rZy+Auooe_F_L_(^fOhW{|+8hBxVFSr`Xk1n^@?goUv2kw_FY z2xT%b6B(z|1DHnMYBpTV1}ZL3D^J=xhOD(MWUXxrN$A7pJ2ph;KTXzrKMOz z#-a8?FRgr#&>B?NaWd`Wg6EeEQOVpCt6&)Cj}MvckQzk}kppD2-!yM((a#_H5z#BF&l5l#u#1ZJNbeDhkh^ zdFshKT9_{HTP}fjKm2mGHt~sPo(T&B=PjG*8Gt3D>dc{Qn?@js+T+vHJ4pP@-2=N{ zduY$vZvm8_veVKw``UHy-oaB^RhWN-z`nz0tIc((J#Oeef5E2n&i3~{`y$(eH>O7a zI(ynQsymeEmTNATR(YEmW=D8&CA^1bU3obL)`vIvT8Tt9wAbOlrSUE%Z-T6ATQ!g zMr*`<2tgE|g%WE-ha?zVC#Y6jD1a!`Qev06Dmtq{{S=~vl~qLWT$xBDmP+c2@y{5| zI)=M7nFC`{N=ec{ua?GP^))|iKx6%yU+DrY9+5=WJhTh&U&7$j#^G}s%t_bHnRz31 z`$L<%wTx_8rkgi)`dGIVRZb|!FlH(rH#P{g+^>jqV1ZpnpaZt-^tWMbl)wm>>U1o9 zz#)?=W%IKvwbsfYX1oO?PGs*}xvN*Xt5-uH@x>5G?46z6teHIjua*>xGNoi$Zn;Hb zg%|ywO)A|RHHwaw=l^HZN|uFKaEBh@_&=LiFvV}!AkY6_Of752v}rAPB2H0(TiJxP zLORtyK`aV>kNwVO7LN~+BZi(LRv8UF4_A&d$A~QkS{<~**fA zSfLA;i00zcZPijP%vF`oxBhx^efdgl>VB}l;HX9419|=j8w>=PSjqp<4uf6^uJC00 z-`iuT`-X!>=ivXNT}FC7j0EaC0QEP)4{px5YS$eU!hOS*{Px@8l`Bh1X3zcR%kfC= z$-fmxHfhtQRjZT;qq=nWvSmGcUfZxbZ_T`~v^lzNn?Bv>(}zm`75Uq@OrNv*5a`Od z#yVQujy>nz-bp^kE2*iky!vWlVjpb*DY(lb-)yimwNX-oxcG#`#vKOS^^64AexiM1 ztF2A$Kb*3UZ)r2M@3S&s%6j}W&){@UE$rF3TSmq+qwcw}RrA6UDt37)3XUAv^fi`% zSt|}97r)uk;mDdXBO>DDiQ}h=Ywdy3i|5W?xOn<-_VU^9l3?@Br}LI?+LwDuo1o9L zxh;5p96AY;V#Z^sb$~>V1`foU0}Vv$M_I&Qq7$+JOS0=u(NCnV3n9Zwj;MFasThvBIv=)t7@s(4REZQPf)+kW zjAMUv(McM-LULwRNK1IY%mW@5{0p}@38Iwal+P~6AO1t>e`@2BIXKj?^TV$iHx)a- z<`MyW?AY>h+K{}B?2n_7EN!wX5Maf(2s{XHLRK^zS)qPWiJWT0x{37PC}iD2H7#dK z%G9ZU_7i29r%%W3I@zD0O&J@Rmv{gDAr7PVl;U{i87<$h9UB`gw&QaBh41KtF!7}P z!GDxRR=DQyYxc2WA|m|3kCX+bP$ycep=vBx66#ONB3MbQm7f$uUa?2EPqS+G!*NH1 zjO=eA9Jh1Fj_cO_hjtL>-frFY{s*>@&I=X{8}=XCL!7NwuWtPx*hHjVkmV0n5tIM; zzcGxwCyA`gp5Xlz9vEan^`?;&8^K`z-Z&!0{eNd3AzC>Q_zz4ZPBfYS#QLZUq59uj zN*u%vTmLg_$^YGNT8|2$e$)1P5C#4>ep3bWfAX6uSpTEn^eT*BsRA#{wM1M5DH`TdjTYxh7mNr0LUqB2zq+^H z^QSi6e%l3Y3PaSv0}tFsVO|5Pn7bgJu|REA|b`e^&`Hdia&8 z!^(X_b}PM#BDCO+I;GXy0+_8PA+yyYgd)V8JGXjuUS37T)Ts+AD*9GbEY$M#h-p;c z(ngNdq*3iu`=9I9n(xnegFZv1+iuIyzBPvxgk@^qYHzrVQ6FhBDU|Q5(xocZYjjE+ zJJx1fx6bDAY^5>+{i{BTapF`Ky8!R-eQ_aBv=*HQ?Si7UqA8ioV~|wv-PG!YT?Ghl z#x4PEw@JlXjP+(}1&@glSB^M-cty$LPa-ckl}lBuHS6%Cz?k1@qhvt!h3enN+T0y7 z6SsxTMEls>Gv^C(b8`#MpUI6S-+>lQ9=j{HY&oIxONwH1O*i13y}^{bWJ&k#G+1;s zYSf52M+uD@xP1>Bm}aNohD}o5;{JtzC&_B=hIpaMi!e&sgzyX zQT5ox=c(HGn3l1nN3k3qEsc%p_RzDVp1QwVRE9R){_1TR85y^|+J`2WUuj?AM}Y;+ z*IU9Eob*JgqbUVjWo5uYw=>K9`RmU)8fV_lmYM1}yMF%saprlm-XEaKq6{(QG2D2* z!TYo3t;sEiYnSJ)nYZB-VdJMZ%$xOgKMb39s>hS|w`YC%<+tBz8OBh30i7t&gPBh@ zk>ZIL4N_CikYvV@LpMVBtccvm7ibCe(Q}#IEH4_gSM`j*RwI27so7=2Um79)I`P;@ z0Rj=ulEv7pL^)o?jU%6N-65ycP!Tz}0VBR7;DrBh#^Kym9zgUC#B~&oabdj5WU%1} z9LuikA@>X6xwF&&|$12ol0{}fIl)dew!DXq8i^a77=0ead( zb*=-CI*hm~)rWdp8#kLdbLNkGj-NPJEr3G-r_UGcJaN1%u359sK1)v4e!y*AWluT(%w;p!gQawd1UoPwPP1H zV|-);Cl-4M-XW3y%w`h2z0xR=t;VR%V%mwaW&SzPD^)l}MihY?2$C&|6(n?=*m#SA z3?q;g#!8Bei3yK22vV` zpR;2}X+l$cTTL288>OfBZ6yOMd(+O+q@?IJgOZXC9EgZOJU&MaAhWa8%_vegw{n_I zr+05%x2VWsDlWwKLauxi&}cSYDmGb)7G-bG)uvC^P1C3Q>pKy*8uR6^1*Wz)k&-xk zP+OX^*{hDoif-PMS8%b$K?|hF(!E;_99S}ez%$o@17&504k55^(;Hqko!vMW@-TPf zS<~gjn@7F;{OkXE?*2YqJ2s?~Z4sk-$tg zvb#{@O{Dv=Fsc&^(eQ%D;*T|(-NaCUsdOojDtU4dvwUEA(2=lGO_0?UMITUrCaWAJ za7mS25!?AX@qty_NGyk^aspO2YSaBVlo zVBX@=mTjw6YwPta6VBMM+UYaCrD@}ay~oa1Q8sk?^vN?;=az;gCMLRTea#XI$avw?pnGuXPG|w$R9R`$_6MAE_)rd z$n~)M@4uy6Wch&wK-2VDO3jtkVgp)awt{vSv(p>7bMuz<3n#xfh-ycJshI9p#?rqL z%J;D4y~&FL2dxyT23OKOG0b)D2OtaOlfN?K`%9RQh6p)R*ppi=Oz1{+RHRmRktsfmO;pW zA_GftPA{|`#a?XjTnyku)`=myUG2n0gobf}TE+DxKKpO1 z?%Q|QuAJ?MOa34B-a9_3Dt+L-(`PbilLARdLI_=YiwY{C38G?UQP+Z~xNBcm*WGnX zZe~CP6bq}UhzMdqK|zWXr6VG}g_aOVfP^HFKB;rx?{g-|=<2Tfdq3}g@0paz4^q42-IYjEqp!DS2BZjJ%lw+~27jWlPcnO*T|`6bFK zUR{`*`}KPm#TR^&lb_b^a_M(5wvX5H&N~ea;*WpIc-rQhzj9kajn`INu!*{3F@-x3ljwUP&=lS(Gjr|QRwEvL^wGNpwA!&_@L;PI7Nc7; z5(EB*?5I~?neo!wYmLiy?mT#+u&AQJ7Xg}VC~T0b13QtneZ7wV>Di|rzO}EtxVE(L z)QP;@yc4yqKBTu_)!tgWX3g!l*KUW1e0_vkLj)W~Xc^4iBetoQxyL{B=)}8kyW^p8 z<8HX3d;3@-nZc4_-BV4(kdD)!8%l};W&#<3kZf@=_6ii;`8h{VRJbCeYR?y)y3x4Y za0bYT;rH_(l9?{(mmBnLG>#kQw+J#20H`?x%(6Fwvoe`ED@km{D*Qz=g}I}srx#|0 zv0(HwM`lF`2O-Ipnv-I|^kMr`tt#kfB~t~Z75I@54SZa{j?RZ5hZkVFr4=PHwpjg) z`m6}S6N-dl=#%(;G4=pkopNdnbxSg#i5wuoQF+8HVg`A^51=7>(A`LTZ7qurv#B6W z1$@}5usK}b0ehVm)awRAMFvAfq?fYPW9bz_MY@DwMZ1LX+T!Bkia=z-(4pUalW;BB zvv+4C?AkS8z`}*%OD2@S@dMl=L*OptSBFlV zsH_YN6K}H?uRDGKZDa^&`)u9XN8~+fsLB$mXEmEg8v_DDuxeMy;+P}d(GlV1aMhI%?<4JYjcl5aYUsg6wj8bKINOM;aI}I2Vz#jF zW>dXfS(o?+wkvhfiQeV77WtD9e@%>xpb@9Taf1tt=B%jnAl7#f>nnDvK~U*m>LQwQ z;eyRJV8GI)rKN`t965CKAnC(Yh3FqRbZqW-D?VuIW?<-rH5 zt52SM{`o7fOi1nBuFLh1TnW)RQyG0(KW!qX68Pk5;i^%A!@479$KoJ2RSnwY=>+4& zsEn|f6~1Hh=5>@~9ctWRj52Pqyfka^`b^`NSEK|ru`D87+3CaQlz?AIC^^N57pe_1 zF~}~FnHYktcs(RF6kNP`9l=mRQy>G!j9_umlO(pHgayL6L242q*A!fH8kVYD_85))QE)mb1gGOK;k4wLv<&B$my5k( z*DYn1l+U#}KIfzR#b_~hO&b#7wX7`dF`sGiS3kC1Oi_6%!OiD%X=1@}Q;ZhDZ&K)g zn$S9wXB!WqWsvXUUZc>cu8zOumUiv5A-cO)FQR16L?m=#1Ns1;JE2?uUNn$-jb4sI7SW8M zsq7Kw@|xxI^ta0EK9n$5#{j)VKxHhkbz;a;%SWt zmsm(}PDm|1eq@^t!zYLiFhtl&Po;C|?Tz=p+;t*0vbnO_?1^6B%B)AZD}Ufax>k3A;S zIh~{%3gMQOP|ql6X$d>J?@%G-%bP0l4qhwbj^?Jp=0x_!y|2d71VxVIha4*lNCrOp z&`y6N1#9w7mWN_f>x7Ft6}R-+uO&XC`*AVh^`Lo!^cg(9_A8?u!3KtxvJ zkej6<1}V64;Cc zHr?2lk{8l9^OB{ZZwPFhLi%bqqz?29(Pn60xWeA|jPLwPc!3d%FVPbIXDx-mpy9($ zp42Vf4{O79%gK|&yX)FP?+^@4v%$dOG#0ARzSm0lD}v5CFPXY%3r&m5=ow)#f4M(q zs5Z~2HlEGG{=`h5eKux{ZrNkP>|_};=CeJMEw8=y_S-{@uEsN_*JqAEE|AKp&%vzqO|psJNhBZ06z(R$jr||thOv_2X2mOqrOwAfPnHxea)Yq!h_#1g zASDdaC512p6b7n`U;*+43)_(K2Y~|#SVRe*5P7q)i8e%ybP{V|wW)Z(5&|gBXlSt6 z=!8Mz1s$(f0|vyFTt2Rc|I?z~!YV(_Du>q1crs*_2RENT-_&s|vfLd#!p?vB(o2+b zX%!O|ZWdXu*6upr?7vU~%dfUZxaqJL898n8{1fipzlHJNH$1WFyrz}tvEkv{wrxA! z9Nl>g7KV{Ypp#fbn(CWig|2WK(~{Hehj(YkxT0YeHJb?OUUuB?OzuQ?CvU`)^yfLZ zYVO>*>uVFPergCY71P_2@?nch&bW3c{hLSJ@u=;|af5kxMdtAS$=31cqBB;B1Qy*475B6vC;i^y5ad3MxCoT-I=k5yphY zQM)kX&WRHz-aEW|Vsi=k1Kx!7M~|-m>{UuLy#Cqx-RC5uxbDoZ^kQ6EJluW_#QdD1YI<}eGq!!auk?%yll$|#PpDkNagvV^8 z4hEGuL?)2{TId3wvCWA*gKb(Y31U(N)nubf=Y@Wtfoz zgl<8uRd_hUIrAa@D#}d=6Va?e-{nuETH`|SHlpF~=Gk{2K74muxF3#B^EU1B=@EsK zjr%62rcT}pU(-(O;6&qe%`as0_eMECCyL$3N+f6<5E@TjqhWE`Ei{&+m!rXIOS;AM ztZ>GW*_TKuf$7pAggfU;egr=Y(z7(~SYjxR|4 zN~`aJWmp?O$t9?@g@T#7AM{!8y?4u&zM0x?+mjDHHFM?znI^mWO06r0DAHuwWA<6j zpZC+>@6XoV6&3pksC(XYU^jNLELvnp(>5#y>`_TAFe8dcIvDlaft#q4ZYg7h8H<7} z$XqR?2FHXPqf5A$n3_0ML8L#=*PrL>ibT?%=j$2re4!qeHlhcvU7MMi z`u3c6=YG6uztS8V9r113(RxlK*U2p!qT|(bYU6Tm8`1A>zkSV`<9~YYPmhhe z!lg9A{1f@4?X=;XnKLK1Xnv0I4?H~Kj$7_{NEI{`0t3Gn=4UYvQ##wz#`CWHoC*!~ z&VL>s>7y?vh!El?0$dB40y#;1h79qbWU(crpDS3L?U3j*cpfG3kXex-#e6OU?M*^Z z$!P@_=+P=N2bm-yhcKCRsGaHp9hAbQHjg)p1iQ(6FbUk2Mq)%H{Gb6`!z#7|O9rrt zeL_~TUkF~uJoJ2V{_&jLb7lU@#z0Z2HElqqIDEsm-PkDg46oLsJEn;AYqovxKBC>i z?+QTWR;K)2K2x$|D4cS-HaX&nJ8m6&$Mu;*dUx;LtyAYAv=dlp{loP&+MnqqqsM0S zh-HGNhQ}U7z`JkUy;`Tc6MWht)ho2svejFU6qVNctE)^MD_IF0(1?P{7FQRg zRmgk^M{R;y02l%f&Avo&l|W_$A30ViO|z-dXcV4Eger%cC?_c7Q!JYrw%lNyD4N|8 z3(We0r73Cb!ts}+iq_+QkoZUjZPD(`X4mY+sX_nbccwW!!yF&k7;J}@A?1muI4V3r zzh$O2+xD1?QdEzT33}t5x2j73+ z_)P5u>+kwf(rtwHv3k8vCGi)mzaKMPyN?Nm=bt%y`t<2zr7^lAw(TIa)9bG#kA@|Y zdP|5cCUcnYrD?Aobs3vi&6@!uoR%1lkWUc>Q5j@ku^qu8sV$0lL=PVsFgIYGr zYA1SFN8vEixhax$42>oIdA-n*chKh$p|gB;+v!=_oXMttb{?v|X4Gk$%-!zWO7b|W z;p9wXgt>aw+#yta9%aG+VO%lA8Ey)2z>8Jp`9iF5xm3h#zp-Y#w3^GH$f44c_XbW^R?<(m}kQjM{by zWjR!<*Zh|I{(12!HmavExmyr?a(La5>FqIWVQ+jFT;c!z)}cBM!OKSZ;AF7eL*}G!hb{~ z4vqHjcWE`WWWRsU9`nkT=Cl!%e(P=i_~UNf%(eM=7V>N9v6mHzpZ`Znv8}dPbYje= zrmL@hUa4x1=kLix${fRAhqc4z!GoW_mb&^Y@M6nrh4wPa!fK|PIg_&Jm>f;1-G_;i zYzuGO{fZmLNmm&#P*{@?H83*n!0Y>8AA-X6C-dt&4-LaRIhOBxU&7dg0gx-plPj!^ zU_X!}=+Nw_O?IRb=mE6PD@nWPzS1~Ij)ihqvceFy*bdFj4UG*fHCi%kTp3DaF7}`t z$>p;mVeHZntO*7uznpa%qN;R7%SJqeDykh}XN8^M8^nj-^hXcDw~$`za`7SbjJO(8 zg*ii;sMGY|DdTqe%R`m~;G%U{t@>?)R0pFHq}!0>YNPs6BT;*)M9z zRGMAe0mH_?IBXo+cHOQFip90QF!xsZ2t7|t~p)2CnM}Z48@`(?>!KEVv_LeLW4Mbo>uBRCk23U(2U4v_W(Qk7t zYc6*9TSC_SN7;NGPM+-W!GiDnc2Dmy6BxH%ksMvW?ZXecbm`tc+FE%gpK*p-I;q{d zbRpRw2|MfFvK^AF@X=R$PPFSjbnN~2-+x=bgoIQNl1o_Yb|;Gc6jeBXs?6KtjgceY zc;?}884)!*m!L(>Te{!euHTr6Pai!}S1C2pv4gPe;A~?9SDn&h!ooDow^; zBfT>}TfO6~zuv5s?OMI?ccXF-sh5nU$K;ir)?zJrj+Kx;B%|0r6E#hHB=eG7^HAmw za*d|y*|k4=R&0T~-ch6fN^g0BaS zzc}7qzT<*3Ui(0|?CR5Jm-l~32sI5Hs0e5Jz4vb2`iDRK;o))D4(^{GFD0Pj()$k{ z@tcW%pfFUS(P{8)e;%Q|sV!`Iz3Ke(ZG$^D7aYRgXleh|SM9z3ORA{!lL6v_52EeL zFUY9?(_-0FQC>I9=#DREwDGWI_2v(!4oB&`-pIf=@Mp`5U#@*o^o8FW*BCu#4G1HI zTawg>WT6cx{ehJ`5cS+05$W+rifq8av7-oC)gvK2A;3T zk3v%UjDr0aKVj*FHf1BYTPzqlyuUvAG)TX01ut&{FC`1$dhqhP5WF1uBfR{F@fSUz z-IuGkzwG ziG>wKgtXxX={Up?mM%vu1U9 zXs9+xUbes7(xp`M69K7vB0l)w{SQ9<^wSN8bB>)jTV7Gq0{OWf9Sp z#l_+x$V827Q8p26DVc*}EwB*sgwCmK{-pLvVgL+CNP;&CBTSG?wa}ex0{)1Nmb`v3 z(?DrN>cugL?L`eaEjT98I!kOW0&K5Skl$clseLN8AsJwhTsSB<2&f@SQ6`X1+I9t{ zYa=k3=2{d_MGIq^AZ#y2phg1QpGKgDNXVBWP(SZ$U6tc%rCTRxefMbgzvkaG@E+qT z-TE(WYnf)sJtHoYf~6jGfys6UElV8%hmNftg^1`=0@=y2Qeuo|x2a4kGieeCf%M^{ z7ilnFWhnS|JNVY0d+H0m4GO`xfg$)7o`37D`Txyw+*XHCy!YPEn~z6mXR*%f{QO_d z$bOmj@yCD0mORWzp}9*ZBjwi`mD}m>r9{yL;uj6egecu+ zT_US9#At6Mn|76E8skiB3x=XTxQ)SCnZ_vTtrs63Vl;G)y7ykbwruf8cJ`AG-6GAQ z{-_Pr&X^O>t}U6Fix!0#5FPnBIr%{&;vX&BD=KyhiTjgj_jXK7%>NuKM4%)F3ktSI z+N|MW&ah|?c6G!ij9SW=XcNn*EResRtR+UhUwD;Bxgl0Xn_|f<5S9M${Gq$pCA!8+ z;C_gKQLT{F1;}VwA;F!FzkoZj$CocZK7D#r)JJod?K_(JaQ=)<#2D%(JmNt&kl>A_ ze!zhGA=(~ok0~Q#xHjLEspV^jv{M8V4%POXp3@eh!7bn{LPajwRUL5$4#e%GKsXC- zS-fWtuz0|@%d~WHrZI+P`K|shTssab8tCpwiu4czKqiIM2|%=zEhvbSMGyzJb=@sC z9SAc;jwD|T6Jf}*#0ozUA<-axpKi5H^w7j-CPle|uACq6W(KSB8LKif&8qp*G%Y)1 zRh}7tN$wlGZ{Oi_jkM&81z-)e73T`^WSlBD>_%<9P3nKdAlt`9q~6B5q)lb_~D0d?H6SfpWFAvo8DonE9S>qw(FkEo{Yic z9(#HevEuWI_XQ~GwOV_l{o}tK>M0^TVNY&Nt8U${ym`Dti2eR|_y6|F4wp$EldDEQ z^!#-gGZ$!!N%jlAzS1^m8v)-8z10IGG&j~#%*X8Z&|@k(-03KyE^zi`f%=Nlc$?wy zc;?RiU`4K0opk*~#M0mN4!4w?+P-xD{P|yOD{iW9PQCU4d?oNmy9rbUgouxnAHk}u zvTcSMnKVfJyJ_VYV&J=u7F{{hxtLy!$sI%^L6A`5geWiSt(XHY z29h_{gQ_H5*n(1_RGyMAaqn=h;Y|}kL?)3ZKzc!R1c}vz$QnG0#oMW)dR~?iy^0kT zuQV_DLk6;vS_QMp{^BN-3rb2WixUbVMe6LyBM7NQhUEe}cf#!j(AKSHe+_Dj4+cAn|-)A%7x6-B1goNOx9GLcOunGE!L z{^p{M{6(Y{o^HF=9S^lxYuiGZI{bt(C109ZvrKPpp8hjMH&^L45i?M%G3vdoY3zmX%fB5-IoX^q`oaS4R#GYNM#tHwTK8Bdb0hyJbzDSV+ zfc&MRoDGt4LgW%6AZ9lb2Mu48;A2o7!1Te|cy-COyHuUCW15-zAwer-B2V98{3XpZ zq=v{(Y>PiOO1kGQ>oDTWd7Tc7%l9u18Y8_VI1bT1(LQoT_3nAu-_JaKbXYCfpDngW zFBwWdH9z(;uAm&}b>{6`cMma!88?`+qcV-&)54>n#l$w6!mUnI6c0t1TeBAhLT&+U z<4cB{C`gdaARt$(!$<>~bFAt})MN&YQSHUbZYDC?3nL3c{wg3ZHb<#?JdkI%gZY& zN{((`HQzTP*tdst177y23s!ADejfVqcN}A=)sQ;%CDh(zjtV$%Zqq3dVoAu8#U(** z5Ks^l2QzLhl}!xi5fUjUM2I&XBY>jKfkxdeN+oVwQRO5a7y=o~fvhBN;TF^@;4JpC z*VQaQmmvW;s`XwYyFk&eC%M+YSWVR>nbjN{vYHb^usGwJ9jEJwhPDQ(3UW3tT|@=M zBPCSUi}~Vp@vRheJR%T8ZK{&|GJ?vGbr?-AY(Xn^G=@e&f@($7FX|Fk+9!Jr|k>j2m zsrd+0@o6uS`n5=2wr=Uk$!TdrNFbZycc`Kzo-_X9)c4~Poul?Fa1f+S` zleTDEwIhgm-)Wy99n9DDKFwNe7Zcqd5Dk)&!fH2d+H|9}%8B zNP2nQa{W1ClqKL76Rixzy2R8+r4;o6(Pq=v9$Pba#xSJi2{hmyW;@#G@;HwU!LIaY z^H=+(UyDuc9^+QyM)J!3Zrt!rYKkUSO6C$KCIDnonO?!tWO2HnPgc7t!mP&-q9XNS z37-`9<_dSaBP0zP3!|I>u(PSvfB=pKA0^$SN#Agy+LieWBv2^CUn0bqEcQktfPNpK z3V|?eWuq2xfLA?t5v)3=g3B>(iupjE6MRZ-4bY$Wm=dEZRaNa-`+#P1N)Y zTL@Q;J#~1?a%#MPw&d%bhf4!$5iOGL!>iRRUmY&@bP{-WNibCwe*Njz{duRfZ*;wj z*&gn384~*5RCzjQ@8ZSL(G90plH2gv?pl{8QKc2!H#n!L!Pn#ad`BkGM3xuxH%RJkC5%i4 zRulL>0g*rzxM1oIfUcybWR3MfJJIntR# zplcAOmcjqBrM|72S+M2>X>%Z@ErB^TkL7GsWzCqB40;n&L}wLo+S^2Wq(~%2s767u z7FzWiu;Nazq92t1Ca~h#5L$I(2v*oUg=Y@BT$$S3b{^L+$EMxhzR5*on%<#r*RES9 zOrQ+dnFe!1m`5mbm`7sJwgTVv#dWcLX+7*U*JNg9YE$C;{zWzZC&y)8IdI^>p(B0> zHJe6A#e-M(iIh;Y)u+vVX?-5`9xQR@Or9$&&SQ;?a%Ov+F;JY0yMFh(-`$-N)qDzk zB2>Yf{r&#^(~SKgVPma-CT#50&(`l(>|~)*OVlbUOh^zuD`Tg+$Ujw+pNo-SL8XC&Pl%T^abaX5jH>*!pt}Ra zfFd=uKwNSjp8(=d0`W(+AA2@_7XtANRlf4yi#cqXp-+G5+2F_f46*lfsq+N=Bpw3p#YZSYTFr@WHE0g(nUlIB+=kly=pFvuAH=N^IM6 zz<^%q$@U{(&h}=gf|mbY)}j5Ke}4AaXZ|>2#`I|~ynn=eXtwXgsV~3$%(Kt^`T0k# zqtFIdqpWPOv_t2MrDnCa-(DN&*{fgw{{8y&*1mpw;>4j1TefW3x^?TeZ5J-Pb)wh2 z;)54Ouy~~9^=#aW3s!tvP$wYt7j9ee?a3-!2KB=+k^hm`GlYJ<_`!<#FAOIP^^fYq zr=7Tu{58dgH-SBm>2F$_YO!u(POYu3BPtL(wH4E|B`hM0NSO?&h^c%T6n77{>=pfu zuuc?c3Y!YmXhwNMNJb6Clf=`rJ14aOwnUs#c*r*bckc7ZdD@Z1HAe04d#b4Km@umB)f`?>ph(s*0 zCZv=CB4Jk?uj?qDXwPPouM-4LkeSrzW;?4S`J*k$g)Pq+eA5$-WnyjxBsCGl3Pk3$+wh4`rk_- zIr`Ps_PeaK^fKM^*kk`*4=Dg;&RInCtkgqtNF^lsrZ7@_3L_O3{I{Y=izPiozQa{< zr2kqN$u9YJpiMS*vY#)Gq&&bv(PRM2mVpfgR^)EdXribh%$iYbO++$6nWWD`bAyed zoglK95kywWz+{}!xx0IZPOytjcBqe8IarVv`zWB0BjIcwK%-<@-=QSxV+N^*8@U%z(m zzTLZ5zdMcSVehneS1($0`m}s&EA;5M-+uQ!F|sz=Vv>`QHtKxwcilB%!h|v10;iMh zhnK#+BPwb~e*5hBgyepooMg;a40(urIh*PzzGP$tWnvHAxOTD+m78kn^L}+#xn{3 z?A%3^Ho9h5yTq0rI8Ykf#hNtquAxafHGXw!{ANj{1F2dvy%;%V@nooLB@RyR)eGS_ zV?e(_g9i5Q)~!dsfm8&h9&p>3j6tbPOyjpyYifs1sa69(P#~Cjw`NhHQnn7UnnY~D zCPbc)8E+0;FovT5bvKd&rDWwL^KQ6t8QMZM@2?7}CLE~zmuzYw%mn1{QwBor#XC## zgoj6YJh74C*si0Zqa&lDqdZg}ruJ~0fR&Mr0m};Mpq7ee(@hPUWOPeJlVAtIIU@ha zg2wsl8|wYFa7fZBakY!9F;EjBGK?BvhR}^h-DDHJN{QOCN?Zce5?Q%rq9nnKAl2YE zPmPpi1;4;jkquFc!tdiia*&JoCv+XWmA_}DrBiGMEBzoV9jZZ$y|mKW0INT$@9^Qn+Z!i7 z|GahU7?-)eC^t7ZFTW6+FU-rseNx(t66x_QTzJBiK6>=%ei42`uOm*JIC0+YxeVJ; zCve0UCHf5HtQ|U(zsBF7O7u4zrcL{<^BPeJ-U03y%lU$Wf(B=5zkcQAkfex|PMtcn zj;2PryNxTRbLY;<;bv=nNlEYC$&p%NVPUy7hSu$^D5&9RtUf_BLNTEkB6=aKRMloX zt3lex7?veF!m!80v`78z5aVp9uEv)EEemdMb|!C>JwR=QgreMytF{+4Sx+xnd%WoQ zs>Ox%4&%tmeYwkKrL_&Jhl07vxVs8jG`0 z<;2V8f+dJ>XK1SEySgI~4)OyX;4gVj?$VOw<~Gn$gu+9_TWC4SZ)n3Nl4OLHkc$u1 zAPPd&PLyci7T(RaCvU?-r@jBuXSAlq=I&dN^yRKy85!V%Wp8@=aose2?+XzyH0@OD z`~mITpEv;kE$yqSQgzd}?O%xa@IzPF)^$6LZ@$^Om9EG$BCK2&7K&wrN3-JXK*rQf z7UKmN6-y^c7*Hosw1jKnJ~X``rGfYt%YiEfK1NLlQ=_G&ZqIex{dL^ESWHJ~ns#*v zeHjrVd9>e=mKq3rw`Sde!dyY|lDdF9r9->5>xu&sYuU+Gb%bX!b&A#9H{YCpmRjkR zwe>X(*^!MF6r?j@|>FKR-F*VS2_M9y(9f+p8Ty$csanw{;+QMl%#yJ~_#yU}BFFe-( zd|Y8rjciACt=pd5A;G2WUxX}!<-v_AmLanxcEdM&8+NSNnv>tyq@6nS-6FrGXxZzL zqH-y{OSU!BqzLbo0$O!F6{rKeAOHje0%g=j1rR{#le851qMVRi zAJ7X+Mgb+h=)R5?&$2sEhODZb5We!NlIBFjS<*3cz6OcE&asC@5T7Snxj8$^Z1toM2FZJR z0;dljK3wY^oRX4=U|3&MQ`2N~Mz&5la^!S_GqER9ZO=qkQFiJm8$ zoTscUI}TSqQ>#U`YSqf-MZN~3Kt+YB7KtBF{0Ka-Brf{uXoKVEuH}1b0^fXLIl6o8 zs*QV#8Y_?NSoT)CG$9l+Kt&`S^2nXJ>)7o!UprTo8<`1eU5CK%49+O zAxHz|2qdFY5YvIGL;wrG}ex#~+8kld4)RIG!xgD%FR+7fCHj3}VWKsKN0=Ow1sV;+p-p_ss?Sd2P zJ?PyKi0gedqlfGKp)cpoox61J8GE-u1Jm2L!Cy>vwpFVwE6RhA=HwRDG}nWSiJ;s* zE%rj>l_1#_@s_IHD_5>OWJGq1w`J2Pnl;OIA@h~f#D~r9?H%SSIhN0;a73r}6M=A1v^g;H|^~AbSY?(_>+9!Bdew6e|QpvH^}}@=6~L&XhrK zu^)yYh@8vW7=q;;VWphFd(l)8=J*7Pk`P212(=soITp+VjiJxD1%d^ZresMJj!dl# z0P=q|kxZs*rpajPd}5l^8i;WibIAo{DsCECh{zE+8O)@BAA%y6o*blN6m{2VaIfM* zh!xSCnU~@hA}&!exB?gbGH?cpxn@2M!)OY}l}&qR`28Z4Lx)OIX3TYYx|Z zS9W6W>2*`Hk|}d9Vy9pX{8R|Jq8YN{!Z(oq*^lyv2&_;L`3Hx{kiMGohZMny$a0cw zhb&JpvkSlpiNI<~3;-&AP^Xa7Op$!3pe5MAcO;D6D(lIYfb&NjF&d5-%X)@(Ar7g3 z8(O!;Psfqkg-r{sB8;522Q=}rcIkP zKk-|Zn3xD_c26sQ`^3(DU~)ZEVq$E?2x-Lx0(KldVZwyb(4zJpS7Qa2Ie)&w?{8@K zb}-po5s4i-UOlL7ZQ;SSQde^EwzGbBe~92sBQrBIx_8#@zS}o=|8hdiENc(J?tWIl<%5s!#6Uv17-P(stDi z(fw&cHmrA?RP92Gr_oqlec@aYoVfUWb+xTa zW@cs=TXprRbsvBH@w!u0RdwMhsU2zQa#>np+k^<4w*%Nzci~*|{zDhyF6%e^7Vhi1 z-mTmfhvC(G51t}~qY~@BuS;jpO!Ni<(1k5BaB|3RVZ3lVP*gUiiK?CJUdvuuTK(qK zL;DI3>|Qc=vQ)O*V$0pL`*^dz=l~dGdvWfP-36sX$R&Bsw2(m2zkM{Izeoa{FPs*? zFGD8dOC(1o=5NR|@8zxFynJBJ>PN{zn!{=Vp#bbNcr7<6p*nV(kU_GK#2q7hgnwfN zak;I?0Wt?{)S*-$X4Hi%P4Wn5CR{)ap$MNM^y-Lzy?b$I^tg~+#_b5vQ#aCbhw8TF zJpLA&9&h6j5GABg?Np)oa3~ULVJUK4kfbZJP7Hww!y0yYNmAesaY2hPEo39R6_i=X z0e36chSbYR%rl_By0%=4A*-XxY01L0{H4eD>K$zp zd&ri(^V+V{2B3Hy%`duep(sDEpdj}I@6Mh$dW5*v`$x3VDi41%|Ml1BuG(L&rHp*w z4>MmiYp>4a?vLtLk0;!Yy`v&;??HzrCM-LF7DOITyCHXz!FPMN+N0LW9a4hrlO6Tb zy0aK{MZ4E6efK4wu4hl5y=2|4vvoLf>naL%u3Ps0t5YUVp7P4OOV{l>RZ%zTTG0MU z%+b#olf)>UC9cPnf`58%k|tFw3vz~NZFG#oVnkdk)K=ah)A3GHUCDB_hDj84Q0zta z1K`5GX@P`-F9S>wnL#0~XZ+<8DF_H=WVdBOKwz~+`5}CeMGYPVuEHM#%@A2(byVjz zO^JoYigYDjO+zL1A?pU+N7MawxZQEFv+q2dl zl^~@-6O+@^v$BQ*+UJ8W%WF%t0zG`mlJxZS=#o9F-zA#d7gJwRURdITt7<=aUrX?sxVq6s9vO3CR1d)|JC$_`+RiC{!#CVvDj)>)BGrOc2zdC^+=eQ2(!9rTxx;BvNZ53^ zoANW56e#VCSSsSJJikP;V8@Zt>yQf_*ruik31m*@4bqt4Z+;5ZF{g;p8Ie}P`e_a+ z4kk>!^%A59)-+K)Q#M6H)$DQw?pE$!1VHr}IHq`x zxV!amDK^AzX>O`RahT+RpmCp)%fsLVK{UC4sBo~JND3I$35-gGKBYjPQbOocXw{jh zY13M@`egdXqJmp){a#-L!uZIq+qqLWrGMu(s;&J z|K%C2Z@iJ1_+_Rs*0yWco1+H4O~!`#18q6i>fe9Q9^I6=#pj+lao4WjKmD7Wv<-{H zC@pWkji!D+%c@nW7-~!WzHsTYq93lTIsVcM$4LWuK8vnFuhNcNC-GDCZ>s|dg>n@@ ziD%*ggU==q5}Pf_9+#diU>0fuCScu_fMa5-<=Ie#rMY47**g3O`28rhT;M0pmuOqg zq3KB}TQiN3<}59TJE^PNut7JS`XmU(L7Cce^F8;Dl6G(pXk#(Ccc&<;&+_%xvZen}Zo%QlCOrZJv`boxJ1CwL?{uq1hd1^?M zR@xTr*HigGIki5qt<92Pgv#>$PKQL6npTlO1E zsy0w0{|Sq4p%g56>eVbr5tWhE5c@$C?tTeMbvaa;G$~v<2^_MSnMjWELf$K(geFepaL8Z_&xLP7;#k`$*dkpmY9X`^M?9WgS#%Zzc8a-Q zfPx&-!oyz-;?(V|`dC)|N^t6CR{gdR`WG5;(e;0*d2RWX^{%`A54El>zqZcx|Fy*R zr(OSt^41Wb|618P93F#srGNudOA=leY(fUyfu?|8eiAmSgH!+tyaKEU?loZG5gZq%QkDV%qyoPt_Li}dFDY?(h zY(}5MY>)6n$Hd0yvFy?%hbro0vE}XCSAF3^Rds#yq<$0&h-f^xX3d&I_D-@Zt!)P0 zh=}&UZ+eEC!@}$K;?de(5(^-hAQLd)2S8EeDr>SxP!NEi%+7nT zgD)}Sfm5Ou^Kat5(BmK=lJx)^3Ch}8h)N{O2Ng;A3^O<8Bg#Y(Tfoo>0pwG`IBH#r z00l|H{-oN^`y}3&L1<7!P$pMJWg(q-T)EgJC10e1K_XvBf4eqdP^b)*8bZ0F-kt0W ztZ3DAYSzppOX!$8Ti1H|wC>rK+`)r$y-~G)Izc(Ct`?26FOM6WZyYYrAZF$Gr_84{NjoxsaEjzwH+PY(8WH?X?o4@$$ zZQp-?uxQi5`Cim!fxfl5th~C&M*-*{=q*ULW}?6d`NFP9onPr%Ac7Fc0{(~zmu5%+ zkBB;@6L7c%1Erv+&FT=l162@$`&@F%d-5dG?YTQp>Ka1nJBL6ie$<&WCAEzvx5xAO z=ldEvj7ssWIa7 zC%LP$+lFtwZPsqzolm+>HOfr`^@P4(y?XVR3l}b2nzwgvp0~}p^z`-}I(AO>#I)(s zrK+m3{Cuh3VyZvaRNuX~w@oYDW-Np1M-hmM!dVv?hyK_)qM#r`Rf~2gg$H$tr@LYJ zKZj_qXtNyueD1+}{yyQ3XQsCyO#?!JtAjA-Itqi-QX&O}=Y!@ZulV!5aq{S*49UU? zt3&cz~_2}x2MLqHq_nG*DYz=@bg7M6SpiBRNA-bP1hD54CdhlyqyB~!}_B?P*l zrZYk8B^U+~P_1&8mYpQ_=w$FOIRyVgC3Vwr(#EMPWBUB1;q)OIYuq0=WjM1k1G#!w z;n!am7HWli-+5=RH$26Y65HImZ(PQGS7@<%Sj5Sb5fKFu`w9w37jT|D@ad|fjmu`g zvJeI4<#0ApG}2c@c&tZ`4Vuw$wsgTI-bAX$68!4Ss zBEd`usTG0&u~bjh?pHpQ_9mq?UAb#!xlWv|%$x|_vgl#E5nlcN-HQqe7J0*awu|U8 zq+2`JWsZDG!9V)Q!-P zq&&BKi`$*o)O70P$-Kjd_U_tMTzu|a@!9gKDsOVja=iD^M{{OkL7BDSv(M(gF>TVM zNi*Nmy!xDEmWOKHR<}gT!kGz};Ts8oArBTJq3`Fqef?mjVunVWe z91Vx=bYQhFPa``vWVNpf;VlYxQe?IB_ODvCVRz1f{d;$9+rPi8>~zkq!$%J0B5CytXj8i@6nTI&!4ZYEkASe$nLG{RxQ;Q>GM#Rf=j_V%3|U;H+x(`pwK#9!a?aG z6`hSWhOG#}fEIy~LC+q?v-W6BuspT=NGr-&DaSO`1(&p?J%^Aajq2^3zz_*b?OOmx zYPaH-O1{C}iPq_qa1G4-z#79kOde%a?cs}E(WO)5f2d@6sZLMjv#Q6eHX&P^pxZO% zs6MmWzp|y%Y{cZrGiHcP+0t!xhTWm5ezWvHLhH3R(XkN67~PCO3u#~=2DvOc*{}^I zZ@MlRg(=*+$1iZ}?jbwz-?(*cxBcI0TYd$%4n&Q+mIg(-y;e0btkr`RM1P)HA6d72 zFY?;IGixhxK-hDB6|=^-DGKbbVAfa^#4s$nt#Emvx{OO4TY6`U)+*5pqo7kmLw3$} zAv>q@$dZ!sx`2f!)Md*K1Uih|-7dY)aP)?&Iz)$s1*&T>5?;vNB?*rzmQbXSr1NCC zUC7H@y>`pt)8zr8?g+mrDlW=DuydDJyH<(-ztG|7>-#2D96#Q+ZO6V>Upu0n4U(Ii zTToI{UmxCi;84b};mDf0y{72o$&*DjdXg0)WQ~a-f*Mt)w7959#A*66;Es~$1i@Qq z3f~~T#F$uP7BBc>V`WqIo*f6iUh(z8W6Kw>nDbf|G6FV#d=VllSwSrNTMID~xd898 zNLxq|&KB@fN>5QXVf(TpCk4X{n!UlsUCO^ES62H*!e>MqWx;j!2s?#+!l1%%FfM@` zLorZ}Y%`s=P$cD^Y(EphEPP4c)=U ze~8cF+sZd#1DTh+L^>fQKAor!ek_w8R{23!#;pJUOqPoA|HTSP-Hv;K%KboPFi^Q6 zP16R3?6Q!23@v5o$}g90I(DqEyiu^Sx#Dc$-qlN1486KTbK$O!rivw1y(_6@iL-Ub{-e2m*t%o@{~>zTce#Pyw?4qQxsSVG?_xxcr?a%fItC+?Kii4^ zV{!ROGs$k%RCfIMcON1ze6Xe1?`qZe#s~2H-E)O^m@$rA^jnOHwin-Dy63E)5{gGw zygzjWZj)R1$2j9Iu<9%ja&6av!ffVh2??Tmj}2_d2tVZo_K zOLt3KA29+Vsn#<$`%1PE8&>SaCQW&XxD9zBvnxLlH^mo!uu(ZBJ6aJK*?|xm9Qbme zN@bS-vdBQdk4sn8TW~q7LC*Lv81Q>AUg-N5(u=Wsn#yaS z5w^IrwBEPig1e5!V8 ze~W%;ZKbo%&4LJHuWD=de@Dlq$H|uYorNpy*Dal@E9;4Ewwh{7!c2`#*-16|yLWH< z1az3Y{(M-8D`V{MK!>|CFW3%Urcgu$ z{bZc+d)tft3*XLqVHiHQvBqp;_#3^5=yqd~Al6FBnUt@f7G{J{Z)8#xiYvH4UY|k< zgmKBhFuWbrg@RO5G%h7Z%C&)bi`s@6IN(igBd}F;U-$;MD11X99)DUXj!7?zSgHw7 zu7#JP;~*H>rJRTD20-g%4g|3d@n3ApSmmXh0(c=4`qI<`t9j)@av2${hx}V2njpoK zMDY-AZTJ$wU=mRMe#zzok8oe3aYf!LEfR=;=SJhNrV<=_H@r+EAi)#?h}!qU%ROXk zh?|}`Q*a^NplVu#Dm@w7>oi2 z_l3Y<-1ti{=&yCEJS+t(ir&z`q4w zVfst&uRl~4)v1rRP`5hjvA6gjeNFYm@*2J*(4pQD*X#QGpLpVly9Tv()R*mDG57V? zU;pUaVsAeTz@5`tS!+-4`BqZ8w{H1%@9A1=d|Ib2l-z&wi=8F4M*Hh0GH$;-p}F?# zhWDn>9nWT%9B!92+hujRsZ?B7<8R7t)8wzIHyNkbef-WFZ@lr|@;t+oJmijvk390o zgd5Ybbg)jr_;^w82w)#-Tx;BCJZCh@ZR0^+WWwoJNic&^`$LX zv-O6k_nhW=XfZ z?I!ZoKrIO;7B1|@;vU2;VHngfm3%JRBXTm|P*}b!0c>nIj8{^H+)aGhWPjcLK*T#)!&fJ9qyg)}^$uxd%e!bN2 zI#;e-zrLYitu{@cYH?GwL^r!NyPl1Sc@m)n2v+7sbct*dDJP--%0tl4*8i{SyfZyQi0yH&5N-Bxij&O}|RcS5#s!^Ac5SnR6`n zf^Khn!-NSFMzxuSY0>GJ<89lu>!L-UPnm?3W_9ja`;~Xxv2NYwgJ&BP2xIP@T>H&i znc7=k?GZg?NPP9tBe`2YB--q=T$72e&ZJM0O1d;KF@-L$A#T> z@65=Wx8k(lSg~Nn5aXYel%I7L7s{(rT}%Kg$7Am`nIoNuldvPZU9&@49rWuV77(x# zrh$D17%M-8sI3Bj(khT|;7lTxLbjSDx)(!a0N*pXNqc9-MdcDuDE=jshb%pDAfaD! zRd82VpT|-&PtwHdvG53jOC_ZGAXW?oD@1M>09ITB1VZJ8fguo(?vh^Jdi?mT@BJ^@ zju!?TS3WURItOZA+g;r{#NZdoGEE?;`O0du&40eCKHv+VH*e0IIcv{Z(=$o)@@gMs z(v~5`YP;>mYe{XrJS}kULW5=vTqxeXkkUsVezW@nkjs2{=1kqWzO1ygEI0`;r^j;7 zxbh9y`@NP!Q|xwC^VYj{NeXpgWH3=6*MYpQ486J}XxW-yh`^r*;}kT7mSNE#-`z~6mgNPfID_QTW$koU zP%~v&9a@#k9JIsT#1l$ACDDOzRUH}+uJxL3yG@UH_SwZnfW+j8jEQtwe9<3#01__Q*BFyN?7pX- zdTRWw-c0Sq4q+z}6Yqcik9S>n)2(Ab&e6mAcT9HJ`y@8k)t}x*g{&>7or!l1!5lT! zYl@E6+b>v<+zOe%7UrUsjL>n1^O1khUvR?p>6W_u9aw=6)OpR-P3KjQ1N+(PqHQZa z#K$6Co8|S7@Yk1YK2&4Xst;{m_Li@uH=iT>)sI*1I3+du{-}Q%huj55VraUU1S2ho z^cXfccobw1!Y9Om$Db0cBIv`-2!c(D4(c%SheT*|x512SS$u{#L0blsSlt0liryd( zgT})8#9+@kvnw14!C+rJ5 zn!tNXG;!nbS{tXST3$^pJ@lmWEm_xE9I*EQ`(Mf_)J>I7Q1xn3meyZ~zW7WJJOE-_ z!Z((b;IUlRsnhGP3+l4Qri1xJxSMe%NhHBk!Yyr-adPMqFT`?5z!$9wKv0!gNXcWN z@8rYcjJCp23BC{RJE`*Z8}3Z(pCh1%eL{HB(2#xC^_u+r;ySZCseSv+oAb?S*F?aK zE>x3i7^psd8bDeD)dgtAl1BRDu2Rk8G&h3%8t|V@CAYeELjqki)tXcy96j_QGX+dAy07? zk=@5~mHWYv2_YEr=%uS@gLW1iFDS1)e{jj$RF-_@oh1j#s!EO>$lY9V z8CB=YtIxPxYu7Gb+^3Jzxpr-2t^n^83)|%r7-YHD;&O!0?w~J^Mb^LU3mDzv#u+*~7 zIqf%Bl@?p+rF-+uD_2t9rzt9m(!BXx?_d9Va~4&V7OXj58PRd%-DrisfAsOkCpj*b z3iFYsq&@1jXMFcvhDN7uN;3c`AR!u`zziybsH!BMAQDMX=s#S(*XJ!cQGa5^7c^t~ zr}0;(@9od)%!S+D@{XcrypFgz$w=h4ypMmcU7BVyiINpW0w5*0pb)VIG0kZ%De<5T z08S^mhKgnfexDPbo0mh2qFOPSFcBne{_9& z@%HNI)YO9q_iS3ZX&-qaxd*@BvSrh%Pv2*JylnG<<3|eezt73nw(5i4dh65mdv+IC z`biMz(4=OgeBUZ`)a~`1`t{3b2N8+_uS?HX@o?1Ys@r{{g0+)Q!XLi6M)iuZC3!&YCb3zZJ5vGCsH?b8 zef#j9?NcFy9oh}meA;A~I#`DNf%}6^G9Xog3qNp3{$Vz4e~}z2$LH&I7Bues9Mt_A z;i&72Y(={l4F!##1+k~kTeJOONo`ee4g&w&&YhG%t`G~g_=GQZ>%Fw5Xy<4wJap*f<|7Bb-?~-n27rkyH^EB$RIo#j%Vy6C{@!c)HA90%J(k33~A^R*-k{ z-0&eS)Qg8eeoFV5>$MKL&s2~2^NjA3_ObjR;6KQ-LeIwr^`rBxAvD5VtLDm8a~Z+8 zfXok*ktU#M&aa-YLd}<<=5ze}d^GdTvT12r=zRb7e06FLx0=K9|MK}t)m(?vTuuLe zKjxo#zMtODkJhU}&3Cn$FZ|!`E#PJS<@v-eBOL&K4t~0t!lb4!{d9_-U2S`&X+0SU zYW(PKx~r+Ws;MqQuUVi63ial@A zFS>O3a^(+a23>dKl;7StWoSa)h7B8Xt2=b*65Dg^IjGip)0G3 zp~CT{CrVwfz6p={o1*xi+zll@t($gw7dCl^I&?^hbJkbYWNC?kp6n&Uzv3TOEd2NE z)oa&2{nCdkwicA^$^CxivbRv=e3(Dpf4%j^+O=Q2_asNFGb!>%clI00R%`nz!$a(<<#9ee3V6HH0S>XhyR|o&WQ-x0rE1ib6 zqmYIZ0&!+wy(S&`NT6{G7FSZ|Xbi({-vRz&ZERG!OPiM7{7jS~1qB61j-0A?CM2S( z2aSc!>QhIL6kvY&^}}MTkF9(aoAPJBvf@~E?6B*9sh#n=Qj0M?3Kh!Qvf|W4>?H1j zT@b~o{U+UvMZbAcztrM=%NNYU8RX0N1v(-G&)>5>cjwl1%W+$~b!YDOJq4%PqrjiL zlYC2ZYtFrd+g2|*rzZD9uK(T4mVNGb1)a$MXZ1w`s56LM3aAKgvDQ_Z^DaElcXLWz zwecf(=;)0j;!)4QGGgHw3em5GYlD1aX6R0@fANaa(7qK}Y_Ir*clH}!SML1!b#zty z^cjqx!@Kzj# zPUF(!7ho#XZb;K7yhXGnfwdskAl7ZaC5)_F*r4X3=#~Xi(IB`qdcT~Vy%;*A;>j-vZCQSIt;SccAAiobU^RTQKpYLeVzu@ShAb}au9vL={ zR$QzB2s#VrdLc!dg-bUxK)i-oz}JV@c)pcbke`E7XMj`3gHx{sr(QlItO>8O;50n# z<(C(vty{Nl{kL0xICSzPWtj_3y*7dFvZ$Zp`{kS0`-g)JDPPbiN5E!2O>tElR zi#Za*MvXXk*u=}Pxg7r{4m)?m$YF!v#Li!L+TC&JB{S~7|F*H6-6b2|c?Mmoer*hz zVwq7+?$xjRt{)DU20Bqo6s~(0P~ZM|*@7#kUXO3OaZLL_m(D6xBkPIfgD(qW;Sv4w zC7Ge$#Xhm-WMxg|$vvN-FXwNezj{Aex3945;Cf_`4nr-P&*TZx0D> Y;6XU#ILQS8g4^Zm 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�uP5<4L&6))V{L_N$NJ(tsg|m8z z`;W&tW{y5g)2qh84q9+_M&caB0>*L;TcE|nJbi$se^7vx4C4$ur=i3L`HQi@jt}b&&F74z;_zuPvwY6tRB|@XObGZK2b2bx?Q=@D*rzq%4IwHK zyaa{g@cYs5DjdV_if_|*Wm1j6fB@86dy%n#ONy^LqSOiChIrz*`a2jsX!$CKg?}QX z)pA{S&vMNi&?D;Dk6~R)d-ne()~1eW&GQ4T<5Alirx%+1Nm&J<#nWyO#fS=4Guo>qO%6IE3pBq# zPL|e>D>`G@5Wk8AQl1o=i=s$X+pw+~2i0Xr)qfZ3#RV!FZvktAB5jw~bxK|nAw$&` zd0o;duQ9avN?z*>d37}_uiWe0yl$vh^6J8OEegx)r;YOJro2LKF$F<{75!n<3l60h zOpn&gF?cPq8tH`}!^hym_QKBEY#&D7%PwICQ))HTK zlSkq9CcaQOIum3|a~QEUq=C^jUuNi1AJNt0m@`v@V>O_Q!$0hn+MY|b`&gGdn1$Ah zl@#$n#s@@tWOS+6YU14V6hcOQO<>z_zA}fN%f>Xl8aO-hi7_4qvEwOwMHEuI1#yOJ_n#x>(mY}bl%N)|Q zEA<`Z>VS3(uwxC`2~y(W(UF{Ofo=B)_np8DEIoaKnm2kv@RlqvzR4KL1UWME@235V zW@RGn*Gg?Etw|qrtm2_mJIV*ICPS)>ERs$Wr>J3CuUM?6y%WL;R}8|I?KC3*<_1hN z-OSD->6?^vGi4vZBPiV#?V7uj)TlYF=7O2oW}K!gZn4U$p{Ls>MW$_xkfKbtrmd75 zqagkLc72qlcXPwzo)o$O335Fto>5y(Ej0=JVw>(WVYb8<$9IzJ(oRc6e<`*;>+wcj zTq1gK1#?q&t}yA)61LZDr!G0{hJn$1P^~JXj|sQHSQm^Xq(5u={$eMsSHWo&(H{id z2WhTc!7KfaJ?+V2b0W=xn4Ojx$9n|&luZd7^j=L$0s{GC2a8II=&rt?_ZX;Jqvo zZ}wr5*#VQ@w}WU$#o8*bcC2F!tlza^9qztYjnDkt6PE`;SU1x7D5V=IT|^dX?t-W#KyA& z&+trIf@}3mcpPd5;l|;VY^z)1Rz6Q-#NJprYdhpq%oVX!usb2I0+prNz@rANilmU4 z8*>3>t;pm$D>vIMP*Mgf4gGpcrQv+~C2<}|pyFoMCT+I3EinI2dsiMORduY-z1_FB z**9QV#$h!i$l^jq@`yd7aSbS&Vk9qMl;|&*s97~Hrh9roUT{kk@gXrNj~6v6q9JUG z0}3Lt8yH0t1wmjIwt-oCx$mnw_fFq?>6vbl_j~y#jn3_!>8`F@r%s(ZRo|%sGOko8 zgL<(hUkzpzKUFC)XxgIyR!d}^9ZnrCTQBWGj<|@1MtK2JptaIvWS32>JiZ1(B8?za zrj>dZc20aFsNXN?e@Tc~!_xhPW=X!ZbP~;;;K58~MZ4m?!Qg$HgLjX?d$P-AXS{bo zUHChAf5E}K%Dj^;mE6l3u_pJO*(Ilje6XJE(&&qLG%qC$$u;>XJp>u5ST9=e{alJ6pEl?-1HR!ISLkM>H$ zb>c#@>nRh-=W^zc*>|pe1bafSBg*;Di@dus+M0I%BU+9bdDaqDBKQB8>|v z=(Nom9x$YBcIH$%G~5q)d$GEtvZgkh$6@~a$%f=J;9FS*+Tfe)DFeOvv<3+rw_w$e zRNk>;BozRe!FBHnL^Z(mYoJUKV~-J$lE@5+@-{OTlxL-kGwprTNt_!0Ah%yBYQz+! z3g4hUOWA!~vGeCEca2nHajb4O-ZQaOhuUb@@bwDT!OOw8j94n|94|rHbcgjb<>3h? z{YEQ}xNwA&($oTMj= zeJ_T@r5B?>Z%7@MWX^f5OWJpc z9rV$V0OgSK3}pRlLc*|@!+TaTh#h{8DUGzYB&d&<&A!yW%oO?y82(5ODIz&m(8G}M zL^6=G%}NFJ8$*&rUm7Lq;`Rr+bjUewqigDSCUf$S%Md$L=5Cbn=O@7NNX(V&e2S|@ zTWMyZM_woUck9~gwQ0Aie9jf>cjhbaW3Hnhne4ixkv>Dg+4e!kPzTV~M7oNse1fBQ zxW>f4*elGS)0(J)Rtr<09=;9<_qU@=~&(1^Bz~9e*ZgE-J3OdXwrHoLc%63Seo~OHVf}osZDJYyQ$Dxd0JAT38^+NMP^F`(G+k zr51RyvvYH^13G#a;t_DQWw}u?A)!}mD4IZ9O$<~)zCd~t4=RU%|L}eJ@isi#+eJKz zdJWNp+O82fyx&K~6i{|b6~vo-H+>}@t~?jYYq@dO(BpQwJ+YVz6}G%?HH_YgUNtj?K&~yWyC)BdiYJDzxI8S6@=+ z0-i%Xn2qWALs#SJ=e;mkGqr$6celg%S3{q)DAHPp`%n!voVP-IHmDV1LRe0r?usgL zpC%{yn1S6e1JiNR^hm)juUFhEImy0pP1ef^F*mG!hD9OkvB!=dZ*5(+thg9f?qLs5 za-^;r-tUQdLNKkwRtzQtSCcJ%kI7ssIF>8fAV_E!B-9@g8UzUqvPft^5UWHj$Du{h zoH^aPz3|Yw!w1HVe?R>4h7GN)0@cJ^6%|{yggyP97b|=9S{ZRqp1gYXc|q}zddHM& zFW0B*KNFXW-JbJ%_g=FGx$PR)(xqd^hCREwi_3fWzC7ZpuWxP+>NmO89&1`(iH3o< zC>!4n>esthtbo;_8f9~fd_G;z^}AIM`uq8EJsuROBSP3XB*HG3N$%~Z#N*+-wpc>P zEKkJR;^Zpfz$h~5sv7p7{T}A98Y!ScJU})iaL))}(vU}LT+yh<6ZXUrXhAg;Bf~NT z?-&fJ^h_fa_mfYSmcEX9-`du#^R6BR19gk%zekOlF+(iFw_kkm_U&O$aJ^vjm^FR+ z)~$Emdt+Vs+E)TW@sejkRn-??;OKgdYvszavaqMVMU=I)ltr>>aKj&-JiYhf2lws< z5Jr3Dm7E;(1e>dX)4Z$z%FL*4Z&tRdVh{jyM12?BKZU-N!iYvu6A!iWqV2klo`*?c zVBn=N$OHn{I;3MQj zA2|5ezgAWje)Lfm73vA05C<64{NkNKgWidt%TP|AC1dZtd-LYTi4)J9L4kvi_eKWa{ja>Te0g3ZvVT9c;P&uinx?5)K3`Z(1OhTT8Ji_xybbcD3uO^75-9+PZa{HoZAJs6UXsZj*c4+D$o6K6&~y z&P>kDL+M5+XTam8rX0fWCtMo1hsMu#p<8YuQWT5fjuKH62SRxvL1T>(h7Swvt`SN# zHS$m+kcpy40>(Orl!}e_hF1;p-Un#|!+LD?5v91fZ^r&kJK+hKl=lI+OrbmvSF2{-zjx6YXmvxcOWVfLg$*V%5i1L3nFKTg0WpOh{cPU7&ei z0!j3RE)2BjdYMHM-kB$F+3?b~TN|MYzMK)=cJGF7gTv3_MXK#5riV4Job;}rl)ZmL zP&}DE@x7ii_CNdOm@&tWiSzNssr<$l>5WAV4MmZH_=ZO#wV^p1MAl~C+_}xo(1gbe zya?f=T8Ybx;{!e)ZjIW%#cN1+d8+52GfOlcrJ9&HQ5=&KK;C*hIR{ig0tgmBe}H;) z+;?)0XO6SxQ;Q?n&*XB+>}PT*A+x%i)3>(zz|Q^dh_3+QrtEHpH!4C%LIm}@;9Ey! zeh3;1ubmo@8Qyi~Tyo{84b0_G{FLW&*hQwZmg&7|KHoDSd6y=dJQGj+U!R4*vEKai zWR)%o<w}23B0=Xk&EhiTD1b-`3c$Rll84xhoHXGIn$I zw2=mF6BS^ijlU-&&t1(PCv|@_#S@oM=NHgk2)-#dgKVmS5|wAY?3t=eInO;KIsXgV zO%UgF5}GPQo83p`xmzQ3&>@%3BDhY@yYuPu^S`0Ekq5hqVrPEG$@8;2;8IL3U7Twy z9XwY)IizTy`)xpoAzK1f;tsGKL*|YuXeh~XH2HPXb@Dp_F1=6&HX%=4sb2{I8t7?8 z?97xzl#(bmNtn?EtA==|YNk&OPE=*mCW<38mMI8^g%Gq2F$ztCGUBztvmhtN!8OrN z$Mw}mi0i@Mr0hCqKfuT$P<3M^Ac>e59V{LW&MEE(hJ=-Kr%b-`G*D>DC1d32wAqX- za(nTO%s1jVxW+lIW}T0zBCAfy7k{9X3&oF38KnJhlr`|vc~B)r=n>}IiOVoA!}VjSl0y5n3hDCI`na%yJ)kiIIbbMbIcI5x zbM%~6X>tqkTQDB{(&+slBvvu6*kdL~53R}n9-i+RNIVzyWu8Zogx#ptZ5_ENt-Us$ zQ^~@~^VC*wtCaL&8IPgt9qfgn$rND*y3`@zRCC0s4>@!~tWqB@^q5U> z*I}G&jX?!Xo-?I<=2NEJ7MGOY1!Y>Oa4fllGW>ljWitlujIY~uB}8C zQO6oJay4v2C7LIUhe$Eg-b5^da-oFNFmODmOk}qfrcPKbr&A}^Z63zLULz2yjfZ_jM`b0cS2~OgJ*Nz znX8^v+nnnYI^dK6<0<_WMmglMt}#BBy$q6$=>=u#f#ad zBK>i_|&FdcOd=hTP0+N!HX;hF2(vl720Fazoba zBAQY$XSUNTa>{x|3+;KjjhAbGv*8nYJN!85aUtSik+^jwvDzai?fNKk*vfz^_E?l9 z;Cnjc4KxCKFcOVmc+EC>n--}n+ROH^AE$1nSqHhULueF8d?VY(t2Tb?wrO@}bH*3! z*hAnm2Wb)FIa7Kix?M{c1*fmQQn{INiK0Lp%r=(kZPQ!4{HgmzKN`E8qLwZ!ZW>AQ z5s_f-bk=kw5${044IGv}D5Ki53?EdUOQ7lK^g+#Ck7sH!f9b@OoVSEDBzB?1I?%~) z2m^9bjPuzff3hHS_9VH+(s@!EN2mTd*R0@4P{-%1@c9;e9>t+ez{6Qk3cIXRSyj7@ zS|gT_JiCbtabYwJ52KG5@37Yn|0}Z<=0kCkNR)zYTs9EP#s-!~(Xf3ybxiN8GplO1 z*Y#o$QQ9Xy#zhGUu48Rq2Qu`Z?R1YyYu_a6EB_b9kf5CK%l|=~r6x7DC;EhfU#fh< z5;oRw0}W|88ELMy>E}r^!oT29MQ|6FHxa$X#ksn4c+O6IVHfkHQmoTIkQPXhRt}{{ zCA#ZGmi)b!_9;-sR@-iytVb#@%xU%ZEnr(3Oe_frARAyn8bBYujp8<{1~HHX^l?TD zcV${^qMyq0c^tmjFhVbhP*CsB*bmUj7qdYYvL*?8Vb z?2#)IO?m@Pmw@wJa6XM?A?tL}tf#1tSH*Xw<=iQmVFz$N5S&xj<4c)p7VVIz29LqH zTx~qI_(`U6AGX(!i&cSwjgbLY%`{}Tp%bUwa>xi8~>RQ}KWiY4^gbB24dO@~JgM7d6X1K(_PY4-vo$pQlopFl-s+5%~5kGBGPgpQ~*5(sz;+Xd>ci zQd`VgY?+VKMj~)N(|X_^rNuSkDw!6~2)k^p`jdXlPY^Sg&<}?$V&KnJUhfkbSqG2# zI$IYx&d|w9;k37P#-8Lo!`dEaYpWR67Aa7+VyeyB(rzl%D&(a7@d>%#S!US6TDFCn z4QWiSEWV?|(soAMxx#(smbBlIl?K%{yuKwXQNoMG`et_Xa7x5u@nxNq%MHrgM1Q{b zx5e*ZV|9*vR+BFSPZZ9#&4Og80hiIxRnrf)X)$_smIkD!mEM9l@7KDXJ4fkUG{9<6 zQt@dtv@fO`d${91%?k1+SEh&Lv5bO~t8W2_Ky_m)_8Y0@lS z!nv+pR_Ubrtldw@d~HuptLwEa{XNlg%5~f+41%Xg48*zJ)Boi<$Pf-%WP#n=LcSUKe zX^VTy4L1N$SCpN-apT6l@%;10-hTV-SM>zeQBkT3Vr?-+_4u=!nwn6rt3_z;>Tdr0 zTunRu_JRcq{<62l*L%?5!GqsYl(!-|Ki0I|qbnCKTv&Ui$LPB&#Y5tu^G=;=(~5hK zyt1mIqT*YVf2jTVrpxfGB6!8cz1_!;ojOJDda&>Zqx$(aKlj{oOWtcxwIBUx*Df3t z3Kswyo^xv7#uw(#pa1f%GqP`A>&X_E&xc)t%jFID-PvdoSQ02MEiN8;^YrP{|NV*~ zrSbaxfB~*qQ`4h%&z{i@fLV5_j_87NI zuybVP8GBABF@A*$18fJQnXt?4QrsG$%D}b{O#r=KzXk}ouH(0aS;u?4xA2P52ECZu1CBi68Ufj1=!>!;$34qSbm|_VS zD1?R=LBk8+-S@F*c+aUF8jjefMo&@uz2=dFIcXSI6V4BNxmYHnLnzH1654 z4Ub))9y+S_zi`C-#czCg)L(J)op^lbvhImpe_1?X!m3r+^SR2(a@Fbqs=uWCv-(z~ z)s^NiKKbO$KcYqX;x%=jmG}MnjWcGhx_!q^?S9NMawrHI33Z>9N4&G z(ag*Bd-2=*^k3!ucJYdLKRt$FZ$0+uhUJUr0CVhq?X}fZ;rZV1k_%LS!0!d90Ygse zg2N8JfFGKQ*5OckJot(#2!1S>-Y_7h3DPq#Ra44?ExU|MJtLqo!L;L%KD}w`VczjS zJmCil8Q_~RMBW5&y>w&YLbMjAR^s$2>NKv$^cX&=go!0M4*8^tAWLX(AZM|zhiNud z2k1?B&=-UYF%jqmG#L-N4+2B#z>woz5zIeVT(2p`Jc&n15N()p)H|G%-L1ys=9x0n z154$d*w^y(`z-cBp?8@?x@!MGv8bO1#Uj}g=V^@1w|P%scFmF%X(4r^YYoLNtr-OC zZrh$g7(r)dNn*>;4mqIkhB(D*kC^+)ZM`~Tt0>J20z3TID{N?X7m`P48St^KhFI_SG$@%MkV@}MLFHELVah3K_aMQ%5gsP z{5fN0o-EQ0!W&HHJFGba9<%{_vHc9GM>)O5i97@mWi3;bw!<<(xENk74Bkm5 zX1#vRXM|Nf5k$6J`Q~Meu0V5B3?4iP!dB=pg#HLzZDK3Bl8JL?TR1@OnX74! z51Gt`Oa_xo?A!jQyDKq@W&NqN8JeEc# z&mPS#&n!lv8!?KNwitzK#3)RhVKTSroZ(h2vCr@?sG2n^OEy)s4k?7cxt-KPlgTCH z5I5DVG1qe^_0H`_sn};w-$fOzL#P7CMwTF?_M{+FNd1svOte8|lnD2twOA*U z+f-ET@~st56P>dk4ntr?Aa8!S0VM7h<@@a!j%8Vul3# zvEzwE{c^ba3m4aY68C1|7Y{$W;CcE3u78q$q-SCtPFWsW`qb0cjR+**lm}{_SaA3R z{JQ-w{vH#}vtY*&{qvWfz*FCXokwHWT^LA&@HX}7okt==4(>hLK5yPj%_SuzIsSmF z@xa#icOUWP#u^TNT;J}`ZLi<8>*&x46MVVxCeavHDsQV2e-<0W(%ir9R>cE9oqF>v z*H;B&y>6=%5%F8~&YrHT5K((xG%8-C(hrLTqS`%t`EK1+B{qvU#2=LFM@C9}V4ZnnpE~~7pJaGbN{uEJMeB#8(Gp)tN#oDP;dP{qv z8V$T#TlekTxBtKip}J4vU|5)Dvi=af9LyGdCI%6^7V_z7j?bpw;O`3Fg{6HqwkJaZ z`Gp0=#oh3KadFZ9&v$M=|7*i8m^gOKSbsrb(ZsRWj~hC4#IT`5CyxF081dckSNHDw z?9jo}r&`p31N)VKShr(GVQFcvetpV&ZFu*+ZJ&PhaovfA##6CY)I(^EV3GM>s%`yC diff --git a/src/PdfEditorApp/Assets/Fonts/RobotoMono.ttf b/src/PdfEditorApp/Assets/Fonts/RobotoMono.ttf deleted file mode 100644 index f21d1d716bce3cc756bc618d32be71ce6f733f81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 183700 zcmb@u2Urx>8ZbO(W|v;Ju)DCm_r7eU_g)pSfq;Mo3yLU+2nyJHG-~W7Cf2A)G-Aq4 zOu4Byy?Ikizq#qX$PWKIyMTC;JpcE6&&Mz@bLN!yyyxxboxu=>VJ!GV!=!nWsxk}e zwKFkPlZ|2ciTvt}N{oq>VQA`CP|H#_$ztF0;Nwd%44r`c`bm>BCV&6Ht7#aTCWQL~ z4a*vq&@~u>`^#`Ip0%K%?d-R&y^dkw|G}`(`WAS;@yyc2@ceCfK5uqIdmH>`z<9~< zKWz5=u9l~wejUNE1S^I(Z_kGMKRkJXj-lz<7+O+3r@5giV!^5{FuoD$yXHVa#08{> z`zE+o&RMXuGx{;kvjBS-jQ9ThMY9?fBf}tuG0Um@1r42Tv}ojm`s<;-bYa7S<~MeI z5B*!9eu%nlQTx&p2dfASIjtBbk7!%c+%_jW9M2FpR)5&4LEO%-H0gu}EkJ zKTm$gG*kaSVaWb7O!vPLk{8wpx8WF0mBJ6S3v2Yh0Z4vvm`<(@$qV!pd=~r*ID@Xg z!7gB2Y#jy=O?(JrB8*0R5p9Pj82t{q1GS7hx8LSoCk6pt4fi+=UuzRsaD0v#& zg>A#;L0KJk5nF~8W1Fx%tN^RQQm`f10qh(+-2`y&#Wq8W=dstY^YFJ8u2*1ZvCXIe zYHYxA#b%?=&<_CD3#bu&hs)tE9Q}swfEirF3b8Wu4U~U{UPKS0 z0%Ss#z2UWN_BlXX@fU{_Y6Oq{BToTFZ#~Xom!PyMaKr~NeJ|i^;t|CB z(}4Y_F&|(!c+7)!2p+Qn|MOra<^lB7v264x4y@27Sd;%f3ILnbkurKLf%T(S@Xv=~ ze8eVfC9LhO$7Q(R95^CJK8Llw^*A3`|9wz82_+uIN3O0~?-NG&#%`i$i zl)j9`!CV&srnbV06a#I|4@i=~`g1pW3C%#Us0dcM0DBMkX&?0A0DjNFR$=$Rl^1hj zzd=tJKoN_4hzUH%K#?dF{SG*L8DM-6;Q1UVazFMCb~`}!3S3Bcr1j`gU35CK6OxIj~ziSya;0l+bjflgAk9kS_zN`VIONx&EXQvf;z4S zj$m)wVLsH1f(JFPn}-EPfcXWEijnt5o*%g~GBVOPas$?rlHiwMH7VJBW?XI;1Hacm zNeWQaCZM{@K*LvnMji&4yfARL0!qrDB_%~Dj%@_|oBu6}@g;kjb+_M5(g?iCWbQGOO-=Ps)fV=Uj z_`~==@n`Y(@E-|85JWf;ODKqq#AaeAag;bu3=z)~{~}%`-lVB$7FrIijMhk7L|aZ< zOZyk?E!u~)pXrFsptHqDoF*O=e=q(~{JW$?8Y$&S#ZtLcEwxG=QlB(gnk`)_?Umjo zy+?XRMwhW=T$x;^mYHRBa$FuFkCn6J964VumK)^x@_Ko*>bYN@AV&ZTU^l`Xq@W{w zAWxD*olsyb1;WL@c7X=JPmVr8|HwG&tU-Ou$8!txRba*Tp^w#UV%AaG&Rji z%cYgmX3^ScowW6|muPR(KBE0X$LUNlCQcRiiI0eX5dQ>oz@%&`Pb!tFU=DVvcYF?a z!W>TDGKcA-b70;who;dv43CVU88C|wpr*&+dF@=5A1Wwl~+M|}R@K-Oa9Za90% zc5(^1fSf~SLfuItl~g@HSlc5G|1xL+y}$Ij_PXkN!uv_@%iov3+Z}P7$is^Qmg{5C(YtVd2In`}PhgLq$DtqU4F2E` zz#W`7e}d2OEBKr61R$e+2*3kT3gSgd9^Q{fEEmikMZ7OYLHrcI;Gq5XyS zp;0*f(+{oiPeo$|2&ktO^kyYkID3Jsmx6Y?9pv^*(5UsmT@4@|2SDl!g7n!3@^T~a z`T?v3O#}O2D`>TY_zKWpld#FaOI0A>?m!KoO|#HEY(3tM-G=J0-JtI>uuRZTl(pT2 zT7d7e(R{ETa)4{=fR_(}HoXTs3jCZ8oPQDI>V2SXp9JaqIB@I`=&rXw%Dw?w^i9yF z|Hi%qt@s7@U+fpq4CM%6eryDVfLlSs3Qz>tSTTr+SV)FMU?oYhVz7l1K_}Wl$2zb+ z(2@Bl8|9)rGzlw3RoI;f#|~p8b{8VBlPC;3gCg;jcn@|8g=1$?6m~C)#x5Za$oE+6 z0mQ~GBOZ1EF|dbF0(J$(|w;m9z{az5hTF=iImt=NRB;*#MskFfjxm1poM4= z_6$;C&muKwp68GTtau&vJknw>f=~A^u)JRaKkpT=<6cH4ybpU2aj|R2jlGU+*gMDt z_I(ldK1#x_qZI4|l#G3dQn61^2KF&Z$38-7_#nOx`wV4apQ23cdsK>jgNm^Kpd9Qw zRDykt3bAidG4>-W$9_eV!RGh_)qsUG6}y3^pf>Dn|Nvq%cTj; zMD^fN%tp0n7V1P@_`lH#{9TZU@1t(C68{wc4F4SU;QztDK&$Zo;$Na({43Ole~nh- z-{9Y(HTZX^9}VE&<3Hd(;y>X(&zfq!y4K8*ID zy@ZXx(E)-$2MHQMCqjr&bO`L;BOrh6L9ghhPv) zf<>^2ID$iP(FuY_#1jeVe)Iskh%OO)^dP#7h6n+=f*u0@=n+DQ9wkJC82y8gpvMR) z;UHw_c|wj}04c8|RD>F=>VKh^2n~@)Xwl1HOT9|`n{W~?bRB(&K0+T8Zo-3pL_ZPN zi4Tcu#5-VX{epf)zY*^e@1ft(AH?g#8-$ne5l<8UL^sed@jmeZ@*|RXhIkfq42B~d z#|fN9BoWCVg`X!E<1u(F@e%Pc@iNHpPl!)(22o5D5hX+^QAU*v=TfrfgGXd!0fY&?#bL(C=q zOMHoQhp&55z zvxui~7oLIjTt*{<=V=g{2>u8`3S0wj^PzIU@2lv)I3M@m`S={X5C54k632;;Xce?3 z+8)|j+AFm0=wWmzeKY;1kj#*^A+LtgLsy1g2>l>T7M2z^IqYoM^>B0eK=`!?6tOVk zM8umBUqvz_t&vTU-H~raei3Di+8=c#njSqnx+^9uW?sz7n195YWB12?!N_EEFzHMq z^9z=X^)b7Gy`KF(dpK@s+zXrx&K}NZTsC()cQ*GQJU(w3Zx`>r_}KXQ@vGza#NQcz zKK}9ew-bm2MuI3opWsf&OK3>wPS~ArZ^A5*_KB;_J z`L6Om%AZu2DoT~ATBUkK^{na*)raZ`HCHWHo7FybuDViPr=F)irM{%Ts{WVyn));K z4{B1w*QhmiO{%6)Q>|&#EYz&ftkry@`9m9`?a~fvcW4i4Piik}AJ@L9eOvp94%0>H z;&n=$RhO*G*KO17*WIJ1>zR6yUZ;2JGxR0;srqL9VttQ(gMPREsQ#?}vi?c^OZsd2 zPYs=he#2J79frFN_Zc2BJY#s>aNU?@EHqXb>y53(WyaOU&Bi^(k4;skdQ+=undt%3 zW2P5OZ<#(eePjCFOfy%QYt3`b9p=^ME#`gZFkvE&DePj$@`{nPY?Fu;WF?a3T{9abkI5 zZQ_!|V@}Mea@IJvIS)C{Ixjgtbq>2CT|QT)tJ1Z=^`z@<*AH>juU|U-U$KdObgR zncl6w5MQJ3cHdV?2}w;!UnUEZ7bd@yB2TGI*^=^OYGUg7GFd%z$&hAL zWX#JrmT^5ZB6CgV{>+ykOvBI0$*Rp-k##=nt87_zNA^oO5jm@KuI2nUSCpHd`&jPV zxj*Nr^3w8Z^5*6B6?3 zPJeRxM>DV)Ni!DD*k8-2omYFZ_T##^x}3U;b;C2WW=@(pYv$gW|Ea&df!VO3;hV-O zjjzqhpLJ~3uT51=_cZ<1oYZ{kZ;wmOFE_u}JltY!>76Z_-81{+Iodfd%zbg*@z#RY z2V0+O{cJuq|CI%d1u7M@)A!y?n7fW6QohxBS!P-!C8T4C`cfN;(al?#`^vvd(Fp&7F%o zdpb9C?&>_;d8+eb=i{9(biUpBN$0nnH@ZT)m|emyO_!r9t*fxBx~rjUL04DTVAuAp z{ayET-QV?S*Rx%(cYUxzwZgh0X+`deiWM_f%wDl%#eFLtS@Fz@*H(P6;>#7kcH`aA z-6h>qx|_P&x>t6u@7~pYr29Sed%AaAnoX z`jzuncCLJ7<$Ejtv+~E4BRvs4oE}+^smI%s(^Jt?+cURkY0t`@fu7AhyLt}v+|_fY z=YgJwd!Fohq389UcY8kR`L1VpRp=_#D$y$KD#xm%RavWwR!v$peO1e<#j94XTDNNF zsza+z^~!toy{_KW-rU~G-n!nF-i5u(dRO&s?A_UWNAI!TQ@!`~Ug^Es`&{pixR+=U#tbQQxG#>3uDIi~G9zR`+f0+tqit?^NG|eOLRQ>wB~BqrR{Eep^jj%~&m5 zty%3@owPb@b=m6at6NqtUcGYly4BlO?^%6#_371@RzJG>xz%s1{&4kItAAQOye4c7 zdyQm`W{rJK>Y9QzRcq?k%wMy7P5+v$YwlQce9hT47uP(#=7lwHulab*w`>0B59w$2 zi~4o_&i?fN;{KZcS^bOpm-qMgZ|mRRe^3AY{r~8HzW>eskNUsv|9yZqz!(q=7zUCC z@&+mg>IUWxbPV(jY#!J%aL>S{fvW@m8n`y_*}xA221&DuZKg{)()6Rp#(OI(+}u6W&)bxrHq)~#H(e%-EhN7kKL zcX{1E*S)sxgLPl7`*l6BK6brey=J{*ecJk>^)>5ftzWdhd;Plgx2-?C{+{)pY>;iJ z+t9gT=Z4E0-rexkh8r70H?lWMHX1g%H)d^|y>Y|F^BdpV_`$}nK)K@(F~DfsA#NUu zMSx$%c0hQ^!FIFRM05LP(!QV64|Uj|cno!s>*(kIC`VmK@lOAG@VU=GyLxCRfQX?N z!yGb~%k6S$64e^DTH_4dxLtu8%IW3uxZKdVkkF8jP#Kfy2;6gm_h-e(ZP6)@m$PjixCPd7Oy{S~A*9y6k9z zm#9|Nd0Tc`EG9JkJFb+;>r+$eWil1QsVE&^AgoUDR*S?EYGP1!T52h}l(|@^HyhNd zMvuGQ^`fiY?QT@53^s#dN#>k0sVP|wlc_sD|4_yA6^HWkSC~wWtd!)Fux9%K_iccC z4n&E@Fb~i;odIY8V2z9y#4$AoPGF7{>J|G@#oUYe*$b5l71F458>Xi3sUpukygO&9 zC3Cuf!$Bx6j#uV#^q22OR+C{xQU00w)~54?HG?{_4DCfCzG88%t0#LwR<|=_u2P|< z@OcTKNd#yj0iRA8Q#N`MFZqw)4-ao5R{4|gqX*IJhyEx(h|{1FczqZx1zNx!&sYlw zlX%;I41Z#H%|m$qLG%Mu#=+r7SkuUtv>C8kSs11wWE>e0m<=_@;P3zOit)IC6`Mhj zTBOB!*&59xb>NzRRcY1xPIjJe9 znu(vO{wdzS3;K_O8{|MBGC~7Wz$4M+5B(n^|A%DNmPa1J@AA(e9C(lai}UzDL3V(^ zL9qLS(ej`z9oCbYyA$;e5vvc<*+3oC^Ih<~7@o(#4TTm0L=pl2K`3;6`atZj^H6l` z1D}mxlr+L~@FG8*VEB*t9|D|dsrK8TeJZpE+5)^1R3B_aOMQs&KmYJU1n#7tzj2k8 z`bRk}{l;UI{F?{3Y5@9Df&UHEI7U~0%kscynsJUA7aZdfZ%lA-xwHn9z!y|_JUgdN z+u`w4@C6A7BoV*TD{G=#tN)`Q1Hu%#3gPZKaJU}QMY*9OB^R0i#_gUjoNHdYnt7j z#V}Kf>$(6l3`_zu4a#e0P+rRb!OWnP9+k=v50EsT%gih($;>?0NNR_WBz=KaV=`&A z^V9Ks#7|lf1s&wY9swzDj|BPoY*Y+2`F=tIU!hY3~h?xP1PD6nd>H)$E*X zpmE!nfL66+=LGI!BJn+a<;RPQ2W>X5*Jd9qF21Y0ul&wnL3sF2U9Z@vve(wQm-~Dm zEGz*<<3!Ns>?rSE!OGGR-JxfDqiWoHws_KFSJ^hbV7HcY~Wlgg)bFNx#4to@@%+5YPv-(t4)}%?98HY=p z?N)0FYD=yWiUcZ^a&C6rK5u5O&1T)%*s#mt&P#~Zip4c)zA0j{SO-g#)^yD4O>;UN zyXxvTIqZ1}Oua-p17=qYcpU(|hEj9{vJYsLHgMw^boBu`>(HS;zM-?=0k#QnkO{R! zaH9w+iBT*-z-NNkbJEi9Cvde=H9s$Jfl{SGwDUO1O-;Rb-kf{W((*y@sWUpw7PrT2 z?#v*r4Xa!3&&(<=$;!O11xCpOSbAX;NR^OLrc$T|DRA~t^!!ugqg)R8*wY|ho+!wp zK^6(M8ni=D7r=9XNyTG3*a{+41K?19{&@7h$cPJ%TsSv3B=W-1^N}HQ&(k7PQ*QhO z5O9-|h%e!~za`8HXG?zu*E;7NY7 zUykScui)?FuR`k-XiafFKuom;AfV}V^5SdgDdG%)o_ZC31ONB%BL9cDgxCS~mq2|t z)Cc(qHUgj<@jyoB;BVo>&G<8Z15P|~khXTqp&P5VgS^IJ59%wLi&hFdoiJaS0|cm( z84xO?64Wt));OGCVUWy5)ex7f3YcF(Mec9}B>>U!I4dsG>pL`~`LNrQgs#YdSlmf7 zWisV+iyzF$$aC7Po2s34dR>l?h$f$Ofe;W##QJUZXBZx}rjB9ia-mNDfzvVTjHpdK}^b1<(g2-zzr z%L9#b&*-cub?2TyRROIKv}ec7N#;aD5`a|i2Z|GDwOUpI4=cddx zrql@HI73m<43}11Y_^t5r8XARCY6+1jrk(Ij};w_GdWfJ(md0pay6I3w1{xuA6Pd} z&5+8)0?qOwZ~qLAb%xeiE#&eNc)S!PdPkYU<0izh5~er}4Y01;U_K65C&;!L#rG(} zM-ANxYsR@{eS#)3-d)q7P)a09WkUSw}qHlp(oNv8Z(V3Z-&I zZOKA~QjV)ROP?()oSdDxBn0!nl$udlQ1JX#PT4lME4?a{jL4gu=5lSN;8+K6QYu*>btse zFe*<&C(yl+E|fz!YcFPI3794Q200;UU030HnkCGj3!m zL>uU6j+>&Y=VA4#=udz|1$+Fa{Z7PDPUJ+YdLFfr+lh_j;aA)qw}-)q*7EtfXhtl} zchnzxI> zm`rJD6m>$*9c><9@_)SnNMYLYB^in?eMlbcx^e~mPKM&k(G%o>HN=@eFa+D6D2N+q z3)ZkEG~bP< zGf_VL2B8lLrzhwbvCxt#c$3hUwkxGF6vvF!@)EQ$EH+AqfJl(SbO13>nB&jz2I2|< z@(R@`?j2$~#HuNdr0G(LG)P}*i>*>`eDvK!n8L?R5D6ucrhK5SbMp^699E=|a=h{* z6m_itnN?Us64!1ia!|mQt#w~}- z^mMqSU^`3J)6xJo5#(=RYzK3q;Ft&;U;s@7Ni%VE&kn_z`G(fimcuR}O&8E#(rmpr zksE#ze@CHIwv|}Rq(UQ;ZI_A)45e)#0cs>C7>{3qG^92Q!3Gob*aGC!r zPT6*VHJ-yt6yxD?51SpA?s5mEUp-AY4(m-F1at<}_J1nnl02THvz;?E5@-C-sW6UJ zpl|lgxzpqE4JlLrs-Zw4wz1>vQgObaWRX&-7?Wpl>=bSMiBdcDB;lLc5=C5me5p65&uU9D>-Ed>vsyH2Hz!sa2RM}YxLm%J z&(Biib(_tJc7vfkGpkvpcClksT&@#lwiS3oM^6vcVIVr7* zH(en=K|-h5+>>vp(P%Pxe5O+@Nf+x1ghDAgKsM3S$v?LFA86WQH0i>^LOC)0v`9KV zG%g{&G7SeM3S&M1V@hZ~$ZVu^wPK0Al%xE3qcAvN6?JAruNJrr%gK?-+>P z;olTV9KJ}XkT0Er5Bht$&U!q~spZgjBdmKf^nHu>A=!e49wA?0G0Ep1g~l&uWf72X zPFXOtd!R0OAF@AtABem29)a-W&d=`Z6o}3&KP%v_x(nZP;)H)L&F3#Ybqc@FU%G!k zmBxY~?~IbXzCZaN3&@Y&M7NQRZ-X{5yh%2q+up%Xq8Ndh)+mU$Ji3YtX#6lrPbEy zX&?GCd;9S#H-6t9mnstJ349NYQaq4f0x?Ax2Q-N);3k4LbfV4pmf`IXfm%Tv+(StF z_YHr(eh&uG>m9I4>GY>SYU;5hXg<+p;oMv#mrIqHI2wQ$b(h%_M5hMAr5sv%dUDFS zwngWXQ_|B@QqC`GyEi#G-5;sbE1EMiX2})0Fq*+EZ%j+Bm#fU-u)%IZRh!-_EG#K0 zEPQJdd3w`Z1w}>0g#~Y&2V3o@mi;!3POVlg$|q6lA)69{&&ovw=z_2+7H0V}03QP0 z8K_K%ZqYd^CJ_?re+Tu@&%b_h$BkqP6IFl-14IM#P{%2o7=#!#6K`?Jf=&zK&5;*$us3L1((mSPA3(6(23-()YRULnq4keN`6Ypoinl* zYSen2LNU{2oMg5v%=3RU2vF3Gd`0{YP=NQ2IHOv50_vQK39L9OT>>h7qF&(q8BzsW zJCM_^)0#9&WlLHb6>b_TNKHLi-*_@LHJ2w8&CE-xf_PB6&v&e``FK)N#udO|LsH62 zsZ0)De`_vbyIm@i&C1Scmdj;InXJxRe|uu03oM&ME%p|(xsaDoWYAC3H{StEpXPGk zHpx3fCR0cx(uNE-T&XF|2C+igY*>egK%5eSlYy{=1JDg&)dNrYm*RVeo*%w|&Wh0& z#6O2)7m)X&%02i#kKY2gc?hVl3|a$^vUw8?nQ;V74AkDl2piV(yIlzufgsDAJ71;J zDCCNk%#Pj6^ATmKDTk&mJ>&Iwl0ld@mvtI+c$uGrUsH4CQBl!$gK=4Q(F%jn(zmjC zuib7h$Vk6$&cX-M({j}bXn;y!!?plaD*6S;#!iPd3(yLFiz|2&5a8S(*bXA-0*wPs z?V$u75mOikeyQ%MPS5b2YFl*D>-Ab4jzbIV(>2;`en>`I^5p@>4_QqznG`0`l;LU7 zXv|EXT0Mn+p{BZrJaVaK-fLy~(@L|m9%z|*COdl)j~(Zf)L+U>D%H^}tQd(3>trmvC zXM1K)UCN}>z1~`&Z``bZ~IKXQoDz8c(<8cps|BnkAJsfHaP|}kK34JK;+$f9#+jm&Ec9-Y)!Ln&-(xl&` z8^5_H-==1vTfjY_fe&TNWLzI*RN^$?6 z$evKdA?_v@pEKm~69j>9cg`Y>Mt_LK0y9fwVK5kMPK=IEUdQ+M?a<^YBpx%_loJO5B?il@RCw78)***p z*Xm7g)9Wm89F|)tFf!s33>wY+^yE2ejp<-?B-5ji+L%lhkH>OIXw6IGxY5e^cufq0 z#bU%LIVn>hkSh_1sy(U{9!DAxA!NoU$=s7gfODa!(!mr(uvjtCF&duG7!wIP8An3= ze&PbqQX*u1VhHw9Zw(FdCU6h$*3e*JIow>XW+GjUg$ARJ$3*E>>eh^$C0d;c9c3}t zNh*mM@Q=2Xbn6XfaH8sxt)*hFBASSNR^eboMX^|%9OLFNO#(j&f7~?1ihS8~K=8;V zl4?g3PX&l#f;%TmgxO5-CQcH;c4s_0M#19Sni;W?(m1X^0HM%qs3x0^_Ibv$$BUBlVvhx@why&Q?rcbY$%|0 zbbzQc+3hA{cYa4fx5;R?8%^DhcIfg1e6g4>$kTP`^Z3*yKM&-a5@g`*Ajd;68$@NP z=my0Be?#O!F+M?vhk{XoGzhgb$j7e|=gEBsHR(KFJZ!1YOiFE1C{tbRV zF|pBF0qH0IjpIxFBlws2({tM${*V2f_I^dWM3Szwl?jAml|)u;6BwDX%$TSc6_=^v zvW*EpHM~b$$sEoFU<0=5X8J{dm zdb03JtpCU0@ZXLOPm0kHX`ZonZ^xGj zCfID+X>vb8X7W`WRrnwFzx;GJa-lzd#rNRsJ?O2yu)*6v9>!zwtNv7=LIY^oli*d> zfKFZ$jHUvujrv?6>QPtn*05^mgis=9qICG1jRWA3TlWs)xE!#^gNkP~ND7jD)cPd) zl4=!lbF`VE=EWzeVPlHJ4+#xNzZ>-W?g~q#JWj=6Xt;_hd;T(=-gG~k#db(s@Y!Hc)ohc|<%!t$DOUMVq!y-gHrcI>s#la6d zI$9L5J~BQcG6u;6aaO)CU0MC#$s24|Czl%~Wpfl!acqM|yC^3N8bAz_#m&_3vYAb* zD{>ZVw8nVQcOrq2B^2Er&xvzO3?*WbA|o@+pkYP_Iwf<&KEBw*iDgI<_!$b&;AMdM zyFoUIfd45EU@RkJERa6IzZu0Ib6gOEyGpy8oQtNAC(stME_H2A!+w{`m*jTsZ^#)) zC4cu)+jU|Q2uW~O5^Q_$=)LIOy^#s!7B&msLAW(q1;QSd^DkU;D&p|>WWt^pjerhDLtEfm1|54e7NQT< z18OjvjK;o6iBnY^4I@?=r*80Ci^XCS)6G!wcs_;5%wmfp!szHZwMN@D$xtrmYM8M~ zj%tRxvd>^NU170VNqT(>J3NL?qlbskMe#94z9E^-X5#Bq4kja({5FIZD&fS+@!qHB zo=Q&6rGF9?a+9xDn=m6Oi4LK zzVdWdyG~~@>*8zzVTR&qW4TEFZt z3G7fJw}#>*D*PMDgHQ->eB~$TDZm7%DjZEzuz)MzpwSF~kPxEewSv#mwv~I$HM(!% zy^GXoJnz0KbMMc{EXdEyxHvzr&z;sNPY`sF1BLAxtzNIywB__1ks}s^lcJH8(L=hL z1{?+4!wj8Z!>qk&Cl-3L3$n5vZg06SGqXq`({vW6?5Irr7b>{%Lz30fm0GX{w&AN? z(ecsgscjZtwIDtL=5_+)QXR-87Q879ehEb5WPw1!s5=5-oeAnoAwvyALx|IHF)cMC zBQ@<}2l*x9l(xeTH0%{DDJ8!Qq_KI^yq*KKwFkVOw7rlaG0Wv_RH;pr{Tql`hH!&1 zOLU9N6WAu0K&G0%jakyt0J(?e_?q=%CvRwo=M)=Sl3EV9oUS3cLb0&eUI`&f7Rw@* zlvzq38%qw`dx0<|kH;_w@Z#SJ@kqWdmdm3em>YsI%LFdOi184qi_PH$VwMQI0+^v9 zGyfZT$HP(Yf5|xX%m?I>g@BFsNZ9g4ACS$RIQz!aXbPYaI|+GJ#V}9E|C2$ub)tt3 z%oDU|D1MsY?F1-lj7LXZB4Eyd@R*1w4ihz?<+G$|3Gw2%ScWo|5oeam%jI$tq|aqr z2$dYMWNYVqSv>URrl)ky0qlv^KCaC zr`DD7`exF~z~1-3^n(d~yb0D1MftK(LyqeTatEcQh#-SFWdW^%Hx%{Q>_vitgcPNI zc1r0ooytf@{wQ#3&UVzF%gQXx%glUaTHYL)T!uR%?J9Kxt&GQJTN8RXsu(8QXSa0c z(j(|yb1$T)=cDrcyr(;i9ZwhJR}4F;R5BMoeW6xohV?l%Vx{GT9DsL;Zi&i{#!Yx& z6a|1EUj|A{j*D?vw_xU?#;FLZ!|?@$H6=EIdpRe=(WKGZhceynZKb!>K13UUr082Bi?;CBGv9#KY8lUUVJkaS|*Q9o4B zZ?pOSZil*Hjl+=>_5Me!S$X;AX6k32&&!*|`tm_akYAQsoKVvxjYr zS52baSV}$yEI6>BNB4;-^9{086p*HZKu}T#9x{Xm$!<8WqT{cVkD75a`RMEDIQb-6 zNe-ZuD7W)u7yh#ULRB?h>bG{C?1Y|=KoqwScAzaVj8mZrOxq1&7xo&)_MTzFH-p`v zdqy`7m_+aENGz2!W@z*HJj+x|{T(j1@4^KnqqeZPGet3)a$VIri`foa)3bcj#1aW& zMBm2bCfXsgGi%$hETd7(<}et$;usE_b$c!G0lXUvP8gLzimR!tAS@JeVcsQs0nWKl zz6{ofis?FK8kl|%)=}|x%WegaTB5&PCJiAc@1dbu@^HxbQfY^ROLb>ba%RZkJLxCR z5aE%L%F)$|;f98X5$LTI8@q@8YQ2WKH?GJVTQF{-NM57@MU7*^2W1mO0(Pzm@);Nu6qqlFJ;RMKIZ{ zWFtQC0bXp^>03RXIXa!4f_nDIr?j0k5A3S|o>e?5caM@o0keZ52Tdq1s6s+{?f@a6 ziF`6aqY!tt4lGq_joOt1oyptF%eN(W^mpowT6J6hoYdV_Rk!;r{` z12%gSq?-(Y*Z$ea&-e>~Z329pz^?zqJ#qZLD=dgoCMCfi^cL~Xu!h`dPE9pi)6-$j z=m&B${x;~3(Y6jIJCP!NkVdddc*GDV$piTwUQZG}Ygk9Tg}SX78CEm3Lk^jjBR|sw zK$SKs8w&-4+Mr=5B{M;0g#J0&4VoB!CqjuvhG=17GO?vWqp?F0=Hce)2fe;*G^AI^ zr&=ICK`2s-#CdXiGJ_Gp9iPt~niPQ`QKWD5dV2GxZMNAQHnU~zkC8Lllf&wi7)TpWqZs`OcjBcd`g+pL^6CuZ6A0k4- zq$1OFrOE;^%6$zryWQ?IG^CbDD-50*p+KMz3Nj_Oq}bT-H+^0Tn_eG&RFljX*hPj} z9&g_$VXqNv3kr-%!l{fKO@f*DNwF~5*@sE84B@*0eE+P1ci@$O;v zD9OY%0ArpqSAxi_|zS#be zxir{~0P4o*kYh=+4!7>v13P61yN26{xA14FCm>Nd#9Mv>x9!~vPYUr(v~`4h>q(1Ou0hLt`7_g8p5p%E)U=*O1TgJKN2G1QI6v@Xgi*}8VKgTlR z8b%z&JRSmH0H7ck#WdWv!ng=ElX{{fq!l27{knjk2$mwH-+`#$7s!i}SJZD1yA*<( zO={IFw`-AIqpMJ>vib2;hUH|lBtxpPFLc3PqS}O)MQj^xoexQH4Z_8;+T^suwKJ~u z#H{(KZqB(3eRli`VPj6teXa9{DHzfLhKf-bZW^|f9~=0+>6ucz9E66buqfgE8CRQK zBg>T;Dn)U!1Rgg>rK#3y?2Fv401P=1`+lCg;NHBPM&V*Xi6i6O!jgB_#VmhiTEm?g z>5Y=b!iLyfA;>Czc*w(1?g_6B_FK? zb`O|%Otky`_tBP+zP-P9?hU;Rb+X8v#OEO?fgOe*9s@7v1pMv^h@@tv0LKXaQ}ZNV z<)l``C&ZzJOP4N+;&Q6;In7&*7Q==uTQ-rOqn{G!=%vGY{QO1mu` zZzn3!vrbl=+Oc{ETC@FR`JI_LlPAF70+tKnY-}N&qkc_5YK(ezqac9thSeR#Hp=2O zZnc<=uzlK^U)dq!@k|cWriQru$y`pf*_x20)nxE(7EXLZ<&Ac{IxFkW@{_qOa`3}< z7%Z~s$)_ft$w?_D0BDN*K)t==^#X~|PMp6L;Uu{gsfml^VsZ%@WP|)!j_st?(k=xg zDp*ut^in|sC;s#hIS<`Fg!aJq1x}JRm&p|L1gsQx65j;x%a2Pk;;Z3D0+I}}o8gla zR@#ry)2PKT))xV?5P#|f*^5@6K&|@WM~E6K>0vLVK^)pUd@3kAFJk|q`Dn8!IM_Ud z+=vQbhoXziQ4uO$PF_U$%gG1H%gff;MUDKhg z_=&Bg(ElR(s1HOlGqZFCT5x3KXoF+d(UBvAj?2_|TTmP=l^6-`nNa)QLHm_5azUg7 zjR#O)#NR&I6Jc4A?%GVWn=2O`hzow5%0A>c(48Q8CXw`oy^)qhO{tYXvd) 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%0AT34)cs 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

-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 z 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⪻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 diff --git a/src/PdfEditorApp/Assets/IconCodefrydev.svg b/src/PdfEditorApp/Assets/IconCodefrydev.svg deleted file mode 100644 index 07c4e45..0000000 --- a/src/PdfEditorApp/Assets/IconCodefrydev.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/src/PdfEditorApp/Assets/app-logo.ico b/src/PdfEditorApp/Assets/app-logo.ico deleted file mode 100644 index 9c72c356ad8a297640b160b6ac62d5329c60e9aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27089 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 EAEcF;EC2ui diff --git a/src/PdfEditorApp/Assets/app-logo.png b/src/PdfEditorApp/Assets/app-logo.png deleted file mode 100644 index 7e12c6e61cdf1938147f3b4ca3a10f372891a458..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52561 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 VC&Gj}S9dw?=5?cMrB|Gu{tqVNg|Ywu diff --git a/src/PdfEditorApp/Assets/app-logo.svg b/src/PdfEditorApp/Assets/app-logo.svg deleted file mode 100644 index ad1f2f5..0000000 --- a/src/PdfEditorApp/Assets/app-logo.svg +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - FryPDF - diff --git a/src/PdfEditorApp/Converters/CommonConverters.cs b/src/PdfEditorApp/Converters/CommonConverters.cs deleted file mode 100644 index 947e255..0000000 --- a/src/PdfEditorApp/Converters/CommonConverters.cs +++ /dev/null @@ -1,395 +0,0 @@ -using System; -using System.Globalization; -using Avalonia; -using Avalonia.Data.Converters; -using Avalonia.Media; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Models; - -namespace PdfEditorApp.Converters; - -public class EqualityToBooleanConverter : IValueConverter -{ - public static readonly EqualityToBooleanConverter Instance = new(); - - public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) - { - if (value == null && parameter == null) return true; - if (value == null || parameter == null) return false; - return string.Equals(value.ToString(), parameter.ToString(), StringComparison.OrdinalIgnoreCase); - } - - public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) - { - if (value is true && parameter != null) - { - if (targetType == typeof(int) || targetType == typeof(int?)) - { - if (int.TryParse(parameter.ToString(), out int intVal)) - return intVal; - } - if (targetType.IsEnum && parameter is string enumStr) - { - if (Enum.TryParse(targetType, enumStr, true, out var enumVal)) - return enumVal; - } - if (targetType == typeof(string)) - { - return parameter.ToString(); - } - return parameter; - } - return Avalonia.Data.BindingOperations.DoNothing; - } -} - -public class BooleanToStretchConverter : IValueConverter -{ - public static readonly BooleanToStretchConverter Instance = new(); - - public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) - { - bool isTrue = value is true; - return isTrue ? Stretch.Uniform : Stretch.Fill; - } - - public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) - { - throw new NotSupportedException(); - } -} - -public class ZoomPercentageConverter : IValueConverter -{ - public static readonly ZoomPercentageConverter Instance = new(); - - public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) - { - if (value is double zoom) - { - return $"{(int)Math.Round(zoom * 100)}%"; - } - return "100%"; - } - - public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) - { - throw new NotSupportedException(); - } -} - -public class NullToBooleanConverter : IValueConverter -{ - public static readonly NullToBooleanConverter Instance = new(); - - public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) - { - bool isNull = value == null; - if (parameter is string paramStr && paramStr.Equals("invert", StringComparison.OrdinalIgnoreCase)) - { - return isNull; - } - return !isNull; - } - - public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) - { - throw new NotSupportedException(); - } -} - -public class BooleanToBrushConverter : IValueConverter -{ - public static readonly BooleanToBrushConverter Instance = new(); - - public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) - { - bool isTrue = value is true; - if (parameter is string paramStr) - { - var parts = paramStr.Split('|'); - string trueHex = parts.Length > 0 ? parts[0] : "#0F6CBD"; - string falseHex = parts.Length > 1 ? parts[1] : "#E2E8F0"; - - string selectedHex = isTrue ? trueHex : falseHex; - if (Color.TryParse(selectedHex, out var col)) - { - return new SolidColorBrush(col); - } - } - return isTrue ? new SolidColorBrush(Color.Parse("#0F6CBD")) : new SolidColorBrush(Color.Parse("#E2E8F0")); - } - - public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) - { - throw new NotSupportedException(); - } -} - -public class BooleanToThicknessConverter : IValueConverter -{ - public static readonly BooleanToThicknessConverter Instance = new(); - - public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) - { - bool isTrue = value is true; - if (parameter is string paramStr) - { - var parts = paramStr.Split('|'); - double trueVal = parts.Length > 0 && double.TryParse(parts[0], out var t) ? t : 2.0; - double falseVal = parts.Length > 1 && double.TryParse(parts[1], out var f) ? f : 1.0; - return new Thickness(isTrue ? trueVal : falseVal); - } - return new Thickness(isTrue ? 2.0 : 1.0); - } - - public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) - { - throw new NotSupportedException(); - } -} - -public class DoubleToThicknessConverter : IValueConverter -{ - public static readonly DoubleToThicknessConverter Instance = new(); - - public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) - { - if (value is double d) - { - return new Thickness(d); - } - if (value is int i) - { - return new Thickness(i); - } - if (value is float f) - { - return new Thickness(f); - } - return new Thickness(0); - } - - public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) - { - if (value is Thickness t) - { - return t.Left; - } - return 0.0; - } -} - -public class DoubleToCornerRadiusConverter : IValueConverter -{ - public static readonly DoubleToCornerRadiusConverter Instance = new(); - - public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) - { - if (value is double d) - { - return new CornerRadius(d); - } - if (value is int i) - { - return new CornerRadius(i); - } - if (value is float f) - { - return new CornerRadius(f); - } - return new CornerRadius(0); - } - - public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) - { - if (value is CornerRadius c) - { - return c.TopLeft; - } - return 0.0; - } -} - -public class TextAlignmentConverter : IValueConverter -{ - public static readonly TextAlignmentConverter Instance = new(); - - public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) - { - if (value is TextAlignmentMode mode) - { - return mode switch - { - TextAlignmentMode.Left => Avalonia.Media.TextAlignment.Left, - TextAlignmentMode.Center => Avalonia.Media.TextAlignment.Center, - TextAlignmentMode.Right => Avalonia.Media.TextAlignment.Right, - TextAlignmentMode.Justify => Avalonia.Media.TextAlignment.Justify, - _ => Avalonia.Media.TextAlignment.Left - }; - } - return Avalonia.Media.TextAlignment.Left; - } - - public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) - { - throw new NotSupportedException(); - } -} - -public class BooleanToFontWeightConverter : IValueConverter -{ - public static readonly BooleanToFontWeightConverter Instance = new(); - - public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) - { - bool isBold = value is true; - return isBold ? FontWeight.Bold : FontWeight.Normal; - } - - public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) - { - return value is FontWeight weight && weight >= FontWeight.Bold; - } -} - -public class BooleanToFontStyleConverter : IValueConverter -{ - public static readonly BooleanToFontStyleConverter Instance = new(); - - public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) - { - bool isItalic = value is true; - return isItalic ? FontStyle.Italic : FontStyle.Normal; - } - - public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) - { - return value is FontStyle style && style == FontStyle.Italic; - } -} - -public class BooleanToTextDecorationsConverter : IValueConverter -{ - public static readonly BooleanToTextDecorationsConverter Instance = new(); - - public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) - { - bool isUnderline = value is true; - return isUnderline ? TextDecorations.Underline : null; - } - - public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) - { - return value is TextDecorationCollection decs && decs.Count > 0; - } -} - -public class StringToFontFamilyConverter : IValueConverter -{ - public static readonly StringToFontFamilyConverter Instance = new(); - - public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) - { - if (value is string fontName && !string.IsNullOrWhiteSpace(fontName)) - { - return PdfEditorApp.Services.FontHelper.CreateFontFamily(fontName); - } - if (value is FontFamily ff) - { - return ff; - } - return FontFamily.Default; - } - - public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) - { - if (value is FontFamily ff) - { - return ff.Name; - } - return value?.ToString(); - } -} - -public class BooleanToStringConverter : IValueConverter -{ - public static readonly BooleanToStringConverter Instance = new(); - - public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) - { - bool isTrue = value is true; - if (parameter is string paramStr) - { - var parts = paramStr.Split('|'); - string trueVal = parts.Length > 0 ? parts[0] : "True"; - string falseVal = parts.Length > 1 ? parts[1] : "False"; - return isTrue ? trueVal : falseVal; - } - return isTrue ? "True" : "False"; - } - - public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) - { - throw new NotSupportedException(); - } -} - -public class MultiplyConverter : IMultiValueConverter -{ - public static readonly MultiplyConverter Instance = new(); - - public object? Convert(System.Collections.Generic.IList values, Type targetType, object? parameter, CultureInfo culture) - { - if (values != null && values.Count >= 2 && values[0] != null && values[1] != null) - { - try - { - double v1 = System.Convert.ToDouble(values[0], CultureInfo.InvariantCulture); - double v2 = System.Convert.ToDouble(values[1], CultureInfo.InvariantCulture); - return v1 * v2; - } - catch - { - return 0.0; - } - } - return 0.0; - } -} - -public class RotationToTransformConverter : IValueConverter -{ - public static readonly RotationToTransformConverter Instance = new(); - - public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) - { - if (value is double angle && Math.Abs(angle) > 0.001) - { - return new RotateTransform(angle); - } - if (value is int angleInt && angleInt != 0) - { - return new RotateTransform(angleInt); - } - if (value is float angleFloat && Math.Abs(angleFloat) > 0.001f) - { - return new RotateTransform(angleFloat); - } - if (value is string str && double.TryParse(str, NumberStyles.Float, CultureInfo.InvariantCulture, out double parsed) && Math.Abs(parsed) > 0.001) - { - return new RotateTransform(parsed); - } - return null; - } - - public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) - { - if (value is RotateTransform rt) - { - return rt.Angle; - } - return 0.0; - } -} - diff --git a/src/PdfEditorApp/Converters/ExtendedConverters.cs b/src/PdfEditorApp/Converters/ExtendedConverters.cs deleted file mode 100644 index f603cc5..0000000 --- a/src/PdfEditorApp/Converters/ExtendedConverters.cs +++ /dev/null @@ -1,1158 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.ComponentModel; -using System.Globalization; -using System.Linq; -using System.Reflection; -using System.Text; -using System.Text.RegularExpressions; -using Avalonia; -using Avalonia.Data.Converters; -using Avalonia.Media; - -namespace PdfEditorApp.Converters; - -#region 1. File Size & Formatting Converters - -///

-/// Formats byte counts (long/int/double) into human-readable strings like "1.45 MB", "340 KB", "12 B", "2.1 GB". -/// Parameter can specify decimal places (e.g. "0", "1", "2"). Defaults to 1 decimal place. -/// -public class ByteSizeToStringConverter : IValueConverter -{ - public static readonly ByteSizeToStringConverter Instance = new(); - - private static readonly string[] SizeSuffixes = { "B", "KB", "MB", "GB", "TB", "PB" }; - - public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) - { - if (value == null) return "0 B"; - - double bytes; - try - { - bytes = System.Convert.ToDouble(value, CultureInfo.InvariantCulture); - } - catch - { - return "0 B"; - } - - if (bytes < 0) return "-" + Convert(-bytes, targetType, parameter, culture); - if (bytes == 0) return "0 B"; - - int decimalPlaces = 1; - if (parameter is string paramStr && int.TryParse(paramStr, out int dp)) - { - decimalPlaces = Math.Clamp(dp, 0, 4); - } - - int mag = (int)Math.Log(bytes, 1024); - mag = Math.Clamp(mag, 0, SizeSuffixes.Length - 1); - - double adjustedSize = bytes / Math.Pow(1024, mag); - - // For Bytes ("B"), don't show fractional parts - if (mag == 0) - { - return $"{(long)bytes} B"; - } - - string format = $"F{decimalPlaces}"; - return $"{adjustedSize.ToString(format, culture ?? CultureInfo.InvariantCulture)} {SizeSuffixes[mag]}"; - } - - public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) - { - if (value is string str && !string.IsNullOrWhiteSpace(str)) - { - str = str.Trim(); - for (int i = SizeSuffixes.Length - 1; i >= 0; i--) - { - string suffix = SizeSuffixes[i]; - if (str.EndsWith(suffix, StringComparison.OrdinalIgnoreCase)) - { - string numPart = str[..^suffix.Length].Trim(); - if (double.TryParse(numPart, NumberStyles.Float, culture ?? CultureInfo.InvariantCulture, out double num)) - { - long result = (long)(num * Math.Pow(1024, i)); - if (targetType == typeof(int)) return (int)result; - if (targetType == typeof(double)) return (double)result; - return result; - } - } - } - } - return 0L; - } -} - -/// -/// Formats DateTime / DateTimeOffset / DateOnly into customized date/time format strings. -/// Supports parameter strings like "yyyy-MM-dd", "g", "MMM dd, yyyy", "t", "Relative". -/// -public class DateTimeFormatConverter : IValueConverter -{ - public static readonly DateTimeFormatConverter Instance = new(); - - public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) - { - if (value == null) return string.Empty; - - DateTime dt; - if (value is DateTime dateTime) - { - dt = dateTime; - } - else if (value is DateTimeOffset dto) - { - dt = dto.LocalDateTime; - } - else if (value is DateOnly dateOnly) - { - dt = dateOnly.ToDateTime(TimeOnly.MinValue); - } - else - { - return value.ToString(); - } - - string format = parameter as string ?? "g"; - - if (format.Equals("Relative", StringComparison.OrdinalIgnoreCase)) - { - var span = DateTime.Now - dt; - if (span.TotalSeconds < 60) return "Just now"; - if (span.TotalMinutes < 60) return $"{(int)span.TotalMinutes}m ago"; - if (span.TotalHours < 24) return $"{(int)span.TotalHours}h ago"; - if (span.TotalDays < 7) return $"{(int)span.TotalDays}d ago"; - return dt.ToString("MMM dd, yyyy", culture ?? CultureInfo.InvariantCulture); - } - - return dt.ToString(format, culture ?? CultureInfo.InvariantCulture); - } - - public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) - { - if (value is string str && DateTime.TryParse(str, culture ?? CultureInfo.InvariantCulture, out var dt)) - { - if (targetType == typeof(DateTimeOffset)) return new DateTimeOffset(dt); - if (targetType == typeof(DateOnly)) return DateOnly.FromDateTime(dt); - return dt; - } - return null; - } -} - -/// -/// Formats TimeSpan or seconds into human-readable duration strings like "01:23", "1h 30m", or "45s". -/// -public class TimeSpanFormatConverter : IValueConverter -{ - public static readonly TimeSpanFormatConverter Instance = new(); - - public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) - { - if (value == null) return "0:00"; - - TimeSpan ts; - if (value is TimeSpan t) - { - ts = t; - } - else - { - try - { - double seconds = System.Convert.ToDouble(value, CultureInfo.InvariantCulture); - ts = TimeSpan.FromSeconds(seconds); - } - catch - { - return "0:00"; - } - } - - string format = parameter as string ?? "timer"; - - if (format.Equals("words", StringComparison.OrdinalIgnoreCase)) - { - if (ts.TotalHours >= 1) return $"{(int)ts.TotalHours}h {ts.Minutes}m"; - if (ts.TotalMinutes >= 1) return $"{(int)ts.TotalMinutes}m {ts.Seconds}s"; - return $"{ts.Seconds}s"; - } - - if (ts.TotalHours >= 1) - { - return $"{(int)ts.TotalHours}:{ts.Minutes:D2}:{ts.Seconds:D2}"; - } - return $"{ts.Minutes}:{ts.Seconds:D2}"; - } - - public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) => throw new NotSupportedException(); -} - -#endregion - -#region 2. Math & Arithmetic Converters - -/// -/// Adds a parameter numeric offset to the value: value + parameter. -/// -public class MathAddConverter : IValueConverter -{ - public static readonly MathAddConverter Instance = new(); - - public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) - { - if (value == null) return 0.0; - try - { - double v = System.Convert.ToDouble(value, CultureInfo.InvariantCulture); - double p = parameter != null ? System.Convert.ToDouble(parameter, CultureInfo.InvariantCulture) : 0.0; - double res = v + p; - if (targetType == typeof(int)) return (int)Math.Round(res); - return res; - } - catch - { - return value; - } - } - - public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) - { - if (value == null) return 0.0; - try - { - double v = System.Convert.ToDouble(value, CultureInfo.InvariantCulture); - double p = parameter != null ? System.Convert.ToDouble(parameter, CultureInfo.InvariantCulture) : 0.0; - double res = v - p; - if (targetType == typeof(int)) return (int)Math.Round(res); - return res; - } - catch - { - return value; - } - } -} - -/// -/// Subtracts a parameter numeric offset from the value: value - parameter. -/// -public class MathSubtractConverter : IValueConverter -{ - public static readonly MathSubtractConverter Instance = new(); - - public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) - { - if (value == null) return 0.0; - try - { - double v = System.Convert.ToDouble(value, CultureInfo.InvariantCulture); - double p = parameter != null ? System.Convert.ToDouble(parameter, CultureInfo.InvariantCulture) : 0.0; - double res = v - p; - if (targetType == typeof(int)) return (int)Math.Round(res); - return res; - } - catch - { - return value; - } - } - - public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) - { - if (value == null) return 0.0; - try - { - double v = System.Convert.ToDouble(value, CultureInfo.InvariantCulture); - double p = parameter != null ? System.Convert.ToDouble(parameter, CultureInfo.InvariantCulture) : 0.0; - double res = v + p; - if (targetType == typeof(int)) return (int)Math.Round(res); - return res; - } - catch - { - return value; - } - } -} - -/// -/// Multiplies value by a parameter numeric factor: value * parameter. -/// -public class MathMultiplyConverter : IValueConverter -{ - public static readonly MathMultiplyConverter Instance = new(); - - public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) - { - if (value == null) return 0.0; - try - { - double v = System.Convert.ToDouble(value, CultureInfo.InvariantCulture); - double p = parameter != null ? System.Convert.ToDouble(parameter, CultureInfo.InvariantCulture) : 1.0; - double res = v * p; - if (targetType == typeof(int)) return (int)Math.Round(res); - return res; - } - catch - { - return value; - } - } - - public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) - { - if (value == null) return 0.0; - try - { - double v = System.Convert.ToDouble(value, CultureInfo.InvariantCulture); - double p = parameter != null ? System.Convert.ToDouble(parameter, CultureInfo.InvariantCulture) : 1.0; - if (Math.Abs(p) < 0.000001) return 0.0; - double res = v / p; - if (targetType == typeof(int)) return (int)Math.Round(res); - return res; - } - catch - { - return value; - } - } -} - -/// -/// Divides value by a parameter numeric divisor: value / parameter. -/// -public class MathDivideConverter : IValueConverter -{ - public static readonly MathDivideConverter Instance = new(); - - public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) - { - if (value == null) return 0.0; - try - { - double v = System.Convert.ToDouble(value, CultureInfo.InvariantCulture); - double p = parameter != null ? System.Convert.ToDouble(parameter, CultureInfo.InvariantCulture) : 1.0; - if (Math.Abs(p) < 0.000001) return 0.0; - double res = v / p; - if (targetType == typeof(int)) return (int)Math.Round(res); - return res; - } - catch - { - return value; - } - } - - public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) - { - if (value == null) return 0.0; - try - { - double v = System.Convert.ToDouble(value, CultureInfo.InvariantCulture); - double p = parameter != null ? System.Convert.ToDouble(parameter, CultureInfo.InvariantCulture) : 1.0; - double res = v * p; - if (targetType == typeof(int)) return (int)Math.Round(res); - return res; - } - catch - { - return value; - } - } -} - -/// -/// Converts double (0..1 or 0..100) to formatted percentage string ("75%") and roundtrips. -/// Parameter "0-1" interprets input as 0..1 scale (default). Parameter "0-100" interprets as 0..100 scale. -/// -public class PercentageConverter : IValueConverter -{ - public static readonly PercentageConverter Instance = new(); - - public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) - { - if (value == null) return "0%"; - try - { - double d = System.Convert.ToDouble(value, CultureInfo.InvariantCulture); - bool isHundredScale = parameter is string p && p.Contains("100"); - double pct = isHundredScale ? d : (d * 100.0); - return $"{(int)Math.Round(pct)}%"; - } - catch - { - return "0%"; - } - } - - public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) - { - if (value is string str) - { - string clean = str.Replace("%", "").Trim(); - if (double.TryParse(clean, NumberStyles.Float, culture ?? CultureInfo.InvariantCulture, out double parsed)) - { - bool isHundredScale = parameter is string p && p.Contains("100"); - double res = isHundredScale ? parsed : (parsed / 100.0); - if (targetType == typeof(int)) return (int)Math.Round(res); - return res; - } - } - return 0.0; - } -} - -#endregion - -#region 3. Units & Dimension Converters (PDF Studio) - -/// -/// Converts PDF points (72 pt/inch) to millimeters (25.4 mm/inch): 1 pt = 0.352778 mm. -/// Two-way binding supported: mm converted back to points accurately. -/// -public class PointsToMillimetersConverter : IValueConverter -{ - public static readonly PointsToMillimetersConverter Instance = new(); - private const double PtToMmFactor = 25.4 / 72.0; // ~0.3527777777777778 - - public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) - { - if (value == null) return 0.0; - try - { - double pt = System.Convert.ToDouble(value, CultureInfo.InvariantCulture); - double mm = pt * PtToMmFactor; - - if (parameter is string paramStr && paramStr.Equals("format", StringComparison.OrdinalIgnoreCase)) - { - return $"{mm:F1} mm"; - } - return Math.Round(mm, 2); - } - catch - { - return 0.0; - } - } - - public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) - { - if (value == null) return 0.0; - try - { - string str = value.ToString()?.Replace("mm", "", StringComparison.OrdinalIgnoreCase).Trim() ?? "0"; - double mm = double.Parse(str, CultureInfo.InvariantCulture); - double pt = mm / PtToMmFactor; - return Math.Round(pt, 2); - } - catch - { - return 0.0; - } - } -} - -/// -/// Converts PDF points (72 pt/inch) to inches: 1 pt = 1/72 inch. -/// Two-way binding supported. -/// -public class PointsToInchesConverter : IValueConverter -{ - public static readonly PointsToInchesConverter Instance = new(); - private const double PtToInchFactor = 1.0 / 72.0; - - public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) - { - if (value == null) return 0.0; - try - { - double pt = System.Convert.ToDouble(value, CultureInfo.InvariantCulture); - double inches = pt * PtToInchFactor; - - if (parameter is string paramStr && paramStr.Equals("format", StringComparison.OrdinalIgnoreCase)) - { - return $"{inches:F2} in"; - } - return Math.Round(inches, 3); - } - catch - { - return 0.0; - } - } - - public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) - { - if (value == null) return 0.0; - try - { - string str = value.ToString()?.Replace("in", "", StringComparison.OrdinalIgnoreCase).Replace("\"", "").Trim() ?? "0"; - double inches = double.Parse(str, CultureInfo.InvariantCulture); - double pt = inches * 72.0; - return Math.Round(pt, 2); - } - catch - { - return 0.0; - } - } -} - -/// -/// Converts PDF points (72 pt/inch) to screen/display pixels at a specified DPI (default 96 DPI). -/// -public class PointsToPixelsConverter : IValueConverter -{ - public static readonly PointsToPixelsConverter Instance = new(); - - public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) - { - if (value == null) return 0.0; - try - { - double pt = System.Convert.ToDouble(value, CultureInfo.InvariantCulture); - double dpi = parameter != null ? System.Convert.ToDouble(parameter, CultureInfo.InvariantCulture) : 96.0; - return pt * (dpi / 72.0); - } - catch - { - return 0.0; - } - } - - public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) - { - if (value == null) return 0.0; - try - { - double px = System.Convert.ToDouble(value, CultureInfo.InvariantCulture); - double dpi = parameter != null ? System.Convert.ToDouble(parameter, CultureInfo.InvariantCulture) : 96.0; - return px * (72.0 / dpi); - } - catch - { - return 0.0; - } - } -} - -#endregion - -#region 4. Logic, Boolean & Collection Converters - -/// -/// Inverts boolean values: true -> false, false -> true. Two-way supported. -/// -public class InverseBooleanConverter : IValueConverter -{ - public static readonly InverseBooleanConverter Instance = new(); - - public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) - { - return value is not true; - } - - public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) - { - return value is not true; - } -} - -/// -/// Returns true if a count or numeric value is greater than 0 (or greater than a parameter threshold). -/// Parameter "invert" or "-1" inverts the condition. -/// -public class CountToBooleanConverter : IValueConverter -{ - public static readonly CountToBooleanConverter Instance = new(); - - public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) - { - if (value == null) return false; - - double count = 0; - if (value is ICollection coll) - { - count = coll.Count; - } - else if (value is IEnumerable enumr && value is not string) - { - count = enumr.Cast().Count(); - } - else - { - try - { - count = System.Convert.ToDouble(value, CultureInfo.InvariantCulture); - } - catch - { - count = 0; - } - } - - double threshold = 0.0; - bool invert = false; - - if (parameter is string paramStr) - { - if (paramStr.Equals("invert", StringComparison.OrdinalIgnoreCase)) - { - invert = true; - } - else if (double.TryParse(paramStr, NumberStyles.Float, CultureInfo.InvariantCulture, out double t)) - { - threshold = t; - } - } - - bool result = count > threshold; - return invert ? !result : result; - } - - public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) => throw new NotSupportedException(); -} - -/// -/// Checks if a string or collection is null or empty. Returns true if empty, or false if populated. -/// Parameter "invert" reverses logic (true when has content). -/// -public class NullOrEmptyToBooleanConverter : IValueConverter -{ - public static readonly NullOrEmptyToBooleanConverter Instance = new(); - - public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) - { - bool isEmpty = false; - - if (value == null) - { - isEmpty = true; - } - else if (value is string s) - { - isEmpty = string.IsNullOrWhiteSpace(s); - } - else if (value is ICollection c) - { - isEmpty = c.Count == 0; - } - else if (value is IEnumerable e) - { - isEmpty = !e.Cast().Any(); - } - - bool invert = parameter is string p && p.Equals("invert", StringComparison.OrdinalIgnoreCase); - return invert ? !isEmpty : isEmpty; - } - - public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) => throw new NotSupportedException(); -} - -/// -/// Evaluates comparison expressions against a value: ">0", ">=1", "<10", "<=5", "==10", "!=0". -/// -public class ComparisonToBooleanConverter : IValueConverter -{ - public static readonly ComparisonToBooleanConverter Instance = new(); - - public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) - { - if (value == null || parameter == null) return false; - - try - { - double v = System.Convert.ToDouble(value, CultureInfo.InvariantCulture); - string expr = parameter.ToString()?.Trim() ?? string.Empty; - - if (expr.StartsWith(">=")) - { - double target = double.Parse(expr[2..].Trim(), CultureInfo.InvariantCulture); - return v >= target; - } - if (expr.StartsWith("<=")) - { - double target = double.Parse(expr[2..].Trim(), CultureInfo.InvariantCulture); - return v <= target; - } - if (expr.StartsWith(">")) - { - double target = double.Parse(expr[1..].Trim(), CultureInfo.InvariantCulture); - return v > target; - } - if (expr.StartsWith("<")) - { - double target = double.Parse(expr[1..].Trim(), CultureInfo.InvariantCulture); - return v < target; - } - if (expr.StartsWith("==")) - { - double target = double.Parse(expr[2..].Trim(), CultureInfo.InvariantCulture); - return Math.Abs(v - target) < 0.0001; - } - if (expr.StartsWith("!=")) - { - double target = double.Parse(expr[2..].Trim(), CultureInfo.InvariantCulture); - return Math.Abs(v - target) >= 0.0001; - } - - if (double.TryParse(expr, NumberStyles.Float, CultureInfo.InvariantCulture, out double eqTarget)) - { - return Math.Abs(v - eqTarget) < 0.0001; - } - } - catch - { - // fallback string equality - return string.Equals(value?.ToString(), parameter?.ToString(), StringComparison.OrdinalIgnoreCase); - } - - return false; - } - - public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) => throw new NotSupportedException(); -} - -/// -/// Formats an integer count with pluralization: e.g. Parameter="page|pages" -> "0 pages", "1 page", "5 pages". -/// -public class CountToStringConverter : IValueConverter -{ - public static readonly CountToStringConverter Instance = new(); - - public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) - { - int count = 0; - if (value is int i) count = i; - else if (value is long l) count = (int)l; - else if (value is ICollection coll) count = coll.Count; - else if (value != null && int.TryParse(value.ToString(), out int parsed)) count = parsed; - - if (parameter is string paramStr) - { - var parts = paramStr.Split('|'); - string singular = parts.Length > 0 ? parts[0] : "item"; - string plural = parts.Length > 1 ? parts[1] : (singular + "s"); - - return count == 1 ? $"{count} {singular}" : $"{count} {plural}"; - } - - return count.ToString(); - } - - public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) => throw new NotSupportedException(); -} - -#endregion - -#region 5. Graphics, Color & Transform Converters - -/// -/// Converts Avalonia Color to SolidColorBrush and back. -/// -public class ColorToBrushConverter : IValueConverter -{ - public static readonly ColorToBrushConverter Instance = new(); - - public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) - { - if (value is Color color) - { - return new SolidColorBrush(color); - } - return Brushes.Transparent; - } - - public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) - { - if (value is ISolidColorBrush brush) - { - return brush.Color; - } - return Colors.Transparent; - } -} - -/// -/// Dynamically scales an element via ScaleTransform(scaleX, scaleY). -/// Parameter can specify uniform scale or "scaleX,scaleY". -/// -public class ScaleToTransformConverter : IValueConverter -{ - public static readonly ScaleToTransformConverter Instance = new(); - - public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) - { - if (value == null) return null; - - try - { - double scaleX = 1.0; - double scaleY = 1.0; - - if (value is double d) - { - scaleX = scaleY = d; - } - else if (value is string s) - { - var parts = s.Split(','); - if (parts.Length == 1 && double.TryParse(parts[0], NumberStyles.Float, CultureInfo.InvariantCulture, out double uniform)) - { - scaleX = scaleY = uniform; - } - else if (parts.Length >= 2 && - double.TryParse(parts[0], NumberStyles.Float, CultureInfo.InvariantCulture, out double sx) && - double.TryParse(parts[1], NumberStyles.Float, CultureInfo.InvariantCulture, out double sy)) - { - scaleX = sx; - scaleY = sy; - } - } - - if (Math.Abs(scaleX - 1.0) < 0.001 && Math.Abs(scaleY - 1.0) < 0.001) - { - return null; // Identity -> avoid transform overhead - } - - return new ScaleTransform(scaleX, scaleY); - } - catch - { - return null; - } - } - - public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) - { - if (value is ScaleTransform st) - { - return st.ScaleX; - } - return 1.0; - } -} - -/// -/// Converts numeric X,Y offset values or comma-separated "X,Y" string to TranslateTransform. -/// -public class TranslateToTransformConverter : IValueConverter -{ - public static readonly TranslateToTransformConverter Instance = new(); - - public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) - { - if (value == null) return null; - - try - { - double x = 0.0; - double y = 0.0; - - if (value is string s) - { - var parts = s.Split(','); - if (parts.Length >= 2 && - double.TryParse(parts[0], NumberStyles.Float, CultureInfo.InvariantCulture, out double px) && - double.TryParse(parts[1], NumberStyles.Float, CultureInfo.InvariantCulture, out double py)) - { - x = px; - y = py; - } - } - else if (value is double d) - { - x = d; - } - - if (Math.Abs(x) < 0.001 && Math.Abs(y) < 0.001) return null; - return new TranslateTransform(x, y); - } - catch - { - return null; - } - } - - public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) - { - if (value is TranslateTransform tt) return tt.X; - return 0.0; - } -} - -/// -/// Parses SVG path data string (e.g. "M 0,0 L 100,100 Z") into an Avalonia Geometry. -/// -public class StringToGeometryConverter : IValueConverter -{ - public static readonly StringToGeometryConverter Instance = new(); - - public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) - { - if (value is string pathData && !string.IsNullOrWhiteSpace(pathData)) - { - try - { - return Geometry.Parse(pathData); - } - catch - { - try - { - return StreamGeometry.Parse(pathData); - } - catch - { - return null; - } - } - } - if (value is Geometry g) return g; - return null; - } - - public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) - { - if (value is Geometry g) return g.ToString(); - return null; - } -} - -#endregion - -#region 6. String & Text Converters - -/// -/// Modifies string casing: "upper", "lower", "title", "pascal", "camel". -/// -public class StringCaseConverter : IValueConverter -{ - public static readonly StringCaseConverter Instance = new(); - - public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) - { - if (value == null) return string.Empty; - string str = value.ToString() ?? string.Empty; - string mode = parameter as string ?? "upper"; - - return mode.ToLowerInvariant() switch - { - "upper" => str.ToUpper(culture ?? CultureInfo.CurrentCulture), - "lower" => str.ToLower(culture ?? CultureInfo.CurrentCulture), - "title" => (culture ?? CultureInfo.CurrentCulture).TextInfo.ToTitleCase(str.ToLower(culture ?? CultureInfo.CurrentCulture)), - "capitalize" => str.Length > 0 ? char.ToUpper(str[0], culture ?? CultureInfo.CurrentCulture) + str[1..] : str, - _ => str - }; - } - - public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) => throw new NotSupportedException(); -} - -/// -/// Truncates long strings to a specified maximum length and appends an ellipsis. -/// Parameter specifies max characters (default 30). -/// -public class StringTruncateConverter : IValueConverter -{ - public static readonly StringTruncateConverter Instance = new(); - - public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) - { - if (value == null) return string.Empty; - string str = value.ToString() ?? string.Empty; - - int maxLength = 30; - if (parameter is string paramStr && int.TryParse(paramStr, out int max)) - { - maxLength = Math.Max(3, max); - } - - if (str.Length <= maxLength) return str; - return str[..(maxLength - 3)] + "..."; - } - - public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) => throw new NotSupportedException(); -} - -/// -/// Formats a value with prefix and/or suffix: Parameter="{0} pt" or "Page {0}". -/// -public class StringPrefixSuffixConverter : IValueConverter -{ - public static readonly StringPrefixSuffixConverter Instance = new(); - - public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) - { - if (value == null) return string.Empty; - string format = parameter as string ?? "{0}"; - if (!format.Contains("{0}")) format = $"{format}{{0}}"; - return string.Format(culture ?? CultureInfo.InvariantCulture, format, value); - } - - public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) => throw new NotSupportedException(); -} - -/// -/// Converts Enum values to human-friendly description strings with space separated words. -/// e.g. TextAlignmentMode.Center -> "Center", PdfPageSize.A4Portrait -> "A4 Portrait". -/// -public class EnumToDescriptionConverter : IValueConverter -{ - public static readonly EnumToDescriptionConverter Instance = new(); - - public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) - { - if (value == null) return string.Empty; - - Type type = value.GetType(); - if (!type.IsEnum) return value.ToString(); - - string name = value.ToString()!; - var field = type.GetField(name); - if (field != null) - { - var attr = field.GetCustomAttribute(); - if (attr != null) return attr.Description; - } - - // Split CamelCase words into spaced words: "A4Portrait" -> "A4 Portrait" - return Regex.Replace(name, "(\\B[A-Z])", " $1"); - } - - public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) - { - if (value is string str && targetType.IsEnum) - { - string clean = str.Replace(" ", ""); - if (Enum.TryParse(targetType, clean, true, out var result)) - { - return result; - } - } - return null; - } -} - -#endregion - -#region 7. Multi-Value Converters - -/// -/// Multi-value converter that returns true only if ALL bound values are true. -/// -public class AllTrueMultiConverter : IMultiValueConverter -{ - public static readonly AllTrueMultiConverter Instance = new(); - - public object? Convert(IList values, Type targetType, object? parameter, CultureInfo culture) - { - if (values == null || values.Count == 0) return false; - return values.All(v => v is true); - } -} - -/// -/// Multi-value converter that returns true if ANY bound value is true. -/// -public class AnyTrueMultiConverter : IMultiValueConverter -{ - public static readonly AnyTrueMultiConverter Instance = new(); - - public object? Convert(IList values, Type targetType, object? parameter, CultureInfo culture) - { - if (values == null || values.Count == 0) return false; - return values.Any(v => v is true); - } -} - -/// -/// Multi-value converter that returns true if the first two bound values are equal (case-insensitive string comparison). -/// -public class ValuesEqualMultiConverter : IMultiValueConverter -{ - public static readonly ValuesEqualMultiConverter Instance = new(); - - public object? Convert(IList values, Type targetType, object? parameter, CultureInfo culture) - { - if (values == null || values.Count < 2) return false; - if (values[0] == null && values[1] == null) return true; - if (values[0] == null || values[1] == null) return false; - return string.Equals(values[0]?.ToString(), values[1]?.ToString(), StringComparison.OrdinalIgnoreCase); - } -} - -/// -/// Concatenates multiple string values together with an optional delimiter parameter. -/// -public class StringConcatMultiConverter : IMultiValueConverter -{ - public static readonly StringConcatMultiConverter Instance = new(); - - public object? Convert(IList values, Type targetType, object? parameter, CultureInfo culture) - { - if (values == null || values.Count == 0) return string.Empty; - string delimiter = parameter as string ?? string.Empty; - return string.Join(delimiter, values.Where(v => v != null).Select(v => v!.ToString())); - } -} - -/// -/// Returns the maximum value among numeric multi-bindings. -/// -public class MathMaxMultiConverter : IMultiValueConverter -{ - public static readonly MathMaxMultiConverter Instance = new(); - - public object? Convert(IList values, Type targetType, object? parameter, CultureInfo culture) - { - if (values == null || values.Count == 0) return 0.0; - double max = double.MinValue; - bool found = false; - - foreach (var v in values) - { - if (v != null && double.TryParse(v.ToString(), NumberStyles.Float, CultureInfo.InvariantCulture, out double d)) - { - if (d > max) max = d; - found = true; - } - } - - return found ? max : 0.0; - } -} - -/// -/// Returns the minimum value among numeric multi-bindings. -/// -public class MathMinMultiConverter : IMultiValueConverter -{ - public static readonly MathMinMultiConverter Instance = new(); - - public object? Convert(IList values, Type targetType, object? parameter, CultureInfo culture) - { - if (values == null || values.Count == 0) return 0.0; - double min = double.MaxValue; - bool found = false; - - foreach (var v in values) - { - if (v != null && double.TryParse(v.ToString(), NumberStyles.Float, CultureInfo.InvariantCulture, out double d)) - { - if (d < min) min = d; - found = true; - } - } - - return found ? min : 0.0; - } -} - -#endregion diff --git a/src/PdfEditorApp/Converters/HexToBrushConverter.cs b/src/PdfEditorApp/Converters/HexToBrushConverter.cs deleted file mode 100644 index 07a98a3..0000000 --- a/src/PdfEditorApp/Converters/HexToBrushConverter.cs +++ /dev/null @@ -1,62 +0,0 @@ -using System; -using System.Globalization; -using Avalonia.Data.Converters; -using Avalonia.Media; - -namespace PdfEditorApp.Converters; - -public class HexToBrushConverter : IValueConverter -{ - public static readonly HexToBrushConverter Instance = new(); - - public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) - { - if (value is string hex && !string.IsNullOrWhiteSpace(hex)) - { - if (Color.TryParse(hex, out var color)) - { - return new SolidColorBrush(color); - } - } - return Brushes.Transparent; - } - - public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) - { - if (value is ISolidColorBrush brush) - { - return brush.Color.ToString(); - } - return "#00000000"; - } -} - -public class HexToColorConverter : IValueConverter -{ - public static readonly HexToColorConverter Instance = new(); - - public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) - { - if (value is string hex && !string.IsNullOrWhiteSpace(hex)) - { - if (Color.TryParse(hex, out var color)) - { - return color; - } - } - return Colors.Black; - } - - public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) - { - if (value is Color color) - { - if (color.A == 255) - { - return $"#{color.R:X2}{color.G:X2}{color.B:X2}"; - } - return $"#{color.A:X2}{color.R:X2}{color.G:X2}{color.B:X2}"; - } - return "#201F1E"; - } -} diff --git a/src/PdfEditorApp/Messages/ShellMessages.cs b/src/PdfEditorApp/Messages/ShellMessages.cs deleted file mode 100644 index 1570dee..0000000 --- a/src/PdfEditorApp/Messages/ShellMessages.cs +++ /dev/null @@ -1,89 +0,0 @@ -using PdfEditorApp.Core.Models; -using PdfEditorApp.Models; - -namespace PdfEditorApp.Messages; - -/// -/// Broadcast message to display a toast notification anywhere in the application. -/// -public record ShowToastMessage(string Message, ToastNotificationType Type = ToastNotificationType.Primary, string? ActionLabel = null); - -/// -/// Request to return to the Home dashboard view. -/// -public record NavigateToHomeMessage(); - -/// -/// Request to open a PDF project or file in the Studio Editor. -/// -public record OpenInEditorMessage(string FilePath); - -/// -/// Request to open a PDF document in the standalone Reader / Viewer. -/// -public record OpenInViewerMessage(string FilePath); - -/// -/// Request to open a .frypdf document in the dedicated Interactive Document Viewer. -/// -public record OpenInFryPdfViewerMessage(string FilePath); - -/// -/// Request to launch the showcase interactive landscape presentation deck. -/// -public record LaunchInteractiveDeckMessage(); - -/// -/// Request to launch a specific PDF tool on a given input file. -/// -public record RunToolMessage(PdfToolId ToolId, string FilePath); - -/// -/// Notification that the user-preferred reading theme has changed. -/// -public record ReadingThemeChangedMessage(PdfReaderTheme Theme); - -/// -/// Notification that a project file was renamed on disk. -/// -public record ProjectRenamedMessage(string OldPath, string NewPath); - -/// -/// Notification that a project file was deleted from disk. -/// -public record ProjectDeletedMessage(string DeletedPath); - -/// -/// Request to prompt the user to rename a document. -/// -public record PromptRenameMessage(string FilePath); - -/// -/// Request to prompt the user to confirm document deletion. -/// -public record PromptDeleteMessage(string FilePath); - -/// -/// Request to open a template in the Studio Editor. -/// -public record OpenTemplateMessage(string? TemplateName); - -/// -/// Request to prompt the user to pick and open a project file in the Studio Editor. -/// -public record OpenProjectFileMessage(); - -/// -/// Request to open the Workflow Studio. -/// -public record OpenWorkflowStudioMessage(); - -/// -/// Request to open the Batch Generation Studio. -/// -public record OpenBatchGenerationMessage(); - -/// -/// Request to prompt the user to pick and open a PDF document in the Viewer. -/// -public record OpenPdfPickerMessage(); diff --git a/src/PdfEditorApp/Models/AiChatMessage.cs b/src/PdfEditorApp/Models/AiChatMessage.cs deleted file mode 100644 index cc9734a..0000000 --- a/src/PdfEditorApp/Models/AiChatMessage.cs +++ /dev/null @@ -1,72 +0,0 @@ -using System; -using System.Collections.ObjectModel; -using CommunityToolkit.Mvvm.ComponentModel; -using CommunityToolkit.Mvvm.Input; - -namespace PdfEditorApp.Models; - -public enum AiChatRole -{ - User, - Assistant, - System -} - -/// -/// Represents a single message within an AI Studio Assistant conversation thread. -/// -public partial class AiChatMessage : ObservableObject -{ - public string Id { get; init; } = Guid.NewGuid().ToString("N"); - - public AiChatRole Role { get; init; } = AiChatRole.User; - - public bool IsUser => Role == AiChatRole.User; - public bool IsAssistant => Role == AiChatRole.Assistant; - public bool IsSystem => Role == AiChatRole.System; - - [ObservableProperty] - private string _content = string.Empty; - - public DateTime Timestamp { get; init; } = DateTime.Now; - - public string FormattedTime => Timestamp.ToString("HH:mm"); - - [ObservableProperty] - private string? _targetElementTitle; - - [ObservableProperty] - private string? _targetElementKind; - - public bool HasTargetElement => !string.IsNullOrEmpty(TargetElementTitle); - - [ObservableProperty] - private bool _isGenerating; - - [ObservableProperty] - private bool _isSuccess = true; - - [ObservableProperty] - private TimeSpan _duration = TimeSpan.Zero; - - public string FormattedDuration => Duration.TotalSeconds > 0 ? $"{Duration.TotalSeconds:0.1}s" : ""; - - [ObservableProperty] - private bool _canUndo; - - public Action? UndoAction { get; set; } - - public ObservableCollection ToolCalls { get; } = new(); - - public bool HasToolCalls => ToolCalls.Count > 0; - - [RelayCommand] - public void Undo() - { - if (CanUndo) - { - UndoAction?.Invoke(); - CanUndo = false; - } - } -} diff --git a/src/PdfEditorApp/Models/AiChatSession.cs b/src/PdfEditorApp/Models/AiChatSession.cs deleted file mode 100644 index 083d5a2..0000000 --- a/src/PdfEditorApp/Models/AiChatSession.cs +++ /dev/null @@ -1,51 +0,0 @@ -using System; -using System.Collections.ObjectModel; -using System.Collections.Specialized; -using System.Linq; -using CommunityToolkit.Mvvm.ComponentModel; - -namespace PdfEditorApp.Models; - -/// -/// Represents a conversation session containing a sequence of AI chat messages. -/// -public partial class AiChatSession : ObservableObject -{ - public string Id { get; init; } = Guid.NewGuid().ToString("N"); - - [ObservableProperty] - private string _title = "New Chat"; - - public DateTime CreatedAt { get; init; } = DateTime.Now; - - [ObservableProperty] - private DateTime _lastModified = DateTime.Now; - - public ObservableCollection Messages { get; } = new(); - - public int MessageCount => Messages.Count; - - public string PreviewSnippet - { - get - { - var last = Messages.LastOrDefault(); - if (last == null) return "Empty conversation"; - string text = last.Content?.Trim() ?? ""; - return text.Length <= 40 ? text : text[..40] + "..."; - } - } - - public string FormattedLastModified => LastModified.ToString("MMM d, HH:mm"); - - public AiChatSession() - { - Messages.CollectionChanged += OnMessagesChanged; - } - - private void OnMessagesChanged(object? sender, NotifyCollectionChangedEventArgs e) - { - OnPropertyChanged(nameof(MessageCount)); - OnPropertyChanged(nameof(PreviewSnippet)); - } -} diff --git a/src/PdfEditorApp/Models/AiSettingsModel.cs b/src/PdfEditorApp/Models/AiSettingsModel.cs deleted file mode 100644 index 38e8167..0000000 --- a/src/PdfEditorApp/Models/AiSettingsModel.cs +++ /dev/null @@ -1,121 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text.Json.Serialization; -using PdfEditorApp.Core.Models; - -namespace PdfEditorApp.Models; - -/// -/// Persisted configuration settings for AI providers, models, and local LLM runtime. -/// -public class AiSettingsModel -{ - [JsonPropertyName("selectedProvider")] - public AiProviderType SelectedProvider { get; set; } = AiProviderType.OllamaLocal; - - [JsonPropertyName("ollamaEndpoint")] - public string OllamaEndpoint { get; set; } = "http://localhost:11434"; - - [JsonPropertyName("ollamaApiKey")] - public string OllamaApiKey { get; set; } = string.Empty; - - [JsonPropertyName("selectedModelId")] - public string SelectedModelId { get; set; } = "llama3.2"; - - [JsonPropertyName("openAiApiKey")] - public string OpenAiApiKey { get; set; } = string.Empty; - - [JsonPropertyName("customBaseUrl")] - public string CustomBaseUrl { get; set; } = string.Empty; - - [JsonPropertyName("customModelName")] - public string CustomModelName { get; set; } = string.Empty; - - [JsonPropertyName("customModelHistory")] - public List CustomModelHistory { get; set; } = new() - { - "openai/gpt-oss-120b", - "llama-3.3-70b-versatile", - "qwen/qwen-2.5-coder-32b", - "deepseek-r1-distill-llama-70b", - "llama-3.1-8b-instant" - }; - - [JsonPropertyName("temperature")] - public float Temperature { get; set; } = 0.7f; - - [JsonPropertyName("systemInstructions")] - public string SystemInstructions { get; set; } = string.Empty; - - [JsonPropertyName("discoveredOllamaModels")] - public List DiscoveredOllamaModels { get; set; } = new(); - - [JsonPropertyName("ollamaLibraryCache")] - public List OllamaLibraryCache { get; set; } = new(); - - [JsonPropertyName("lastConnectedAt")] - public DateTime? LastConnectedAt { get; set; } - - [JsonIgnore] - public bool IsOllamaRemote => !string.IsNullOrWhiteSpace(OllamaEndpoint) && - !OllamaEndpoint.Contains("localhost", StringComparison.OrdinalIgnoreCase) && - !OllamaEndpoint.Contains("127.0.0.1"); - - public AiSettingsModel Clone() - { - var copy = new AiSettingsModel - { - SelectedProvider = this.SelectedProvider, - OllamaEndpoint = this.OllamaEndpoint, - OllamaApiKey = this.OllamaApiKey, - SelectedModelId = this.SelectedModelId, - OpenAiApiKey = this.OpenAiApiKey, - CustomBaseUrl = this.CustomBaseUrl, - CustomModelName = this.CustomModelName, - Temperature = this.Temperature, - SystemInstructions = this.SystemInstructions, - LastConnectedAt = this.LastConnectedAt - }; - - foreach (var m in DiscoveredOllamaModels) - { - copy.DiscoveredOllamaModels.Add(new AiModelInfo - { - Id = m.Id, - DisplayName = m.DisplayName, - Provider = m.Provider, - Tier = m.Tier, - Category = m.Category, - Capabilities = m.Capabilities, - SizeBytes = m.SizeBytes, - FormattedSize = m.FormattedSize, - ParameterSize = m.ParameterSize, - Description = m.Description, - IsInstalledLocally = m.IsInstalledLocally - }); - } - - foreach (var m in OllamaLibraryCache) - { - copy.OllamaLibraryCache.Add(new AiModelInfo - { - Id = m.Id, - DisplayName = m.DisplayName, - Provider = m.Provider, - Tier = m.Tier, - Category = m.Category, - Capabilities = m.Capabilities, - SizeBytes = m.SizeBytes, - FormattedSize = m.FormattedSize, - ParameterSize = m.ParameterSize, - Description = m.Description, - IsInstalledLocally = m.IsInstalledLocally - }); - } - - copy.CustomModelHistory.Clear(); - copy.CustomModelHistory.AddRange(this.CustomModelHistory); - - return copy; - } -} diff --git a/src/PdfEditorApp/Models/DocumentComparisonModels.cs b/src/PdfEditorApp/Models/DocumentComparisonModels.cs deleted file mode 100644 index c3d942f..0000000 --- a/src/PdfEditorApp/Models/DocumentComparisonModels.cs +++ /dev/null @@ -1,54 +0,0 @@ -using System; -using System.Collections.Generic; -using PdfEditorApp.Core.Models; - -namespace PdfEditorApp.Models; - -public class DocumentComparisonReport -{ - public string BaseDocumentTitle { get; set; } = ""; - public string ComparedDocumentTitle { get; set; } = ""; - public DateTime ComparisonTimestamp { get; set; } = DateTime.UtcNow; - - public int BasePageCount { get; set; } - public int ComparedPageCount { get; set; } - - public int TotalDifferencesCount => Differences.Count; - public int AdditionsCount { get; set; } - public int DeletionsCount { get; set; } - public int ModificationsCount { get; set; } - - public List Differences { get; set; } = new(); -} - -public class DocumentDifferenceItem -{ - public int PageNumber { get; set; } - public CompareDiffType DiffType { get; set; } - public string Description { get; set; } = ""; - public string OldValue { get; set; } = ""; - public string NewValue { get; set; } = ""; - public string ElementKindDisplay { get; set; } = ""; - public string BadgeColorHex => DiffType switch - { - CompareDiffType.ElementAdded => "#16A34A", - CompareDiffType.ElementRemoved => "#DC2626", - CompareDiffType.ElementModified => "#0F6CBD", - CompareDiffType.TextModified => "#D97706", - CompareDiffType.FormattingModified => "#7C3AED", - CompareDiffType.SecurityModified => "#E11D48", - CompareDiffType.MetadataModified => "#2563EB", - _ => "#475569" - }; - public string BadgeIcon => DiffType switch - { - CompareDiffType.ElementAdded => "PlusCircleOutline", - CompareDiffType.ElementRemoved => "MinusCircleOutline", - CompareDiffType.ElementModified => "PencilOutline", - CompareDiffType.TextModified => "FormatColorText", - CompareDiffType.FormattingModified => "FormatFont", - CompareDiffType.SecurityModified => "ShieldAlertOutline", - CompareDiffType.MetadataModified => "TagOutline", - _ => "InformationOutline" - }; -} diff --git a/src/PdfEditorApp/Models/HelpGuideItem.cs b/src/PdfEditorApp/Models/HelpGuideItem.cs deleted file mode 100644 index 22c999a..0000000 --- a/src/PdfEditorApp/Models/HelpGuideItem.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System; -using System.Collections.Generic; -using PdfEditorApp.Models; - -namespace PdfEditorApp.Models; - -/// -/// Model representing a comprehensive help guide topic, tool walkthrough, or troubleshooting article. -/// -public class HelpGuideItem -{ - public string Id { get; set; } = ""; - public string Title { get; set; } = ""; - public string Category { get; set; } = ""; - public string Summary { get; set; } = ""; - public string Description { get; set; } = ""; - public List Steps { get; set; } = new(); - public List KeyFeatures { get; set; } = new(); - public List ProTips { get; set; } = new(); - public string SupportedFormats { get; set; } = ""; - public PdfToolId? RelatedToolId { get; set; } - public string? KeyboardShortcut { get; set; } - public string IconKind { get; set; } = "HelpCircleOutline"; - public string IconColorHex { get; set; } = "#0284C7"; - public string BackgroundAccentHex { get; set; } = "#E0F2FE"; - public string Badge { get; set; } = "Guide"; - public string Keywords { get; set; } = ""; - public bool IsFeatured { get; set; } - - public bool HasRelatedTool => RelatedToolId.HasValue; - public bool HasShortcut => !string.IsNullOrWhiteSpace(KeyboardShortcut); - public bool HasFormats => !string.IsNullOrWhiteSpace(SupportedFormats); - public bool HasSteps => Steps != null && Steps.Count > 0; - public bool HasKeyFeatures => KeyFeatures != null && KeyFeatures.Count > 0; - public bool HasProTips => ProTips != null && ProTips.Count > 0; -} diff --git a/src/PdfEditorApp/Models/PdfFilePreviewItem.cs b/src/PdfEditorApp/Models/PdfFilePreviewItem.cs deleted file mode 100644 index ed4539f..0000000 --- a/src/PdfEditorApp/Models/PdfFilePreviewItem.cs +++ /dev/null @@ -1,80 +0,0 @@ -using System; -using System.IO; -using CommunityToolkit.Mvvm.ComponentModel; -using PdfEditorApp.ViewModels; - -namespace PdfEditorApp.Models; - -/// -/// Rich metadata and preview representation for a PDF document selected in a tool workspace. -/// -public partial class PdfFilePreviewItem : ObservableObject -{ - [ObservableProperty] - private string _filePath = string.Empty; - - [ObservableProperty] - private string _fileName = string.Empty; - - [ObservableProperty] - private string _directoryPath = string.Empty; - - [ObservableProperty] - private long _fileSizeBytes; - - [ObservableProperty] - private string _fileSizeFormatted = "0 KB"; - - [ObservableProperty] - private int _pageCount = 1; - - [ObservableProperty] - private string _pageCountText = "1 Page"; - - [ObservableProperty] - private int _orderIndex = 1; - - [ObservableProperty] - private string _orderIndexText = "#1"; - - [ObservableProperty] - private string _pageDimensionsText = "A4 · Standard"; - - [ObservableProperty] - private bool _isCorrupted; - - [ObservableProperty] - private PageViewModel? _pagePreview; - - public bool HasLivePreview => PagePreview != null; - - public static string FormatBytes(long bytes) - { - if (bytes < 1024) return $"{bytes} B"; - if (bytes < 1024 * 1024) return $"{bytes / 1024.0:F1} KB"; - return $"{bytes / (1024.0 * 1024.0):F1} MB"; - } - - public static PdfFilePreviewItem CreateFromFile(string filePath, int orderIndex = 1, int pageCount = 1) - { - var fi = new FileInfo(filePath); - long size = fi.Exists ? fi.Length : 0; - string name = Path.GetFileName(filePath); - string dir = Path.GetDirectoryName(filePath) ?? string.Empty; - - return new PdfFilePreviewItem - { - FilePath = filePath, - FileName = name, - DirectoryPath = dir, - FileSizeBytes = size, - FileSizeFormatted = FormatBytes(size), - PageCount = Math.Max(1, pageCount), - PageCountText = pageCount == 1 ? "1 Page" : $"{pageCount} Pages", - OrderIndex = orderIndex, - OrderIndexText = $"#{orderIndex}", - PageDimensionsText = "Standard PDF", - IsCorrupted = false - }; - } -} diff --git a/src/PdfEditorApp/Models/PdfPagePreviewThumbnail.cs b/src/PdfEditorApp/Models/PdfPagePreviewThumbnail.cs deleted file mode 100644 index 87a23be..0000000 --- a/src/PdfEditorApp/Models/PdfPagePreviewThumbnail.cs +++ /dev/null @@ -1,34 +0,0 @@ -using System; -using CommunityToolkit.Mvvm.ComponentModel; - -namespace PdfEditorApp.Models; - -/// -/// Representation of an individual page in a merged or output PDF for in-app page strip browsing. -/// -public partial class PdfPagePreviewThumbnail : ObservableObject -{ - [ObservableProperty] - private int _pageNumber = 1; - - [ObservableProperty] - private string _pageLabel = "Page 1"; - - [ObservableProperty] - private double _widthPoints = 595; - - [ObservableProperty] - private double _heightPoints = 842; - - [ObservableProperty] - private bool _isLandscape; - - [ObservableProperty] - private string _dimensionsText = "595 × 842 pt"; - - [ObservableProperty] - private string _pageSummary = string.Empty; - - [ObservableProperty] - private bool _isSelected; -} diff --git a/src/PdfEditorApp/Models/PdfToolModels.cs b/src/PdfEditorApp/Models/PdfToolModels.cs deleted file mode 100644 index bbb9aba..0000000 --- a/src/PdfEditorApp/Models/PdfToolModels.cs +++ /dev/null @@ -1,522 +0,0 @@ -using System; -using System.Collections.Generic; -using CommunityToolkit.Mvvm.ComponentModel; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Services; - -namespace PdfEditorApp.Models; - -public enum PdfToolId -{ - MergePdf, - SplitPdf, - CompressPdf, - PdfToWord, - PdfToPowerPoint, - PdfToExcel, - WordToPdf, - PowerPointToPdf, - ExcelToPdf, - EditPdf, - PdfToJpg, - JpgToPdf, - SignPdf, - Watermark, - RotatePdf, - HtmlToPdf, - UnlockPdf, - ProtectPdf, - OrganizePdf, - PdfToPdfA, - RepairPdf, - PageNumbers, - ScanToPdf, - OcrPdf, - ComparePdf, - RedactPdf, - CropPdf, - PdfForms, - AiSummarizer, - TranslatePdf, - PdfToMarkdown, - WorkflowBuilder, - BatchMailMerge -} - -public enum PdfToolCategory -{ - All, - OrganizeAndPage, - OptimizeAndSecurity, - ConvertFromPdf, - ConvertToPdf, - EditAndForms, - AiAndAutomation -} - -public enum PdfCompressionLevel -{ - MaximumQuality, - HighQuality, - Balanced, - SmallSize, - MaximumCompression -} - -public enum PdfAStandard -{ - PdfA1b, - PdfA2b, - PdfA3b -} - -public enum WatermarkType -{ - Text, - Image -} - -public enum WatermarkPosition -{ - Center, - TopLeft, - TopCenter, - TopRight, - BottomLeft, - BottomCenter, - BottomRight, - Tiled -} - -public enum PageNumberPosition -{ - TopLeft, - TopCenter, - TopRight, - BottomLeft, - BottomCenter, - BottomRight -} - -public enum PageTargetSelection -{ - AllPages, - OddPagesOnly, - EvenPagesOnly, - CustomRange -} - -public class PdfToolDefinition -{ - public PdfToolId Id { get; set; } - public string Name { get; set; } = string.Empty; - public string Description { get; set; } = string.Empty; - public PdfToolCategory Category { get; set; } - public string CategoryDisplayName => Category switch - { - PdfToolCategory.OrganizeAndPage => "Organize & Page", - PdfToolCategory.OptimizeAndSecurity => "Optimize & Security", - PdfToolCategory.ConvertFromPdf => "Convert from PDF", - PdfToolCategory.ConvertToPdf => "Convert to PDF", - PdfToolCategory.EditAndForms => "Edit & Forms", - PdfToolCategory.AiAndAutomation => "AI & Automation", - _ => "All Tools" - }; - - public string IconKind { get; set; } = "FileDocumentOutline"; - public string IconColorHex { get; set; } = "#0F6CBD"; - public string BackgroundAccentHex { get; set; } = "#EFF6FF"; - public bool IsNew { get; set; } - public bool IsWorkflowBanner { get; set; } - public string AcceptedFileExtensions { get; set; } = ".pdf"; - public bool SupportsMultiFile { get; set; } - - private string? _stringId; - public string StringId - { - get => string.IsNullOrWhiteSpace(_stringId) ? Id.ToString() : _stringId; - set => _stringId = value; - } - - public Func? ViewModelFactory { get; set; } -} - -public record ToolExecutionResult -{ - public bool Success { get; init; } - public string? OutputFilePath { get; init; } - public List OutputFiles { get; init; } = new(); - public string? Message { get; init; } - public string? ErrorMessage { get; init; } - public long OriginalSizeBytes { get; init; } - public long OutputSizeBytes { get; init; } - public double SavingsPercentage => OriginalSizeBytes > 0 && OutputSizeBytes > 0 - ? Math.Max(0, (OriginalSizeBytes - OutputSizeBytes) / (double)OriginalSizeBytes * 100.0) - : 0; - public Dictionary ExtraData { get; init; } = new(); -} - -public enum PdfProcessingEngine -{ - QuestPdfNative = 0, - StandardPdfSharp = 1 -} - -public enum PdfEncryptionLevel -{ - Aes256Bit = 0, - Aes128Bit = 1, - Rc440Bit = 2 -} - -public class MergeToolOptions -{ - public List InputFiles { get; set; } = new(); - public string OutputFilePath { get; set; } = string.Empty; - public bool PreserveBookmarks { get; set; } = true; - public bool NormalizePageSizes { get; set; } - public PdfProcessingEngine Engine { get; set; } = PdfProcessingEngine.QuestPdfNative; - public Dictionary FilePageRanges { get; set; } = new(StringComparer.OrdinalIgnoreCase); -} - -public class SplitToolOptions -{ - public string InputFilePath { get; set; } = string.Empty; - public string OutputDirectory { get; set; } = string.Empty; - public SplitExtractMode Mode { get; set; } = SplitExtractMode.SplitEveryNPages; - public int PagesPerSplit { get; set; } = 1; - public string RangeExpression { get; set; } = "1-3, 5, 7-10"; - public bool SplitOddEven { get; set; } - public bool ExtractOddPages { get; set; } - public PdfProcessingEngine Engine { get; set; } = PdfProcessingEngine.QuestPdfNative; -} - -public class CompressToolOptions -{ - public string InputFilePath { get; set; } = string.Empty; - public string OutputFilePath { get; set; } = string.Empty; - public PdfCompressionLevel Level { get; set; } = PdfCompressionLevel.Balanced; - public int ImageQualityDpi { get; set; } = 150; - public int JpegQuality { get; set; } = 0; // 0 = automatic based on level, or 20-100 - public int MaxImageDimension { get; set; } = 0; // 0 = automatic based on level - public bool ConvertToGrayscale { get; set; } - public bool RemoveMetadata { get; set; } - public bool RemoveDuplicateObjects { get; set; } = true; - public bool CompressStreams { get; set; } = true; - public bool LinearizeForWeb { get; set; } -} - -public class LinearizeToolOptions -{ - public string InputFilePath { get; set; } = string.Empty; - public string OutputFilePath { get; set; } = string.Empty; -} - -public class WordConversionOptions -{ - public string InputFilePath { get; set; } = string.Empty; - public string OutputFilePath { get; set; } = string.Empty; - public bool ExtractTables { get; set; } = true; - public bool ExtractImages { get; set; } = true; - public bool OcrFallback { get; set; } -} - -public class ExcelConversionOptions -{ - public string InputFilePath { get; set; } = string.Empty; - public string OutputFilePath { get; set; } = string.Empty; - public bool DetectAllTables { get; set; } = true; - public bool SeparateSheetsPerPage { get; set; } -} - -public class PptxConversionOptions -{ - public string InputFilePath { get; set; } = string.Empty; - public string OutputFilePath { get; set; } = string.Empty; - public bool EditableText { get; set; } = true; -} - -public class OfficeToPdfOptions -{ - public string InputFilePath { get; set; } = string.Empty; - public string OutputFilePath { get; set; } = string.Empty; - public PageOrientation Orientation { get; set; } = PageOrientation.Portrait; -} - -public class ImageConversionOptions -{ - public string InputFilePath { get; set; } = string.Empty; - public string OutputDirectory { get; set; } = string.Empty; - public string OutputFormat { get; set; } = "jpg"; // jpg, png - public int Dpi { get; set; } = 300; - public int JpgQuality { get; set; } = 90; - public bool Grayscale { get; set; } - public PageTargetSelection TargetPages { get; set; } = PageTargetSelection.AllPages; - public string PageRange { get; set; } = "1"; -} - -public class ImagesToPdfOptions -{ - public List ImageFiles { get; set; } = new(); - public string OutputFilePath { get; set; } = string.Empty; - public PageFormat PageFormat { get; set; } = PageFormat.A4; - public PageOrientation Orientation { get; set; } = PageOrientation.Portrait; - public bool AutoOrientation { get; set; } = true; - public bool FitToPage { get; set; } = true; - public double MarginPoints { get; set; } = 20; - public int ImagesPerPage { get; set; } = 1; // 1, 2, 4 -} - -public class SignToolOptions -{ - public string InputFilePath { get; set; } = string.Empty; - public string OutputFilePath { get; set; } = string.Empty; - public SignatureStyle Style { get; set; } = SignatureStyle.CursiveElegance; - public string SignerName { get; set; } = "Jane Doe"; - public string? Reason { get; set; } = "Document Approved and Verified"; - public string? Location { get; set; } - public string? CertificatePath { get; set; } - public string? CertificatePassword { get; set; } - public int TargetPageNumber { get; set; } = 1; - public double X { get; set; } = 100; - public double Y { get; set; } = 600; - public double Width { get; set; } = 200; - public double Height { get; set; } = 70; - public string? SignatureImageDataUri { get; set; } -} - -public class WatermarkToolOptions -{ - public string InputFilePath { get; set; } = string.Empty; - public string OutputFilePath { get; set; } = string.Empty; - public WatermarkType Type { get; set; } = WatermarkType.Text; - public string Text { get; set; } = "CONFIDENTIAL"; - public string? ImagePath { get; set; } - public string FontFamily { get; set; } = "Helvetica"; - public double FontSize { get; set; } = 48; - public string ColorHex { get; set; } = "#EF4444"; - public double Opacity { get; set; } = 0.35; - public double RotationAngle { get; set; } = -45; - public WatermarkPosition Position { get; set; } = WatermarkPosition.Center; - public PageTargetSelection TargetPages { get; set; } = PageTargetSelection.AllPages; - public string CustomRange { get; set; } = ""; - public bool LayerOnTop { get; set; } = true; -} - -public class RotateToolOptions -{ - public string InputFilePath { get; set; } = string.Empty; - public string OutputFilePath { get; set; } = string.Empty; - public int RotationDegrees { get; set; } = 90; // 90, 180, 270 - public PageFilterTarget TargetFilter { get; set; } = PageFilterTarget.All; - public string CustomRange { get; set; } = ""; -} - -public class HtmlToPdfOptions -{ - public string HtmlContentOrUrl { get; set; } = string.Empty; - public bool IsUrl { get; set; } - public string OutputFilePath { get; set; } = string.Empty; - public PageFormat Format { get; set; } = PageFormat.A4; - public PageOrientation Orientation { get; set; } = PageOrientation.Portrait; - public double MarginPoints { get; set; } = 36; - public bool IncludePageNumbers { get; set; } = true; -} - -public class SecurityToolOptions -{ - public string InputFilePath { get; set; } = string.Empty; - public string OutputFilePath { get; set; } = string.Empty; - public string UserPassword { get; set; } = string.Empty; - public string OwnerPassword { get; set; } = string.Empty; - public bool AllowPrinting { get; set; } = true; - public bool AllowModifying { get; set; } = false; - public bool AllowCopying { get; set; } = false; - public bool AllowAnnotating { get; set; } = true; - public bool AllowFormFilling { get; set; } = true; - public bool AllowAssembly { get; set; } = true; - public bool EncryptMetadata { get; set; } = true; - public PdfEncryptionLevel EncryptionLevel { get; set; } = PdfEncryptionLevel.Aes256Bit; - public PdfProcessingEngine Engine { get; set; } = PdfProcessingEngine.StandardPdfSharp; -} - -public class UnlockToolOptions -{ - public string InputFilePath { get; set; } = string.Empty; - public string OutputFilePath { get; set; } = string.Empty; - public string Password { get; set; } = string.Empty; - public PdfProcessingEngine Engine { get; set; } = PdfProcessingEngine.QuestPdfNative; -} - -public class PageOrganizeAction -{ - public int SourcePageIndex { get; set; } - public int RotationDegrees { get; set; } - public bool Delete { get; set; } - public bool Duplicate { get; set; } - public string? InsertPdfFilePath { get; set; } - public int? InsertPdfPageIndex { get; set; } -} - -public class OrganizeToolOptions -{ - public string InputFilePath { get; set; } = string.Empty; - public string OutputFilePath { get; set; } = string.Empty; - public List PageOrder { get; set; } = new(); // 0-based page indices in target order - public List PagesToDelete { get; set; } = new(); - public Dictionary PageRotations { get; set; } = new(); // pageIndex -> angle -} - -public class PdfAToolOptions -{ - public string InputFilePath { get; set; } = string.Empty; - public string OutputFilePath { get; set; } = string.Empty; - public PdfAStandard Standard { get; set; } = PdfAStandard.PdfA2b; -} - -public class RepairToolOptions -{ - public string InputFilePath { get; set; } = string.Empty; - public string OutputFilePath { get; set; } = string.Empty; -} - -public class PageNumberToolOptions -{ - public string InputFilePath { get; set; } = string.Empty; - public string OutputFilePath { get; set; } = string.Empty; - public PageNumberPosition Position { get; set; } = PageNumberPosition.BottomCenter; - public string Template { get; set; } = "Page {n} of {total}"; // e.g. "Page {n} of {total}", "{n}", "Bates: DOC-{n:D6}" - public int StartingNumber { get; set; } = 1; - public string FontFamily { get; set; } = "Helvetica"; - public double FontSize { get; set; } = 10; - public string ColorHex { get; set; } = "#334155"; - public PageTargetSelection TargetPages { get; set; } = PageTargetSelection.AllPages; - public string CustomRange { get; set; } = ""; - public double MarginPoints { get; set; } = 28; -} - -public class ScanToolOptions -{ - public List InputImageFiles { get; set; } = new(); - public string OutputFilePath { get; set; } = string.Empty; - public bool AutoDeskew { get; set; } = true; - public bool EnhanceContrast { get; set; } = true; - public bool WhitenBackground { get; set; } = true; - public bool ConvertToGrayscale { get; set; } - public PageFormat Format { get; set; } = PageFormat.A4; -} - -public class OcrToolOptions -{ - public string InputFilePath { get; set; } = string.Empty; - public string OutputFilePath { get; set; } = string.Empty; - public string Language { get; set; } = "eng"; // eng, spa, deu, fra, etc. - public bool GenerateSearchablePdf { get; set; } = true; - public bool GenerateTextFile { get; set; } = true; - public bool ExtractTextOnly { get; set; } -} - -public class CompareToolOptions -{ - public string DocumentAPath { get; set; } = string.Empty; - public string DocumentBPath { get; set; } = string.Empty; - public bool DetectTextDiff { get; set; } = true; - public bool DetectVisualDiff { get; set; } = true; -} - -public class RedactionRegion -{ - public int PageIndex { get; set; } - public double X { get; set; } - public double Y { get; set; } - public double Width { get; set; } - public double Height { get; set; } - public string Reason { get; set; } = "CONFIDENTIAL"; - public string FillColorHex { get; set; } = "#000000"; -} - -/// -/// UI-facing wrapper around a shown in a "Marked for -/// redaction" review list — carries a human-readable label in addition to the raw -/// region geometry the backend needs. -/// -public partial class RedactionMarkItem : ObservableObject -{ - public required RedactionRegion Region { get; init; } - public required string Label { get; init; } - public string PageLabel => $"Page {Region.PageIndex + 1}"; - - // On-screen highlight position/size in display pixels, computed by the ViewModel - // for the currently rendered page (Region stays in PDF-point space; these are - // derived purely for XAML Canvas.Left/Top/Width/Height binding). - [ObservableProperty] - private double _displayX; - - [ObservableProperty] - private double _displayY; - - [ObservableProperty] - private double _displayWidth; - - [ObservableProperty] - private double _displayHeight; -} - -public class RedactionToolOptions -{ - public string InputFilePath { get; set; } = string.Empty; - public string OutputFilePath { get; set; } = string.Empty; - public List Regions { get; set; } = new(); - public string? SearchPatternToRedact { get; set; } - public bool CaseSensitive { get; set; } - public bool PermanentScrubText { get; set; } = true; -} - -public class CropToolOptions -{ - public string InputFilePath { get; set; } = string.Empty; - public string OutputFilePath { get; set; } = string.Empty; - public double CropLeftPoints { get; set; } - public double CropRightPoints { get; set; } - public double CropTopPoints { get; set; } - public double CropBottomPoints { get; set; } - public PageTargetSelection TargetPages { get; set; } = PageTargetSelection.AllPages; - public string CustomRange { get; set; } = ""; -} - -public class FormToolOptions -{ - public string InputFilePath { get; set; } = string.Empty; - public string OutputFilePath { get; set; } = string.Empty; - public Dictionary FieldValues { get; set; } = new(); - public bool FlattenFields { get; set; } - public bool ExportFieldValuesJson { get; set; } -} - -public class AiSummaryOptions -{ - public string InputFilePath { get; set; } = string.Empty; - public int MaxBulletPoints { get; set; } = 7; - public bool IncludeExecutiveSummary { get; set; } = true; - public bool IncludeActionItems { get; set; } = true; - public string? CustomPrompt { get; set; } - public string TargetLanguage { get; set; } = "English"; -} - -public class TranslationOptions -{ - public string InputFilePath { get; set; } = string.Empty; - public string OutputFilePath { get; set; } = string.Empty; - public string SourceLanguage { get; set; } = "Auto"; - public string TargetLanguage { get; set; } = "Spanish"; // Spanish, French, German, Japanese, etc. - public bool PreserveLayout { get; set; } = true; -} - -public class MarkdownConversionOptions -{ - public string InputFilePath { get; set; } = string.Empty; - public string OutputFilePath { get; set; } = string.Empty; - public bool IncludeTables { get; set; } = true; - public bool IncludeImages { get; set; } = true; - public bool IncludeMetadataHeader { get; set; } = true; -} diff --git a/src/PdfEditorApp/Models/PdfToolPreviewPage.cs b/src/PdfEditorApp/Models/PdfToolPreviewPage.cs deleted file mode 100644 index b6725c3..0000000 --- a/src/PdfEditorApp/Models/PdfToolPreviewPage.cs +++ /dev/null @@ -1,34 +0,0 @@ -using Avalonia.Media.Imaging; -using CommunityToolkit.Mvvm.ComponentModel; - -namespace PdfEditorApp.Models; - -/// -/// One rendered page in a tool screen's live input-document preview. -/// -public partial class PdfToolPreviewPage : ObservableObject -{ - [ObservableProperty] - private int _pageNumber = 1; - - [ObservableProperty] - private double _widthPoints = 595; - - [ObservableProperty] - private double _heightPoints = 842; - - [ObservableProperty] - private Bitmap? _bitmap; - - [ObservableProperty] - private Bitmap? _thumbnailBitmap; - - [ObservableProperty] - private bool _isSelected; - - /// Scale the current was rendered at, so zoom changes only re-render when the resolution actually needs to change. - [ObservableProperty] - private float _renderedScale; - - public string PageLabel => $"Page {PageNumber}"; -} diff --git a/src/PdfEditorApp/Models/RecentDocumentItem.cs b/src/PdfEditorApp/Models/RecentDocumentItem.cs deleted file mode 100644 index b7929f9..0000000 --- a/src/PdfEditorApp/Models/RecentDocumentItem.cs +++ /dev/null @@ -1,86 +0,0 @@ -using System; -using System.IO; -using System.Text.Json.Serialization; -using CommunityToolkit.Mvvm.ComponentModel; -using PdfEditorApp.ViewModels; - -namespace PdfEditorApp.Models; - -/// -/// Represents a recently opened or saved FryPDF project file entry. -/// -public partial class RecentDocumentItem : ObservableObject -{ - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(FileName))] - [NotifyPropertyChangedFor(nameof(DirectoryName))] - [NotifyPropertyChangedFor(nameof(FileExists))] - [NotifyPropertyChangedFor(nameof(FormattedFileSize))] - private string _filePath = ""; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(FileName))] - private string _title = "Untitled"; - - [ObservableProperty] - private DateTime _lastOpened = DateTime.UtcNow; - - [ObservableProperty] - private int _pageCount = 1; - - [ObservableProperty] - private string _formatDescription = "A4 Document"; - - [ObservableProperty] - [property: JsonIgnore] - [NotifyPropertyChangedFor(nameof(HasLivePreview))] - private PageViewModel? _pagePreview; - - [JsonIgnore] - public bool HasLivePreview => PagePreview != null; - - [JsonIgnore] - public string FileName => string.IsNullOrEmpty(FilePath) ? Title : Path.GetFileName(FilePath); - - [JsonIgnore] - public string DirectoryName => string.IsNullOrEmpty(FilePath) ? "" : (Path.GetDirectoryName(FilePath) ?? ""); - - [JsonIgnore] - public bool FileExists => !string.IsNullOrEmpty(FilePath) && File.Exists(FilePath); - - [JsonIgnore] - public string FormattedFileSize - { - get - { - try - { - if (!FileExists) return ""; - var bytes = new FileInfo(FilePath).Length; - if (bytes < 1024) return $"{bytes} B"; - if (bytes < 1024 * 1024) return $"{bytes / 1024.0:F1} KB"; - return $"{bytes / (1024.0 * 1024.0):F1} MB"; - } - catch - { - return ""; - } - } - } - - /// Friendly display string for how long ago the file was opened. - [JsonIgnore] - public string RelativeTime - { - get - { - var delta = DateTime.UtcNow - LastOpened; - if (delta.TotalMinutes < 1) return "Just now"; - if (delta.TotalHours < 1) return $"{(int)delta.TotalMinutes}m ago"; - if (delta.TotalDays < 1) return $"{(int)delta.TotalHours}h ago"; - if (delta.TotalDays < 7) return $"{(int)delta.TotalDays}d ago"; - return LastOpened.ToString("MMM d, yyyy"); - } - } -} - diff --git a/src/PdfEditorApp/Models/ThirdPartyToolLicense.cs b/src/PdfEditorApp/Models/ThirdPartyToolLicense.cs deleted file mode 100644 index e20f6bd..0000000 --- a/src/PdfEditorApp/Models/ThirdPartyToolLicense.cs +++ /dev/null @@ -1,47 +0,0 @@ -using System; -using CommunityToolkit.Mvvm.ComponentModel; - -namespace PdfEditorApp.Models; - -/// -/// Represents a third-party library, package, tool, or engine utilized by FryPDF, -/// along with its license type, repository/website link, maintainer information, and full license text. -/// -public partial class ThirdPartyToolLicense : ObservableObject -{ - public required string Name { get; init; } - public required string Version { get; init; } - public required string LicenseType { get; init; } - public required string Category { get; init; } - public required string Purpose { get; init; } - public required string Maintainer { get; init; } - public required string ProjectUrl { get; init; } - public required string LicenseText { get; init; } - public required string AccentColorHex { get; init; } - public required string IconKind { get; init; } - - [ObservableProperty] - private bool _isExpanded; - - public string BadgeColorHex => LicenseType.ToUpperInvariant() switch - { - var l when l.Contains("MIT") => "#10B981", // Green - var l when l.Contains("APACHE") => "#0284C7", // Blue - var l when l.Contains("COMMUNITY") => "#8B5CF6", // Purple - var l when l.Contains("MICROSOFT") => "#0078D4", // Microsoft Blue - var l when l.Contains("OFL") || l.Contains("SIL") => "#D946EF", // Fuchsia / Pink - var l when l.Contains("UBUNTU") => "#EA580C", // Ubuntu Orange - _ => "#6366F1" - }; - - public string BadgeBackgroundHex => LicenseType.ToUpperInvariant() switch - { - var l when l.Contains("MIT") => "#ECFDF5", - var l when l.Contains("APACHE") => "#F0F9FF", - var l when l.Contains("COMMUNITY") => "#F5F3FF", - var l when l.Contains("MICROSOFT") => "#EFF6FF", - var l when l.Contains("OFL") || l.Contains("SIL") => "#FDF4FF", - var l when l.Contains("UBUNTU") => "#FFF7ED", - _ => "#EEF2FF" - }; -} diff --git a/src/PdfEditorApp/Models/UiSettingsModel.cs b/src/PdfEditorApp/Models/UiSettingsModel.cs deleted file mode 100644 index d5681c2..0000000 --- a/src/PdfEditorApp/Models/UiSettingsModel.cs +++ /dev/null @@ -1,94 +0,0 @@ -using System; -using System.Text.Json.Serialization; -using PdfEditorApp.Core.Models; - -namespace PdfEditorApp.Models; - -/// -/// Persisted user interface preferences and customization settings. -/// -public class UiSettingsModel -{ - // --- Toast / Snackbar Preferences --- - - [JsonPropertyName("toastPosition")] - public ToastPosition ToastPosition { get; set; } = ToastPosition.BottomCenter; - - [JsonPropertyName("toastStyleVariant")] - public ToastStyleVariant ToastStyleVariant { get; set; } = ToastStyleVariant.Solid; - - [JsonPropertyName("toastDurationMs")] - public int ToastDurationMs { get; set; } = 3500; - - [JsonPropertyName("toastShowCloseButton")] - public bool ToastShowCloseButton { get; set; } = true; - - [JsonPropertyName("toastSoundEnabled")] - public bool ToastSoundEnabled { get; set; } = false; - - // --- Appearance & Studio Theme --- - - [JsonPropertyName("themeMode")] - public AppThemeMode ThemeMode { get; set; } = AppThemeMode.Light; - - [JsonPropertyName("readingTheme")] - public PdfReaderTheme ReadingTheme { get; set; } = PdfReaderTheme.Default; - - [JsonPropertyName("accentColorHex")] - public string AccentColorHex { get; set; } = "#0F6CBD"; - - // --- Canvas & Document Workspace --- - - [JsonPropertyName("showGridByDefault")] - public bool ShowGridByDefault { get; set; } = false; - - [JsonPropertyName("snapToGridByDefault")] - public bool SnapToGridByDefault { get; set; } = false; - - [JsonPropertyName("gridSnapSize")] - public GridSnapSize GridSnapSize { get; set; } = GridSnapSize.Points20; - - [JsonPropertyName("defaultZoomMode")] - public PdfViewerZoomMode DefaultZoomMode { get; set; } = PdfViewerZoomMode.FitWidth; - - // --- Layout & Panel Behaviors --- - - [JsonPropertyName("compactRibbonByDefault")] - public bool CompactRibbonByDefault { get; set; } = false; - - [JsonPropertyName("autoExpandInspectorOnSelect")] - public bool AutoExpandInspectorOnSelect { get; set; } = true; - - [JsonPropertyName("showShortcutHints")] - public bool ShowShortcutHints { get; set; } = true; - - [JsonPropertyName("aiSettings")] - public AiSettingsModel AiSettings { get; set; } = new(); - - [JsonPropertyName("updatedAt")] - public DateTime UpdatedAt { get; set; } = DateTime.UtcNow; - - public UiSettingsModel Clone() - { - return new UiSettingsModel - { - ToastPosition = this.ToastPosition, - ToastStyleVariant = this.ToastStyleVariant, - ToastDurationMs = this.ToastDurationMs, - ToastShowCloseButton = this.ToastShowCloseButton, - ToastSoundEnabled = this.ToastSoundEnabled, - ThemeMode = this.ThemeMode, - ReadingTheme = this.ReadingTheme, - AccentColorHex = this.AccentColorHex, - ShowGridByDefault = this.ShowGridByDefault, - SnapToGridByDefault = this.SnapToGridByDefault, - GridSnapSize = this.GridSnapSize, - DefaultZoomMode = this.DefaultZoomMode, - CompactRibbonByDefault = this.CompactRibbonByDefault, - AutoExpandInspectorOnSelect = this.AutoExpandInspectorOnSelect, - ShowShortcutHints = this.ShowShortcutHints, - AiSettings = this.AiSettings.Clone(), - UpdatedAt = this.UpdatedAt - }; - } -} diff --git a/src/PdfEditorApp/Models/WorkflowModels.cs b/src/PdfEditorApp/Models/WorkflowModels.cs deleted file mode 100644 index bb41126..0000000 --- a/src/PdfEditorApp/Models/WorkflowModels.cs +++ /dev/null @@ -1,84 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text.Json; - -namespace PdfEditorApp.Models; - -public class WorkflowStepDefinition -{ - public string Id { get; set; } = Guid.NewGuid().ToString("N"); - public PdfToolId ToolId { get; set; } - public string StepName { get; set; } = string.Empty; - public string StepDescription { get; set; } = string.Empty; - public bool IsEnabled { get; set; } = true; - public string ParametersJson { get; set; } = "{}"; - - public T GetParameters() where T : class, new() - { - try - { - if (string.IsNullOrWhiteSpace(ParametersJson)) return new T(); - return JsonSerializer.Deserialize(ParametersJson) ?? new T(); - } - catch - { - return new T(); - } - } - - public void SetParameters(T parameters) - { - ParametersJson = JsonSerializer.Serialize(parameters); - } -} - -public class WorkflowDefinition -{ - public string Id { get; set; } = Guid.NewGuid().ToString("N"); - public string Name { get; set; } = "Automated Document Pipeline"; - public string Description { get; set; } = "Chain multiple PDF operations together into a reusable automated pipeline"; - public DateTime CreatedAt { get; set; } = DateTime.UtcNow; - public DateTime ModifiedAt { get; set; } = DateTime.UtcNow; - public string OutputDirectory { get; set; } = string.Empty; - public string OutputFileNamePattern { get; set; } = "{filename}_pipeline.pdf"; - public List Steps { get; set; } = new(); - - public WorkflowDefinition Clone() - { - var clone = new WorkflowDefinition - { - Id = Guid.NewGuid().ToString("N"), - Name = $"{Name} (Copy)", - Description = Description, - CreatedAt = DateTime.UtcNow, - ModifiedAt = DateTime.UtcNow, - OutputDirectory = OutputDirectory, - OutputFileNamePattern = OutputFileNamePattern - }; - - foreach (var s in Steps) - { - clone.Steps.Add(new WorkflowStepDefinition - { - Id = Guid.NewGuid().ToString("N"), - ToolId = s.ToolId, - StepName = s.StepName, - StepDescription = s.StepDescription, - IsEnabled = s.IsEnabled, - ParametersJson = s.ParametersJson - }); - } - - return clone; - } -} - -public record WorkflowProgressInfo -{ - public int CurrentStepIndex { get; init; } - public int TotalSteps { get; init; } - public string CurrentStepName { get; init; } = string.Empty; - public string CurrentFileName { get; init; } = string.Empty; - public double OverallProgressPercentage { get; init; } - public string StatusMessage { get; init; } = string.Empty; -} diff --git a/src/PdfEditorApp/PdfEditorApp.csproj b/src/PdfEditorApp/PdfEditorApp.csproj deleted file mode 100644 index a64b090..0000000 --- a/src/PdfEditorApp/PdfEditorApp.csproj +++ /dev/null @@ -1,52 +0,0 @@ - - - WinExe - net10.0 - enable - true - $(NoWarn);NU1901;NU1902;NU1903;NU1904 - Assets/app-logo.ico - app.manifest - 1.0.0 - FryPDF - FryPDF - Code Fry Dev - Copyright © 2026 Code Fry Dev - Privacy-first, professional desktop PDF creator and editor studio - - - - - - - - - - - - - - - - - - - - None - All - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Plugins/Bundles/AiProvidersBundle.cs b/src/PdfEditorApp/Plugins/Bundles/AiProvidersBundle.cs deleted file mode 100644 index bcbe42a..0000000 --- a/src/PdfEditorApp/Plugins/Bundles/AiProvidersBundle.cs +++ /dev/null @@ -1,109 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using PdfEditorApp.Core.Plugins; -using PdfEditorApp.Core.Plugins.Profiles; -using PdfEditorApp.Services.AI; -using PdfEditorApp.Services.AI.Providers; - -namespace PdfEditorApp.Plugins.Bundles; - -/// -/// Plugin bundle providing all built-in AI model providers. -/// -public class AiProvidersBundle : IFryPluginBundle -{ - public string Id => "FryPdf.Bundle.AiProviders"; - public string Name => "AI Model Providers Bundle"; - public string Description => "Pluggable AI providers: local Ollama, ultra-fast Groq cloud inference, and OpenAI compatible endpoints."; - - public IReadOnlyList Plugins => new IFryPlugin[] - { - new OllamaAiPlugin(), - new GroqAiPlugin(), - new OpenAiPlugin() - }; -} - -public class OllamaAiPlugin : IFryPlugin -{ - public string Id => "frypdf.ai.ollama"; - public string Name => "Ollama Local AI Provider"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => new[] { typeof(IAiProviderRegistry) }; - - public IReadOnlyDictionary? SettingsSchema => new Dictionary - { - ["Endpoint"] = new() - { - Type = "string", - Label = "Ollama Endpoint URL", - Description = "HTTP endpoint for local Ollama daemon", - DefaultValue = "http://localhost:11434" - }, - ["Model"] = new() - { - Type = "string", - Label = "Model Tag", - Description = "Default local model tag (e.g. llama3, mistral, phi3)", - DefaultValue = "llama3" - } - }; - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - var reg = ctx.GetService(); - reg.RegisterProvider(new OllamaAiProvider()); - return Task.CompletedTask; - } -} - -public class GroqAiPlugin : IFryPlugin -{ - public string Id => "frypdf.ai.groq"; - public string Name => "Groq Cloud AI Provider"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => new[] { typeof(IAiProviderRegistry) }; - - public IReadOnlyDictionary? SettingsSchema => new Dictionary - { - ["ApiKey"] = new() - { - Type = "secret", - Label = "Groq API Key", - Description = "API key from console.groq.com for ultra-fast Llama-3 / Mixtral inference", - DefaultValue = "" - }, - ["Model"] = new() - { - Type = "select", - Label = "Model", - Description = "Inference model name", - DefaultValue = "llama-3.3-70b-versatile", - Options = new List { "llama-3.3-70b-versatile", "llama-3.1-8b-instant", "mixtral-8x7b-32768" } - } - }; - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - var reg = ctx.GetService(); - reg.RegisterProvider(new GroqAiProvider()); - return Task.CompletedTask; - } -} - -public class OpenAiPlugin : IFryPlugin -{ - public string Id => "frypdf.ai.openai"; - public string Name => "OpenAI / Compatible Provider"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => new[] { typeof(IAiProviderRegistry) }; - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - var reg = ctx.GetService(); - reg.RegisterProvider(new OpenAiProvider()); - return Task.CompletedTask; - } -} diff --git a/src/PdfEditorApp/Plugins/Bundles/CanvasElementsBundle.cs b/src/PdfEditorApp/Plugins/Bundles/CanvasElementsBundle.cs deleted file mode 100644 index 620e9b2..0000000 --- a/src/PdfEditorApp/Plugins/Bundles/CanvasElementsBundle.cs +++ /dev/null @@ -1,386 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using PdfEditorApp.Core.Models.Elements; -using PdfEditorApp.Core.Plugins; -using PdfEditorApp.Core.Plugins.Descriptors; -using PdfEditorApp.Core.Plugins.Profiles; -using PdfEditorApp.ViewModels.ElementViewModels; - -namespace PdfEditorApp.Plugins.Bundles; - -/// -/// Plugin bundle providing all built-in canvas elements for FryPDF. -/// Enables profile-level enabling/disabling (e.g. minimal viewer vs full publisher). -/// -public class CanvasElementsBundle : IFryPluginBundle -{ - public string Id => "FryPdf.Bundle.CanvasElements"; - public string Name => "Canvas Elements Bundle"; - public string Description => "Core canvas elements: typography, geometry, charts, tables, LaTeX equations, form controls, and signatures."; - - public IReadOnlyList Plugins => new IFryPlugin[] - { - new TextElementPlugin(), - new ShapeElementPlugin(), - new MediaElementPlugin(), - new DataVisualsElementPlugin(), - new MathElementPlugin(), - new FormElementsPlugin(), - new MarkupElementsPlugin() - }; -} - -public class TextElementPlugin : IFryPlugin -{ - public string Id => "frypdf.element.plugin.text"; - public string Name => "Typography Elements"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => Array.Empty(); - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - ctx.RegisterCanvasElement(new CanvasElementDescriptor - { - ElementTypeId = "frypdf.element.text", - DisplayName = "Text Block", - ModelType = typeof(PdfTextElement), - ViewModelType = typeof(TextElementViewModel), - IconKind = "FormatColorText", - DefaultWidth = 200, - DefaultHeight = 60, - CanInsertFromToolbar = true, - InsertionCategory = "Basic", - ShortcutKey = "T", - SortOrder = 10, - Tags = new[] { "text", "typography", "heading", "label" }, - Factory = (sp, m) => new TextElementViewModel() - }); - - ctx.RegisterCanvasElement(new CanvasElementDescriptor - { - ElementTypeId = "frypdf.element.divider", - DisplayName = "Divider Line", - ModelType = typeof(PdfDividerElement), - ViewModelType = typeof(DividerElementViewModel), - IconKind = "Minus", - DefaultWidth = 300, - DefaultHeight = 20, - CanInsertFromToolbar = true, - InsertionCategory = "Basic", - SortOrder = 20, - Tags = new[] { "divider", "line", "separator" }, - Factory = (sp, m) => new DividerElementViewModel() - }); - - return Task.CompletedTask; - } -} - -public class ShapeElementPlugin : IFryPlugin -{ - public string Id => "frypdf.element.plugin.shape"; - public string Name => "Geometric Shapes"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => Array.Empty(); - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - ctx.RegisterCanvasElement(new CanvasElementDescriptor - { - ElementTypeId = "frypdf.element.shape", - DisplayName = "Geometric Shape", - ModelType = typeof(PdfShapeElement), - ViewModelType = typeof(ShapeElementViewModel), - IconKind = "ShapeOutline", - DefaultWidth = 150, - DefaultHeight = 100, - CanInsertFromToolbar = true, - InsertionCategory = "Basic", - ShortcutKey = "R", - SortOrder = 30, - Tags = new[] { "shape", "rectangle", "circle", "arrow", "polygon" }, - Factory = (sp, m) => new ShapeElementViewModel() - }); - - return Task.CompletedTask; - } -} - -public class MediaElementPlugin : IFryPlugin -{ - public string Id => "frypdf.element.plugin.media"; - public string Name => "Media Graphics"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => Array.Empty(); - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - ctx.RegisterCanvasElement(new CanvasElementDescriptor - { - ElementTypeId = "frypdf.element.image", - DisplayName = "Image Graphic", - ModelType = typeof(PdfImageElement), - ViewModelType = typeof(ImageElementViewModel), - IconKind = "ImageOutline", - DefaultWidth = 200, - DefaultHeight = 150, - CanInsertFromToolbar = true, - InsertionCategory = "Media", - ShortcutKey = "I", - SortOrder = 40, - Tags = new[] { "image", "photo", "bitmap", "picture" }, - Factory = (sp, m) => new ImageElementViewModel() - }); - - ctx.RegisterCanvasElement(new CanvasElementDescriptor - { - ElementTypeId = "frypdf.element.svg", - DisplayName = "Vector SVG Artwork", - ModelType = typeof(PdfSvgElement), - ViewModelType = typeof(SvgElementViewModel), - IconKind = "VectorSquare", - DefaultWidth = 180, - DefaultHeight = 180, - CanInsertFromToolbar = true, - InsertionCategory = "Media", - SortOrder = 45, - Tags = new[] { "svg", "vector", "graphic", "illustration" }, - Factory = (sp, m) => new SvgElementViewModel() - }); - - return Task.CompletedTask; - } -} - -public class DataVisualsElementPlugin : IFryPlugin -{ - public string Id => "frypdf.element.plugin.datavisuals"; - public string Name => "Data Visualizations"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => Array.Empty(); - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - ctx.RegisterCanvasElement(new CanvasElementDescriptor - { - ElementTypeId = "frypdf.element.table", - DisplayName = "Data Table", - ModelType = typeof(PdfTableElement), - ViewModelType = typeof(TableElementViewModel), - IconKind = "TableLarge", - DefaultWidth = 400, - DefaultHeight = 160, - CanInsertFromToolbar = true, - InsertionCategory = "Tables & Data", - SortOrder = 50, - Tags = new[] { "table", "grid", "data", "columns", "rows" }, - Factory = (sp, m) => new TableElementViewModel() - }); - - ctx.RegisterCanvasElement(new CanvasElementDescriptor - { - ElementTypeId = "frypdf.element.chart", - DisplayName = "Interactive Chart", - ModelType = typeof(PdfChartElement), - ViewModelType = typeof(ChartElementViewModel), - IconKind = "ChartBar", - DefaultWidth = 400, - DefaultHeight = 250, - CanInsertFromToolbar = true, - InsertionCategory = "Tables & Data", - SortOrder = 60, - Tags = new[] { "chart", "graph", "bar", "pie", "line", "candlestick", "radar", "waterfall" }, - Factory = (sp, m) => new ChartElementViewModel() - }); - - ctx.RegisterCanvasElement(new CanvasElementDescriptor - { - ElementTypeId = "frypdf.element.qrcode", - DisplayName = "QR Code", - ModelType = typeof(PdfQrCodeElement), - ViewModelType = typeof(QrCodeElementViewModel), - IconKind = "Qrcode", - DefaultWidth = 120, - DefaultHeight = 120, - CanInsertFromToolbar = true, - InsertionCategory = "Tables & Data", - SortOrder = 70, - Tags = new[] { "qrcode", "barcode", "url", "2d" }, - Factory = (sp, m) => new QrCodeElementViewModel() - }); - - ctx.RegisterCanvasElement(new CanvasElementDescriptor - { - ElementTypeId = "frypdf.element.barcode", - DisplayName = "Barcode", - ModelType = typeof(PdfBarcodeElement), - ViewModelType = typeof(BarcodeElementViewModel), - IconKind = "Barcode", - DefaultWidth = 200, - DefaultHeight = 80, - CanInsertFromToolbar = true, - InsertionCategory = "Tables & Data", - SortOrder = 80, - Tags = new[] { "barcode", "code128", "ean", "optical" }, - Factory = (sp, m) => new BarcodeElementViewModel() - }); - - return Task.CompletedTask; - } -} - -public class MathElementPlugin : IFryPlugin -{ - public string Id => "frypdf.element.plugin.math"; - public string Name => "Math Equations (LaTeX)"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => Array.Empty(); - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - ctx.RegisterCanvasElement(new CanvasElementDescriptor - { - ElementTypeId = "frypdf.element.math", - DisplayName = "Math Equation", - ModelType = typeof(PdfMathElement), - ViewModelType = typeof(MathElementViewModel), - IconKind = "Sigma", - DefaultWidth = 240, - DefaultHeight = 60, - CanInsertFromToolbar = true, - InsertionCategory = "Equations", - ShortcutKey = "M", - SortOrder = 90, - Tags = new[] { "math", "formula", "equation", "latex", "integral", "matrix" }, - Factory = (sp, m) => new MathElementViewModel() - }); - - return Task.CompletedTask; - } -} - -public class FormElementsPlugin : IFryPlugin -{ - public string Id => "frypdf.element.plugin.forms"; - public string Name => "Interactive Form Controls"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => Array.Empty(); - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - ctx.RegisterCanvasElement(new CanvasElementDescriptor - { - ElementTypeId = "frypdf.element.formfield", - DisplayName = "Form Field", - ModelType = typeof(PdfFormFieldElement), - ViewModelType = typeof(FormFieldElementViewModel), - IconKind = "TextBoxOutline", - DefaultWidth = 180, - DefaultHeight = 36, - CanInsertFromToolbar = true, - InsertionCategory = "Forms", - SortOrder = 100, - Tags = new[] { "form", "field", "input", "checkbox", "dropdown" }, - Factory = (sp, m) => new FormFieldElementViewModel() - }); - - return Task.CompletedTask; - } -} - -public class MarkupElementsPlugin : IFryPlugin -{ - public string Id => "frypdf.element.plugin.markup"; - public string Name => "Stamps, Redaction & Markup"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => Array.Empty(); - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - ctx.RegisterCanvasElement(new CanvasElementDescriptor - { - ElementTypeId = "frypdf.element.watermark", - DisplayName = "Watermark", - ModelType = typeof(PdfWatermarkElement), - ViewModelType = typeof(WatermarkElementViewModel), - IconKind = "Watermark", - DefaultWidth = 400, - DefaultHeight = 120, - CanInsertFromToolbar = true, - InsertionCategory = "Annotations", - SortOrder = 110, - Tags = new[] { "watermark", "draft", "confidential", "diagonal" }, - Factory = (sp, m) => new WatermarkElementViewModel() - }); - - ctx.RegisterCanvasElement(new CanvasElementDescriptor - { - ElementTypeId = "frypdf.element.redaction", - DisplayName = "Redaction Annotation", - ModelType = typeof(PdfRedactionElement), - ViewModelType = typeof(RedactionElementViewModel), - IconKind = "EyeOffOutline", - DefaultWidth = 160, - DefaultHeight = 40, - CanInsertFromToolbar = true, - InsertionCategory = "Annotations", - SortOrder = 120, - Tags = new[] { "redact", "redaction", "blackout", "security" }, - Factory = (sp, m) => new RedactionElementViewModel() - }); - - ctx.RegisterCanvasElement(new CanvasElementDescriptor - { - ElementTypeId = "frypdf.element.stickynote", - DisplayName = "Sticky Review Note", - ModelType = typeof(PdfStickyNoteElement), - ViewModelType = typeof(StickyNoteElementViewModel), - IconKind = "NoteOutline", - DefaultWidth = 180, - DefaultHeight = 140, - CanInsertFromToolbar = true, - InsertionCategory = "Annotations", - ShortcutKey = "N", - SortOrder = 130, - Tags = new[] { "note", "comment", "review", "annotation", "sticky" }, - Factory = (sp, m) => new StickyNoteElementViewModel() - }); - - ctx.RegisterCanvasElement(new CanvasElementDescriptor - { - ElementTypeId = "frypdf.element.ink", - DisplayName = "Freehand Drawing", - ModelType = typeof(PdfInkElement), - ViewModelType = typeof(InkElementViewModel), - IconKind = "DrawPen", - DefaultWidth = 150, - DefaultHeight = 100, - CanInsertFromToolbar = true, - InsertionCategory = "Annotations", - ShortcutKey = "D", - SortOrder = 140, - Tags = new[] { "ink", "pen", "draw", "highlight", "marker" }, - Factory = (sp, m) => new InkElementViewModel() - }); - - ctx.RegisterCanvasElement(new CanvasElementDescriptor - { - ElementTypeId = "frypdf.element.measurement", - DisplayName = "Measurement Dimension", - ModelType = typeof(PdfMeasurementElement), - ViewModelType = typeof(MeasurementElementViewModel), - IconKind = "Ruler", - DefaultWidth = 200, - DefaultHeight = 30, - CanInsertFromToolbar = true, - InsertionCategory = "Annotations", - SortOrder = 150, - Tags = new[] { "measure", "dimension", "ruler", "cad" }, - Factory = (sp, m) => new MeasurementElementViewModel() - }); - - return Task.CompletedTask; - } -} diff --git a/src/PdfEditorApp/Plugins/Bundles/CommandPaletteBundle.cs b/src/PdfEditorApp/Plugins/Bundles/CommandPaletteBundle.cs deleted file mode 100644 index f0f21a8..0000000 --- a/src/PdfEditorApp/Plugins/Bundles/CommandPaletteBundle.cs +++ /dev/null @@ -1,288 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using PdfEditorApp.Core.Plugins; -using PdfEditorApp.Core.Plugins.Descriptors; -using PdfEditorApp.Core.Plugins.Profiles; - -namespace PdfEditorApp.Plugins.Bundles; - -/// -/// Plugin bundle providing all standard Command Palette (⌘K / Ctrl+K) searchable actions. -/// -public class CommandPaletteBundle : IFryPluginBundle -{ - public string Id => "FryPdf.Bundle.CommandPalette"; - public string Name => "Command Palette Actions Bundle"; - public string Description => "Extensible Command Palette (⌘K / Ctrl+K) and keyboard shortcuts for quick action navigation."; - - public IReadOnlyList Plugins => new IFryPlugin[] - { - new FileCommandsPlugin(), - new EditCommandsPlugin(), - new InsertCommandsPlugin(), - new ViewCommandsPlugin(), - new SecurityCommandsPlugin() - }; -} - -public class FileCommandsPlugin : IFryPlugin -{ - public string Id => "frypdf.commands.file"; - public string Name => "File Operations Commands"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => Array.Empty(); - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - ctx.RegisterCommand(new CommandPaletteDescriptor - { - Id = "cmd.file.new", - Title = "New Document / Templates", - Subtitle = "Browse executive templates or start a blank document", - Category = "File", - IconKind = "FilePlusOutline", - Shortcut = "⌘N", - Order = 10 - }); - - ctx.RegisterCommand(new CommandPaletteDescriptor - { - Id = "cmd.file.save", - Title = "Save Project", - Subtitle = "Save editable FryPDF project archive (.frypdf)", - Category = "File", - IconKind = "ContentSaveOutline", - Shortcut = "⌘S", - Order = 20 - }); - - ctx.RegisterCommand(new CommandPaletteDescriptor - { - Id = "cmd.file.open", - Title = "Open Project", - Subtitle = "Open existing FryPDF project archive (.frypdf)", - Category = "File", - IconKind = "FolderOpenOutline", - Shortcut = "⌘O", - Order = 30 - }); - - ctx.RegisterCommand(new CommandPaletteDescriptor - { - Id = "cmd.file.export", - Title = "Export Production PDF", - Subtitle = "Compile document to high-resolution vector PDF", - Category = "File", - IconKind = "FilePdfBox", - Shortcut = "⌘E", - Order = 40 - }); - - return Task.CompletedTask; - } -} - -public class EditCommandsPlugin : IFryPlugin -{ - public string Id => "frypdf.commands.edit"; - public string Name => "Edit & History Commands"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => Array.Empty(); - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - ctx.RegisterCommand(new CommandPaletteDescriptor - { - Id = "cmd.edit.undo", - Title = "Undo Action", - Subtitle = "Revert last canvas or page operation", - Category = "Edit", - IconKind = "Undo", - Shortcut = "⌘Z", - Order = 10 - }); - - ctx.RegisterCommand(new CommandPaletteDescriptor - { - Id = "cmd.edit.redo", - Title = "Redo Action", - Subtitle = "Reapply reverted operation", - Category = "Edit", - IconKind = "Redo", - Shortcut = "⌘Y", - Order = 20 - }); - - ctx.RegisterCommand(new CommandPaletteDescriptor - { - Id = "cmd.edit.cut", - Title = "Cut Element", - Subtitle = "Cut selected element to internal clipboard", - Category = "Edit", - IconKind = "ContentCut", - Shortcut = "⌘X", - Order = 30 - }); - - ctx.RegisterCommand(new CommandPaletteDescriptor - { - Id = "cmd.edit.copy", - Title = "Copy Element", - Subtitle = "Copy selected element to internal clipboard", - Category = "Edit", - IconKind = "ContentCopy", - Shortcut = "⌘C", - Order = 40 - }); - - ctx.RegisterCommand(new CommandPaletteDescriptor - { - Id = "cmd.edit.paste", - Title = "Paste Element", - Subtitle = "Paste element from clipboard to current page", - Category = "Edit", - IconKind = "ContentPaste", - Shortcut = "⌘V", - Order = 50 - }); - - return Task.CompletedTask; - } -} - -public class InsertCommandsPlugin : IFryPlugin -{ - public string Id => "frypdf.commands.insert"; - public string Name => "Insert Elements Commands"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => Array.Empty(); - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - ctx.RegisterCommand(new CommandPaletteDescriptor - { - Id = "cmd.insert.text", - Title = "Insert Text Block", - Subtitle = "Add multi-line editable rich text block", - Category = "Insert", - IconKind = "FormatColorText", - Shortcut = "T", - Order = 10 - }); - - ctx.RegisterCommand(new CommandPaletteDescriptor - { - Id = "cmd.insert.image", - Title = "Insert Image Graphic", - Subtitle = "Import PNG, JPEG, or WebP graphic from disk", - Category = "Insert", - IconKind = "ImageOutline", - Shortcut = "⌘I", - Order = 20 - }); - - ctx.RegisterCommand(new CommandPaletteDescriptor - { - Id = "cmd.insert.table", - Title = "Insert Data Table", - Subtitle = "Add customizable multi-column data grid", - Category = "Insert", - IconKind = "TableLarge", - Order = 30 - }); - - ctx.RegisterCommand(new CommandPaletteDescriptor - { - Id = "cmd.insert.math", - Title = "Insert Math Equation (LaTeX)", - Subtitle = "Add vector LaTeX mathematical equation", - Category = "Insert", - IconKind = "Sigma", - Shortcut = "⌘M", - Order = 40 - }); - - return Task.CompletedTask; - } -} - -public class ViewCommandsPlugin : IFryPlugin -{ - public string Id => "frypdf.commands.view"; - public string Name => "View & Navigation Commands"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => Array.Empty(); - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - ctx.RegisterCommand(new CommandPaletteDescriptor - { - Id = "cmd.view.ribbon", - Title = "Toggle Ribbon Toolbar", - Subtitle = "Collapse or expand top ribbon tools panel", - Category = "View", - IconKind = "ViewAgendaOutline", - Shortcut = "⌘F1", - Order = 10 - }); - - ctx.RegisterCommand(new CommandPaletteDescriptor - { - Id = "cmd.view.sidebar", - Title = "Toggle Pages Sidebar", - Subtitle = "Collapse or expand left thumbnails & outline sidebar", - Category = "View", - IconKind = "DockLeft", - Shortcut = "⌘B", - Order = 20 - }); - - ctx.RegisterCommand(new CommandPaletteDescriptor - { - Id = "cmd.view.inspector", - Title = "Toggle Properties Inspector", - Subtitle = "Collapse or expand right formatting & properties panel", - Category = "View", - IconKind = "DockRight", - Shortcut = "⌘⇧P", - Order = 30 - }); - - return Task.CompletedTask; - } -} - -public class SecurityCommandsPlugin : IFryPlugin -{ - public string Id => "frypdf.commands.security"; - public string Name => "Security & Redaction Commands"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => Array.Empty(); - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - ctx.RegisterCommand(new CommandPaletteDescriptor - { - Id = "cmd.security.sanitize", - Title = "Sanitize Document", - Subtitle = "Scrub author metadata and internal review notes", - Category = "Security", - IconKind = "ShieldCheck", - Order = 10 - }); - - ctx.RegisterCommand(new CommandPaletteDescriptor - { - Id = "cmd.security.redact", - Title = "Search & Redact Pattern", - Subtitle = "Auto-redact text occurrences on current page", - Category = "Security", - IconKind = "DatabaseSearchOutline", - Order = 20 - }); - - return Task.CompletedTask; - } -} diff --git a/src/PdfEditorApp/Plugins/Bundles/DataStudioBundle.cs b/src/PdfEditorApp/Plugins/Bundles/DataStudioBundle.cs deleted file mode 100644 index d2e9731..0000000 --- a/src/PdfEditorApp/Plugins/Bundles/DataStudioBundle.cs +++ /dev/null @@ -1,66 +0,0 @@ -using System; -using System.Collections.Generic; -using Microsoft.Extensions.DependencyInjection; -using PdfEditorApp.Core.Plugins; -using PdfEditorApp.Core.Plugins.Descriptors; -using PdfEditorApp.Core.Plugins.Profiles; -using PdfEditorApp.Models; -using PdfEditorApp.ViewModels.BatchGeneration; -using PdfEditorApp.ViewModels.DataStudio; - -namespace PdfEditorApp.Plugins.Bundles; - -public class DataStudioBundle : IFryPluginBundle -{ - public string Id => "FryPdf.Bundle.DataStudio"; - public string Name => "Data Studio & Batch Generation Bundle"; - public string Description => "Tabular dataset ingestion (Excel, CSV, REST APIs), dynamic data binding, and high-throughput batch PDF generation."; - - public IReadOnlyList Plugins => new IFryPlugin[] - { - new DataStudioToolPlugin(), - new BatchGenerationToolPlugin() - }; -} - -public class DataStudioToolPlugin : ToolPluginBase -{ - public override string Id => "frypdf.tool.datastudio"; - public override string Name => "Data Studio"; - - protected override PdfToolDescriptor CreateDescriptor() => new() - { - Id = Id, - LegacyId = (int)PdfToolId.WorkflowBuilder, - Name = Name, - Description = "Connect external datasets (Excel, CSV, REST API) and bind dynamic fields to PDF tables, charts, and text templates.", - Category = "AiAndAutomation", - IconKind = "DatabaseOutline", - IconColorHex = "#0284C7", - BackgroundAccentHex = "#F0F9FF", - SupportsMultiFile = false, - AcceptedFileExtensions = ".xlsx,.csv,.tsv,.json", - CreateViewModel = sp => ActivatorUtilities.CreateInstance(sp) - }; -} - -public class BatchGenerationToolPlugin : ToolPluginBase -{ - public override string Id => "frypdf.tool.batchgeneration"; - public override string Name => "Batch Mail Merge"; - - protected override PdfToolDescriptor CreateDescriptor() => new() - { - Id = Id, - LegacyId = (int)PdfToolId.BatchMailMerge, - Name = Name, - Description = "Generate hundreds of personalized PDFs (payslips, certificates, invoices, badges) in one click using Excel, CSV, or REST APIs.", - Category = "AiAndAutomation", - IconKind = "DatabaseArrowDownOutline", - IconColorHex = "#0F6CBD", - BackgroundAccentHex = "#EFF6FF", - SupportsMultiFile = false, - AcceptedFileExtensions = ".xlsx,.csv,.tsv,.json", - CreateViewModel = sp => ActivatorUtilities.CreateInstance(sp) - }; -} diff --git a/src/PdfEditorApp/Plugins/Bundles/DialogsBundle.cs b/src/PdfEditorApp/Plugins/Bundles/DialogsBundle.cs deleted file mode 100644 index 3131595..0000000 --- a/src/PdfEditorApp/Plugins/Bundles/DialogsBundle.cs +++ /dev/null @@ -1,240 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using PdfEditorApp.Core.Plugins; -using PdfEditorApp.Core.Plugins.Descriptors; -using PdfEditorApp.Core.Plugins.Profiles; -using PdfEditorApp.Views.Dialogs; - -namespace PdfEditorApp.Plugins.Bundles; - -/// -/// Plugin bundle providing all modal dialogs, studio overlays, and floating assistant inspectors. -/// -public class DialogsBundle : IFryPluginBundle -{ - public string Id => "FryPdf.Bundle.Dialogs"; - public string Name => "Modal Dialogs & Studios Bundle"; - public string Description => "Modular modal dialogs: New Document, About, Shortcuts Help, Signatures, Security, Preflight Diagnostics, Watermark, Math Studio, and Data Studio."; - - public IReadOnlyList Plugins => new IFryPlugin[] - { - new CoreAppDialogsPlugin(), - new SecurityDialogsPlugin(), - new DocumentUtilityDialogsPlugin(), - new AdvancedStudioDialogsPlugin() - }; -} - -public class CoreAppDialogsPlugin : IFryPlugin -{ - public string Id => "frypdf.dialogs.core"; - public string Name => "Core Application Dialogs"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => Array.Empty(); - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - ctx.RegisterDialog(new DialogDescriptor - { - Id = "frypdf.dialog.about", - Title = "About FryPDF", - ViewType = typeof(AboutDialog), - ViewFactory = sp => new AboutDialog() - }); - - ctx.RegisterDialog(new DialogDescriptor - { - Id = "frypdf.dialog.shortcuts", - Title = "Keyboard Shortcuts", - ViewType = typeof(ShortcutsHelpDialog), - ViewFactory = sp => new ShortcutsHelpDialog() - }); - - ctx.RegisterDialog(new DialogDescriptor - { - Id = "frypdf.dialog.plugins", - Title = "Plugins & Extensions Studio", - ViewType = typeof(PluginsDialog), - ViewFactory = sp => new PluginsDialog() - }); - - ctx.RegisterDialog(new DialogDescriptor - { - Id = "frypdf.dialog.newdocument", - Title = "Create New Document", - ViewType = typeof(NewDocumentDialog), - ViewFactory = sp => new NewDocumentDialog() - }); - - ctx.RegisterDialog(new DialogDescriptor - { - Id = "frypdf.dialog.exportsuccess", - Title = "Export Completed", - ViewType = typeof(ExportSuccessDialog), - ViewFactory = sp => new ExportSuccessDialog() - }); - - return Task.CompletedTask; - } -} - -public class SecurityDialogsPlugin : IFryPlugin -{ - public string Id => "frypdf.dialogs.security"; - public string Name => "Document Security & Privacy Dialogs"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => Array.Empty(); - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - ctx.RegisterDialog(new DialogDescriptor - { - Id = "frypdf.dialog.security", - Title = "Document Security & Permissions", - ViewType = typeof(DocumentSecurityDialog), - ViewFactory = sp => new DocumentSecurityDialog() - }); - - ctx.RegisterDialog(new DialogDescriptor - { - Id = "frypdf.dialog.searchredact", - Title = "Search & Redact Sensitive Content", - ViewType = typeof(SearchRedactDialog), - ViewFactory = sp => new SearchRedactDialog() - }); - - ctx.RegisterDialog(new DialogDescriptor - { - Id = "frypdf.dialog.watermark", - Title = "Watermark Manager", - ViewType = typeof(WatermarkManagerDialog), - ViewFactory = sp => new WatermarkManagerDialog() - }); - - return Task.CompletedTask; - } -} - -public class DocumentUtilityDialogsPlugin : IFryPlugin -{ - public string Id => "frypdf.dialogs.utilities"; - public string Name => "Document Utility Dialogs"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => Array.Empty(); - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - ctx.RegisterDialog(new DialogDescriptor - { - Id = "frypdf.dialog.preflight", - Title = "Preflight Diagnostics", - ViewType = typeof(PreflightDiagnosticsDialog), - ViewFactory = sp => new PreflightDiagnosticsDialog() - }); - - ctx.RegisterDialog(new DialogDescriptor - { - Id = "frypdf.dialog.headerfooter", - Title = "Header & Footer Studio", - ViewType = typeof(HeaderFooterDialog), - ViewFactory = sp => new HeaderFooterDialog() - }); - - ctx.RegisterDialog(new DialogDescriptor - { - Id = "frypdf.dialog.customstamp", - Title = "Custom Dynamic Stamps", - ViewType = typeof(CustomStampDialog), - ViewFactory = sp => new CustomStampDialog() - }); - - ctx.RegisterDialog(new DialogDescriptor - { - Id = "frypdf.dialog.bates", - Title = "Bates Legal Numbering", - ViewType = typeof(BatesNumberingDialog), - ViewFactory = sp => new BatesNumberingDialog() - }); - - ctx.RegisterDialog(new DialogDescriptor - { - Id = "frypdf.dialog.splitextract", - Title = "Split & Extract Pages", - ViewType = typeof(SplitExtractDialog), - ViewFactory = sp => new SplitExtractDialog() - }); - - ctx.RegisterDialog(new DialogDescriptor - { - Id = "frypdf.dialog.compare", - Title = "Compare Documents", - ViewType = typeof(CompareDocumentsDialog), - ViewFactory = sp => new CompareDocumentsDialog() - }); - - return Task.CompletedTask; - } -} - -public class AdvancedStudioDialogsPlugin : IFryPlugin -{ - public string Id => "frypdf.dialogs.studios"; - public string Name => "Advanced Floating Studio Dialogs"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => Array.Empty(); - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - ctx.RegisterDialog(new DialogDescriptor - { - Id = "frypdf.dialog.signature", - Title = "Digital Signature Studio", - ViewType = typeof(SignatureStudioDialog), - ViewFactory = sp => new SignatureStudioDialog() - }); - - ctx.RegisterDialog(new DialogDescriptor - { - Id = "frypdf.dialog.math", - Title = "LaTeX Math Formula Studio", - ViewType = typeof(MathEquationStudioDialog), - ViewFactory = sp => new MathEquationStudioDialog() - }); - - ctx.RegisterDialog(new DialogDescriptor - { - Id = "frypdf.dialog.datastudio", - Title = "Data Studio", - ViewType = typeof(DataStudioDialog), - ViewFactory = sp => new DataStudioDialog() - }); - - ctx.RegisterDialog(new DialogDescriptor - { - Id = "frypdf.dialog.workflow", - Title = "PDF Workflow Builder", - ViewType = typeof(WorkflowBuilderDialog), - ViewFactory = sp => new WorkflowBuilderDialog() - }); - - ctx.RegisterDialog(new DialogDescriptor - { - Id = "frypdf.dialog.batch", - Title = "Batch Generation Studio", - ViewType = typeof(BatchGenerationDialog), - ViewFactory = sp => new BatchGenerationDialog() - }); - - ctx.RegisterDialog(new DialogDescriptor - { - Id = "frypdf.dialog.aiassistant", - Title = "AI Document Assistant", - ViewType = typeof(AiAssistantDialog), - ViewFactory = sp => new AiAssistantDialog() - }); - - return Task.CompletedTask; - } -} diff --git a/src/PdfEditorApp/Plugins/Bundles/DocumentIoBundle.cs b/src/PdfEditorApp/Plugins/Bundles/DocumentIoBundle.cs deleted file mode 100644 index c93f8d9..0000000 --- a/src/PdfEditorApp/Plugins/Bundles/DocumentIoBundle.cs +++ /dev/null @@ -1,95 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Extensions.DependencyInjection; -using PdfEditorApp.Core.Plugins; -using PdfEditorApp.Core.Plugins.Profiles; -using PdfEditorApp.Services; -using PdfEditorApp.Services.Export; -using PdfEditorApp.Services.Import; - -namespace PdfEditorApp.Plugins.Bundles; - -/// -/// Plugin bundle providing all built-in document importers and multi-format exporters. -/// -public class DocumentIoBundle : IFryPluginBundle -{ - public string Id => "FryPdf.Bundle.DocumentIo"; - public string Name => "Document I/O (Import & Export) Bundle"; - public string Description => "Comprehensive document import/export formats: PDF, Images (PNG/JPEG/WebP), Markdown, HTML5, Plain Text, and SVG."; - - public IReadOnlyList Plugins => new IFryPlugin[] - { - new PdfIoPlugin(), - new ImageIoPlugin(), - new TextIoPlugin(), - new WebVectorIoPlugin() - }; -} - -public class PdfIoPlugin : IFryPlugin -{ - public string Id => "frypdf.io.pdf"; - public string Name => "Standard PDF Engine I/O"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => Array.Empty(); - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - // Importer - ctx.RegisterImporter(new PdfDeconstructionImporter()); - - // Exporter - var exportService = ctx.GetService(); - ctx.RegisterExporter(new PdfDocumentExporter(exportService)); - - return Task.CompletedTask; - } -} - -public class ImageIoPlugin : IFryPlugin -{ - public string Id => "frypdf.io.images"; - public string Name => "Raster Image Document I/O"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => Array.Empty(); - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - ctx.RegisterImporter(new ImageDocumentImporter()); - return Task.CompletedTask; - } -} - -public class TextIoPlugin : IFryPlugin -{ - public string Id => "frypdf.io.text"; - public string Name => "Text & Markdown Document I/O"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => Array.Empty(); - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - ctx.RegisterImporter(new PlainTextDocumentImporter()); - ctx.RegisterExporter(new MarkdownDocumentExporter()); - ctx.RegisterExporter(new PlainTextDocumentExporter()); - return Task.CompletedTask; - } -} - -public class WebVectorIoPlugin : IFryPlugin -{ - public string Id => "frypdf.io.webvector"; - public string Name => "HTML5 & SVG Vector Document Exporter"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => Array.Empty(); - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - ctx.RegisterExporter(new HtmlDocumentExporter()); - ctx.RegisterExporter(new SvgVectorExporter()); - return Task.CompletedTask; - } -} diff --git a/src/PdfEditorApp/Plugins/Bundles/EditorSidebarsBundle.cs b/src/PdfEditorApp/Plugins/Bundles/EditorSidebarsBundle.cs deleted file mode 100644 index 2d16415..0000000 --- a/src/PdfEditorApp/Plugins/Bundles/EditorSidebarsBundle.cs +++ /dev/null @@ -1,89 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using PdfEditorApp.Core.Plugins; -using PdfEditorApp.Core.Plugins.Descriptors; -using PdfEditorApp.Core.Plugins.Profiles; - -namespace PdfEditorApp.Plugins.Bundles; - -/// -/// Plugin bundle providing left and right sidebar panels for the document editor workspace. -/// -public class EditorSidebarsBundle : IFryPluginBundle -{ - public string Id => "FryPdf.Bundle.EditorSidebars"; - public string Name => "Editor Sidebars Bundle"; - public string Description => "Pluggable sidebar panels for the document editor: Page Thumbnails, Bookmarks Outline, and Review Comments."; - - public IReadOnlyList Plugins => new IFryPlugin[] - { - new ThumbnailsSidebarPlugin(), - new OutlineSidebarPlugin(), - new CommentsSidebarPlugin() - }; -} - -public class ThumbnailsSidebarPlugin : IFryPlugin -{ - public string Id => "frypdf.sidebar.thumbnails"; - public string Name => "Page Thumbnails Sidebar"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => Array.Empty(); - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - ctx.RegisterSidebarTab(new SidebarTabDescriptor - { - Id = "Thumbnails", - Title = "Page Thumbnails", - IconKind = "FileDocumentMultipleOutline", - Tooltip = "Page Thumbnails & Reordering", - Order = 10 - }); - return Task.CompletedTask; - } -} - -public class OutlineSidebarPlugin : IFryPlugin -{ - public string Id => "frypdf.sidebar.outline"; - public string Name => "Bookmarks & Outline Sidebar"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => Array.Empty(); - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - ctx.RegisterSidebarTab(new SidebarTabDescriptor - { - Id = "Outline", - Title = "Outline & Bookmarks", - IconKind = "FormatListBulleted", - Tooltip = "Document Outline & Navigation Bookmarks", - Order = 20 - }); - return Task.CompletedTask; - } -} - -public class CommentsSidebarPlugin : IFryPlugin -{ - public string Id => "frypdf.sidebar.comments"; - public string Name => "Comments & Annotations Sidebar"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => Array.Empty(); - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - ctx.RegisterSidebarTab(new SidebarTabDescriptor - { - Id = "Comments", - Title = "Comments & Review", - IconKind = "CommentTextMultipleOutline", - Tooltip = "Review Annotations & Sticky Notes", - Order = 30 - }); - return Task.CompletedTask; - } -} diff --git a/src/PdfEditorApp/Plugins/Bundles/InspectorBundle.cs b/src/PdfEditorApp/Plugins/Bundles/InspectorBundle.cs deleted file mode 100644 index e2540f2..0000000 --- a/src/PdfEditorApp/Plugins/Bundles/InspectorBundle.cs +++ /dev/null @@ -1,227 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Plugins; -using PdfEditorApp.Core.Plugins.Descriptors; -using PdfEditorApp.Core.Plugins.Profiles; -using PdfEditorApp.ViewModels; -using PdfEditorApp.ViewModels.ElementViewModels; - -namespace PdfEditorApp.Plugins.Bundles; - -/// -/// Plugin bundle providing modular properties inspector sections. -/// -public class InspectorBundle : IFryPluginBundle -{ - public string Id => "FryPdf.Bundle.Inspector"; - public string Name => "Properties Inspector Bundle"; - public string Description => "Dynamic inspector property cards: Element Diagnostics, Table Grid Specifications, Chart Series, and Barcode Encoding Details."; - - public IReadOnlyList Plugins => new IFryPlugin[] - { - new GeometryInspectorPlugin(), - new AppearanceInspectorPlugin(), - new TypographyInspectorPlugin(), - new TableGridInspectorPlugin(), - new ChartVisualizationInspectorPlugin(), - new ElementDiagnosticsInspectorPlugin(), - new BarcodeDetailsInspectorPlugin() - }; -} - -public class GeometryInspectorPlugin : IFryPlugin -{ - public string Id => "frypdf.inspector.geometry"; - public string Name => "Geometry & Transform Inspector Card"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => Array.Empty(); - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - ctx.RegisterInspectorSection(new InspectorSectionDescriptor - { - SectionId = "frypdf.inspector.geometry", - Title = "Custom Geometry", - IconKind = "VectorRectangle", - Order = 10, - AppliesTo = target => false, - Factory = (sp, target) => "Geometry specification" - }); - - return Task.CompletedTask; - } -} - -public class AppearanceInspectorPlugin : IFryPlugin -{ - public string Id => "frypdf.inspector.appearance"; - public string Name => "Appearance & Styling Inspector Card"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => Array.Empty(); - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - ctx.RegisterInspectorSection(new InspectorSectionDescriptor - { - SectionId = "frypdf.inspector.appearance", - Title = "Custom Appearance", - IconKind = "PaletteOutline", - Order = 20, - AppliesTo = target => false, - Factory = (sp, target) => "Appearance specification" - }); - - return Task.CompletedTask; - } -} - -public class TypographyInspectorPlugin : IFryPlugin -{ - public string Id => "frypdf.inspector.typography"; - public string Name => "Typography & Font Inspector Card"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => Array.Empty(); - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - ctx.RegisterInspectorSection(new InspectorSectionDescriptor - { - SectionId = "frypdf.inspector.typography", - Title = "Custom Typography", - IconKind = "FormatFont", - Order = 30, - AppliesTo = target => false, - Factory = (sp, target) => "Typography specification" - }); - - return Task.CompletedTask; - } -} - -public class TableGridInspectorPlugin : IFryPlugin -{ - public string Id => "frypdf.inspector.table"; - public string Name => "Table Grid Inspector Card"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => Array.Empty(); - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - ctx.RegisterInspectorSection(new InspectorSectionDescriptor - { - SectionId = "frypdf.inspector.table", - Title = "Table Grid Properties", - IconKind = "TableLarge", - Order = 40, - AppliesTo = target => target is TableElementViewModel, - Factory = (sp, target) => - { - if (target is TableElementViewModel table) - { - return $"Columns: {table.Headers.Count} | Rows: {table.Rows.Count}\nGrid Border: {table.BorderColorHex}"; - } - return "Table specification"; - } - }); - - return Task.CompletedTask; - } -} - -public class ChartVisualizationInspectorPlugin : IFryPlugin -{ - public string Id => "frypdf.inspector.chart"; - public string Name => "Chart Series Inspector Card"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => Array.Empty(); - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - ctx.RegisterInspectorSection(new InspectorSectionDescriptor - { - SectionId = "frypdf.inspector.chart", - Title = "Chart Series & Visualization", - IconKind = "ChartLine", - Order = 50, - AppliesTo = target => target is ChartElementViewModel, - Factory = (sp, target) => - { - if (target is ChartElementViewModel chart) - { - return $"Chart Type: {chart.ChartTypeDescription}\nPalette: {chart.Palette}\nLegend: {chart.LegendPosition}"; - } - return "Chart specification"; - } - }); - - return Task.CompletedTask; - } -} - -public class ElementDiagnosticsInspectorPlugin : IFryPlugin -{ - public string Id => "frypdf.inspector.diagnostics"; - public string Name => "Element Diagnostics Inspector Card"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => Array.Empty(); - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - ctx.RegisterInspectorSection(new InspectorSectionDescriptor - { - SectionId = "frypdf.inspector.diagnostics", - Title = "Element Diagnostics", - IconKind = "InformationOutline", - Order = 90, - AppliesTo = target => target is ElementViewModelBase, - Factory = (sp, target) => - { - if (target is ElementViewModelBase el) - { - string elType = el.GetType().Name.Replace("ViewModel", ""); - return $"Type: {elType}\nLayer: Z-Index {el.ZIndex}\nBounds: {el.Width:F0} × {el.Height:F0} pt (X: {el.X:F0}, Y: {el.Y:F0})"; - } - return "No element selected"; - } - }); - - return Task.CompletedTask; - } -} - -public class BarcodeDetailsInspectorPlugin : IFryPlugin -{ - public string Id => "frypdf.inspector.barcode"; - public string Name => "Barcode Details Inspector Card"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => Array.Empty(); - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - ctx.RegisterInspectorSection(new InspectorSectionDescriptor - { - SectionId = "frypdf.inspector.barcode", - Title = "Barcode & Code Encoding", - IconKind = "Barcode", - Order = 45, - AppliesTo = target => target is BarcodeElementViewModel || target is QrCodeElementViewModel, - Factory = (sp, target) => - { - if (target is QrCodeElementViewModel qr) - { - return $"QR Code Payload:\n{qr.Content}"; - } - if (target is BarcodeElementViewModel bc) - { - return $"Barcode ({bc.BarcodeFormat}):\n{bc.CodeValue}"; - } - return "Encoding details"; - } - }); - - return Task.CompletedTask; - } -} diff --git a/src/PdfEditorApp/Plugins/Bundles/OcrEnginesBundle.cs b/src/PdfEditorApp/Plugins/Bundles/OcrEnginesBundle.cs deleted file mode 100644 index 0c41ab0..0000000 --- a/src/PdfEditorApp/Plugins/Bundles/OcrEnginesBundle.cs +++ /dev/null @@ -1,69 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using PdfEditorApp.Core.Plugins; -using PdfEditorApp.Core.Plugins.Profiles; -using PdfEditorApp.Services.Ocr; - -namespace PdfEditorApp.Plugins.Bundles; - -/// -/// Plugin bundle providing all built-in OCR engines (Apple Vision, Windows Media, Tesseract). -/// -public class OcrEnginesBundle : IFryPluginBundle -{ - public string Id => "FryPdf.Bundle.OcrEngines"; - public string Name => "OCR Engines Bundle"; - public string Description => "Hardware-accelerated optical character recognition: macOS Apple Vision, Windows Media OCR, and Tesseract neural network models."; - - public IReadOnlyList Plugins => new IFryPlugin[] - { - new AppleVisionOcrPlugin(), - new WindowsMediaOcrPlugin(), - new TesseractOcrPlugin() - }; -} - -public class AppleVisionOcrPlugin : IFryPlugin -{ - public string Id => "frypdf.ocr.applevision"; - public string Name => "Apple Vision Framework OCR (macOS)"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => Array.Empty(); - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - ctx.RegisterOcrEngine(new AppleVisionOcrEngine()); - return Task.CompletedTask; - } -} - -public class WindowsMediaOcrPlugin : IFryPlugin -{ - public string Id => "frypdf.ocr.windowsmedia"; - public string Name => "Windows Media OCR Engine (Windows)"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => Array.Empty(); - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - ctx.RegisterOcrEngine(new WindowsMediaOcrEngine()); - return Task.CompletedTask; - } -} - -public class TesseractOcrPlugin : IFryPlugin -{ - public string Id => "frypdf.ocr.tesseract"; - public string Name => "Tesseract Neural Network OCR"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => Array.Empty(); - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - var modelService = ctx.TryGetService(out var ms) ? ms : new TesseractModelService(); - ctx.RegisterOcrEngine(new TesseractOcrEngine(modelService)); - return Task.CompletedTask; - } -} diff --git a/src/PdfEditorApp/Plugins/Bundles/ShellOverlaysBundle.cs b/src/PdfEditorApp/Plugins/Bundles/ShellOverlaysBundle.cs deleted file mode 100644 index fc27250..0000000 --- a/src/PdfEditorApp/Plugins/Bundles/ShellOverlaysBundle.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; -using System.Collections.Generic; -using PdfEditorApp.Core.Plugins; -using PdfEditorApp.Core.Plugins.Profiles; - -namespace PdfEditorApp.Plugins.Bundles; - -/// -/// Plugin bundle providing non-modal, interactive floating shell overlays. -/// Dynamic third-party and arcade overlays are installed on-demand from the FryPDF Marketplace. -/// -public class ShellOverlaysBundle : IFryPluginBundle -{ - public string Id => "FryPdf.Bundle.ShellOverlays"; - public string Name => "Shell Overlays & Arcade Bundle"; - public string Description => "Slot provider for non-modal floating widgets and dynamic overlays rendered into the 'shell.overlay' slot."; - - public IReadOnlyList Plugins => Array.Empty(); -} diff --git a/src/PdfEditorApp/Plugins/Bundles/StandardTemplatesBundle.cs b/src/PdfEditorApp/Plugins/Bundles/StandardTemplatesBundle.cs deleted file mode 100644 index 35eb7cd..0000000 --- a/src/PdfEditorApp/Plugins/Bundles/StandardTemplatesBundle.cs +++ /dev/null @@ -1,171 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using PdfEditorApp.Core.Plugins; -using PdfEditorApp.Core.Plugins.Profiles; -using PdfEditorApp.Templates.Academic; -using PdfEditorApp.Templates.Career; -using PdfEditorApp.Templates.Certificates; -using PdfEditorApp.Templates.Corporate; -using PdfEditorApp.Templates.Education; -using PdfEditorApp.Templates.Events; -using PdfEditorApp.Templates.Finance; -using PdfEditorApp.Templates.General; -using PdfEditorApp.Templates.Technical; - -namespace PdfEditorApp.Plugins.Bundles; - -/// -/// Plugin bundle providing all 28 executive document templates across 8 professional domains. -/// -public class StandardTemplatesBundle : IFryPluginBundle -{ - public string Id => "FryPdf.Bundle.Templates"; - public string Name => "Executive Templates Bundle"; - public string Description => "28 executive templates: Corporate Annual Reports, Payslips, Invoices, CVs, Academic Papers, Certificates, STEM Worksheets, and Invitations."; - - public IReadOnlyList Plugins => new IFryPlugin[] - { - new CorporateTemplatesPlugin(), - new FinanceTemplatesPlugin(), - new CareerTemplatesPlugin(), - new AcademicTemplatesPlugin(), - new CertificateTemplatesPlugin(), - new EducationTemplatesPlugin(), - new PublishingTemplatesPlugin(), - new TechnicalTemplatesPlugin() - }; -} - -public class CorporateTemplatesPlugin : IFryPlugin -{ - public string Id => "frypdf.templates.corporate"; - public string Name => "Corporate Templates Pack"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => Array.Empty(); - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - ctx.RegisterTemplate(new AnnualReportTemplate()); - ctx.RegisterTemplate(new InteractiveExecutiveBriefTemplate()); - ctx.RegisterTemplate(new EmployeePayslipTemplate()); - ctx.RegisterTemplate(new OcrAnalysisReportTemplate()); - return Task.CompletedTask; - } -} - -public class FinanceTemplatesPlugin : IFryPlugin -{ - public string Id => "frypdf.templates.finance"; - public string Name => "Finance & Billing Templates Pack"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => Array.Empty(); - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - ctx.RegisterTemplate(new InvoiceTemplate()); - ctx.RegisterTemplate(new FinanceResearchPaperTemplate()); - return Task.CompletedTask; - } -} - -public class CareerTemplatesPlugin : IFryPlugin -{ - public string Id => "frypdf.templates.career"; - public string Name => "Career & Resume Templates Pack"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => Array.Empty(); - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - ctx.RegisterTemplate(new ResumeTemplate()); - ctx.RegisterTemplate(new ResumeModernCleanTemplate()); - ctx.RegisterTemplate(new ResumeCreativeMinimalistTemplate()); - ctx.RegisterTemplate(new ResumeAcademicCvTemplate()); - return Task.CompletedTask; - } -} - -public class AcademicTemplatesPlugin : IFryPlugin -{ - public string Id => "frypdf.templates.academic"; - public string Name => "Academic Research Templates Pack"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => Array.Empty(); - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - ctx.RegisterTemplate(new AcademicPaperTemplate()); - ctx.RegisterTemplate(new MathResearchPaperTemplate()); - ctx.RegisterTemplate(new PhysicsResearchPaperTemplate()); - ctx.RegisterTemplate(new HistoryResearchPaperTemplate()); - return Task.CompletedTask; - } -} - -public class CertificateTemplatesPlugin : IFryPlugin -{ - public string Id => "frypdf.templates.certificates"; - public string Name => "Certificates & Diplomas Templates Pack"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => Array.Empty(); - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - ctx.RegisterTemplate(new CertificateTemplate()); - ctx.RegisterTemplate(new CertificateNavyGoldTemplate()); - ctx.RegisterTemplate(new DiplomaAcademicTemplate()); - return Task.CompletedTask; - } -} - -public class EducationTemplatesPlugin : IFryPlugin -{ - public string Id => "frypdf.templates.education"; - public string Name => "STEM & Education Worksheets Templates Pack"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => Array.Empty(); - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - ctx.RegisterTemplate(new MathBODMASWorksheetTemplate()); - ctx.RegisterTemplate(new FactorizationWorksheetTemplate()); - ctx.RegisterTemplate(new BilingualExamPaperTemplate()); - ctx.RegisterTemplate(new StatesOfMatterDiagramNotesTemplate()); - ctx.RegisterTemplate(new QuadrilateralsGuideTemplate()); - return Task.CompletedTask; - } -} - -public class PublishingTemplatesPlugin : IFryPlugin -{ - public string Id => "frypdf.templates.publishing"; - public string Name => "Invitations & Publishing Templates Pack"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => Array.Empty(); - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - ctx.RegisterTemplate(new WeddingInvitationTraditionalTemplate()); - ctx.RegisterTemplate(new WeddingInvitationRoyalFloralTemplate()); - ctx.RegisterTemplate(new GalaInvitationTemplate()); - ctx.RegisterTemplate(new CreativeTypographyShowcaseTemplate()); - ctx.RegisterTemplate(new RichTextPublishingShowcaseTemplate()); - return Task.CompletedTask; - } -} - -public class TechnicalTemplatesPlugin : IFryPlugin -{ - public string Id => "frypdf.templates.technical"; - public string Name => "Technical Documentation Templates Pack"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => Array.Empty(); - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - ctx.RegisterTemplate(new ArduinoCheatSheetTemplate()); - return Task.CompletedTask; - } -} diff --git a/src/PdfEditorApp/Plugins/Bundles/StatusBarBundle.cs b/src/PdfEditorApp/Plugins/Bundles/StatusBarBundle.cs deleted file mode 100644 index 348ce31..0000000 --- a/src/PdfEditorApp/Plugins/Bundles/StatusBarBundle.cs +++ /dev/null @@ -1,113 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using PdfEditorApp.Core.Plugins; -using PdfEditorApp.Core.Plugins.Descriptors; -using PdfEditorApp.Core.Plugins.Profiles; - -namespace PdfEditorApp.Plugins.Bundles; - -/// -/// Plugin bundle providing status bar widgets across the footer of the desktop window. -/// -public class StatusBarBundle : IFryPluginBundle -{ - public string Id => "FryPdf.Bundle.StatusBar"; - public string Name => "Status Bar Widgets Bundle"; - public string Description => "Status bar footer indicators: document page statistics, system operational status, and graphics engine memory monitor."; - - public IReadOnlyList Plugins => new IFryPlugin[] - { - new PageStatsWidgetPlugin(), - new SystemStatusWidgetPlugin(), - new MemoryMonitorWidgetPlugin() - }; -} - -public class PageStatsWidgetPlugin : IFryPlugin -{ - public string Id => "frypdf.status.pagestats"; - public string Name => "Document Page Stats Widget"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => Array.Empty(); - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - ctx.RegisterStatusBarWidget(new StatusBarWidgetDescriptor - { - WidgetId = "frypdf.status.pagestats", - Alignment = StatusBarAlignment.Left, - Order = 10, - ToolTip = "Current Page Statistics", - Factory = sp => new ViewModels.StatusBarWidgetViewModel - { - WidgetId = "frypdf.status.pagestats", - Label = "Pages", - IconKind = "FileDocumentOutline", - ToolTip = "Active Document Page Statistics", - IsActive = true - } - }); - - return Task.CompletedTask; - } -} - -public class SystemStatusWidgetPlugin : IFryPlugin -{ - public string Id => "frypdf.status.ready"; - public string Name => "System Operational Status Widget"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => Array.Empty(); - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - ctx.RegisterStatusBarWidget(new StatusBarWidgetDescriptor - { - WidgetId = "frypdf.status.ready", - Alignment = StatusBarAlignment.Left, - Order = 20, - ToolTip = "System Operational & Idle", - Factory = sp => new ViewModels.StatusBarWidgetViewModel - { - WidgetId = "frypdf.status.ready", - Label = "Ready", - IconKind = "CheckCircleOutline", - ToolTip = "System Operational & Idle", - IsActive = true - } - }); - - return Task.CompletedTask; - } -} - -public class MemoryMonitorWidgetPlugin : IFryPlugin -{ - public string Id => "frypdf.status.memory"; - public string Name => "Skia Engine Memory Widget"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => Array.Empty(); - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - ctx.RegisterStatusBarWidget(new StatusBarWidgetDescriptor - { - WidgetId = "frypdf.status.memory", - Alignment = StatusBarAlignment.Right, - Order = 90, - ToolTip = "SkiaSharp 64-Bit Graphics Engine", - Factory = sp => new ViewModels.StatusBarWidgetViewModel - { - WidgetId = "frypdf.status.memory", - Label = "Skia 64-bit", - IconKind = "Memory", - ToolTip = "SkiaSharp 64-Bit Graphics Engine", - IsActive = true - } - }); - - return Task.CompletedTask; - } -} diff --git a/src/PdfEditorApp/Plugins/Bundles/ToolsConversionBundle.cs b/src/PdfEditorApp/Plugins/Bundles/ToolsConversionBundle.cs deleted file mode 100644 index 6ba9fdb..0000000 --- a/src/PdfEditorApp/Plugins/Bundles/ToolsConversionBundle.cs +++ /dev/null @@ -1,285 +0,0 @@ -using System; -using System.Collections.Generic; -using Microsoft.Extensions.DependencyInjection; -using PdfEditorApp.Core.Plugins; -using PdfEditorApp.Core.Plugins.Descriptors; -using PdfEditorApp.Core.Plugins.Profiles; -using PdfEditorApp.Models; -using PdfEditorApp.ViewModels.Tools.Conversion; - -namespace PdfEditorApp.Plugins.Bundles; - -public class ToolsConversionBundle : IFryPluginBundle -{ - public string Id => "FryPdf.Bundle.Tools.Conversion"; - public string Name => "PDF Conversion Tools Bundle"; - public string Description => "Bi-directional conversions between PDF and Office (Word, Excel, PowerPoint), Images, HTML, Markdown, and PDF/A."; - - public IReadOnlyList Plugins => new IFryPlugin[] - { - new PdfToWordToolPlugin(), - new WordToPdfToolPlugin(), - new PdfToPowerPointToolPlugin(), - new PowerPointToPdfToolPlugin(), - new PdfToExcelToolPlugin(), - new ExcelToPdfToolPlugin(), - new PdfToJpgToolPlugin(), - new JpgToPdfToolPlugin(), - new HtmlToPdfToolPlugin(), - new PdfToMarkdownToolPlugin(), - new PdfToPdfAToolPlugin(), - new ScanToPdfToolPlugin() - }; -} - -public class PdfToWordToolPlugin : ToolPluginBase -{ - public override string Id => "frypdf.tool.pdftoword"; - public override string Name => "PDF to Word"; - - protected override PdfToolDescriptor CreateDescriptor() => new() - { - Id = Id, - LegacyId = (int)PdfToolId.PdfToWord, - Name = Name, - Description = "Easily convert your PDF files into easy to edit DOC and DOCX documents.", - Category = "ConvertFromPdf", - IconKind = "FileWordOutline", - IconColorHex = "#2563EB", - BackgroundAccentHex = "#EFF6FF", - SupportsMultiFile = true, - AcceptedFileExtensions = ".pdf", - CreateViewModel = sp => ActivatorUtilities.CreateInstance(sp) - }; -} - -public class WordToPdfToolPlugin : ToolPluginBase -{ - public override string Id => "frypdf.tool.wordtopdf"; - public override string Name => "Word to PDF"; - - protected override PdfToolDescriptor CreateDescriptor() => new() - { - Id = Id, - LegacyId = (int)PdfToolId.WordToPdf, - Name = Name, - Description = "Make DOC and DOCX files easy to read by converting them to PDF.", - Category = "ConvertToPdf", - IconKind = "FileWordOutline", - IconColorHex = "#2563EB", - BackgroundAccentHex = "#EFF6FF", - SupportsMultiFile = true, - AcceptedFileExtensions = ".doc,.docx", - CreateViewModel = sp => ActivatorUtilities.CreateInstance(sp) - }; -} - -public class PdfToPowerPointToolPlugin : ToolPluginBase -{ - public override string Id => "frypdf.tool.pdftopowerpoint"; - public override string Name => "PDF to PowerPoint"; - - protected override PdfToolDescriptor CreateDescriptor() => new() - { - Id = Id, - LegacyId = (int)PdfToolId.PdfToPowerPoint, - Name = Name, - Description = "Turn your PDF files into easy to edit PPT and PPTX slideshows.", - Category = "ConvertFromPdf", - IconKind = "FilePowerpointOutline", - IconColorHex = "#EA580C", - BackgroundAccentHex = "#FFF7ED", - SupportsMultiFile = true, - AcceptedFileExtensions = ".pdf", - CreateViewModel = sp => ActivatorUtilities.CreateInstance(sp) - }; -} - -public class PowerPointToPdfToolPlugin : ToolPluginBase -{ - public override string Id => "frypdf.tool.powerpointtopdf"; - public override string Name => "PowerPoint to PDF"; - - protected override PdfToolDescriptor CreateDescriptor() => new() - { - Id = Id, - LegacyId = (int)PdfToolId.PowerPointToPdf, - Name = Name, - Description = "Make PPT and PPTX slideshows easy to view by converting them to PDF.", - Category = "ConvertToPdf", - IconKind = "FilePowerpointOutline", - IconColorHex = "#EA580C", - BackgroundAccentHex = "#FFF7ED", - SupportsMultiFile = true, - AcceptedFileExtensions = ".ppt,.pptx", - CreateViewModel = sp => ActivatorUtilities.CreateInstance(sp) - }; -} - -public class PdfToExcelToolPlugin : ToolPluginBase -{ - public override string Id => "frypdf.tool.pdftoexcel"; - public override string Name => "PDF to Excel"; - - protected override PdfToolDescriptor CreateDescriptor() => new() - { - Id = Id, - LegacyId = (int)PdfToolId.PdfToExcel, - Name = Name, - Description = "Pull data straight from PDFs into Excel spreadsheets in a few short seconds.", - Category = "ConvertFromPdf", - IconKind = "FileExcelOutline", - IconColorHex = "#16A34A", - BackgroundAccentHex = "#F0FDF4", - SupportsMultiFile = true, - AcceptedFileExtensions = ".pdf", - CreateViewModel = sp => ActivatorUtilities.CreateInstance(sp) - }; -} - -public class ExcelToPdfToolPlugin : ToolPluginBase -{ - public override string Id => "frypdf.tool.exceltopdf"; - public override string Name => "Excel to PDF"; - - protected override PdfToolDescriptor CreateDescriptor() => new() - { - Id = Id, - LegacyId = (int)PdfToolId.ExcelToPdf, - Name = Name, - Description = "Make EXCEL spreadsheets easy to read by converting them to PDF.", - Category = "ConvertToPdf", - IconKind = "FileExcelOutline", - IconColorHex = "#16A34A", - BackgroundAccentHex = "#F0FDF4", - SupportsMultiFile = true, - AcceptedFileExtensions = ".xls,.xlsx", - CreateViewModel = sp => ActivatorUtilities.CreateInstance(sp) - }; -} - -public class PdfToJpgToolPlugin : ToolPluginBase -{ - public override string Id => "frypdf.tool.pdftojpg"; - public override string Name => "PDF to JPG"; - - protected override PdfToolDescriptor CreateDescriptor() => new() - { - Id = Id, - LegacyId = (int)PdfToolId.PdfToJpg, - Name = Name, - Description = "Convert each PDF page into a JPG or extract all images contained in a PDF.", - Category = "ConvertFromPdf", - IconKind = "FileImageOutline", - IconColorHex = "#D97706", - BackgroundAccentHex = "#FFFBEB", - SupportsMultiFile = true, - AcceptedFileExtensions = ".pdf", - CreateViewModel = sp => ActivatorUtilities.CreateInstance(sp) - }; -} - -public class JpgToPdfToolPlugin : ToolPluginBase -{ - public override string Id => "frypdf.tool.jpgtopdf"; - public override string Name => "JPG to PDF"; - - protected override PdfToolDescriptor CreateDescriptor() => new() - { - Id = Id, - LegacyId = (int)PdfToolId.JpgToPdf, - Name = Name, - Description = "Convert JPG, PNG, BMP, GIF and TIFF images to PDF in seconds with custom orientation and margins.", - Category = "ConvertToPdf", - IconKind = "FileImageOutline", - IconColorHex = "#D97706", - BackgroundAccentHex = "#FFFBEB", - SupportsMultiFile = true, - AcceptedFileExtensions = ".jpg,.jpeg,.png,.bmp,.gif,.webp", - CreateViewModel = sp => ActivatorUtilities.CreateInstance(sp) - }; -} - -public class HtmlToPdfToolPlugin : ToolPluginBase -{ - public override string Id => "frypdf.tool.htmltopdf"; - public override string Name => "HTML to PDF"; - - protected override PdfToolDescriptor CreateDescriptor() => new() - { - Id = Id, - LegacyId = (int)PdfToolId.HtmlToPdf, - Name = Name, - Description = "Convert webpages or raw HTML files in seconds. Copy and paste the URL or drop local HTML files.", - Category = "ConvertToPdf", - IconKind = "LanguageHtml5", - IconColorHex = "#E11D48", - BackgroundAccentHex = "#FFF1F2", - SupportsMultiFile = false, - AcceptedFileExtensions = ".html,.htm", - CreateViewModel = sp => ActivatorUtilities.CreateInstance(sp) - }; -} - -public class PdfToMarkdownToolPlugin : ToolPluginBase -{ - public override string Id => "frypdf.tool.pdftomarkdown"; - public override string Name => "PDF to Markdown"; - - protected override PdfToolDescriptor CreateDescriptor() => new() - { - Id = Id, - LegacyId = (int)PdfToolId.PdfToMarkdown, - Name = Name, - Description = "Extract clean, readable Markdown content and structured tables from your PDF documents.", - Category = "ConvertFromPdf", - IconKind = "LanguageMarkdownOutline", - IconColorHex = "#0284C7", - BackgroundAccentHex = "#F0F9FF", - SupportsMultiFile = true, - AcceptedFileExtensions = ".pdf", - CreateViewModel = sp => ActivatorUtilities.CreateInstance(sp) - }; -} - -public class PdfToPdfAToolPlugin : ToolPluginBase -{ - public override string Id => "frypdf.tool.pdftopdfa"; - public override string Name => "PDF to PDF/A"; - - protected override PdfToolDescriptor CreateDescriptor() => new() - { - Id = Id, - LegacyId = (int)PdfToolId.PdfToPdfA, - Name = Name, - Description = "Transform your PDF to PDF/A, the ISO-standardized version of PDF for long-term digital preservation.", - Category = "ConvertFromPdf", - IconKind = "ArchiveOutline", - IconColorHex = "#0D9488", - BackgroundAccentHex = "#F0FDFA", - SupportsMultiFile = true, - AcceptedFileExtensions = ".pdf", - CreateViewModel = sp => ActivatorUtilities.CreateInstance(sp) - }; -} - -public class ScanToPdfToolPlugin : ToolPluginBase -{ - public override string Id => "frypdf.tool.scantopdf"; - public override string Name => "Scan to PDF"; - - protected override PdfToolDescriptor CreateDescriptor() => new() - { - Id = Id, - LegacyId = (int)PdfToolId.ScanToPdf, - Name = Name, - Description = "Capture document photos or connect a scanner to convert physical paperwork directly into PDF.", - Category = "ConvertToPdf", - IconKind = "Scanner", - IconColorHex = "#4F46E5", - BackgroundAccentHex = "#EEF2FF", - SupportsMultiFile = false, - AcceptedFileExtensions = ".jpg,.jpeg,.png,.bmp,.tiff", - CreateViewModel = sp => ActivatorUtilities.CreateInstance(sp) - }; -} diff --git a/src/PdfEditorApp/Plugins/Bundles/ToolsIntelligenceBundle.cs b/src/PdfEditorApp/Plugins/Bundles/ToolsIntelligenceBundle.cs deleted file mode 100644 index 3163b5e..0000000 --- a/src/PdfEditorApp/Plugins/Bundles/ToolsIntelligenceBundle.cs +++ /dev/null @@ -1,153 +0,0 @@ -using System; -using System.Collections.Generic; -using Microsoft.Extensions.DependencyInjection; -using PdfEditorApp.Core.Plugins; -using PdfEditorApp.Core.Plugins.Descriptors; -using PdfEditorApp.Core.Plugins.Profiles; -using PdfEditorApp.Models; -using PdfEditorApp.ViewModels.Tools.Intelligence; - -namespace PdfEditorApp.Plugins.Bundles; - -public class ToolsIntelligenceBundle : IFryPluginBundle -{ - public string Id => "FryPdf.Bundle.Tools.Intelligence"; - public string Name => "PDF Intelligence & Editing Tools Bundle"; - public string Description => "AI summarization, machine translation, OCR text extraction, visual document diffing, and PDF form design."; - - public IReadOnlyList Plugins => new IFryPlugin[] - { - new AiSummarizerToolPlugin(), - new TranslatePdfToolPlugin(), - new OcrPdfToolPlugin(), - new ComparePdfToolPlugin(), - new EditPdfToolPlugin(), - new PdfFormsToolPlugin() - }; -} - -public class AiSummarizerToolPlugin : ToolPluginBase -{ - public override string Id => "frypdf.tool.aisummarizer"; - public override string Name => "AI Summarizer"; - - protected override PdfToolDescriptor CreateDescriptor() => new() - { - Id = Id, - LegacyId = (int)PdfToolId.AiSummarizer, - Name = Name, - Description = "Generate comprehensive, structured executive summaries and key takeaway bullet points using AI.", - Category = "AiAndAutomation", - IconKind = "Sparkles", - IconColorHex = "#7C3AED", - BackgroundAccentHex = "#F5F3FF", - SupportsMultiFile = false, - AcceptedFileExtensions = ".pdf", - CreateViewModel = sp => ActivatorUtilities.CreateInstance(sp) - }; -} - -public class TranslatePdfToolPlugin : ToolPluginBase -{ - public override string Id => "frypdf.tool.translate"; - public override string Name => "Translate PDF"; - - protected override PdfToolDescriptor CreateDescriptor() => new() - { - Id = Id, - LegacyId = (int)PdfToolId.TranslatePdf, - Name = Name, - Description = "Translate entire PDF documents into 50+ world languages while preserving visual layout and geometry.", - Category = "AiAndAutomation", - IconKind = "Translate", - IconColorHex = "#0284C7", - BackgroundAccentHex = "#F0F9FF", - SupportsMultiFile = false, - AcceptedFileExtensions = ".pdf", - CreateViewModel = sp => ActivatorUtilities.CreateInstance(sp) - }; -} - -public class OcrPdfToolPlugin : ToolPluginBase -{ - public override string Id => "frypdf.tool.ocr"; - public override string Name => "OCR PDF"; - - protected override PdfToolDescriptor CreateDescriptor() => new() - { - Id = Id, - LegacyId = (int)PdfToolId.OcrPdf, - Name = Name, - Description = "Convert scanned documents and image PDFs into fully searchable, selectable, and copyable text.", - Category = "AiAndAutomation", - IconKind = "TextRecognition", - IconColorHex = "#D97706", - BackgroundAccentHex = "#FFFBEB", - SupportsMultiFile = true, - AcceptedFileExtensions = ".pdf,.jpg,.jpeg,.png", - CreateViewModel = sp => ActivatorUtilities.CreateInstance(sp) - }; -} - -public class ComparePdfToolPlugin : ToolPluginBase -{ - public override string Id => "frypdf.tool.compare"; - public override string Name => "Compare PDF"; - - protected override PdfToolDescriptor CreateDescriptor() => new() - { - Id = Id, - LegacyId = (int)PdfToolId.ComparePdf, - Name = Name, - Description = "Show a side-by-side comparison of two PDF documents and easily spot differences, additions, and deletions.", - Category = "AiAndAutomation", - IconKind = "FileCompare", - IconColorHex = "#2563EB", - BackgroundAccentHex = "#EFF6FF", - SupportsMultiFile = false, - AcceptedFileExtensions = ".pdf", - CreateViewModel = sp => ActivatorUtilities.CreateInstance(sp) - }; -} - -public class EditPdfToolPlugin : ToolPluginBase -{ - public override string Id => "frypdf.tool.edit"; - public override string Name => "Edit PDF"; - - protected override PdfToolDescriptor CreateDescriptor() => new() - { - Id = Id, - LegacyId = (int)PdfToolId.EditPdf, - Name = Name, - Description = "Add text, images, shapes or freehand annotations to a PDF document. Edit the size, font, and color of added content.", - Category = "EditAndForms", - IconKind = "SquareEditOutline", - IconColorHex = "#7C3AED", - BackgroundAccentHex = "#F5F3FF", - SupportsMultiFile = false, - AcceptedFileExtensions = ".pdf", - CreateViewModel = sp => ActivatorUtilities.CreateInstance(sp) - }; -} - -public class PdfFormsToolPlugin : ToolPluginBase -{ - public override string Id => "frypdf.tool.forms"; - public override string Name => "PDF Forms"; - - protected override PdfToolDescriptor CreateDescriptor() => new() - { - Id = Id, - LegacyId = (int)PdfToolId.PdfForms, - Name = Name, - Description = "Design interactive AcroForms with text inputs, checkboxes, radio options, dropdowns, and digital signature boxes.", - Category = "EditAndForms", - IconKind = "FormSelect", - IconColorHex = "#059669", - BackgroundAccentHex = "#ECFDF5", - SupportsMultiFile = false, - AcceptedFileExtensions = ".pdf", - CreateViewModel = sp => ActivatorUtilities.CreateInstance(sp) - }; -} diff --git a/src/PdfEditorApp/Plugins/Bundles/ToolsOrganizeBundle.cs b/src/PdfEditorApp/Plugins/Bundles/ToolsOrganizeBundle.cs deleted file mode 100644 index f361297..0000000 --- a/src/PdfEditorApp/Plugins/Bundles/ToolsOrganizeBundle.cs +++ /dev/null @@ -1,153 +0,0 @@ -using System; -using System.Collections.Generic; -using Microsoft.Extensions.DependencyInjection; -using PdfEditorApp.Core.Plugins; -using PdfEditorApp.Core.Plugins.Descriptors; -using PdfEditorApp.Core.Plugins.Profiles; -using PdfEditorApp.Models; -using PdfEditorApp.ViewModels.Tools.Organize; - -namespace PdfEditorApp.Plugins.Bundles; - -public class ToolsOrganizeBundle : IFryPluginBundle -{ - public string Id => "FryPdf.Bundle.Tools.Organize"; - public string Name => "PDF Organize & Page Tools Bundle"; - public string Description => "Essential page manipulation and document organizing tools (Merge, Split, Rotate, Organize, Crop, Page Numbers)."; - - public IReadOnlyList Plugins => new IFryPlugin[] - { - new MergePdfToolPlugin(), - new SplitPdfToolPlugin(), - new RotatePdfToolPlugin(), - new OrganizePdfToolPlugin(), - new CropPdfToolPlugin(), - new PageNumbersToolPlugin() - }; -} - -public class MergePdfToolPlugin : ToolPluginBase -{ - public override string Id => "frypdf.tool.merge"; - public override string Name => "Merge PDF"; - - protected override PdfToolDescriptor CreateDescriptor() => new() - { - Id = Id, - LegacyId = (int)PdfToolId.MergePdf, - Name = Name, - Description = "Combine PDFs in the order you want with the easiest PDF merger available.", - Category = "OrganizeAndPage", - IconKind = "CallMerge", - IconColorHex = "#EA580C", - BackgroundAccentHex = "#FFF7ED", - SupportsMultiFile = true, - AcceptedFileExtensions = ".pdf", - CreateViewModel = sp => ActivatorUtilities.CreateInstance(sp) - }; -} - -public class SplitPdfToolPlugin : ToolPluginBase -{ - public override string Id => "frypdf.tool.split"; - public override string Name => "Split PDF"; - - protected override PdfToolDescriptor CreateDescriptor() => new() - { - Id = Id, - LegacyId = (int)PdfToolId.SplitPdf, - Name = Name, - Description = "Separate one page or a whole set for easy conversion into independent PDF files.", - Category = "OrganizeAndPage", - IconKind = "CallSplit", - IconColorHex = "#DC2626", - BackgroundAccentHex = "#FEF2F2", - SupportsMultiFile = false, - AcceptedFileExtensions = ".pdf", - CreateViewModel = sp => ActivatorUtilities.CreateInstance(sp) - }; -} - -public class RotatePdfToolPlugin : ToolPluginBase -{ - public override string Id => "frypdf.tool.rotate"; - public override string Name => "Rotate PDF"; - - protected override PdfToolDescriptor CreateDescriptor() => new() - { - Id = Id, - LegacyId = (int)PdfToolId.RotatePdf, - Name = Name, - Description = "Rotate your PDF pages however you'd like. You can even rotate multiple PDFs at once!", - Category = "OrganizeAndPage", - IconKind = "RotateRight", - IconColorHex = "#0284C7", - BackgroundAccentHex = "#F0F9FF", - SupportsMultiFile = true, - AcceptedFileExtensions = ".pdf", - CreateViewModel = sp => ActivatorUtilities.CreateInstance(sp) - }; -} - -public class OrganizePdfToolPlugin : ToolPluginBase -{ - public override string Id => "frypdf.tool.organize"; - public override string Name => "Organize PDF"; - - protected override PdfToolDescriptor CreateDescriptor() => new() - { - Id = Id, - LegacyId = (int)PdfToolId.OrganizePdf, - Name = Name, - Description = "Sort, add and delete PDF pages. Drag and drop the page thumbnails to reorganize them as you wish.", - Category = "OrganizeAndPage", - IconKind = "ViewGridOutline", - IconColorHex = "#7C3AED", - BackgroundAccentHex = "#F5F3FF", - SupportsMultiFile = false, - AcceptedFileExtensions = ".pdf", - CreateViewModel = sp => ActivatorUtilities.CreateInstance(sp) - }; -} - -public class CropPdfToolPlugin : ToolPluginBase -{ - public override string Id => "frypdf.tool.crop"; - public override string Name => "Crop PDF"; - - protected override PdfToolDescriptor CreateDescriptor() => new() - { - Id = Id, - LegacyId = (int)PdfToolId.CropPdf, - Name = Name, - Description = "Trim margins, remove unnecessary whitespace, and adjust canvas bounding boxes.", - Category = "OrganizeAndPage", - IconKind = "Crop", - IconColorHex = "#059669", - BackgroundAccentHex = "#ECFDF5", - SupportsMultiFile = false, - AcceptedFileExtensions = ".pdf", - CreateViewModel = sp => ActivatorUtilities.CreateInstance(sp) - }; -} - -public class PageNumbersToolPlugin : ToolPluginBase -{ - public override string Id => "frypdf.tool.pagenumbers"; - public override string Name => "Page Numbers"; - - protected override PdfToolDescriptor CreateDescriptor() => new() - { - Id = Id, - LegacyId = (int)PdfToolId.PageNumbers, - Name = Name, - Description = "Add page numbers into PDFs with ease. Choose position, dimensions, typography and formatting.", - Category = "OrganizeAndPage", - IconKind = "Numeric", - IconColorHex = "#D97706", - BackgroundAccentHex = "#FFFBEB", - SupportsMultiFile = true, - AcceptedFileExtensions = ".pdf", - CreateViewModel = sp => ActivatorUtilities.CreateInstance(sp) - }; -} diff --git a/src/PdfEditorApp/Plugins/Bundles/ToolsSecurityBundle.cs b/src/PdfEditorApp/Plugins/Bundles/ToolsSecurityBundle.cs deleted file mode 100644 index 8066bf5..0000000 --- a/src/PdfEditorApp/Plugins/Bundles/ToolsSecurityBundle.cs +++ /dev/null @@ -1,175 +0,0 @@ -using System; -using System.Collections.Generic; -using Microsoft.Extensions.DependencyInjection; -using PdfEditorApp.Core.Plugins; -using PdfEditorApp.Core.Plugins.Descriptors; -using PdfEditorApp.Core.Plugins.Profiles; -using PdfEditorApp.Models; -using PdfEditorApp.ViewModels.Tools.Security; - -namespace PdfEditorApp.Plugins.Bundles; - -public class ToolsSecurityBundle : IFryPluginBundle -{ - public string Id => "FryPdf.Bundle.Tools.Security"; - public string Name => "PDF Optimization & Security Tools Bundle"; - public string Description => "Document optimization, compression, encryption, digital signatures, redaction and watermarking."; - - public IReadOnlyList Plugins => new IFryPlugin[] - { - new CompressPdfToolPlugin(), - new RepairPdfToolPlugin(), - new ProtectPdfToolPlugin(), - new UnlockPdfToolPlugin(), - new SignPdfToolPlugin(), - new RedactPdfToolPlugin(), - new WatermarkToolPlugin() - }; -} - -public class CompressPdfToolPlugin : ToolPluginBase -{ - public override string Id => "frypdf.tool.compress"; - public override string Name => "Compress PDF"; - - protected override PdfToolDescriptor CreateDescriptor() => new() - { - Id = Id, - LegacyId = (int)PdfToolId.CompressPdf, - Name = Name, - Description = "Reduce file size while optimizing for maximal PDF quality.", - Category = "OptimizeAndSecurity", - IconKind = "ArrowCollapseAll", - IconColorHex = "#16A34A", - BackgroundAccentHex = "#F0FDF4", - SupportsMultiFile = true, - AcceptedFileExtensions = ".pdf", - CreateViewModel = sp => ActivatorUtilities.CreateInstance(sp) - }; -} - -public class RepairPdfToolPlugin : ToolPluginBase -{ - public override string Id => "frypdf.tool.repair"; - public override string Name => "Repair PDF"; - - protected override PdfToolDescriptor CreateDescriptor() => new() - { - Id = Id, - LegacyId = (int)PdfToolId.RepairPdf, - Name = Name, - Description = "Repair a damaged PDF and recover data from corrupt files. Fix PDF files with our Repair tool.", - Category = "OptimizeAndSecurity", - IconKind = "WrenchOutline", - IconColorHex = "#D97706", - BackgroundAccentHex = "#FFFBEB", - SupportsMultiFile = true, - AcceptedFileExtensions = ".pdf", - CreateViewModel = sp => ActivatorUtilities.CreateInstance(sp) - }; -} - -public class ProtectPdfToolPlugin : ToolPluginBase -{ - public override string Id => "frypdf.tool.protect"; - public override string Name => "Protect PDF"; - - protected override PdfToolDescriptor CreateDescriptor() => new() - { - Id = Id, - LegacyId = (int)PdfToolId.ProtectPdf, - Name = Name, - Description = "Encrypt and password protect your PDF files. Prevent unauthorized access to sensitive information.", - Category = "OptimizeAndSecurity", - IconKind = "LockOutline", - IconColorHex = "#DC2626", - BackgroundAccentHex = "#FEF2F2", - SupportsMultiFile = true, - AcceptedFileExtensions = ".pdf", - CreateViewModel = sp => ActivatorUtilities.CreateInstance(sp) - }; -} - -public class UnlockPdfToolPlugin : ToolPluginBase -{ - public override string Id => "frypdf.tool.unlock"; - public override string Name => "Unlock PDF"; - - protected override PdfToolDescriptor CreateDescriptor() => new() - { - Id = Id, - LegacyId = (int)PdfToolId.UnlockPdf, - Name = Name, - Description = "Remove PDF password security, giving you the freedom to use your PDFs as you want.", - Category = "OptimizeAndSecurity", - IconKind = "LockOpenOutline", - IconColorHex = "#16A34A", - BackgroundAccentHex = "#F0FDF4", - SupportsMultiFile = true, - AcceptedFileExtensions = ".pdf", - CreateViewModel = sp => ActivatorUtilities.CreateInstance(sp) - }; -} - -public class SignPdfToolPlugin : ToolPluginBase -{ - public override string Id => "frypdf.tool.sign"; - public override string Name => "Sign PDF"; - - protected override PdfToolDescriptor CreateDescriptor() => new() - { - Id = Id, - LegacyId = (int)PdfToolId.SignPdf, - Name = Name, - Description = "Sign yourself or request electronic signatures from others. Draw, type, or upload an image of your signature.", - Category = "OptimizeAndSecurity", - IconKind = "Draw", - IconColorHex = "#0284C7", - BackgroundAccentHex = "#F0F9FF", - SupportsMultiFile = false, - AcceptedFileExtensions = ".pdf", - CreateViewModel = sp => ActivatorUtilities.CreateInstance(sp) - }; -} - -public class RedactPdfToolPlugin : ToolPluginBase -{ - public override string Id => "frypdf.tool.redact"; - public override string Name => "Redact PDF"; - - protected override PdfToolDescriptor CreateDescriptor() => new() - { - Id = Id, - LegacyId = (int)PdfToolId.RedactPdf, - Name = Name, - Description = "Permanently remove sensitive text, numbers, and images from your PDF documents for compliance.", - Category = "OptimizeAndSecurity", - IconKind = "FormatColorFill", - IconColorHex = "#475569", - BackgroundAccentHex = "#F8FAFC", - SupportsMultiFile = false, - AcceptedFileExtensions = ".pdf", - CreateViewModel = sp => ActivatorUtilities.CreateInstance(sp) - }; -} - -public class WatermarkToolPlugin : ToolPluginBase -{ - public override string Id => "frypdf.tool.watermark"; - public override string Name => "Watermark PDF"; - - protected override PdfToolDescriptor CreateDescriptor() => new() - { - Id = Id, - LegacyId = (int)PdfToolId.Watermark, - Name = Name, - Description = "Stamp an image or text over your PDF in seconds. Choose typography, transparency and position.", - Category = "OptimizeAndSecurity", - IconKind = "Watermark", - IconColorHex = "#0D9488", - BackgroundAccentHex = "#F0FDFA", - SupportsMultiFile = true, - AcceptedFileExtensions = ".pdf", - CreateViewModel = sp => ActivatorUtilities.CreateInstance(sp) - }; -} diff --git a/src/PdfEditorApp/Plugins/Bundles/WorkspacePagesBundle.cs b/src/PdfEditorApp/Plugins/Bundles/WorkspacePagesBundle.cs deleted file mode 100644 index 355d540..0000000 --- a/src/PdfEditorApp/Plugins/Bundles/WorkspacePagesBundle.cs +++ /dev/null @@ -1,404 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using PdfEditorApp.Core.Plugins; -using PdfEditorApp.Core.Plugins.Descriptors; -using PdfEditorApp.Core.Plugins.Profiles; -using PdfEditorApp.ViewModels; -using PdfEditorApp.Views; - -namespace PdfEditorApp.Plugins.Bundles; - -/// -/// Plugin bundle providing all workspace pages and sidebar navigation sections. -/// -public class WorkspacePagesBundle : IFryPluginBundle -{ - public string Id => "FryPdf.Bundle.WorkspacePages"; - public string Name => "Workspace Pages & Navigation Bundle"; - public string Description => "Modular workspace pages for the studio: Dashboard, PDF Reader, Templates Gallery, Tools Studios, OCR Models, Fonts, and Preferences."; - - public IReadOnlyList Plugins => new IFryPlugin[] - { - new HomeDashboardPagePlugin(), - new PdfReaderLandingPagePlugin(), - new NewDocumentPagePlugin(), - new PdfToolsStudioPagePlugin(), - new ToolCategoryPagesPlugin(), - new StarredToolsPagePlugin(), - new FontManagerPagePlugin(), - new TesseractPagePlugin(), - new TrashCachePagePlugin(), - new HelpGuidePagePlugin(), - new LicensingPagePlugin(), - new PluginsPagePlugin(), - new SettingsPagePlugin() - }; -} - -public class HomeDashboardPagePlugin : IFryPlugin -{ - public string Id => "frypdf.page.dashboard"; - public string Name => "Overview Dashboard Page"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => Array.Empty(); - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - ctx.RegisterNavigationItem(new NavigationItemDescriptor - { - Id = "Home", - Title = "Home", - Group = "Overview", - IconKind = "HomeOutline", - Order = 10, - ViewFactory = null // Built-in view mounted in HomeView.axaml for 0ms instantaneous navigation - }); - return Task.CompletedTask; - } -} - -public class PdfReaderLandingPagePlugin : IFryPlugin -{ - public string Id => "frypdf.page.reader"; - public string Name => "PDF Reader Landing Page"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => Array.Empty(); - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - ctx.RegisterNavigationItem(new NavigationItemDescriptor - { - Id = "PdfReader", - Title = "PDF Reader", - Group = "Overview", - IconKind = "BookOpenPageVariantOutline", - BadgeText = "Read", - BadgeColorHex = "#DC2626", - Order = 20, - ViewFactory = null // Built-in view mounted in HomeView.axaml for 0ms instantaneous navigation - }); - return Task.CompletedTask; - } -} - -public class NewDocumentPagePlugin : IFryPlugin -{ - public string Id => "frypdf.page.newdocument"; - public string Name => "New Document & Template Gallery Page"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => Array.Empty(); - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - ctx.RegisterNavigationItem(new NavigationItemDescriptor - { - Id = "NewDocument", - Title = "New Document", - Group = "Overview", - IconKind = "FileDocumentPlusOutline", - BadgeText = "19", - BadgeColorHex = "#059669", - Order = 30, - ViewFactory = null // Built-in view mounted in HomeView.axaml for 0ms instantaneous navigation - }); - return Task.CompletedTask; - } -} - -public class PdfToolsStudioPagePlugin : IFryPlugin -{ - public string Id => "frypdf.page.tools"; - public string Name => "PDF Tools Studio Page"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => Array.Empty(); - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - ctx.RegisterNavigationItem(new NavigationItemDescriptor - { - Id = "AllTools", - Title = "All Tools", - Group = "Overview", - IconKind = "ViewGridOutline", - BadgeText = "32", - BadgeColorHex = "#4F46E5", - Order = 40, - ViewFactory = null // Built-in view mounted in HomeView.axaml for 0ms instantaneous navigation - }); - return Task.CompletedTask; - } -} - -public class ToolCategoryPagesPlugin : IFryPlugin -{ - public string Id => "frypdf.page.toolcategories"; - public string Name => "Tool Categories Pages"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => Array.Empty(); - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - ctx.RegisterNavigationItem(new NavigationItemDescriptor - { - Id = "OrganizeAndPage", - Title = "Organize & Page", - Group = "Categories", - IconKind = "BookOpenPageVariantOutline", - BadgeText = "6", - Order = 50, - ViewFactory = null - }); - - ctx.RegisterNavigationItem(new NavigationItemDescriptor - { - Id = "OptimizeAndSecurity", - Title = "Security & Optimize", - Group = "Categories", - IconKind = "ShieldLockOutline", - BadgeText = "7", - Order = 60, - ViewFactory = null - }); - - ctx.RegisterNavigationItem(new NavigationItemDescriptor - { - Id = "ConvertFromPdf", - Title = "Convert from PDF", - Group = "Categories", - IconKind = "ExportVariant", - BadgeText = "5", - Order = 70, - ViewFactory = null - }); - - ctx.RegisterNavigationItem(new NavigationItemDescriptor - { - Id = "ConvertToPdf", - Title = "Convert to PDF", - Group = "Categories", - IconKind = "Import", - BadgeText = "6", - Order = 80, - ViewFactory = null - }); - - ctx.RegisterNavigationItem(new NavigationItemDescriptor - { - Id = "EditAndForms", - Title = "Edit & Forms", - Group = "Categories", - IconKind = "Draw", - BadgeText = "4", - Order = 90, - ViewFactory = null - }); - - ctx.RegisterNavigationItem(new NavigationItemDescriptor - { - Id = "AiAndAutomation", - Title = "AI & Automation", - Group = "Categories", - IconKind = "AutoFix", - BadgeText = "4", - Order = 100, - ViewFactory = null - }); - - return Task.CompletedTask; - } -} - -public class StarredToolsPagePlugin : IFryPlugin -{ - public string Id => "frypdf.page.starred"; - public string Name => "Starred Tools Page"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => Array.Empty(); - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - ctx.RegisterNavigationItem(new NavigationItemDescriptor - { - Id = "Starred", - Title = "Starred Tools", - Group = "Library", - IconKind = "StarOutline", - Order = 110, - ViewFactory = null - }); - return Task.CompletedTask; - } -} - -public class FontManagerPagePlugin : IFryPlugin -{ - public string Id => "frypdf.page.fonts"; - public string Name => "Language & Fonts Studio Page"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => Array.Empty(); - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - ctx.RegisterNavigationItem(new NavigationItemDescriptor - { - Id = "FontPackages", - Title = "Language & Fonts", - Group = "Library", - IconKind = "Translate", - BadgeText = "10", - BadgeColorHex = "#0284C7", - Order = 120, - ViewFactory = null - }); - return Task.CompletedTask; - } -} - -public class TesseractPagePlugin : IFryPlugin -{ - public string Id => "frypdf.page.tesseract"; - public string Name => "OCR Models Manager Page"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => Array.Empty(); - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - ctx.RegisterNavigationItem(new NavigationItemDescriptor - { - Id = "TesseractData", - Title = "OCR Models", - Group = "Library", - IconKind = "TextRecognition", - Order = 130, - ViewFactory = null - }); - return Task.CompletedTask; - } -} - -public class TrashCachePagePlugin : IFryPlugin -{ - public string Id => "frypdf.page.trash"; - public string Name => "Trash & Cache Cleaner Page"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => Array.Empty(); - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - ctx.RegisterNavigationItem(new NavigationItemDescriptor - { - Id = "Trash", - Title = "Trash & Cache", - Group = "Library", - IconKind = "TrashCanOutline", - Order = 140, - ViewFactory = null - }); - return Task.CompletedTask; - } -} - -public class HelpGuidePagePlugin : IFryPlugin -{ - public string Id => "frypdf.page.help"; - public string Name => "Help & Guides Studio Page"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => Array.Empty(); - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - ctx.RegisterNavigationItem(new NavigationItemDescriptor - { - Id = "Help", - Title = "Help & Guides", - Group = "Library", - IconKind = "HelpCircleOutline", - BadgeText = "Guides", - BadgeColorHex = "#0284C7", - Order = 150, - ViewFactory = null - }); - return Task.CompletedTask; - } -} - -public class LicensingPagePlugin : IFryPlugin -{ - public string Id => "frypdf.page.licensing"; - public string Name => "Licenses & Tools Page"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => Array.Empty(); - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - ctx.RegisterNavigationItem(new NavigationItemDescriptor - { - Id = "Licensing", - Title = "Licenses & Tools", - Group = "Library", - IconKind = "CertificateOutline", - BadgeText = "12", - BadgeColorHex = "#4F46E5", - Order = 160, - ViewFactory = null - }); - return Task.CompletedTask; - } -} - -public class SettingsPagePlugin : IFryPlugin -{ - public string Id => "frypdf.page.settings"; - public string Name => "Settings & UI Preferences Page"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => Array.Empty(); - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - ctx.RegisterNavigationItem(new NavigationItemDescriptor - { - Id = "Settings", - Title = "Settings & UI", - Group = "Preferences", - IconKind = "TuneVariant", - BadgeText = "UI", - BadgeColorHex = "#7C3AED", - Order = 170, - ViewFactory = null - }); - return Task.CompletedTask; - } -} - -public class PluginsPagePlugin : IFryPlugin -{ - public string Id => "frypdf.page.plugins"; - public string Name => "Plugins & Extensions Studio Page"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => Array.Empty(); - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - ctx.RegisterNavigationItem(new NavigationItemDescriptor - { - Id = "Plugins", - Title = "Plugins & Extensions", - Group = "Preferences", - IconKind = "PuzzleOutline", - BadgeText = "Store", - BadgeColorHex = "#7C3AED", - Order = 165, - ViewFactory = sp => new PluginsManagerPageView - { - DataContext = (sp?.GetService(typeof(HomeViewModel)) as HomeViewModel)?.PluginsManager - ?? sp?.GetService(typeof(PluginsManagerViewModel)) as PluginsManagerViewModel - ?? new PluginsManagerViewModel( - sp?.GetService(typeof(PluginHost)) as PluginHost, - sp?.GetService(typeof(Core.Plugins.Marketplace.IPluginMarketplaceService)) as Core.Plugins.Marketplace.IPluginMarketplaceService) - } - }); - return Task.CompletedTask; - } -} diff --git a/src/PdfEditorApp/Plugins/Cli/HeadlessCliRunner.cs b/src/PdfEditorApp/Plugins/Cli/HeadlessCliRunner.cs deleted file mode 100644 index 073fdb0..0000000 --- a/src/PdfEditorApp/Plugins/Cli/HeadlessCliRunner.cs +++ /dev/null @@ -1,316 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Extensions.DependencyInjection; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Plugins; -using PdfEditorApp.Core.Plugins.Profiles; -using PdfEditorApp.Models; -using PdfEditorApp.Plugins.Bundles; -using PdfEditorApp.Services; -using PdfEditorApp.Services.Tools.Core; - -namespace PdfEditorApp.Plugins.Cli; - -/// -/// Headless Command-Line Runner for FryPDF, enabling batch operations and CI/CD pipelines -/// without launching an Avalonia desktop window. -/// -public static class HeadlessCliRunner -{ - private static readonly HashSet CliFlags = new(StringComparer.OrdinalIgnoreCase) - { - "--tool", "-t", - "--list-tools", - "--list-plugins", - "--profile", - "--help", "-h", - "--version", "-v" - }; - - /// - /// Checks whether the command line arguments indicate a headless CLI execution. - /// - public static bool IsCliInvocation(string[] args) - { - if (args == null || args.Length == 0) return false; - return args.Any(arg => CliFlags.Contains(arg)); - } - - /// - /// Executes the headless command line interface. - /// - public static async Task RunCliAsync(string[] args) - { - Console.WriteLine("=================================================="); - Console.WriteLine(" FryPDF Headless Studio (Plugin-Based CLI)"); - Console.WriteLine(" Powered by .NET 10 & QuestPDF / SkiaSharp"); - Console.WriteLine("=================================================="); - - var parsedArgs = ParseArguments(args); - - if (parsedArgs.ContainsKey("--help") || parsedArgs.ContainsKey("-h")) - { - PrintHelp(); - return 0; - } - - if (parsedArgs.ContainsKey("--version") || parsedArgs.ContainsKey("-v")) - { - Console.WriteLine("FryPDF version 1.0.0 (Plugin Architecture Edition)"); - return 0; - } - - // Initialize Services & Plugin Host - var services = new ServiceCollection(); - ConfigureHeadlessServices(services); - using var sp = services.BuildServiceProvider(); - - var pluginHost = sp.GetRequiredService(); - var toolRegistry = sp.GetRequiredService(); - var operationsService = sp.GetRequiredService(); - - // Load Bundles - var bundles = new IFryPluginBundle[] - { - new ToolsOrganizeBundle(), - new ToolsSecurityBundle(), - new ToolsConversionBundle(), - new ToolsIntelligenceBundle(), - new DataStudioBundle(), - new CanvasElementsBundle(), - new DocumentIoBundle(), - new AiProvidersBundle(), - new OcrEnginesBundle(), - new StandardTemplatesBundle(), - new StatusBarBundle(), - new InspectorBundle(), - new CommandPaletteBundle(), - new WorkspacePagesBundle(), - new DialogsBundle(), - new EditorSidebarsBundle() - }; - - // Determine profile - var profilePath = parsedArgs.GetValueOrDefault("--profile"); - if (!string.IsNullOrWhiteSpace(profilePath) && File.Exists(profilePath)) - { - var profile = ProfileLoader.LoadFromFile(profilePath); - ProfileLoader.ApplyProfile(profile, pluginHost, bundles); - } - else - { - // Default headless setup: register all bundles - foreach (var bundle in bundles) - { - pluginHost.RegisterPlugins(bundle.Plugins); - } - } - - await pluginHost.StartAsync(); - - if (parsedArgs.ContainsKey("--list-plugins")) - { - Console.WriteLine("\nActive Loaded Plugins:"); - foreach (var plugin in pluginHost.LoadedPlugins) - { - Console.WriteLine($" - [{plugin.Id}] {plugin.Name} (v{plugin.Version})"); - } - return 0; - } - - if (parsedArgs.ContainsKey("--list-tools")) - { - Console.WriteLine("\nRegistered PDF Tools:"); - var allTools = toolRegistry.GetAllTools(); - foreach (var tool in allTools) - { - Console.WriteLine($" - {tool.StringId,-25} | {tool.Name,-20} | Category: {tool.Category}"); - } - return 0; - } - - // Tool Execution - var toolId = parsedArgs.GetValueOrDefault("--tool") ?? parsedArgs.GetValueOrDefault("-t"); - if (string.IsNullOrWhiteSpace(toolId)) - { - Console.ForegroundColor = ConsoleColor.Red; - Console.WriteLine("Error: No tool specified. Use --tool or --list-tools."); - Console.ResetColor(); - return 1; - } - - var toolDef = toolRegistry.GetTool(toolId); - if (toolDef == null) - { - Console.ForegroundColor = ConsoleColor.Red; - Console.WriteLine($"Error: Tool '{toolId}' was not recognized. Run --list-tools to see all available tools."); - Console.ResetColor(); - return 1; - } - - var inputs = parsedArgs.GetValueOrDefault("--input") ?? parsedArgs.GetValueOrDefault("-i"); - var output = parsedArgs.GetValueOrDefault("--output") ?? parsedArgs.GetValueOrDefault("-o"); - - if (string.IsNullOrWhiteSpace(inputs)) - { - Console.ForegroundColor = ConsoleColor.Red; - Console.WriteLine("Error: Please provide one or more input files via -i or --input."); - Console.ResetColor(); - return 1; - } - - var inputFiles = inputs.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries); - foreach (var file in inputFiles) - { - if (!File.Exists(file)) - { - Console.ForegroundColor = ConsoleColor.Red; - Console.WriteLine($"Error: Input file not found: {file}"); - Console.ResetColor(); - return 1; - } - } - - output ??= $"output_{Path.GetFileName(inputFiles[0])}"; - - Console.WriteLine($"\nExecuting Tool: {toolDef.Name} ({toolDef.StringId})"); - Console.WriteLine($"Inputs: {string.Join(", ", inputFiles)}"); - Console.WriteLine($"Output: {output}\n"); - - var progress = new Progress(p => - { - Console.Write($"\rProgress: {p:F0}%"); - }); - - var stopwatch = System.Diagnostics.Stopwatch.StartNew(); - - try - { - ToolExecutionResult result; - - if (string.Equals(toolDef.StringId, "frypdf.tool.merge", StringComparison.OrdinalIgnoreCase) || toolDef.Id == PdfToolId.MergePdf) - { - result = await operationsService.PageService.MergePdfAsync(new MergeToolOptions - { - InputFiles = inputFiles.ToList(), - OutputFilePath = output - }, progress, CancellationToken.None); - } - else if (string.Equals(toolDef.StringId, "frypdf.tool.compress", StringComparison.OrdinalIgnoreCase) || toolDef.Id == PdfToolId.CompressPdf) - { - result = await operationsService.OptimizationService.CompressPdfAsync(new CompressToolOptions - { - InputFilePath = inputFiles[0], - OutputFilePath = output, - Level = PdfCompressionLevel.Balanced - }, progress, CancellationToken.None); - } - else if (string.Equals(toolDef.StringId, "frypdf.tool.split", StringComparison.OrdinalIgnoreCase) || toolDef.Id == PdfToolId.SplitPdf) - { - var outDir = Path.GetDirectoryName(output); - if (string.IsNullOrWhiteSpace(outDir)) outDir = "."; - result = await operationsService.PageService.SplitPdfAsync(new SplitToolOptions - { - InputFilePath = inputFiles[0], - OutputDirectory = outDir, - Mode = SplitExtractMode.SplitEveryNPages, - PagesPerSplit = 1 - }, progress, CancellationToken.None); - } - else - { - Console.WriteLine($"Note: Executing via generic tool pipeline dispatcher for '{toolDef.StringId}'..."); - result = new ToolExecutionResult - { - Success = true, - OutputFilePath = output, - Message = $"Executed {toolDef.Name} successfully." - }; - } - - stopwatch.Stop(); - Console.WriteLine(); - - if (result.Success) - { - Console.ForegroundColor = ConsoleColor.Green; - Console.WriteLine($"\n[SUCCESS] Operation completed in {stopwatch.ElapsedMilliseconds}ms!"); - if (!string.IsNullOrEmpty(result.OutputFilePath)) - { - Console.WriteLine($"Generated Output: {result.OutputFilePath}"); - } - if (result.OriginalSizeBytes > 0 && result.OutputSizeBytes > 0) - { - Console.WriteLine($"Saved: {result.SavingsPercentage:F1}% ({result.OriginalSizeBytes:N0} bytes -> {result.OutputSizeBytes:N0} bytes)"); - } - Console.ResetColor(); - return 0; - } - else - { - Console.ForegroundColor = ConsoleColor.Red; - Console.WriteLine($"\n[FAILED] {result.ErrorMessage}"); - Console.ResetColor(); - return 1; - } - } - catch (Exception ex) - { - Console.ForegroundColor = ConsoleColor.Red; - Console.WriteLine($"\n[ERROR] Unhandled exception: {ex.Message}"); - Console.ResetColor(); - return 1; - } - } - - private static Dictionary ParseArguments(string[] args) - { - var dict = new Dictionary(StringComparer.OrdinalIgnoreCase); - - for (int i = 0; i < args.Length; i++) - { - var arg = args[i]; - if (arg.StartsWith("-")) - { - if (i + 1 < args.Length && !args[i + 1].StartsWith("-")) - { - dict[arg] = args[i + 1]; - i++; - } - else - { - dict[arg] = "true"; - } - } - } - - return dict; - } - - private static void PrintHelp() - { - Console.WriteLine("\nUsage: dotnet run --project src/PdfEditorApp -- [options]\n"); - Console.WriteLine("Options:"); - Console.WriteLine(" --tool, -t Specify tool ID to run (e.g. frypdf.tool.merge)"); - Console.WriteLine(" --input, -i Comma-separated input PDF files"); - Console.WriteLine(" --output, -o Target output PDF or directory"); - Console.WriteLine(" --profile Custom profile JSON path (e.g. profiles/headless.profile.json)"); - Console.WriteLine(" --list-tools List all registered PDF tools"); - Console.WriteLine(" --list-plugins List all loaded plugin components"); - Console.WriteLine(" --version, -v Show version information"); - Console.WriteLine(" --help, -h Display this help menu\n"); - Console.WriteLine("Examples:"); - Console.WriteLine(" dotnet run --project src/PdfEditorApp -- --tool frypdf.tool.merge -i doc1.pdf,doc2.pdf -o merged.pdf"); - Console.WriteLine(" dotnet run --project src/PdfEditorApp -- --tool frypdf.tool.compress -i large.pdf -o compressed.pdf"); - Console.WriteLine(" dotnet run --project src/PdfEditorApp -- --list-tools\n"); - } - - private static void ConfigureHeadlessServices(IServiceCollection services) - { - App.ConfigureServices(services); - } -} diff --git a/src/PdfEditorApp/Plugins/Loader/FryPluginPackageLoader.cs b/src/PdfEditorApp/Plugins/Loader/FryPluginPackageLoader.cs deleted file mode 100644 index c8642f0..0000000 --- a/src/PdfEditorApp/Plugins/Loader/FryPluginPackageLoader.cs +++ /dev/null @@ -1,160 +0,0 @@ -using System; -using System.IO; -using System.IO.Compression; -using System.Linq; -using System.Text.Json; -using PdfEditorApp.Core.Plugins; -using PdfEditorApp.Core.Plugins.Manifests; - -namespace PdfEditorApp.Plugins.Loader; - -/// -/// Result of unpacking and loading a self-contained .fryplugin package. -/// -public sealed class FryPluginPackageResult : IDisposable -{ - public required PluginManifest Manifest { get; init; } - public required PluginAssemblyPackage AssemblyPackage { get; init; } - public required string InstallDirectory { get; init; } - - public void Dispose() - { - AssemblyPackage.Dispose(); - } -} - -/// -/// Manages packing, unpacking, validation, and loading of self-contained .fryplugin distribution archives. -/// A .fryplugin is a standard ZIP archive containing a plugin.json manifest, entry assemblies, dependencies, and assets. -/// -public static class FryPluginPackageLoader -{ - /// - /// Unpacks a .fryplugin package to the target plugins directory and loads its contained plugins. - /// - public static FryPluginPackageResult UnpackAndLoad(string packageFilePath, string? targetPluginsDirectory = null) - { - ArgumentException.ThrowIfNullOrWhiteSpace(packageFilePath); - if (!File.Exists(packageFilePath)) - { - throw new FileNotFoundException($"Plugin package '{packageFilePath}' not found."); - } - - var baseDirectory = targetPluginsDirectory ?? Path.Combine(AppContext.BaseDirectory, "plugins"); - Directory.CreateDirectory(baseDirectory); - - // 1. Read manifest from ZIP before extracting to know target folder name - PluginManifest? manifest = null; - using (var archive = ZipFile.OpenRead(packageFilePath)) - { - var manifestEntry = archive.Entries.FirstOrDefault(e => - string.Equals(e.FullName, "plugin.json", StringComparison.OrdinalIgnoreCase) || - string.Equals(Path.GetFileName(e.FullName), "plugin.json", StringComparison.OrdinalIgnoreCase)); - - if (manifestEntry != null) - { - using var stream = manifestEntry.Open(); - using var reader = new StreamReader(stream); - var json = reader.ReadToEnd(); - manifest = JsonSerializer.Deserialize(json); - } - } - - var pluginId = !string.IsNullOrWhiteSpace(manifest?.Id) - ? manifest.Id - : Path.GetFileNameWithoutExtension(packageFilePath); - - var destinationFolder = Path.Combine(baseDirectory, pluginId); - if (Directory.Exists(destinationFolder)) - { - try - { - Directory.Delete(destinationFolder, recursive: true); - } - catch - { - // If locked, create unique timestamped folder - destinationFolder = Path.Combine(baseDirectory, $"{pluginId}_{DateTime.UtcNow.Ticks}"); - } - } - - Directory.CreateDirectory(destinationFolder); - ZipFile.ExtractToDirectory(packageFilePath, destinationFolder, overwriteFiles: true); - - // 2. Identify entry assembly DLL - string? entryDll = null; - if (!string.IsNullOrWhiteSpace(manifest?.EntryPoint)) - { - var candidate = Path.Combine(destinationFolder, manifest.EntryPoint); - if (File.Exists(candidate)) - { - entryDll = candidate; - } - } - - if (entryDll == null) - { - // Search for DLL matching pluginId or any DLL containing IFryPlugin - var allDlls = Directory.GetFiles(destinationFolder, "*.dll", SearchOption.AllDirectories); - entryDll = allDlls.FirstOrDefault(d => string.Equals(Path.GetFileNameWithoutExtension(d), pluginId, StringComparison.OrdinalIgnoreCase)) - ?? allDlls.FirstOrDefault(); - } - - if (string.IsNullOrWhiteSpace(entryDll) || !File.Exists(entryDll)) - { - throw new InvalidOperationException($"No entry DLL found in package '{packageFilePath}'."); - } - - // 3. Load assembly into isolated collectible ALC - var assemblyPackage = PluginAssemblyLoader.LoadPluginAssembly(entryDll); - - // Create fallback manifest if plugin.json was not packaged - if (manifest == null) - { - var firstPlugin = assemblyPackage.Plugins.FirstOrDefault(); - manifest = new PluginManifest - { - Id = firstPlugin?.Id ?? pluginId, - Name = firstPlugin?.Name ?? pluginId, - Version = firstPlugin?.Version.ToString() ?? "1.0.0", - EntryPoint = Path.GetFileName(entryDll), - Description = "Extracted .fryplugin archive" - }; - } - - return new FryPluginPackageResult - { - Manifest = manifest, - AssemblyPackage = assemblyPackage, - InstallDirectory = destinationFolder - }; - } - - /// - /// Creates a .fryplugin package archive from a directory containing a plugin.json manifest and built DLLs. - /// - public static string CreatePackage(string sourceDirectory, string outputPackagePath) - { - ArgumentException.ThrowIfNullOrWhiteSpace(sourceDirectory); - ArgumentException.ThrowIfNullOrWhiteSpace(outputPackagePath); - - if (!Directory.Exists(sourceDirectory)) - { - throw new DirectoryNotFoundException($"Source directory '{sourceDirectory}' not found."); - } - - var outDir = Path.GetDirectoryName(outputPackagePath); - if (!string.IsNullOrWhiteSpace(outDir)) - { - Directory.CreateDirectory(outDir); - } - - if (File.Exists(outputPackagePath)) - { - File.Delete(outputPackagePath); - } - - ZipFile.CreateFromDirectory(sourceDirectory, outputPackagePath, CompressionLevel.Optimal, includeBaseDirectory: false); - return outputPackagePath; - } -} diff --git a/src/PdfEditorApp/Plugins/Loader/PluginAssemblyLoader.cs b/src/PdfEditorApp/Plugins/Loader/PluginAssemblyLoader.cs deleted file mode 100644 index dd07755..0000000 --- a/src/PdfEditorApp/Plugins/Loader/PluginAssemblyLoader.cs +++ /dev/null @@ -1,308 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Reflection; -using System.Runtime.Loader; -using PdfEditorApp.Core.Plugins; - -namespace PdfEditorApp.Plugins.Loader; - -/// -/// Container holding instantiated plugins from an isolated assembly, along with its collectible load context. -/// -public sealed class PluginAssemblyPackage : IDisposable -{ - private readonly CollectiblePluginLoadContext _context; - private bool _isDisposed; - - public IReadOnlyList Plugins { get; } - public string AssemblyPath { get; } - - public PluginAssemblyPackage( - string assemblyPath, - IReadOnlyList plugins, - CollectiblePluginLoadContext context) - { - AssemblyPath = assemblyPath; - Plugins = plugins; - _context = context; - } - - public void Dispose() - { - if (_isDisposed) return; - _isDisposed = true; - - if (_context.IsCollectible) - { - _context.Unload(); - GC.Collect(); - GC.WaitForPendingFinalizers(); - } - } -} - -/// -/// Collectible that allows dynamic plugin DLLs to be loaded and later completely unloaded. -/// -public sealed class CollectiblePluginLoadContext : AssemblyLoadContext -{ - private readonly AssemblyDependencyResolver _resolver; - private readonly string _pluginDirectory; - - public CollectiblePluginLoadContext(string pluginPath, bool isCollectible = false) - : base(name: Path.GetFileNameWithoutExtension(pluginPath), isCollectible: isCollectible) - { - _resolver = new AssemblyDependencyResolver(pluginPath); - _pluginDirectory = Path.GetDirectoryName(pluginPath) ?? string.Empty; - } - - protected override Assembly? Load(AssemblyName assemblyName) - { - string? assemblyPath = _resolver.ResolveAssemblyToPath(assemblyName); - if (assemblyPath != null && File.Exists(assemblyPath)) - { - return LoadFromAssemblyPath(assemblyPath); - } - - // Direct fallback: check for .dll in the plugin directory - if (!string.IsNullOrEmpty(_pluginDirectory)) - { - var candidate = Path.Combine(_pluginDirectory, $"{assemblyName.Name}.dll"); - if (File.Exists(candidate)) - { - return LoadFromAssemblyPath(candidate); - } - - // Also search plugin directory recursively if dependencies are in subfolders - try - { - var match = Directory.GetFiles(_pluginDirectory, $"{assemblyName.Name}.dll", SearchOption.AllDirectories).FirstOrDefault(); - if (match != null && File.Exists(match)) - { - return LoadFromAssemblyPath(match); - } - } - catch { } - } - - return null; - } - - protected override IntPtr LoadUnmanagedDll(string unmanagedDllName) - { - string? libraryPath = _resolver.ResolveUnmanagedDllToPath(unmanagedDllName); - if (libraryPath != null && File.Exists(libraryPath)) - { - return LoadUnmanagedDllFromPath(libraryPath); - } - - // Direct fallback: check in runtimes//native/ or plugin directory - if (!string.IsNullOrEmpty(_pluginDirectory)) - { - string rid = OperatingSystem.IsMacOS() - ? (System.Runtime.InteropServices.RuntimeInformation.ProcessArchitecture == System.Runtime.InteropServices.Architecture.Arm64 ? "osx-arm64" : "osx-x64") - : OperatingSystem.IsWindows() - ? (System.Runtime.InteropServices.RuntimeInformation.ProcessArchitecture == System.Runtime.InteropServices.Architecture.Arm64 ? "win-arm64" : "win-x64") - : (System.Runtime.InteropServices.RuntimeInformation.ProcessArchitecture == System.Runtime.InteropServices.Architecture.Arm64 ? "linux-arm64" : "linux-x64"); - - var candidatePaths = new[] - { - Path.Combine(_pluginDirectory, "runtimes", rid, "native", unmanagedDllName), - Path.Combine(_pluginDirectory, "runtimes", rid, "native", $"{unmanagedDllName}.dylib"), - Path.Combine(_pluginDirectory, "runtimes", rid, "native", $"lib{unmanagedDllName}.dylib"), - Path.Combine(_pluginDirectory, "runtimes", rid, "native", $"{unmanagedDllName}.so"), - Path.Combine(_pluginDirectory, "runtimes", rid, "native", $"lib{unmanagedDllName}.so"), - Path.Combine(_pluginDirectory, "runtimes", rid, "native", $"{unmanagedDllName}.dll"), - Path.Combine(_pluginDirectory, unmanagedDllName), - Path.Combine(_pluginDirectory, $"{unmanagedDllName}.dylib"), - Path.Combine(_pluginDirectory, $"lib{unmanagedDllName}.dylib"), - Path.Combine(_pluginDirectory, $"{unmanagedDllName}.dll") - }; - - foreach (var p in candidatePaths) - { - if (File.Exists(p)) - { - return LoadUnmanagedDllFromPath(p); - } - } - } - - return base.LoadUnmanagedDll(unmanagedDllName); - } -} - -/// -/// Discovers and loads external .NET 10 plugin assemblies at runtime. -/// -public static class PluginAssemblyLoader -{ - private static readonly List _activePackages = new(); - - /// - /// Loads an isolated assembly, instantiates any implementations, and returns a package. - /// - public static PluginAssemblyPackage LoadPluginAssembly(string assemblyPath) - { - ArgumentException.ThrowIfNullOrWhiteSpace(assemblyPath); - if (!File.Exists(assemblyPath)) - { - throw new FileNotFoundException($"Plugin assembly '{assemblyPath}' not found."); - } - - var fullPath = Path.GetFullPath(assemblyPath); - var alc = new CollectiblePluginLoadContext(fullPath); - var assembly = alc.LoadFromAssemblyPath(fullPath); - - var pluginTypes = assembly.GetTypes() - .Where(t => typeof(IFryPlugin).IsAssignableFrom(t) && !t.IsAbstract && !t.IsInterface) - .ToList(); - - var plugins = new List(); - foreach (var type in pluginTypes) - { - try - { - if (Activator.CreateInstance(type) is IFryPlugin instance) - { - plugins.Add(instance); - } - } - catch (Exception ex) - { - System.Diagnostics.Debug.WriteLine($"[PluginAssemblyLoader] Could not instantiate '{type.FullName}': {ex.Message}"); - } - } - - var package = new PluginAssemblyPackage(fullPath, plugins, alc); - lock (_activePackages) - { - _activePackages.Add(package); - } - return package; - } - - /// - /// Scans a directory for plugin packages (.fryplugin), plugin subdirectories, and standalone DLLs, - /// loading all discovered plugin packages into isolated collectible ALC contexts. - /// - public static IReadOnlyList DiscoverAndLoadDirectory(string pluginsDirectory) - { - if (string.IsNullOrWhiteSpace(pluginsDirectory) || !Directory.Exists(pluginsDirectory)) - { - return Array.Empty(); - } - - var packages = new List(); - var loadedPaths = new HashSet(StringComparer.OrdinalIgnoreCase); - - // 1. Discover and unpack .fryplugin packages - var packageFiles = Directory.GetFiles(pluginsDirectory, "*.fryplugin", SearchOption.TopDirectoryOnly); - foreach (var pkgFile in packageFiles) - { - try - { - var pkgResult = FryPluginPackageLoader.UnpackAndLoad(pkgFile, pluginsDirectory); - if (pkgResult.AssemblyPackage.Plugins.Count > 0) - { - packages.Add(pkgResult.AssemblyPackage); - loadedPaths.Add(pkgResult.AssemblyPackage.AssemblyPath); - } - else - { - pkgResult.Dispose(); - } - } - catch (Exception ex) - { - System.Diagnostics.Debug.WriteLine($"[PluginAssemblyLoader] Failed to unpack/load package '{pkgFile}': {ex.Message}"); - } - } - - // 2. Discover unpacked plugin subdirectories - var subDirectories = Directory.GetDirectories(pluginsDirectory); - foreach (var subDir in subDirectories) - { - try - { - string? entryDll = null; - var manifestFile = Path.Combine(subDir, "plugin.json"); - if (File.Exists(manifestFile)) - { - var json = File.ReadAllText(manifestFile); - var manifest = System.Text.Json.JsonSerializer.Deserialize(json); - if (!string.IsNullOrWhiteSpace(manifest?.EntryPoint)) - { - var candidate = Path.Combine(subDir, manifest.EntryPoint); - if (File.Exists(candidate)) - { - entryDll = candidate; - } - } - } - - if (entryDll == null) - { - var folderName = Path.GetFileName(subDir); - var candidate = Path.Combine(subDir, $"{folderName}.dll"); - if (File.Exists(candidate)) - { - entryDll = candidate; - } - else - { - entryDll = Directory.GetFiles(subDir, "*.dll", SearchOption.TopDirectoryOnly).FirstOrDefault(); - } - } - - if (entryDll != null && !loadedPaths.Contains(entryDll)) - { - var package = LoadPluginAssembly(entryDll); - if (package.Plugins.Count > 0) - { - packages.Add(package); - loadedPaths.Add(entryDll); - } - else - { - package.Dispose(); - } - } - } - catch (Exception ex) - { - System.Diagnostics.Debug.WriteLine($"[PluginAssemblyLoader] Failed to load plugin from subdirectory '{subDir}': {ex.Message}"); - } - } - - // 3. Discover top-level standalone DLLs - var dllFiles = Directory.GetFiles(pluginsDirectory, "*.dll", SearchOption.TopDirectoryOnly); - foreach (var dll in dllFiles) - { - if (loadedPaths.Contains(dll)) continue; - - try - { - var package = LoadPluginAssembly(dll); - if (package.Plugins.Count > 0) - { - packages.Add(package); - loadedPaths.Add(dll); - } - else - { - // No plugins in this assembly; unload immediately - package.Dispose(); - } - } - catch - { - // Skip non-.NET or incompatible assemblies - } - } - - return packages; - } -} diff --git a/src/PdfEditorApp/Plugins/ToolPluginBase.cs b/src/PdfEditorApp/Plugins/ToolPluginBase.cs deleted file mode 100644 index 89e65af..0000000 --- a/src/PdfEditorApp/Plugins/ToolPluginBase.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using PdfEditorApp.Core.Plugins; -using PdfEditorApp.Core.Plugins.Descriptors; -using PdfEditorApp.Services; -using PdfEditorApp.Services.Tools.Core; - -namespace PdfEditorApp.Plugins; - -/// -/// Convenient base class for standard FryPDF tool plugins. -/// Automatically registers its into the active context during . -/// -public abstract class ToolPluginBase : IFryPlugin -{ - public abstract string Id { get; } - public abstract string Name { get; } - public virtual Version Version => new(1, 0, 0); - public virtual IReadOnlyList RequiredServices => Array.Empty(); - public virtual IReadOnlyList ProvidedServices => Array.Empty(); - - protected abstract PdfToolDescriptor CreateDescriptor(); - - public virtual Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - ctx.RegisterTool(CreateDescriptor()); - return Task.CompletedTask; - } -} diff --git a/src/PdfEditorApp/Program.cs b/src/PdfEditorApp/Program.cs deleted file mode 100644 index 973479f..0000000 --- a/src/PdfEditorApp/Program.cs +++ /dev/null @@ -1,32 +0,0 @@ -using Avalonia; -using System; -using PdfEditorApp.Plugins.Cli; - -namespace PdfEditorApp; - -sealed class Program -{ - // Initialization code. Don't use any Avalonia, third-party APIs or any - // SynchronizationContext-reliant code before AppMain is called: things aren't initialized - // yet and stuff might break. - [STAThread] - public static int Main(string[] args) - { - if (HeadlessCliRunner.IsCliInvocation(args)) - { - return HeadlessCliRunner.RunCliAsync(args).GetAwaiter().GetResult(); - } - - return BuildAvaloniaApp().StartWithClassicDesktopLifetime(args); - } - - // Avalonia configuration, don't remove; also used by visual designer. - public static AppBuilder BuildAvaloniaApp() - => AppBuilder.Configure() - .UsePlatformDetect() -#if DEBUG - .WithDeveloperTools() -#endif - .WithInterFont() - .LogToTrace(); -} diff --git a/src/PdfEditorApp/Services/AI/AiProviderRegistry.cs b/src/PdfEditorApp/Services/AI/AiProviderRegistry.cs deleted file mode 100644 index f0815d4..0000000 --- a/src/PdfEditorApp/Services/AI/AiProviderRegistry.cs +++ /dev/null @@ -1,58 +0,0 @@ -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using PdfEditorApp.Core.Plugins.Descriptors; -using PdfEditorApp.Services.AI.Providers; - -namespace PdfEditorApp.Services.AI; - -public class AiProviderRegistry : IAiProviderRegistry -{ - private readonly ConcurrentDictionary _providers = new(StringComparer.OrdinalIgnoreCase); - - public event Action? RegistryChanged; - - public AiProviderRegistry() - { - RegisterBuiltInProviders(); - } - - private void RegisterBuiltInProviders() - { - RegisterProvider(new OllamaAiProvider()); - RegisterProvider(new GroqAiProvider()); - RegisterProvider(new OpenAiProvider()); - } - - public IDisposable RegisterProvider(IAiProvider provider) - { - ArgumentNullException.ThrowIfNull(provider); - _providers[provider.ProviderId] = provider; - RegistryChanged?.Invoke(); - - return new DisposableAction(() => - { - _providers.TryRemove(provider.ProviderId, out _); - RegistryChanged?.Invoke(); - }); - } - - public IAiProvider? GetProvider(string providerId) - { - if (string.IsNullOrWhiteSpace(providerId)) return null; - return _providers.GetValueOrDefault(providerId); - } - - public IReadOnlyList GetAllProviders() - { - return _providers.Values.ToList(); - } - - private sealed class DisposableAction(Action action) : IDisposable - { - private Action? _action = action; - public void Dispose() => Interlocked.Exchange(ref _action, null)?.Invoke(); - } -} diff --git a/src/PdfEditorApp/Services/AI/AiService.cs b/src/PdfEditorApp/Services/AI/AiService.cs deleted file mode 100644 index 79fac3d..0000000 --- a/src/PdfEditorApp/Services/AI/AiService.cs +++ /dev/null @@ -1,695 +0,0 @@ -using System; -using System.ClientModel; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using System.Net.Http; -using System.Net.Http.Json; -using System.Text.Json.Serialization; -using System.Text.RegularExpressions; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Extensions.AI; -using OllamaSharp; -using OpenAI; -using OpenAI.Chat; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Models; - -namespace PdfEditorApp.Services.AI; - -/// -/// Core implementation of IAiService leveraging Microsoft.Extensions.AI, OllamaSharp, and OpenAI SDK. -/// -public class AiService : IAiService -{ - private readonly HttpClient _httpClient; - private readonly IAiProviderRegistry _providerRegistry; - private readonly List _ollamaLibraryCache = new(); - private readonly object _libraryLock = new(); - - public AiService(HttpClient? httpClient = null, IAiProviderRegistry? providerRegistry = null) - { - _httpClient = httpClient ?? new HttpClient { Timeout = TimeSpan.FromSeconds(10) }; - _providerRegistry = providerRegistry ?? new AiProviderRegistry(); - if (_httpClient.DefaultRequestHeaders.UserAgent.Count == 0) - { - _httpClient.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"); - } - } - - /// - public async Task> DiscoverOllamaModelsAsync(string endpoint, CancellationToken ct = default) - { - var results = new List(); - - if (string.IsNullOrWhiteSpace(endpoint)) - { - endpoint = "http://localhost:11434"; - } - - bool isRemote = !string.IsNullOrWhiteSpace(endpoint) && - !endpoint.Contains("localhost", StringComparison.OrdinalIgnoreCase) && - !endpoint.Contains("127.0.0.1"); - - try - { - string url = $"{endpoint.TrimEnd('/')}/api/tags"; - var response = await _httpClient.GetFromJsonAsync(url, ct); - - if (response?.Models != null && response.Models.Count > 0) - { - foreach (var m in response.Models) - { - string paramSize = m.Details?.ParameterSize ?? ExtractParamSizeFromName(m.Name); - bool hasRemoteHost = !string.IsNullOrWhiteSpace(m.RemoteHost); - bool isCloudModel = isRemote || - hasRemoteHost || - m.Name.Contains("cloud", StringComparison.OrdinalIgnoreCase) || - (m.Size > 0 && m.Size < 1024 * 1024 && !string.IsNullOrEmpty(paramSize)); - - var modelTier = isCloudModel ? AiModelTier.FreeCloud : AiModelTier.FreeLocal; - string formattedSize = (isCloudModel && m.Size < 1024 * 1024) - ? "Ollama Cloud" - : AiModelInfo.FormatBytes(m.Size); - - var capabilitiesList = new List(); - if (m.Capabilities != null && m.Capabilities.Count > 0) - { - foreach (var cap in m.Capabilities) - { - capabilitiesList.Add(Capitalize(cap)); - } - } - else - { - if (isCloudModel) capabilitiesList.Add("Cloud"); - capabilitiesList.Add("Completion"); - } - string capStr = string.Join(" • ", capabilitiesList); - - string hostNote = hasRemoteHost ? $" [via {m.RemoteHost}]" : string.Empty; - string desc = !string.IsNullOrEmpty(m.Details?.Family) - ? $"{Capitalize(m.Details.Family)} architecture ({paramSize}) [{(isCloudModel ? "Ollama Free Cloud" : "Local Free")}]{hostNote}" - : (isCloudModel ? $"Ollama Free Cloud model{hostNote}" : "Local Ollama model"); - - string category = isCloudModel ? "Ollama Cloud (Installed)" : "Installed on Ollama"; - - results.Add(new AiModelInfo - { - Id = m.Name, - DisplayName = FormatModelDisplayName(m.Name), - Provider = AiProviderType.OllamaLocal, - Tier = modelTier, - Category = category, - Capabilities = capStr, - SizeBytes = m.Size, - FormattedSize = formattedSize, - ParameterSize = paramSize, - Description = desc, - IsInstalledLocally = !isRemote && !hasRemoteHost - }); - } - } - } - catch - { - // If Ollama is not currently running or unreachable, return empty list gracefully - } - - return results; - } - - /// - public IReadOnlyList GetCloudCatalogModels() - { - return new List - { - new() - { - Id = "llama-3.1-8b-instant", - DisplayName = "Llama 3.1 8B (Groq Free Cloud)", - Provider = AiProviderType.CustomOpenAiCompatible, - Tier = AiModelTier.FreeCloud, - Description = "Ultra-fast free cloud tier inference powered by Groq LPU", - ParameterSize = "8B Cloud", - IsInstalledLocally = false - }, - new() - { - Id = "openai/gpt-oss-120b", - DisplayName = "GPT-OSS 120B Reasoning (Groq Cloud)", - Provider = AiProviderType.CustomOpenAiCompatible, - Tier = AiModelTier.FreeCloud, - Description = "Open-weights 120B reasoning model powered by Groq LPUs", - ParameterSize = "120B Cloud", - IsInstalledLocally = false - }, - new() - { - Id = "meta-llama/llama-3.2-3b-instruct:free", - DisplayName = "Llama 3.2 3B (OpenRouter Free Cloud)", - Provider = AiProviderType.CustomOpenAiCompatible, - Tier = AiModelTier.FreeCloud, - Description = "Official free cloud tier model via OpenRouter API", - ParameterSize = "3B Cloud", - IsInstalledLocally = false - }, - new() - { - Id = "gpt-4o-mini", - DisplayName = "GPT-4o Mini (OpenAI)", - Provider = AiProviderType.OpenAiCloud, - Tier = AiModelTier.PaidCloud, - Description = "Fast, lightweight flagship-grade intelligence (recommended for high accuracy)", - ParameterSize = "Cloud API", - IsInstalledLocally = false - }, - new() - { - Id = "gpt-4o", - DisplayName = "GPT-4o (OpenAI)", - Provider = AiProviderType.OpenAiCloud, - Tier = AiModelTier.PaidCloud, - Description = "Omni flagship model with complex layout reasoning and multimodal capabilities", - ParameterSize = "Cloud API", - IsInstalledLocally = false - }, - new() - { - Id = "o1-mini", - DisplayName = "o1-mini Reasoning (OpenAI)", - Provider = AiProviderType.OpenAiCloud, - Tier = AiModelTier.PaidCloud, - Description = "Deep reasoning model for math, complex data tables, and dense structure", - ParameterSize = "Reasoning Cloud", - IsInstalledLocally = false - }, - new() - { - Id = "llama-3.3-70b-versatile", - DisplayName = "Llama 3.3 70B (Groq / OpenRouter)", - Provider = AiProviderType.CustomOpenAiCompatible, - Tier = AiModelTier.PaidCloud, - Description = "High-speed LPU inference via Groq or compatible OpenAI provider", - ParameterSize = "70B Cloud", - IsInstalledLocally = false - }, - new() - { - Id = "mixtral-8x7b-32768", - DisplayName = "Mixtral 8x7B (Custom / Groq)", - Provider = AiProviderType.CustomOpenAiCompatible, - Tier = AiModelTier.PaidCloud, - Description = "High-throughput mixture of experts via custom API endpoint", - ParameterSize = "8x7B Cloud", - IsInstalledLocally = false - } - }; - } - - /// - public IReadOnlyList GetOllamaLibraryModels() - { - lock (_libraryLock) - { - if (_ollamaLibraryCache.Count > 0) - { - return _ollamaLibraryCache.ToList(); - } - - return GetDefaultOllamaLibrarySeedModels(); - } - } - - private static List GetDefaultOllamaLibrarySeedModels() - { - return new List - { - new() - { - Id = "llama3.2", - DisplayName = "Llama 3.2 (3B)", - Provider = AiProviderType.OllamaLocal, - Tier = AiModelTier.FreeLocal, - Category = "Ollama Library", - Capabilities = "Tools • Vision • Text", - ParameterSize = "3B", - FormattedSize = "2.0 GB", - Description = "Meta's lightweight model optimized for local multilingual text and tool usage.", - IsInstalledLocally = false - }, - new() - { - Id = "mistral", - DisplayName = "Mistral (7B)", - Provider = AiProviderType.OllamaLocal, - Tier = AiModelTier.FreeLocal, - Category = "Ollama Library", - Capabilities = "Reasoning • Code • Text", - ParameterSize = "7B", - FormattedSize = "4.1 GB", - Description = "Fast, high-performance 7B model by Mistral AI.", - IsInstalledLocally = false - }, - new() - { - Id = "deepseek-r1:8b", - DisplayName = "DeepSeek R1 (8B)", - Provider = AiProviderType.OllamaLocal, - Tier = AiModelTier.FreeLocal, - Category = "Ollama Library", - Capabilities = "Thinking • Math • Reasoning", - ParameterSize = "8B", - FormattedSize = "4.9 GB", - Description = "DeepSeek reasoning model with step-by-step thinking scratchpad.", - IsInstalledLocally = false - }, - new() - { - Id = "qwen2.5:7b", - DisplayName = "Qwen 2.5 (7B)", - Provider = AiProviderType.OllamaLocal, - Tier = AiModelTier.FreeLocal, - Category = "Ollama Library", - Capabilities = "Reasoning • Coding", - ParameterSize = "7B", - FormattedSize = "4.4 GB", - Description = "Alibaba's advanced open-weight model with strong code and instruction following.", - IsInstalledLocally = false - }, - new() - { - Id = "phi3:mini", - DisplayName = "Phi-3 Mini (3.8B)", - Provider = AiProviderType.OllamaLocal, - Tier = AiModelTier.FreeLocal, - Category = "Ollama Library", - Capabilities = "Lightweight • Text", - ParameterSize = "3.8B", - FormattedSize = "2.3 GB", - Description = "Microsoft's efficient small language model for consumer hardware.", - IsInstalledLocally = false - } - }; - } - - /// - public async Task> FetchOllamaOnlineLibraryAsync(string? query = null, CancellationToken ct = default) - { - var fetched = new List(); - try - { - if (string.IsNullOrWhiteSpace(query)) - { - // Fetch both newest and popular trending models from ollama.com - var taskNewest = _httpClient.GetStringAsync("https://ollama.com/search?o=newest", ct); - var taskPopular = _httpClient.GetStringAsync("https://ollama.com/search", ct); - await Task.WhenAll(taskNewest, taskPopular); - - var newestList = ParseOllamaLibraryHtml(taskNewest.Result); - var popularList = ParseOllamaLibraryHtml(taskPopular.Result); - - var seen = new HashSet(StringComparer.OrdinalIgnoreCase); - foreach (var m in newestList.Concat(popularList)) - { - if (seen.Add(m.Id)) - { - fetched.Add(m); - } - } - } - else - { - string searchUrl = $"https://ollama.com/search?q={Uri.EscapeDataString(query.Trim())}"; - string html = await _httpClient.GetStringAsync(searchUrl, ct); - fetched.AddRange(ParseOllamaLibraryHtml(html)); - } - - if (fetched.Count > 0) - { - lock (_libraryLock) - { - _ollamaLibraryCache.Clear(); - _ollamaLibraryCache.AddRange(fetched); - } - } - } - catch - { - // Network error - } - - lock (_libraryLock) - { - return _ollamaLibraryCache.ToList(); - } - } - - /// - /// Parses public HTML from ollama.com/search to extract live model cards, capabilities, tags, and sizes. - /// - public static List ParseOllamaLibraryHtml(string html) - { - var list = new List(); - if (string.IsNullOrWhiteSpace(html)) return list; - - var itemMatches = Regex.Matches( - html, - """(.*?)(?=| x.Id.Equals(id, StringComparison.OrdinalIgnoreCase))) - continue; - - string block = m.Groups[2].Value; - - // Extract Description - string desc = string.Empty; - var descMatch = Regex.Match(block, """]*>(.*?)

""", RegexOptions.Singleline); - if (descMatch.Success) - { - desc = System.Net.WebUtility.HtmlDecode(descMatch.Groups[1].Value.Trim()); - } - - // Extract Capability Badges (vision, tools, thinking, cloud, etc.) - var badgeMatches = Regex.Matches(block, """]*class="[^"]*rounded-md[^"]*"[^>]*>\s*([a-zA-Z0-9_\-\.]+)\s*""", RegexOptions.Singleline); - var capabilities = new List(); - bool isCloud = false; - - foreach (Match bm in badgeMatches) - { - string tag = bm.Groups[1].Value.Trim(); - if (string.Equals(tag, "cloud", StringComparison.OrdinalIgnoreCase)) - { - isCloud = true; - } - else if (!string.IsNullOrEmpty(tag)) - { - capabilities.Add(Capitalize(tag)); - } - } - - if (id.Contains("cloud", StringComparison.OrdinalIgnoreCase)) - { - isCloud = true; - } - - // Extract Pulls (e.g. 69.7K Pulls) - string pulls = string.Empty; - var pullsMatch = Regex.Match(block, """>\s*([0-9\.]+[KMB]?)\s*\s*]*> Pulls""", RegexOptions.Singleline); - if (pullsMatch.Success) - { - pulls = pullsMatch.Groups[1].Value + " pulls"; - } - - string paramSize = ExtractParamSizeFromName(id); - if (string.IsNullOrEmpty(paramSize)) - { - var pMatch = Regex.Match(desc, @"\b([0-9]+(?:\.[0-9]+)?B)\b", RegexOptions.IgnoreCase); - if (pMatch.Success) - { - paramSize = pMatch.Groups[1].Value.ToUpperInvariant(); - } - } - - string capStr = string.Join(" • ", capabilities); - if (string.IsNullOrEmpty(capStr)) - { - capStr = isCloud ? "Cloud • Fast Inference" : "Tools • Text"; - } - - var tier = isCloud ? AiModelTier.FreeCloud : AiModelTier.FreeLocal; - string formattedSize = isCloud ? "Ollama Cloud" : (!string.IsNullOrEmpty(pulls) ? pulls : "Ollama Library"); - - list.Add(new AiModelInfo - { - Id = id, - DisplayName = FormatModelDisplayName(id), - Provider = AiProviderType.OllamaLocal, - Tier = tier, - Category = isCloud ? "Ollama Cloud (Online)" : "Ollama Library (Online)", - Capabilities = capStr, - ParameterSize = paramSize, - FormattedSize = formattedSize, - Description = string.IsNullOrEmpty(desc) ? $"Ollama {(isCloud ? "Cloud" : "Library")} model {id}" : desc, - IsInstalledLocally = false - }); - } - - return list; - } - - /// - public IReadOnlyList GetUnifiedModelCatalog(AiSettingsModel settings) - { - var catalog = new List(); - var seenIds = new HashSet(StringComparer.OrdinalIgnoreCase); - - // 1. Add Discovered Ollama Models (Installed on user's machine/endpoint) - if (settings.DiscoveredOllamaModels.Count > 0) - { - foreach (var m in settings.DiscoveredOllamaModels) - { - if (seenIds.Add(m.Id)) - { - catalog.Add(m); - } - } - } - - // 2. Add Cached Online Library Models (from previous fetch) - if (settings.OllamaLibraryCache != null && settings.OllamaLibraryCache.Count > 0) - { - foreach (var cached in settings.OllamaLibraryCache) - { - if (seenIds.Add(cached.Id)) - { - catalog.Add(cached); - } - } - } - - // 3. Add Ollama Library Models (Official online or fallback seed models) - foreach (var libModel in GetOllamaLibraryModels()) - { - if (seenIds.Add(libModel.Id)) - { - catalog.Add(libModel); - } - } - - // 4. Add Cloud Models (Free Cloud & Paid Cloud) - foreach (var cloudModel in GetCloudCatalogModels()) - { - if (seenIds.Add(cloudModel.Id)) - { - catalog.Add(cloudModel); - } - } - - return catalog; - } - - /// - public async Task<(bool Success, string Message, TimeSpan Latency)> TestConnectionAsync(AiSettingsModel settings, CancellationToken ct = default) - { - var sw = Stopwatch.StartNew(); - - try - { - var chatClient = CreateChatClient(settings); - var response = await chatClient.GetResponseAsync( - "Respond in 3 words confirming you are connected to FryPDF Studio.", - new ChatOptions - { - MaxOutputTokens = 25, - Temperature = 0.2f - }, - ct); - - sw.Stop(); - string reply = response?.Text?.Trim() ?? "OK"; - return (true, $"Success! Model responded: \"{reply}\"", sw.Elapsed); - } - catch (Exception ex) - { - sw.Stop(); - return (false, $"Connection failed: {ex.Message}", sw.Elapsed); - } - } - - /// - public IChatClient CreateChatClient(AiSettingsModel settings) - { - switch (settings.SelectedProvider) - { - case AiProviderType.OllamaLocal: - { - string endpoint = string.IsNullOrWhiteSpace(settings.OllamaEndpoint) - ? "http://localhost:11434" - : settings.OllamaEndpoint.TrimEnd('/'); - - string model = string.IsNullOrWhiteSpace(settings.SelectedModelId) - ? "llama3.2" - : settings.SelectedModelId; - - if (!string.IsNullOrWhiteSpace(settings.OllamaApiKey)) - { - var httpClient = new HttpClient { BaseAddress = new Uri(endpoint), Timeout = TimeSpan.FromSeconds(60) }; - httpClient.DefaultRequestHeaders.Authorization = - new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", settings.OllamaApiKey.Trim()); - return new OllamaApiClient(httpClient, model); - } - - // OllamaApiClient implements IChatClient directly from Microsoft.Extensions.AI - return new OllamaApiClient(new Uri(endpoint), model); - } - - case AiProviderType.OpenAiCloud: - { - string apiKey = string.IsNullOrWhiteSpace(settings.OpenAiApiKey) - ? "dummy-key" - : settings.OpenAiApiKey.Trim(); - - string model = string.IsNullOrWhiteSpace(settings.SelectedModelId) - ? "gpt-4o-mini" - : settings.SelectedModelId; - - var client = new ChatClient(model, apiKey); - return client.AsIChatClient(); - } - - case AiProviderType.CustomOpenAiCompatible: - { - string apiKey = string.IsNullOrWhiteSpace(settings.OpenAiApiKey) - ? "dummy-key" - : settings.OpenAiApiKey.Trim(); - - string model = string.IsNullOrWhiteSpace(settings.CustomModelName) - ? (string.IsNullOrWhiteSpace(settings.SelectedModelId) ? "llama-3.3-70b-versatile" : settings.SelectedModelId) - : settings.CustomModelName.Trim(); - - string baseUrl = NormalizeCustomOpenAiBaseUrl(settings.CustomBaseUrl); - - var client = new ChatClient( - model, - new ApiKeyCredential(apiKey), - new OpenAIClientOptions { Endpoint = new Uri(baseUrl) }); - - return client.AsIChatClient(); - } - - default: - throw new ArgumentOutOfRangeException(nameof(settings.SelectedProvider)); - } - } - - private static string FormatModelDisplayName(string rawName) - { - if (string.IsNullOrWhiteSpace(rawName)) return "Unknown"; - string clean = rawName.Replace(":latest", ""); - return clean switch - { - "llama3.2" => "Llama 3.2 (Meta)", - "llama3.1" => "Llama 3.1 (Meta)", - "mistral" => "Mistral 7B", - "phi3" => "Phi-3 Mini (Microsoft)", - "phi4" => "Phi-4 (Microsoft)", - "gemma2" => "Gemma 2 (Google)", - "deepseek-r1" => "DeepSeek-R1 (Reasoning)", - "qwen2.5" => "Qwen 2.5", - _ => Capitalize(clean) - }; - } - - private static string ExtractParamSizeFromName(string name) - { - if (name.Contains("3.2", StringComparison.OrdinalIgnoreCase)) return "3B"; - if (name.Contains("70b", StringComparison.OrdinalIgnoreCase)) return "70B"; - if (name.Contains("8b", StringComparison.OrdinalIgnoreCase)) return "8B"; - if (name.Contains("7b", StringComparison.OrdinalIgnoreCase)) return "7B"; - if (name.Contains("14b", StringComparison.OrdinalIgnoreCase)) return "14B"; - if (name.Contains("3b", StringComparison.OrdinalIgnoreCase)) return "3B"; - if (name.Contains("1b", StringComparison.OrdinalIgnoreCase)) return "1B"; - return string.Empty; - } - - private static string Capitalize(string str) - { - if (string.IsNullOrEmpty(str)) return str; - return char.ToUpperInvariant(str[0]) + str[1..]; - } - - /// - /// Normalizes custom OpenAI-compatible base URLs by trimming trailing slashes and - /// stripping '/chat/completions' if the user accidentally included the full endpoint path. - /// - public static string NormalizeCustomOpenAiBaseUrl(string? rawUrl) - { - if (string.IsNullOrWhiteSpace(rawUrl)) - { - return "https://api.openai.com/v1"; - } - - string trimmed = rawUrl.Trim().TrimEnd('/'); - if (trimmed.EndsWith("/chat/completions", StringComparison.OrdinalIgnoreCase)) - { - trimmed = trimmed[..^"/chat/completions".Length].TrimEnd('/'); - } - - return trimmed; - } - - // JSON DTO for Ollama /api/tags - private sealed class OllamaTagsResponse - { - [JsonPropertyName("models")] - public List? Models { get; set; } - } - - private sealed class OllamaModelDto - { - [JsonPropertyName("name")] - public string Name { get; set; } = string.Empty; - - [JsonPropertyName("model")] - public string? Model { get; set; } - - [JsonPropertyName("remote_model")] - public string? RemoteModel { get; set; } - - [JsonPropertyName("remote_host")] - public string? RemoteHost { get; set; } - - [JsonPropertyName("size")] - public long Size { get; set; } - - [JsonPropertyName("details")] - public OllamaDetailsDto? Details { get; set; } - - [JsonPropertyName("capabilities")] - public List? Capabilities { get; set; } - } - - private sealed class OllamaDetailsDto - { - [JsonPropertyName("family")] - public string? Family { get; set; } - - [JsonPropertyName("families")] - public List? Families { get; set; } - - [JsonPropertyName("parameter_size")] - public string? ParameterSize { get; set; } - - [JsonPropertyName("quantization_level")] - public string? QuantizationLevel { get; set; } - - [JsonPropertyName("context_length")] - public long? ContextLength { get; set; } - } -} diff --git a/src/PdfEditorApp/Services/AI/IAiProviderRegistry.cs b/src/PdfEditorApp/Services/AI/IAiProviderRegistry.cs deleted file mode 100644 index ec1686b..0000000 --- a/src/PdfEditorApp/Services/AI/IAiProviderRegistry.cs +++ /dev/null @@ -1,86 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Extensions.AI; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Models; - -namespace PdfEditorApp.Services.AI; - -/// -/// Contract for an AI provider plugin (e.g., Ollama, Groq, OpenAI, Anthropic, Gemini, Mock). -/// -public interface IAiProvider -{ - /// - /// Unique provider ID, e.g. "ollama", "groq", "openai", "claude", "gemini". - /// - string ProviderId { get; } - - /// - /// User-facing display name, e.g. "Ollama (Local Private AI)" or "Groq (Ultra-Fast Cloud LPU)". - /// - string DisplayName { get; } - - /// - /// Indicates whether this provider requires an API key. - /// - bool RequiresApiKey { get; } - - /// - /// Indicates whether this provider allows custom endpoint URL configuration. - /// - bool SupportsCustomEndpoint { get; } - - /// - /// Default API endpoint URL if applicable. - /// - string DefaultEndpoint => ""; - - /// - /// Material icon name representing the provider. - /// - string IconKind => "RobotOutline"; - - /// - /// Retrieves the list of available models supported by this provider. - /// - Task> GetModelsAsync(AiSettingsModel settings, CancellationToken ct = default); - - /// - /// Creates a configured for this provider. - /// - IChatClient CreateChatClient(AiSettingsModel settings); - - /// - /// Tests connectivity and latency to the provider endpoint. - /// - Task<(bool Success, string Message, TimeSpan Latency)> TestConnectionAsync(AiSettingsModel settings, CancellationToken ct = default); -} - -/// -/// Registry for discovering and dispatching pluggable AI backends. -/// -public interface IAiProviderRegistry -{ - /// - /// Registers an AI provider into the system. - /// - IDisposable RegisterProvider(IAiProvider provider); - - /// - /// Retrieves an AI provider by its unique identifier. - /// - IAiProvider? GetProvider(string providerId); - - /// - /// Gets all currently registered AI providers. - /// - IReadOnlyList GetAllProviders(); - - /// - /// Raised whenever an AI provider is registered or unregistered. - /// - event Action? RegistryChanged; -} diff --git a/src/PdfEditorApp/Services/AI/IAiService.cs b/src/PdfEditorApp/Services/AI/IAiService.cs deleted file mode 100644 index d714b0f..0000000 --- a/src/PdfEditorApp/Services/AI/IAiService.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Extensions.AI; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Models; - -namespace PdfEditorApp.Services.AI; - -/// -/// Service responsible for managing AI providers, model catalogs, connection verification, and IChatClient creation. -/// -public interface IAiService -{ - /// - /// Auto-discovers all locally installed models on the specified Ollama endpoint. - /// - Task> DiscoverOllamaModelsAsync(string endpoint, CancellationToken ct = default); - - /// - /// Retrieves standard cloud and OpenAI-compatible models labeled with Paid/Cloud tier badges. - /// - IReadOnlyList GetCloudCatalogModels(); - - /// - /// Retrieves official featured models provided in the Ollama library. - /// - IReadOnlyList GetOllamaLibraryModels(); - - /// - /// Fetches live models directly from Ollama's online model catalog/search (ollama.com). - /// - Task> FetchOllamaOnlineLibraryAsync(string? query = null, CancellationToken ct = default); - - /// - /// Combines discovered local models and cloud models into a unified catalog. - /// - IReadOnlyList GetUnifiedModelCatalog(AiSettingsModel settings); - - /// - /// Tests connectivity to the currently configured AI provider. - /// - Task<(bool Success, string Message, TimeSpan Latency)> TestConnectionAsync(AiSettingsModel settings, CancellationToken ct = default); - - /// - /// Creates a configured Microsoft.Extensions.AI IChatClient based on active settings. - /// - IChatClient CreateChatClient(AiSettingsModel settings); -} diff --git a/src/PdfEditorApp/Services/AI/IPdfStudioAgentService.cs b/src/PdfEditorApp/Services/AI/IPdfStudioAgentService.cs deleted file mode 100644 index 61b7b02..0000000 --- a/src/PdfEditorApp/Services/AI/IPdfStudioAgentService.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System; -using System.Threading; -using System.Threading.Tasks; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Models; -using PdfEditorApp.ViewModels; -using PdfEditorApp.ViewModels.ElementViewModels; - -namespace PdfEditorApp.Services.AI; - -/// -/// AI Agent service that takes natural language user prompts and generates or modifies native PDF studio canvas elements. -/// -public interface IPdfStudioAgentService -{ - /// - /// Executes an AI generation prompt on the specified page using Microsoft.Extensions.AI. - /// - Task ExecutePromptAsync( - string userPrompt, - PageViewModel targetPage, - AiSettingsModel settings, - Action? progressCallback = null, - CancellationToken ct = default, - (double X, double Y)? targetPoint = null); - - /// - /// Modifies an existing canvas element in-place using natural language instructions via Microsoft.Extensions.AI. - /// - Task ModifyElementAsync( - ElementViewModelBase targetElement, - string modificationPrompt, - AiSettingsModel settings, - Action? progressCallback = null, - CancellationToken ct = default); -} diff --git a/src/PdfEditorApp/Services/AI/PdfStudioAgentService.cs b/src/PdfEditorApp/Services/AI/PdfStudioAgentService.cs deleted file mode 100644 index 6aa5a35..0000000 --- a/src/PdfEditorApp/Services/AI/PdfStudioAgentService.cs +++ /dev/null @@ -1,1464 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Linq; -using System.Text.Json; -using System.Text.Json.Serialization; -using System.Text.RegularExpressions; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Extensions.AI; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; -using PdfEditorApp.Models; -using PdfEditorApp.ViewModels; -using PdfEditorApp.ViewModels.ElementViewModels; - -namespace PdfEditorApp.Services.AI; - -/// -/// Autonomous document studio agent powered by Microsoft.Extensions.AI. -/// Translates natural language composition prompts into native editable FryPDF canvas elements. -/// -public class PdfStudioAgentService : IPdfStudioAgentService -{ - private readonly IAiService _aiService; - private readonly IUndoRedoService? _undoRedoService; - - public PdfStudioAgentService(IAiService aiService, IUndoRedoService? undoRedoService = null) - { - _aiService = aiService ?? throw new ArgumentNullException(nameof(aiService)); - _undoRedoService = undoRedoService; - } - - /// - public async Task ExecutePromptAsync( - string userPrompt, - PageViewModel targetPage, - AiSettingsModel settings, - Action? progressCallback = null, - CancellationToken ct = default, - (double X, double Y)? targetPoint = null) - { - if (string.IsNullOrWhiteSpace(userPrompt)) - { - return new AiAgentResult { Success = false, Message = "User prompt was empty." }; - } - - if (targetPage == null) - { - return new AiAgentResult { Success = false, Message = "Target page is required." }; - } - - var sw = Stopwatch.StartNew(); - progressCallback?.Invoke("Connecting to AI model..."); - - var createdElements = new List(); - var actionsTaken = new List(); - - double baseX = targetPoint?.X ?? 40; - double baseY = targetPoint?.Y ?? 40; - - double ResolveX(double x) => (targetPoint.HasValue && Math.Abs(x - 40) < 0.1) ? targetPoint.Value.X : x; - double ResolveY(double y, double defaultY = 40) => (targetPoint.HasValue && Math.Abs(y - defaultY) < 0.1) ? targetPoint.Value.Y : y; - - string targetScopeInstruction = targetPoint.HasValue - ? $""" - Target Location: - - The user explicitly pointed to coordinate X: {targetPoint.Value.X:0} pt, Y: {targetPoint.Value.Y:0} pt on Page {targetPage.PageNumber}. - - Place newly created elements starting at or centered near this target position (X: {targetPoint.Value.X:0}, Y: {targetPoint.Value.Y:0}). - - For composed layouts (e.g. heading + paragraph + button), position elements sequentially from Y: {targetPoint.Value.Y:0} downwards. - """ - : $""" - Target Scope: - - The user has selected ENTIRE Page {targetPage.PageNumber} (Width: {targetPage.Width:0} pt, Height: {targetPage.Height:0} pt). - - You have full creative authority to structure, align, and compose elements across the entire page layout. - """; - - // System prompt guiding design principles and canvas coordinate system - string systemPrompt = $""" - You are FryPDF Studio Agent, an expert AI document layout designer. - You create professional, beautiful, polished document elements directly on the active document canvas using available tools. - - Canvas Dimensions: - - Page Width: {targetPage.Width:0} pt, Height: {targetPage.Height:0} pt. - - Coordinate origin (0, 0) is top-left. - - Safe printable margins: X: 40 to {targetPage.Width - 40:0} pt, Y: 40 to {targetPage.Height - 40:0} pt. - - {targetScopeInstruction} - - Design Guidelines: - 1. Visual Hierarchy: Use clear contrast in font sizes (Headings 20-28pt bold, Subheadings 14-16pt, Paragraphs 10-12pt). - 2. Layout Spacing: Leave generous vertical spacing between sections (15-25pt gap). Do not overlap elements unless deliberately layering a text/badge over a background card shape. - 3. Cohesive Color Palettes: - - Primary Accent: #0F6CBD (Modern Blue), #1E293B (Slate Dark), or #15803D (Emerald Green) - - Background Tints: #F8FAFC, #F0F7FD, #F0FDF4 - - Borders/Dividers: #E2E8F0, #CBD5E1 - - Text Colors: Dark text #0F172A or #1E293B on light backgrounds. - 4. Completeness: When asked for a composition (e.g. invoice, report header, certificate, certificate border, notice, card), invoke multiple tools to build the complete, ready-to-use section. - 5. If the tool calling mechanism is unavailable or you prefer structured output, output a JSON array of actions with keys: - action ('addHeading'|'addParagraph'|'addShape'|'addTable'|'addDivider'|'addBadge'|'addCard'|'addSvg'|'addQrCode'|'addBarcode'|'addChart'). - """; - - if (!string.IsNullOrWhiteSpace(settings.SystemInstructions)) - { - systemPrompt += $""" - - - User Custom Instructions: - {settings.SystemInstructions} - """; - } - - // Define tools using Microsoft.Extensions.AI AIFunctionFactory - var tools = new List - { - AIFunctionFactory.Create( - ([Description("Heading or title text")] string text, - [Description("X position in pt")] double x = 40, - [Description("Y position in pt")] double y = 40, - [Description("Width in pt")] double width = 500, - [Description("Height in pt")] double height = 45, - [Description("Font size in pt (default 24)")] double fontSize = 24, - [Description("Font family name")] string fontFamily = "Georgia", - [Description("Hex text color (e.g. #111827)")] string textColorHex = "#111827", - [Description("Bold typeface")] bool isBold = true, - [Description("Text alignment: Left, Center, or Right")] string alignment = "Left") => - { - double rx = ResolveX(x); - double ry = ResolveY(y, 40); - var el = CreateHeadingElement(text, rx, ry, width, height, fontSize, fontFamily, textColorHex, isBold, alignment); - targetPage.AddElement(el); - createdElements.Add(el); - string desc = $"Heading: \"{Truncate(text, 25)}\" at ({rx:0},{ry:0})"; - actionsTaken.Add(desc); - progressCallback?.Invoke($"Created {desc}"); - return $"Created heading element ID {el.Id}"; - }, - "addHeading", - "Adds a prominent section title or document heading text element."), - - AIFunctionFactory.Create( - ([Description("Paragraph body text")] string text, - [Description("X position in pt")] double x = 40, - [Description("Y position in pt")] double y = 90, - [Description("Width in pt")] double width = 500, - [Description("Height in pt")] double height = 60, - [Description("Font size in pt (default 12)")] double fontSize = 12, - [Description("Font family name")] string fontFamily = "Inter", - [Description("Hex text color (e.g. #374151)")] string textColorHex = "#374151", - [Description("Text alignment: Left, Center, or Right")] string alignment = "Left") => - { - double rx = ResolveX(x); - double ry = ResolveY(y, 90); - var el = CreateParagraphElement(text, rx, ry, width, height, fontSize, fontFamily, textColorHex, alignment); - targetPage.AddElement(el); - createdElements.Add(el); - string desc = $"Paragraph: \"{Truncate(text, 25)}\" at ({rx:0},{ry:0})"; - actionsTaken.Add(desc); - progressCallback?.Invoke($"Created {desc}"); - return $"Created paragraph element ID {el.Id}"; - }, - "addParagraph", - "Adds a multi-line paragraph or body text block."), - - AIFunctionFactory.Create( - ([Description("Shape type: Rectangle, RoundedRectangle, Circle, PillBadge, Star, Triangle")] string shapeType = "RoundedRectangle", - [Description("X position in pt")] double x = 40, - [Description("Y position in pt")] double y = 40, - [Description("Width in pt")] double width = 200, - [Description("Height in pt")] double height = 100, - [Description("Fill background hex color")] string fillColorHex = "#F0F7FD", - [Description("Border stroke hex color")] string strokeColorHex = "#0F6CBD", - [Description("Stroke thickness in pt")] double strokeThickness = 1.0, - [Description("Corner radius for rounded rectangle")] double cornerRadius = 8.0) => - { - double rx = ResolveX(x); - double ry = ResolveY(y, 40); - var el = CreateShapeElement(shapeType, rx, ry, width, height, fillColorHex, strokeColorHex, strokeThickness, cornerRadius); - targetPage.AddElement(el); - createdElements.Add(el); - string desc = $"Shape: {shapeType} at ({rx:0},{ry:0})"; - actionsTaken.Add(desc); - progressCallback?.Invoke($"Created {desc}"); - return $"Created shape element ID {el.Id}"; - }, - "addShape", - "Adds a geometric container shape, background card, accent bar, or banner."), - - AIFunctionFactory.Create( - ([Description("List of column header titles")] string[] headers, - [Description("Matrix of row cell string values")] string[][] rows, - [Description("X position in pt")] double x = 40, - [Description("Y position in pt")] double y = 160, - [Description("Width in pt")] double width = 520, - [Description("Height in pt")] double height = 180, - [Description("Header background color hex")] string headerBgColorHex = "#0F6CBD", - [Description("Header text color hex")] string headerTextColorHex = "#FFFFFF") => - { - double rx = ResolveX(x); - double ry = ResolveY(y, 160); - var el = CreateTableElement(headers, rows, rx, ry, width, height, headerBgColorHex, headerTextColorHex); - targetPage.AddElement(el); - createdElements.Add(el); - string desc = $"Table: {headers?.Length ?? 0} cols × {rows?.Length ?? 0} rows at ({rx:0},{ry:0})"; - actionsTaken.Add(desc); - progressCallback?.Invoke($"Created {desc}"); - return $"Created table element ID {el.Id}"; - }, - "addTable", - "Adds a structured multi-column data grid or financial table with formatted headers and rows."), - - AIFunctionFactory.Create( - ([Description("X position in pt")] double x = 40, - [Description("Y position in pt")] double y = 150, - [Description("Width in pt")] double width = 520, - [Description("Height in pt")] double height = 2, - [Description("Divider line color hex")] string colorHex = "#CBD5E1", - [Description("Line thickness in pt")] double thickness = 1.0, - [Description("Orientation: Horizontal or Vertical")] string orientation = "Horizontal") => - { - double rx = ResolveX(x); - double ry = ResolveY(y, 150); - var el = CreateDividerElement(rx, ry, width, height, colorHex, thickness, orientation); - targetPage.AddElement(el); - createdElements.Add(el); - string desc = $"Divider: {orientation} at ({rx:0},{ry:0})"; - actionsTaken.Add(desc); - progressCallback?.Invoke($"Created {desc}"); - return $"Created divider element ID {el.Id}"; - }, - "addDivider", - "Adds a decorative horizontal or vertical divider line to separate sections."), - - AIFunctionFactory.Create( - ([Description("Short badge text label (e.g. PAID, CONFIDENTIAL, APPROVED)")] string text, - [Description("X position in pt")] double x = 40, - [Description("Y position in pt")] double y = 40, - [Description("Width in pt")] double width = 120, - [Description("Height in pt")] double height = 28, - [Description("Badge background fill color hex")] string bgColorHex = "#EFF6FF", - [Description("Badge text color hex")] string textColorHex = "#1D4ED8") => - { - double rx = ResolveX(x); - double ry = ResolveY(y, 40); - var el = CreateBadgeElement(text, rx, ry, width, height, bgColorHex, textColorHex); - targetPage.AddElement(el); - createdElements.Add(el); - string desc = $"Badge: \"{text}\" at ({rx:0},{ry:0})"; - actionsTaken.Add(desc); - progressCallback?.Invoke($"Created {desc}"); - return $"Created badge element ID {el.Id}"; - }, - "addBadge", - "Adds a stylish pill badge or status tag (e.g. PAID, DRAFT, CONFIDENTIAL)."), - - AIFunctionFactory.Create( - ([Description("Card header title")] string title, - [Description("Card subheader or date")] string subtitle, - [Description("Card body text")] string body, - [Description("X position in pt")] double x = 40, - [Description("Y position in pt")] double y = 100, - [Description("Width in pt")] double width = 520, - [Description("Height in pt")] double height = 130, - [Description("Theme accent color hex")] string themeColorHex = "#0F6CBD") => - { - double rx = ResolveX(x); - double ry = ResolveY(y, 100); - var elements = CreateCardElements(title, subtitle, body, rx, ry, width, height, themeColorHex); - foreach (var el in elements) - { - targetPage.AddElement(el); - createdElements.Add(el); - } - string desc = $"Card: \"{Truncate(title, 20)}\" (container + text) at ({rx:0},{ry:0})"; - actionsTaken.Add(desc); - progressCallback?.Invoke($"Created {desc}"); - return $"Created card composed of {elements.Count} elements"; - }, - "addCard", - "Adds a composed UI callout card with container background, title, subtitle, and body text."), - - AIFunctionFactory.Create( - ([Description("Preset ornament name from SvgOrnamentLibrary (e.g. ArtDecoFrame, BotanicalWreath, GaneshaCrest, OmCrest)")] string ornamentName, - [Description("X position in pt")] double x = 40, - [Description("Y position in pt")] double y = 40, - [Description("Width in pt")] double width = 80, - [Description("Height in pt")] double height = 80, - [Description("Tint color hex")] string colorHex = "#0F6CBD") => - { - double rx = ResolveX(x); - double ry = ResolveY(y, 40); - var el = CreateSvgOrnamentElement(ornamentName, rx, ry, width, height, colorHex); - targetPage.AddElement(el); - createdElements.Add(el); - string desc = $"SVG Ornament: {ornamentName} at ({rx:0},{ry:0})"; - actionsTaken.Add(desc); - progressCallback?.Invoke($"Created {desc}"); - return $"Created SVG ornament element ID {el.Id}"; - }, - "addSvgOrnament", - "Adds a vector ornament, crest, emblem, or flourish from FryPDF's vector library."), - - AIFunctionFactory.Create( - ([Description("URL, text, or payment payload")] string payload, - [Description("X position in pt")] double x = 40, - [Description("Y position in pt")] double y = 40, - [Description("Size in pt")] double size = 80) => - { - double rx = ResolveX(x); - double ry = ResolveY(y, 40); - var el = CreateQrCodeElement(payload, rx, ry, size); - targetPage.AddElement(el); - createdElements.Add(el); - string desc = $"QR Code at ({rx:0},{ry:0})"; - actionsTaken.Add(desc); - progressCallback?.Invoke($"Created {desc}"); - return $"Created QR code element ID {el.Id}"; - }, - "addQrCode", - "Adds a scannable QR code element for verification, links, or contact details."), - - AIFunctionFactory.Create( - ([Description("Barcode data value")] string payload, - [Description("Format: Code128, Ean13, etc.")] string format = "Code128", - [Description("X position in pt")] double x = 40, - [Description("Y position in pt")] double y = 40, - [Description("Width in pt")] double width = 180, - [Description("Height in pt")] double height = 55) => - { - double rx = ResolveX(x); - double ry = ResolveY(y, 40); - var el = CreateBarcodeElement(payload, format, rx, ry, width, height); - targetPage.AddElement(el); - createdElements.Add(el); - string desc = $"Barcode: {payload} at ({rx:0},{ry:0})"; - actionsTaken.Add(desc); - progressCallback?.Invoke($"Created {desc}"); - return $"Created barcode element ID {el.Id}"; - }, - "addBarcode", - "Adds a standard 1D barcode element.") - }; - - try - { - var baseChatClient = _aiService.CreateChatClient(settings); - - // Wrap in FunctionInvokingChatClient from Microsoft.Extensions.AI for automatic tool loop - var chatClient = new ChatClientBuilder(baseChatClient) - .UseFunctionInvocation() - .Build(); - - var messages = new List - { - new(ChatRole.System, systemPrompt), - new(ChatRole.User, userPrompt) - }; - - var chatOptions = new ChatOptions - { - Tools = tools, - Temperature = settings.Temperature, - MaxOutputTokens = 1500 - }; - - progressCallback?.Invoke("Generating elements on canvas..."); - var response = await chatClient.GetResponseAsync(messages, chatOptions, ct); - - string replyText = response?.Text ?? string.Empty; - - // FALLBACK: If model returned structured JSON actions in text instead of native function calls - if (createdElements.Count == 0 && !string.IsNullOrWhiteSpace(replyText)) - { - progressCallback?.Invoke("Parsing structured element instructions..."); - ParseAndExecuteJsonFallback(replyText, targetPage, createdElements, actionsTaken, progressCallback, targetPoint); - } - - // ATOMIC UNDO/REDO RECORDING: Wrap all created elements in a single atomic undo transaction - if (createdElements.Count > 0 && _undoRedoService != null) - { - var elementsSnapshot = createdElements.ToList(); - string undoDesc = $"AI Studio: {Truncate(userPrompt, 30)} ({elementsSnapshot.Count} items)"; - - _undoRedoService.RecordAction( - undoDesc, - () => - { - foreach (var el in elementsSnapshot) targetPage.RemoveElement(el); - }, - () => - { - foreach (var el in elementsSnapshot) targetPage.AddElement(el); - }); - } - - sw.Stop(); - - if (createdElements.Count > 0) - { - return new AiAgentResult - { - Success = true, - Message = $"Successfully created {createdElements.Count} elements in {sw.Elapsed.TotalSeconds:0.1}s.", - ElementsCreatedCount = createdElements.Count, - ActionDescriptions = actionsTaken, - RawOutput = replyText, - Duration = sw.Elapsed - }; - } - else - { - return new AiAgentResult - { - Success = false, - Message = string.IsNullOrWhiteSpace(replyText) - ? "The AI model did not generate any elements. Please verify your prompt." - : $"AI Response: {replyText}", - ElementsCreatedCount = 0, - RawOutput = replyText, - Duration = sw.Elapsed - }; - } - } - catch (Exception ex) - { - sw.Stop(); - return new AiAgentResult - { - Success = false, - Message = $"AI Generation Error: {ex.Message}", - Duration = sw.Elapsed - }; - } - } - - /// - public async Task ModifyElementAsync( - ElementViewModelBase targetElement, - string modificationPrompt, - AiSettingsModel settings, - Action? progressCallback = null, - CancellationToken ct = default) - { - if (targetElement == null) - { - return new AiAgentResult { Success = false, Message = "Target element is required." }; - } - - if (string.IsNullOrWhiteSpace(modificationPrompt)) - { - return new AiAgentResult { Success = false, Message = "Modification prompt cannot be empty." }; - } - - var sw = Stopwatch.StartNew(); - progressCallback?.Invoke($"Analyzing {targetElement.Kind} element..."); - - var currentModel = targetElement.ToModel(); - var beforeSnapshot = currentModel.Clone(); - - var jsonOptions = new JsonSerializerOptions - { - WriteIndented = true, - PropertyNamingPolicy = JsonNamingPolicy.CamelCase, - PropertyNameCaseInsensitive = true, - Converters = { new JsonStringEnumConverter() } - }; - - string currentJson = JsonSerializer.Serialize(currentModel, currentModel.GetType(), jsonOptions); - - string systemPrompt = $""" - You are FryPDF AI Element Modifier, an expert in document graphics, charts, typography, and layout. - The user has selected an existing canvas element and wants to modify it in-place using natural language. - Element Kind: {currentModel.Kind} - - Instructions: - 1. Apply the user's requested modifications to the properties of this element. - 2. Return ONLY a valid JSON object matching the element's schema, with the updated property values. - 3. Keep unmodified properties intact. Retain the same 'id', 'x', and 'y' unless explicitly requested to move or resize. - 4. Output strictly valid JSON. Do not include introductory text, conversational pleasantries, or explanations outside the JSON block. - - Element-Specific Guidelines: - - Charts: You can modify 'title', 'chartType' (BarColumn, HorizontalBar, Line, SmoothLine, Area, DonutPie, StackedBar, StackedHorizontalBar, Radar, ScatterPlot), 'palette' (CorporateBlue, ModernTeal, VibrantWarm, EmeraldForest, RoyalPurple, SunsetOrange, MonochromeSlate, NeonCyber), 'categories', 'values', 'valueLabels', 'barColorsHex', 'backgroundColorHex', 'borderColorHex', 'showDataLabels', 'showGridlines', etc. - - Text: You can modify 'text', 'fontFamily', 'fontSize', 'isBold', 'isItalic', 'isUnderline', 'textColorHex', 'backgroundColorHex', 'alignment', 'lineHeight', etc. - - Table: You can modify 'headers', 'rows', 'headerBackgroundHex', 'borderColorHex', 'alternateRowBackgroundHex', etc. - - Shape: You can modify 'shapeType' (Rectangle, RoundedRectangle, Circle, PillBadge, Diamond, Star, Banner), 'fillColorHex', 'strokeColorHex', 'strokeThickness', 'cornerRadius', etc. - - Math: You can modify 'formula' (LaTeX equation string), 'fontSize', 'textColorHex', 'showEquationNumber', 'equationNumber', etc. - - Image: You can modify 'opacity', 'width', 'height', 'altText', etc. - - Svg: You can modify 'tintColorHex', 'borderColorHex', 'borderThickness', 'cornerRadius', etc. - - Divider: You can modify 'colorHex', 'thickness', 'orientation', etc. - - QrCode: You can modify 'payload', 'darkColorHex', 'lightColorHex', etc. - - Barcode: You can modify 'codeValue', 'barColorHex', 'barcodeFormat', etc. - - FormField: You can modify 'label', 'isRequired', 'borderColorHex', 'backgroundColorHex', etc. - - StickyNote: You can modify 'noteText', 'colorHex', 'status', 'author', etc. - """; - - if (!string.IsNullOrWhiteSpace(settings.SystemInstructions)) - { - systemPrompt += $""" - - - User Custom Instructions: - {settings.SystemInstructions} - """; - } - - string userMessage = $""" - Modify this element according to instructions: - - User Request: {modificationPrompt} - - Current Element JSON: - {currentJson} - """; - - PdfElementBase? updatedModel = null; - string replyText = string.Empty; - - try - { - var baseChatClient = _aiService.CreateChatClient(settings); - var messages = new List - { - new(ChatRole.System, systemPrompt), - new(ChatRole.User, userMessage) - }; - - var chatOptions = new ChatOptions - { - Temperature = Math.Min(settings.Temperature, 0.4f), - MaxOutputTokens = 2000 - }; - - progressCallback?.Invoke("Querying AI model for modifications..."); - var response = await baseChatClient.GetResponseAsync(messages, chatOptions, ct); - replyText = response?.Text ?? string.Empty; - - if (!string.IsNullOrWhiteSpace(replyText)) - { - progressCallback?.Invoke("Applying updated attributes..."); - updatedModel = TryParseElementJson(replyText, currentModel.GetType(), jsonOptions); - } - } - catch (Exception ex) - { - Debug.WriteLine($"[PdfStudioAgentService] AI call error during ModifyElement: {ex.Message}"); - progressCallback?.Invoke("Attempting smart offline modifier..."); - } - - // Fallback to heuristic modifier if offline or test environment - if (updatedModel == null) - { - updatedModel = TryApplyHeuristicModification(currentModel, modificationPrompt); - } - - sw.Stop(); - - if (updatedModel != null) - { - updatedModel.Id = currentModel.Id; - if (updatedModel.Width <= 0) updatedModel.Width = currentModel.Width; - if (updatedModel.Height <= 0) updatedModel.Height = currentModel.Height; - - targetElement.LoadFromModel(updatedModel); - - if (targetElement is ChartElementViewModel chartVm) - { - chartVm.UpdateLiveChart(); - } - - // Atomic Undo/Redo recording - if (_undoRedoService != null) - { - var afterSnapshot = updatedModel.Clone(); - string undoDesc = $"AI Modify: {Truncate(modificationPrompt, 28)}"; - _undoRedoService.RecordAction( - undoDesc, - () => - { - targetElement.LoadFromModel(beforeSnapshot); - if (targetElement is ChartElementViewModel c) c.UpdateLiveChart(); - }, - () => - { - targetElement.LoadFromModel(afterSnapshot); - if (targetElement is ChartElementViewModel c) c.UpdateLiveChart(); - }); - } - - return new AiAgentResult - { - Success = true, - Message = $"Updated {targetElement.Kind} successfully: {Truncate(modificationPrompt, 40)}", - ElementsCreatedCount = 1, - RawOutput = replyText, - Duration = sw.Elapsed - }; - } - - return new AiAgentResult - { - Success = false, - Message = string.IsNullOrWhiteSpace(replyText) - ? "Unable to modify element with the provided instructions." - : $"AI Response could not be parsed: {Truncate(replyText, 100)}", - ElementsCreatedCount = 0, - RawOutput = replyText, - Duration = sw.Elapsed - }; - } - - private static PdfElementBase? TryParseElementJson(string rawText, Type targetType, JsonSerializerOptions options) - { - if (string.IsNullOrWhiteSpace(rawText)) return null; - - try - { - string cleaned = rawText.Trim(); - if (cleaned.StartsWith("```json", StringComparison.OrdinalIgnoreCase)) - { - cleaned = cleaned[7..]; - } - else if (cleaned.StartsWith("```", StringComparison.OrdinalIgnoreCase)) - { - cleaned = cleaned[3..]; - } - - if (cleaned.EndsWith("```", StringComparison.OrdinalIgnoreCase)) - { - cleaned = cleaned[..^3].Trim(); - } - - int firstBrace = cleaned.IndexOf('{'); - int lastBrace = cleaned.LastIndexOf('}'); - if (firstBrace >= 0 && lastBrace > firstBrace) - { - cleaned = cleaned.Substring(firstBrace, lastBrace - firstBrace + 1); - } - - return JsonSerializer.Deserialize(cleaned, targetType, options) as PdfElementBase; - } - catch (Exception ex) - { - Debug.WriteLine($"[PdfStudioAgentService] JSON parse error: {ex.Message}"); - return null; - } - } - - private static PdfElementBase? TryApplyHeuristicModification(PdfElementBase currentModel, string prompt) - { - if (currentModel == null || string.IsNullOrWhiteSpace(prompt)) return null; - string lower = prompt.ToLowerInvariant(); - - if (currentModel is PdfChartElement chart) - { - var modified = (PdfChartElement)chart.Clone(); - - // Chart Type - if (lower.Contains("line")) - { - modified.ChartType = lower.Contains("smooth") ? ChartType.SmoothLine : ChartType.Line; - } - else if (lower.Contains("bar") || lower.Contains("column")) - { - modified.ChartType = lower.Contains("horizontal") ? ChartType.HorizontalBar : ChartType.BarColumn; - } - else if (lower.Contains("donut") || lower.Contains("pie")) - { - modified.ChartType = ChartType.DonutPie; - } - else if (lower.Contains("area")) - { - modified.ChartType = ChartType.Area; - } - else if (lower.Contains("stacked")) - { - modified.ChartType = lower.Contains("horizontal") ? ChartType.StackedHorizontalBar : ChartType.StackedBar; - } - else if (lower.Contains("radar")) - { - modified.ChartType = ChartType.Radar; - } - - // Palette - if (lower.Contains("emerald") || lower.Contains("green") || lower.Contains("mint")) - { - modified.Palette = ChartPalette.EmeraldGreen; - modified.BarColorsHex = new List { "#A7F3D0", "#34D399", "#10B981", "#047857" }; - } - else if (lower.Contains("cyber") || lower.Contains("neon")) - { - modified.Palette = ChartPalette.CyberNeon; - modified.BarColorsHex = new List { "#99F6E4", "#2DD4BF", "#0D9488", "#115E59" }; - } - else if (lower.Contains("pastel")) - { - modified.Palette = ChartPalette.PastelHarmony; - modified.BarColorsHex = new List { "#E9D5FF", "#C084FC", "#9333EA", "#6B21A8" }; - } - else if (lower.Contains("sunset") || lower.Contains("orange")) - { - modified.Palette = ChartPalette.SunsetOrange; - modified.BarColorsHex = new List { "#FED7AA", "#FB923C", "#EA580C", "#9A3412" }; - } - else if (lower.Contains("rainbow") || lower.Contains("vibrant")) - { - modified.Palette = ChartPalette.VibrantRainbow; - modified.BarColorsHex = new List { "#FECDD3", "#FB7185", "#E11D48", "#9F1239" }; - } - else if (lower.Contains("blue") || lower.Contains("corporate")) - { - modified.Palette = ChartPalette.CorporateBlue; - modified.BarColorsHex = new List { "#C7E0F4", "#82BDF0", "#3D95E6", "#0F6CBD" }; - } - else if (lower.Contains("slate") || lower.Contains("gray") || lower.Contains("grey") || lower.Contains("executive")) - { - modified.Palette = ChartPalette.ExecutiveSlate; - modified.BarColorsHex = new List { "#E2E8F0", "#94A3B8", "#475569", "#1E293B" }; - } - - // Title extraction: e.g. title to "XYZ" or rename to "XYZ" or title: XYZ - var titleMatch = Regex.Match(prompt, """(?:title\s*(?:to|is|:)\s*|rename\s*(?:to)?\s*)["']?([^"'\r\n]+)["']?""", RegexOptions.IgnoreCase); - if (titleMatch.Success && !string.IsNullOrWhiteSpace(titleMatch.Groups[1].Value)) - { - modified.Title = titleMatch.Groups[1].Value.Trim(); - } - - // Projections / Adding future quarters - if (lower.Contains("2027") || lower.Contains("projection") || lower.Contains("forecast") || lower.Contains("add quarter")) - { - if (!modified.Categories.Any(c => c.Contains("2027"))) - { - double lastVal = modified.Values.LastOrDefault(); - double projVal = lastVal > 0 ? Math.Round(lastVal * 1.15, 2) : 1.0; - modified.Categories.Add("Q1 2027 (Proj)"); - modified.Values.Add(projVal); - modified.ValueLabels.Add($"${projVal:0.00}B"); - modified.BarColorsHex.Add("#34D399"); - } - } - - // Sorting - if (lower.Contains("sort") && (lower.Contains("asc") || lower.Contains("ascending") || lower.Contains("lowest"))) - { - var paired = modified.Categories.Select((cat, i) => new - { - Cat = cat, - Val = i < modified.Values.Count ? modified.Values[i] : 0, - Lbl = i < modified.ValueLabels.Count ? modified.ValueLabels[i] : "", - Col = i < modified.BarColorsHex.Count ? modified.BarColorsHex[i] : "#0F6CBD" - }).OrderBy(x => x.Val).ToList(); - - modified.Categories = paired.Select(p => p.Cat).ToList(); - modified.Values = paired.Select(p => p.Val).ToList(); - modified.ValueLabels = paired.Select(p => p.Lbl).ToList(); - modified.BarColorsHex = paired.Select(p => p.Col).ToList(); - } - else if (lower.Contains("sort") && (lower.Contains("desc") || lower.Contains("descending") || lower.Contains("highest"))) - { - var paired = modified.Categories.Select((cat, i) => new - { - Cat = cat, - Val = i < modified.Values.Count ? modified.Values[i] : 0, - Lbl = i < modified.ValueLabels.Count ? modified.ValueLabels[i] : "", - Col = i < modified.BarColorsHex.Count ? modified.BarColorsHex[i] : "#0F6CBD" - }).OrderByDescending(x => x.Val).ToList(); - - modified.Categories = paired.Select(p => p.Cat).ToList(); - modified.Values = paired.Select(p => p.Val).ToList(); - modified.ValueLabels = paired.Select(p => p.Lbl).ToList(); - modified.BarColorsHex = paired.Select(p => p.Col).ToList(); - } - - return modified; - } - - if (currentModel is PdfTextElement text) - { - var modified = (PdfTextElement)text.Clone(); - - if (lower.Contains("bold")) modified.IsBold = true; - if (lower.Contains("italic")) modified.IsItalic = true; - if (lower.Contains("underline")) modified.IsUnderline = true; - - if (lower.Contains("center")) modified.Alignment = TextAlignmentMode.Center; - else if (lower.Contains("right")) modified.Alignment = TextAlignmentMode.Right; - else if (lower.Contains("left")) modified.Alignment = TextAlignmentMode.Left; - else if (lower.Contains("justify")) modified.Alignment = TextAlignmentMode.Justify; - - var sizeMatch = Regex.Match(prompt, @"(\d+)\s*(?:pt|px|size)", RegexOptions.IgnoreCase); - if (sizeMatch.Success && double.TryParse(sizeMatch.Groups[1].Value, out double size) && size > 4 && size < 120) - { - modified.FontSize = size; - } - - if (lower.Contains("red")) modified.TextColorHex = "#DC2626"; - else if (lower.Contains("blue")) modified.TextColorHex = "#0F6CBD"; - else if (lower.Contains("green")) modified.TextColorHex = "#16A34A"; - else if (lower.Contains("purple")) modified.TextColorHex = "#7C3AED"; - else if (lower.Contains("amber") || lower.Contains("orange")) modified.TextColorHex = "#D97706"; - else if (lower.Contains("dark") || lower.Contains("black")) modified.TextColorHex = "#0F172A"; - - if (lower.Contains("inter")) modified.FontFamily = "Inter"; - else if (lower.Contains("roboto")) modified.FontFamily = "Roboto"; - else if (lower.Contains("georgia")) modified.FontFamily = "Georgia"; - else if (lower.Contains("cascadia") || lower.Contains("mono")) modified.FontFamily = "Cascadia Code"; - else if (lower.Contains("times")) modified.FontFamily = "Times New Roman"; - - if (lower.Contains("bullet")) - { - var lines = modified.Text.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries); - modified.Text = string.Join("\n", lines.Select(l => l.Trim().StartsWith("•") ? l : $"• {l.TrimStart('✔', '✓', '•', '-', '*', ' ', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.')}")); - } - else if (lower.Contains("check") || lower.Contains("checkmark")) - { - var lines = modified.Text.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries); - modified.Text = string.Join("\n", lines.Select(l => l.Trim().StartsWith("✔") ? l : $"✔ {l.TrimStart('✔', '✓', '•', '-', '*', ' ', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.')}")); - } - else if (lower.Contains("number") || lower.Contains("numbered") || lower.Contains("roadmap")) - { - var lines = modified.Text.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries); - modified.Text = string.Join("\n", lines.Select((l, i) => $"{i + 1}. {l.TrimStart('✔', '✓', '•', '-', '*', ' ', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.')}")); - } - else if (lower.Contains("executive") || lower.Contains("formal") || lower.Contains("professional")) - { - if (!modified.Text.StartsWith("Executive Summary:", StringComparison.OrdinalIgnoreCase)) - { - modified.Text = $"Executive Summary: {modified.Text}"; - } - } - - return modified; - } - - if (currentModel is PdfTableElement table) - { - var modified = (PdfTableElement)table.Clone(); - - if (lower.Contains("total") || lower.Contains("sum")) - { - var totalRow = new List { "Total" }; - for (int c = 1; c < modified.Headers.Count; c++) - { - if (c == modified.Headers.Count - 1) - { - double sum = 0; - foreach (var row in modified.Rows) - { - if (c < row.Count) - { - string clean = Regex.Replace(row[c], @"[^\d.]", ""); - if (double.TryParse(clean, out double num)) sum += num; - } - } - totalRow.Add(sum > 0 ? $"${sum:N2}" : "—"); - } - else - { - totalRow.Add(""); - } - } - modified.Rows.Add(totalRow); - } - - if (lower.Contains("emerald") || lower.Contains("green")) - { - modified.HeaderBackgroundHex = "#047857"; - } - else if (lower.Contains("purple")) - { - modified.HeaderBackgroundHex = "#6B21A8"; - } - else if (lower.Contains("slate") || lower.Contains("dark")) - { - modified.HeaderBackgroundHex = "#1E293B"; - } - - return modified; - } - - if (currentModel is PdfShapeElement shape) - { - var modified = (PdfShapeElement)shape.Clone(); - - if (lower.Contains("round")) - { - modified.ShapeType = ShapeType.RoundedRectangle; - modified.CornerRadius = 12; - } - else if (lower.Contains("circle") || lower.Contains("ellipse")) - { - modified.ShapeType = ShapeType.Circle; - } - - if (lower.Contains("blue")) - { - modified.FillColorHex = "#EFF6FF"; - modified.StrokeColorHex = "#2563EB"; - } - else if (lower.Contains("green") || lower.Contains("emerald")) - { - modified.FillColorHex = "#F0FDF4"; - modified.StrokeColorHex = "#16A34A"; - } - else if (lower.Contains("purple")) - { - modified.FillColorHex = "#FAF5FF"; - modified.StrokeColorHex = "#9333EA"; - } - - return modified; - } - - if (currentModel is PdfMathElement math) - { - var modified = (PdfMathElement)math.Clone(); - - if (lower.Contains("equation number") || lower.Contains("number")) - { - modified.ShowEquationNumber = true; - var numMatch = Regex.Match(prompt, @"(?:\(([^)]+)\)|number\s+([0-9.]+))", RegexOptions.IgnoreCase); - if (numMatch.Success) - { - string num = numMatch.Groups[1].Success ? numMatch.Groups[1].Value : numMatch.Groups[2].Value; - modified.EquationNumber = $"({num})"; - } - } - - if (lower.Contains("pythagor")) - { - modified.Formula = "a^2 + b^2 = c^2"; - } - else if (lower.Contains("quadratic")) - { - modified.Formula = @"x = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}"; - } - else if (lower.Contains("euler")) - { - modified.Formula = "e^{i\\pi} + 1 = 0"; - } - - var sizeMatch = Regex.Match(prompt, @"(?:(?:font\s*size|size)\s*[:=]?\s*(\d+)|(\d+)\s*(?:pt|px|size))", RegexOptions.IgnoreCase); - if (sizeMatch.Success) - { - string val = sizeMatch.Groups[1].Success ? sizeMatch.Groups[1].Value : sizeMatch.Groups[2].Value; - if (double.TryParse(val, out double size) && size >= 8 && size <= 72) - { - modified.FontSize = size; - } - } - - if (lower.Contains("navy") || lower.Contains("dark")) modified.TextColorHex = "#0F172A"; - else if (lower.Contains("blue")) modified.TextColorHex = "#0F6CBD"; - else if (lower.Contains("red")) modified.TextColorHex = "#DC2626"; - else if (lower.Contains("emerald") || lower.Contains("green")) modified.TextColorHex = "#059669"; - - return modified; - } - - if (currentModel is PdfImageElement img) - { - var modified = (PdfImageElement)img.Clone(); - - if (lower.Contains("opacity") || lower.Contains("transparent") || lower.Contains("fade")) - { - var match = Regex.Match(prompt, @"(\d+)\s*%", RegexOptions.IgnoreCase); - if (match.Success && double.TryParse(match.Groups[1].Value, out double pct)) - { - modified.Opacity = Math.Clamp(pct / 100.0, 0.05, 1.0); - } - else - { - modified.Opacity = 0.7; - } - } - - if (lower.Contains("round") || lower.Contains("border")) - { - modified.CornerRadius = 8; - modified.BorderThickness = 1.5; - modified.BorderColorHex = "#0F6CBD"; - } - - return modified; - } - - if (currentModel is PdfSvgElement svg) - { - var modified = (PdfSvgElement)svg.Clone(); - - if (lower.Contains("gold")) modified.TintColorHex = "#D97706"; - else if (lower.Contains("blue")) modified.TintColorHex = "#0F6CBD"; - else if (lower.Contains("green") || lower.Contains("emerald")) modified.TintColorHex = "#16A34A"; - else if (lower.Contains("purple")) modified.TintColorHex = "#7C3AED"; - else if (lower.Contains("slate") || lower.Contains("dark")) modified.TintColorHex = "#1E293B"; - - return modified; - } - - if (currentModel is PdfDividerElement div) - { - var modified = (PdfDividerElement)div.Clone(); - - if (lower.Contains("thick")) modified.Thickness = Math.Max(2.5, modified.Thickness * 1.5); - else if (lower.Contains("thin")) modified.Thickness = Math.Max(0.5, modified.Thickness * 0.5); - - if (lower.Contains("blue")) modified.ColorHex = "#0F6CBD"; - else if (lower.Contains("emerald") || lower.Contains("green")) modified.ColorHex = "#10B981"; - else if (lower.Contains("slate") || lower.Contains("gray")) modified.ColorHex = "#CBD5E1"; - else if (lower.Contains("purple")) modified.ColorHex = "#7C3AED"; - - return modified; - } - - if (currentModel is PdfQrCodeElement qr) - { - var modified = (PdfQrCodeElement)qr.Clone(); - var urlMatch = Regex.Match(prompt, @"(https?://[^\s]+)", RegexOptions.IgnoreCase); - if (urlMatch.Success) modified.Content = urlMatch.Groups[1].Value; - - if (lower.Contains("dark") || lower.Contains("navy") || lower.Contains("slate")) modified.DarkColorHex = "#1E293B"; - else if (lower.Contains("blue")) modified.DarkColorHex = "#0F6CBD"; - - return modified; - } - - if (currentModel is PdfBarcodeElement barcode) - { - var modified = (PdfBarcodeElement)barcode.Clone(); - var codeMatch = Regex.Match(prompt, @"(?:to|is|value|code)\s+([A-Za-z0-9\-_]+)", RegexOptions.IgnoreCase); - if (codeMatch.Success) modified.CodeValue = codeMatch.Groups[1].Value; - - if (lower.Contains("blue")) modified.BarColorHex = "#0F6CBD"; - else if (lower.Contains("slate") || lower.Contains("dark")) modified.BarColorHex = "#1E293B"; - - return modified; - } - - if (currentModel is PdfStickyNoteElement note) - { - var modified = (PdfStickyNoteElement)note.Clone(); - - if (lower.Contains("yellow") || lower.Contains("amber")) modified.ColorHex = "#FEF3C7"; - else if (lower.Contains("blue")) modified.ColorHex = "#E0F2FE"; - else if (lower.Contains("green") || lower.Contains("mint")) modified.ColorHex = "#DCFCE7"; - else if (lower.Contains("pink") || lower.Contains("rose")) modified.ColorHex = "#FFE4E6"; - - if (lower.Contains("approve") || lower.Contains("approved")) modified.Status = "Approved"; - else if (lower.Contains("review")) modified.Status = "In Review"; - - return modified; - } - - if (currentModel is PdfFormFieldElement form) - { - var modified = (PdfFormFieldElement)form.Clone(); - - if (lower.Contains("required")) modified.IsRequired = true; - else if (lower.Contains("optional")) modified.IsRequired = false; - - var labelMatch = Regex.Match(prompt, """(?:label\s*(?:to|is|:)\s*|name\s*(?:to)?\s*)["']?([^"'\r\n]+)["']?""", RegexOptions.IgnoreCase); - if (labelMatch.Success && !string.IsNullOrWhiteSpace(labelMatch.Groups[1].Value)) - { - modified.Label = labelMatch.Groups[1].Value.Trim(); - } - - if (lower.Contains("blue")) modified.BorderColorHex = "#0F6CBD"; - else if (lower.Contains("emerald") || lower.Contains("green")) modified.BorderColorHex = "#059669"; - - return modified; - } - - return null; - } - - #region Element Factory Methods - - private static TextElementViewModel CreateHeadingElement( - string text, double x, double y, double width, double height, - double fontSize, string fontFamily, string textColorHex, bool isBold, string alignment) - { - return new TextElementViewModel - { - X = Math.Max(0, x), - Y = Math.Max(0, y), - Width = Math.Max(60, width), - Height = Math.Max(24, height), - Text = text, - FontSize = fontSize > 0 ? fontSize : 24, - FontFamily = string.IsNullOrWhiteSpace(fontFamily) ? "Georgia" : fontFamily, - TextColorHex = string.IsNullOrWhiteSpace(textColorHex) ? "#111827" : textColorHex, - IsBold = isBold, - ZIndex = 1000 - }; - } - - private static TextElementViewModel CreateParagraphElement( - string text, double x, double y, double width, double height, - double fontSize, string fontFamily, string textColorHex, string alignment) - { - return new TextElementViewModel - { - X = Math.Max(0, x), - Y = Math.Max(0, y), - Width = Math.Max(60, width), - Height = Math.Max(30, height), - Text = text, - FontSize = fontSize > 0 ? fontSize : 12, - FontFamily = string.IsNullOrWhiteSpace(fontFamily) ? "Inter" : fontFamily, - TextColorHex = string.IsNullOrWhiteSpace(textColorHex) ? "#374151" : textColorHex, - ZIndex = 1000 - }; - } - - private static ShapeElementViewModel CreateShapeElement( - string shapeTypeStr, double x, double y, double width, double height, - string fillColorHex, string strokeColorHex, double strokeThickness, double cornerRadius) - { - var shapeType = ShapeType.RoundedRectangle; - if (Enum.TryParse(shapeTypeStr, true, out var parsed)) - { - shapeType = parsed; - } - - return new ShapeElementViewModel - { - X = Math.Max(0, x), - Y = Math.Max(0, y), - Width = Math.Max(20, width), - Height = Math.Max(10, height), - ShapeType = shapeType, - FillColorHex = string.IsNullOrWhiteSpace(fillColorHex) ? "#F0F7FD" : fillColorHex, - StrokeColorHex = string.IsNullOrWhiteSpace(strokeColorHex) ? "#0F6CBD" : strokeColorHex, - StrokeThickness = strokeThickness >= 0 ? strokeThickness : 1.0, - CornerRadius = cornerRadius >= 0 ? cornerRadius : 6.0, - ZIndex = 100 // Background shape layer - }; - } - - private static TableElementViewModel CreateTableElement( - string[]? headers, string[][]? rows, double x, double y, double width, double height, - string headerBgColorHex, string headerTextColorHex) - { - var table = new TableElementViewModel - { - X = Math.Max(0, x), - Y = Math.Max(0, y), - Width = Math.Max(200, width), - Height = Math.Max(80, height), - HeaderBackgroundHex = string.IsNullOrWhiteSpace(headerBgColorHex) ? "#0F6CBD" : headerBgColorHex, - HeaderTextHex = string.IsNullOrWhiteSpace(headerTextColorHex) ? "#FFFFFF" : headerTextColorHex, - ZIndex = 500 - }; - - if (headers != null && headers.Length > 0) - { - table.Headers.Clear(); - foreach (var h in headers) - { - table.Headers.Add(new TableHeaderItem(h)); - } - } - - if (rows != null && rows.Length > 0) - { - table.Rows.Clear(); - foreach (var row in rows) - { - table.Rows.Add(new TableRowItem(row)); - } - } - - return table; - } - - private static DividerElementViewModel CreateDividerElement( - double x, double y, double width, double height, - string colorHex, double thickness, string orientation) - { - bool isVertical = orientation.Equals("Vertical", StringComparison.OrdinalIgnoreCase); - - return new DividerElementViewModel - { - X = Math.Max(0, x), - Y = Math.Max(0, y), - Width = Math.Max(10, width), - Height = isVertical ? Math.Max(10, height) : 2, - ColorHex = string.IsNullOrWhiteSpace(colorHex) ? "#CBD5E1" : colorHex, - Thickness = thickness > 0 ? thickness : 1.0, - IsVertical = isVertical, - ZIndex = 600 - }; - } - - private static ShapeElementViewModel CreateBadgeElement( - string text, double x, double y, double width, double height, - string bgColorHex, string textColorHex) - { - return new ShapeElementViewModel - { - X = Math.Max(0, x), - Y = Math.Max(0, y), - Width = Math.Max(60, width), - Height = Math.Max(22, height), - ShapeType = ShapeType.RoundedRectangle, - FillColorHex = string.IsNullOrWhiteSpace(bgColorHex) ? "#EFF6FF" : bgColorHex, - StrokeColorHex = string.IsNullOrWhiteSpace(textColorHex) ? "#1D4ED8" : textColorHex, - StrokeThickness = 1.0, - CornerRadius = height / 2.0, // Pill badge - Label = text, - LabelColorHex = textColorHex, - LabelFontSize = 11, - ZIndex = 800 - }; - } - - private static List CreateCardElements( - string title, string subtitle, string body, - double x, double y, double width, double height, string themeColorHex) - { - var list = new List(); - - // 1. Background Card Shape (ZIndex = 50) - var cardShape = new ShapeElementViewModel - { - X = x, - Y = y, - Width = width, - Height = height, - ShapeType = ShapeType.RoundedRectangle, - FillColorHex = "#F8FAFC", - StrokeColorHex = string.IsNullOrWhiteSpace(themeColorHex) ? "#0F6CBD" : themeColorHex, - StrokeThickness = 1.2, - CornerRadius = 10, - ZIndex = 50 - }; - list.Add(cardShape); - - // 2. Title Text - var titleEl = new TextElementViewModel - { - X = x + 16, - Y = y + 14, - Width = width - 32, - Height = 26, - Text = title, - FontSize = 15, - FontFamily = "Georgia", - IsBold = true, - TextColorHex = "#0F172A", - ZIndex = 1000 - }; - list.Add(titleEl); - - double contentY = y + 42; - - // 3. Subtitle Text (if present) - if (!string.IsNullOrWhiteSpace(subtitle)) - { - var subEl = new TextElementViewModel - { - X = x + 16, - Y = contentY, - Width = width - 32, - Height = 20, - Text = subtitle, - FontSize = 11, - FontFamily = "Inter", - TextColorHex = string.IsNullOrWhiteSpace(themeColorHex) ? "#0F6CBD" : themeColorHex, - ZIndex = 1000 - }; - list.Add(subEl); - contentY += 24; - } - - // 4. Body Text - if (!string.IsNullOrWhiteSpace(body)) - { - var bodyEl = new TextElementViewModel - { - X = x + 16, - Y = contentY, - Width = width - 32, - Height = Math.Max(30, (y + height) - contentY - 14), - Text = body, - FontSize = 11.5, - FontFamily = "Inter", - TextColorHex = "#334155", - ZIndex = 1000 - }; - list.Add(bodyEl); - } - - return list; - } - - private static SvgElementViewModel CreateSvgOrnamentElement( - string ornamentName, double x, double y, double width, double height, string colorHex) - { - string svg = SvgOrnamentLibrary.GetSvg(ornamentName, colorHex); - return new SvgElementViewModel - { - X = Math.Max(0, x), - Y = Math.Max(0, y), - Width = Math.Max(20, width), - Height = Math.Max(20, height), - SvgSource = svg, - PresetName = ornamentName, - TintColorHex = colorHex, - ZIndex = 700 - }; - } - - private static QrCodeElementViewModel CreateQrCodeElement(string payload, double x, double y, double size) - { - double dim = Math.Max(40, size); - return new QrCodeElementViewModel - { - X = Math.Max(0, x), - Y = Math.Max(0, y), - Width = dim, - Height = dim, - Content = string.IsNullOrWhiteSpace(payload) ? "https://github.com/PrashantUnity/PDFCreator" : payload, - ZIndex = 800 - }; - } - - private static BarcodeElementViewModel CreateBarcodeElement(string payload, string format, double x, double y, double width, double height) - { - return new BarcodeElementViewModel - { - X = Math.Max(0, x), - Y = Math.Max(0, y), - Width = Math.Max(100, width), - Height = Math.Max(30, height), - CodeValue = string.IsNullOrWhiteSpace(payload) ? "DOC-2026-001" : payload, - BarcodeFormat = string.IsNullOrWhiteSpace(format) ? "Code128" : format, - ZIndex = 800 - }; - } - - #endregion - - #region JSON Fallback Parsing - - private void ParseAndExecuteJsonFallback( - string text, - PageViewModel page, - List created, - List actions, - Action? progress, - (double X, double Y)? targetPoint = null) - { - var match = Regex.Match(text, """\[[\s\S]*\]"""); - if (!match.Success) return; - - try - { - using var doc = JsonDocument.Parse(match.Value); - if (doc.RootElement.ValueKind != JsonValueKind.Array) return; - - double defaultX = targetPoint?.X ?? 40; - double defaultY = targetPoint?.Y ?? 40; - - foreach (var item in doc.RootElement.EnumerateArray()) - { - if (!item.TryGetProperty("action", out var actionProp)) continue; - string action = actionProp.GetString() ?? ""; - - double x = GetDouble(item, "x", defaultX); - double y = GetDouble(item, "y", defaultY); - double w = GetDouble(item, "width", 300); - double h = GetDouble(item, "height", 50); - - switch (action.ToLowerInvariant()) - { - case "addheading": - { - string txt = GetString(item, "text", "Heading"); - double fontSize = GetDouble(item, "fontSize", 24); - string color = GetString(item, "textColorHex", "#111827"); - var el = CreateHeadingElement(txt, x, y, w, h, fontSize, "Georgia", color, true, "Left"); - page.AddElement(el); - created.Add(el); - actions.Add($"Heading: \"{Truncate(txt, 20)}\""); - progress?.Invoke($"Created Heading: \"{Truncate(txt, 20)}\""); - break; - } - case "addparagraph": - { - string txt = GetString(item, "text", "Paragraph text"); - double fontSize = GetDouble(item, "fontSize", 12); - string color = GetString(item, "textColorHex", "#374151"); - var el = CreateParagraphElement(txt, x, y, w, h, fontSize, "Inter", color, "Left"); - page.AddElement(el); - created.Add(el); - actions.Add($"Paragraph: \"{Truncate(txt, 20)}\""); - progress?.Invoke($"Created Paragraph: \"{Truncate(txt, 20)}\""); - break; - } - case "addshape": - { - string shape = GetString(item, "shapeType", "RoundedRectangle"); - string fill = GetString(item, "fillColorHex", "#F0F7FD"); - string stroke = GetString(item, "strokeColorHex", "#0F6CBD"); - double radius = GetDouble(item, "cornerRadius", 6); - var el = CreateShapeElement(shape, x, y, w, h, fill, stroke, 1.0, radius); - page.AddElement(el); - created.Add(el); - actions.Add($"Shape: {shape}"); - progress?.Invoke($"Created Shape: {shape}"); - break; - } - case "adddivider": - { - string color = GetString(item, "colorHex", "#CBD5E1"); - var el = CreateDividerElement(x, y, w, h, color, 1.0, "Horizontal"); - page.AddElement(el); - created.Add(el); - actions.Add("Divider line"); - progress?.Invoke("Created Divider"); - break; - } - case "addbadge": - { - string txt = GetString(item, "text", "STATUS"); - string bg = GetString(item, "bgColorHex", "#EFF6FF"); - string textCol = GetString(item, "textColorHex", "#1D4ED8"); - var el = CreateBadgeElement(txt, x, y, w, h, bg, textCol); - page.AddElement(el); - created.Add(el); - actions.Add($"Badge: \"{txt}\""); - progress?.Invoke($"Created Badge: \"{txt}\""); - break; - } - } - } - } - catch - { - // JSON fallback parsing failed; proceed without crash - } - } - - private static double GetDouble(JsonElement el, string prop, double fallback) - { - if (el.TryGetProperty(prop, out var p) && p.TryGetDouble(out var v)) return v; - return fallback; - } - - private static string GetString(JsonElement el, string prop, string fallback) - { - if (el.TryGetProperty(prop, out var p)) return p.GetString() ?? fallback; - return fallback; - } - - private static string Truncate(string str, int maxLen) - { - if (string.IsNullOrEmpty(str)) return ""; - return str.Length <= maxLen ? str : str[..maxLen] + "..."; - } - - #endregion -} diff --git a/src/PdfEditorApp/Services/AI/Providers/GroqAiProvider.cs b/src/PdfEditorApp/Services/AI/Providers/GroqAiProvider.cs deleted file mode 100644 index cf5f9d7..0000000 --- a/src/PdfEditorApp/Services/AI/Providers/GroqAiProvider.cs +++ /dev/null @@ -1,73 +0,0 @@ -using System; -using System.ClientModel; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Extensions.AI; -using OpenAI; -using OpenAI.Chat; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Plugins.Descriptors; -using PdfEditorApp.Models; - -namespace PdfEditorApp.Services.AI.Providers; - -public class GroqAiProvider : IAiProvider -{ - public string ProviderId => "groq"; - public string DisplayName => "Groq (Ultra-Fast Cloud LPU)"; - public bool RequiresApiKey => true; - public bool SupportsCustomEndpoint => true; - public string DefaultEndpoint => "https://api.groq.com/openai/v1"; - public string IconKind => "LightningBoltOutline"; - - public Task> GetModelsAsync(AiSettingsModel settings, CancellationToken ct = default) - { - var models = new List - { - new() { Id = "llama-3.3-70b-versatile", DisplayName = "Llama 3.3 (70B Versatile)", Provider = AiProviderType.CustomOpenAiCompatible, Tier = AiModelTier.PaidCloud, ParameterSize = "70B" }, - new() { Id = "mixtral-8x7b-32768", DisplayName = "Mixtral (8x7B MoE)", Provider = AiProviderType.CustomOpenAiCompatible, Tier = AiModelTier.PaidCloud, ParameterSize = "8x7B" }, - new() { Id = "deepseek-r1-distill-llama-70b", DisplayName = "DeepSeek R1 Distill (70B)", Provider = AiProviderType.CustomOpenAiCompatible, Tier = AiModelTier.PaidCloud, ParameterSize = "70B" } - }; - return Task.FromResult>(models); - } - - public IChatClient CreateChatClient(AiSettingsModel settings) - { - string apiKey = string.IsNullOrWhiteSpace(settings.OpenAiApiKey) - ? "dummy-key" - : settings.OpenAiApiKey.Trim(); - - string model = string.IsNullOrWhiteSpace(settings.CustomModelName) - ? (string.IsNullOrWhiteSpace(settings.SelectedModelId) ? "llama-3.3-70b-versatile" : settings.SelectedModelId) - : settings.CustomModelName.Trim(); - - string baseUrl = string.IsNullOrWhiteSpace(settings.CustomBaseUrl) - ? DefaultEndpoint - : settings.CustomBaseUrl.TrimEnd('/'); - - var client = new ChatClient( - model, - new ApiKeyCredential(apiKey), - new OpenAIClientOptions { Endpoint = new Uri(baseUrl) }); - - return client.AsIChatClient(); - } - - public async Task<(bool Success, string Message, TimeSpan Latency)> TestConnectionAsync(AiSettingsModel settings, CancellationToken ct = default) - { - var sw = System.Diagnostics.Stopwatch.StartNew(); - try - { - var client = CreateChatClient(settings); - var response = await client.GetResponseAsync("Ping", new ChatOptions { MaxOutputTokens = 10 }, ct); - sw.Stop(); - return (true, "Connected to Groq", sw.Elapsed); - } - catch (Exception ex) - { - sw.Stop(); - return (false, ex.Message, sw.Elapsed); - } - } -} diff --git a/src/PdfEditorApp/Services/AI/Providers/OllamaAiProvider.cs b/src/PdfEditorApp/Services/AI/Providers/OllamaAiProvider.cs deleted file mode 100644 index 28da022..0000000 --- a/src/PdfEditorApp/Services/AI/Providers/OllamaAiProvider.cs +++ /dev/null @@ -1,72 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Net.Http; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Extensions.AI; -using OllamaSharp; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Plugins.Descriptors; -using PdfEditorApp.Models; - -namespace PdfEditorApp.Services.AI.Providers; - -public class OllamaAiProvider : IAiProvider -{ - public string ProviderId => "ollama"; - public string DisplayName => "Ollama (Local Private AI)"; - public bool RequiresApiKey => false; - public bool SupportsCustomEndpoint => true; - public string DefaultEndpoint => "http://localhost:11434"; - public string IconKind => "Laptop"; - - public Task> GetModelsAsync(AiSettingsModel settings, CancellationToken ct = default) - { - var models = new List - { - new() { Id = "llama3.2", DisplayName = "Llama 3.2 (3B)", Provider = AiProviderType.OllamaLocal, Tier = AiModelTier.FreeLocal, ParameterSize = "3B" }, - new() { Id = "mistral", DisplayName = "Mistral (7B)", Provider = AiProviderType.OllamaLocal, Tier = AiModelTier.FreeLocal, ParameterSize = "7B" }, - new() { Id = "deepseek-r1:8b", DisplayName = "DeepSeek R1 (8B)", Provider = AiProviderType.OllamaLocal, Tier = AiModelTier.FreeLocal, ParameterSize = "8B" }, - new() { Id = "qwen2.5:7b", DisplayName = "Qwen 2.5 (7B)", Provider = AiProviderType.OllamaLocal, Tier = AiModelTier.FreeLocal, ParameterSize = "7B" } - }; - return Task.FromResult>(models); - } - - public IChatClient CreateChatClient(AiSettingsModel settings) - { - string endpoint = string.IsNullOrWhiteSpace(settings.OllamaEndpoint) - ? DefaultEndpoint - : settings.OllamaEndpoint.TrimEnd('/'); - - string model = string.IsNullOrWhiteSpace(settings.SelectedModelId) - ? "llama3.2" - : settings.SelectedModelId; - - if (!string.IsNullOrWhiteSpace(settings.OllamaApiKey)) - { - var httpClient = new HttpClient { BaseAddress = new Uri(endpoint), Timeout = TimeSpan.FromSeconds(60) }; - httpClient.DefaultRequestHeaders.Authorization = - new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", settings.OllamaApiKey.Trim()); - return new OllamaApiClient(httpClient, model); - } - - return new OllamaApiClient(new Uri(endpoint), model); - } - - public async Task<(bool Success, string Message, TimeSpan Latency)> TestConnectionAsync(AiSettingsModel settings, CancellationToken ct = default) - { - var sw = System.Diagnostics.Stopwatch.StartNew(); - try - { - var client = CreateChatClient(settings); - var response = await client.GetResponseAsync("Ping", new ChatOptions { MaxOutputTokens = 10 }, ct); - sw.Stop(); - return (true, "Connected to Ollama", sw.Elapsed); - } - catch (Exception ex) - { - sw.Stop(); - return (false, ex.Message, sw.Elapsed); - } - } -} diff --git a/src/PdfEditorApp/Services/AI/Providers/OpenAiProvider.cs b/src/PdfEditorApp/Services/AI/Providers/OpenAiProvider.cs deleted file mode 100644 index 10e5e26..0000000 --- a/src/PdfEditorApp/Services/AI/Providers/OpenAiProvider.cs +++ /dev/null @@ -1,63 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Extensions.AI; -using OpenAI.Chat; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Plugins.Descriptors; -using PdfEditorApp.Models; - -namespace PdfEditorApp.Services.AI.Providers; - -public class OpenAiProvider : IAiProvider -{ - public string ProviderId => "openai"; - public string DisplayName => "OpenAI Official Cloud API"; - public bool RequiresApiKey => true; - public bool SupportsCustomEndpoint => false; - public string DefaultEndpoint => "https://api.openai.com/v1"; - public string IconKind => "Brain"; - - public Task> GetModelsAsync(AiSettingsModel settings, CancellationToken ct = default) - { - var models = new List - { - new() { Id = "gpt-4o", DisplayName = "GPT-4o (Omni)", Provider = AiProviderType.OpenAiCloud, Tier = AiModelTier.PaidCloud, ParameterSize = "Flagship" }, - new() { Id = "gpt-4o-mini", DisplayName = "GPT-4o Mini", Provider = AiProviderType.OpenAiCloud, Tier = AiModelTier.PaidCloud, ParameterSize = "Fast & Cheap" }, - new() { Id = "o1-mini", DisplayName = "o1-mini (Reasoning)", Provider = AiProviderType.OpenAiCloud, Tier = AiModelTier.PaidCloud, ParameterSize = "Reasoning" } - }; - return Task.FromResult>(models); - } - - public IChatClient CreateChatClient(AiSettingsModel settings) - { - string apiKey = string.IsNullOrWhiteSpace(settings.OpenAiApiKey) - ? "dummy-key" - : settings.OpenAiApiKey.Trim(); - - string model = string.IsNullOrWhiteSpace(settings.SelectedModelId) - ? "gpt-4o-mini" - : settings.SelectedModelId; - - var client = new ChatClient(model, apiKey); - return client.AsIChatClient(); - } - - public async Task<(bool Success, string Message, TimeSpan Latency)> TestConnectionAsync(AiSettingsModel settings, CancellationToken ct = default) - { - var sw = System.Diagnostics.Stopwatch.StartNew(); - try - { - var client = CreateChatClient(settings); - var response = await client.GetResponseAsync("Ping", new ChatOptions { MaxOutputTokens = 10 }, ct); - sw.Stop(); - return (true, "Connected to OpenAI", sw.Elapsed); - } - catch (Exception ex) - { - sw.Stop(); - return (false, ex.Message, sw.Elapsed); - } - } -} diff --git a/src/PdfEditorApp/Services/BatchPdfGeneratorService.cs b/src/PdfEditorApp/Services/BatchPdfGeneratorService.cs deleted file mode 100644 index e5209f6..0000000 --- a/src/PdfEditorApp/Services/BatchPdfGeneratorService.cs +++ /dev/null @@ -1,444 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Globalization; -using System.IO; -using System.IO.Compression; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using PdfEditorApp.Core.Data; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Models; - -namespace PdfEditorApp.Services; - -public class BatchPdfGeneratorService : IBatchPdfGenerator -{ - private readonly IDataMergeEngine _mergeEngine; - private readonly IPdfExportService _exportService; - - public BatchPdfGeneratorService(IDataMergeEngine mergeEngine, IPdfExportService exportService) - { - _mergeEngine = mergeEngine ?? throw new ArgumentNullException(nameof(mergeEngine)); - _exportService = exportService ?? throw new ArgumentNullException(nameof(exportService)); - } - - public async Task GenerateBatchAsync( - PdfDocumentModel template, - DataMatrix matrix, - IReadOnlyList? mappings, - BatchGenerationConfig config, - IProgress? progress = null, - CancellationToken cancellationToken = default) - { - if (template == null) throw new ArgumentNullException(nameof(template)); - if (matrix == null) throw new ArgumentNullException(nameof(matrix)); - if (config == null) throw new ArgumentNullException(nameof(config)); - - var stopwatch = Stopwatch.StartNew(); - var result = new BatchGenerationResult(); - - int totalRows = matrix.RowCount; - if (config.MaxRecordCount.HasValue && config.MaxRecordCount.Value > 0) - { - totalRows = Math.Min(totalRows, config.MaxRecordCount.Value); - } - - if (totalRows == 0) - { - stopwatch.Stop(); - result.ElapsedTime = stopwatch.Elapsed; - return result; - } - - // Ensure output directories exist - if (!string.IsNullOrEmpty(config.OutputDirectory) && !Directory.Exists(config.OutputDirectory)) - { - Directory.CreateDirectory(config.OutputDirectory); - } - - if (config.OutputMode != BatchOutputMode.SeparateFiles && !string.IsNullOrEmpty(config.OutputFilePath)) - { - string? dir = Path.GetDirectoryName(config.OutputFilePath); - if (!string.IsNullOrEmpty(dir) && !Directory.Exists(dir)) - { - Directory.CreateDirectory(dir); - } - } - - await Task.Run(() => - { - if (config.OutputMode == BatchOutputMode.SingleMergedPdf) - { - GenerateSingleMergedPdf(template, matrix, mappings, config, totalRows, result, progress, cancellationToken); - } - else if (config.OutputMode == BatchOutputMode.ZipArchive) - { - GenerateZipArchive(template, matrix, mappings, config, totalRows, result, progress, cancellationToken); - } - else - { - GenerateSeparateFiles(template, matrix, mappings, config, totalRows, result, progress, cancellationToken); - } - }, cancellationToken); - - stopwatch.Stop(); - result.ElapsedTime = stopwatch.Elapsed; - return result; - } - - private void GenerateSeparateFiles( - PdfDocumentModel template, - DataMatrix matrix, - IReadOnlyList? mappings, - BatchGenerationConfig config, - int totalRows, - BatchGenerationResult result, - IProgress? progress, - CancellationToken cancellationToken) - { - string outDir = string.IsNullOrWhiteSpace(config.OutputDirectory) ? Directory.GetCurrentDirectory() : config.OutputDirectory; - - for (int r = 0; r < totalRows; r++) - { - cancellationToken.ThrowIfCancellationRequested(); - - var record = BuildRecordDictionary(matrix, r, mappings); - if (config.SkipEmptyRows && record.Values.All(string.IsNullOrWhiteSpace)) - { - continue; - } - - result.TotalProcessed++; - - try - { - // Hydrate template - var hydratedDoc = _mergeEngine.HydrateDocument(template, record); - - // Determine dynamic filename - string filename = ResolveFilename(config.FilenamePattern, record, r + 1); - string filePath = Path.Combine(outDir, filename); - - // Handle unique filename collisions - filePath = EnsureUniqueFilePath(filePath); - - // Export to PDF - byte[] pdfBytes = _exportService.GeneratePdfBytes(hydratedDoc); - File.WriteAllBytes(filePath, pdfBytes); - - result.GeneratedFiles.Add(filePath); - result.SuccessfulCount++; - - progress?.Report(new BatchProgressReport - { - CurrentIndex = r + 1, - TotalCount = totalRows, - CurrentItemName = Path.GetFileName(filePath), - SucceededCount = result.SuccessfulCount, - FailedCount = result.FailedCount, - StatusMessage = $"Generated {Path.GetFileName(filePath)} ({r + 1}/{totalRows})" - }); - } - catch (Exception ex) - { - result.FailedCount++; - result.Errors.Add((r, ex.Message)); - - progress?.Report(new BatchProgressReport - { - CurrentIndex = r + 1, - TotalCount = totalRows, - CurrentItemName = $"Row {r + 1}", - SucceededCount = result.SuccessfulCount, - FailedCount = result.FailedCount, - StatusMessage = $"Error on row {r + 1}: {ex.Message}" - }); - } - } - } - - private void GenerateSingleMergedPdf( - PdfDocumentModel template, - DataMatrix matrix, - IReadOnlyList? mappings, - BatchGenerationConfig config, - int totalRows, - BatchGenerationResult result, - IProgress? progress, - CancellationToken cancellationToken) - { - string targetFilePath = !string.IsNullOrEmpty(config.OutputFilePath) - ? config.OutputFilePath - : Path.Combine(string.IsNullOrWhiteSpace(config.OutputDirectory) ? Directory.GetCurrentDirectory() : config.OutputDirectory, "Merged_Batch_Output.pdf"); - - var mergedDoc = template.Clone(); - mergedDoc.Pages.Clear(); - int globalPageNum = 1; - - for (int r = 0; r < totalRows; r++) - { - cancellationToken.ThrowIfCancellationRequested(); - - var record = BuildRecordDictionary(matrix, r, mappings); - if (config.SkipEmptyRows && record.Values.All(string.IsNullOrWhiteSpace)) - { - continue; - } - - result.TotalProcessed++; - - try - { - var hydratedDoc = _mergeEngine.HydrateDocument(template, record); - foreach (var page in hydratedDoc.Pages) - { - var pageClone = page.Clone(); - pageClone.PageNumber = globalPageNum++; - mergedDoc.Pages.Add(pageClone); - } - - result.SuccessfulCount++; - - progress?.Report(new BatchProgressReport - { - CurrentIndex = r + 1, - TotalCount = totalRows, - CurrentItemName = $"Record {r + 1}", - SucceededCount = result.SuccessfulCount, - FailedCount = result.FailedCount, - StatusMessage = $"Prepared record {r + 1} of {totalRows}" - }); - } - catch (Exception ex) - { - result.FailedCount++; - result.Errors.Add((r, ex.Message)); - } - } - - if (mergedDoc.Pages.Count > 0) - { - byte[] pdfBytes = _exportService.GeneratePdfBytes(mergedDoc); - File.WriteAllBytes(targetFilePath, pdfBytes); - result.OutputMergedFilePath = targetFilePath; - result.GeneratedFiles.Add(targetFilePath); - } - } - - private void GenerateZipArchive( - PdfDocumentModel template, - DataMatrix matrix, - IReadOnlyList? mappings, - BatchGenerationConfig config, - int totalRows, - BatchGenerationResult result, - IProgress? progress, - CancellationToken cancellationToken) - { - string zipFilePath = !string.IsNullOrEmpty(config.OutputFilePath) - ? config.OutputFilePath - : Path.Combine(string.IsNullOrWhiteSpace(config.OutputDirectory) ? Directory.GetCurrentDirectory() : config.OutputDirectory, "Batch_PDFs_Archive.zip"); - - using (var fileStream = new FileStream(zipFilePath, FileMode.Create, FileAccess.Write, FileShare.None)) - using (var zipArchive = new ZipArchive(fileStream, ZipArchiveMode.Create, true)) - { - var addedNames = new HashSet(StringComparer.OrdinalIgnoreCase); - - for (int r = 0; r < totalRows; r++) - { - cancellationToken.ThrowIfCancellationRequested(); - - var record = BuildRecordDictionary(matrix, r, mappings); - if (config.SkipEmptyRows && record.Values.All(string.IsNullOrWhiteSpace)) - { - continue; - } - - result.TotalProcessed++; - - try - { - var hydratedDoc = _mergeEngine.HydrateDocument(template, record); - string filename = ResolveFilename(config.FilenamePattern, record, r + 1); - - // Ensure unique name in zip - int counter = 1; - string entryName = filename; - string nameNoExt = Path.GetFileNameWithoutExtension(filename); - string ext = Path.GetExtension(filename); - - while (addedNames.Contains(entryName)) - { - entryName = $"{nameNoExt}_{counter++}{ext}"; - } - addedNames.Add(entryName); - - byte[] pdfBytes = _exportService.GeneratePdfBytes(hydratedDoc); - var entry = zipArchive.CreateEntry(entryName, CompressionLevel.Optimal); - using (var entryStream = entry.Open()) - { - entryStream.Write(pdfBytes, 0, pdfBytes.Length); - } - - result.SuccessfulCount++; - - progress?.Report(new BatchProgressReport - { - CurrentIndex = r + 1, - TotalCount = totalRows, - CurrentItemName = entryName, - SucceededCount = result.SuccessfulCount, - FailedCount = result.FailedCount, - StatusMessage = $"Archived {entryName} ({r + 1}/{totalRows})" - }); - } - catch (Exception ex) - { - result.FailedCount++; - result.Errors.Add((r, ex.Message)); - } - } - } - - result.OutputZipFilePath = zipFilePath; - result.GeneratedFiles.Add(zipFilePath); - } - - public static Dictionary BuildRecordDictionary(DataMatrix matrix, int rowIndex, IReadOnlyList? mappings) - { - var dict = new Dictionary(StringComparer.OrdinalIgnoreCase); - - // 1. First add all direct matrix columns - for (int c = 0; c < matrix.ColumnCount; c++) - { - string header = matrix.Headers[c]; - string val = matrix.GetCellValue(rowIndex, c); - dict[header] = val; - } - - // Add standard systemic variables - dict["Index"] = (rowIndex + 1).ToString(); - dict["RowNumber"] = (rowIndex + 1).ToString(); - dict["TotalRecords"] = matrix.RowCount.ToString(); - dict["CurrentDate"] = DateTime.Now.ToString("yyyy-MM-dd"); - dict["CurrentYear"] = DateTime.Now.Year.ToString(); - dict["CurrentMonth"] = DateTime.Now.ToString("MMMM"); - - // 2. Overlay custom mappings - if (mappings != null) - { - foreach (var m in mappings) - { - if (string.IsNullOrWhiteSpace(m.PlaceholderTag)) continue; - - string val = string.Empty; - if (!string.IsNullOrWhiteSpace(m.DataColumnName) && dict.TryGetValue(m.DataColumnName, out var mappedVal)) - { - val = mappedVal; - } - - if (string.IsNullOrWhiteSpace(val) && !string.IsNullOrWhiteSpace(m.DefaultValue)) - { - val = m.DefaultValue; - } - - // Apply transform - val = ApplyFieldTransform(val, m.Transform, m.CustomFormat); - - dict[m.PlaceholderTag] = val; - } - } - - return dict; - } - - private static string ApplyFieldTransform(string val, FieldTransformType transform, string customFormat) - { - if (string.IsNullOrEmpty(val)) return val; - - switch (transform) - { - case FieldTransformType.Uppercase: - return val.ToUpperInvariant(); - - case FieldTransformType.Lowercase: - return val.ToLowerInvariant(); - - case FieldTransformType.TitleCase: - return CultureInfo.CurrentCulture.TextInfo.ToTitleCase(val.ToLowerInvariant()); - - case FieldTransformType.Currency: - if (DataMatrix.TryParseNumeric(val, out double currNum)) - { - return currNum.ToString("C", CultureInfo.CurrentCulture); - } - break; - - case FieldTransformType.Numeric: - if (DataMatrix.TryParseNumeric(val, out double numVal)) - { - string fmt = string.IsNullOrWhiteSpace(customFormat) ? "N2" : customFormat; - return numVal.ToString(fmt, CultureInfo.InvariantCulture); - } - break; - - case FieldTransformType.Percentage: - if (DataMatrix.TryParseNumeric(val, out double pctVal)) - { - return (pctVal / 100.0).ToString("P1", CultureInfo.InvariantCulture); - } - break; - - case FieldTransformType.Date: - if (DateTime.TryParse(val, CultureInfo.InvariantCulture, DateTimeStyles.None, out var dt) || - DateTime.TryParse(val, CultureInfo.CurrentCulture, DateTimeStyles.None, out dt)) - { - string fmt = string.IsNullOrWhiteSpace(customFormat) ? "yyyy-MM-dd" : customFormat; - return dt.ToString(fmt, CultureInfo.InvariantCulture); - } - break; - } - - return val; - } - - private string ResolveFilename(string pattern, IReadOnlyDictionary record, int index) - { - if (string.IsNullOrWhiteSpace(pattern)) - { - pattern = "Document_{{Index}}.pdf"; - } - - string raw = _mergeEngine.EvaluateText(pattern, record); - raw = raw.Replace("{{Index}}", index.ToString()); - - if (!raw.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase)) - { - raw += ".pdf"; - } - - // Sanitize invalid characters - var invalidChars = Path.GetInvalidFileNameChars(); - var sanitized = new string(raw.Select(c => invalidChars.Contains(c) ? '_' : c).ToArray()); - return sanitized; - } - - private static string EnsureUniqueFilePath(string filePath) - { - if (!File.Exists(filePath)) return filePath; - - string dir = Path.GetDirectoryName(filePath) ?? ""; - string name = Path.GetFileNameWithoutExtension(filePath); - string ext = Path.GetExtension(filePath); - - int counter = 1; - while (File.Exists(filePath)) - { - filePath = Path.Combine(dir, $"{name}_{counter++}{ext}"); - } - - return filePath; - } -} diff --git a/src/PdfEditorApp/Services/Canvas/CanvasElementRegistry.cs b/src/PdfEditorApp/Services/Canvas/CanvasElementRegistry.cs deleted file mode 100644 index 7ae8865..0000000 --- a/src/PdfEditorApp/Services/Canvas/CanvasElementRegistry.cs +++ /dev/null @@ -1,377 +0,0 @@ -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Linq; -using Microsoft.Extensions.DependencyInjection; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; -using PdfEditorApp.Core.Plugins.Descriptors; -using PdfEditorApp.ViewModels.ElementViewModels; - -namespace PdfEditorApp.Services.Canvas; - -/// -/// Combined registry and factory interface for canvas element descriptors and ViewModels. -/// -public interface ICanvasElementService : ICanvasElementRegistry -{ - /// Creates and initializes a ViewModel matching the specified domain model. - ElementViewModelBase CreateViewModel(PdfElementBase model); - - /// Creates a default ViewModel for the given element type ID. - ElementViewModelBase CreateViewModel(string elementTypeId); - - /// Clones an element ViewModel by serializing to model and re-instantiating. - ElementViewModelBase CloneViewModel(ElementViewModelBase source); -} - -/// -/// Thread-safe implementation of supporting both -/// core built-in canvas elements and dynamic plugin-contributed element types. -/// -public class CanvasElementRegistry : ICanvasElementService -{ - private readonly IServiceProvider? _serviceProvider; - private readonly ConcurrentDictionary _descriptorsById = new(StringComparer.OrdinalIgnoreCase); - private readonly ConcurrentDictionary _descriptorsByModelType = new(); - - public CanvasElementRegistry(IServiceProvider? serviceProvider = null, bool seedBuiltIns = true) - { - _serviceProvider = serviceProvider; - if (seedBuiltIns) - { - RegisterBuiltInElements(); - } - } - - private void RegisterBuiltInElements() - { - RegisterElement(new CanvasElementDescriptor - { - ElementTypeId = "frypdf.element.text", - DisplayName = "Text Block", - ModelType = typeof(PdfTextElement), - ViewModelType = typeof(TextElementViewModel), - IconKind = "FormatText", - DefaultWidth = 200, - DefaultHeight = 60, - Tags = new[] { "text", "typography", "heading", "label" }, - Factory = (sp, m) => new TextElementViewModel() - }); - - RegisterElement(new CanvasElementDescriptor - { - ElementTypeId = "frypdf.element.image", - DisplayName = "Image", - ModelType = typeof(PdfImageElement), - ViewModelType = typeof(ImageElementViewModel), - IconKind = "ImageOutline", - DefaultWidth = 200, - DefaultHeight = 150, - Tags = new[] { "image", "photo", "bitmap", "picture" }, - Factory = (sp, m) => new ImageElementViewModel() - }); - - RegisterElement(new CanvasElementDescriptor - { - ElementTypeId = "frypdf.element.shape", - DisplayName = "Geometric Shape", - ModelType = typeof(PdfShapeElement), - ViewModelType = typeof(ShapeElementViewModel), - IconKind = "ShapeOutline", - DefaultWidth = 150, - DefaultHeight = 100, - Tags = new[] { "shape", "rectangle", "circle", "arrow", "polygon" }, - Factory = (sp, m) => new ShapeElementViewModel() - }); - - RegisterElement(new CanvasElementDescriptor - { - ElementTypeId = "frypdf.element.divider", - DisplayName = "Divider Line", - ModelType = typeof(PdfDividerElement), - ViewModelType = typeof(DividerElementViewModel), - IconKind = "Minus", - DefaultWidth = 300, - DefaultHeight = 20, - Tags = new[] { "divider", "line", "separator" }, - Factory = (sp, m) => new DividerElementViewModel() - }); - - RegisterElement(new CanvasElementDescriptor - { - ElementTypeId = "frypdf.element.table", - DisplayName = "Data Grid / Table", - ModelType = typeof(PdfTableElement), - ViewModelType = typeof(TableElementViewModel), - IconKind = "Table", - DefaultWidth = 350, - DefaultHeight = 180, - Tags = new[] { "table", "grid", "rows", "columns", "data" }, - Factory = (sp, m) => new TableElementViewModel() - }); - - RegisterElement(new CanvasElementDescriptor - { - ElementTypeId = "frypdf.element.chart", - DisplayName = "Interactive Chart", - ModelType = typeof(PdfChartElement), - ViewModelType = typeof(ChartElementViewModel), - IconKind = "ChartBar", - DefaultWidth = 320, - DefaultHeight = 220, - Tags = new[] { "chart", "bar", "line", "pie", "statistics", "data" }, - Factory = (sp, m) => new ChartElementViewModel() - }); - - RegisterElement(new CanvasElementDescriptor - { - ElementTypeId = "frypdf.element.watermark", - DisplayName = "Watermark", - ModelType = typeof(PdfWatermarkElement), - ViewModelType = typeof(WatermarkElementViewModel), - IconKind = "Watermark", - DefaultWidth = 400, - DefaultHeight = 120, - Tags = new[] { "watermark", "stamp", "draft", "confidential" }, - Factory = (sp, m) => new WatermarkElementViewModel() - }); - - RegisterElement(new CanvasElementDescriptor - { - ElementTypeId = "frypdf.element.formfield", - DisplayName = "Form Field", - ModelType = typeof(PdfFormFieldElement), - ViewModelType = typeof(FormFieldElementViewModel), - IconKind = "TextBoxOutline", - DefaultWidth = 180, - DefaultHeight = 36, - Tags = new[] { "form", "field", "input", "checkbox", "dropdown" }, - Factory = (sp, m) => new FormFieldElementViewModel() - }); - - RegisterElement(new CanvasElementDescriptor - { - ElementTypeId = "frypdf.element.qrcode", - DisplayName = "QR Code", - ModelType = typeof(PdfQrCodeElement), - ViewModelType = typeof(QrCodeElementViewModel), - IconKind = "Qrcode", - DefaultWidth = 120, - DefaultHeight = 120, - Tags = new[] { "qr", "qrcode", "barcode", "link" }, - Factory = (sp, m) => new QrCodeElementViewModel() - }); - - RegisterElement(new CanvasElementDescriptor - { - ElementTypeId = "frypdf.element.barcode", - DisplayName = "Barcode", - ModelType = typeof(PdfBarcodeElement), - ViewModelType = typeof(BarcodeElementViewModel), - IconKind = "Barcode", - DefaultWidth = 200, - DefaultHeight = 80, - Tags = new[] { "barcode", "code128", "ean", "upc" }, - Factory = (sp, m) => new BarcodeElementViewModel() - }); - - RegisterElement(new CanvasElementDescriptor - { - ElementTypeId = "frypdf.element.redaction", - DisplayName = "Redaction Annotation", - ModelType = typeof(PdfRedactionElement), - ViewModelType = typeof(RedactionElementViewModel), - IconKind = "EyeOffOutline", - DefaultWidth = 160, - DefaultHeight = 40, - Tags = new[] { "redact", "redaction", "blackout", "security" }, - Factory = (sp, m) => new RedactionElementViewModel() - }); - - RegisterElement(new CanvasElementDescriptor - { - ElementTypeId = "frypdf.element.ink", - DisplayName = "Freehand Drawing", - ModelType = typeof(PdfInkElement), - ViewModelType = typeof(InkElementViewModel), - IconKind = "Draw", - DefaultWidth = 150, - DefaultHeight = 100, - Tags = new[] { "ink", "draw", "pencil", "pen", "signature" }, - Factory = (sp, m) => new InkElementViewModel() - }); - - RegisterElement(new CanvasElementDescriptor - { - ElementTypeId = "frypdf.element.stickynote", - DisplayName = "Sticky Note", - ModelType = typeof(PdfStickyNoteElement), - ViewModelType = typeof(StickyNoteElementViewModel), - IconKind = "NoteOutline", - DefaultWidth = 180, - DefaultHeight = 140, - Tags = new[] { "note", "sticky", "comment", "annotation" }, - Factory = (sp, m) => new StickyNoteElementViewModel() - }); - - RegisterElement(new CanvasElementDescriptor - { - ElementTypeId = "frypdf.element.measurement", - DisplayName = "Measurement Dimension", - ModelType = typeof(PdfMeasurementElement), - ViewModelType = typeof(MeasurementElementViewModel), - IconKind = "Ruler", - DefaultWidth = 200, - DefaultHeight = 40, - Tags = new[] { "ruler", "measure", "dimension", "distance" }, - Factory = (sp, m) => new MeasurementElementViewModel() - }); - - RegisterElement(new CanvasElementDescriptor - { - ElementTypeId = "frypdf.element.svg", - DisplayName = "Vector SVG Artwork", - ModelType = typeof(PdfSvgElement), - ViewModelType = typeof(SvgElementViewModel), - IconKind = "VectorSquare", - DefaultWidth = 180, - DefaultHeight = 180, - Tags = new[] { "svg", "vector", "graphic", "illustration" }, - Factory = (sp, m) => new SvgElementViewModel() - }); - - RegisterElement(new CanvasElementDescriptor - { - ElementTypeId = "frypdf.element.math", - DisplayName = "LaTeX Math Formula", - ModelType = typeof(PdfMathElement), - ViewModelType = typeof(MathElementViewModel), - IconKind = "FunctionVariant", - DefaultWidth = 200, - DefaultHeight = 80, - Tags = new[] { "math", "formula", "latex", "equation" }, - Factory = (sp, m) => new MathElementViewModel() - }); - } - - public void RegisterElement(CanvasElementDescriptor descriptor) - { - ArgumentNullException.ThrowIfNull(descriptor); - _descriptorsById[descriptor.ElementTypeId] = descriptor; - _descriptorsByModelType[descriptor.ModelType] = descriptor; - } - - public bool UnregisterElement(string elementTypeId) - { - if (_descriptorsById.TryRemove(elementTypeId, out var descriptor)) - { - _descriptorsByModelType.TryRemove(descriptor.ModelType, out _); - return true; - } - return false; - } - - public CanvasElementDescriptor? GetDescriptor(string elementTypeId) - { - return _descriptorsById.TryGetValue(elementTypeId, out var desc) ? desc : null; - } - - public CanvasElementDescriptor? GetDescriptorByModelType(Type modelType) - { - if (_descriptorsByModelType.TryGetValue(modelType, out var desc)) - { - return desc; - } - - // Check assignable types if exact type match not found - foreach (var kvp in _descriptorsByModelType) - { - if (kvp.Key.IsAssignableFrom(modelType)) - { - return kvp.Value; - } - } - - return null; - } - - public IReadOnlyList GetAllDescriptors() - { - return _descriptorsById.Values.ToList(); - } - - public IReadOnlyList GetInsertableElements() - { - return _descriptorsById.Values - .Where(d => d.CanInsertFromToolbar) - .OrderBy(d => d.SortOrder) - .ToList(); - } - - public ElementViewModelBase CreateViewModel(PdfElementBase model) - { - ArgumentNullException.ThrowIfNull(model); - var descriptor = GetDescriptorByModelType(model.GetType()); - - ElementViewModelBase vm; - if (descriptor?.Factory != null) - { - vm = (ElementViewModelBase)descriptor.Factory(_serviceProvider!, model); - } - else if (descriptor != null) - { - if (_serviceProvider != null) - { - vm = (ElementViewModelBase)Microsoft.Extensions.DependencyInjection.ActivatorUtilities.CreateInstance(_serviceProvider, descriptor.ViewModelType); - } - else - { - vm = (ElementViewModelBase)Activator.CreateInstance(descriptor.ViewModelType)!; - } - } - else - { - // Direct fallback to TextElementViewModel - vm = new TextElementViewModel(); - } - - vm.LoadFromModel(model); - return vm; - } - - public ElementViewModelBase CreateViewModel(string elementTypeId) - { - var descriptor = GetDescriptor(elementTypeId); - if (descriptor == null) - { - return new TextElementViewModel(); - } - - ElementViewModelBase vm; - if (descriptor.Factory != null) - { - vm = (ElementViewModelBase)descriptor.Factory(_serviceProvider!, null); - } - else if (_serviceProvider != null) - { - vm = (ElementViewModelBase)Microsoft.Extensions.DependencyInjection.ActivatorUtilities.CreateInstance(_serviceProvider, descriptor.ViewModelType); - } - else - { - vm = (ElementViewModelBase)Activator.CreateInstance(descriptor.ViewModelType)!; - } - - vm.Width = descriptor.DefaultWidth; - vm.Height = descriptor.DefaultHeight; - return vm; - } - - public ElementViewModelBase CloneViewModel(ElementViewModelBase source) - { - ArgumentNullException.ThrowIfNull(source); - var model = source.ToModel(); - var vm = CreateViewModel(model); - return vm; - } -} diff --git a/src/PdfEditorApp/Services/Data/DataConnectorRegistry.cs b/src/PdfEditorApp/Services/Data/DataConnectorRegistry.cs deleted file mode 100644 index dfbb363..0000000 --- a/src/PdfEditorApp/Services/Data/DataConnectorRegistry.cs +++ /dev/null @@ -1,139 +0,0 @@ -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using PdfEditorApp.Core.Data; -using PdfEditorApp.Core.Plugins.Descriptors; - -namespace PdfEditorApp.Services.Data; - -public class DataConnectorRegistry : IDataConnectorRegistry -{ - private readonly ConcurrentDictionary _connectors = new(StringComparer.OrdinalIgnoreCase); - - public event Action? RegistryChanged; - - public DataConnectorRegistry(IDataSourceService? dataSourceService = null) - { - RegisterBuiltInConnectors(dataSourceService ?? new DataSourceService()); - } - - private void RegisterBuiltInConnectors(IDataSourceService ds) - { - RegisterConnector(new CsvDataConnector(ds)); - RegisterConnector(new JsonDataConnector(ds)); - RegisterConnector(new ExcelDataConnector(ds)); - RegisterConnector(new RestApiDataConnector(ds)); - } - - public IDisposable RegisterConnector(IDataConnector connector) - { - ArgumentNullException.ThrowIfNull(connector); - _connectors[connector.ConnectorId] = connector; - RegistryChanged?.Invoke(); - - return new DisposableAction(() => - { - _connectors.TryRemove(connector.ConnectorId, out _); - RegistryChanged?.Invoke(); - }); - } - - public IDataConnector? GetConnector(string connectorId) - { - if (string.IsNullOrWhiteSpace(connectorId)) return null; - return _connectors.GetValueOrDefault(connectorId); - } - - public IReadOnlyList GetAllConnectors() - { - return _connectors.Values.ToList(); - } - - private sealed class DisposableAction(Action action) : IDisposable - { - private Action? _action = action; - public void Dispose() => Interlocked.Exchange(ref _action, null)?.Invoke(); - } -} - -public class CsvDataConnector(IDataSourceService ds) : IDataConnector -{ - public string ConnectorId => "frypdf.connector.csv"; - public string DisplayName => "CSV / TSV Flat Files"; - public string Description => "Ingests comma-separated or tab-separated text files."; - public string IconKind => "FileDelimitedOutline"; - public IReadOnlyList SupportedExtensions => new[] { ".csv", ".tsv", ".txt" }; - - public async Task LoadDataAsync(Dictionary parameters, CancellationToken ct = default) - { - if (parameters.TryGetValue("filePath", out var path) && File.Exists(path)) - { - var text = await File.ReadAllTextAsync(path, ct); - return ds.ParseCsv(text); - } - return new DataMatrix(); - } -} - -public class JsonDataConnector(IDataSourceService ds) : IDataConnector -{ - public string ConnectorId => "frypdf.connector.json"; - public string DisplayName => "JSON Hierarchical Array"; - public string Description => "Extracts tabular matrices from JSON object arrays or nested JSON paths."; - public string IconKind => "CodeJson"; - public IReadOnlyList SupportedExtensions => new[] { ".json" }; - - public async Task LoadDataAsync(Dictionary parameters, CancellationToken ct = default) - { - if (parameters.TryGetValue("filePath", out var path) && File.Exists(path)) - { - var text = await File.ReadAllTextAsync(path, ct); - parameters.TryGetValue("jsonPath", out var jsonPath); - return ds.ParseJson(text, jsonPath); - } - return new DataMatrix(); - } -} - -public class ExcelDataConnector(IDataSourceService ds) : IDataConnector -{ - public string ConnectorId => "frypdf.connector.excel"; - public string DisplayName => "Microsoft Excel Workbook"; - public string Description => "Imports sheets from modern .xlsx workbooks."; - public string IconKind => "FileExcelOutline"; - public IReadOnlyList SupportedExtensions => new[] { ".xlsx", ".xlsm" }; - - public async Task LoadDataAsync(Dictionary parameters, CancellationToken ct = default) - { - if (parameters.TryGetValue("filePath", out var path) && File.Exists(path)) - { - await using var stream = File.OpenRead(path); - parameters.TryGetValue("sheetName", out var sheetName); - return ds.ParseExcel(stream, sheetName); - } - return new DataMatrix(); - } -} - -public class RestApiDataConnector(IDataSourceService ds) : IDataConnector -{ - public string ConnectorId => "frypdf.connector.rest"; - public string DisplayName => "REST API Endpoint"; - public string Description => "Fetches live data records from HTTP/HTTPS endpoints returning JSON arrays."; - public string IconKind => "Api"; - public IReadOnlyList SupportedExtensions => Array.Empty(); - - public Task LoadDataAsync(Dictionary parameters, CancellationToken ct = default) - { - if (parameters.TryGetValue("url", out var url) && !string.IsNullOrWhiteSpace(url)) - { - parameters.TryGetValue("jsonPath", out var jsonPath); - return ds.FetchFromRestApiAsync(url, null, jsonPath, ct); - } - return Task.FromResult(new DataMatrix()); - } -} diff --git a/src/PdfEditorApp/Services/Dialogs/DialogRegistry.cs b/src/PdfEditorApp/Services/Dialogs/DialogRegistry.cs deleted file mode 100644 index f3e2a3f..0000000 --- a/src/PdfEditorApp/Services/Dialogs/DialogRegistry.cs +++ /dev/null @@ -1,78 +0,0 @@ -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Linq; -using PdfEditorApp.Core.Plugins.Descriptors; - -namespace PdfEditorApp.Services.Dialogs; - -/// -/// Thread-safe registry for modal dialogs and floating studio overlays. -/// -public sealed class DialogRegistry : IDialogRegistry -{ - private readonly ConcurrentDictionary _dialogs = new(StringComparer.OrdinalIgnoreCase); - - public event Action? RegistryChanged; - - public IDisposable RegisterDialog(DialogDescriptor descriptor) - { - ArgumentNullException.ThrowIfNull(descriptor); - _dialogs[descriptor.Id] = descriptor; - RegistryChanged?.Invoke(); - - return new UnregisterDisposable(() => - { - UnregisterDialog(descriptor.Id); - }); - } - - public bool UnregisterDialog(string dialogId) - { - if (_dialogs.TryRemove(dialogId, out _)) - { - RegistryChanged?.Invoke(); - return true; - } - return false; - } - - public DialogDescriptor? GetDialog(string dialogId) - { - if (_dialogs.TryGetValue(dialogId, out var descriptor)) - { - return descriptor; - } - - if (!dialogId.StartsWith("frypdf.dialog.", StringComparison.OrdinalIgnoreCase)) - { - if (_dialogs.TryGetValue($"frypdf.dialog.{dialogId}", out descriptor)) - { - return descriptor; - } - } - - return null; - } - - public IReadOnlyList GetAllDialogs() - { - return _dialogs.Values.OrderBy(d => d.Title).ToList(); - } - - private sealed class UnregisterDisposable : IDisposable - { - private Action? _action; - - public UnregisterDisposable(Action action) - { - _action = action; - } - - public void Dispose() - { - var act = System.Threading.Interlocked.Exchange(ref _action, null); - act?.Invoke(); - } - } -} diff --git a/src/PdfEditorApp/Services/DocumentAuditService.cs b/src/PdfEditorApp/Services/DocumentAuditService.cs deleted file mode 100644 index 85581e6..0000000 --- a/src/PdfEditorApp/Services/DocumentAuditService.cs +++ /dev/null @@ -1,681 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; -using PdfEditorApp.Models; - -namespace PdfEditorApp.Services; - -public class AuditIssueItem -{ - public string Id { get; set; } = Guid.NewGuid().ToString("N"); - public string Severity { get; set; } = "Info"; // "Success", "Warning", "Error", "Info" - public string Category { get; set; } = "General"; // "Accessibility", "Typography", "Images", "PDF/A", "Security", "Structure" - public string Title { get; set; } = ""; - public string Description { get; set; } = ""; - public int PageIndex { get; set; } = 1; - public string? ElementId { get; set; } - public string? RecommendedFix { get; set; } - public bool CanAutoFix { get; set; } - public double? MeasuredValue { get; set; } - public double? RequiredThreshold { get; set; } -} - -public class DocumentAuditReport -{ - public int HealthScore { get; set; } = 100; - public string Grade { get; set; } = "A+"; - public int TotalWordCount { get; set; } = 0; - public int EstimatedReadingTimeSeconds { get; set; } = 0; - public int TotalPages { get; set; } = 0; - public int TotalElements { get; set; } = 0; - - public int TextElementsCount { get; set; } = 0; - public int ImageElementsCount { get; set; } = 0; - public int ShapeElementsCount { get; set; } = 0; - public int TableElementsCount { get; set; } = 0; - public int ChartElementsCount { get; set; } = 0; - public int FormFieldsCount { get; set; } = 0; - public int RedactionsCount { get; set; } = 0; - public int SignaturesCount { get; set; } = 0; - - public int AccessibilityIssuesCount { get; set; } = 0; - public int PdfAComplianceScore { get; set; } = 100; - public int PrintReadyScore { get; set; } = 100; - - public List UniqueFontsUsed { get; set; } = new(); - public List Issues { get; set; } = new(); - - public int WarningsCount => Issues.Count(i => i.Severity == "Warning"); - public int ErrorsCount => Issues.Count(i => i.Severity == "Error"); - public int PassedChecksCount => Issues.Count(i => i.Severity == "Success"); - - public string ReadingTimeDisplay => - EstimatedReadingTimeSeconds < 60 - ? $"{Math.Max(1, EstimatedReadingTimeSeconds)} sec" - : $"{EstimatedReadingTimeSeconds / 60} min {EstimatedReadingTimeSeconds % 60} sec"; -} - -public interface IDocumentAuditService -{ - DocumentAuditReport RunAudit(PdfDocumentModel document); - Task RunAuditAsync(PdfDocumentModel document, IProgress? progress = null, CancellationToken ct = default); - int AutoFixContrastIssues(PdfDocumentModel document); - int AutoFixMetadataIssues(PdfDocumentModel document); - int AutoFixMissingAltText(PdfDocumentModel document); - int AutoFixAllIssues(PdfDocumentModel document); -} - -public class DocumentAuditService : IDocumentAuditService -{ - public Task RunAuditAsync(PdfDocumentModel document, IProgress? progress = null, CancellationToken ct = default) - { - ct.ThrowIfCancellationRequested(); - return Task.Run(() => - { - progress?.Report(0); - ct.ThrowIfCancellationRequested(); - var report = RunAudit(document); - progress?.Report(100); - return report; - }, ct); - } - - public DocumentAuditReport RunAudit(PdfDocumentModel document) - { - var report = new DocumentAuditReport - { - TotalPages = document.Pages.Count - }; - - var allFonts = new HashSet(StringComparer.OrdinalIgnoreCase); - int totalWords = 0; - int accessibilityViolations = 0; - int pdfAPenalties = 0; - int printPenalties = 0; - int smallFontCount = 0; - int placeholderCount = 0; - int emptyPagesCount = 0; - int incompleteTablesCount = 0; - int unsanitizedRedactionsCount = 0; - - // 1. PDF/A Metadata Validation - if (string.IsNullOrWhiteSpace(document.Title) || document.Title.Equals("Untitled Document", StringComparison.OrdinalIgnoreCase)) - { - report.Issues.Add(new AuditIssueItem - { - Severity = "Warning", - Category = "PDF/A", - Title = "Missing Document Title", - Description = "A descriptive Title metadata entry is required for PDF/A archival and PDF/UA accessibility compliance.", - PageIndex = 1, - CanAutoFix = true, - RecommendedFix = "Set Title to project or file name" - }); - pdfAPenalties += 10; - } - else - { - report.Issues.Add(new AuditIssueItem - { - Severity = "Success", - Category = "PDF/A", - Title = "Document Title Present", - Description = $"Document title '{document.Title}' conforms to metadata standards.", - PageIndex = 1 - }); - } - - if (string.IsNullOrWhiteSpace(document.Author)) - { - report.Issues.Add(new AuditIssueItem - { - Severity = "Info", - Category = "PDF/A", - Title = "Missing Author Metadata", - Description = "Author metadata is not configured. Setting Author improves document attribution in enterprise archiving.", - PageIndex = 1, - CanAutoFix = true, - RecommendedFix = "Set Author to current user or company name" - }); - pdfAPenalties += 5; - } - - // 2. Page & Element Inspections - for (int pIdx = 0; pIdx < document.Pages.Count; pIdx++) - { - var page = document.Pages[pIdx]; - int pageNum = pIdx + 1; - string pageBgHex = string.IsNullOrWhiteSpace(page.BackgroundColorHex) ? "#FFFFFF" : page.BackgroundColorHex; - - if (page.Elements.Count == 0) - { - report.Issues.Add(new AuditIssueItem - { - Severity = "Warning", - Category = "Structure", - Title = "Empty Page Detected", - Description = $"Page {pageNum} contains zero elements.", - PageIndex = pageNum - }); - emptyPagesCount++; - } - - foreach (var element in page.Elements) - { - report.TotalElements++; - - switch (element) - { - case PdfTextElement textEl: - report.TextElementsCount++; - if (!string.IsNullOrWhiteSpace(textEl.FontFamily)) - { - allFonts.Add(textEl.FontFamily); - } - - if (!string.IsNullOrWhiteSpace(textEl.Text)) - { - var words = textEl.Text.Split(new[] { ' ', '\r', '\n', '\t' }, StringSplitOptions.RemoveEmptyEntries); - totalWords += words.Length; - - if (textEl.Text.Contains("Lorem ipsum", StringComparison.OrdinalIgnoreCase) || - textEl.Text.Contains("Enter text here", StringComparison.OrdinalIgnoreCase) || - textEl.Text.Contains("Placeholder", StringComparison.OrdinalIgnoreCase)) - { - report.Issues.Add(new AuditIssueItem - { - Severity = "Warning", - Category = "Typography", - Title = "Placeholder / Sample Text", - Description = $"Boilerplate placeholder found on Page {pageNum}: \"{GetTextSnippet(textEl.Text)}\".", - PageIndex = pageNum, - ElementId = textEl.Id - }); - placeholderCount++; - } - } - - // Font size checks - if (textEl.FontSize < 8.0) - { - report.Issues.Add(new AuditIssueItem - { - Severity = "Warning", - Category = "Typography", - Title = "Small Font Size (< 8pt)", - Description = $"Text with font size {textEl.FontSize:F1}pt on Page {pageNum} may be illegible when printed.", - PageIndex = pageNum, - ElementId = textEl.Id, - MeasuredValue = textEl.FontSize, - RequiredThreshold = 8.0 - }); - smallFontCount++; - printPenalties += 3; - } - - // Mathematical WCAG 2.1 Contrast Ratio Check - string fgColor = string.IsNullOrWhiteSpace(textEl.TextColorHex) ? "#000000" : textEl.TextColorHex; - string effectiveBg = !string.IsNullOrWhiteSpace(textEl.BackgroundColorHex) && !textEl.BackgroundColorHex.Equals("Transparent", StringComparison.OrdinalIgnoreCase) - ? textEl.BackgroundColorHex - : pageBgHex; - - double contrastRatio = CalculateContrastRatio(fgColor, effectiveBg); - bool isLargeText = textEl.FontSize >= 18.0 || (textEl.FontSize >= 14.0 && textEl.IsBold); - double requiredAaRatio = isLargeText ? 3.0 : 4.5; - double requiredAaaRatio = isLargeText ? 4.5 : 7.0; - - if (contrastRatio < requiredAaRatio) - { - accessibilityViolations++; - report.Issues.Add(new AuditIssueItem - { - Severity = "Error", - Category = "Accessibility", - Title = "WCAG 2.1 AA Contrast Failure", - Description = $"Text \"{GetTextSnippet(textEl.Text)}\" on Page {pageNum} has a contrast ratio of {contrastRatio:F2}:1 (Required: {requiredAaRatio:F1}:1).", - PageIndex = pageNum, - ElementId = textEl.Id, - MeasuredValue = contrastRatio, - RequiredThreshold = requiredAaRatio, - CanAutoFix = true, - RecommendedFix = $"Change text color to {GetCompliantColor(fgColor, effectiveBg)}" - }); - accessibilityViolations++; - } - else if (contrastRatio < requiredAaaRatio) - { - report.Issues.Add(new AuditIssueItem - { - Severity = "Info", - Category = "Accessibility", - Title = "WCAG 2.1 AAA Contrast Advisory", - Description = $"Text on Page {pageNum} meets AA standard ({contrastRatio:F2}:1) but falls below enhanced AAA standard ({requiredAaaRatio:F1}:1).", - PageIndex = pageNum, - ElementId = textEl.Id, - MeasuredValue = contrastRatio, - RequiredThreshold = requiredAaaRatio - }); - } - break; - - case PdfImageElement imgEl: - report.ImageElementsCount++; - - // Effective DPI Analysis - var dims = TryGetImageDimensions(imgEl.ImagePath); - if (dims.HasValue && imgEl.Width > 0 && imgEl.Height > 0) - { - double dpiX = dims.Value.Width / (imgEl.Width / 72.0); - double dpiY = dims.Value.Height / (imgEl.Height / 72.0); - double minDpi = Math.Min(dpiX, dpiY); - - if (minDpi < 150.0) - { - report.Issues.Add(new AuditIssueItem - { - Severity = "Warning", - Category = "Images", - Title = "Low Image Resolution (< 150 DPI)", - Description = $"Image on Page {pageNum} has an effective resolution of {minDpi:F0} DPI. Professional printing requires at least 300 DPI.", - PageIndex = pageNum, - ElementId = imgEl.Id, - MeasuredValue = minDpi, - RequiredThreshold = 300.0 - }); - printPenalties += 10; - } - else if (minDpi > 600.0) - { - report.Issues.Add(new AuditIssueItem - { - Severity = "Info", - Category = "Images", - Title = "High Image Resolution (> 600 DPI)", - Description = $"Image on Page {pageNum} is {minDpi:F0} DPI. Consider downsampling to 300 DPI to reduce PDF file size.", - PageIndex = pageNum, - ElementId = imgEl.Id, - MeasuredValue = minDpi, - RequiredThreshold = 600.0 - }); - } - } - else if (string.IsNullOrWhiteSpace(imgEl.ImagePath)) - { - report.Issues.Add(new AuditIssueItem - { - Severity = "Info", - Category = "Images", - Title = "Placeholder Image Box", - Description = $"Image placeholder on Page {pageNum} has no image file loaded.", - PageIndex = pageNum, - ElementId = imgEl.Id - }); - } - break; - - case PdfShapeElement shapeEl: - report.ShapeElementsCount++; - if (shapeEl.ShapeType == ShapeType.RoundedRectangle && shapeEl.Label != null && - (shapeEl.Label.Contains("SIGN", StringComparison.OrdinalIgnoreCase) || shapeEl.Label.Contains("APPROVED", StringComparison.OrdinalIgnoreCase))) - { - report.SignaturesCount++; - } - break; - - case PdfTableElement tblEl: - report.TableElementsCount++; - if (tblEl.Rows.Count == 0 || tblEl.Headers.Count == 0) - { - report.Issues.Add(new AuditIssueItem - { - Severity = "Warning", - Category = "Structure", - Title = "Incomplete Table Structure", - Description = $"Table on Page {pageNum} has zero rows or column headers configured.", - PageIndex = pageNum, - ElementId = tblEl.Id - }); - incompleteTablesCount++; - } - break; - - case PdfChartElement: - report.ChartElementsCount++; - break; - - case PdfFormFieldElement formEl: - report.FormFieldsCount++; - if (formEl.FieldType == FormFieldType.Signature || formEl.FieldType == FormFieldType.SignatureLine) - { - report.SignaturesCount++; - } - break; - - case PdfRedactionElement redEl: - report.RedactionsCount++; - report.Issues.Add(new AuditIssueItem - { - Severity = "Warning", - Category = "Security", - Title = "Unsanitized Redaction Mark", - Description = $"Redaction overlay ({redEl.ExemptionCode}) on Page {pageNum} is active. Ensure redactions are permanently burned in before external sharing.", - PageIndex = pageNum, - ElementId = redEl.Id - }); - unsanitizedRedactionsCount++; - break; - } - } - } - - // 3. Positive Summary Checks - if (allFonts.Count > 0 && allFonts.Count <= 3) - { - report.Issues.Add(new AuditIssueItem - { - Severity = "Success", - Category = "Typography", - Title = "Harmonious Font Hierarchy", - Description = $"Document utilizes a concise set of {allFonts.Count} font families ({string.Join(", ", allFonts)}).", - PageIndex = 1 - }); - } - else if (allFonts.Count > 4) - { - report.Issues.Add(new AuditIssueItem - { - Severity = "Warning", - Category = "Typography", - Title = "Excessive Font Diversity", - Description = $"Document uses {allFonts.Count} distinct fonts. Standard publishing guidelines recommend 2-3 fonts maximum.", - PageIndex = 1 - }); - } - - if (document.SecuritySettings.IsPasswordProtected) - { - report.Issues.Add(new AuditIssueItem - { - Severity = "Success", - Category = "Security", - Title = "Document Encryption Active", - Description = "Document is secured with password protection and restricted permissions.", - PageIndex = 1 - }); - } - - if (document.Pages.Count > 0 && document.Pages.All(p => p.ShowHeaderFooter)) - { - report.Issues.Add(new AuditIssueItem - { - Severity = "Success", - Category = "Structure", - Title = "Structured Pagination & Footers", - Description = "All document pages have structured headers and sequential footers enabled.", - PageIndex = 1 - }); - } - - report.UniqueFontsUsed = allFonts.OrderBy(f => f).ToList(); - report.TotalWordCount = totalWords; - report.EstimatedReadingTimeSeconds = (int)Math.Ceiling(totalWords / 3.3); // ~200 WPM - report.AccessibilityIssuesCount = accessibilityViolations; - report.PdfAComplianceScore = Math.Clamp(100 - pdfAPenalties, 0, 100); - report.PrintReadyScore = Math.Clamp(100 - printPenalties, 0, 100); - - int typographyPenalty = Math.Min(12, (allFonts.Count > 4 ? 4 : 0) + smallFontCount * 1 + placeholderCount * 2); - int structurePenalty = Math.Min(12, emptyPagesCount * 5 + incompleteTablesCount * 4); - int accessibilityPenalty = Math.Min(15, accessibilityViolations * 4); - int securityPenalty = Math.Min(8, unsanitizedRedactionsCount * 3); - int metadataPenalty = Math.Min(10, pdfAPenalties); - - int totalPenalty = typographyPenalty + structurePenalty + accessibilityPenalty + securityPenalty + metadataPenalty; - int calculatedScore = Math.Clamp(100 - totalPenalty, 20, 100); - report.HealthScore = calculatedScore; - report.Grade = calculatedScore switch - { - >= 95 => "A+", - >= 85 => "A", - >= 75 => "B", - >= 60 => "C", - _ => "Needs Review" - }; - - return report; - } - - public int AutoFixContrastIssues(PdfDocumentModel document) - { - int fixedCount = 0; - foreach (var page in document.Pages) - { - string pageBgHex = string.IsNullOrWhiteSpace(page.BackgroundColorHex) ? "#FFFFFF" : page.BackgroundColorHex; - - foreach (var element in page.Elements) - { - if (element is PdfTextElement textEl) - { - string fgColor = string.IsNullOrWhiteSpace(textEl.TextColorHex) ? "#000000" : textEl.TextColorHex; - string effectiveBg = !string.IsNullOrWhiteSpace(textEl.BackgroundColorHex) && !textEl.BackgroundColorHex.Equals("Transparent", StringComparison.OrdinalIgnoreCase) - ? textEl.BackgroundColorHex - : pageBgHex; - - double ratio = CalculateContrastRatio(fgColor, effectiveBg); - bool isLargeText = textEl.FontSize >= 18.0 || (textEl.FontSize >= 14.0 && textEl.IsBold); - double requiredRatio = isLargeText ? 3.0 : 4.5; - - if (ratio < requiredRatio) - { - textEl.TextColorHex = GetCompliantColor(fgColor, effectiveBg); - fixedCount++; - } - } - } - } - return fixedCount; - } - - public int AutoFixMetadataIssues(PdfDocumentModel document) - { - int fixedCount = 0; - if (string.IsNullOrWhiteSpace(document.Title) || document.Title.Equals("Untitled Document", StringComparison.OrdinalIgnoreCase)) - { - document.Title = "Document Publication"; - fixedCount++; - } - if (string.IsNullOrWhiteSpace(document.Author)) - { - document.Author = Environment.UserName; - fixedCount++; - } - return fixedCount; - } - - public int AutoFixMissingAltText(PdfDocumentModel document) - { - int fixedCount = 0; - int imgIndex = 1; - foreach (var page in document.Pages) - { - foreach (var element in page.Elements) - { - if (element is PdfImageElement imgEl && (string.IsNullOrWhiteSpace(imgEl.AltText) || imgEl.AltText.Equals("Image", StringComparison.OrdinalIgnoreCase))) - { - imgEl.AltText = $"Document Figure {imgIndex++}"; - fixedCount++; - } - } - } - return fixedCount; - } - - public int AutoFixAllIssues(PdfDocumentModel document) - { - int total = 0; - total += AutoFixContrastIssues(document); - total += AutoFixMetadataIssues(document); - total += AutoFixMissingAltText(document); - return total; - } - - #region Mathematical WCAG 2.1 Calculations - - public static (double R, double G, double B) ParseRgb(string hex) - { - if (string.IsNullOrWhiteSpace(hex)) return (0, 0, 0); - hex = hex.Trim().TrimStart('#'); - if (hex.Length == 3) - { - hex = $"{hex[0]}{hex[0]}{hex[1]}{hex[1]}{hex[2]}{hex[2]}"; - } - else if (hex.Length == 8) - { - hex = hex.Substring(2, 6); - } - else if (hex.Length != 6) - { - return (0, 0, 0); - } - - if (int.TryParse(hex.Substring(0, 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out int r) && - int.TryParse(hex.Substring(2, 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out int g) && - int.TryParse(hex.Substring(4, 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out int b)) - { - return (r / 255.0, g / 255.0, b / 255.0); - } - return (0, 0, 0); - } - - public static double CalculateRelativeLuminance(string hex) - { - var (r, g, b) = ParseRgb(hex); - - static double ToLinear(double c) => (c <= 0.04045) ? c / 12.92 : Math.Pow((c + 0.055) / 1.055, 2.4); - - double rLinear = ToLinear(r); - double gLinear = ToLinear(g); - double bLinear = ToLinear(b); - - return 0.2126 * rLinear + 0.7152 * gLinear + 0.0722 * bLinear; - } - - public static double CalculateContrastRatio(string fgHex, string bgHex) - { - double l1 = CalculateRelativeLuminance(fgHex); - double l2 = CalculateRelativeLuminance(bgHex); - - double lighter = Math.Max(l1, l2); - double darker = Math.Min(l1, l2); - - return Math.Round((lighter + 0.05) / (darker + 0.05), 2); - } - - public static string GetCompliantColor(string currentFgHex, string bgHex, double targetRatio = 4.5) - { - double bgLuminance = CalculateRelativeLuminance(bgHex); - return bgLuminance > 0.5 ? "#0F172A" : "#FFFFFF"; - } - - #endregion - - #region Fast Image Dimensions Header Inspector - - public static (int Width, int Height)? TryGetImageDimensions(string? path) - { - if (string.IsNullOrWhiteSpace(path) || !File.Exists(path)) return null; - - try - { - using var stream = File.OpenRead(path); - using var reader = new BinaryReader(stream); - - byte[] magic = reader.ReadBytes(8); - if (magic.Length < 8) return null; - - // PNG magic: 89 50 4E 47 0D 0A 1A 0A - if (magic[0] == 0x89 && magic[1] == 0x50 && magic[2] == 0x4E && magic[3] == 0x47) - { - stream.Seek(16, SeekOrigin.Begin); - byte[] wBytes = reader.ReadBytes(4); - byte[] hBytes = reader.ReadBytes(4); - if (BitConverter.IsLittleEndian) - { - Array.Reverse(wBytes); - Array.Reverse(hBytes); - } - int w = BitConverter.ToInt32(wBytes, 0); - int h = BitConverter.ToInt32(hBytes, 0); - return (w, h); - } - - // GIF: "GIF87a" or "GIF89a" - if (magic[0] == 'G' && magic[1] == 'I' && magic[2] == 'F') - { - stream.Seek(6, SeekOrigin.Begin); - int w = reader.ReadUInt16(); - int h = reader.ReadUInt16(); - return (w, h); - } - - // BMP: "BM" - if (magic[0] == 'B' && magic[1] == 'M') - { - stream.Seek(18, SeekOrigin.Begin); - int w = reader.ReadInt32(); - int h = Math.Abs(reader.ReadInt32()); - return (w, h); - } - - // JPEG - if (magic[0] == 0xFF && magic[1] == 0xD8) - { - stream.Seek(2, SeekOrigin.Begin); - while (stream.Position < stream.Length) - { - byte markerPrefix = reader.ReadByte(); - if (markerPrefix != 0xFF) break; - byte marker = reader.ReadByte(); - if (marker == 0xC0 || marker == 0xC1 || marker == 0xC2) - { - reader.ReadUInt16(); // length - reader.ReadByte(); // precision - int h = (reader.ReadByte() << 8) | reader.ReadByte(); - int w = (reader.ReadByte() << 8) | reader.ReadByte(); - return (w, h); - } - else if (marker == 0xD9 || marker == 0xDA) - { - break; - } - else - { - int length = (reader.ReadByte() << 8) | reader.ReadByte(); - if (length < 2) break; - stream.Seek(length - 2, SeekOrigin.Current); - } - } - } - } - catch - { - // Ignore format parse failures - } - - return null; - } - - private static string GetTextSnippet(string? text, int maxLen = 30) - { - if (string.IsNullOrWhiteSpace(text)) return ""; - string clean = text.Trim().Replace('\r', ' ').Replace('\n', ' '); - return clean.Length <= maxLen ? clean : $"{clean.Substring(0, maxLen)}..."; - } - - #endregion -} diff --git a/src/PdfEditorApp/Services/DocumentCompareService.cs b/src/PdfEditorApp/Services/DocumentCompareService.cs deleted file mode 100644 index f845caf..0000000 --- a/src/PdfEditorApp/Services/DocumentCompareService.cs +++ /dev/null @@ -1,281 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; -using PdfEditorApp.Models; - -namespace PdfEditorApp.Services; - -public interface IDocumentCompareService -{ - DocumentComparisonReport CompareDocuments(PdfDocumentModel baseDoc, PdfDocumentModel comparedDoc); - Task CompareDocumentsAsync(PdfDocumentModel baseDoc, PdfDocumentModel comparedDoc, CancellationToken ct = default); -} - -public class DocumentCompareService : IDocumentCompareService -{ - public Task CompareDocumentsAsync(PdfDocumentModel baseDoc, PdfDocumentModel comparedDoc, CancellationToken ct = default) - { - ct.ThrowIfCancellationRequested(); - return Task.Run(() => CompareDocuments(baseDoc, comparedDoc), ct); - } - - public DocumentComparisonReport CompareDocuments(PdfDocumentModel baseDoc, PdfDocumentModel comparedDoc) - { - var report = new DocumentComparisonReport - { - BaseDocumentTitle = string.IsNullOrWhiteSpace(baseDoc.Title) ? "Base Document" : baseDoc.Title, - ComparedDocumentTitle = string.IsNullOrWhiteSpace(comparedDoc.Title) ? "Revised Document" : comparedDoc.Title, - BasePageCount = baseDoc.Pages.Count, - ComparedPageCount = comparedDoc.Pages.Count, - ComparisonTimestamp = DateTime.UtcNow - }; - - // 1. Document Metadata Comparison - if (baseDoc.Title != comparedDoc.Title) - { - report.Differences.Add(new DocumentDifferenceItem - { - PageNumber = 0, - DiffType = CompareDiffType.MetadataModified, - Description = $"Document Title changed from \"{baseDoc.Title}\" to \"{comparedDoc.Title}\"", - OldValue = baseDoc.Title, - NewValue = comparedDoc.Title, - ElementKindDisplay = "Document Metadata" - }); - } - - if (baseDoc.Author != comparedDoc.Author) - { - report.Differences.Add(new DocumentDifferenceItem - { - PageNumber = 0, - DiffType = CompareDiffType.MetadataModified, - Description = $"Document Author changed from \"{baseDoc.Author}\" to \"{comparedDoc.Author}\"", - OldValue = baseDoc.Author, - NewValue = comparedDoc.Author, - ElementKindDisplay = "Document Metadata" - }); - } - - if (baseDoc.SecuritySettings.IsPasswordProtected != comparedDoc.SecuritySettings.IsPasswordProtected) - { - report.Differences.Add(new DocumentDifferenceItem - { - PageNumber = 0, - DiffType = CompareDiffType.SecurityModified, - Description = $"Security settings changed: Protected={comparedDoc.SecuritySettings.IsPasswordProtected}", - OldValue = baseDoc.SecuritySettings.IsPasswordProtected ? "Password Protected" : "Standard (Unprotected)", - NewValue = comparedDoc.SecuritySettings.IsPasswordProtected ? "Password Protected" : "Standard (Unprotected)", - ElementKindDisplay = "Security" - }); - } - - // 2. Page Count Comparison - if (baseDoc.Pages.Count != comparedDoc.Pages.Count) - { - report.Differences.Add(new DocumentDifferenceItem - { - PageNumber = 0, - DiffType = CompareDiffType.PageCountChanged, - Description = $"Page count changed from {baseDoc.Pages.Count} to {comparedDoc.Pages.Count}", - OldValue = $"{baseDoc.Pages.Count} pages", - NewValue = $"{comparedDoc.Pages.Count} pages", - ElementKindDisplay = "Document Structure" - }); - } - - int maxPages = Math.Max(baseDoc.Pages.Count, comparedDoc.Pages.Count); - for (int p = 0; p < maxPages; p++) - { - int pageNum = p + 1; - - if (p >= baseDoc.Pages.Count) - { - var addedPage = comparedDoc.Pages[p]; - report.AdditionsCount += Math.Max(1, addedPage.Elements.Count); - report.Differences.Add(new DocumentDifferenceItem - { - PageNumber = pageNum, - DiffType = CompareDiffType.ElementAdded, - Description = $"Added new Page {pageNum} with {addedPage.Elements.Count} elements", - OldValue = "(None)", - NewValue = $"Page {pageNum} ({addedPage.Format})", - ElementKindDisplay = "Page" - }); - continue; - } - - if (p >= comparedDoc.Pages.Count) - { - var removedPage = baseDoc.Pages[p]; - report.DeletionsCount += Math.Max(1, removedPage.Elements.Count); - report.Differences.Add(new DocumentDifferenceItem - { - PageNumber = pageNum, - DiffType = CompareDiffType.ElementRemoved, - Description = $"Deleted Page {pageNum} containing {removedPage.Elements.Count} elements", - OldValue = $"Page {pageNum}", - NewValue = "(Deleted)", - ElementKindDisplay = "Page" - }); - continue; - } - - var basePage = baseDoc.Pages[p]; - var compPage = comparedDoc.Pages[p]; - - // Compare page dimensions and orientation - if (basePage.Orientation != compPage.Orientation || basePage.Format != compPage.Format || - Math.Abs(basePage.Width - compPage.Width) > 1 || Math.Abs(basePage.Height - compPage.Height) > 1) - { - report.ModificationsCount++; - report.Differences.Add(new DocumentDifferenceItem - { - PageNumber = pageNum, - DiffType = CompareDiffType.ElementModified, - Description = $"Page {pageNum} geometry changed: {basePage.Format} ({basePage.Width:F0}x{basePage.Height:F0}) -> {compPage.Format} ({compPage.Width:F0}x{compPage.Height:F0})", - OldValue = $"{basePage.Format} ({basePage.Width:F0}x{basePage.Height:F0})", - NewValue = $"{compPage.Format} ({compPage.Width:F0}x{compPage.Height:F0})", - ElementKindDisplay = "Page Setup" - }); - } - - // Compare elements on page - ComparePageElements(basePage, compPage, pageNum, report); - } - - return report; - } - - private static void ComparePageElements(PdfPageModel basePage, PdfPageModel compPage, int pageNum, DocumentComparisonReport report) - { - var unmatchedComp = new List(compPage.Elements); - var matchedCompIds = new HashSet(); - - // 1. Pass: Match by Id - var baseElById = basePage.Elements.ToDictionary(e => e.Id, e => e); - var compElById = compPage.Elements.ToDictionary(e => e.Id, e => e); - - foreach (var baseEl in basePage.Elements) - { - if (compElById.TryGetValue(baseEl.Id, out var compEl)) - { - matchedCompIds.Add(compEl.Id); - unmatchedComp.Remove(compEl); - CompareMatchedPair(baseEl, compEl, pageNum, report); - } - } - - // 2. Pass: Spatial/Kind matching for elements without matching ID - var unmatchedBase = basePage.Elements.Where(e => !matchedCompIds.Contains(e.Id)).ToList(); - var stillUnmatchedBase = new List(); - - foreach (var baseEl in unmatchedBase) - { - var match = unmatchedComp.FirstOrDefault(c => c.Kind == baseEl.Kind && Math.Abs(c.X - baseEl.X) < 15 && Math.Abs(c.Y - baseEl.Y) < 15); - if (match != null) - { - unmatchedComp.Remove(match); - CompareMatchedPair(baseEl, match, pageNum, report); - } - else - { - stillUnmatchedBase.Add(baseEl); - } - } - - // 3. Deletions - foreach (var baseEl in stillUnmatchedBase) - { - report.DeletionsCount++; - string desc = baseEl is PdfTextElement txt ? $": \"{GetSnippet(txt.Text)}\"" : ""; - report.Differences.Add(new DocumentDifferenceItem - { - PageNumber = pageNum, - DiffType = CompareDiffType.ElementRemoved, - Description = $"Removed {baseEl.Kind} on Page {pageNum}{desc}", - OldValue = $"{baseEl.Kind} at (X:{baseEl.X:F0}, Y:{baseEl.Y:F0})", - NewValue = "(Removed)", - ElementKindDisplay = baseEl.Kind.ToString() - }); - } - - // 4. Additions - foreach (var compEl in unmatchedComp) - { - report.AdditionsCount++; - string desc = compEl is PdfTextElement txt ? $": \"{GetSnippet(txt.Text)}\"" : ""; - report.Differences.Add(new DocumentDifferenceItem - { - PageNumber = pageNum, - DiffType = CompareDiffType.ElementAdded, - Description = $"Added new {compEl.Kind} on Page {pageNum}{desc}", - OldValue = "(None)", - NewValue = $"{compEl.Kind} at (X:{compEl.X:F0}, Y:{compEl.Y:F0})", - ElementKindDisplay = compEl.Kind.ToString() - }); - } - } - - private static void CompareMatchedPair(PdfElementBase baseEl, PdfElementBase compEl, int pageNum, DocumentComparisonReport report) - { - // Check Text modifications - if (baseEl is PdfTextElement bTxt && compEl is PdfTextElement cTxt) - { - if (bTxt.Text != cTxt.Text) - { - report.ModificationsCount++; - report.Differences.Add(new DocumentDifferenceItem - { - PageNumber = pageNum, - DiffType = CompareDiffType.TextModified, - Description = $"Modified text on Page {pageNum}: \"{GetSnippet(bTxt.Text)}\" -> \"{GetSnippet(cTxt.Text)}\"", - OldValue = bTxt.Text, - NewValue = cTxt.Text, - ElementKindDisplay = "Text Content" - }); - } - - if (Math.Abs(bTxt.FontSize - cTxt.FontSize) > 0.5 || bTxt.IsBold != cTxt.IsBold || bTxt.IsItalic != cTxt.IsItalic || bTxt.TextColorHex != cTxt.TextColorHex) - { - report.ModificationsCount++; - report.Differences.Add(new DocumentDifferenceItem - { - PageNumber = pageNum, - DiffType = CompareDiffType.FormattingModified, - Description = $"Formatting changed for text on Page {pageNum}", - OldValue = $"{bTxt.FontFamily} {bTxt.FontSize:F0}pt {bTxt.TextColorHex}", - NewValue = $"{cTxt.FontFamily} {cTxt.FontSize:F0}pt {cTxt.TextColorHex}", - ElementKindDisplay = "Typography" - }); - } - } - - // Check geometry displacement/resizing - if (Math.Abs(baseEl.X - compEl.X) > 2 || Math.Abs(baseEl.Y - compEl.Y) > 2 || - Math.Abs(baseEl.Width - compEl.Width) > 2 || Math.Abs(baseEl.Height - compEl.Height) > 2) - { - report.ModificationsCount++; - report.Differences.Add(new DocumentDifferenceItem - { - PageNumber = pageNum, - DiffType = CompareDiffType.ElementModified, - Description = $"Moved / resized {compEl.Kind} on Page {pageNum}", - OldValue = $"Pos ({baseEl.X:F0}, {baseEl.Y:F0}) Size ({baseEl.Width:F0}x{baseEl.Height:F0})", - NewValue = $"Pos ({compEl.X:F0}, {compEl.Y:F0}) Size ({compEl.Width:F0}x{compEl.Height:F0})", - ElementKindDisplay = compEl.Kind.ToString() - }); - } - } - - private static string GetSnippet(string? text, int max = 25) - { - if (string.IsNullOrWhiteSpace(text)) return ""; - string clean = text.Trim().Replace('\r', ' ').Replace('\n', ' '); - return clean.Length <= max ? clean : $"{clean.Substring(0, max)}..."; - } -} diff --git a/src/PdfEditorApp/Services/Export/DocumentExporterRegistry.cs b/src/PdfEditorApp/Services/Export/DocumentExporterRegistry.cs deleted file mode 100644 index d3cd651..0000000 --- a/src/PdfEditorApp/Services/Export/DocumentExporterRegistry.cs +++ /dev/null @@ -1,293 +0,0 @@ -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using System.Threading; -using System.Threading.Tasks; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; -using PdfEditorApp.Core.Plugins.Descriptors; - -namespace PdfEditorApp.Services.Export; - -public class DocumentExporterRegistry : IDocumentExporterRegistry -{ - private readonly ConcurrentDictionary _exporters = new(StringComparer.OrdinalIgnoreCase); - - public event Action? RegistryChanged; - - public DocumentExporterRegistry(IPdfExportService? pdfExportService = null) - { - RegisterBuiltInExporters(pdfExportService); - } - - private void RegisterBuiltInExporters(IPdfExportService? pdfExportService) - { - RegisterExporter(new PdfDocumentExporter(pdfExportService)); - RegisterExporter(new MarkdownDocumentExporter()); - RegisterExporter(new HtmlDocumentExporter()); - RegisterExporter(new PlainTextDocumentExporter()); - RegisterExporter(new SvgVectorExporter()); - } - - public IDisposable RegisterExporter(IDocumentExporter exporter) - { - ArgumentNullException.ThrowIfNull(exporter); - _exporters[exporter.ExporterId] = exporter; - RegistryChanged?.Invoke(); - - return new DisposableAction(() => - { - _exporters.TryRemove(exporter.ExporterId, out _); - RegistryChanged?.Invoke(); - }); - } - - public IDocumentExporter? GetExporter(string exporterId) - { - if (string.IsNullOrWhiteSpace(exporterId)) return null; - return _exporters.GetValueOrDefault(exporterId); - } - - public IDocumentExporter? FindExporterByExtension(string extension) - { - if (string.IsNullOrWhiteSpace(extension)) return null; - var ext = extension.StartsWith('.') ? extension : "." + extension; - - return _exporters.Values - .FirstOrDefault(e => string.Equals(e.DefaultExtension, ext, StringComparison.OrdinalIgnoreCase)); - } - - public IReadOnlyList GetAllExporters() - { - return _exporters.Values.ToList(); - } - - private sealed class DisposableAction(Action action) : IDisposable - { - private Action? _action = action; - public void Dispose() => Interlocked.Exchange(ref _action, null)?.Invoke(); - } -} - -/// -/// Default PDF exporter delegating to IPdfExportService. -/// -public class PdfDocumentExporter : IDocumentExporter -{ - private readonly IPdfExportService? _exportService; - - public PdfDocumentExporter(IPdfExportService? exportService = null) - { - _exportService = exportService; - } - - public string ExporterId => "frypdf.exporter.pdf"; - public string DisplayName => "PDF Document (.pdf)"; - public string DefaultExtension => ".pdf"; - public string FileFilterDescription => "PDF Document (*.pdf)|*.pdf"; - public string IconKind => "FilePdfBox"; - - public Task ExportAsync(PdfDocumentModel document, DocumentExportOptions options, CancellationToken ct = default) - { - if (_exportService != null) - { - return Task.FromResult(_exportService.GeneratePdfBytes(document)); - } - - // Fallback directly to PdfExportService - var fallback = new PdfExportService(); - return Task.FromResult(fallback.GeneratePdfBytes(document)); - } -} - -/// -/// Markdown exporter extracting text blocks, headings, and tables to formatted Markdown. -/// -public class MarkdownDocumentExporter : IDocumentExporter -{ - public string ExporterId => "frypdf.exporter.markdown"; - public string DisplayName => "GitHub-Flavored Markdown (.md)"; - public string DefaultExtension => ".md"; - public string FileFilterDescription => "Markdown Document (*.md)|*.md"; - public string IconKind => "LanguageMarkdown"; - - public Task ExportAsync(PdfDocumentModel document, DocumentExportOptions options, CancellationToken ct = default) - { - var sb = new StringBuilder(); - sb.AppendLine($"# {document.Title}"); - if (!string.IsNullOrWhiteSpace(document.Author)) - { - sb.AppendLine($"*Author: {document.Author}*"); - } - sb.AppendLine(); - - int pageNum = 1; - foreach (var page in document.Pages) - { - if (document.Pages.Count > 1) - { - sb.AppendLine($"---"); - sb.AppendLine($"## Page {pageNum}"); - sb.AppendLine(); - } - - var sortedElements = page.Elements.OrderBy(e => e.Y).ThenBy(e => e.X); - foreach (var el in sortedElements) - { - if (el is PdfTextElement text && !string.IsNullOrWhiteSpace(text.Text)) - { - if (text.FontSize >= 20) - { - sb.AppendLine($"# {text.Text.Trim()}"); - } - else if (text.FontSize >= 15) - { - sb.AppendLine($"## {text.Text.Trim()}"); - } - else if (text.FontSize >= 12 && text.IsBold) - { - sb.AppendLine($"### {text.Text.Trim()}"); - } - else - { - sb.AppendLine(text.Text.Trim()); - } - sb.AppendLine(); - } - else if (el is PdfTableElement table) - { - sb.AppendLine($"*[Table: {table.Rows.Count}x{table.Headers.Count}]*"); - sb.AppendLine(); - } - } - - pageNum++; - } - - return Task.FromResult(Encoding.UTF8.GetBytes(sb.ToString())); - } -} - -/// -/// Plain text exporter extracting raw text in layout order. -/// -public class PlainTextDocumentExporter : IDocumentExporter -{ - public string ExporterId => "frypdf.exporter.text"; - public string DisplayName => "Plain Text (.txt)"; - public string DefaultExtension => ".txt"; - public string FileFilterDescription => "Text Document (*.txt)|*.txt"; - public string IconKind => "TextRecognition"; - - public Task ExportAsync(PdfDocumentModel document, DocumentExportOptions options, CancellationToken ct = default) - { - var sb = new StringBuilder(); - foreach (var page in document.Pages) - { - var textElements = page.Elements.OfType().OrderBy(e => e.Y).ThenBy(e => e.X); - foreach (var t in textElements) - { - if (!string.IsNullOrWhiteSpace(t.Text)) - { - sb.AppendLine(t.Text); - } - } - sb.AppendLine(); - } - - return Task.FromResult(Encoding.UTF8.GetBytes(sb.ToString())); - } -} - -/// -/// HTML5 document exporter rendering styled semantic HTML. -/// -public class HtmlDocumentExporter : IDocumentExporter -{ - public string ExporterId => "frypdf.exporter.html"; - public string DisplayName => "Web Page HTML5 (.html)"; - public string DefaultExtension => ".html"; - public string FileFilterDescription => "HTML Document (*.html)|*.html"; - public string IconKind => "LanguageHtml5"; - - public Task ExportAsync(PdfDocumentModel document, DocumentExportOptions options, CancellationToken ct = default) - { - var sb = new StringBuilder(); - sb.AppendLine(""); - sb.AppendLine(""); - sb.AppendLine(""); - sb.AppendLine(" "); - sb.AppendLine($" {System.Net.WebUtility.HtmlEncode(document.Title)}"); - sb.AppendLine(" "); - sb.AppendLine(""); - sb.AppendLine(""); - - int pageNum = 1; - foreach (var page in document.Pages) - { - sb.AppendLine($"
"); - var sorted = page.Elements.OrderBy(e => e.Y).ThenBy(e => e.X); - foreach (var el in sorted) - { - if (el is PdfTextElement text && !string.IsNullOrWhiteSpace(text.Text)) - { - var encoded = System.Net.WebUtility.HtmlEncode(text.Text); - if (text.FontSize >= 20) sb.AppendLine($"

{encoded}

"); - else if (text.FontSize >= 15) sb.AppendLine($"

{encoded}

"); - else sb.AppendLine($"

{encoded}

"); - } - } - sb.AppendLine("
"); - pageNum++; - } - - sb.AppendLine(""); - sb.AppendLine(""); - - return Task.FromResult(Encoding.UTF8.GetBytes(sb.ToString())); - } -} - -/// -/// SVG vector document exporter. -/// -public class SvgVectorExporter : IDocumentExporter -{ - public string ExporterId => "frypdf.exporter.svg"; - public string DisplayName => "Scalable Vector Graphics (.svg)"; - public string DefaultExtension => ".svg"; - public string FileFilterDescription => "Scalable Vector Graphics (*.svg)|*.svg"; - public string IconKind => "Svg"; - - public Task ExportAsync(PdfDocumentModel document, DocumentExportOptions options, CancellationToken ct = default) - { - var firstPage = document.Pages.FirstOrDefault() ?? new PdfPageModel { Width = 600, Height = 800 }; - var sb = new StringBuilder(); - sb.AppendLine($""); - sb.AppendLine($" "); - sb.AppendLine($" "); - - foreach (var el in firstPage.Elements.OrderBy(e => e.ZIndex)) - { - if (el is PdfTextElement text && !string.IsNullOrWhiteSpace(text.Text)) - { - var encoded = System.Net.WebUtility.HtmlEncode(text.Text); - sb.AppendLine($" {encoded}"); - } - else if (el is PdfShapeElement shape) - { - sb.AppendLine($" "); - } - } - - sb.AppendLine(""); - return Task.FromResult(Encoding.UTF8.GetBytes(sb.ToString())); - } -} diff --git a/src/PdfEditorApp/Services/FileOperationHelper.cs b/src/PdfEditorApp/Services/FileOperationHelper.cs deleted file mode 100644 index b1335e7..0000000 --- a/src/PdfEditorApp/Services/FileOperationHelper.cs +++ /dev/null @@ -1,263 +0,0 @@ -using System; -using System.Diagnostics; -using System.IO; -using System.Runtime.InteropServices; - -namespace PdfEditorApp.Services; - -/// -/// Provides cross-platform utility methods for file operations: -/// renaming, duplication, deletion, file name validation, and revealing in OS file managers. -/// -public static class FileOperationHelper -{ - private static readonly char[] CrossPlatformInvalidChars = new[] - { - '/', '\\', ':', '*', '?', '"', '<', '>', '|', '\0' - }; - - /// - /// Validates whether the proposed file name is valid across Windows, macOS, and Linux file systems. - /// - public static bool ValidateFileName(string? fileName, out string? errorMessage) - { - errorMessage = null; - - if (string.IsNullOrWhiteSpace(fileName)) - { - errorMessage = "Document name cannot be empty."; - return false; - } - - var trimmed = fileName.Trim(); - if (trimmed.Length == 0 || trimmed == "." || trimmed == "..") - { - errorMessage = "Document name cannot be empty or a navigation dot."; - return false; - } - - if (trimmed.IndexOfAny(CrossPlatformInvalidChars) >= 0 || trimmed.IndexOfAny(Path.GetInvalidFileNameChars()) >= 0) - { - errorMessage = "Document name contains invalid characters (e.g. / \\ : * ? \" < > |)."; - return false; - } - - if (trimmed.Length > 255) - { - errorMessage = "Document name is too long (maximum 255 characters)."; - return false; - } - - return true; - } - - /// - /// Renames a physical file on disk to a new file name, preserving the original extension if not explicitly typed. - /// - public static bool RenameFile(string oldPath, string newName, out string? newPath, out string? errorMessage) - { - newPath = null; - errorMessage = null; - - if (!File.Exists(oldPath)) - { - errorMessage = "Original file could not be found on disk."; - return false; - } - - if (!ValidateFileName(newName, out errorMessage)) - { - return false; - } - - try - { - var dir = Path.GetDirectoryName(oldPath); - if (string.IsNullOrEmpty(dir)) - { - errorMessage = "Could not determine parent directory."; - return false; - } - - var originalExt = Path.GetExtension(oldPath); - var trimmedName = newName.Trim(); - - // If user typed the extension explicitly, keep it; otherwise append original extension - string finalFileName; - if (!string.IsNullOrEmpty(originalExt) && trimmedName.EndsWith(originalExt, StringComparison.OrdinalIgnoreCase)) - { - finalFileName = trimmedName; - } - else - { - finalFileName = trimmedName + originalExt; - } - - var destinationPath = Path.Combine(dir, finalFileName); - - // If same file path, no rename required - if (string.Equals(oldPath, destinationPath, StringComparison.OrdinalIgnoreCase)) - { - newPath = oldPath; - return true; - } - - // Check if another file with this name already exists - if (File.Exists(destinationPath)) - { - errorMessage = $"A file named \"{finalFileName}\" already exists in this folder."; - return false; - } - - File.Move(oldPath, destinationPath); - newPath = destinationPath; - return true; - } - catch (Exception ex) - { - errorMessage = $"Failed to rename file: {ex.Message}"; - return false; - } - } - - /// - /// Creates a duplicate copy of a file in the same directory (e.g. "Document (Copy).pdf"). - /// - public static bool DuplicateFile(string sourcePath, out string? newPath, out string? errorMessage) - { - newPath = null; - errorMessage = null; - - if (!File.Exists(sourcePath)) - { - errorMessage = "Source file does not exist on disk."; - return false; - } - - try - { - var dir = Path.GetDirectoryName(sourcePath); - if (string.IsNullOrEmpty(dir)) - { - errorMessage = "Could not determine parent directory."; - return false; - } - - var nameWithoutExt = Path.GetFileNameWithoutExtension(sourcePath); - var ext = Path.GetExtension(sourcePath); - - string targetPath = Path.Combine(dir, $"{nameWithoutExt} (Copy){ext}"); - int copyIndex = 2; - - while (File.Exists(targetPath) && copyIndex <= 999) - { - targetPath = Path.Combine(dir, $"{nameWithoutExt} (Copy {copyIndex}){ext}"); - copyIndex++; - } - - File.Copy(sourcePath, targetPath, false); - newPath = targetPath; - return true; - } - catch (Exception ex) - { - errorMessage = $"Failed to create duplicate: {ex.Message}"; - return false; - } - } - - /// - /// Safely deletes a file from the disk. - /// - public static bool DeleteFile(string filePath, out string? errorMessage) - { - errorMessage = null; - - if (string.IsNullOrWhiteSpace(filePath)) - { - return true; - } - - if (!File.Exists(filePath)) - { - return true; // Already deleted - } - - try - { - File.Delete(filePath); - return true; - } - catch (Exception ex) - { - errorMessage = $"Failed to delete file: {ex.Message}"; - return false; - } - } - - /// - /// Cross-platform helper to highlight/select a file in macOS Finder, Windows Explorer, or Linux file managers. - /// - public static bool RevealInFileManager(string filePath, out string? errorMessage) - { - errorMessage = null; - - if (string.IsNullOrWhiteSpace(filePath)) - { - errorMessage = "File path is empty."; - return false; - } - - try - { - if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) - { - var psi = new ProcessStartInfo - { - FileName = "open", - Arguments = $"-R \"{filePath}\"", - UseShellExecute = false, - CreateNoWindow = true - }; - Process.Start(psi); - return true; - } - else if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) - { - var psi = new ProcessStartInfo - { - FileName = "explorer.exe", - Arguments = $"/select,\"{filePath}\"", - UseShellExecute = true - }; - Process.Start(psi); - return true; - } - else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) - { - var folder = File.Exists(filePath) ? Path.GetDirectoryName(filePath) : filePath; - if (string.IsNullOrEmpty(folder)) folder = "."; - - var psi = new ProcessStartInfo - { - FileName = "xdg-open", - Arguments = $"\"{folder}\"", - UseShellExecute = false, - CreateNoWindow = true - }; - Process.Start(psi); - return true; - } - else - { - errorMessage = "Unsupported operating system."; - return false; - } - } - catch (Exception ex) - { - errorMessage = $"Could not open file manager: {ex.Message}"; - return false; - } - } -} diff --git a/src/PdfEditorApp/Services/FontHelper.cs b/src/PdfEditorApp/Services/FontHelper.cs deleted file mode 100644 index cb0acc5..0000000 --- a/src/PdfEditorApp/Services/FontHelper.cs +++ /dev/null @@ -1,164 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using Avalonia.Media; - -namespace PdfEditorApp.Services; - -public static class FontHelper -{ - private static readonly HashSet KnownFontFamilies = new(StringComparer.OrdinalIgnoreCase) - { - // --- Core Bundled Fonts --- - "Roboto", - "Inter", - "Open Sans", - "Montserrat", - "Source Sans 3", - "Playfair Display", - "Lora", - "Merriweather", - "Cinzel", - "Fira Code", - "Roboto Mono", - "Comic Neue", - "Pacifico", - "Dancing Script", - "Caveat", - "Great Vibes", - "Lobster", - "Bebas Neue", - "Oswald", - "Orbitron", - - // --- On-Demand Web Fonts --- - "Lato", - "Poppins", - "Raleway", - "Nunito", - "Ubuntu", - "Noto Sans", - "Noto Serif", - "PT Serif", - "Crimson Text", - "Libre Baskerville", - "Libre Franklin", - "Josefin Sans", - "Titillium Web", - "Exo 2", - "Cabin", - - // --- Indian Scripts (Noto) --- - "Noto Sans Devanagari", - "Noto Sans Tamil", - "Noto Sans Telugu", - "Noto Sans Arabic", - "Noto Sans Gujarati", - "Noto Sans Kannada", - "Noto Sans Bengali", - "Noto Sans Malayalam", - "Noto Sans Sinhala", - "Tiro Devanagari Hindi", - - // --- CJK --- - "Noto Sans SC", // Simplified Chinese - "Noto Sans TC", // Traditional Chinese - "Noto Sans JP", // Japanese (Hiragana + Katakana + CJK) - "Noto Serif JP", // Japanese Serif - "Noto Sans KR", // Korean (full Hangul) - "Nanum Gothic", // Korean (additional) - - // --- Southeast Asian --- - "Noto Sans Thai", // Thai - "Sarabun", // Thai (modern) - "Noto Sans Myanmar", // Burmese - "Noto Sans Khmer", // Cambodian - "Noto Sans Lao", // Laotian - "Be Vietnam Pro", // Vietnamese (extended Latin) - - // --- Middle Eastern / RTL --- - "Noto Sans Hebrew", // Hebrew / Yiddish - "Heebo", // Hebrew (modern) - "Vazirmatn", // Persian / Farsi - "Noto Nastaliq Urdu", // Urdu (Nastaliq calligraphic style) - - // --- Eurasian --- - "Noto Sans Georgian", // Georgian - "Noto Sans Armenian", // Armenian - "Noto Sans Ethiopic", // Ethiopic (Amharic, Tigrinya) - "Golos Text", // Cyrillic / Russian - "Russo One", // Cyrillic display - "GFS Neohellenic", // Greek - }; - - public static void RegisterFontFamily(string fontName) - { - if (!string.IsNullOrWhiteSpace(fontName)) - { - lock (KnownFontFamilies) - { - KnownFontFamilies.Add(fontName); - } - } - } - - public static FontFamily CreateFontFamily(string? fontName) - { - if (string.IsNullOrWhiteSpace(fontName)) - return FontFamily.Default; - - // Check if there's a cached font file in the user cache directory - string userDir = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "FryPDF", "Fonts"); - string cleanName = fontName.Replace(" ", ""); - string ttfPath = Path.Combine(userDir, $"{cleanName}.ttf"); - - if (File.Exists(ttfPath)) - { - try - { - var uri = new Uri(ttfPath); - return new FontFamily($"file://{userDir}#{fontName}, avares://PdfEditorApp/Assets/Fonts#{fontName}, {fontName}"); - } - catch { } - } - - // Standard embedded asset resolution with system font fallback - return new FontFamily($"avares://PdfEditorApp/Assets/Fonts#{fontName}, {fontName}"); - } - - /// - /// Returns a safe fallback font family when the requested family cannot be resolved. - /// - public static string GetSafeFallback(string? requestedFamily) - { - if (string.IsNullOrWhiteSpace(requestedFamily)) return "Open Sans"; - - // Script-specific fallbacks - string lc = requestedFamily.ToLowerInvariant(); - if (lc.Contains("sc") || lc.Contains("hans") || lc.Contains("chinese") || lc.Contains("simsun") || lc.Contains("yahei")) return "Noto Sans SC"; - if (lc.Contains("tc") || lc.Contains("hant") || lc.Contains("mingliu")) return "Noto Sans TC"; - if (lc.Contains("jp") || lc.Contains("japanese") || lc.Contains("gothic") || lc.Contains("mincho")) return "Noto Sans JP"; - if (lc.Contains("kr") || lc.Contains("korean") || lc.Contains("hangul") || lc.Contains("malgun")) return "Noto Sans KR"; - if (lc.Contains("devanagari") || lc.Contains("hindi")) return "Noto Sans Devanagari"; - if (lc.Contains("tamil")) return "Noto Sans Tamil"; - if (lc.Contains("telugu")) return "Noto Sans Telugu"; - if (lc.Contains("arabic") || lc.Contains("urdu")) return "Noto Sans Arabic"; - if (lc.Contains("hebrew")) return "Noto Sans Hebrew"; - if (lc.Contains("thai")) return "Noto Sans Thai"; - if (lc.Contains("gujarati")) return "Noto Sans Gujarati"; - if (lc.Contains("kannada")) return "Noto Sans Kannada"; - if (lc.Contains("bengali")) return "Noto Sans Bengali"; - if (lc.Contains("malayalam")) return "Noto Sans Malayalam"; - - // Serif fallbacks - if (lc.Contains("serif") || lc.Contains("times") || lc.Contains("georgia") || - lc.Contains("garamond") || lc.Contains("baskerville")) - return "PT Serif"; - - // Mono fallbacks - if (lc.Contains("mono") || lc.Contains("code") || lc.Contains("courier")) - return "Fira Code"; - - return "Open Sans"; - } -} diff --git a/src/PdfEditorApp/Services/FontPackageService.cs b/src/PdfEditorApp/Services/FontPackageService.cs deleted file mode 100644 index db2b702..0000000 --- a/src/PdfEditorApp/Services/FontPackageService.cs +++ /dev/null @@ -1,595 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Net.Http; -using System.Threading; -using System.Threading.Tasks; -using PdfEditorApp.Core.Analysis; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Services; - -namespace PdfEditorApp.Services; - -/// -/// Professional on-demand font package management service. -/// Keeps FryPDF lightweight while giving users on-demand access to worldwide language packs. -/// -public class FontPackageService : IFontPackageService -{ - private static readonly HttpClient HttpClient = CreateHttpClient(); - - private static HttpClient CreateHttpClient() - { - var client = new HttpClient - { - Timeout = TimeSpan.FromMinutes(3) - }; - client.DefaultRequestHeaders.UserAgent.ParseAdd("FryPDF-FontDownloader/1.0"); - return client; - } - - private readonly string _userFontDir; - private readonly List _catalog; - - public event Action? FontLibraryChanged; - - public FontPackageService() - { - string localAppData = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); - _userFontDir = Path.Combine(localAppData, "FryPDF", "Fonts"); - - if (!Directory.Exists(_userFontDir)) - { - try { Directory.CreateDirectory(_userFontDir); } catch { } - } - - _catalog = BuildCatalog(); - - // Register any already-cached fonts on startup - RegisterAllDownloadedFontsWithQuestPdf(); - } - - public IReadOnlyList GetAllPackages() => _catalog; - - public string GetUserFontDirectory() => _userFontDir; - - public bool IsPackageInstalled(FontPackageInfo package) - { - if (package.Files.Count == 0) return true; - - foreach (var file in package.Files) - { - string userPath = Path.Combine(_userFontDir, file.FileName); - if (File.Exists(userPath) && new FileInfo(userPath).Length > 0) - continue; - - // Also check embedded fallback - string appPath = Path.Combine(AppContext.BaseDirectory, "Assets", "Fonts", file.FileName); - if (File.Exists(appPath) && new FileInfo(appPath).Length > 0) - continue; - - return false; - } - - return true; - } - - public async Task DownloadPackageAsync( - FontPackageInfo package, - IProgress? progress = null, - Action? statusCallback = null, - CancellationToken ct = default) - { - if (package.Files.Count == 0) - { - progress?.Report(1.0); - return true; - } - - Directory.CreateDirectory(_userFontDir); - - long totalBytesExpected = package.TotalEstimatedSizeBytes; - long totalBytesDownloaded = 0; - int completedFiles = 0; - - foreach (var file in package.Files) - { - if (ct.IsCancellationRequested) return false; - - string targetPath = Path.Combine(_userFontDir, file.FileName); - string tempPath = targetPath + ".tmp"; - - // If already downloaded and valid size, count as downloaded - if (File.Exists(targetPath) && new FileInfo(targetPath).Length > 1000) - { - totalBytesDownloaded += new FileInfo(targetPath).Length; - completedFiles++; - progress?.Report((double)totalBytesDownloaded / Math.Max(1, totalBytesExpected)); - continue; - } - - statusCallback?.Invoke($"Downloading {file.FileName}..."); - - try - { - using var response = await HttpClient.GetAsync(file.DownloadUrl, HttpCompletionOption.ResponseHeadersRead, ct); - response.EnsureSuccessStatusCode(); - - long? contentLength = response.Content.Headers.ContentLength; - using var sourceStream = await response.Content.ReadAsStreamAsync(ct); - using var fileStream = new FileStream(tempPath, FileMode.Create, FileAccess.Write, FileShare.None); - - byte[] buffer = new byte[81920]; - int bytesRead; - - while ((bytesRead = await sourceStream.ReadAsync(buffer, 0, buffer.Length, ct)) > 0) - { - await fileStream.WriteAsync(buffer, 0, bytesRead, ct); - totalBytesDownloaded += bytesRead; - if (totalBytesExpected > 0) - { - double p = Math.Min(0.99, (double)totalBytesDownloaded / totalBytesExpected); - progress?.Report(p); - } - } - - fileStream.Close(); - - if (File.Exists(targetPath)) - File.Delete(targetPath); - - File.Move(tempPath, targetPath); - - // Register with QuestPDF dynamically - try - { - using var regStream = File.OpenRead(targetPath); - QuestPDF.Drawing.FontManager.RegisterFont(regStream); - } - catch { } - - completedFiles++; - } - catch (Exception ex) - { - if (File.Exists(tempPath)) - { - try { File.Delete(tempPath); } catch { } - } - - statusCallback?.Invoke($"Error downloading {file.FileName}: {ex.Message}"); - return false; - } - } - - progress?.Report(1.0); - statusCallback?.Invoke("Installed successfully!"); - FontLibraryChanged?.Invoke(); - return true; - } - - public async Task DeletePackageAsync(FontPackageInfo package) - { - return await Task.Run(() => - { - try - { - foreach (var file in package.Files) - { - string targetPath = Path.Combine(_userFontDir, file.FileName); - if (File.Exists(targetPath)) - { - File.Delete(targetPath); - } - } - - FontLibraryChanged?.Invoke(); - return true; - } - catch - { - return false; - } - }); - } - - public async Task GetTotalCacheSizeBytesAsync() - { - return await Task.Run(() => - { - if (!Directory.Exists(_userFontDir)) return 0L; - try - { - var dir = new DirectoryInfo(_userFontDir); - return dir.GetFiles("*.*", SearchOption.TopDirectoryOnly).Sum(f => f.Length); - } - catch - { - return 0L; - } - }); - } - - public async Task ClearAllCacheAsync() - { - await Task.Run(() => - { - if (!Directory.Exists(_userFontDir)) return; - try - { - foreach (var file in Directory.GetFiles(_userFontDir, "*.*")) - { - try { File.Delete(file); } catch { } - } - FontLibraryChanged?.Invoke(); - } - catch { } - }); - } - - public async Task ImportCustomFontAsync(string sourceFilePath) - { - if (!File.Exists(sourceFilePath)) return false; - - string ext = Path.GetExtension(sourceFilePath).ToLowerInvariant(); - if (ext != ".ttf" && ext != ".otf") return false; - - return await Task.Run(() => - { - try - { - Directory.CreateDirectory(_userFontDir); - string fileName = Path.GetFileName(sourceFilePath); - string destPath = Path.Combine(_userFontDir, fileName); - - File.Copy(sourceFilePath, destPath, true); - - using (var stream = File.OpenRead(destPath)) - { - QuestPDF.Drawing.FontManager.RegisterFont(stream); - } - - FontLibraryChanged?.Invoke(); - return true; - } - catch - { - return false; - } - }); - } - - public FontPackageInfo? DetectMissingPackageForText(string text) - { - if (string.IsNullOrWhiteSpace(text)) return null; - - if (UnicodeScriptDetector.ContainsCjk(text)) - { - string detectedFont = UnicodeScriptDetector.DetectScriptFontFamily(text); - var matchingPack = _catalog.FirstOrDefault(p => p.IncludedFontFamilies.Contains(detectedFont)); - if (matchingPack != null && !IsPackageInstalled(matchingPack)) - { - return matchingPack; - } - } - else if (UnicodeScriptDetector.ContainsDevanagari(text)) - { - var indicPack = _catalog.FirstOrDefault(p => p.Id == "indic"); - if (indicPack != null && !IsPackageInstalled(indicPack)) - return indicPack; - } - else if (UnicodeScriptDetector.IsRtlText(text)) - { - var arabicPack = _catalog.FirstOrDefault(p => p.Id == "arabic"); - if (arabicPack != null && !IsPackageInstalled(arabicPack)) - return arabicPack; - } - - return null; - } - - public IEnumerable GetAllAvailableFontFilePaths() - { - var paths = new HashSet(StringComparer.OrdinalIgnoreCase); - - // User cache - if (Directory.Exists(_userFontDir)) - { - foreach (var f in Directory.GetFiles(_userFontDir, "*.*")) - { - string ext = Path.GetExtension(f).ToLowerInvariant(); - if (ext == ".ttf" || ext == ".otf") - paths.Add(f); - } - } - - // App assets - string[] searchPaths = - { - Path.Combine(AppContext.BaseDirectory, "Assets", "Fonts"), - Path.Combine(AppContext.BaseDirectory, "..", "..", "..", "Assets", "Fonts"), - Path.Combine(Directory.GetCurrentDirectory(), "src", "PdfEditorApp", "Assets", "Fonts"), - Path.Combine(Directory.GetCurrentDirectory(), "Assets", "Fonts") - }; - - foreach (var basePath in searchPaths) - { - if (Directory.Exists(basePath)) - { - foreach (var f in Directory.GetFiles(basePath, "*.ttf")) - paths.Add(f); - break; - } - } - - return paths; - } - - public void RegisterAllDownloadedFontsWithQuestPdf() - { - try - { - foreach (var fontPath in GetAllAvailableFontFilePaths()) - { - try - { - using var stream = File.OpenRead(fontPath); - QuestPDF.Drawing.FontManager.RegisterFont(stream); - } - catch { } - } - } - catch { } - } - - /// - /// Base URL for the official FryPDF font repository on GitHub. - /// Eliminates Google Fonts CDN hash breakage and ensures 100% reliable downloads worldwide. - /// - public const string FontCdnBaseUrl = "https://raw.githubusercontent.com/codefrydev/PDFCreator-resources/refs/heads/main/fonts"; - - private static string CdnUrl(string fileName) => $"{FontCdnBaseUrl}/{fileName}"; - - private static List BuildCatalog() - { - return new List - { - // ── 1. Simplified Chinese ────────────────────────────────────────── - new() - { - Id = "zh-hans", - Name = "Simplified Chinese", - NativeName = "简体中文", - FlagEmoji = "🇨🇳", - Region = "China, Singapore, Global", - Category = FontPackageCategory.EastAsia, - Description = "Complete Simplified Chinese typography with full GB2312/GBK coverage for reports, contracts, and documents.", - SampleText = "创造世界一流的 PDF 编辑与文档处理体验。", - SupportedLanguages = new() { "Chinese (Simplified)", "Mandarin" }, - IncludedFontFamilies = new() { "Noto Sans SC" }, - TotalEstimatedSizeBytes = 21_071_052, - Files = new() - { - new() { FileName = "NotoSansSC.ttf", DownloadUrl = CdnUrl("NotoSansSC.ttf"), FontFamilyName = "Noto Sans SC", FileSizeBytes = 10_540_644 }, - new() { FileName = "NotoSansSC-Bold.ttf", DownloadUrl = CdnUrl("NotoSansSC-Bold.ttf"), FontFamilyName = "Noto Sans SC", IsBold = true, FileSizeBytes = 10_530_408 } - } - }, - - // ── 2. Traditional Chinese ───────────────────────────────────────── - new() - { - Id = "zh-hant", - Name = "Traditional Chinese", - NativeName = "繁體中文", - FlagEmoji = "🇹🇼", - Region = "Taiwan, Hong Kong, Macau", - Category = FontPackageCategory.EastAsia, - Description = "High-precision Traditional Chinese typography with Big5 and full character coverage for legal, business, and publishing.", - SampleText = "創造世界一流的 PDF 編輯與文件處理體驗。", - SupportedLanguages = new() { "Chinese (Traditional)", "Cantonese", "Taiwanese" }, - IncludedFontFamilies = new() { "Noto Sans TC" }, - TotalEstimatedSizeBytes = 14_176_420, - Files = new() - { - new() { FileName = "NotoSansTC.ttf", DownloadUrl = CdnUrl("NotoSansTC.ttf"), FontFamilyName = "Noto Sans TC", FileSizeBytes = 7_090_820 }, - new() { FileName = "NotoSansTC-Bold.ttf", DownloadUrl = CdnUrl("NotoSansTC-Bold.ttf"), FontFamilyName = "Noto Sans TC", IsBold = true, FileSizeBytes = 7_085_600 } - } - }, - - // ── 3. Japanese ─────────────────────────────────────────────────── - new() - { - Id = "ja", - Name = "Japanese", - NativeName = "日本語", - FlagEmoji = "🇯🇵", - Region = "Japan", - Category = FontPackageCategory.EastAsia, - Description = "Includes both modern Sans-Serif and elegant Serif Japanese fonts for Hiragana, Katakana, and Kanji.", - SampleText = "世界最高峰のPDF編集およびドキュメント作成体験を提供します。", - SupportedLanguages = new() { "Japanese" }, - IncludedFontFamilies = new() { "Noto Sans JP", "Noto Serif JP" }, - TotalEstimatedSizeBytes = 18_121_784, - Files = new() - { - new() { FileName = "NotoSansJP.ttf", DownloadUrl = CdnUrl("NotoSansJP.ttf"), FontFamilyName = "Noto Sans JP", FileSizeBytes = 5_324_144 }, - new() { FileName = "NotoSansJP-Bold.ttf", DownloadUrl = CdnUrl("NotoSansJP-Bold.ttf"), FontFamilyName = "Noto Sans JP", IsBold = true, FileSizeBytes = 5_319_680 }, - new() { FileName = "NotoSerifJP.ttf", DownloadUrl = CdnUrl("NotoSerifJP.ttf"), FontFamilyName = "Noto Serif JP", FileSizeBytes = 7_477_960 } - } - }, - - // ── 4. Korean ───────────────────────────────────────────────────── - new() - { - Id = "ko", - Name = "Korean", - NativeName = "한국어", - FlagEmoji = "🇰🇷", - Region = "South Korea", - Category = FontPackageCategory.EastAsia, - Description = "Complete Hangul syllable and Jamo character set with Noto Sans KR and Nanum Gothic for professional Korean documents.", - SampleText = "세계 최고 수준의 PDF 편집 및 문서 작성 경험을 선사합니다.", - SupportedLanguages = new() { "Korean" }, - IncludedFontFamilies = new() { "Noto Sans KR", "Nanum Gothic" }, - TotalEstimatedSizeBytes = 14_375_144, - Files = new() - { - new() { FileName = "NotoSansKR.ttf", DownloadUrl = CdnUrl("NotoSansKR.ttf"), FontFamilyName = "Noto Sans KR", FileSizeBytes = 6_163_256 }, - new() { FileName = "NotoSansKR-Bold.ttf", DownloadUrl = CdnUrl("NotoSansKR-Bold.ttf"), FontFamilyName = "Noto Sans KR", IsBold = true, FileSizeBytes = 6_159_248 }, - new() { FileName = "NanumGothic.ttf", DownloadUrl = CdnUrl("NanumGothic.ttf"), FontFamilyName = "Nanum Gothic", FileSizeBytes = 2_052_640 } - } - }, - - // ── 5. Indic Languages ──────────────────────────────────────────── - new() - { - Id = "indic", - Name = "Indic Languages Pack", - NativeName = "भारतीय भाषाएँ", - FlagEmoji = "🇮🇳", - Region = "India, Nepal, Sri Lanka, Bangladesh", - Category = FontPackageCategory.SouthAsia, - Description = "Comprehensive Indian subcontinent typography: Devanagari (Hindi/Marathi/Sanskrit), Tamil, Telugu, Bengali, Gujarati, Kannada, Malayalam, and Tiro Hindi.", - SampleText = "भारत का सबसे तेज़ और सुरक्षित PDF एडिटर और क्रिएटर।", - SupportedLanguages = new() { "Hindi", "Marathi", "Sanskrit", "Tamil", "Telugu", "Bengali", "Gujarati", "Kannada", "Malayalam" }, - IncludedFontFamilies = new() { "Noto Sans Devanagari", "Tiro Devanagari Hindi", "Noto Sans Tamil", "Noto Sans Telugu", "Noto Sans Bengali", "Noto Sans Gujarati", "Noto Sans Kannada", "Noto Sans Malayalam" }, - TotalEstimatedSizeBytes = 1_414_088, - Files = new() - { - new() { FileName = "NotoSansDevanagari.ttf", DownloadUrl = CdnUrl("NotoSansDevanagari.ttf"), FontFamilyName = "Noto Sans Devanagari", FileSizeBytes = 219_460 }, - new() { FileName = "TiroDevanagariHindi.ttf", DownloadUrl = CdnUrl("TiroDevanagariHindi.ttf"), FontFamilyName = "Tiro Devanagari Hindi", FileSizeBytes = 376_908 }, - new() { FileName = "NotoSansTamil.ttf", DownloadUrl = CdnUrl("NotoSansTamil.ttf"), FontFamilyName = "Noto Sans Tamil", FileSizeBytes = 77_724 }, - new() { FileName = "NotoSansTelugu.ttf", DownloadUrl = CdnUrl("NotoSansTelugu.ttf"), FontFamilyName = "Noto Sans Telugu", FileSizeBytes = 178_492 }, - new() { FileName = "NotoSansBengali.ttf", DownloadUrl = CdnUrl("NotoSansBengali.ttf"), FontFamilyName = "Noto Sans Bengali", FileSizeBytes = 138_780 }, - new() { FileName = "NotoSansGujarati.ttf", DownloadUrl = CdnUrl("NotoSansGujarati.ttf"), FontFamilyName = "Noto Sans Gujarati", FileSizeBytes = 173_540 }, - new() { FileName = "NotoSansKannada.ttf", DownloadUrl = CdnUrl("NotoSansKannada.ttf"), FontFamilyName = "Noto Sans Kannada", FileSizeBytes = 143_576 }, - new() { FileName = "NotoSansMalayalam.ttf", DownloadUrl = CdnUrl("NotoSansMalayalam.ttf"), FontFamilyName = "Noto Sans Malayalam", FileSizeBytes = 105_608 } - } - }, - - // ── 6. Arabic, Persian & Urdu ───────────────────────────────────── - new() - { - Id = "arabic", - Name = "Arabic, Persian & Urdu", - NativeName = "العربية / فارسی / اردو", - FlagEmoji = "🇸🇦", - Region = "Middle East, North Africa, Pakistan, Iran", - Category = FontPackageCategory.MiddleEast, - Description = "RTL-optimized font suite featuring Noto Sans Arabic, Vazirmatn (Farsi), and calligraphic Noto Nastaliq Urdu.", - SampleText = "محرر ومُنشئ مستندات PDF الاحترافي والأكثر أماناً وسرعة.", - SupportedLanguages = new() { "Arabic", "Persian (Farsi)", "Urdu", "Pashto", "Kurdish" }, - IncludedFontFamilies = new() { "Noto Sans Arabic", "Vazirmatn", "Noto Nastaliq Urdu" }, - TotalEstimatedSizeBytes = 824_404, - Files = new() - { - new() { FileName = "NotoSansArabic.ttf", DownloadUrl = CdnUrl("NotoSansArabic.ttf"), FontFamilyName = "Noto Sans Arabic", FileSizeBytes = 192_144 }, - new() { FileName = "Vazirmatn.ttf", DownloadUrl = CdnUrl("Vazirmatn.ttf"), FontFamilyName = "Vazirmatn", FileSizeBytes = 104_640 }, - new() { FileName = "NotoNastaliqUrdu.ttf", DownloadUrl = CdnUrl("NotoNastaliqUrdu.ttf"), FontFamilyName = "Noto Nastaliq Urdu", FileSizeBytes = 527_620 } - } - }, - - // ── 7. Hebrew ───────────────────────────────────────────────────── - new() - { - Id = "hebrew", - Name = "Hebrew", - NativeName = "עברית", - FlagEmoji = "🇮🇱", - Region = "Israel, Global", - Category = FontPackageCategory.MiddleEast, - Description = "Modern and classic Hebrew typography featuring Noto Sans Hebrew and Heebo for documents and books.", - SampleText = "עורך ומציג מסמכי ה-PDF המקצועי והמהיר ביותר.", - SupportedLanguages = new() { "Hebrew", "Yiddish" }, - IncludedFontFamilies = new() { "Noto Sans Hebrew", "Heebo" }, - TotalEstimatedSizeBytes = 90_452, - Files = new() - { - new() { FileName = "NotoSansHebrew.ttf", DownloadUrl = CdnUrl("NotoSansHebrew.ttf"), FontFamilyName = "Noto Sans Hebrew", FileSizeBytes = 46_496 }, - new() { FileName = "Heebo.ttf", DownloadUrl = CdnUrl("Heebo.ttf"), FontFamilyName = "Heebo", FileSizeBytes = 43_956 } - } - }, - - // ── 8. Southeast Asian ──────────────────────────────────────────── - new() - { - Id = "southeast-asia", - Name = "Southeast Asian Pack", - NativeName = "ไทย, မြန်မာ, ខ្មែរ, ລາວ", - FlagEmoji = "🇹🇭", - Region = "Thailand, Myanmar, Cambodia, Laos, Sri Lanka, Vietnam", - Category = FontPackageCategory.SoutheastAsia, - Description = "Complete Southeast Asian fonts: Thai (Sarabun & Noto), Burmese (Myanmar), Khmer, Lao, Sinhala, and Vietnamese (Be Vietnam Pro).", - SampleText = "โปรแกรมสร้างและแก้ไขไฟล์ PDF ระดับมืออาชีพที่ปลอดภัยที่สุด", - SupportedLanguages = new() { "Thai", "Burmese", "Khmer", "Lao", "Sinhala", "Vietnamese" }, - IncludedFontFamilies = new() { "Noto Sans Thai", "Sarabun", "Noto Sans Myanmar", "Noto Sans Khmer", "Noto Sans Lao", "Noto Sans Sinhala", "Be Vietnam Pro" }, - TotalEstimatedSizeBytes = 820_332, - Files = new() - { - new() { FileName = "NotoSansThai.ttf", DownloadUrl = CdnUrl("NotoSansThai.ttf"), FontFamilyName = "Noto Sans Thai", FileSizeBytes = 45_660 }, - new() { FileName = "Sarabun.ttf", DownloadUrl = CdnUrl("Sarabun.ttf"), FontFamilyName = "Sarabun", FileSizeBytes = 81_516 }, - new() { FileName = "NotoSansMyanmar.ttf", DownloadUrl = CdnUrl("NotoSansMyanmar.ttf"), FontFamilyName = "Noto Sans Myanmar", FileSizeBytes = 181_864 }, - new() { FileName = "NotoSansKhmer.ttf", DownloadUrl = CdnUrl("NotoSansKhmer.ttf"), FontFamilyName = "Noto Sans Khmer", FileSizeBytes = 104_132 }, - new() { FileName = "NotoSansLao.ttf", DownloadUrl = CdnUrl("NotoSansLao.ttf"), FontFamilyName = "Noto Sans Lao", FileSizeBytes = 51_004 }, - new() { FileName = "NotoSansSinhala.ttf", DownloadUrl = CdnUrl("NotoSansSinhala.ttf"), FontFamilyName = "Noto Sans Sinhala", FileSizeBytes = 235_928 }, - new() { FileName = "BeVietnamPro.ttf", DownloadUrl = CdnUrl("BeVietnamPro.ttf"), FontFamilyName = "Be Vietnam Pro", FileSizeBytes = 120_228 } - } - }, - - // ── 9. Eurasian & Eastern Europe ────────────────────────────────── - new() - { - Id = "eurasia", - Name = "Eurasian & Eastern European", - NativeName = "Русский, Ελληνικά, ქართული, Հայերեն", - FlagEmoji = "🌍", - Region = "Eastern Europe, Caucasus, Horn of Africa", - Category = FontPackageCategory.EuropeAndEurasia, - Description = "Cyrillic (Golos & Russo One), Greek (GFS Neohellenic), Georgian, Armenian, and Ethiopic (Amharic).", - SampleText = "Самый быстрый и безопасный редактор и создатель PDF документов.", - SupportedLanguages = new() { "Russian", "Ukrainian", "Bulgarian", "Greek", "Georgian", "Armenian", "Amharic" }, - IncludedFontFamilies = new() { "Golos Text", "Russo One", "GFS Neohellenic", "Noto Sans Georgian", "Noto Sans Armenian", "Noto Sans Ethiopic" }, - TotalEstimatedSizeBytes = 1_016_072, - Files = new() - { - new() { FileName = "GolosText.ttf", DownloadUrl = CdnUrl("GolosText.ttf"), FontFamilyName = "Golos Text", FileSizeBytes = 64_240 }, - new() { FileName = "RussoOne.ttf", DownloadUrl = CdnUrl("RussoOne.ttf"), FontFamilyName = "Russo One", FileSizeBytes = 36_816 }, - new() { FileName = "GFSNeohellenic.ttf", DownloadUrl = CdnUrl("GFSNeohellenic.ttf"), FontFamilyName = "GFS Neohellenic", FileSizeBytes = 440_376 }, - new() { FileName = "NotoSansGeorgian.ttf", DownloadUrl = CdnUrl("NotoSansGeorgian.ttf"), FontFamilyName = "Noto Sans Georgian", FileSizeBytes = 60_888 }, - new() { FileName = "NotoSansArmenian.ttf", DownloadUrl = CdnUrl("NotoSansArmenian.ttf"), FontFamilyName = "Noto Sans Armenian", FileSizeBytes = 48_388 }, - new() { FileName = "NotoSansEthiopic.ttf", DownloadUrl = CdnUrl("NotoSansEthiopic.ttf"), FontFamilyName = "Noto Sans Ethiopic", FileSizeBytes = 365_364 } - } - }, - - // ── 10. Creative & Typography Pack ───────────────────────────────── - new() - { - Id = "creative-design", - Name = "Creative & Typography Pack", - NativeName = "Modern Display & Script", - FlagEmoji = "🎨", - Region = "Global", - Category = FontPackageCategory.DesignAndTypography, - Description = "Expanded design fonts for brochures, certificates, flyers, and branding: Poppins, Lato, Raleway, Nunito, Ubuntu, Playfair Display, Cinzel, Orbitron, Lobster, Pacifico, Dancing Script, and Titillium Web.", - SampleText = "Design stunning certificates, invoices, and branded documents.", - SupportedLanguages = new() { "All Latin Languages" }, - IncludedFontFamilies = new() { "Poppins", "Lato", "Raleway", "Nunito", "Ubuntu", "Playfair Display", "Cinzel", "Orbitron", "Lobster", "Pacifico", "Dancing Script", "Titillium Web", "Exo 2", "Cabin" }, - TotalEstimatedSizeBytes = 1_264_788, - Files = new() - { - new() { FileName = "Poppins.ttf", DownloadUrl = CdnUrl("Poppins.ttf"), FontFamilyName = "Poppins", FileSizeBytes = 154_628 }, - new() { FileName = "Poppins-Bold.ttf", DownloadUrl = CdnUrl("Poppins-Bold.ttf"), FontFamilyName = "Poppins", IsBold = true, FileSizeBytes = 150_292 }, - new() { FileName = "Lato.ttf", DownloadUrl = CdnUrl("Lato.ttf"), FontFamilyName = "Lato", FileSizeBytes = 72_312 }, - new() { FileName = "Lato-Bold.ttf", DownloadUrl = CdnUrl("Lato-Bold.ttf"), FontFamilyName = "Lato", IsBold = true, FileSizeBytes = 70_576 }, - new() { FileName = "Raleway.ttf", DownloadUrl = CdnUrl("Raleway.ttf"), FontFamilyName = "Raleway", FileSizeBytes = 138_808 }, - new() { FileName = "Nunito.ttf", DownloadUrl = CdnUrl("Nunito.ttf"), FontFamilyName = "Nunito", FileSizeBytes = 125_528 }, - new() { FileName = "Ubuntu.ttf", DownloadUrl = CdnUrl("Ubuntu.ttf"), FontFamilyName = "Ubuntu", FileSizeBytes = 280_328 }, - new() { FileName = "TitilliumWeb.ttf", DownloadUrl = CdnUrl("TitilliumWeb.ttf"), FontFamilyName = "Titillium Web", FileSizeBytes = 53_980 }, - new() { FileName = "Exo2.ttf", DownloadUrl = CdnUrl("Exo2.ttf"), FontFamilyName = "Exo 2", FileSizeBytes = 143_780 }, - new() { FileName = "Cabin.ttf", DownloadUrl = CdnUrl("Cabin.ttf"), FontFamilyName = "Cabin", FileSizeBytes = 74_556 } - } - } - }; - } -} diff --git a/src/PdfEditorApp/Services/FryPdfDocument.cs b/src/PdfEditorApp/Services/FryPdfDocument.cs deleted file mode 100644 index c139596..0000000 --- a/src/PdfEditorApp/Services/FryPdfDocument.cs +++ /dev/null @@ -1,65 +0,0 @@ -using System; -using QuestPDF.Fluent; -using QuestPDF.Infrastructure; - -namespace PdfEditorApp.Services; - -/// -/// Universal QuestPDF IDocument wrapper ensuring enterprise FryPDF Creator and codefrydev.in Producer metadata branding. -/// -public class FryPdfDocument : IDocument -{ - private readonly Action _compose; - private readonly string _title; - private readonly string _author; - private readonly string _subject; - private readonly string _keywords; - private readonly string _creator; - private readonly string _producer; - - public FryPdfDocument( - Action compose, - string? title = null, - string? author = null, - string? subject = null, - string? keywords = null, - string? creator = null, - string? producer = null) - { - _compose = compose; - _title = title ?? "FryPDF Document"; - _author = author ?? "FryPDF"; - _subject = subject ?? ""; - _keywords = keywords ?? ""; - _creator = !string.IsNullOrWhiteSpace(creator) ? creator : "FryPDF"; - _producer = !string.IsNullOrWhiteSpace(producer) ? producer : "codefrydev.in"; - } - - public DocumentMetadata GetMetadata() => new DocumentMetadata - { - Title = _title, - Author = _author, - Subject = _subject, - Keywords = _keywords, - Creator = _creator, - Producer = _producer, - CreationDate = DateTime.UtcNow, - ModifiedDate = DateTime.UtcNow - }; - - public DocumentSettings GetSettings() => DocumentSettings.Default; - - public void Compose(IDocumentContainer container) => _compose(container); - - public static IDocument Create( - Action compose, - string? title = null, - string? author = null, - string? subject = null, - string? keywords = null, - string? creator = null, - string? producer = null) - { - return new FryPdfDocument(compose, title, author, subject, keywords, creator, producer); - } -} diff --git a/src/PdfEditorApp/Services/HelpGuideService.cs b/src/PdfEditorApp/Services/HelpGuideService.cs deleted file mode 100644 index 12f598c..0000000 --- a/src/PdfEditorApp/Services/HelpGuideService.cs +++ /dev/null @@ -1,1796 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using PdfEditorApp.Models; - -namespace PdfEditorApp.Services; - -/// -/// Comprehensive, offline-first service providing step-by-step guides, pro-tips, key features, and specifications -/// for all 32 PDF tools, the live canvas document editor, automation workflows, batch generation, and international typography. -/// -public class HelpGuideService : IHelpGuideService -{ - private readonly List _guides; - private readonly List _categories; - - public HelpGuideService() - { - _guides = new List - { - // ========================================================================= - // 1. GETTING STARTED & CORE BASICS - // ========================================================================= - new HelpGuideItem - { - Id = "getting-started", - Title = "Welcome to FryPDF Studio", - Category = "Getting Started", - Summary = "Learn the basics of FryPDF: a privacy-first, ultra-fast PDF creation and manipulation studio.", - Description = "FryPDF is an all-in-one PDF powerhouse engineered with .NET 10, Avalonia UI, QuestPDF, and SkiaSharp. Everything runs 100% locally on your machine—no cloud uploads, no subscriptions, and total data privacy.", - Steps = new List - { - "Launch FryPDF to arrive at the Home Dashboard featuring quick actions, recent files, and 32 specialized PDF tools.", - "Choose 'New Document' to start from a blank canvas or pick from 19+ professionally designed templates.", - "Use 'Open File' or drag and drop any .frypdf, .pdf, or .json file to view or edit existing documents.", - "Press ⌘K (or Ctrl+K on Windows/Linux) anytime to bring up the Quick Command Palette to launch tools, search guides, or insert elements.", - "Switch between Light and Dark themes anytime using the toggle button in the bottom-left sidebar." - }, - KeyFeatures = new List - { - "100% Offline & Private: Zero telemetry or external server processing", - "Dual-Mode Studio: High-performance Acrobat-style Reader + Full Canvas Editor", - "32 Built-in Single & Multi-File PDF Utility Tools", - "Native .frypdf Workspace Persistence with embedded project states in exported PDFs" - }, - ProTips = new List - { - "You can double-click any recent file from the Home Dashboard to open it immediately.", - "Press F1 or Shift+? at any point to view the keyboard shortcut cheat sheet." - }, - SupportedFormats = "Native: .frypdf, .json | Standard: .pdf, .docx, .xlsx, .pptx, images", - KeyboardShortcut = "⌘K / Ctrl+K (Command Palette)", - IconKind = "RocketLaunchOutline", - IconColorHex = "#0284C7", - BackgroundAccentHex = "#E0F2FE", - Badge = "Getting Started", - Keywords = "intro start quickstart overview privacy offline mac windows linux theme darkmode", - IsFeatured = true - }, - new HelpGuideItem - { - Id = "pdf-reader-mode", - Title = "PDF Reader & Acrobat Navigation", - Category = "Getting Started", - Summary = "Read and review PDF documents with continuous scroll, bookmark outline trees, and reading themes.", - Description = "The dedicated PDF Reader mode allows you to read large documents comfortably with high-precision vector rendering, thumbnail previews, bookmark navigation, and eye-friendly color themes.", - Steps = new List - { - "Click 'PDF Reader' in the left sidebar or select 'PDF Reader Mode' from the Home Dashboard.", - "Click 'Open PDF Document' or drag and drop any standard PDF file into the drop zone.", - "Use the sidebar to view page thumbnails or navigate via the interactive Document Outline tree.", - "Choose your preferred viewing theme: Default White, Eye-Comfort Sepia, Dark Night, or High Contrast.", - "Use the zoom slider (⌘+ / ⌘-) or quick buttons (Fit Width ⌘1, Fit Page ⌘9) to optimize your reading layout." - }, - KeyFeatures = new List - { - "Multi-Theme Reading: Default, Sepia, Dark, High-Contrast", - "Continuous Vertical Scrolling and Single/Spread Page View Modes", - "Interactive Table of Contents & Bookmarks Navigation", - "In-Document Text Search with live match highlighting" - }, - ProTips = new List - { - "Use the Sepia theme for long-form reading sessions to minimize eye fatigue.", - "Click the 'Edit in Canvas' button in the viewer toolbar to deconstruct and edit the PDF directly." - }, - SupportedFormats = "Input: .pdf", - KeyboardShortcut = "⌘1 (Fit Width), ⌘9 (Fit Page)", - IconKind = "BookOpenPageVariantOutline", - IconColorHex = "#DC2626", - BackgroundAccentHex = "#FEE2E2", - Badge = "Reader Mode", - Keywords = "reader read pdf viewer sepia dark outline bookmarks scroll pages zoom", - IsFeatured = true - }, - new HelpGuideItem - { - Id = "templates-guide", - Title = "Template Studio & Document Gallery", - Category = "Getting Started", - Summary = "Jumpstart your documents with 19+ curated templates including Invoices, Resumes, and Academic Papers.", - Description = "The Template Studio provides a rich library of pre-formatted, production-ready templates. Every template is fully editable down to each text block, logo, color palette, and vector element.", - Steps = new List - { - "Select 'New Document' from the left sidebar to enter the Template Gallery.", - "Filter templates by category: Business, Finance, Academic & Research, Certificates, Invitations, or General.", - "Click on any template card to instantly instantiate and open it inside the live Canvas Editor.", - "Double-click any text box to replace sample copy with your own information.", - "Export your finished document using ⌘E (Export to PDF)." - }, - KeyFeatures = new List - { - "19+ High-Quality Templates: Invoices, Executive CVs, Discrete Math Research, Certificates, Art Deco Gala Invitations", - "Pre-configured typography, color schemes, and vector embellishments", - "Instant blank document creation with standard paper sizes (A4, Letter, Legal, Tabloid)" - }, - ProTips = new List - { - "Academic and math templates include pre-rendered LaTeX formulas and 2-column scientific grids.", - "All templates automatically detect your system fonts and fallback gracefully to embedded Noto Sans families." - }, - SupportedFormats = "Output: .frypdf, .pdf", - KeyboardShortcut = "⌘N / Ctrl+N (New Document)", - IconKind = "ViewDashboardOutline", - IconColorHex = "#10B981", - BackgroundAccentHex = "#ECFDF5", - Badge = "Templates", - Keywords = "templates gallery new invoice resume cv academic certificate letter formal blank", - IsFeatured = true - }, - - // ========================================================================= - // 2. ALL 32 PDF TOOLS (ORGANIZE, OPTIMIZE, CONVERT, EDIT, AI & AUTOMATION) - // ========================================================================= - new HelpGuideItem - { - Id = "tool-merge", - Title = "Merge PDF Files", - Category = "32 PDF Tools", - Summary = "Combine multiple PDF documents into a single unified file in custom order.", - Description = "The Merge PDF tool combines two or more PDF files into a single, cohesive document. You can drag and drop multiple files, reorder them with up/down arrows, and compile them with a single click.", - Steps = new List - { - "Open 'Merge PDF' from the Tools Studio or press ⌘K and type 'Merge PDF'.", - "Click 'Add PDF Files' or drag and drop your PDFs into the file staging area.", - "Reorder files using the move up/down controls or remove any unwanted files.", - "Specify your desired output filename or leave default.", - "Click 'Merge PDFs' to generate your combined PDF in seconds." - }, - KeyFeatures = new List - { - "Batch multi-file support with visual reordering", - "Preserves internal bookmarks, links, and high-resolution images", - "Generates compliant, optimized output with zero quality loss" - }, - ProTips = new List - { - "You can drag and drop dozens of PDF files at once directly onto the tool page.", - "After merging, you can open the result in the PDF Viewer or Editor with one click." - }, - SupportedFormats = "Inputs: Multiple .pdf | Output: Single .pdf", - RelatedToolId = PdfToolId.MergePdf, - IconKind = "CallMerge", - IconColorHex = "#EA580C", - BackgroundAccentHex = "#FFF7ED", - Badge = "Organize", - Keywords = "merge combine join pdfs bind assemble files batch", - IsFeatured = true - }, - new HelpGuideItem - { - Id = "tool-split", - Title = "Split PDF Pages & Ranges", - Category = "32 PDF Tools", - Summary = "Extract specific page ranges, split by intervals, or separate into individual page files.", - Description = "The Split PDF tool allows you to divide a large PDF into smaller standalone documents by custom page ranges, fixed page intervals, or individual single pages.", - Steps = new List - { - "Open 'Split PDF' from the Tools Studio.", - "Select or drop your source PDF document.", - "Choose your split mode: 'Custom Ranges' (e.g. 1-3, 5, 8-10), 'Fixed Intervals' (e.g. every 2 pages), or 'All Pages'.", - "Review the output file preview list.", - "Click 'Split PDF' to export your new files to the chosen directory." - }, - KeyFeatures = new List - { - "Custom page range syntax (e.g. '1-4, 7, 9-12')", - "Burst mode: Extract each page as a distinct single-page PDF", - "Odd / Even page split support" - }, - ProTips = new List - { - "Use comma-separated ranges to create multiple output files in a single pass.", - "All extracted files retain full vector quality and embedded fonts." - }, - SupportedFormats = "Input: .pdf | Output: Multiple .pdf files", - RelatedToolId = PdfToolId.SplitPdf, - IconKind = "CallSplit", - IconColorHex = "#DC2626", - BackgroundAccentHex = "#FEF2F2", - Badge = "Organize", - Keywords = "split extract divide separate pages ranges interval burst", - IsFeatured = true - }, - new HelpGuideItem - { - Id = "tool-compress", - Title = "Compress & Optimize PDF", - Category = "32 PDF Tools", - Summary = "Reduce PDF file sizes dramatically while retaining crisp vector typography and clear images.", - Description = "Compress PDF analyzes embedded image streams, strips duplicate metadata, and applies optimized stream compression algorithms to drastically shrink file sizes for email sharing and web publishing.", - Steps = new List - { - "Open 'Compress PDF' from the Tools Studio.", - "Select the PDF file(s) you wish to shrink.", - "Select your compression level: 'Recommended' (best balance), 'Extreme' (smallest size), or 'Light' (maximal fidelity).", - "Click 'Compress PDF'.", - "Inspect the before/after file size summary and percentage savings." - }, - KeyFeatures = new List - { - "3 Compression Presets: Extreme, Recommended, and Light", - "Intelligent Skia image resampling and DCT quality tuning", - "Removes redundant stream objects and unreferenced fonts" - }, - ProTips = new List - { - "Scanned image-heavy PDFs often see 70%–90% file size reduction with Recommended compression.", - "Pure vector documents with text remain razor-sharp even under extreme compression." - }, - SupportedFormats = "Input: .pdf | Output: Optimized .pdf", - RelatedToolId = PdfToolId.CompressPdf, - IconKind = "ArrowCollapseAll", - IconColorHex = "#16A34A", - BackgroundAccentHex = "#F0FDF4", - Badge = "Optimize", - Keywords = "compress shrink optimize reduce file size email small quality", - IsFeatured = true - }, - new HelpGuideItem - { - Id = "tool-pdf-to-word", - Title = "PDF to Word (DOCX)", - Category = "32 PDF Tools", - Summary = "Convert PDF documents into fully editable Microsoft Word DOC and DOCX files.", - Description = "Extracts text paragraphs, headings, bullet lists, formatting, and tables from PDF files into standard Microsoft Word DOCX documents compatible with Microsoft 365, Word 2016+, and LibreOffice.", - Steps = new List - { - "Open 'PDF to Word' from the Convert from PDF category.", - "Choose your source PDF file.", - "Select formatting preservation options (maintain paragraph flow vs exact layout).", - "Click 'Convert to Word'.", - "Open the generated .docx file in Microsoft Word or any compatible word processor." - }, - KeyFeatures = new List - { - "Preserves paragraph structure, font styling, and colors", - "Extracts tables into native Word table grids", - "Embeds extracted images in their original positions" - }, - ProTips = new List - { - "For scanned documents without selectable text, run 'OCR Text Recognition' first for best results." - }, - SupportedFormats = "Input: .pdf | Output: .docx", - RelatedToolId = PdfToolId.PdfToWord, - IconKind = "FileWordOutline", - IconColorHex = "#2563EB", - BackgroundAccentHex = "#EFF6FF", - Badge = "Convert", - Keywords = "word doc docx convert export office microsoft word editable", - IsFeatured = true - }, - new HelpGuideItem - { - Id = "tool-pdf-to-excel", - Title = "PDF to Excel (XLSX)", - Category = "32 PDF Tools", - Summary = "Extract tables, financial figures, and balance sheets from PDF into Microsoft Excel spreadsheets.", - Description = "Extracts structured tabular data from PDF invoices, financial statements, and reports into real editable cells inside Microsoft Excel .xlsx workbooks.", - Steps = new List - { - "Open 'PDF to Excel' from the Tools Studio.", - "Select the PDF containing tabular data.", - "Configure table detection sensitivity (Automatic or Strict Grid).", - "Click 'Convert to Excel'.", - "Open the generated .xlsx workbook in Microsoft Excel or Google Sheets." - }, - KeyFeatures = new List - { - "Detects table columns and cell boundaries automatically", - "Preserves numeric formatting for immediate calculations", - "Creates separate worksheets per PDF page" - }, - ProTips = new List - { - "Perfect for extracting transaction statements, product catalogs, and invoice line items." - }, - SupportedFormats = "Input: .pdf | Output: .xlsx", - RelatedToolId = PdfToolId.PdfToExcel, - IconKind = "FileExcelOutline", - IconColorHex = "#16A34A", - BackgroundAccentHex = "#F0FDF4", - Badge = "Convert", - Keywords = "excel xlsx spreadsheet table financial data grid convert export", - IsFeatured = false - }, - new HelpGuideItem - { - Id = "tool-pdf-to-powerpoint", - Title = "PDF to PowerPoint (PPTX)", - Category = "32 PDF Tools", - Summary = "Transform PDF presentations into editable Microsoft PowerPoint PPTX slide decks.", - Description = "Converts each page of a PDF document into a slide in Microsoft PowerPoint, allowing you to edit text boxes, rearrange slides, and apply presentation animations.", - Steps = new List - { - "Open 'PDF to PowerPoint' from the Tools Studio.", - "Select the PDF presentation deck.", - "Click 'Convert to PowerPoint'.", - "Save and open the resulting .pptx file in Microsoft PowerPoint or Keynote." - }, - KeyFeatures = new List - { - "Maps each PDF page to an individual 16:9 or 4:3 slide", - "Extracts text blocks as movable slide text frames", - "Retains vector background graphics and slide illustrations" - }, - ProTips = new List - { - "Ideal for repurposing exported webinar slide decks, pitch decks, and lecture handouts." - }, - SupportedFormats = "Input: .pdf | Output: .pptx", - RelatedToolId = PdfToolId.PdfToPowerPoint, - IconKind = "FilePowerpointOutline", - IconColorHex = "#EA580C", - BackgroundAccentHex = "#FFF7ED", - Badge = "Convert", - Keywords = "powerpoint ppt pptx slides presentation deck convert export", - IsFeatured = false - }, - new HelpGuideItem - { - Id = "tool-word-to-pdf", - Title = "Word to PDF (DOCX to PDF)", - Category = "32 PDF Tools", - Summary = "Compile Microsoft Word DOC and DOCX files into standardized, high-fidelity PDF documents.", - Description = "Converts Microsoft Word documents into vector PDFs with consistent typography, crisp layout formatting, and embedded metadata.", - Steps = new List - { - "Open 'Word to PDF' from the Convert to PDF category.", - "Select or drop your .docx file.", - "Click 'Convert to PDF'.", - "Open or export your compiled PDF." - }, - KeyFeatures = new List - { - "Accurate font and margin translation", - "Embeds vector typography for universal cross-platform viewing", - "Fast batch processing support" - }, - ProTips = new List - { - "Batch convert multiple .docx files in one click to standardize company document archives." - }, - SupportedFormats = "Input: .docx, .doc | Output: .pdf", - RelatedToolId = PdfToolId.WordToPdf, - IconKind = "FileWord", - IconColorHex = "#2563EB", - BackgroundAccentHex = "#EFF6FF", - Badge = "Convert", - Keywords = "word to pdf docx doc compile convert document import", - IsFeatured = false - }, - new HelpGuideItem - { - Id = "tool-excel-to-pdf", - Title = "Excel to PDF (XLSX to PDF)", - Category = "32 PDF Tools", - Summary = "Convert Excel spreadsheets and tables into cleanly formatted, printable PDF documents.", - Description = "Renders Microsoft Excel worksheets into paginated, publication-grade PDF documents with clean gridlines and fit-to-page scaling.", - Steps = new List - { - "Open 'Excel to PDF' from the Tools Studio.", - "Select your .xlsx or .xls workbook.", - "Choose page orientation (Landscape or Portrait) and scaling options.", - "Click 'Convert to PDF'." - }, - KeyFeatures = new List - { - "Automatic column width fitting and table boundary alignment", - "Preserves table borders, number formats, and header colors", - "Multi-sheet workbook support" - }, - ProTips = new List - { - "Select Landscape orientation for spreadsheets with more than 6 columns to prevent horizontal clipping." - }, - SupportedFormats = "Input: .xlsx, .xls | Output: .pdf", - RelatedToolId = PdfToolId.ExcelToPdf, - IconKind = "FileExcel", - IconColorHex = "#16A34A", - BackgroundAccentHex = "#F0FDF4", - Badge = "Convert", - Keywords = "excel to pdf xlsx xls spreadsheet table sheet convert", - IsFeatured = false - }, - new HelpGuideItem - { - Id = "tool-powerpoint-to-pdf", - Title = "PowerPoint to PDF (PPTX to PDF)", - Category = "32 PDF Tools", - Summary = "Convert PowerPoint presentations into high-resolution, presentation-ready PDF slide decks.", - Description = "Compiles PPTX slide decks into crisp, universally shareable PDF handouts and presentation documents.", - Steps = new List - { - "Open 'PowerPoint to PDF' from the Tools Studio.", - "Select your .pptx presentation.", - "Click 'Convert to PDF'.", - "Review the generated PDF slides in the viewer." - }, - KeyFeatures = new List - { - "Preserves slide dimensions (16:9 widescreen or 4:3 standard)", - "Retains slide backgrounds, vector shapes, and diagrams", - "High-resolution vector output" - }, - ProTips = new List - { - "Use this tool to create unalterable PDF handouts for clients and conference attendees." - }, - SupportedFormats = "Input: .pptx, .ppt | Output: .pdf", - RelatedToolId = PdfToolId.PowerPointToPdf, - IconKind = "FilePowerpoint", - IconColorHex = "#EA580C", - BackgroundAccentHex = "#FFF7ED", - Badge = "Convert", - Keywords = "powerpoint to pdf pptx ppt presentation slides convert", - IsFeatured = false - }, - new HelpGuideItem - { - Id = "tool-edit-pdf", - Title = "Live PDF Deconstruction & Editing", - Category = "32 PDF Tools", - Summary = "Deconstruct any existing 3rd-party PDF into an editable canvas with live text, images, and shapes.", - Description = "FryPDF's breakthrough deconstruction engine parses raw PDF streams, performs layout and typography analysis, detects Unicode scripts, and converts static PDF pages into fully editable, layered canvas elements.", - Steps = new List - { - "Open 'Edit PDF' from the Tools Studio or drag and drop any PDF into the editor.", - "The deconstruction engine analyzes text bounding boxes, font metrics, and embedded graphics.", - "Click any text element to edit its content, font size, weight, and color directly.", - "Move, resize, or delete shapes, logos, and images on the visual canvas.", - "Save as a .frypdf project file or export directly back to vector PDF via ⌘E." - }, - KeyFeatures = new List - { - "Intelligent Line & Paragraph Clustering with baseline tracking", - "Multi-Format Skia Image Extraction (DCT, JPEG2000, CMYK, PNG)", - "Script-Aware Font Fallback (Devanagari, CJK, Arabic, Latin)", - "Strict Layered Z-Index Allocation preventing occlusion" - }, - ProTips = new List - { - "FryPDF preserves exact coordinates and typography so your edits look indistinguishable from the original.", - "Use the Properties Inspector (⌘⇧P) to fine-tune letter spacing, line height multipliers, and padding." - }, - SupportedFormats = "Inputs: .pdf, .frypdf, .json | Output: .pdf, .frypdf", - RelatedToolId = PdfToolId.EditPdf, - IconKind = "Draw", - IconColorHex = "#9333EA", - BackgroundAccentHex = "#FAF5FF", - Badge = "Editor", - Keywords = "edit deconstruct modify alter text images replace delete change pdf", - IsFeatured = true - }, - new HelpGuideItem - { - Id = "tool-pdf-to-jpg", - Title = "PDF to JPG & PNG Images", - Category = "32 PDF Tools", - Summary = "Render each page of a PDF into high-resolution JPG or PNG images, or extract all embedded photos.", - Description = "Converts PDF pages into standalone image files at selectable DPI settings (72 DPI, 150 DPI, 300 DPI print grade), or extracts raw embedded images from inside the document.", - Steps = new List - { - "Open 'PDF to JPG' from the Tools Studio.", - "Select the PDF file.", - "Choose mode: 'Render Entire Pages' or 'Extract Embedded Images Only'.", - "Select target image format (JPG or PNG) and resolution DPI.", - "Click 'Convert to Images' to export to a dedicated folder." - }, - KeyFeatures = new List - { - "High-Fidelity SkiaSharp Raster Engine with sub-pixel antialiasing", - "Supports 72, 150, and 300 DPI output resolutions", - "Lossless PNG or compressed JPEG formats" - }, - ProTips = new List - { - "Choose 300 DPI PNG when generating images intended for print catalogs or marketing materials." - }, - SupportedFormats = "Input: .pdf | Output: .jpg, .png", - RelatedToolId = PdfToolId.PdfToJpg, - IconKind = "FileImageOutline", - IconColorHex = "#EAB308", - BackgroundAccentHex = "#FEFCE8", - Badge = "Convert", - Keywords = "jpg png image photo picture render extract dpi export", - IsFeatured = false - }, - new HelpGuideItem - { - Id = "tool-images-to-pdf", - Title = "Images to PDF (JPG/PNG to PDF)", - Category = "32 PDF Tools", - Summary = "Combine multiple JPG, PNG, WebP, and BMP images into a single bound PDF document.", - Description = "Import one or multiple photos, scans, and graphic files, arrange their order, configure page orientation and margins, and compile them into a clean PDF album or portfolio.", - Steps = new List - { - "Open 'Images to PDF' from the Tools Studio.", - "Click 'Add Images' or drag and drop image files into the window.", - "Drag images to arrange their page sequence.", - "Select page sizing (Fit Image, A4, or Letter) and margin settings.", - "Click 'Convert to PDF'." - }, - KeyFeatures = new List - { - "Supports JPG, PNG, WebP, BMP, and GIF formats", - "Automatic orientation matching (portrait vs landscape per image)", - "Custom margin options: None, Small, or Standard" - }, - ProTips = new List - { - "Set margins to 'None' for full-bleed photo albums and graphic presentations." - }, - SupportedFormats = "Inputs: .jpg, .jpeg, .png, .webp, .bmp | Output: .pdf", - RelatedToolId = PdfToolId.JpgToPdf, - IconKind = "FileImagePlusOutline", - IconColorHex = "#EAB308", - BackgroundAccentHex = "#FEFCE8", - Badge = "Convert", - Keywords = "images to pdf photos jpg png picture album scan combine convert", - IsFeatured = false - }, - new HelpGuideItem - { - Id = "tool-sign-pdf", - Title = "Digital Signature Studio", - Category = "32 PDF Tools", - Summary = "Add handwritten mouse/stylus signatures, typed calligraphy, or certificate stamps to PDFs.", - Description = "The Signature Studio lets you create and place professional signatures on contracts, agreements, and forms. You can draw your signature, type it using elegant cursive typography, or upload a signature image.", - Steps = new List - { - "Open 'Sign PDF' from the Tools Studio or launch Signature Studio from the editor ribbon.", - "Select your signature style: 'Draw' (handwritten with pen/mouse), 'Type' (calligraphy fonts), or 'Upload Image'.", - "Configure stroke thickness and ink color (Classic Black, Executive Navy Blue, or Crimson).", - "Position the signature box on the desired page and coordinates.", - "Click 'Apply Signature' to stamp the document." - }, - KeyFeatures = new List - { - "Smooth vector Bézier smoothing for drawn signatures", - "Pre-styled executive script font options", - "Multi-page stamping and coordinate alignment" - }, - ProTips = new List - { - "Executive Navy Blue ink (#0F2942) provides a distinctive authentic pen-and-paper look on formal legal agreements." - }, - SupportedFormats = "Input: .pdf | Output: Signed .pdf", - RelatedToolId = PdfToolId.SignPdf, - IconKind = "DrawPen", - IconColorHex = "#059669", - BackgroundAccentHex = "#ECFDF5", - Badge = "Security", - Keywords = "sign signature e-sign contract agreement draw calligraphy legal ink", - IsFeatured = true - }, - new HelpGuideItem - { - Id = "tool-protect-pdf", - Title = "Protect PDF (AES-256 Encryption)", - Category = "32 PDF Tools", - Summary = "Secure confidential PDFs with robust 256-bit AES passwords and granular access permissions.", - Description = "Encrypts your PDF documents with industry-standard 256-bit AES encryption. You can set a Document Open password as well as a Permissions Master password to prevent unauthorized printing, copying, or modifying.", - Steps = new List - { - "Open 'Protect PDF' from the Tools Studio.", - "Select the PDF you wish to encrypt.", - "Enter a strong Document Open Password.", - "Optionally set permissions: Prevent Printing, Prevent Content Copying, or Restrict Editing.", - "Click 'Encrypt & Protect PDF' to save your secured file." - }, - KeyFeatures = new List - { - "256-bit AES Encryption (Adobe Acrobat Standard & PDF 2.0 compliant)", - "Granular permissions: Disallow copying, printing, or form alterations", - "Strong password strength indicator" - }, - ProTips = new List - { - "Always store your encryption password securely; FryPDF encrypts locally and cannot recover forgotten passwords." - }, - SupportedFormats = "Input: .pdf | Output: Encrypted .pdf", - RelatedToolId = PdfToolId.ProtectPdf, - IconKind = "LockOutline", - IconColorHex = "#DC2626", - BackgroundAccentHex = "#FEF2F2", - Badge = "Security", - Keywords = "protect password encrypt lock security aes permissions secure confidential", - IsFeatured = true - }, - new HelpGuideItem - { - Id = "tool-unlock-pdf", - Title = "Unlock PDF (Remove Password)", - Category = "32 PDF Tools", - Summary = "Remove password protection and permission locks from authenticated PDF files.", - Description = "Removes encryption and security restrictions from PDF files when you possess the authorization password, making the document freely editable and printable.", - Steps = new List - { - "Open 'Unlock PDF' from the Tools Studio.", - "Select the encrypted PDF.", - "Enter the valid password.", - "Click 'Unlock PDF' to produce an unrestricted, open version of the document." - }, - KeyFeatures = new List - { - "Removes open password and all editing/printing permission restrictions", - "Fast stream decryption with zero data corruption", - "Safe local processing" - }, - ProTips = new List - { - "Once unlocked, you can freely edit, merge, or convert the document with any other FryPDF tool." - }, - SupportedFormats = "Input: Password-Protected .pdf | Output: Unlocked .pdf", - RelatedToolId = PdfToolId.UnlockPdf, - IconKind = "LockOpenOutline", - IconColorHex = "#16A34A", - BackgroundAccentHex = "#F0FDF4", - Badge = "Security", - Keywords = "unlock decrypt remove password unprotect permissions open", - IsFeatured = false - }, - new HelpGuideItem - { - Id = "tool-rotate-pdf", - Title = "Rotate PDF Pages", - Category = "32 PDF Tools", - Summary = "Rotate upside-down or sideways pages by 90°, 180°, or 270° degrees.", - Description = "Fix misaligned, upside-down, or sideways scanned pages across the entire document or for selected individual pages.", - Steps = new List - { - "Open 'Rotate PDF' from the Tools Studio.", - "Select the PDF file.", - "Choose rotation angle: 90° Clockwise, 180° Inverted, or 90° Counter-Clockwise.", - "Specify page selection: All Pages, Odd Pages Only, Even Pages Only, or Custom Range.", - "Click 'Apply Rotation' to save the corrected PDF." - }, - KeyFeatures = new List - { - "Rotates page bounding boxes and graphics vectors losslessly", - "Supports selective odd/even or range-based rotation", - "Immediate visual thumbnail preview" - }, - ProTips = new List - { - "Inside the live editor, you can also press ⌘⇧R (or Ctrl+Shift+R) to rotate the current active page." - }, - SupportedFormats = "Input: .pdf | Output: Rotated .pdf", - RelatedToolId = PdfToolId.RotatePdf, - IconKind = "RotateRight", - IconColorHex = "#2563EB", - BackgroundAccentHex = "#EFF6FF", - Badge = "Organize", - Keywords = "rotate orientation angle clockwise landscape portrait upside down", - IsFeatured = false - }, - new HelpGuideItem - { - Id = "tool-add-watermark", - Title = "Add Watermark", - Category = "32 PDF Tools", - Summary = "Stamp diagonal text or graphic logos across pages with customizable opacity and angle.", - Description = "Apply prominent security watermarks such as 'CONFIDENTIAL', 'DRAFT', 'COPY', or custom company logos across all pages of a PDF document.", - Steps = new List - { - "Open 'Watermark PDF' from the Tools Studio or click 'Watermark' in the editor ribbon.", - "Select watermark type: 'Text' or 'Image Logo'.", - "If text, type your message (e.g. 'CONFIDENTIAL — DO NOT DISTRIBUTE') and pick a font.", - "Adjust opacity (e.g. 15%–30%), rotation angle (e.g. 45° diagonal), and position.", - "Click 'Apply Watermark'." - }, - KeyFeatures = new List - { - "Adjustable opacity slider (0%–100%)", - "Custom rotation angle and font sizing", - "Choice between background layer (behind text) or foreground overlay" - }, - ProTips = new List - { - "A 20% opacity at a 45° angle provides high visibility without obscuring underlying document text." - }, - SupportedFormats = "Input: .pdf | Output: Watermarked .pdf", - RelatedToolId = PdfToolId.Watermark, - IconKind = "Watermark", - IconColorHex = "#0891B2", - BackgroundAccentHex = "#ECFEFF", - Badge = "Security", - Keywords = "watermark stamp draft confidential copyright logo security overlay opacity", - IsFeatured = false - }, - new HelpGuideItem - { - Id = "tool-html-to-pdf", - Title = "HTML to PDF", - Category = "32 PDF Tools", - Summary = "Convert HTML5 web pages, raw HTML markup, and CSS into standardized PDF documents.", - Description = "Render web articles, invoices, receipts, and online reports directly from HTML files or URLs into cleanly formatted PDF pages.", - Steps = new List - { - "Open 'HTML to PDF' from the Tools Studio.", - "Select an .html file or enter a web URL.", - "Configure page size (A4, Letter) and margin settings.", - "Click 'Convert to PDF'." - }, - KeyFeatures = new List - { - "Full CSS3 styling, flexbox, and web font rendering", - "Automatic page break calculations", - "Retains embedded hyperlinks" - }, - ProTips = new List - { - "Add CSS @media print styles to your HTML for perfect print layout control." - }, - SupportedFormats = "Input: .html, .htm | Output: .pdf", - RelatedToolId = PdfToolId.HtmlToPdf, - IconKind = "LanguageHtml5", - IconColorHex = "#EA580C", - BackgroundAccentHex = "#FFF7ED", - Badge = "Convert", - Keywords = "html url web webpage css html to pdf compile convert", - IsFeatured = false - }, - new HelpGuideItem - { - Id = "tool-page-numbers", - Title = "Add Page Numbers", - Category = "32 PDF Tools", - Summary = "Insert customizable page numbering headers and footers with custom formats and offsets.", - Description = "Stamp running page numbers across PDF documents with flexible placement, format strings like 'Page {0} of {1}', Roman numerals, and starting offsets.", - Steps = new List - { - "Open 'Add Page Numbers' from the Tools Studio.", - "Select the PDF file.", - "Choose position: Top/Bottom, Left/Center/Right.", - "Select numbering format: '1, 2, 3...', 'Page 1 of N', or 'I, II, III...'.", - "Optionally specify a starting page offset (e.g. skip cover page).", - "Click 'Apply Page Numbers'." - }, - KeyFeatures = new List - { - "6 Placement Positions (Top/Bottom, Left/Center/Right)", - "Custom format strings (e.g. 'Page {0} of {1}' or 'Document Ref - Page {0}')", - "Option to skip cover or title pages" - }, - ProTips = new List - { - "Set 'Start on Page' to 2 when your document includes a formal cover page." - }, - SupportedFormats = "Input: .pdf | Output: Numbered .pdf", - RelatedToolId = PdfToolId.PageNumbers, - IconKind = "Numeric", - IconColorHex = "#6366F1", - BackgroundAccentHex = "#EEF2FF", - Badge = "Organize", - Keywords = "page numbers footer header numbering pagination count stamp", - IsFeatured = false - }, - new HelpGuideItem - { - Id = "tool-crop-pdf", - Title = "Crop PDF Margins", - Category = "32 PDF Tools", - Summary = "Trim unwanted margins, white borders, and header/footer areas visually.", - Description = "Adjust the visible page boundaries (CropBox) of a PDF to remove excess margins, scanner edges, or crop to specific content regions.", - Steps = new List - { - "Open 'Crop PDF' from the Tools Studio.", - "Select the PDF document.", - "Drag the visual crop bounding box handles or enter exact margin dimensions in points.", - "Apply to current page or all pages.", - "Click 'Crop PDF'." - }, - KeyFeatures = new List - { - "Interactive visual crop handle bounding box", - "Preserves vector text quality without re-rasterizing", - "Batch crop across all pages" - }, - ProTips = new List - { - "Cropping adjusts the display boundary without destroying underlying vectors, ensuring crisp rendering." - }, - SupportedFormats = "Input: .pdf | Output: Cropped .pdf", - RelatedToolId = PdfToolId.CropPdf, - IconKind = "Crop", - IconColorHex = "#0284C7", - BackgroundAccentHex = "#E0F2FE", - Badge = "Organize", - Keywords = "crop trim margins border cut resize bounding box", - IsFeatured = false - }, - new HelpGuideItem - { - Id = "tool-organize-pages", - Title = "Organize & Reorder Pages", - Category = "32 PDF Tools", - Summary = "Visually drag and drop thumbnails to reorder, duplicate, rotate, or delete pages in a PDF.", - Description = "Provides an interactive grid view of all pages in a document. Easily drag pages to resequence them, duplicate key slides, or delete accidental pages.", - Steps = new List - { - "Open 'Organize Pages' from the Tools Studio.", - "Select your PDF to load the page thumbnail grid.", - "Click and drag any page thumbnail to change its position.", - "Hover over any page to access quick Rotate, Duplicate, or Delete icons.", - "Click 'Save Organized PDF' to export the reordered document." - }, - KeyFeatures = new List - { - "High-resolution interactive visual thumbnail grid", - "Drag-and-drop page reordering", - "Per-page rotate, duplicate, and delete actions" - }, - ProTips = new List - { - "You can also manage and reorder pages directly inside the Editor using the left thumbnail sidebar." - }, - SupportedFormats = "Input: .pdf | Output: Organized .pdf", - RelatedToolId = PdfToolId.OrganizePdf, - IconKind = "ViewGridOutline", - IconColorHex = "#4F46E5", - BackgroundAccentHex = "#EEF2FF", - Badge = "Organize", - Keywords = "organize reorder pages sequence thumbnails duplicate delete rearrange", - IsFeatured = true - }, - new HelpGuideItem - { - Id = "tool-extract-pages", - Title = "Extract Pages", - Category = "32 PDF Tools", - Summary = "Extract specific pages or page selections into a brand-new standalone PDF file.", - Description = "Select specific pages or enter page ranges to pull out and generate a new independent PDF without modifying the original document.", - Steps = new List - { - "Open 'Extract Pages' from the Tools Studio.", - "Select your source PDF.", - "Click to select thumbnails or enter page numbers (e.g. '1, 3, 5-7').", - "Click 'Extract to New PDF'." - }, - KeyFeatures = new List - { - "Visual multi-select thumbnail picker", - "Custom range syntax support", - "Zero quality loss during extraction" - }, - ProTips = new List - { - "Great for isolating single chapters from textbooks or extracting specific invoices from monthly ledgers." - }, - SupportedFormats = "Input: .pdf | Output: Extracted .pdf", - RelatedToolId = PdfToolId.OrganizePdf, - IconKind = "Export", - IconColorHex = "#6366F1", - BackgroundAccentHex = "#EEF2FF", - Badge = "Organize", - Keywords = "extract pull pages subset select export isolate", - IsFeatured = false - }, - new HelpGuideItem - { - Id = "tool-remove-pages", - Title = "Remove Pages", - Category = "32 PDF Tools", - Summary = "Delete blank, duplicate, or unnecessary pages from your PDF document.", - Description = "Quickly prune unwanted pages from a document. Simply click the pages you want gone and export the streamlined PDF.", - Steps = new List - { - "Open 'Remove Pages' from the Tools Studio.", - "Select your PDF.", - "Click the trash icon on any pages you wish to delete.", - "Click 'Remove Pages & Save'." - }, - KeyFeatures = new List - { - "Click-to-remove visual interface", - "Shows instant preview of the remaining document structure", - "Automatic page numbering re-indexing" - }, - ProTips = new List - { - "Inside the canvas editor, you can also press ⌘⇧⌫ (Ctrl+Shift+Delete) to remove the active page." - }, - SupportedFormats = "Input: .pdf | Output: Pruned .pdf", - RelatedToolId = PdfToolId.OrganizePdf, - IconKind = "TrashCanOutline", - IconColorHex = "#DC2626", - BackgroundAccentHex = "#FEF2F2", - Badge = "Organize", - Keywords = "remove delete prune pages blank unwanted trash", - IsFeatured = false - }, - new HelpGuideItem - { - Id = "tool-compare-documents", - Title = "Compare Documents", - Category = "32 PDF Tools", - Summary = "Perform a side-by-side visual and structural difference comparison between two PDF revisions.", - Description = "The Compare Documents tool analyzes two versions of a PDF document, highlighting visual changes, modified text paragraphs, altered tables, and moved graphic elements with color-coded diff overlays.", - Steps = new List - { - "Open 'Compare Documents' from the Tools Studio or press ⌘K and search 'Compare'.", - "Select 'Document A' (Original Version) and 'Document B' (Revised Version).", - "Choose comparison mode: 'Side-by-Side Diff' or 'Overlay Blend'.", - "Click 'Compare Revisions'.", - "Inspect the highlighted difference markers: Green for additions, Red for deletions, Yellow for modifications." - }, - KeyFeatures = new List - { - "Side-by-Side synchronized scrolling comparison", - "Pixel-level Skia difference heatmaps", - "Structural text change reports" - }, - ProTips = new List - { - "Invaluable for legal contract revisions, architectural drawing revisions, and editing proof checks." - }, - SupportedFormats = "Inputs: Two .pdf files | Output: Diff Report & Visual Comparison", - RelatedToolId = PdfToolId.ComparePdf, - IconKind = "CompareHorizontal", - IconColorHex = "#0284C7", - BackgroundAccentHex = "#E0F2FE", - Badge = "Security", - Keywords = "compare diff revision versions legal check visual difference side by side", - IsFeatured = true - }, - new HelpGuideItem - { - Id = "tool-redact-pdf", - Title = "Search & Redact Sensitive Data", - Category = "32 PDF Tools", - Summary = "Permanently black-out and sanitize PII, SSNs, credit card numbers, and secret names from PDFs.", - Description = "Redacts sensitive text and information with permanent, irreversible black-box sanitization. Redacted content is completely purged from underlying PDF content streams—not just covered with a black box.", - Steps = new List - { - "Open 'Search & Redact' from the Tools Studio.", - "Select your PDF.", - "Enter search keywords (e.g. 'Social Security', 'Confidential') or choose a regex pattern (SSN, Email, Phone, Credit Card).", - "Review matching occurrences across pages.", - "Click 'Apply Permanent Redaction' to purge all matched content." - }, - KeyFeatures = new List - { - "True stream sanitization: completely purges text from vector and text streams", - "Built-in PII pattern detectors: SSN, Credit Cards, Email Addresses, Phone Numbers", - "Visual rectangle redaction drawing tool" - }, - ProTips = new List - { - "Never use plain highlighter or drawing tools to hide secrets; always use True Redaction to purge the text from search indices." - }, - SupportedFormats = "Input: .pdf | Output: Redacted & Sanitized .pdf", - RelatedToolId = PdfToolId.RedactPdf, - IconKind = "EyeOffOutline", - IconColorHex = "#DC2626", - BackgroundAccentHex = "#FEF2F2", - Badge = "Security", - Keywords = "redact black out pii ssn privacy sanitize secret erase legal security", - IsFeatured = true - }, - new HelpGuideItem - { - Id = "tool-bates-numbering", - Title = "Bates Numbering", - Category = "32 PDF Tools", - Summary = "Apply sequential legal Bates numbering with customizable prefixes, suffixes, and digit padding.", - Description = "Bates numbering is the global legal standard for indexing discovery documents, trial exhibits, and compliance records. FryPDF applies Bates stamps with customizable prefixes, digit counts, and positions.", - Steps = new List - { - "Open 'Bates Numbering' from the Tools Studio.", - "Select one or multiple PDF files.", - "Configure Prefix (e.g. 'EXHIBIT-A-'), Starting Number (e.g. 1), and Digit Padding (e.g. 6 digits: '000001').", - "Choose stamp placement (Bottom Right, Top Right, etc.) and font style.", - "Click 'Apply Bates Numbering'." - }, - KeyFeatures = new List - { - "Customizable Prefix and Suffix strings", - "Adjustable digit padding (e.g. 4 to 8 digits)", - "Batch multi-document continuous sequence numbering" - }, - ProTips = new List - { - "When stamping multi-file court filings, load all files together to maintain an unbroken sequential Bates index across documents." - }, - SupportedFormats = "Inputs: Multiple .pdf files | Output: Bates-Stamped .pdf files", - RelatedToolId = PdfToolId.PageNumbers, - IconKind = "Numeric", - IconColorHex = "#7C3AED", - BackgroundAccentHex = "#F5F3FF", - Badge = "Security", - Keywords = "bates numbering legal court exhibit litigation discovery compliance index", - IsFeatured = false - }, - new HelpGuideItem - { - Id = "tool-preflight-diagnostics", - Title = "Preflight Diagnostics & Repair", - Category = "32 PDF Tools", - Summary = "Audit documents for corrupted streams, missing fonts, PDF/A compliance, and auto-repair issues.", - Description = "Runs a comprehensive preflight validation check against your PDF file, detecting broken xref tables, unembedded fonts, corrupt image streams, and syntax warnings, offering one-click auto-repair.", - Steps = new List - { - "Open 'Preflight Diagnostics' from the Tools Studio.", - "Select the PDF you want to audit.", - "Click 'Run Diagnostic Scan'.", - "Review the diagnostic report: Security status, PDF/A compliance, embedded fonts, and stream integrity.", - "Click 'Auto-Repair & Rebuild PDF' if any issues are detected." - }, - KeyFeatures = new List - { - "Comprehensive structural and syntax validation engine", - "Scans for missing glyphs, unembedded fonts, and broken xref tables", - "One-Click stream rebuilding and sanitization" - }, - ProTips = new List - { - "Run Preflight Diagnostics before sending files to professional print shops or archival repositories." - }, - SupportedFormats = "Input: .pdf | Output: Diagnostic Report & Repaired .pdf", - RelatedToolId = PdfToolId.RepairPdf, - IconKind = "ShieldCheckOutline", - IconColorHex = "#059669", - BackgroundAccentHex = "#ECFDF5", - Badge = "Security", - Keywords = "preflight diagnostics repair audit test validate fix pdfa corrupted broken", - IsFeatured = false - }, - new HelpGuideItem - { - Id = "tool-custom-stamp", - Title = "Custom Stamp Studio", - Category = "32 PDF Tools", - Summary = "Stamp APPROVED, CONFIDENTIAL, VOID, DRAFT, or custom vector corporate seals on PDFs.", - Description = "Apply professional dynamic office stamps with date/time stamps, reviewer names, and vector borders to approve invoices, verify contracts, or mark drafts.", - Steps = new List - { - "Open 'Custom Stamp Studio' from the Tools Studio or ribbon.", - "Pick a preset stamp ('APPROVED', 'CONFIDENTIAL', 'COMPLETED', 'RECEIVED', 'REJECTED') or create a custom text stamp.", - "Optionally include dynamic Date, Time, and User Name fields.", - "Select ink color (Emerald Green, Crimson Red, Deep Blue, Amber).", - "Click on the page where you want to place the stamp." - }, - KeyFeatures = new List - { - "Pre-designed vector border styles (Classic Boxed, Double Border, Ribbon)", - "Dynamic date and reviewer name stamps", - "Resizable and rotatable vector stamp elements" - }, - ProTips = new List - { - "Add dynamic date stamps to invoice approvals to establish a clear audit trail." - }, - SupportedFormats = "Input: .pdf | Output: Stamped .pdf", - RelatedToolId = PdfToolId.PdfForms, - IconKind = "Stamp", - IconColorHex = "#EA580C", - BackgroundAccentHex = "#FFF7ED", - Badge = "Editor", - Keywords = "stamp approved confidential draft seal logo office mark dynamic date", - IsFeatured = false - }, - new HelpGuideItem - { - Id = "tool-header-footer", - Title = "Header & Footer Studio", - Category = "32 PDF Tools", - Summary = "Apply document-wide running headers, footers, metadata titles, and margin offsets.", - Description = "Add running headers and footers across entire documents with customized left, center, and right text segments, page counts, and document titles.", - Steps = new List - { - "Open 'Header & Footer Studio' from the Tools Studio.", - "Select your PDF.", - "Configure Header text (Left, Center, Right) and Footer text.", - "Use variables like {{PageNumber}}, {{TotalPages}}, {{DocumentTitle}}, and {{Date}}.", - "Click 'Apply Headers & Footers'." - }, - KeyFeatures = new List - { - "3-Column Header & Footer layout (Left, Center, Right)", - "Dynamic variable interpolation (Page {0} of {1}, Date, Filename)", - "Independent first page (cover page) suppression" - }, - ProTips = new List - { - "Enable 'Suppress on Page 1' to keep cover pages and report title pages clean." - }, - SupportedFormats = "Input: .pdf | Output: .pdf with Headers/Footers", - RelatedToolId = PdfToolId.PageNumbers, - IconKind = "DockTop", - IconColorHex = "#0284C7", - BackgroundAccentHex = "#E0F2FE", - Badge = "Editor", - Keywords = "header footer running title date page count margins metadata", - IsFeatured = false - }, - new HelpGuideItem - { - Id = "tool-ocr-pdf", - Title = "OCR Text Recognition", - Category = "32 PDF Tools", - Summary = "Extract selectable, searchable, and copyable text from scanned image PDFs and photos.", - Description = "Converts flat bitmap scans and scanned paper documents into searchable PDFs with an invisible, selectable text layer aligned over the original scan.", - Steps = new List - { - "Open 'OCR PDF' from the AI & Automation tools category.", - "Select your scanned PDF or image.", - "Select document language (English, Spanish, French, German, Hindi, Chinese, etc.).", - "Click 'Perform OCR'.", - "The resulting PDF now features fully selectable, copyable, and searchable text." - }, - KeyFeatures = new List - { - "Multi-language recognition engine", - "Generates invisible text overlay matching scan geometry", - "Exports searchable PDF or pure plain text" - }, - ProTips = new List - { - "Running OCR on scanned contracts enables fast in-document keyword search (⌘F) in any PDF reader." - }, - SupportedFormats = "Input: Scanned .pdf, images | Output: Searchable .pdf, .txt", - RelatedToolId = PdfToolId.OcrPdf, - IconKind = "TextRecognition", - IconColorHex = "#7C3AED", - BackgroundAccentHex = "#F5F3FF", - Badge = "AI & Automation", - Keywords = "ocr text recognition scan scanned searchable copyable extract text image", - IsFeatured = true - }, - new HelpGuideItem - { - Id = "tool-document-translation", - Title = "Document Translation", - Category = "32 PDF Tools", - Summary = "Translate document content into multiple languages with script-aware font matching.", - Description = "Translate entire PDF documents into different languages while preserving the original layout structure, headers, and visual tables, with automatic font fallback for non-Latin scripts.", - Steps = new List - { - "Open 'Translate Document' from AI & Automation.", - "Select your PDF file.", - "Choose source and target languages.", - "Click 'Translate & Rebuild Document'.", - "Inspect the translated document with matching localized typography." - }, - KeyFeatures = new List - { - "Preserves document layout, columns, tables, and image positions", - "Automatic Unicode script detection and font family fallback", - "Side-by-side bilingual export option" - }, - ProTips = new List - { - "Ensure you have the required language font pack installed via 'Language & Fonts' in the sidebar for optimal glyph rendering." - }, - SupportedFormats = "Input: .pdf | Output: Translated .pdf", - RelatedToolId = PdfToolId.TranslatePdf, - IconKind = "Translate", - IconColorHex = "#0284C7", - BackgroundAccentHex = "#E0F2FE", - Badge = "AI & Automation", - Keywords = "translate translation language multilingual international scripts localized", - IsFeatured = false - }, - new HelpGuideItem - { - Id = "tool-ai-summarizer", - Title = "AI Summarizer & Analysis", - Category = "32 PDF Tools", - Summary = "Generate structured summaries, executive briefs, key takeaways, and section analyses from PDFs.", - Description = "Extracts and synthesizes document contents into high-level executive summaries, bulleted key takeaways, and section-by-section breakdowns.", - Steps = new List - { - "Open 'AI Summarizer' from AI & Automation.", - "Select your document.", - "Choose summary type: Executive Brief, Bulleted Key Takeaways, or Detailed Section Breakdown.", - "Click 'Generate Summary'.", - "Copy summary text or export it as a clean PDF summary report." - }, - KeyFeatures = new List - { - "Multiple summary modes: Executive, Key Points, Q&A Brief", - "Analyzes multi-page research papers and lengthy legal contracts", - "Exports formatted markdown or PDF reports" - }, - ProTips = new List - { - "Use Key Takeaways mode on 50+ page annual reports to extract financial highlights in under 10 seconds." - }, - SupportedFormats = "Input: .pdf | Output: .txt, .md, .pdf Summary Report", - RelatedToolId = PdfToolId.AiSummarizer, - IconKind = "AutoFix", - IconColorHex = "#EC4899", - BackgroundAccentHex = "#FDF2F8", - Badge = "AI & Automation", - Keywords = "ai summarize summarizer analysis overview key points takeaways brief report", - IsFeatured = true - }, - - // ========================================================================= - // 3. LIVE CANVAS DOCUMENT EDITOR & INSPECTOR STUDIO - // ========================================================================= - new HelpGuideItem - { - Id = "editor-canvas-basics", - Title = "Canvas Navigation, Grid & Rulers", - Category = "Live Editor", - Summary = "Master the interactive canvas: moving elements, snapping to grid, guideline alignment, and rulers.", - Description = "The FryPDF Document Canvas is an interactive vector design workspace. Elements can be clicked, dragged, resized via control handles, and snapped to precise alignments.", - Steps = new List - { - "Click on any canvas element to select it; selection handles will appear around its bounding box.", - "Drag the element to reposition it; smart alignment guides appear automatically to help align with nearby elements.", - "Drag corner or edge handles to resize elements proportionally (hold Shift to maintain aspect ratio).", - "Use canvas rulers along the top and left to measure exact point coordinates.", - "Zoom in and out using ⌘+ / ⌘- or hold Ctrl while scrolling the mouse wheel." - }, - KeyFeatures = new List - { - "Live Canvas Rulers with cursor tracking in physical PDF points", - "Snap-to-Grid and dynamic object alignment guides", - "Multi-selection: Drag a selection marquee or Shift-click elements", - "Zoom range from 40% up to 250% with instant 100% reset (⌘0)" - }, - ProTips = new List - { - "Hold Spacebar and drag the mouse to pan smoothly across the canvas at high zoom levels.", - "Press ⌘1 to fit the page width or ⌘9 to fit the entire page on screen." - }, - SupportedFormats = "Live Canvas Workspace", - KeyboardShortcut = "⌘1 (Fit Width), ⌘9 (Fit Page), ⌘0 (Reset 100%)", - IconKind = "RulerSquare", - IconColorHex = "#0F6CBD", - BackgroundAccentHex = "#EFF6FF", - Badge = "Editor", - Keywords = "canvas rulers grid snap alignment pan zoom selection move resize handles", - IsFeatured = true - }, - new HelpGuideItem - { - Id = "editor-typography", - Title = "Typography, Fonts & Text Blocks", - Category = "Live Editor", - Summary = "Format rich text blocks: font families, weights, font sizes, line heights, and letter spacing.", - Description = "Text blocks in FryPDF provide fine-grained typographic controls. You can adjust font families (Inter, Roboto, Noto Sans, Playfair, Courier, etc.), font sizes, line heights, letter spacing, and alignments via the Properties Inspector.", - Steps = new List - { - "Click 'Text' in the ribbon toolbar to insert a new text element, or double-click any existing text.", - "Open the Properties Inspector on the right sidebar (⌘⇧P).", - "Choose font family, font weight (Regular, Medium, SemiBold, Bold), and font size.", - "Adjust 'Line Height' multiplier (1.25x to 1.5x) for optimal paragraph readability.", - "Pick text color, text alignment (Left, Center, Right, Justify), and background padding." - }, - KeyFeatures = new List - { - "Rich Font Library with embedded Unicode fallbacks", - "Fine-grained Typography Controls: Size, Weight, Line Height, Letter Spacing", - "Multi-line wrapping with auto-height bounding box calculations", - "Rich hex color picker with preset palette swatches" - }, - ProTips = new List - { - "Set Line Height between 1.3x and 1.45x for comfortable reading in multi-paragraph body text.", - "When typing in non-Latin scripts (Hindi, Japanese, Arabic), FryPDF automatically selects the optimal Noto Sans script family." - }, - SupportedFormats = "Typography & Text Elements", - KeyboardShortcut = "⌘⇧P / Ctrl+Shift+P (Properties Inspector)", - IconKind = "FormatSize", - IconColorHex = "#6366F1", - BackgroundAccentHex = "#EEF2FF", - Badge = "Editor", - Keywords = "text typography font family size line height spacing bold italic alignment color", - IsFeatured = true - }, - new HelpGuideItem - { - Id = "editor-rich-text", - Title = "Rich Text & Inline Markdown Formatting", - Category = "Live Editor", - Summary = "Style words within the same text box with mixed bold, italics, underlines, strikethroughs, sub/superscripts, colors, and links.", - Description = "FryPDF supports high-fidelity rich text with multi-span inline styling. You can format distinct words and phrases within a single text box using quick Markdown shorthand or HTML-style tags during in-place editing, or via the Properties Inspector.", - Steps = new List - { - "Double-click any text box on the canvas to activate in-place editing mode.", - "Type standard Markdown shorthand: use **bold** for bold text, *italic* for italic text, underline for underlines, and ~~strikethrough~~ for revisions.", - "Use scientific scripts: type ~2~ for subscript (e.g. H~2~O) and ^2^ for superscript (e.g. E=mc^2^, 1^st^).", - "Apply custom inline colors with text (e.g. Blue) and highlights with text.", - "Add clickable hyperlinks with [Label Text](https://example.com).", - "Press Enter or click outside the text box: FryPDF instantly compiles the markup into high-performance multi-span runs rendered on the canvas and exported to vector PDF." - }, - KeyFeatures = new List - { - "Multi-Span Architecture: Single unified text element with granular typography for every word", - "In-Place Markdown & HTML Tag Parsing on double-tap and blur", - "Scientific Subscript (~x~) and Superscript (^x^) Notation Support", - "Inline Hex Color Tags () and Highlights ()", - "Clickable PDF Hyperlinks ([Title](url)) compiled directly to QuestPDF links", - "Template DataMerge Support: {{Variable}} tags evaluate seamlessly inside rich spans", - "100% Vector PDF Export with zero rasterization" - }, - ProTips = new List - { - "Combine formatting freely! For example, **Bold Blue** creates styled highlighted headings in one step.", - "Press ⌘Z (Ctrl+Z) after editing to undo any formatting changes atomically.", - "Check out the 'Rich Typography & Publishing Specimen' in the Template Studio for live examples." - }, - SupportedFormats = "Live Canvas, Markdown Shorthand, QuestPDF Vector Export, SVG ", - KeyboardShortcut = "Double-Click text (In-Place Edit)", - IconKind = "FormatColorText", - IconColorHex = "#0F6CBD", - BackgroundAccentHex = "#EFF6FF", - Badge = "New Feature", - Keywords = "richtext rich text markdown bold italic underline strikethrough subscript superscript color highlight link spans formatting tags", - IsFeatured = true - }, - new HelpGuideItem - { - Id = "editor-shapes-ink", - Title = "Vector Shapes, Cards & Freehand Ink", - Category = "Live Editor", - Summary = "Add vector rectangles, rounded container cards, divider rules, and freehand stylus ink drawings.", - Description = "Enhance your document layouts with crisp vector shapes. Insert rectangles, badges, callout cards, divider lines, or draw freehand ink annotations directly on the canvas.", - Steps = new List - { - "Click 'Shapes' in the ribbon to insert a Rectangle, Ellipse, or Divider Line.", - "Use the Properties Inspector to adjust Fill Color, Stroke Color, Border Thickness, and Corner Radius.", - "To draw freehand annotations, select the 'Ink Pen' tool from the ribbon and draw directly on the canvas.", - "Adjust stroke width and pen color in the inspector." - }, - KeyFeatures = new List - { - "Vector Rectangles, Rounded Cards, Ellipses, and Divider Lines", - "Customizable Corner Radius, Border Thickness, and Box Shadows", - "Freehand Stylus & Mouse Ink Pen with Bézier smoothing", - "Exported as razor-sharp vector SVG/QuestPDF paths" - }, - ProTips = new List - { - "Use rounded cards with a subtle border and 8px corner radius for modern corporate document cards.", - "Set element opacity in the inspector to create translucent background badges." - }, - SupportedFormats = "Vector Elements", - IconKind = "ShapeOutline", - IconColorHex = "#F59E0B", - BackgroundAccentHex = "#FFFBEB", - Badge = "Editor", - Keywords = "shapes rectangle card rounded ellipse divider line ink pen draw freehand vector", - IsFeatured = false - }, - new HelpGuideItem - { - Id = "editor-tables", - Title = "Tables & Data Grids", - Category = "Live Editor", - Summary = "Create and format professional tables with custom column widths, header styles, and alternating shading.", - Description = "Insert and customize structured tables for financial reports, pricing sheets, and technical data. Easily edit cell text, adjust column widths, configure borders, and apply alternating row colors.", - Steps = new List - { - "Click 'Table' in the ribbon toolbar to insert a new data grid on the canvas.", - "Specify initial rows and columns in the dialog.", - "Double-click any cell to enter text, numbers, or headers.", - "Use the Inspector to customize Header Row Background, Alternating Row Shading, and Border Colors.", - "Drag column dividers to adjust column proportions." - }, - KeyFeatures = new List - { - "Customizable Row and Column counts", - "Header row formatting with distinct typography and background colors", - "Alternating row shading (Zebra striping) for readability", - "Adjustable cell padding and border styles" - }, - ProTips = new List - { - "Right-align numeric and currency cells to ensure decimal points align cleanly for readers." - }, - SupportedFormats = "Table Elements", - IconKind = "Table", - IconColorHex = "#10B981", - BackgroundAccentHex = "#ECFDF5", - Badge = "Editor", - Keywords = "table grid rows columns cells data financial report format borders", - IsFeatured = false - }, - new HelpGuideItem - { - Id = "editor-math-latex", - Title = "LaTeX Math Equation Studio", - Category = "Live Editor", - Summary = "Typeset publication-grade LaTeX math formulas, integrals, fractions, and matrices into vector paths.", - Description = "The built-in Math Equation Studio allows academic researchers, students, and engineers to write LaTeX equations (e.g. fractions, integrals, Greek letters, summations, matrices) and render them directly into crisp vector elements on the canvas.", - Steps = new List - { - "Click 'Math Equation' in the ribbon or press ⌘K and type 'Math Equation'.", - "Type your LaTeX expression in the formula editor (e.g. '\\int_{0}^{\\infty} e^{-x^2} dx = \\frac{\\sqrt{\\pi}}{2}').", - "Inspect the live real-time formula preview.", - "Choose font size and text color.", - "Click 'Insert Equation' to place the formula on the canvas." - }, - KeyFeatures = new List - { - "Full LaTeX Syntax Support: Fractions, Superscripts/Subscripts, Integrals, Summations, Greek Symbols, Matrices", - "Live Real-Time Vector Formula Preview", - "Rendered as infinite-resolution vector paths in exported PDFs" - }, - ProTips = new List - { - "Check the 'Math & Academic Research' templates for pre-configured theorem blocks and math formulas." - }, - SupportedFormats = "LaTeX Math Elements", - IconKind = "Sigma", - IconColorHex = "#7C3AED", - BackgroundAccentHex = "#F5F3FF", - Badge = "Editor", - Keywords = "math latex equation formula integral fraction matrix greek physics academic science", - IsFeatured = true - }, - new HelpGuideItem - { - Id = "editor-qr-barcodes", - Title = "QR Codes & 2D Barcodes", - Category = "Live Editor", - Summary = "Generate instant QR codes for URLs, contact vCards, Wi-Fi keys, and embed them in layouts.", - Description = "Generate and embed scannable QR codes directly on your PDF pages. Ideal for business cards, resumes, event flyers, invoices, and product packaging.", - Steps = new List - { - "Click 'QR Code' in the ribbon toolbar.", - "Enter your target URL, contact vCard, Wi-Fi credentials, or text.", - "Configure QR code size, foreground color, and background color.", - "Click 'Insert QR Code' to position it on your page.", - "Test scan the preview on your mobile phone camera." - }, - KeyFeatures = new List - { - "Supports URLs, Plain Text, vCard Contacts, and Payment Links", - "Customizable QR pixel colors and background transparencies", - "High-resolution vector generation ensuring instant scan reliability" - }, - ProTips = new List - { - "Maintain high contrast (e.g. dark QR pixels on a light background) to ensure fast scanning in all lighting conditions." - }, - SupportedFormats = "QR Code Elements", - IconKind = "Qrcode", - IconColorHex = "#0F172A", - BackgroundAccentHex = "#F1F5F9", - Badge = "Editor", - Keywords = "qr code barcode scan link url vcard contact wifi embed generate", - IsFeatured = false - }, - new HelpGuideItem - { - Id = "editor-zindex-layers", - Title = "Layer Hierarchy & Z-Index Management", - Category = "Live Editor", - Summary = "Control visual stacking order: bring elements forward, send backward, and manage container layers.", - Description = "Learn how visual layer stacking works in FryPDF. Layer ordering ensures background cards stay behind content, while headers, labels, and interactive form fields remain on top.", - Steps = new List - { - "Select an element on the canvas.", - "Use the Layer controls in the ribbon or Inspector: 'Bring Forward', 'Send Backward', 'Bring to Front', or 'Send to Back'.", - "Background shapes and cards automatically occupy Z-indices 0–99.", - "Images and photos occupy Z-indices 100–499.", - "Text blocks and headings occupy Z-indices 1000–1999." - }, - KeyFeatures = new List - { - "Predictable Layered Z-Index Architecture", - "Prevents background cards from occluding photos and text", - "One-click Bring to Front and Send to Back controls" - }, - ProTips = new List - { - "Use 'Send to Back' whenever adding a background card behind existing text to immediately nest it behind all content." - }, - SupportedFormats = "Layer Management", - IconKind = "LayersOutline", - IconColorHex = "#4F46E5", - BackgroundAccentHex = "#EEF2FF", - Badge = "Editor", - Keywords = "layers zindex stacking order bring forward send back front arrange hierarchy", - IsFeatured = false - }, - new HelpGuideItem - { - Id = "editor-undo-redo", - Title = "Undo, Redo & Project History", - Category = "Live Editor", - Summary = "Never lose work with unlimited atomic undo/redo history and accidental change rollback.", - Description = "Every modification in FryPDF—element moves, text edits, color adjustments, deletions, and page additions—is recorded in an atomic undo/redo history stack.", - Steps = new List - { - "Press ⌘Z (Ctrl+Z) to undo your last action.", - "Press ⌘⇧Z or ⌘Y (Ctrl+Y) to redo an undone action.", - "Use the Quick Undo/Redo arrow buttons in the top toolbar.", - "History tracks moves, property edits, deletions, and layout changes seamlessly." - }, - KeyFeatures = new List - { - "Deep Atomic Undo/Redo stack", - "Full cross-platform shortcuts (macOS Cmd vs Win/Linux Ctrl)", - "Captures canvas movements, resizing, deletions, and text modifications" - }, - ProTips = new List - { - "You can undo multiple actions in rapid succession without losing document integrity." - }, - SupportedFormats = "Editor History", - KeyboardShortcut = "⌘Z (Undo), ⌘⇧Z / ⌘Y (Redo)", - IconKind = "Undo", - IconColorHex = "#F59E0B", - BackgroundAccentHex = "#FFFBEB", - Badge = "Editor", - Keywords = "undo redo history revert rollback restore accidental mistake change", - IsFeatured = false - }, - new HelpGuideItem - { - Id = "editor-export-persistence", - Title = "Exporting Vector PDFs & Native Projects", - Category = "Live Editor", - Summary = "Save native .frypdf workspaces and compile high-resolution vector QuestPDF documents.", - Description = "FryPDF offers dual-mode persistence: save your project as a lightweight `.frypdf` workspace file for future editing, or export a publication-ready `.pdf` with embedded project metadata.", - Steps = new List - { - "Press ⌘S (Save Project) to save your work as a native `.frypdf` file.", - "Press ⌘E (Export to PDF) to compile the document into a high-fidelity vector PDF.", - "In the Export dialog, choose your destination folder and filename.", - "Exported PDFs embed the editable project state inside metadata, allowing them to be reopened and edited in FryPDF anytime!" - }, - KeyFeatures = new List - { - "QuestPDF High-Fidelity Vector Compilation Engine", - "Embedded Project State: Exported PDFs can be reopened as live editable files", - "Compact Native .frypdf JSON File Format" - }, - ProTips = new List - { - "Because FryPDF embeds project metadata in exported PDFs, you can send a PDF to a colleague and they can open and edit it directly in FryPDF!" - }, - SupportedFormats = "Save: .frypdf | Export: .pdf", - KeyboardShortcut = "⌘S (Save Project), ⌘E (Export PDF)", - IconKind = "ContentSaveOutline", - IconColorHex = "#059669", - BackgroundAccentHex = "#ECFDF5", - Badge = "Editor", - Keywords = "save export pdf compile frypdf project metadata persistence embed", - IsFeatured = true - }, - - // ========================================================================= - // 4. AUTOMATION, WORKFLOWS & BATCH MASS GENERATION - // ========================================================================= - new HelpGuideItem - { - Id = "automation-workflow-builder", - Title = "Workflow Builder: Chained PDF Pipelines", - Category = "Automation", - Summary = "Build and execute multi-step automated PDF processing pipelines with one click.", - Description = "Workflow Builder allows you to automate repetitive document tasks by chaining multiple PDF tools into an automated sequence (e.g. Merge -> Compress -> Watermark -> Encrypt).", - Steps = new List - { - "Open 'Workflow Builder' from AI & Automation or click the Workflow banner on the Home Dashboard.", - "Choose a workflow preset or click 'Create Custom Workflow'.", - "Add pipeline steps from the tool catalog (e.g. Step 1: Merge, Step 2: Compress, Step 3: Watermark, Step 4: Protect).", - "Configure step parameters (e.g. Watermark text, Encryption password).", - "Select input files and click 'Run Automated Workflow'." - }, - KeyFeatures = new List - { - "Chain any combination of the 32 PDF tools", - "Visual pipeline flowchart builder", - "Batch multi-file pipeline execution with live progress logging" - }, - ProTips = new List - { - "Save your frequently used pipelines as custom presets to run routine end-of-month reporting workflows in seconds." - }, - SupportedFormats = "Pipeline Automation Engine", - RelatedToolId = PdfToolId.WorkflowBuilder, - IconKind = "VectorPolyline", - IconColorHex = "#7C3AED", - BackgroundAccentHex = "#F5F3FF", - Badge = "Automation", - Keywords = "workflow pipeline automated chain sequence batch batching process auto", - IsFeatured = true - }, - new HelpGuideItem - { - Id = "automation-data-studio", - Title = "Data Studio & Batch Mass PDF Generation", - Category = "Automation", - Summary = "Import CSV or JSON data to mail-merge placeholders and generate hundreds of personalized PDFs.", - Description = "Data Studio connects datasets (CSV, JSON, Excel) directly to document template placeholders (e.g. {{CustomerName}}, {{InvoiceNumber}}, {{DueDate}}, {{Amount}}), compiling hundreds of personalized PDFs in seconds.", - Steps = new List - { - "Design your base document in the Canvas Editor using placeholder variables like {{Name}}, {{Amount}}, {{Date}}.", - "Click 'Batch Generation / Data Studio' in the ribbon or Home Dashboard.", - "Import your CSV or JSON data source file.", - "Map dataset columns to the document placeholders.", - "Preview sample merged records in real-time.", - "Click 'Generate Batch PDFs' to produce individual PDFs or a single combined batch file." - }, - KeyFeatures = new List - { - "Supports CSV, JSON, and Excel tabular datasets", - "Live Data Binding Preview: Cycle through records to verify layout before generating", - "Mass High-Speed Parallel Generation Engine (100+ PDFs in seconds)", - "Custom dynamic output naming (e.g. 'Invoice_{{InvoiceNumber}}_{{CustomerName}}.pdf')" - }, - ProTips = new List - { - "Use Data Studio to generate monthly payroll slips, customized certificates of completion, conference badges, and bulk invoices." - }, - SupportedFormats = "Inputs: .csv, .json, .xlsx | Output: Batch .pdf files", - IconKind = "DatabaseArrowRightOutline", - IconColorHex = "#2563EB", - BackgroundAccentHex = "#EFF6FF", - Badge = "Automation", - Keywords = "batch mass generation data studio csv json mail merge variables certificates invoices", - IsFeatured = true - }, - - // ========================================================================= - // 5. FONTS & INTERNATIONAL SCRIPT SUPPORT - // ========================================================================= - new HelpGuideItem - { - Id = "fonts-language-packs", - Title = "Font Manager & Unicode Script Support", - Category = "Language & Fonts", - Summary = "Manage on-demand Google Noto Sans font packages for Devanagari, CJK, Arabic, and Indic scripts.", - Description = "FryPDF includes comprehensive multi-script Unicode intelligence. It eliminates missing font boxes (tofu '□□□') by automatically detecting text scripts and falling back to embedded Google Noto Sans font families.", - Steps = new List - { - "Select 'Language & Fonts' from the left sidebar.", - "Browse available language packages: Devanagari (Hindi, Marathi, Sanskrit), CJK (Chinese, Japanese, Korean), Arabic, Tamil, Telugu, Thai, Cyrillic, Greek, Hebrew.", - "View installed font status and package details.", - "When deconstructing imported PDFs with Indic or CJK text, FryPDF automatically activates the appropriate script rendering rules." - }, - KeyFeatures = new List - { - "Automatic Unicode Script Range Detection", - "Eliminates tofu boxes (□□□) across 100+ languages", - "Script-Aware token joining for Indic and Asian scripts without artificial spaces", - "100% Embedded and self-contained: zero external web font requests" - }, - ProTips = new List - { - "If an imported PDF displays missing character glyphs, verify the corresponding language package is active in Language & Fonts." - }, - SupportedFormats = "TrueType / OpenType Fonts (.ttf, .otf)", - IconKind = "Translate", - IconColorHex = "#0284C7", - BackgroundAccentHex = "#E0F2FE", - Badge = "Typography", - Keywords = "fonts languages unicode noto sans devanagari hindi cjk chinese japanese arabic tofu glyphs", - IsFeatured = false - }, - - // ========================================================================= - // 6. KEYBOARD SHORTCUTS & PRODUCTIVITY - // ========================================================================= - new HelpGuideItem - { - Id = "shortcuts-reference", - Title = "Keyboard Shortcuts & Mouse Gestures", - Category = "Shortcuts", - Summary = "Comprehensive cheat sheet for all global hotkeys, editor shortcuts, and navigation gestures.", - Description = "Boost your editing productivity with full keyboard shortcuts designed for both macOS (Cmd key) and Windows/Linux (Ctrl key).", - Steps = new List - { - "Press F1 or Shift+? anytime to open the interactive Keyboard Shortcuts dialog.", - "Use ⌘K to open the Quick Command Palette to run any command without touching the mouse.", - "Use ⌘S to save your project and ⌘E to export to PDF.", - "Use ⌘B to toggle the left sidebar, ⌘F1 to toggle the ribbon, and ⌘⇧P to toggle the Inspector.", - "Use ⌘1, ⌘9, and ⌘0 for quick zoom fitting and reset." - }, - KeyFeatures = new List - { - "File Operations: ⌘N (New), ⌘O (Open), ⌘S (Save), ⌘E (Export)", - "Edit Operations: ⌘Z (Undo), ⌘⇧Z / ⌘Y (Redo), ⌘C (Copy), ⌘V (Paste), ⌘X (Cut), ⌘D (Duplicate)", - "View Operations: ⌘+ (Zoom In), ⌘- (Zoom Out), ⌘0 (100%), ⌘1 (Fit Width), ⌘9 (Fit Page)", - "Page Management: PageDown / PageUp, ⌘⇧N (Add Page), ⌘⇧D (Duplicate Page), ⌘⇧R (Rotate Page), ⌘⇧⌫ (Delete Page)", - "Workspace Panels: ⌘B (Sidebar), ⌘F1 (Ribbon), ⌘⇧P (Inspector), ⌘K (Command Palette)" - }, - ProTips = new List - { - "Hold Shift while dragging an element's corner handle to constrain its aspect ratio.", - "Hold Alt / Option while dragging an element to clone and duplicate it instantly." - }, - SupportedFormats = "Hotkeys & Gestures", - KeyboardShortcut = "F1 / Shift+? (Shortcuts Dialog)", - IconKind = "KeyboardOutline", - IconColorHex = "#64748B", - BackgroundAccentHex = "#F1F5F9", - Badge = "Productivity", - Keywords = "shortcuts hotkeys keys keyboard mouse gestures cheat sheet f1 cmd ctrl", - IsFeatured = true - }, - - // ========================================================================= - // 7. FREQUENTLY ASKED QUESTIONS & TROUBLESHOOTING - // ========================================================================= - new HelpGuideItem - { - Id = "faq-troubleshooting", - Title = "Frequently Asked Questions & Troubleshooting", - Category = "FAQ & Support", - Summary = "Find answers to common questions, performance tips, and troubleshooting resolutions.", - Description = "Get quick answers regarding privacy, file compatibility, high-resolution rendering, and troubleshooting common PDF challenges.", - Steps = new List - { - "Q: Is my document uploaded to the internet or any cloud server? -> A: Absolutely not. FryPDF is 100% offline and processes everything strictly locally on your computer.", - "Q: Why do some non-Latin characters appear as squares (□□□)? -> A: Open 'Language & Fonts' from the sidebar and confirm the appropriate Google Noto Sans font pack is available.", - "Q: Can I edit a PDF created in another application? -> A: Yes! Use 'Edit PDF' or drag the PDF into the editor. The deconstruction engine parses text, shapes, and images into editable layers.", - "Q: How do I reduce the file size of a PDF for email? -> A: Use the 'Compress PDF' tool with 'Recommended' compression preset to achieve maximum file size reduction with zero visible quality loss.", - "Q: How do I report a bug or suggest a feature? -> A: Visit the CodeFryDev developer portal at https://codefrydev.in or check the 'Licenses & Tools' page." - }, - KeyFeatures = new List - { - "100% Local Privacy Guarantee", - "Comprehensive Troubleshooting Guide", - "Performance tuning for 100+ page documents" - }, - ProTips = new List - { - "If an imported PDF has flattened raster text (such as a physical scan), run 'OCR Text Recognition' before editing." - }, - SupportedFormats = "Knowledge Base & FAQ", - IconKind = "HelpBoxOutline", - IconColorHex = "#0284C7", - BackgroundAccentHex = "#E0F2FE", - Badge = "FAQ", - Keywords = "faq help questions troubleshooting issue problem privacy tofu error crash support", - IsFeatured = true - } - }; - - _categories = new List - { - "All Guides", - "Getting Started", - "32 PDF Tools", - "Live Editor", - "Automation", - "Language & Fonts", - "Shortcuts", - "FAQ & Support" - }; - } - - public IReadOnlyList GetAllGuides() => _guides; - - public IReadOnlyList GetGuidesByCategory(string category) - { - if (string.IsNullOrWhiteSpace(category) || category.Equals("All Guides", StringComparison.OrdinalIgnoreCase) || category.Equals("All", StringComparison.OrdinalIgnoreCase)) - return _guides; - - return _guides.Where(g => g.Category.Equals(category, StringComparison.OrdinalIgnoreCase)).ToList(); - } - - public HelpGuideItem? GetGuideById(string id) - { - if (string.IsNullOrWhiteSpace(id)) return null; - return _guides.FirstOrDefault(g => g.Id.Equals(id, StringComparison.OrdinalIgnoreCase)); - } - - public HelpGuideItem? GetGuideByToolId(PdfToolId toolId) - { - return _guides.FirstOrDefault(g => g.RelatedToolId == toolId); - } - - public IReadOnlyList GetAllCategories() => _categories; -} diff --git a/src/PdfEditorApp/Services/IHelpGuideService.cs b/src/PdfEditorApp/Services/IHelpGuideService.cs deleted file mode 100644 index 57c7a0b..0000000 --- a/src/PdfEditorApp/Services/IHelpGuideService.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Collections.Generic; -using PdfEditorApp.Models; - -namespace PdfEditorApp.Services; - -/// -/// Service interface for accessing and searching the built-in FryPDF help guides, tool tutorials, and documentation knowledge base. -/// -public interface IHelpGuideService -{ - /// - /// Returns all available help guide topics. - /// - IReadOnlyList GetAllGuides(); - - /// - /// Returns help guides matching a specific category. - /// - IReadOnlyList GetGuidesByCategory(string category); - - /// - /// Looks up a guide item by unique ID. - /// - HelpGuideItem? GetGuideById(string id); - - /// - /// Looks up a guide item corresponding to a specific PDF tool. - /// - HelpGuideItem? GetGuideByToolId(PdfToolId toolId); - - /// - /// Returns all distinct categories in the knowledge base. - /// - IReadOnlyList GetAllCategories(); -} diff --git a/src/PdfEditorApp/Services/IPdfDocumentOperationsService.cs b/src/PdfEditorApp/Services/IPdfDocumentOperationsService.cs deleted file mode 100644 index 4908f07..0000000 --- a/src/PdfEditorApp/Services/IPdfDocumentOperationsService.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using PdfEditorApp.Models; -using PdfEditorApp.Services.Tools.Core; -using PdfEditorApp.Services.Tools.Organize; -using PdfEditorApp.Services.Tools.Security; -using PdfEditorApp.Services.Tools.Conversion; -using PdfEditorApp.Services.Tools.Intelligence; - -namespace PdfEditorApp.Services; - -public interface IPdfDocumentOperationsService -{ - IPdfToolRegistry ToolRegistry { get; } - IPdfPageService PageService { get; } - IPdfOptimizationService OptimizationService { get; } - IPdfSecurityService SecurityService { get; } - IPdfConversionService ConversionService { get; } - IPdfOcrService OcrService { get; } - IPdfFormService FormService { get; } - IAiDocumentService AiService { get; } - IDocumentTranslationService TranslationService { get; } - IPdfWorkflowEngine WorkflowEngine { get; } - - Task ExecuteToolAsync(PdfToolId toolId, object options, IProgress? progress = null, CancellationToken ct = default); -} diff --git a/src/PdfEditorApp/Services/IPdfExportService.cs b/src/PdfEditorApp/Services/IPdfExportService.cs deleted file mode 100644 index be4d1d1..0000000 --- a/src/PdfEditorApp/Services/IPdfExportService.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; -using System.Threading; -using System.Threading.Tasks; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Models; - -namespace PdfEditorApp.Services; - -public interface IPdfExportService -{ - byte[] GeneratePdfBytes(PdfDocumentModel model); - Task ExportToBytesAsync(PdfDocumentModel model, IProgress? progress = null, CancellationToken ct = default); - Task ExportToFileAsync(PdfDocumentModel model, string filePath, IProgress? progress = null, CancellationToken ct = default); -} diff --git a/src/PdfEditorApp/Services/IRecentDocumentsService.cs b/src/PdfEditorApp/Services/IRecentDocumentsService.cs deleted file mode 100644 index ba563f1..0000000 --- a/src/PdfEditorApp/Services/IRecentDocumentsService.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System.Collections.Generic; -using PdfEditorApp.Models; - -namespace PdfEditorApp.Services; - -public interface IRecentDocumentsService -{ - /// Returns the list of recent documents, newest first. - List Load(); - - /// Adds or bumps an item to the top of the recent list and persists it. - void Add(RecentDocumentItem item); - - /// Removes a specific file path from the recent list. - void Remove(string filePath); - - /// Updates an existing recent document's path and title when renamed. - void Rename(string oldFilePath, string newFilePath, string newTitle); - - /// Clears all recent documents. - void Clear(); -} diff --git a/src/PdfEditorApp/Services/ISmartPlacementService.cs b/src/PdfEditorApp/Services/ISmartPlacementService.cs deleted file mode 100644 index 71a2cec..0000000 --- a/src/PdfEditorApp/Services/ISmartPlacementService.cs +++ /dev/null @@ -1,31 +0,0 @@ -using PdfEditorApp.ViewModels; - -namespace PdfEditorApp.Services; - -public interface ISmartPlacementService -{ - /// - /// Calculates the optimal (X, Y) placement coordinates for a newly created or pasted element. - /// - (double X, double Y) GetPlacementPosition(PageViewModel page, double elementWidth, double elementHeight, bool isContextMenuTriggered = false); - - /// - /// Updates the currently visible viewport center and dimensions in unscaled page coordinates. - /// - void UpdateViewport(double pageCenterX, double pageCenterY, double visibleWidth, double visibleHeight); - - /// - /// Registers the exact page coordinates where a right-click context menu was opened. - /// - void SetContextMenuPointer(double pageX, double pageY); - - /// - /// Clears any pending context menu pointer coordinates. - /// - void ClearContextMenuPointer(); - - /// - /// Resets the sequential cascading offset counter. - /// - void ResetCascade(); -} diff --git a/src/PdfEditorApp/Services/ITemplateService.cs b/src/PdfEditorApp/Services/ITemplateService.cs deleted file mode 100644 index 0144a14..0000000 --- a/src/PdfEditorApp/Services/ITemplateService.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System.Collections.Generic; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Models; -using PdfEditorApp.Templates; - -namespace PdfEditorApp.Services; - -public interface ITemplateService -{ - IReadOnlyList GetAllTemplates(); - PdfDocumentModel CreateTemplate(string templateId); - - PdfDocumentModel CreateAnnualReportTemplate(); - PdfDocumentModel CreateInteractiveExecutiveBriefTemplate(); - PdfDocumentModel CreateEmployeePayslipTemplate(); - PdfDocumentModel CreateInvoiceTemplate(); - PdfDocumentModel CreateResumeTemplate(); - PdfDocumentModel CreateResumeModernCleanTemplate(); - PdfDocumentModel CreateResumeCreativeMinimalistTemplate(); - PdfDocumentModel CreateResumeAcademicCvTemplate(); - PdfDocumentModel CreateAcademicPaperTemplate(); - PdfDocumentModel CreateMathResearchPaperTemplate(); - PdfDocumentModel CreatePhysicsResearchPaperTemplate(); - PdfDocumentModel CreateHistoryResearchPaperTemplate(); - PdfDocumentModel CreateFinanceResearchPaperTemplate(); - PdfDocumentModel CreateCertificateTemplate(); - PdfDocumentModel CreateCertificateNavyGoldTemplate(); - PdfDocumentModel CreateDiplomaAcademicTemplate(); - PdfDocumentModel CreateWeddingInvitationTraditionalTemplate(); - PdfDocumentModel CreateWeddingInvitationRoyalFloralTemplate(); - PdfDocumentModel CreateGalaInvitationTemplate(); - PdfDocumentModel CreateTypographyShowcaseTemplate(); - PdfDocumentModel CreateRichTextShowcaseTemplate(); - PdfDocumentModel CreateOcrAnalysisReportTemplate(); - PdfDocumentModel CreateMathBODMASWorksheetTemplate(); - PdfDocumentModel CreateFactorizationWorksheetTemplate(); - PdfDocumentModel CreateBilingualExamPaperTemplate(); - PdfDocumentModel CreateStatesOfMatterDiagramNotesTemplate(); - PdfDocumentModel CreateQuadrilateralsGuideTemplate(); - PdfDocumentModel CreateArduinoCheatSheetTemplate(); - PdfDocumentModel CreateBlankDocument(PageFormat format = PageFormat.A4, PageOrientation orientation = PageOrientation.Portrait); -} diff --git a/src/PdfEditorApp/Services/IUiSettingsService.cs b/src/PdfEditorApp/Services/IUiSettingsService.cs deleted file mode 100644 index f604968..0000000 --- a/src/PdfEditorApp/Services/IUiSettingsService.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System; -using PdfEditorApp.Models; - -namespace PdfEditorApp.Services; - -/// -/// Service providing centralized retrieval, mutation, and persistence of UI user preferences. -/// -public interface IUiSettingsService -{ - /// - /// Current snapshot of UI preferences. - /// - UiSettingsModel Settings { get; } - - /// - /// Event raised whenever any UI preference is modified and saved. - /// - event Action? SettingsChanged; - - /// - /// Save current settings state to disk. - /// - void Save(); - - /// - /// Mutate settings atomically and persist changes. - /// - void UpdateSettings(Action updateAction); - - /// - /// Reset all settings to application defaults and persist. - /// - void ResetToDefaults(); -} diff --git a/src/PdfEditorApp/Services/Import/DocumentImporterRegistry.cs b/src/PdfEditorApp/Services/Import/DocumentImporterRegistry.cs deleted file mode 100644 index 4025d68..0000000 --- a/src/PdfEditorApp/Services/Import/DocumentImporterRegistry.cs +++ /dev/null @@ -1,189 +0,0 @@ -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using PdfEditorApp.Core.Deconstruction; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; -using PdfEditorApp.Core.Plugins.Descriptors; - -namespace PdfEditorApp.Services.Import; - -public class DocumentImporterRegistry : IDocumentImporterRegistry -{ - private readonly ConcurrentDictionary _importers = new(StringComparer.OrdinalIgnoreCase); - - public event Action? RegistryChanged; - - public DocumentImporterRegistry() - { - RegisterBuiltInImporters(); - } - - private void RegisterBuiltInImporters() - { - RegisterImporter(new PdfDeconstructionImporter()); - RegisterImporter(new ImageDocumentImporter()); - RegisterImporter(new PlainTextDocumentImporter()); - } - - public IDisposable RegisterImporter(IDocumentImporter importer) - { - ArgumentNullException.ThrowIfNull(importer); - _importers[importer.ImporterId] = importer; - RegistryChanged?.Invoke(); - - return new DisposableAction(() => - { - _importers.TryRemove(importer.ImporterId, out _); - RegistryChanged?.Invoke(); - }); - } - - public IDocumentImporter? FindImporter(string filePathOrExtension) - { - if (string.IsNullOrWhiteSpace(filePathOrExtension)) return null; - - var ext = Path.GetExtension(filePathOrExtension); - if (string.IsNullOrWhiteSpace(ext)) - { - ext = filePathOrExtension.StartsWith('.') ? filePathOrExtension : "." + filePathOrExtension; - } - - return _importers.Values - .Where(i => i.SupportedExtensions.Any(e => string.Equals(e, ext, StringComparison.OrdinalIgnoreCase))) - .OrderByDescending(i => i.Priority) - .FirstOrDefault(); - } - - public IDocumentImporter? GetImporter(string importerId) - { - if (string.IsNullOrWhiteSpace(importerId)) return null; - return _importers.GetValueOrDefault(importerId); - } - - public IReadOnlyList GetAllImporters() - { - return _importers.Values.OrderByDescending(i => i.Priority).ToList(); - } - - private sealed class DisposableAction(Action action) : IDisposable - { - private Action? _action = action; - public void Dispose() => Interlocked.Exchange(ref _action, null)?.Invoke(); - } -} - -/// -/// Default native PDF deconstruction engine importer using UglyToad.PdfPig + Skia. -/// -public class PdfDeconstructionImporter : IDocumentImporter -{ - public string ImporterId => "frypdf.importer.pdfpig"; - public string DisplayName => "Adobe PDF Deconstruction Engine"; - public IReadOnlyList SupportedExtensions => new[] { ".pdf" }; - public int Priority => 100; - - public async Task ImportAsync(Stream stream, string fileName, string? password = null, CancellationToken ct = default) - { - using var ms = new MemoryStream(); - await stream.CopyToAsync(ms, ct); - var bytes = ms.ToArray(); - - return await Task.Run(() => PdfDeconstructionEngine.Deconstruct(bytes, fileName, password), ct); - } -} - -/// -/// Image importer converting raster images into editable full-bleed PDF pages. -/// -public class ImageDocumentImporter : IDocumentImporter -{ - public string ImporterId => "frypdf.importer.image"; - public string DisplayName => "Raster Image Importer"; - public IReadOnlyList SupportedExtensions => new[] { ".png", ".jpg", ".jpeg", ".webp", ".bmp", ".tiff" }; - public int Priority => 50; - - public async Task ImportAsync(Stream stream, string fileName, string? password = null, CancellationToken ct = default) - { - using var ms = new MemoryStream(); - await stream.CopyToAsync(ms, ct); - var bytes = ms.ToArray(); - - var doc = new PdfDocumentModel - { - Title = Path.GetFileNameWithoutExtension(fileName), - Author = "FryPDF Image Importer" - }; - - var page = new PdfPageModel - { - PageNumber = 1, - Width = 595.28, // Standard A4 portrait - Height = 841.89 - }; - - var imgElement = new PdfImageElement - { - X = 20, - Y = 20, - Width = 555.28, - Height = 801.89, - ImageData = bytes, - ZIndex = 100 - }; - - page.Elements.Add(imgElement); - doc.Pages.Add(page); - return doc; - } -} - -/// -/// Plain text / Markdown document importer. -/// -public class PlainTextDocumentImporter : IDocumentImporter -{ - public string ImporterId => "frypdf.importer.text"; - public string DisplayName => "Text & Markdown Importer"; - public IReadOnlyList SupportedExtensions => new[] { ".txt", ".md" }; - public int Priority => 50; - - public async Task ImportAsync(Stream stream, string fileName, string? password = null, CancellationToken ct = default) - { - using var reader = new StreamReader(stream); - var text = await reader.ReadToEndAsync(ct); - - var doc = new PdfDocumentModel - { - Title = Path.GetFileNameWithoutExtension(fileName), - Author = "FryPDF Text Importer" - }; - - var page = new PdfPageModel - { - PageNumber = 1, - Width = 595.28, - Height = 841.89 - }; - - var textElement = new PdfTextElement - { - X = 50, - Y = 50, - Width = 495.28, - Height = 741.89, - Text = text, - FontSize = 12, - FontFamily = "Inter", - ZIndex = 1000 - }; - - page.Elements.Add(textElement); - doc.Pages.Add(page); - return doc; - } -} diff --git a/src/PdfEditorApp/Services/Inspector/InspectorRegistry.cs b/src/PdfEditorApp/Services/Inspector/InspectorRegistry.cs deleted file mode 100644 index 7789104..0000000 --- a/src/PdfEditorApp/Services/Inspector/InspectorRegistry.cs +++ /dev/null @@ -1,60 +0,0 @@ -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using PdfEditorApp.Core.Plugins.Descriptors; - -namespace PdfEditorApp.Services.Inspector; - -public class InspectorRegistry : IInspectorRegistry -{ - private readonly ConcurrentDictionary _sections = new(StringComparer.OrdinalIgnoreCase); - - public event Action? RegistryChanged; - - public InspectorRegistry(bool seedDefaults = false) - { - if (seedDefaults) - { - RegisterBuiltInSections(); - } - } - - private void RegisterBuiltInSections() - { - // Core sections can be registered dynamically if needed - } - - public IDisposable RegisterSection(InspectorSectionDescriptor descriptor) - { - ArgumentNullException.ThrowIfNull(descriptor); - _sections[descriptor.SectionId] = descriptor; - RegistryChanged?.Invoke(); - - return new DisposableAction(() => - { - _sections.TryRemove(descriptor.SectionId, out _); - RegistryChanged?.Invoke(); - }); - } - - public IReadOnlyList GetSectionsForTarget(object? target) - { - return _sections.Values - .Where(s => s.AppliesTo(target)) - .OrderBy(s => s.Order) - .ToList(); - } - - public IReadOnlyList GetAllSections() - { - return _sections.Values.OrderBy(s => s.Order).ToList(); - } - - private sealed class DisposableAction(Action action) : IDisposable - { - private Action? _action = action; - public void Dispose() => Interlocked.Exchange(ref _action, null)?.Invoke(); - } -} diff --git a/src/PdfEditorApp/Services/Math/MathLayoutEngine.cs b/src/PdfEditorApp/Services/Math/MathLayoutEngine.cs deleted file mode 100644 index da189cc..0000000 --- a/src/PdfEditorApp/Services/Math/MathLayoutEngine.cs +++ /dev/null @@ -1,1482 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; -using System.Text; -using PdfEditorApp.Core.Models; - -namespace PdfEditorApp.Services.MathEngine; - -public record MathRenderOptions( - double FontSize = 16, - string TextColorHex = "#0F172A", - string BackgroundColorHex = "#00000000", - string BorderColorHex = "#00000000", - double BorderThickness = 0, - double CornerRadius = 4, - double Padding = 8, - bool ShowBackground = false, - bool ShowBorder = false, - bool ShowEquationNumber = false, - string EquationNumber = "(1)", - TextAlignmentMode Alignment = TextAlignmentMode.Center, - MathDisplayStyle DisplayStyle = MathDisplayStyle.DisplayBlock, - double TargetWidth = 0, - double TargetHeight = 0 -); - -public class MathRenderResult -{ - public string SvgXml { get; set; } = ""; - public string SvgMarkup => SvgXml; - public double Width { get; set; } - public double Height { get; set; } - public bool IsSuccess { get; set; } = true; - public string? ErrorMessage { get; set; } - public string PathGeometryData { get; set; } = ""; -} - -public static class MathLayoutEngine -{ - // ========================================================================= - // SYMBOL & COMMAND DICTIONARIES - // ========================================================================= - private static readonly Dictionary _greekSymbols = new(StringComparer.OrdinalIgnoreCase) - { - // Lowercase Greek - ["alpha"] = ("α", false), ["beta"] = ("β", false), ["gamma"] = ("γ", false), ["delta"] = ("δ", false), - ["epsilon"] = ("ϵ", false), ["varepsilon"] = ("ε", false), ["zeta"] = ("ζ", false), ["eta"] = ("η", false), - ["theta"] = ("θ", false), ["vartheta"] = ("ϑ", false), ["iota"] = ("ι", false), ["kappa"] = ("κ", false), - ["lambda"] = ("λ", false), ["mu"] = ("μ", false), ["nu"] = ("ν", false), ["xi"] = ("ξ", false), - ["pi"] = ("π", false), ["varpi"] = ("ϖ", false), ["rho"] = ("ρ", false), ["varrho"] = ("ϱ", false), - ["sigma"] = ("σ", false), ["varsigma"] = ("ς", false), ["tau"] = ("τ", false), ["upsilon"] = ("υ", false), - ["phi"] = ("ϕ", false), ["varphi"] = ("φ", false), ["chi"] = ("χ", false), ["psi"] = ("ψ", false), - ["omega"] = ("ω", false), - - // Uppercase Greek - ["Gamma"] = ("Γ", false), ["Delta"] = ("Δ", false), ["Theta"] = ("Θ", false), ["Lambda"] = ("Λ", false), - ["Xi"] = ("Ξ", false), ["Pi"] = ("Π", false), ["Sigma"] = ("Σ", false), ["Upsilon"] = ("Υ", false), - ["Phi"] = ("Φ", false), ["Psi"] = ("Ψ", false), ["Omega"] = ("Ω", false) - }; - - private static readonly Dictionary _mathSymbols = new(StringComparer.OrdinalIgnoreCase) - { - // Binary Operators & Signs - ["pm"] = "±", ["mp"] = "∓", ["times"] = "×", ["cdot"] = "·", ["div"] = "÷", - ["ast"] = "∗", ["star"] = "★", ["circ"] = "∘", ["bullet"] = "•", - ["oplus"] = "⊕", ["otimes"] = "⊗", ["odot"] = "⊙", ["wedge"] = "∧", ["vee"] = "∨", - ["cap"] = "∩", ["cup"] = "∪", - - // Relations & Sets - ["le"] = "≤", ["leq"] = "≤", ["ge"] = "≥", ["geq"] = "≥", ["neq"] = "≠", ["ne"] = "≠", - ["approx"] = "≈", ["equiv"] = "≡", ["sim"] = "∼", ["simeq"] = "≃", ["cong"] = "≅", - ["propto"] = "∝", ["subset"] = "⊂", ["subseteq"] = "⊆", ["supset"] = "⊃", ["supseteq"] = "⊇", - ["in"] = "∈", ["notin"] = "∉", ["ni"] = "∋", ["mid"] = "∣", ["parallel"] = "∥", ["perp"] = "⊥", - - // Arrows - ["to"] = "→", ["rightarrow"] = "→", ["leftarrow"] = "←", ["Rightarrow"] = "⇒", - ["Leftarrow"] = "⇐", ["leftrightarrow"] = "↔", ["Leftrightarrow"] = "⇔", ["iff"] = "⟺", - ["mapsto"] = "↦", ["uparrow"] = "↑", ["downarrow"] = "↓", - - // Calculus, Physics & Analysis - ["partial"] = "∂", ["nabla"] = "∇", ["hbar"] = "ℏ", ["infty"] = "∞", ["ell"] = "ℓ", - ["dagger"] = "†", ["ddagger"] = "‡", ["prime"] = "′", ["forall"] = "∀", ["exists"] = "∃", - ["nexists"] = "∄", ["empty"] = "∅", ["emptyset"] = "∅", ["neg"] = "¬", ["angle"] = "∠", - ["Re"] = "ℜ", ["Im"] = "ℑ", ["aleph"] = "ℵ", ["wp"] = "℘" - }; - - private static readonly Dictionary _blackboardBold = new(StringComparer.OrdinalIgnoreCase) - { - ["R"] = "ℝ", ["C"] = "ℂ", ["N"] = "ℕ", ["Z"] = "ℤ", ["Q"] = "ℚ", - ["P"] = "ℙ", ["E"] = "𝔼", ["H"] = "ℍ", ["F"] = "𝔽", ["K"] = "𝕂" - }; - - private static readonly Dictionary _calligraphic = new(StringComparer.OrdinalIgnoreCase) - { - ["A"] = "𝒜", ["B"] = "ℬ", ["C"] = "𝒞", ["D"] = "𝒟", ["E"] = "ℰ", - ["F"] = "ℱ", ["G"] = "𝒢", ["H"] = "ℋ", ["I"] = "ℐ", ["J"] = "𝒥", - ["K"] = "𝒦", ["L"] = "ℒ", ["M"] = "ℳ", ["N"] = "𝒩", ["O"] = "𝒪", - ["P"] = "𝒫", ["Q"] = "𝒬", ["R"] = "ℛ", ["S"] = "𝒮", ["T"] = "𝒯", - ["U"] = "𝒰", ["V"] = "𝒱", ["W"] = "𝒲", ["X"] = "𝒳", ["Y"] = "𝒴", - ["Z"] = "𝒵" - }; - - private static readonly HashSet _standardFunctions = new(StringComparer.OrdinalIgnoreCase) - { - "sin", "cos", "tan", "cot", "sec", "csc", - "arcsin", "arccos", "arctan", "sinh", "cosh", "tanh", - "ln", "log", "exp", "det", "dim", "ker", "deg", "gcd", - "max", "min", "sup", "inf", "lim", "limsup", "liminf", - "Pr", "arg", "Tr", "diag", "cov", "var", "Res", "rank" - }; - - // ========================================================================= - // PUBLIC MAIN RENDER API - // ========================================================================= - public static MathRenderResult RenderToSvg(string formula, MathRenderOptions? options = null) - { - options ??= new MathRenderOptions(); - var result = new MathRenderResult(); - - try - { - if (string.IsNullOrWhiteSpace(formula)) - { - formula = @"f(x) = y"; - } - - // 1. Tokenize & Parse AST - var tokens = Tokenize(formula); - var parser = new MathParser(tokens); - var rootNode = parser.ParseExpression(); - - // 2. Measure AST Nodes recursively - double baseFontSize = System.Math.Max(8, options.FontSize); - var measureCtx = new LayoutContext(baseFontSize, options.TextColorHex, options.DisplayStyle); - rootNode.Measure(measureCtx); - - double contentWidth = rootNode.Width; - double contentHeight = rootNode.Height; - double contentAscent = rootNode.Ascent; - - // 3. Compute SVG Dimensions and Margins - double pad = System.Math.Max(0, options.Padding); - double eqNumWidth = 0; - if (options.ShowEquationNumber && !string.IsNullOrWhiteSpace(options.EquationNumber)) - { - eqNumWidth = (options.EquationNumber.Length * baseFontSize * 0.55) + 20; - } - - double totalWidth = System.Math.Max(options.TargetWidth, contentWidth + (pad * 2) + eqNumWidth); - double totalHeight = System.Math.Max(options.TargetHeight, contentHeight + (pad * 2)); - - // Align content X inside bounding box - double startX = pad; - if (options.Alignment == TextAlignmentMode.Center) - { - startX = pad + System.Math.Max(0, (totalWidth - (pad * 2) - eqNumWidth - contentWidth) / 2); - } - else if (options.Alignment == TextAlignmentMode.Right) - { - startX = totalWidth - pad - eqNumWidth - contentWidth; - } - - double baselineY = pad + contentAscent + System.Math.Max(0, (totalHeight - (pad * 2) - contentHeight) / 2); - - // 4. Generate SVG Output - var svgBuilder = new StringBuilder(); - string strW = totalWidth.ToString("F1", CultureInfo.InvariantCulture); - string strH = totalHeight.ToString("F1", CultureInfo.InvariantCulture); - - svgBuilder.AppendLine($""); - svgBuilder.AppendLine(" "); - svgBuilder.AppendLine(" "); - svgBuilder.AppendLine(" "); - - // Background & Border - if (options.ShowBackground || options.ShowBorder) - { - string fill = options.ShowBackground && !string.IsNullOrEmpty(options.BackgroundColorHex) ? options.BackgroundColorHex : "none"; - string stroke = options.ShowBorder && !string.IsNullOrEmpty(options.BorderColorHex) ? options.BorderColorHex : "none"; - string strokeW = options.BorderThickness > 0 ? options.BorderThickness.ToString("F1", CultureInfo.InvariantCulture) : "0"; - string rx = options.CornerRadius.ToString("F1", CultureInfo.InvariantCulture); - - svgBuilder.AppendLine($" "); - } - - // Render Math AST Content - var renderCtx = new RenderContext(baseFontSize, options.TextColorHex, svgBuilder, options.DisplayStyle); - rootNode.Render(startX, baselineY, renderCtx); - - // Render Right-Aligned Equation Number (e.g. "(1)") - if (options.ShowEquationNumber && !string.IsNullOrWhiteSpace(options.EquationNumber)) - { - double eqNumX = totalWidth - pad; - double eqNumFontSize = baseFontSize * 0.9; - svgBuilder.AppendLine($" {EscapeXml(options.EquationNumber)}"); - } - - svgBuilder.AppendLine(""); - - result.SvgXml = svgBuilder.ToString(); - result.Width = totalWidth; - result.Height = totalHeight; - result.IsSuccess = true; - result.PathGeometryData = GeneratePathPreviewData(totalWidth, totalHeight); - } - catch (Exception ex) - { - result.IsSuccess = false; - result.ErrorMessage = ex.Message; - result.SvgXml = GenerateFallbackErrorSvg(formula, options, ex.Message); - result.Width = System.Math.Max(200, options.TargetWidth); - result.Height = System.Math.Max(40, options.TargetHeight); - } - - return result; - } - - private static string GeneratePathPreviewData(double width, double height) - { - // Simple geometry representation for Avalonia vector path binding fallback - return $"M 0,0 L {width.ToString("F0", CultureInfo.InvariantCulture)},0 L {width.ToString("F0", CultureInfo.InvariantCulture)},{height.ToString("F0", CultureInfo.InvariantCulture)} L 0,{height.ToString("F0", CultureInfo.InvariantCulture)} Z"; - } - - private static string GenerateFallbackErrorSvg(string rawFormula, MathRenderOptions options, string error) - { - double w = System.Math.Max(240, options.TargetWidth > 0 ? options.TargetWidth : 240); - double h = System.Math.Max(50, options.TargetHeight > 0 ? options.TargetHeight : 50); - - return $""" - - - {EscapeXml(rawFormula)} - Syntax Error: {EscapeXml(error)} - - """; - } - - public static string EscapeXml(string? input) - { - if (string.IsNullOrEmpty(input)) return ""; - return input - .Replace("&", "&") - .Replace("<", "<") - .Replace(">", ">") - .Replace("\"", """) - .Replace("'", "'"); - } - - // ========================================================================= - // TOKENIZER - // ========================================================================= - public enum TokenType - { - Command, - Identifier, - Number, - Operator, - OpenBrace, - CloseBrace, - OpenBracket, - CloseBracket, - OpenParen, - CloseParen, - Superscript, - Subscript, - Ampersand, - Newline, - StringLiteral, - EOF - } - - public record Token(TokenType Type, string Value, int Position); - - public static List Tokenize(string formula) - { - var tokens = new List(); - int i = 0; - int len = formula.Length; - - while (i < len) - { - char c = formula[i]; - - if (char.IsWhiteSpace(c)) - { - i++; - continue; - } - - if (c == '\\') - { - int start = i; - i++; // Skip backslash - if (i < len && (formula[i] == '\\' || formula[i] == ',' || formula[i] == ':' || formula[i] == ';' || formula[i] == '!' || formula[i] == '{' || formula[i] == '}' || formula[i] == '|' || formula[i] == ' ' || formula[i] == '%')) - { - char sym = formula[i++]; - if (sym == '\\') - { - tokens.Add(new Token(TokenType.Newline, "\\\\", start)); - } - else - { - tokens.Add(new Token(TokenType.Command, "\\" + sym, start)); - } - } - else - { - int cmdStart = i; - while (i < len && char.IsLetter(formula[i])) - { - i++; - } - string cmd = formula[cmdStart..i]; - tokens.Add(new Token(TokenType.Command, cmd, start)); - } - continue; - } - - if (c == '{') - { - tokens.Add(new Token(TokenType.OpenBrace, "{", i++)); - continue; - } - - if (c == '}') - { - tokens.Add(new Token(TokenType.CloseBrace, "}", i++)); - continue; - } - - if (c == '[') - { - tokens.Add(new Token(TokenType.OpenBracket, "[", i++)); - continue; - } - - if (c == ']') - { - tokens.Add(new Token(TokenType.CloseBracket, "]", i++)); - continue; - } - - if (c == '(') - { - tokens.Add(new Token(TokenType.OpenParen, "(", i++)); - continue; - } - - if (c == ')') - { - tokens.Add(new Token(TokenType.CloseParen, ")", i++)); - continue; - } - - if (c == '^') - { - tokens.Add(new Token(TokenType.Superscript, "^", i++)); - continue; - } - - if (c == '_') - { - tokens.Add(new Token(TokenType.Subscript, "_", i++)); - continue; - } - - if (c == '&') - { - tokens.Add(new Token(TokenType.Ampersand, "&", i++)); - continue; - } - - if (char.IsDigit(c) || (c == '.' && i + 1 < len && char.IsDigit(formula[i + 1]))) - { - int numStart = i; - while (i < len && (char.IsDigit(formula[i]) || formula[i] == '.')) - { - i++; - } - tokens.Add(new Token(TokenType.Number, formula[numStart..i], numStart)); - continue; - } - - if (char.IsLetter(c)) - { - tokens.Add(new Token(TokenType.Identifier, c.ToString(), i++)); - continue; - } - - // Operators & Punctuation: +, -, =, <, >, *, /, !, ,, ;, :, |, ', ~ - tokens.Add(new Token(TokenType.Operator, c.ToString(), i++)); - } - - tokens.Add(new Token(TokenType.EOF, "", i)); - return tokens; - } - - // ========================================================================= - // AST NODES DEFINITION - // ========================================================================= - public record LayoutContext(double FontSize, string ColorHex, MathDisplayStyle DisplayStyle); - public record RenderContext(double BaseFontSize, string TextColorHex, StringBuilder Svg, MathDisplayStyle DisplayStyle); - - public abstract class MathAstNode - { - public double Width { get; set; } - public double Height { get; set; } - public double Ascent { get; set; } - public double Descent { get; set; } - - public abstract void Measure(LayoutContext ctx); - public abstract void Render(double x, double y, RenderContext ctx); - } - - public class MathSequenceNode : MathAstNode - { - public List Children { get; } = new(); - - public override void Measure(LayoutContext ctx) - { - Width = 0; - Ascent = 0; - Descent = 0; - - foreach (var child in Children) - { - child.Measure(ctx); - Width += child.Width; - Ascent = System.Math.Max(Ascent, child.Ascent); - Descent = System.Math.Max(Descent, child.Descent); - } - - if (Children.Count == 0) - { - Ascent = ctx.FontSize * 0.75; - Descent = ctx.FontSize * 0.25; - } - - Height = Ascent + Descent; - } - - public override void Render(double x, double y, RenderContext ctx) - { - double curX = x; - foreach (var child in Children) - { - child.Render(curX, y, ctx); - curX += child.Width; - } - } - } - - public class MathTextNode : MathAstNode - { - public string Text { get; set; } - public bool IsVariable { get; set; } - public bool IsUpright { get; set; } - public bool IsBold { get; set; } - public string? ColorOverride { get; set; } - - public MathTextNode(string text, bool isVariable = false, bool isUpright = false, bool isBold = false) - { - Text = text; - IsVariable = isVariable; - IsUpright = isUpright; - IsBold = isBold; - } - - public override void Measure(LayoutContext ctx) - { - Ascent = ctx.FontSize * 0.78; - Descent = ctx.FontSize * 0.22; - Height = Ascent + Descent; - - // Character width calculation - double charW = ctx.FontSize * 0.56; - if (Text.Length == 1) - { - char c = Text[0]; - if (c is 'i' or 'l' or 'j' or 't' or '!' or ',' or ';' or '.') charW = ctx.FontSize * 0.32; - else if (c is 'm' or 'w' or 'W' or 'M') charW = ctx.FontSize * 0.82; - else if (char.IsUpper(c)) charW = ctx.FontSize * 0.68; - else if (char.IsDigit(c)) charW = ctx.FontSize * 0.52; - Width = charW; - } - else - { - Width = Text.Length * charW; - } - } - - public override void Render(double x, double y, RenderContext ctx) - { - string color = ColorOverride ?? ctx.TextColorHex; - string cls = IsVariable ? "m-text m-var" : "m-text m-upright"; - string weight = IsBold ? "font-weight=\"bold\" " : ""; - string fontStyle = IsVariable ? "font-style=\"italic\" " : ""; - string fontSizeStr = ctx.BaseFontSize.ToString("F1", CultureInfo.InvariantCulture); - - ctx.Svg.AppendLine($" {EscapeXml(Text)}"); - } - } - - public class MathSymbolNode : MathAstNode - { - public string Symbol { get; set; } - public bool IsOperator { get; set; } - public double ExtraSpacing { get; set; } - - public MathSymbolNode(string symbol, bool isOperator = true, double extraSpacing = 0) - { - Symbol = symbol; - IsOperator = isOperator; - ExtraSpacing = extraSpacing; - } - - public override void Measure(LayoutContext ctx) - { - Ascent = ctx.FontSize * 0.8; - Descent = ctx.FontSize * 0.2; - Height = Ascent + Descent; - - double symW = ctx.FontSize * 0.6; - if (Symbol is "+" or "-" or "=" or "<" or ">" or "≤" or "≥" or "≠" or "≈" or "≡" or "→" or "⇒" or "⟺" or "±") - { - symW = ctx.FontSize * 0.72; - ExtraSpacing = ctx.FontSize * 0.18; - } - else if (Symbol is "·" or "∗" or "∘") - { - symW = ctx.FontSize * 0.45; - ExtraSpacing = ctx.FontSize * 0.12; - } - - Width = symW + (ExtraSpacing * 2); - } - - public override void Render(double x, double y, RenderContext ctx) - { - double posX = x + ExtraSpacing; - string fontSizeStr = ctx.BaseFontSize.ToString("F1", CultureInfo.InvariantCulture); - ctx.Svg.AppendLine($" {EscapeXml(Symbol)}"); - } - } - - public class MathFractionNode : MathAstNode - { - public MathAstNode Numerator { get; } - public MathAstNode Denominator { get; } - - public MathFractionNode(MathAstNode numerator, MathAstNode denominator) - { - Numerator = numerator; - Denominator = denominator; - } - - public override void Measure(LayoutContext ctx) - { - double subScale = 0.82; - var subCtx = new LayoutContext(ctx.FontSize * subScale, ctx.ColorHex, MathDisplayStyle.Inline); - - Numerator.Measure(subCtx); - Denominator.Measure(subCtx); - - double maxContentW = System.Math.Max(Numerator.Width, Denominator.Width); - Width = maxContentW + (ctx.FontSize * 0.35); // Margin around fraction bar - - double barGap = ctx.FontSize * 0.22; - Ascent = Numerator.Height + barGap; - Descent = Denominator.Height + barGap; - Height = Ascent + Descent; - } - - public override void Render(double x, double y, RenderContext ctx) - { - double subScale = 0.82; - double childFontSize = ctx.BaseFontSize * subScale; - var childCtx = new RenderContext(childFontSize, ctx.TextColorHex, ctx.Svg, MathDisplayStyle.Inline); - - double barY = y - (ctx.BaseFontSize * 0.28); - double barGap = ctx.BaseFontSize * 0.22; - - // Render Numerator (centered horizontally above bar) - double numX = x + ((Width - Numerator.Width) / 2); - double numY = barY - barGap - Numerator.Descent; - Numerator.Render(numX, numY, childCtx); - - // Draw Fraction Horizontal Bar Line - double barThickness = System.Math.Max(1.0, ctx.BaseFontSize * 0.07); - string x1 = x.ToString("F1", CultureInfo.InvariantCulture); - string y1 = barY.ToString("F1", CultureInfo.InvariantCulture); - string x2 = (x + Width).ToString("F1", CultureInfo.InvariantCulture); - string thickStr = barThickness.ToString("F1", CultureInfo.InvariantCulture); - - ctx.Svg.AppendLine($" "); - - // Render Denominator (centered horizontally below bar) - double denX = x + ((Width - Denominator.Width) / 2); - double denY = barY + barGap + Denominator.Ascent; - Denominator.Render(denX, denY, childCtx); - } - } - - public class MathRadicalNode : MathAstNode - { - public MathAstNode Radicand { get; } - public MathAstNode? Degree { get; } - - public MathRadicalNode(MathAstNode radicand, MathAstNode? degree = null) - { - Radicand = radicand; - Degree = degree; - } - - public override void Measure(LayoutContext ctx) - { - Radicand.Measure(ctx); - if (Degree != null) - { - var degCtx = new LayoutContext(ctx.FontSize * 0.6, ctx.ColorHex, MathDisplayStyle.Inline); - Degree.Measure(degCtx); - } - - double radicalSymbolW = ctx.FontSize * 0.65; - double degW = Degree?.Width ?? 0; - - Width = radicalSymbolW + Radicand.Width + (ctx.FontSize * 0.15) + (degW > 0 ? degW * 0.4 : 0); - Ascent = Radicand.Ascent + (ctx.FontSize * 0.25); - Descent = Radicand.Descent + (ctx.FontSize * 0.08); - Height = Ascent + Descent; - } - - public override void Render(double x, double y, RenderContext ctx) - { - double degOffset = 0; - if (Degree != null) - { - double degFontSize = ctx.BaseFontSize * 0.58; - var degCtx = new RenderContext(degFontSize, ctx.TextColorHex, ctx.Svg, MathDisplayStyle.Inline); - Degree.Render(x, y - (ctx.BaseFontSize * 0.5), degCtx); - degOffset = Degree.Width * 0.4; - } - - double radX = x + degOffset; - double topY = y - Ascent + (ctx.BaseFontSize * 0.05); - double bottomY = y + Descent; - double radicandStartX = radX + (ctx.BaseFontSize * 0.6); - double radicandEndX = x + Width; - - // Draw Radical √ Symbol Path + Overbar - double lineThick = System.Math.Max(1.0, ctx.BaseFontSize * 0.065); - double hookX = radX + (ctx.BaseFontSize * 0.12); - double hookY = y - (ctx.BaseFontSize * 0.2); - double cornerX = radX + (ctx.BaseFontSize * 0.28); - - string d = $"M {radX.ToString("F1", CultureInfo.InvariantCulture)},{hookY.ToString("F1", CultureInfo.InvariantCulture)} " + - $"L {cornerX.ToString("F1", CultureInfo.InvariantCulture)},{bottomY.ToString("F1", CultureInfo.InvariantCulture)} " + - $"L {radicandStartX.ToString("F1", CultureInfo.InvariantCulture)},{topY.ToString("F1", CultureInfo.InvariantCulture)} " + - $"L {radicandEndX.ToString("F1", CultureInfo.InvariantCulture)},{topY.ToString("F1", CultureInfo.InvariantCulture)}"; - - ctx.Svg.AppendLine($" "); - - // Render Radicand - Radicand.Render(radicandStartX + (ctx.BaseFontSize * 0.08), y, ctx); - } - } - - public class MathSubSuperNode : MathAstNode - { - public MathAstNode BaseNode { get; } - public MathAstNode? Subscript { get; } - public MathAstNode? Superscript { get; } - - public MathSubSuperNode(MathAstNode baseNode, MathAstNode? sub = null, MathAstNode? sup = null) - { - BaseNode = baseNode; - Subscript = sub; - Superscript = sup; - } - - public override void Measure(LayoutContext ctx) - { - BaseNode.Measure(ctx); - - double scriptScale = 0.72; - var scriptCtx = new LayoutContext(ctx.FontSize * scriptScale, ctx.ColorHex, MathDisplayStyle.Inline); - - double scriptWidth = 0; - if (Superscript != null) - { - Superscript.Measure(scriptCtx); - scriptWidth = System.Math.Max(scriptWidth, Superscript.Width); - } - if (Subscript != null) - { - Subscript.Measure(scriptCtx); - scriptWidth = System.Math.Max(scriptWidth, Subscript.Width); - } - - Width = BaseNode.Width + scriptWidth + (ctx.FontSize * 0.06); - - double supAscent = Superscript != null ? (ctx.FontSize * 0.45) + Superscript.Ascent : 0; - double subDescent = Subscript != null ? (ctx.FontSize * 0.35) + Subscript.Descent : 0; - - Ascent = System.Math.Max(BaseNode.Ascent, supAscent); - Descent = System.Math.Max(BaseNode.Descent, subDescent); - Height = Ascent + Descent; - } - - public override void Render(double x, double y, RenderContext ctx) - { - BaseNode.Render(x, y, ctx); - - double scriptX = x + BaseNode.Width + (ctx.BaseFontSize * 0.04); - double scriptFontSize = ctx.BaseFontSize * 0.72; - var scriptCtx = new RenderContext(scriptFontSize, ctx.TextColorHex, ctx.Svg, MathDisplayStyle.Inline); - - if (Superscript != null) - { - double supY = y - (ctx.BaseFontSize * 0.42); - Superscript.Render(scriptX, supY, scriptCtx); - } - - if (Subscript != null) - { - double subY = y + (ctx.BaseFontSize * 0.28); - Subscript.Render(scriptX, subY, scriptCtx); - } - } - } - - public class MathLargeOperatorNode : MathAstNode - { - public string OperatorName { get; } - public MathAstNode? LowerLimit { get; } - public MathAstNode? UpperLimit { get; } - public bool IsDisplayMode { get; } - - public MathLargeOperatorNode(string opName, MathAstNode? lower = null, MathAstNode? upper = null, bool isDisplay = true) - { - OperatorName = opName; - LowerLimit = lower; - UpperLimit = upper; - IsDisplayMode = isDisplay; - } - - public override void Measure(LayoutContext ctx) - { - double opScale = IsDisplayMode ? 1.4 : 1.1; - double opW = ctx.FontSize * (OperatorName.Contains("int") ? 0.75 : 1.1) * opScale; - - double scriptScale = 0.68; - var scriptCtx = new LayoutContext(ctx.FontSize * scriptScale, ctx.ColorHex, MathDisplayStyle.Inline); - - LowerLimit?.Measure(scriptCtx); - UpperLimit?.Measure(scriptCtx); - - bool isIntegral = OperatorName.Contains("int"); - - if (isIntegral || !IsDisplayMode) - { - // Side limits - double limitsW = System.Math.Max(LowerLimit?.Width ?? 0, UpperLimit?.Width ?? 0); - Width = opW + limitsW + (ctx.FontSize * 0.1); - Ascent = (ctx.FontSize * opScale * 0.8) + (UpperLimit != null ? UpperLimit.Height * 0.4 : 0); - Descent = (ctx.FontSize * opScale * 0.35) + (LowerLimit != null ? LowerLimit.Height * 0.4 : 0); - } - else - { - // Top/bottom centered limits (Sum, Prod, Lim) - double maxW = System.Math.Max(opW, System.Math.Max(LowerLimit?.Width ?? 0, UpperLimit?.Width ?? 0)); - Width = maxW + (ctx.FontSize * 0.15); - Ascent = (ctx.FontSize * opScale * 0.75) + (UpperLimit?.Height ?? 0) + (ctx.FontSize * 0.12); - Descent = (ctx.FontSize * opScale * 0.3) + (LowerLimit?.Height ?? 0) + (ctx.FontSize * 0.12); - } - - Height = Ascent + Descent; - } - - public override void Render(double x, double y, RenderContext ctx) - { - double opScale = IsDisplayMode ? 1.4 : 1.1; - double opFontSize = ctx.BaseFontSize * opScale; - double scriptFontSize = ctx.BaseFontSize * 0.68; - var scriptCtx = new RenderContext(scriptFontSize, ctx.TextColorHex, ctx.Svg, MathDisplayStyle.Inline); - - bool isIntegral = OperatorName.Contains("int"); - string sym = OperatorName switch - { - "sum" => "∑", - "prod" => "∏", - "coprod" => "∐", - "int" => "∫", - "iint" => "∬", - "iiint" => "∭", - "oint" => "∮", - "lim" => "lim", - _ => "∑" - }; - - if (isIntegral || !IsDisplayMode) - { - double opW = ctx.BaseFontSize * 0.75 * opScale; - // Render Integral / Operator symbol - ctx.Svg.AppendLine($" {sym}"); - - double limitX = x + opW + (ctx.BaseFontSize * 0.05); - if (UpperLimit != null) - { - double upY = y - (ctx.BaseFontSize * opScale * 0.55); - UpperLimit.Render(limitX, upY, scriptCtx); - } - if (LowerLimit != null) - { - double lowY = y + (ctx.BaseFontSize * opScale * 0.35); - LowerLimit.Render(limitX, lowY, scriptCtx); - } - } - else - { - // Centered stacked limits (for \sum, \prod, \lim) - double opW = sym == "lim" ? ctx.BaseFontSize * 1.3 : ctx.BaseFontSize * 1.0 * opScale; - double opX = x + ((Width - opW) / 2); - - if (UpperLimit != null) - { - double upX = x + ((Width - UpperLimit.Width) / 2); - double upY = y - (ctx.BaseFontSize * opScale * 0.65) - UpperLimit.Descent; - UpperLimit.Render(upX, upY, scriptCtx); - } - - ctx.Svg.AppendLine($" {sym}"); - - if (LowerLimit != null) - { - double lowX = x + ((Width - LowerLimit.Width) / 2); - double lowY = y + (ctx.BaseFontSize * opScale * 0.3) + LowerLimit.Ascent; - LowerLimit.Render(lowX, lowY, scriptCtx); - } - } - } - } - - public class MathDelimiterNode : MathAstNode - { - public string LeftDelim { get; } - public string RightDelim { get; } - public MathAstNode Content { get; } - - public MathDelimiterNode(string left, string right, MathAstNode content) - { - LeftDelim = left; - RightDelim = right; - Content = content; - } - - public override void Measure(LayoutContext ctx) - { - Content.Measure(ctx); - - double delimW = ctx.FontSize * 0.45; - if (LeftDelim == "." || string.IsNullOrEmpty(LeftDelim)) delimW = 0; - double rightDelimW = ctx.FontSize * 0.45; - if (RightDelim == "." || string.IsNullOrEmpty(RightDelim)) rightDelimW = 0; - - Width = delimW + Content.Width + rightDelimW; - Ascent = Content.Ascent; - Descent = Content.Descent; - Height = Content.Height; - } - - public override void Render(double x, double y, RenderContext ctx) - { - double curX = x; - double delimScale = System.Math.Max(1.0, Content.Height / (ctx.BaseFontSize * 1.1)); - - if (LeftDelim != "." && !string.IsNullOrEmpty(LeftDelim)) - { - RenderSingleDelimiter(LeftDelim, curX, y, Content.Ascent, Content.Descent, delimScale, ctx); - curX += ctx.BaseFontSize * 0.45; - } - - Content.Render(curX, y, ctx); - curX += Content.Width; - - if (RightDelim != "." && !string.IsNullOrEmpty(RightDelim)) - { - RenderSingleDelimiter(RightDelim, curX, y, Content.Ascent, Content.Descent, delimScale, ctx); - } - } - - private static void RenderSingleDelimiter(string delim, double x, double y, double ascent, double descent, double scale, RenderContext ctx) - { - double fontSize = ctx.BaseFontSize * scale; - string str = delim switch - { - "(" => "(", - ")" => ")", - "[" => "[", - "]" => "]", - "{" or "\\{" => "{", - "}" or "\\}" => "}", - "|" or "\\|" => "|", - "\\langle" or "langle" => "⟨", - "\\rangle" or "rangle" => "⟩", - "\\lceil" or "lceil" => "⌈", - "\\rceil" or "rceil" => "⌉", - "\\lfloor" or "lfloor" => "⌊", - "\\rfloor" or "rfloor" => "⌋", - _ => delim - }; - - double adjustY = y + ((descent - ascent) * 0.1); - ctx.Svg.AppendLine($" {EscapeXml(str)}"); - } - } - - public class MathMatrixNode : MathAstNode - { - public List> Rows { get; } = new(); - public string MatrixType { get; } - - public MathMatrixNode(string matrixType) - { - MatrixType = matrixType; - } - - private List _colWidths = new(); - private List _rowHeights = new(); - private List _rowAscents = new(); - - public override void Measure(LayoutContext ctx) - { - _colWidths.Clear(); - _rowHeights.Clear(); - _rowAscents.Clear(); - - int numCols = 0; - foreach (var row in Rows) - { - numCols = System.Math.Max(numCols, row.Count); - } - - for (int c = 0; c < numCols; c++) _colWidths.Add(0); - - foreach (var row in Rows) - { - double rowAsc = 0; - double rowDesc = 0; - - for (int c = 0; c < row.Count; c++) - { - row[c].Measure(ctx); - _colWidths[c] = System.Math.Max(_colWidths[c], row[c].Width); - rowAsc = System.Math.Max(rowAsc, row[c].Ascent); - rowDesc = System.Math.Max(rowDesc, row[c].Descent); - } - - _rowAscents.Add(rowAsc); - _rowHeights.Add(rowAsc + rowDesc + (ctx.FontSize * 0.3)); - } - - double totalW = _colWidths.Sum() + (System.Math.Max(0, numCols - 1) * ctx.FontSize * 0.5); - double delimW = MatrixType switch - { - "matrix" => 0, - "cases" => ctx.FontSize * 0.6, - _ => ctx.FontSize * 0.8 - }; - - Width = totalW + delimW; - double totalH = _rowHeights.Sum(); - Ascent = totalH / 2; - Descent = totalH / 2; - Height = totalH; - } - - public override void Render(double x, double y, RenderContext ctx) - { - double startX = x + (MatrixType == "cases" ? ctx.BaseFontSize * 0.6 : (MatrixType != "matrix" ? ctx.BaseFontSize * 0.4 : 0)); - double curY = y - Ascent + (_rowAscents.FirstOrDefault()); - - // Draw Left Bracket/Delim - if (MatrixType == "pmatrix") - { - ctx.Svg.AppendLine($" ("); - ctx.Svg.AppendLine($" )"); - } - else if (MatrixType == "bmatrix") - { - ctx.Svg.AppendLine($" ["); - ctx.Svg.AppendLine($" ]"); - } - else if (MatrixType == "vmatrix") - { - double lineThick = System.Math.Max(1.0, ctx.BaseFontSize * 0.08); - double y1 = (y - Ascent).ToString("F1", CultureInfo.InvariantCulture) == "0.0" ? 0 : y - Ascent; - double y2 = y + Descent; - ctx.Svg.AppendLine($" "); - ctx.Svg.AppendLine($" "); - } - else if (MatrixType == "cases") - { - ctx.Svg.AppendLine($" {{"); - } - - for (int r = 0; r < Rows.Count; r++) - { - var row = Rows[r]; - double colX = startX; - - for (int c = 0; c < row.Count; c++) - { - double cellW = _colWidths[c]; - double alignX = colX + ((cellW - row[c].Width) / 2); // Center cell - row[c].Render(alignX, curY, ctx); - colX += cellW + (ctx.BaseFontSize * 0.5); - } - - if (r + 1 < Rows.Count) - { - curY += _rowHeights[r]; - } - } - } - } - - public class MathAccentNode : MathAstNode - { - public MathAstNode BaseNode { get; } - public string AccentType { get; } - - public MathAccentNode(MathAstNode baseNode, string accentType) - { - BaseNode = baseNode; - AccentType = accentType; - } - - public override void Measure(LayoutContext ctx) - { - BaseNode.Measure(ctx); - Width = BaseNode.Width; - Ascent = BaseNode.Ascent + (ctx.FontSize * 0.28); - Descent = BaseNode.Descent; - Height = Ascent + Descent; - } - - public override void Render(double x, double y, RenderContext ctx) - { - BaseNode.Render(x, y, ctx); - - double accentX = x + (BaseNode.Width / 2); - double accentY = y - BaseNode.Ascent - (ctx.BaseFontSize * 0.05); - - string accentSym = AccentType switch - { - "hat" => "^", - "bar" or "overline" => "¯", - "vec" => "→", - "dot" => "˙", - "ddot" => "¨", - "tilde" => "~", - _ => "^" - }; - - double accentSize = ctx.BaseFontSize * (AccentType is "dot" or "ddot" ? 1.1 : 0.85); - ctx.Svg.AppendLine($" {accentSym}"); - } - } - - public class MathSpaceNode : MathAstNode - { - public double SpaceFactor { get; } - - public MathSpaceNode(double spaceFactor = 0.3) - { - SpaceFactor = spaceFactor; - } - - public override void Measure(LayoutContext ctx) - { - Width = ctx.FontSize * SpaceFactor; - Ascent = ctx.FontSize * 0.5; - Descent = 0; - Height = Ascent; - } - - public override void Render(double x, double y, RenderContext ctx) - { - // Empty space, no rendering required - } - } - - // ========================================================================= - // PARSER - // ========================================================================= - public class MathParser - { - private readonly List _tokens; - private int _pos; - - public MathParser(List tokens) - { - _tokens = tokens; - _pos = 0; - } - - private Token Current => _pos < _tokens.Count ? _tokens[_pos] : _tokens[^1]; - private Token Peek(int offset = 1) => _pos + offset < _tokens.Count ? _tokens[_pos + offset] : _tokens[^1]; - - private Token Consume() - { - var t = Current; - _pos++; - return t; - } - - private bool Match(TokenType type) - { - if (Current.Type == type) - { - _pos++; - return true; - } - return false; - } - - private bool MatchCommand(string cmd) - { - if (Current.Type == TokenType.Command && Current.Value.Equals(cmd, StringComparison.OrdinalIgnoreCase)) - { - _pos++; - return true; - } - return false; - } - - public MathAstNode ParseExpression() - { - var seq = new MathSequenceNode(); - - while (Current.Type != TokenType.EOF && - Current.Type != TokenType.CloseBrace && - Current.Type != TokenType.CloseBracket && - Current.Type != TokenType.Ampersand && - Current.Type != TokenType.Newline && - !(Current.Type == TokenType.Command && Current.Value.Equals("end", StringComparison.OrdinalIgnoreCase))) - { - int beforePos = _pos; - var atom = ParseAtom(); - if (atom != null) - { - // Check for trailing subscript / superscript (e.g. x_1^2 or x^2_1) - atom = ParseSubSuper(atom); - seq.Children.Add(atom); - } - else if (_pos == beforePos) - { - // Skip unrecognized token to avoid infinite loop - Consume(); - } - } - - if (seq.Children.Count == 1) - { - return seq.Children[0]; - } - - return seq; - } - - private MathAstNode? ParseAtom() - { - var token = Current; - - // 1. Grouped Expression { ... } - if (Match(TokenType.OpenBrace)) - { - var group = ParseExpression(); - Match(TokenType.CloseBrace); - return group; - } - - // 2. Parenthesized ( ... ) - if (Match(TokenType.OpenParen)) - { - return new MathSymbolNode("(", false); - } - if (Match(TokenType.CloseParen)) - { - return new MathSymbolNode(")", false); - } - - // 3. Brackets [ ... ] - if (Match(TokenType.OpenBracket)) - { - return new MathSymbolNode("[", false); - } - if (Match(TokenType.CloseBracket)) - { - return new MathSymbolNode("]", false); - } - - // 4. Number - if (Match(TokenType.Number)) - { - return new MathTextNode(token.Value, isVariable: false, isUpright: true); - } - - // 5. Single Variable Letter - if (Match(TokenType.Identifier)) - { - return new MathTextNode(token.Value, isVariable: true); - } - - // 6. Operator - if (Match(TokenType.Operator)) - { - return new MathSymbolNode(token.Value, isOperator: true); - } - - // 7. LaTeX Commands - if (Current.Type == TokenType.Command) - { - return ParseCommand(); - } - - return null; - } - - private MathAstNode ParseCommand() - { - var cmdToken = Consume(); - string cmd = cmdToken.Value; - - // Fractions: \frac{a}{b}, \dfrac, \tfrac - if (cmd is "frac" or "dfrac" or "tfrac") - { - var num = ParseRequiredGroup(); - var den = ParseRequiredGroup(); - return new MathFractionNode(num, den); - } - - // Binomial: \binom{n}{k} - if (cmd is "binom" or "dbinom" or "tbinom") - { - var top = ParseRequiredGroup(); - var bot = ParseRequiredGroup(); - var frac = new MathFractionNode(top, bot); - return new MathDelimiterNode("(", ")", frac); - } - - // Radicals: \sqrt{x}, \sqrt[n]{x} - if (cmd is "sqrt") - { - MathAstNode? degree = null; - if (Match(TokenType.OpenBracket)) - { - degree = ParseExpression(); - Match(TokenType.CloseBracket); - } - var radicand = ParseRequiredGroup(); - return new MathRadicalNode(radicand, degree); - } - - // Large Operators: \sum, \prod, \int, \iint, \iiint, \oint, \coprod, \lim - if (cmd is "sum" or "prod" or "int" or "iint" or "iiint" or "oint" or "coprod" or "lim") - { - MathAstNode? lower = null; - MathAstNode? upper = null; - - while (Current.Type is TokenType.Subscript or TokenType.Superscript) - { - if (Match(TokenType.Subscript)) - { - lower = ParseRequiredGroup(); - } - else if (Match(TokenType.Superscript)) - { - upper = ParseRequiredGroup(); - } - } - - return new MathLargeOperatorNode(cmd, lower, upper, isDisplay: true); - } - - // Dynamic Delimiters: \left( ... \right), \left[ ... \right] - if (cmd is "left") - { - string leftDelim = Current.Value; - Consume(); - - var content = ParseExpression(); - - string rightDelim = ")"; - if (MatchCommand("right")) - { - rightDelim = Current.Value; - Consume(); - } - - return new MathDelimiterNode(leftDelim, rightDelim, content); - } - - // Matrices & Environments: \begin{matrix}, \begin{pmatrix}, \begin{cases} - if (cmd is "begin") - { - string envType = "matrix"; - if (Match(TokenType.OpenBrace)) - { - envType = Current.Value; - Consume(); - Match(TokenType.CloseBrace); - } - - return ParseMatrixEnvironment(envType); - } - - // Accents: \hat{x}, \bar{x}, \vec{x}, \dot{x}, \ddot{x}, \tilde{x} - if (cmd is "hat" or "bar" or "vec" or "dot" or "ddot" or "tilde" or "overline") - { - var baseNode = ParseRequiredGroup(); - return new MathAccentNode(baseNode, cmd); - } - - // Text & Font Styles: \text{...}, \mathrm{...}, \mathbf{...}, \mathbb{...}, \mathcal{...} - if (cmd is "text" or "mathrm" or "mathbf" or "mathit" or "mathsf" or "mathtt") - { - var inner = ParseRequiredGroup(); - return inner; - } - - if (cmd is "mathbb") - { - var inner = ParseRequiredGroup(); - if (inner is MathTextNode textNode && _blackboardBold.TryGetValue(textNode.Text, out var bbSym)) - { - return new MathSymbolNode(bbSym, isOperator: false); - } - return inner; - } - - if (cmd is "mathcal") - { - var inner = ParseRequiredGroup(); - if (inner is MathTextNode textNode && _calligraphic.TryGetValue(textNode.Text, out var calSym)) - { - return new MathSymbolNode(calSym, isOperator: false); - } - return inner; - } - - // Standard Functions: \sin, \cos, \tan, \ln, \log, \exp, \det, \dim, \ker - if (_standardFunctions.Contains(cmd)) - { - return new MathTextNode(cmd, isVariable: false, isUpright: true); - } - - // Greek Alphabet - if (_greekSymbols.TryGetValue(cmd, out var greek)) - { - return new MathSymbolNode(greek.unicode, greek.isOperator); - } - - // Mathematical Symbols & Operators - if (_mathSymbols.TryGetValue(cmd, out var mathSym)) - { - return new MathSymbolNode(mathSym, isOperator: true); - } - - // Spacing: \quad, \qquad, \,, \:, \;, \! - if (cmd is "quad") return new MathSpaceNode(1.0); - if (cmd is "qquad") return new MathSpaceNode(2.0); - if (cmd is "\\," or ",") return new MathSpaceNode(0.2); - if (cmd is "\\:" or ":") return new MathSpaceNode(0.3); - if (cmd is "\\;" or ";") return new MathSpaceNode(0.4); - if (cmd is "\\!" or "!") return new MathSpaceNode(-0.15); - - // Fallback for custom or unrecognized commands: render text - return new MathTextNode(cmd, isVariable: false, isUpright: true); - } - - private MathAstNode ParseMatrixEnvironment(string envType) - { - var matrixNode = new MathMatrixNode(envType); - var currentRow = new List(); - - while (Current.Type != TokenType.EOF) - { - if (Current.Type == TokenType.Command && Current.Value.Equals("end", StringComparison.OrdinalIgnoreCase)) - { - Consume(); - if (Match(TokenType.OpenBrace)) - { - Consume(); // Consume env name - Match(TokenType.CloseBrace); - } - break; - } - - if (Match(TokenType.Ampersand)) - { - // Next column - continue; - } - - if (Match(TokenType.Newline)) - { - // Next row - if (currentRow.Count > 0) - { - matrixNode.Rows.Add(currentRow); - currentRow = new List(); - } - continue; - } - - int beforePos = _pos; - var cellExpr = ParseExpression(); - if (cellExpr != null) - { - currentRow.Add(cellExpr); - } - if (_pos == beforePos && Current.Type != TokenType.EOF) - { - Consume(); - } - } - - if (currentRow.Count > 0) - { - matrixNode.Rows.Add(currentRow); - } - - return matrixNode; - } - - private MathAstNode ParseSubSuper(MathAstNode baseNode) - { - MathAstNode? sub = null; - MathAstNode? sup = null; - - while (Current.Type is TokenType.Subscript or TokenType.Superscript) - { - if (Match(TokenType.Subscript)) - { - sub = ParseRequiredGroup(); - } - else if (Match(TokenType.Superscript)) - { - sup = ParseRequiredGroup(); - } - } - - if (sub != null || sup != null) - { - return new MathSubSuperNode(baseNode, sub, sup); - } - - return baseNode; - } - - private MathAstNode ParseRequiredGroup() - { - if (Match(TokenType.OpenBrace)) - { - var group = ParseExpression(); - Match(TokenType.CloseBrace); - return group; - } - - var atom = ParseAtom(); - return atom ?? new MathTextNode("", false); - } - } -} diff --git a/src/PdfEditorApp/Services/Math/MathPresetsLibrary.cs b/src/PdfEditorApp/Services/Math/MathPresetsLibrary.cs deleted file mode 100644 index 166150d..0000000 --- a/src/PdfEditorApp/Services/Math/MathPresetsLibrary.cs +++ /dev/null @@ -1,525 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using PdfEditorApp.Core.Models; - -namespace PdfEditorApp.Services.MathEngine; - -public record MathPresetItem( - string Id, - string Name, - string Formula, - MathCategory Category, - string Description, - string DefaultEquationNumber, - double DefaultWidth = 340, - double DefaultHeight = 55 -); - -public static class MathPresetsLibrary -{ - private static readonly List _presets = new() - { - // ========================================== - // 0. SCHOOL ARITHMETIC & WORKSHEET MATH - // ========================================== - new( - "bodmas_order", - "BODMAS Order of Operations", - @"\text{BODMAS: } [\;] \to \{\;\} \to (\;) \to \text{Of} \to \div \to \times \to + \to -", - MathCategory.SchoolArithmetic, - "Fundamental rule for evaluating nested arithmetic expressions", - "(1)", - 360, 48 - ), - new( - "simple_interest", - "Simple Interest & Amount Formula", - @"SI = \frac{P \times R \times T}{100}, \quad A = P + SI = P\left(1 + \frac{RT}{100}\right)", - MathCategory.SchoolArithmetic, - "Standard commercial math formula for principal P, rate R%, and time T years", - "(2)", - 380, 52 - ), - new( - "compound_interest", - "Compound Interest Formula", - @"A = P\left(1 + \frac{r}{n}\right)^{nt}, \quad CI = A - P", - MathCategory.SchoolArithmetic, - "Compound interest compounded n times per year over t periods", - "(3)", - 320, 50 - ), - - // ========================================== - // 1. CALCULUS & ANALYSIS - // ========================================== - new( - "gaussian_integral", - "Gaussian Integral", - @"\int_{-\infty}^{\infty} e^{-x^2} \, dx = \sqrt{\pi}", - MathCategory.Calculus, - "Euler-Poisson definite integral over the entire real line", - "(1)", - 260, 48 - ), - new( - "fundamental_calculus", - "Fundamental Theorem of Calculus", - @"\int_{a}^{b} f(x) \, dx = F(b) - F(a) = \left[ F(x) \right]_{a}^{b}", - MathCategory.Calculus, - "Connecting derivatives and definite integrals", - "(2)", - 320, 50 - ), - new( - "taylor_series", - "Taylor Series Expansion", - @"f(x) = \sum_{n=0}^{\infty} \frac{f^{(n)}(a)}{n!} (x - a)^n", - MathCategory.Calculus, - "Infinite power series representation of a smooth function", - "(3)", - 300, 52 - ), - new( - "fourier_transform", - "Continuous Fourier Transform", - @"\hat{f}(\xi) = \int_{-\infty}^{\infty} f(x) \, e^{-2\pi i x \xi} \, dx", - MathCategory.Calculus, - "Frequency spectrum decomposition of a time-domain signal", - "(4)", - 300, 50 - ), - new( - "laplace_transform", - "Laplace Transform", - @"\mathcal{L}\{f(t)\} = F(s) = \int_{0}^{\infty} f(t) \, e^{-st} \, dt", - MathCategory.Calculus, - "Integral transform mapping time functions to complex frequency s-plane", - "(5)", - 320, 50 - ), - new( - "cauchy_residue", - "Cauchy's Residue Theorem", - @"\oint_{\gamma} f(z) \, dz = 2\pi i \sum_{k=1}^n \operatorname{Res}(f, a_k)", - MathCategory.Calculus, - "Contour integral evaluation via isolated singularities", - "(6)", - 310, 52 - ), - new( - "greens_theorem", - "Green's Theorem in the Plane", - @"\oint_{C} (L \, dx + M \, dy) = \iint_{D} \left( \frac{\partial M}{\partial x} - \frac{\partial L}{\partial y} \right) dx \, dy", - MathCategory.Calculus, - "Relating line integrals around closed curves to 2D double integrals", - "(7)", - 380, 55 - ), - - // ========================================== - // 2. PHYSICS & RELATIVITY - // ========================================== - new( - "mass_energy", - "Mass-Energy Equivalence", - @"E = m c^2", - MathCategory.Physics, - "Einstein's rest-frame mass-energy equivalence relation", - "(1)", - 160, 42 - ), - new( - "relativistic_energy_momentum", - "Relativistic Energy-Momentum", - @"E^2 = (p c)^2 + (m_0 c^2)^2", - MathCategory.Physics, - "Energy of a particle with relativistic momentum p and rest mass m0", - "(2)", - 240, 45 - ), - new( - "maxwell_diff", - "Maxwell's Equations (Differential)", - @"\nabla \cdot \mathbf{E} = \frac{\rho}{\varepsilon_0}, \quad \nabla \times \mathbf{B} = \mu_0 \mathbf{J} + \mu_0 \varepsilon_0 \frac{\partial \mathbf{E}}{\partial t}", - MathCategory.Physics, - "Fundamental laws of classical electrodynamics", - "(3)", - 420, 52 - ), - new( - "schrodinger_time_dependent", - "Time-Dependent Schrödinger Equation", - @"i \hbar \frac{\partial}{\partial t} \Psi(\mathbf{r}, t) = \hat{H} \Psi(\mathbf{r}, t)", - MathCategory.Physics, - "Quantum state time evolution governed by the Hamiltonian operator", - "(4)", - 300, 50 - ), - new( - "heisenberg_uncertainty", - "Heisenberg Uncertainty Principle", - @"\sigma_x \sigma_p \ge \frac{\hbar}{2}", - MathCategory.Physics, - "Fundamental lower bound on position-momentum measurement precision", - "(5)", - 190, 48 - ), - new( - "dirac_equation", - "Dirac Relativistic Wave Equation", - @"(i \gamma^\mu \partial_\mu - m) \psi = 0", - MathCategory.Physics, - "Relativistic quantum mechanics for spin-1/2 fermions predicting antimatter", - "(6)", - 230, 46 - ), - new( - "navier_stokes", - "Navier-Stokes Fluid Dynamics", - @"\rho \left( \frac{\partial \mathbf{u}}{\partial t} + \mathbf{u} \cdot \nabla \mathbf{u} \right) = -\nabla p + \mu \nabla^2 \mathbf{u} + \mathbf{f}", - MathCategory.Physics, - "Momentum balance equation for incompressible viscous fluid flows", - "(7)", - 420, 55 - ), - - // ========================================== - // 3. QUANTUM MECHANICS & CQED - // ========================================== - new( - "dicke_hamiltonian", - "Dicke Cavity QED Hamiltonian", - @"\hat{H} = \hbar \omega_c \hat{a}^\dagger \hat{a} + \frac{1}{2} \hbar \omega_q \sum_{j=1}^N \hat{\sigma}_z^{(j)} + \frac{\hbar g}{\sqrt{N}} \sum_{j=1}^N (\hat{a}^\dagger \hat{\sigma}_-^{(j)} + \hat{a} \hat{\sigma}_+^{(j)})", - MathCategory.QuantumMechanics, - "Collective interaction between an array of N transmons and a cavity mode", - "(1)", - 460, 56 - ), - new( - "lindblad_master_equation", - "Lindblad Open-System Master Equation", - @"\frac{\partial \hat{\rho}}{\partial t} = -\frac{i}{\hbar} [\hat{H}, \hat{\rho}] + \sum_k \gamma_k \left( \hat{L}_k \hat{\rho} \hat{L}_k^\dagger - \frac{1}{2} \{ \hat{L}_k^\dagger \hat{L}_k, \hat{\rho} \} \right)", - MathCategory.QuantumMechanics, - "Markovian density matrix evolution with dissipation and dephasing channels", - "(2)", - 440, 58 - ), - new( - "wigner_distribution", - "Wigner Quasi-Probability Function", - @"W(\alpha) = \frac{2}{\pi} \operatorname{Tr} \left[ \hat{\rho} \, \hat{D}(\alpha) \, (-1)^{\hat{a}^\dagger \hat{a}} \, \hat{D}^\dagger(\alpha) \right]", - MathCategory.QuantumMechanics, - "Phase-space representation for quantum state tomography and squeezing", - "(3)", - 360, 52 - ), - new( - "pauli_matrices", - "Pauli Spin-1/2 Matrices", - @"\hat{\sigma}_x = \begin{pmatrix} 0 & 1 \\ 1 & 0 \end{pmatrix}, \quad \hat{\sigma}_y = \begin{pmatrix} 0 & -i \\ i & 0 \end{pmatrix}, \quad \hat{\sigma}_z = \begin{pmatrix} 1 & 0 \\ 0 & -1 \end{pmatrix}", - MathCategory.QuantumMechanics, - "Standard Pauli matrix representations for 2-level qubit states", - "(4)", - 420, 54 - ), - - // ========================================== - // 4. QUANTITATIVE FINANCE & ECONOMETRICS - // ========================================== - new( - "bates_jump_diffusion", - "Bates Jump-Diffusion SDE System", - @"dS_t = (\mu - \lambda \bar{k}) S_t dt + \sqrt{V_t} S_t dW_t^S + (e^J - 1) S_t dN_t", - MathCategory.Finance, - "Continuous-time asset pricing with stochastic volatility and Poisson jump arrivals", - "(1)", - 400, 50 - ), - new( - "heston_variance_sde", - "Heston CIR Stochastic Variance Process", - @"dV_t = \kappa (\theta - V_t) dt + \sigma_v \sqrt{V_t} dW_t^V, \quad d\langle W^S, W^V \rangle_t = \rho dt", - MathCategory.Finance, - "Mean-reverting square-root variance process with leverage correlation", - "(2)", - 410, 52 - ), - new( - "black_scholes_pde", - "Black-Scholes-Merton PDE", - @"\frac{\partial V}{\partial t} + \frac{1}{2} \sigma^2 S^2 \frac{\partial^2 V}{\partial S^2} + r S \frac{\partial V}{\partial S} - r V = 0", - MathCategory.Finance, - "Linear parabolic PDE for European contingent claim derivative pricing", - "(3)", - 380, 52 - ), - new( - "sharpe_ratio", - "Annualized Sharpe Ratio", - @"SR = \frac{\mathbb{E}[R_p - R_f]}{\sigma(R_p - R_f)} \cdot \sqrt{252}", - MathCategory.Finance, - "Risk-adjusted excess return per unit of annualized total portfolio volatility", - "(4)", - 260, 50 - ), - new( - "capm_pricing", - "Capital Asset Pricing Model (CAPM)", - @"\mathbb{E}[R_i] = R_f + \beta_i (\mathbb{E}[R_m] - R_f), \quad \beta_i = \frac{\operatorname{Cov}(R_i, R_m)}{\operatorname{Var}(R_m)}", - MathCategory.Finance, - "Equilibrium asset pricing model relating expected return to systematic market beta", - "(5)", - 400, 52 - ), - - // ========================================== - // 5. ALGEBRA & DISCRETE MATHEMATICS - // ========================================== - new( - "quadratic_formula", - "Quadratic Formula", - @"x = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}", - MathCategory.Algebra, - "Exact analytic roots of the general quadratic equation ax² + bx + c = 0", - "(1)", - 240, 48 - ), - new( - "eulers_identity", - "Euler's Beautiful Identity", - @"e^{i\pi} + 1 = 0", - MathCategory.Algebra, - "Profound identity linking the fundamental constants e, i, π, 1, and 0", - "(2)", - 160, 42 - ), - new( - "binomial_theorem", - "Binomial Theorem", - @"(x + y)^n = \sum_{k=0}^{n} \binom{n}{k} x^{n-k} y^k", - MathCategory.Algebra, - "Algebraic expansion of powers of a binomial sum using combinations", - "(3)", - 280, 48 - ), - new( - "matrix_2x2_inverse", - "2x2 Matrix Inversion", - @"A^{-1} = \frac{1}{ad - bc} \begin{pmatrix} d & -b \\ -c & a \end{pmatrix}", - MathCategory.Algebra, - "Analytic inverse of a 2×2 non-singular matrix with determinant ad - bc", - "(4)", - 300, 54 - ), - new( - "algebraic_identity_square", - "Algebraic Identities: Square of Binomial", - @"(a \pm b)^2 = a^2 \pm 2ab + b^2, \quad a^2 - b^2 = (a - b)(a + b)", - MathCategory.Algebra, - "Fundamental identities for expanding and factorizing quadratic binomials", - "(5)", - 350, 48 - ), - new( - "algebraic_identity_cubes", - "Algebraic Identities: Sum and Difference of Cubes", - @"a^3 \pm b^3 = (a \pm b)(a^2 \mp ab + b^2), \quad (a \pm b)^3 = a^3 \pm 3a^2b + 3ab^2 \pm b^3", - MathCategory.Algebra, - "Cubic binomial and trinomial expansion and factorization identities", - "(6)", - 420, 52 - ), - new( - "complex_number_sqrt", - "Square Root of Complex Number", - @"\sqrt{a + ib} = \pm \left( \sqrt{\frac{|z| + a}{2}} + i \, \text{sgn}(b) \sqrt{\frac{|z| - a}{2}} \right), \quad |z| = \sqrt{a^2 + b^2}", - MathCategory.Algebra, - "Standard analytic formula for computing principal square roots of complex numbers", - "(7)", - 430, 52 - ), - new( - "euler_polyhedron", - "Euler's Polyhedral Formula", - @"V - E + F = 2", - MathCategory.DiscreteMath, - "Topological invariant relating vertices, edges, and faces of convex polyhedra", - "(8)", - 170, 42 - ), - - // ========================================== - // 5B. GEOMETRY & TRIGONOMETRY - // ========================================== - new( - "quadrilateral_parallelogram_trapezoid", - "Area of Parallelogram & Trapezoid", - @"A_{\text{parallelogram}} = b \times h, \quad A_{\text{trapezoid}} = \frac{a + b}{2} \times h", - MathCategory.Geometry, - "Area formulas for quadrilaterals with parallel bases", - "(1)", - 350, 48 - ), - new( - "quadrilateral_rhombus_kite", - "Area of Rhombus & Kite", - @"A_{\text{rhombus}} = \frac{1}{2} d_1 d_2, \quad \text{Perimeter} = 4a", - MathCategory.Geometry, - "Area and perimeter formulas for equilateral and kite-shaped quadrilaterals", - "(2)", - 320, 48 - ), - new( - "pythagorean_theorem", - "Pythagorean Theorem", - @"a^2 + b^2 = c^2, \quad c = \sqrt{a^2 + b^2}", - MathCategory.Geometry, - "Fundamental geometric relationship between the sides of a right triangle", - "(3)", - 260, 44 - ), - - // ========================================== - // 6. STATISTICS & MACHINE LEARNING - // ========================================== - new( - "normal_distribution", - "Normal (Gaussian) Distribution PDF", - @"f(x) = \frac{1}{\sigma \sqrt{2\pi}} \exp\left( -\frac{1}{2}\left(\frac{x - \mu}{\sigma}\right)^2 \right)", - MathCategory.Statistics, - "Probability density function of the Gaussian distribution with mean μ and variance σ²", - "(1)", - 350, 54 - ), - new( - "bayes_theorem", - "Bayes' Conditional Probability Theorem", - @"P(A \mid B) = \frac{P(B \mid A) \, P(A)}{P(B)}", - MathCategory.Statistics, - "Computing posterior probability from likelihood, prior, and marginal evidence", - "(2)", - 250, 48 - ), - new( - "softmax_function", - "Softmax Activation Function", - @"\sigma(\mathbf{z})_i = \frac{e^{z_i}}{\sum_{j=1}^K e^{z_j}} \quad \text{for } i = 1, \dots, K", - MathCategory.Statistics, - "Probability distribution normalizer across K multi-class logit logits", - "(3)", - 320, 50 - ), - new( - "cross_entropy_loss", - "Categorical Cross-Entropy Loss", - @"\mathcal{L}_{\text{CE}} = -\sum_{i=1}^C y_i \log(\hat{y}_i)", - MathCategory.Statistics, - "Standard loss metric comparing true one-hot distribution y and predicted probabilities ŷ", - "(4)", - 260, 48 - ), - new( - "sample_variance", - "Sample Standard Deviation", - @"s = \sqrt{\frac{1}{N - 1} \sum_{i=1}^{N} (x_i - \bar{x})^2}", - MathCategory.Statistics, - "Unbiased sample variance and standard deviation with Bessel's correction N - 1", - "(5)", - 280, 50 - ), - - // ========================================== - // 7. CHEMISTRY & THERMODYNAMICS - // ========================================== - new( - "arrhenius_equation", - "Arrhenius Rate Equation", - @"k = A \, e^{-\frac{E_a}{R T}}", - MathCategory.Chemistry, - "Temperature dependence of chemical reaction rate constants and activation energy", - "(1)", - 200, 48 - ), - new( - "nernst_equation", - "Nernst Electrochemical Potential", - @"E = E^\circ - \frac{R T}{z F} \ln Q", - MathCategory.Chemistry, - "Reduction potential of an electrochemical cell as a function of standard potential and quotient Q", - "(2)", - 250, 50 - ), - new( - "ideal_gas_law", - "Ideal Gas State Equation", - @"P V = n R T = N k_B T", - MathCategory.Chemistry, - "Thermodynamic equation of state for hypothetical ideal gases", - "(3)", - 220, 42 - ) - }; - - public static IReadOnlyList AllPresets => _presets; - public static IReadOnlyList GetAllPresets() => _presets; - - public static IEnumerable GetByCategory(MathCategory category) => - _presets.Where(p => p.Category == category); - - public static MathPresetItem? FindById(string id) => - _presets.FirstOrDefault(p => p.Id.Equals(id, System.StringComparison.OrdinalIgnoreCase)); - - public static MathPresetItem? FindByName(string name) => - _presets.FirstOrDefault(p => p.Name.Equals(name, System.StringComparison.OrdinalIgnoreCase)); - - private static readonly Dictionary _snippets = new(System.StringComparer.OrdinalIgnoreCase) - { - ["frac"] = @"\frac{a}{b}", - ["sqrt"] = @"\sqrt{x}", - ["rootn"] = @"\sqrt[n]{x}", - ["sum"] = @"\sum_{i=1}^{n}", - ["prod"] = @"\prod_{i=1}^{n}", - ["int"] = @"\int_{a}^{b}", - ["iint"] = @"\iint", - ["iiint"] = @"\iiint", - ["oint"] = @"\oint", - ["lim"] = @"\lim_{x \to 0}", - ["dydx"] = @"\frac{\partial y}{\partial x}", - ["partial"] = @"\partial", - ["nabla"] = @"\nabla", - ["hbar"] = @"\hbar", - ["infty"] = @"\infty", - ["hat"] = @"\hat{H}", - ["vec"] = @"\vec{F}", - ["dot"] = @"\dot{x}", - ["ddot"] = @"\ddot{x}", - ["x2"] = @"x^{2}", - ["xi"] = @"x_{i}", - ["xi2"] = @"x_{i}^{2}", - ["binom"] = @"\binom{n}{k}", - ["pmatrix"] = @"\begin{pmatrix} a & b \\ c & d \end{pmatrix}", - ["bmatrix"] = @"\begin{bmatrix} a & b \\ c & d \end{bmatrix}", - ["cases"] = @"\begin{cases} x & x \ge 0 \\ -x & x < 0 \end{cases}", - ["parens"] = @"\left( \right)", - ["brackets"] = @"\left[ \right]", - ["set"] = @"\left\{ \right\}", - ["bra"] = @"\langle \psi |", - ["ket"] = @"| \psi \rangle", - ["bodmas"] = @"45 - [18 + (12 - 6)]", - ["si"] = @"SI = \frac{P \times R \times T}{100}", - ["modz"] = @"|z| = \sqrt{a^2 + b^2}", - ["quad"] = @"x = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}", - ["algsq"] = @"(a + b)^2 = a^2 + 2ab + b^2" - }; - - public static string ResolveSnippet(string snippet) - { - if (string.IsNullOrWhiteSpace(snippet)) return ""; - if (_snippets.TryGetValue(snippet.Trim(), out var expansion)) - { - return expansion; - } - return snippet; - } -} diff --git a/src/PdfEditorApp/Services/Navigation/NavigationRegistry.cs b/src/PdfEditorApp/Services/Navigation/NavigationRegistry.cs deleted file mode 100644 index 4d30ead..0000000 --- a/src/PdfEditorApp/Services/Navigation/NavigationRegistry.cs +++ /dev/null @@ -1,75 +0,0 @@ -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Linq; -using PdfEditorApp.Core.Plugins.Descriptors; - -namespace PdfEditorApp.Services.Navigation; - -/// -/// Thread-safe registry for workspace pages and navigation sections. -/// -public sealed class NavigationRegistry : INavigationRegistry -{ - private readonly ConcurrentDictionary _items = new(StringComparer.OrdinalIgnoreCase); - - public event Action? RegistryChanged; - - public IDisposable RegisterNavigationItem(NavigationItemDescriptor descriptor) - { - ArgumentNullException.ThrowIfNull(descriptor); - _items[descriptor.Id] = descriptor; - RegistryChanged?.Invoke(); - - return new UnregisterDisposable(() => - { - UnregisterNavigationItem(descriptor.Id); - }); - } - - public bool UnregisterNavigationItem(string itemId) - { - if (_items.TryRemove(itemId, out _)) - { - RegistryChanged?.Invoke(); - return true; - } - return false; - } - - public IReadOnlyList GetAllItems() - { - return _items.Values.OrderBy(i => i.Order).ThenBy(i => i.Title).ToList(); - } - - public IReadOnlyList GetItemsByGroup(string group) - { - return _items.Values - .Where(i => string.Equals(i.Group, group, StringComparison.OrdinalIgnoreCase)) - .OrderBy(i => i.Order) - .ThenBy(i => i.Title) - .ToList(); - } - - public NavigationItemDescriptor? GetItem(string itemId) - { - _items.TryGetValue(itemId, out var item); - return item; - } - - private sealed class UnregisterDisposable : IDisposable - { - private Action? _action; - - public UnregisterDisposable(Action action) - { - _action = action; - } - - public void Dispose() - { - var act = System.Threading.Interlocked.Exchange(ref _action, null); - act?.Invoke(); - } - } -} diff --git a/src/PdfEditorApp/Services/Ocr/AppleVisionOcrEngine.cs b/src/PdfEditorApp/Services/Ocr/AppleVisionOcrEngine.cs deleted file mode 100644 index a0d6874..0000000 --- a/src/PdfEditorApp/Services/Ocr/AppleVisionOcrEngine.cs +++ /dev/null @@ -1,300 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Runtime.InteropServices; -using System.Text; -using System.Threading; -using System.Threading.Tasks; -using PdfEditorApp.Core.Models; - -namespace PdfEditorApp.Services.Ocr; - -/// -/// Ultra-fast hardware-accelerated OCR engine for macOS powered by Apple's Vision Framework -/// (VNRecognizeTextRequest / Apple Neural Engine / GPU). Requires zero downloads or external packages. -/// -public class AppleVisionOcrEngine : IOcrEngine -{ - public string EngineName => "Apple Vision OCR (macOS)"; - public OcrEngineType EngineType => OcrEngineType.OsNative; - public bool IsAvailable => OperatingSystem.IsMacOS(); - - [StructLayout(LayoutKind.Sequential)] - private struct NativeCGRect - { - public double X; - public double Y; - public double Width; - public double Height; - } - - public Task RecognizeTextAsync(byte[] imageBytes, string language = "eng", CancellationToken ct = default) - { - if (!IsAvailable) - { - return Task.FromResult(new OcrResult - { - Success = false, - ErrorMessage = "Apple Vision OCR is only supported on macOS." - }); - } - - return Task.Run(() => - { - var sw = Stopwatch.StartNew(); - try - { - var result = RunVisionOcr(imageBytes, language, ct); - sw.Stop(); - result.DurationMs = sw.ElapsedMilliseconds; - result.EngineUsed = EngineName; - return result; - } - catch (Exception ex) - { - sw.Stop(); - return new OcrResult - { - Success = false, - ErrorMessage = $"Apple Vision OCR failed: {ex.Message}", - DurationMs = sw.ElapsedMilliseconds, - EngineUsed = EngineName - }; - } - }, ct); - } - - private static OcrResult RunVisionOcr(byte[] imageBytes, string language, CancellationToken ct) - { - if (imageBytes == null || imageBytes.Length == 0) - { - return new OcrResult { Success = false, ErrorMessage = "Empty image bytes." }; - } - - // Initialize frameworks - NativeLibrary.Load("/System/Library/Frameworks/Foundation.framework/Foundation"); - NativeLibrary.Load("/System/Library/Frameworks/Vision.framework/Vision"); - - IntPtr autoreleasePool = objc_msgSend(objc_getClass("NSAutoreleasePool"), sel_registerName("alloc")); - autoreleasePool = objc_msgSend(autoreleasePool, sel_registerName("init")); - - try - { - // Create NSData from image bytes - IntPtr nsData = IntPtr.Zero; - var handle = GCHandle.Alloc(imageBytes, GCHandleType.Pinned); - try - { - IntPtr pBytes = handle.AddrOfPinnedObject(); - nsData = objc_msgSend_IntPtr_ulong( - objc_getClass("NSData"), - sel_registerName("dataWithBytes:length:"), - pBytes, - (ulong)imageBytes.Length); - } - finally - { - handle.Free(); - } - - if (nsData == IntPtr.Zero) - { - return new OcrResult { Success = false, ErrorMessage = "Failed to allocate NSData for image." }; - } - - // Create VNRecognizeTextRequest - IntPtr request = objc_msgSend(objc_getClass("VNRecognizeTextRequest"), sel_registerName("alloc")); - request = objc_msgSend(request, sel_registerName("init")); - - // Recognition level: 1 = Accurate, 0 = Fast - objc_msgSend_void_long(request, sel_registerName("setRecognitionLevel:"), 1); - objc_msgSend_void_bool(request, sel_registerName("setUsesLanguageCorrection:"), true); - - // Create VNImageRequestHandler with NSData and options - IntPtr emptyDict = objc_msgSend(objc_getClass("NSDictionary"), sel_registerName("dictionary")); - IntPtr handler = objc_msgSend(objc_getClass("VNImageRequestHandler"), sel_registerName("alloc")); - handler = objc_msgSend_IntPtr_IntPtr(handler, sel_registerName("initWithData:options:"), nsData, emptyDict); - - // Create NSArray with [request] - IntPtr reqArray = objc_msgSend_IntPtr(objc_getClass("NSArray"), sel_registerName("arrayWithObject:"), request); - - // Perform requests - IntPtr pError = IntPtr.Zero; - bool success = objc_msgSend_bool_IntPtr_outIntPtr(handler, sel_registerName("performRequests:error:"), reqArray, out pError); - - if (!success) - { - return new OcrResult { Success = false, ErrorMessage = "Vision request execution returned false." }; - } - - ct.ThrowIfCancellationRequested(); - - // Read results: NSArray - IntPtr resultsArray = objc_msgSend(request, sel_registerName("results")); - ulong count = resultsArray != IntPtr.Zero ? objc_msgSend_ulong(resultsArray, sel_registerName("count")) : 0; - - var words = new List(); - var lines = new List(); - var fullTextSb = new StringBuilder(); - - for (ulong i = 0; i < count; i++) - { - ct.ThrowIfCancellationRequested(); - - IntPtr observation = objc_msgSend_ulong_arg(resultsArray, sel_registerName("objectAtIndex:"), i); - if (observation == IntPtr.Zero) continue; - - // [observation topCandidates:1] -> NSArray - IntPtr candidates = objc_msgSend_ulong_arg(observation, sel_registerName("topCandidates:"), 1); - ulong candCount = candidates != IntPtr.Zero ? objc_msgSend_ulong(candidates, sel_registerName("count")) : 0; - if (candCount == 0) continue; - - IntPtr candidate = objc_msgSend_ulong_arg(candidates, sel_registerName("objectAtIndex:"), 0); - if (candidate == IntPtr.Zero) continue; - - // String value - IntPtr nsString = objc_msgSend(candidate, sel_registerName("string")); - string text = GetUtf8String(nsString); - if (string.IsNullOrWhiteSpace(text)) continue; - - // Confidence - float confidence = objc_msgSend_float(candidate, sel_registerName("confidence")); - - // BoundingBox: normalized CGRect in Vision coordinates (0,0 is bottom-left) - NativeCGRect visionBox = GetObservationBoundingBox(observation); - - // Convert Vision coordinates (bottom-left) to top-left normalized coordinates - // Vision: X=0..1 (left-to-right), Y=0..1 (bottom-to-top) - // Top-left: X=X, Y=1.0 - (Y + Height) - double topY = Math.Max(0.0, Math.Min(1.0, 1.0 - (visionBox.Y + visionBox.Height))); - var lineBounds = new OcrBoundingBox( - Math.Max(0.0, visionBox.X), - topY, - Math.Max(0.001, visionBox.Width), - Math.Max(0.001, visionBox.Height)); - - var lineItem = new OcrLineItem - { - Text = text, - NormalizedBounds = lineBounds - }; - - // Split text into individual words and estimate/calculate sub-word bounding boxes - string[] tokens = text.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); - if (tokens.Length > 0) - { - double currentWordLeft = lineBounds.X; - double totalChars = Math.Max(1, text.Length); - - foreach (var token in tokens) - { - double wordWidthFraction = (double)token.Length / totalChars; - double wordWidth = lineBounds.Width * wordWidthFraction; - - var wordItem = new OcrWordItem - { - Text = token, - NormalizedBounds = new OcrBoundingBox( - Math.Max(0.0, currentWordLeft), - lineBounds.Y, - Math.Max(0.001, wordWidth), - lineBounds.Height), - Confidence = confidence - }; - - lineItem.Words.Add(wordItem); - words.Add(wordItem); - - // Advance horizontal position including inter-word space - double spaceWidth = (lineBounds.Width / totalChars); - currentWordLeft += wordWidth + spaceWidth; - } - } - - lines.Add(lineItem); - fullTextSb.AppendLine(text); - } - - return new OcrResult - { - Success = true, - FullText = fullTextSb.ToString().TrimEnd(), - Lines = lines, - Words = words - }; - } - finally - { - if (autoreleasePool != IntPtr.Zero) - { - objc_msgSend(autoreleasePool, sel_registerName("drain")); - } - } - } - - private static string GetUtf8String(IntPtr nsString) - { - if (nsString == IntPtr.Zero) return string.Empty; - IntPtr utf8Ptr = objc_msgSend(nsString, sel_registerName("UTF8String")); - return utf8Ptr != IntPtr.Zero ? Marshal.PtrToStringUTF8(utf8Ptr) ?? string.Empty : string.Empty; - } - - private static NativeCGRect GetObservationBoundingBox(IntPtr observation) - { - // On macOS 64-bit (both arm64 and x86_64), structs with 4 doubles can be retrieved - // reliably through objc_msgSend with NativeCGRect return type. - try - { - return objc_msgSend_stret_rect(observation, sel_registerName("boundingBox")); - } - catch - { - return new NativeCGRect { X = 0, Y = 0, Width = 1, Height = 0.05 }; - } - } - - #region Objective-C Runtime P/Invoke - - [DllImport("libobjc.dylib", EntryPoint = "objc_getClass")] - private static extern IntPtr objc_getClass(string name); - - [DllImport("libobjc.dylib", EntryPoint = "sel_registerName")] - private static extern IntPtr sel_registerName(string name); - - [DllImport("libobjc.dylib", EntryPoint = "objc_msgSend")] - private static extern IntPtr objc_msgSend(IntPtr receiver, IntPtr selector); - - [DllImport("libobjc.dylib", EntryPoint = "objc_msgSend")] - private static extern IntPtr objc_msgSend_IntPtr(IntPtr receiver, IntPtr selector, IntPtr arg1); - - [DllImport("libobjc.dylib", EntryPoint = "objc_msgSend")] - private static extern IntPtr objc_msgSend_IntPtr_IntPtr(IntPtr receiver, IntPtr selector, IntPtr arg1, IntPtr arg2); - - [DllImport("libobjc.dylib", EntryPoint = "objc_msgSend")] - private static extern IntPtr objc_msgSend_IntPtr_ulong(IntPtr receiver, IntPtr selector, IntPtr arg1, ulong arg2); - - [DllImport("libobjc.dylib", EntryPoint = "objc_msgSend")] - private static extern void objc_msgSend_void_long(IntPtr receiver, IntPtr selector, long arg1); - - [DllImport("libobjc.dylib", EntryPoint = "objc_msgSend")] - private static extern void objc_msgSend_void_bool(IntPtr receiver, IntPtr selector, bool arg1); - - [DllImport("libobjc.dylib", EntryPoint = "objc_msgSend")] - private static extern ulong objc_msgSend_ulong(IntPtr receiver, IntPtr selector); - - [DllImport("libobjc.dylib", EntryPoint = "objc_msgSend")] - private static extern IntPtr objc_msgSend_ulong_arg(IntPtr receiver, IntPtr selector, ulong index); - - [DllImport("libobjc.dylib", EntryPoint = "objc_msgSend")] - private static extern float objc_msgSend_float(IntPtr receiver, IntPtr selector); - - [DllImport("libobjc.dylib", EntryPoint = "objc_msgSend")] - [return: MarshalAs(UnmanagedType.I1)] - private static extern bool objc_msgSend_bool_IntPtr_outIntPtr(IntPtr receiver, IntPtr selector, IntPtr arg1, out IntPtr arg2); - - [DllImport("libobjc.dylib", EntryPoint = "objc_msgSend")] - private static extern NativeCGRect objc_msgSend_stret_rect(IntPtr receiver, IntPtr selector); - - #endregion -} diff --git a/src/PdfEditorApp/Services/Ocr/CompositeOcrProvider.cs b/src/PdfEditorApp/Services/Ocr/CompositeOcrProvider.cs deleted file mode 100644 index 286fbfe..0000000 --- a/src/PdfEditorApp/Services/Ocr/CompositeOcrProvider.cs +++ /dev/null @@ -1,101 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using PdfEditorApp.Core.Models; - -namespace PdfEditorApp.Services.Ocr; - -public interface ICompositeOcrProvider : IOcrEngine -{ - OcrEngineType PreferredEngine { get; set; } - ITesseractModelService ModelService { get; } - IReadOnlyList AvailableEngines { get; } - IOcrEngine ActiveEngine { get; } - void RegisterEngine(IOcrEngine engine); -} - -public class CompositeOcrProvider : ICompositeOcrProvider -{ - private static CompositeOcrProvider? _instance; - public static CompositeOcrProvider Default => _instance ??= new CompositeOcrProvider(); - - private readonly List _engines = new(); - private readonly ITesseractModelService _modelService; - private readonly AppleVisionOcrEngine _appleEngine; - private readonly WindowsMediaOcrEngine _windowsEngine; - private readonly TesseractOcrEngine _tesseractEngine; - - public string EngineName => ActiveEngine.EngineName; - public OcrEngineType EngineType => ActiveEngine.EngineType; - public bool IsAvailable => ActiveEngine.IsAvailable; - public OcrEngineType PreferredEngine { get; set; } = OcrEngineType.Auto; - public ITesseractModelService ModelService => _modelService; - public IReadOnlyList AvailableEngines => _engines; - - public IOcrEngine ActiveEngine - { - get - { - if (PreferredEngine == OcrEngineType.OsNative) - { - if (OperatingSystem.IsMacOS()) return _appleEngine; - if (OperatingSystem.IsWindows()) return _windowsEngine; - } - else if (PreferredEngine == OcrEngineType.Tesseract) - { - return _tesseractEngine; - } - - // Auto mode: prioritize OS Native for zero-download instant execution - if (OperatingSystem.IsMacOS() && _appleEngine.IsAvailable) return _appleEngine; - if (OperatingSystem.IsWindows() && _windowsEngine.IsAvailable) return _windowsEngine; - return _tesseractEngine; - } - } - - public CompositeOcrProvider(ITesseractModelService? modelService = null) - { - _modelService = modelService ?? new TesseractModelService(); - _appleEngine = new AppleVisionOcrEngine(); - _windowsEngine = new WindowsMediaOcrEngine(); - _tesseractEngine = new TesseractOcrEngine(_modelService); - - if (_appleEngine.IsAvailable) _engines.Add(_appleEngine); - if (_windowsEngine.IsAvailable) _engines.Add(_windowsEngine); - if (_tesseractEngine.IsAvailable) _engines.Add(_tesseractEngine); - } - - public void RegisterEngine(IOcrEngine engine) - { - ArgumentNullException.ThrowIfNull(engine); - if (!_engines.Any(e => e.EngineName == engine.EngineName)) - { - _engines.Add(engine); - } - } - - public async Task RecognizeTextAsync(byte[] imageBytes, string language = "eng", CancellationToken ct = default) - { - var primary = ActiveEngine; - var result = await primary.RecognizeTextAsync(imageBytes, language, ct); - - if (result.Success && (result.Words.Count > 0 || !string.IsNullOrWhiteSpace(result.FullText))) - { - return result; - } - - // If primary engine produced nothing or failed and we're in Auto mode, try fallback - if (PreferredEngine == OcrEngineType.Auto && primary != _tesseractEngine && _tesseractEngine.IsAvailable) - { - var fallback = await _tesseractEngine.RecognizeTextAsync(imageBytes, language, ct); - if (fallback.Success) - { - return fallback; - } - } - - return result; - } -} diff --git a/src/PdfEditorApp/Services/Ocr/OcrEngineRegistry.cs b/src/PdfEditorApp/Services/Ocr/OcrEngineRegistry.cs deleted file mode 100644 index 3a2be22..0000000 --- a/src/PdfEditorApp/Services/Ocr/OcrEngineRegistry.cs +++ /dev/null @@ -1,63 +0,0 @@ -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Plugins.Descriptors; - -namespace PdfEditorApp.Services.Ocr; - -public class OcrEngineRegistry : IOcrEngineRegistry -{ - private readonly ConcurrentDictionary _engines = new(StringComparer.OrdinalIgnoreCase); - - public event Action? RegistryChanged; - - public OcrEngineRegistry(ITesseractModelService? modelService = null) - { - RegisterBuiltInEngines(modelService); - } - - private void RegisterBuiltInEngines(ITesseractModelService? modelService) - { - RegisterEngine(new AppleVisionOcrEngine()); - RegisterEngine(new WindowsMediaOcrEngine()); - RegisterEngine(new TesseractOcrEngine(modelService ?? new TesseractModelService())); - } - - public IDisposable RegisterEngine(IOcrEngine engine) - { - ArgumentNullException.ThrowIfNull(engine); - _engines[engine.EngineName] = engine; - RegistryChanged?.Invoke(); - - return new DisposableAction(() => - { - _engines.TryRemove(engine.EngineName, out _); - RegistryChanged?.Invoke(); - }); - } - - public IOcrEngine? GetEngine(string engineName) - { - if (string.IsNullOrWhiteSpace(engineName)) return null; - return _engines.GetValueOrDefault(engineName); - } - - public IReadOnlyList GetAllEngines() - { - return _engines.Values.ToList(); - } - - public IReadOnlyList GetAvailableEngines() - { - return _engines.Values.Where(e => e.IsAvailable).ToList(); - } - - private sealed class DisposableAction(Action action) : IDisposable - { - private Action? _action = action; - public void Dispose() => Interlocked.Exchange(ref _action, null)?.Invoke(); - } -} diff --git a/src/PdfEditorApp/Services/Ocr/TesseractModelService.cs b/src/PdfEditorApp/Services/Ocr/TesseractModelService.cs deleted file mode 100644 index 235789b..0000000 --- a/src/PdfEditorApp/Services/Ocr/TesseractModelService.cs +++ /dev/null @@ -1,368 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Linq; -using System.Net.Http; -using System.Threading; -using System.Threading.Tasks; -using PdfEditorApp.Core.Models; - -namespace PdfEditorApp.Services.Ocr; - -public interface ITesseractModelService -{ - event Action? LanguageLibraryChanged; - - string TessDataDirectory { get; } - IReadOnlyList AvailableLanguages { get; } - - bool IsLanguageInstalled(string languageCode); - string? GetInstalledLanguagePath(string languageCode); - - Task DownloadLanguageAsync( - string languageCode, - IProgress? progress = null, - Action? statusCallback = null, - CancellationToken ct = default); - - Task DeleteLanguageAsync(string languageCode); - Task ClearAllCacheAsync(); - Task GetTotalCacheSizeBytesAsync(); - - bool IsTesseractCliAvailable(); - string? GetTesseractCliPath(); - void RefreshInstalledStatuses(); -} - -public class TesseractModelService : ITesseractModelService -{ - public event Action? LanguageLibraryChanged; - - private static readonly HttpClient HttpClient = new(new SocketsHttpHandler - { - PooledConnectionLifetime = TimeSpan.FromMinutes(10), - ConnectTimeout = TimeSpan.FromSeconds(15) - }) - { - Timeout = TimeSpan.FromMinutes(5) - }; - - static TesseractModelService() - { - HttpClient.DefaultRequestHeaders.UserAgent.ParseAdd("FryPDF-OcrDownloader/1.0"); - } - - private readonly string _tessDataDir; - private readonly List _languages; - - public string TessDataDirectory => _tessDataDir; - public IReadOnlyList AvailableLanguages => _languages; - - public TesseractModelService(string? customTessDataDir = null) - { - _tessDataDir = customTessDataDir ?? Path.Combine( - Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), - ".frypdf", - "tessdata"); - - if (!Directory.Exists(_tessDataDir)) - { - try { Directory.CreateDirectory(_tessDataDir); } catch { } - } - - _languages = InitializeCatalog(); - } - - public bool IsLanguageInstalled(string languageCode) - { - string path = Path.Combine(_tessDataDir, $"{languageCode}.traineddata"); - if (File.Exists(path) && new FileInfo(path).Length > 1000) - { - return true; - } - - // Fallback: check app assets/bundle - string appPath = Path.Combine(AppContext.BaseDirectory, "tessdata", $"{languageCode}.traineddata"); - return File.Exists(appPath) && new FileInfo(appPath).Length > 1000; - } - - public string? GetInstalledLanguagePath(string languageCode) - { - string userPath = Path.Combine(_tessDataDir, $"{languageCode}.traineddata"); - if (File.Exists(userPath) && new FileInfo(userPath).Length > 1000) - return userPath; - - string appPath = Path.Combine(AppContext.BaseDirectory, "tessdata", $"{languageCode}.traineddata"); - if (File.Exists(appPath) && new FileInfo(appPath).Length > 1000) - return appPath; - - return null; - } - - public void RefreshInstalledStatuses() - { - foreach (var lang in _languages) - { - lang.IsInstalled = IsLanguageInstalled(lang.Code); - } - LanguageLibraryChanged?.Invoke(); - } - - public async Task DownloadLanguageAsync( - string languageCode, - IProgress? progress = null, - Action? statusCallback = null, - CancellationToken ct = default) - { - var lang = _languages.FirstOrDefault(l => string.Equals(l.Code, languageCode, StringComparison.OrdinalIgnoreCase)); - if (lang == null) - { - // Custom or dynamic language code - lang = new TesseractLanguagePackageInfo - { - Code = languageCode.ToLowerInvariant(), - DisplayName = languageCode.ToUpperInvariant(), - DownloadUrl = $"https://raw.githubusercontent.com/tesseract-ocr/tessdata_fast/main/{languageCode.ToLowerInvariant()}.traineddata", - EstimatedSizeBytes = 4_000_000, - Category = "Custom" - }; - } - - Directory.CreateDirectory(_tessDataDir); - string targetPath = Path.Combine(_tessDataDir, lang.FileName); - string tempPath = targetPath + ".tmp"; - - if (File.Exists(targetPath) && new FileInfo(targetPath).Length > 1000) - { - progress?.Report(1.0); - statusCallback?.Invoke($"{lang.DisplayName} is already installed."); - lang.IsInstalled = true; - LanguageLibraryChanged?.Invoke(); - return true; - } - - statusCallback?.Invoke($"Connecting to download {lang.DisplayName} ({lang.Code})..."); - progress?.Report(0.05); - - try - { - using var response = await HttpClient.GetAsync(lang.DownloadUrl, HttpCompletionOption.ResponseHeadersRead, ct); - response.EnsureSuccessStatusCode(); - - long totalExpected = response.Content.Headers.ContentLength ?? lang.EstimatedSizeBytes; - if (totalExpected <= 0) totalExpected = 4_000_000; - - using var sourceStream = await response.Content.ReadAsStreamAsync(ct); - using var fileStream = new FileStream(tempPath, FileMode.Create, FileAccess.Write, FileShare.None); - - byte[] buffer = new byte[81920]; - long downloadedBytes = 0; - int bytesRead; - - while ((bytesRead = await sourceStream.ReadAsync(buffer, 0, buffer.Length, ct)) > 0) - { - await fileStream.WriteAsync(buffer, 0, bytesRead, ct); - downloadedBytes += bytesRead; - - double p = Math.Min(0.98, (double)downloadedBytes / totalExpected); - progress?.Report(p); - statusCallback?.Invoke($"Downloading {lang.DisplayName}: {downloadedBytes / (1024 * 1024.0):F1} MB / {totalExpected / (1024 * 1024.0):F1} MB"); - } - - fileStream.Close(); - - if (File.Exists(targetPath)) - File.Delete(targetPath); - - File.Move(tempPath, targetPath); - - lang.IsInstalled = true; - progress?.Report(1.0); - statusCallback?.Invoke($"{lang.DisplayName} language pack installed successfully."); - LanguageLibraryChanged?.Invoke(); - return true; - } - catch (Exception ex) - { - try { if (File.Exists(tempPath)) File.Delete(tempPath); } catch { } - statusCallback?.Invoke($"Download failed: {ex.Message}"); - return false; - } - } - - public Task DeleteLanguageAsync(string languageCode) - { - try - { - string targetPath = Path.Combine(_tessDataDir, $"{languageCode}.traineddata"); - if (File.Exists(targetPath)) - { - File.Delete(targetPath); - } - - var lang = _languages.FirstOrDefault(l => string.Equals(l.Code, languageCode, StringComparison.OrdinalIgnoreCase)); - if (lang != null) - { - lang.IsInstalled = IsLanguageInstalled(lang.Code); - } - - LanguageLibraryChanged?.Invoke(); - return Task.FromResult(true); - } - catch - { - return Task.FromResult(false); - } - } - - public Task ClearAllCacheAsync() - { - try - { - if (Directory.Exists(_tessDataDir)) - { - var files = Directory.GetFiles(_tessDataDir, "*.traineddata") - .Concat(Directory.GetFiles(_tessDataDir, "*.tmp")); - foreach (var f in files) - { - try { File.Delete(f); } catch { } - } - } - - foreach (var lang in _languages) - { - lang.IsInstalled = IsLanguageInstalled(lang.Code); - } - - LanguageLibraryChanged?.Invoke(); - } - catch { } - - return Task.CompletedTask; - } - - public Task GetTotalCacheSizeBytesAsync() - { - try - { - if (!Directory.Exists(_tessDataDir)) - return Task.FromResult(0L); - - long total = 0; - var dirInfo = new DirectoryInfo(_tessDataDir); - foreach (var file in dirInfo.EnumerateFiles("*.traineddata", SearchOption.TopDirectoryOnly)) - { - total += file.Length; - } - return Task.FromResult(total); - } - catch - { - return Task.FromResult(0L); - } - } - - public bool IsTesseractCliAvailable() - { - return !string.IsNullOrEmpty(GetTesseractCliPath()); - } - - public string? GetTesseractCliPath() - { - string[] candidates = OperatingSystem.IsWindows() - ? new[] { "tesseract.exe", @"C:\Program Files\Tesseract-OCR\tesseract.exe", @"C:\Program Files (x86)\Tesseract-OCR\tesseract.exe" } - : new[] { "tesseract", "/opt/homebrew/bin/tesseract", "/usr/local/bin/tesseract", "/usr/bin/tesseract" }; - - foreach (var candidate in candidates) - { - if (File.Exists(candidate)) return candidate; - } - - try - { - var psi = new ProcessStartInfo - { - FileName = OperatingSystem.IsWindows() ? "where" : "which", - Arguments = "tesseract", - RedirectStandardOutput = true, - UseShellExecute = false, - CreateNoWindow = true - }; - using var p = Process.Start(psi); - if (p != null) - { - string path = p.StandardOutput.ReadLine()?.Trim() ?? ""; - p.WaitForExit(1000); - if (File.Exists(path)) return path; - } - } - catch { } - - return null; - } - - private List InitializeCatalog() - { - string BaseUrl(string code) => $"https://raw.githubusercontent.com/tesseract-ocr/tessdata_fast/main/{code}.traineddata"; - - var list = new List - { - // === 1. Latin & European === - new() { Code = "eng", DisplayName = "English", NativeName = "English", FlagEmoji = "🇺🇸", Category = "Latin & European", EstimatedSizeBytes = 4_113_000, DownloadUrl = BaseUrl("eng"), Description = "Fast LSTM neural model for English documents, forms, reports, and books.", SampleText = "The quick brown fox jumps over the lazy dog." }, - new() { Code = "spa", DisplayName = "Spanish", NativeName = "Español", FlagEmoji = "🇪🇸", Category = "Latin & European", EstimatedSizeBytes = 1_470_000, DownloadUrl = BaseUrl("spa"), Description = "Modern Spanish language model with accented characters and punctuation.", SampleText = "El veloz murciélago hindú comía feliz cardillo y kiwi." }, - new() { Code = "fra", DisplayName = "French", NativeName = "Français", FlagEmoji = "🇫🇷", Category = "Latin & European", EstimatedSizeBytes = 1_870_000, DownloadUrl = BaseUrl("fra"), Description = "French language model supporting cedillas, ligatures, and acute accents.", SampleText = "Voix ambiguë d'un cœur qui au zéphyr préfère les jattes de kiwis." }, - new() { Code = "deu", DisplayName = "German", NativeName = "Deutsch", FlagEmoji = "🇩🇪", Category = "Latin & European", EstimatedSizeBytes = 2_200_000, DownloadUrl = BaseUrl("deu"), Description = "German language model with umlauts (ä, ö, ü) and Eszett (ß).", SampleText = "Victor jagt zwölf Boxkämpfer quer über den großen Sylter Deich." }, - new() { Code = "ita", DisplayName = "Italian", NativeName = "Italiano", FlagEmoji = "🇮🇹", Category = "Latin & European", EstimatedSizeBytes = 1_680_000, DownloadUrl = BaseUrl("ita"), Description = "Italian language model for high-fidelity document OCR.", SampleText = "Quel vituperio di un pazzo fa sbadigliare la gente con zelo." }, - new() { Code = "por", DisplayName = "Portuguese", NativeName = "Português", FlagEmoji = "🇵🇹", Category = "Latin & European", EstimatedSizeBytes = 1_620_000, DownloadUrl = BaseUrl("por"), Description = "Portuguese model supporting European and Brazilian orthography.", SampleText = "Um pequeno jabuti xereta viu dez cegonhas felizes." }, - new() { Code = "nld", DisplayName = "Dutch", NativeName = "Nederlands", FlagEmoji = "🇳🇱", Category = "Latin & European", EstimatedSizeBytes = 1_600_000, DownloadUrl = BaseUrl("nld"), Description = "Dutch model supporting compounding and standard orthography.", SampleText = "Pa's wijze lynx bezag vroom het fijne cactussnoeiwerk." }, - new() { Code = "rus", DisplayName = "Russian", NativeName = "Русский", FlagEmoji = "🇷🇺", Category = "Latin & European", EstimatedSizeBytes = 3_800_000, DownloadUrl = BaseUrl("rus"), Description = "Cyrillic Russian language model for print and book OCR.", SampleText = "Съешь же ещё этих мягких французских булок, да выпей чаю." }, - new() { Code = "pol", DisplayName = "Polish", NativeName = "Polski", FlagEmoji = "🇵🇱", Category = "Latin & European", EstimatedSizeBytes = 1_800_000, DownloadUrl = BaseUrl("pol"), Description = "Polish language model with ogoneks, kreskas, and diacritics.", SampleText = "Pchnąć w tę łódź jeża lub ośm skrzyń fig." }, - new() { Code = "ukr", DisplayName = "Ukrainian", NativeName = "Українська", FlagEmoji = "🇺🇦", Category = "Latin & European", EstimatedSizeBytes = 2_600_000, DownloadUrl = BaseUrl("ukr"), Description = "Cyrillic Ukrainian model with apostrophes and specific vowels.", SampleText = "Чуєш, їхній плуг замінить рясну траву шовком." }, - new() { Code = "swe", DisplayName = "Swedish", NativeName = "Svenska", FlagEmoji = "🇸🇪", Category = "Latin & European", EstimatedSizeBytes = 1_400_000, DownloadUrl = BaseUrl("swe"), Description = "Swedish model supporting å, ä, ö and Scandinavian typography.", SampleText = "Flygande bäckasiner söka hwila på mjuk tuva." }, - new() { Code = "nor", DisplayName = "Norwegian", NativeName = "Norsk", FlagEmoji = "🇳🇴", Category = "Latin & European", EstimatedSizeBytes = 1_500_000, DownloadUrl = BaseUrl("nor"), Description = "Norwegian (Bokmål & Nynorsk) model with æ, ø, å support.", SampleText = "Vår sære ørn ble mager av sjøens ti fisk." }, - new() { Code = "dan", DisplayName = "Danish", NativeName = "Dansk", FlagEmoji = "🇩🇰", Category = "Latin & European", EstimatedSizeBytes = 1_400_000, DownloadUrl = BaseUrl("dan"), Description = "Danish model supporting æ, ø, å diacritics.", SampleText = "Quizdeltagerne spiste jordbær med fløde, mens cirkusklovnen kiggede på." }, - new() { Code = "fin", DisplayName = "Finnish", NativeName = "Suomi", FlagEmoji = "🇫🇮", Category = "Latin & European", EstimatedSizeBytes = 1_800_000, DownloadUrl = BaseUrl("fin"), Description = "Finnish model tuned for agglutinative words and compound terms.", SampleText = "Viekas kettu kuoppaan lankesi heti aamutuimaan." }, - new() { Code = "ces", DisplayName = "Czech", NativeName = "Čeština", FlagEmoji = "🇨🇿", Category = "Latin & European", EstimatedSizeBytes = 1_700_000, DownloadUrl = BaseUrl("ces"), Description = "Czech language model supporting carons and acutes.", SampleText = "Příliš žluťoučký kůň úpěl ďábelské ódy." }, - new() { Code = "ell", DisplayName = "Greek", NativeName = "Ελληνικά", FlagEmoji = "🇬🇷", Category = "Latin & European", EstimatedSizeBytes = 1_800_000, DownloadUrl = BaseUrl("ell"), Description = "Modern Greek script model with monotonic accentuation.", SampleText = "Ξεσκεπάζω την ψυχοφθόρα βδελυγμία του καθενός." }, - new() { Code = "lat", DisplayName = "Latin", NativeName = "Latina", FlagEmoji = "🏛️", Category = "Latin & European", EstimatedSizeBytes = 1_300_000, DownloadUrl = BaseUrl("lat"), Description = "Classical and Ecclesiastical Latin recognition model.", SampleText = "Lorem ipsum dolor sit amet, consectetur adipiscing elit." }, - new() { Code = "tur", DisplayName = "Turkish", NativeName = "Türkçe", FlagEmoji = "🇹🇷", Category = "Latin & European", EstimatedSizeBytes = 1_500_000, DownloadUrl = BaseUrl("tur"), Description = "Turkish model with dotted/dotless i (İ/i, I/ı), ş, ğ.", SampleText = "Pijamalı hasta yağız şoföre çabucak güvendi." }, - - // === 2. East Asia (CJK) === - new() { Code = "chi_sim", DisplayName = "Chinese Simplified", NativeName = "简体中文", FlagEmoji = "🇨🇳", Category = "East Asia (CJK)", EstimatedSizeBytes = 11_200_000, DownloadUrl = BaseUrl("chi_sim"), Description = "Simplified Chinese neural model (Hanzi / Mandarin).", SampleText = "天地玄黄,宇宙洪荒。日月盈昃,辰宿列张。" }, - new() { Code = "chi_tra", DisplayName = "Chinese Traditional", NativeName = "繁體中文", FlagEmoji = "🇹🇼", Category = "East Asia (CJK)", EstimatedSizeBytes = 11_100_000, DownloadUrl = BaseUrl("chi_tra"), Description = "Traditional Chinese neural model for Hong Kong, Taiwan, and classic docs.", SampleText = "有朋自遠方來,不亦樂乎?博學而篤志,切問而近思。" }, - new() { Code = "jpn", DisplayName = "Japanese", NativeName = "日本語", FlagEmoji = "🇯🇵", Category = "East Asia (CJK)", EstimatedSizeBytes = 8_200_000, DownloadUrl = BaseUrl("jpn"), Description = "Japanese model supporting Kanji, Hiragana, and Katakana.", SampleText = "いろはにほへと ちりぬるを わかよたれそ つねならむ" }, - new() { Code = "kor", DisplayName = "Korean", NativeName = "한국어", FlagEmoji = "🇰🇷", Category = "East Asia (CJK)", EstimatedSizeBytes = 4_900_000, DownloadUrl = BaseUrl("kor"), Description = "Korean Hangul script neural model.", SampleText = "다람쥐 헌 쳇바퀴에 타고파. 나랏말싸미 듕귁에 달아." }, - - // === 3. South Asia (Indic) === - new() { Code = "hin", DisplayName = "Hindi", NativeName = "हिन्दी", FlagEmoji = "🇮🇳", Category = "South Asia (Indic)", EstimatedSizeBytes = 3_600_000, DownloadUrl = BaseUrl("hin"), Description = "Devanagari Hindi model for official, legal, and published documents.", SampleText = "सत्यमेव जयते। सभी मनुष्यों को गौरव और अधिकारों के विषय में समानता प्राप्त है।" }, - new() { Code = "ben", DisplayName = "Bengali", NativeName = "বাংলা", FlagEmoji = "🇧🇩", Category = "South Asia (Indic)", EstimatedSizeBytes = 2_500_000, DownloadUrl = BaseUrl("ben"), Description = "Bengali / Bangla script model for India and Bangladesh documents.", SampleText = "সকল মানুষ সমান মর্যাদা এবং অধিকার নিয়ে জন্মগ্রহণ করে।" }, - new() { Code = "tam", DisplayName = "Tamil", NativeName = "தமிழ்", FlagEmoji = "🇮🇳", Category = "South Asia (Indic)", EstimatedSizeBytes = 2_400_000, DownloadUrl = BaseUrl("tam"), Description = "Tamil script model with complex ligature recognition.", SampleText = "யாதும் ஊரே யாவரும் கேளிர்; தீதும் நன்றும் பிறர்தர வாரா." }, - new() { Code = "tel", DisplayName = "Telugu", NativeName = "తెలుగు", FlagEmoji = "🇮🇳", Category = "South Asia (Indic)", EstimatedSizeBytes = 2_300_000, DownloadUrl = BaseUrl("tel"), Description = "Telugu Dravidian script recognition model.", SampleText = "తెలుగు భాష అమృతము వంటిది. సర్వేజనా సుఖినోభవంతు." }, - new() { Code = "mar", DisplayName = "Marathi", NativeName = "मराठी", FlagEmoji = "🇮🇳", Category = "South Asia (Indic)", EstimatedSizeBytes = 2_800_000, DownloadUrl = BaseUrl("mar"), Description = "Marathi Devanagari model for government and educational records.", SampleText = "ज्ञान हीच खरी शक्ती आहे. सर्वांना समान संधी मिळायला हवी." }, - new() { Code = "san", DisplayName = "Sanskrit", NativeName = "संस्कृतम्", FlagEmoji = "🕉️", Category = "South Asia (Indic)", EstimatedSizeBytes = 3_200_000, DownloadUrl = BaseUrl("san"), Description = "Classical Sanskrit Devanagari model with Vedic accent markings.", SampleText = "सर्वे भवन्तु सुखिनः सर्वे सन्तु निरामयाः।" }, - new() { Code = "urd", DisplayName = "Urdu", NativeName = "اردو", FlagEmoji = "🇵🇰", Category = "South Asia (Indic)", EstimatedSizeBytes = 2_400_000, DownloadUrl = BaseUrl("urd"), Description = "Urdu Nastaliq / Perso-Arabic model for books and documents.", SampleText = "تمام انسان آزادی اور حقوق کے اعتبار سے برابر پیدا ہوئے ہیں۔" }, - - // === 4. Middle East & RTL === - new() { Code = "ara", DisplayName = "Arabic", NativeName = "العربية", FlagEmoji = "🇸🇦", Category = "Middle East & RTL", EstimatedSizeBytes = 2_100_000, DownloadUrl = BaseUrl("ara"), Description = "Modern Standard Arabic right-to-left document OCR.", SampleText = "يولد جميع الناس أحراراً ومتساوين في الكرامة والحقوق." }, - new() { Code = "heb", DisplayName = "Hebrew", NativeName = "עברית", FlagEmoji = "🇮🇱", Category = "Middle East & RTL", EstimatedSizeBytes = 1_500_000, DownloadUrl = BaseUrl("heb"), Description = "Modern and Biblical Hebrew script recognition model.", SampleText = "כל בני אדם נולדו בני חורין ושווים בכבודם ובזכויותיהם." }, - new() { Code = "fas", DisplayName = "Persian", NativeName = "فارسی", FlagEmoji = "🇮🇷", Category = "Middle East & RTL", EstimatedSizeBytes = 2_200_000, DownloadUrl = BaseUrl("fas"), Description = "Persian / Farsi Nastaliq and standard typeface model.", SampleText = "همه افراد بشر آزاد به دنیا می‌آیند و از لحاظ حیثیت و حقوق با هم برابرند." }, - - // === 5. Southeast Asia === - new() { Code = "vie", DisplayName = "Vietnamese", NativeName = "Tiếng Việt", FlagEmoji = "🇻🇳", Category = "Southeast Asia", EstimatedSizeBytes = 1_900_000, DownloadUrl = BaseUrl("vie"), Description = "Vietnamese Quốc ngữ model with multiple stacked diacritics.", SampleText = "Mọi người sinh ra đều được tự do và bình đẳng về nhân phẩm." }, - new() { Code = "tha", DisplayName = "Thai", NativeName = "ไทย", FlagEmoji = "🇹🇭", Category = "Southeast Asia", EstimatedSizeBytes = 2_500_000, DownloadUrl = BaseUrl("tha"), Description = "Thai script model without inter-word spacing.", SampleText = "มนุษย์ทุกคนเกิดมามีอิสระและเสมอภาคกันในศักดิ์ศรีและสิทธิ" }, - new() { Code = "ind", DisplayName = "Indonesian", NativeName = "Bahasa Indonesia", FlagEmoji = "🇮🇩", Category = "Southeast Asia", EstimatedSizeBytes = 1_400_000, DownloadUrl = BaseUrl("ind"), Description = "Bahasa Indonesia model for contracts, receipts, and forms.", SampleText = "Semua orang dilahirkan merdeka dan mempunyai martabat yang sama." }, - - // === 6. Specialized & Other === - new() { Code = "osd", DisplayName = "Orientation & Script", NativeName = "OSD", FlagEmoji = "🧭", Category = "Specialized & Other", EstimatedSizeBytes = 10_500_000, DownloadUrl = BaseUrl("osd"), Description = "Orientation and script detection neural model (detects page angle & script).", SampleText = "0° / 90° / 180° / 270° Orientation & Script Classifier" }, - new() { Code = "equ", DisplayName = "Math & Equations", NativeName = "Equation", FlagEmoji = "📐", Category = "Specialized & Other", EstimatedSizeBytes = 2_400_000, DownloadUrl = BaseUrl("equ"), Description = "Mathematical notation, operators, formulas, and equation recognition.", SampleText = "f(x) = ∫ e^(-x²) dx, ∑(a_n * x^n)" } - }; - - foreach (var item in list) - { - item.IsInstalled = IsLanguageInstalled(item.Code); - } - - return list; - } -} diff --git a/src/PdfEditorApp/Services/Ocr/TesseractOcrEngine.cs b/src/PdfEditorApp/Services/Ocr/TesseractOcrEngine.cs deleted file mode 100644 index acf61c5..0000000 --- a/src/PdfEditorApp/Services/Ocr/TesseractOcrEngine.cs +++ /dev/null @@ -1,245 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Globalization; -using System.IO; -using System.Text; -using System.Threading; -using System.Threading.Tasks; -using PdfEditorApp.Core.Models; - -namespace PdfEditorApp.Services.Ocr; - -/// -/// Cross-platform Tesseract OCR engine that utilizes downloaded .traineddata language packs. -/// Supports execution via native Tesseract CLI/runtime with TSV/HOCR parsing for exact word bounds. -/// -public class TesseractOcrEngine : IOcrEngine -{ - private readonly ITesseractModelService _modelService; - - public string EngineName => "Tesseract OCR"; - public OcrEngineType EngineType => OcrEngineType.Tesseract; - public bool IsAvailable => true; - - public TesseractOcrEngine(ITesseractModelService modelService) - { - _modelService = modelService; - } - - public async Task RecognizeTextAsync(byte[] imageBytes, string language = "eng", CancellationToken ct = default) - { - if (imageBytes == null || imageBytes.Length == 0) - { - return new OcrResult { Success = false, ErrorMessage = "Empty image data provided." }; - } - - // Ensure the requested language pack is downloaded - if (!_modelService.IsLanguageInstalled(language)) - { - bool downloaded = await _modelService.DownloadLanguageAsync(language, null, null, ct); - if (!downloaded) - { - return new OcrResult - { - Success = false, - ErrorMessage = $"Language pack for '{language}' could not be downloaded." - }; - } - } - - string tessDataDir = _modelService.TessDataDirectory; - return await Task.Run(() => RunTesseractProcess(imageBytes, language, tessDataDir, ct), ct); - } - - private static OcrResult RunTesseractProcess(byte[] imageBytes, string language, string tessDataDir, CancellationToken ct) - { - string tempDir = Path.Combine(Path.GetTempPath(), "frypdf_ocr_" + Guid.NewGuid().ToString("N")); - Directory.CreateDirectory(tempDir); - - string imagePath = Path.Combine(tempDir, "input.png"); - string outputBase = Path.Combine(tempDir, "output"); - string tsvPath = outputBase + ".tsv"; - - try - { - File.WriteAllBytes(imagePath, imageBytes); - - // Locate tesseract executable - string? tesseractExe = FindTesseractExecutable(); - if (string.IsNullOrEmpty(tesseractExe)) - { - return new OcrResult - { - Success = false, - ErrorMessage = "Tesseract executable was not found on the system PATH. Use OS Native OCR (Apple Vision / Windows Media) for zero-dependency OCR.", - EngineUsed = "Tesseract" - }; - } - - var startInfo = new ProcessStartInfo - { - FileName = tesseractExe, - Arguments = $"\"{imagePath}\" \"{outputBase}\" -l {language} --tessdata-dir \"{tessDataDir}\" tsv", - RedirectStandardOutput = true, - RedirectStandardError = true, - UseShellExecute = false, - CreateNoWindow = true - }; - - using var process = Process.Start(startInfo); - if (process == null) - { - return new OcrResult { Success = false, ErrorMessage = "Failed to launch Tesseract process." }; - } - - process.WaitForExit(30000); - - if (!File.Exists(tsvPath)) - { - string err = process.StandardError.ReadToEnd(); - return new OcrResult { Success = false, ErrorMessage = $"Tesseract did not produce output: {err}" }; - } - - return ParseTsvOutput(tsvPath, imageBytes); - } - catch (Exception ex) - { - return new OcrResult { Success = false, ErrorMessage = $"Tesseract execution error: {ex.Message}" }; - } - finally - { - try { Directory.Delete(tempDir, recursive: true); } catch { } - } - } - - private static string? FindTesseractExecutable() - { - string[] candidates = OperatingSystem.IsWindows() - ? new[] { "tesseract.exe", @"C:\Program Files\Tesseract-OCR\tesseract.exe", @"C:\Program Files (x86)\Tesseract-OCR\tesseract.exe" } - : new[] { "tesseract", "/opt/homebrew/bin/tesseract", "/usr/local/bin/tesseract", "/usr/bin/tesseract" }; - - foreach (var candidate in candidates) - { - if (File.Exists(candidate)) return candidate; - } - - // Try 'which' / 'where' - try - { - var psi = new ProcessStartInfo - { - FileName = OperatingSystem.IsWindows() ? "where" : "which", - Arguments = "tesseract", - RedirectStandardOutput = true, - UseShellExecute = false, - CreateNoWindow = true - }; - using var p = Process.Start(psi); - if (p != null) - { - string path = p.StandardOutput.ReadLine()?.Trim() ?? ""; - p.WaitForExit(2000); - if (File.Exists(path)) return path; - } - } - catch { } - - return null; - } - - private static OcrResult ParseTsvOutput(string tsvPath, byte[] imageBytes) - { - var lines = new List(); - var words = new List(); - var fullText = new StringBuilder(); - - // Approximate image dimensions or default 1000x1000 - double imgWidth = 1000; - double imgHeight = 1000; - - string[] tsvLines = File.ReadAllLines(tsvPath); - if (tsvLines.Length <= 1) - { - return new OcrResult { Success = true, FullText = string.Empty, Lines = lines, Words = words }; - } - - // TSV format: level, page_num, block_num, par_num, line_num, word_num, left, top, width, height, conf, text - // Header is line 0 - OcrLineItem? currentLine = null; - int lastLineNum = -1; - - for (int i = 1; i < tsvLines.Length; i++) - { - string line = tsvLines[i]; - string[] cols = line.Split('\t'); - if (cols.Length < 12) continue; - - int level = int.TryParse(cols[0], out var lv) ? lv : 0; - if (level == 1) // Page level - { - if (double.TryParse(cols[8], NumberStyles.Any, CultureInfo.InvariantCulture, out var pw) && pw > 0) - imgWidth = pw; - if (double.TryParse(cols[9], NumberStyles.Any, CultureInfo.InvariantCulture, out var ph) && ph > 0) - imgHeight = ph; - continue; - } - - if (level != 5) continue; // Word level - - string text = cols[11].Trim(); - if (string.IsNullOrEmpty(text)) continue; - - double left = double.TryParse(cols[6], NumberStyles.Any, CultureInfo.InvariantCulture, out var l) ? l : 0; - double top = double.TryParse(cols[7], NumberStyles.Any, CultureInfo.InvariantCulture, out var t) ? t : 0; - double width = double.TryParse(cols[8], NumberStyles.Any, CultureInfo.InvariantCulture, out var w) ? w : 0; - double height = double.TryParse(cols[9], NumberStyles.Any, CultureInfo.InvariantCulture, out var h) ? h : 0; - float conf = float.TryParse(cols[10], NumberStyles.Any, CultureInfo.InvariantCulture, out var c) ? c / 100f : 1.0f; - int lineNum = int.TryParse(cols[4], out var ln) ? ln : 0; - - var normBox = new OcrBoundingBox(left / imgWidth, top / imgHeight, width / imgWidth, height / imgHeight); - var wordItem = new OcrWordItem - { - Text = text, - NormalizedBounds = normBox, - Confidence = conf - }; - - words.Add(wordItem); - - if (currentLine == null || lineNum != lastLineNum) - { - currentLine = new OcrLineItem - { - Text = text, - NormalizedBounds = normBox - }; - currentLine.Words.Add(wordItem); - lines.Add(currentLine); - lastLineNum = lineNum; - } - else - { - currentLine.Text += " " + text; - currentLine.Words.Add(wordItem); - // Union bounding box - double nx = Math.Min(currentLine.NormalizedBounds.X, normBox.X); - double ny = Math.Min(currentLine.NormalizedBounds.Y, normBox.Y); - double nr = Math.Max(currentLine.NormalizedBounds.Right, normBox.Right); - double nb = Math.Max(currentLine.NormalizedBounds.Bottom, normBox.Bottom); - currentLine.NormalizedBounds = new OcrBoundingBox(nx, ny, nr - nx, nb - ny); - } - - fullText.Append(text).Append(' '); - } - - return new OcrResult - { - Success = true, - FullText = fullText.ToString().Trim(), - Lines = lines, - Words = words, - EngineUsed = "Tesseract OCR" - }; - } -} diff --git a/src/PdfEditorApp/Services/Ocr/WindowsMediaOcrEngine.cs b/src/PdfEditorApp/Services/Ocr/WindowsMediaOcrEngine.cs deleted file mode 100644 index 656d4c8..0000000 --- a/src/PdfEditorApp/Services/Ocr/WindowsMediaOcrEngine.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Threading; -using System.Threading.Tasks; -using PdfEditorApp.Core.Models; - -namespace PdfEditorApp.Services.Ocr; - -/// -/// Hardware-accelerated native Windows OCR engine utilizing Windows 10/11 WinRT -/// Windows.Media.Ocr.OcrEngine. Requires zero external downloads on Windows systems. -/// -public class WindowsMediaOcrEngine : IOcrEngine -{ - public string EngineName => "Windows Media OCR"; - public OcrEngineType EngineType => OcrEngineType.OsNative; - public bool IsAvailable => OperatingSystem.IsWindows(); - - public async Task RecognizeTextAsync(byte[] imageBytes, string language = "eng", CancellationToken ct = default) - { - if (!IsAvailable) - { - return new OcrResult - { - Success = false, - ErrorMessage = "Windows Media OCR is only available on Windows 10/11." - }; - } - - return await Task.Run(() => - { - // Windows OCR dynamic invocation or fallback - return new OcrResult - { - Success = false, - ErrorMessage = "Windows Media OCR initialized." - }; - }, ct); - } -} diff --git a/src/PdfEditorApp/Services/Overlays/OverlayRegistry.cs b/src/PdfEditorApp/Services/Overlays/OverlayRegistry.cs deleted file mode 100644 index 1564f4e..0000000 --- a/src/PdfEditorApp/Services/Overlays/OverlayRegistry.cs +++ /dev/null @@ -1,240 +0,0 @@ -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Linq; -using Avalonia.Threading; -using PdfEditorApp.Core.Plugins.Descriptors; -using PdfEditorApp.ViewModels; - -namespace PdfEditorApp.Services.Overlays; - -/// -/// Thread-safe registry and lifecycle manager for floating plugins targeting the 'shell.overlay' slot. -/// -public sealed class OverlayRegistry : IOverlayRegistry -{ - private readonly ConcurrentDictionary _descriptors = new(StringComparer.OrdinalIgnoreCase); - private readonly ConcurrentDictionary _activeInstances = new(StringComparer.OrdinalIgnoreCase); - private readonly IServiceProvider _serviceProvider; - - public event Action? RegistryChanged; - public event Action? ActiveOverlaysChanged; - - public ObservableCollection ActiveOverlays { get; } = new(); - - public OverlayRegistry(IServiceProvider serviceProvider) - { - _serviceProvider = serviceProvider ?? throw new ArgumentNullException(nameof(serviceProvider)); - } - - public IDisposable RegisterOverlay(OverlayDescriptor descriptor) - { - ArgumentNullException.ThrowIfNull(descriptor); - _descriptors[descriptor.Id] = descriptor; - - if (_activeInstances.TryGetValue(descriptor.Id, out var existingInstance)) - { - try - { - var newContent = descriptor.ViewFactory != null - ? descriptor.ViewFactory(_serviceProvider) - : (descriptor.ViewType != null ? Activator.CreateInstance(descriptor.ViewType) : null); - - RunOnUIThread(() => - { - existingInstance.Content = newContent; - }); - } - catch (Exception ex) - { - System.Diagnostics.Debug.WriteLine($"[OverlayRegistry] Error refreshing view for {descriptor.Id}: {ex.Message}"); - } - } - - RegistryChanged?.Invoke(); - - return new UnregisterDisposable(() => - { - UnregisterOverlay(descriptor.Id); - }); - } - - public bool UnregisterOverlay(string overlayId) - { - if (_descriptors.TryRemove(overlayId, out _)) - { - HideOverlay(overlayId); - RegistryChanged?.Invoke(); - return true; - } - return false; - } - - public OverlayDescriptor? GetOverlay(string overlayId) - { - if (_descriptors.TryGetValue(overlayId, out var descriptor)) - { - return descriptor; - } - - if (!overlayId.StartsWith("frypdf.overlay.", StringComparison.OrdinalIgnoreCase)) - { - if (_descriptors.TryGetValue($"frypdf.overlay.{overlayId}", out descriptor)) - { - return descriptor; - } - } - - return null; - } - - public IReadOnlyList GetAllOverlays() - { - return _descriptors.Values.OrderBy(d => d.Title).ToList(); - } - - public void ShowOverlay(string overlayId) - { - var desc = GetOverlay(overlayId); - if (desc == null) return; - - if (_activeInstances.TryGetValue(desc.Id, out var existingInstance)) - { - RunOnUIThread(() => - { - if (existingInstance.Content == null) - { - existingInstance.Content = desc.ViewFactory != null - ? desc.ViewFactory(_serviceProvider) - : (desc.ViewType != null ? Activator.CreateInstance(desc.ViewType) : null); - } - existingInstance.IsVisible = true; - existingInstance.IsMinimized = false; - if (!ActiveOverlays.Contains(existingInstance)) - { - ActiveOverlays.Add(existingInstance); - } - ActiveOverlaysChanged?.Invoke(); - }); - return; - } - - object? content = null; - if (desc.ViewFactory != null) - { - try - { - content = desc.ViewFactory(_serviceProvider); - } - catch (Exception ex) - { - System.Diagnostics.Debug.WriteLine($"[OverlayRegistry] Error creating view for {desc.Id}: {ex.Message}"); - } - } - else if (desc.ViewType != null) - { - try - { - content = Activator.CreateInstance(desc.ViewType); - } - catch (Exception ex) - { - System.Diagnostics.Debug.WriteLine($"[OverlayRegistry] Error instantiating ViewType {desc.ViewType}: {ex.Message}"); - } - } - - var instance = new OverlayInstanceViewModel(desc, inst => - { - HideOverlay(inst.Id); - }) - { - Content = content, - X = desc.InitialX ?? 0, - Y = desc.InitialY ?? 0, - IsVisible = true, - IsMinimized = false - }; - - if (_activeInstances.TryAdd(desc.Id, instance)) - { - RunOnUIThread(() => - { - if (!ActiveOverlays.Contains(instance)) - { - ActiveOverlays.Add(instance); - } - ActiveOverlaysChanged?.Invoke(); - }); - } - } - - public void HideOverlay(string overlayId) - { - var desc = GetOverlay(overlayId); - var targetId = desc?.Id ?? overlayId; - - if (_activeInstances.TryRemove(targetId, out var instance)) - { - RunOnUIThread(() => - { - instance.IsVisible = false; - ActiveOverlays.Remove(instance); - ActiveOverlaysChanged?.Invoke(); - }); - } - } - - private static void RunOnUIThread(Action action) - { - if (Dispatcher.UIThread.CheckAccess()) - { - action(); - return; - } - - if (Avalonia.Application.Current?.ApplicationLifetime is Avalonia.Controls.ApplicationLifetimes.IClassicDesktopStyleApplicationLifetime) - { - Dispatcher.UIThread.Post(action); - } - else - { - action(); - } - } - - public void ToggleOverlay(string overlayId) - { - if (IsOverlayVisible(overlayId)) - { - HideOverlay(overlayId); - } - else - { - ShowOverlay(overlayId); - } - } - - public bool IsOverlayVisible(string overlayId) - { - var desc = GetOverlay(overlayId); - var targetId = desc?.Id ?? overlayId; - return _activeInstances.TryGetValue(targetId, out var inst) && inst.IsVisible; - } - - private sealed class UnregisterDisposable : IDisposable - { - private Action? _action; - - public UnregisterDisposable(Action action) - { - _action = action; - } - - public void Dispose() - { - var action = System.Threading.Interlocked.Exchange(ref _action, null); - action?.Invoke(); - } - } -} diff --git a/src/PdfEditorApp/Services/PageOrganizerService.cs b/src/PdfEditorApp/Services/PageOrganizerService.cs deleted file mode 100644 index 9655a27..0000000 --- a/src/PdfEditorApp/Services/PageOrganizerService.cs +++ /dev/null @@ -1,241 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Models; - -namespace PdfEditorApp.Services; - -public enum PageFilterTarget -{ - All, - EvenPages, - OddPages, - LandscapePages, - PortraitPages -} - -public interface IPageOrganizerService -{ - List SplitEveryNPages(PdfDocumentModel doc, int pagesPerDoc); - List SplitByRanges(PdfDocumentModel doc, string rangeExpression); - PdfDocumentModel ExtractPages(PdfDocumentModel doc, IEnumerable pageIndexes, string? newTitle = null); - PdfDocumentModel MergeDocuments(IEnumerable docs, string mergedTitle); - int BatchRotatePages(PdfDocumentModel doc, PageFilterTarget target, int angleDegrees); - List ParsePageRanges(string rangeExpression, int totalPages); -} - -public class PageOrganizerService : IPageOrganizerService -{ - public List SplitEveryNPages(PdfDocumentModel doc, int pagesPerDoc) - { - if (doc.Pages.Count == 0) return new List(); - int interval = Math.Max(1, pagesPerDoc); - var result = new List(); - - int totalPages = doc.Pages.Count; - int partIndex = 1; - - for (int i = 0; i < totalPages; i += interval) - { - int count = Math.Min(interval, totalPages - i); - var partDoc = new PdfDocumentModel - { - Title = $"{System.IO.Path.GetFileNameWithoutExtension(doc.Title)}_Part{partIndex}.pdf", - Author = doc.Author, - Subject = $"{doc.Subject} (Part {partIndex})", - Keywords = doc.Keywords, - Creator = string.IsNullOrWhiteSpace(doc.Creator) ? "FryPDF" : doc.Creator, - Producer = string.IsNullOrWhiteSpace(doc.Producer) ? "codefrydev.in" : doc.Producer, - CreatedDate = doc.CreatedDate, - SecuritySettings = doc.SecuritySettings - }; - - for (int j = 0; j < count; j++) - { - var page = doc.Pages[i + j]; - var clonedPage = (PdfPageModel)page.Clone(); - clonedPage.PageNumber = j + 1; - partDoc.Pages.Add(clonedPage); - } - - result.Add(partDoc); - partIndex++; - } - - return result; - } - - public List SplitByRanges(PdfDocumentModel doc, string rangeExpression) - { - var result = new List(); - if (doc.Pages.Count == 0 || string.IsNullOrWhiteSpace(rangeExpression)) return result; - - var parts = rangeExpression.Split(new[] { ',', ';' }, StringSplitOptions.RemoveEmptyEntries); - int partIndex = 1; - - foreach (var part in parts) - { - var pageIndexes = ParseSingleRange(part.Trim(), doc.Pages.Count); - if (pageIndexes.Count == 0) continue; - - var partDoc = new PdfDocumentModel - { - Title = $"{System.IO.Path.GetFileNameWithoutExtension(doc.Title)}_Range_{part.Trim().Replace(' ', '_')}.pdf", - Author = doc.Author, - Subject = $"{doc.Subject} (Pages {part.Trim()})", - Keywords = doc.Keywords, - Creator = string.IsNullOrWhiteSpace(doc.Creator) ? "FryPDF" : doc.Creator, - Producer = string.IsNullOrWhiteSpace(doc.Producer) ? "codefrydev.in" : doc.Producer, - CreatedDate = doc.CreatedDate - }; - - int pageNum = 1; - foreach (int pIdx in pageIndexes) - { - var page = doc.Pages[pIdx]; - var clonedPage = (PdfPageModel)page.Clone(); - clonedPage.PageNumber = pageNum++; - partDoc.Pages.Add(clonedPage); - } - - result.Add(partDoc); - partIndex++; - } - - return result; - } - - public PdfDocumentModel ExtractPages(PdfDocumentModel doc, IEnumerable pageIndexes, string? newTitle = null) - { - var extractedDoc = new PdfDocumentModel - { - Title = newTitle ?? $"{System.IO.Path.GetFileNameWithoutExtension(doc.Title)}_Extracted.pdf", - Author = doc.Author, - Subject = $"Extracted pages from {doc.Title}", - Keywords = doc.Keywords, - Creator = string.IsNullOrWhiteSpace(doc.Creator) ? "FryPDF" : doc.Creator, - Producer = string.IsNullOrWhiteSpace(doc.Producer) ? "codefrydev.in" : doc.Producer, - CreatedDate = DateTime.Now, - SecuritySettings = doc.SecuritySettings - }; - - int pageNum = 1; - foreach (int pIdx in pageIndexes) - { - if (pIdx >= 0 && pIdx < doc.Pages.Count) - { - var page = doc.Pages[pIdx]; - var clonedPage = (PdfPageModel)page.Clone(); - clonedPage.PageNumber = pageNum++; - extractedDoc.Pages.Add(clonedPage); - } - } - - return extractedDoc; - } - - public PdfDocumentModel MergeDocuments(IEnumerable docs, string mergedTitle) - { - var mergedDoc = new PdfDocumentModel - { - Title = mergedTitle, - Creator = "FryPDF", - Producer = "codefrydev.in", - CreatedDate = DateTime.Now - }; - - int pageNum = 1; - foreach (var doc in docs) - { - if (string.IsNullOrWhiteSpace(mergedDoc.Author) && !string.IsNullOrWhiteSpace(doc.Author)) - { - mergedDoc.Author = doc.Author; - } - - foreach (var page in doc.Pages) - { - var clonedPage = (PdfPageModel)page.Clone(); - clonedPage.PageNumber = pageNum++; - mergedDoc.Pages.Add(clonedPage); - } - } - - return mergedDoc; - } - - public int BatchRotatePages(PdfDocumentModel doc, PageFilterTarget target, int angleDegrees) - { - int count = 0; - for (int i = 0; i < doc.Pages.Count; i++) - { - int pageNum = i + 1; - var page = doc.Pages[i]; - - bool shouldRotate = target switch - { - PageFilterTarget.All => true, - PageFilterTarget.EvenPages => (pageNum % 2 == 0), - PageFilterTarget.OddPages => (pageNum % 2 != 0), - PageFilterTarget.LandscapePages => page.Width > page.Height, - PageFilterTarget.PortraitPages => page.Height >= page.Width, - _ => true - }; - - if (shouldRotate) - { - page.RotationAngle = (page.RotationAngle + angleDegrees + 360) % 360; - count++; - } - } - return count; - } - - public List ParsePageRanges(string rangeExpression, int totalPages) - { - var result = new HashSet(); - if (string.IsNullOrWhiteSpace(rangeExpression) || totalPages <= 0) return result.ToList(); - - var parts = rangeExpression.Split(new[] { ',', ';' }, StringSplitOptions.RemoveEmptyEntries); - foreach (var part in parts) - { - foreach (var idx in ParseSingleRange(part.Trim(), totalPages)) - { - result.Add(idx); - } - } - - return result.OrderBy(i => i).ToList(); - } - - private static List ParseSingleRange(string range, int totalPages) - { - var list = new List(); - if (string.IsNullOrWhiteSpace(range)) return list; - - if (range.Contains('-')) - { - var bounds = range.Split('-'); - if (bounds.Length == 2 && - int.TryParse(bounds[0].Trim(), out int start) && - int.TryParse(bounds[1].Trim(), out int end)) - { - int min = Math.Clamp(Math.Min(start, end), 1, totalPages); - int max = Math.Clamp(Math.Max(start, end), 1, totalPages); - for (int i = min; i <= max; i++) - { - list.Add(i - 1); - } - } - } - else if (int.TryParse(range.Trim(), out int single)) - { - if (single >= 1 && single <= totalPages) - { - list.Add(single - 1); - } - } - - return list; - } -} diff --git a/src/PdfEditorApp/Services/Palette/CommandPaletteRegistry.cs b/src/PdfEditorApp/Services/Palette/CommandPaletteRegistry.cs deleted file mode 100644 index 545b317..0000000 --- a/src/PdfEditorApp/Services/Palette/CommandPaletteRegistry.cs +++ /dev/null @@ -1,64 +0,0 @@ -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Linq; -using PdfEditorApp.Core.Plugins.Descriptors; - -namespace PdfEditorApp.Services.Palette; - -/// -/// Thread-safe in-memory registry for discovering, searching, and dispatching Command Palette commands. -/// -public class CommandPaletteRegistry : ICommandPaletteRegistry -{ - private readonly ConcurrentDictionary _commands = new(StringComparer.OrdinalIgnoreCase); - - public event Action? RegistryChanged; - - public IDisposable RegisterCommand(CommandPaletteDescriptor descriptor) - { - ArgumentNullException.ThrowIfNull(descriptor); - ArgumentException.ThrowIfNullOrWhiteSpace(descriptor.Id); - - _commands[descriptor.Id] = descriptor; - RegistryChanged?.Invoke(); - - return new DisposableAction(() => - { - _commands.TryRemove(descriptor.Id, out _); - RegistryChanged?.Invoke(); - }); - } - - public bool UnregisterCommand(string commandId) - { - if (string.IsNullOrWhiteSpace(commandId)) return false; - var removed = _commands.TryRemove(commandId, out _); - if (removed) - { - RegistryChanged?.Invoke(); - } - return removed; - } - - public IReadOnlyList GetAllCommands() - { - return _commands.Values.OrderBy(c => c.Order).ThenBy(c => c.Title).ToList(); - } - - private sealed class DisposableAction : IDisposable - { - private Action? _action; - - public DisposableAction(Action action) - { - _action = action; - } - - public void Dispose() - { - var act = System.Threading.Interlocked.Exchange(ref _action, null); - act?.Invoke(); - } - } -} diff --git a/src/PdfEditorApp/Services/PdfDocumentOperationsService.cs b/src/PdfEditorApp/Services/PdfDocumentOperationsService.cs deleted file mode 100644 index 673f08b..0000000 --- a/src/PdfEditorApp/Services/PdfDocumentOperationsService.cs +++ /dev/null @@ -1,266 +0,0 @@ -using PdfEditorApp.Services.Tools.Core; -using PdfEditorApp.Services.Tools.Organize; -using PdfEditorApp.Services.Tools.Security; -using PdfEditorApp.Services.Tools.Conversion; -using PdfEditorApp.Services.Tools.Intelligence; -using System; -using System.Collections.Generic; -using System.IO; -using System.Text; -using System.Threading; -using System.Threading.Tasks; -using PdfEditorApp.Models; -using PdfEditorApp.Services.Tools; - -namespace PdfEditorApp.Services; - -public class PdfDocumentOperationsService : IPdfDocumentOperationsService -{ - public IPdfToolRegistry ToolRegistry { get; } - public IPdfPageService PageService { get; } - public IPdfOptimizationService OptimizationService { get; } - public IPdfSecurityService SecurityService { get; } - public IPdfConversionService ConversionService { get; } - public IPdfOcrService OcrService { get; } - public IPdfFormService FormService { get; } - public IAiDocumentService AiService { get; } - public IDocumentTranslationService TranslationService { get; } - public IPdfWorkflowEngine WorkflowEngine { get; } - - public PdfDocumentOperationsService() - : this( - new PdfToolRegistry(), - new PdfPageService(), - new PdfOptimizationService(), - new PdfSecurityService(), - new PdfConversionService(), - new PdfOcrService(), - new PdfFormService(), - new AiDocumentService(), - new DocumentTranslationService(), - new PdfWorkflowEngine()) - { - } - - public PdfDocumentOperationsService( - IPdfToolRegistry toolRegistry, - IPdfPageService pageService, - IPdfOptimizationService optimizationService, - IPdfSecurityService securityService, - IPdfConversionService conversionService, - IPdfOcrService ocrService, - IPdfFormService formService, - IAiDocumentService aiService, - IDocumentTranslationService translationService, - IPdfWorkflowEngine workflowEngine, - PdfEditorApp.Core.Plugins.IFryPluginContext? pluginContext = null) - { - ToolRegistry = toolRegistry; - PageService = pageService; - OptimizationService = optimizationService; - SecurityService = securityService; - ConversionService = conversionService; - OcrService = ocrService; - FormService = formService; - AiService = aiService; - TranslationService = translationService; - WorkflowEngine = workflowEngine; - _pluginContext = pluginContext; - } - - private readonly PdfEditorApp.Core.Plugins.IFryPluginContext? _pluginContext; - - public async Task ExecuteToolAsync(PdfToolId toolId, object options, IProgress? progress = null, CancellationToken ct = default) - { - if (_pluginContext != null) - { - var pipelineContext = new PdfEditorApp.Core.Plugins.Pipelines.PdfToolExecutionPipelineContext(toolId.ToString(), options, progress, ct); - await _pluginContext.ExecuteWaterfallAsync("tool:execute", pipelineContext, async () => - { - pipelineContext.Result = await ExecuteToolCoreAsync(toolId, pipelineContext.Options, progress, ct); - }); - - return pipelineContext.Result as ToolExecutionResult ?? new ToolExecutionResult - { - Success = false, - ErrorMessage = "Tool execution pipeline did not produce a result." - }; - } - - return await ExecuteToolCoreAsync(toolId, options, progress, ct); - } - - private async Task ExecuteToolCoreAsync(PdfToolId toolId, object options, IProgress? progress = null, CancellationToken ct = default) - { - try - { - switch (toolId) - { - case PdfToolId.MergePdf when options is MergeToolOptions mergeOpts: - return await PageService.MergePdfAsync(mergeOpts, progress, ct); - - case PdfToolId.SplitPdf when options is SplitToolOptions splitOpts: - return await PageService.SplitPdfAsync(splitOpts, progress, ct); - - case PdfToolId.RotatePdf when options is RotateToolOptions rotateOpts: - return await PageService.RotatePdfAsync(rotateOpts, progress, ct); - - case PdfToolId.CropPdf when options is CropToolOptions cropOpts: - return await PageService.CropPdfAsync(cropOpts, progress, ct); - - case PdfToolId.OrganizePdf when options is OrganizeToolOptions orgOpts: - return await PageService.OrganizePdfAsync(orgOpts, progress, ct); - - case PdfToolId.PageNumbers when options is PageNumberToolOptions numOpts: - return await PageService.AddPageNumbersAsync(numOpts, progress, ct); - - case PdfToolId.Watermark when options is WatermarkToolOptions wmOpts: - return await PageService.AddWatermarkAsync(wmOpts, progress, ct); - - case PdfToolId.CompressPdf when options is CompressToolOptions compOpts: - return await OptimizationService.CompressPdfAsync(compOpts, progress, ct); - - case PdfToolId.RepairPdf when options is RepairToolOptions repOpts: - return await OptimizationService.RepairPdfAsync(repOpts, progress, ct); - - case PdfToolId.PdfToPdfA when options is PdfAToolOptions pdfAOpts: - return await OptimizationService.ConvertToPdfAAsync(pdfAOpts, progress, ct); - - case PdfToolId.ProtectPdf when options is SecurityToolOptions secOpts: - return await SecurityService.ProtectPdfAsync(secOpts, progress, ct); - - case PdfToolId.UnlockPdf when options is UnlockToolOptions unlOpts: - return await SecurityService.UnlockPdfAsync(unlOpts, progress, ct); - - case PdfToolId.SignPdf when options is SignToolOptions signOpts: - return await SecurityService.SignPdfAsync(signOpts, progress, ct); - - case PdfToolId.RedactPdf when options is RedactionToolOptions redOpts: - return await SecurityService.RedactPdfAsync(redOpts, progress, ct); - - case PdfToolId.PdfToWord when options is WordConversionOptions wordOpts: - return await ConversionService.ConvertPdfToWordAsync(wordOpts, progress, ct); - - case PdfToolId.PdfToExcel when options is ExcelConversionOptions excelOpts: - return await ConversionService.ConvertPdfToExcelAsync(excelOpts, progress, ct); - - case PdfToolId.PdfToPowerPoint when options is PptxConversionOptions pptOpts: - return await ConversionService.ConvertPdfToPowerPointAsync(pptOpts, progress, ct); - - case PdfToolId.WordToPdf when options is OfficeToPdfOptions docxOpts: - return await ConversionService.ConvertWordToPdfAsync(docxOpts, progress, ct); - - case PdfToolId.ExcelToPdf when options is OfficeToPdfOptions xlsxOpts: - return await ConversionService.ConvertExcelToPdfAsync(xlsxOpts, progress, ct); - - case PdfToolId.PowerPointToPdf when options is OfficeToPdfOptions pptxOpts: - return await ConversionService.ConvertPowerPointToPdfAsync(pptxOpts, progress, ct); - - case PdfToolId.PdfToJpg when options is ImageConversionOptions imgOpts: - return await ConversionService.ConvertPdfToImagesAsync(imgOpts, progress, ct); - - case PdfToolId.JpgToPdf when options is ImagesToPdfOptions imgsToPdfOpts: - return await ConversionService.ConvertImagesToPdfAsync(imgsToPdfOpts, progress, ct); - - case PdfToolId.HtmlToPdf when options is HtmlToPdfOptions htmlOpts: - return await ConversionService.ConvertHtmlToPdfAsync(htmlOpts, progress, ct); - - case PdfToolId.PdfToMarkdown when options is MarkdownConversionOptions mdOpts: - return await ConversionService.ConvertPdfToMarkdownAsync(mdOpts, progress, ct); - - case PdfToolId.OcrPdf when options is OcrToolOptions ocrOpts: - return await OcrService.OcrPdfAsync(ocrOpts, progress, ct); - - case PdfToolId.ScanToPdf when options is ScanToolOptions scanOpts: - return await OcrService.ScanToPdfAsync(scanOpts, progress, ct); - - case PdfToolId.PdfForms when options is FormToolOptions formOpts: - return await FormService.ProcessPdfFormsAsync(formOpts, progress, ct); - - case PdfToolId.AiSummarizer when options is AiSummaryOptions aiOpts: - return await AiService.SummarizePdfAsync(aiOpts, progress, ct); - - case PdfToolId.TranslatePdf when options is TranslationOptions transOpts: - return await TranslationService.TranslatePdfAsync(transOpts, progress, ct); - - case PdfToolId.ComparePdf when options is CompareToolOptions compOpts: - { - if (!File.Exists(compOpts.DocumentAPath) || !File.Exists(compOpts.DocumentBPath)) - return new ToolExecutionResult { Success = false, ErrorMessage = "One or both comparison documents do not exist." }; - - var importService = new PdfImportService(); - var compareService = new DocumentCompareService(); - - var docA = await importService.ImportPdfAsync(compOpts.DocumentAPath); - ct.ThrowIfCancellationRequested(); - progress?.Report(40.0); - var docB = await importService.ImportPdfAsync(compOpts.DocumentBPath); - ct.ThrowIfCancellationRequested(); - progress?.Report(70.0); - - var report = await compareService.CompareDocumentsAsync(docA, docB, ct); - - string outDir = Path.GetDirectoryName(compOpts.DocumentBPath) ?? Path.GetTempPath(); - string reportPath = Path.Combine(outDir, $"{Path.GetFileNameWithoutExtension(compOpts.DocumentBPath)}_comparison_report.txt"); - - var sb = new StringBuilder(); - sb.AppendLine("Document Comparison Report"); - sb.AppendLine($"Base document: {report.BaseDocumentTitle} ({report.BasePageCount} pages)"); - sb.AppendLine($"Compared document: {report.ComparedDocumentTitle} ({report.ComparedPageCount} pages)"); - sb.AppendLine($"Generated: {report.ComparisonTimestamp:u}"); - sb.AppendLine(); - sb.AppendLine($"Total differences: {report.TotalDifferencesCount} (Added: {report.AdditionsCount}, Removed: {report.DeletionsCount}, Modified: {report.ModificationsCount})"); - sb.AppendLine(); - foreach (var diff in report.Differences) - { - sb.AppendLine($"[Page {diff.PageNumber}] {diff.DiffType}: {diff.Description}"); - if (!string.IsNullOrEmpty(diff.OldValue) || !string.IsNullOrEmpty(diff.NewValue)) - { - sb.AppendLine($" - Was: {diff.OldValue}"); - sb.AppendLine($" + Now: {diff.NewValue}"); - } - } - - await File.WriteAllTextAsync(reportPath, sb.ToString(), ct); - progress?.Report(100.0); - - return new ToolExecutionResult - { - Success = true, - OutputFilePath = reportPath, - OutputFiles = new List { reportPath }, - Message = report.TotalDifferencesCount == 0 - ? $"No differences found between '{Path.GetFileName(compOpts.DocumentAPath)}' and '{Path.GetFileName(compOpts.DocumentBPath)}'." - : $"Found {report.TotalDifferencesCount} difference(s) between the two documents ({report.AdditionsCount} added, {report.DeletionsCount} removed, {report.ModificationsCount} modified). Report saved to {Path.GetFileName(reportPath)}.", - ExtraData = new Dictionary { ["ComparisonReport"] = report } - }; - } - - case PdfToolId.WorkflowBuilder when options is WorkflowDefinition wfDef: - return await WorkflowEngine.ExecuteWorkflowAsync(wfDef, new string[0], null, ct); - - default: - return new ToolExecutionResult - { - Success = false, - ErrorMessage = $"No execution handler mapped for tool '{toolId}' with options '{options?.GetType().Name}'." - }; - } - } - catch (OperationCanceledException) - { - // Let cancellation propagate so PdfToolViewModelBase's dedicated - // OperationCanceledException handler can show a neutral "cancelled" state - // instead of the generic failure path. - throw; - } - catch (Exception ex) - { - return new ToolExecutionResult - { - Success = false, - ErrorMessage = $"An error occurred during execution: {ex.Message}" - }; - } - } -} diff --git a/src/PdfEditorApp/Services/PdfExportService.cs b/src/PdfEditorApp/Services/PdfExportService.cs deleted file mode 100644 index 451d0ab..0000000 --- a/src/PdfEditorApp/Services/PdfExportService.cs +++ /dev/null @@ -1,897 +0,0 @@ -using System; -using System.IO; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using QuestPDF.Fluent; -using QuestPDF.Helpers; -using QuestPDF.Infrastructure; -using QRCoder; -using PdfEditorApp.Core.Analysis; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; -using PdfEditorApp.Core.Utils; -using PdfEditorApp.Models; -using PdfEditorApp.Core.Plugins; -using PdfEditorApp.Core.Plugins.Pipelines; -using PdfEditorApp.Services.MathEngine; -using PdfEditorApp.Services.Typography; - -namespace PdfEditorApp.Services; - -public class PdfExportService : IPdfExportService -{ - private readonly IFryPluginContext? _pluginContext; - - public PdfExportService(IFryPluginContext? pluginContext = null) - { - _pluginContext = pluginContext; - } - - static PdfExportService() - { - RegisterEmbeddedFonts(); - } - - private static void RegisterEmbeddedFonts() - { - try - { - // 1. User on-demand font cache directory - string userFontDir = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "FryPDF", "Fonts"); - if (Directory.Exists(userFontDir)) - { - foreach (var fontFile in Directory.GetFiles(userFontDir, "*.*")) - { - string ext = Path.GetExtension(fontFile).ToLowerInvariant(); - if (ext == ".ttf" || ext == ".otf") - { - try - { - using var stream = File.OpenRead(fontFile); - QuestPDF.Drawing.FontManager.RegisterFont(stream); - } - catch { } - } - } - } - - // 2. Application bundled fonts - string[] searchPaths = - { - Path.Combine(AppContext.BaseDirectory, "Assets", "Fonts"), - Path.Combine(AppContext.BaseDirectory, "..", "..", "..", "Assets", "Fonts"), - Path.Combine(Directory.GetCurrentDirectory(), "src", "PdfEditorApp", "Assets", "Fonts"), - Path.Combine(Directory.GetCurrentDirectory(), "Assets", "Fonts") - }; - - foreach (var basePath in searchPaths) - { - if (Directory.Exists(basePath)) - { - var ttfFiles = Directory.GetFiles(basePath, "*.ttf"); - foreach (var ttf in ttfFiles) - { - try - { - using var stream = File.OpenRead(ttf); - QuestPDF.Drawing.FontManager.RegisterFont(stream); - } - catch { } - } - break; - } - } - } - catch { } - } - - public byte[] GeneratePdfBytes(PdfDocumentModel model) - { - return GeneratePdfBytes(model, null); - } - - public byte[] GeneratePdfBytes(PdfDocumentModel model, IProgress? progress) - { - var context = new PdfExportPipelineContext(model, progress); - - if (_pluginContext != null) - { - _pluginContext.ExecuteWaterfallAsync("document:export", context, () => - { - context.ResultPdfBytes = CompileModelToBytes(context.Document, context.Progress); - return Task.CompletedTask; - }).GetAwaiter().GetResult(); - - return context.ResultPdfBytes ?? CompileModelToBytes(model, progress); - } - - return CompileModelToBytes(model, progress); - } - - private static byte[] CompileModelToBytes(PdfDocumentModel model, IProgress? progress) - { - var document = new QuestPdfDocumentWrapper(model, progress); - byte[] rawPdf = document.GeneratePdf(); - - // If scrub metadata is requested, do not embed internal model - if (model.SecuritySettings.ScrubMetadataOnExport) - { - return rawPdf; - } - - // Embed full lossless FryPDF model metadata for 100% perfect roundtrip re-editing - return FryPdfEmbeddingHelper.EmbedModelInPdfBytes(rawPdf, model); - } - - public async Task ExportToBytesAsync(PdfDocumentModel model, IProgress? progress = null, CancellationToken ct = default) - { - ct.ThrowIfCancellationRequested(); - var context = new PdfExportPipelineContext(model, progress, ct); - - if (_pluginContext != null) - { - await _pluginContext.ExecuteWaterfallAsync("document:export", context, () => - { - context.ResultPdfBytes = CompileModelToBytes(context.Document, context.Progress); - return Task.CompletedTask; - }); - - return context.ResultPdfBytes ?? CompileModelToBytes(model, progress); - } - - return await Task.Run(() => CompileModelToBytes(model, progress), ct); - } - - public async Task ExportToFileAsync(PdfDocumentModel model, string filePath, IProgress? progress = null, CancellationToken ct = default) - { - byte[] bytes = await ExportToBytesAsync(model, progress, ct); - - string tempPath = filePath + ".tmp"; - try - { - await File.WriteAllBytesAsync(tempPath, bytes, ct); - - if (File.Exists(filePath)) - { - File.Replace(tempPath, filePath, null); - } - else - { - File.Move(tempPath, filePath); - } - } - catch - { - try { if (File.Exists(tempPath)) File.Delete(tempPath); } catch { } - throw; - } - } -} - -internal class QuestPdfDocumentWrapper : IDocument -{ - private readonly PdfDocumentModel _model; - private readonly IProgress? _progress; - - public QuestPdfDocumentWrapper(PdfDocumentModel model, IProgress? progress = null) - { - _model = model; - _progress = progress; - } - - public DocumentMetadata GetMetadata() - { - if (_model.SecuritySettings.ScrubMetadataOnExport) - { - return new DocumentMetadata - { - Title = "Document", - Author = "Anonymous", - Subject = "", - CreationDate = new DateTime(2000, 1, 1, 0, 0, 0, DateTimeKind.Utc), - ModifiedDate = new DateTime(2000, 1, 1, 0, 0, 0, DateTimeKind.Utc), - Creator = "FryPDF", - Producer = "codefrydev.in" - }; - } - - return new DocumentMetadata - { - Title = _model.Title, - Author = _model.Author, - Subject = _model.Subject, - Keywords = _model.Keywords, - CreationDate = _model.CreatedDate, - ModifiedDate = _model.ModifiedDate, - Creator = string.IsNullOrWhiteSpace(_model.Creator) ? "FryPDF" : _model.Creator, - Producer = string.IsNullOrWhiteSpace(_model.Producer) ? "codefrydev.in" : _model.Producer - }; - } - - public void Compose(IDocumentContainer container) - { - int totalPages = Math.Max(1, _model.Pages.Count); - int pageIndex = 0; - foreach (var pageModel in _model.Pages) - { - container.Page(page => - { - float pageW = (float)pageModel.Width; - float pageH = (float)pageModel.Height; - - if (pageW <= 0) pageW = 595.28f; // Standard A4 points - if (pageH <= 0) pageH = 841.89f; - - page.Size(new PageSize(pageW, pageH)); - page.Margin(0); - page.PageColor(pageModel.BackgroundColorHex); - page.DefaultTextStyle(x => x.FontFamily("Arial").FontSize(10).FontColor("#201F1E")); - - // Absolute Layout Content via Layers - page.Content().Layers(layers => - { - // Primary Base Layer - layers.PrimaryLayer().Element(c => c.Width(pageW).Height(pageH)); - - // Header Zone (if enabled) - if (pageModel.ShowHeaderFooter && (!string.IsNullOrEmpty(pageModel.HeaderLeft) || !string.IsNullOrEmpty(pageModel.HeaderCenter) || !string.IsNullOrEmpty(pageModel.HeaderRight))) - { - layers.Layer().PaddingLeft(36).PaddingTop(18).Width(pageW - 72).Height(24).Row(row => - { - if (!string.IsNullOrEmpty(pageModel.HeaderLeft)) - row.RelativeItem().Text(pageModel.HeaderLeft).FontSize(8).FontColor(Colors.Grey.Medium); - if (!string.IsNullOrEmpty(pageModel.HeaderCenter)) - row.RelativeItem().AlignCenter().Text(pageModel.HeaderCenter).FontSize(8).FontColor(Colors.Grey.Medium); - if (!string.IsNullOrEmpty(pageModel.HeaderRight)) - row.RelativeItem().AlignRight().Text(pageModel.HeaderRight).FontSize(8).FontColor(Colors.Grey.Medium); - }); - } - - // Watermark (if present) - if (pageModel.Watermark != null && !string.IsNullOrWhiteSpace(pageModel.Watermark.Text)) - { - layers.Layer().AlignCenter().AlignMiddle().Rotate((float)pageModel.Watermark.Angle) - .Text(pageModel.Watermark.Text) - .FontSize((float)pageModel.Watermark.FontSize) - .FontColor(pageModel.Watermark.ColorHex) - .Bold(); - } - - // Elements ordered by ZIndex - var sortedElements = pageModel.Elements - .OrderBy(e => e.ZIndex) - .ThenBy(e => e.Y) - .ThenBy(e => e.X) - .ToList(); - - var redactionBoxes = pageModel.Elements.OfType().ToList(); - - foreach (var element in sortedElements) - { - if (_model.SecuritySettings.RemoveCommentsOnExport && element is PdfStickyNoteElement) - { - continue; - } - - float elX = (float)element.X; - float elY = (float)element.Y; - float elW = (float)Math.Max(1, element.Width); - float elH = (float)Math.Max(1, element.Height); - - // Permanent Redaction Sanitization: Strip underlying text/images completely covered by a redaction box - if (element is PdfTextElement or PdfImageElement) - { - bool isFullyCovered = redactionBoxes.Any(r => - r.X <= elX + 1 && - r.Y <= elY + 1 && - (r.X + r.Width) >= (elX + elW - 1) && - (r.Y + r.Height) >= (elY + elH - 1)); - - if (isFullyCovered) - { - continue; - } - } - - layers.Layer().Element(layerContainer => - { - var c = layerContainer - .PaddingLeft(elX) - .PaddingTop(elY) - .Width(elW) - .Height(elH); - - if (element.Rotation != 0) - { - c = c.Rotate((float)element.Rotation); - } - - ComposeElement(c, element); - }); - } - - // Footer Zone (if enabled) - if (pageModel.ShowHeaderFooter) - { - layers.Layer().PaddingLeft(36).PaddingTop(pageH - 32).Width(pageW - 72).Height(24).Row(row => - { - row.RelativeItem().Text(pageModel.FooterLeft ?? "CONFIDENTIAL & PROPRIETARY").FontSize(8).FontColor(Colors.Grey.Medium); - if (!string.IsNullOrEmpty(pageModel.FooterCenter)) - { - row.RelativeItem().AlignCenter().Text(pageModel.FooterCenter).FontSize(8).FontColor(Colors.Grey.Medium); - } - row.RelativeItem().AlignRight().Text(text => - { - text.DefaultTextStyle(x => x.FontSize(8).FontColor(Colors.Grey.Medium)); - text.Span("Page "); - text.CurrentPageNumber(); - text.Span(" of "); - text.TotalPages(); - }); - }); - } - }); - }); - - pageIndex++; - _progress?.Report(Math.Min(100.0, pageIndex * 100.0 / totalPages)); - } - } - - private void ComposeElement(IContainer container, PdfElementBase element) - { - switch (element) - { - case PdfTextElement textEl: - ComposeText(container, textEl); - break; - - case PdfShapeElement shapeEl: - ComposeShape(container, shapeEl); - break; - - case PdfDividerElement divEl: - ComposeDivider(container, divEl); - break; - - case PdfTableElement tableEl: - ComposeTable(container, tableEl); - break; - - case PdfChartElement chartEl: - ComposeChart(container, chartEl); - break; - - case PdfImageElement imgEl: - ComposeImage(container, imgEl); - break; - - case PdfQrCodeElement qrEl: - ComposeQrCode(container, qrEl); - break; - - case PdfBarcodeElement barEl: - ComposeBarcode(container, barEl); - break; - - case PdfFormFieldElement formEl: - ComposeFormField(container, formEl); - break; - - case PdfRedactionElement redEl: - container.Background(redEl.FillColorHex).Border((float)redEl.BorderThickness).BorderColor(redEl.BorderColorHex).Padding(4).AlignCenter().AlignMiddle() - .Text(redEl.ShowOverlayText ? redEl.ExemptionCode : "").FontSize(8.5f).Bold().FontColor(redEl.TextColorHex); - break; - - case PdfInkElement inkEl: - ComposeInk(container, inkEl); - break; - - case PdfStickyNoteElement noteEl: - ComposeStickyNote(container, noteEl); - break; - - case PdfMeasurementElement measEl: - container.PaddingVertical(2).Row(mRow => - { - mRow.AutoItem().Text("|").FontSize(9).Bold().FontColor(measEl.StrokeColorHex); - mRow.RelativeItem().BorderBottom((float)measEl.StrokeThickness).BorderColor(measEl.StrokeColorHex).PaddingBottom(2).AlignCenter().Text(measEl.GetFormattedDistance()).FontSize((float)measEl.FontSize).Bold().FontColor(measEl.StrokeColorHex); - mRow.AutoItem().Text("|").FontSize(9).Bold().FontColor(measEl.StrokeColorHex); - }); - break; - - case PdfSvgElement svgEl: - ComposeSvg(container, svgEl); - break; - - case PdfMathElement mathEl: - ComposeMath(container, mathEl); - break; - } - } - - private void ComposeText(IContainer container, PdfTextElement textEl) - { - // For curved/circular typography, outline strokes, drop shadows, double underlines, custom scaling/flipping or baseline shifts, - // render with high-precision vector SVG so all transformations and glyph geometries remain 100% scalable in the PDF. - bool requiresVectorSvg = textEl.ShapeMode != TextShapeMode.Normal || - textEl.HasStroke || - textEl.HasShadow || - textEl.IsDoubleUnderline || - Math.Abs(textEl.ScaleX - 1.0) > 0.01 || - Math.Abs(textEl.ScaleY - 1.0) > 0.01 || - textEl.FlipX || - textEl.FlipY || - Math.Abs(textEl.BaselineShift) > 0.01 || - Math.Abs(textEl.CharacterRotation) > 0.01 || - Math.Abs(textEl.WordSpacing) > 0.01 || - Math.Abs(textEl.ParagraphSpacing) > 0.01 || - textEl.VerticalAlignment != TextVerticalAlignment.Top; - - if (requiresVectorSvg) - { - try - { - string svgMarkup = TextLayoutEngine.GenerateSvgMarkup(textEl); - container.Svg(svgMarkup).FitArea(); - return; - } - catch - { - // Fallback to standard text composition on any unexpected error - } - } - - var target = container; - - if (textEl.CornerRadius > 0) - { - target = target.CornerRadius((float)textEl.CornerRadius); - } - - if (textEl.BorderThickness > 0 && textEl.BorderColorHex != "#00000000" && !textEl.BorderColorHex.Equals("Transparent", StringComparison.OrdinalIgnoreCase)) - { - target = target.Border((float)textEl.BorderThickness).BorderColor(textEl.BorderColorHex); - } - - if (textEl.BackgroundColorHex != "#00000000" && !textEl.BackgroundColorHex.Equals("Transparent", StringComparison.OrdinalIgnoreCase)) - { - target = target.Background(textEl.BackgroundColorHex); - } - - target.Padding((float)textEl.Padding).Text(text => - { - if (textEl.Alignment == TextAlignmentMode.Center) text.AlignCenter(); - else if (textEl.Alignment == TextAlignmentMode.Right) text.AlignRight(); - else if (textEl.Alignment == TextAlignmentMode.Justify) text.Justify(); - - if (textEl.Spans != null && textEl.Spans.Count > 0) - { - foreach (var s in textEl.Spans) - { - if (string.IsNullOrEmpty(s.Text)) continue; - - var span = !string.IsNullOrEmpty(s.LinkUrl) - ? text.Hyperlink(s.Text, s.LinkUrl) - : text.Span(s.Text); - - span.FontFamily(s.FontFamily ?? textEl.FontFamily ?? "Arial") - .FontSize((float)(s.FontSize ?? textEl.FontSize)) - .FontColor(s.TextColorHex ?? textEl.TextColorHex); - - if (textEl.LineHeight > 0.1) span.LineHeight((float)textEl.LineHeight); - if (s.IsBold ?? textEl.IsBold) span.Bold(); - if (s.IsItalic ?? textEl.IsItalic) span.Italic(); - if (s.IsUnderline ?? textEl.IsUnderline) span.Underline(); - if (s.IsStrikethrough ?? textEl.IsStrikethrough) span.Strikethrough(); - if (s.Script == TextScriptMode.Superscript) span.Superscript(); - if (s.Script == TextScriptMode.Subscript) span.Subscript(); - } - } - else - { - var span = text.Span(textEl.Text ?? "") - .FontFamily(textEl.FontFamily ?? "Arial") - .FontSize((float)textEl.FontSize) - .FontColor(textEl.TextColorHex); - - if (textEl.LineHeight > 0.1) span.LineHeight((float)textEl.LineHeight); - if (textEl.IsBold) span.Bold(); - if (textEl.IsItalic) span.Italic(); - if (textEl.IsUnderline) span.Underline(); - if (textEl.IsStrikethrough) span.Strikethrough(); - } - }); - } - - private void ComposeShape(IContainer container, PdfShapeElement shapeEl) - { - if (shapeEl.ShapeType == ShapeType.Rectangle && shapeEl.CornerRadius <= 0 && string.IsNullOrEmpty(shapeEl.CustomPathData)) - { - var target = container; - - if (!string.IsNullOrEmpty(shapeEl.FillColorHex) && shapeEl.FillColorHex != "#00000000" && !shapeEl.FillColorHex.Equals("Transparent", StringComparison.OrdinalIgnoreCase)) - { - target = target.Background(shapeEl.FillColorHex); - } - - if (shapeEl.StrokeThickness > 0 && !string.IsNullOrEmpty(shapeEl.StrokeColorHex) && shapeEl.StrokeColorHex != "#00000000" && !shapeEl.StrokeColorHex.Equals("Transparent", StringComparison.OrdinalIgnoreCase)) - { - target = target.Border((float)shapeEl.StrokeThickness).BorderColor(shapeEl.StrokeColorHex); - } - - if (!string.IsNullOrEmpty(shapeEl.Label)) - { - target.Padding(4).AlignCenter().AlignMiddle().Text(shapeEl.Label) - .FontSize((float)shapeEl.LabelFontSize) - .FontColor(shapeEl.LabelColorHex ?? "#201F1E") - .Bold(); - } - return; - } - - try - { - string svgMarkup = SvgShapeHelper.GenerateSvgMarkup(shapeEl); - container.Svg(svgMarkup); - } - catch - { - var target = container; - - if (shapeEl.ShapeType == ShapeType.Circle) - { - target = target.CornerRadius((float)Math.Max(shapeEl.Width, shapeEl.Height) / 2); - } - else if (shapeEl.CornerRadius > 0) - { - target = target.CornerRadius((float)shapeEl.CornerRadius); - } - - if (!string.IsNullOrEmpty(shapeEl.FillColorHex) && shapeEl.FillColorHex != "#00000000" && !shapeEl.FillColorHex.Equals("Transparent", StringComparison.OrdinalIgnoreCase)) - { - target = target.Background(shapeEl.FillColorHex); - } - - if (shapeEl.StrokeThickness > 0 && !string.IsNullOrEmpty(shapeEl.StrokeColorHex) && shapeEl.StrokeColorHex != "#00000000" && !shapeEl.StrokeColorHex.Equals("Transparent", StringComparison.OrdinalIgnoreCase)) - { - target = target.Border((float)shapeEl.StrokeThickness).BorderColor(shapeEl.StrokeColorHex); - } - - if (!string.IsNullOrEmpty(shapeEl.Label)) - { - target.Padding(4).AlignCenter().AlignMiddle().Text(shapeEl.Label) - .FontSize((float)shapeEl.LabelFontSize) - .FontColor(shapeEl.LabelColorHex ?? "#201F1E") - .Bold(); - } - } - } - - private void ComposeDivider(IContainer container, PdfDividerElement divEl) - { - if (divEl.Style == DividerStyle.Straight && divEl.DashStyle == LineDashStyle.Solid) - { - if (divEl.IsVertical) - { - container.AlignCenter().LineVertical((float)divEl.Thickness).LineColor(divEl.ColorHex); - } - else - { - container.AlignMiddle().LineHorizontal((float)divEl.Thickness).LineColor(divEl.ColorHex); - } - return; - } - - try - { - string svgMarkup = SvgShapeHelper.GenerateDividerSvgMarkup(divEl); - container.Svg(svgMarkup).FitArea(); - } - catch - { - if (divEl.IsVertical) - container.AlignCenter().LineVertical((float)divEl.Thickness).LineColor(divEl.ColorHex); - else - container.AlignMiddle().LineHorizontal((float)divEl.Thickness).LineColor(divEl.ColorHex); - } - } - - private void ComposeInk(IContainer container, PdfInkElement inkEl) - { - try - { - string svgMarkup = SvgShapeHelper.GenerateInkSvgMarkup(inkEl); - container.Svg(svgMarkup).FitArea(); - } - catch - { - container.Background(inkEl.StrokeColorHex); - } - } - - private void ComposeTable(IContainer container, PdfTableElement tableEl) - { - container.Border(1).BorderColor(tableEl.BorderColorHex).Table(table => - { - table.ColumnsDefinition(columns => - { - for (int i = 0; i < Math.Max(1, tableEl.Headers.Count); i++) - { - columns.RelativeColumn(); - } - }); - - // Headers - if (tableEl.Headers.Count > 0) - { - table.Header(header => - { - foreach (var h in tableEl.Headers) - { - header.Cell().Background(tableEl.HeaderBackgroundHex).Padding(5).Text(h) - .FontColor(tableEl.HeaderTextHex) - .Bold() - .FontSize(8.5f); - } - }); - } - - // Rows - int rowIndex = 0; - foreach (var row in tableEl.Rows) - { - var bg = (rowIndex % 2 == 1) ? tableEl.AlternateRowBackgroundHex : "#FFFFFF"; - foreach (var cellText in row) - { - table.Cell().Background(bg).BorderBottom(0.5f).BorderColor(tableEl.BorderColorHex).Padding(4).Text(cellText) - .FontSize(8); - } - rowIndex++; - } - }); - } - - private void ComposeChart(IContainer container, PdfChartElement chartEl) - { - try - { - byte[] chartPng = LiveChartsRenderer.RenderChartToPngBytes( - chartEl, - Math.Max(180, (int)chartEl.Width), - Math.Max(120, (int)chartEl.Height), - 2.5f); - - if (chartPng.Length > 0) - { - container.Border(1).BorderColor(chartEl.BorderColorHex).Background(chartEl.BackgroundColorHex).Padding(4).Image(chartPng).FitArea(); - return; - } - } - catch - { - // Fallback to title block - } - - container.Border(1).BorderColor(chartEl.BorderColorHex).Background(chartEl.BackgroundColorHex).Padding(8).Column(chartCol => - { - chartCol.Item().AlignCenter().Text($"{chartEl.Title}").FontSize(9f).Bold().FontColor(Colors.Grey.Darken3); - }); - } - - private void ComposeImage(IContainer container, PdfImageElement imgEl) - { - if (imgEl.ImageData != null && imgEl.ImageData.Length > 0) - { - try - { - container.Image(imgEl.ImageData).FitArea(); - return; - } - catch { } - } - - if (!string.IsNullOrEmpty(imgEl.Base64Data)) - { - try - { - byte[] bytes = Convert.FromBase64String(imgEl.Base64Data); - container.Image(bytes).FitArea(); - return; - } - catch { } - } - - if (!string.IsNullOrEmpty(imgEl.ImagePath) && File.Exists(imgEl.ImagePath)) - { - try - { - if (imgEl.ImagePath.EndsWith(".svg", StringComparison.OrdinalIgnoreCase)) - { - string svg = File.ReadAllText(imgEl.ImagePath); - container.Svg(svg).FitArea(); - return; - } - - container.Image(imgEl.ImagePath).FitArea(); - return; - } - catch { } - } - - container.Border(1).BorderColor(imgEl.BorderColorHex).Background("#F3F2F1").AlignCenter().AlignMiddle() - .Text(imgEl.AltText ?? "Image").FontSize(10).FontColor(Colors.Grey.Medium); - } - - private void ComposeSvg(IContainer container, PdfSvgElement svgEl) - { - try - { - string svgData = !string.IsNullOrWhiteSpace(svgEl.SvgSource) - ? svgEl.SvgSource - : (!string.IsNullOrWhiteSpace(svgEl.FilePath) && File.Exists(svgEl.FilePath) - ? File.ReadAllText(svgEl.FilePath) - : SvgOrnamentLibrary.GetGaneshaCrestSvg()); - - if (!string.IsNullOrWhiteSpace(svgEl.TintColorHex)) - { - svgData = svgData.Replace("currentColor", svgEl.TintColorHex); - } - - container.Svg(svgData).FitArea(); - } - catch - { - container.Border(1).BorderColor(svgEl.BorderColorHex ?? "#CBD5E1").Background("#F8FAFC").AlignCenter().AlignMiddle() - .Text("SVG Vector Art").FontSize(9).FontColor(Colors.Grey.Medium); - } - } - - private void ComposeMath(IContainer container, PdfMathElement mathEl) - { - try - { - var target = container; - - if (mathEl.CornerRadius > 0) - { - target = target.CornerRadius((float)mathEl.CornerRadius); - } - - if (mathEl.ShowBorder && mathEl.BorderThickness > 0 && !string.IsNullOrEmpty(mathEl.BorderColorHex) && !mathEl.BorderColorHex.Equals("Transparent", StringComparison.OrdinalIgnoreCase)) - { - target = target.Border((float)mathEl.BorderThickness).BorderColor(mathEl.BorderColorHex); - } - - if (mathEl.ShowBackground && !string.IsNullOrEmpty(mathEl.BackgroundColorHex) && !mathEl.BackgroundColorHex.Equals("Transparent", StringComparison.OrdinalIgnoreCase)) - { - target = target.Background(mathEl.BackgroundColorHex); - } - - if (mathEl.Padding > 0) - { - target = target.Padding((float)mathEl.Padding); - } - - var options = new MathRenderOptions - { - FontSize = mathEl.FontSize > 0 ? mathEl.FontSize : 16.0, - TextColorHex = !string.IsNullOrEmpty(mathEl.TextColorHex) ? mathEl.TextColorHex : "#000000", - BackgroundColorHex = "#00000000", - DisplayStyle = mathEl.DisplayStyle, - Alignment = mathEl.Alignment, - ShowEquationNumber = mathEl.ShowEquationNumber, - EquationNumber = mathEl.EquationNumber, - Padding = 2.0 - }; - - var renderResult = MathLayoutEngine.RenderToSvg(mathEl.Formula, options); - target.Svg(renderResult.SvgMarkup).FitArea(); - } - catch - { - container.Border(1).BorderColor("#CBD5E1").Background("#F8FAFC").AlignCenter().AlignMiddle() - .Text(mathEl.Formula ?? "f(x)").FontSize((float)mathEl.FontSize).FontColor(mathEl.TextColorHex ?? "#000000"); - } - } - - private void ComposeQrCode(IContainer container, PdfQrCodeElement qrEl) - { - try - { - byte[] qrBytes = QrCodeHelper.GeneratePngBytes( - qrEl.Content, - qrEl.DarkColorHex, - qrEl.LightColorHex, - qrEl.EccLevel, - pixelsPerModule: 20, - drawQuietZones: qrEl.DrawQuietZones); - - string bgHex = !string.IsNullOrWhiteSpace(qrEl.LightColorHex) ? qrEl.LightColorHex : "#FFFFFF"; - - container.Border(1).BorderColor(Colors.Grey.Lighten2).Background(bgHex).Padding(4).Column(qCol => - { - qCol.Item().AlignCenter().Image(qrBytes).FitArea(); - if (!string.IsNullOrEmpty(qrEl.Label)) - { - qCol.Item().PaddingTop(2).AlignCenter().Text(qrEl.Label).FontSize(7f).Bold().FontColor(Colors.Grey.Darken2); - } - }); - } - catch - { - container.Border(1).BorderColor(Colors.Grey.Lighten2).Background(Colors.White).AlignCenter().AlignMiddle() - .Text("QR CODE").FontSize(8).Bold(); - } - } - - private void ComposeBarcode(IContainer container, PdfBarcodeElement barEl) - { - container.Border(1).BorderColor(Colors.Grey.Lighten2).Background(Colors.White).Padding(4).Column(bCol => - { - // Algorithmic barcode stripes - bCol.Item().AlignCenter().Height(22).Row(r => - { - string val = barEl.CodeValue ?? "12345678"; - foreach (char c in val) - { - int pattern = (int)c % 5; - r.AutoItem().Width(pattern == 0 ? 1 : (pattern == 1 ? 2 : (pattern == 2 ? 1.5f : 3))).Background(barEl.BarColorHex); - r.AutoItem().Width(pattern % 2 == 0 ? 1 : 2).Background(Colors.White); - } - }); - - if (barEl.ShowText && !string.IsNullOrEmpty(barEl.CodeValue)) - { - bCol.Item().PaddingTop(2).AlignCenter().Text(barEl.CodeValue).FontSize(7.5f).FontColor(Colors.Grey.Darken3); - } - }); - } - - private void ComposeFormField(IContainer container, PdfFormFieldElement formEl) - { - container.Border(1).BorderColor(formEl.BorderColorHex).Background(formEl.BackgroundColorHex).Padding(4).Column(fCol => - { - fCol.Item().Row(r => - { - r.RelativeItem().Text(formEl.Label).FontSize(8).Bold().FontColor(Colors.Grey.Darken3); - if (formEl.IsRequired) - { - r.AutoItem().Text("* Required").FontSize(7f).FontColor(Colors.Red.Medium); - } - }); - - if (formEl.FieldType == FormFieldType.Checkbox) - { - fCol.Item().PaddingTop(2).Row(r => - { - r.AutoItem().Width(10).Height(10).Border(1).BorderColor(Colors.Grey.Darken2).Background(formEl.IsChecked ? Colors.Blue.Lighten4 : Colors.White); - r.RelativeItem().PaddingLeft(4).Text(formEl.IsChecked ? "[X] Checked" : "[ ] Unchecked").FontSize(7.5f); - }); - } - else if (formEl.FieldType == FormFieldType.Signature) - { - fCol.Item().PaddingTop(4).BorderBottom(1).BorderColor(Colors.Grey.Medium).PaddingBottom(2).Text(string.IsNullOrEmpty(formEl.Value) ? "Authorized Signature" : formEl.Value).FontSize(8.5f).Italic().FontColor(Colors.Blue.Darken2); - } - else - { - fCol.Item().PaddingTop(2).Border(1).BorderColor(Colors.Grey.Lighten1).Background(Colors.White).Padding(2).Text(string.IsNullOrEmpty(formEl.Value) ? formEl.Placeholder : formEl.Value).FontSize(7.5f).FontColor(string.IsNullOrEmpty(formEl.Value) ? Colors.Grey.Medium : Colors.Black); - } - }); - } - - private void ComposeStickyNote(IContainer container, PdfStickyNoteElement noteEl) - { - container.Border(1).BorderColor(noteEl.BorderColorHex).Background(noteEl.ColorHex).Padding(6).Column(nCol => - { - nCol.Item().Row(r => - { - r.RelativeItem().Text($"📌 {noteEl.Author}").FontSize(8f).Bold().FontColor("#78350F"); - r.AutoItem().Text(noteEl.Timestamp).FontSize(7f).FontColor("#92400E"); - }); - nCol.Item().PaddingTop(2).Text(noteEl.NoteText).FontSize(7.5f).FontColor("#78350F"); - nCol.Item().PaddingTop(2).Text($"Status: {noteEl.Status}").FontSize(7f).Bold().FontColor("#B45309"); - }); - } -} diff --git a/src/PdfEditorApp/Services/PdfImportService.cs b/src/PdfEditorApp/Services/PdfImportService.cs deleted file mode 100644 index 2d940a4..0000000 --- a/src/PdfEditorApp/Services/PdfImportService.cs +++ /dev/null @@ -1,90 +0,0 @@ -using System; -using System.IO; -using System.Threading.Tasks; -using PdfEditorApp.Core.Deconstruction; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Plugins; -using PdfEditorApp.Core.Plugins.Descriptors; -using PdfEditorApp.Core.Plugins.Pipelines; -using PdfEditorApp.Models; -using PdfEditorApp.Services.Import; - -namespace PdfEditorApp.Services; - -public interface IPdfImportService -{ - Task ImportPdfAsync(string filePath, string? password = null); - Task ImportPdfFromBytesAsync(byte[] pdfBytes, string title = "Imported_Document.pdf", string? password = null); - Task ImportPdfBytesAsync(byte[] pdfBytes, string title = "Imported_Document.pdf", string? password = null); -} - -/// -/// Professional Multi-Format Document Import and Deconstruction Engine. -/// Parses PDF, raster images, markdown, and text files into an editable, multi-layered PdfDocumentModel -/// with pluggable format discovery and Waterfall pipeline interception. -/// -public class PdfImportService : IPdfImportService -{ - private readonly IDocumentImporterRegistry _importerRegistry; - private readonly IFryPluginContext? _pluginContext; - - public PdfImportService(IDocumentImporterRegistry? importerRegistry = null, IFryPluginContext? pluginContext = null) - { - _importerRegistry = importerRegistry ?? new DocumentImporterRegistry(); - _pluginContext = pluginContext; - } - - public Task ImportPdfBytesAsync(byte[] pdfBytes, string title = "Imported_Document.pdf", string? password = null) - => ImportPdfFromBytesAsync(pdfBytes, title, password); - - public async Task ImportPdfAsync(string filePath, string? password = null) - { - if (!File.Exists(filePath)) - throw new FileNotFoundException($"Document file not found: {filePath}"); - - byte[] bytes = await File.ReadAllBytesAsync(filePath); - string title = Path.GetFileName(filePath); - return await ImportDocumentInternalAsync(bytes, filePath, title, password); - } - - public async Task ImportPdfFromBytesAsync(byte[] pdfBytes, string title = "Imported_Document.pdf", string? password = null) - { - return await ImportDocumentInternalAsync(pdfBytes, title, title, password); - } - - private async Task ImportDocumentInternalAsync(byte[] bytes, string pathOrExtension, string title, string? password) - { - using var stream = new MemoryStream(bytes); - var pipelineContext = new PdfImportPipelineContext(stream, title, password); - - if (_pluginContext != null) - { - await _pluginContext.ExecuteWaterfallAsync("document:import", pipelineContext, async () => - { - pipelineContext.Document = await ExecuteImportCoreAsync(stream, pathOrExtension, title, password); - }); - } - else - { - pipelineContext.Document = await ExecuteImportCoreAsync(stream, pathOrExtension, title, password); - } - - return pipelineContext.Document ?? throw new InvalidOperationException($"Failed to import document: {title}"); - } - - private async Task ExecuteImportCoreAsync(Stream stream, string pathOrExtension, string title, string? password) - { - var importer = _importerRegistry.FindImporter(pathOrExtension); - if (importer != null) - { - stream.Position = 0; - return await importer.ImportAsync(stream, title, password); - } - - // Direct fallback to PDF deconstruction engine - stream.Position = 0; - using var ms = new MemoryStream(); - await stream.CopyToAsync(ms); - return await Task.Run(() => PdfDeconstructionEngine.Deconstruct(ms.ToArray(), title, password)); - } -} diff --git a/src/PdfEditorApp/Services/Plugins/PluginMarketplaceService.cs b/src/PdfEditorApp/Services/Plugins/PluginMarketplaceService.cs deleted file mode 100644 index 8fe83f9..0000000 --- a/src/PdfEditorApp/Services/Plugins/PluginMarketplaceService.cs +++ /dev/null @@ -1,806 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Net.Http; -using System.Text.Json; -using System.Threading; -using System.Threading.Tasks; -using PdfEditorApp.Core.Plugins; -using PdfEditorApp.Core.Plugins.Descriptors; -using PdfEditorApp.Core.Plugins.Marketplace; -using PdfEditorApp.Plugins.Loader; - - -namespace PdfEditorApp.Services.Plugins; - -/// -/// Service providing access to the curated FryPDF Plugin Store and Marketplace. -/// Features real, functional extension packages with persistent history and 1-click mounting into the isolated plugin kernel. -/// -public class PluginMarketplaceService : IPluginMarketplaceService -{ - public const string DefaultRegistryBaseUrl = "https://raw.githubusercontent.com/codefrydev/PDFCreator-resources/refs/heads/main/plugins"; - - private readonly PluginHost? _pluginHost; - private readonly IOverlayRegistry? _overlayRegistry; - private readonly IInstalledPluginStore _installedPluginStore; - private readonly string _pluginsDirectory; - private readonly string _registryBaseUrl; - private readonly HttpClient _httpClient; - private readonly HashSet _installedMarketplaceIds = new(StringComparer.OrdinalIgnoreCase); - private readonly List _remoteExtensions = new(); - private readonly object _catalogLock = new(); - - /// - /// All extensions and plugins are discovered and downloaded dynamically from the online catalog.json registry. - /// - private static readonly List CuratedExtensions = new(); - - public PluginMarketplaceService( - PluginHost? pluginHost = null, - IOverlayRegistry? overlayRegistry = null, - IInstalledPluginStore? installedPluginStore = null, - HttpClient? httpClient = null, - string? registryBaseUrl = null, - string? pluginsDirectory = null) - { - _pluginHost = pluginHost; - _overlayRegistry = overlayRegistry; - _installedPluginStore = installedPluginStore ?? new FileInstalledPluginStore(); - _pluginsDirectory = string.IsNullOrWhiteSpace(pluginsDirectory) - ? Path.Combine(AppContext.BaseDirectory, "plugins") - : pluginsDirectory; - _registryBaseUrl = string.IsNullOrWhiteSpace(registryBaseUrl) ? DefaultRegistryBaseUrl : registryBaseUrl.TrimEnd('/'); - _httpClient = httpClient ?? new HttpClient { Timeout = TimeSpan.FromSeconds(6) }; - - try - { - Directory.CreateDirectory(_pluginsDirectory); - LoadDiskCatalogCache(); - ScanInstalledMarketplacePlugins(); - RestorePersistedPlugins(); - } - catch (Exception ex) - { - System.Diagnostics.Debug.WriteLine($"[PluginMarketplaceService] Init warning: {ex.Message}"); - } - } - - private bool _hasFetchedRemote; - - private void LoadDiskCatalogCache() - { - try - { - var cacheFile = Path.Combine(_pluginsDirectory, "catalog_cache.json"); - if (!File.Exists(cacheFile)) - { - var baseCache = Path.Combine(AppContext.BaseDirectory, "plugins", "catalog_cache.json"); - if (File.Exists(baseCache)) - { - cacheFile = baseCache; - } - } - - if (File.Exists(cacheFile)) - { - var json = File.ReadAllText(cacheFile); - var cached = JsonSerializer.Deserialize>(json, new JsonSerializerOptions - { - PropertyNameCaseInsensitive = true - }); - if (cached != null && cached.Count > 0) - { - lock (_catalogLock) - { - _remoteExtensions.Clear(); - _remoteExtensions.AddRange(cached.Where(c => c != null && !string.IsNullOrEmpty(c.Id))); - } - } - } - - DiscoverFromLocalExamples(); - } - catch { } - } - - private static string? FindExamplesDirectory() - { - var current = AppContext.BaseDirectory; - while (!string.IsNullOrEmpty(current)) - { - var candidate = Path.Combine(current, "docs", "examples"); - if (Directory.Exists(candidate)) - { - return Path.GetFullPath(candidate); - } - - var parent = Directory.GetParent(current); - if (parent == null || parent.FullName == current) break; - current = parent.FullName; - } - - current = Directory.GetCurrentDirectory(); - while (!string.IsNullOrEmpty(current)) - { - var candidate = Path.Combine(current, "docs", "examples"); - if (Directory.Exists(candidate)) - { - return Path.GetFullPath(candidate); - } - - var parent = Directory.GetParent(current); - if (parent == null || parent.FullName == current) break; - current = parent.FullName; - } - - return null; - } - - private void DiscoverFromLocalExamples() - { - try - { - var examplesDir = FindExamplesDirectory(); - if (examplesDir != null && Directory.Exists(examplesDir)) - { - foreach (var dir in Directory.GetDirectories(examplesDir)) - { - var manifestPath = Path.Combine(dir, "plugin.json"); - if (File.Exists(manifestPath)) - { - var json = File.ReadAllText(manifestPath); - using var doc = JsonDocument.Parse(json); - var rootElem = doc.RootElement; - var id = rootElem.TryGetProperty("id", out var idProp) ? idProp.GetString() : null; - var name = rootElem.TryGetProperty("name", out var nameProp) ? nameProp.GetString() : null; - var author = rootElem.TryGetProperty("author", out var authorProp) ? authorProp.GetString() : "Community"; - var version = rootElem.TryGetProperty("version", out var verProp) ? verProp.GetString() : "1.0.0"; - var desc = rootElem.TryGetProperty("description", out var descProp) ? descProp.GetString() : ""; - var icon = rootElem.TryGetProperty("icon", out var iconProp) ? iconProp.GetString() : "PuzzleOutline"; - - if (!string.IsNullOrWhiteSpace(id) && !string.IsNullOrWhiteSpace(name)) - { - lock (_catalogLock) - { - if (!_remoteExtensions.Any(e => string.Equals(e?.Id, id, StringComparison.OrdinalIgnoreCase))) - { - var rawShort = id.Split('.').Last(); - var shortName = char.ToUpperInvariant(rawShort[0]) + (rawShort.Length > 1 ? rawShort.Substring(1) : ""); - _remoteExtensions.Add(new MarketplacePluginItem - { - Id = id, - Name = name, - Publisher = author ?? "FryPDF Team", - Version = version ?? "1.0.0", - Description = desc ?? "", - IconKind = icon ?? "PuzzleOutline", - IsOfficial = true, - IsVerified = true, - Category = "UI & Extensions", - DownloadUrl = $"{_registryBaseUrl}/{id}/{shortName}.fryplugin" - }); - } - } - } - } - } - } - } - catch { } - } - - private static IFryPlugin? InstantiatePlugin(string pluginId) - { - return null; - } - - private void RestorePersistedPlugins() - { - if (_pluginHost == null) return; - - var records = _installedPluginStore.GetAll(); - foreach (var rec in records) - { - if (!rec.IsEnabled) continue; - - var plugin = InstantiatePlugin(rec.PluginId); - if (plugin != null) - { - if (_pluginHost.GetPluginState(rec.PluginId) == PluginState.Unloaded) - { - _pluginHost.RegisterPlugin(plugin); - } - - if (!_pluginHost.IsPluginActive(rec.PluginId)) - { - try - { - _pluginHost.EnablePluginAsync(rec.PluginId).GetAwaiter().GetResult(); - } - catch (Exception ex) - { - System.Diagnostics.Debug.WriteLine($"[PluginMarketplaceService] Restore error for {rec.PluginId}: {ex.Message}"); - } - } - - _installedMarketplaceIds.Add(rec.PluginId); - - if (rec.WasOverlayOpen) - { - var overlayReg = _overlayRegistry ?? _pluginHost.Context.GetService(); - overlayReg?.ShowOverlay(rec.PluginId); - } - } - else - { - // Try restoring external downloaded plugin from plugins/{pluginId}/ - var pluginDir = Path.Combine(_pluginsDirectory, rec.PluginId); - if (Directory.Exists(pluginDir)) - { - try - { - string? entryDll = null; - var manifestFile = Path.Combine(pluginDir, "plugin.json"); - if (File.Exists(manifestFile)) - { - var json = File.ReadAllText(manifestFile); - var manifest = JsonSerializer.Deserialize(json); - if (!string.IsNullOrWhiteSpace(manifest?.EntryPoint)) - { - var candidate = Path.Combine(pluginDir, manifest.EntryPoint); - if (File.Exists(candidate)) entryDll = candidate; - } - } - - entryDll ??= Directory.GetFiles(pluginDir, "*.dll", SearchOption.TopDirectoryOnly).FirstOrDefault(); - if (entryDll != null) - { - var pkg = PluginAssemblyLoader.LoadPluginAssembly(entryDll); - if (pkg.Plugins.Count > 0) - { - _pluginHost.RegisterPlugins(pkg.Plugins); - foreach (var p in pkg.Plugins) - { - if (!_pluginHost.IsPluginActive(p.Id)) - { - _pluginHost.EnablePluginAsync(p.Id).GetAwaiter().GetResult(); - } - } - - _installedMarketplaceIds.Add(rec.PluginId); - - if (rec.WasOverlayOpen) - { - var overlayReg = _overlayRegistry ?? _pluginHost.Context.GetService(); - overlayReg?.ShowOverlay(rec.PluginId); - } - } - } - } - catch (Exception ex) - { - System.Diagnostics.Debug.WriteLine($"[PluginMarketplaceService] Error restoring external plugin {rec.PluginId}: {ex.Message}"); - } - } - } - } - } - - private void ScanInstalledMarketplacePlugins() - { - _installedMarketplaceIds.Clear(); - - foreach (var rec in _installedPluginStore.GetAll()) - { - if (rec != null && rec.IsEnabled && !string.IsNullOrEmpty(rec.PluginId)) - { - _installedMarketplaceIds.Add(rec.PluginId); - } - } - - if (_pluginHost != null) - { - foreach (var item in CuratedExtensions) - { - if (item != null && !string.IsNullOrEmpty(item.Id) && _pluginHost.IsPluginActive(item.Id)) - { - _installedMarketplaceIds.Add(item.Id); - } - } - - List snapshot; - lock (_catalogLock) - { - snapshot = _remoteExtensions.Where(i => i != null && !string.IsNullOrEmpty(i.Id)).ToList(); - } - - foreach (var item in snapshot) - { - if (_pluginHost.IsPluginActive(item.Id)) - { - _installedMarketplaceIds.Add(item.Id); - } - } - } - } - - public async Task> FetchRemoteCatalogAsync(bool forceRefresh = false, CancellationToken ct = default) - { - if (_hasFetchedRemote && !forceRefresh) - { - lock (_catalogLock) - { - return _remoteExtensions.Where(i => i != null && !string.IsNullOrEmpty(i.Id)).ToList(); - } - } - - var catalogUrl = $"{_registryBaseUrl}/catalog.json"; - try - { - using var response = await _httpClient.GetAsync(catalogUrl, ct); - if (response.IsSuccessStatusCode) - { - var json = await response.Content.ReadAsStringAsync(ct); - var items = JsonSerializer.Deserialize>(json, new JsonSerializerOptions - { - PropertyNameCaseInsensitive = true - }); - - if (items != null && items.Count > 0) - { - lock (_catalogLock) - { - foreach (var item in items.Where(i => i != null && !string.IsNullOrEmpty(i.Id))) - { - var existing = _remoteExtensions.FirstOrDefault(e => string.Equals(e?.Id, item.Id, StringComparison.OrdinalIgnoreCase)); - if (existing != null) - { - _remoteExtensions.Remove(existing); - } - _remoteExtensions.Add(item); - } - } - - // Also merge any local examples not present in remote catalog yet - DiscoverFromLocalExamples(); - - // Persist to local disk cache for fast/offline resilience - try - { - string mergedJson; - lock (_catalogLock) - { - mergedJson = JsonSerializer.Serialize(_remoteExtensions, new JsonSerializerOptions { WriteIndented = true }); - } - var cacheFile = Path.Combine(_pluginsDirectory, "catalog_cache.json"); - Directory.CreateDirectory(_pluginsDirectory); - File.WriteAllText(cacheFile, mergedJson); - } - catch { } - } - } - else - { - lock (_catalogLock) - { - if (_remoteExtensions.Count == 0) - { - LoadDiskCatalogCache(); - } - } - } - } - catch (Exception ex) - { - System.Diagnostics.Debug.WriteLine($"[PluginMarketplaceService] Remote catalog fetch failed: {ex.Message}"); - lock (_catalogLock) - { - if (_remoteExtensions.Count == 0) - { - LoadDiskCatalogCache(); - } - } - } - - _hasFetchedRemote = true; - ScanInstalledMarketplacePlugins(); - List result; - lock (_catalogLock) - { - foreach (var item in _remoteExtensions) - { - if (item == null || string.IsNullOrEmpty(item.Id)) continue; - item.Status = IsPluginInstalled(item.Id) - ? MarketplacePluginStatus.Installed - : MarketplacePluginStatus.Available; - } - result = _remoteExtensions.Where(i => i != null && !string.IsNullOrEmpty(i.Id)).ToList(); - } - - return result; - } - - public Task> GetCatalogAsync(CancellationToken ct = default) - { - ScanInstalledMarketplacePlugins(); - var allItems = new List(CuratedExtensions); - List snapshot; - lock (_catalogLock) - { - snapshot = _remoteExtensions.Where(i => i != null && !string.IsNullOrEmpty(i.Id)).ToList(); - } - - foreach (var remote in snapshot) - { - if (!allItems.Any(c => string.Equals(c?.Id, remote.Id, StringComparison.OrdinalIgnoreCase))) - { - allItems.Add(remote); - } - } - - foreach (var item in allItems) - { - item.Status = IsPluginInstalled(item.Id) - ? MarketplacePluginStatus.Installed - : MarketplacePluginStatus.Available; - } - return Task.FromResult>(allItems); - } - - public Task> SearchAsync(string query, string? category = null, CancellationToken ct = default) - { - ScanInstalledMarketplacePlugins(); - List allItems; - lock (_catalogLock) - { - allItems = _remoteExtensions.Where(i => i != null && !string.IsNullOrEmpty(i.Id)).ToList(); - } - - var q = query.Trim().ToLowerInvariant(); - var results = allItems.Where(item => - { - if (!string.IsNullOrWhiteSpace(category) && !string.Equals(category, "All", StringComparison.OrdinalIgnoreCase)) - { - if (!string.Equals(item.Category, category, StringComparison.OrdinalIgnoreCase)) - return false; - } - - if (string.IsNullOrWhiteSpace(q)) return true; - - return (item.Name?.ToLowerInvariant().Contains(q) ?? false) || - (item.Id?.ToLowerInvariant().Contains(q) ?? false) || - (item.Publisher?.ToLowerInvariant().Contains(q) ?? false) || - (item.Description?.ToLowerInvariant().Contains(q) ?? false) || - (item.Tags?.Any(t => t.ToLowerInvariant().Contains(q)) ?? false); - }).ToList(); - - foreach (var item in results) - { - item.Status = IsPluginInstalled(item.Id) - ? MarketplacePluginStatus.Installed - : MarketplacePluginStatus.Available; - } - - return Task.FromResult>(results); - } - - public async Task InstallPluginAsync(string pluginId, IProgress? progress = null, Action? statusCallback = null, CancellationToken ct = default) - { - MarketplacePluginItem? item; - lock (_catalogLock) - { - item = CuratedExtensions.FirstOrDefault(e => string.Equals(e?.Id, pluginId, StringComparison.OrdinalIgnoreCase)) - ?? _remoteExtensions.FirstOrDefault(e => string.Equals(e?.Id, pluginId, StringComparison.OrdinalIgnoreCase)); - } - - // If not found in memory, try fetching remote catalog or fallback to known TicTacToe plugin - if (item == null) - { - await FetchRemoteCatalogAsync(forceRefresh: false, ct); - lock (_catalogLock) - { - item = _remoteExtensions.FirstOrDefault(e => string.Equals(e?.Id, pluginId, StringComparison.OrdinalIgnoreCase)); - } - } - - if (item == null) - { - var shortName = pluginId.Split('.').Last(); - item = new MarketplacePluginItem - { - Id = pluginId, - Name = shortName, - Publisher = "Community", - Version = "1.0.0", - Description = $"{shortName} plugin.", - DownloadUrl = $"{_registryBaseUrl}/{pluginId}/{shortName}.fryplugin" - }; - } - - item.Status = MarketplacePluginStatus.Installing; - statusCallback?.Invoke($"Connecting to FryPDF Marketplace registry for '{item.Name}'..."); - progress?.Report(0.1); - - // Check if pre-packaged local archive exists in docs/examples for fast/offline test environments - string? localArchive = null; - var shortId = pluginId.Split('.').Last(); - var capitalized = char.ToUpperInvariant(shortId[0]) + (shortId.Length > 1 ? shortId.Substring(1) : ""); - var candidateNames = new[] { shortId, capitalized, "Snake", "TicTacToe", "Scratchpad", "Telemetry" }; - var examplesDir = FindExamplesDirectory(); - if (examplesDir != null) - { - foreach (var name in candidateNames.Distinct(StringComparer.OrdinalIgnoreCase)) - { - var candidate = Path.Combine(examplesDir, $"{name}Plugin", "bin", "Release", "net10.0", $"{name}.fryplugin"); - if (File.Exists(candidate)) - { - localArchive = candidate; - break; - } - } - } - - // Case A: Remote package download from GitHub repository (with offline local fallback) - if (!string.IsNullOrWhiteSpace(item.DownloadUrl)) - { - statusCallback?.Invoke($"Downloading {item.FormattedSize} package archive from registry..."); - progress?.Report(0.2); - - var tempDir = Path.Combine(_pluginsDirectory, ".cache"); - Directory.CreateDirectory(tempDir); - var tempPackagePath = Path.Combine(tempDir, $"{item.Id}.fryplugin"); - - try - { - bool downloaded = false; - try - { - using (var response = await _httpClient.GetAsync(item.DownloadUrl, HttpCompletionOption.ResponseHeadersRead, ct)) - { - if (response.IsSuccessStatusCode) - { - var contentLength = response.Content.Headers.ContentLength ?? 1; - await using var stream = await response.Content.ReadAsStreamAsync(ct); - await using var fileStream = File.Create(tempPackagePath); - - var buffer = new byte[8192]; - long totalBytesRead = 0; - int bytesRead; - - while ((bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length, ct)) > 0) - { - await fileStream.WriteAsync(buffer.AsMemory(0, bytesRead), ct); - totalBytesRead += bytesRead; - progress?.Report(0.2 + 0.5 * ((double)totalBytesRead / contentLength)); - } - downloaded = true; - } - } - } - catch (Exception ex) - { - System.Diagnostics.Debug.WriteLine($"[PluginMarketplaceService] Remote package download failed: {ex.Message}"); - } - - if (!downloaded) - { - if (localArchive != null && File.Exists(localArchive)) - { - File.Copy(localArchive, tempPackagePath, overwrite: true); - } - else - { - item.Status = MarketplacePluginStatus.Available; - return false; - } - } - - statusCallback?.Invoke("Unpacking package archive and verifying manifest..."); - progress?.Report(0.75); - - var pkgResult = FryPluginPackageLoader.UnpackAndLoad(tempPackagePath, _pluginsDirectory); - - statusCallback?.Invoke("Mounting extension into isolated plugin kernel..."); - progress?.Report(0.85); - - if (_pluginHost != null) - { - _pluginHost.RegisterPlugins(pkgResult.AssemblyPackage.Plugins); - foreach (var pkgPlugin in pkgResult.AssemblyPackage.Plugins) - { - if (!_pluginHost.IsPluginActive(pkgPlugin.Id)) - { - await _pluginHost.EnablePluginAsync(pkgPlugin.Id, ct); - } - } - - var overlayReg = _overlayRegistry ?? _pluginHost.Context.GetService(); - overlayReg?.ShowOverlay(item.Id); - } - - _installedMarketplaceIds.Add(item.Id); - _installedPluginStore.AddOrUpdate(new InstalledPluginRecord - { - PluginId = item.Id, - Name = item.Name, - Version = item.Version, - InstalledAt = DateTime.UtcNow, - IsEnabled = true, - WasOverlayOpen = true - }); - - item.Status = MarketplacePluginStatus.Installed; - statusCallback?.Invoke($"'{item.Name}' installed and activated successfully!"); - progress?.Report(1.0); - return true; - } - catch (Exception ex) - { - System.Diagnostics.Debug.WriteLine($"[PluginMarketplaceService] Remote install failed: {ex.Message}"); - item.Status = MarketplacePluginStatus.Available; - statusCallback?.Invoke($"Failed to install '{item.Name}': {ex.Message}"); - return false; - } - finally - { - try - { - if (File.Exists(tempPackagePath)) - { - File.Delete(tempPackagePath); - } - } - catch { } - } - } - - // Case B: Local/simulated installation for built-in plugins (Snake, Scratchpad, Telemetry) - await Task.Delay(100, ct); - - statusCallback?.Invoke($"Preparing {item.FormattedSize} package components..."); - progress?.Report(0.35); - await Task.Delay(150, ct); - - statusCallback?.Invoke("Verifying package SHA-256 manifest and digital signatures..."); - progress?.Report(0.65); - await Task.Delay(100, ct); - - // Create installation folder in plugins/ - var targetDir = Path.Combine(_pluginsDirectory, item.Id); - Directory.CreateDirectory(targetDir); - - var manifestPath = Path.Combine(targetDir, "plugin.json"); - var manifestContent = $@"{{ - ""id"": ""{item.Id}"", - ""name"": ""{item.Name}"", - ""version"": ""{item.Version}"", - ""category"": ""{item.Category}"", - ""description"": ""{item.Description}"", - ""author"": ""{item.Publisher}"", - ""entryPoint"": ""{item.Id}.dll"", - ""license"": ""{item.License}"" -}}"; - await File.WriteAllTextAsync(manifestPath, manifestContent, ct); - - statusCallback?.Invoke("Mounting extension into isolated plugin kernel..."); - progress?.Report(0.85); - - // Mount and activate real plugin into host if available - var plugin = InstantiatePlugin(item.Id); - if (plugin != null && _pluginHost != null) - { - if (_pluginHost.GetPluginState(item.Id) == PluginState.Unloaded) - { - _pluginHost.RegisterPlugin(plugin); - } - - if (!_pluginHost.IsPluginActive(item.Id)) - { - await _pluginHost.EnablePluginAsync(item.Id, ct); - } - - var overlayReg = _overlayRegistry ?? _pluginHost.Context.GetService(); - overlayReg?.ShowOverlay(item.Id); - } - - _installedMarketplaceIds.Add(item.Id); - _installedPluginStore.AddOrUpdate(new InstalledPluginRecord - { - PluginId = item.Id, - Name = item.Name, - Version = item.Version, - InstalledAt = DateTime.UtcNow, - IsEnabled = true, - WasOverlayOpen = true - }); - - item.Status = MarketplacePluginStatus.Installed; - - statusCallback?.Invoke($"'{item.Name}' installed and activated successfully!"); - progress?.Report(1.0); - return true; - } - - public async Task UninstallPluginAsync(string pluginId, CancellationToken ct = default) - { - MarketplacePluginItem? item; - lock (_catalogLock) - { - item = CuratedExtensions.FirstOrDefault(e => string.Equals(e?.Id, pluginId, StringComparison.OrdinalIgnoreCase)) - ?? _remoteExtensions.FirstOrDefault(e => string.Equals(e?.Id, pluginId, StringComparison.OrdinalIgnoreCase)); - } - if (item != null) - { - item.Status = MarketplacePluginStatus.Available; - } - - _installedMarketplaceIds.Remove(pluginId); - _installedPluginStore.Remove(pluginId); - - if (_pluginHost != null) - { - var overlayReg = _overlayRegistry ?? _pluginHost.Context.GetService(); - overlayReg?.HideOverlay(pluginId); - - if (_pluginHost.IsPluginActive(pluginId)) - { - await _pluginHost.DisablePluginAsync(pluginId, ct); - } - } - - var targetDir = Path.Combine(_pluginsDirectory, pluginId); - if (Directory.Exists(targetDir)) - { - try - { - Directory.Delete(targetDir, recursive: true); - } - catch (Exception ex) - { - System.Diagnostics.Debug.WriteLine($"[PluginMarketplaceService] Uninstall delete error: {ex.Message}"); - } - } - - return true; - } - - public bool IsPluginInstalled(string pluginId) - { - if (string.IsNullOrWhiteSpace(pluginId)) return false; - - if (_installedPluginStore.IsInstalled(pluginId)) - return true; - - if (_pluginHost != null && _pluginHost.IsPluginActive(pluginId)) - return true; - - return _installedMarketplaceIds.Contains(pluginId); - } - - public async Task> CheckForUpdatesAsync(CancellationToken ct = default) - { - var remote = await FetchRemoteCatalogAsync(forceRefresh: true, ct); - var updateAvailable = new List(); - - foreach (var remoteItem in remote) - { - var installed = _installedPluginStore.Get(remoteItem.Id); - if (installed != null) - { - if (Version.TryParse(remoteItem.Version, out var remoteVer) && - Version.TryParse(installed.Version, out var localVer)) - { - if (remoteVer > localVer) - { - remoteItem.Status = MarketplacePluginStatus.UpdateAvailable; - updateAvailable.Add(remoteItem); - } - } - } - } - - return updateAvailable; - } -} diff --git a/src/PdfEditorApp/Services/ProjectPersistenceService.cs b/src/PdfEditorApp/Services/ProjectPersistenceService.cs deleted file mode 100644 index da9e450..0000000 --- a/src/PdfEditorApp/Services/ProjectPersistenceService.cs +++ /dev/null @@ -1,162 +0,0 @@ -using System; -using System.IO; -using System.Security.Cryptography; -using System.Text; -using System.Text.Json; -using System.Text.Json.Serialization; -using System.Threading.Tasks; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Models; - -namespace PdfEditorApp.Services; - -public interface IProjectPersistenceService -{ - Task SaveProjectAsync(PdfDocumentModel model, string filePath); - Task LoadProjectAsync(string filePath); - Task SaveAutoSaveAsync(PdfDocumentModel model, string? currentFilePath); - bool HasRecoverableAutoSave(string? currentFilePath, out string autoSavePath); - Task LoadAutoSaveAsync(string autoSavePath); - void CleanAutoSave(string? currentFilePath); -} - -public class ProjectPersistenceService : IProjectPersistenceService -{ - private readonly JsonSerializerOptions _options; - private readonly string _autoSaveDirectory; - private readonly IPdfImportService _importService; - private readonly PdfEditorApp.Core.Plugins.Descriptors.ICanvasElementRegistry? _canvasElementRegistry; - - public ProjectPersistenceService( - IPdfImportService? importService = null, - PdfEditorApp.Core.Plugins.Descriptors.ICanvasElementRegistry? canvasElementRegistry = null) - { - _importService = importService ?? new PdfImportService(); - _canvasElementRegistry = canvasElementRegistry; - _options = PdfEditorApp.Core.Models.Elements.DynamicElementJsonResolver.CreateOptions( - _canvasElementRegistry != null ? () => _canvasElementRegistry.GetAllDescriptors() : null, - writeIndented: true); - - string localAppData = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); - _autoSaveDirectory = Path.Combine(localAppData, "FryPDF", "AutoSave"); - try - { - if (!Directory.Exists(_autoSaveDirectory)) - { - Directory.CreateDirectory(_autoSaveDirectory); - } - } - catch - { - _autoSaveDirectory = Path.GetTempPath(); - } - } - - public async Task SaveProjectAsync(PdfDocumentModel model, string filePath) - { - var json = JsonSerializer.Serialize(model, _options); - string tempPath = filePath + ".tmp"; - - // Write safely to temp file first - await File.WriteAllTextAsync(tempPath, json); - - // Atomic swap - if (File.Exists(filePath)) - { - File.Replace(tempPath, filePath, null); - } - else - { - File.Move(tempPath, filePath); - } - - // Clean any staging autosave after successful explicit save - CleanAutoSave(filePath); - } - - public async Task LoadProjectAsync(string filePath) - { - if (!File.Exists(filePath)) return null; - - // 1. Check if file is binary PDF (by extension or PDF magic header %PDF-) - bool isPdf = false; - string ext = Path.GetExtension(filePath).ToLowerInvariant(); - if (ext == ".pdf") - { - isPdf = true; - } - else - { - try - { - using var fs = File.OpenRead(filePath); - byte[] header = new byte[5]; - int read = await fs.ReadAsync(header, 0, 5); - if (read >= 4 && header[0] == '%' && header[1] == 'P' && header[2] == 'D' && header[3] == 'F') - { - isPdf = true; - } - } - catch { } - } - - if (isPdf) - { - return await _importService.ImportPdfAsync(filePath); - } - - // 2. Load as JSON FryPDF project - var json = await File.ReadAllTextAsync(filePath); - return JsonSerializer.Deserialize(json, _options); - } - - public string GetAutoSaveFilePath(string? currentFilePath) - { - string key = string.IsNullOrWhiteSpace(currentFilePath) ? "untitled_session" : Convert.ToHexString(SHA256.HashData(Encoding.UTF8.GetBytes(currentFilePath))); - return Path.Combine(_autoSaveDirectory, $"{key}.autosave.frypdf"); - } - - public async Task SaveAutoSaveAsync(PdfDocumentModel model, string? currentFilePath) - { - string autoSaveFile = GetAutoSaveFilePath(currentFilePath); - string json = JsonSerializer.Serialize(model, _options); - await File.WriteAllTextAsync(autoSaveFile, json); - } - - public bool HasRecoverableAutoSave(string? currentFilePath, out string autoSavePath) - { - autoSavePath = GetAutoSaveFilePath(currentFilePath); - if (!File.Exists(autoSavePath)) return false; - - if (string.IsNullOrWhiteSpace(currentFilePath) || !File.Exists(currentFilePath)) - { - return true; - } - - // If autosave file is newer than the saved project file - var autoSaveTime = File.GetLastWriteTimeUtc(autoSavePath); - var projectFileTime = File.GetLastWriteTimeUtc(currentFilePath); - return autoSaveTime > projectFileTime.AddSeconds(5); - } - - public async Task LoadAutoSaveAsync(string autoSavePath) - { - return await LoadProjectAsync(autoSavePath); - } - - public void CleanAutoSave(string? currentFilePath) - { - try - { - string path = GetAutoSaveFilePath(currentFilePath); - if (File.Exists(path)) - { - File.Delete(path); - } - } - catch - { - // Best effort cleanup - } - } -} diff --git a/src/PdfEditorApp/Services/QrCodeHelper.cs b/src/PdfEditorApp/Services/QrCodeHelper.cs deleted file mode 100644 index 4337e23..0000000 --- a/src/PdfEditorApp/Services/QrCodeHelper.cs +++ /dev/null @@ -1,108 +0,0 @@ -using System; -using System.Globalization; -using System.IO; -using Avalonia.Media.Imaging; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Models; -using QRCoder; - -namespace PdfEditorApp.Services; - -/// -/// High-performance QR Code generation helper supporting live Avalonia bitmap previews, -/// custom brand colors, error correction levels, and vector/raster export bytes. -/// -public static class QrCodeHelper -{ - public static byte[] HexToRgba(string? hex, byte defaultR, byte defaultG, byte defaultB, byte defaultA = 255) - { - if (string.IsNullOrWhiteSpace(hex)) - { - return new byte[] { defaultR, defaultG, defaultB, defaultA }; - } - - string clean = hex.Trim().TrimStart('#'); - try - { - if (clean.Length == 6) - { - byte r = byte.Parse(clean.Substring(0, 2), NumberStyles.HexNumber); - byte g = byte.Parse(clean.Substring(2, 2), NumberStyles.HexNumber); - byte b = byte.Parse(clean.Substring(4, 2), NumberStyles.HexNumber); - return new byte[] { r, g, b, 255 }; - } - if (clean.Length == 8) - { - byte a = byte.Parse(clean.Substring(0, 2), NumberStyles.HexNumber); - byte r = byte.Parse(clean.Substring(2, 2), NumberStyles.HexNumber); - byte g = byte.Parse(clean.Substring(4, 2), NumberStyles.HexNumber); - byte b = byte.Parse(clean.Substring(6, 2), NumberStyles.HexNumber); - return new byte[] { r, g, b, a }; - } - if (clean.Length == 3) - { - byte r = (byte)(Convert.ToByte(clean[0].ToString(), 16) * 17); - byte g = (byte)(Convert.ToByte(clean[1].ToString(), 16) * 17); - byte b = (byte)(Convert.ToByte(clean[2].ToString(), 16) * 17); - return new byte[] { r, g, b, 255 }; - } - } - catch - { - // fallback on format error - } - - return new byte[] { defaultR, defaultG, defaultB, defaultA }; - } - - public static QRCodeGenerator.ECCLevel ToQRCoderEcc(QrCodeEccLevel level) - { - return level switch - { - QrCodeEccLevel.L => QRCodeGenerator.ECCLevel.L, - QrCodeEccLevel.M => QRCodeGenerator.ECCLevel.M, - QrCodeEccLevel.Q => QRCodeGenerator.ECCLevel.Q, - QrCodeEccLevel.H => QRCodeGenerator.ECCLevel.H, - _ => QRCodeGenerator.ECCLevel.M - }; - } - - public static byte[] GeneratePngBytes( - string? content, - string? darkHex = "#0F172A", - string? lightHex = "#FFFFFF", - QrCodeEccLevel ecc = QrCodeEccLevel.M, - int pixelsPerModule = 10, - bool drawQuietZones = true) - { - string payload = string.IsNullOrWhiteSpace(content) ? "https://codefrydev.in" : content; - byte[] darkRgba = HexToRgba(darkHex, 15, 23, 42); // #0F172A - byte[] lightRgba = HexToRgba(lightHex, 255, 255, 255); // #FFFFFF - - using var generator = new QRCodeGenerator(); - using var qrData = generator.CreateQrCode(payload, ToQRCoderEcc(ecc)); - using var qrCode = new PngByteQRCode(qrData); - - return qrCode.GetGraphic(pixelsPerModule, darkRgba, lightRgba, drawQuietZones); - } - - public static Bitmap? GenerateAvaloniaBitmap( - string? content, - string? darkHex = "#0F172A", - string? lightHex = "#FFFFFF", - QrCodeEccLevel ecc = QrCodeEccLevel.M, - int pixelsPerModule = 8, - bool drawQuietZones = true) - { - try - { - byte[] bytes = GeneratePngBytes(content, darkHex, lightHex, ecc, pixelsPerModule, drawQuietZones); - using var ms = new MemoryStream(bytes); - return new Bitmap(ms); - } - catch - { - return null; - } - } -} diff --git a/src/PdfEditorApp/Services/RecentDocumentsService.cs b/src/PdfEditorApp/Services/RecentDocumentsService.cs deleted file mode 100644 index e908465..0000000 --- a/src/PdfEditorApp/Services/RecentDocumentsService.cs +++ /dev/null @@ -1,103 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text.Json; -using PdfEditorApp.Models; - -namespace PdfEditorApp.Services; - -/// -/// Persists up to 20 recent documents to a JSON file in the user's application data folder. -/// -public class RecentDocumentsService : IRecentDocumentsService -{ - private const int MaxRecent = 20; - - private static string StoragePath - { - get - { - var appData = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); - var dir = Path.Combine(appData, "FryPDF"); - Directory.CreateDirectory(dir); - return Path.Combine(dir, "recent.json"); - } - } - - private static readonly JsonSerializerOptions _jsonOptions = new() - { - WriteIndented = true - }; - - public List Load() - { - try - { - if (!File.Exists(StoragePath)) return new List(); - var json = File.ReadAllText(StoragePath); - var list = JsonSerializer.Deserialize>(json, _jsonOptions) - ?? new List(); - return list.Where(x => !string.IsNullOrWhiteSpace(x.FilePath) && File.Exists(x.FilePath)).ToList(); - } - catch - { - return new List(); - } - } - - public void Add(RecentDocumentItem item) - { - if (string.IsNullOrWhiteSpace(item.FilePath) || !File.Exists(item.FilePath)) - return; - - var list = Load(); - // Remove existing entry for the same path (bump to top) - list.RemoveAll(x => string.Equals(x.FilePath, item.FilePath, StringComparison.OrdinalIgnoreCase)); - list.Insert(0, item); - // Trim to max - if (list.Count > MaxRecent) list = list.Take(MaxRecent).ToList(); - Save(list); - } - - public void Remove(string filePath) - { - var list = Load(); - list.RemoveAll(x => string.Equals(x.FilePath, filePath, StringComparison.OrdinalIgnoreCase)); - Save(list); - } - - public void Rename(string oldFilePath, string newFilePath, string newTitle) - { - if (string.IsNullOrWhiteSpace(oldFilePath) || string.IsNullOrWhiteSpace(newFilePath)) - return; - - var list = Load(); - var match = list.FirstOrDefault(x => string.Equals(x.FilePath, oldFilePath, StringComparison.OrdinalIgnoreCase)); - if (match != null) - { - match.FilePath = newFilePath; - match.Title = newTitle; - match.LastOpened = DateTime.UtcNow; - Save(list); - } - } - - public void Clear() - { - Save(new List()); - } - - private static void Save(List list) - { - try - { - var json = JsonSerializer.Serialize(list, _jsonOptions); - File.WriteAllText(StoragePath, json); - } - catch - { - // Best-effort: silently swallow disk errors - } - } -} diff --git a/src/PdfEditorApp/Services/Ribbon/RibbonRegistry.cs b/src/PdfEditorApp/Services/Ribbon/RibbonRegistry.cs deleted file mode 100644 index eb61aa3..0000000 --- a/src/PdfEditorApp/Services/Ribbon/RibbonRegistry.cs +++ /dev/null @@ -1,136 +0,0 @@ -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Linq; -using PdfEditorApp.Core.Plugins.Descriptors; - -namespace PdfEditorApp.Services.Ribbon; - -/// -/// Thread-safe in-memory registry for dynamic Ribbon tabs, groups, and action descriptors contributed by plugins. -/// -public class RibbonRegistry : IRibbonRegistry -{ - private readonly ConcurrentDictionary _tabs = new(StringComparer.OrdinalIgnoreCase); - private readonly ConcurrentDictionary _groups = new(StringComparer.OrdinalIgnoreCase); - private readonly ConcurrentDictionary _actions = new(StringComparer.OrdinalIgnoreCase); - - public event Action? RegistryChanged; - - public IDisposable RegisterTab(RibbonTabDescriptor tab) - { - ArgumentNullException.ThrowIfNull(tab); - ArgumentException.ThrowIfNullOrWhiteSpace(tab.Id); - - _tabs[tab.Id] = tab; - RegistryChanged?.Invoke(); - - return new UnregisterDisposable(() => - { - if (_tabs.TryRemove(tab.Id, out _)) - { - RegistryChanged?.Invoke(); - } - }); - } - - public IDisposable RegisterGroup(RibbonGroupDescriptor group) - { - ArgumentNullException.ThrowIfNull(group); - ArgumentException.ThrowIfNullOrWhiteSpace(group.Id); - - _groups[group.Id] = group; - RegistryChanged?.Invoke(); - - return new UnregisterDisposable(() => - { - if (_groups.TryRemove(group.Id, out _)) - { - RegistryChanged?.Invoke(); - } - }); - } - - public void RegisterAction(RibbonActionDescriptor action) - { - ArgumentNullException.ThrowIfNull(action); - ArgumentException.ThrowIfNullOrWhiteSpace(action.Id); - - _actions[action.Id] = action; - RegistryChanged?.Invoke(); - } - - public bool UnregisterAction(string actionId) - { - if (string.IsNullOrWhiteSpace(actionId)) return false; - - if (_actions.TryRemove(actionId, out _)) - { - RegistryChanged?.Invoke(); - return true; - } - return false; - } - - public IReadOnlyList GetAllTabs() - { - return _tabs.Values.OrderBy(t => t.Order).ThenBy(t => t.Title).ToList(); - } - - public IReadOnlyList GetGroupsForTab(string tabId) - { - if (string.IsNullOrWhiteSpace(tabId)) return Array.Empty(); - - return _groups.Values - .Where(g => string.Equals(g.TabId, tabId, StringComparison.OrdinalIgnoreCase)) - .OrderBy(g => g.Order) - .ThenBy(g => g.Title) - .ToList(); - } - - public IReadOnlyList GetActionsForTab(string tabId) - { - if (string.IsNullOrWhiteSpace(tabId)) return Array.Empty(); - - return _actions.Values - .Where(a => string.Equals(a.TabId, tabId, StringComparison.OrdinalIgnoreCase)) - .OrderBy(a => a.Order) - .ToList(); - } - - public IReadOnlyList GetActionsForGroup(string tabId, string groupId) - { - if (string.IsNullOrWhiteSpace(tabId) || string.IsNullOrWhiteSpace(groupId)) - return Array.Empty(); - - return _actions.Values - .Where(a => string.Equals(a.TabId, tabId, StringComparison.OrdinalIgnoreCase) && - string.Equals(a.GroupId, groupId, StringComparison.OrdinalIgnoreCase)) - .OrderBy(a => a.Order) - .ToList(); - } - - public IReadOnlyList GetAllActions() - { - return _actions.Values - .OrderBy(a => a.TabId) - .ThenBy(a => a.Order) - .ToList(); - } - - private sealed class UnregisterDisposable : IDisposable - { - private Action? _action; - - public UnregisterDisposable(Action action) - { - _action = action; - } - - public void Dispose() - { - var act = System.Threading.Interlocked.Exchange(ref _action, null); - act?.Invoke(); - } - } -} diff --git a/src/PdfEditorApp/Services/Sidebar/SidebarRegistry.cs b/src/PdfEditorApp/Services/Sidebar/SidebarRegistry.cs deleted file mode 100644 index 6ff0bc3..0000000 --- a/src/PdfEditorApp/Services/Sidebar/SidebarRegistry.cs +++ /dev/null @@ -1,66 +0,0 @@ -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Linq; -using PdfEditorApp.Core.Plugins.Descriptors; - -namespace PdfEditorApp.Services.Sidebar; - -/// -/// Thread-safe registry for document editor left/right sidebar tabs. -/// -public sealed class SidebarRegistry : ISidebarRegistry -{ - private readonly ConcurrentDictionary _tabs = new(StringComparer.OrdinalIgnoreCase); - - public event Action? RegistryChanged; - - public IDisposable RegisterTab(SidebarTabDescriptor descriptor) - { - ArgumentNullException.ThrowIfNull(descriptor); - _tabs[descriptor.Id] = descriptor; - RegistryChanged?.Invoke(); - - return new UnregisterDisposable(() => - { - UnregisterTab(descriptor.Id); - }); - } - - public bool UnregisterTab(string tabId) - { - if (_tabs.TryRemove(tabId, out _)) - { - RegistryChanged?.Invoke(); - return true; - } - return false; - } - - public SidebarTabDescriptor? GetTab(string tabId) - { - _tabs.TryGetValue(tabId, out var tab); - return tab; - } - - public IReadOnlyList GetAllTabs() - { - return _tabs.Values.OrderBy(t => t.Order).ThenBy(t => t.Title).ToList(); - } - - private sealed class UnregisterDisposable : IDisposable - { - private Action? _action; - - public UnregisterDisposable(Action action) - { - _action = action; - } - - public void Dispose() - { - var act = System.Threading.Interlocked.Exchange(ref _action, null); - act?.Invoke(); - } - } -} diff --git a/src/PdfEditorApp/Services/SignatureService.cs b/src/PdfEditorApp/Services/SignatureService.cs deleted file mode 100644 index 26d1398..0000000 --- a/src/PdfEditorApp/Services/SignatureService.cs +++ /dev/null @@ -1,206 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Security.Cryptography; -using System.Text; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; -using PdfEditorApp.Models; - -namespace PdfEditorApp.Services; - -public class SignaturePresetStyle -{ - public string Name { get; set; } = "Cursive Elegance"; - public SignatureStyle Style { get; set; } = SignatureStyle.CursiveElegance; - public string FontFamily { get; set; } = "Georgia"; - public bool IsItalic { get; set; } = true; - public string ColorHex { get; set; } = "#002B49"; // Traditional dark fountain blue -} - -public interface ISignatureService -{ - List GetAvailableSignatureStyles(); - PdfTextElement CreateCursiveSignatureElement(string signerName, SignatureStyle style, double x = 100, double y = 200); - PdfShapeElement CreateSignatureBoxElement(string signerName, string title = "Authorized Signatory", double x = 100, double y = 200); - PdfShapeElement CreateCryptographicSignatureSeal(string signerName, string organization, string reason, string sha256Fingerprint, double x = 100, double y = 200); - PdfTextElement CreateDateStampElement(double x = 100, double y = 200); - PdfShapeElement CreateInitialsElement(string initials, double x = 100, double y = 200); - PdfShapeElement CreateMarkupBadge(string symbol, string colorHex, double x = 100, double y = 200); - PdfFormFieldElement CreateFormFieldElement(FormFieldType fieldType, string fieldName, double x = 100, double y = 200, double width = 180, double height = 32); - string ComputeDocumentSha256(PdfDocumentModel document); -} - -public class SignatureService : ISignatureService -{ - public List GetAvailableSignatureStyles() - { - return new List - { - new() { Name = "Executive Elegance", Style = SignatureStyle.CursiveElegance, FontFamily = "Georgia", IsItalic = true, ColorHex = "#0F2942" }, - new() { Name = "Classic Script", Style = SignatureStyle.ClassicScript, FontFamily = "Times New Roman", IsItalic = true, ColorHex = "#0F6CBD" }, - new() { Name = "Modern Signature", Style = SignatureStyle.SignatureCasual, FontFamily = "Segoe UI", IsItalic = true, ColorHex = "#1E293B" }, - new() { Name = "Handwritten Legal Blue", Style = SignatureStyle.ModernHandwriting, FontFamily = "Arial", IsItalic = true, ColorHex = "#003366" } - }; - } - - public PdfTextElement CreateCursiveSignatureElement(string signerName, SignatureStyle style, double x = 100, double y = 200) - { - string font = style switch - { - SignatureStyle.CursiveElegance => "Georgia", - SignatureStyle.ClassicScript => "Times New Roman", - SignatureStyle.SignatureCasual => "Segoe UI", - SignatureStyle.ModernHandwriting => "Arial", - _ => "Georgia" - }; - - string color = style switch - { - SignatureStyle.ClassicScript => "#0F6CBD", - SignatureStyle.ModernHandwriting => "#003366", - _ => "#0F2942" - }; - - return new PdfTextElement - { - X = x, - Y = y, - Width = 260, - Height = 55, - Text = signerName, - FontFamily = font, - FontSize = 26, - IsItalic = true, - TextColorHex = color, - Alignment = TextAlignmentMode.Left - }; - } - - public PdfShapeElement CreateSignatureBoxElement(string signerName, string title = "Authorized Signatory", double x = 100, double y = 200) - { - return new PdfShapeElement - { - X = x, - Y = y, - Width = 280, - Height = 90, - ShapeType = ShapeType.RoundedRectangle, - CornerRadius = 6, - FillColorHex = "#F8FAFC", - StrokeColorHex = "#0F6CBD", - StrokeThickness = 1.5, - Label = $"DIGITALLY SIGNED & VERIFIED\n{signerName} ({title})\n{DateTime.UtcNow:yyyy-MM-dd HH:mm:ss} UTC", - LabelColorHex = "#0F6CBD", - LabelFontSize = 10 - }; - } - - public PdfShapeElement CreateCryptographicSignatureSeal(string signerName, string organization, string reason, string sha256Fingerprint, double x = 100, double y = 200) - { - string shortFingerprint = sha256Fingerprint.Length > 16 ? sha256Fingerprint.Substring(0, 16) : sha256Fingerprint; - return new PdfShapeElement - { - X = x, - Y = y, - Width = 320, - Height = 100, - ShapeType = ShapeType.RoundedRectangle, - CornerRadius = 8, - FillColorHex = "#F0FDF4", // Light emerald tint - StrokeColorHex = "#16A34A", // Emerald green border - StrokeThickness = 1.5, - Label = $"CRYPTOGRAPHIC X.509 DIGITAL SEAL\nSigner: {signerName} • {organization}\nReason: {reason}\nDigest: SHA256:{shortFingerprint}...\nVerified: {DateTime.UtcNow:yyyy-MM-dd HH:mm:ss} UTC", - LabelColorHex = "#15803D", - LabelFontSize = 9.5 - }; - } - - public PdfTextElement CreateDateStampElement(double x = 100, double y = 200) - { - return new PdfTextElement - { - X = x, - Y = y, - Width = 180, - Height = 32, - Text = $"Date: {DateTime.Now:MMM dd, yyyy}", - FontFamily = "Segoe UI", - FontSize = 12, - TextColorHex = "#334155", - Alignment = TextAlignmentMode.Left - }; - } - - public PdfShapeElement CreateInitialsElement(string initials, double x = 100, double y = 200) - { - string init = string.IsNullOrWhiteSpace(initials) ? "JD" : initials.Trim().ToUpper(); - return new PdfShapeElement - { - X = x, - Y = y, - Width = 60, - Height = 60, - ShapeType = ShapeType.Circle, - FillColorHex = "#EFF6FF", - StrokeColorHex = "#0F6CBD", - StrokeThickness = 2.0, - Label = init, - LabelColorHex = "#0F6CBD", - LabelFontSize = 18 - }; - } - - public PdfShapeElement CreateMarkupBadge(string symbol, string colorHex, double x = 100, double y = 200) - { - return new PdfShapeElement - { - X = x, - Y = y, - Width = 36, - Height = 36, - ShapeType = ShapeType.RoundedRectangle, - CornerRadius = 6, - FillColorHex = "#FFFFFF", - StrokeColorHex = colorHex, - StrokeThickness = 1.5, - Label = symbol, - LabelColorHex = colorHex, - LabelFontSize = 18 - }; - } - - public PdfFormFieldElement CreateFormFieldElement(FormFieldType fieldType, string fieldName, double x = 100, double y = 200, double width = 180, double height = 32) - { - return new PdfFormFieldElement - { - X = x, - Y = y, - Width = width, - Height = height, - FieldType = fieldType, - FieldName = fieldName, - DefaultValue = fieldType == FormFieldType.Checkbox ? "false" : "" - }; - } - - public string ComputeDocumentSha256(PdfDocumentModel document) - { - var sb = new StringBuilder(); - sb.Append(document.Title).Append('|'); - sb.Append(document.Author).Append('|'); - sb.Append(document.Subject).Append('|'); - sb.Append(document.Pages.Count).Append('|'); - - foreach (var page in document.Pages) - { - sb.Append(page.PageNumber).Append(':').Append(page.Elements.Count).Append('|'); - foreach (var el in page.Elements) - { - sb.Append(el.Kind).Append('@').Append(el.X).Append(',').Append(el.Y).Append(';'); - } - } - - byte[] hash = SHA256.HashData(Encoding.UTF8.GetBytes(sb.ToString())); - return Convert.ToHexString(hash); - } -} diff --git a/src/PdfEditorApp/Services/SmartPlacementService.cs b/src/PdfEditorApp/Services/SmartPlacementService.cs deleted file mode 100644 index 0dc9525..0000000 --- a/src/PdfEditorApp/Services/SmartPlacementService.cs +++ /dev/null @@ -1,111 +0,0 @@ -using System; -using PdfEditorApp.ViewModels; - -namespace PdfEditorApp.Services; - -public class SmartPlacementService : ISmartPlacementService -{ - private const double DefaultMargin = 28.0; - private const double CascadeOffset = 22.0; - - private double _viewportCenterX = 400.0; - private double _viewportCenterY = 300.0; - private double _visibleWidth = 800.0; - private double _visibleHeight = 600.0; - private bool _hasViewport; - - private (double X, double Y)? _pendingContextMenuPoint; - private double _lastBaseX = double.NaN; - private double _lastBaseY = double.NaN; - private int _cascadeCount; - - public void UpdateViewport(double pageCenterX, double pageCenterY, double visibleWidth, double visibleHeight) - { - _viewportCenterX = pageCenterX; - _viewportCenterY = pageCenterY; - _visibleWidth = visibleWidth; - _visibleHeight = visibleHeight; - _hasViewport = true; - } - - public void SetContextMenuPointer(double pageX, double pageY) - { - _pendingContextMenuPoint = (pageX, pageY); - } - - public void ClearContextMenuPointer() - { - _pendingContextMenuPoint = null; - } - - public void ResetCascade() - { - _cascadeCount = 0; - _lastBaseX = double.NaN; - _lastBaseY = double.NaN; - } - - public (double X, double Y) GetPlacementPosition( - PageViewModel page, - double elementWidth, - double elementHeight, - bool isContextMenuTriggered = false) - { - double targetX; - double targetY; - - double pageWidth = page.Width > 0 ? page.Width : 800.0; - double pageHeight = page.Height > 0 ? page.Height : 1131.0; - - if (_pendingContextMenuPoint.HasValue) - { - var pt = _pendingContextMenuPoint.Value; - _pendingContextMenuPoint = null; - - // When placed via context menu right-click: - // Place top-left near cursor with subtle offset so pointer doesn't obstruct content - targetX = pt.X - (elementWidth > 120 ? 30.0 : elementWidth / 2.0); - targetY = pt.Y - 10.0; - } - else if (_hasViewport) - { - // Viewport-center placement (Industry Standard: Figma / Canva / Miro) - targetX = _viewportCenterX - (elementWidth / 2.0); - targetY = _viewportCenterY - (elementHeight / 2.0); - } - else - { - // Fallback default center-top - targetX = Math.Max(DefaultMargin, (pageWidth - elementWidth) / 2.0); - targetY = 180.0; - } - - double baseTargetX = targetX; - double baseTargetY = targetY; - - // Sequential cascading offset when inserting consecutive elements at same base position - if (!double.IsNaN(_lastBaseX) && !double.IsNaN(_lastBaseY) && - Math.Abs(baseTargetX - _lastBaseX) < 2.0 && Math.Abs(baseTargetY - _lastBaseY) < 2.0) - { - _cascadeCount = (_cascadeCount + 1) % 6; - targetX += _cascadeCount * CascadeOffset; - targetY += _cascadeCount * CascadeOffset; - } - else - { - _cascadeCount = 0; - } - - _lastBaseX = baseTargetX; - _lastBaseY = baseTargetY; - - // Boundary and margin clamping - double maxX = Math.Max(DefaultMargin, pageWidth - elementWidth - DefaultMargin); - targetX = Math.Clamp(targetX, DefaultMargin, maxX); - - double maxY = Math.Max(DefaultMargin, pageHeight - elementHeight - DefaultMargin); - targetY = Math.Clamp(targetY, DefaultMargin, maxY); - - return (Math.Round(targetX, 1), Math.Round(targetY, 1)); - } -} diff --git a/src/PdfEditorApp/Services/StatusBar/StatusBarRegistry.cs b/src/PdfEditorApp/Services/StatusBar/StatusBarRegistry.cs deleted file mode 100644 index bbdc511..0000000 --- a/src/PdfEditorApp/Services/StatusBar/StatusBarRegistry.cs +++ /dev/null @@ -1,90 +0,0 @@ -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using PdfEditorApp.Core.Plugins.Descriptors; - -namespace PdfEditorApp.Services.StatusBar; - -public class StatusBarRegistry : IStatusBarRegistry -{ - private readonly ConcurrentDictionary _widgets = new(StringComparer.OrdinalIgnoreCase); - - public event Action? RegistryChanged; - - public StatusBarRegistry(bool seedDefaults = true) - { - if (seedDefaults) - { - RegisterBuiltInWidgets(); - } - } - - private void RegisterBuiltInWidgets() - { - RegisterWidget(new StatusBarWidgetDescriptor - { - WidgetId = "frypdf.status.active_indicator", - Alignment = StatusBarAlignment.Left, - Order = 10, - ToolTip = "System Operational & Ready", - Factory = sp => new ViewModels.StatusBarWidgetViewModel - { - WidgetId = "frypdf.status.active_indicator", - Label = "Ready", - IconKind = "CheckCircleOutline", - ToolTip = "System Operational & Ready", - IsActive = true - } - }); - - RegisterWidget(new StatusBarWidgetDescriptor - { - WidgetId = "frypdf.status.memory_monitor", - Alignment = StatusBarAlignment.Right, - Order = 90, - ToolTip = "SkiaSharp High-Performance Graphics Acceleration", - Factory = sp => new ViewModels.StatusBarWidgetViewModel - { - WidgetId = "frypdf.status.memory_monitor", - Label = "Skia 64-bit", - IconKind = "Memory", - ToolTip = "SkiaSharp High-Performance Graphics Acceleration", - IsActive = true - } - }); - } - - public IDisposable RegisterWidget(StatusBarWidgetDescriptor widget) - { - ArgumentNullException.ThrowIfNull(widget); - _widgets[widget.WidgetId] = widget; - RegistryChanged?.Invoke(); - - return new DisposableAction(() => - { - _widgets.TryRemove(widget.WidgetId, out _); - RegistryChanged?.Invoke(); - }); - } - - public IReadOnlyList GetWidgets(StatusBarAlignment alignment) - { - return _widgets.Values - .Where(w => w.Alignment == alignment) - .OrderBy(w => w.Order) - .ToList(); - } - - public IReadOnlyList GetAllWidgets() - { - return _widgets.Values.OrderBy(w => w.Order).ToList(); - } - - private sealed class DisposableAction(Action action) : IDisposable - { - private Action? _action = action; - public void Dispose() => Interlocked.Exchange(ref _action, null)?.Invoke(); - } -} diff --git a/src/PdfEditorApp/Services/SvgOrnamentLibrary.cs b/src/PdfEditorApp/Services/SvgOrnamentLibrary.cs deleted file mode 100644 index 54f6a88..0000000 --- a/src/PdfEditorApp/Services/SvgOrnamentLibrary.cs +++ /dev/null @@ -1,605 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace PdfEditorApp.Services; - -/// -/// Built-in vector ornaments, ceremonial emblems, wedding garlands, and luxury invitation assets. -/// -public static class SvgOrnamentLibrary -{ - public static readonly Dictionary Presets = new(StringComparer.OrdinalIgnoreCase) - { - { "GaneshaCrest", GetGaneshaCrestSvg() }, - { "MarigoldToran", GetMarigoldToranSvg() }, - { "TraditionalDeepam", GetTraditionalDeepamSvg() }, - { "HangingDiyas", GetHangingDiyasSvg() }, - { "DottedFloralDivider", GetDottedFloralDividerSvg() }, - { "MandapArch", GetMandapArchSvg() }, - { "PlantainTrees", GetPlantainTreesSvg() }, - { "AuspiciousKalash", GetAuspiciousKalashSvg() }, - { "BotanicalWreath", GetBotanicalWreathSvg() }, - { "ArtDecoFrame", GetArtDecoFrameSvg() }, - { "CalligraphicFlourish", GetCalligraphicFlourishSvg() }, - { "OmCrest", GetOmCrestSvg() }, - { "TriangularPhaseCycle", GetTriangularPhaseCycleSvg() }, - { "Triangular Phase Cycle", GetTriangularPhaseCycleSvg() }, - { "ParticleArrangementGrid", GetParticleArrangementGridSvg() }, - { "ParticleArrangement", GetParticleArrangementGridSvg() }, - { "Particle Arrangement", GetParticleArrangementGridSvg() }, - { "QuadrilateralSetDiagram", GetQuadrilateralSetDiagramSvg() }, - { "Quadrilaterals Geometry Diagram", GetQuadrilateralSetDiagramSvg() }, - { "QuadrilateralsGeometryDiagram", GetQuadrilateralSetDiagramSvg() } - }; - - public static string GetSvg(string? presetName, string? tintHex = null) - { - if (string.IsNullOrWhiteSpace(presetName) || - (!Presets.TryGetValue(presetName, out var svg) && - !Presets.TryGetValue(presetName.Replace(" ", "").Replace("-", "").Replace("_", ""), out svg))) - { - svg = GetGaneshaCrestSvg(); - } - - if (!string.IsNullOrWhiteSpace(tintHex)) - { - // Apply tint to main strokes and fills if requested - svg = svg.Replace("currentColor", tintHex); - } - - return svg; - } - - /// - /// Sacred Lord Ganesha auspicious line-art crest for wedding invitations. - /// - public static string GetGaneshaCrestSvg(string colorHex = "#8B0000", string goldHex = "#D97706") - { - return $@" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -"; - } - - /// - /// Festive Marigold Toran Garland with mango leaves and hanging brass lamps. - /// - public static string GetMarigoldToranSvg(string orange = "#EA580C", string yellow = "#FBBF24", string green = "#15803D", string gold = "#D97706") - { - return $@" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -"; - } - - /// - /// Traditional brass Indian standing oil lamp (Samai / Kuthu Vilakku) with glowing flame. - /// - public static string GetTraditionalDeepamSvg(string gold = "#D97706", string flame = "#EA580C", string glow = "#FBBF24") - { - return $@" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -"; - } - - /// - /// Pair of hanging decorative lamps. - /// - public static string GetHangingDiyasSvg(string gold = "#D97706", string flame = "#EA580C", string yellow = "#FBBF24") - { - return $@" - - - - - - - - - - - -"; - } - - /// - /// Dotted floral divider with center lotus medallion. - /// - public static string GetDottedFloralDividerSvg(string gold = "#D97706", string maroon = "#8B0000") - { - return $@" - - - - - - - - - - - - - - - - - - -"; - } - - /// - /// Traditional Indian wedding mandap pillar arch border. - /// - public static string GetMandapArchSvg(string gold = "#D97706", string maroon = "#8B0000") - { - return $@" - - - - - - - - - - - - -"; - } - - /// - /// Ceremonial banana trees / plantain wedding stems. - /// - public static string GetPlantainTreesSvg(string green = "#16A34A", string darkGreen = "#15803D", string yellow = "#FBBF24") - { - return $@" - - - - - - - - - - - - - - - - - - - - - - - - - -"; - } - - /// - /// Auspicious Vedic Kalash with coconut and mango leaves. - /// - public static string GetAuspiciousKalashSvg(string copper = "#B45309", string gold = "#F59E0B", string green = "#15803D") - { - return $@" - - - - - - - - - - - - - - - - - - - - - - -"; - } - - /// - /// Royal Botanical Floral Wreath for Luxury Gala and Wedding Invitations. - /// - public static string GetBotanicalWreathSvg(string gold = "#D97706", string leaf = "#059669") - { - return $@" - - - - - - - - - - - - - - - - - - - - - - -"; - } - - /// - /// Art Deco Gold Luxury Geometric Frame. - /// - public static string GetArtDecoFrameSvg(string gold = "#D97706") - { - return $@" - - - - - - - - - - - - - - -"; - } - - /// - /// Calligraphic Swirl & Filigree Flourish. - /// - public static string GetCalligraphicFlourishSvg(string colorHex = "#78350F") - { - return $@" - - - - -"; - } - - /// - /// Sacred Om symbol crest. - /// - public static string GetOmCrestSvg(string gold = "#D97706", string maroon = "#8B0000") - { - return $@" - - - - - - - - -"; - } - - /// - /// Triangular Phase Change Cycle Diagram: Solid (ठोस) <-> Liquid (द्रव) <-> Gas (गैस) with 6 transition arrows. - /// Matches sample 'interchange_solid_liquid_gas' and 'states_of_matter_visual_notes'. - /// - public static string GetTriangularPhaseCycleSvg(string primary = "#0284C7", string accent = "#DC2626", string textDark = "#0F172A") - { - return $@" - - - - - - - - - - - - GAS (गैस) - High Kinetic Energy - - - - SOLID (ठोस) - Fixed Shape & Volume - - - - LIQUID (द्रव) - Fixed Volume, Fluid - - - - Melting / गलनांक / संलयन → - - - - ← Freezing / जमना / हिमीकरण - - - - Sublimation / ऊर्ध्वपातन ↗ - - - - ↙ Deposition / निक्षेपण - - - - Condensation / संघनन ↘ - - - - ↖ Vaporization / वाष्पीकरण -"; - } - - /// - /// Comparative Particle Arrangement Diagram (Solid lattice, Liquid fluid, Gas dispersed). - /// Matches sample 'states_of_matter_visual_notes' and 'states_of_matter_notes'. - /// - public static string GetParticleArrangementGridSvg() - { - return $@" - - - - Solid (ठोस) - - - - - - - - - - - - - - - - - - - - - - - Liquid (द्रव) - - - - - - - - - - - - - - - - Gas (गैस) - - - - - - - - - - - -"; - } - - /// - /// Geometric Quadrilaterals Reference Diagram: Parallelogram, Rhombus, Trapezoid, Kite. - /// Matches sample 'Types_of_Quadrilaterals_Hindi_English'. - /// - public static string GetQuadrilateralSetDiagramSvg() - { - return $@" - - - - - h - b - Parallelogram (समांतर) - Area = b × h - - - - - - - - Rhombus (समचतुर्भुज) - Area = ½ d₁ d₂ - - - - - - - h - a - b - Trapezoid (समलंब) - Area = ½(a+b)h - - - - - - - - Kite (पतंग) - Diagonals ⊥ - -"; - } -} - diff --git a/src/PdfEditorApp/Services/SvgShapeHelper.cs b/src/PdfEditorApp/Services/SvgShapeHelper.cs deleted file mode 100644 index eea7901..0000000 --- a/src/PdfEditorApp/Services/SvgShapeHelper.cs +++ /dev/null @@ -1,469 +0,0 @@ -using System; -using System.Globalization; -using System.Text; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; -using PdfEditorApp.Models; - -namespace PdfEditorApp.Services; - -public static class SvgShapeHelper -{ - public static string GetVectorPath(ShapeType shapeType, double width, double height, double cornerRadius = 4, string? customPathData = null) - { - if (shapeType == ShapeType.CustomSvgPath && !string.IsNullOrWhiteSpace(customPathData)) - { - return customPathData.Trim(); - } - - double w = Math.Max(10, width); - double h = Math.Max(10, height); - double r = Math.Min(cornerRadius > 0 ? cornerRadius : 8, Math.Min(w / 2, h / 2)); - - var ci = CultureInfo.InvariantCulture; - - return shapeType switch - { - ShapeType.RoundedRectangle => - string.Format(ci, "M {0:F1},0 L {1:F1},0 A {0:F1},{0:F1} 0 0 1 {2:F1},{0:F1} L {2:F1},{3:F1} A {0:F1},{0:F1} 0 0 1 {1:F1},{4:F1} L {0:F1},{4:F1} A {0:F1},{0:F1} 0 0 1 0,{3:F1} L 0,{0:F1} A {0:F1},{0:F1} 0 0 1 {0:F1},0 Z", - r, w - r, w, h - r, h), - - ShapeType.Circle => - string.Format(ci, "M {0:F1},0 A {0:F1},{1:F1} 0 1 1 {0:F1},{2:F1} A {0:F1},{1:F1} 0 1 1 {0:F1},0 Z", - w / 2.0, h / 2.0, h), - - ShapeType.Triangle => - string.Format(ci, "M {0:F1},0 L {1:F1},{2:F1} L 0,{2:F1} Z", - w / 2.0, w, h), - - ShapeType.RightTriangle => - string.Format(ci, "M 0,0 L {0:F1},{1:F1} L 0,{1:F1} Z", - w, h), - - ShapeType.Diamond => - string.Format(ci, "M {0:F1},0 L {1:F1},{2:F1} L {0:F1},{3:F1} L 0,{2:F1} Z", - w / 2.0, w, h / 2.0, h), - - ShapeType.Pentagon => - string.Format(ci, "M {0:F1},0 L {1:F1},{2:F1} L {3:F1},{4:F1} L {5:F1},{4:F1} L 0,{2:F1} Z", - w / 2.0, w, h * 0.38, w * 0.81, h, w * 0.19), - - ShapeType.Hexagon => - string.Format(ci, "M {0:F1},0 L {1:F1},0 L {2:F1},{3:F1} L {1:F1},{4:F1} L {0:F1},{4:F1} L 0,{3:F1} Z", - w * 0.25, w * 0.75, w, h / 2.0, h), - - ShapeType.Octagon => - string.Format(ci, "M {0:F1},0 L {1:F1},0 L {2:F1},{3:F1} L {2:F1},{4:F1} L {1:F1},{5:F1} L {0:F1},{5:F1} L 0,{4:F1} L 0,{3:F1} Z", - w * 0.3, w * 0.7, w, h * 0.3, h * 0.7, h), - - ShapeType.Star5 or ShapeType.Star => - string.Format(ci, "M {0:F1},0 L {1:F1},{2:F1} L {3:F1},{2:F1} L {4:F1},{5:F1} L {6:F1},{7:F1} L {0:F1},{8:F1} L {9:F1},{7:F1} L {10:F1},{5:F1} L 0,{2:F1} L {11:F1},{2:F1} Z", - w * 0.5, w * 0.62, h * 0.35, w, w * 0.69, h * 0.57, w * 0.81, h, h * 0.75, w * 0.19, w * 0.31, w * 0.38), - - ShapeType.Star4Badge => - string.Format(ci, "M {0:F1},0 L {1:F1},{2:F1} L {3:F1},{4:F1} L {1:F1},{5:F1} L {0:F1},{6:F1} L {7:F1},{5:F1} L 0,{4:F1} L {7:F1},{2:F1} Z", - w * 0.5, w * 0.65, h * 0.35, w, h * 0.5, h * 0.65, h, w * 0.35), - - ShapeType.Star8Badge => - GenerateStarPath(w, h, 8, 0.6), - - ShapeType.Star12Seal or ShapeType.RosetteSeal => - GenerateStarPath(w, h, 16, 0.78), - - ShapeType.ShieldBadge => - string.Format(ci, "M 0,0 L {0:F1},0 L {0:F1},{1:F1} Q {0:F1},{2:F1} {3:F1},{2:F1} Q 0,{2:F1} 0,{1:F1} Z", - w, h * 0.6, h, w / 2.0), - - ShapeType.AwardBadge => - GenerateStarPath(w, h, 12, 0.72), - - ShapeType.LaurelWreathSeal => - string.Format(ci, "M {0:F1},0 A {0:F1},{1:F1} 0 1 1 {0:F1},{2:F1} A {0:F1},{1:F1} 0 1 1 {0:F1},0 Z M {0:F1},{3:F1} A {4:F1},{5:F1} 0 1 0 {0:F1},{6:F1} A {4:F1},{5:F1} 0 1 0 {0:F1},{3:F1} Z", - w / 2.0, h / 2.0, h, h * 0.12, (w * 0.38), (h * 0.38), h * 0.88), - - ShapeType.MedalRibbonBadge => - string.Format(ci, "M {0:F1},0 A {0:F1},{1:F1} 0 1 1 {0:F1},{2:F1} A {0:F1},{1:F1} 0 1 1 {0:F1},0 Z M {3:F1},{4:F1} L {5:F1},{6:F1} L {7:F1},{8:F1} L {9:F1},{4:F1} Z M {10:F1},{4:F1} L {11:F1},{8:F1} L {12:F1},{6:F1} L {13:F1},{4:F1} Z", - w / 2.0, h * 0.35, h * 0.7, - w * 0.25, h * 0.55, w * 0.12, h, w * 0.32, h * 0.88, w * 0.42, - w * 0.58, w * 0.68, w * 0.88, w * 0.75), - - ShapeType.RibbonBanner => - string.Format(ci, "M 0,0 L {0:F1},0 L {1:F1},{2:F1} L {0:F1},{3:F1} L 0,{3:F1} L {4:F1},{2:F1} Z", - w, w - 18.0, h / 2.0, h, 18.0), - - ShapeType.CornerPolygonalAccentTopLeft => - string.Format(ci, "M 0,0 L {0:F1},0 L {1:F1},{2:F1} L 0,{3:F1} Z", - w, w * 0.32, h * 0.48, h), - - ShapeType.CornerPolygonalAccentBottomRight => - string.Format(ci, "M {0:F1},{1:F1} L 0,{1:F1} L {2:F1},{3:F1} L {0:F1},0 Z", - w, h, w * 0.68, h * 0.52), - - ShapeType.CornerDiagonalWedge => - string.Format(ci, "M 0,0 L {0:F1},0 L 0,{1:F1} Z", - w, h), - - ShapeType.Chevron => - string.Format(ci, "M 0,0 L {0:F1},0 L {1:F1},{2:F1} L {0:F1},{3:F1} L 0,{3:F1} L {4:F1},{2:F1} Z", - w * 0.7, w, h / 2.0, h, w * 0.3), - - ShapeType.Trapezoid => - string.Format(ci, "M {0:F1},0 L {1:F1},0 L {2:F1},{3:F1} L 0,{3:F1} Z", - w * 0.2, w * 0.8, w, h), - - ShapeType.Parallelogram => - string.Format(ci, "M {0:F1},0 L {1:F1},0 L {2:F1},{3:F1} L 0,{3:F1} Z", - w * 0.25, w, w * 0.75, h), - - ShapeType.ArrowRight or ShapeType.Arrow => - string.Format(ci, "M 0,{0:F1} L {1:F1},{0:F1} L {1:F1},0 L {2:F1},{3:F1} L {1:F1},{4:F1} L {1:F1},{5:F1} L 0,{5:F1} Z", - h * 0.3, w * 0.6, w, h * 0.5, h, h * 0.7), - - ShapeType.ArrowLeft => - string.Format(ci, "M {0:F1},{1:F1} L {2:F1},{1:F1} L {2:F1},0 L 0,{3:F1} L {2:F1},{4:F1} L {2:F1},{5:F1} L {0:F1},{5:F1} Z", - w, h * 0.3, w * 0.4, h * 0.5, h, h * 0.7), - - ShapeType.Callout => - string.Format(ci, "M 0,0 L {0:F1},0 L {0:F1},{1:F1} L {2:F1},{1:F1} L {3:F1},{4:F1} L {5:F1},{1:F1} L 0,{1:F1} Z", - w, h * 0.75, w * 0.55, w * 0.3, h, w * 0.35), - - ShapeType.Heart => - string.Format(ci, "M {0:F1},{1:F1} C {2:F1},0 0,{3:F1} 0,{4:F1} C 0,{5:F1} {2:F1},{6:F1} {0:F1},{7:F1} C {8:F1},{6:F1} {9:F1},{5:F1} {9:F1},{4:F1} C {9:F1},{3:F1} {8:F1},0 {0:F1},{1:F1} Z", - w * 0.5, h * 0.25, w * 0.3, h * 0.2, h * 0.45, h * 0.7, h * 0.85, h, w * 0.7, w), - - ShapeType.Cloud => - string.Format(ci, "M {0:F1},{1:F1} A {2:F1},{3:F1} 0 0 1 {4:F1},{5:F1} A {6:F1},{5:F1} 0 0 1 {7:F1},{8:F1} A {9:F1},{10:F1} 0 0 1 {11:F1},{1:F1} Z", - w * 0.2, h * 0.7, w * 0.15, h * 0.2, w * 0.35, h * 0.3, w * 0.25, w * 0.75, h * 0.35, w * 0.18, h * 0.22, w * 0.9), - - ShapeType.Line => - string.Format(ci, "M 0,{0:F1} L {1:F1},{0:F1}", - h / 2.0, w), - - ShapeType.BezierCurve => - string.Format(ci, "M 0,{0:F1} C {1:F1},0 {2:F1},{3:F1} {4:F1},{0:F1}", - h * 0.5, w * 0.33, w * 0.67, h, w), - - ShapeType.CurvedArrow => - string.Format(ci, "M 0,{0:F1} C {1:F1},0 {2:F1},{3:F1} {4:F1},{0:F1} M {5:F1},{6:F1} L {4:F1},{0:F1} L {7:F1},{8:F1}", - h * 0.5, w * 0.33, w * 0.67, h, w - 8.0, w - 18.0, (h * 0.5) - 8.0, w - 18.0, (h * 0.5) + 8.0), - - ShapeType.SCurveConnector => - string.Format(ci, "M 0,{0:F1} C {1:F1},{0:F1} {2:F1},0 {3:F1},0", - h, w * 0.45, w * 0.55, w), - - ShapeType.WaveLine => - string.Format(ci, "M 0,{0:F1} C {1:F1},0 {2:F1},{3:F1} {4:F1},{0:F1} C {5:F1},0 {6:F1},{3:F1} {7:F1},{0:F1}", - h * 0.5, w * 0.125, w * 0.375, h, w * 0.5, w * 0.625, w * 0.875, w), - - ShapeType.ArcLine => - string.Format(ci, "M 0,{0:F1} Q {1:F1},0 {2:F1},{0:F1}", - h, w * 0.5, w), - - ShapeType.CurlyBrace => - string.Format(ci, "M {0:F1},0 C {1:F1},0 {1:F1},{2:F1} 0,{3:F1} C {1:F1},{4:F1} {1:F1},{5:F1} {0:F1},{5:F1}", - w, w * 0.45, h * 0.4, h * 0.5, h * 0.6, h), - - ShapeType.CurvedCallout => - string.Format(ci, "M {0:F1},0 L {1:F1},0 A {0:F1},{0:F1} 0 0 1 {2:F1},{0:F1} L {2:F1},{3:F1} A {0:F1},{0:F1} 0 0 1 {1:F1},{4:F1} L {5:F1},{4:F1} Q {6:F1},{4:F1} {7:F1},{8:F1} Q {9:F1},{10:F1} {9:F1},{4:F1} L {0:F1},{4:F1} A {0:F1},{0:F1} 0 0 1 0,{3:F1} L 0,{0:F1} A {0:F1},{0:F1} 0 0 1 {0:F1},0 Z", - r, w - r, w, h * 0.72 - r, h * 0.72, w * 0.5, w * 0.38, w * 0.22, h, w * 0.32, h * 0.82), - - ShapeType.Teardrop => - string.Format(ci, "M {0:F1},0 C {1:F1},{2:F1} {3:F1},{4:F1} {0:F1},{5:F1} C 0,{4:F1} {6:F1},{2:F1} {0:F1},0 Z", - w * 0.5, w * 0.85, h * 0.45, w, h * 0.75, h, w * 0.15), - - ShapeType.WaveRibbon => - string.Format(ci, "M 0,{0:F1} Q {1:F1},0 {2:F1},{0:F1} Q {3:F1},{4:F1} {5:F1},{0:F1} L {5:F1},{6:F1} Q {3:F1},{7:F1} {2:F1},{6:F1} Q {1:F1},{8:F1} 0,{6:F1} Z", - h * 0.2, w * 0.25, w * 0.5, w * 0.75, h * 0.4, w, h * 0.8, h, h * 0.6), - - ShapeType.OrganicBlob => - string.Format(ci, "M {0:F1},0 C {1:F1},{2:F1} {3:F1},{4:F1} {5:F1},{6:F1} C {0:F1},{7:F1} {8:F1},{6:F1} 0,{4:F1} C 0,{2:F1} {8:F1},0 {0:F1},0 Z", - w * 0.5, w * 0.9, h * 0.12, w, h * 0.6, w * 0.75, h * 0.9, h, w * 0.15), - - ShapeType.Card => - string.Format(ci, "M {0:F1},0 L {1:F1},0 A {0:F1},{0:F1} 0 0 1 {2:F1},{0:F1} L {2:F1},{3:F1} A {0:F1},{0:F1} 0 0 1 {1:F1},{4:F1} L {0:F1},{4:F1} A {0:F1},{0:F1} 0 0 1 0,{3:F1} L 0,{0:F1} A {0:F1},{0:F1} 0 0 1 {0:F1},0 Z", - r, w - r, w, h - r, h), - - ShapeType.StickyNote => - string.Format(ci, "M 0,0 L {0:F1},0 L {1:F1},18 L {1:F1},{2:F1} L 0,{2:F1} Z M {0:F1},0 L {0:F1},18 L {1:F1},18", - w - 18.0, w, h), - - _ => string.Format(ci, "M 0,0 L {0:F1},0 L {0:F1},{1:F1} L 0,{1:F1} Z", w, h) - }; - } - - public static string? GetDashArray(LineDashStyle style, double strokeThickness) - { - double st = Math.Max(1.0, strokeThickness); - var ci = CultureInfo.InvariantCulture; - return style switch - { - LineDashStyle.Dashed => string.Format(ci, "{0:F1},{1:F1}", st * 3.5, st * 2.0), - LineDashStyle.Dotted => string.Format(ci, "{0:F1},{1:F1}", st, st * 2.0), - LineDashStyle.DashDot => string.Format(ci, "{0:F1},{1:F1},{2:F1},{1:F1}", st * 4.0, st * 2.0, st), - _ => null - }; - } - - public static string GenerateSmoothInkSvgPath(string pointsData, bool isSmoothSpline = true) - { - if (string.IsNullOrWhiteSpace(pointsData)) return "M 0,0"; - - var ci = CultureInfo.InvariantCulture; - var rawParts = pointsData.Trim().Split(new[] { ' ', ';', '\n', '\r', '\t' }, StringSplitOptions.RemoveEmptyEntries); - var points = new System.Collections.Generic.List<(double X, double Y)>(); - - foreach (var p in rawParts) - { - var coords = p.Split(','); - if (coords.Length == 2 && - double.TryParse(coords[0], NumberStyles.Float, CultureInfo.InvariantCulture, out double x) && - double.TryParse(coords[1], NumberStyles.Float, CultureInfo.InvariantCulture, out double y)) - { - points.Add((x, y)); - } - } - - if (points.Count == 0) return "M 0,0"; - if (points.Count == 1) return string.Format(ci, "M {0:F1},{1:F1} L {0:F1},{1:F1}", points[0].X, points[0].Y); - if (points.Count == 2 || !isSmoothSpline) - { - var sbPoly = new StringBuilder(); - sbPoly.AppendFormat(ci, "M {0:F1},{1:F1}", points[0].X, points[0].Y); - for (int i = 1; i < points.Count; i++) - { - sbPoly.AppendFormat(ci, " L {0:F1},{1:F1}", points[i].X, points[i].Y); - } - return sbPoly.ToString(); - } - - // Catmull-Rom to Cubic Bézier Spline Conversion - var sb = new StringBuilder(); - sb.AppendFormat(ci, "M {0:F1},{1:F1}", points[0].X, points[0].Y); - - int n = points.Count; - for (int i = 0; i < n - 1; i++) - { - var p0 = i > 0 ? points[i - 1] : points[i]; - var p1 = points[i]; - var p2 = points[i + 1]; - var p3 = i < n - 2 ? points[i + 2] : p2; - - // Catmull-Rom tangents: T1 = (p2 - p0)/2, T2 = (p3 - p1)/2 - double t1x = (p2.X - p0.X) / 2.0; - double t1y = (p2.Y - p0.Y) / 2.0; - double t2x = (p3.X - p1.X) / 2.0; - double t2y = (p3.Y - p1.Y) / 2.0; - - // Cubic Bézier control points: C1 = p1 + T1/3, C2 = p2 - T2/3 - double c1x = p1.X + (t1x / 3.0); - double c1y = p1.Y + (t1y / 3.0); - double c2x = p2.X - (t2x / 3.0); - double c2y = p2.Y - (t2y / 3.0); - - sb.AppendFormat(ci, " C {0:F1},{1:F1} {2:F1},{3:F1} {4:F1},{5:F1}", c1x, c1y, c2x, c2y, p2.X, p2.Y); - } - - return sb.ToString(); - } - - public static string GenerateDividerSvgPath(DividerStyle style, double width, double height, double amplitude = 6.0, double frequency = 4.0, bool isVertical = false) - { - double w = isVertical ? Math.Max(1.0, width) : Math.Max(10.0, width); - double h = isVertical ? Math.Max(10.0, height) : Math.Max(1.0, height); - var ci = CultureInfo.InvariantCulture; - - if (isVertical) - { - double midX = w / 2.0; - return style switch - { - DividerStyle.Wave => string.Format(ci, "M {0:F1},0 C {1:F1},{2:F1} {3:F1},{4:F1} {0:F1},{5:F1} C {1:F1},{6:F1} {3:F1},{7:F1} {0:F1},{8:F1}", - midX, midX - amplitude, h * 0.15, midX + amplitude, h * 0.35, h * 0.5, h * 0.65, h * 0.85, h), - DividerStyle.Arch => string.Format(ci, "M {0:F1},0 Q {1:F1},{2:F1} {0:F1},{3:F1}", - midX, midX - amplitude, h * 0.5, h), - _ => string.Format(ci, "M {0:F1},0 L {0:F1},{1:F1}", midX, h) - }; - } - - double midY = h / 2.0; - double amp = Math.Min(midY, Math.Max(2.0, amplitude)); - int cycles = Math.Max(1, (int)Math.Round(frequency)); - - return style switch - { - DividerStyle.Wave => GenerateHarmonicWavePath(w, midY, amp, cycles), - DividerStyle.SCurve => string.Format(ci, "M 0,{0:F1} C {1:F1},{2:F1} {3:F1},{4:F1} {5:F1},{0:F1}", - midY, w * 0.35, midY - amp, w * 0.65, midY + amp, w), - DividerStyle.Arch => string.Format(ci, "M 0,{0:F1} Q {1:F1},{2:F1} {3:F1},{0:F1}", - midY, w * 0.5, midY - amp, w), - DividerStyle.DoubleWave => GenerateDoubleWavePath(w, midY, amp, cycles), - DividerStyle.CalligraphicFlourish => string.Format(ci, "M 0,{0:F1} C {1:F1},{2:F1} {3:F1},{4:F1} {5:F1},{0:F1} L {6:F1},{0:F1} L {7:F1},{2:F1} L {8:F1},{0:F1} L {9:F1},{0:F1} C {10:F1},{2:F1} {11:F1},{4:F1} {12:F1},{0:F1}", - midY, w * 0.1, midY - amp, w * 0.25, midY + amp, w * 0.45, w * 0.48, w * 0.5, w * 0.52, w * 0.55, w * 0.75, w * 0.9, w), - _ => string.Format(ci, "M 0,{0:F1} L {1:F1},{0:F1}", midY, w) - }; - } - - private static string GenerateHarmonicWavePath(double w, double midY, double amp, int cycles) - { - var ci = CultureInfo.InvariantCulture; - var sb = new StringBuilder(); - sb.AppendFormat(ci, "M 0,{0:F1}", midY); - - double cycleWidth = w / cycles; - for (int i = 0; i < cycles; i++) - { - double startX = i * cycleWidth; - double endX = startX + cycleWidth; - double cp1x = startX + (cycleWidth * 0.25); - double cp2x = startX + (cycleWidth * 0.75); - - sb.AppendFormat(ci, " C {0:F1},{1:F1} {2:F1},{3:F1} {4:F1},{5:F1}", - cp1x, midY - amp, cp2x, midY + amp, endX, midY); - } - - return sb.ToString(); - } - - private static string GenerateDoubleWavePath(double w, double midY, double amp, int cycles) - { - var ci = CultureInfo.InvariantCulture; - string wave1 = GenerateHarmonicWavePath(w, midY - (amp * 0.4), amp * 0.6, cycles); - string wave2 = GenerateHarmonicWavePath(w, midY + (amp * 0.4), amp * 0.6, cycles); - return wave1 + " " + wave2; - } - - private static string GenerateStarPath(double w, double h, int points, double innerRadiusRatio) - { - var ci = CultureInfo.InvariantCulture; - var sb = new StringBuilder(); - - double cx = w / 2.0; - double cy = h / 2.0; - double rx = w / 2.0; - double ry = h / 2.0; - double innerRx = rx * innerRadiusRatio; - double innerRy = ry * innerRadiusRatio; - - int totalVertices = points * 2; - double angleStep = Math.PI * 2.0 / totalVertices; - double startAngle = -Math.PI / 2.0; - - for (int i = 0; i < totalVertices; i++) - { - double angle = startAngle + (i * angleStep); - bool isOuter = (i % 2 == 0); - double currentRx = isOuter ? rx : innerRx; - double currentRy = isOuter ? ry : innerRy; - - double x = cx + (currentRx * Math.Cos(angle)); - double y = cy + (currentRy * Math.Sin(angle)); - - if (i == 0) - sb.AppendFormat(ci, "M {0:F1},{1:F1} ", x, y); - else - sb.AppendFormat(ci, "L {0:F1},{1:F1} ", x, y); - } - - sb.Append("Z"); - return sb.ToString(); - } - - public static string GenerateSvgMarkup(PdfShapeElement shape) - { - double w = Math.Max(10, shape.Width); - double h = Math.Max(10, shape.Height); - var ci = CultureInfo.InvariantCulture; - - string fill = string.IsNullOrWhiteSpace(shape.FillColorHex) || shape.FillColorHex.Equals("Transparent", StringComparison.OrdinalIgnoreCase) || shape.FillColorHex == "#00000000" - ? "none" - : shape.FillColorHex; - - string stroke = string.IsNullOrWhiteSpace(shape.StrokeColorHex) || shape.StrokeColorHex.Equals("Transparent", StringComparison.OrdinalIgnoreCase) || shape.StrokeColorHex == "#00000000" - ? "none" - : shape.StrokeColorHex; - - double strokeThickness = shape.StrokeThickness > 0 ? shape.StrokeThickness : 0; - string? dashArray = GetDashArray(shape.DashStyle, strokeThickness); - string dashAttr = !string.IsNullOrEmpty(dashArray) ? string.Format(ci, " stroke-dasharray=\"{0}\"", dashArray) : ""; - - var sb = new StringBuilder(); - sb.AppendFormat(ci, @"", w, h); - - if (shape.ShapeType == ShapeType.MedalRibbonBadge) - { - string ribbonFill = !string.IsNullOrEmpty(shape.SecondaryFillColorHex) ? shape.SecondaryFillColorHex : "#990000"; - string medalFill = fill != "none" ? fill : "#F59E0B"; - string medalStroke = stroke != "none" ? stroke : "#B45309"; - - // Left Ribbon Tail - sb.AppendFormat(ci, @"", - w * 0.35, h * 0.45, w * 0.15, h, w * 0.35, h * 0.85, w * 0.48, h * 0.55, ribbonFill, medalStroke, Math.Max(1, strokeThickness * 0.7)); - - // Right Ribbon Tail - sb.AppendFormat(ci, @"", - w * 0.52, h * 0.55, w * 0.65, h * 0.85, w * 0.85, h, w * 0.65, h * 0.45, ribbonFill, medalStroke, Math.Max(1, strokeThickness * 0.7)); - - // Outer Medal Rim - sb.AppendFormat(ci, @"", - w / 2.0, h * 0.38, w * 0.38, medalFill, medalStroke, strokeThickness > 0 ? strokeThickness : 2.5); - - // Inner Laurel Garland Embossed Ring - sb.AppendFormat(ci, @"", - w / 2.0, h * 0.38, w * 0.30, "#FEF3C7"); - - sb.AppendFormat(ci, @"", - w / 2.0, h * 0.38, w * 0.24, medalStroke); - } - else - { - string pathData = GetVectorPath(shape.ShapeType, w, h, shape.CornerRadius, shape.CustomPathData); - sb.AppendFormat(ci, @"", - pathData, fill, stroke, strokeThickness, dashAttr); - } - - if (!string.IsNullOrWhiteSpace(shape.Label)) - { - string labelColor = !string.IsNullOrEmpty(shape.LabelColorHex) ? shape.LabelColorHex : "#201F1E"; - double labelSize = shape.LabelFontSize > 0 ? shape.LabelFontSize : 12; - sb.AppendFormat(ci, @"{4}", - w / 2.0, (shape.ShapeType == ShapeType.MedalRibbonBadge ? h * 0.38 : h / 2.0), labelColor, labelSize, System.Security.SecurityElement.Escape(shape.Label)); - } - - sb.Append(""); - return sb.ToString(); - } - - public static string GenerateDividerSvgMarkup(PdfDividerElement div) - { - double w = div.IsVertical ? Math.Max(1.0, div.Width) : Math.Max(10.0, div.Width); - double h = div.IsVertical ? Math.Max(10.0, div.Height) : Math.Max(1.0, div.Height); - var ci = CultureInfo.InvariantCulture; - - string stroke = !string.IsNullOrWhiteSpace(div.ColorHex) ? div.ColorHex : "#0F6CBD"; - double thickness = Math.Max(1.0, div.Thickness); - string pathData = GenerateDividerSvgPath(div.Style, w, h, div.WaveAmplitude, div.WaveFrequency, div.IsVertical); - string? dashArray = GetDashArray(div.DashStyle, thickness); - string dashAttr = !string.IsNullOrEmpty(dashArray) ? string.Format(ci, " stroke-dasharray=\"{0}\"", dashArray) : ""; - - return string.Format(ci, - @"", - w, h, pathData, stroke, thickness, dashAttr); - } - - public static string GenerateInkSvgMarkup(PdfInkElement ink) - { - double w = Math.Max(10, ink.Width); - double h = Math.Max(6, ink.Height); - var ci = CultureInfo.InvariantCulture; - - string stroke = !string.IsNullOrWhiteSpace(ink.StrokeColorHex) ? ink.StrokeColorHex : "#0F6CBD"; - double thickness = Math.Max(1.0, ink.StrokeThickness); - double opacity = Math.Clamp(ink.Opacity, 0.05, 1.0); - string pathData = GenerateSmoothInkSvgPath(ink.PointsData, ink.IsSmoothSpline); - - return string.Format(ci, - @"", - w, h, pathData, stroke, thickness, opacity); - } -} - diff --git a/src/PdfEditorApp/Services/TemplateService.cs b/src/PdfEditorApp/Services/TemplateService.cs deleted file mode 100644 index 890523a..0000000 --- a/src/PdfEditorApp/Services/TemplateService.cs +++ /dev/null @@ -1,199 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Models; -using PdfEditorApp.Templates; -using PdfEditorApp.Templates.Academic; -using PdfEditorApp.Templates.Career; -using PdfEditorApp.Templates.Certificates; -using PdfEditorApp.Templates.Corporate; -using PdfEditorApp.Templates.Events; -using PdfEditorApp.Templates.Finance; -using PdfEditorApp.Templates.General; -using PdfEditorApp.Templates.Education; -using PdfEditorApp.Templates.Technical; - -namespace PdfEditorApp.Services; - -public class TemplateService : ITemplateService, PdfEditorApp.Core.Plugins.Descriptors.ITemplateRegistry -{ - private readonly Dictionary _templates = new(StringComparer.OrdinalIgnoreCase); - private readonly BlankDocumentTemplate _blankTemplate = new(); - - public event Action? RegistryChanged; - - public TemplateService() - { - // Corporate - RegisterTemplate(new AnnualReportTemplate()); - RegisterTemplate(new InteractiveExecutiveBriefTemplate()); - RegisterTemplate(new EmployeePayslipTemplate()); - RegisterTemplate(new OcrAnalysisReportTemplate()); - - // Finance - RegisterTemplate(new InvoiceTemplate()); - RegisterTemplate(new FinanceResearchPaperTemplate()); - - // Career / Resumes - RegisterTemplate(new ResumeTemplate()); - RegisterTemplate(new ResumeModernCleanTemplate()); - RegisterTemplate(new ResumeCreativeMinimalistTemplate()); - RegisterTemplate(new ResumeAcademicCvTemplate()); - - // Academic Research - RegisterTemplate(new AcademicPaperTemplate()); - RegisterTemplate(new MathResearchPaperTemplate()); - RegisterTemplate(new PhysicsResearchPaperTemplate()); - RegisterTemplate(new HistoryResearchPaperTemplate()); - - // Certificates & Diplomas - RegisterTemplate(new CertificateTemplate()); - RegisterTemplate(new CertificateNavyGoldTemplate()); - RegisterTemplate(new DiplomaAcademicTemplate()); - - // Events, Design & Publishing - RegisterTemplate(new WeddingInvitationTraditionalTemplate()); - RegisterTemplate(new WeddingInvitationRoyalFloralTemplate()); - RegisterTemplate(new GalaInvitationTemplate()); - RegisterTemplate(new CreativeTypographyShowcaseTemplate()); - RegisterTemplate(new RichTextPublishingShowcaseTemplate()); - - // Education & Practice Worksheets - RegisterTemplate(new MathBODMASWorksheetTemplate()); - RegisterTemplate(new FactorizationWorksheetTemplate()); - RegisterTemplate(new BilingualExamPaperTemplate()); - RegisterTemplate(new StatesOfMatterDiagramNotesTemplate()); - RegisterTemplate(new QuadrilateralsGuideTemplate()); - - // Technical & Cheat Sheets - RegisterTemplate(new ArduinoCheatSheetTemplate()); - - // General - RegisterTemplate(_blankTemplate); - } - - public void RegisterTemplate(ITemplateDefinition template) - { - _templates[template.Id] = template; - RegistryChanged?.Invoke(); - } - - public IDisposable RegisterTemplate(PdfEditorApp.Core.Plugins.Descriptors.ITemplateDescriptor template) - { - ArgumentNullException.ThrowIfNull(template); - if (template is ITemplateDefinition def) - { - RegisterTemplate(def); - } - else - { - _templates[template.Id] = new TemplateDescriptorAdapter(template); - RegistryChanged?.Invoke(); - } - - return new DisposableAction(() => - { - _templates.Remove(template.Id); - RegistryChanged?.Invoke(); - }); - } - - PdfEditorApp.Core.Plugins.Descriptors.ITemplateDescriptor? PdfEditorApp.Core.Plugins.Descriptors.ITemplateRegistry.GetTemplate(string id) - { - return _templates.GetValueOrDefault(id); - } - - IReadOnlyList PdfEditorApp.Core.Plugins.Descriptors.ITemplateRegistry.GetAllTemplates() - { - return _templates.Values.ToList(); - } - - public IReadOnlyList GetCategories() - { - return _templates.Values.Select(t => t.Category).Distinct(StringComparer.OrdinalIgnoreCase).OrderBy(c => c).ToList(); - } - - private sealed class TemplateDescriptorAdapter(PdfEditorApp.Core.Plugins.Descriptors.ITemplateDescriptor inner) : ITemplateDefinition - { - public string Id => inner.Id; - public string Name => inner.Name; - public string Description => inner.Description; - public string Category => inner.Category; - public string IconKind => inner.IconKind; - public string AccentColorHex => inner.AccentColorHex; - public PdfDocumentModel Create() => inner.Create(); - } - - private sealed class DisposableAction(Action action) : IDisposable - { - private Action? _action = action; - public void Dispose() => System.Threading.Interlocked.Exchange(ref _action, null)?.Invoke(); - } - - public IReadOnlyList GetAllTemplates() - { - return _templates.Values.ToList(); - } - - public PdfDocumentModel CreateTemplate(string templateId) - { - if (_templates.TryGetValue(templateId, out var template)) - { - return template.Create(); - } - - return _blankTemplate.Create(); - } - - public PdfDocumentModel CreateAnnualReportTemplate() => CreateTemplate("annualreport"); - public PdfDocumentModel CreateInteractiveExecutiveBriefTemplate() => CreateTemplate("interactive_executive_deck"); - public PdfDocumentModel CreateEmployeePayslipTemplate() => CreateTemplate("payslip"); - - public PdfDocumentModel CreateInvoiceTemplate() => CreateTemplate("invoice"); - - public PdfDocumentModel CreateResumeTemplate() => CreateTemplate("resume"); - - public PdfDocumentModel CreateResumeModernCleanTemplate() => CreateTemplate("resumemodern"); - - public PdfDocumentModel CreateResumeCreativeMinimalistTemplate() => CreateTemplate("resumecreative"); - - public PdfDocumentModel CreateResumeAcademicCvTemplate() => CreateTemplate("resumeacademic"); - - public PdfDocumentModel CreateAcademicPaperTemplate() => CreateTemplate("academic"); - - public PdfDocumentModel CreateMathResearchPaperTemplate() => CreateTemplate("mathresearch"); - - public PdfDocumentModel CreatePhysicsResearchPaperTemplate() => CreateTemplate("physicsresearch"); - - public PdfDocumentModel CreateHistoryResearchPaperTemplate() => CreateTemplate("historyresearch"); - - public PdfDocumentModel CreateFinanceResearchPaperTemplate() => CreateTemplate("financeresearch"); - - public PdfDocumentModel CreateCertificateTemplate() => CreateTemplate("certificate"); - - public PdfDocumentModel CreateCertificateNavyGoldTemplate() => CreateTemplate("certificatenavygold"); - - public PdfDocumentModel CreateDiplomaAcademicTemplate() => CreateTemplate("diploma"); - - public PdfDocumentModel CreateWeddingInvitationTraditionalTemplate() => CreateTemplate("weddingtraditional"); - - public PdfDocumentModel CreateWeddingInvitationRoyalFloralTemplate() => CreateTemplate("weddingroyalfloral"); - - public PdfDocumentModel CreateGalaInvitationTemplate() => CreateTemplate("galainvitation"); - public PdfDocumentModel CreateTypographyShowcaseTemplate() => CreateTemplate("typographyshowcase"); - public PdfDocumentModel CreateRichTextShowcaseTemplate() => CreateTemplate("richtextshowcase"); - public PdfDocumentModel CreateOcrAnalysisReportTemplate() => CreateTemplate("ocranalysisreport"); - - public PdfDocumentModel CreateMathBODMASWorksheetTemplate() => CreateTemplate("bodmas_worksheet"); - public PdfDocumentModel CreateFactorizationWorksheetTemplate() => CreateTemplate("factorization_worksheet"); - public PdfDocumentModel CreateBilingualExamPaperTemplate() => CreateTemplate("bilingual_exam_paper"); - public PdfDocumentModel CreateStatesOfMatterDiagramNotesTemplate() => CreateTemplate("states_of_matter_notes"); - public PdfDocumentModel CreateQuadrilateralsGuideTemplate() => CreateTemplate("quadrilaterals_guide"); - public PdfDocumentModel CreateArduinoCheatSheetTemplate() => CreateTemplate("arduino_cheatsheet"); - - public PdfDocumentModel CreateBlankDocument(PageFormat format = PageFormat.A4, PageOrientation orientation = PageOrientation.Portrait) - { - return _blankTemplate.Create(format, orientation); - } -} diff --git a/src/PdfEditorApp/Services/ThemeService.cs b/src/PdfEditorApp/Services/ThemeService.cs deleted file mode 100644 index c68cbdf..0000000 --- a/src/PdfEditorApp/Services/ThemeService.cs +++ /dev/null @@ -1,318 +0,0 @@ -using System; -using System.IO; -using System.Text.Json; -using System.Text.Json.Serialization; -using Avalonia; -using Avalonia.Styling; -using Avalonia.Threading; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Models; - -namespace PdfEditorApp.Services; - -public interface IThemeService -{ - AppThemeMode CurrentTheme { get; } - PdfReaderTheme ReadingTheme { get; } - bool IsDarkMode { get; } - event Action? ThemeChanged; - event Action? ReadingThemeChanged; - - void SetTheme(AppThemeMode mode); - void ToggleTheme(); - void SetReadingTheme(PdfReaderTheme theme); - void Initialize(); -} - -public class ThemePreferenceData -{ - [JsonPropertyName("Theme")] - public string? Theme { get; set; } - - [JsonPropertyName("ReadingTheme")] - public string? ReadingTheme { get; set; } - - [JsonPropertyName("IsDarkMode")] - public bool? IsDarkMode { get; set; } - - [JsonPropertyName("UpdatedAt")] - public DateTime? UpdatedAt { get; set; } -} - -public class ThemeService : IThemeService -{ - private AppThemeMode _currentTheme = AppThemeMode.Light; - private PdfReaderTheme _readingTheme = PdfReaderTheme.Default; - private bool _isHookedToActualThemeVariant = false; - - public AppThemeMode CurrentTheme => _currentTheme; - public PdfReaderTheme ReadingTheme => _readingTheme; - - public bool IsDarkMode => _currentTheme == AppThemeMode.Dark || - (_currentTheme == AppThemeMode.System && Application.Current?.ActualThemeVariant == ThemeVariant.Dark); - - public event Action? ThemeChanged; - public event Action? ReadingThemeChanged; - - public ThemeService() - { - Initialize(); - } - - public static string GetSettingsDirectory() - { - string? appData = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); - if (string.IsNullOrWhiteSpace(appData)) - { - appData = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); - } - if (string.IsNullOrWhiteSpace(appData)) - { - appData = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile); - } - if (string.IsNullOrWhiteSpace(appData)) - { - appData = Path.GetTempPath(); - } - - var dir = Path.Combine(appData, "FryPDF"); - try - { - if (!Directory.Exists(dir)) - { - Directory.CreateDirectory(dir); - } - } - catch - { - dir = Path.Combine(Path.GetTempPath(), "FryPDF"); - try { Directory.CreateDirectory(dir); } catch { /* Ignore */ } - } - - return dir; - } - - public static string GetSettingsFilePath() - { - return Path.Combine(GetSettingsDirectory(), "theme_preference.json"); - } - - public void Initialize() - { - try - { - var filePath = GetSettingsFilePath(); - - // Check primary path, then fallback to LocalApplicationData if different - if (!File.Exists(filePath)) - { - var localAppData = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); - if (!string.IsNullOrWhiteSpace(localAppData)) - { - var alternatePath = Path.Combine(localAppData, "FryPDF", "theme_preference.json"); - if (File.Exists(alternatePath)) - { - filePath = alternatePath; - } - } - } - - if (File.Exists(filePath)) - { - string json = File.ReadAllText(filePath); - - var options = new JsonSerializerOptions - { - PropertyNameCaseInsensitive = true, - AllowTrailingCommas = true, - ReadCommentHandling = JsonCommentHandling.Skip - }; - - bool loaded = false; - try - { - var data = JsonSerializer.Deserialize(json, options); - if (data != null) - { - if (!string.IsNullOrWhiteSpace(data.Theme) && - Enum.TryParse(data.Theme, true, out var parsedTheme)) - { - _currentTheme = parsedTheme; - loaded = true; - } - else if (data.IsDarkMode.HasValue) - { - _currentTheme = data.IsDarkMode.Value ? AppThemeMode.Dark : AppThemeMode.Light; - loaded = true; - } - - if (!string.IsNullOrWhiteSpace(data.ReadingTheme) && - Enum.TryParse(data.ReadingTheme, true, out var parsedReadingTheme)) - { - _readingTheme = parsedReadingTheme; - } - } - } - catch - { - // Fallback to manual parsing below - } - - if (!loaded) - { - using var doc = JsonDocument.Parse(json); - var root = doc.RootElement; - foreach (var prop in root.EnumerateObject()) - { - if (prop.NameEquals("Theme") || prop.NameEquals("theme") || - prop.NameEquals("ThemeMode") || prop.NameEquals("themeMode")) - { - if (prop.Value.ValueKind == JsonValueKind.String && - Enum.TryParse(prop.Value.GetString(), true, out var t)) - { - _currentTheme = t; - } - else if (prop.Value.ValueKind == JsonValueKind.Number && - prop.Value.TryGetInt32(out var intVal) && - Enum.IsDefined(typeof(AppThemeMode), intVal)) - { - _currentTheme = (AppThemeMode)intVal; - } - } - else if (prop.NameEquals("ReadingTheme") || prop.NameEquals("readingTheme") || - prop.NameEquals("ReaderTheme") || prop.NameEquals("readerTheme")) - { - if (prop.Value.ValueKind == JsonValueKind.String && - Enum.TryParse(prop.Value.GetString(), true, out var rt)) - { - _readingTheme = rt; - } - else if (prop.Value.ValueKind == JsonValueKind.Number && - prop.Value.TryGetInt32(out var intVal) && - Enum.IsDefined(typeof(PdfReaderTheme), intVal)) - { - _readingTheme = (PdfReaderTheme)intVal; - } - } - } - } - } - } - catch - { - _currentTheme = AppThemeMode.Light; - _readingTheme = PdfReaderTheme.Default; - } - - ApplyThemeToApplication(_currentTheme); - HookActualThemeVariant(); - ThemeChanged?.Invoke(_currentTheme); - ReadingThemeChanged?.Invoke(_readingTheme); - } - - public void SetTheme(AppThemeMode mode) - { - if (_currentTheme == mode) return; - _currentTheme = mode; - ApplyThemeToApplication(mode); - SavePreference(); - ThemeChanged?.Invoke(mode); - } - - public void SetReadingTheme(PdfReaderTheme theme) - { - if (_readingTheme == theme) return; - _readingTheme = theme; - SavePreference(); - ReadingThemeChanged?.Invoke(theme); - } - - public void ToggleTheme() - { - var newTheme = IsDarkMode ? AppThemeMode.Light : AppThemeMode.Dark; - SetTheme(newTheme); - } - - private void ApplyThemeToApplication(AppThemeMode mode) - { - if (Application.Current == null) return; - - void Apply() - { - if (Application.Current == null) return; - - Application.Current.RequestedThemeVariant = mode switch - { - AppThemeMode.Dark => ThemeVariant.Dark, - AppThemeMode.Light => ThemeVariant.Light, - AppThemeMode.System => ThemeVariant.Default, - _ => ThemeVariant.Light - }; - } - - try - { - if (Dispatcher.UIThread.CheckAccess()) - { - Apply(); - } - else - { - Dispatcher.UIThread.Post(Apply); - } - } - catch - { - // Headless unit test environment without active dispatcher loop - } - } - - private void HookActualThemeVariant() - { - if (_isHookedToActualThemeVariant || Application.Current == null) return; - - try - { - Application.Current.ActualThemeVariantChanged += (sender, args) => - { - if (_currentTheme == AppThemeMode.System) - { - ThemeChanged?.Invoke(_currentTheme); - } - }; - _isHookedToActualThemeVariant = true; - } - catch - { - // Ignore if platform doesn't support event - } - } - - private void SavePreference() - { - try - { - var dir = GetSettingsDirectory(); - var filePath = Path.Combine(dir, "theme_preference.json"); - var payload = new ThemePreferenceData - { - Theme = _currentTheme.ToString(), - ReadingTheme = _readingTheme.ToString(), - IsDarkMode = IsDarkMode, - UpdatedAt = DateTime.UtcNow - }; - - var options = new JsonSerializerOptions - { - WriteIndented = true - }; - - string json = JsonSerializer.Serialize(payload, options); - File.WriteAllText(filePath, json); - } - catch - { - // Ignore storage permission failures gracefully - } - } -} diff --git a/src/PdfEditorApp/Services/Tools/Conversion/PdfConversionService.cs b/src/PdfEditorApp/Services/Tools/Conversion/PdfConversionService.cs deleted file mode 100644 index aa8fee9..0000000 --- a/src/PdfEditorApp/Services/Tools/Conversion/PdfConversionService.cs +++ /dev/null @@ -1,1076 +0,0 @@ -using PdfEditorApp.Services.Tools.Core; -using PdfEditorApp.Services.Tools.Organize; -using PdfEditorApp.Services.Tools.Security; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using System.Text.RegularExpressions; -using System.Threading; -using System.Threading.Tasks; -using DocumentFormat.OpenXml; -using DocumentFormat.OpenXml.Packaging; -using DocumentFormat.OpenXml.Spreadsheet; -using DocumentFormat.OpenXml.Wordprocessing; -using DocumentFormat.OpenXml.Presentation; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Models; -using PdfSharpCore.Drawing; -using PdfSharpCore.Pdf; -using PdfSharpCore.Pdf.IO; -using QuestPDF.Fluent; -using QuestPDF.Infrastructure; -using QColors = QuestPDF.Helpers.Colors; -using UglyToad.PdfPig; -using UglyToad.PdfPig.Content; -using QuestPDF.Helpers; - -namespace PdfEditorApp.Services.Tools.Conversion; - - -public interface IPdfConversionService -{ - Task ConvertPdfToWordAsync(WordConversionOptions options, IProgress? progress = null, CancellationToken ct = default); - Task ConvertPdfToExcelAsync(ExcelConversionOptions options, IProgress? progress = null, CancellationToken ct = default); - Task ConvertPdfToPowerPointAsync(PptxConversionOptions options, IProgress? progress = null, CancellationToken ct = default); - Task ConvertWordToPdfAsync(OfficeToPdfOptions options, IProgress? progress = null, CancellationToken ct = default); - Task ConvertExcelToPdfAsync(OfficeToPdfOptions options, IProgress? progress = null, CancellationToken ct = default); - Task ConvertPowerPointToPdfAsync(OfficeToPdfOptions options, IProgress? progress = null, CancellationToken ct = default); - Task ConvertPdfToImagesAsync(ImageConversionOptions options, IProgress? progress = null, CancellationToken ct = default); - Task ConvertImagesToPdfAsync(ImagesToPdfOptions options, IProgress? progress = null, CancellationToken ct = default); - Task ConvertHtmlToPdfAsync(HtmlToPdfOptions options, IProgress? progress = null, CancellationToken ct = default); - Task ConvertPdfToMarkdownAsync(MarkdownConversionOptions options, IProgress? progress = null, CancellationToken ct = default); -} - -public class PdfConversionService : IPdfConversionService -{ - public async Task ConvertPdfToWordAsync(WordConversionOptions options, IProgress? progress = null, CancellationToken ct = default) - { - return await Task.Run(() => - { - if (!File.Exists(options.InputFilePath)) - return new ToolExecutionResult { Success = false, ErrorMessage = "Input PDF file does not exist." }; - - long origBytes = new FileInfo(options.InputFilePath).Length; - string outPath = options.OutputFilePath; - if (string.IsNullOrWhiteSpace(outPath)) - { - string dir = Path.GetDirectoryName(options.InputFilePath) ?? ""; - string name = Path.GetFileNameWithoutExtension(options.InputFilePath); - outPath = Path.Combine(dir, $"{name}.docx"); - } - - ct.ThrowIfCancellationRequested(); - progress?.Report(10.0); - - using var pdf = UglyToad.PdfPig.PdfDocument.Open(options.InputFilePath); - int totalPages = pdf.NumberOfPages; - - using var wordDoc = WordprocessingDocument.Create(outPath, WordprocessingDocumentType.Document); - var mainPart = wordDoc.AddMainDocumentPart(); - mainPart.Document = new DocumentFormat.OpenXml.Wordprocessing.Document(); - var body = mainPart.Document.AppendChild(new Body()); - - for (int p = 1; p <= totalPages; p++) - { - ct.ThrowIfCancellationRequested(); - var page = pdf.GetPage(p); - var text = page.Text; - - // Split into paragraphs - var lines = text.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries); - foreach (var line in lines) - { - if (string.IsNullOrWhiteSpace(line)) continue; - - var para = body.AppendChild(new DocumentFormat.OpenXml.Wordprocessing.Paragraph()); - var run = para.AppendChild(new DocumentFormat.OpenXml.Wordprocessing.Run()); - run.AppendChild(new DocumentFormat.OpenXml.Wordprocessing.Text(line.Trim())); - } - - // Add section break between pages if not last page - if (p < totalPages) - { - var pageBreakPara = body.AppendChild(new DocumentFormat.OpenXml.Wordprocessing.Paragraph()); - var pageBreakRun = pageBreakPara.AppendChild(new DocumentFormat.OpenXml.Wordprocessing.Run()); - pageBreakRun.AppendChild(new DocumentFormat.OpenXml.Wordprocessing.Break { Type = BreakValues.Page }); - } - - progress?.Report(10.0 + (p / (double)totalPages * 80.0)); - } - - mainPart.Document.Save(); - progress?.Report(100.0); - - long outBytes = File.Exists(outPath) ? new FileInfo(outPath).Length : 0; - return new ToolExecutionResult - { - Success = true, - OutputFilePath = outPath, - OutputFiles = new List { outPath }, - OriginalSizeBytes = origBytes, - OutputSizeBytes = outBytes, - Message = $"Successfully converted {totalPages} pages to Microsoft Word document: {Path.GetFileName(outPath)}" - }; - }, ct); - } - - public async Task ConvertPdfToExcelAsync(ExcelConversionOptions options, IProgress? progress = null, CancellationToken ct = default) - { - return await Task.Run(() => - { - if (!File.Exists(options.InputFilePath)) - return new ToolExecutionResult { Success = false, ErrorMessage = "Input PDF file does not exist." }; - - long origBytes = new FileInfo(options.InputFilePath).Length; - string outPath = options.OutputFilePath; - if (string.IsNullOrWhiteSpace(outPath)) - { - string dir = Path.GetDirectoryName(options.InputFilePath) ?? ""; - string name = Path.GetFileNameWithoutExtension(options.InputFilePath); - outPath = Path.Combine(dir, $"{name}.xlsx"); - } - - ct.ThrowIfCancellationRequested(); - progress?.Report(10.0); - - using var pdf = UglyToad.PdfPig.PdfDocument.Open(options.InputFilePath); - int totalPages = pdf.NumberOfPages; - - using var spreadsheetDoc = SpreadsheetDocument.Create(outPath, SpreadsheetDocumentType.Workbook); - var workbookPart = spreadsheetDoc.AddWorkbookPart(); - workbookPart.Workbook = new DocumentFormat.OpenXml.Spreadsheet.Workbook(); - var sheets = workbookPart.Workbook.AppendChild(new Sheets()); - - uint sheetId = 1; - for (int p = 1; p <= totalPages; p++) - { - ct.ThrowIfCancellationRequested(); - var page = pdf.GetPage(p); - var text = page.Text; - - var worksheetPart = workbookPart.AddNewPart(); - var sheetData = new SheetData(); - worksheetPart.Worksheet = new Worksheet(sheetData); - - var lines = text.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries); - uint rowIndex = 1; - - foreach (var line in lines) - { - if (string.IsNullOrWhiteSpace(line)) continue; - - var row = new Row { RowIndex = rowIndex }; - // Parse row elements (split by whitespace tab or multiple spaces / commas) - var cells = Regex.Split(line.Trim(), @"\s{2,}|\t"); - if (cells.Length <= 1) - { - cells = line.Split(new[] { ',', ';' }, StringSplitOptions.RemoveEmptyEntries); - } - - int colIndex = 1; - foreach (var cellVal in cells) - { - string cleanVal = cellVal.Trim(); - string numericCandidate = cleanVal.Replace("$", "").Replace(",", ""); - bool isNumber = double.TryParse(numericCandidate, System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out double numericValue); - var cell = new Cell - { - CellReference = $"{GetExcelColumnName(colIndex)}{rowIndex}", - DataType = isNumber ? CellValues.Number : CellValues.String, - CellValue = new CellValue(isNumber - ? numericValue.ToString(System.Globalization.CultureInfo.InvariantCulture) - : cleanVal) - }; - row.Append(cell); - colIndex++; - } - - sheetData.Append(row); - rowIndex++; - } - - string sheetName = totalPages == 1 ? "Data" : $"Page {p}"; - var sheet = new Sheet - { - Id = spreadsheetDoc.WorkbookPart!.GetIdOfPart(worksheetPart), - SheetId = sheetId++, - Name = sheetName - }; - sheets.Append(sheet); - - progress?.Report(10.0 + (p / (double)totalPages * 80.0)); - } - - workbookPart.Workbook.Save(); - progress?.Report(100.0); - - long outBytes = File.Exists(outPath) ? new FileInfo(outPath).Length : 0; - return new ToolExecutionResult - { - Success = true, - OutputFilePath = outPath, - OutputFiles = new List { outPath }, - OriginalSizeBytes = origBytes, - OutputSizeBytes = outBytes, - Message = $"Extracted tabular data across {totalPages} pages into Excel spreadsheet: {Path.GetFileName(outPath)}" - }; - }, ct); - } - - public async Task ConvertPdfToPowerPointAsync(PptxConversionOptions options, IProgress? progress = null, CancellationToken ct = default) - { - return await Task.Run(() => - { - if (!File.Exists(options.InputFilePath)) - return new ToolExecutionResult { Success = false, ErrorMessage = "Input PDF file does not exist." }; - - long origBytes = new FileInfo(options.InputFilePath).Length; - string outPath = options.OutputFilePath; - if (string.IsNullOrWhiteSpace(outPath)) - { - string dir = Path.GetDirectoryName(options.InputFilePath) ?? ""; - string name = Path.GetFileNameWithoutExtension(options.InputFilePath); - outPath = Path.Combine(dir, $"{name}.pptx"); - } - - ct.ThrowIfCancellationRequested(); - progress?.Report(10.0); - - using var pdf = UglyToad.PdfPig.PdfDocument.Open(options.InputFilePath); - int totalPages = pdf.NumberOfPages; - - using var presentationDoc = PresentationDocument.Create(outPath, PresentationDocumentType.Presentation); - var presentationPart = presentationDoc.AddPresentationPart(); - presentationPart.Presentation = new Presentation(); - var slideIdList = presentationPart.Presentation.AppendChild(new SlideIdList()); - - uint slideId = 256; - for (int p = 1; p <= totalPages; p++) - { - ct.ThrowIfCancellationRequested(); - var page = pdf.GetPage(p); - var text = page.Text; - - var slidePart = presentationPart.AddNewPart(); - var slide = new Slide(new CommonSlideData(new ShapeTree())); - - var shapeTree = slide.CommonSlideData!.ShapeTree!; - var nonVisualProperties = shapeTree.AppendChild(new NonVisualGroupShapeProperties( - new NonVisualDrawingProperties { Id = 1, Name = "" }, - new NonVisualGroupShapeDrawingProperties(), - new ApplicationNonVisualDrawingProperties())); - shapeTree.AppendChild(new GroupShapeProperties()); - - // Add Title / Text Shape - var shape = shapeTree.AppendChild(new DocumentFormat.OpenXml.Presentation.Shape()); - shape.NonVisualShapeProperties = new NonVisualShapeProperties( - new NonVisualDrawingProperties { Id = 2, Name = $"Slide Text {p}" }, - new NonVisualShapeDrawingProperties(new DocumentFormat.OpenXml.Drawing.ShapeLocks { NoGrouping = true }), - new ApplicationNonVisualDrawingProperties(new PlaceholderShape())); - - shape.ShapeProperties = new DocumentFormat.OpenXml.Presentation.ShapeProperties(); - var textBody = shape.AppendChild(new DocumentFormat.OpenXml.Presentation.TextBody( - new DocumentFormat.OpenXml.Drawing.BodyProperties(), - new DocumentFormat.OpenXml.Drawing.ListStyle())); - - var lines = text.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries); - foreach (var line in lines) - { - if (string.IsNullOrWhiteSpace(line)) continue; - var para = textBody.AppendChild(new DocumentFormat.OpenXml.Drawing.Paragraph()); - var run = para.AppendChild(new DocumentFormat.OpenXml.Drawing.Run()); - run.AppendChild(new DocumentFormat.OpenXml.Drawing.Text(line.Trim())); - } - - slidePart.Slide = slide; - slidePart.Slide.Save(); - - var slideIdItem = new SlideId - { - Id = slideId++, - RelationshipId = presentationPart.GetIdOfPart(slidePart) - }; - slideIdList.Append(slideIdItem); - - progress?.Report(10.0 + (p / (double)totalPages * 80.0)); - } - - presentationPart.Presentation.Save(); - progress?.Report(100.0); - - long outBytes = File.Exists(outPath) ? new FileInfo(outPath).Length : 0; - return new ToolExecutionResult - { - Success = true, - OutputFilePath = outPath, - OutputFiles = new List { outPath }, - OriginalSizeBytes = origBytes, - OutputSizeBytes = outBytes, - Message = $"Converted PDF to {totalPages}-slide PowerPoint presentation: {Path.GetFileName(outPath)}" - }; - }, ct); - } - - public async Task ConvertWordToPdfAsync(OfficeToPdfOptions options, IProgress? progress = null, CancellationToken ct = default) - { - return await Task.Run(() => - { - if (!File.Exists(options.InputFilePath)) - return new ToolExecutionResult { Success = false, ErrorMessage = "Input Word document does not exist." }; - - if (IsLegacyOfficeBinaryFormat(options.InputFilePath)) - return new ToolExecutionResult { Success = false, ErrorMessage = "This is a legacy .doc (binary) file, which isn't supported yet. Please save it as .docx in Word and try again." }; - - long origBytes = new FileInfo(options.InputFilePath).Length; - string outPath = options.OutputFilePath; - if (string.IsNullOrWhiteSpace(outPath)) - { - string dir = Path.GetDirectoryName(options.InputFilePath) ?? ""; - string name = Path.GetFileNameWithoutExtension(options.InputFilePath); - outPath = Path.Combine(dir, $"{name}.pdf"); - } - - ct.ThrowIfCancellationRequested(); - progress?.Report(15.0); - - // Read DOCX text and paragraphs - var paragraphs = new List(); - using (var wordDoc = WordprocessingDocument.Open(options.InputFilePath, false)) - { - var body = wordDoc.MainDocumentPart?.Document?.Body; - if (body != null) - { - // Descendants (not Elements) so paragraphs nested inside tables are included too. - foreach (var para in body.Descendants()) - { - string txt = para.InnerText; - if (!string.IsNullOrWhiteSpace(txt)) paragraphs.Add(txt); - } - } - } - - progress?.Report(50.0); - ct.ThrowIfCancellationRequested(); - - // Generate PDF via QuestPDF with FryPDF Creator and codefrydev.in Producer metadata - var doc = FryPdfDocument.Create(container => - { - container.Page(page => - { - page.Size(PageSizes.A4); - page.Margin(36); - page.PageColor(QColors.White); - page.DefaultTextStyle(x => x.FontSize(11).FontFamily("Helvetica").FontColor(QColors.Grey.Darken3)); - - page.Header().Row(row => - { - row.RelativeItem().Text(Path.GetFileNameWithoutExtension(options.InputFilePath)).SemiBold().FontColor(QColors.Grey.Darken2); - }); - - page.Content().PaddingVertical(10).Column(col => - { - col.Spacing(8); - foreach (var p in paragraphs) - { - col.Item().Text(p); - } - }); - - page.Footer().AlignCenter().Text(x => - { - x.Span("Page "); - x.CurrentPageNumber(); - x.Span(" of "); - x.TotalPages(); - }); - }); - }); - - doc.GeneratePdf(outPath); - progress?.Report(100.0); - - long outBytes = File.Exists(outPath) ? new FileInfo(outPath).Length : 0; - return new ToolExecutionResult - { - Success = true, - OutputFilePath = outPath, - OutputFiles = new List { outPath }, - OriginalSizeBytes = origBytes, - OutputSizeBytes = outBytes, - Message = $"Converted Word document ({paragraphs.Count} paragraphs) to PDF: {Path.GetFileName(outPath)}" - }; - }, ct); - } - - public async Task ConvertExcelToPdfAsync(OfficeToPdfOptions options, IProgress? progress = null, CancellationToken ct = default) - { - return await Task.Run(() => - { - if (!File.Exists(options.InputFilePath)) - return new ToolExecutionResult { Success = false, ErrorMessage = "Input Excel document does not exist." }; - - if (IsLegacyOfficeBinaryFormat(options.InputFilePath)) - return new ToolExecutionResult { Success = false, ErrorMessage = "This is a legacy .xls (binary) file, which isn't supported yet. Please save it as .xlsx in Excel and try again." }; - - long origBytes = new FileInfo(options.InputFilePath).Length; - string outPath = options.OutputFilePath; - if (string.IsNullOrWhiteSpace(outPath)) - { - string dir = Path.GetDirectoryName(options.InputFilePath) ?? ""; - string name = Path.GetFileNameWithoutExtension(options.InputFilePath); - outPath = Path.Combine(dir, $"{name}.pdf"); - } - - ct.ThrowIfCancellationRequested(); - progress?.Report(15.0); - - var tables = new List<(string SheetName, List> Rows)>(); - - using (var spreadsheet = SpreadsheetDocument.Open(options.InputFilePath, false)) - { - var workbookPart = spreadsheet.WorkbookPart; - if (workbookPart != null) - { - var sharedStrings = workbookPart.SharedStringTablePart?.SharedStringTable; - var sheetsEnum = workbookPart.Workbook!.Sheets?.Elements() ?? Enumerable.Empty(); - foreach (var sheet in sheetsEnum) - { - var sheetName = sheet.Name?.Value ?? "Sheet"; - var worksheetPart = workbookPart.GetPartById(sheet.Id?.Value ?? string.Empty) as WorksheetPart; - if (worksheetPart == null) continue; - var sheetData = worksheetPart.Worksheet!.Elements().FirstOrDefault(); - var rowsList = new List>(); - - if (sheetData != null) - { - foreach (var row in sheetData.Elements()) - { - var cellValues = new List(); - foreach (var cell in row.Elements()) - { - string val; - if (cell.DataType?.Value == CellValues.SharedString - && cell.CellValue != null - && int.TryParse(cell.CellValue.Text, out int sharedIndex) - && sharedStrings != null - && sharedIndex >= 0 && sharedIndex < sharedStrings.ChildElements.Count) - { - val = sharedStrings.ElementAt(sharedIndex).InnerText; - } - else - { - val = cell.CellValue?.Text ?? cell.InnerText ?? ""; - } - cellValues.Add(val); - } - if (cellValues.Count > 0) rowsList.Add(cellValues); - } - } - if (rowsList.Count > 0) tables.Add((sheetName, rowsList)); - } - } - } - - if (tables.Count == 0) - { - tables.Add(("Sheet 1", new List> { new() { "Data Table" } })); - } - - progress?.Report(50.0); - ct.ThrowIfCancellationRequested(); - - var doc = FryPdfDocument.Create(container => - { - foreach (var table in tables) - { - container.Page(page => - { - page.Size(PageSizes.A4.Landscape()); - page.Margin(28); - page.PageColor(QColors.White); - page.DefaultTextStyle(x => x.FontSize(9).FontFamily("Helvetica")); - - page.Header().Text(table.SheetName).Bold().FontSize(13).FontColor(QColors.Blue.Darken2); - - page.Content().PaddingVertical(10).Table(tbl => - { - int maxCols = table.Rows.Max(r => r.Count); - if (maxCols == 0) maxCols = 1; - - tbl.ColumnsDefinition(cols => - { - for (int c = 0; c < maxCols; c++) cols.RelativeColumn(); - }); - - bool isHeader = true; - foreach (var r in table.Rows) - { - foreach (var cell in r) - { - if (isHeader) - { - tbl.Cell().Background(QColors.Grey.Lighten3).Border(0.5f).BorderColor(QColors.Grey.Lighten1).Padding(4).Text(cell).Bold(); - } - else - { - tbl.Cell().Border(0.5f).BorderColor(QColors.Grey.Lighten2).Padding(4).Text(cell); - } - } - isHeader = false; - } - }); - - page.Footer().AlignCenter().Text(x => - { - x.Span("Page "); - x.CurrentPageNumber(); - x.Span(" of "); - x.TotalPages(); - }); - }); - } - }); - - doc.GeneratePdf(outPath); - progress?.Report(100.0); - - long outBytes = File.Exists(outPath) ? new FileInfo(outPath).Length : 0; - return new ToolExecutionResult - { - Success = true, - OutputFilePath = outPath, - OutputFiles = new List { outPath }, - OriginalSizeBytes = origBytes, - OutputSizeBytes = outBytes, - Message = $"Converted Excel spreadsheet ({tables.Count} sheets) to PDF: {Path.GetFileName(outPath)}" - }; - }, ct); - } - - public async Task ConvertPowerPointToPdfAsync(OfficeToPdfOptions options, IProgress? progress = null, CancellationToken ct = default) - { - return await Task.Run(() => - { - if (!File.Exists(options.InputFilePath)) - return new ToolExecutionResult { Success = false, ErrorMessage = "Input PowerPoint presentation does not exist." }; - - if (IsLegacyOfficeBinaryFormat(options.InputFilePath)) - return new ToolExecutionResult { Success = false, ErrorMessage = "This is a legacy .ppt (binary) file, which isn't supported yet. Please save it as .pptx in PowerPoint and try again." }; - - long origBytes = new FileInfo(options.InputFilePath).Length; - string outPath = options.OutputFilePath; - if (string.IsNullOrWhiteSpace(outPath)) - { - string dir = Path.GetDirectoryName(options.InputFilePath) ?? ""; - string name = Path.GetFileNameWithoutExtension(options.InputFilePath); - outPath = Path.Combine(dir, $"{name}.pdf"); - } - - ct.ThrowIfCancellationRequested(); - progress?.Report(15.0); - - var slidesText = new List>(); - - using (var presentationDoc = PresentationDocument.Open(options.InputFilePath, false)) - { - var presentationPart = presentationDoc.PresentationPart; - if (presentationPart != null) - { - var slideIdsEnum = presentationPart.Presentation!.SlideIdList?.Elements() ?? Enumerable.Empty(); - foreach (var slideId in slideIdsEnum) - { - var slidePart = presentationPart.GetPartById(slideId.RelationshipId?.Value ?? string.Empty) as SlidePart; - if (slidePart == null) continue; - var slideLines = new List(); - foreach (var paragraph in slidePart.Slide!.Descendants()) - { - string t = paragraph.InnerText; - if (!string.IsNullOrWhiteSpace(t)) slideLines.Add(t); - } - slidesText.Add(slideLines); - } - } - } - - progress?.Report(50.0); - ct.ThrowIfCancellationRequested(); - - if (slidesText.Count == 0) - { - slidesText.Add(new List { "Presentation Slide" }); - } - - var doc = FryPdfDocument.Create(container => - { - int sIndex = 1; - foreach (var slide in slidesText) - { - var linesToRender = slide.Count > 0 ? slide : new List { string.Empty }; - container.Page(page => - { - page.Size(PageSizes.A4.Landscape()); - page.Margin(36); - page.PageColor(QColors.White); - page.DefaultTextStyle(x => x.FontSize(12).FontFamily("Helvetica")); - - page.Header().Row(row => - { - row.RelativeItem().Text($"Slide {sIndex}").Bold().FontSize(14).FontColor(QColors.Orange.Darken2); - }); - - page.Content().PaddingVertical(16).Column(col => - { - col.Spacing(10); - foreach (var line in linesToRender) - { - col.Item().Text(string.IsNullOrWhiteSpace(line) ? " " : line); - } - }); - - page.Footer().AlignCenter().Text(x => - { - x.Span($"Slide {sIndex} of {slidesText.Count}"); - }); - }); - sIndex++; - } - }); - - doc.GeneratePdf(outPath); - progress?.Report(100.0); - - long outBytes = File.Exists(outPath) ? new FileInfo(outPath).Length : 0; - return new ToolExecutionResult - { - Success = true, - OutputFilePath = outPath, - OutputFiles = new List { outPath }, - OriginalSizeBytes = origBytes, - OutputSizeBytes = outBytes, - Message = $"Converted PowerPoint presentation ({slidesText.Count} slides) to PDF: {Path.GetFileName(outPath)}" - }; - }, ct); - } - - public async Task ConvertPdfToImagesAsync(ImageConversionOptions options, IProgress? progress = null, CancellationToken ct = default) - { - return await Task.Run(() => - { - if (!File.Exists(options.InputFilePath)) - return new ToolExecutionResult { Success = false, ErrorMessage = "Input PDF file does not exist." }; - - long origBytes = new FileInfo(options.InputFilePath).Length; - string outDir = options.OutputDirectory; - if (string.IsNullOrWhiteSpace(outDir)) - { - outDir = Path.Combine(Path.GetDirectoryName(options.InputFilePath) ?? "", Path.GetFileNameWithoutExtension(options.InputFilePath) + "_images"); - } - if (!Directory.Exists(outDir)) Directory.CreateDirectory(outDir); - - ct.ThrowIfCancellationRequested(); - - // Render actual page content via the same PdfPig+Skia path used for on-screen - // preview (PdfViewerViewModel.RenderPageBytesAtScale), instead of a blank canvas. - using var pdfPigDoc = UglyToad.PdfPig.PdfDocument.Open(options.InputFilePath); - try { UglyToad.PdfPig.Rendering.Skia.PdfPigExtensions.AddSkiaPageFactory(pdfPigDoc); } catch { } - - int totalPages = pdfPigDoc.NumberOfPages; - var createdFiles = new List(); - string baseName = Path.GetFileNameWithoutExtension(options.InputFilePath); - string ext = options.OutputFormat.ToLowerInvariant().Contains("png") ? "png" : "jpg"; - float scale = (float)(options.Dpi / 72.0); - - for (int p = 1; p <= totalPages; p++) - { - ct.ThrowIfCancellationRequested(); - string imgPath = Path.Combine(outDir, $"{baseName}_page_{p:D3}.{ext}"); - - using var pngStream = UglyToad.PdfPig.Rendering.Skia.PdfPigExtensions.GetPageAsPng(pdfPigDoc, p, scale, 100); - if (pngStream == null || pngStream.Length == 0) - { - progress?.Report(p / (double)totalPages * 90.0); - continue; - } - - if (ext == "png") - { - pngStream.Position = 0; - using var fs = File.Create(imgPath); - pngStream.CopyTo(fs); - } - else - { - pngStream.Position = 0; - using var skBitmap = SkiaSharp.SKBitmap.Decode(pngStream); - if (skBitmap == null) - { - progress?.Report(p / (double)totalPages * 90.0); - continue; - } - using var skImage = SkiaSharp.SKImage.FromBitmap(skBitmap); - using var jpegData = skImage.Encode(SkiaSharp.SKEncodedImageFormat.Jpeg, options.JpgQuality); - using var fs = File.Create(imgPath); - jpegData.SaveTo(fs); - } - - createdFiles.Add(imgPath); - progress?.Report(p / (double)totalPages * 90.0); - } - - progress?.Report(100.0); - - if (createdFiles.Count == 0) - { - return new ToolExecutionResult { Success = false, ErrorMessage = "No pages could be rendered from this PDF." }; - } - - return new ToolExecutionResult - { - Success = true, - OutputFilePath = createdFiles.FirstOrDefault(), - OutputFiles = createdFiles, - OriginalSizeBytes = origBytes, - OutputSizeBytes = createdFiles.Sum(f => File.Exists(f) ? new FileInfo(f).Length : 0), - Message = $"Exported {createdFiles.Count} page images at {options.Dpi} DPI to {outDir}." - }; - }, ct); - } - - public async Task ConvertImagesToPdfAsync(ImagesToPdfOptions options, IProgress? progress = null, CancellationToken ct = default) - { - return await Task.Run(() => - { - if (options.ImageFiles == null || options.ImageFiles.Count == 0) - return new ToolExecutionResult { Success = false, ErrorMessage = "No images provided for PDF conversion." }; - - long totalOriginalBytes = options.ImageFiles.Where(File.Exists).Sum(f => new FileInfo(f).Length); - string outPath = options.OutputFilePath; - if (string.IsNullOrWhiteSpace(outPath)) - { - string dir = Path.GetDirectoryName(options.ImageFiles[0]) ?? Path.GetTempPath(); - outPath = Path.Combine(dir, "Images_Document.pdf"); - } - - ct.ThrowIfCancellationRequested(); - using var pdfDoc = new PdfSharpCore.Pdf.PdfDocument(); - int total = options.ImageFiles.Count; - var skipped = new List(); - int addedCount = 0; - - for (int i = 0; i < total; i++) - { - ct.ThrowIfCancellationRequested(); - string imgFile = options.ImageFiles[i]; - if (!File.Exists(imgFile)) - { - skipped.Add($"{Path.GetFileName(imgFile)} (not found)"); - continue; - } - - XImage xImage; - try - { - xImage = XImage.FromFile(imgFile); - } - catch (Exception ex) - { - // One corrupt/unsupported image must not abort the whole batch - // (and must not leave an empty page behind for it). - skipped.Add($"{Path.GetFileName(imgFile)} ({ex.Message})"); - continue; - } - - using (xImage) - { - var page = pdfDoc.AddPage(); - - if (options.AutoOrientation && xImage.PixelWidth > xImage.PixelHeight) - { - page.Orientation = PdfSharpCore.PageOrientation.Landscape; - } - else - { - page.Orientation = options.Orientation == PageOrientation.Landscape - ? PdfSharpCore.PageOrientation.Landscape - : PdfSharpCore.PageOrientation.Portrait; - } - - using var gfx = XGraphics.FromPdfPage(page); - - if (options.FitToPage) - { - double margin = options.MarginPoints; - double maxW = page.Width.Point - (margin * 2); - double maxH = page.Height.Point - (margin * 2); - - double scale = Math.Min(maxW / xImage.PixelWidth, maxH / xImage.PixelHeight); - double drawW = xImage.PixelWidth * scale; - double drawH = xImage.PixelHeight * scale; - double posX = margin + ((maxW - drawW) / 2.0); - double posY = margin + ((maxH - drawH) / 2.0); - - gfx.DrawImage(xImage, posX, posY, drawW, drawH); - } - else - { - gfx.DrawImage(xImage, options.MarginPoints, options.MarginPoints); - } - } - - addedCount++; - progress?.Report((i + 1) / (double)total * 90.0); - } - - if (addedCount == 0) - { - return new ToolExecutionResult - { - Success = false, - ErrorMessage = $"No images could be converted: {string.Join("; ", skipped)}" - }; - } - - pdfDoc.Save(outPath); - progress?.Report(100.0); - - long outBytes = File.Exists(outPath) ? new FileInfo(outPath).Length : 0; - string resultMessage = skipped.Count == 0 - ? $"Converted {total} images into high-resolution PDF: {Path.GetFileName(outPath)}" - : $"Converted {addedCount} of {total} images into PDF: {Path.GetFileName(outPath)}. Skipped: {string.Join("; ", skipped)}"; - - return new ToolExecutionResult - { - Success = true, - OutputFilePath = outPath, - OutputFiles = new List { outPath }, - OriginalSizeBytes = totalOriginalBytes, - OutputSizeBytes = outBytes, - Message = resultMessage - }; - }, ct); - } - - public async Task ConvertHtmlToPdfAsync(HtmlToPdfOptions options, IProgress? progress = null, CancellationToken ct = default) - { - return await Task.Run(() => - { - string htmlContent = options.HtmlContentOrUrl; - if (options.IsUrl && options.HtmlContentOrUrl.StartsWith("http", StringComparison.OrdinalIgnoreCase)) - { - try - { - using var client = new System.Net.Http.HttpClient { Timeout = TimeSpan.FromSeconds(20) }; - htmlContent = client.GetStringAsync(options.HtmlContentOrUrl, ct).GetAwaiter().GetResult(); - } - catch (OperationCanceledException) - { - throw; - } - catch (Exception ex) - { - return new ToolExecutionResult { Success = false, ErrorMessage = $"Failed to load URL: {ex.Message}" }; - } - } - else if (File.Exists(options.HtmlContentOrUrl)) - { - htmlContent = File.ReadAllText(options.HtmlContentOrUrl); - } - - string outPath = options.OutputFilePath; - if (string.IsNullOrWhiteSpace(outPath)) - { - string dir = Path.GetTempPath(); - outPath = Path.Combine(dir, $"Webpage_Export_{Guid.NewGuid():N}.pdf"); - } - - ct.ThrowIfCancellationRequested(); - progress?.Report(30.0); - - // Clean simple HTML tags to paragraphs - string plainText = Regex.Replace(htmlContent, @"]*>[\s\S]*?", "", RegexOptions.IgnoreCase); - plainText = Regex.Replace(plainText, @"]*>[\s\S]*?", "", RegexOptions.IgnoreCase); - plainText = Regex.Replace(plainText, @"<[^>]+>", "\n", RegexOptions.IgnoreCase); - plainText = System.Net.WebUtility.HtmlDecode(plainText); - - var lines = plainText.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries) - .Select(l => l.Trim()) - .Where(l => !string.IsNullOrWhiteSpace(l)) - .ToList(); - - var doc = FryPdfDocument.Create(container => - { - container.Page(page => - { - page.Size(options.Orientation == PageOrientation.Landscape ? PageSizes.A4.Landscape() : PageSizes.A4); - page.Margin((float)options.MarginPoints); - page.PageColor(QColors.White); - page.DefaultTextStyle(x => x.FontSize(10.5f).FontFamily("Helvetica").FontColor(QColors.Grey.Darken3)); - - page.Header().Text(options.IsUrl ? options.HtmlContentOrUrl : "HTML Web Document").SemiBold().FontColor(QColors.Blue.Darken2); - - page.Content().PaddingVertical(10).Column(col => - { - col.Spacing(6); - foreach (var l in lines) - { - col.Item().Text(l); - } - }); - - if (options.IncludePageNumbers) - { - page.Footer().AlignCenter().Text(x => - { - x.Span("Page "); - x.CurrentPageNumber(); - x.Span(" of "); - x.TotalPages(); - }); - } - }); - }); - - doc.GeneratePdf(outPath); - progress?.Report(100.0); - - long outBytes = File.Exists(outPath) ? new FileInfo(outPath).Length : 0; - return new ToolExecutionResult - { - Success = true, - OutputFilePath = outPath, - OutputFiles = new List { outPath }, - OriginalSizeBytes = htmlContent.Length, - OutputSizeBytes = outBytes, - Message = $"Compiled HTML content to PDF: {Path.GetFileName(outPath)}" - }; - }, ct); - } - - public async Task ConvertPdfToMarkdownAsync(MarkdownConversionOptions options, IProgress? progress = null, CancellationToken ct = default) - { - return await Task.Run(() => - { - if (!File.Exists(options.InputFilePath)) - return new ToolExecutionResult { Success = false, ErrorMessage = "Input PDF file does not exist." }; - - long origBytes = new FileInfo(options.InputFilePath).Length; - string outPath = options.OutputFilePath; - if (string.IsNullOrWhiteSpace(outPath)) - { - string dir = Path.GetDirectoryName(options.InputFilePath) ?? ""; - string name = Path.GetFileNameWithoutExtension(options.InputFilePath); - outPath = Path.Combine(dir, $"{name}.md"); - } - - ct.ThrowIfCancellationRequested(); - progress?.Report(15.0); - - using var pdf = UglyToad.PdfPig.PdfDocument.Open(options.InputFilePath); - int totalPages = pdf.NumberOfPages; - var sb = new StringBuilder(); - - if (options.IncludeMetadataHeader) - { - sb.AppendLine("---"); - sb.AppendLine($"title: \"{Path.GetFileNameWithoutExtension(options.InputFilePath)}\""); - sb.AppendLine($"pages: {totalPages}"); - sb.AppendLine($"generated_by: \"FryPDF\""); - sb.AppendLine($"producer: \"codefrydev.in\""); - sb.AppendLine($"date: \"{DateTime.UtcNow:yyyy-MM-dd}\""); - sb.AppendLine("---"); - sb.AppendLine(); - } - - for (int p = 1; p <= totalPages; p++) - { - ct.ThrowIfCancellationRequested(); - var page = pdf.GetPage(p); - sb.AppendLine($""); - sb.AppendLine(); - - var lines = page.Text.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries); - - foreach (var line in lines) - { - string trimmed = line.Trim(); - if (string.IsNullOrWhiteSpace(trimmed)) continue; - - // Heading heuristics - if (trimmed.Length < 60 && (trimmed.StartsWith("Chapter") || trimmed.StartsWith("Section") || trimmed.All(c => !char.IsLetter(c) || char.IsUpper(c)))) - { - sb.AppendLine($"## {trimmed}"); - sb.AppendLine(); - } - // Bullet list - else if (trimmed.StartsWith("•") || trimmed.StartsWith("-") || trimmed.StartsWith("*")) - { - sb.AppendLine($"- {trimmed.TrimStart('•', '-', '*', ' ')}"); - } - // Numbered list - else if (Regex.IsMatch(trimmed, @"^\d+[\.\)]\s+")) - { - sb.AppendLine(trimmed); - } - else - { - sb.AppendLine(trimmed); - sb.AppendLine(); - } - } - - sb.AppendLine(); - progress?.Report(15.0 + (p / (double)totalPages * 75.0)); - } - - File.WriteAllText(outPath, sb.ToString(), Encoding.UTF8); - progress?.Report(100.0); - - long outBytes = File.Exists(outPath) ? new FileInfo(outPath).Length : 0; - return new ToolExecutionResult - { - Success = true, - OutputFilePath = outPath, - OutputFiles = new List { outPath }, - OriginalSizeBytes = origBytes, - OutputSizeBytes = outBytes, - ExtraData = new Dictionary { ["MarkdownContent"] = sb.ToString() }, - Message = $"Extracted structured Markdown ({totalPages} pages) to {Path.GetFileName(outPath)}" - }; - }, ct); - } - - private static string GetExcelColumnName(int colIndex) - { - string name = ""; - while (colIndex > 0) - { - int mod = (colIndex - 1) % 26; - name = (char)('A' + mod) + name; - colIndex = (colIndex - mod) / 26; - } - return name; - } - - /// - /// Detects the legacy OLE2 Compound File signature used by pre-2007 .doc/.xls/.ppt - /// binary formats, which DocumentFormat.OpenXml (ZIP/OOXML-only) cannot open. - /// - private static bool IsLegacyOfficeBinaryFormat(string path) - { - try - { - using var fs = File.OpenRead(path); - Span header = stackalloc byte[8]; - int read = fs.Read(header); - if (read < 8) return false; - ReadOnlySpan ole2Signature = stackalloc byte[] { 0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1 }; - return header.SequenceEqual(ole2Signature); - } - catch - { - return false; - } - } -} diff --git a/src/PdfEditorApp/Services/Tools/Core/IPdfToolViewModelFactory.cs b/src/PdfEditorApp/Services/Tools/Core/IPdfToolViewModelFactory.cs deleted file mode 100644 index fe54ff3..0000000 --- a/src/PdfEditorApp/Services/Tools/Core/IPdfToolViewModelFactory.cs +++ /dev/null @@ -1,15 +0,0 @@ -using PdfEditorApp.ViewModels.Tools.Core; -using PdfEditorApp.Models; -using PdfEditorApp.ViewModels.Tools; - -namespace PdfEditorApp.Services.Tools.Core; - -/// -/// Factory interface for creating dedicated PDF Tool ViewModels for any registered tool ID. -/// -public interface IPdfToolViewModelFactory -{ - PdfToolViewModelBase Create(PdfToolId toolId); - PdfToolViewModelBase CreateToolViewModel(PdfToolId toolId); - PdfToolViewModelBase CreateToolViewModel(PdfToolDefinition toolDefinition); -} diff --git a/src/PdfEditorApp/Services/Tools/Core/PdfFileHelper.cs b/src/PdfEditorApp/Services/Tools/Core/PdfFileHelper.cs deleted file mode 100644 index 0bc3689..0000000 --- a/src/PdfEditorApp/Services/Tools/Core/PdfFileHelper.cs +++ /dev/null @@ -1,377 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using PdfSharpCore.Pdf; -using PdfSharpCore.Pdf.IO; -using UglyToad.PdfPig.Writer; - -namespace PdfEditorApp.Services.Tools.Core; - -/// -/// Robust PDF file reader and sanitizer. -/// Gracefully opens modern, web-exported, linearized, or non-standard PDF files. -/// -public static class PdfFileHelper -{ - public static void SetFryPdfMetadata( - PdfSharpCore.Pdf.PdfDocument doc, - string? title = null, - string? author = null, - string? subject = null, - string? keywords = null, - string? creator = null, - string? producer = null) - { - if (doc == null) return; - if (!string.IsNullOrEmpty(title) && string.IsNullOrEmpty(doc.Info.Title)) doc.Info.Title = title; - if (!string.IsNullOrEmpty(author) && string.IsNullOrEmpty(doc.Info.Author)) doc.Info.Author = author; - if (!string.IsNullOrEmpty(subject) && string.IsNullOrEmpty(doc.Info.Subject)) doc.Info.Subject = subject; - if (!string.IsNullOrEmpty(keywords) && string.IsNullOrEmpty(doc.Info.Keywords)) doc.Info.Keywords = keywords; - doc.Info.Creator = !string.IsNullOrWhiteSpace(creator) ? creator : "FryPDF"; - try - { - doc.Info.Elements.SetString("/Producer", !string.IsNullOrWhiteSpace(producer) ? producer : "codefrydev.in"); - } - catch - { - try { doc.Info.Elements["/Producer"] = new PdfString(!string.IsNullOrWhiteSpace(producer) ? producer : "codefrydev.in"); } catch { } - } - } - - public static void SaveDocumentWithFryPdfMetadata( - PdfSharpCore.Pdf.PdfDocument doc, - string filePath, - string? title = null, - string? author = null, - string? subject = null, - string? keywords = null, - string? creator = "FryPDF", - string? producer = "codefrydev.in") - { - SetFryPdfMetadata(doc, title, author, subject, keywords, creator, producer); - doc.Save(filePath); - PatchProducerInFile(filePath, producer ?? "codefrydev.in"); - } - - public static void PatchProducerInFile(string filePath, string producer = "codefrydev.in") - { - if (!File.Exists(filePath)) return; - try - { - byte[] bytes = File.ReadAllBytes(filePath); - byte[] updated = PatchProducerInBytes(bytes, producer); - if (updated != null && updated.Length > 0) - { - File.WriteAllBytes(filePath, updated); - } - } - catch { } - } - - public static byte[] PatchProducerInBytes(byte[] bytes, string producer = "codefrydev.in") - { - if (bytes == null || bytes.Length < 20) return bytes ?? Array.Empty(); - - try - { - string text = Encoding.ASCII.GetString(bytes); - if (text.Contains("/Encrypt")) - { - // Never binary patch encrypted PDF streams - return bytes; - } - - int searchIdx = 0; - while ((searchIdx = text.IndexOf("/Producer", searchIdx, StringComparison.Ordinal)) >= 0) - { - int openParen = text.IndexOf('(', searchIdx); - if (openParen > searchIdx && openParen < searchIdx + 25) - { - int closeParen = text.IndexOf(')', openParen); - if (closeParen > openParen) - { - int origSpanLen = closeParen - openParen + 1; - string replacement = $"({producer})"; - if (replacement.Length <= origSpanLen) - { - string filler = "%".PadRight(origSpanLen - replacement.Length, ' '); - string fullPatch = replacement + filler; - byte[] patchBytes = Encoding.ASCII.GetBytes(fullPatch); - Array.Copy(patchBytes, 0, bytes, openParen, patchBytes.Length); - } - } - } - searchIdx += 9; - } - } - catch { } - - return bytes; - } - - public static PdfSharpCore.Pdf.PdfDocument OpenDocumentSafely(string filePath, PdfDocumentOpenMode mode = PdfDocumentOpenMode.Import, string? password = null) - { - if (!File.Exists(filePath)) - throw new FileNotFoundException($"File not found: {filePath}"); - - // 1. Direct open attempt - try - { - if (string.IsNullOrEmpty(password)) - return PdfReader.Open(filePath, mode); - else - return PdfReader.Open(filePath, password, mode); - } - catch - { - // 2. Read bytes and sanitize trailing garbage or whitespace - byte[] rawBytes = File.ReadAllBytes(filePath); - byte[] sanitized = SanitizePdfBytes(rawBytes); - - try - { - var ms = new MemoryStream(sanitized); - if (string.IsNullOrEmpty(password)) - return PdfReader.Open(ms, mode); - else - return PdfReader.Open(ms, password, mode); - } - catch - { - // 3. Fallback: Reconstruct using pure C# PdfPig builder (handles modern cross-reference streams and non-standard xrefs) - try - { - byte[] rebuilt = ReconstructCleanPdfWithPdfPig(filePath); - if (rebuilt.Length > 0) - { - var msRebuilt = new MemoryStream(rebuilt); - if (string.IsNullOrEmpty(password)) - return PdfReader.Open(msRebuilt, mode); - else - return PdfReader.Open(msRebuilt, password, mode); - } - } - catch - { - // Continue to next fallback - } - - // 4. Fallback: synthesize trailer - byte[] repaired = SalvageAndRepairPdfBytes(sanitized); - var ms = new MemoryStream(repaired); - if (string.IsNullOrEmpty(password)) - return PdfReader.Open(ms, mode); - else - return PdfReader.Open(ms, password, mode); - } - } - } - - public static int InspectPageCountSafely(string filePath) - { - if (!File.Exists(filePath)) return 0; - - // 1. Try modern PdfPig parser (handles all PDF versions & formats) - try - { - using var pig = UglyToad.PdfPig.PdfDocument.Open(filePath); - return pig.NumberOfPages; - } - catch - { - // 2. Try OpenDocumentSafely - try - { - using var doc = OpenDocumentSafely(filePath, PdfDocumentOpenMode.Import); - return doc.PageCount; - } - catch - { - // 3. Regex token counting fallback - try - { - byte[] bytes = File.ReadAllBytes(filePath); - string text = Encoding.ASCII.GetString(bytes); - int count = 0; - int idx = 0; - while ((idx = text.IndexOf("/Type /Page", idx, StringComparison.Ordinal)) != -1) - { - if (idx + 11 >= text.Length || text[idx + 11] != 's') - { - count++; - } - idx += 11; - } - return Math.Max(1, count); - } - catch - { - return 1; - } - } - } - } - - public static byte[] ReconstructCleanPdfWithPdfPig(string filePath) - { - var builder = new PdfDocumentBuilder(); - using (var pigDoc = UglyToad.PdfPig.PdfDocument.Open(filePath)) - { - for (int i = 1; i <= pigDoc.NumberOfPages; i++) - { - builder.AddPage(pigDoc, i); - } - } - return builder.Build(); - } - - public static byte[] SanitizePdfBytes(byte[] rawBytes) - { - if (rawBytes == null || rawBytes.Length < 10) return rawBytes ?? Array.Empty(); - - // Look for the last %%EOF token in the file - string rawText = Encoding.ASCII.GetString(rawBytes, Math.Max(0, rawBytes.Length - 8192), Math.Min(rawBytes.Length, 8192)); - int eofIdx = rawText.LastIndexOf("%%EOF", StringComparison.OrdinalIgnoreCase); - - if (eofIdx >= 0) - { - int startOffset = Math.Max(0, rawBytes.Length - 8192); - int eofAbsoluteEnd = startOffset + eofIdx + 5; - - if (eofAbsoluteEnd < rawBytes.Length) - { - var trimmed = new byte[eofAbsoluteEnd + 2]; - Array.Copy(rawBytes, 0, trimmed, 0, eofAbsoluteEnd); - trimmed[eofAbsoluteEnd] = (byte)'\r'; - trimmed[eofAbsoluteEnd + 1] = (byte)'\n'; - return trimmed; - } - } - else - { - // Missing %%EOF, append standard trailer terminator - using var ms = new MemoryStream(); - ms.Write(rawBytes, 0, rawBytes.Length); - byte[] terminator = Encoding.ASCII.GetBytes("\r\n%%EOF\r\n"); - ms.Write(terminator, 0, terminator.Length); - return ms.ToArray(); - } - - return rawBytes; - } - - public static byte[] SalvageAndRepairPdfBytes(byte[] rawBytes) - { - string fullText = Encoding.ASCII.GetString(rawBytes); - int rootIdx = fullText.IndexOf("/Root", StringComparison.OrdinalIgnoreCase); - if (rootIdx >= 0 && !fullText.Contains("trailer")) - { - int spaceIdx = fullText.IndexOf(" ", rootIdx + 5); - string rootRef = "1 0 R"; - if (spaceIdx > 0 && spaceIdx + 10 < fullText.Length) - { - string snippet = fullText.Substring(rootIdx + 5, Math.Min(20, fullText.Length - (rootIdx + 5))).Trim(); - var parts = snippet.Split(new[] { ' ', '\r', '\n', '/' }, StringSplitOptions.RemoveEmptyEntries); - if (parts.Length >= 3 && parts[2] == "R") - { - rootRef = $"{parts[0]} {parts[1]} R"; - } - } - - using var ms = new MemoryStream(); - ms.Write(rawBytes, 0, rawBytes.Length); - string synthTrailer = $"\r\ntrailer\r\n<<\r\n/Root {rootRef}\r\n>>\r\nstartxref\r\n0\r\n%%EOF\r\n"; - byte[] tBytes = Encoding.ASCII.GetBytes(synthTrailer); - ms.Write(tBytes, 0, tBytes.Length); - return ms.ToArray(); - } - return rawBytes; - } - - /// - /// Checks whether an existing file is currently locked or cannot be opened for writing by the current process. - /// Returns false if the file does not exist. - /// - public static bool IsFileLocked(string filePath) - { - if (!File.Exists(filePath)) return false; - try - { - using var stream = new FileStream(filePath, FileMode.Open, FileAccess.ReadWrite, FileShare.None); - return false; - } - catch (IOException) - { - return true; - } - catch (UnauthorizedAccessException) - { - return true; - } - catch - { - return false; - } - } - - /// - /// Resolves a safe, non-conflicting, and writable destination file path. - /// If requestedPath is supplied and non-empty, it is returned directly. - /// Otherwise, checks defaultDirectory for baseFileName.extension. - /// If that file already exists and is locked or matches any path in avoidPaths, - /// appends an incrementing index (_1, _2, ...) until an available and unlocked path is found. - /// - public static string ResolveSafeOutputPath( - string? requestedPath, - string defaultDirectory, - string baseFileName, - string extension = ".pdf", - IEnumerable? avoidPaths = null) - { - if (!string.IsNullOrWhiteSpace(requestedPath)) - { - return requestedPath; - } - - if (!extension.StartsWith(".", StringComparison.Ordinal)) - { - extension = "." + extension; - } - - string dir = !string.IsNullOrWhiteSpace(defaultDirectory) && Directory.Exists(defaultDirectory) - ? defaultDirectory - : Path.GetTempPath(); - - var avoidList = avoidPaths? - .Where(p => !string.IsNullOrWhiteSpace(p)) - .Select(p => Path.GetFullPath(p)) - .ToHashSet(StringComparer.OrdinalIgnoreCase); - - bool ShouldAvoid(string path) - { - string fullPath = Path.GetFullPath(path); - if (avoidList != null && avoidList.Contains(fullPath)) return true; - if (File.Exists(path) && IsFileLocked(path)) return true; - return false; - } - - string candidate = Path.Combine(dir, $"{baseFileName}{extension}"); - if (!ShouldAvoid(candidate)) - { - return candidate; - } - - for (int i = 1; i <= 1000; i++) - { - candidate = Path.Combine(dir, $"{baseFileName}_{i}{extension}"); - if (!ShouldAvoid(candidate)) - { - return candidate; - } - } - - return Path.Combine(dir, $"{baseFileName}_{DateTime.Now:yyyyMMdd_HHmmss}{extension}"); - } -} diff --git a/src/PdfEditorApp/Services/Tools/Core/PdfPageRenderer.cs b/src/PdfEditorApp/Services/Tools/Core/PdfPageRenderer.cs deleted file mode 100644 index a59e189..0000000 --- a/src/PdfEditorApp/Services/Tools/Core/PdfPageRenderer.cs +++ /dev/null @@ -1,156 +0,0 @@ -using System.IO; -using Avalonia.Media.Imaging; -using QuestPDF.Fluent; -using QuestPDF.Infrastructure; -using UglyToad.PdfPig; -using UglyToad.PdfPig.Rendering.Skia; - -namespace PdfEditorApp.Services.Tools.Core; - -/// -/// Single shared PdfPig+Skia page rasterization path, used by both the PDF reader -/// () and tool-screen live -/// previews (), -/// so the render pipeline exists in exactly one place instead of being reimplemented -/// per screen. -/// -public static class PdfPageRenderer -{ - /// - /// Renders one page of a PDF file to a bitmap at the given scale. Falls back to - /// PdfFileHelper's salvage/repair path if the file can't be opened directly. - /// Page dimensions are still returned even if bitmap decoding fails, since callers - /// (page-card sizing, mark-position math) depend on them independent of render success. - /// - public static (Bitmap? Bitmap, double WidthPoints, double HeightPoints) RenderPageAtScale( - string filePath, int pageNumber, float scale) - { - if (string.IsNullOrEmpty(filePath) || !File.Exists(filePath) || pageNumber < 1) - { - return (null, 0, 0); - } - - try - { - byte[] bytes = File.ReadAllBytes(filePath); - - PdfDocument? doc = null; - try - { - doc = PdfDocument.Open(bytes); - } - catch - { - try - { - byte[] repaired = PdfFileHelper.SalvageAndRepairPdfBytes(bytes); - doc = PdfDocument.Open(repaired); - } - catch - { - return (null, 0, 0); - } - } - - using (doc) - { - if (pageNumber > doc.NumberOfPages) - { - return (null, 0, 0); - } - - var page = doc.GetPage(pageNumber); - double widthPoints = page.Width; - double heightPoints = page.Height; - - try { PdfPigExtensions.AddSkiaPageFactory(doc); } catch { } - - using var stream = PdfPigExtensions.GetPageAsPng(doc, pageNumber, scale, 100); - if (stream != null && stream.Length > 0) - { - stream.Position = 0; - Bitmap? bitmap = null; - try { bitmap = new Bitmap(stream); } catch { } - return (bitmap, widthPoints, heightPoints); - } - - return (null, widthPoints, heightPoints); - } - } - catch - { - return (null, 0, 0); - } - } - - /// - /// Renders a raw SVG XML string to PNG bytes using QuestPDF's native vector SVG engine - /// and PdfPig/Skia. Pure headless, high-DPI rasterization without UI dependencies. - /// - public static byte[]? RenderSvgToPngBytes(string svgMarkup, double targetWidth, double targetHeight) - { - if (string.IsNullOrWhiteSpace(svgMarkup)) return null; - - try - { - float w = (float)System.Math.Max(30, targetWidth); - float h = (float)System.Math.Max(30, targetHeight); - - // High-DPI scale (clamped to prevent memory bloat, capped at max 2048px) - float maxDim = System.Math.Max(w, h); - float scale = maxDim > 0 ? (float)System.Math.Clamp(2048.0 / maxDim, 1.0, 2.5) : 2.0f; - - var doc = QuestPDF.Fluent.Document.Create(container => - { - container.Page(page => - { - page.Size(w, h, QuestPDF.Infrastructure.Unit.Point); - page.Margin(0); - page.PageColor(QuestPDF.Helpers.Colors.Transparent); - page.Content().Svg(svgMarkup).FitArea(); - }); - }); - - byte[] pdfBytes = doc.GeneratePdf(); - using var pdfPigDoc = PdfDocument.Open(pdfBytes); - try { PdfPigExtensions.AddSkiaPageFactory(pdfPigDoc); } catch { } - - using var stream = PdfPigExtensions.GetPageAsPng(pdfPigDoc, 1, scale, 100); - if (stream != null && stream.Length > 0) - { - return stream.ToArray(); - } - } - catch - { - // Graceful fallback - } - - return null; - } - - /// - /// Renders a raw SVG XML string to a high-DPI Avalonia Bitmap using QuestPDF's native vector SVG engine - /// and PdfPig/Skia. Ensures complete visual fidelity for complex multi-element diagrams (paths, circles, - /// rects, polygons, texts, gradients, markers) on the live Avalonia canvas. - /// - public static Bitmap? RenderSvgToBitmap(string svgMarkup, double targetWidth, double targetHeight) - { - byte[]? pngBytes = RenderSvgToPngBytes(svgMarkup, targetWidth, targetHeight); - if (pngBytes != null && pngBytes.Length > 0) - { - try - { - using var ms = new MemoryStream(pngBytes); - return new Bitmap(ms); - } - catch - { - // In headless unit test runners without Avalonia platform rendering context - return null; - } - } - - return null; - } -} diff --git a/src/PdfEditorApp/Services/Tools/Core/PdfToolRegistry.cs b/src/PdfEditorApp/Services/Tools/Core/PdfToolRegistry.cs deleted file mode 100644 index d09cc3b..0000000 --- a/src/PdfEditorApp/Services/Tools/Core/PdfToolRegistry.cs +++ /dev/null @@ -1,553 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using PdfEditorApp.Models; - -namespace PdfEditorApp.Services.Tools.Core; - -using PdfEditorApp.Core.Plugins; - -public interface IPdfToolRegistry -{ - event Action? RegistryChanged; - IReadOnlyList GetAllTools(); - IReadOnlyList GetToolsByCategory(PdfToolCategory category); - PdfToolDefinition? GetTool(PdfToolId id); - PdfToolDefinition? GetTool(string stringId); - void RegisterTool(PdfToolDefinition tool); -} - -public class PdfToolRegistry : IPdfToolRegistry -{ - public event Action? RegistryChanged; - private readonly List _tools; - private readonly IFryPluginContext? _pluginContext; - private readonly bool _seedDefaults; - - public PdfToolRegistry(IFryPluginContext? pluginContext = null, bool seedDefaults = true) - { - _pluginContext = pluginContext; - _seedDefaults = seedDefaults; - _tools = seedDefaults ? GetBuiltInToolDefinitions() : new List(); - if (_pluginContext != null) - { - _pluginContext.ToolsChanged += () => RegistryChanged?.Invoke(); - } - } - - private static List GetBuiltInToolDefinitions() => new() - { - // 1. MERGE PDF - new PdfToolDefinition - { - Id = PdfToolId.MergePdf, - Name = "Merge PDF", - Description = "Combine PDFs in the order you want with the easiest PDF merger available.", - Category = PdfToolCategory.OrganizeAndPage, - IconKind = "CallMerge", - IconColorHex = "#EA580C", - BackgroundAccentHex = "#FFF7ED", - SupportsMultiFile = true, - AcceptedFileExtensions = ".pdf" - }, - // 2. SPLIT PDF - new PdfToolDefinition - { - Id = PdfToolId.SplitPdf, - Name = "Split PDF", - Description = "Separate one page or a whole set for easy conversion into independent PDF files.", - Category = PdfToolCategory.OrganizeAndPage, - IconKind = "CallSplit", - IconColorHex = "#DC2626", - BackgroundAccentHex = "#FEF2F2", - SupportsMultiFile = false, - AcceptedFileExtensions = ".pdf" - }, - // 3. COMPRESS PDF - new PdfToolDefinition - { - Id = PdfToolId.CompressPdf, - Name = "Compress PDF", - Description = "Reduce file size while optimizing for maximal PDF quality.", - Category = PdfToolCategory.OptimizeAndSecurity, - IconKind = "ArrowCollapseAll", - IconColorHex = "#16A34A", - BackgroundAccentHex = "#F0FDF4", - SupportsMultiFile = true, - AcceptedFileExtensions = ".pdf" - }, - // 4. PDF TO WORD - new PdfToolDefinition - { - Id = PdfToolId.PdfToWord, - Name = "PDF to Word", - Description = "Easily convert your PDF files into easy to edit DOC and DOCX documents.", - Category = PdfToolCategory.ConvertFromPdf, - IconKind = "FileWordOutline", - IconColorHex = "#2563EB", - BackgroundAccentHex = "#EFF6FF", - SupportsMultiFile = true, - AcceptedFileExtensions = ".pdf" - }, - // 5. PDF TO POWERPOINT - new PdfToolDefinition - { - Id = PdfToolId.PdfToPowerPoint, - Name = "PDF to PowerPoint", - Description = "Turn your PDF files into easy to edit PPT and PPTX slideshows.", - Category = PdfToolCategory.ConvertFromPdf, - IconKind = "FilePowerpointOutline", - IconColorHex = "#EA580C", - BackgroundAccentHex = "#FFF7ED", - SupportsMultiFile = true, - AcceptedFileExtensions = ".pdf" - }, - // 6. PDF TO EXCEL - new PdfToolDefinition - { - Id = PdfToolId.PdfToExcel, - Name = "PDF to Excel", - Description = "Pull data straight from PDFs into Excel spreadsheets in a few short seconds.", - Category = PdfToolCategory.ConvertFromPdf, - IconKind = "FileExcelOutline", - IconColorHex = "#16A34A", - BackgroundAccentHex = "#F0FDF4", - SupportsMultiFile = true, - AcceptedFileExtensions = ".pdf" - }, - // 7. WORD TO PDF - new PdfToolDefinition - { - Id = PdfToolId.WordToPdf, - Name = "Word to PDF", - Description = "Make DOC and DOCX files easy to read by converting them to PDF.", - Category = PdfToolCategory.ConvertToPdf, - IconKind = "FileWord", - IconColorHex = "#2563EB", - BackgroundAccentHex = "#EFF6FF", - SupportsMultiFile = true, - AcceptedFileExtensions = ".docx,.doc" - }, - // 8. POWERPOINT TO PDF - new PdfToolDefinition - { - Id = PdfToolId.PowerPointToPdf, - Name = "PowerPoint to PDF", - Description = "Make PPT and PPTX slideshows easy to view by converting them to PDF.", - Category = PdfToolCategory.ConvertToPdf, - IconKind = "FilePowerpoint", - IconColorHex = "#EA580C", - BackgroundAccentHex = "#FFF7ED", - SupportsMultiFile = true, - AcceptedFileExtensions = ".pptx,.ppt" - }, - // 9. EXCEL TO PDF - new PdfToolDefinition - { - Id = PdfToolId.ExcelToPdf, - Name = "Excel to PDF", - Description = "Make EXCEL spreadsheets easy to read by converting them to PDF.", - Category = PdfToolCategory.ConvertToPdf, - IconKind = "FileExcel", - IconColorHex = "#16A34A", - BackgroundAccentHex = "#F0FDF4", - SupportsMultiFile = true, - AcceptedFileExtensions = ".xlsx,.xls" - }, - // 10. EDIT PDF - new PdfToolDefinition - { - Id = PdfToolId.EditPdf, - Name = "Edit PDF", - Description = "Add text, images, shapes or freehand annotations to a PDF document. Edit size, font and color.", - Category = PdfToolCategory.EditAndForms, - IconKind = "Draw", - IconColorHex = "#9333EA", - BackgroundAccentHex = "#FAF5FF", - SupportsMultiFile = false, - AcceptedFileExtensions = ".pdf,.frypdf,.json" - }, - // 11. PDF TO JPG - new PdfToolDefinition - { - Id = PdfToolId.PdfToJpg, - Name = "PDF to JPG", - Description = "Convert each PDF page into a JPG or extract all images contained in a PDF.", - Category = PdfToolCategory.ConvertFromPdf, - IconKind = "FileImageOutline", - IconColorHex = "#CA8A04", - BackgroundAccentHex = "#FEFCE8", - SupportsMultiFile = true, - AcceptedFileExtensions = ".pdf" - }, - // 12. JPG TO PDF - new PdfToolDefinition - { - Id = PdfToolId.JpgToPdf, - Name = "JPG to PDF", - Description = "Convert JPG images to PDF in seconds. Easily adjust orientation and margins.", - Category = PdfToolCategory.ConvertToPdf, - IconKind = "ImageOutline", - IconColorHex = "#CA8A04", - BackgroundAccentHex = "#FEFCE8", - SupportsMultiFile = true, - AcceptedFileExtensions = ".jpg,.jpeg,.png,.bmp,.webp" - }, - // 13. SIGN PDF - new PdfToolDefinition - { - Id = PdfToolId.SignPdf, - Name = "Sign PDF", - Description = "Sign yourself with ink, typed cursive, image stamp, or digital certificate signatures.", - Category = PdfToolCategory.OptimizeAndSecurity, - IconKind = "DrawPen", - IconColorHex = "#2563EB", - BackgroundAccentHex = "#EFF6FF", - SupportsMultiFile = false, - AcceptedFileExtensions = ".pdf" - }, - // 14. WATERMARK - new PdfToolDefinition - { - Id = PdfToolId.Watermark, - Name = "Watermark", - Description = "Stamp an image or text over your PDF in seconds. Choose typography, transparency and position.", - Category = PdfToolCategory.EditAndForms, - IconKind = "Watermark", - IconColorHex = "#9333EA", - BackgroundAccentHex = "#FAF5FF", - SupportsMultiFile = true, - AcceptedFileExtensions = ".pdf" - }, - // 15. ROTATE PDF - new PdfToolDefinition - { - Id = PdfToolId.RotatePdf, - Name = "Rotate PDF", - Description = "Rotate your PDFs the way you need them. You can even rotate multiple PDFs at once!", - Category = PdfToolCategory.OrganizeAndPage, - IconKind = "RotateRight", - IconColorHex = "#9333EA", - BackgroundAccentHex = "#FAF5FF", - SupportsMultiFile = true, - AcceptedFileExtensions = ".pdf" - }, - // 16. HTML TO PDF - new PdfToolDefinition - { - Id = PdfToolId.HtmlToPdf, - Name = "HTML to PDF", - Description = "Convert webpages or HTML files to PDF. Copy and paste URL or load local HTML.", - Category = PdfToolCategory.ConvertToPdf, - IconKind = "LanguageHtml5", - IconColorHex = "#CA8A04", - BackgroundAccentHex = "#FEFCE8", - SupportsMultiFile = false, - AcceptedFileExtensions = ".html,.htm" - }, - // 17. UNLOCK PDF - new PdfToolDefinition - { - Id = PdfToolId.UnlockPdf, - Name = "Unlock PDF", - Description = "Remove PDF password security, giving you the freedom to use your PDFs as you want.", - Category = PdfToolCategory.OptimizeAndSecurity, - IconKind = "LockOpenOutline", - IconColorHex = "#0284C7", - BackgroundAccentHex = "#F0F9FF", - SupportsMultiFile = true, - AcceptedFileExtensions = ".pdf" - }, - // 18. PROTECT PDF - new PdfToolDefinition - { - Id = PdfToolId.ProtectPdf, - Name = "Protect PDF", - Description = "Protect PDF files with a password. Encrypt PDF documents to prevent unauthorized access.", - Category = PdfToolCategory.OptimizeAndSecurity, - IconKind = "ShieldCheckOutline", - IconColorHex = "#0284C7", - BackgroundAccentHex = "#F0F9FF", - SupportsMultiFile = true, - AcceptedFileExtensions = ".pdf" - }, - // 19. ORGANIZE PDF - new PdfToolDefinition - { - Id = PdfToolId.OrganizePdf, - Name = "Organize PDF", - Description = "Sort pages of your PDF file however you like. Delete PDF pages or add PDF pages at convenience.", - Category = PdfToolCategory.OrganizeAndPage, - IconKind = "SortAlphabeticalVariant", - IconColorHex = "#EA580C", - BackgroundAccentHex = "#FFF7ED", - SupportsMultiFile = false, - AcceptedFileExtensions = ".pdf" - }, - // 20. PDF TO PDF/A - new PdfToolDefinition - { - Id = PdfToolId.PdfToPdfA, - Name = "PDF to PDF/A", - Description = "Transform your PDF to PDF/A, the ISO-standardized version of PDF for long-term archiving.", - Category = PdfToolCategory.OptimizeAndSecurity, - IconKind = "FileCheckOutline", - IconColorHex = "#0284C7", - BackgroundAccentHex = "#F0F9FF", - SupportsMultiFile = true, - AcceptedFileExtensions = ".pdf" - }, - // 21. REPAIR PDF - new PdfToolDefinition - { - Id = PdfToolId.RepairPdf, - Name = "Repair PDF", - Description = "Repair a damaged PDF and recover data from corrupt PDF. Fix PDF files with our repair tool.", - Category = PdfToolCategory.OptimizeAndSecurity, - IconKind = "WrenchOutline", - IconColorHex = "#65A30D", - BackgroundAccentHex = "#F7FEE7", - SupportsMultiFile = true, - AcceptedFileExtensions = ".pdf" - }, - // 22. PAGE NUMBERS - new PdfToolDefinition - { - Id = PdfToolId.PageNumbers, - Name = "Page numbers", - Description = "Add page numbers into PDFs with ease. Choose your positions, dimensions, typography.", - Category = PdfToolCategory.OrganizeAndPage, - IconKind = "Numeric1BoxMultipleOutline", - IconColorHex = "#9333EA", - BackgroundAccentHex = "#FAF5FF", - SupportsMultiFile = true, - AcceptedFileExtensions = ".pdf" - }, - // 23. SCAN TO PDF - new PdfToolDefinition - { - Id = PdfToolId.ScanToPdf, - Name = "Scan to PDF", - Description = "Capture document scans from your mobile device or scanner and enhance them cleanly.", - Category = PdfToolCategory.ConvertToPdf, - IconKind = "Scanner", - IconColorHex = "#EA580C", - BackgroundAccentHex = "#FFF7ED", - SupportsMultiFile = true, - AcceptedFileExtensions = ".jpg,.jpeg,.png,.tiff,.bmp" - }, - // 24. OCR PDF - new PdfToolDefinition - { - Id = PdfToolId.OcrPdf, - Name = "OCR PDF", - Description = "Easily convert scanned PDF into searchable and selectable documents.", - Category = PdfToolCategory.AiAndAutomation, - IconKind = "TextRecognition", - IconColorHex = "#65A30D", - BackgroundAccentHex = "#F7FEE7", - SupportsMultiFile = true, - AcceptedFileExtensions = ".pdf" - }, - // 25. COMPARE PDF - new PdfToolDefinition - { - Id = PdfToolId.ComparePdf, - Name = "Compare PDF", - Description = "Show a side-by-side document comparison and easily spot changes between different file versions.", - Category = PdfToolCategory.EditAndForms, - IconKind = "BookOpenPageVariantOutline", - IconColorHex = "#2563EB", - BackgroundAccentHex = "#EFF6FF", - SupportsMultiFile = true, - AcceptedFileExtensions = ".pdf" - }, - // 26. REDACT PDF - new PdfToolDefinition - { - Id = PdfToolId.RedactPdf, - Name = "Redact PDF", - Description = "Redact text and graphics to permanently remove sensitive information from a PDF.", - Category = PdfToolCategory.OptimizeAndSecurity, - IconKind = "SelectRemove", - IconColorHex = "#0284C7", - BackgroundAccentHex = "#F0F9FF", - SupportsMultiFile = false, - AcceptedFileExtensions = ".pdf" - }, - // 27. CROP PDF - new PdfToolDefinition - { - Id = PdfToolId.CropPdf, - Name = "Crop PDF", - Description = "Crop margins of PDF documents or select specific areas, then apply changes to one or all pages.", - Category = PdfToolCategory.OrganizeAndPage, - IconKind = "Crop", - IconColorHex = "#9333EA", - BackgroundAccentHex = "#FAF5FF", - SupportsMultiFile = true, - AcceptedFileExtensions = ".pdf" - }, - // 28. PDF FORMS (New!) - new PdfToolDefinition - { - Id = PdfToolId.PdfForms, - Name = "PDF Forms", - Description = "Detect form fields automatically, create interactive fillable PDFs, or fill PDF forms yourself.", - Category = PdfToolCategory.EditAndForms, - IconKind = "TextBoxOutline", - IconColorHex = "#9333EA", - BackgroundAccentHex = "#FAF5FF", - IsNew = true, - SupportsMultiFile = false, - AcceptedFileExtensions = ".pdf" - }, - // 29. AI SUMMARIZER (New!) - new PdfToolDefinition - { - Id = PdfToolId.AiSummarizer, - Name = "AI Summarizer", - Description = "Quickly generate concise summaries from articles, paragraphs, and essays with key points in seconds.", - Category = PdfToolCategory.AiAndAutomation, - IconKind = "FormatListBulletedSquare", - IconColorHex = "#6366F1", - BackgroundAccentHex = "#EEF2FF", - IsNew = true, - SupportsMultiFile = false, - AcceptedFileExtensions = ".pdf" - }, - // 30. TRANSLATE PDF (New!) - new PdfToolDefinition - { - Id = PdfToolId.TranslatePdf, - Name = "Translate PDF", - Description = "Easily translate PDF files powered by AI. Keep fonts, layout, and formatting perfectly intact.", - Category = PdfToolCategory.AiAndAutomation, - IconKind = "Translate", - IconColorHex = "#6366F1", - BackgroundAccentHex = "#EEF2FF", - IsNew = true, - SupportsMultiFile = false, - AcceptedFileExtensions = ".pdf" - }, - // 31. PDF TO MARKDOWN (New!) - new PdfToolDefinition - { - Id = PdfToolId.PdfToMarkdown, - Name = "PDF to Markdown", - Description = "Easily turn PDFs into Markdown files for notes, docs, and LLMs. Headings, tables, and lists preserved.", - Category = PdfToolCategory.ConvertFromPdf, - IconKind = "CodeTags", - IconColorHex = "#6366F1", - BackgroundAccentHex = "#EEF2FF", - IsNew = true, - SupportsMultiFile = true, - AcceptedFileExtensions = ".pdf" - }, - // 32. CREATE A WORKFLOW (New Callout Banner!) - new PdfToolDefinition - { - Id = PdfToolId.WorkflowBuilder, - Name = "Create a workflow", - Description = "Create custom workflows with your favorite tools, automate tasks, and reuse them anytime.", - Category = PdfToolCategory.AiAndAutomation, - IconKind = "TuneVariant", - IconColorHex = "#E11D48", - BackgroundAccentHex = "#FFE4E6", - IsNew = true, - IsWorkflowBanner = true, - SupportsMultiFile = true, - AcceptedFileExtensions = ".pdf,.fryflow,.json" - }, - // 33. BATCH MAIL MERGE & MASS PDF GENERATOR (New!) - new PdfToolDefinition - { - Id = PdfToolId.BatchMailMerge, - Name = "Batch Mail Merge & Mass PDF", - Description = "Generate hundreds of personalized PDFs (payslips, certificates, invoices, badges) in one click using Excel, CSV, or REST APIs.", - Category = PdfToolCategory.AiAndAutomation, - IconKind = "DatabaseArrowDownOutline", - IconColorHex = "#0F6CBD", - BackgroundAccentHex = "#EFF6FF", - IsNew = true, - SupportsMultiFile = false, - AcceptedFileExtensions = ".xlsx,.csv,.tsv,.json" - } - }; - - public IReadOnlyList GetAllTools() - { - if (_pluginContext == null) return _tools; - - var pluginTools = _pluginContext.GetRegisteredTools(); - if (pluginTools.Count == 0 && _seedDefaults) return _tools; - - var merged = _seedDefaults ? new List(_tools) : new List(); - foreach (var pt in pluginTools) - { - var existingIndex = merged.FindIndex(t => - (!string.IsNullOrEmpty(t.StringId) && string.Equals(t.StringId, pt.Id, StringComparison.OrdinalIgnoreCase)) || - (pt.LegacyId.HasValue && t.Id == (PdfToolId)pt.LegacyId.Value)); - - var toolDef = new PdfToolDefinition - { - Id = pt.LegacyId.HasValue && Enum.IsDefined(typeof(PdfToolId), pt.LegacyId.Value) - ? (PdfToolId)pt.LegacyId.Value - : PdfToolId.EditPdf, - StringId = pt.Id, - Name = pt.Name, - Description = pt.Description, - Category = ParseCategory(pt.Category), - IconKind = pt.IconKind, - IconColorHex = pt.IconColorHex, - BackgroundAccentHex = pt.BackgroundAccentHex, - SupportsMultiFile = pt.SupportsMultiFile, - AcceptedFileExtensions = pt.AcceptedFileExtensions, - ViewModelFactory = pt.CreateViewModel - }; - - if (existingIndex >= 0) - { - merged[existingIndex] = toolDef; - } - else - { - merged.Add(toolDef); - } - } - return merged; - } - - public IReadOnlyList GetToolsByCategory(PdfToolCategory category) - { - var all = GetAllTools(); - if (category == PdfToolCategory.All) return all; - return all.Where(t => t.Category == category).ToList(); - } - - public PdfToolDefinition? GetTool(PdfToolId id) => GetAllTools().FirstOrDefault(t => t.Id == id); - - public PdfToolDefinition? GetTool(string stringId) - { - if (string.IsNullOrWhiteSpace(stringId)) return null; - return GetAllTools().FirstOrDefault(t => - string.Equals(t.StringId, stringId, StringComparison.OrdinalIgnoreCase) || - string.Equals(t.Id.ToString(), stringId, StringComparison.OrdinalIgnoreCase)); - } - - public void NotifyRegistryChanged() => RegistryChanged?.Invoke(); - - public void RegisterTool(PdfToolDefinition tool) - { - ArgumentNullException.ThrowIfNull(tool); - _tools.Add(tool); - NotifyRegistryChanged(); - } - - private static PdfToolCategory ParseCategory(string category) - { - if (Enum.TryParse(category, true, out var cat)) - return cat; - return PdfToolCategory.OrganizeAndPage; - } -} diff --git a/src/PdfEditorApp/Services/Tools/Core/PdfToolViewModelFactory.cs b/src/PdfEditorApp/Services/Tools/Core/PdfToolViewModelFactory.cs deleted file mode 100644 index 352e7c8..0000000 --- a/src/PdfEditorApp/Services/Tools/Core/PdfToolViewModelFactory.cs +++ /dev/null @@ -1,156 +0,0 @@ -using PdfEditorApp.ViewModels.Tools.Core; -using PdfEditorApp.ViewModels.Tools.Organize; -using PdfEditorApp.ViewModels.Tools.Security; -using PdfEditorApp.ViewModels.Tools.Conversion; -using PdfEditorApp.ViewModels.Tools.Intelligence; -using PdfEditorApp.Services.Tools.Core; -using PdfEditorApp.Services.Tools.Organize; -using PdfEditorApp.Services.Tools.Security; -using PdfEditorApp.Services.Tools.Conversion; -using PdfEditorApp.Services.Tools.Intelligence; -using System; -using PdfEditorApp.Models; -using PdfEditorApp.ViewModels.Tools; - -using Microsoft.Extensions.DependencyInjection; - -namespace PdfEditorApp.Services.Tools.Core; - -/// -/// Default implementation of IPdfToolViewModelFactory. -/// Instantiates typed, dedicated ViewModels for each PDF tool, taking advantage of Microsoft.Extensions.DependencyInjection when available. -/// -public class PdfToolViewModelFactory : IPdfToolViewModelFactory -{ - private readonly IPdfDocumentOperationsService _operationsService; - private readonly IPdfToolRegistry _toolRegistry; - private readonly IServiceProvider? _serviceProvider; - - public PdfToolViewModelFactory( - IPdfDocumentOperationsService operationsService, - IPdfToolRegistry toolRegistry, - IServiceProvider? serviceProvider = null) - { - _operationsService = operationsService; - _toolRegistry = toolRegistry; - _serviceProvider = serviceProvider; - } - - public PdfToolViewModelBase Create(PdfToolId toolId) => CreateToolViewModel(toolId); - - public PdfToolViewModelBase CreateToolViewModel(PdfToolId toolId) - { - var toolDef = _toolRegistry.GetTool(toolId) ?? new PdfToolDefinition - { - Id = toolId, - Name = toolId.ToString() - }; - - return CreateToolViewModel(toolDef); - } - - public PdfToolViewModelBase CreateToolViewModel(PdfToolDefinition toolDef) - { - if (toolDef.ViewModelFactory != null && _serviceProvider != null) - { - try - { - if (toolDef.ViewModelFactory(_serviceProvider) is PdfToolViewModelBase vmFromFactory) - { - return vmFromFactory; - } - } - catch - { - // Fall back to built-in factory logic - } - } - - if (_serviceProvider != null) - { - try - { - Type? vmType = toolDef.Id switch - { - PdfToolId.MergePdf => typeof(MergePdfToolViewModel), - PdfToolId.SplitPdf => typeof(SplitPdfToolViewModel), - PdfToolId.CompressPdf => typeof(CompressPdfToolViewModel), - PdfToolId.PdfToWord => typeof(PdfToWordToolViewModel), - PdfToolId.PdfToPowerPoint => typeof(PdfToPowerPointToolViewModel), - PdfToolId.PdfToExcel => typeof(PdfToExcelToolViewModel), - PdfToolId.WordToPdf => typeof(WordToPdfToolViewModel), - PdfToolId.PowerPointToPdf => typeof(PowerPointToPdfToolViewModel), - PdfToolId.ExcelToPdf => typeof(ExcelToPdfToolViewModel), - PdfToolId.EditPdf => typeof(EditPdfToolViewModel), - PdfToolId.PdfToJpg => typeof(PdfToJpgToolViewModel), - PdfToolId.JpgToPdf => typeof(JpgToPdfToolViewModel), - PdfToolId.SignPdf => typeof(SignPdfToolViewModel), - PdfToolId.Watermark => typeof(WatermarkToolViewModel), - PdfToolId.RotatePdf => typeof(RotatePdfToolViewModel), - PdfToolId.HtmlToPdf => typeof(HtmlToPdfToolViewModel), - PdfToolId.UnlockPdf => typeof(UnlockPdfToolViewModel), - PdfToolId.ProtectPdf => typeof(ProtectPdfToolViewModel), - PdfToolId.OrganizePdf => typeof(OrganizePdfToolViewModel), - PdfToolId.PdfToPdfA => typeof(PdfToPdfAToolViewModel), - PdfToolId.RepairPdf => typeof(RepairPdfToolViewModel), - PdfToolId.PageNumbers => typeof(PageNumbersToolViewModel), - PdfToolId.ScanToPdf => typeof(ScanToPdfToolViewModel), - PdfToolId.OcrPdf => typeof(OcrPdfToolViewModel), - PdfToolId.ComparePdf => typeof(ComparePdfToolViewModel), - PdfToolId.RedactPdf => typeof(RedactPdfToolViewModel), - PdfToolId.CropPdf => typeof(CropPdfToolViewModel), - PdfToolId.PdfForms => typeof(PdfFormsToolViewModel), - PdfToolId.AiSummarizer => typeof(AiSummarizerToolViewModel), - PdfToolId.TranslatePdf => typeof(TranslatePdfToolViewModel), - PdfToolId.PdfToMarkdown => typeof(PdfToMarkdownToolViewModel), - _ => typeof(EditPdfToolViewModel) - }; - - if (ActivatorUtilities.CreateInstance(_serviceProvider, vmType, toolDef) is PdfToolViewModelBase vm) - { - return vm; - } - } - catch - { - // Fall back to direct instantiation - } - } - - return toolDef.Id switch - { - PdfToolId.MergePdf => new MergePdfToolViewModel(_operationsService, toolDef), - PdfToolId.SplitPdf => new SplitPdfToolViewModel(_operationsService, toolDef), - PdfToolId.CompressPdf => new CompressPdfToolViewModel(_operationsService, toolDef), - PdfToolId.PdfToWord => new PdfToWordToolViewModel(_operationsService, toolDef), - PdfToolId.PdfToPowerPoint => new PdfToPowerPointToolViewModel(_operationsService, toolDef), - PdfToolId.PdfToExcel => new PdfToExcelToolViewModel(_operationsService, toolDef), - PdfToolId.WordToPdf => new WordToPdfToolViewModel(_operationsService, toolDef), - PdfToolId.PowerPointToPdf => new PowerPointToPdfToolViewModel(_operationsService, toolDef), - PdfToolId.ExcelToPdf => new ExcelToPdfToolViewModel(_operationsService, toolDef), - PdfToolId.EditPdf => new EditPdfToolViewModel(_operationsService, toolDef), - PdfToolId.PdfToJpg => new PdfToJpgToolViewModel(_operationsService, toolDef), - PdfToolId.JpgToPdf => new JpgToPdfToolViewModel(_operationsService, toolDef), - PdfToolId.SignPdf => new SignPdfToolViewModel(_operationsService, toolDef), - PdfToolId.Watermark => new WatermarkToolViewModel(_operationsService, toolDef), - PdfToolId.RotatePdf => new RotatePdfToolViewModel(_operationsService, toolDef), - PdfToolId.HtmlToPdf => new HtmlToPdfToolViewModel(_operationsService, toolDef), - PdfToolId.UnlockPdf => new UnlockPdfToolViewModel(_operationsService, toolDef), - PdfToolId.ProtectPdf => new ProtectPdfToolViewModel(_operationsService, toolDef), - PdfToolId.OrganizePdf => new OrganizePdfToolViewModel(_operationsService, toolDef), - PdfToolId.PdfToPdfA => new PdfToPdfAToolViewModel(_operationsService, toolDef), - PdfToolId.RepairPdf => new RepairPdfToolViewModel(_operationsService, toolDef), - PdfToolId.PageNumbers => new PageNumbersToolViewModel(_operationsService, toolDef), - PdfToolId.ScanToPdf => new ScanToPdfToolViewModel(_operationsService, toolDef), - PdfToolId.OcrPdf => new OcrPdfToolViewModel(_operationsService, toolDef), - PdfToolId.ComparePdf => new ComparePdfToolViewModel(_operationsService, toolDef), - PdfToolId.RedactPdf => new RedactPdfToolViewModel(_operationsService, toolDef), - PdfToolId.CropPdf => new CropPdfToolViewModel(_operationsService, toolDef), - PdfToolId.PdfForms => new PdfFormsToolViewModel(_operationsService, toolDef), - PdfToolId.AiSummarizer => new AiSummarizerToolViewModel(_operationsService, toolDef), - PdfToolId.TranslatePdf => new TranslatePdfToolViewModel(_operationsService, toolDef), - PdfToolId.PdfToMarkdown => new PdfToMarkdownToolViewModel(_operationsService, toolDef), - _ => new EditPdfToolViewModel(_operationsService, toolDef) - }; - } -} diff --git a/src/PdfEditorApp/Services/Tools/Core/PdfWorkflowEngine.cs b/src/PdfEditorApp/Services/Tools/Core/PdfWorkflowEngine.cs deleted file mode 100644 index c570eae..0000000 --- a/src/PdfEditorApp/Services/Tools/Core/PdfWorkflowEngine.cs +++ /dev/null @@ -1,281 +0,0 @@ -using PdfEditorApp.Services.Tools.Core; -using PdfEditorApp.Services.Tools.Organize; -using PdfEditorApp.Services.Tools.Security; -using PdfEditorApp.Services.Tools.Conversion; -using PdfEditorApp.Services.Tools.Intelligence; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text.Json; -using System.Threading; -using System.Threading.Tasks; -using PdfEditorApp.Models; - -namespace PdfEditorApp.Services.Tools.Core; - -public interface IPdfWorkflowEngine -{ - Task ExecuteWorkflowAsync(WorkflowDefinition workflow, IEnumerable inputFiles, IProgress? progress = null, CancellationToken ct = default); - Task SaveWorkflowToFileAsync(WorkflowDefinition workflow, string filePath); - Task LoadWorkflowFromFileAsync(string filePath); - string SerializeWorkflow(WorkflowDefinition workflow); - WorkflowDefinition? DeserializeWorkflow(string json); - IReadOnlyList GetPresetWorkflows(); -} - -public class PdfWorkflowEngine : IPdfWorkflowEngine -{ - private readonly IPdfPageService _pageService; - private readonly IPdfOptimizationService _optService; - private readonly IPdfSecurityService _secService; - private readonly IPdfConversionService _convService; - private readonly IPdfOcrService _ocrService; - - public PdfWorkflowEngine() - : this(new PdfPageService(), new PdfOptimizationService(), new PdfSecurityService(), new PdfConversionService(), new PdfOcrService()) - { - } - - public PdfWorkflowEngine( - IPdfPageService pageService, - IPdfOptimizationService optService, - IPdfSecurityService secService, - IPdfConversionService convService, - IPdfOcrService ocrService) - { - _pageService = pageService; - _optService = optService; - _secService = secService; - _convService = convService; - _ocrService = ocrService; - } - - public async Task ExecuteWorkflowAsync( - WorkflowDefinition workflow, - IEnumerable inputFiles, - IProgress? progress = null, - CancellationToken ct = default) - { - return await Task.Run(async () => - { - var files = inputFiles.Where(File.Exists).ToList(); - if (files.Count == 0) - return new ToolExecutionResult { Success = false, ErrorMessage = "No valid input files provided for workflow execution." }; - - var enabledSteps = workflow.Steps.Where(s => s.IsEnabled).ToList(); - if (enabledSteps.Count == 0) - return new ToolExecutionResult { Success = false, ErrorMessage = "Workflow has no enabled steps." }; - - string outDir = string.IsNullOrWhiteSpace(workflow.OutputDirectory) - ? Path.Combine(Path.GetDirectoryName(files[0]) ?? "", "Workflow_Output") - : workflow.OutputDirectory; - - if (!Directory.Exists(outDir)) Directory.CreateDirectory(outDir); - - var finalOutputs = new List(); - string tempDir = Path.Combine(Path.GetTempPath(), "FryPdf_Workflow_" + Guid.NewGuid().ToString("N")); - Directory.CreateDirectory(tempDir); - - try - { - int totalSteps = enabledSteps.Count * files.Count; - int completedSteps = 0; - - foreach (var file in files) - { - ct.ThrowIfCancellationRequested(); - string currentFile = file; - - for (int s = 0; s < enabledSteps.Count; s++) - { - ct.ThrowIfCancellationRequested(); - var step = enabledSteps[s]; - - progress?.Report(new WorkflowProgressInfo - { - CurrentStepIndex = s + 1, - TotalSteps = enabledSteps.Count, - CurrentStepName = step.StepName, - CurrentFileName = Path.GetFileName(file), - OverallProgressPercentage = (completedSteps / (double)totalSteps) * 100.0, - StatusMessage = $"Running '{step.StepName}' on {Path.GetFileName(file)}..." - }); - - string stepOut = Path.Combine(tempDir, $"step_{s}_{Guid.NewGuid():N}_{Path.GetFileName(currentFile)}"); - - // Execute Step - var stepResult = await ExecuteSingleStepAsync(step, currentFile, stepOut, ct); - if (!stepResult.Success) - { - return new ToolExecutionResult - { - Success = false, - ErrorMessage = $"Workflow failed at step '{step.StepName}': {stepResult.ErrorMessage}" - }; - } - - currentFile = stepResult.OutputFilePath ?? stepOut; - completedSteps++; - } - - // Move final output to destination folder - string finalFileName = workflow.OutputFileNamePattern - .Replace("{filename}", Path.GetFileNameWithoutExtension(file)) - .Replace("{date}", DateTime.UtcNow.ToString("yyyyMMdd")); - - if (!finalFileName.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase)) - finalFileName += ".pdf"; - - string destPath = Path.Combine(outDir, finalFileName); - if (!string.Equals(Path.GetFullPath(currentFile), Path.GetFullPath(destPath), StringComparison.OrdinalIgnoreCase)) - { - if (File.Exists(destPath)) File.Delete(destPath); - File.Copy(currentFile, destPath, true); - } - finalOutputs.Add(destPath); - } - - progress?.Report(new WorkflowProgressInfo - { - CurrentStepIndex = enabledSteps.Count, - TotalSteps = enabledSteps.Count, - CurrentStepName = "Complete", - OverallProgressPercentage = 100.0, - StatusMessage = $"Workflow '{workflow.Name}' executed successfully on {files.Count} files." - }); - - return new ToolExecutionResult - { - Success = true, - OutputFilePath = finalOutputs.FirstOrDefault(), - OutputFiles = finalOutputs, - Message = $"Executed workflow '{workflow.Name}' on {files.Count} files across {enabledSteps.Count} automated steps." - }; - } - finally - { - try - { - if (Directory.Exists(tempDir)) Directory.Delete(tempDir, true); - } - catch { } - } - }, ct); - } - - private async Task ExecuteSingleStepAsync(WorkflowStepDefinition step, string inputFile, string outputFile, CancellationToken ct) - { - switch (step.ToolId) - { - case PdfToolId.CompressPdf: - return await _optService.CompressPdfAsync(new CompressToolOptions - { - InputFilePath = inputFile, - OutputFilePath = outputFile, - Level = PdfCompressionLevel.Balanced - }, null, ct); - - case PdfToolId.OcrPdf: - return await _ocrService.OcrPdfAsync(new OcrToolOptions - { - InputFilePath = inputFile, - OutputFilePath = outputFile - }, null, ct); - - case PdfToolId.PageNumbers: - return await _pageService.AddPageNumbersAsync(new PageNumberToolOptions - { - InputFilePath = inputFile, - OutputFilePath = outputFile - }, null, ct); - - case PdfToolId.ProtectPdf: - return await _secService.ProtectPdfAsync(new SecurityToolOptions - { - InputFilePath = inputFile, - OutputFilePath = outputFile, - AllowPrinting = true - }, null, ct); - - case PdfToolId.PdfToPdfA: - return await _optService.ConvertToPdfAAsync(new PdfAToolOptions - { - InputFilePath = inputFile, - OutputFilePath = outputFile - }, null, ct); - - case PdfToolId.RepairPdf: - return await _optService.RepairPdfAsync(new RepairToolOptions - { - InputFilePath = inputFile, - OutputFilePath = outputFile - }, null, ct); - - default: - // Pass-through copy if no specialized execution needed - if (!string.Equals(Path.GetFullPath(inputFile), Path.GetFullPath(outputFile), StringComparison.OrdinalIgnoreCase)) - { - File.Copy(inputFile, outputFile, true); - } - return new ToolExecutionResult { Success = true, OutputFilePath = outputFile }; - } - } - - public string SerializeWorkflow(WorkflowDefinition workflow) - { - workflow.ModifiedAt = DateTime.UtcNow; - return JsonSerializer.Serialize(workflow, new JsonSerializerOptions { WriteIndented = true }); - } - - public WorkflowDefinition? DeserializeWorkflow(string json) - { - if (string.IsNullOrWhiteSpace(json)) return null; - return JsonSerializer.Deserialize(json); - } - - public async Task SaveWorkflowToFileAsync(WorkflowDefinition workflow, string filePath) - { - string json = SerializeWorkflow(workflow); - await File.WriteAllTextAsync(filePath, json); - } - - public async Task LoadWorkflowFromFileAsync(string filePath) - { - if (!File.Exists(filePath)) return null; - string json = await File.ReadAllTextAsync(filePath); - return DeserializeWorkflow(json); - } - - public IReadOnlyList GetPresetWorkflows() - { - return new List - { - new WorkflowDefinition - { - Id = "preset_publish", - Name = "Publishing & Archival Pipeline", - Description = "Run OCR, optimize compression, stamp page numbers, and convert to PDF/A for long-term storage.", - Steps = new List - { - new WorkflowStepDefinition { Id = "s1", ToolId = PdfToolId.OcrPdf, StepName = "OCR Text Recognition", StepDescription = "Make scanned text searchable" }, - new WorkflowStepDefinition { Id = "s2", ToolId = PdfToolId.CompressPdf, StepName = "Balanced Compression", StepDescription = "Optimize document file size" }, - new WorkflowStepDefinition { Id = "s3", ToolId = PdfToolId.PageNumbers, StepName = "Add Header & Page Numbers", StepDescription = "Stamp 'Page {n} of {total}'" }, - new WorkflowStepDefinition { Id = "s4", ToolId = PdfToolId.PdfToPdfA, StepName = "Convert to PDF/A", StepDescription = "Enforce ISO 19005 archival compliance" } - } - }, - new WorkflowDefinition - { - Id = "preset_secure", - Name = "Enterprise Security & Protection", - Description = "Sanitize document, apply corporate watermarking, and protect with permission encryption.", - Steps = new List - { - new WorkflowStepDefinition { Id = "s1", ToolId = PdfToolId.RepairPdf, StepName = "Audit & Repair", StepDescription = "Fix damaged object structures" }, - new WorkflowStepDefinition { Id = "s2", ToolId = PdfToolId.CompressPdf, StepName = "Compress Resources", StepDescription = "Strip unnecessary metadata" }, - new WorkflowStepDefinition { Id = "s3", ToolId = PdfToolId.ProtectPdf, StepName = "Encrypt & Protect", StepDescription = "Apply password encryption and printing restrictions" } - } - } - }; - } -} diff --git a/src/PdfEditorApp/Services/Tools/Intelligence/AiDocumentService.cs b/src/PdfEditorApp/Services/Tools/Intelligence/AiDocumentService.cs deleted file mode 100644 index cc2bd8d..0000000 --- a/src/PdfEditorApp/Services/Tools/Intelligence/AiDocumentService.cs +++ /dev/null @@ -1,210 +0,0 @@ -using PdfEditorApp.Services.Tools.Core; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using System.Text.RegularExpressions; -using System.Threading; -using System.Threading.Tasks; -using PdfEditorApp.Models; -using UglyToad.PdfPig; - -namespace PdfEditorApp.Services.Tools.Intelligence; - -public interface IAiDocumentService -{ - Task SummarizePdfAsync(AiSummaryOptions options, IProgress? progress = null, CancellationToken ct = default); -} - -public class AiDocumentService : IAiDocumentService -{ - public async Task SummarizePdfAsync(AiSummaryOptions options, IProgress? progress = null, CancellationToken ct = default) - { - return await Task.Run(() => - { - if (!File.Exists(options.InputFilePath)) - return new ToolExecutionResult { Success = false, ErrorMessage = "Input PDF file does not exist." }; - - long origBytes = new FileInfo(options.InputFilePath).Length; - progress?.Report(15.0); - - ct.ThrowIfCancellationRequested(); - var allText = new StringBuilder(); - - using (var pdf = UglyToad.PdfPig.PdfDocument.Open(options.InputFilePath)) - { - int totalPages = pdf.NumberOfPages; - for (int p = 1; p <= totalPages; p++) - { - ct.ThrowIfCancellationRequested(); - var page = pdf.GetPage(p); - allText.AppendLine(page.Text); - progress?.Report(15.0 + (p / (double)totalPages * 40.0)); - } - } - - string fullDocText = allText.ToString(); - if (string.IsNullOrWhiteSpace(fullDocText)) - { - return new ToolExecutionResult - { - Success = false, - ErrorMessage = "Unable to extract readable text for summarization. The document may be scanned or image-based." - }; - } - - progress?.Report(65.0); - ct.ThrowIfCancellationRequested(); - - // Run Extractive NLP & Statistical Summarizer - var summary = GenerateExtractiveSummary(fullDocText, options.MaxBulletPoints, options.IncludeExecutiveSummary, options.IncludeActionItems); - progress?.Report(95.0); - - string outDir = Path.GetDirectoryName(options.InputFilePath) ?? Path.GetTempPath(); - string outPath = Path.Combine(outDir, $"{Path.GetFileNameWithoutExtension(options.InputFilePath)}_Summary.md"); - File.WriteAllText(outPath, summary, Encoding.UTF8); - - progress?.Report(100.0); - - long outBytes = File.Exists(outPath) ? new FileInfo(outPath).Length : 0; - return new ToolExecutionResult - { - Success = true, - OutputFilePath = outPath, - OutputFiles = new List { outPath }, - OriginalSizeBytes = origBytes, - OutputSizeBytes = outBytes, - ExtraData = new Dictionary { ["SummaryText"] = summary }, - Message = $"Generated executive summary and key points to {Path.GetFileName(outPath)}" - }; - }, ct); - } - - private static string GenerateExtractiveSummary(string text, int maxBullets, bool includeExec, bool includeActions) - { - var sentences = SplitIntoSentences(text); - if (sentences.Count == 0) return "No content available to summarize."; - - // Word frequency map (excluding common stop words) - var stopWords = new HashSet(StringComparer.OrdinalIgnoreCase) - { - "the", "a", "an", "and", "or", "but", "in", "on", "at", "to", "for", "of", "with", - "by", "from", "as", "is", "was", "are", "were", "be", "been", "have", "has", "had", - "this", "that", "it", "they", "we", "you", "which", "will", "would", "can", "could", - "should", "not", "also", "more", "their", "all", "its", "into" - }; - - var wordFreq = new Dictionary(StringComparer.OrdinalIgnoreCase); - foreach (var s in sentences) - { - var words = Regex.Matches(s, @"\b[A-Za-z]{3,}\b"); - foreach (Match m in words) - { - string w = m.Value; - if (!stopWords.Contains(w)) - { - wordFreq[w] = wordFreq.GetValueOrDefault(w, 0) + 1; - } - } - } - - // Score sentences based on word frequencies and position - var scored = new List<(string Sentence, double Score, int Index)>(); - for (int i = 0; i < sentences.Count; i++) - { - string s = sentences[i]; - double score = 0; - var words = Regex.Matches(s, @"\b[A-Za-z]{3,}\b"); - foreach (Match m in words) - { - if (wordFreq.TryGetValue(m.Value, out int count)) - { - score += count; - } - } - - // Normalization by sentence length (penalize extremely short or long sentences) - if (words.Count > 0) - { - score /= Math.Sqrt(words.Count); - } - - // Boost early sentences (introductions/abstracts) - if (i < 5) score *= 1.3; - - scored.Add((s, score, i)); - } - - var topSentences = scored.OrderByDescending(x => x.Score) - .Take(maxBullets) - .OrderBy(x => x.Index) - .Select(x => x.Sentence) - .ToList(); - - var sb = new StringBuilder(); - sb.AppendLine("# AI Executive Document Summary"); - sb.AppendLine($"*Generated by FryPDF Intelligence Engine · {DateTime.UtcNow:yyyy-MM-dd}*"); - sb.AppendLine(); - - if (includeExec && topSentences.Count > 0) - { - sb.AppendLine("## Executive Overview"); - sb.AppendLine(string.Join(" ", topSentences.Take(2))); - sb.AppendLine(); - } - - sb.AppendLine("## Key Takeaways & Core Findings"); - foreach (var s in topSentences) - { - sb.AppendLine($"- **Key Point**: {s.Trim()}"); - } - sb.AppendLine(); - - if (includeActions) - { - var actionKeywords = new[] { "must", "should", "recommend", "require", "next steps", "action", "deadline", "implement", "review", "ensure" }; - var actionSentences = sentences.Where(s => actionKeywords.Any(k => s.Contains(k, StringComparison.OrdinalIgnoreCase))) - .Take(4) - .ToList(); - - if (actionSentences.Count > 0) - { - sb.AppendLine("## Strategic Action Items"); - foreach (var a in actionSentences) - { - sb.AppendLine($"1. {a.Trim()}"); - } - sb.AppendLine(); - } - } - - return sb.ToString(); - } - - private static List SplitIntoSentences(string text) - { - var list = new List(); - var matches = Regex.Matches(text, @"(?<=[\.\!\?])\s+(?=[A-Z])"); - int lastIndex = 0; - - foreach (Match m in matches) - { - int length = m.Index - lastIndex; - string s = text.Substring(lastIndex, length).Trim(); - if (s.Length > 20 && s.Length < 350) - { - list.Add(s); - } - lastIndex = m.Index + m.Length; - } - - if (lastIndex < text.Length) - { - string s = text.Substring(lastIndex).Trim(); - if (s.Length > 20 && s.Length < 350) list.Add(s); - } - - return list; - } -} diff --git a/src/PdfEditorApp/Services/Tools/Intelligence/DocumentTranslationService.cs b/src/PdfEditorApp/Services/Tools/Intelligence/DocumentTranslationService.cs deleted file mode 100644 index 76e922d..0000000 --- a/src/PdfEditorApp/Services/Tools/Intelligence/DocumentTranslationService.cs +++ /dev/null @@ -1,225 +0,0 @@ -using PdfEditorApp.Services.Tools.Core; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text.RegularExpressions; -using System.Threading; -using System.Threading.Tasks; -using PdfEditorApp.Models; -using QuestPDF.Fluent; -using QuestPDF.Helpers; -using QuestPDF.Infrastructure; -using UglyToad.PdfPig; - -namespace PdfEditorApp.Services.Tools.Intelligence; - -public interface IDocumentTranslationService -{ - Task TranslatePdfAsync(TranslationOptions options, IProgress? progress = null, CancellationToken ct = default); -} - -public class DocumentTranslationService : IDocumentTranslationService -{ - private static readonly HashSet SupportedGlossaryLanguages = new(StringComparer.OrdinalIgnoreCase) - { - "spanish", "es", "french", "fr", "german", "de" - }; - - public async Task TranslatePdfAsync(TranslationOptions options, IProgress? progress = null, CancellationToken ct = default) - { - return await Task.Run(() => - { - if (!File.Exists(options.InputFilePath)) - return new ToolExecutionResult { Success = false, ErrorMessage = "Input PDF file does not exist." }; - - // This service only swaps a small fixed glossary of business terms — it is not - // a real machine-translation backend. Fail clearly for anything outside that - // glossary's 3 languages instead of silently returning the document unchanged. - if (!SupportedGlossaryLanguages.Contains(options.TargetLanguage.Trim())) - { - return new ToolExecutionResult - { - Success = false, - ErrorMessage = $"'{options.TargetLanguage}' is not supported yet. This tool currently only swaps a small glossary of common business terms for Spanish, French, or German — it does not perform full machine translation." - }; - } - - long origBytes = new FileInfo(options.InputFilePath).Length; - string outPath = options.OutputFilePath; - if (string.IsNullOrWhiteSpace(outPath)) - { - string dir = Path.GetDirectoryName(options.InputFilePath) ?? ""; - string name = Path.GetFileNameWithoutExtension(options.InputFilePath); - string langCode = options.TargetLanguage.Substring(0, Math.Min(3, options.TargetLanguage.Length)).ToUpperInvariant(); - outPath = Path.Combine(dir, $"{name}_{langCode}.pdf"); - } - - ct.ThrowIfCancellationRequested(); - progress?.Report(15.0); - - var pagesData = new List>(); - - using (var pdf = UglyToad.PdfPig.PdfDocument.Open(options.InputFilePath)) - { - int totalPages = pdf.NumberOfPages; - for (int p = 1; p <= totalPages; p++) - { - ct.ThrowIfCancellationRequested(); - var page = pdf.GetPage(p); - var lines = page.Text.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries) - .Select(l => l.Trim()) - .Where(l => !string.IsNullOrWhiteSpace(l)) - .ToList(); - - var translatedLines = new List(); - foreach (var line in lines) - { - string translated = TranslateText(line, options.TargetLanguage); - translatedLines.Add(translated); - } - - pagesData.Add(translatedLines); - progress?.Report(15.0 + (p / (double)totalPages * 50.0)); - } - } - - ct.ThrowIfCancellationRequested(); - progress?.Report(70.0); - - // Reconstruct PDF layout in target language via QuestPDF with FryPDF metadata - var doc = FryPdfDocument.Create(container => - { - int pNum = 1; - foreach (var pageLines in pagesData) - { - container.Page(page => - { - page.Size(PageSizes.A4); - page.Margin(36); - page.PageColor(Colors.White); - page.DefaultTextStyle(x => x.FontSize(11).FontFamily("Helvetica").FontColor(Colors.Grey.Darken3)); - - page.Header().Row(row => - { - row.RelativeItem().Text($"{Path.GetFileNameWithoutExtension(options.InputFilePath)} [{options.TargetLanguage}]").SemiBold().FontColor(Colors.Indigo.Darken2); - }); - - page.Content().PaddingVertical(10).Column(col => - { - col.Spacing(8); - foreach (var l in pageLines) - { - col.Item().Text(l); - } - }); - - page.Footer().AlignCenter().Text(x => - { - x.Span($"Page {pNum} of {pagesData.Count}"); - }); - }); - pNum++; - } - }); - - doc.GeneratePdf(outPath); - progress?.Report(100.0); - - long outBytes = File.Exists(outPath) ? new FileInfo(outPath).Length : 0; - return new ToolExecutionResult - { - Success = true, - OutputFilePath = outPath, - OutputFiles = new List { outPath }, - OriginalSizeBytes = origBytes, - OutputSizeBytes = outBytes, - Message = $"Applied glossary-based term translation ({pagesData.Count} pages) for {options.TargetLanguage}: {Path.GetFileName(outPath)}. " + - "Note: only a small set of common business terms are translated (not full sentences/paragraphs), and the document is reflowed into a new plain layout — original fonts, layout, and formatting are not preserved." - }; - }, ct); - } - - private static string TranslateText(string input, string targetLang) - { - if (string.IsNullOrWhiteSpace(input)) return input; - - // Offline glossary translations for common business / document headings and terms - var spanishDict = new Dictionary(StringComparer.OrdinalIgnoreCase) - { - ["Annual Report"] = "Informe Anual", - ["Financial Report"] = "Informe Financiero", - ["Executive Summary"] = "Resumen Ejecutivo", - ["Introduction"] = "Introducción", - ["Conclusion"] = "Conclusión", - ["Table of Contents"] = "Índice de Contenidos", - ["Invoice"] = "Factura", - ["Total"] = "Total", - ["Description"] = "Descripción", - ["Amount"] = "Importe", - ["Date"] = "Fecha", - ["Page"] = "Página", - ["Overview"] = "Visión General", - ["Results"] = "Resultados", - ["Recommendations"] = "Recomendaciones" - }; - - var frenchDict = new Dictionary(StringComparer.OrdinalIgnoreCase) - { - ["Annual Report"] = "Rapport Annuel", - ["Financial Report"] = "Rapport Financier", - ["Executive Summary"] = "Résumé Exécutif", - ["Introduction"] = "Introduction", - ["Conclusion"] = "Conclusion", - ["Table of Contents"] = "Table des Matières", - ["Invoice"] = "Facture", - ["Total"] = "Total", - ["Description"] = "Description", - ["Amount"] = "Montant", - ["Date"] = "Date", - ["Page"] = "Page", - ["Overview"] = "Aperçu", - ["Results"] = "Résultats", - ["Recommendations"] = "Recommandations" - }; - - var germanDict = new Dictionary(StringComparer.OrdinalIgnoreCase) - { - ["Annual Report"] = "Jahresbericht", - ["Financial Report"] = "Finanzbericht", - ["Executive Summary"] = "Zusammenfassung", - ["Introduction"] = "Einleitung", - ["Conclusion"] = "Fazit", - ["Table of Contents"] = "Inhaltsverzeichnis", - ["Invoice"] = "Rechnung", - ["Total"] = "Gesamt", - ["Description"] = "Beschreibung", - ["Amount"] = "Betrag", - ["Date"] = "Datum", - ["Page"] = "Seite", - ["Overview"] = "Überblick", - ["Results"] = "Ergebnisse", - ["Recommendations"] = "Empfehlungen" - }; - - var dict = targetLang.ToLowerInvariant() switch - { - "spanish" or "es" => spanishDict, - "french" or "fr" => frenchDict, - "german" or "de" => germanDict, - _ => null - }; - - if (dict != null) - { - string output = input; - foreach (var kvp in dict) - { - output = Regex.Replace(output, $@"\b{Regex.Escape(kvp.Key)}\b", kvp.Value, RegexOptions.IgnoreCase); - } - return output; - } - - return input; - } -} diff --git a/src/PdfEditorApp/Services/Tools/Intelligence/PdfFormService.cs b/src/PdfEditorApp/Services/Tools/Intelligence/PdfFormService.cs deleted file mode 100644 index 3b648f9..0000000 --- a/src/PdfEditorApp/Services/Tools/Intelligence/PdfFormService.cs +++ /dev/null @@ -1,127 +0,0 @@ -using PdfEditorApp.Services.Tools.Core; -using System; -using System.Collections.Generic; -using System.IO; -using System.Text.Json; -using System.Threading; -using System.Threading.Tasks; -using PdfEditorApp.Models; -using PdfSharpCore.Pdf; -using PdfSharpCore.Pdf.AcroForms; -using PdfSharpCore.Pdf.IO; - -namespace PdfEditorApp.Services.Tools.Intelligence; - -public interface IPdfFormService -{ - Task ProcessPdfFormsAsync(FormToolOptions options, IProgress? progress = null, CancellationToken ct = default); - Task> GetFormFieldsAsync(string pdfPath, CancellationToken ct = default); - Task> ExtractFormFieldsAsync(string pdfPath, CancellationToken ct = default); -} - -public class PdfFormService : IPdfFormService -{ - public Task> ExtractFormFieldsAsync(string pdfPath, CancellationToken ct = default) => GetFormFieldsAsync(pdfPath, ct); - - public async Task> GetFormFieldsAsync(string pdfPath, CancellationToken ct = default) - { - return await Task.Run(() => - { - var dict = new Dictionary(); - if (!File.Exists(pdfPath)) return dict; - - try - { - using var doc = PdfReader.Open(pdfPath, PdfDocumentOpenMode.ReadOnly); - var form = doc.AcroForm; - if (form != null) - { - foreach (var name in form.Fields.Names) - { - var field = form.Fields[name]; - dict[name] = field?.Value?.ToString() ?? ""; - } - } - } - catch { } - - return dict; - }, ct); - } - - public async Task ProcessPdfFormsAsync(FormToolOptions options, IProgress? progress = null, CancellationToken ct = default) - { - return await Task.Run(() => - { - if (!File.Exists(options.InputFilePath)) - return new ToolExecutionResult { Success = false, ErrorMessage = "Input PDF file does not exist." }; - - long origBytes = new FileInfo(options.InputFilePath).Length; - string outPath = options.OutputFilePath; - if (string.IsNullOrWhiteSpace(outPath)) - { - string dir = Path.GetDirectoryName(options.InputFilePath) ?? ""; - string name = Path.GetFileNameWithoutExtension(options.InputFilePath); - outPath = Path.Combine(dir, $"{name}_FormFilled.pdf"); - } - - ct.ThrowIfCancellationRequested(); - progress?.Report(20.0); - - using var doc = PdfReader.Open(options.InputFilePath, PdfDocumentOpenMode.Modify); - var form = doc.AcroForm; - - int updatedFields = 0; - if (form != null && options.FieldValues != null) - { - foreach (var kvp in options.FieldValues) - { - if (form.Fields.Names.Contains(kvp.Key)) - { - var field = form.Fields[kvp.Key]; - if (field is PdfTextField textField) - { - textField.Text = kvp.Value; - updatedFields++; - } - else if (field is PdfCheckBoxField checkBoxField) - { - checkBoxField.Checked = bool.TryParse(kvp.Value, out bool b) && b; - updatedFields++; - } - } - } - - if (options.FlattenFields) - { - // Flatten: remove the AcroForm entry so fields become static content - if (doc.AcroForm != null) - doc.Internals.Catalog.Elements.Remove("/AcroForm"); - } - } - - progress?.Report(80.0); - PdfFileHelper.SaveDocumentWithFryPdfMetadata(doc, outPath); - - if (options.ExportFieldValuesJson) - { - string jsonPath = Path.ChangeExtension(outPath, ".json"); - string json = JsonSerializer.Serialize(options.FieldValues, new JsonSerializerOptions { WriteIndented = true }); - File.WriteAllText(jsonPath, json); - } - - progress?.Report(100.0); - - long outBytes = File.Exists(outPath) ? new FileInfo(outPath).Length : 0; - return new ToolExecutionResult - { - Success = true, - OutputFilePath = outPath, - OutputFiles = new List { outPath }, - OriginalSizeBytes = origBytes, - OutputSizeBytes = outBytes, - Message = $"Processed AcroForm with {updatedFields} filled fields." - }; - }, ct); - } -} diff --git a/src/PdfEditorApp/Services/Tools/Intelligence/PdfOcrService.cs b/src/PdfEditorApp/Services/Tools/Intelligence/PdfOcrService.cs deleted file mode 100644 index 8c4827c..0000000 --- a/src/PdfEditorApp/Services/Tools/Intelligence/PdfOcrService.cs +++ /dev/null @@ -1,347 +0,0 @@ -using PdfEditorApp.Services.Tools.Core; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using PdfEditorApp.Models; -using PdfSharpCore.Drawing; -using PdfSharpCore.Pdf; -using PdfSharpCore.Pdf.IO; -using UglyToad.PdfPig; - -using System.Text; -using PdfEditorApp.Services.Ocr; - -namespace PdfEditorApp.Services.Tools.Intelligence; - -public interface IPdfOcrService -{ - Task OcrPdfAsync(OcrToolOptions options, IProgress? progress = null, CancellationToken ct = default); - Task ScanToPdfAsync(ScanToolOptions options, IProgress? progress = null, CancellationToken ct = default); -} - -public class PdfOcrService : IPdfOcrService -{ - private readonly ICompositeOcrProvider _ocrProvider; - - public PdfOcrService(ICompositeOcrProvider? ocrProvider = null) - { - _ocrProvider = ocrProvider ?? CompositeOcrProvider.Default; - } - - public async Task OcrPdfAsync(OcrToolOptions options, IProgress? progress = null, CancellationToken ct = default) - { - return await Task.Run(() => - { - if (!File.Exists(options.InputFilePath)) - return new ToolExecutionResult { Success = false, ErrorMessage = "Input PDF file does not exist." }; - - long origBytes = new FileInfo(options.InputFilePath).Length; - string outPath = options.OutputFilePath; - if (string.IsNullOrWhiteSpace(outPath)) - { - string dir = Path.GetDirectoryName(options.InputFilePath) ?? ""; - string name = Path.GetFileNameWithoutExtension(options.InputFilePath); - outPath = Path.Combine(dir, $"{name}_Searchable.pdf"); - } - - ct.ThrowIfCancellationRequested(); - progress?.Report(10.0); - - using var pdfPigDoc = UglyToad.PdfPig.PdfDocument.Open(options.InputFilePath); - try { UglyToad.PdfPig.Rendering.Skia.PdfPigExtensions.AddSkiaPageFactory(pdfPigDoc); } catch { } - - int totalPages = pdfPigDoc.NumberOfPages; - int recognizedWords = 0; - int pagesWithoutText = 0; - var scannedPageIndices = new List(); - - for (int p = 1; p <= totalPages; p++) - { - ct.ThrowIfCancellationRequested(); - var pigPage = pdfPigDoc.GetPage(p); - var words = pigPage.GetWords().ToList(); - recognizedWords += words.Count; - if (words.Count == 0) - { - pagesWithoutText++; - scannedPageIndices.Add(p); - } - - progress?.Report(10.0 + (p / (double)totalPages * 15.0)); - } - - if (pagesWithoutText == 0) - { - // Document is already fully searchable - if (!string.Equals(Path.GetFullPath(options.InputFilePath), Path.GetFullPath(outPath), StringComparison.OrdinalIgnoreCase)) - { - File.Copy(options.InputFilePath, outPath, overwrite: true); - } - long outBytes = File.Exists(outPath) ? new FileInfo(outPath).Length : 0; - return new ToolExecutionResult - { - Success = true, - OutputFilePath = outPath, - OutputFiles = new List { outPath }, - OriginalSizeBytes = origBytes, - OutputSizeBytes = outBytes, - Message = $"All {totalPages} page(s) already contain selectable text ({recognizedWords} words) — this document was already searchable." - }; - } - - // Perform true OCR on scanned pages - string txtOutPath = Path.ChangeExtension(outPath, ".txt"); - var allText = new StringBuilder(); - int ocrWordsAdded = 0; - string lastEngineUsed = _ocrProvider.EngineName; - - for (int p = 1; p <= totalPages; p++) - { - ct.ThrowIfCancellationRequested(); - var pigPage = pdfPigDoc.GetPage(p); - var words = pigPage.GetWords().ToList(); - - if (words.Count > 0) - { - allText.AppendLine($"--- Page {p} ---"); - allText.AppendLine(pigPage.Text); - } - else - { - using var pngStream = UglyToad.PdfPig.Rendering.Skia.PdfPigExtensions.GetPageAsPng(pdfPigDoc, p, 1.5f, 100); - if (pngStream != null && pngStream.Length > 0) - { - var ocrRes = _ocrProvider.RecognizeTextAsync(pngStream.ToArray(), options.Language, ct).GetAwaiter().GetResult(); - if (ocrRes.Success) - { - allText.AppendLine($"--- Page {p} (OCR) ---"); - allText.AppendLine(ocrRes.FullText); - recognizedWords += ocrRes.Words.Count; - ocrWordsAdded += ocrRes.Words.Count; - lastEngineUsed = ocrRes.EngineUsed; - } - } - } - - progress?.Report(25.0 + (p / (double)totalPages * 35.0)); - } - - if (options.GenerateTextFile || options.ExtractTextOnly) - { - File.WriteAllText(txtOutPath, allText.ToString(), Encoding.UTF8); - } - - if (options.ExtractTextOnly) - { - progress?.Report(100.0); - return new ToolExecutionResult - { - Success = true, - OutputFilePath = txtOutPath, - OutputFiles = new List { txtOutPath }, - OriginalSizeBytes = origBytes, - OutputSizeBytes = new FileInfo(txtOutPath).Length, - Message = $"Extracted text from {totalPages} page(s) ({recognizedWords} words) into {Path.GetFileName(txtOutPath)}." - }; - } - - // Create searchable PDF with invisible text layer - using var outPdfDoc = PdfSharpCore.Pdf.IO.PdfReader.Open(options.InputFilePath, PdfDocumentOpenMode.Modify); - - for (int i = 0; i < scannedPageIndices.Count; i++) - { - ct.ThrowIfCancellationRequested(); - int p = scannedPageIndices[i]; - - using var pngStream = UglyToad.PdfPig.Rendering.Skia.PdfPigExtensions.GetPageAsPng(pdfPigDoc, p, 1.5f, 100); - if (pngStream == null || pngStream.Length == 0) continue; - - var ocrRes = _ocrProvider.RecognizeTextAsync(pngStream.ToArray(), options.Language, ct).GetAwaiter().GetResult(); - if (!ocrRes.Success || ocrRes.Words.Count == 0) continue; - - var sharpPage = outPdfDoc.Pages[p - 1]; - double pw = sharpPage.Width.Point; - double ph = sharpPage.Height.Point; - - using var gfx = XGraphics.FromPdfPage(sharpPage, XGraphicsPdfPageOptions.Append); - var transparentBrush = new XSolidBrush(XColor.FromArgb(0, 0, 0, 0)); - - foreach (var word in ocrRes.Words) - { - double wx = word.NormalizedBounds.X * pw; - double wy = word.NormalizedBounds.Y * ph; - double ww = Math.Max(1, word.NormalizedBounds.Width * pw); - double wh = Math.Max(1, word.NormalizedBounds.Height * ph); - - double fontSize = Math.Max(4, Math.Min(72, wh * 0.85)); - var font = new XFont("Helvetica", fontSize, XFontStyle.Regular); - gfx.DrawString(word.Text, font, transparentBrush, new XPoint(wx, wy + wh * 0.85)); - } - - progress?.Report(60.0 + ((i + 1) / (double)scannedPageIndices.Count * 38.0)); - } - - outPdfDoc.Save(outPath); - progress?.Report(100.0); - - long finalBytes = File.Exists(outPath) ? new FileInfo(outPath).Length : 0; - if (ocrWordsAdded == 0 && pagesWithoutText > 0) - { - return new ToolExecutionResult - { - Success = false, - ErrorMessage = pagesWithoutText == totalPages - ? $"No extractable text was found on any of the {totalPages} page(s) — this looks like a scanned/image-only document. This tool indexes text that already exists in a PDF; it does not yet perform true image-to-text OCR recognition." - : $"{pagesWithoutText} of {totalPages} page(s) have no extractable text (likely scanned images) and could not be made searchable. This tool indexes text that already exists in a PDF; it does not yet perform true image-to-text OCR recognition for those pages." - }; - } - - var outFiles = new List { outPath }; - if (options.GenerateTextFile && File.Exists(txtOutPath)) - { - outFiles.Add(txtOutPath); - } - - string resultMsg = options.GenerateTextFile && File.Exists(txtOutPath) - ? $"OCR completed using {lastEngineUsed}: recognized and indexed {ocrWordsAdded} words across {pagesWithoutText} scanned page(s). Created Searchable PDF & Text File." - : $"OCR completed successfully using {lastEngineUsed}: recognized and indexed {ocrWordsAdded} words across {pagesWithoutText} scanned page(s)."; - - return new ToolExecutionResult - { - Success = true, - OutputFilePath = outPath, - OutputFiles = outFiles, - OriginalSizeBytes = origBytes, - OutputSizeBytes = finalBytes, - Message = resultMsg - }; - }, ct); - } - - public async Task ScanToPdfAsync(ScanToolOptions options, IProgress? progress = null, CancellationToken ct = default) - { - return await Task.Run(() => - { - if (options.InputImageFiles == null || options.InputImageFiles.Count == 0) - return new ToolExecutionResult { Success = false, ErrorMessage = "No scanned images provided." }; - - long totalOriginalBytes = options.InputImageFiles.Where(File.Exists).Sum(f => new FileInfo(f).Length); - string outPath = options.OutputFilePath; - if (string.IsNullOrWhiteSpace(outPath)) - { - string dir = Path.GetDirectoryName(options.InputImageFiles[0]) ?? Path.GetTempPath(); - outPath = Path.Combine(dir, "Scanned_Document.pdf"); - } - - ct.ThrowIfCancellationRequested(); - using var pdfDoc = new PdfSharpCore.Pdf.PdfDocument(); - int total = options.InputImageFiles.Count; - - for (int i = 0; i < total; i++) - { - ct.ThrowIfCancellationRequested(); - string imgFile = options.InputImageFiles[i]; - if (!File.Exists(imgFile)) continue; - - // Load and enhance scanned image with SkiaSharp - using var skBitmap = SkiaSharp.SKBitmap.Decode(imgFile); - if (skBitmap != null) - { - // If enhancement requested (contrast / whitening) - using var enhancedSurface = SkiaSharp.SKSurface.Create(new SkiaSharp.SKImageInfo(skBitmap.Width, skBitmap.Height)); - var canvas = enhancedSurface.Canvas; - - // Compose the requested enhancement filters. Note: AutoDeskew is not - // applied here — real skew correction needs angle detection (e.g. a - // Hough transform / projection-profile analysis), which is a separate, - // larger piece of work rather than a color filter. - SkiaSharp.SKColorFilter? colorFilter = null; - void Compose(SkiaSharp.SKColorFilter next) - { - colorFilter = colorFilter == null ? next : SkiaSharp.SKColorFilter.CreateCompose(next, colorFilter); - } - - if (options.ConvertToGrayscale) - { - Compose(SkiaSharp.SKColorFilter.CreateColorMatrix(new float[] - { - 0.21f, 0.72f, 0.07f, 0, 0, - 0.21f, 0.72f, 0.07f, 0, 0, - 0.21f, 0.72f, 0.07f, 0, 0, - 0, 0, 0, 1, 0 - })); - } - - if (options.EnhanceContrast) - { - const float contrast = 1.25f; - float t = 0.5f * (1f - contrast); - Compose(SkiaSharp.SKColorFilter.CreateColorMatrix(new float[] - { - contrast, 0, 0, 0, t, - 0, contrast, 0, 0, t, - 0, 0, contrast, 0, t, - 0, 0, 0, 1, 0 - })); - } - - if (options.WhitenBackground) - { - const float brighten = 0.10f; - Compose(SkiaSharp.SKColorFilter.CreateColorMatrix(new float[] - { - 1, 0, 0, 0, brighten, - 0, 1, 0, 0, brighten, - 0, 0, 1, 0, brighten, - 0, 0, 0, 1, 0 - })); - } - - using var paint = new SkiaSharp.SKPaint { ColorFilter = colorFilter }; - - canvas.DrawBitmap(skBitmap, 0, 0, paint); - - using var enhancedImage = enhancedSurface.Snapshot(); - using var data = enhancedImage.Encode(SkiaSharp.SKEncodedImageFormat.Jpeg, 92); - - using var ms = new MemoryStream(); - data.SaveTo(ms); - ms.Seek(0, SeekOrigin.Begin); - - var page = pdfDoc.AddPage(); - var xImage = XImage.FromStream(() => new MemoryStream(ms.ToArray())); - - using var gfx = XGraphics.FromPdfPage(page); - double maxW = page.Width.Point - 40; - double maxH = page.Height.Point - 40; - double scale = Math.Min(maxW / xImage.PixelWidth, maxH / xImage.PixelHeight); - double drawW = xImage.PixelWidth * scale; - double drawH = xImage.PixelHeight * scale; - double posX = 20 + ((maxW - drawW) / 2.0); - double posY = 20 + ((maxH - drawH) / 2.0); - - gfx.DrawImage(xImage, posX, posY, drawW, drawH); - } - - progress?.Report((i + 1) / (double)total * 90.0); - } - - pdfDoc.Save(outPath); - progress?.Report(100.0); - - long outBytes = File.Exists(outPath) ? new FileInfo(outPath).Length : 0; - return new ToolExecutionResult - { - Success = true, - OutputFilePath = outPath, - OutputFiles = new List { outPath }, - OriginalSizeBytes = totalOriginalBytes, - OutputSizeBytes = outBytes, - Message = $"Enhanced {total} scanned pages and compiled into PDF: {Path.GetFileName(outPath)}" - }; - }, ct); - } -} diff --git a/src/PdfEditorApp/Services/Tools/Organize/PdfPageService.cs b/src/PdfEditorApp/Services/Tools/Organize/PdfPageService.cs deleted file mode 100644 index 4bc7763..0000000 --- a/src/PdfEditorApp/Services/Tools/Organize/PdfPageService.cs +++ /dev/null @@ -1,768 +0,0 @@ -using PdfEditorApp.Services.Tools.Security; -using PdfEditorApp.Services.Tools.Core; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Models; -using PdfSharpCore.Drawing; -using PdfSharpCore.Pdf; -using PdfSharpCore.Pdf.IO; -using QuestPDF.Fluent; - -namespace PdfEditorApp.Services.Tools.Organize; - -public interface IPdfPageService -{ - Task MergePdfAsync(MergeToolOptions options, IProgress? progress = null, CancellationToken ct = default); - Task SplitPdfAsync(SplitToolOptions options, IProgress? progress = null, CancellationToken ct = default); - Task RotatePdfAsync(RotateToolOptions options, IProgress? progress = null, CancellationToken ct = default); - Task CropPdfAsync(CropToolOptions options, IProgress? progress = null, CancellationToken ct = default); - Task OrganizePdfAsync(OrganizeToolOptions options, IProgress? progress = null, CancellationToken ct = default); - Task AddPageNumbersAsync(PageNumberToolOptions options, IProgress? progress = null, CancellationToken ct = default); - Task AddWatermarkAsync(WatermarkToolOptions options, IProgress? progress = null, CancellationToken ct = default); - Task ApplyPdfLayerAsync(string inputPath, string layerPdfPath, bool isOverlay, string targetPages, string? outputPath = null, IProgress? progress = null, CancellationToken ct = default); -} - -public class PdfPageService : IPdfPageService -{ - private readonly IQuestPdfOperationsEngine _questEngine; - - public PdfPageService(IQuestPdfOperationsEngine? questEngine = null) - { - _questEngine = questEngine ?? new QuestPdfOperationsEngine(); - } - - public async Task MergePdfAsync(MergeToolOptions options, IProgress? progress = null, CancellationToken ct = default) - { - if (options.Engine == PdfProcessingEngine.QuestPdfNative) - { - var questResult = await _questEngine.MergeAsync(options, progress, ct); - if (questResult.Success) - return questResult; - - System.Diagnostics.Debug.WriteLine($"QuestPDF Merge fallback: {questResult.ErrorMessage}"); - } - - return await MergeWithPdfSharpAsync(options, progress, ct); - } - - private async Task MergeWithPdfSharpAsync(MergeToolOptions options, IProgress? progress, CancellationToken ct) - { - return await Task.Run(() => - { - if (options.InputFiles == null || options.InputFiles.Count == 0) - return new ToolExecutionResult { Success = false, ErrorMessage = "No input PDF files provided for merging." }; - - long totalOriginalBytes = 0; - foreach (var f in options.InputFiles) - { - if (File.Exists(f)) totalOriginalBytes += new FileInfo(f).Length; - } - - string outPath = options.OutputFilePath; - if (string.IsNullOrWhiteSpace(outPath)) - { - string dir = Path.GetDirectoryName(options.InputFiles[0]) ?? Path.GetTempPath(); - outPath = PdfFileHelper.ResolveSafeOutputPath(null, dir, "Merged_Document", ".pdf", options.InputFiles); - } - - string? targetDir = Path.GetDirectoryName(outPath); - if (!string.IsNullOrEmpty(targetDir) && !Directory.Exists(targetDir)) - Directory.CreateDirectory(targetDir); - - // Standard Engine (PdfSharpCore) - using var outputDoc = new PdfDocument(); - int totalFiles = options.InputFiles.Count; - - for (int i = 0; i < totalFiles; i++) - { - ct.ThrowIfCancellationRequested(); - string filePath = options.InputFiles[i]; - if (!File.Exists(filePath)) continue; - - using var inputDoc = PdfFileHelper.OpenDocumentSafely(filePath, PdfDocumentOpenMode.Import); - int pageCount = inputDoc.PageCount; - - for (int p = 0; p < pageCount; p++) - { - ct.ThrowIfCancellationRequested(); - var page = inputDoc.Pages[p]; - outputDoc.AddPage(page); - } - - progress?.Report((i + 1) / (double)totalFiles * 90.0); - } - - if (outputDoc.PageCount == 0) - return new ToolExecutionResult { Success = false, ErrorMessage = "No valid pages found in the provided PDF files to merge." }; - - try - { - PdfFileHelper.SaveDocumentWithFryPdfMetadata(outputDoc, outPath); - } - catch (IOException) when (string.IsNullOrWhiteSpace(options.OutputFilePath)) - { - string dir = Path.GetDirectoryName(outPath) ?? Path.GetTempPath(); - string fallbackPath = Path.Combine(dir, $"Merged_Document_{DateTime.Now:yyyyMMdd_HHmmss}.pdf"); - try - { - PdfFileHelper.SaveDocumentWithFryPdfMetadata(outputDoc, fallbackPath); - outPath = fallbackPath; - } - catch - { - return new ToolExecutionResult - { - Success = false, - ErrorMessage = $"Cannot save merged document to '{Path.GetFileName(outPath)}': the file is currently open in another application. Please close it and try again." - }; - } - } - catch (Exception ex) - { - return new ToolExecutionResult - { - Success = false, - ErrorMessage = $"Cannot save to '{Path.GetFileName(outPath)}': {ex.Message}" - }; - } - progress?.Report(100.0); - - long outBytes = File.Exists(outPath) ? new FileInfo(outPath).Length : 0; - return new ToolExecutionResult - { - Success = true, - OutputFilePath = outPath, - OutputFiles = new List { outPath }, - OriginalSizeBytes = totalOriginalBytes, - OutputSizeBytes = outBytes, - Message = $"Successfully merged {totalFiles} files into {Path.GetFileName(outPath)} ({outputDoc.PageCount} pages)." - }; - }, ct); - } - - public async Task SplitPdfAsync(SplitToolOptions options, IProgress? progress = null, CancellationToken ct = default) - { - return await Task.Run(() => - { - if (!File.Exists(options.InputFilePath)) - return new ToolExecutionResult { Success = false, ErrorMessage = "Input PDF file does not exist." }; - - long origBytes = new FileInfo(options.InputFilePath).Length; - using var inputDoc = PdfFileHelper.OpenDocumentSafely(options.InputFilePath, PdfDocumentOpenMode.Import); - int totalPages = inputDoc.PageCount; - - if (totalPages == 0) - return new ToolExecutionResult { Success = false, ErrorMessage = "The selected PDF has no pages to split." }; - - string outDir = options.OutputDirectory; - if (string.IsNullOrWhiteSpace(outDir)) - { - outDir = Path.Combine(Path.GetDirectoryName(options.InputFilePath) ?? "", Path.GetFileNameWithoutExtension(options.InputFilePath) + "_split"); - } - if (!Directory.Exists(outDir)) Directory.CreateDirectory(outDir); - - var createdFiles = new List(); - string baseName = Path.GetFileNameWithoutExtension(options.InputFilePath); - - if (options.SplitOddEven) - { - // Odd pages document - using var oddDoc = new PdfDocument(); - for (int i = 0; i < totalPages; i += 2) - oddDoc.AddPage(inputDoc.Pages[i]); - string oddPath = Path.Combine(outDir, $"{baseName}_OddPages.pdf"); - if (oddDoc.PageCount > 0) - { - PdfFileHelper.SaveDocumentWithFryPdfMetadata(oddDoc, oddPath); - createdFiles.Add(oddPath); - } - - // Even pages document - using var evenDoc = new PdfDocument(); - for (int i = 1; i < totalPages; i += 2) - evenDoc.AddPage(inputDoc.Pages[i]); - string evenPath = Path.Combine(outDir, $"{baseName}_EvenPages.pdf"); - if (evenDoc.PageCount > 0) - { - PdfFileHelper.SaveDocumentWithFryPdfMetadata(evenDoc, evenPath); - createdFiles.Add(evenPath); - } - } - else if (options.Mode == SplitExtractMode.SplitByPageRanges) - { - var ranges = ParsePageRanges(options.RangeExpression, totalPages); - int rIdx = 1; - foreach (var range in ranges) - { - ct.ThrowIfCancellationRequested(); - if (range.Count == 0) continue; - using var rangeDoc = new PdfDocument(); - foreach (int pIndex in range) - { - if (pIndex >= 0 && pIndex < totalPages) - rangeDoc.AddPage(inputDoc.Pages[pIndex]); - } - - if (rangeDoc.PageCount > 0) - { - string rangeName = $"{baseName}_Range{rIdx}_{range.First() + 1}-{range.Last() + 1}.pdf"; - string rangePath = Path.Combine(outDir, rangeName); - PdfFileHelper.SaveDocumentWithFryPdfMetadata(rangeDoc, rangePath); - createdFiles.Add(rangePath); - } - rIdx++; - } - } - else - { - // Split every N pages - int n = Math.Max(1, options.PagesPerSplit); - int part = 1; - for (int i = 0; i < totalPages; i += n) - { - ct.ThrowIfCancellationRequested(); - using var partDoc = new PdfDocument(); - int count = Math.Min(n, totalPages - i); - for (int j = 0; j < count; j++) - { - partDoc.AddPage(inputDoc.Pages[i + j]); - } - - string partPath = Path.Combine(outDir, $"{baseName}_Part{part}.pdf"); - PdfFileHelper.SaveDocumentWithFryPdfMetadata(partDoc, partPath); - createdFiles.Add(partPath); - part++; - - progress?.Report(i / (double)totalPages * 90.0); - } - } - - progress?.Report(100.0); - return new ToolExecutionResult - { - Success = true, - OutputFilePath = createdFiles.FirstOrDefault(), - OutputFiles = createdFiles, - OriginalSizeBytes = origBytes, - OutputSizeBytes = createdFiles.Sum(f => File.Exists(f) ? new FileInfo(f).Length : 0), - Message = $"Split PDF into {createdFiles.Count} files in {outDir}." - }; - }, ct); - } - - public async Task RotatePdfAsync(RotateToolOptions options, IProgress? progress = null, CancellationToken ct = default) - { - return await Task.Run(() => - { - if (!File.Exists(options.InputFilePath)) - return new ToolExecutionResult { Success = false, ErrorMessage = "Input PDF file does not exist." }; - - long origBytes = new FileInfo(options.InputFilePath).Length; - using var doc = PdfFileHelper.OpenDocumentSafely(options.InputFilePath, PdfDocumentOpenMode.Modify); - int totalPages = doc.PageCount; - - var targetIndices = GetFilteredPageIndices(options.TargetFilter, options.CustomRange, totalPages); - - for (int i = 0; i < totalPages; i++) - { - ct.ThrowIfCancellationRequested(); - if (targetIndices.Contains(i)) - { - var page = doc.Pages[i]; - int currentRotate = page.Rotate; - int newRotate = (currentRotate + options.RotationDegrees) % 360; - if (newRotate < 0) newRotate += 360; - page.Rotate = newRotate; - } - progress?.Report((i + 1) / (double)totalPages * 90.0); - } - - string outPath = options.OutputFilePath; - if (string.IsNullOrWhiteSpace(outPath)) - { - string dir = Path.GetDirectoryName(options.InputFilePath) ?? ""; - string name = Path.GetFileNameWithoutExtension(options.InputFilePath); - outPath = PdfFileHelper.ResolveSafeOutputPath(null, dir, $"{name}_Rotated", ".pdf", [options.InputFilePath]); - } - - PdfFileHelper.SaveDocumentWithFryPdfMetadata(doc, outPath); - progress?.Report(100.0); - - long outBytes = File.Exists(outPath) ? new FileInfo(outPath).Length : 0; - return new ToolExecutionResult - { - Success = true, - OutputFilePath = outPath, - OutputFiles = new List { outPath }, - OriginalSizeBytes = origBytes, - OutputSizeBytes = outBytes, - Message = $"Rotated {targetIndices.Count} pages by {options.RotationDegrees}°." - }; - }, ct); - } - - public async Task CropPdfAsync(CropToolOptions options, IProgress? progress = null, CancellationToken ct = default) - { - return await Task.Run(() => - { - if (!File.Exists(options.InputFilePath)) - return new ToolExecutionResult { Success = false, ErrorMessage = "Input PDF file does not exist." }; - - long origBytes = new FileInfo(options.InputFilePath).Length; - using var doc = PdfFileHelper.OpenDocumentSafely(options.InputFilePath, PdfDocumentOpenMode.Modify); - int totalPages = doc.PageCount; - - var targetIndices = GetTargetPageIndices(options.TargetPages, options.CustomRange, totalPages); - - for (int i = 0; i < totalPages; i++) - { - ct.ThrowIfCancellationRequested(); - if (targetIndices.Contains(i)) - { - var page = doc.Pages[i]; - var mediaBox = page.MediaBox; - double x1 = mediaBox.X1 + options.CropLeftPoints; - double y1 = mediaBox.Y1 + options.CropBottomPoints; - double x2 = mediaBox.X2 - options.CropRightPoints; - double y2 = mediaBox.Y2 - options.CropTopPoints; - - if (x2 > x1 && y2 > y1) - { - var rect = new PdfRectangle(new PdfSharpCore.Drawing.XPoint(x1, y1), new PdfSharpCore.Drawing.XPoint(x2, y2)); - page.CropBox = rect; - page.MediaBox = rect; - } - } - progress?.Report((i + 1) / (double)totalPages * 90.0); - } - - string outPath = options.OutputFilePath; - if (string.IsNullOrWhiteSpace(outPath)) - { - string dir = Path.GetDirectoryName(options.InputFilePath) ?? ""; - string name = Path.GetFileNameWithoutExtension(options.InputFilePath); - outPath = PdfFileHelper.ResolveSafeOutputPath(null, dir, $"{name}_Cropped", ".pdf", [options.InputFilePath]); - } - - PdfFileHelper.SaveDocumentWithFryPdfMetadata(doc, outPath); - progress?.Report(100.0); - - long outBytes = File.Exists(outPath) ? new FileInfo(outPath).Length : 0; - return new ToolExecutionResult - { - Success = true, - OutputFilePath = outPath, - OutputFiles = new List { outPath }, - OriginalSizeBytes = origBytes, - OutputSizeBytes = outBytes, - Message = $"Applied crop margins to {targetIndices.Count} pages." - }; - }, ct); - } - - public async Task OrganizePdfAsync(OrganizeToolOptions options, IProgress? progress = null, CancellationToken ct = default) - { - return await Task.Run(() => - { - if (!File.Exists(options.InputFilePath)) - return new ToolExecutionResult { Success = false, ErrorMessage = "Input PDF file does not exist." }; - - long origBytes = new FileInfo(options.InputFilePath).Length; - using var inputDoc = PdfFileHelper.OpenDocumentSafely(options.InputFilePath, PdfDocumentOpenMode.Import); - using var outputDoc = new PdfDocument(); - int totalPages = inputDoc.PageCount; - - var order = options.PageOrder.Count > 0 ? options.PageOrder : Enumerable.Range(0, totalPages).ToList(); - - int step = 0; - foreach (int pIndex in order) - { - ct.ThrowIfCancellationRequested(); - if (pIndex < 0 || pIndex >= totalPages) continue; - if (options.PagesToDelete.Contains(pIndex)) continue; - - var page = inputDoc.Pages[pIndex]; - var addedPage = outputDoc.AddPage(page); - - if (options.PageRotations.TryGetValue(pIndex, out int rot) && rot != 0) - { - addedPage.Rotate = (addedPage.Rotate + rot) % 360; - } - - step++; - progress?.Report(step / (double)order.Count * 90.0); - } - - string outPath = options.OutputFilePath; - if (string.IsNullOrWhiteSpace(outPath)) - { - string dir = Path.GetDirectoryName(options.InputFilePath) ?? ""; - string name = Path.GetFileNameWithoutExtension(options.InputFilePath); - outPath = PdfFileHelper.ResolveSafeOutputPath(null, dir, $"{name}_Organized", ".pdf", [options.InputFilePath]); - } - - PdfFileHelper.SaveDocumentWithFryPdfMetadata(outputDoc, outPath); - progress?.Report(100.0); - - long outBytes = File.Exists(outPath) ? new FileInfo(outPath).Length : 0; - return new ToolExecutionResult - { - Success = true, - OutputFilePath = outPath, - OutputFiles = new List { outPath }, - OriginalSizeBytes = origBytes, - OutputSizeBytes = outBytes, - Message = $"Organized PDF to {outputDoc.PageCount} pages." - }; - }, ct); - } - - public async Task AddPageNumbersAsync(PageNumberToolOptions options, IProgress? progress = null, CancellationToken ct = default) - { - return await Task.Run(() => - { - if (!File.Exists(options.InputFilePath)) - return new ToolExecutionResult { Success = false, ErrorMessage = "Input PDF file does not exist." }; - - long origBytes = new FileInfo(options.InputFilePath).Length; - using var doc = PdfFileHelper.OpenDocumentSafely(options.InputFilePath, PdfDocumentOpenMode.Modify); - int totalPages = doc.PageCount; - - var targetIndices = GetTargetPageIndices(options.TargetPages, options.CustomRange, totalPages); - var font = new XFont(options.FontFamily, options.FontSize, XFontStyle.Regular); - var brush = new XSolidBrush(ParseColor(options.ColorHex)); - - int count = 0; - for (int i = 0; i < totalPages; i++) - { - ct.ThrowIfCancellationRequested(); - if (targetIndices.Contains(i)) - { - var page = doc.Pages[i]; - using var gfx = XGraphics.FromPdfPage(page); - - int pageNum = options.StartingNumber + count; - string text = FormatTemplate(options.Template, pageNum, totalPages); - - var size = gfx.MeasureString(text, font); - double margin = options.MarginPoints; - double x = 0, y = 0; - - switch (options.Position) - { - case PageNumberPosition.TopLeft: - x = margin; - y = margin + size.Height; - break; - case PageNumberPosition.TopCenter: - x = (page.Width.Point - size.Width) / 2.0; - y = margin + size.Height; - break; - case PageNumberPosition.TopRight: - x = page.Width.Point - size.Width - margin; - y = margin + size.Height; - break; - case PageNumberPosition.BottomLeft: - x = margin; - y = page.Height.Point - margin; - break; - case PageNumberPosition.BottomCenter: - x = (page.Width.Point - size.Width) / 2.0; - y = page.Height.Point - margin; - break; - case PageNumberPosition.BottomRight: - x = page.Width.Point - size.Width - margin; - y = page.Height.Point - margin; - break; - } - - gfx.DrawString(text, font, brush, new XPoint(x, y)); - count++; - } - - progress?.Report((i + 1) / (double)totalPages * 90.0); - } - - string outPath = options.OutputFilePath; - if (string.IsNullOrWhiteSpace(outPath)) - { - string dir = Path.GetDirectoryName(options.InputFilePath) ?? ""; - string name = Path.GetFileNameWithoutExtension(options.InputFilePath); - outPath = PdfFileHelper.ResolveSafeOutputPath(null, dir, $"{name}_Numbered", ".pdf", [options.InputFilePath]); - } - - PdfFileHelper.SaveDocumentWithFryPdfMetadata(doc, outPath); - progress?.Report(100.0); - - long outBytes = File.Exists(outPath) ? new FileInfo(outPath).Length : 0; - return new ToolExecutionResult - { - Success = true, - OutputFilePath = outPath, - OutputFiles = new List { outPath }, - OriginalSizeBytes = origBytes, - OutputSizeBytes = outBytes, - Message = $"Stamped page numbers on {count} pages." - }; - }, ct); - } - - public async Task AddWatermarkAsync(WatermarkToolOptions options, IProgress? progress = null, CancellationToken ct = default) - { - return await Task.Run(() => - { - if (!File.Exists(options.InputFilePath)) - return new ToolExecutionResult { Success = false, ErrorMessage = "Input PDF file does not exist." }; - - long origBytes = new FileInfo(options.InputFilePath).Length; - using var doc = PdfFileHelper.OpenDocumentSafely(options.InputFilePath, PdfDocumentOpenMode.Modify); - int totalPages = doc.PageCount; - - var targetIndices = GetTargetPageIndices(options.TargetPages, options.CustomRange, totalPages); - var baseColor = ParseColor(options.ColorHex); - byte alpha = (byte)(Math.Clamp(options.Opacity, 0.01, 1.0) * 255); - var watermarkColor = XColor.FromArgb(alpha, baseColor.R, baseColor.G, baseColor.B); - var font = new XFont(string.IsNullOrWhiteSpace(options.FontFamily) ? "Helvetica" : options.FontFamily, Math.Max(8, options.FontSize), XFontStyle.Bold); - var brush = new XSolidBrush(watermarkColor); - - int stampedCount = 0; - for (int i = 0; i < totalPages; i++) - { - ct.ThrowIfCancellationRequested(); - if (targetIndices.Contains(i)) - { - var page = doc.Pages[i]; - using var gfx = XGraphics.FromPdfPage(page); - - if (options.Position == WatermarkPosition.Tiled) - { - // Draw repeated tiled watermark diagonally across page - for (double y = 50; y < page.Height.Point; y += 180) - { - for (double x = 50; x < page.Width.Point; x += 220) - { - var state = gfx.Save(); - gfx.TranslateTransform(x, y); - gfx.RotateTransform(options.RotationAngle); - gfx.DrawString(options.Text, font, brush, new XPoint(0, 0), XStringFormats.Center); - gfx.Restore(state); - } - } - } - else - { - var state = gfx.Save(); - double cx = page.Width.Point / 2.0; - double cy = page.Height.Point / 2.0; - - switch (options.Position) - { - case WatermarkPosition.TopLeft: - cx = 100; cy = 100; break; - case WatermarkPosition.TopCenter: - cx = page.Width.Point / 2.0; cy = 100; break; - case WatermarkPosition.TopRight: - cx = page.Width.Point - 100; cy = 100; break; - case WatermarkPosition.BottomLeft: - cx = 100; cy = page.Height.Point - 100; break; - case WatermarkPosition.BottomCenter: - cx = page.Width.Point / 2.0; cy = page.Height.Point - 100; break; - case WatermarkPosition.BottomRight: - cx = page.Width.Point - 100; cy = page.Height.Point - 100; break; - default: // Center - cx = page.Width.Point / 2.0; cy = page.Height.Point / 2.0; break; - } - - gfx.TranslateTransform(cx, cy); - gfx.RotateTransform(options.RotationAngle); - - if (options.Type == WatermarkType.Image && !string.IsNullOrWhiteSpace(options.ImagePath) && File.Exists(options.ImagePath)) - { - try - { - using var img = XImage.FromFile(options.ImagePath); - double imgW = Math.Min(300, img.PixelWidth); - double imgH = imgW * (img.PixelHeight / (double)img.PixelWidth); - gfx.DrawImage(img, -imgW / 2.0, -imgH / 2.0, imgW, imgH); - } - catch - { - gfx.DrawString(options.Text, font, brush, new XPoint(0, 0), XStringFormats.Center); - } - } - else - { - gfx.DrawString(options.Text, font, brush, new XPoint(0, 0), XStringFormats.Center); - } - - gfx.Restore(state); - } - - stampedCount++; - } - - progress?.Report((i + 1) / (double)totalPages * 90.0); - } - - string outPath = options.OutputFilePath; - if (string.IsNullOrWhiteSpace(outPath)) - { - string dir = Path.GetDirectoryName(options.InputFilePath) ?? ""; - string name = Path.GetFileNameWithoutExtension(options.InputFilePath); - outPath = PdfFileHelper.ResolveSafeOutputPath(null, dir, $"{name}_Watermarked", ".pdf", [options.InputFilePath]); - } - - PdfFileHelper.SaveDocumentWithFryPdfMetadata(doc, outPath); - progress?.Report(100.0); - - long outBytes = File.Exists(outPath) ? new FileInfo(outPath).Length : 0; - return new ToolExecutionResult - { - Success = true, - OutputFilePath = outPath, - OutputFiles = new List { outPath }, - OriginalSizeBytes = origBytes, - OutputSizeBytes = outBytes, - Message = $"Applied watermark to {stampedCount} pages." - }; - }, ct); - } - - private static string FormatTemplate(string template, int n, int total) - { - if (string.IsNullOrWhiteSpace(template)) return n.ToString(); - return template - .Replace("{n}", n.ToString()) - .Replace("{P}", n.ToString()) - .Replace("{total}", total.ToString()) - .Replace("{N}", total.ToString()) - .Replace("{n:D6}", n.ToString("D6")) - .Replace("{n:D4}", n.ToString("D4")); - } - - private static HashSet GetTargetPageIndices(PageTargetSelection selection, string customRange, int totalPages) - { - var result = new HashSet(); - switch (selection) - { - case PageTargetSelection.AllPages: - for (int i = 0; i < totalPages; i++) result.Add(i); - break; - case PageTargetSelection.OddPagesOnly: - for (int i = 0; i < totalPages; i += 2) result.Add(i); - break; - case PageTargetSelection.EvenPagesOnly: - for (int i = 1; i < totalPages; i += 2) result.Add(i); - break; - case PageTargetSelection.CustomRange: - var parsed = ParseSingleRangeList(customRange, totalPages); - foreach (int p in parsed) result.Add(p); - break; - } - return result; - } - - private static HashSet GetFilteredPageIndices(PageFilterTarget filter, string customRange, int totalPages) - { - var result = new HashSet(); - switch (filter) - { - case PageFilterTarget.All: - for (int i = 0; i < totalPages; i++) result.Add(i); - break; - case PageFilterTarget.OddPages: - for (int i = 0; i < totalPages; i += 2) result.Add(i); - break; - case PageFilterTarget.EvenPages: - for (int i = 1; i < totalPages; i += 2) result.Add(i); - break; - default: - for (int i = 0; i < totalPages; i++) result.Add(i); - break; - } - return result; - } - - private static List> ParsePageRanges(string expr, int totalPages) - { - var result = new List>(); - if (string.IsNullOrWhiteSpace(expr)) return result; - var parts = expr.Split(new[] { ',', ';' }, StringSplitOptions.RemoveEmptyEntries); - foreach (var p in parts) - { - var single = ParseSingleRange(p.Trim(), totalPages); - if (single.Count > 0) result.Add(single); - } - return result; - } - - private static List ParseSingleRangeList(string expr, int totalPages) - { - var result = new List(); - if (string.IsNullOrWhiteSpace(expr)) return result; - var parts = expr.Split(new[] { ',', ';' }, StringSplitOptions.RemoveEmptyEntries); - foreach (var p in parts) - { - result.AddRange(ParseSingleRange(p.Trim(), totalPages)); - } - return result.Distinct().ToList(); - } - - private static List ParseSingleRange(string token, int totalPages) - { - var list = new List(); - if (token.Contains('-')) - { - var bounds = token.Split('-'); - if (bounds.Length == 2 && int.TryParse(bounds[0].Trim(), out int start) && int.TryParse(bounds[1].Trim(), out int end)) - { - start = Math.Max(1, start); - end = Math.Min(totalPages, end); - for (int p = start; p <= end; p++) list.Add(p - 1); - } - } - else if (int.TryParse(token, out int single)) - { - if (single >= 1 && single <= totalPages) list.Add(single - 1); - } - return list; - } - - private static XColor ParseColor(string hex) - { - try - { - if (string.IsNullOrWhiteSpace(hex)) return XColors.Black; - hex = hex.TrimStart('#'); - if (hex.Length == 6) - { - byte r = Convert.ToByte(hex.Substring(0, 2), 16); - byte g = Convert.ToByte(hex.Substring(2, 2), 16); - byte b = Convert.ToByte(hex.Substring(4, 2), 16); - return XColor.FromArgb(r, g, b); - } - if (hex.Length == 8) - { - byte a = Convert.ToByte(hex.Substring(0, 2), 16); - byte r = Convert.ToByte(hex.Substring(2, 2), 16); - byte g = Convert.ToByte(hex.Substring(4, 2), 16); - byte b = Convert.ToByte(hex.Substring(6, 2), 16); - return XColor.FromArgb(a, r, g, b); - } - } - catch { } - return XColors.Black; - } - - public Task ApplyPdfLayerAsync(string inputPath, string layerPdfPath, bool isOverlay, string targetPages, string? outputPath = null, IProgress? progress = null, CancellationToken ct = default) - { - return _questEngine.ApplyLayerAsync(inputPath, layerPdfPath, isOverlay, targetPages, outputPath, progress, ct); - } -} - - diff --git a/src/PdfEditorApp/Services/Tools/Security/PdfOptimizationService.cs b/src/PdfEditorApp/Services/Tools/Security/PdfOptimizationService.cs deleted file mode 100644 index 3bd839d..0000000 --- a/src/PdfEditorApp/Services/Tools/Security/PdfOptimizationService.cs +++ /dev/null @@ -1,596 +0,0 @@ -using PdfEditorApp.Services.Tools.Core; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using PdfEditorApp.Models; -using PdfSharpCore.Pdf; -using PdfSharpCore.Pdf.Advanced; -using PdfSharpCore.Pdf.IO; -using QuestPDF.Fluent; -using QuestPDF.Helpers; -using QuestPDF.Infrastructure; -using SkiaSharp; -using UglyToad.PdfPig; -using UglyToad.PdfPig.Rendering.Skia; -using PdfSharpDoc = PdfSharpCore.Pdf.PdfDocument; - -namespace PdfEditorApp.Services.Tools.Security; - -public interface IPdfOptimizationService -{ - Task CompressPdfAsync(CompressToolOptions options, IProgress? progress = null, CancellationToken ct = default); - Task RepairPdfAsync(RepairToolOptions options, IProgress? progress = null, CancellationToken ct = default); - Task ConvertToPdfAAsync(PdfAToolOptions options, IProgress? progress = null, CancellationToken ct = default); - Task LinearizePdfAsync(LinearizeToolOptions options, IProgress? progress = null, CancellationToken ct = default); -} - -public class PdfOptimizationService : IPdfOptimizationService -{ - private readonly IQuestPdfOperationsEngine _questEngine; - - public PdfOptimizationService(IQuestPdfOperationsEngine? questEngine = null) - { - _questEngine = questEngine ?? new QuestPdfOperationsEngine(); - } - - public async Task CompressPdfAsync(CompressToolOptions options, IProgress? progress = null, CancellationToken ct = default) - { - return await Task.Run(() => - { - if (!File.Exists(options.InputFilePath)) - return new ToolExecutionResult { Success = false, ErrorMessage = "Input PDF file does not exist." }; - - long origBytes = new FileInfo(options.InputFilePath).Length; - progress?.Report(10.0); - - ct.ThrowIfCancellationRequested(); - - byte[] pass1Bytes = CompressPdfStreamsAndImages(options.InputFilePath, options, progress, ct); - byte[] bestBytes = pass1Bytes; - - // Test raster page compression for Extreme, SmallSize, and Recommended presets, - // or whenever in-place pass did not achieve aggressive reduction (<40% reduction). - bool shouldTryRaster = options.Level == PdfCompressionLevel.MaximumCompression || - options.Level == PdfCompressionLevel.SmallSize || - options.Level == PdfCompressionLevel.Balanced || - pass1Bytes.Length >= origBytes || - (pass1Bytes.Length / (double)origBytes) > 0.55; - - if (shouldTryRaster) - { - progress?.Report(80.0); - byte[]? rasterCandidate = TryRasterPageCompression(options.InputFilePath, options, ct); - if (rasterCandidate != null && rasterCandidate.Length < bestBytes.Length) - { - bestBytes = rasterCandidate; - } - } - - progress?.Report(95.0); - - string outPath = options.OutputFilePath; - if (string.IsNullOrWhiteSpace(outPath)) - { - string dir = Path.GetDirectoryName(options.InputFilePath) ?? ""; - string name = Path.GetFileNameWithoutExtension(options.InputFilePath); - outPath = Path.Combine(dir, $"{name}_Compressed.pdf"); - } - - string? targetDir = Path.GetDirectoryName(outPath); - if (!string.IsNullOrEmpty(targetDir) && !Directory.Exists(targetDir)) - Directory.CreateDirectory(targetDir); - - long outBytes; - string message; - - if (bestBytes.Length < origBytes) - { - File.WriteAllBytes(outPath, bestBytes); - outBytes = bestBytes.Length; - double reduction = ((origBytes - outBytes) / (double)origBytes) * 100.0; - message = $"Compressed document from {FormatFileSize(origBytes)} to {FormatFileSize(outBytes)} ({reduction:F1}% reduction)."; - } - else - { - // Document is already optimally compressed. NEVER output a larger file! - if (!string.Equals(Path.GetFullPath(options.InputFilePath), Path.GetFullPath(outPath), StringComparison.OrdinalIgnoreCase)) - { - File.Copy(options.InputFilePath, outPath, overwrite: true); - } - outBytes = origBytes; - message = $"Document is already at optimal compression ({FormatFileSize(origBytes)}). Original fidelity preserved without increasing file size."; - } - - // High-Performance QuestPDF Web Linearization (Fast Web View) - if (options.LinearizeForWeb && File.Exists(outPath)) - { - var linResult = _questEngine.LinearizeAsync(outPath, outPath, null, ct).GetAwaiter().GetResult(); - if (linResult.Success) - { - outBytes = new FileInfo(outPath).Length; - message += " Optimized for Fast Web View (Linearized)."; - } - } - - progress?.Report(100.0); - - return new ToolExecutionResult - { - Success = true, - OutputFilePath = outPath, - OutputFiles = new List { outPath }, - OriginalSizeBytes = origBytes, - OutputSizeBytes = outBytes, - Message = message - }; - }, ct); - } - - public Task LinearizePdfAsync(LinearizeToolOptions options, IProgress? progress = null, CancellationToken ct = default) - { - return _questEngine.LinearizeAsync(options.InputFilePath, options.OutputFilePath, progress, ct); - } - - private static byte[] CompressPdfStreamsAndImages(string inputPath, CompressToolOptions options, IProgress? progress, CancellationToken ct) - { - int effectiveDpi = options.ImageQualityDpi > 0 ? Math.Clamp(options.ImageQualityDpi, 50, 600) : 150; - - int jpegQuality = options.JpegQuality > 0 - ? Math.Clamp(options.JpegQuality, 20, 100) - : options.Level switch - { - PdfCompressionLevel.MaximumCompression => 52, - PdfCompressionLevel.SmallSize => 60, - PdfCompressionLevel.Balanced => 66, - PdfCompressionLevel.HighQuality => 82, - PdfCompressionLevel.MaximumQuality => 92, - _ => 66 - }; - - int maxDimension = options.MaxImageDimension > 0 - ? Math.Clamp(options.MaxImageDimension, 500, 5000) - : Math.Clamp((int)(11.69 * effectiveDpi), 600, 4500); - - using var doc = PdfFileHelper.OpenDocumentSafely(inputPath, PdfDocumentOpenMode.Modify); - - doc.Options.CompressContentStreams = options.CompressStreams; - doc.Options.UseFlateDecoderForJpegImages = PdfUseFlateDecoderForJpegImages.Never; - doc.Options.NoCompression = !options.CompressStreams; - - if (options.RemoveMetadata) - { - doc.Info.Title = ""; - doc.Info.Author = ""; - doc.Info.Subject = ""; - doc.Info.Keywords = ""; - PdfFileHelper.SetFryPdfMetadata(doc); - doc.Internals.Catalog.Elements.Remove("/Metadata"); - doc.Internals.Catalog.Elements.Remove("/PieceInfo"); - doc.Internals.Catalog.Elements.Remove("/StructTreeRoot"); - } - - int pageCount = doc.Pages.Count; - for (int i = 0; i < pageCount; i++) - { - ct.ThrowIfCancellationRequested(); - var page = doc.Pages[i]; - page.Elements.Remove("/Thumb"); - if (options.RemoveMetadata) - { - page.Elements.Remove("/PieceInfo"); - } - - if (options.CompressStreams && page.Contents != null) - { - for (int c = 0; c < page.Contents.Elements.Count; c++) - { - var contentRef = page.Contents.Elements[c]; - if (contentRef is PdfDictionary cDict && cDict.Stream != null) - { - try { cDict.Stream.Zip(); } catch { } - } - } - } - progress?.Report(20.0 + (i / (double)pageCount * 30.0)); - } - - var allObjects = doc.Internals.GetAllObjects(); - for (int idx = 0; idx < allObjects.Length; idx++) - { - ct.ThrowIfCancellationRequested(); - var obj = allObjects[idx]; - if (obj is PdfDictionary dict && dict.Stream != null) - { - string subtype = dict.Elements.GetString("/Subtype"); - string type = dict.Elements.GetString("/Type"); - bool isImage = subtype == "/Image" || (type == "/XObject" && dict.Elements.ContainsKey("/Width") && dict.Elements.ContainsKey("/Height")); - - if (isImage) - { - OptimizeImageDictionary(dict, maxDimension, jpegQuality, options.ConvertToGrayscale); - } - else if (options.CompressStreams) - { - try - { - if (!dict.Elements.ContainsKey("/Filter")) - { - dict.Stream.Zip(); - } - } - catch { } - } - } - progress?.Report(50.0 + (idx / (double)allObjects.Length * 30.0)); - } - - using var ms = new MemoryStream(); - doc.Save(ms); - return ms.ToArray(); - } - - private static void OptimizeImageDictionary(PdfDictionary dict, int maxDimension, int jpegQuality, bool convertToGrayscale = false) - { - try - { - if (dict.Stream == null || dict.Stream.Value == null || dict.Stream.Value.Length < 256) - return; - - byte[] streamBytes = dict.Stream.Value; - - using var bmp = SKBitmap.Decode(streamBytes); - if (bmp == null || bmp.Width <= 0 || bmp.Height <= 0) - return; - - int origW = bmp.Width; - int origH = bmp.Height; - int targetW = origW; - int targetH = origH; - - int maxSide = Math.Max(origW, origH); - if (maxSide > maxDimension) - { - double scale = (double)maxDimension / maxSide; - targetW = Math.Max(1, (int)(origW * scale)); - targetH = Math.Max(1, (int)(origH * scale)); - } - - SKBitmap? toEncode = bmp; - SKBitmap? resizedBmp = null; - SKBitmap? grayBmp = null; - - if (targetW != origW || targetH != origH) - { - resizedBmp = bmp.Resize(new SKImageInfo(targetW, targetH), new SKSamplingOptions(SKFilterMode.Linear, SKMipmapMode.Linear)); - if (resizedBmp != null) - { - toEncode = resizedBmp; - } - } - - if (convertToGrayscale && toEncode != null) - { - grayBmp = ConvertBitmapToGrayscale(toEncode); - if (grayBmp != null) - { - toEncode = grayBmp; - } - } - - try - { - using var skImage = SKImage.FromBitmap(toEncode); - if (skImage != null) - { - using var encoded = skImage.Encode(SKEncodedImageFormat.Jpeg, jpegQuality); - if (encoded != null) - { - byte[] newJpegBytes = encoded.ToArray(); - if (newJpegBytes.Length < streamBytes.Length) - { - dict.Stream.Value = newJpegBytes; - dict.Elements.SetName("/Filter", "/DCTDecode"); - dict.Elements.SetInteger("/Length", newJpegBytes.Length); - dict.Elements.SetInteger("/Width", targetW); - dict.Elements.SetInteger("/Height", targetH); - dict.Elements.SetName("/ColorSpace", "/DeviceRGB"); - dict.Elements.SetInteger("/BitsPerComponent", 8); - dict.Elements.Remove("/DecodeParms"); - } - } - } - } - finally - { - resizedBmp?.Dispose(); - grayBmp?.Dispose(); - } - } - catch - { - // Preserve original bytes on error - } - } - - private static SKBitmap? ConvertBitmapToGrayscale(SKBitmap original) - { - try - { - var grayBmp = new SKBitmap(original.Width, original.Height, SKColorType.Bgra8888, SKAlphaType.Opaque); - using var canvas = new SKCanvas(grayBmp); - using var paint = new SKPaint(); - paint.ColorFilter = SKColorFilter.CreateColorMatrix(new float[] - { - 0.21f, 0.72f, 0.07f, 0, 0, - 0.21f, 0.72f, 0.07f, 0, 0, - 0.21f, 0.72f, 0.07f, 0, 0, - 0, 0, 0, 1, 0 - }); - canvas.DrawBitmap(original, 0, 0, paint); - return grayBmp; - } - catch - { - return null; - } - } - - private static byte[]? TryRasterPageCompression(string inputPath, CompressToolOptions options, CancellationToken ct) - { - try - { - float scale = options.ImageQualityDpi > 0 - ? Math.Clamp(options.ImageQualityDpi / 72f, 0.75f, 4.0f) - : options.Level switch - { - PdfCompressionLevel.MaximumCompression => 1.25f, - PdfCompressionLevel.SmallSize => 1.35f, - PdfCompressionLevel.Balanced => 1.45f, - PdfCompressionLevel.HighQuality => 1.85f, - _ => 1.45f - }; - - int jpegQuality = options.JpegQuality > 0 - ? Math.Clamp(options.JpegQuality, 20, 100) - : options.Level switch - { - PdfCompressionLevel.MaximumCompression => 52, - PdfCompressionLevel.SmallSize => 60, - PdfCompressionLevel.Balanced => 66, - PdfCompressionLevel.HighQuality => 82, - _ => 66 - }; - - using var pigDoc = UglyToad.PdfPig.PdfDocument.Open(inputPath); - int pageCount = pigDoc.NumberOfPages; - if (pageCount <= 0 || pageCount > 250) return null; - - var pageImages = new List<(byte[] Bytes, float Width, float Height)>(); - for (int i = 1; i <= pageCount; i++) - { - ct.ThrowIfCancellationRequested(); - var page = pigDoc.GetPage(i); - using var pngStream = PdfPigExtensions.GetPageAsPng(pigDoc, i, scale, 90); - if (pngStream == null || pngStream.Length == 0) return null; - - using var bmp = SKBitmap.Decode(pngStream); - if (bmp == null) return null; - - SKBitmap finalBmp = bmp; - SKBitmap? grayCandidate = null; - if (options.ConvertToGrayscale) - { - grayCandidate = ConvertBitmapToGrayscale(bmp); - if (grayCandidate != null) - { - finalBmp = grayCandidate; - } - } - - try - { - using var img = SKImage.FromBitmap(finalBmp); - using var encoded = img.Encode(SKEncodedImageFormat.Jpeg, jpegQuality); - pageImages.Add((encoded.ToArray(), (float)page.Width, (float)page.Height)); - } - finally - { - grayCandidate?.Dispose(); - } - } - - var doc = FryPdfDocument.Create(container => - { - foreach (var p in pageImages) - { - container.Page(page => - { - page.Size(p.Width, p.Height, Unit.Point); - page.Margin(0); - page.Content().Image(p.Bytes); - }); - } - }); - - return doc.GeneratePdf(); - } - catch - { - return null; - } - } - - public async Task RepairPdfAsync(RepairToolOptions options, IProgress? progress = null, CancellationToken ct = default) - { - return await Task.Run(() => - { - if (!File.Exists(options.InputFilePath)) - return new ToolExecutionResult { Success = false, ErrorMessage = "Input PDF file does not exist." }; - - long origBytes = new FileInfo(options.InputFilePath).Length; - progress?.Report(20.0); - - string outPath = options.OutputFilePath; - if (string.IsNullOrWhiteSpace(outPath)) - { - string dir = Path.GetDirectoryName(options.InputFilePath) ?? ""; - string name = Path.GetFileNameWithoutExtension(options.InputFilePath); - outPath = Path.Combine(dir, $"{name}_Repaired.pdf"); - } - - ct.ThrowIfCancellationRequested(); - - try - { - // Attempt standard reconstruction - using var inputDoc = PdfFileHelper.OpenDocumentSafely(options.InputFilePath, PdfDocumentOpenMode.Import); - using var outputDoc = new PdfSharpDoc(); - - outputDoc.Info.Title = !string.IsNullOrEmpty(inputDoc.Info.Title) ? inputDoc.Info.Title : Path.GetFileNameWithoutExtension(options.InputFilePath); - PdfFileHelper.SetFryPdfMetadata(outputDoc); - - int pages = inputDoc.PageCount; - int recoveredPages = 0; - - for (int i = 0; i < pages; i++) - { - ct.ThrowIfCancellationRequested(); - try - { - var page = inputDoc.Pages[i]; - outputDoc.AddPage(page); - recoveredPages++; - } - catch - { - // Skip corrupted page or object - } - progress?.Report(20.0 + (i / (double)pages * 60.0)); - } - - PdfFileHelper.SaveDocumentWithFryPdfMetadata(outputDoc, outPath); - progress?.Report(100.0); - - long outBytes = File.Exists(outPath) ? new FileInfo(outPath).Length : 0; - return new ToolExecutionResult - { - Success = true, - OutputFilePath = outPath, - OutputFiles = new System.Collections.Generic.List { outPath }, - OriginalSizeBytes = origBytes, - OutputSizeBytes = outBytes, - Message = $"Repaired and safely reconstructed {recoveredPages} of {pages} pages without data loss." - }; - } - catch (Exception ex) - { - // Fallback stream reconstruction for broken xref - try - { - byte[] bytes = File.ReadAllBytes(options.InputFilePath); - using var ms = new MemoryStream(bytes); - using var inputDoc = PdfReader.Open(ms, PdfDocumentOpenMode.Import); - using var outputDoc = new PdfSharpDoc(); - - for (int i = 0; i < inputDoc.PageCount; i++) - { - outputDoc.AddPage(inputDoc.Pages[i]); - } - PdfFileHelper.SaveDocumentWithFryPdfMetadata(outputDoc, outPath); - - long outBytes = File.Exists(outPath) ? new FileInfo(outPath).Length : 0; - return new ToolExecutionResult - { - Success = true, - OutputFilePath = outPath, - OutputFiles = new System.Collections.Generic.List { outPath }, - OriginalSizeBytes = origBytes, - OutputSizeBytes = outBytes, - Message = $"Rebuilt xref tables and recovered {outputDoc.PageCount} pages." - }; - } - catch - { - return new ToolExecutionResult - { - Success = false, - ErrorMessage = $"Unable to repair document structure: {ex.Message}" - }; - } - } - }, ct); - } - - public async Task ConvertToPdfAAsync(PdfAToolOptions options, IProgress? progress = null, CancellationToken ct = default) - { - return await Task.Run(() => - { - if (!File.Exists(options.InputFilePath)) - return new ToolExecutionResult { Success = false, ErrorMessage = "Input PDF file does not exist." }; - - long origBytes = new FileInfo(options.InputFilePath).Length; - progress?.Report(20.0); - - using var inputDoc = PdfFileHelper.OpenDocumentSafely(options.InputFilePath, PdfDocumentOpenMode.Import); - using var outputDoc = new PdfSharpDoc(); - - // Note: this labels the document as the requested standard but does not (yet) - // produce real PDF/A-conformant output — that additionally requires embedded - // XMP metadata with the pdfaid schema, an /OutputIntent ICC profile, full font - // embedding, and no encryption, none of which are implemented here. The label - // below reflects intent, not verified conformance. - string standardLabel = options.Standard switch - { - PdfAStandard.PdfA1b => "PDF/A-1b (ISO 19005-1)", - PdfAStandard.PdfA3b => "PDF/A-3b (ISO 19005-3)", - _ => "PDF/A-2b (ISO 19005-2)" - }; - - outputDoc.Info.Title = inputDoc.Info.Title; - outputDoc.Info.Author = inputDoc.Info.Author; - outputDoc.Info.Subject = $"Prepared for archiving (targeting {standardLabel})"; - PdfFileHelper.SetFryPdfMetadata(outputDoc); - outputDoc.Options.CompressContentStreams = true; - - int pageCount = inputDoc.PageCount; - for (int i = 0; i < pageCount; i++) - { - ct.ThrowIfCancellationRequested(); - outputDoc.AddPage(inputDoc.Pages[i]); - progress?.Report(20.0 + (i / (double)pageCount * 60.0)); - } - - string outPath = options.OutputFilePath; - if (string.IsNullOrWhiteSpace(outPath)) - { - string dir = Path.GetDirectoryName(options.InputFilePath) ?? ""; - string name = Path.GetFileNameWithoutExtension(options.InputFilePath); - outPath = Path.Combine(dir, $"{name}_PDFA.pdf"); - } - - PdfFileHelper.SaveDocumentWithFryPdfMetadata(outputDoc, outPath); - progress?.Report(100.0); - - long outBytes = File.Exists(outPath) ? new FileInfo(outPath).Length : 0; - return new ToolExecutionResult - { - Success = true, - OutputFilePath = outPath, - OutputFiles = new System.Collections.Generic.List { outPath }, - OriginalSizeBytes = origBytes, - OutputSizeBytes = outBytes, - Message = $"Prepared document targeting {standardLabel}. Note: this does not yet produce verified PDF/A-conformant output (no embedded XMP/pdfaid metadata, ICC output intent, or font-embedding/encryption checks) — do not rely on this for formal archival compliance." - }; - }, ct); - } - - private static string FormatFileSize(long bytes) - { - if (bytes < 1024) return $"{bytes} B"; - if (bytes < 1024 * 1024) return $"{bytes / 1024.0:F1} KB"; - return $"{bytes / (1024.0 * 1024.0):F2} MB"; - } -} diff --git a/src/PdfEditorApp/Services/Tools/Security/PdfSecurityService.cs b/src/PdfEditorApp/Services/Tools/Security/PdfSecurityService.cs deleted file mode 100644 index 09f5def..0000000 --- a/src/PdfEditorApp/Services/Tools/Security/PdfSecurityService.cs +++ /dev/null @@ -1,562 +0,0 @@ -using PdfEditorApp.Services.Tools.Organize; -using PdfEditorApp.Services.Tools.Core; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Security.Cryptography; -using System.Security.Cryptography.X509Certificates; -using System.Text; -using System.Threading; -using System.Threading.Tasks; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Models; -using PdfSharpCore.Drawing; -using PdfSharpCore.Pdf; -using PdfSharpCore.Pdf.IO; -using PdfSharpCore.Pdf.Security; -using QuestPDF.Fluent; - -namespace PdfEditorApp.Services.Tools.Security; - -public interface IPdfSecurityService -{ - Task ProtectPdfAsync(SecurityToolOptions options, IProgress? progress = null, CancellationToken ct = default); - Task UnlockPdfAsync(UnlockToolOptions options, IProgress? progress = null, CancellationToken ct = default); - Task SignPdfAsync(SignToolOptions options, IProgress? progress = null, CancellationToken ct = default); - Task RedactPdfAsync(RedactionToolOptions options, IProgress? progress = null, CancellationToken ct = default); - Task AddWatermarkAsync(WatermarkToolOptions options, IProgress? progress = null, CancellationToken ct = default); - - /// - /// Read-only: finds regions matching without writing anything. - /// Lets a preview UI show matches for review before committing to RedactPdfAsync. - /// - Task> FindRedactionMatchesAsync(string filePath, string pattern, bool caseSensitive, CancellationToken ct = default); -} - -public class PdfSecurityService : IPdfSecurityService -{ - private readonly IPdfPageService _pageService; - private readonly IQuestPdfOperationsEngine _questEngine; - - public PdfSecurityService(IQuestPdfOperationsEngine? questEngine = null, IPdfPageService? pageService = null) - { - _questEngine = questEngine ?? new QuestPdfOperationsEngine(); - _pageService = pageService ?? new PdfPageService(_questEngine); - } - - public Task AddWatermarkAsync(WatermarkToolOptions options, IProgress? progress = null, CancellationToken ct = default) - { - return _pageService.AddWatermarkAsync(options, progress, ct); - } - - public async Task ProtectPdfAsync(SecurityToolOptions options, IProgress? progress = null, CancellationToken ct = default) - { - if (options.Engine == PdfProcessingEngine.QuestPdfNative) - { - var questResult = await _questEngine.EncryptAsync(options, progress, ct); - if (questResult.Success) - return questResult; - - System.Diagnostics.Debug.WriteLine($"QuestPDF encryption fallback: {questResult.ErrorMessage}"); - } - - return await ProtectWithPdfSharpAsync(options, progress, ct); - } - - private async Task ProtectWithPdfSharpAsync(SecurityToolOptions options, IProgress? progress, CancellationToken ct) - { - return await Task.Run(() => - { - if (!File.Exists(options.InputFilePath)) - return new ToolExecutionResult { Success = false, ErrorMessage = "Input PDF file does not exist." }; - - long origBytes = new FileInfo(options.InputFilePath).Length; - progress?.Report(20.0); - ct.ThrowIfCancellationRequested(); - - string outPath = options.OutputFilePath; - if (string.IsNullOrWhiteSpace(outPath)) - { - string dir = Path.GetDirectoryName(options.InputFilePath) ?? ""; - string name = Path.GetFileNameWithoutExtension(options.InputFilePath); - outPath = Path.Combine(dir, $"{name}_Protected.pdf"); - } - - string? targetDir = Path.GetDirectoryName(outPath); - if (!string.IsNullOrEmpty(targetDir) && !Directory.Exists(targetDir)) - Directory.CreateDirectory(targetDir); - - using var doc = PdfFileHelper.OpenDocumentSafely(options.InputFilePath, PdfDocumentOpenMode.Modify); - var security = doc.SecuritySettings; - - string userPwd = options.UserPassword ?? string.Empty; - string ownerPwd = options.OwnerPassword ?? string.Empty; - string? generatedOwnerPassword = null; - - if (!string.IsNullOrEmpty(userPwd)) - security.UserPassword = userPwd; - - if (!string.IsNullOrEmpty(ownerPwd)) - { - security.OwnerPassword = ownerPwd; - } - else if (!string.IsNullOrEmpty(userPwd)) - { - generatedOwnerPassword = GenerateRandomPassword(); - security.OwnerPassword = generatedOwnerPassword; - } - - security.PermitPrint = options.AllowPrinting; - security.PermitModifyDocument = options.AllowModifying; - security.PermitExtractContent = options.AllowCopying; - security.PermitAnnotations = options.AllowAnnotating; - security.PermitFormsFill = options.AllowFormFilling; - - PdfFileHelper.SaveDocumentWithFryPdfMetadata(doc, outPath); - progress?.Report(100.0); - - long stdOutBytes = File.Exists(outPath) ? new FileInfo(outPath).Length : 0; - return new ToolExecutionResult - { - Success = true, - OutputFilePath = outPath, - OutputFiles = new List { outPath }, - OriginalSizeBytes = origBytes, - OutputSizeBytes = stdOutBytes, - Message = generatedOwnerPassword != null - ? $"Document successfully encrypted and secured with requested permission constraints. No owner password was provided, so a random one was generated (you'll need it later to change permissions): {generatedOwnerPassword}" - : "Document successfully encrypted and secured with requested permission constraints." - }; - }, ct); - } - - private static string GenerateRandomPassword(int length = 20) - { - const string chars = "ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz23456789!@#$%^&*"; - var bytes = RandomNumberGenerator.GetBytes(length); - var sb = new StringBuilder(length); - foreach (var b in bytes) - { - sb.Append(chars[b % chars.Length]); - } - return sb.ToString(); - } - - public async Task UnlockPdfAsync(UnlockToolOptions options, IProgress? progress = null, CancellationToken ct = default) - { - if (options.Engine == PdfProcessingEngine.QuestPdfNative) - { - var questResult = await _questEngine.DecryptAsync(options, progress, ct); - if (questResult.Success) - return questResult; - - System.Diagnostics.Debug.WriteLine($"QuestPDF unlock fallback: {questResult.ErrorMessage}"); - } - - return await UnlockWithPdfSharpAsync(options, progress, ct); - } - - private async Task UnlockWithPdfSharpAsync(UnlockToolOptions options, IProgress? progress, CancellationToken ct) - { - return await Task.Run(() => - { - if (!File.Exists(options.InputFilePath)) - return new ToolExecutionResult { Success = false, ErrorMessage = "Input PDF file does not exist." }; - - long origBytes = new FileInfo(options.InputFilePath).Length; - progress?.Report(20.0); - ct.ThrowIfCancellationRequested(); - - string outPath = options.OutputFilePath; - if (string.IsNullOrWhiteSpace(outPath)) - { - string dir = Path.GetDirectoryName(options.InputFilePath) ?? ""; - string name = Path.GetFileNameWithoutExtension(options.InputFilePath); - outPath = Path.Combine(dir, $"{name}_Unlocked.pdf"); - } - - string? targetDir = Path.GetDirectoryName(outPath); - if (!string.IsNullOrEmpty(targetDir) && !Directory.Exists(targetDir)) - Directory.CreateDirectory(targetDir); - - try - { - using var inputDoc = PdfFileHelper.OpenDocumentSafely(options.InputFilePath, PdfDocumentOpenMode.Import, options.Password ?? ""); - using var outputDoc = new PdfDocument(); - - PdfFileHelper.SetFryPdfMetadata(outputDoc, inputDoc.Info.Title, inputDoc.Info.Author); - - int pageCount = inputDoc.PageCount; - for (int i = 0; i < pageCount; i++) - { - ct.ThrowIfCancellationRequested(); - outputDoc.AddPage(inputDoc.Pages[i]); - progress?.Report(20.0 + (i / (double)pageCount * 70.0)); - } - - PdfFileHelper.SaveDocumentWithFryPdfMetadata(outputDoc, outPath); - progress?.Report(100.0); - - long outBytes = File.Exists(outPath) ? new FileInfo(outPath).Length : 0; - return new ToolExecutionResult - { - Success = true, - OutputFilePath = outPath, - OutputFiles = new List { outPath }, - OriginalSizeBytes = origBytes, - OutputSizeBytes = outBytes, - Message = "Security restrictions and passwords successfully removed. Output PDF is fully unlocked." - }; - } - catch (Exception ex) - { - return new ToolExecutionResult - { - Success = false, - ErrorMessage = $"Failed to unlock PDF with provided credentials: {ex.Message}" - }; - } - }, ct); - } - - public async Task SignPdfAsync(SignToolOptions options, IProgress? progress = null, CancellationToken ct = default) - { - return await Task.Run(() => - { - if (!File.Exists(options.InputFilePath)) - return new ToolExecutionResult { Success = false, ErrorMessage = "Input PDF file does not exist." }; - - long origBytes = new FileInfo(options.InputFilePath).Length; - progress?.Report(20.0); - - ct.ThrowIfCancellationRequested(); - using var doc = PdfFileHelper.OpenDocumentSafely(options.InputFilePath, PdfDocumentOpenMode.Modify); - - int targetPageIndex = Math.Max(0, Math.Min(doc.PageCount - 1, options.TargetPageNumber - 1)); - var page = doc.Pages[targetPageIndex]; - - using var gfx = XGraphics.FromPdfPage(page); - - // Draw visual signature badge - double x = options.X; - double y = options.Y; - double w = options.Width; - double h = options.Height; - - // Background badge border - var rectBrush = new XSolidBrush(XColor.FromArgb(245, 247, 250)); - var borderPen = new XPen(XColor.FromArgb(15, 108, 189), 1.5); - gfx.DrawRoundedRectangle(borderPen, rectBrush, x, y, w, h, 6, 6); - - // Draw cursive signature text or imported signature image - if (!string.IsNullOrWhiteSpace(options.SignatureImageDataUri) && options.SignatureImageDataUri.StartsWith("data:image")) - { - try - { - int commaIdx = options.SignatureImageDataUri.IndexOf(','); - string b64 = commaIdx >= 0 ? options.SignatureImageDataUri.Substring(commaIdx + 1) : options.SignatureImageDataUri; - byte[] imgBytes = Convert.FromBase64String(b64); - using var ms = new MemoryStream(imgBytes); - var xImg = XImage.FromStream(() => new MemoryStream(imgBytes)); - gfx.DrawImage(xImg, x + 8, y + 6, w - 16, h - 26); - } - catch { } - } - else - { - string sigFont = options.Style switch - { - SignatureStyle.CursiveElegance => "Times New Roman", - SignatureStyle.ClassicScript => "Georgia", - SignatureStyle.ModernHandwriting => "Courier New", - _ => "Helvetica" - }; - - var cursiveFont = new XFont(sigFont, 18, XFontStyle.Italic | XFontStyle.Bold); - var cursiveBrush = new XSolidBrush(XColor.FromArgb(15, 108, 189)); - gfx.DrawString(options.SignerName, cursiveFont, cursiveBrush, new XPoint(x + 10, y + 24)); - } - - // Draw cryptographic / verification badge metadata - var metaFont = new XFont("Helvetica", 8, XFontStyle.Regular); - var metaBrush = new XSolidBrush(XColor.FromArgb(100, 116, 139)); - string dateStr = DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss 'UTC'"); - string reasonStr = !string.IsNullOrWhiteSpace(options.Reason) ? $" • {options.Reason}" : ""; - gfx.DrawString($"Digitally Verified: {options.SignerName}{reasonStr}", metaFont, metaBrush, new XPoint(x + 10, y + h - 14)); - gfx.DrawString($"Timestamp: {dateStr}", metaFont, metaBrush, new XPoint(x + 10, y + h - 4)); - - // If a certificate is provided, read it to label the visual badge with the - // signer identity it names. Note: this does NOT apply a cryptographic PDF - // signature (no /ByteRange or signature dictionary is embedded) — it's a - // visual badge only, so the document is not tamper-evident. Say so honestly - // rather than claiming "Digitally Signed", which would be a false integrity - // guarantee for anyone relying on it. - if (!string.IsNullOrEmpty(options.CertificatePath) && File.Exists(options.CertificatePath)) - { - try - { - var cert = System.Security.Cryptography.X509Certificates.X509CertificateLoader.LoadPkcs12FromFile(options.CertificatePath, options.CertificatePassword); - doc.Info.Subject = $"Visual signature badge referencing certificate '{cert.SubjectName.Name}' at {dateStr} — not a cryptographic PDF signature"; - } - catch { } - } - - string outPath = options.OutputFilePath; - if (string.IsNullOrWhiteSpace(outPath)) - { - string dir = Path.GetDirectoryName(options.InputFilePath) ?? ""; - string name = Path.GetFileNameWithoutExtension(options.InputFilePath); - outPath = Path.Combine(dir, $"{name}_Signed.pdf"); - } - - PdfFileHelper.SaveDocumentWithFryPdfMetadata(doc, outPath); - progress?.Report(100.0); - - long outBytes = File.Exists(outPath) ? new FileInfo(outPath).Length : 0; - return new ToolExecutionResult - { - Success = true, - OutputFilePath = outPath, - OutputFiles = new System.Collections.Generic.List { outPath }, - OriginalSizeBytes = origBytes, - OutputSizeBytes = outBytes, - Message = $"Placed electronic signature for '{options.SignerName}' on page {options.TargetPageNumber}." - }; - }, ct); - } - - public async Task RedactPdfAsync(RedactionToolOptions options, IProgress? progress = null, CancellationToken ct = default) - { - return await Task.Run(async () => - { - if (!File.Exists(options.InputFilePath)) - return new ToolExecutionResult { Success = false, ErrorMessage = "Input PDF file does not exist." }; - - long origBytes = new FileInfo(options.InputFilePath).Length; - progress?.Report(10.0); - - ct.ThrowIfCancellationRequested(); - - // Start from any regions supplied directly (e.g. a UI that already resolved - // matches or manual marks for the user to review), then add matches for - // SearchPatternToRedact if one was also given. - var regions = new List(options.Regions); - string? pattern = options.SearchPatternToRedact?.Trim(); - if (!string.IsNullOrEmpty(pattern)) - { - var matched = await FindRedactionMatchesAsync(options.InputFilePath, pattern, options.CaseSensitive, ct); - regions.AddRange(matched); - } - - progress?.Report(30.0); - - if (regions.Count == 0) - { - return new ToolExecutionResult - { - Success = false, - ErrorMessage = string.IsNullOrEmpty(pattern) - ? "No redaction regions were specified." - : $"No matches for \"{pattern}\" were found in this document — nothing was redacted." - }; - } - - var regionsByPage = regions - .Where(r => r.PageIndex >= 0) - .GroupBy(r => r.PageIndex) - .ToDictionary(g => g.Key, g => g.ToList()); - - using var inputDoc = PdfFileHelper.OpenDocumentSafely(options.InputFilePath, PdfDocumentOpenMode.Import); - using var outputDoc = new PdfDocument(); - - // For genuine (not just visual) sanitization, redacted pages are rendered to a - // raster image with the black boxes baked in, then that image becomes the - // page's ENTIRE content — the original text/vector data for that page is never - // copied into the output at all, so it can't be recovered by anyone who removes - // the black box or runs text extraction. Pages with no matches are left as - // normal, fully-selectable vector pages. - UglyToad.PdfPig.PdfDocument? pigForRender = null; - if (options.PermanentScrubText) - { - pigForRender = UglyToad.PdfPig.PdfDocument.Open(options.InputFilePath); - try { UglyToad.PdfPig.Rendering.Skia.PdfPigExtensions.AddSkiaPageFactory(pigForRender); } catch { } - } - - try - { - int totalRedactions = 0; - int totalPages = inputDoc.PageCount; - for (int pageIndex = 0; pageIndex < totalPages; pageIndex++) - { - ct.ThrowIfCancellationRequested(); - bool hasRegions = regionsByPage.TryGetValue(pageIndex, out var pageRegions) && pageRegions!.Count > 0; - bool flattened = false; - - if (hasRegions && options.PermanentScrubText && pigForRender != null) - { - const float scale = 2.0f; // ~144 DPI: legible while keeping file size reasonable - using var pngStream = UglyToad.PdfPig.Rendering.Skia.PdfPigExtensions.GetPageAsPng(pigForRender, pageIndex + 1, scale, 100); - if (pngStream != null && pngStream.Length > 0) - { - pngStream.Position = 0; - using var bitmap = SkiaSharp.SKBitmap.Decode(pngStream); - if (bitmap != null) - { - using (var canvas = new SkiaSharp.SKCanvas(bitmap)) - using (var blackPaint = new SkiaSharp.SKPaint { Color = SkiaSharp.SKColors.Black, Style = SkiaSharp.SKPaintStyle.Fill }) - { - foreach (var r in pageRegions!) - { - canvas.DrawRect((float)(r.X * scale), (float)(r.Y * scale), (float)(r.Width * scale), (float)(r.Height * scale), blackPaint); - totalRedactions++; - } - } - - using var flattenedImage = SkiaSharp.SKImage.FromBitmap(bitmap); - using var flattenedData = flattenedImage.Encode(SkiaSharp.SKEncodedImageFormat.Png, 100); - var flattenedBytes = flattenedData.ToArray(); - - var srcPage = inputDoc.Pages[pageIndex]; - var newPage = outputDoc.AddPage(); - newPage.Width = srcPage.Width; - newPage.Height = srcPage.Height; - using var gfx = XGraphics.FromPdfPage(newPage); - using var xImage = XImage.FromStream(() => new MemoryStream(flattenedBytes)); - gfx.DrawImage(xImage, 0, 0, newPage.Width.Point, newPage.Height.Point); - flattened = true; - } - } - } - - if (!flattened) - { - var importedPage = outputDoc.AddPage(inputDoc.Pages[pageIndex]); - if (hasRegions) - { - using var gfx = XGraphics.FromPdfPage(importedPage); - var fillBrush = new XSolidBrush(XColors.Black); - foreach (var r in pageRegions!) - { - gfx.DrawRectangle(fillBrush, r.X, r.Y, r.Width, r.Height); - if (!string.IsNullOrWhiteSpace(r.Reason) && r.Width > 40 && r.Height > 12) - { - var reasonFont = new XFont("Helvetica", Math.Min(9, r.Height * 0.5), XFontStyle.Bold); - var reasonBrush = new XSolidBrush(XColors.White); - gfx.DrawString($"[{r.Reason}]", reasonFont, reasonBrush, new XPoint(r.X + 4, r.Y + (r.Height * 0.7))); - } - totalRedactions++; - } - } - } - - progress?.Report(30.0 + (pageIndex / (double)totalPages * 60.0)); - } - - string outPath = options.OutputFilePath; - if (string.IsNullOrWhiteSpace(outPath)) - { - string dir = Path.GetDirectoryName(options.InputFilePath) ?? ""; - string name = Path.GetFileNameWithoutExtension(options.InputFilePath); - outPath = Path.Combine(dir, $"{name}_Redacted.pdf"); - } - - PdfFileHelper.SaveDocumentWithFryPdfMetadata(outputDoc, outPath); - progress?.Report(100.0); - - long outBytes = File.Exists(outPath) ? new FileInfo(outPath).Length : 0; - return new ToolExecutionResult - { - Success = true, - OutputFilePath = outPath, - OutputFiles = new List { outPath }, - OriginalSizeBytes = origBytes, - OutputSizeBytes = outBytes, - Message = options.PermanentScrubText - ? $"Permanently redacted {totalRedactions} region(s) — affected pages were flattened to images so the underlying text cannot be recovered." - : $"Redacted {totalRedactions} region(s) with a visual overlay only — underlying text is still present in the PDF and can be recovered by anyone who removes the overlay. Enable \"Permanent Deep Content Sanitization\" for irrecoverable redaction." - }; - } - finally - { - pigForRender?.Dispose(); - } - }, ct); - } - - public async Task> FindRedactionMatchesAsync(string filePath, string pattern, bool caseSensitive, CancellationToken ct = default) - { - return await Task.Run(() => - { - var regions = new List(); - string? trimmed = pattern?.Trim(); - if (string.IsNullOrEmpty(trimmed) || !File.Exists(filePath)) return regions; - - var comparison = caseSensitive ? StringComparison.Ordinal : StringComparison.OrdinalIgnoreCase; - string[] patternWords = trimmed.Split((char[]?)null, StringSplitOptions.RemoveEmptyEntries); - - void AddMatchRegions(int pageIndex, double pageHeight, IEnumerable matchedWords) - { - var lineGroups = matchedWords - .GroupBy(w => Math.Round(w.BoundingBox.Bottom / 4.0) * 4.0) - .OrderByDescending(g => g.Key); - - foreach (var line in lineGroups) - { - double left = line.Min(w => w.BoundingBox.Left); - double right = line.Max(w => w.BoundingBox.Right); - double top = line.Max(w => w.BoundingBox.Top); - double bottom = line.Min(w => w.BoundingBox.Bottom); - - regions.Add(new RedactionRegion - { - PageIndex = pageIndex, - X = left, - Y = Math.Max(0, pageHeight - top), - Width = Math.Max(1, right - left), - Height = Math.Max(1, top - bottom), - Reason = "Pattern match" - }); - } - } - - using var pigDoc = UglyToad.PdfPig.PdfDocument.Open(filePath); - for (int p = 1; p <= pigDoc.NumberOfPages; p++) - { - ct.ThrowIfCancellationRequested(); - var pigPage = pigDoc.GetPage(p); - double pageHeight = pigPage.Height; - var words = pigPage.GetWords().ToList(); - - if (patternWords.Length > 1) - { - for (int i = 0; i + patternWords.Length <= words.Count; i++) - { - bool match = true; - for (int k = 0; k < patternWords.Length; k++) - { - if (!string.Equals(words[i + k].Text, patternWords[k], comparison)) { match = false; break; } - } - if (match) - { - var matchedSubList = words.GetRange(i, patternWords.Length); - AddMatchRegions(p - 1, pageHeight, matchedSubList); - } - } - } - else if (patternWords.Length == 1) - { - foreach (var w in words) - { - if (w.Text.IndexOf(patternWords[0], comparison) >= 0) - { - AddMatchRegions(p - 1, pageHeight, new[] { w }); - } - } - } - } - - return regions; - }, ct); - } -} diff --git a/src/PdfEditorApp/Services/Tools/Security/QuestPdfOperationsEngine.cs b/src/PdfEditorApp/Services/Tools/Security/QuestPdfOperationsEngine.cs deleted file mode 100644 index f715fcd..0000000 --- a/src/PdfEditorApp/Services/Tools/Security/QuestPdfOperationsEngine.cs +++ /dev/null @@ -1,559 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Security.Cryptography; -using System.Text; -using System.Threading; -using System.Threading.Tasks; -using PdfEditorApp.Models; -using PdfEditorApp.Services.Tools.Core; -using QuestPDF.Fluent; - -namespace PdfEditorApp.Services.Tools.Security; - -/// -/// High-performance, extensible QuestPDF native operations engine. -/// Encapsulates native Skia/C++ document operations: -/// multi-document merging with range syntax, AES-256 encryption, decryption, -/// Fast Web View linearization, vector PDF overlays/underlays, attachments, and XMP metadata. -/// -public interface IQuestPdfOperationsEngine -{ - Task MergeAsync(MergeToolOptions options, IProgress? progress = null, CancellationToken ct = default); - Task EncryptAsync(SecurityToolOptions options, IProgress? progress = null, CancellationToken ct = default); - Task DecryptAsync(UnlockToolOptions options, IProgress? progress = null, CancellationToken ct = default); - Task LinearizeAsync(string inputPath, string outputPath, IProgress? progress = null, CancellationToken ct = default); - Task ApplyLayerAsync(string inputPath, string layerPdfPath, bool isOverlay, string targetPages, string? outputPath = null, IProgress? progress = null, CancellationToken ct = default); - Task AddAttachmentAsync(string inputPath, string attachmentFilePath, string? description = null, string? mimeType = null, DocumentOperation.DocumentAttachmentRelationship relationship = DocumentOperation.DocumentAttachmentRelationship.Unspecified, string? outputPath = null, IProgress? progress = null, CancellationToken ct = default); - Task ExtendMetadataAsync(string inputPath, string customXmpXml, string? outputPath = null, IProgress? progress = null, CancellationToken ct = default); -} - -public class QuestPdfOperationsEngine : IQuestPdfOperationsEngine -{ - public async Task MergeAsync(MergeToolOptions options, IProgress? progress = null, CancellationToken ct = default) - { - return await Task.Run(() => - { - if (options.InputFiles == null || options.InputFiles.Count == 0) - return new ToolExecutionResult { Success = false, ErrorMessage = "No input PDF files provided for merging." }; - - var validFiles = options.InputFiles.Where(File.Exists).ToList(); - if (validFiles.Count == 0) - return new ToolExecutionResult { Success = false, ErrorMessage = "None of the specified input PDF files exist." }; - - long totalOriginalBytes = validFiles.Sum(f => new FileInfo(f).Length); - string outPath = options.OutputFilePath; - if (string.IsNullOrWhiteSpace(outPath)) - { - string dir = Path.GetDirectoryName(validFiles[0]) ?? Path.GetTempPath(); - outPath = PdfFileHelper.ResolveSafeOutputPath(null, dir, "Merged_Document", ".pdf", validFiles); - } - - EnsureDirectoryExists(outPath); - progress?.Report(10.0); - ct.ThrowIfCancellationRequested(); - - try - { - string firstFile = validFiles[0]; - var op = DocumentOperation.LoadFile(firstFile); - - if (options.FilePageRanges != null && - options.FilePageRanges.TryGetValue(firstFile, out var firstRange) && - !string.IsNullOrWhiteSpace(firstRange)) - { - op = op.TakePages(firstRange); - } - - for (int i = 1; i < validFiles.Count; i++) - { - ct.ThrowIfCancellationRequested(); - string f = validFiles[i]; - string? range = null; - options.FilePageRanges?.TryGetValue(f, out range); - - op = string.IsNullOrWhiteSpace(range) - ? op.MergeFile(f) - : op.MergeFile(f, range); - - progress?.Report(10.0 + ((i + 1) / (double)validFiles.Count * 80.0)); - } - - op.Save(outPath); - progress?.Report(100.0); - - long outBytes = File.Exists(outPath) ? new FileInfo(outPath).Length : 0; - return new ToolExecutionResult - { - Success = true, - OutputFilePath = outPath, - OutputFiles = new List { outPath }, - OriginalSizeBytes = totalOriginalBytes, - OutputSizeBytes = outBytes, - Message = $"Successfully merged {validFiles.Count} files into {Path.GetFileName(outPath)} via QuestPDF Native Engine." - }; - } - catch (Exception ex) - { - return new ToolExecutionResult - { - Success = false, - ErrorMessage = $"QuestPDF document merge failed: {ex.Message}" - }; - } - }, ct); - } - - public async Task EncryptAsync(SecurityToolOptions options, IProgress? progress = null, CancellationToken ct = default) - { - return await Task.Run(() => - { - if (!File.Exists(options.InputFilePath)) - return new ToolExecutionResult { Success = false, ErrorMessage = "Input PDF file does not exist." }; - - long origBytes = new FileInfo(options.InputFilePath).Length; - progress?.Report(20.0); - ct.ThrowIfCancellationRequested(); - - string outPath = options.OutputFilePath; - if (string.IsNullOrWhiteSpace(outPath)) - { - string dir = Path.GetDirectoryName(options.InputFilePath) ?? ""; - string name = Path.GetFileNameWithoutExtension(options.InputFilePath); - outPath = Path.Combine(dir, $"{name}_Protected.pdf"); - } - - EnsureDirectoryExists(outPath); - - string userPwd = options.UserPassword ?? string.Empty; - string ownerPwd = options.OwnerPassword ?? string.Empty; - string? generatedOwnerPassword = null; - if (string.IsNullOrEmpty(ownerPwd) && !string.IsNullOrEmpty(userPwd)) - { - generatedOwnerPassword = GenerateRandomPassword(); - ownerPwd = generatedOwnerPassword; - } - - try - { - var op = DocumentOperation.LoadFile(options.InputFilePath); - switch (options.EncryptionLevel) - { - case PdfEncryptionLevel.Aes256Bit: - op = op.Encrypt(new DocumentOperation.Encryption256Bit - { - UserPassword = userPwd, - OwnerPassword = ownerPwd, - AllowPrinting = options.AllowPrinting, - AllowModification = options.AllowModifying, - AllowContentExtraction = options.AllowCopying, - AllowAnnotation = options.AllowAnnotating, - AllowFillingForms = options.AllowFormFilling, - AllowAssembly = options.AllowAssembly, - EncryptMetadata = options.EncryptMetadata - }); - break; - - case PdfEncryptionLevel.Aes128Bit: - op = op.Encrypt(new DocumentOperation.Encryption128Bit - { - UserPassword = userPwd, - OwnerPassword = ownerPwd, - AllowPrinting = options.AllowPrinting, - AllowModification = options.AllowModifying, - AllowContentExtraction = options.AllowCopying, - AllowAnnotation = options.AllowAnnotating, - AllowFillingForms = options.AllowFormFilling, - AllowAssembly = options.AllowAssembly, - EncryptMetadata = options.EncryptMetadata - }); - break; - - case PdfEncryptionLevel.Rc440Bit: - op = op.Encrypt(new DocumentOperation.Encryption40Bit - { - UserPassword = userPwd, - OwnerPassword = ownerPwd, - AllowPrinting = options.AllowPrinting, - AllowModification = options.AllowModifying, - AllowContentExtraction = options.AllowCopying, - AllowAnnotation = options.AllowAnnotating - }); - break; - } - - progress?.Report(85.0); - op.Save(outPath); - progress?.Report(100.0); - - long outBytes = File.Exists(outPath) ? new FileInfo(outPath).Length : 0; - string levelText = options.EncryptionLevel switch - { - PdfEncryptionLevel.Aes256Bit => "256-bit AES (QuestPDF Native)", - PdfEncryptionLevel.Aes128Bit => "128-bit AES", - _ => "40-bit Legacy" - }; - - return new ToolExecutionResult - { - Success = true, - OutputFilePath = outPath, - OutputFiles = new List { outPath }, - OriginalSizeBytes = origBytes, - OutputSizeBytes = outBytes, - Message = generatedOwnerPassword != null - ? $"Document successfully encrypted with {levelText} and secured with requested permission constraints. Generated owner password: {generatedOwnerPassword}" - : $"Document successfully encrypted with {levelText} and secured with requested permission constraints." - }; - } - catch (Exception ex) - { - return new ToolExecutionResult - { - Success = false, - ErrorMessage = $"QuestPDF encryption failed: {ex.Message}" - }; - } - }, ct); - } - - public async Task DecryptAsync(UnlockToolOptions options, IProgress? progress = null, CancellationToken ct = default) - { - return await Task.Run(() => - { - if (!File.Exists(options.InputFilePath)) - return new ToolExecutionResult { Success = false, ErrorMessage = "Input PDF file does not exist." }; - - long origBytes = new FileInfo(options.InputFilePath).Length; - progress?.Report(20.0); - ct.ThrowIfCancellationRequested(); - - string outPath = options.OutputFilePath; - if (string.IsNullOrWhiteSpace(outPath)) - { - string dir = Path.GetDirectoryName(options.InputFilePath) ?? ""; - string name = Path.GetFileNameWithoutExtension(options.InputFilePath); - outPath = Path.Combine(dir, $"{name}_Unlocked.pdf"); - } - - EnsureDirectoryExists(outPath); - - try - { - DocumentOperation - .LoadFile(options.InputFilePath, options.Password ?? string.Empty) - .Decrypt() - .RemoveRestrictions() - .Save(outPath); - - progress?.Report(100.0); - long outBytes = File.Exists(outPath) ? new FileInfo(outPath).Length : 0; - return new ToolExecutionResult - { - Success = true, - OutputFilePath = outPath, - OutputFiles = new List { outPath }, - OriginalSizeBytes = origBytes, - OutputSizeBytes = outBytes, - Message = "Security restrictions and passwords successfully removed via QuestPDF Native Engine. Output PDF is fully unlocked." - }; - } - catch (Exception ex) - { - return new ToolExecutionResult - { - Success = false, - ErrorMessage = $"Failed to unlock PDF via QuestPDF: {ex.Message}" - }; - } - }, ct); - } - - public async Task LinearizeAsync(string inputPath, string outputPath, IProgress? progress = null, CancellationToken ct = default) - { - return await Task.Run(() => - { - if (!File.Exists(inputPath)) - return new ToolExecutionResult { Success = false, ErrorMessage = "Input PDF file does not exist." }; - - long origBytes = new FileInfo(inputPath).Length; - progress?.Report(20.0); - ct.ThrowIfCancellationRequested(); - - string outPath = outputPath; - if (string.IsNullOrWhiteSpace(outPath)) - { - string dir = Path.GetDirectoryName(inputPath) ?? ""; - string name = Path.GetFileNameWithoutExtension(inputPath); - outPath = Path.Combine(dir, $"{name}_Linearized.pdf"); - } - - EnsureDirectoryExists(outPath); - - try - { - bool inPlace = string.Equals(Path.GetFullPath(inputPath), Path.GetFullPath(outPath), StringComparison.OrdinalIgnoreCase); - string saveTarget = outPath; - string? tempFile = null; - - if (inPlace) - { - string dir = Path.GetDirectoryName(outPath) ?? Path.GetTempPath(); - tempFile = Path.Combine(dir, $"quest_lin_temp_{Guid.NewGuid():N}.pdf"); - saveTarget = tempFile; - } - - DocumentOperation.LoadFile(inputPath).Linearize().Save(saveTarget); - - if (inPlace && tempFile != null && File.Exists(tempFile)) - { - File.Move(tempFile, outPath, overwrite: true); - } - - progress?.Report(100.0); - long outBytes = File.Exists(outPath) ? new FileInfo(outPath).Length : 0; - return new ToolExecutionResult - { - Success = true, - OutputFilePath = outPath, - OutputFiles = new List { outPath }, - OriginalSizeBytes = origBytes, - OutputSizeBytes = outBytes, - Message = $"Document successfully linearized for Fast Web View ({FormatFileSize(outBytes)}). Viewers can stream and display Page 1 immediately." - }; - } - catch (Exception ex) - { - return new ToolExecutionResult - { - Success = false, - ErrorMessage = $"QuestPDF linearization failed: {ex.Message}" - }; - } - }, ct); - } - - public async Task ApplyLayerAsync(string inputPath, string layerPdfPath, bool isOverlay, string targetPages, string? outputPath = null, IProgress? progress = null, CancellationToken ct = default) - { - return await Task.Run(() => - { - if (!File.Exists(inputPath)) - return new ToolExecutionResult { Success = false, ErrorMessage = "Input PDF file does not exist." }; - if (!File.Exists(layerPdfPath)) - return new ToolExecutionResult { Success = false, ErrorMessage = "Layer/Letterhead PDF file does not exist." }; - - long origBytes = new FileInfo(inputPath).Length; - progress?.Report(20.0); - ct.ThrowIfCancellationRequested(); - - string outPath = outputPath ?? string.Empty; - if (string.IsNullOrWhiteSpace(outPath)) - { - string dir = Path.GetDirectoryName(inputPath) ?? ""; - string name = Path.GetFileNameWithoutExtension(inputPath); - string suffix = isOverlay ? "Overlay" : "Underlay"; - outPath = Path.Combine(dir, $"{name}_{suffix}.pdf"); - } - - EnsureDirectoryExists(outPath); - - try - { - var layerConfig = new DocumentOperation.LayerConfiguration - { - FilePath = layerPdfPath, - TargetPages = string.IsNullOrWhiteSpace(targetPages) ? "1-z" : targetPages, - SourcePages = "1", - RepeatSourcePages = "1" - }; - - var op = DocumentOperation.LoadFile(inputPath); - op = isOverlay ? op.OverlayFile(layerConfig) : op.UnderlayFile(layerConfig); - - progress?.Report(80.0); - op.Save(outPath); - progress?.Report(100.0); - - long outBytes = File.Exists(outPath) ? new FileInfo(outPath).Length : 0; - string layerType = isOverlay ? "Overlay" : "Letterhead / Underlay"; - return new ToolExecutionResult - { - Success = true, - OutputFilePath = outPath, - OutputFiles = new List { outPath }, - OriginalSizeBytes = origBytes, - OutputSizeBytes = outBytes, - Message = $"Successfully applied {layerType} PDF to '{Path.GetFileName(outPath)}' via QuestPDF Native Engine." - }; - } - catch (Exception ex) - { - return new ToolExecutionResult - { - Success = false, - ErrorMessage = $"Failed to apply PDF layer: {ex.Message}" - }; - } - }, ct); - } - - public async Task AddAttachmentAsync( - string inputPath, - string attachmentFilePath, - string? description = null, - string? mimeType = null, - DocumentOperation.DocumentAttachmentRelationship relationship = DocumentOperation.DocumentAttachmentRelationship.Unspecified, - string? outputPath = null, - IProgress? progress = null, - CancellationToken ct = default) - { - return await Task.Run(() => - { - if (!File.Exists(inputPath)) - return new ToolExecutionResult { Success = false, ErrorMessage = "Input PDF file does not exist." }; - if (!File.Exists(attachmentFilePath)) - return new ToolExecutionResult { Success = false, ErrorMessage = "Attachment file does not exist." }; - - long origBytes = new FileInfo(inputPath).Length; - progress?.Report(20.0); - ct.ThrowIfCancellationRequested(); - - string outPath = outputPath ?? string.Empty; - if (string.IsNullOrWhiteSpace(outPath)) - { - string dir = Path.GetDirectoryName(inputPath) ?? ""; - string name = Path.GetFileNameWithoutExtension(inputPath); - outPath = Path.Combine(dir, $"{name}_Attached.pdf"); - } - - EnsureDirectoryExists(outPath); - - try - { - var attach = new DocumentOperation.DocumentAttachment - { - FilePath = attachmentFilePath, - AttachmentName = Path.GetFileName(attachmentFilePath), - Description = description ?? "Embedded supporting document", - MimeType = mimeType ?? "application/octet-stream", - Relationship = relationship, - CreationDate = DateTime.UtcNow, - ModificationDate = DateTime.UtcNow, - Replace = true - }; - - DocumentOperation - .LoadFile(inputPath) - .AddAttachment(attach) - .Save(outPath); - - progress?.Report(100.0); - long outBytes = File.Exists(outPath) ? new FileInfo(outPath).Length : 0; - return new ToolExecutionResult - { - Success = true, - OutputFilePath = outPath, - OutputFiles = new List { outPath }, - OriginalSizeBytes = origBytes, - OutputSizeBytes = outBytes, - Message = $"Successfully embedded attachment '{Path.GetFileName(attachmentFilePath)}' ({relationship}) via QuestPDF Native Engine." - }; - } - catch (Exception ex) - { - return new ToolExecutionResult - { - Success = false, - ErrorMessage = $"Failed to embed attachment: {ex.Message}" - }; - } - }, ct); - } - - public async Task ExtendMetadataAsync( - string inputPath, - string customXmpXml, - string? outputPath = null, - IProgress? progress = null, - CancellationToken ct = default) - { - return await Task.Run(() => - { - if (!File.Exists(inputPath)) - return new ToolExecutionResult { Success = false, ErrorMessage = "Input PDF file does not exist." }; - if (string.IsNullOrWhiteSpace(customXmpXml)) - return new ToolExecutionResult { Success = false, ErrorMessage = "No custom XMP metadata XML provided." }; - - long origBytes = new FileInfo(inputPath).Length; - progress?.Report(20.0); - ct.ThrowIfCancellationRequested(); - - string outPath = outputPath ?? string.Empty; - if (string.IsNullOrWhiteSpace(outPath)) - { - string dir = Path.GetDirectoryName(inputPath) ?? ""; - string name = Path.GetFileNameWithoutExtension(inputPath); - outPath = Path.Combine(dir, $"{name}_ExtendedXmp.pdf"); - } - - EnsureDirectoryExists(outPath); - - try - { - DocumentOperation - .LoadFile(inputPath) - .ExtendMetadata(customXmpXml) - .Save(outPath); - - progress?.Report(100.0); - long outBytes = File.Exists(outPath) ? new FileInfo(outPath).Length : 0; - return new ToolExecutionResult - { - Success = true, - OutputFilePath = outPath, - OutputFiles = new List { outPath }, - OriginalSizeBytes = origBytes, - OutputSizeBytes = outBytes, - Message = "Successfully extended document XMP metadata via QuestPDF Native Engine." - }; - } - catch (Exception ex) - { - return new ToolExecutionResult - { - Success = false, - ErrorMessage = $"Failed to extend metadata: {ex.Message}" - }; - } - }, ct); - } - - private static void EnsureDirectoryExists(string filePath) - { - string? dir = Path.GetDirectoryName(filePath); - if (!string.IsNullOrEmpty(dir) && !Directory.Exists(dir)) - { - Directory.CreateDirectory(dir); - } - } - - private static string GenerateRandomPassword(int length = 20) - { - const string chars = "ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz23456789!@#$%^&*"; - var bytes = RandomNumberGenerator.GetBytes(length); - var sb = new StringBuilder(length); - foreach (var b in bytes) - { - sb.Append(chars[b % chars.Length]); - } - return sb.ToString(); - } - - private static string FormatFileSize(long bytes) - { - if (bytes < 1024) return $"{bytes} B"; - if (bytes < 1024 * 1024) return $"{bytes / 1024.0:F1} KB"; - return $"{bytes / (1024.0 * 1024.0):F2} MB"; - } -} diff --git a/src/PdfEditorApp/Services/Typography/RichTextHelper.cs b/src/PdfEditorApp/Services/Typography/RichTextHelper.cs deleted file mode 100644 index 6bea7dc..0000000 --- a/src/PdfEditorApp/Services/Typography/RichTextHelper.cs +++ /dev/null @@ -1,732 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Text; -using System.Text.RegularExpressions; -using PdfEditorApp.Core.Models.Elements; - -namespace PdfEditorApp.Services.Typography; - -/// -/// High-performance parser and serializer for rich text formatting. -/// Translates between inline Markdown/HTML tags, plain text, and structured runs. -/// -public static class RichTextHelper -{ - private static readonly Regex ColorTagRegex = new(@"[#\w\d]+)>(?.*?)", RegexOptions.IgnoreCase | RegexOptions.Singleline | RegexOptions.Compiled); - private static readonly Regex UnderlineTagRegex = new(@"(?.*?)", RegexOptions.IgnoreCase | RegexOptions.Singleline | RegexOptions.Compiled); - private static readonly Regex LinkTagRegex = new(@"\[(?", EscapeXml(span.Text)); - } - sb.Append(""); - } - else - { - string escText = EscapeXml(line.Text); - sb.AppendFormat(Ci, "{0}", escText); - } - - // Double underline vector line if requested - if (el.IsDoubleUnderline) - { - double uY1 = line.BaselineY + 2; - double uY2 = line.BaselineY + 5; - sb.AppendFormat(Ci, "", line.X, uY1, line.X + line.Width, fontColor); - sb.AppendFormat(Ci, "", line.X, uY2, line.X + line.Width, fontColor); - } - } - } - else if (el.ShapeMode == TextShapeMode.BezierCurve) - { - var bezierLayout = CalculateBezierGlyphs( - el.Text, - el.FontFamily, - el.FontSize, - el.IsBold, - el.IsItalic, - el.Width, - el.Height, - new Point(el.BezierP0X, el.BezierP0Y), - new Point(el.BezierP1X, el.BezierP1Y), - new Point(el.BezierP2X, el.BezierP2Y), - new Point(el.BezierP3X, el.BezierP3Y), - el.CurveInvert, - el.CharacterSpacing, - el.BaselineShift - ); - - foreach (var g in bezierLayout.Glyphs) - { - string escChar = EscapeXml(g.Text); - sb.AppendFormat(Ci, "{0}", escChar); - } - } - else // Curved or Circular Mode - { - var curvedLayout = CalculateCurvedGlyphs( - el.Text, - el.FontFamily, - el.FontSize, - el.IsBold, - el.IsItalic, - el.Width, - el.Height, - el.CurveRadius, - el.CurveArcAngle, - el.CurveStartAngle, - el.CurveClockwise, - el.CurveInvert, - el.CharacterSpacing, - el.CircularPlacement, - el.ShapeMode, - el.BaselineShift - ); - - foreach (var g in curvedLayout.Glyphs) - { - string escChar = EscapeXml(g.Text); - sb.AppendFormat(Ci, "{0}", escChar); - } - } - - sb.Append(""); - sb.Append(""); - - return sb.ToString(); - } - - private static string EscapeXml(string unescaped) - { - if (string.IsNullOrEmpty(unescaped)) return ""; - return unescaped - .Replace("&", "&") - .Replace("<", "<") - .Replace(">", ">") - .Replace("\"", """) - .Replace("'", "'"); - } -} diff --git a/src/PdfEditorApp/Services/UiSettingsService.cs b/src/PdfEditorApp/Services/UiSettingsService.cs deleted file mode 100644 index 0ab2da1..0000000 --- a/src/PdfEditorApp/Services/UiSettingsService.cs +++ /dev/null @@ -1,119 +0,0 @@ -using System; -using System.IO; -using System.Text.Json; -using System.Text.Json.Serialization; -using PdfEditorApp.Models; - -namespace PdfEditorApp.Services; - -/// -/// Default implementation of with JSON persistence. -/// -public class UiSettingsService : IUiSettingsService -{ - private readonly string _settingsFilePath; - private UiSettingsModel _settings; - private readonly object _lock = new(); - - private static readonly JsonSerializerOptions JsonOptions = new() - { - WriteIndented = true, - PropertyNameCaseInsensitive = true, - AllowTrailingCommas = true, - ReadCommentHandling = JsonCommentHandling.Skip, - Converters = { new JsonStringEnumConverter() } - }; - - public UiSettingsModel Settings - { - get - { - lock (_lock) - { - return _settings; - } - } - } - - public event Action? SettingsChanged; - - public UiSettingsService(string? customSettingsFilePath = null) - { - _settingsFilePath = customSettingsFilePath ?? GetDefaultSettingsFilePath(); - _settings = LoadSettings(); - } - - public static string GetDefaultSettingsFilePath() - { - return Path.Combine(ThemeService.GetSettingsDirectory(), "ui_settings.json"); - } - - private UiSettingsModel LoadSettings() - { - try - { - if (File.Exists(_settingsFilePath)) - { - var json = File.ReadAllText(_settingsFilePath); - var loaded = JsonSerializer.Deserialize(json, JsonOptions); - if (loaded != null) - { - return loaded; - } - } - } - catch - { - // Gracefully fall back to defaults if file is corrupt or unreadable - } - - return new UiSettingsModel(); - } - - public void Save() - { - lock (_lock) - { - try - { - _settings.UpdatedAt = DateTime.UtcNow; - var dir = Path.GetDirectoryName(_settingsFilePath); - if (!string.IsNullOrEmpty(dir) && !Directory.Exists(dir)) - { - Directory.CreateDirectory(dir); - } - - var json = JsonSerializer.Serialize(_settings, JsonOptions); - File.WriteAllText(_settingsFilePath, json); - } - catch - { - // Never crash the UI on disk write failure - } - } - - SettingsChanged?.Invoke(Settings); - } - - public void UpdateSettings(Action updateAction) - { - ArgumentNullException.ThrowIfNull(updateAction); - - lock (_lock) - { - updateAction(_settings); - } - - Save(); - } - - public void ResetToDefaults() - { - lock (_lock) - { - _settings = new UiSettingsModel(); - } - - Save(); - } -} diff --git a/src/PdfEditorApp/Services/UndoRedoService.cs b/src/PdfEditorApp/Services/UndoRedoService.cs deleted file mode 100644 index 63b35a2..0000000 --- a/src/PdfEditorApp/Services/UndoRedoService.cs +++ /dev/null @@ -1,140 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; - -namespace PdfEditorApp.Services; - -public interface IUndoRedoService -{ - bool CanUndo { get; } - bool CanRedo { get; } - string? NextUndoDescription { get; } - string? NextRedoDescription { get; } - event EventHandler? StateChanged; - - void RecordAction(string description, Action undoAction, Action redoAction, Action? onDiscarded = null); - string? Undo(); - string? Redo(); - void Clear(); -} - -public class UndoRedoAction -{ - public string Description { get; set; } = ""; - public Action UndoAction { get; set; } = () => { }; - public Action RedoAction { get; set; } = () => { }; - - /// - /// Optional cleanup fired only when this action is discarded while it represents a - /// deleted (currently off-canvas) element — capacity eviction from the undo list, or a - /// full on document teardown. Never fired for the - /// automatic redo-stack clear on a new action, since a discarded redo-side delete means - /// the element was already restored and is currently visible. - /// - public Action? OnDiscarded { get; set; } -} - -public class UndoRedoService : IUndoRedoService -{ - private readonly LinkedList _undoList = new(); - private readonly Stack _redoStack = new(); - private const int MaxHistorySize = 100; - - public bool CanUndo => _undoList.Count > 0; - public bool CanRedo => _redoStack.Count > 0; - - public string? NextUndoDescription => _undoList.Last?.Value.Description; - public string? NextRedoDescription => _redoStack.Count > 0 ? _redoStack.Peek().Description : null; - - public event EventHandler? StateChanged; - - public void RecordAction(string description, Action undoAction, Action redoAction, Action? onDiscarded = null) - { - if (_undoList.Count >= MaxHistorySize) - { - DiscardAction(_undoList.First!.Value); - _undoList.RemoveFirst(); - } - - _undoList.AddLast(new UndoRedoAction - { - Description = description, - UndoAction = undoAction, - RedoAction = redoAction, - OnDiscarded = onDiscarded - }); - - _redoStack.Clear(); - StateChanged?.Invoke(this, EventArgs.Empty); - } - - private static void DiscardAction(UndoRedoAction action) - { - try - { - action.OnDiscarded?.Invoke(); - } - catch (Exception ex) - { - Debug.WriteLine($"[UndoRedoService] Error during OnDiscarded '{action.Description}': {ex}"); - } - } - - public string? Undo() - { - if (_undoList.Count == 0) return null; - - var node = _undoList.Last!; - _undoList.RemoveLast(); - var action = node.Value; - - try - { - action.UndoAction(); - } - catch (Exception ex) - { - Debug.WriteLine($"[UndoRedoService] Error during Undo '{action.Description}': {ex}"); - } - - _redoStack.Push(action); - StateChanged?.Invoke(this, EventArgs.Empty); - return action.Description; - } - - public string? Redo() - { - if (_redoStack.Count == 0) return null; - - var action = _redoStack.Pop(); - try - { - action.RedoAction(); - } - catch (Exception ex) - { - Debug.WriteLine($"[UndoRedoService] Error during Redo '{action.Description}': {ex}"); - } - - _undoList.AddLast(action); - StateChanged?.Invoke(this, EventArgs.Empty); - return action.Description; - } - - public void Clear() - { - // Document teardown: anything still holding a deleted element's resources (e.g. a - // decoded chart/image bitmap) is about to become unreachable anyway, since the whole - // document is being replaced — release it now instead of waiting on the GC. The redo - // stack is intentionally left alone: any delete sitting there was already undone, so - // the element it refers to is currently live elsewhere on the page. - foreach (var action in _undoList) - { - DiscardAction(action); - } - - _undoList.Clear(); - _redoStack.Clear(); - StateChanged?.Invoke(this, EventArgs.Empty); - } -} diff --git a/src/PdfEditorApp/Styles/FluentOfficeStyles.axaml b/src/PdfEditorApp/Styles/FluentOfficeStyles.axaml deleted file mode 100644 index ef48735..0000000 --- a/src/PdfEditorApp/Styles/FluentOfficeStyles.axaml +++ /dev/null @@ -1,670 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Styles/Material3ExpressiveStyles.axaml b/src/PdfEditorApp/Styles/Material3ExpressiveStyles.axaml deleted file mode 100644 index 2a46642..0000000 --- a/src/PdfEditorApp/Styles/Material3ExpressiveStyles.axaml +++ /dev/null @@ -1,851 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Styles/Material3ExpressiveTokens.axaml b/src/PdfEditorApp/Styles/Material3ExpressiveTokens.axaml deleted file mode 100644 index b493d67..0000000 --- a/src/PdfEditorApp/Styles/Material3ExpressiveTokens.axaml +++ /dev/null @@ -1,406 +0,0 @@ - - - - - - - - 0 - 4 - 8 - 12 - 16 - 28 - 9999 - - - 12,12,0,0 - 0,0,12,12 - 9999,0,0,9999 - 0,9999,9999,0 - - - 10 - 0 - 0 - 26 - 26 - 22 - 22 - 22 - 22 - 11 - 11 - - - avares://PdfEditorApp/Assets/Fonts#Roboto, avares://PdfEditorApp/Assets/Fonts#Inter, Segoe UI, -apple-system, BlinkMacSystemFont, 'SF Pro Text', sans-serif - avares://PdfEditorApp/Assets/Fonts#Roboto, Segoe UI, sans-serif - avares://PdfEditorApp/Assets/Fonts#FiraCode, avares://PdfEditorApp/Assets/Fonts#RobotoMono, Consolas, monospace - - 57 - 45 - 36 - 32 - 28 - 24 - 22 - 16 - 14 - 16 - 14 - 12 - 14 - 12 - 11 - - - 0 0 0 transparent - 0 1 3 #14000000, 0 1 2 #1E000000 - 0 2 6 #16000000, 0 4 8 #1C000000 - 0 4 12 #1A000000, 0 8 20 #20000000 - 0 6 18 #1E000000, 0 12 28 #22000000 - 0 8 24 #22000000, 0 16 36 #26000000 - - 0 8 24 #28000000, 0 24 64 #48000000 - - - - - - - - - - #1E5EEB - #FFFFFF - #E0EAFF - #001A42 - - - #4A607A - #FFFFFF - #D7E3F8 - #081D33 - - - #E05D38 - #FFFFFF - #FFDBD0 - #380D03 - - - #BA1A1A - #FFFFFF - #FFDAD6 - #410002 - - #198754 - #FFFFFF - #D1E7DD - #0A3622 - - #D97706 - #FFFFFF - #FEF3C7 - #78350F - - - #F8FAFD - #D9E2EC - #FFFFFF - #FFFFFF - #F1F5F9 - #E9EEF6 - #E1E8F2 - #D7E1EE - - - #191C20 - #44474E - #74777F - #C4C7D0 - #2E3135 - #F0F1F5 - #A8C7FA - #52000000 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #F8FAFD - #FFFFFF - #FFFFFF - #F1F5F9 - #E2E8F0 - #EDF2F7 - #EBF2FD - #D7E3F8 - #E0EAFF - #191C20 - #5B6471 - #8E97A6 - #1E5EEB - #1548B8 - #E0EAFF - #A8C7FA - #BA1A1A - #FFDAD6 - #FFB4AB - #198754 - #D1E7DD - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #A8C7FA - #062E6F - #0F387D - #D3E3FD - - - #BDC7DC - #273142 - #343E4E - #D9E3F8 - - - #FFB4A1 - #581E10 - #6C2C1E - #FFDBD0 - - - #FFB4AB - #690005 - #93000A - #FFDAD6 - - #75D59A - #00391A - #0F5229 - #A8F5C1 - - #FBBF24 - #451A03 - #78350F - #FEF3C7 - - - #101317 - #0D1013 - #343940 - #0B0E11 - #161A1F - #1C2128 - #252C36 - #2F3743 - - - #E2E2E6 - #9BA1AD - #8E919A - #3D4450 - #E2E2E6 - #191C20 - #1E5EEB - #80000000 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #101317 - #161A1F - #1C2128 - #0B0E11 - #2F3743 - #202630 - #252C36 - #343E4E - #182338 - #F8FAFC - #9BA1AD - #647082 - #A8C7FA - #7AA9F8 - #0F387D - #4D8DF7 - #FFB4AB - #4E0003 - #93000A - #75D59A - #0F5229 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Templates/Academic/AcademicPaperTemplate.cs b/src/PdfEditorApp/Templates/Academic/AcademicPaperTemplate.cs deleted file mode 100644 index 6070a97..0000000 --- a/src/PdfEditorApp/Templates/Academic/AcademicPaperTemplate.cs +++ /dev/null @@ -1,707 +0,0 @@ -using System.Collections.Generic; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; - -namespace PdfEditorApp.Templates.Academic; - -public class AcademicPaperTemplate : ITemplateDefinition -{ - public string Id => "academic"; - public string Name => "Academic Research Paper"; - public string Description => "Full 2-page peer-reviewed research paper with mathematical equations, benchmark data table, author bios, and citations"; - public string Category => "Academic"; - public string IconKind => "BookOpenPageVariantOutline"; - public string AccentColorHex => "#D97706"; - - public PdfDocumentModel Create() - { - var doc = new PdfDocumentModel - { - Title = "Research_Paper_Vector_Graphics_2026.pdf", - Author = "Dr. John Doe, Jane Doe, and Alex Doe", - Subject = "High-Performance Cross-Platform Desktop Vector Rendering" - }; - - // ========================================================================= - // PAGE 1: Title, Authors, Abstract, Introduction & Mathematical Theory - // ========================================================================= - var page1 = new PdfPageModel - { - PageNumber = 1, - Format = PageFormat.A4, - Orientation = PageOrientation.Portrait, - Width = 800, - Height = 1131, - BackgroundColorHex = "#FFFFFF", - FooterLeft = "IEEE TRANSACTIONS ON SOFTWARE ENGINEERING • ISSN 0098-5589 • DOI: 10.1109/TSE.2026.892014", - FooterRight = "Page 1 of 2", - Elements = new List - { - // Top Header Metadata Strip - new PdfTextElement - { - X = 55, - Y = 32, - Width = 690, - Height = 18, - Text = "IEEE TRANSACTIONS ON SOFTWARE ENGINEERING, VOL. 52, NO. 4, AUGUST 2026", - FontSize = 8.5, - FontFamily = "Times New Roman", - TextColorHex = "#64748B", - Alignment = TextAlignmentMode.Center - }, - new PdfDividerElement - { - X = 55, - Y = 52, - Width = 690, - Height = 1, - Thickness = 0.75, - ColorHex = "#CBD5E1" - }, - - // Main Paper Title - new PdfTextElement - { - X = 55, - Y = 58, - Width = 690, - Height = 48, - Text = "High-Performance Cross-Platform Vector Graphics Architecture in Modern .NET Environments", - FontSize = 17, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#0F172A", - Alignment = TextAlignmentMode.Center - }, - - // Authors & Institutional Affiliation - new PdfTextElement - { - X = 55, - Y = 108, - Width = 690, - Height = 34, - Text = "John Doe, Ph.D.¹, Jane Doe, M.Sc.², Alex Doe, Ph.D.¹\n¹Institute for Advanced Computing, CodeFryDev Institute • ²Department of Computer Science, CodeFryDev University", - FontSize = 9.5, - FontFamily = "Times New Roman", - TextColorHex = "#334155", - Alignment = TextAlignmentMode.Center - }, - - // Abstract & Keywords Callout Card - new PdfShapeElement - { - X = 75, - Y = 145, - Width = 650, - Height = 104, - CornerRadius = 4, - FillColorHex = "#F8FAFC", - StrokeColorHex = "#E2E8F0", - StrokeThickness = 1 - }, - new PdfTextElement - { - X = 90, - Y = 150, - Width = 620, - Height = 68, - Text = "Abstract— We present a unified, hardware-accelerated rendering pipeline for interactive desktop publishing software running on Avalonia and SkiaSharp within .NET 9. By decoupling scene graph state from rendering primitives and implementing a zero-allocation spatial indexing tree, we achieve a 4.2× reduction in garbage collection stalls and consistent 60 FPS multi-touch canvas manipulation across Windows, macOS, and Linux.", - FontSize = 9, - FontFamily = "Times New Roman", - IsItalic = true, - LineHeight = 1.35, - TextColorHex = "#1E293B", - Alignment = TextAlignmentMode.Justify - }, - new PdfTextElement - { - X = 90, - Y = 222, - Width = 620, - Height = 22, - Text = "Index Terms— Vector graphics, SkiaSharp, Avalonia UI, cross-platform publishing, GPU shaders, garbage collection.", - FontSize = 8.5, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#0F6CBD" - }, - - // Column Split Divider - new PdfDividerElement - { - X = 55, - Y = 254, - Width = 690, - Height = 1, - Thickness = 1, - ColorHex = "#CBD5E1" - }, - - // ========================================== - // COLUMN 1 (Left: X = 55, Width = 330) - // ========================================== - new PdfTextElement - { - X = 55, - Y = 262, - Width = 330, - Height = 22, - Text = "I. INTRODUCTION", - FontSize = 11, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#0F172A" - }, - new PdfTextElement - { - X = 55, - Y = 286, - Width = 330, - Height = 135, - Text = "Desktop publishing workflows impose rigorous demands on color space management, sub-pixel glyph rasterization, and interactive transform matrices [1]. Historically, applications relied on platform-specific APIs such as Direct2D on Windows and CoreGraphics on macOS, leading to divergent rendering artifacts and doubled maintenance overhead. Our framework leverages Skia-backed hardware surfaces unified under a reactive MVVM state model.", - FontSize = 9.5, - FontFamily = "Times New Roman", - LineHeight = 1.35, - TextColorHex = "#334155", - Alignment = TextAlignmentMode.Justify - }, - - new PdfTextElement - { - X = 55, - Y = 425, - Width = 330, - Height = 22, - Text = "II. MATHEMATICAL FORMULATION", - FontSize = 11, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#0F172A" - }, - new PdfTextElement - { - X = 55, - Y = 449, - Width = 330, - Height = 70, - Text = "Let Ω ⊂ ℝ² define the bounded document viewport. For each vector primitive P_i with boundary curve ∂P_i, the continuous antialiased rasterization intensity I(p) at coordinate p = (x, y) is governed by the signed distance field filter:", - FontSize = 9.5, - FontFamily = "Times New Roman", - LineHeight = 1.35, - TextColorHex = "#334155", - Alignment = TextAlignmentMode.Justify - }, - - // Formal Equation Box 1 - new PdfShapeElement - { - X = 55, - Y = 522, - Width = 330, - Height = 36, - CornerRadius = 3, - FillColorHex = "#F1F5F9", - StrokeColorHex = "#CBD5E1", - StrokeThickness = 0.5 - }, - new PdfTextElement - { - X = 65, - Y = 528, - Width = 310, - Height = 24, - Text = "I(p) = clamp( 1/2 - dist(p, ∂P_i) / w_pixel, 0, 1 ) (1)", - FontSize = 9.5, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#0F172A", - Alignment = TextAlignmentMode.Center - }, - - new PdfTextElement - { - X = 55, - Y = 562, - Width = 330, - Height = 120, - Text = "Equation (1) enables constant-time sub-pixel coverage evaluation per fragment without requiring expensive multi-sample supersampling (MSAA) buffers [2]. The spatial complexity of the scene bounding hierarchy scales logarithmically with depth: O(log N) for hit testing across N = 10⁴ interactive vector shapes.", - FontSize = 9.5, - FontFamily = "Times New Roman", - LineHeight = 1.35, - TextColorHex = "#334155", - Alignment = TextAlignmentMode.Justify - }, - - new PdfTextElement - { - X = 55, - Y = 686, - Width = 330, - Height = 22, - Text = "III. SCENE GRAPH & ZERO-COPY BUFFERING", - FontSize = 11, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#0F172A" - }, - new PdfTextElement - { - X = 55, - Y = 710, - Width = 330, - Height = 145, - Text = "Managed runtime garbage collection cycles introduce non-deterministic micro-stutters during 60 Hz drag-and-drop operations. To overcome this, our scene graph uses contiguous struct spans (ReadOnlySpan) allocated through unmanaged NativeMemory pools. Viewport updates trigger differential buffer invalidations rather than total scene reconstructs.", - FontSize = 9.5, - FontFamily = "Times New Roman", - LineHeight = 1.35, - TextColorHex = "#334155", - Alignment = TextAlignmentMode.Justify - }, - - new PdfTextElement - { - X = 55, - Y = 858, - Width = 330, - Height = 22, - Text = "IV. ADAPTIVE SHADER RASTERIZATION", - FontSize = 11, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#0F172A" - }, - new PdfTextElement - { - X = 55, - Y = 882, - Width = 330, - Height = 120, - Text = "On high-DPI displays (Apple Retina and 4K Windows monitors), pixel fill rate dominates frame time. We introduce an adaptive tessellation shader that subdivides cubic Bézier curves based on local curvature κ(t) = |x'y'' - y'x''| / (x'^2 + y'^2)^{3/2}, minimizing emitted vertex counts.", - FontSize = 9.5, - FontFamily = "Times New Roman", - LineHeight = 1.35, - TextColorHex = "#334155", - Alignment = TextAlignmentMode.Justify - }, - - // ========================================== - // COLUMN 2 (Right: X = 415, Width = 330) - // ========================================== - new PdfTextElement - { - X = 415, - Y = 262, - Width = 330, - Height = 22, - Text = "V. GPU PIPELINE & BACKEND TOPOLOGY", - FontSize = 11, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#0F172A" - }, - new PdfTextElement - { - X = 415, - Y = 286, - Width = 330, - Height = 135, - Text = "The backend abstracts DirectX 12 on Windows, Metal on macOS, and Vulkan on Linux through Skia's GRContext handle. Document layout matrices are pre-computed in SIMD registers (Vector256), which batches up to 1,024 vector paths into a single GPU draw call invocation.", - FontSize = 9.5, - FontFamily = "Times New Roman", - LineHeight = 1.35, - TextColorHex = "#334155", - Alignment = TextAlignmentMode.Justify - }, - - new PdfTextElement - { - X = 415, - Y = 425, - Width = 330, - Height = 22, - Text = "VI. EMPIRICAL BENCHMARK EVALUATION", - FontSize = 11, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#0F172A" - }, - new PdfTextElement - { - X = 415, - Y = 449, - Width = 330, - Height = 55, - Text = "We evaluated rendering throughput across 1,000 synthetic multi-layer vector documents containing complex paths, radial gradients, and typography on Apple M3 Max (Metal) and Intel Core i9 (DirectX 12).", - FontSize = 9.5, - FontFamily = "Times New Roman", - LineHeight = 1.35, - TextColorHex = "#334155", - Alignment = TextAlignmentMode.Justify - }, - - // Benchmark Data Table - new PdfTableElement - { - X = 415, - Y = 508, - Width = 330, - Height = 165, - Headers = new List { "Framework", "FPS", "RAM", "P99 GC", "Draw Lat." }, - Rows = new List> - { - new() { "WPF Direct2D", "34.2", "420 MB", "18.4 ms", "4.2 ms" }, - new() { "Web Electron", "28.5", "680 MB", "24.1 ms", "6.8 ms" }, - new() { "Qt QPainter", "52.1", "210 MB", "0.0 ms", "1.9 ms" }, - new() { "Proposed .NET 9", "59.8", "148 MB", "1.2 ms", "0.8 ms" } - }, - HeaderBackgroundHex = "#0F6CBD", - HeaderTextHex = "#FFFFFF", - AlternateRowBackgroundHex = "#F8FAFC", - BorderColorHex = "#CBD5E1" - }, - - new PdfTextElement - { - X = 415, - Y = 686, - Width = 330, - Height = 22, - Text = "VII. MEMORY PRESSURE & CACHE COHERENCE", - FontSize = 11, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#0F172A" - }, - new PdfTextElement - { - X = 415, - Y = 710, - Width = 330, - Height = 145, - Text = "As documented in Table I, the zero-allocation pipeline avoids Gen2 GC collections during rapid zooming and pan gestures. Cache miss rates for the spatial R-tree dropped from 14.2% in pointer-heavy structures to 2.1% in flat contiguous memory blocks.", - FontSize = 9.5, - FontFamily = "Times New Roman", - LineHeight = 1.35, - TextColorHex = "#334155", - Alignment = TextAlignmentMode.Justify - }, - - new PdfTextElement - { - X = 415, - Y = 858, - Width = 330, - Height = 22, - Text = "VIII. ACKNOWLEDGMENTS", - FontSize = 11, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#0F172A" - }, - new PdfTextElement - { - X = 415, - Y = 882, - Width = 330, - Height = 120, - Text = "This research was supported by National Science Foundation Grant CCF-2490182, the MIT Center for Advanced Computing, and the Open Source Cross-Platform Software Foundation. Hardware testbeds were generously provided by Microsoft Corporation and Apple Computer.", - FontSize = 9, - FontFamily = "Times New Roman", - LineHeight = 1.35, - TextColorHex = "#475569", - Alignment = TextAlignmentMode.Justify - } - } - }; - - // ========================================================================= - // PAGE 2: Discussion, Multi-Device Scalability, Author Bios & References - // ========================================================================= - var page2 = new PdfPageModel - { - PageNumber = 2, - Format = PageFormat.A4, - Orientation = PageOrientation.Portrait, - Width = 800, - Height = 1131, - BackgroundColorHex = "#FFFFFF", - FooterLeft = "IEEE TRANSACTIONS ON SOFTWARE ENGINEERING • VOL. 52, NO. 4", - FooterRight = "Page 2 of 2", - Elements = new List - { - // Top Header Metadata Strip - new PdfTextElement - { - X = 55, - Y = 32, - Width = 690, - Height = 18, - Text = "VANCE ET AL.: HIGH-PERFORMANCE VECTOR GRAPHICS ARCHITECTURE IN .NET", - FontSize = 8.5, - FontFamily = "Times New Roman", - TextColorHex = "#64748B", - Alignment = TextAlignmentMode.Center - }, - new PdfDividerElement - { - X = 55, - Y = 52, - Width = 690, - Height = 1, - Thickness = 0.75, - ColorHex = "#CBD5E1" - }, - - // ========================================== - // COLUMN 1 (Left: X = 55, Width = 330) - // ========================================== - new PdfTextElement - { - X = 55, - Y = 62, - Width = 330, - Height = 22, - Text = "IX. EXTENSIBILITY & VECTOR PLUGINS", - FontSize = 11, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#0F172A" - }, - new PdfTextElement - { - X = 55, - Y = 86, - Width = 330, - Height = 130, - Text = "Our architecture exposes a modular interface IPdfElementRenderer enabling custom procedural shaders, SVG path decoders, and hardware-accelerated QR matrix synthesis. Because element state is decoupled from rendering logic, extensions can execute on worker threads using task parallelism without acquiring UI thread locks [3].", - FontSize = 9.5, - FontFamily = "Times New Roman", - LineHeight = 1.35, - TextColorHex = "#334155", - Alignment = TextAlignmentMode.Justify - }, - - new PdfTextElement - { - X = 55, - Y = 222, - Width = 330, - Height = 22, - Text = "X. MULTI-DEVICE RESPONSIVE LATENCY", - FontSize = 11, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#0F172A" - }, - new PdfTextElement - { - X = 55, - Y = 246, - Width = 330, - Height = 65, - Text = "Table II benchmarks touch drag latency across diverse hardware form factors (Apple Silicon MacBook, Intel Surface Laptop, and ARM64 Linux tablets).", - FontSize = 9.5, - FontFamily = "Times New Roman", - LineHeight = 1.35, - TextColorHex = "#334155", - Alignment = TextAlignmentMode.Justify - }, - - // Multi-device Latency Table - new PdfTableElement - { - X = 55, - Y = 315, - Width = 330, - Height = 150, - Headers = new List { "Platform", "OS Backend", "Touch Lat.", "FPS" }, - Rows = new List> - { - new() { "MacBook Pro M3", "Metal 3", "6.2 ms", "120 FPS" }, - new() { "Surface Laptop 5", "DirectX 12", "7.8 ms", "60 FPS" }, - new() { "Dell XPS 15", "Vulkan", "8.1 ms", "60 FPS" }, - new() { "Raspberry Pi 5", "GLES 3.1", "14.5 ms", "54 FPS" } - }, - HeaderBackgroundHex = "#0F6CBD", - HeaderTextHex = "#FFFFFF", - AlternateRowBackgroundHex = "#F8FAFC", - BorderColorHex = "#CBD5E1" - }, - - new PdfTextElement - { - X = 55, - Y = 478, - Width = 330, - Height = 22, - Text = "XI. CONCLUSION & FUTURE DIRECTIONS", - FontSize = 11, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#0F172A" - }, - new PdfTextElement - { - X = 55, - Y = 502, - Width = 330, - Height = 135, - Text = "We demonstrated that unified cross-platform desktop publishing in managed .NET runtimes achieves near-native performance through hardware-accelerated Skia surfaces and memory-conscious data structures. Future work will investigate real-time collaborative document synchronization via Conflict-Free Replicated Data Types (CRDTs) and neural font upscaling on WebGPU.", - FontSize = 9.5, - FontFamily = "Times New Roman", - LineHeight = 1.35, - TextColorHex = "#334155", - Alignment = TextAlignmentMode.Justify - }, - - // ========================================== - // COLUMN 2 (Right: X = 415, Width = 330) - // ========================================== - - // References Section - new PdfTextElement - { - X = 415, - Y = 62, - Width = 330, - Height = 22, - Text = "REFERENCES", - FontSize = 10.5, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#0F172A" - }, - new PdfDividerElement - { - X = 415, - Y = 85, - Width = 330, - Height = 1, - Thickness = 0.75, - ColorHex = "#CBD5E1" - }, - new PdfTextElement - { - X = 415, - Y = 90, - Width = 330, - Height = 220, - Text = "[1] J. D. Foley, A. van Dam, et al., Computer Graphics: Principles and Practice, 3rd ed., Addison-Wesley, 2021.\n[2] M. Kilgard and J. Bolz, \"GPU-accelerated path rendering,\" ACM Trans. Graph., vol. 31, no. 6, pp. 172:1–172:10, 2022.\n[3] Google Skia Engine Architecture Whitepaper, Google LLC, 2025.\n[4] D. E. Knuth, The TeXbook, Addison-Wesley, 1984.\n[5] ISO 32000-2:2020, Document Management — Portable Document Format — Part 2: PDF 2.0.\n[6] E. Gamma et al., Design Patterns: Elements of Reusable Object-Oriented Software, Addison-Wesley, 1994.\n[7] Avalonia UI Architecture & Reactive Binding Framework Specification, 2026.\n[8] Microsoft .NET 9 Performance and Garbage Collector Improvements Guide, Microsoft Press, 2025.", - FontSize = 8, - FontFamily = "Times New Roman", - LineHeight = 1.35, - TextColorHex = "#475569", - Alignment = TextAlignmentMode.Justify - }, - - // Author Biographies Header - new PdfTextElement - { - X = 415, - Y = 320, - Width = 330, - Height = 22, - Text = "AUTHOR BIOGRAPHIES", - FontSize = 10.5, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#0F172A" - }, - new PdfDividerElement - { - X = 415, - Y = 340, - Width = 330, - Height = 1, - Thickness = 0.75, - ColorHex = "#CBD5E1" - }, - - // Bio 1: John Doe - new PdfShapeElement - { - X = 415, - Y = 350, - Width = 36, - Height = 36, - CornerRadius = 18, - FillColorHex = "#0F6CBD", - Label = "JD", - LabelColorHex = "#FFFFFF", - LabelFontSize = 12 - }, - new PdfTextElement - { - X = 460, - Y = 348, - Width = 285, - Height = 85, - Text = "John Doe received the Ph.D. in Computer Science in 2020. He is currently a Principal Research Scientist specializing in GPU compilers and vector rendering systems.", - FontSize = 8, - FontFamily = "Times New Roman", - LineHeight = 1.3, - TextColorHex = "#334155" - }, - - // Bio 2: Jane Doe - new PdfShapeElement - { - X = 415, - Y = 445, - Width = 36, - Height = 36, - CornerRadius = 18, - FillColorHex = "#0284C7", - Label = "JD", - LabelColorHex = "#FFFFFF", - LabelFontSize = 12 - }, - new PdfTextElement - { - X = 460, - Y = 443, - Width = 285, - Height = 85, - Text = "Jane Doe received the M.Sc. in Electrical Engineering in 2022. Her research focuses on zero-allocation memory pools and low-latency user interfaces.", - FontSize = 8, - FontFamily = "Times New Roman", - LineHeight = 1.3, - TextColorHex = "#334155" - }, - - // Bio 3: Alex Doe - new PdfShapeElement - { - X = 415, - Y = 540, - Width = 36, - Height = 36, - CornerRadius = 18, - FillColorHex = "#7E22CE", - Label = "AD", - LabelColorHex = "#FFFFFF", - LabelFontSize = 12 - }, - new PdfTextElement - { - X = 460, - Y = 538, - Width = 285, - Height = 85, - Text = "Alex Doe is an Associate Professor at CodeFryDev Institute. His research interests include human-computer interaction, digital document security, and typography rendering algorithms.", - FontSize = 8, - FontFamily = "Times New Roman", - LineHeight = 1.3, - TextColorHex = "#334155" - } - } - }; - - doc.Pages.Add(page1); - doc.Pages.Add(page2); - - return doc; - } -} diff --git a/src/PdfEditorApp/Templates/Academic/HistoryResearchPaperTemplate.cs b/src/PdfEditorApp/Templates/Academic/HistoryResearchPaperTemplate.cs deleted file mode 100644 index d759772..0000000 --- a/src/PdfEditorApp/Templates/Academic/HistoryResearchPaperTemplate.cs +++ /dev/null @@ -1,540 +0,0 @@ -using System.Collections.Generic; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; - -namespace PdfEditorApp.Templates.Academic; - -public class HistoryResearchPaperTemplate : ITemplateDefinition -{ - public string Id => "historyresearch"; - public string Name => "Historical Research & Archival Monograph"; - public string Description => "Full 2-page historical research monograph with primary ledger records, bullion flow tables, notary archives, and manuscript citations"; - public string Category => "Academic"; - public string IconKind => "Bookshelf"; - public string AccentColorHex => "#92400E"; - - public PdfDocumentModel Create() - { - var doc = new PdfDocumentModel - { - Title = "Mediterranean_Maritime_Trade_1250_1450_Research.pdf", - Author = "Prof. Jane Doe", - Subject = "Economic History & Medieval Mediterranean Archival Trade Networks" - }; - - // ========================================================================= - // PAGE 1: Title, Abstract, Archival Context, Bullion & Port Ledger Table - // ========================================================================= - var page1 = new PdfPageModel - { - PageNumber = 1, - Format = PageFormat.A4, - Orientation = PageOrientation.Portrait, - Width = 800, - Height = 1131, - BackgroundColorHex = "#FFFDF9", - FooterLeft = "MEDIEVAL MEDITERRANEAN MONOGRAPHS • VOL. 48 • ISSN 0928-5520", - FooterCenter = "HISTORICAL RESEARCH MONOGRAPH", - FooterRight = "Page 1 of 2", - Elements = new List - { - // Top Header Rule & Monograph Series Metadata - new PdfTextElement - { - X = 55, - Y = 32, - Width = 690, - Height = 18, - Text = "JOURNAL OF MEDIEVAL ECONOMIC HISTORY, VOL. 48, PP. 112–148 • DOI: 10.1163/15700674-12345", - FontSize = 8.5, - FontFamily = "Times New Roman", - TextColorHex = "#78350F", - Alignment = TextAlignmentMode.Center - }, - new PdfDividerElement - { - X = 55, - Y = 52, - Width = 690, - Height = 1, - Thickness = 0.75, - ColorHex = "#D97706" - }, - - // Main Paper Title - new PdfTextElement - { - X = 55, - Y = 58, - Width = 690, - Height = 48, - Text = "Maritime Trade Networks, Bullion Flows, and Commercial Treaties in the Mediterranean Basin (1250–1450 CE)", - FontSize = 16, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#451A03", - Alignment = TextAlignmentMode.Center - }, - - // Author & Institutional Affiliation - new PdfTextElement - { - X = 55, - Y = 108, - Width = 690, - Height = 34, - Text = "Jane Doe, Ph.D.\nChair of Medieval Economic History, CodeFryDev Institute of Historical Studies", - FontSize = 9.5, - FontFamily = "Times New Roman", - TextColorHex = "#522504", - Alignment = TextAlignmentMode.Center - }, - - // Abstract & Archival Keywords Card - new PdfShapeElement - { - X = 75, - Y = 145, - Width = 650, - Height = 104, - CornerRadius = 4, - FillColorHex = "#FEF3C7", - StrokeColorHex = "#FDE68A", - StrokeThickness = 1 - }, - new PdfTextElement - { - X = 90, - Y = 150, - Width = 620, - Height = 68, - Text = "Abstract— Drawing upon newly transcribed notary cartularies from the Archivio di Stato di Venezia and the Datini Archives in Prato, this study examines the velocity of gold specie (ducats and florins) in financing Levantine spice and silk commerce between 1250 and 1450 CE. We demonstrate that merchant syndicates mitigated currency depreciation through sophisticated maritime loans and reciprocal credit instruments.", - FontSize = 9, - FontFamily = "Times New Roman", - IsItalic = true, - LineHeight = 1.35, - TextColorHex = "#78350F", - Alignment = TextAlignmentMode.Justify - }, - new PdfTextElement - { - X = 90, - Y = 222, - Width = 620, - Height = 22, - Text = "Keywords— Mediterranean trade, Venetian notary registers, bullion flows, bills of exchange, Pax Mongolica.", - FontSize = 8.5, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#92400E" - }, - - // Column Split Divider - new PdfDividerElement - { - X = 55, - Y = 254, - Width = 690, - Height = 1, - Thickness = 1, - ColorHex = "#D97706" - }, - - // ========================================== - // COLUMN 1 (Left: X = 55, Width = 330) - // ========================================== - new PdfTextElement - { - X = 55, - Y = 262, - Width = 330, - Height = 22, - Text = "I. HISTORIOGRAPHICAL CONTEXT & ARCHIVES", - FontSize = 11, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#451A03" - }, - new PdfTextElement - { - X = 55, - Y = 286, - Width = 330, - Height = 110, - Text = "The Commercial Revolution of the thirteenth century reshaped the financial structures of Western Christendom [1]. Venetian and Genoese maritime hegemony relied not merely on naval superiority, but on legal innovations such as the colleganza and the development of double-entry bookkeeping recorded in notarized registers (cartulari notarili) across Mediterranean emporia [2].", - FontSize = 9.5, - FontFamily = "Times New Roman", - LineHeight = 1.35, - TextColorHex = "#334155", - Alignment = TextAlignmentMode.Justify - }, - - new PdfTextElement - { - X = 55, - Y = 402, - Width = 330, - Height = 22, - Text = "II. BULLION FLOWS & CURRENCY SPECIE", - FontSize = 11, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#451A03" - }, - new PdfTextElement - { - X = 55, - Y = 426, - Width = 330, - Height = 120, - Text = "The introduction of the gold ducat (ducato d'oro) in 1284 established an international standard of exchange. Our quantitative examination of 2,400 notarized contracts in Famagusta and Alexandria reveals that an estimated 350,000 to 500,000 gold ducats flowed annually through Levantine ports to purchase Indonesian spices and Persian silks [3].", - FontSize = 9.5, - FontFamily = "Times New Roman", - LineHeight = 1.35, - TextColorHex = "#334155", - Alignment = TextAlignmentMode.Justify - }, - - // Archival Quotation Callout - new PdfShapeElement - { - X = 55, - Y = 552, - Width = 330, - Height = 70, - CornerRadius = 3, - FillColorHex = "#FEF3C7", - StrokeColorHex = "#FDE68A", - StrokeThickness = 0.5 - }, - new PdfTextElement - { - X = 68, - Y = 558, - Width = 304, - Height = 58, - Text = "\"In nomine Domini, anno 1342... Ego Nicoleto de Contareno fateor recepisse a te... ducatos auri ducentos quinquaginta in colleganza pro navigando versus Alexandriam.\"\n— ASVe, Notarile, Busta 142, fol. 18r.", - FontSize = 8.5, - FontFamily = "Times New Roman", - IsItalic = true, - LineHeight = 1.3, - TextColorHex = "#78350F" - }, - - new PdfTextElement - { - X = 55, - Y = 632, - Width = 330, - Height = 22, - Text = "III. COMMERCIAL TREATIES & GUILD PRIVILEGES", - FontSize = 11, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#451A03" - }, - new PdfTextElement - { - X = 55, - Y = 656, - Width = 330, - Height = 160, - Text = "Bilateral treaties signed between the Republic of Venice and Mamluk Sultans in Cairo (notably the 1345 and 1375 chrysobulls) fixed customs tariffs at 5% ad valorem for pepper and ginger, while granting extraterritorial legal jurisdiction to the Venetian consul (bailo) stationed in Alexandria and Aleppo [4].", - FontSize = 9.5, - FontFamily = "Times New Roman", - LineHeight = 1.35, - TextColorHex = "#334155", - Alignment = TextAlignmentMode.Justify - }, - - // ========================================== - // COLUMN 2 (Right: X = 415, Width = 330) - // ========================================== - new PdfTextElement - { - X = 415, - Y = 262, - Width = 330, - Height = 22, - Text = "IV. QUANTITATIVE TRADE DATA ACROSS PORTS", - FontSize = 11, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#451A03" - }, - new PdfTextElement - { - X = 415, - Y = 286, - Width = 330, - Height = 58, - Text = "Table I details the estimated annual gold specie inflows, primary exported commodities, and average customs duty rates across major Mediterranean trade depots based on consular customs ledgers (1300–1400 CE).", - FontSize = 9.5, - FontFamily = "Times New Roman", - LineHeight = 1.35, - TextColorHex = "#334155", - Alignment = TextAlignmentMode.Justify - }, - - // Historical Archival Table - new PdfTableElement - { - X = 415, - Y = 348, - Width = 330, - Height = 145, - Headers = new List { "Trading Port", "Commodity", "Gold Flow (Ducats)", "Tariff" }, - Rows = new List> - { - new() { "Alexandria (Egypt)", "Spices / Pepper", "380,000", "5.0%" }, - new() { "Constantinople", "Silk / Grain", "240,000", "3.5%" }, - new() { "Famagusta (Cyprus)", "Sugar / Cotton", "160,000", "4.0%" }, - new() { "Ragusa (Dubrovnik)", "Silver / Timber", "120,000", "2.0%" } - }, - HeaderBackgroundHex = "#92400E", - HeaderTextHex = "#FFFFFF", - AlternateRowBackgroundHex = "#FEF3C7", - BorderColorHex = "#CBD5E1" - }, - - new PdfTextElement - { - X = 415, - Y = 502, - Width = 330, - Height = 22, - Text = "V. MARITIME LAW & BILLS OF EXCHANGE", - FontSize = 11, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#451A03" - }, - new PdfTextElement - { - X = 415, - Y = 526, - Width = 330, - Height = 115, - Text = "The emergence of the lettera di cambio (bill of exchange) permitted merchant bankers in Florence, Venice, and Genoa to settle accounts without physically transporting silver and gold across pirate-infested shipping lanes, effectively multiplying liquidity across Europe [5].", - FontSize = 9.5, - FontFamily = "Times New Roman", - LineHeight = 1.35, - TextColorHex = "#334155", - Alignment = TextAlignmentMode.Justify - }, - - new PdfTextElement - { - X = 415, - Y = 648, - Width = 330, - Height = 22, - Text = "VI. CONVOY SHIPPING & THE MUDA SYSTEM", - FontSize = 11, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#451A03" - }, - new PdfTextElement - { - X = 415, - Y = 672, - Width = 330, - Height = 145, - Text = "The Venetian State organized biannual state-sponsored galley convoys (mude) departing for Flanders, Beirut, and Alexandria. Auctioning cargo space on armed great galleys minimized piracy risks and created standardized freight insurance rates of 2.5%–4.0% [6].", - FontSize = 9.5, - FontFamily = "Times New Roman", - LineHeight = 1.35, - TextColorHex = "#334155", - Alignment = TextAlignmentMode.Justify - } - } - }; - - // ========================================================================= - // PAGE 2: Silk Road Links, Datini Archives, Author Bio & References - // ========================================================================= - var page2 = new PdfPageModel - { - PageNumber = 2, - Format = PageFormat.A4, - Orientation = PageOrientation.Portrait, - Width = 800, - Height = 1131, - BackgroundColorHex = "#FFFDF9", - FooterLeft = "MEDIEVAL MEDITERRANEAN MONOGRAPHS • VOL. 48", - FooterRight = "Page 2 of 2", - Elements = new List - { - // Top Header Metadata Strip - new PdfTextElement - { - X = 55, - Y = 32, - Width = 690, - Height = 18, - Text = "DE MONTMIRAIL: MEDITERRANEAN MARITIME TRADE (1250–1450 CE)", - FontSize = 8.5, - FontFamily = "Times New Roman", - TextColorHex = "#78350F", - Alignment = TextAlignmentMode.Center - }, - new PdfDividerElement - { - X = 55, - Y = 52, - Width = 690, - Height = 1, - Thickness = 0.75, - ColorHex = "#D97706" - }, - - // ========================================== - // COLUMN 1 (Left: X = 55, Width = 330) - // ========================================== - new PdfTextElement - { - X = 55, - Y = 62, - Width = 330, - Height = 22, - Text = "VII. OVERLAND SILK ROAD LINKAGES", - FontSize = 11, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#451A03" - }, - new PdfTextElement - { - X = 55, - Y = 86, - Width = 330, - Height = 135, - Text = "During the Pax Mongolica, maritime routes converged with overland caravan routes terminating at Trebizond, Tabriz, and Ayas. Venetian and Genoese factors established permanent trading houses (fondachi) in the Black Sea port of Caffa, exporting Crimean wheat and raw silk westward in exchange for Flemish woolen textiles and German silver ingots [7].", - FontSize = 9.5, - FontFamily = "Times New Roman", - LineHeight = 1.35, - TextColorHex = "#334155", - Alignment = TextAlignmentMode.Justify - }, - - new PdfTextElement - { - X = 55, - Y = 228, - Width = 330, - Height = 22, - Text = "VIII. CONCLUSION & HISTORIOGRAPHY", - FontSize = 11, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#451A03" - }, - new PdfTextElement - { - X = 55, - Y = 252, - Width = 330, - Height = 135, - Text = "The pre-modern Mediterranean was not an arena of irreconcilable religious clash, but a deeply integrated commercial network held together by institutional legal norms, shared currency weights, and mutual commercial interest. These notary registers prove that capital velocity was far higher than traditional historiography assumed.", - FontSize = 9.5, - FontFamily = "Times New Roman", - LineHeight = 1.35, - TextColorHex = "#334155", - Alignment = TextAlignmentMode.Justify - }, - - // Author Biography Header - new PdfTextElement - { - X = 55, - Y = 395, - Width = 330, - Height = 22, - Text = "AUTHOR BIOGRAPHY", - FontSize = 10.5, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#451A03" - }, - new PdfDividerElement - { - X = 55, - Y = 415, - Width = 330, - Height = 1, - Thickness = 0.75, - ColorHex = "#D97706" - }, - - new PdfShapeElement - { - X = 55, - Y = 425, - Width = 36, - Height = 36, - CornerRadius = 18, - FillColorHex = "#92400E", - Label = "HM", - LabelColorHex = "#FFFFFF", - LabelFontSize = 12 - }, - new PdfTextElement - { - X = 100, - Y = 423, - Width = 285, - Height = 90, - Text = "Henriette de Montmirail is Professor of Medieval Economic History at EHESS Paris and Fellow of the Royal Historical Society. She has authored four books on Mediterranean maritime law and medieval banking cartularies.", - FontSize = 8.5, - FontFamily = "Times New Roman", - LineHeight = 1.3, - TextColorHex = "#334155" - }, - - // ========================================== - // COLUMN 2 (Right: X = 415, Width = 330) - // ========================================== - new PdfTextElement - { - X = 415, - Y = 62, - Width = 330, - Height = 22, - Text = "PRIMARY SOURCES & BIBLIOGRAPHY", - FontSize = 10.5, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#451A03" - }, - new PdfDividerElement - { - X = 415, - Y = 85, - Width = 330, - Height = 1, - Thickness = 0.75, - ColorHex = "#D97706" - }, - new PdfTextElement - { - X = 415, - Y = 90, - Width = 330, - Height = 270, - Text = "[1] F. Braudel, The Mediterranean and the Mediterranean World in the Age of Philip II, Harper & Row, 1972.\n[2] R. S. Lopez, The Commercial Revolution of the Middle Ages, 950–1350, Cambridge Univ. Press, 1976.\n[3] E. Ashtor, Levant Trade in the Later Middle Ages, Princeton Univ. Press, 1983.\n[4] F. C. Lane, Venice: A Maritime Republic, Johns Hopkins Univ. Press, 1973.\n[5] R. de Roover, The Rise and Decline of the Medici Bank, 1397–1494, Harvard Univ. Press, 1963.\n[6] D. Jacoby, Commercial Exchange Across the Mediterranean, Variorum, 2005.\n[7] M. Balard, La Romanie Génoise (XIIe–début du XVe siècle), École Française de Rome, 1978.\n[8] Archivio di Stato di Venezia (ASVe), Procuratori di San Marco, de Citra, Buste 140–162.", - FontSize = 8, - FontFamily = "Times New Roman", - LineHeight = 1.35, - TextColorHex = "#475569", - Alignment = TextAlignmentMode.Justify - } - } - }; - - doc.Pages.Add(page1); - doc.Pages.Add(page2); - - return doc; - } -} diff --git a/src/PdfEditorApp/Templates/Academic/MathResearchPaperTemplate.cs b/src/PdfEditorApp/Templates/Academic/MathResearchPaperTemplate.cs deleted file mode 100644 index 1ac3908..0000000 --- a/src/PdfEditorApp/Templates/Academic/MathResearchPaperTemplate.cs +++ /dev/null @@ -1,629 +0,0 @@ -using System.Collections.Generic; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; - -namespace PdfEditorApp.Templates.Academic; - -public class MathResearchPaperTemplate : ITemplateDefinition -{ - public string Id => "mathresearch"; - public string Name => "Mathematics Research Paper"; - public string Description => "Full 2-page pure & applied mathematics paper with discrete Hodge Laplacians, theorem proofs, spectral tables, and citations"; - public string Category => "Academic"; - public string IconKind => "MathCompass"; - public string AccentColorHex => "#4338CA"; - - public PdfDocumentModel Create() - { - var doc = new PdfDocumentModel - { - Title = "Discrete_Hodge_Laplacians_Simplicial_Manifolds_2026.pdf", - Author = "Prof. John Doe & Dr. Jane Doe", - Subject = "Discrete Differential Geometry & Topological Data Analysis" - }; - - // ========================================================================= - // PAGE 1: Title, Abstract, Discrete Hodge Formulation & Proofs - // ========================================================================= - var page1 = new PdfPageModel - { - PageNumber = 1, - Format = PageFormat.A4, - Orientation = PageOrientation.Portrait, - Width = 800, - Height = 1131, - BackgroundColorHex = "#FFFFFF", - FooterLeft = "ANNALS OF MATHEMATICS • VOL. 198, NO. 3 • MSC2020: 55N31, 58J50, 05E45", - FooterCenter = "MATHEMATICAL RESEARCH ARTICLE", - FooterRight = "Page 1 of 2", - Elements = new List - { - // Top Header Rule & Journal Metadata - new PdfTextElement - { - X = 55, - Y = 32, - Width = 690, - Height = 18, - Text = "ANNALS OF MATHEMATICS, VOL. 198 (2026), ISSUE 3, PP. 711–754", - FontSize = 8.5, - FontFamily = "Times New Roman", - TextColorHex = "#64748B", - Alignment = TextAlignmentMode.Center - }, - new PdfDividerElement - { - X = 55, - Y = 52, - Width = 690, - Height = 1, - Thickness = 0.75, - ColorHex = "#CBD5E1" - }, - - // Main Paper Title - new PdfTextElement - { - X = 55, - Y = 58, - Width = 690, - Height = 48, - Text = "Discrete Hodge Laplacians and Persistent Cohomology on High-Dimensional Simplicial Manifolds", - FontSize = 17, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#1E1B4B", - Alignment = TextAlignmentMode.Center - }, - - // Authors & Institutional Affiliation - new PdfTextElement - { - X = 55, - Y = 108, - Width = 690, - Height = 34, - Text = "John Doe¹ and Jane Doe²\n¹Department of Mathematics, CodeFryDev Institute • ²Mathematical Institute, CodeFryDev Academy", - FontSize = 9.5, - FontFamily = "Times New Roman", - TextColorHex = "#334155", - Alignment = TextAlignmentMode.Center - }, - - // Abstract & MSC Classification Card - new PdfShapeElement - { - X = 75, - Y = 145, - Width = 650, - Height = 104, - CornerRadius = 4, - FillColorHex = "#F5F3FF", - StrokeColorHex = "#DDD6FE", - StrokeThickness = 1 - }, - new PdfTextElement - { - X = 90, - Y = 150, - Width = 620, - Height = 68, - Text = "Abstract— We establish spectral convergence bounds for higher-order discrete Hodge Laplacians Δ_k acting on real cochain complexes of triangulated Riemannian manifolds. We prove that the persistent harmonic cochains of a filtration asymptotically recover the continuous L² de Rham cohomology, and provide explicit lower bounds on the first non-zero eigenvalue λ₁(Δ_k) in terms of combinatorial Ricci curvature.", - FontSize = 9, - FontFamily = "Times New Roman", - IsItalic = true, - LineHeight = 1.35, - TextColorHex = "#1E1B4B", - Alignment = TextAlignmentMode.Justify - }, - new PdfTextElement - { - X = 90, - Y = 222, - Width = 620, - Height = 22, - Text = "MSC 2020 Classification— 55N31 (Persistent homology), 58J50 (Spectral theory on manifolds), 05E45 (Simplicial complexes).", - FontSize = 8.5, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#4338CA" - }, - - // Column Split Divider - new PdfDividerElement - { - X = 55, - Y = 254, - Width = 690, - Height = 1, - Thickness = 1, - ColorHex = "#CBD5E1" - }, - - // ========================================== - // COLUMN 1 (Left: X = 55, Width = 330) - // ========================================== - new PdfTextElement - { - X = 55, - Y = 262, - Width = 330, - Height = 22, - Text = "1. INTRODUCTION & PRELIMINARIES", - FontSize = 11, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#1E1B4B" - }, - new PdfTextElement - { - X = 55, - Y = 286, - Width = 330, - Height = 110, - Text = "Let K be a finite, oriented simplicial complex of dimension n. For each integer k ∈ {0, …, n}, let C_k(K; ℝ) denote the vector space of real k-chains, endowed with the canonical inner product making the oriented simplices an orthonormal basis. The combinatorial coboundary operator δ_k: C^k(K; ℝ) → C^{k+1}(K; ℝ) is the adjoint of the boundary operator ∂_{k+1}.", - FontSize = 9.5, - FontFamily = "Times New Roman", - LineHeight = 1.35, - TextColorHex = "#334155", - Alignment = TextAlignmentMode.Justify - }, - - new PdfTextElement - { - X = 55, - Y = 402, - Width = 330, - Height = 22, - Text = "2. DISCRETE HODGE LAPLACIAN", - FontSize = 11, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#1E1B4B" - }, - new PdfTextElement - { - X = 55, - Y = 426, - Width = 330, - Height = 45, - Text = "Definition 2.1. The k-th discrete Hodge Laplacian Δ_k: C^k(K; ℝ) → C^k(K; ℝ) is the self-adjoint, positive semi-definite operator defined by:", - FontSize = 9.5, - FontFamily = "Times New Roman", - LineHeight = 1.35, - TextColorHex = "#334155", - Alignment = TextAlignmentMode.Justify - }, - - // Formal Hodge Laplacian Math Equation - new PdfMathElement - { - X = 55, - Y = 475, - Width = 330, - Height = 38, - Formula = @"\Delta_k = \delta_{k-1} \partial_k + \partial_{k+1} \delta_k = \Delta_k^{\text{down}} + \Delta_k^{\text{up}}", - FontSize = 10, - TextColorHex = "#1E1B4B", - BackgroundColorHex = "#F5F3FF", - BorderColorHex = "#DDD6FE", - BorderThickness = 0.5, - CornerRadius = 3, - ShowBackground = true, - ShowBorder = true, - ShowEquationNumber = true, - EquationNumber = "(2.1)", - Alignment = TextAlignmentMode.Center, - Category = MathCategory.Geometry, - PresetName = "Discrete Hodge Laplacian" - }, - - new PdfTextElement - { - X = 55, - Y = 516, - Width = 330, - Height = 22, - Text = "Theorem 2.2 (Discrete Hodge Decomposition).", - FontSize = 10, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#1E1B4B" - }, - new PdfTextElement - { - X = 55, - Y = 540, - Width = 330, - Height = 145, - Text = "For any finite simplicial complex K, there exists an orthogonal direct sum decomposition:\n\nC^k(K; ℝ) = im(δ_{k-1}) ⊕ im(∂_{k+1}) ⊕ ker(Δ_k).\n\nFurthermore, there is a canonical isomorphism between the space of harmonic k-cochains and the k-th simplicial cohomology group: ker(Δ_k) ≅ H^k(K; ℝ), yielding dim ker(Δ_k) = β_k(K), where β_k is the k-th Betti number.", - FontSize = 9, - FontFamily = "Times New Roman", - IsItalic = true, - LineHeight = 1.35, - TextColorHex = "#1F2937", - Alignment = TextAlignmentMode.Justify - }, - - new PdfTextElement - { - X = 55, - Y = 690, - Width = 330, - Height = 22, - Text = "3. SPECTRAL GAP & CURVATURE BOUNDS", - FontSize = 11, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#1E1B4B" - }, - new PdfTextElement - { - X = 55, - Y = 714, - Width = 330, - Height = 140, - Text = "Lemma 3.1 (Bochner-Weitzenböck Formula). Let Ric_k(K) denote the Forman combinatorial Ricci curvature on k-simplices [4]. If Ric_k(K) ≥ κ > 0 for all σ ∈ K_k, then the first non-zero eigenvalue satisfies λ₁(Δ_k) ≥ κ. Consequently, whenever κ > 0, the k-th reduced cohomology group vanishes: H̃^k(K; ℝ) = 0.", - FontSize = 9, - FontFamily = "Times New Roman", - LineHeight = 1.35, - TextColorHex = "#334155", - Alignment = TextAlignmentMode.Justify - }, - - // ========================================== - // COLUMN 2 (Right: X = 415, Width = 330) - // ========================================== - new PdfTextElement - { - X = 415, - Y = 262, - Width = 330, - Height = 22, - Text = "4. NUMERICAL EIGENVALUE COMPUTATION", - FontSize = 11, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#1E1B4B" - }, - new PdfTextElement - { - X = 415, - Y = 286, - Width = 330, - Height = 58, - Text = "We evaluated the spectral spectrum of Δ₁ on fine triangulations of standard smooth surfaces (2-Sphere S², Torus T², Klein Bottle K², and 3-Torus T³). Sparse Lanczos iterations were computed via ARPACK.", - FontSize = 9.5, - FontFamily = "Times New Roman", - LineHeight = 1.35, - TextColorHex = "#334155", - Alignment = TextAlignmentMode.Justify - }, - - // Analytical Spectral Table - new PdfTableElement - { - X = 415, - Y = 348, - Width = 330, - Height = 145, - Headers = new List { "Manifold (M)", "Dim", "β₁(M)", "λ₁(Δ₁)", "ρ(Δ₁)" }, - Rows = new List> - { - new() { "Sphere S²", "2", "0", "1.9842", "12.00" }, - new() { "Torus T²", "2", "2", "0.4931", "11.85" }, - new() { "Klein Bottle K²", "2", "1", "0.4810", "11.90" }, - new() { "3-Torus T³", "3", "3", "0.2465", "18.00" } - }, - HeaderBackgroundHex = "#4338CA", - HeaderTextHex = "#FFFFFF", - AlternateRowBackgroundHex = "#F5F3FF", - BorderColorHex = "#CBD5E1" - }, - - new PdfTextElement - { - X = 415, - Y = 502, - Width = 330, - Height = 22, - Text = "5. PERSISTENT COHOMOLOGY ALGORITHM", - FontSize = 11, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#1E1B4B" - }, - new PdfTextElement - { - X = 415, - Y = 526, - Width = 330, - Height = 115, - Text = "Given a filtered simplicial complex ∅ = K₀ ⊂ K₁ ⊂ ⋯ ⊂ K_m = K, the persistence diagram Dgm_k is computed via matrix reduction on the boundary matrix. The harmonic representatives ω_i ∈ ker(Δ_k(K_t)) provide geometric localization for persistent topological features across filtration scales [3].", - FontSize = 9.5, - FontFamily = "Times New Roman", - LineHeight = 1.35, - TextColorHex = "#334155", - Alignment = TextAlignmentMode.Justify - }, - - new PdfTextElement - { - X = 415, - Y = 648, - Width = 330, - Height = 22, - Text = "6. CONTINUOUS ASYMPTOTIC CONVERGENCE", - FontSize = 11, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#1E1B4B" - }, - new PdfTextElement - { - X = 415, - Y = 672, - Width = 330, - Height = 145, - Text = "Theorem 6.1 (Spectral Convergence). Let (M, g) be a smooth compact Riemannian manifold and let {K_h}_{h>0} be a family of Delaunay triangulations with mesh size h → 0 satisfying the minimal angle condition. Then for each k, the spectrum of Δ_k(K_h) converges in the Hausdorff metric to the spectrum of the continuous Hodge-de Rham Laplacian Δ_k^M on differential k-forms.", - FontSize = 9, - FontFamily = "Times New Roman", - IsItalic = true, - LineHeight = 1.35, - TextColorHex = "#1F2937", - Alignment = TextAlignmentMode.Justify - } - } - }; - - // ========================================================================= - // PAGE 2: Heat Trace, Zeta Functions, Author Bios & References - // ========================================================================= - var page2 = new PdfPageModel - { - PageNumber = 2, - Format = PageFormat.A4, - Orientation = PageOrientation.Portrait, - Width = 800, - Height = 1131, - BackgroundColorHex = "#FFFFFF", - FooterLeft = "ANNALS OF MATHEMATICS • VOL. 198, NO. 3", - FooterRight = "Page 2 of 2", - Elements = new List - { - // Top Header Metadata Strip - new PdfTextElement - { - X = 55, - Y = 32, - Width = 690, - Height = 18, - Text = "EISENBUD & MONTGOMERY: DISCRETE HODGE LAPLACIANS ON MANIFOLDS", - FontSize = 8.5, - FontFamily = "Times New Roman", - TextColorHex = "#64748B", - Alignment = TextAlignmentMode.Center - }, - new PdfDividerElement - { - X = 55, - Y = 52, - Width = 690, - Height = 1, - Thickness = 0.75, - ColorHex = "#CBD5E1" - }, - - // ========================================== - // COLUMN 1 (Left: X = 55, Width = 330) - // ========================================== - new PdfTextElement - { - X = 55, - Y = 62, - Width = 330, - Height = 22, - Text = "7. DISCRETE HEAT KERNEL & SPECTRAL ZETA", - FontSize = 11, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#1E1B4B" - }, - new PdfTextElement - { - X = 55, - Y = 86, - Width = 330, - Height = 70, - Text = "The discrete heat operator H_k(t) = exp(-t Δ_k) admits a spectral expansion governed by the eigenvalues 0 ≤ λ₁ ≤ λ₂ ≤ ⋯ ≤ λ_N. The combinatorial spectral zeta function is defined for Re(s) > 0 by:", - FontSize = 9.5, - FontFamily = "Times New Roman", - LineHeight = 1.35, - TextColorHex = "#334155", - Alignment = TextAlignmentMode.Justify - }, - - // Formal Spectral Zeta Function Math Equation - new PdfMathElement - { - X = 55, - Y = 160, - Width = 330, - Height = 38, - Formula = @"\zeta_k(s) = \mathrm{Tr}\left( (\Delta_k |_{\ker(\Delta_k)^\perp})^{-s} \right) = \sum_{j=1}^{N - \beta_k} \lambda_j^{-s}", - FontSize = 9.5, - TextColorHex = "#1E1B4B", - BackgroundColorHex = "#F5F3FF", - BorderColorHex = "#DDD6FE", - BorderThickness = 0.5, - CornerRadius = 3, - ShowBackground = true, - ShowBorder = true, - ShowEquationNumber = true, - EquationNumber = "(7.1)", - Alignment = TextAlignmentMode.Center, - Category = MathCategory.Calculus, - PresetName = "Spectral Zeta Function" - }, - - new PdfTextElement - { - X = 55, - Y = 202, - Width = 330, - Height = 120, - Text = "The derivative at zero, ζ'_k(0), yields the discrete Ray-Singer analytic torsion, which we prove is a topological invariant of the complex K under simplicial subdivision and Reidemeister moves [5]. This extends Cheeger's theorem to combinatorial cell complexes.", - FontSize = 9.5, - FontFamily = "Times New Roman", - LineHeight = 1.35, - TextColorHex = "#334155", - Alignment = TextAlignmentMode.Justify - }, - - new PdfTextElement - { - X = 55, - Y = 330, - Width = 330, - Height = 22, - Text = "8. CONCLUDING THEORETICAL REMARKS", - FontSize = 11, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#1E1B4B" - }, - new PdfTextElement - { - X = 55, - Y = 354, - Width = 330, - Height = 125, - Text = "Our results establish that higher-order discrete Hodge Laplacians faithfully reflect the underlying geometry and topology of continuous Riemannian manifolds. Future extensions will investigate discrete spin Dirac operators D on simplicial spin manifolds and non-linear p-Laplacian eigenvalues.", - FontSize = 9.5, - FontFamily = "Times New Roman", - LineHeight = 1.35, - TextColorHex = "#334155", - Alignment = TextAlignmentMode.Justify - }, - - // Author Biographies (Left Column) - new PdfTextElement - { - X = 55, - Y = 490, - Width = 330, - Height = 22, - Text = "AUTHOR BIOGRAPHIES", - FontSize = 10.5, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#1E1B4B" - }, - new PdfDividerElement - { - X = 55, - Y = 510, - Width = 330, - Height = 1, - Thickness = 0.75, - ColorHex = "#CBD5E1" - }, - - // Bio 1: David Eisenbud - new PdfShapeElement - { - X = 55, - Y = 520, - Width = 34, - Height = 34, - CornerRadius = 17, - FillColorHex = "#4338CA", - Label = "DE", - LabelColorHex = "#FFFFFF", - LabelFontSize = 12 - }, - new PdfTextElement - { - X = 98, - Y = 518, - Width = 287, - Height = 65, - Text = "David H. Eisenbud is Professor of Mathematics at UC Berkeley and former Director of MSRI. His work spans commutative algebra, algebraic geometry, and discrete Hodge theory.", - FontSize = 8, - FontFamily = "Times New Roman", - LineHeight = 1.3, - TextColorHex = "#334155" - }, - - // Bio 2: Claire Montgomery - new PdfShapeElement - { - X = 55, - Y = 590, - Width = 34, - Height = 34, - CornerRadius = 17, - FillColorHex = "#6366F1", - Label = "CM", - LabelColorHex = "#FFFFFF", - LabelFontSize = 12 - }, - new PdfTextElement - { - X = 98, - Y = 588, - Width = 287, - Height = 65, - Text = "Claire Montgomery is a Royal Society University Research Fellow at Oxford University. Her research focuses on persistent spectral geometry and high-dimensional topological data analysis.", - FontSize = 8, - FontFamily = "Times New Roman", - LineHeight = 1.3, - TextColorHex = "#334155" - }, - - // ========================================== - // COLUMN 2 (Right: X = 415, Width = 330) - // ========================================== - new PdfTextElement - { - X = 415, - Y = 62, - Width = 330, - Height = 22, - Text = "REFERENCES", - FontSize = 10.5, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#1E1B4B" - }, - new PdfDividerElement - { - X = 415, - Y = 85, - Width = 330, - Height = 1, - Thickness = 0.75, - ColorHex = "#CBD5E1" - }, - new PdfTextElement - { - X = 415, - Y = 90, - Width = 330, - Height = 270, - Text = "[1] W. V. D. Hodge, The Theory and Applications of Harmonic Integrals, Cambridge University Press, 1941.\n[2] H. Edelsbrunner and J. L. Harer, Computational Topology: An Introduction, American Mathematical Society, 2010.\n[3] G. Carlsson, \"Topology and data,\" Bull. Amer. Math. Soc., vol. 46, no. 2, pp. 255–308, 2009.\n[4] R. Forman, \"Bochner's method for cell complexes and combinatorial Ricci curvature,\" Discrete Comput. Geom., vol. 29, pp. 323–374, 2003.\n[5] M. F. Atiyah and I. M. Singer, \"The index of elliptic operators: I,\" Ann. of Math., vol. 87, pp. 484–530, 1968.\n[6] J. Cheeger, \"Analytic torsion and the heat equation,\" Ann. of Math., vol. 109, pp. 259–322, 1979.\n[7] D. B. Ray and I. M. Singer, \"R-torsion and the Laplacian on Riemannian manifolds,\" Adv. Math., vol. 7, pp. 145–210, 1971.\n[8] J. Dodziuk, \"Finite-difference approach to the Hodge theory of harmonic forms,\" Amer. J. Math., vol. 98, pp. 79–104, 1976.", - FontSize = 8, - FontFamily = "Times New Roman", - LineHeight = 1.35, - TextColorHex = "#475569", - Alignment = TextAlignmentMode.Justify - } - } - }; - - doc.Pages.Add(page1); - doc.Pages.Add(page2); - - return doc; - } -} diff --git a/src/PdfEditorApp/Templates/Academic/PhysicsResearchPaperTemplate.cs b/src/PdfEditorApp/Templates/Academic/PhysicsResearchPaperTemplate.cs deleted file mode 100644 index c240b58..0000000 --- a/src/PdfEditorApp/Templates/Academic/PhysicsResearchPaperTemplate.cs +++ /dev/null @@ -1,616 +0,0 @@ -using System.Collections.Generic; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; - -namespace PdfEditorApp.Templates.Academic; - -public class PhysicsResearchPaperTemplate : ITemplateDefinition -{ - public string Id => "physicsresearch"; - public string Name => "Physics Research Paper"; - public string Description => "Full 2-page quantum physics paper with Hamiltonian equations, Lindblad dissipation, Wigner tomography, and spectroscopy data"; - public string Category => "Academic"; - public string IconKind => "Atom"; - public string AccentColorHex => "#0891B2"; - - public PdfDocumentModel Create() - { - var doc = new PdfDocumentModel - { - Title = "Cavity_QED_Superconducting_Qubits_2026.pdf", - Author = "Dr. John Doe, Dr. Jane Doe, and Prof. Alex Doe", - Subject = "Quantum Electrodynamics & Non-Equilibrium Phase Transitions" - }; - - // ========================================================================= - // PAGE 1: Title, Abstract, Dicke Hamiltonian, Master Equation & Data - // ========================================================================= - var page1 = new PdfPageModel - { - PageNumber = 1, - Format = PageFormat.A4, - Orientation = PageOrientation.Portrait, - Width = 800, - Height = 1131, - BackgroundColorHex = "#FFFFFF", - FooterLeft = "PHYSICAL REVIEW LETTERS • VOL. 136, 140401 (2026) • PACS: 03.67.Lx, 42.50.Pq, 85.25.Cp", - FooterCenter = "QUANTUM PHYSICS RESEARCH", - FooterRight = "Page 1 of 2", - Elements = new List - { - // Top Header Rule & Journal Metadata - new PdfTextElement - { - X = 55, - Y = 32, - Width = 690, - Height = 18, - Text = "PHYSICAL REVIEW LETTERS 136, 140401 (2026) • DOI: 10.1103/PhysRevLett.136.140401", - FontSize = 8.5, - FontFamily = "Times New Roman", - TextColorHex = "#64748B", - Alignment = TextAlignmentMode.Center - }, - new PdfDividerElement - { - X = 55, - Y = 52, - Width = 690, - Height = 1, - Thickness = 0.75, - ColorHex = "#CBD5E1" - }, - - // Main Paper Title - new PdfTextElement - { - X = 55, - Y = 58, - Width = 690, - Height = 48, - Text = "Cavity Quantum Electrodynamics and Non-Equilibrium Phase Transitions in Superconducting Qubits", - FontSize = 17, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#0E7490", - Alignment = TextAlignmentMode.Center - }, - - // Authors & Affiliation - new PdfTextElement - { - X = 55, - Y = 108, - Width = 690, - Height = 34, - Text = "John Doe¹, Jane Doe², and Alex Doe¹\n¹Quantum Photonics Laboratory, Department of Physics, CodeFryDev Institute\n²Center for Quantum Information, CodeFryDev Academy", - FontSize = 9.5, - FontFamily = "Times New Roman", - TextColorHex = "#334155", - Alignment = TextAlignmentMode.Center - }, - - // Abstract & PACS Card - new PdfShapeElement - { - X = 75, - Y = 145, - Width = 650, - Height = 104, - CornerRadius = 4, - FillColorHex = "#ECFEFF", - StrokeColorHex = "#A5F3FC", - StrokeThickness = 1 - }, - new PdfTextElement - { - X = 90, - Y = 150, - Width = 620, - Height = 68, - Text = "Abstract— We report the experimental observation of a non-equilibrium superradiant phase transition in an array of 64 transmon qubits coupled to a high-Q 3D microwave cavity. In the ultra-strong coupling regime (g/ω_c ≈ 0.18), we measure a critical threshold in the cavity transmission spectrum, observing a 12.4 dB photon squeezing and extended ensemble dephasing times T₂* exceeding 180 μs.", - FontSize = 9, - FontFamily = "Times New Roman", - IsItalic = true, - LineHeight = 1.35, - TextColorHex = "#164E63", - Alignment = TextAlignmentMode.Justify - }, - new PdfTextElement - { - X = 90, - Y = 222, - Width = 620, - Height = 22, - Text = "PACS Numbers— 03.67.Lx (Quantum computation), 42.50.Pq (Cavity QED), 85.25.Cp (Josephson devices).", - FontSize = 8.5, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#0891B2" - }, - - // Column Split Divider - new PdfDividerElement - { - X = 55, - Y = 254, - Width = 690, - Height = 1, - Thickness = 1, - ColorHex = "#CBD5E1" - }, - - // ========================================== - // COLUMN 1 (Left: X = 55, Width = 330) - // ========================================== - new PdfTextElement - { - X = 55, - Y = 262, - Width = 330, - Height = 22, - Text = "I. INTRODUCTION & EXPERIMENTAL SETUP", - FontSize = 11, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#0E7490" - }, - new PdfTextElement - { - X = 55, - Y = 286, - Width = 330, - Height = 110, - Text = "Circuit quantum electrodynamics (cQED) provides a macroscopic testbed for exploring light-matter interactions at the single-photon level [1, 2]. By embedding superconducting Josephson junction transmon qubits inside an aluminum 3D resonant cavity cooled to 12 mK in a dilution refrigerator, we suppress ambient thermal noise and achieve ultra-long photon coherence.", - FontSize = 9.5, - FontFamily = "Times New Roman", - LineHeight = 1.35, - TextColorHex = "#334155", - Alignment = TextAlignmentMode.Justify - }, - - new PdfTextElement - { - X = 55, - Y = 402, - Width = 330, - Height = 22, - Text = "II. TAVIS-CUMMINGS HAMILTONIAN", - FontSize = 11, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#0E7490" - }, - new PdfTextElement - { - X = 55, - Y = 426, - Width = 330, - Height = 45, - Text = "The coherent dynamics of N identical two-level transmons coupled to a single cavity mode is described by the Dicke Hamiltonian:", - FontSize = 9.5, - FontFamily = "Times New Roman", - LineHeight = 1.35, - TextColorHex = "#334155", - Alignment = TextAlignmentMode.Justify - }, - - // Dicke Hamiltonian Vector Math Equation - new PdfMathElement - { - X = 55, - Y = 475, - Width = 330, - Height = 44, - Formula = @"\hat{H} = \hbar \omega_c a^\dagger a + \frac{1}{2} \hbar \omega_q \sum_{j=1}^N \sigma_z^{(j)} + \frac{\hbar g}{\sqrt{N}} \sum_{j=1}^N (a^\dagger \sigma_-^{(j)} + a \sigma_+^{(j)})", - FontSize = 9.5, - TextColorHex = "#0E7490", - BackgroundColorHex = "#ECFEFF", - BorderColorHex = "#A5F3FC", - BorderThickness = 0.5, - CornerRadius = 3, - ShowBackground = true, - ShowBorder = true, - ShowEquationNumber = true, - EquationNumber = "(1)", - Alignment = TextAlignmentMode.Center, - Category = MathCategory.QuantumMechanics, - PresetName = "Dicke Cavity QED Hamiltonian" - }, - - new PdfTextElement - { - X = 55, - Y = 524, - Width = 330, - Height = 22, - Text = "III. LINDBLAD MASTER EQUATION", - FontSize = 11, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#0E7490" - }, - new PdfTextElement - { - X = 55, - Y = 548, - Width = 330, - Height = 135, - Text = "Open-system quantum dissipation is treated via the Lindblad generator:\n\n∂_t ρ̂ = -i/ℏ [Ĥ, ρ̂] + κ 𝒟[â]ρ̂ + γ ∑ 𝒟[σ_-^(j)]ρ̂ + γ_φ ∑ 𝒟[σ_z^(j)]ρ̂,\n\nwhere 𝒟[L̂]ρ̂ = L̂ρ̂L̂† - ½ {L̂†L̂, ρ̂}. Here κ = 2π × 42 kHz represents the cavity photon leakage rate, γ = 2π × 8.5 kHz is the spontaneous qubit decay rate, and γ_φ is the pure dephasing rate.", - FontSize = 9, - FontFamily = "Times New Roman", - LineHeight = 1.35, - TextColorHex = "#334155", - Alignment = TextAlignmentMode.Justify - }, - - new PdfTextElement - { - X = 55, - Y = 690, - Width = 330, - Height = 22, - Text = "IV. DECOHERENCE SUPPRESSION", - FontSize = 11, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#0E7490" - }, - new PdfTextElement - { - X = 55, - Y = 714, - Width = 330, - Height = 140, - Text = "By tuning the qubit array frequency to the cavity anti-node (ω_q = 6.482 GHz), we observe cooperative subradiant states that effectively shield the quantum ensemble from local 1/f charge and flux noise fluctuations. This yields an order-of-magnitude enhancement in ensemble quantum state lifetime.", - FontSize = 9.5, - FontFamily = "Times New Roman", - LineHeight = 1.35, - TextColorHex = "#334155", - Alignment = TextAlignmentMode.Justify - }, - - // ========================================== - // COLUMN 2 (Right: X = 415, Width = 330) - // ========================================== - new PdfTextElement - { - X = 415, - Y = 262, - Width = 330, - Height = 22, - Text = "V. SPECTROSCOPY & EXPERIMENTAL DATA", - FontSize = 11, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#0E7490" - }, - new PdfTextElement - { - X = 415, - Y = 286, - Width = 330, - Height = 58, - Text = "Table I summarizes the calibrated experimental parameters across 4 sub-modules of the 64-qubit quantum processor measured at a base temperature T = 12.5 mK.", - FontSize = 9.5, - FontFamily = "Times New Roman", - LineHeight = 1.35, - TextColorHex = "#334155", - Alignment = TextAlignmentMode.Justify - }, - - // Experimental cQED Table - new PdfTableElement - { - X = 415, - Y = 348, - Width = 330, - Height = 145, - Headers = new List { "Module", "ω_q / 2π", "g / 2π", "T₁ (μs)", "T₂* (μs)" }, - Rows = new List> - { - new() { "Array α (N=16)", "6.482 GHz", "184 MHz", "192.4", "184.2" }, - new() { "Array β (N=16)", "6.485 GHz", "181 MHz", "188.1", "176.5" }, - new() { "Array γ (N=16)", "6.479 GHz", "186 MHz", "195.0", "189.0" }, - new() { "Array δ (N=16)", "6.481 GHz", "183 MHz", "190.2", "182.8" } - }, - HeaderBackgroundHex = "#0891B2", - HeaderTextHex = "#FFFFFF", - AlternateRowBackgroundHex = "#ECFEFF", - BorderColorHex = "#CBD5E1" - }, - - new PdfTextElement - { - X = 415, - Y = 502, - Width = 330, - Height = 22, - Text = "VI. QUANTUM PHASE TRANSITION OBSERVATION", - FontSize = 11, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#0E7490" - }, - new PdfTextElement - { - X = 415, - Y = 526, - Width = 330, - Height = 115, - Text = "As the drive photon amplitude exceeds the critical threshold η_c = √(κγ)/2g, we detect macroscopic photon occupation within the cavity accompanied by spontaneous symmetry breaking of the collective spin polarization vector ⟨J_x⟩ ≠ 0 [3, 4].", - FontSize = 9.5, - FontFamily = "Times New Roman", - LineHeight = 1.35, - TextColorHex = "#334155", - Alignment = TextAlignmentMode.Justify - }, - - new PdfTextElement - { - X = 415, - Y = 648, - Width = 330, - Height = 22, - Text = "VII. TIME-RESOLVED PHOTON CORRELATIONS", - FontSize = 11, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#0E7490" - }, - new PdfTextElement - { - X = 415, - Y = 672, - Width = 330, - Height = 145, - Text = "Second-order correlation measurements g^(2)(τ) = ⟨â†(t) â†(t+τ) â(t+τ) â(t)⟩ / ⟨↠â⟩² demonstrate strong non-classical antibunching (g^(2)(0) = 0.08 ± 0.02) below the threshold, transitioning smoothly into super-Poissonian photon bunching at criticality.", - FontSize = 9.5, - FontFamily = "Times New Roman", - LineHeight = 1.35, - TextColorHex = "#334155", - Alignment = TextAlignmentMode.Justify - } - } - }; - - // ========================================================================= - // PAGE 2: Wigner Tomography, Fault Tolerance, Author Bios & References - // ========================================================================= - var page2 = new PdfPageModel - { - PageNumber = 2, - Format = PageFormat.A4, - Orientation = PageOrientation.Portrait, - Width = 800, - Height = 1131, - BackgroundColorHex = "#FFFFFF", - FooterLeft = "PHYSICAL REVIEW LETTERS • VOL. 136, 140401", - FooterRight = "Page 2 of 2", - Elements = new List - { - // Top Header Metadata Strip - new PdfTextElement - { - X = 55, - Y = 32, - Width = 690, - Height = 18, - Text = "BOHR, CHEN, AND THORNE: CAVITY QED IN SUPERCONDUCTING QUBITS", - FontSize = 8.5, - FontFamily = "Times New Roman", - TextColorHex = "#64748B", - Alignment = TextAlignmentMode.Center - }, - new PdfDividerElement - { - X = 55, - Y = 52, - Width = 690, - Height = 1, - Thickness = 0.75, - ColorHex = "#CBD5E1" - }, - - // ========================================== - // COLUMN 1 (Left: X = 55, Width = 330) - // ========================================== - new PdfTextElement - { - X = 55, - Y = 62, - Width = 330, - Height = 22, - Text = "VIII. WIGNER TOMOGRAPHY & SQUEEZING", - FontSize = 11, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#0E7490" - }, - new PdfTextElement - { - X = 55, - Y = 86, - Width = 330, - Height = 120, - Text = "Full quantum state tomography of the cavity mode reveals pronounced negativity in the reconstructed Wigner quasi-probability distribution W(α). Quadrature variance satisfies (ΔX_θ)² = e^{-2r} with squeeze parameter r = 1.43, demonstrating non-Gaussian quantum resource generation in macroscopic circuits [5].", - FontSize = 9.5, - FontFamily = "Times New Roman", - LineHeight = 1.35, - TextColorHex = "#334155", - Alignment = TextAlignmentMode.Justify - }, - - new PdfTextElement - { - X = 55, - Y = 212, - Width = 330, - Height = 22, - Text = "IX. FAULT-TOLERANT QUANTUM COMPUTING", - FontSize = 11, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#0E7490" - }, - new PdfTextElement - { - X = 55, - Y = 236, - Width = 330, - Height = 130, - Text = "The collective protection against single-qubit relaxation opens direct pathways for bosonic quantum error correction codes, specifically Gottesman-Kitaev-Preskill (GKP) grid states and cat-qubit parity measurements. With average gate fidelities ℱ_gate > 99.82%, the architecture satisfies the fault-tolerance threshold.", - FontSize = 9.5, - FontFamily = "Times New Roman", - LineHeight = 1.35, - TextColorHex = "#334155", - Alignment = TextAlignmentMode.Justify - }, - - new PdfTextElement - { - X = 55, - Y = 372, - Width = 330, - Height = 22, - Text = "X. CONCLUDING REMARKS", - FontSize = 11, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#0E7490" - }, - new PdfTextElement - { - X = 55, - Y = 396, - Width = 330, - Height = 90, - Text = "In conclusion, we achieved ultra-strong collective light-matter coupling in multi-transmon systems. This platform provides an ideal simulator for non-equilibrium quantum criticality and high-fidelity quantum transducers.", - FontSize = 9.5, - FontFamily = "Times New Roman", - LineHeight = 1.35, - TextColorHex = "#334155", - Alignment = TextAlignmentMode.Justify - }, - - // Author Biographies Header - new PdfTextElement - { - X = 55, - Y = 494, - Width = 330, - Height = 22, - Text = "AUTHOR BIOGRAPHIES", - FontSize = 10.5, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#0E7490" - }, - new PdfDividerElement - { - X = 55, - Y = 515, - Width = 330, - Height = 1, - Thickness = 0.75, - ColorHex = "#CBD5E1" - }, - - // Bio 1: Alexander Bohr - new PdfShapeElement - { - X = 55, - Y = 525, - Width = 34, - Height = 34, - CornerRadius = 17, - FillColorHex = "#0891B2", - Label = "AB", - LabelColorHex = "#FFFFFF", - LabelFontSize = 12 - }, - new PdfTextElement - { - X = 98, - Y = 523, - Width = 287, - Height = 65, - Text = "Alexander Bohr received his Ph.D. in Physics from Harvard in 2021. He leads experimental superconducting cQED research at the Harvard Quantum Optics Lab.", - FontSize = 8, - FontFamily = "Times New Roman", - LineHeight = 1.3, - TextColorHex = "#334155" - }, - - // Bio 2: Evelyn Chen - new PdfShapeElement - { - X = 55, - Y = 595, - Width = 34, - Height = 34, - CornerRadius = 17, - FillColorHex = "#0E7490", - Label = "EC", - LabelColorHex = "#FFFFFF", - LabelFontSize = 12 - }, - new PdfTextElement - { - X = 98, - Y = 593, - Width = 287, - Height = 65, - Text = "Evelyn Chen is an Associate Professor of Electrical Engineering and Physics at MIT, focusing on Josephson junction parametric amplifiers and quantum noise limits.", - FontSize = 8, - FontFamily = "Times New Roman", - LineHeight = 1.3, - TextColorHex = "#334155" - }, - - // ========================================== - // COLUMN 2 (Right: X = 415, Width = 330) - // ========================================== - new PdfTextElement - { - X = 415, - Y = 62, - Width = 330, - Height = 22, - Text = "REFERENCES", - FontSize = 10.5, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#0E7490" - }, - new PdfDividerElement - { - X = 415, - Y = 85, - Width = 330, - Height = 1, - Thickness = 0.75, - ColorHex = "#CBD5E1" - }, - new PdfTextElement - { - X = 415, - Y = 90, - Width = 330, - Height = 270, - Text = "[1] S. Haroche and J.-M. Raimond, Exploring the Quantum: Atoms, Cavities, and Photons, Oxford Univ. Press, 2006.\n[2] A. Blais, S. M. Girvin, and R. J. Schoelkopf, \"Circuit quantum electrodynamics,\" Rev. Mod. Phys., vol. 93, 025005, 2021.\n[3] M. H. Devoret and R. J. Schoelkopf, \"Superconducting circuits for quantum information,\" Science, vol. 339, pp. 1169–1174, 2013.\n[4] R. H. Dicke, \"Coherence in spontaneous radiation processes,\" Phys. Rev., vol. 93, pp. 99–110, 1954.\n[5] P. Krantz et al., \"A quantum engineer's guide to superconducting qubits,\" Appl. Phys. Rev., vol. 6, 021318, 2019.\n[6] D. Gottesman, A. Kitaev, and J. Preskill, \"Encoding a qubit in an oscillator,\" Phys. Rev. A, vol. 64, 012310, 2001.\n[7] M. Mirrahimi et al., \"Dynamically protected cat-qubits,\" New J. Phys., vol. 16, 045014, 2014.\n[8] J. M. Fink et al., \"Climbing the Jaynes-Cummings ladder and observing its nonlinearity,\" Nature, vol. 454, pp. 315–318, 2008.", - FontSize = 8, - FontFamily = "Times New Roman", - LineHeight = 1.35, - TextColorHex = "#475569", - Alignment = TextAlignmentMode.Justify - } - } - }; - - doc.Pages.Add(page1); - doc.Pages.Add(page2); - - return doc; - } -} diff --git a/src/PdfEditorApp/Templates/Career/ResumeAcademicCvTemplate.cs b/src/PdfEditorApp/Templates/Career/ResumeAcademicCvTemplate.cs deleted file mode 100644 index bdc1bed..0000000 --- a/src/PdfEditorApp/Templates/Career/ResumeAcademicCvTemplate.cs +++ /dev/null @@ -1,490 +0,0 @@ -using System.Collections.Generic; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; - -namespace PdfEditorApp.Templates.Career; - -public class ResumeAcademicCvTemplate : ITemplateDefinition -{ - public string Id => "resumeacademic"; - public string Name => "Academic & Scientific Curriculum Vitae"; - public string Description => "Comprehensive 2-page academic CV with grants table, peer-reviewed publications with DOIs, student advising, and editorial service"; - public string Category => "Career"; - public string IconKind => "SchoolOutline"; - public string AccentColorHex => "#78350F"; - - public PdfDocumentModel Create() - { - var doc = new PdfDocumentModel - { - Title = "Prof_John_Doe_Academic_CV.pdf", - Author = "Prof. John Doe, Ph.D.", - Subject = "Curriculum Vitae • Computational Neuroscience & Applied Mathematics" - }; - - // ========================================================================= - // PAGE 1: Header, Appointments, Education, Grants Table & Major Publications - // ========================================================================= - var page1 = new PdfPageModel - { - PageNumber = 1, - Format = PageFormat.A4, - Orientation = PageOrientation.Portrait, - Width = 800, - Height = 1131, - BackgroundColorHex = "#FFFFFF", - FooterLeft = "Prof. John Doe, Ph.D. • Curriculum Vitae | ORCID: 0000-0002-8910-4492", - FooterCenter = "FACULTY DOSSIER", - FooterRight = "Page 1 of 2", - Elements = new List - { - // Top Header Rule - new PdfDividerElement - { - X = 55, - Y = 35, - Width = 690, - Height = 2, - Thickness = 2, - ColorHex = "#78350F" - }, - - // Scholar Name - new PdfTextElement - { - X = 55, - Y = 45, - Width = 520, - Height = 34, - Text = "JOHN DOE, Ph.D.", - FontSize = 24, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#1E293B" - }, - - // Academic Title & Institutional Affiliation - new PdfTextElement - { - X = 55, - Y = 78, - Width = 520, - Height = 44, - Text = "Associate Professor of Applied Mathematics & Computational Neuroscience\nInstitute for Advanced Theoretical Studies • CodeFryDev Institute of Technology\nEmail: j.doe@codefrydev.in • Web: codefrydev.in/people/john-doe", - FontSize = 9.5, - FontFamily = "Times New Roman", - LineHeight = 1.35, - TextColorHex = "#475569" - }, - - // Top Right ORCID / Google Scholar QR Code - new PdfQrCodeElement - { - X = 645, - Y = 42, - Width = 100, - Height = 85, - Content = "https://orcid.org/0000-0002-8910-4492", - Label = "ORCID RECORD", - DarkColorHex = "#78350F", - LightColorHex = "#FFFFFF" - }, - - // Header Divider - new PdfDividerElement - { - X = 55, - Y = 126, - Width = 690, - Height = 1, - Thickness = 1, - ColorHex = "#CBD5E1" - }, - - // Section: Research Interests - new PdfTextElement - { - X = 55, - Y = 135, - Width = 690, - Height = 20, - Text = "PRIMARY RESEARCH FIELDS", - FontSize = 11, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#78350F" - }, - new PdfTextElement - { - X = 55, - Y = 155, - Width = 690, - Height = 34, - Text = "Topological Data Analysis, Neural Differential Equations, High-Dimensional Stochastic Dynamical Systems, Geometric Deep Learning, and Spectral Graph Theory on Cortical Manifolds.", - FontSize = 9.5, - FontFamily = "Times New Roman", - IsItalic = true, - LineHeight = 1.35, - TextColorHex = "#334155" - }, - - // Section: Academic Appointments - new PdfTextElement - { - X = 55, - Y = 190, - Width = 690, - Height = 20, - Text = "ACADEMIC APPOINTMENTS & POSITIONS", - FontSize = 11, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#78350F" - }, - new PdfDividerElement - { - X = 55, - Y = 208, - Width = 690, - Height = 1, - Thickness = 1, - ColorHex = "#E2E8F0" - }, - new PdfTextElement - { - X = 55, - Y = 214, - Width = 690, - Height = 68, - Text = "• Associate Professor (Tenured) — Mathematical Institute, Oxford University (2022 – Present)\n• Assistant Professor of Applied Mathematics — Stanford University (2018 – 2022)\n• Postdoctoral Research Fellow — Center for Brain Science, Harvard University (2015 – 2018)\n• Visiting Scholar — Max Planck Institute for Mathematics in the Sciences, Leipzig (2017)", - FontSize = 9, - FontFamily = "Times New Roman", - LineHeight = 1.4, - TextColorHex = "#334155" - }, - - // Section: Education - new PdfTextElement - { - X = 55, - Y = 285, - Width = 690, - Height = 20, - Text = "EDUCATION & DEGREES CONFERRED", - FontSize = 11, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#78350F" - }, - new PdfDividerElement - { - X = 55, - Y = 303, - Width = 690, - Height = 1, - Thickness = 1, - ColorHex = "#E2E8F0" - }, - new PdfTextElement - { - X = 55, - Y = 309, - Width = 690, - Height = 58, - Text = "• Ph.D. in Applied Mathematics — Harvard University (2011 – 2015)\n Dissertation: Spectral Geometry and Persistent Homology on Cortical Surfaces. Advisor: Prof. Shing-Tung Yau.\n• M.Sc. in Theoretical Physics — Cambridge University (Part III of Mathematical Tripos, Distinction, 2010 – 2011)\n• B.Sc. in Mathematics & Physics — MIT (Summa Cum Laude, GPA 4.00/4.00, 2006 – 2010)", - FontSize = 9, - FontFamily = "Times New Roman", - LineHeight = 1.35, - TextColorHex = "#334155" - }, - - // Section: Major Research Grants & Funding - new PdfTextElement - { - X = 55, - Y = 370, - Width = 690, - Height = 20, - Text = "MAJOR FUNDED RESEARCH GRANTS ($4.2M TOTAL AWARDS)", - FontSize = 11, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#78350F" - }, - new PdfDividerElement - { - X = 55, - Y = 388, - Width = 690, - Height = 1, - Thickness = 1, - ColorHex = "#E2E8F0" - }, - - // Table of Grants - new PdfTableElement - { - X = 55, - Y = 394, - Width = 690, - Height = 115, - Headers = new List { "Grant Agency & Title", "Grant Number", "Role", "Funding Period", "Total Amount" }, - Rows = new List> - { - new() { "ERC Consolidator Grant (Topological Brain Dynamics)", "ERC-2023-COG-948", "Principal Investigator", "2024 – 2029", "€2,000,000" }, - new() { "NSF DMS CAREER: Geometric Deep Learning on Manifolds", "DMS-2048910", "Sole PI", "2020 – 2025", "$520,000" }, - new() { "NIH BRAIN Initiative: High-Dimensional Cortical Tracking", "U01-MH12498", "Co-PI (with Stanford Med)", "2019 – 2023", "$1,450,000" } - }, - HeaderBackgroundHex = "#78350F", - HeaderTextHex = "#FFFFFF", - AlternateRowBackgroundHex = "#FFFDF9", - BorderColorHex = "#E2E8F0" - }, - - // Section: Selected Peer-Reviewed Publications (Part 1) - new PdfTextElement - { - X = 55, - Y = 520, - Width = 690, - Height = 20, - Text = "SELECTED PEER-REVIEWED PUBLICATIONS (OVER 45 PEER-REVIEWED PAPERS, h-index: 28)", - FontSize = 11, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#78350F" - }, - new PdfDividerElement - { - X = 55, - Y = 538, - Width = 690, - Height = 1, - Thickness = 1, - ColorHex = "#E2E8F0" - }, - new PdfTextElement - { - X = 55, - Y = 544, - Width = 690, - Height = 185, - Text = "1. Doe, J., & Chen, E. (2025). \"Persistent Spectral Cohomology on High-Dimensional Simplicial Manifolds.\" Journal of the American Mathematical Society, 38(2), pp. 412–458. DOI: 10.1090/jams/9842.\n2. Doe, J., Thorne, M., & Jenkins, S. (2024). \"Neural Differential Equations with Guaranteed Stability via Hodge Decomposition.\" Nature Machine Intelligence, 6(8), pp. 892–906. DOI: 10.1038/s42256-024-00892.\n3. Doe, J. (2023). \"Spectral Gap Concentration on Random Simplicial Complexes.\" Communications on Pure and Applied Mathematics, 76(4), pp. 789–834. DOI: 10.1002/cpa.22019.\n4. Vance, E., & Doe, J. (2022). \"Topological Decoding of Multi-Electrode Array Cortical Spikes.\" Proceedings of the National Academy of Sciences (PNAS), 119(14), e2119842119. DOI: 10.1073/pnas.2119842119.\n5. Doe, J., et al. (2020). \"Continuous Invertible Neural Flows on Riemannian Manifolds.\" IEEE Transactions on Pattern Analysis and Machine Intelligence (TPAMI), 42(11), pp. 2780–2794. DOI: 10.1109/TPAMI.2020.29841.", - FontSize = 8.5, - FontFamily = "Times New Roman", - LineHeight = 1.35, - TextColorHex = "#334155" - } - } - }; - - // ========================================================================= - // PAGE 2: Additional Publications, Keynotes, Teaching, Advising & Service - // ========================================================================= - var page2 = new PdfPageModel - { - PageNumber = 2, - Format = PageFormat.A4, - Orientation = PageOrientation.Portrait, - Width = 800, - Height = 1131, - BackgroundColorHex = "#FFFFFF", - FooterLeft = "Prof. John Doe, Ph.D. • Curriculum Vitae (Page 2)", - FooterCenter = "FACULTY DOSSIER", - FooterRight = "Page 2 of 2", - Elements = new List - { - // Top Header Rule - new PdfDividerElement - { - X = 55, - Y = 35, - Width = 690, - Height = 2, - Thickness = 2, - ColorHex = "#78350F" - }, - - // Section: Additional Publications (Part 2) - new PdfTextElement - { - X = 55, - Y = 48, - Width = 690, - Height = 20, - Text = "ADDITIONAL PEER-REVIEWED ARTICLES & MONOGRAPHS", - FontSize = 11, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#78350F" - }, - new PdfDividerElement - { - X = 55, - Y = 70, - Width = 690, - Height = 1, - Thickness = 1, - ColorHex = "#E2E8F0" - }, - new PdfTextElement - { - X = 55, - Y = 76, - Width = 690, - Height = 150, - Text = "6. Doe, J., & Sterling, C. (2020). \"Discrete Bochner Laplacians and Curvature Bounds on Cell Complexes.\" SIAM Journal on Applied Mathematics, 80(3), pp. 1120–1145. DOI: 10.1137/19M1284102.\n7. Doe, J., & Tanaka, H. (2019). \"Diffusion Geometry on Non-Compact Symmetric Spaces.\" Journal of Machine Learning Research (JMLR), 20(84), pp. 1–38.\n8. Doe, J. (2018). \"Spectral Geometry of Cortical Folding Patterns.\" Cambridge University Press Research Monograph Series in Mathematical Biology, Vol. 14, 280 pages. ISBN 978-1-108-49210-4.\n9. Thorne, J., & Doe, J. (2017). \"Persistent Homology of Neural Population Codes.\" Physical Review E, 96(4), 042412. DOI: 10.1103/PhysRevE.96.042412.", - FontSize = 8.5, - FontFamily = "Times New Roman", - LineHeight = 1.35, - TextColorHex = "#334155" - }, - - // Section: Invited Keynotes & Plenaries - new PdfTextElement - { - X = 55, - Y = 232, - Width = 690, - Height = 20, - Text = "INVITED KEYNOTES & PLENARY ADDRESSES", - FontSize = 11, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#78350F" - }, - new PdfDividerElement - { - X = 55, - Y = 254, - Width = 690, - Height = 1, - Thickness = 1, - ColorHex = "#E2E8F0" - }, - new PdfTextElement - { - X = 55, - Y = 260, - Width = 690, - Height = 65, - Text = "• Plenary Speaker, International Congress of Mathematicians (ICM 2026, Section on Applied Topology, Helsinki)\n• Invited Keynote, NeurIPS 2024 Workshop on Differential Geometry in Deep Learning (Vancouver, BC)\n• Euler Lecturer, Zurich Mathematics Colloquium, ETH Zurich (2023)\n• Courant Institute Annual Distinguished Lecture in Applied Mathematics, NYU (2022)\n• Invited Plenary, SIAM Conference on Mathematics of Data Science (MDS 2020)", - FontSize = 8.5, - FontFamily = "Times New Roman", - LineHeight = 1.35, - TextColorHex = "#334155" - }, - - // Section: Ph.D. Advising & Postdoctoral Mentorship - new PdfTextElement - { - X = 55, - Y = 330, - Width = 330, - Height = 20, - Text = "PH.D. STUDENTS & POSTDOCS SUPERVISED", - FontSize = 11, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#78350F" - }, - new PdfDividerElement - { - X = 55, - Y = 352, - Width = 330, - Height = 1, - Thickness = 1, - ColorHex = "#E2E8F0" - }, - new PdfTextElement - { - X = 55, - Y = 358, - Width = 330, - Height = 90, - Text = "• Dr. Clara Sterling (Ph.D. 2023, now Assistant Professor at Cambridge)\n• Dr. Julian Thorne (Ph.D. 2024, Postdoc at MIT Mathematics)\n• Dr. Hiroshi Tanaka (Postdoc 2021–2024, now Faculty at Tokyo Univ)\n• Currently advising 4 Ph.D. students and 2 postdoctoral fellows.", - FontSize = 8.5, - FontFamily = "Times New Roman", - LineHeight = 1.35, - TextColorHex = "#334155" - }, - - // Section: Editorial Boards & Review Service - new PdfTextElement - { - X = 415, - Y = 330, - Width = 330, - Height = 20, - Text = "EDITORIAL BOARDS & SERVICE", - FontSize = 11, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#78350F" - }, - new PdfDividerElement - { - X = 415, - Y = 352, - Width = 330, - Height = 1, - Thickness = 1, - ColorHex = "#E2E8F0" - }, - new PdfTextElement - { - X = 415, - Y = 358, - Width = 330, - Height = 90, - Text = "• Associate Editor, SIAM Journal on Applied Mathematics (2021–Present)\n• Action Editor, Journal of Machine Learning Research (JMLR)\n• Program Chair, Computational Topology & Geometry 2025\n• NSF & ERC Panel Reviewer (Mathematics & Computing)", - FontSize = 8.5, - FontFamily = "Times New Roman", - LineHeight = 1.35, - TextColorHex = "#334155" - }, - - // Section: University Teaching & Courses Taught - new PdfTextElement - { - X = 55, - Y = 455, - Width = 690, - Height = 20, - Text = "UNIVERSITY TEACHING & CURRICULUM DEVELOPMENT", - FontSize = 11, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#78350F" - }, - new PdfDividerElement - { - X = 55, - Y = 477, - Width = 690, - Height = 1, - Thickness = 1, - ColorHex = "#E2E8F0" - }, - new PdfTextElement - { - X = 55, - Y = 483, - Width = 690, - Height = 65, - Text = "• MATH 842: High-Dimensional Stochastic Differential Equations (Oxford, Graduate Level, 2022–2026)\n• MATH 510: Computational Topology and Persistent Homology (Stanford / Oxford, 2019–2025)\n• Recipient of Oxford University Outstanding Graduate Teaching Award (2024)", - FontSize = 8.5, - FontFamily = "Times New Roman", - LineHeight = 1.35, - TextColorHex = "#334155" - } - } - }; - - doc.Pages.Add(page1); - doc.Pages.Add(page2); - - return doc; - } -} diff --git a/src/PdfEditorApp/Templates/Career/ResumeCreativeMinimalistTemplate.cs b/src/PdfEditorApp/Templates/Career/ResumeCreativeMinimalistTemplate.cs deleted file mode 100644 index 07d8888..0000000 --- a/src/PdfEditorApp/Templates/Career/ResumeCreativeMinimalistTemplate.cs +++ /dev/null @@ -1,472 +0,0 @@ -using System.Collections.Generic; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; - -namespace PdfEditorApp.Templates.Career; - -public class ResumeCreativeMinimalistTemplate : ITemplateDefinition -{ - public string Id => "resumecreative"; - public string Name => "Creative UI/UX Design Director Resume"; - public string Description => "Minimalist design resume featuring creative philosophy, case study outcomes, and interactive Figma QR code"; - public string Category => "Career"; - public string IconKind => "PaletteOutline"; - public string AccentColorHex => "#0D9488"; - - public PdfDocumentModel Create() - { - var doc = new PdfDocumentModel - { - Title = "Jane_Doe_Design_Director_Resume.pdf", - Author = "Jane Doe", - Subject = "Senior Design Director & UI/UX Specialist Resume" - }; - - var page = new PdfPageModel - { - PageNumber = 1, - Format = PageFormat.A4, - Orientation = PageOrientation.Portrait, - Width = 800, - Height = 1131, - BackgroundColorHex = "#FCFCFD", - FooterLeft = "Jane Doe • Creative Director & Product Designer | codefrydev.in", - FooterCenter = "PORTFOLIO & CASE STUDIES", - FooterRight = "Page 1 of 1", - Elements = new List - { - // Top Teal Accent Bar - new PdfShapeElement - { - X = 55, - Y = 40, - Width = 690, - Height = 4, - FillColorHex = "#0D9488", - StrokeColorHex = "#00000000", - StrokeThickness = 0 - }, - - // Candidate Name & Creative Title - new PdfTextElement - { - X = 55, - Y = 54, - Width = 480, - Height = 38, - Text = "JANE DOE", - FontSize = 28, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0F172A" - }, - new PdfTextElement - { - X = 55, - Y = 92, - Width = 480, - Height = 24, - Text = "Design Director • Principal Product & Interaction Designer", - FontSize = 12.5, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0D9488" - }, - - // Contact Strip - new PdfTextElement - { - X = 55, - Y = 116, - Width = 520, - Height = 20, - Text = "🌐 codefrydev.in • ✉️ jane.doe@codefrydev.in • 📍 New York, NY • 📱 +1 (555) 019-2834", - FontSize = 9.5, - FontFamily = "Segoe UI", - TextColorHex = "#64748B" - }, - - // Top Right Interactive Portfolio QR Code - new PdfQrCodeElement - { - X = 645, - Y = 48, - Width = 100, - Height = 85, - Content = "https://codefrydev.in/case-studies", - Label = "VIEW CASE STUDIES", - DarkColorHex = "#0D9488", - LightColorHex = "#FCFCFD" - }, - - // Header Divider Line - new PdfDividerElement - { - X = 55, - Y = 142, - Width = 690, - Height = 1, - Thickness = 1, - ColorHex = "#E2E8F0" - }, - - // Creative Statement / Design Philosophy Box - new PdfShapeElement - { - X = 55, - Y = 152, - Width = 690, - Height = 72, - CornerRadius = 8, - FillColorHex = "#F0FDFA", - StrokeColorHex = "#99F6E4", - StrokeThickness = 1 - }, - new PdfTextElement - { - X = 72, - Y = 160, - Width = 656, - Height = 56, - Text = "\"Designing at the intersection of emotional elegance, strict accessibility, and data-driven usability. 10+ years shaping high-growth digital products adopted by 50M+ users globally, transforming complex enterprise workflows into intuitive, joyous experiences.\"", - FontSize = 9.5, - FontFamily = "Segoe UI", - IsItalic = true, - LineHeight = 1.45, - TextColorHex = "#115E59" - }, - - // Section: Core Design Disciplines - new PdfTextElement - { - X = 55, - Y = 236, - Width = 690, - Height = 22, - Text = "CORE DESIGN DISCIPLINES & EXPERTISE", - FontSize = 12, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0F172A" - }, - new PdfDividerElement - { - X = 55, - Y = 258, - Width = 690, - Height = 1, - Thickness = 1, - ColorHex = "#E2E8F0" - }, - new PdfTextElement - { - X = 55, - Y = 265, - Width = 330, - Height = 65, - Text = "• Design Systems Architecture & Tokenization\n• End-to-End Product & Mobile App Strategy\n• User Research, Ethnography & Usability Testing\n• WCAG AAA Accessibility & Inclusive Design", - FontSize = 9, - FontFamily = "Segoe UI", - LineHeight = 1.35, - TextColorHex = "#334155" - }, - new PdfTextElement - { - X = 415, - Y = 265, - Width = 330, - Height = 65, - Text = "• Interactive Prototyping & Motion Choreography\n• 3D Spatial & Canvas Interface Engineering\n• Cross-Functional Leadership (Design & Engineering)\n• Brand Identity, Editorial Direction & Storytelling", - FontSize = 9, - FontFamily = "Segoe UI", - LineHeight = 1.35, - TextColorHex = "#334155" - }, - - // Section: Design Leadership Experience - new PdfTextElement - { - X = 55, - Y = 340, - Width = 690, - Height = 22, - Text = "DESIGN LEADERSHIP EXPERIENCE", - FontSize = 12, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0F172A" - }, - new PdfDividerElement - { - X = 55, - Y = 362, - Width = 690, - Height = 1, - Thickness = 1, - ColorHex = "#E2E8F0" - }, - - // Role 1 - new PdfTextElement - { - X = 55, - Y = 370, - Width = 490, - Height = 20, - Text = "Design Director | CodeFryDev Design Studio — New York, NY", - FontSize = 11, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#1E293B" - }, - new PdfTextElement - { - X = 550, - Y = 370, - Width = 195, - Height = 20, - Text = "2022 – Present", - FontSize = 9.5, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0D9488", - Alignment = TextAlignmentMode.Right - }, - new PdfTextElement - { - X = 55, - Y = 390, - Width = 690, - Height = 85, - Text = "✦ Built and mentored a high-performing team of 14 product designers, motion artists, and design system engineers.\n✦ Directed the redesign of an enterprise fintech suite handling $12B+ in annual transaction volume, lifting Task Success Rate by +28% and NPS by +34 points.\n✦ Created the unified 'Aura' multiplatform design system deployed across iOS, Android, Web, and Desktop.", - FontSize = 9, - FontFamily = "Segoe UI", - LineHeight = 1.4, - TextColorHex = "#334155" - }, - - // Role 2 - new PdfTextElement - { - X = 55, - Y = 485, - Width = 490, - Height = 20, - Text = "Principal Product Designer | CodeFryDev Interactive — San Francisco, CA", - FontSize = 11, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#1E293B" - }, - new PdfTextElement - { - X = 550, - Y = 485, - Width = 195, - Height = 20, - Text = "2018 – 2022", - FontSize = 9.5, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0D9488", - Alignment = TextAlignmentMode.Right - }, - new PdfTextElement - { - X = 55, - Y = 505, - Width = 690, - Height = 85, - Text = "✦ Led end-to-end UX vision for new Host Onboarding flow across 220 countries, resulting in a +19.4% increase in completed active listings within the first 60 days.\n✦ Conducted in-depth contextual inquiry user studies in Tokyo, London, and Berlin to identify friction points in multi-calendar management.\n✦ Collaborated closely with VP of Design on strategic brand evolutionary guidelines.", - FontSize = 9, - FontFamily = "Segoe UI", - LineHeight = 1.4, - TextColorHex = "#334155" - }, - - // Role 3 - new PdfTextElement - { - X = 55, - Y = 600, - Width = 490, - Height = 20, - Text = "Senior Interaction Designer | CodeFryDev Creative — New York, NY", - FontSize = 11, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#1E293B" - }, - new PdfTextElement - { - X = 550, - Y = 600, - Width = 195, - Height = 20, - Text = "2015 – 2018", - FontSize = 9.5, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0D9488", - Alignment = TextAlignmentMode.Right - }, - new PdfTextElement - { - X = 55, - Y = 620, - Width = 690, - Height = 75, - Text = "✦ Crafted award-winning digital experiences and spatial interactive installations for clients including MoMA, The Atlantic, and Spotify.\n✦ Authored interactive brand design guides and dynamic typography specifications.\n✦ Recipient of Red Dot Best of the Best Award 2017.", - FontSize = 9, - FontFamily = "Segoe UI", - LineHeight = 1.4, - TextColorHex = "#334155" - }, - - // Section: Featured Case Studies & Quantified Impact - new PdfTextElement - { - X = 55, - Y = 705, - Width = 690, - Height = 22, - Text = "FEATURED CASE STUDIES & MEASURED IMPACT", - FontSize = 12, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0F172A" - }, - new PdfDividerElement - { - X = 55, - Y = 727, - Width = 690, - Height = 1, - Thickness = 1, - ColorHex = "#E2E8F0" - }, - - // Case Study Cards - new PdfShapeElement - { - X = 55, - Y = 735, - Width = 330, - Height = 90, - CornerRadius = 6, - FillColorHex = "#F8FAFC", - StrokeColorHex = "#E2E8F0", - StrokeThickness = 1 - }, - new PdfTextElement - { - X = 68, - Y = 742, - Width = 304, - Height = 78, - Text = "🏆 Global Fintech Workspace Reimagination\nRole: Lead Design Strategist • Client: Fortune 100\nImpact: +38% time savings on trades, $45M revenue impact, 0 accessibility violations across 48 modules.", - FontSize = 8.5, - FontFamily = "Segoe UI", - LineHeight = 1.35, - TextColorHex = "#334155" - }, - - new PdfShapeElement - { - X = 415, - Y = 735, - Width = 330, - Height = 90, - CornerRadius = 6, - FillColorHex = "#F8FAFC", - StrokeColorHex = "#E2E8F0", - StrokeThickness = 1 - }, - new PdfTextElement - { - X = 428, - Y = 742, - Width = 304, - Height = 78, - Text = "🎨 Spatial Museum Interactive Experience\nRole: Creative Director • Client: Whitney Museum\nImpact: 1.4M visitors engaged, Featured in Fast Company Innovation by Design, Awwwards Site of the Year.", - FontSize = 8.5, - FontFamily = "Segoe UI", - LineHeight = 1.35, - TextColorHex = "#334155" - }, - - // Section: Education & Recognition - new PdfTextElement - { - X = 55, - Y = 835, - Width = 330, - Height = 22, - Text = "EDUCATION & TRAINING", - FontSize = 12, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0F172A" - }, - new PdfDividerElement - { - X = 55, - Y = 857, - Width = 330, - Height = 1, - Thickness = 1, - ColorHex = "#E2E8F0" - }, - new PdfTextElement - { - X = 55, - Y = 864, - Width = 330, - Height = 65, - Text = "Master of Fine Arts (MFA) in Interaction Design\nSchool of Visual Arts (SVA), New York (2013 – 2015)\n\nB.A. in Graphic Design & Human-Computer Interaction\nCarnegie Mellon University • With University Honors", - FontSize = 8.5, - FontFamily = "Segoe UI", - LineHeight = 1.35, - TextColorHex = "#334155" - }, - - new PdfTextElement - { - X = 415, - Y = 835, - Width = 330, - Height = 22, - Text = "AWARDS & JURIES", - FontSize = 12, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0F172A" - }, - new PdfDividerElement - { - X = 415, - Y = 857, - Width = 330, - Height = 1, - Thickness = 1, - ColorHex = "#E2E8F0" - }, - new PdfTextElement - { - X = 415, - Y = 864, - Width = 330, - Height = 65, - Text = "• D&AD Yellow Pencil Winner (Digital Design 2023)\n• Red Dot: Best of the Best Award (2017, 2021)\n• Jury Member, AIGA National Design Competitions\n• Fast Company 100 Most Creative People in Business", - FontSize = 8.5, - FontFamily = "Segoe UI", - LineHeight = 1.35, - TextColorHex = "#334155" - } - } - }; - - doc.Pages.Add(page); - return doc; - } -} diff --git a/src/PdfEditorApp/Templates/Career/ResumeModernCleanTemplate.cs b/src/PdfEditorApp/Templates/Career/ResumeModernCleanTemplate.cs deleted file mode 100644 index df5533e..0000000 --- a/src/PdfEditorApp/Templates/Career/ResumeModernCleanTemplate.cs +++ /dev/null @@ -1,606 +0,0 @@ -using System.Collections.Generic; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; - -namespace PdfEditorApp.Templates.Career; - -public class ResumeModernCleanTemplate : ITemplateDefinition -{ - public string Id => "resumemodern"; - public string Name => "Modern Tech & Product Resume"; - public string Description => "Two-column tech resume with skills sidebar, verified metrics, and interactive GitHub QR code"; - public string Category => "Career"; - public string IconKind => "AccountTieOutline"; - public string AccentColorHex => "#0284C7"; - - public PdfDocumentModel Create() - { - var doc = new PdfDocumentModel - { - Title = "John_Doe_Product_Engineer_Resume.pdf", - Author = "John Doe", - Subject = "Lead Product & Full-Stack Engineer Resume" - }; - - var page = new PdfPageModel - { - PageNumber = 1, - Format = PageFormat.A4, - Orientation = PageOrientation.Portrait, - Width = 800, - Height = 1131, - BackgroundColorHex = "#FFFFFF", - FooterLeft = "John Doe • Lead Product Engineer | Portfolio: codefrydev.in", - FooterCenter = "CONFIDENTIAL", - FooterRight = "Page 1 of 1", - Elements = new List - { - // Left Column Background Sidebar (Width: 245) - new PdfShapeElement - { - X = 0, - Y = 0, - Width = 245, - Height = 1131, - FillColorHex = "#F1F5F9", - StrokeColorHex = "#00000000", - StrokeThickness = 0 - }, - - // Sidebar Right Border Line - new PdfDividerElement - { - IsVertical = true, - X = 245, - Y = 0, - Width = 1, - Height = 1131, - Thickness = 1, - ColorHex = "#CBD5E1" - }, - - // ========================================== - // SIDEBAR CONTENT (Left Column: X = 20, Width = 205) - // ========================================== - - // Monogram Initials Avatar Badge - new PdfShapeElement - { - X = 85, - Y = 45, - Width = 75, - Height = 75, - CornerRadius = 38, - FillColorHex = "#0284C7", - StrokeColorHex = "#0369A1", - StrokeThickness = 2, - Label = "JD", - LabelColorHex = "#FFFFFF", - LabelFontSize = 26 - }, - - // Contact Details Header - new PdfTextElement - { - X = 20, - Y = 135, - Width = 205, - Height = 22, - Text = "CONTACT", - FontSize = 11.5, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0F172A" - }, - new PdfDividerElement - { - X = 20, - Y = 157, - Width = 205, - Height = 1, - Thickness = 1, - ColorHex = "#0284C7" - }, - new PdfTextElement - { - X = 20, - Y = 162, - Width = 205, - Height = 100, - Text = "📧 john.doe@codefrydev.in\n📱 +1 (555) 019-2834\n📍 San Francisco, CA\n🌐 codefrydev.in\n🐙 github.com/codefrydev\n💼 linkedin.com/in/codefrydev", - FontSize = 8.5, - FontFamily = "Segoe UI", - LineHeight = 1.45, - TextColorHex = "#334155" - }, - - // Technical Skills Header - new PdfTextElement - { - X = 20, - Y = 272, - Width = 205, - Height = 22, - Text = "TECHNICAL SKILLS", - FontSize = 11.5, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0F172A" - }, - new PdfDividerElement - { - X = 20, - Y = 294, - Width = 205, - Height = 1, - Thickness = 1, - ColorHex = "#0284C7" - }, - new PdfTextElement - { - X = 20, - Y = 298, - Width = 205, - Height = 200, - Text = "LANGUAGES\n• TypeScript, C# / .NET 9, Go, Python, SQL\n\nFRONTEND & UI\n• React, Next.js, Avalonia UI, TailwindCSS, WebGL, Redux, Vite\n\nBACKEND & CLOUD\n• Node.js, ASP.NET Core, GraphQL, gRPC, Kafka, Redis, PostgreSQL\n\nDEVOPS & INFRA\n• AWS, Kubernetes, Docker, Terraform, GitHub Actions CI/CD", - FontSize = 8.5, - FontFamily = "Segoe UI", - LineHeight = 1.35, - TextColorHex = "#334155" - }, - - // Education Header - new PdfTextElement - { - X = 20, - Y = 508, - Width = 205, - Height = 22, - Text = "EDUCATION", - FontSize = 11.5, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0F172A" - }, - new PdfDividerElement - { - X = 20, - Y = 530, - Width = 205, - Height = 1, - Thickness = 1, - ColorHex = "#0284C7" - }, - new PdfTextElement - { - X = 20, - Y = 535, - Width = 205, - Height = 90, - Text = "B.S. in Computer Science\nUniversity of California, Berkeley\nGPA: 3.89 / 4.00 (2016 – 2020)\n• Regents & Chancellor's Scholar\n• Tau Beta Pi Engineering Honor", - FontSize = 8.5, - FontFamily = "Segoe UI", - LineHeight = 1.35, - TextColorHex = "#334155" - }, - - // Certifications Header - new PdfTextElement - { - X = 20, - Y = 635, - Width = 205, - Height = 22, - Text = "CERTIFICATIONS", - FontSize = 11.5, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0F172A" - }, - new PdfDividerElement - { - X = 20, - Y = 657, - Width = 205, - Height = 1, - Thickness = 1, - ColorHex = "#0284C7" - }, - new PdfTextElement - { - X = 20, - Y = 662, - Width = 205, - Height = 70, - Text = "• AWS Solutions Architect Professional\n• Certified Kubernetes Application Developer (CKAD)\n• Meta Front-End Certified Professional", - FontSize = 8.5, - FontFamily = "Segoe UI", - LineHeight = 1.35, - TextColorHex = "#334155" - }, - - // Sidebar Live Portfolio QR Code - new PdfQrCodeElement - { - X = 72, - Y = 745, - Width = 100, - Height = 100, - Content = "https://github.com/codefrydev", - Label = "SCAN FOR GITHUB", - DarkColorHex = "#0284C7", - LightColorHex = "#F1F5F9" - }, - - // Spoken Languages - new PdfTextElement - { - X = 20, - Y = 855, - Width = 205, - Height = 22, - Text = "LANGUAGES", - FontSize = 11.5, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0F172A" - }, - new PdfDividerElement - { - X = 20, - Y = 875, - Width = 205, - Height = 1, - Thickness = 1, - ColorHex = "#0284C7" - }, - new PdfTextElement - { - X = 20, - Y = 882, - Width = 205, - Height = 50, - Text = "• English (Native / Bilingual)\n• Mandarin Chinese (Fluent)\n• German (Conversational B1)", - FontSize = 8.5, - FontFamily = "Segoe UI", - LineHeight = 1.35, - TextColorHex = "#334155" - }, - - // ========================================== - // MAIN BODY CONTENT (Right Column: X = 265, Width = 480) - // ========================================== - - // Candidate Name - new PdfTextElement - { - X = 265, - Y = 40, - Width = 480, - Height = 34, - Text = "JOHN DOE", - FontSize = 26, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0F172A" - }, - - // Subtitle / Professional Title - new PdfTextElement - { - X = 265, - Y = 74, - Width = 480, - Height = 22, - Text = "Lead Product Engineer • Full-Stack & Systems Architecture", - FontSize = 12.5, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0284C7" - }, - - // Executive Summary Card - new PdfTextElement - { - X = 265, - Y = 98, - Width = 480, - Height = 65, - Text = "High-velocity Lead Product Engineer with 7+ years of track record architecting mission-critical SaaS web & desktop applications. Proven expertise in zero-to-one product engineering, leading distributed frontend teams, and refactoring core ingestion pipelines to support 10M+ daily active users.", - FontSize = 9.5, - FontFamily = "Segoe UI", - LineHeight = 1.4, - TextColorHex = "#475569" - }, - - // Section: Professional Experience - new PdfTextElement - { - X = 265, - Y = 170, - Width = 480, - Height = 22, - Text = "PROFESSIONAL EXPERIENCE", - FontSize = 13, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0F172A" - }, - new PdfDividerElement - { - X = 265, - Y = 192, - Width = 480, - Height = 2, - Thickness = 1.5, - ColorHex = "#0284C7" - }, - - // Job 1 - new PdfTextElement - { - X = 265, - Y = 202, - Width = 330, - Height = 20, - Text = "Lead Product Engineer | CodeFryDev Technologies", - FontSize = 11, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#1E293B" - }, - new PdfTextElement - { - X = 600, - Y = 202, - Width = 145, - Height = 20, - Text = "2023 – Present • SF, CA", - FontSize = 9.5, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0284C7", - Alignment = TextAlignmentMode.Right - }, - new PdfTextElement - { - X = 265, - Y = 224, - Width = 480, - Height = 85, - Text = "• Led a squad of 8 engineers architecting real-time collaboration canvas with WebGL & WebSockets, reducing latency by 45% for 2.4M enterprise users.\n• Built automated design token compilation engine across web and desktop clients, cutting designer-to-code iteration time by 60%.\n• Designed multi-tenant billing & seat provisioning microservice processing $35M+ annual recurring revenue with 99.99% uptime.", - FontSize = 9, - FontFamily = "Segoe UI", - LineHeight = 1.4, - TextColorHex = "#334155" - }, - - // Job 2 - new PdfTextElement - { - X = 265, - Y = 315, - Width = 330, - Height = 20, - Text = "Senior Full-Stack Engineer | CodeFryDev Solutions", - FontSize = 11, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#1E293B" - }, - new PdfTextElement - { - X = 600, - Y = 315, - Width = 145, - Height = 20, - Text = "2021 – 2023 • SF, CA", - FontSize = 9.5, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0284C7", - Alignment = TextAlignmentMode.Right - }, - new PdfTextElement - { - X = 265, - Y = 337, - Width = 480, - Height = 85, - Text = "• Spearheaded redesign of multi-currency onboarding KYC flow across 35 countries, improving checkout completion rate by +14.2%.\n• Optimized global GraphQL API caching layer with Redis cluster, dropping P95 API response times from 340ms to 48ms.\n• Mentored 5 junior and mid-level engineers through code reviews, tech talks, and comprehensive RFC design document templates.", - FontSize = 9, - FontFamily = "Segoe UI", - LineHeight = 1.4, - TextColorHex = "#334155" - }, - - // Job 3 - new PdfTextElement - { - X = 265, - Y = 428, - Width = 330, - Height = 20, - Text = "Software Engineer | CodeFryDev Labs", - FontSize = 11, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#1E293B" - }, - new PdfTextElement - { - X = 600, - Y = 428, - Width = 145, - Height = 20, - Text = "2019 – 2021 • Berkeley, CA", - FontSize = 9.5, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0284C7", - Alignment = TextAlignmentMode.Right - }, - new PdfTextElement - { - X = 265, - Y = 450, - Width = 480, - Height = 80, - Text = "• Engineered interactive data visualization dashboards rendering 500,000+ data points smoothly at 60 FPS using React & D3.js.\n• Migrated legacy monolith backend to containerized Docker services running on AWS ECS, decreasing deployment cycle from 3 days to 15 minutes.\n• Implemented automated Jest and Cypress test suites achieving 91% code coverage.", - FontSize = 9, - FontFamily = "Segoe UI", - LineHeight = 1.4, - TextColorHex = "#334155" - }, - - // Section: Featured Open Source & Projects - new PdfTextElement - { - X = 265, - Y = 538, - Width = 480, - Height = 22, - Text = "FEATURED OPEN SOURCE & KEY PROJECTS", - FontSize = 13, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0F172A" - }, - new PdfDividerElement - { - X = 265, - Y = 560, - Width = 480, - Height = 2, - Thickness = 1.5, - ColorHex = "#0284C7" - }, - - // Project 1 - new PdfTextElement - { - X = 265, - Y = 570, - Width = 480, - Height = 20, - Text = "🚀 FastCanvas-Core (Creator & Maintainer — 3.2k GitHub Stars)", - FontSize = 10.5, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0284C7" - }, - new PdfTextElement - { - X = 265, - Y = 592, - Width = 480, - Height = 55, - Text = "Lightweight zero-allocation 2D vector drawing library built on WebAssembly and Skia. Adopted by over 40,000 active web applications worldwide with sub-millisecond layer caching.", - FontSize = 9, - FontFamily = "Segoe UI", - LineHeight = 1.35, - TextColorHex = "#334155" - }, - - // Project 2 - new PdfTextElement - { - X = 265, - Y = 652, - Width = 480, - Height = 20, - Text = "⚡ Micro-State-Sync (Co-Author)", - FontSize = 10.5, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0284C7" - }, - new PdfTextElement - { - X = 265, - Y = 674, - Width = 480, - Height = 55, - Text = "CRDT-based real-time state synchronization engine for collaborative multi-user editing with conflict-free vector clocks and end-to-end encrypted payload verification.", - FontSize = 9, - FontFamily = "Segoe UI", - LineHeight = 1.35, - TextColorHex = "#334155" - }, - - // Section: Awards & Leadership - new PdfTextElement - { - X = 265, - Y = 736, - Width = 480, - Height = 22, - Text = "HONORS & LEADERSHIP", - FontSize = 13, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0F172A" - }, - new PdfDividerElement - { - X = 265, - Y = 758, - Width = 480, - Height = 2, - Thickness = 1.5, - ColorHex = "#0284C7" - }, - new PdfTextElement - { - X = 265, - Y = 766, - Width = 480, - Height = 70, - Text = "• Winner, Stripe Global Hackathon 2022 (Real-time Settlement Engine)\n• Keynote Speaker, React Summit SF 2024 (\"Building 60 FPS Canvas Apps\")\n• Mentor, Women in Tech Engineering Cohort (Mentored 18 women engineers)", - FontSize = 9, - FontFamily = "Segoe UI", - LineHeight = 1.4, - TextColorHex = "#334155" - }, - - // Section: Patents & Publications - new PdfTextElement - { - X = 265, - Y = 845, - Width = 480, - Height = 22, - Text = "PATENTS & TECHNICAL PUBLICATIONS", - FontSize = 13, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0F172A" - }, - new PdfDividerElement - { - X = 265, - Y = 867, - Width = 480, - Height = 2, - Thickness = 1.5, - ColorHex = "#0284C7" - }, - new PdfTextElement - { - X = 265, - Y = 875, - Width = 480, - Height = 90, - Text = "• US Patent 11,842,109: \"Zero-Allocation Vector Tile Streaming in Distributed Browser Clients\"\n• Doe, J. (2024). \"Sub-Millisecond Canvas Geometry Rendering in Modern WebGL2 Environments.\" ACM SIGGRAPH Web3D Proceedings, pp. 45–56.\n• Available for advisory and engineering leadership consultations via codefrydev.in.", - FontSize = 9, - FontFamily = "Segoe UI", - LineHeight = 1.4, - TextColorHex = "#334155" - } - } - }; - - doc.Pages.Add(page); - return doc; - } -} diff --git a/src/PdfEditorApp/Templates/Career/ResumeTemplate.cs b/src/PdfEditorApp/Templates/Career/ResumeTemplate.cs deleted file mode 100644 index 67250e0..0000000 --- a/src/PdfEditorApp/Templates/Career/ResumeTemplate.cs +++ /dev/null @@ -1,525 +0,0 @@ -using System.Collections.Generic; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; - -namespace PdfEditorApp.Templates.Career; - -public class ResumeTemplate : ITemplateDefinition -{ - public string Id => "resume"; - public string Name => "Executive Resume"; - public string Description => "Complete CV with QR code, competencies, and verified metrics"; - public string Category => "Career"; - public string IconKind => "AccountTieOutline"; - public string AccentColorHex => "#7C3AED"; - - public PdfDocumentModel Create() - { - var doc = new PdfDocumentModel - { - Title = "John_Doe_Executive_Resume.pdf", - Author = "John Doe", - Subject = "Principal Software Architect Resume" - }; - - var page = new PdfPageModel - { - PageNumber = 1, - Format = PageFormat.A4, - Orientation = PageOrientation.Portrait, - Width = 800, - Height = 1131, - BackgroundColorHex = "#FFFFFF", - FooterLeft = "John Doe • Principal Software Architect | Portfolio: codefrydev.in", - FooterCenter = "CONFIDENTIAL & VERIFIED", - FooterRight = "Page 1 of 1", - Elements = new List - { - // 1. Monogram Initials Avatar Badge Top Left - new PdfShapeElement - { - X = 55, - Y = 45, - Width = 54, - Height = 54, - CornerRadius = 12, - FillColorHex = "#0F6CBD", - StrokeColorHex = "#0C599B", - StrokeThickness = 0, - Label = "JD", - LabelColorHex = "#FFFFFF", - LabelFontSize = 22 - }, - - // 2. Candidate Full Name - new PdfTextElement - { - X = 120, - Y = 45, - Width = 510, - Height = 32, - Text = "JOHN DOE, M.Sc.", - FontSize = 22, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0F172A" - }, - - // 3. Professional Headline / Title - new PdfTextElement - { - X = 120, - Y = 75, - Width = 510, - Height = 22, - Text = "Principal Software Architect | Cloud & Distributed Systems", - FontSize = 12, - FontFamily = "Segoe UI", - TextColorHex = "#0F6CBD", - IsBold = true - }, - - // 4. Contact Information Strip (Line 1: Phone, Email, Location) - new PdfTextElement - { - X = 120, - Y = 96, - Width = 510, - Height = 20, - Text = "📧 john.doe@codefrydev.in • 📱 +1 (555) 019-2834 • 📍 Seattle, WA", - FontSize = 10, - FontFamily = "Segoe UI", - TextColorHex = "#475569" - }, - - // 5. Contact Information Strip (Line 2: Portfolio, LinkedIn, GitHub) - new PdfTextElement - { - X = 120, - Y = 114, - Width = 510, - Height = 20, - Text = "🔗 linkedin.com/in/codefrydev • 🌐 codefrydev.in • 🐙 github.com/codefrydev", - FontSize = 10, - FontFamily = "Segoe UI", - TextColorHex = "#475569" - }, - - // 6. Portfolio & Verification QR Code Badge Top Right - new PdfQrCodeElement - { - X = 645, - Y = 45, - Width = 100, - Height = 85, - Content = "https://codefrydev.in", - Label = "PORTFOLIO QR" - }, - - // 7. Header Accent Divider Line - new PdfDividerElement - { - X = 55, - Y = 142, - Width = 690, - Height = 2, - Thickness = 2, - ColorHex = "#0F6CBD" - }, - - // 8. Section: Executive Summary Title - new PdfTextElement - { - X = 55, - Y = 152, - Width = 690, - Height = 22, - Text = "EXECUTIVE SUMMARY", - FontSize = 12.5, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0F172A" - }, - - // 9. Executive Summary Callout Card - new PdfTextElement - { - X = 55, - Y = 174, - Width = 690, - Height = 68, - Text = "Strategic Principal Software Architect with 12+ years of expertise architecting high-throughput distributed systems, cross-platform enterprise desktop suites (.NET / Avalonia UI), and cloud-native microservices. Track record of leading 20+ member cross-functional engineering teams, orchestrating cloud migrations that reduced operational overhead by $1.4M annually, and delivering fault-tolerant platforms processing 100M+ transactions daily.", - FontSize = 10, - FontFamily = "Segoe UI", - LineHeight = 1.45, - TextColorHex = "#334155", - BackgroundColorHex = "#F8FAFC", - BorderColorHex = "#E2E8F0", - BorderThickness = 1.0, - CornerRadius = 6, - Padding = 8 - }, - - // 10. Section: Core Competencies & Skills Title - new PdfTextElement - { - X = 55, - Y = 246, - Width = 690, - Height = 22, - Text = "CORE COMPETENCIES & TECHNICAL EXPERTISE", - FontSize = 12.5, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0F172A" - }, - - // 11. Core Competencies Divider - new PdfDividerElement - { - X = 55, - Y = 268, - Width = 690, - Height = 1, - Thickness = 1, - ColorHex = "#E2E8F0" - }, - - // 12. Skills Column Left - new PdfTextElement - { - X = 55, - Y = 276, - Width = 335, - Height = 64, - Text = "• Cloud & Distributed: Microsoft Azure, AWS, Kubernetes, Docker, Kafka, gRPC, Redis, Microservices, CI/CD\n• Architecture & Design: DDD, Event Sourcing, High Availability, Zero-Trust Security, System Resiliency, SOC2", - FontSize = 9.5, - FontFamily = "Segoe UI", - LineHeight = 1.35, - TextColorHex = "#374151" - }, - - // 13. Skills Column Right - new PdfTextElement - { - X = 410, - Y = 276, - Width = 335, - Height = 64, - Text = "• Languages & Frameworks: C# / .NET 9, Avalonia UI, WPF, TypeScript, Node.js, Go, Python, PostgreSQL\n• Engineering Leadership: Technical Roadmapping, Team Mentorship (20+ devs), Agile/Scrum, RFC Process", - FontSize = 9.5, - FontFamily = "Segoe UI", - LineHeight = 1.35, - TextColorHex = "#374151" - }, - - // 14. Section: Professional Experience Title - new PdfTextElement - { - X = 55, - Y = 348, - Width = 690, - Height = 22, - Text = "PROFESSIONAL EXPERIENCE", - FontSize = 12.5, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0F172A" - }, - - // 15. Professional Experience Divider - new PdfDividerElement - { - X = 55, - Y = 370, - Width = 690, - Height = 1, - Thickness = 1, - ColorHex = "#E2E8F0" - }, - - // 16. Role 1: Title & Company - new PdfTextElement - { - X = 55, - Y = 378, - Width = 490, - Height = 20, - Text = "Principal Software Architect | CodeFryDev CloudScale Inc. — Seattle, WA", - FontSize = 11, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#1E293B" - }, - - // 17. Role 1: Date Range - new PdfTextElement - { - X = 550, - Y = 378, - Width = 195, - Height = 20, - Text = "Jan 2021 – Present", - FontSize = 10, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0F6CBD", - Alignment = TextAlignmentMode.Right - }, - - // 18. Role 1: Bullets & Achievements - new PdfTextElement - { - X = 55, - Y = 398, - Width = 690, - Height = 90, - Text = "✔ Spearheaded architecture of enterprise multiplatform desktop publishing suite using Avalonia UI and .NET 9, achieving 60 FPS rendering and reducing memory footprint by 45% across macOS, Windows, and Linux.\n✔ Led engineering transition of monolithic billing platform to Azure Kubernetes Service (AKS) microservices, lowering P99 latency by 55% and reducing annual cloud costs by $1.4M.\n✔ Mentored 22 software engineers, established automated CI/CD static security pipelines, and spearheaded RFC design review culture across 4 engineering pods.", - FontSize = 9.5, - FontFamily = "Segoe UI", - LineHeight = 1.4, - TextColorHex = "#374151" - }, - - // 19. Role 2: Title & Company - new PdfTextElement - { - X = 55, - Y = 498, - Width = 490, - Height = 20, - Text = "Staff Systems Engineer | CodeFryDev Data Systems — Redmond, WA", - FontSize = 11, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#1E293B" - }, - - // 20. Role 2: Date Range - new PdfTextElement - { - X = 550, - Y = 498, - Width = 195, - Height = 20, - Text = "Mar 2017 – Dec 2020", - FontSize = 10, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0F6CBD", - Alignment = TextAlignmentMode.Right - }, - - // 21. Role 2: Bullets & Achievements - new PdfTextElement - { - X = 55, - Y = 518, - Width = 690, - Height = 90, - Text = "✔ Architected distributed event streaming ingestion engine processing 75M+ transactions/day using Apache Kafka and .NET Core with 99.999% SLA availability.\n✔ Designed high-performance SkiaSharp hardware-accelerated rasterization backend for high-volume document exports and digital signature verification.\n✔ Partnered with Product and InfoSec teams to achieve SOC2 Type II compliance and implement end-to-end payload encryption.", - FontSize = 9.5, - FontFamily = "Segoe UI", - LineHeight = 1.4, - TextColorHex = "#374151" - }, - - // 22. Role 3: Title & Company - new PdfTextElement - { - X = 55, - Y = 618, - Width = 490, - Height = 20, - Text = "Senior Software Engineer | CodeFryDev Solutions Ltd — Seattle, WA", - FontSize = 11, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#1E293B" - }, - - // 23. Role 3: Date Range - new PdfTextElement - { - X = 550, - Y = 618, - Width = 195, - Height = 20, - Text = "Jun 2014 – Feb 2017", - FontSize = 10, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0F6CBD", - Alignment = TextAlignmentMode.Right - }, - - // 24. Role 3: Bullets & Achievements - new PdfTextElement - { - X = 55, - Y = 638, - Width = 690, - Height = 76, - Text = "✔ Engineered RESTful web services and enterprise desktop clients adopted by 250,000+ business users globally.\n✔ Refactored legacy database queries and introduced distributed Redis caching layer, improving API response times from 850ms to 45ms.\n✔ Introduced automated integration testing with 88% code coverage, cutting QA regression cycles from 2 weeks to 3 days.", - FontSize = 9.5, - FontFamily = "Segoe UI", - LineHeight = 1.4, - TextColorHex = "#374151" - }, - - // 25. Section: Education & Credentials Title - new PdfTextElement - { - X = 55, - Y = 720, - Width = 690, - Height = 22, - Text = "EDUCATION & PROFESSIONAL CREDENTIALS", - FontSize = 12.5, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0F172A" - }, - - // 26. Education Divider - new PdfDividerElement - { - X = 55, - Y = 742, - Width = 690, - Height = 1, - Thickness = 1, - ColorHex = "#E2E8F0" - }, - - // 27. Education Column Subheading - new PdfTextElement - { - X = 55, - Y = 750, - Width = 335, - Height = 20, - Text = "🎓 Academic Background", - FontSize = 10.5, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0F6CBD" - }, - - // 28. Education Details - new PdfTextElement - { - X = 55, - Y = 770, - Width = 335, - Height = 80, - Text = "Master of Science in Computer Science\nUniversity of Washington • GPA: 3.92 (2012 – 2014)\n\nBachelor of Science in Software Engineering\nSeattle University • Magna Cum Laude (2008 – 2012)", - FontSize = 9.5, - FontFamily = "Segoe UI", - LineHeight = 1.35, - TextColorHex = "#374151" - }, - - // 29. Certifications Column Subheading - new PdfTextElement - { - X = 410, - Y = 750, - Width = 335, - Height = 20, - Text = "🏆 Key Certifications & Honors", - FontSize = 10.5, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0F6CBD" - }, - - // 30. Certifications Details - new PdfTextElement - { - X = 410, - Y = 770, - Width = 335, - Height = 80, - Text = "• Microsoft Certified: Azure Solutions Architect Expert\n• AWS Certified Solutions Architect – Professional (SAP-C02)\n• Certified Kubernetes Administrator (CKA — Linux Foundation)\n• IEEE Senior Member & Open Source Contributor", - FontSize = 9.5, - FontFamily = "Segoe UI", - LineHeight = 1.35, - TextColorHex = "#374151" - }, - - // 31. Section: Notable Projects & Open Source - new PdfTextElement - { - X = 55, - Y = 860, - Width = 690, - Height = 22, - Text = "NOTABLE PROJECTS & OPEN SOURCE CONTRIBUTIONS", - FontSize = 12.5, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0F172A" - }, - - // 32. Projects Divider - new PdfDividerElement - { - X = 55, - Y = 882, - Width = 690, - Height = 1, - Thickness = 1, - ColorHex = "#E2E8F0" - }, - - // 33. Projects Callout Box - new PdfTextElement - { - X = 55, - Y = 890, - Width = 690, - Height = 90, - Text = "🚀 OpenPDF & CrossPlatform-UI Engine (Creator & Core Maintainer — 4.8k GitHub Stars)\nEngineered high-performance cross-platform vector rendering library for .NET with SkiaSharp integration.\n\n🌐 Enterprise Distributed Cache Mesh (Co-Author)\nLightweight, low-latency consensus protocol implementation for distributed multi-region memory stores.", - FontSize = 9.5, - FontFamily = "Segoe UI", - LineHeight = 1.4, - TextColorHex = "#166534", - BackgroundColorHex = "#F0FDF4", - BorderColorHex = "#BBF7D0", - BorderThickness = 1.0, - CornerRadius = 6, - Padding = 8 - }, - - // 34. Bottom Verification Strip Divider - new PdfDividerElement - { - X = 55, - Y = 992, - Width = 690, - Height = 1, - Thickness = 1, - ColorHex = "#CBD5E1" - }, - - // 35. References & Verification Notice - new PdfTextElement - { - X = 55, - Y = 1002, - Width = 690, - Height = 20, - Text = "References, patent publications, and verified code portfolio available upon request at codefrydev.in", - FontSize = 9, - FontFamily = "Segoe UI", - TextColorHex = "#64748B", - Alignment = TextAlignmentMode.Center - } - } - }; - - doc.Pages.Add(page); - return doc; - } -} diff --git a/src/PdfEditorApp/Templates/Certificates/CertificateNavyGoldTemplate.cs b/src/PdfEditorApp/Templates/Certificates/CertificateNavyGoldTemplate.cs deleted file mode 100644 index 7736665..0000000 --- a/src/PdfEditorApp/Templates/Certificates/CertificateNavyGoldTemplate.cs +++ /dev/null @@ -1,338 +0,0 @@ -using System.Collections.Generic; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; - -namespace PdfEditorApp.Templates.Certificates; - -public class CertificateNavyGoldTemplate : ITemplateDefinition -{ - public string Id => "certificatenavygold"; - public string Name => "Executive Certificate of Honor"; - public string Description => "Prestigious corporate & executive recognition with navy & gold geometric crests"; - public string Category => "Certificates"; - public string IconKind => "ShieldCrownOutline"; - public string AccentColorHex => "#1E3A8A"; - - public PdfDocumentModel Create() - { - var doc = new PdfDocumentModel - { - Title = "Executive_Certificate_of_Honor.pdf", - Author = "CodeFryDev Leadership Institute", - Subject = "Official Certificate of Distinction and Honor" - }; - - var page = new PdfPageModel - { - PageNumber = 1, - Format = PageFormat.A4, - Orientation = PageOrientation.Landscape, - Width = 1131, - Height = 800, - BackgroundColorHex = "#FFFFFF", - ShowHeaderFooter = false, - Elements = new List - { - // Outer Navy Frame - new PdfShapeElement - { - X = 35, - Y = 35, - Width = 1061, - Height = 730, - FillColorHex = "#00000000", - StrokeColorHex = "#0F172A", - StrokeThickness = 4, - CornerRadius = 8, - ZIndex = 1 - }, - // Inner Gold Thin Inset Frame - new PdfShapeElement - { - X = 45, - Y = 45, - Width = 1041, - Height = 710, - FillColorHex = "#00000000", - StrokeColorHex = "#D97706", - StrokeThickness = 1.5, - CornerRadius = 6, - ZIndex = 2 - }, - - // Top Geometric Navy & Gold Corner Accents - new PdfShapeElement - { - X = 35, - Y = 35, - Width = 180, - Height = 180, - ShapeType = ShapeType.CustomSvgPath, - CustomPathData = "M 0,0 L 180,0 L 0,180 Z", - FillColorHex = "#0F172A", - StrokeColorHex = "#00000000", - ZIndex = 3 - }, - new PdfShapeElement - { - X = 35, - Y = 35, - Width = 205, - Height = 205, - ShapeType = ShapeType.CustomSvgPath, - CustomPathData = "M 180,0 L 205,0 L 0,205 L 0,180 Z", - FillColorHex = "#D97706", - StrokeColorHex = "#00000000", - ZIndex = 4 - }, - new PdfShapeElement - { - X = 916, - Y = 585, - Width = 180, - Height = 180, - ShapeType = ShapeType.CustomSvgPath, - CustomPathData = "M 180,180 L 0,180 L 180,0 Z", - FillColorHex = "#0F172A", - StrokeColorHex = "#00000000", - ZIndex = 3 - }, - new PdfShapeElement - { - X = 891, - Y = 560, - Width = 205, - Height = 205, - ShapeType = ShapeType.CustomSvgPath, - CustomPathData = "M 0,180 L 0,205 L 205,0 L 180,0 Z", - FillColorHex = "#D97706", - StrokeColorHex = "#00000000", - ZIndex = 4 - }, - - // Golden Shield Heraldic Crest - new PdfShapeElement - { - X = 525, - Y = 70, - Width = 80, - Height = 90, - ShapeType = ShapeType.ShieldBadge, - FillColorHex = "#FEF3C7", - StrokeColorHex = "#D97706", - StrokeThickness = 2.5, - Label = "CFD", - LabelColorHex = "#B45309", - LabelFontSize = 14, - ZIndex = 10 - }, - - // Main Title - new PdfTextElement - { - X = 150, - Y = 175, - Width = 831, - Height = 54, - Text = "CERTIFICATE OF DISTINCTION", - FontSize = 38, - FontFamily = "Cinzel", - IsBold = true, - TextColorHex = "#0F172A", - Alignment = TextAlignmentMode.Center, - ZIndex = 5 - }, - new PdfTextElement - { - X = 150, - Y = 230, - Width = 831, - Height = 26, - Text = "IN RECOGNITION OF EXCEPTIONAL EXECUTIVE LEADERSHIP & STRATEGIC VISION", - FontSize = 11.5, - FontFamily = "Montserrat", - IsBold = true, - TextColorHex = "#B45309", - Alignment = TextAlignmentMode.Center, - ZIndex = 5 - }, - - // Recipient Name - new PdfTextElement - { - X = 150, - Y = 280, - Width = 831, - Height = 90, - Text = "Jane Doe, MBA", - FontSize = 48, - FontFamily = "Great Vibes", - IsItalic = true, - TextColorHex = "#0F172A", - Alignment = TextAlignmentMode.Center, - ZIndex = 6 - }, - - // Gold Divider - new PdfDividerElement - { - X = 300, - Y = 370, - Width = 531, - Height = 2, - Thickness = 2.0, - ColorHex = "#D97706", - ZIndex = 5 - }, - - // Body Text - new PdfTextElement - { - X = 180, - Y = 395, - Width = 771, - Height = 72, - Text = "Having demonstrated supreme governance, transformational strategy execution, and unrelenting commitment to corporate stewardship throughout the Global Enterprise Leadership Fellowship.", - FontSize = 15.5, - FontFamily = "Lora", - LineHeight = 1.5, - TextColorHex = "#334155", - Alignment = TextAlignmentMode.Center, - ZIndex = 5 - }, - - // Conferred Date & Motto - new PdfTextElement - { - X = 180, - Y = 470, - Width = 771, - Height = 26, - Text = "Conferred this 28th day of October, 2026 at the Annual Convocation • London, United Kingdom", - FontSize = 11.5, - FontFamily = "Montserrat", - IsBold = true, - TextColorHex = "#B45309", - Alignment = TextAlignmentMode.Center, - ZIndex = 5 - }, - - // Gold 16-Point Rosette Star Seal - new PdfShapeElement - { - X = 525, - Y = 498, - Width = 80, - Height = 80, - ShapeType = ShapeType.RosetteSeal, - FillColorHex = "#FEF3C7", - StrokeColorHex = "#D97706", - StrokeThickness = 2, - Label = "HONOR", - LabelColorHex = "#92400E", - LabelFontSize = 11, - ZIndex = 8 - }, - - // Motto Text Below Seal - new PdfTextElement - { - X = 450, - Y = 584, - Width = 231, - Height = 22, - Text = "— VIRTUS ET EXCELLENTIA —", - FontSize = 10, - FontFamily = "Cinzel", - IsBold = true, - TextColorHex = "#0F172A", - Alignment = TextAlignmentMode.Center, - ZIndex = 8 - }, - - // Signatory Left - new PdfTextElement - { - X = 180, - Y = 620, - Width = 260, - Height = 48, - Text = "John Doe", - FontSize = 26, - FontFamily = "Dancing Script", - IsItalic = true, - TextColorHex = "#0F172A", - Alignment = TextAlignmentMode.Center, - ZIndex = 6 - }, - new PdfDividerElement - { - X = 180, - Y = 670, - Width = 260, - Height = 1, - Thickness = 1.5, - ColorHex = "#0F172A", - ZIndex = 5 - }, - new PdfTextElement - { - X = 180, - Y = 678, - Width = 260, - Height = 26, - Text = "Chancellor of the Board", - FontSize = 13, - FontFamily = "Montserrat", - IsBold = true, - TextColorHex = "#0F172A", - Alignment = TextAlignmentMode.Center, - ZIndex = 5 - }, - - // Signatory Right - new PdfTextElement - { - X = 691, - Y = 620, - Width = 260, - Height = 48, - Text = "Alex Doe", - FontSize = 26, - FontFamily = "Dancing Script", - IsItalic = true, - TextColorHex = "#0F172A", - Alignment = TextAlignmentMode.Center, - ZIndex = 6 - }, - new PdfDividerElement - { - X = 691, - Y = 670, - Width = 260, - Height = 1, - Thickness = 1.5, - ColorHex = "#0F172A", - ZIndex = 5 - }, - new PdfTextElement - { - X = 691, - Y = 678, - Width = 260, - Height = 26, - Text = "Managing Director & Fellow", - FontSize = 13, - FontFamily = "Montserrat", - IsBold = true, - TextColorHex = "#0F172A", - Alignment = TextAlignmentMode.Center, - ZIndex = 5 - } - } - }; - - doc.Pages.Add(page); - return doc; - } -} diff --git a/src/PdfEditorApp/Templates/Certificates/CertificateTemplate.cs b/src/PdfEditorApp/Templates/Certificates/CertificateTemplate.cs deleted file mode 100644 index e5bc9ef..0000000 --- a/src/PdfEditorApp/Templates/Certificates/CertificateTemplate.cs +++ /dev/null @@ -1,393 +0,0 @@ -using System.Collections.Generic; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; - -namespace PdfEditorApp.Templates.Certificates; - -public class CertificateTemplate : ITemplateDefinition -{ - public string Id => "certificate"; - public string Name => "Certificate of Achievement"; - public string Description => "National Olympiad award of distinction with gold medal ribbon seal, ornate crimson borders, and official verification signatures"; - public string Category => "Certificates"; - public string IconKind => "CertificateOutline"; - public string AccentColorHex => "#990000"; - - public PdfDocumentModel Create() - { - var doc = new PdfDocumentModel - { - Title = "Certificate_of_Achievement.pdf", - Author = "CodeFryDev Academy of Computing & Science", - Subject = "Official Certificate of Outstanding Achievement & First-Place Distinction" - }; - - var page = new PdfPageModel - { - PageNumber = 1, - Format = PageFormat.A4, - Orientation = PageOrientation.Landscape, - Width = 1131, - Height = 800, - BackgroundColorHex = "#FFFFFF", - ShowHeaderFooter = false, - Elements = new List - { - // ========================================== - // 1. LEFT CORNER VECTOR POLYGONAL ART - // ========================================== - - // Main Top-Left Deep Crimson Polygon Wing - new PdfShapeElement - { - X = 0, - Y = 0, - Width = 260, - Height = 800, - ShapeType = ShapeType.CustomSvgPath, - CustomPathData = "M 0,0 L 220,0 L 160,380 L 0,720 Z", - FillColorHex = "#990000", - StrokeColorHex = "#00000000", - StrokeThickness = 0, - ZIndex = 1 - }, - - // Top-Left Gold Accent Stripe - new PdfShapeElement - { - X = 0, - Y = 0, - Width = 285, - Height = 800, - ShapeType = ShapeType.CustomSvgPath, - CustomPathData = "M 220,0 L 245,0 L 180,380 L 0,770 L 0,720 L 160,380 Z", - FillColorHex = "#F59E0B", - StrokeColorHex = "#00000000", - StrokeThickness = 0, - ZIndex = 2 - }, - - // Bottom-Left Sharp Dark Red Polygonal Wedge - new PdfShapeElement - { - X = 0, - Y = 480, - Width = 160, - Height = 320, - ShapeType = ShapeType.CustomSvgPath, - CustomPathData = "M 0,520 L 140,800 L 0,800 Z", - FillColorHex = "#800000", - StrokeColorHex = "#00000000", - StrokeThickness = 0, - ZIndex = 3 - }, - - // ========================================== - // 2. RIGHT CORNER VECTOR POLYGONAL ART - // ========================================== - - // Top-Right Gold Accent Strip - new PdfShapeElement - { - X = 1040, - Y = 0, - Width = 91, - Height = 160, - ShapeType = ShapeType.CustomSvgPath, - CustomPathData = "M 1060,0 L 1131,0 L 1131,140 Z", - FillColorHex = "#F59E0B", - StrokeColorHex = "#00000000", - StrokeThickness = 0, - ZIndex = 1 - }, - - // Top-Right Crimson Corner Wedge - new PdfShapeElement - { - X = 1080, - Y = 0, - Width = 51, - Height = 90, - ShapeType = ShapeType.CustomSvgPath, - CustomPathData = "M 1090,0 L 1131,0 L 1131,80 Z", - FillColorHex = "#990000", - StrokeColorHex = "#00000000", - StrokeThickness = 0, - ZIndex = 2 - }, - - // Bottom-Right Gold Accent Border Stripe - new PdfShapeElement - { - X = 820, - Y = 420, - Width = 311, - Height = 380, - ShapeType = ShapeType.CustomSvgPath, - CustomPathData = "M 1131,430 L 1131,470 L 960,630 L 865,800 L 835,800 L 935,620 Z", - FillColorHex = "#F59E0B", - StrokeColorHex = "#00000000", - StrokeThickness = 0, - ZIndex = 1 - }, - - // Bottom-Right Bold Crimson Polygon Wing - new PdfShapeElement - { - X = 860, - Y = 460, - Width = 271, - Height = 340, - ShapeType = ShapeType.CustomSvgPath, - CustomPathData = "M 1131,470 L 1131,800 L 865,800 L 960,630 Z", - FillColorHex = "#990000", - StrokeColorHex = "#00000000", - StrokeThickness = 0, - ZIndex = 2 - }, - - // ========================================== - // 3. GOLD MEDAL SEAL BADGE WITH RIBBON TAILS - // ========================================== - new PdfShapeElement - { - X = 165, - Y = 95, - Width = 160, - Height = 195, - ShapeType = ShapeType.MedalRibbonBadge, - FillColorHex = "#F59E0B", - StrokeColorHex = "#B45309", - StrokeThickness = 2.5, - SecondaryFillColorHex = "#990000", - ZIndex = 10 - }, - - // ========================================== - // 4. MAIN HEADINGS & CERTIFICATE TITLE - // ========================================== - new PdfTextElement - { - X = 280, - Y = 42, - Width = 700, - Height = 68, - Text = "CERTIFICATE", - FontSize = 46, - FontFamily = "Montserrat", - IsBold = true, - TextColorHex = "#990000", - Alignment = TextAlignmentMode.Center, - ZIndex = 5 - }, - new PdfTextElement - { - X = 280, - Y = 110, - Width = 700, - Height = 40, - Text = "OF OUTSTANDING ACHIEVEMENT", - FontSize = 22, - FontFamily = "Montserrat", - IsBold = true, - TextColorHex = "#1E293B", - Alignment = TextAlignmentMode.Center, - ZIndex = 5 - }, - new PdfTextElement - { - X = 280, - Y = 165, - Width = 700, - Height = 28, - Text = "THIS CERTIFICATE IS PROUDLY PRESENTED TO", - FontSize = 12.5, - FontFamily = "Montserrat", - IsBold = true, - TextColorHex = "#475569", - Alignment = TextAlignmentMode.Center, - ZIndex = 5 - }, - - // ========================================== - // 5. RECIPIENT NAME IN CURSIVE CALLIGRAPHY - // ========================================== - new PdfTextElement - { - X = 250, - Y = 205, - Width = 760, - Height = 95, - Text = "John Doe", - FontSize = 52, - FontFamily = "Great Vibes", - IsItalic = true, - TextColorHex = "#990000", - Alignment = TextAlignmentMode.Center, - ZIndex = 6 - }, - - // Red Horizontal Accent Rule - new PdfDividerElement - { - X = 240, - Y = 310, - Width = 760, - Height = 2, - Thickness = 2.0, - ColorHex = "#990000", - ZIndex = 5 - }, - - // ========================================== - // 6. CITATION & ACHIEVEMENT DESCRIPTION - // ========================================== - new PdfTextElement - { - X = 240, - Y = 330, - Width = 760, - Height = 115, - Text = "For distinguished excellence, exceptional analytical problem-solving, and achieving First Place Honors in the CodeFryDev Mathematics & Computational Science Olympiad. Conferred on the 18th of July, 2026 by the Executive Board of Examiners.", - FontSize = 15.5, - FontFamily = "Lora", - IsBold = false, - LineHeight = 1.55, - TextColorHex = "#1E293B", - Alignment = TextAlignmentMode.Center, - ZIndex = 5 - }, - - // Verification Badge (Center) - new PdfShapeElement - { - X = 525, - Y = 460, - Width = 80, - Height = 80, - ShapeType = ShapeType.RosetteSeal, - FillColorHex = "#FEF3C7", - StrokeColorHex = "#D97706", - StrokeThickness = 2, - Label = "1ST PLACE", - LabelColorHex = "#92400E", - LabelFontSize = 10, - ZIndex = 8 - }, - - // ========================================== - // 7. DATE & SIGNATURE COLUMNS - // ========================================== - - // Date Signature (Left) - new PdfTextElement - { - X = 210, - Y = 575, - Width = 260, - Height = 40, - Text = "July 18, 2026", - FontSize = 18, - FontFamily = "Playfair Display", - IsBold = true, - TextColorHex = "#1E293B", - Alignment = TextAlignmentMode.Center, - ZIndex = 5 - }, - new PdfDividerElement - { - X = 210, - Y = 620, - Width = 260, - Height = 2, - Thickness = 1.5, - ColorHex = "#1E293B", - ZIndex = 5 - }, - new PdfTextElement - { - X = 210, - Y = 628, - Width = 260, - Height = 26, - Text = "Date of Issuance", - FontSize = 12.5, - FontFamily = "Montserrat", - IsBold = true, - TextColorHex = "#1E293B", - Alignment = TextAlignmentMode.Center, - ZIndex = 5 - }, - new PdfTextElement - { - X = 210, - Y = 654, - Width = 260, - Height = 22, - Text = "Credential ID: CFD-2026-89412", - FontSize = 10, - FontFamily = "Montserrat", - TextColorHex = "#64748B", - Alignment = TextAlignmentMode.Center, - ZIndex = 5 - }, - - // Cursive Handwritten Signature (Right) - new PdfTextElement - { - X = 660, - Y = 555, - Width = 280, - Height = 60, - Text = "Jane Doe", - FontSize = 32, - FontFamily = "Great Vibes", - IsItalic = true, - TextColorHex = "#1E293B", - Alignment = TextAlignmentMode.Center, - ZIndex = 6 - }, - new PdfDividerElement - { - X = 660, - Y = 620, - Width = 280, - Height = 2, - Thickness = 1.5, - ColorHex = "#1E293B", - ZIndex = 5 - }, - new PdfTextElement - { - X = 660, - Y = 628, - Width = 280, - Height = 26, - Text = "Dr. Jane Doe, Ph.D.", - FontSize = 12.5, - FontFamily = "Montserrat", - IsBold = true, - TextColorHex = "#1E293B", - Alignment = TextAlignmentMode.Center, - ZIndex = 5 - }, - new PdfTextElement - { - X = 660, - Y = 654, - Width = 280, - Height = 22, - Text = "President, CodeFryDev Academy", - FontSize = 10, - FontFamily = "Montserrat", - TextColorHex = "#64748B", - Alignment = TextAlignmentMode.Center, - ZIndex = 5 - } - } - }; - - doc.Pages.Add(page); - return doc; - } -} diff --git a/src/PdfEditorApp/Templates/Certificates/DiplomaAcademicTemplate.cs b/src/PdfEditorApp/Templates/Certificates/DiplomaAcademicTemplate.cs deleted file mode 100644 index 6ee86f6..0000000 --- a/src/PdfEditorApp/Templates/Certificates/DiplomaAcademicTemplate.cs +++ /dev/null @@ -1,356 +0,0 @@ -using System.Collections.Generic; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; - -namespace PdfEditorApp.Templates.Certificates; - -public class DiplomaAcademicTemplate : ITemplateDefinition -{ - public string Id => "diploma"; - public string Name => "Collegiate Academic Diploma"; - public string Description => "Formal university degree with ornamental borders, Latin crest, and official seal"; - public string Category => "Certificates"; - public string IconKind => "SchoolOutline"; - public string AccentColorHex => "#7C2D12"; - - public PdfDocumentModel Create() - { - var doc = new PdfDocumentModel - { - Title = "Collegiate_Diploma.pdf", - Author = "CodeFryDev Institute of Technology", - Subject = "Degree of Master of Computer Science" - }; - - var page = new PdfPageModel - { - PageNumber = 1, - Format = PageFormat.A4, - Orientation = PageOrientation.Landscape, - Width = 1131, - Height = 800, - BackgroundColorHex = "#FFFDF9", - ShowHeaderFooter = false, - Elements = new List - { - // Formal Multi-Border Inset - new PdfShapeElement - { - X = 30, - Y = 30, - Width = 1071, - Height = 740, - FillColorHex = "#00000000", - StrokeColorHex = "#78350F", - StrokeThickness = 3.5, - CornerRadius = 4, - ZIndex = 1 - }, - new PdfShapeElement - { - X = 40, - Y = 40, - Width = 1051, - Height = 720, - FillColorHex = "#00000000", - StrokeColorHex = "#D97706", - StrokeThickness = 1.0, - CornerRadius = 2, - ZIndex = 2 - }, - - // University Name - new PdfTextElement - { - X = 100, - Y = 80, - Width = 931, - Height = 45, - Text = "THE TRUSTEES AND FACULTY OF", - FontSize = 14, - FontFamily = "Cinzel", - IsBold = true, - TextColorHex = "#78350F", - Alignment = TextAlignmentMode.Center, - ZIndex = 5 - }, - new PdfTextElement - { - X = 100, - Y = 125, - Width = 931, - Height = 58, - Text = "CODEFRYDEV INSTITUTE OF TECHNOLOGY", - FontSize = 36, - FontFamily = "Cinzel", - IsBold = true, - TextColorHex = "#1E293B", - Alignment = TextAlignmentMode.Center, - ZIndex = 5 - }, - new PdfTextElement - { - X = 100, - Y = 195, - Width = 931, - Height = 26, - Text = "UPON THE RECOMMENDATION OF THE FACULTY HAVE CONFERRED UPON", - FontSize = 11, - FontFamily = "Playfair Display", - IsItalic = true, - TextColorHex = "#64748B", - Alignment = TextAlignmentMode.Center, - ZIndex = 5 - }, - - // Graduate Name - new PdfTextElement - { - X = 100, - Y = 235, - Width = 931, - Height = 95, - Text = "John Doe", - FontSize = 52, - FontFamily = "Great Vibes", - IsItalic = true, - TextColorHex = "#78350F", - Alignment = TextAlignmentMode.Center, - ZIndex = 6 - }, - - // Degree Conferred - new PdfTextElement - { - X = 100, - Y = 325, - Width = 931, - Height = 24, - Text = "THE DEGREE OF", - FontSize = 11, - FontFamily = "Cinzel", - IsBold = true, - TextColorHex = "#78350F", - Alignment = TextAlignmentMode.Center, - ZIndex = 5 - }, - new PdfTextElement - { - X = 100, - Y = 350, - Width = 931, - Height = 42, - Text = "MASTER OF SCIENCE IN ARTIFICIAL INTELLIGENCE", - FontSize = 24, - FontFamily = "Cinzel", - IsBold = true, - TextColorHex = "#0F172A", - Alignment = TextAlignmentMode.Center, - ZIndex = 5 - }, - new PdfTextElement - { - X = 150, - Y = 395, - Width = 831, - Height = 48, - Text = "SUMMA CUM LAUDE • WITH HIGHEST DISTINCTION IN NEURAL DYNAMICS & GRAPH ALGORITHMS\nWITH ALL THE RIGHTS, HONORS, AND PRIVILEGES PERTAINING THERETO", - FontSize = 10, - FontFamily = "Playfair Display", - IsItalic = true, - LineHeight = 1.35, - TextColorHex = "#475569", - Alignment = TextAlignmentMode.Center, - ZIndex = 5 - }, - - // Latin Inscription - new PdfTextElement - { - X = 150, - Y = 445, - Width = 831, - Height = 26, - Text = "\"Quod bonum, faustum, felix fortunatumque sit. Ex auctoritate Senatus Academici.\"", - FontSize = 10, - FontFamily = "Cinzel", - IsItalic = true, - TextColorHex = "#78350F", - Alignment = TextAlignmentMode.Center, - ZIndex = 5 - }, - - // Official University Gold Seal - new PdfShapeElement - { - X = 515, - Y = 475, - Width = 100, - Height = 100, - ShapeType = ShapeType.LaurelWreathSeal, - FillColorHex = "#FEF3C7", - StrokeColorHex = "#B45309", - StrokeThickness = 2.5, - Label = "SEAL", - LabelColorHex = "#92400E", - LabelFontSize = 12, - ZIndex = 8 - }, - - // Latin Motto Below Seal - new PdfTextElement - { - X = 415, - Y = 582, - Width = 300, - Height = 22, - Text = "— DISCERE • COGNOSCERE • CREARE —", - FontSize = 9.5, - FontFamily = "Cinzel", - IsBold = true, - TextColorHex = "#78350F", - Alignment = TextAlignmentMode.Center, - ZIndex = 8 - }, - - // President Signature Left - new PdfTextElement - { - X = 80, - Y = 590, - Width = 260, - Height = 50, - Text = "John Doe", - FontSize = 28, - FontFamily = "Great Vibes", - IsItalic = true, - TextColorHex = "#1E293B", - Alignment = TextAlignmentMode.Center, - ZIndex = 6 - }, - new PdfDividerElement - { - X = 80, - Y = 640, - Width = 260, - Height = 1, - Thickness = 1.5, - ColorHex = "#78350F", - ZIndex = 5 - }, - new PdfTextElement - { - X = 80, - Y = 648, - Width = 260, - Height = 24, - Text = "President of the Institute", - FontSize = 11, - FontFamily = "Cinzel", - IsBold = true, - TextColorHex = "#78350F", - Alignment = TextAlignmentMode.Center, - ZIndex = 5 - }, - - // Dean Signature Center - new PdfTextElement - { - X = 435, - Y = 605, - Width = 260, - Height = 35, - Text = "Jane Doe", - FontSize = 24, - FontFamily = "Great Vibes", - IsItalic = true, - TextColorHex = "#1E293B", - Alignment = TextAlignmentMode.Center, - ZIndex = 6 - }, - new PdfDividerElement - { - X = 435, - Y = 640, - Width = 260, - Height = 1, - Thickness = 1.5, - ColorHex = "#78350F", - ZIndex = 5 - }, - new PdfTextElement - { - X = 435, - Y = 648, - Width = 260, - Height = 24, - Text = "Dean of Graduate Studies", - FontSize = 11, - FontFamily = "Cinzel", - IsBold = true, - TextColorHex = "#78350F", - Alignment = TextAlignmentMode.Center, - ZIndex = 5 - }, - - // Registrar Signature Right - new PdfTextElement - { - X = 790, - Y = 590, - Width = 260, - Height = 50, - Text = "Alex Doe", - FontSize = 28, - FontFamily = "Great Vibes", - IsItalic = true, - TextColorHex = "#1E293B", - Alignment = TextAlignmentMode.Center, - ZIndex = 6 - }, - new PdfDividerElement - { - X = 790, - Y = 640, - Width = 260, - Height = 1, - Thickness = 1.5, - ColorHex = "#78350F", - ZIndex = 5 - }, - new PdfTextElement - { - X = 790, - Y = 648, - Width = 260, - Height = 24, - Text = "Registrar & Academic Secretary", - FontSize = 11, - FontFamily = "Cinzel", - IsBold = true, - TextColorHex = "#78350F", - Alignment = TextAlignmentMode.Center, - ZIndex = 5 - }, - - // Degree Serial Tracking Footer - new PdfTextElement - { - X = 100, - Y = 690, - Width = 931, - Height = 22, - Text = "Degree Serial No: CFD-MS-2026-948102 • Conferred June 15, 2026 • Verified by CodeFryDev Academic Registry", - FontSize = 8.5, - FontFamily = "Montserrat", - TextColorHex = "#64748B", - Alignment = TextAlignmentMode.Center, - ZIndex = 5 - } - } - }; - - doc.Pages.Add(page); - return doc; - } -} diff --git a/src/PdfEditorApp/Templates/Corporate/AnnualReportTemplate.cs b/src/PdfEditorApp/Templates/Corporate/AnnualReportTemplate.cs deleted file mode 100644 index defb131..0000000 --- a/src/PdfEditorApp/Templates/Corporate/AnnualReportTemplate.cs +++ /dev/null @@ -1,1007 +0,0 @@ -using System; -using System.Collections.Generic; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; - -namespace PdfEditorApp.Templates.Corporate; - -public class AnnualReportTemplate : ITemplateDefinition -{ - public string Id => "annualreport"; - public string Name => "Annual Corporate Report"; - public string Description => "Comprehensive 3-page corporate report with CEO address, segment metrics, financial statements, and charts"; - public string Category => "Corporate"; - public string IconKind => "ChartBoxOutline"; - public string AccentColorHex => "#0F6CBD"; - - public PdfDocumentModel Create() - { - var doc = new PdfDocumentModel - { - Title = "CodeFryDev_Corp_Annual_Report_2026.pdf", - Author = "CodeFryDev Corporation Inc.", - Subject = "Fiscal Year 2026 Annual Report & Consolidated Financial Statements", - CreatedDate = DateTime.Now - }; - - // ========================================================================= - // PAGE 1: Executive Summary, KPI Cards, Revenue Chart & Strategic Outlook - // ========================================================================= - var page1 = new PdfPageModel - { - PageNumber = 1, - Format = PageFormat.A4, - Orientation = PageOrientation.Portrait, - Width = 800, - Height = 1131, - BackgroundColorHex = "#FFFFFF", - FooterLeft = "CODEFRYDEV CORPORATION • FISCAL YEAR 2026 ANNUAL REPORT", - FooterCenter = "CONFIDENTIAL & PROPRIETARY", - FooterRight = "Page 1 of 3", - Elements = new List - { - // Top Brand Accent Bar - new PdfShapeElement - { - X = 0, - Y = 0, - Width = 800, - Height = 6, - FillColorHex = "#0F6CBD", - StrokeColorHex = "#00000000", - StrokeThickness = 0 - }, - - // CodeFryDev Logo Badge Top Right - new PdfShapeElement - { - X = 680, - Y = 35, - Width = 55, - Height = 55, - CornerRadius = 10, - FillColorHex = "#0F6CBD", - StrokeColorHex = "#0C599B", - StrokeThickness = 0, - Label = "CF", - LabelColorHex = "#FFFFFF", - LabelFontSize = 24 - }, - new PdfTextElement - { - X = 600, - Y = 95, - Width = 135, - Height = 24, - Text = "CODEFRYDEV CORP.", - FontSize = 9.5, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0F172A", - Alignment = TextAlignmentMode.Right - }, - - // Title "ANNUAL REPORT" - new PdfTextElement - { - X = 55, - Y = 35, - Width = 530, - Height = 40, - Text = "ANNUAL CORPORATE REPORT", - FontSize = 26, - FontFamily = "Georgia", - IsBold = true, - TextColorHex = "#0F172A", - Alignment = TextAlignmentMode.Left - }, - new PdfTextElement - { - X = 55, - Y = 78, - Width = 530, - Height = 22, - Text = "FISCAL YEAR ENDED DECEMBER 31, 2026 • GLOBAL ENTERPRISE SOLUTIONS", - FontSize = 10.5, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0F6CBD", - Alignment = TextAlignmentMode.Left - }, - - // Header Divider Line - new PdfDividerElement - { - X = 55, - Y = 122, - Width = 690, - Height = 2, - Thickness = 2, - ColorHex = "#0F6CBD" - }, - - // 1.0 Letter from the Chief Executive Officer - new PdfTextElement - { - X = 55, - Y = 132, - Width = 690, - Height = 22, - Text = "1.0 Executive Letter to Shareholders & Partners", - FontSize = 14, - FontFamily = "Georgia", - IsBold = true, - TextColorHex = "#0F172A" - }, - new PdfTextElement - { - X = 55, - Y = 158, - Width = 690, - Height = 105, - Text = "Fiscal year 2026 has been a transformative period of record performance, disciplined capital allocation, and technological breakthroughs for CodeFryDev Corporation. In an evolving global macro environment, our cloud-native enterprise architecture, automated AI publishing engines, and mission-critical cybersecurity suites generated record top-line revenue of $3.10 Billion (+24% YoY) and net income of $540 Million (+33% YoY). We expanded gross margins to 63.8% and generated $412 Million in free cash flow.", - FontSize = 9.5, - FontFamily = "Segoe UI", - LineHeight = 1.45, - TextColorHex = "#1E293B", - BackgroundColorHex = "#F8FAFC", - BorderColorHex = "#E2E8F0", - BorderThickness = 1.0, - Padding = 10, - CornerRadius = 6, - Alignment = TextAlignmentMode.Justify - }, - - // KPI 4-Card Summary Grid - new PdfShapeElement - { - X = 55, - Y = 274, - Width = 160, - Height = 68, - CornerRadius = 6, - FillColorHex = "#F0F7FF", - StrokeColorHex = "#BFDBFE", - StrokeThickness = 1 - }, - new PdfTextElement - { - X = 65, - Y = 282, - Width = 140, - Height = 52, - Text = "$3.10 BILLION\nNet Revenue (+24% YoY)", - FontSize = 10, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0F6CBD", - Alignment = TextAlignmentMode.Center - }, - - new PdfShapeElement - { - X = 232, - Y = 274, - Width = 160, - Height = 68, - CornerRadius = 6, - FillColorHex = "#F0FDF4", - StrokeColorHex = "#BBF7D0", - StrokeThickness = 1 - }, - new PdfTextElement - { - X = 242, - Y = 282, - Width = 140, - Height = 52, - Text = "$685 MILLION\nOperating EBITDA (+31.7%)", - FontSize = 10, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#166534", - Alignment = TextAlignmentMode.Center - }, - - new PdfShapeElement - { - X = 408, - Y = 274, - Width = 160, - Height = 68, - CornerRadius = 6, - FillColorHex = "#FAF5FF", - StrokeColorHex = "#E9D5FF", - StrokeThickness = 1 - }, - new PdfTextElement - { - X = 418, - Y = 282, - Width = 140, - Height = 52, - Text = "$412 MILLION\nFree Cash Flow (+28.4%)", - FontSize = 10, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#7E22CE", - Alignment = TextAlignmentMode.Center - }, - - new PdfShapeElement - { - X = 585, - Y = 274, - Width = 160, - Height = 68, - CornerRadius = 6, - FillColorHex = "#FFFBEB", - StrokeColorHex = "#FDE68A", - StrokeThickness = 1 - }, - new PdfTextElement - { - X = 595, - Y = 282, - Width = 140, - Height = 52, - Text = "99.995% SLA\nGlobal Cloud Reliability", - FontSize = 10, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#B45309", - Alignment = TextAlignmentMode.Center - }, - - // Section 2: Highlights Left & Visual Chart Right - new PdfTextElement - { - X = 55, - Y = 356, - Width = 330, - Height = 20, - Text = "Strategic & Operational Milestones", - FontSize = 13, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0F172A" - }, - new PdfDividerElement - { - X = 55, - Y = 378, - Width = 330, - Height = 1, - Thickness = 1, - ColorHex = "#CBD5E1" - }, - new PdfTextElement - { - X = 55, - Y = 386, - Width = 330, - Height = 175, - Text = "✔ Acquisition of TechNova AI: Seamlessly integrated real-time vector document intelligence into all flagship offerings.\n✔ Enterprise Customer Expansion: Surpassed 8,420+ global enterprise accounts with net revenue retention (NRR) of 128%.\n✔ Multiplatform Engine Upgrade: Deployed Avalonia UI & SkiaSharp cross-platform architecture across 2.5M active daily seats.\n✔ Patent Portfolio: Granted 14 new international patents in distributed document synchronization and zero-knowledge encryption.", - FontSize = 8.5, - FontFamily = "Segoe UI", - LineHeight = 1.35, - TextColorHex = "#334155" - }, - - // Revenue Growth Chart (Q1-Q4) - new PdfChartElement - { - X = 405, - Y = 356, - Width = 340, - Height = 205, - Title = "FY 2026 Quarterly Revenue Trajectory ($ Billions)", - Categories = new List { "Q1 2026", "Q2 2026", "Q3 2026", "Q4 2026" }, - Values = new List { 0.65, 0.74, 0.82, 0.89 }, - ValueLabels = new List { "$0.65B", "$0.74B", "$0.82B", "$0.89B" }, - BarColorsHex = new List { "#93C5FD", "#60A5FA", "#3B82F6", "#0F6CBD" }, - BackgroundColorHex = "#FAFAFA", - BorderColorHex = "#E2E8F0" - }, - - // Section 3: Strategic Outlook & Long-Term Value Creation - new PdfTextElement - { - X = 55, - Y = 575, - Width = 690, - Height = 20, - Text = "2.0 Strategic Outlook & 2027 Growth Priorities", - FontSize = 13, - FontFamily = "Georgia", - IsBold = true, - TextColorHex = "#0F172A" - }, - new PdfDividerElement - { - X = 55, - Y = 597, - Width = 690, - Height = 1, - Thickness = 1, - ColorHex = "#0F6CBD" - }, - new PdfTextElement - { - X = 55, - Y = 605, - Width = 330, - Height = 180, - Text = "HYBRID CLOUD & EDGE SCALING\nWe are expanding our Kubernetes multi-region fabric to 14 additional Tier-4 colocation hubs across Europe and Asia-Pacific. This will decrease latency for global collaborative document editing to under 15 milliseconds worldwide.\n\nAI AUTOMATION & WORKFLOWS\nOur R&D pipeline will commercialize zero-shot tabular extraction and autonomous report generation, unlocking substantial productivity for Fortune 500 financial institutions.", - FontSize = 8.5, - FontFamily = "Segoe UI", - LineHeight = 1.35, - TextColorHex = "#334155" - }, - new PdfTextElement - { - X = 405, - Y = 605, - Width = 340, - Height = 180, - Text = "SECURITY & ENTERPRISE COMPLIANCE\nMaintaining SOC2 Type II, ISO 27001, and HIPAA compliance remains central to our governance model. We have allocated $65M toward continuous zero-trust authorization audits.\n\nCAPITAL ALLOCATION & BUYBACKS\nThe Board authorized a $250M share repurchase program for FY 2027, underscoring confidence in sustainable compounding cash generation and shareholder returns.", - FontSize = 8.5, - FontFamily = "Segoe UI", - LineHeight = 1.35, - TextColorHex = "#334155" - }, - - // Section 4: Risk Management & Governance Framework - new PdfShapeElement - { - X = 55, - Y = 795, - Width = 690, - Height = 120, - CornerRadius = 6, - FillColorHex = "#F8FAFC", - StrokeColorHex = "#E2E8F0", - StrokeThickness = 1 - }, - new PdfTextElement - { - X = 70, - Y = 805, - Width = 660, - Height = 18, - Text = "ENTERPRISE RISK MANAGEMENT & COMPLIANCE SUMMARY", - FontSize = 10.5, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0F6CBD" - }, - new PdfTextElement - { - X = 70, - Y = 828, - Width = 660, - Height = 78, - Text = "Our Enterprise Risk Management (ERM) committee regularly audits cybersecurity protocols, foreign exchange volatility exposures, and supply chain redundancies. Hedging instruments protect over 85% of foreign-currency cash receivables, and multi-cloud failovers ensure zero single-point-of-failure risks for mission-critical client services.", - FontSize = 8.5, - FontFamily = "Segoe UI", - LineHeight = 1.35, - TextColorHex = "#475569" - }, - - // Sign-off Strip - new PdfTextElement - { - X = 55, - Y = 930, - Width = 330, - Height = 50, - Text = "John Doe\nChief Executive Officer & Chair of the Board", - FontSize = 10, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0F172A" - }, - new PdfTextElement - { - X = 415, - Y = 930, - Width = 330, - Height = 50, - Text = "Jane Doe\nChief Financial Officer & Executive VP of Operations", - FontSize = 10, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0F172A", - Alignment = TextAlignmentMode.Right - } - } - }; - - // ========================================================================= - // PAGE 2: Operations, Regional Segments, Business Lines & Sustainability - // ========================================================================= - var page2 = new PdfPageModel - { - PageNumber = 2, - Format = PageFormat.A4, - Orientation = PageOrientation.Portrait, - Width = 800, - Height = 1131, - BackgroundColorHex = "#FFFFFF", - FooterLeft = "CODEFRYDEV CORPORATION • GLOBAL OPERATIONS & ESG", - FooterCenter = "CONFIDENTIAL & PROPRIETARY", - FooterRight = "Page 2 of 3", - Elements = new List - { - // Top Brand Accent Bar - new PdfShapeElement - { - X = 0, - Y = 0, - Width = 800, - Height = 6, - FillColorHex = "#0F6CBD", - StrokeColorHex = "#00000000", - StrokeThickness = 0 - }, - - new PdfTextElement - { - X = 55, - Y = 35, - Width = 690, - Height = 32, - Text = "3.0 Global Operational Footprint & Segment Performance", - FontSize = 22, - FontFamily = "Georgia", - IsBold = true, - TextColorHex = "#0F172A" - }, - new PdfDividerElement - { - X = 55, - Y = 75, - Width = 690, - Height = 2, - Thickness = 2, - ColorHex = "#0F6CBD" - }, - new PdfTextElement - { - X = 55, - Y = 85, - Width = 690, - Height = 45, - Text = "CodeFryDev operates across 4 core geographical markets supporting over 8,420 enterprise clients in 68 countries. High-availability cloud clustering and automated edge nodes delivered 99.995% uptime across all commercial SLA agreements throughout 2026.", - FontSize = 9.5, - FontFamily = "Segoe UI", - LineHeight = 1.35, - TextColorHex = "#334155" - }, - - // Table 1: Regional Operational Performance - new PdfTableElement - { - X = 55, - Y = 135, - Width = 690, - Height = 190, - Headers = new List { "Operating Region", "Data Hubs", "Enterprise Clients", "Uptime SLA", "2026 Revenue", "YoY Growth" }, - Rows = new List> - { - new() { "North America (HQ)", "14", "4,350", "99.998%", "$1,420 Million", "+22.4%" }, - new() { "EMEA (London / Frankfurt)", "9", "2,420", "99.995%", "$980 Million", "+26.1%" }, - new() { "APAC (Tokyo / Singapore)", "7", "1,280", "99.992%", "$540 Million", "+28.5%" }, - new() { "Latin America (São Paulo)", "3", "370", "99.985%", "$160 Million", "+18.5%" } - }, - HeaderBackgroundHex = "#0F6CBD", - HeaderTextHex = "#FFFFFF", - AlternateRowBackgroundHex = "#F8FAFC", - BorderColorHex = "#E2E8F0" - }, - - // Section 3.2: Product Segment Performance Table - new PdfTextElement - { - X = 55, - Y = 340, - Width = 690, - Height = 22, - Text = "3.1 Revenue & Contribution by Business Segment", - FontSize = 13, - FontFamily = "Georgia", - IsBold = true, - TextColorHex = "#0F172A" - }, - new PdfDividerElement - { - X = 55, - Y = 364, - Width = 690, - Height = 1, - Thickness = 1, - ColorHex = "#CBD5E1" - }, - - new PdfTableElement - { - X = 55, - Y = 374, - Width = 690, - Height = 190, - Headers = new List { "Product Line", "Revenue ($M)", "Gross Margin", "Active Seats", "Key Capabilities" }, - Rows = new List> - { - new() { "Enterprise Cloud Platform", "$1,450.0", "72.4%", "1,850,000", "Microservices, API Ingestion & AKS" }, - new() { "Desktop Publishing Suite", "$920.0", "64.8%", "2,450,000", "Cross-Platform Avalonia / SkiaSharp" }, - new() { "AI Vector Intelligence", "$510.0", "58.2%", "680,000", "LLM Document OCR & Synthesis" }, - new() { "Professional Advisory & Sec", "$220.0", "42.0%", "N/A", "SOC2 Architecture & Custom Integrations" } - }, - HeaderBackgroundHex = "#0F6CBD", - HeaderTextHex = "#FFFFFF", - AlternateRowBackgroundHex = "#F8FAFC", - BorderColorHex = "#E2E8F0" - }, - - // Section 4: Environmental, Social & Governance (ESG) - new PdfTextElement - { - X = 55, - Y = 580, - Width = 690, - Height = 22, - Text = "4.0 Environmental, Social & Governance (ESG) Stewardship", - FontSize = 13, - FontFamily = "Georgia", - IsBold = true, - TextColorHex = "#0F172A" - }, - new PdfDividerElement - { - X = 55, - Y = 604, - Width = 690, - Height = 1, - Thickness = 1, - ColorHex = "#0F6CBD" - }, - - // ESG 3-Pillar Cards - new PdfShapeElement - { - X = 55, - Y = 614, - Width = 218, - Height = 180, - CornerRadius = 6, - FillColorHex = "#F0FDF4", - StrokeColorHex = "#BBF7D0", - StrokeThickness = 1 - }, - new PdfTextElement - { - X = 68, - Y = 624, - Width = 192, - Height = 160, - Text = "🌿 ENVIRONMENTAL\n• 100% Renewable Energy: Sourced green energy across 100% of direct data facilities.\n• Zero Waste Hardware: 94% of retired server components recycled or refurbished.\n• Carbon Neutrality Goal: On track for net-zero Scope 1 & 2 emissions by 2028.", - FontSize = 8.5, - FontFamily = "Segoe UI", - LineHeight = 1.35, - TextColorHex = "#166534" - }, - - new PdfShapeElement - { - X = 291, - Y = 614, - Width = 218, - Height = 180, - CornerRadius = 6, - FillColorHex = "#F0F7FF", - StrokeColorHex = "#BFDBFE", - StrokeThickness = 1 - }, - new PdfTextElement - { - X = 304, - Y = 624, - Width = 192, - Height = 160, - Text = "🤝 SOCIAL & TALENT\n• Global Workforce: 3,450 employees across 18 development centers.\n• STEM Mentorship: $12M invested in youth coding fellowships and university scholarships.\n• Retention & Culture: 91% employee retention with top-quartile Glassdoor rating.", - FontSize = 8.5, - FontFamily = "Segoe UI", - LineHeight = 1.35, - TextColorHex = "#0F6CBD" - }, - - new PdfShapeElement - { - X = 527, - Y = 614, - Width = 218, - Height = 180, - CornerRadius = 6, - FillColorHex = "#FAF5FF", - StrokeColorHex = "#E9D5FF", - StrokeThickness = 1 - }, - new PdfTextElement - { - X = 540, - Y = 624, - Width = 192, - Height = 160, - Text = "⚖️ GOVERNANCE\n• Independent Board: 8 of 10 directors are fully independent.\n• Whistleblower Protections: 24/7 confidential reporting channel.\n• Audit & Risk: Quarterly external cybersecurity penetration testing and comprehensive controls.", - FontSize = 8.5, - FontFamily = "Segoe UI", - LineHeight = 1.35, - TextColorHex = "#7E22CE" - }, - - // Section 5: Board of Directors & Corporate Officers Roster - new PdfTextElement - { - X = 55, - Y = 810, - Width = 690, - Height = 22, - Text = "5.0 Executive Leadership & Board of Directors", - FontSize = 13, - FontFamily = "Georgia", - IsBold = true, - TextColorHex = "#0F172A" - }, - new PdfDividerElement - { - X = 55, - Y = 834, - Width = 690, - Height = 1, - Thickness = 1, - ColorHex = "#CBD5E1" - }, - new PdfTextElement - { - X = 55, - Y = 842, - Width = 330, - Height = 130, - Text = "EXECUTIVE COMMITTEE:\n• John Doe — Chief Executive Officer & Chair\n• Jane Doe — Chief Financial Officer\n• Alex Doe — Chief Technology Officer\n• Sam Doe, J.D. — Chief Legal & Compliance Officer\n• Taylor Doe — Chief Product Officer", - FontSize = 8.5, - FontFamily = "Segoe UI", - LineHeight = 1.35, - TextColorHex = "#334155" - }, - new PdfTextElement - { - X = 405, - Y = 842, - Width = 340, - Height = 130, - Text = "INDEPENDENT DIRECTORS:\n• Jordan Doe — Lead Independent Director\n• Morgan Doe — Former CFO, Enterprise Cloud\n• Dr. Robin Doe — Dean of Engineering, Technology Institute\n• Chris Doe — Managing Partner, Horizon Capital\n• Lee Doe — Chair of Audit Committee", - FontSize = 8.5, - FontFamily = "Segoe UI", - LineHeight = 1.35, - TextColorHex = "#334155" - } - } - }; - - // ========================================================================= - // PAGE 3: Consolidated Financials, Balance Sheet, Cash Flow & Audit Opinion - // ========================================================================= - var page3 = new PdfPageModel - { - PageNumber = 3, - Format = PageFormat.A4, - Orientation = PageOrientation.Portrait, - Width = 800, - Height = 1131, - BackgroundColorHex = "#FFFFFF", - FooterLeft = "CODEFRYDEV CORPORATION • CONSOLIDATED FINANCIAL STATEMENTS", - FooterCenter = "CONFIDENTIAL & PROPRIETARY", - FooterRight = "Page 3 of 3", - Elements = new List - { - // Top Brand Accent Bar - new PdfShapeElement - { - X = 0, - Y = 0, - Width = 800, - Height = 6, - FillColorHex = "#0F6CBD", - StrokeColorHex = "#00000000", - StrokeThickness = 0 - }, - - new PdfTextElement - { - X = 55, - Y = 35, - Width = 690, - Height = 32, - Text = "6.0 Consolidated Financial Statements & Audit Report", - FontSize = 22, - FontFamily = "Georgia", - IsBold = true, - TextColorHex = "#0F172A" - }, - new PdfDividerElement - { - X = 55, - Y = 75, - Width = 690, - Height = 2, - Thickness = 2, - ColorHex = "#0F6CBD" - }, - - // Statement of Operations (P&L) Table - new PdfTextElement - { - X = 55, - Y = 85, - Width = 690, - Height = 20, - Text = "CONSOLIDATED STATEMENTS OF OPERATIONS (IN MILLIONS, EXCEPT PER SHARE DATA)", - FontSize = 10, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0F6CBD" - }, - new PdfTableElement - { - X = 55, - Y = 108, - Width = 690, - Height = 230, - Headers = new List { "Line Item", "FY 2024", "FY 2025", "FY 2026", "YoY %" }, - Rows = new List> - { - new() { "Total Net Revenue", "$1,980.0", "$2,500.0", "$3,100.0", "+24.0%" }, - new() { "Cost of Goods Sold (COGS)", "$820.0", "$990.0", "$1,120.0", "+13.1%" }, - new() { "Gross Profit", "$1,160.0", "$1,510.0", "$1,980.0", "+31.1%" }, - new() { "Research & Development (R&D)", "$290.0", "$380.0", "$480.0", "+26.3%" }, - new() { "Sales, Marketing & General (SG&A)", "$460.0", "$610.0", "$815.0", "+33.6%" }, - new() { "Operating Income (EBITDA)", "$410.0", "$520.0", "$685.0", "+31.7%" }, - new() { "Provision for Income Taxes (21%)", "$95.0", "$115.0", "$145.0", "+26.1%" }, - new() { "Net Income After Taxes", "$315.0", "$405.0", "$540.0", "+33.3%" }, - new() { "Diluted Earnings Per Share (EPS)", "$1.82", "$2.34", "$3.12", "+33.3%" } - }, - HeaderBackgroundHex = "#0F6CBD", - HeaderTextHex = "#FFFFFF", - AlternateRowBackgroundHex = "#F8FAFC", - BorderColorHex = "#E2E8F0" - }, - - // Condensed Balance Sheet & Cash Flow Table - new PdfTextElement - { - X = 55, - Y = 350, - Width = 690, - Height = 20, - Text = "CONDENSED CONSOLIDATED BALANCE SHEET & CASH FLOW (AS OF DEC 31, 2026)", - FontSize = 10, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0F6CBD" - }, - new PdfTableElement - { - X = 55, - Y = 372, - Width = 690, - Height = 190, - Headers = new List { "Balance Sheet Metric", "FY 2025", "FY 2026", "YoY Change ($M)", "Health Indicator" }, - Rows = new List> - { - new() { "Cash, Equivalents & Short-Term Marketable Securities", "$840.0", "$1,180.0", "+$340.0", "Robust Liquidity" }, - new() { "Total Current Assets", "$1,450.0", "$1,980.0", "+$530.0", "Current Ratio: 2.4x" }, - new() { "Property, Plant & Cloud Infrastructure Equipment", "$620.0", "$890.0", "+$270.0", "Capacity Expanded" }, - new() { "Total Assets", "$3,280.0", "$4,420.0", "+$1,140.0", "Asset Growth +34.8%" }, - new() { "Total Long-Term Debt & Liabilities", "$650.0", "$580.0", "-$70.0", "Debt-to-Equity: 0.18" }, - new() { "Total Stockholders' Equity", "$2,150.0", "$3,180.0", "+$1,030.0", "Book Value / Share: $18.40" } - }, - HeaderBackgroundHex = "#0F6CBD", - HeaderTextHex = "#FFFFFF", - AlternateRowBackgroundHex = "#F8FAFC", - BorderColorHex = "#E2E8F0" - }, - - // Section 7: Independent Auditor's Report Box - new PdfShapeElement - { - X = 55, - Y = 575, - Width = 690, - Height = 145, - CornerRadius = 6, - FillColorHex = "#F0F7FF", - StrokeColorHex = "#BFDBFE", - StrokeThickness = 1 - }, - new PdfTextElement - { - X = 70, - Y = 585, - Width = 660, - Height = 20, - Text = "REPORT OF INDEPENDENT REGISTERED PUBLIC ACCOUNTING FIRM", - FontSize = 10.5, - FontFamily = "Georgia", - IsBold = true, - TextColorHex = "#0F6CBD" - }, - new PdfTextElement - { - X = 70, - Y = 608, - Width = 660, - Height = 102, - Text = "To the Shareholders and Board of Directors of CodeFryDev Corporation Inc.:\n\nOpinion on the Financial Statements: We have audited the accompanying consolidated balance sheets of CodeFryDev Corporation as of December 31, 2026 and 2025, and the related consolidated statements of operations, stockholders' equity, and cash flows. In our opinion, the consolidated financial statements present fairly, in all material respects, the financial position of CodeFryDev Corporation in conformity with U.S. GAAP.\n\nHorizon Global Assurance LLP • Certified Public Accountants • New York, NY • February 24, 2027", - FontSize = 8.5, - FontFamily = "Segoe UI", - LineHeight = 1.35, - TextColorHex = "#1E293B" - }, - - // Section 8: Board Signatures & Corporate Approval - new PdfTextElement - { - X = 55, - Y = 735, - Width = 690, - Height = 20, - Text = "7.0 Corporate Signatories & Board Approvals", - FontSize = 13, - FontFamily = "Georgia", - IsBold = true, - TextColorHex = "#0F172A" - }, - new PdfDividerElement - { - X = 55, - Y = 758, - Width = 690, - Height = 1, - Thickness = 1, - ColorHex = "#CBD5E1" - }, - - // Signatory 1 (CEO) - new PdfTextElement - { - X = 55, - Y = 770, - Width = 210, - Height = 40, - Text = "John Doe", - FontSize = 20, - FontFamily = "Great Vibes", - IsItalic = true, - TextColorHex = "#0F172A" - }, - new PdfDividerElement - { - X = 55, - Y = 812, - Width = 200, - Height = 1, - Thickness = 1, - ColorHex = "#94A3B8" - }, - new PdfTextElement - { - X = 55, - Y = 818, - Width = 200, - Height = 35, - Text = "John Doe\nChief Executive Officer", - FontSize = 9, - FontFamily = "Segoe UI", - TextColorHex = "#475569" - }, - - // Signatory 2 (CFO) - new PdfTextElement - { - X = 295, - Y = 770, - Width = 210, - Height = 40, - Text = "Jane Doe", - FontSize = 20, - FontFamily = "Great Vibes", - IsItalic = true, - TextColorHex = "#0F172A" - }, - new PdfDividerElement - { - X = 295, - Y = 812, - Width = 200, - Height = 1, - Thickness = 1, - ColorHex = "#94A3B8" - }, - new PdfTextElement - { - X = 295, - Y = 818, - Width = 200, - Height = 35, - Text = "Jane Doe\nChief Financial Officer", - FontSize = 9, - FontFamily = "Segoe UI", - TextColorHex = "#475569" - }, - - // Signatory 3 (Lead Director) - new PdfTextElement - { - X = 535, - Y = 770, - Width = 210, - Height = 40, - Text = "Alex Doe", - FontSize = 20, - FontFamily = "Great Vibes", - IsItalic = true, - TextColorHex = "#0F172A" - }, - new PdfDividerElement - { - X = 535, - Y = 812, - Width = 200, - Height = 1, - Thickness = 1, - ColorHex = "#94A3B8" - }, - new PdfTextElement - { - X = 535, - Y = 818, - Width = 200, - Height = 35, - Text = "Alex Doe\nLead Independent Director", - FontSize = 9, - FontFamily = "Segoe UI", - TextColorHex = "#475569" - }, - - // SEC EDGAR & Investor Relations Verification Notice - new PdfDividerElement - { - X = 55, - Y = 868, - Width = 690, - Height = 1, - Thickness = 1, - ColorHex = "#CBD5E1" - }, - new PdfTextElement - { - X = 55, - Y = 878, - Width = 690, - Height = 30, - Text = "Investor Relations: ir@codefrydev.in • Web: https://investors.codefrydev.in • Transfer Agent: Trust Co.", - FontSize = 8, - FontFamily = "Segoe UI", - TextColorHex = "#64748B", - Alignment = TextAlignmentMode.Center - } - } - }; - - doc.Pages.Add(page1); - doc.Pages.Add(page2); - doc.Pages.Add(page3); - - return doc; - } -} diff --git a/src/PdfEditorApp/Templates/Corporate/EmployeePayslipTemplate.cs b/src/PdfEditorApp/Templates/Corporate/EmployeePayslipTemplate.cs deleted file mode 100644 index ef294cd..0000000 --- a/src/PdfEditorApp/Templates/Corporate/EmployeePayslipTemplate.cs +++ /dev/null @@ -1,429 +0,0 @@ -using System.Collections.Generic; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; - -namespace PdfEditorApp.Templates.Corporate; - -public class EmployeePayslipTemplate : ITemplateDefinition -{ - public string Id => "payslip"; - public string Name => "Employee Monthly Payslip & Salary Statement"; - public string Description => "Modern corporate employee salary statement with dynamic earnings & deductions tables, verification QR code, barcode, and merge placeholders."; - public string Category => "Corporate"; - public string IconKind => "CashMultiple"; - public string AccentColorHex => "#0F6CBD"; - - public PdfDocumentModel Create() - { - var doc = new PdfDocumentModel - { - Title = "Payslip_{{EmployeeId}}_{{EmployeeName}}_{{PayPeriod}}.pdf", - Author = "{{CompanyName ?? CodeFryDev Inc.}}", - Subject = "Salary Payslip for {{EmployeeName}} - {{PayPeriod}}" - }; - - var page = new PdfPageModel - { - PageNumber = 1, - Format = PageFormat.A4, - Orientation = PageOrientation.Portrait, - Width = 800, - Height = 1131, - BackgroundColorHex = "#FFFFFF", - FooterLeft = "CodeFryDev Inc. • Confidential & Proprietary Document", - FooterCenter = "Computer Generated • No Physical Signature Required", - FooterRight = "Generated for {{EmployeeName}} (ID: {{EmployeeId}})", - Elements = new List - { - // Top Brand Accent Header Bar - new PdfShapeElement - { - X = 0, - Y = 0, - Width = 800, - Height = 8, - FillColorHex = "#0F6CBD", - StrokeColorHex = "#00000000", - StrokeThickness = 0 - }, - - // 1. Company Logo Badge - new PdfShapeElement - { - X = 50, - Y = 35, - Width = 48, - Height = 48, - CornerRadius = 10, - FillColorHex = "#0F6CBD", - StrokeColorHex = "#0C599B", - StrokeThickness = 0, - Label = "CF", - LabelColorHex = "#FFFFFF", - LabelFontSize = 18 - }, - - // 2. Company Details - new PdfTextElement - { - X = 110, - Y = 35, - Width = 380, - Height = 24, - Text = "{{CompanyName ?? CODEFRYDEV INC.}}", - FontSize = 14, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0F172A" - }, - new PdfTextElement - { - X = 110, - Y = 60, - Width = 380, - Height = 35, - Text = "100 Innovation Way, Suite 500 • Silicon Valley, CA 94025\nTax ID: US-EIN 94-8291042 • payroll@codefrydev.in", - FontSize = 9, - FontFamily = "Segoe UI", - LineHeight = 1.3, - TextColorHex = "#64748B" - }, - - // 3. Document Title & Pay Period Card - new PdfShapeElement - { - X = 520, - Y = 35, - Width = 230, - Height = 60, - CornerRadius = 8, - FillColorHex = "#F8FAFC", - StrokeColorHex = "#E2E8F0", - StrokeThickness = 1 - }, - new PdfTextElement - { - X = 530, - Y = 42, - Width = 210, - Height = 20, - Text = "MONTHLY SALARY SLIP", - FontSize = 12, - FontFamily = "Segoe UI", - IsBold = true, - Alignment = TextAlignmentMode.Center, - TextColorHex = "#0F6CBD" - }, - new PdfTextElement - { - X = 530, - Y = 66, - Width = 210, - Height = 20, - Text = "Pay Period: {{PayPeriod ?? August 2026}}", - FontSize = 10.5, - FontFamily = "Segoe UI", - IsBold = true, - Alignment = TextAlignmentMode.Center, - TextColorHex = "#334155" - }, - - // Divider Line - new PdfDividerElement - { - X = 50, - Y = 108, - Width = 700, - Height = 1, - ColorHex = "#E2E8F0", - Thickness = 1 - }, - - // 4. Employee Information Summary Card (Container) - new PdfShapeElement - { - X = 50, - Y = 120, - Width = 700, - Height = 115, - CornerRadius = 8, - FillColorHex = "#F8FAFC", - StrokeColorHex = "#CBD5E1", - StrokeThickness = 1 - }, - - // Section Header - new PdfTextElement - { - X = 65, - Y = 128, - Width = 300, - Height = 18, - Text = "EMPLOYEE & BANKING DETAILS", - FontSize = 10, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0F6CBD" - }, - - // Row 1: Name, ID, Designation - new PdfTextElement - { - X = 65, - Y = 150, - Width = 220, - Height = 36, - Text = "Employee Name\n{{EmployeeName ?? John Doe}}", - FontSize = 9.5, - FontFamily = "Segoe UI", - LineHeight = 1.35, - TextColorHex = "#1E293B" - }, - new PdfTextElement - { - X = 300, - Y = 150, - Width = 200, - Height = 36, - Text = "Employee ID\n{{EmployeeId ?? EMP-2026-0842}}", - FontSize = 9.5, - FontFamily = "Segoe UI", - LineHeight = 1.35, - TextColorHex = "#1E293B" - }, - new PdfTextElement - { - X = 520, - Y = 150, - Width = 210, - Height = 36, - Text = "Designation\n{{Designation ?? Senior Software Architect}}", - FontSize = 9.5, - FontFamily = "Segoe UI", - LineHeight = 1.35, - TextColorHex = "#1E293B" - }, - - // Row 2: Department, Bank Details, PAN/Tax ID - new PdfTextElement - { - X = 65, - Y = 190, - Width = 220, - Height = 36, - Text = "Department\n{{Department ?? Cloud Engineering}}", - FontSize = 9.5, - FontFamily = "Segoe UI", - LineHeight = 1.35, - TextColorHex = "#1E293B" - }, - new PdfTextElement - { - X = 300, - Y = 190, - Width = 200, - Height = 36, - Text = "Bank & Account No.\n{{BankName ?? First National Bank}} • {{AccountNumber ?? ****4892}}", - FontSize = 9.5, - FontFamily = "Segoe UI", - LineHeight = 1.35, - TextColorHex = "#1E293B" - }, - new PdfTextElement - { - X = 520, - Y = 190, - Width = 210, - Height = 36, - Text = "Date of Joining / Pay Days\n{{JoiningDate ?? 2022-04-15}} ({{WorkingDays ?? 30}} Days)", - FontSize = 9.5, - FontFamily = "Segoe UI", - LineHeight = 1.35, - TextColorHex = "#1E293B" - }, - - // 5. Earnings & Deductions Tables (Two Column Layout) - - // Left: Earnings Table - new PdfTableElement - { - X = 50, - Y = 250, - Width = 342, - Height = 220, - HeaderBackgroundHex = "#0F6CBD", - HeaderTextHex = "#FFFFFF", - AlternateRowBackgroundHex = "#F8FAFC", - BorderColorHex = "#CBD5E1", - Headers = new List { "EARNINGS BREAKDOWN", "AMOUNT" }, - Rows = new List> - { - new() { "Basic Salary", "{{BasicSalary:C}}" }, - new() { "House Rent Allowance (HRA)", "{{HRA:C}}" }, - new() { "Special Allowance", "{{SpecialAllowance:C}}" }, - new() { "Performance Incentive / Bonus", "{{Bonus:C}}" }, - new() { "Medical & Conveyance Allowance", "{{MedicalAllowance:C}}" }, - new() { "GROSS EARNINGS TOTAL", "{{GrossEarnings:C}}" } - } - }, - - // Right: Deductions Table - new PdfTableElement - { - X = 408, - Y = 250, - Width = 342, - Height = 220, - HeaderBackgroundHex = "#475569", - HeaderTextHex = "#FFFFFF", - AlternateRowBackgroundHex = "#F8FAFC", - BorderColorHex = "#CBD5E1", - Headers = new List { "DEDUCTIONS BREAKDOWN", "AMOUNT" }, - Rows = new List> - { - new() { "Provident Fund (PF) / 401(k)", "{{ProvidentFund:C}}" }, - new() { "Income Tax / TDS / PAYE", "{{IncomeTax:C}}" }, - new() { "Professional Tax", "{{ProfessionalTax:C}}" }, - new() { "Health & Life Insurance", "{{Insurance:C}}" }, - new() { "Other Deductions", "{{OtherDeductions:C}}" }, - new() { "TOTAL DEDUCTIONS", "{{TotalDeductions:C}}" } - } - }, - - // 6. Large Net Salary Highlight Card - new PdfShapeElement - { - X = 50, - Y = 490, - Width = 700, - Height = 82, - CornerRadius = 10, - FillColorHex = "#0F6CBD", - StrokeColorHex = "#0C599B", - StrokeThickness = 1 - }, - new PdfTextElement - { - X = 75, - Y = 502, - Width = 350, - Height = 24, - Text = "NET SALARY PAYABLE (TAKE HOME)", - FontSize = 11, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#E0F2FE" - }, - new PdfTextElement - { - X = 75, - Y = 528, - Width = 350, - Height = 32, - Text = "{{NetSalary:C}}", - FontSize = 22, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#FFFFFF" - }, - new PdfTextElement - { - X = 440, - Y = 512, - Width = 290, - Height = 44, - Text = "Amount in words:\n{{NetSalaryInWords ?? US Dollars Only}}", - FontSize = 9.5, - FontFamily = "Segoe UI", - LineHeight = 1.3, - TextColorHex = "#E0F2FE" - }, - - // 7. Security Verification & Barcode Section - new PdfShapeElement - { - X = 50, - Y = 590, - Width = 700, - Height = 145, - CornerRadius = 8, - FillColorHex = "#FAFAFA", - StrokeColorHex = "#E2E8F0", - StrokeThickness = 1 - }, - - // QR Code - new PdfQrCodeElement - { - X = 70, - Y = 605, - Width = 100, - Height = 100, - Content = "https://payroll.codefrydev.in/verify?emp={{EmployeeId}}&period={{PayPeriod}}&hash={{AuthHash ?? 8f92a10c}}", - Label = "SCAN TO VERIFY", - DarkColorHex = "#0F172A", - LightColorHex = "#FFFFFF" - }, - - // Verification details text - new PdfTextElement - { - X = 185, - Y = 608, - Width = 270, - Height = 110, - Text = "OFFICIAL DIGITAL RECORD\n\nThis payroll document is digitally signed and cryptographically registered in the CodeFryDev Enterprise Payroll Ledger.\n\nVerification Token: {{AuthHash ?? 8F92-A10C-5542}}\nDisbursement Date: {{PaymentDate ?? 2026-08-31}}", - FontSize = 8.5, - FontFamily = "Segoe UI", - LineHeight = 1.35, - TextColorHex = "#475569" - }, - - // Barcode - new PdfBarcodeElement - { - X = 480, - Y = 612, - Width = 250, - Height = 55, - CodeValue = "{{EmployeeId ?? EMP-2026-0842}}", - BarcodeFormat = "Code128", - BarColorHex = "#0F172A", - BackgroundColorHex = "#FFFFFF", - ShowText = true - }, - - // Authorized Signatory Stamp Box - new PdfTextElement - { - X = 480, - Y = 680, - Width = 250, - Height = 40, - Text = "Authorized Payroll Officer\nCodeFryDev Inc.", - FontSize = 9, - FontFamily = "Segoe UI", - Alignment = TextAlignmentMode.Center, - TextColorHex = "#64748B" - }, - - // Confidentiality Legal Notice - new PdfTextElement - { - X = 50, - Y = 750, - Width = 700, - Height = 40, - Text = "CONFIDENTIALITY NOTICE: This document contains strictly confidential compensation information intended solely for the named employee. Unauthorized copying, distribution, or disclosure is strictly prohibited under corporate policy and applicable privacy laws.", - FontSize = 7.5, - FontFamily = "Segoe UI", - LineHeight = 1.35, - TextColorHex = "#94A3B8" - } - } - }; - - doc.Pages.Add(page); - return doc; - } -} diff --git a/src/PdfEditorApp/Templates/Corporate/InteractiveExecutiveBriefTemplate.cs b/src/PdfEditorApp/Templates/Corporate/InteractiveExecutiveBriefTemplate.cs deleted file mode 100644 index c36047c..0000000 --- a/src/PdfEditorApp/Templates/Corporate/InteractiveExecutiveBriefTemplate.cs +++ /dev/null @@ -1,1378 +0,0 @@ -using System; -using System.Collections.Generic; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; - -namespace PdfEditorApp.Templates.Corporate; - -/// -/// High-impact, multi-page landscape presentation deck designed specifically for the .frypdf interactive viewer. -/// Features capabilities impossible in static binary PDFs: -/// - Interactive live data tables with real-time substring search, multi-column sorting, and CSV export -/// - Dynamic animated charts with 600ms cubic ease-out entry, hover tooltips, and live data inspector toggle -/// - Interactive form field compliance checklist and verifiable digital signature blocks -/// - Real QR codes, tracking barcodes, security redaction blocks, and executive sticky notes -/// - 16:10 / landscape presentation geometry (1131 x 800 pt) ideal for laptop and widescreen displays -/// -public class InteractiveExecutiveBriefTemplate : ITemplateDefinition -{ - public string Id => "interactive_executive_deck"; - public string Name => "Executive Strategy & Interactive Deck"; - public string Description => "Landscape presentation deck showcasing interactive living tables with CSV export, animated charts, live checklist form fields, and KPI telemetry"; - public string Category => "Corporate"; - public string IconKind => "PresentationPlay"; - public string AccentColorHex => "#6366F1"; - - public PdfDocumentModel Create() - { - var doc = new PdfDocumentModel - { - Title = "QuantumScale_Global_Executive_Strategic_Brief_2026.frypdf", - Author = "QuantumScale Systems Global Corp", - Subject = "Interactive Board Presentation Deck • Live Tables, Animated Charts, and Security Governance Ledger", - CreatedDate = DateTime.Now - }; - - // ========================================================================= - // PAGE 1: EXECUTIVE INTELLIGENCE & TELEMETRY DASHBOARD (1131 x 800 pt) - // ========================================================================= - var page1 = new PdfPageModel - { - PageNumber = 1, - Format = PageFormat.A4, - Orientation = PageOrientation.Landscape, - Width = 1131, - Height = 800, - BackgroundColorHex = "#FFFFFF", - HeaderLeft = "QUANTUMSCALE CLOUD SYSTEMS • GLOBAL STRATEGIC BRIEF", - HeaderCenter = "CONFIDENTIAL • BOARD OF DIRECTORS PRESENTATION", - HeaderRight = "FY 2026-2027", - FooterLeft = "QUANTUMSCALE ENTERPRISE TELEMETRY • LIVE PRESENTATION DECK", - FooterCenter = "CONFIDENTIAL & PROPRIETARY", - FooterRight = "Slide 1 of 3", - Elements = new List - { - // Top Edge Accent Brand Band - new PdfShapeElement - { - X = 0, - Y = 0, - Width = 1131, - Height = 6, - FillColorHex = "#4F46E5", - StrokeColorHex = "#00000000", - StrokeThickness = 0 - }, - - // QuantumScale Logo Badge - new PdfShapeElement - { - X = 50, - Y = 28, - Width = 48, - Height = 48, - CornerRadius = 12, - FillColorHex = "#4F46E5", - StrokeColorHex = "#3730A3", - StrokeThickness = 0, - Label = "QS", - LabelColorHex = "#FFFFFF", - LabelFontSize = 20 - }, - - // Header Titles - new PdfTextElement - { - X = 110, - Y = 30, - Width = 600, - Height = 18, - Text = "QUANTUMSCALE CLOUD ENTERPRISE • EXECUTIVE STRATEGIC BRIEFING", - FontSize = 9.5, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#6366F1", - CharacterSpacing = 1.0 - }, - new PdfTextElement - { - X = 110, - Y = 48, - Width = 600, - Height = 32, - Text = "Global Enterprise Telemetry & Growth Outlook", - FontSize = 22, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0F172A" - }, - - // Right Live Deck Pill Badge - new PdfShapeElement - { - X = 930, - Y = 34, - Width = 151, - Height = 34, - CornerRadius = 17, - FillColorHex = "#EEF2FF", - StrokeColorHex = "#C7D2FE", - StrokeThickness = 1, - Label = "● LIVE INTERACTIVE", - LabelColorHex = "#4F46E5", - LabelFontSize = 10 - }, - new PdfTextElement - { - X = 850, - Y = 74, - Width = 231, - Height = 18, - Text = "Fiscal Year 2026-2027 • Board Review", - FontSize = 9.5, - FontFamily = "Segoe UI", - TextColorHex = "#64748B", - Alignment = TextAlignmentMode.Right - }, - - // Top Accent Divider - new PdfDividerElement - { - X = 50, - Y = 94, - Width = 1031, - Height = 2, - ColorHex = "#E2E8F0" - }, - - // ----------------------------------------------------------------- - // ROW 1: FOUR HIGH-IMPACT EXECUTIVE KPI CARDS (Y = 110, Height = 90) - // ----------------------------------------------------------------- - // Card 1: Annual Recurring Revenue - new PdfShapeElement - { - X = 50, - Y = 110, - Width = 242, - Height = 90, - CornerRadius = 12, - FillColorHex = "#F8FAFC", - StrokeColorHex = "#E2E8F0", - StrokeThickness = 1 - }, - new PdfShapeElement - { - X = 50, - Y = 110, - Width = 4, - Height = 90, - CornerRadius = 2, - FillColorHex = "#4F46E5", - StrokeThickness = 0 - }, - new PdfTextElement - { - X = 64, - Y = 122, - Width = 210, - Height = 18, - Text = "ANNUAL RECURRING REVENUE (ARR)", - FontSize = 8.5, - IsBold = true, - TextColorHex = "#64748B" - }, - new PdfTextElement - { - X = 64, - Y = 140, - Width = 120, - Height = 36, - Text = "$148.6M", - FontSize = 24, - IsBold = true, - TextColorHex = "#0F172A" - }, - new PdfShapeElement - { - X = 180, - Y = 146, - Width = 98, - Height = 24, - CornerRadius = 12, - FillColorHex = "#ECFDF5", - StrokeColorHex = "#A7F3D0", - StrokeThickness = 1, - Label = "▲ +38.2% YoY", - LabelColorHex = "#059669", - LabelFontSize = 9.5 - }, - - // Card 2: Net Dollar Retention (NDR) - new PdfShapeElement - { - X = 313, - Y = 110, - Width = 242, - Height = 90, - CornerRadius = 12, - FillColorHex = "#F8FAFC", - StrokeColorHex = "#E2E8F0", - StrokeThickness = 1 - }, - new PdfShapeElement - { - X = 313, - Y = 110, - Width = 4, - Height = 90, - CornerRadius = 2, - FillColorHex = "#0284C7", - StrokeThickness = 0 - }, - new PdfTextElement - { - X = 327, - Y = 122, - Width = 210, - Height = 18, - Text = "NET DOLLAR RETENTION (NDR)", - FontSize = 8.5, - IsBold = true, - TextColorHex = "#64748B" - }, - new PdfTextElement - { - X = 327, - Y = 140, - Width = 110, - Height = 36, - Text = "142.4%", - FontSize = 24, - IsBold = true, - TextColorHex = "#0F172A" - }, - new PdfShapeElement - { - X = 438, - Y = 146, - Width = 104, - Height = 24, - CornerRadius = 12, - FillColorHex = "#F0F9FF", - StrokeColorHex = "#BAE6FD", - StrokeThickness = 1, - Label = "★ Top 5% Decile", - LabelColorHex = "#0284C7", - LabelFontSize = 9.5 - }, - - // Card 3: Blended Gross Margin - new PdfShapeElement - { - X = 576, - Y = 110, - Width = 242, - Height = 90, - CornerRadius = 12, - FillColorHex = "#F8FAFC", - StrokeColorHex = "#E2E8F0", - StrokeThickness = 1 - }, - new PdfShapeElement - { - X = 576, - Y = 110, - Width = 4, - Height = 90, - CornerRadius = 2, - FillColorHex = "#10B981", - StrokeThickness = 0 - }, - new PdfTextElement - { - X = 590, - Y = 122, - Width = 210, - Height = 18, - Text = "BLENDED GROSS MARGIN", - FontSize = 8.5, - IsBold = true, - TextColorHex = "#64748B" - }, - new PdfTextElement - { - X = 590, - Y = 140, - Width = 110, - Height = 36, - Text = "79.8%", - FontSize = 24, - IsBold = true, - TextColorHex = "#0F172A" - }, - new PdfShapeElement - { - X = 702, - Y = 146, - Width = 102, - Height = 24, - CornerRadius = 12, - FillColorHex = "#ECFDF5", - StrokeColorHex = "#A7F3D0", - StrokeThickness = 1, - Label = "+340 bps YoY", - LabelColorHex = "#059669", - LabelFontSize = 9.5 - }, - - // Card 4: Active Enterprise Mesh Nodes - new PdfShapeElement - { - X = 839, - Y = 110, - Width = 242, - Height = 90, - CornerRadius = 12, - FillColorHex = "#F8FAFC", - StrokeColorHex = "#E2E8F0", - StrokeThickness = 1 - }, - new PdfShapeElement - { - X = 839, - Y = 110, - Width = 4, - Height = 90, - CornerRadius = 2, - FillColorHex = "#8B5CF6", - StrokeThickness = 0 - }, - new PdfTextElement - { - X = 853, - Y = 122, - Width = 210, - Height = 18, - Text = "ACTIVE ENTERPRISE MESH NODES", - FontSize = 8.5, - IsBold = true, - TextColorHex = "#64748B" - }, - new PdfTextElement - { - X = 853, - Y = 140, - Width = 110, - Height = 36, - Text = "42,850", - FontSize = 24, - IsBold = true, - TextColorHex = "#0F172A" - }, - new PdfShapeElement - { - X = 964, - Y = 146, - Width = 104, - Height = 24, - CornerRadius = 12, - FillColorHex = "#F5F3FF", - StrokeColorHex = "#DDD6FE", - StrokeThickness = 1, - Label = "38 Cloud Zones", - LabelColorHex = "#7C3AED", - LabelFontSize = 9.5 - }, - - // ----------------------------------------------------------------- - // ROW 2: LEFT COLUMN: INTERACTIVE REVENUE CHART (Y = 218, H = 512) - // ----------------------------------------------------------------- - new PdfShapeElement - { - X = 50, - Y = 218, - Width = 590, - Height = 512, - CornerRadius = 16, - FillColorHex = "#FFFFFF", - StrokeColorHex = "#E2E8F0", - StrokeThickness = 1 - }, - new PdfTextElement - { - X = 72, - Y = 236, - Width = 400, - Height = 24, - Text = "Quarterly Revenue Acceleration & Runway ($M)", - FontSize = 14, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0F172A" - }, - new PdfTextElement - { - X = 72, - Y = 260, - Width = 520, - Height = 18, - Text = "Interactive chart: Hover bars for details, replay animation, or toggle data table view.", - FontSize = 9.5, - FontFamily = "Segoe UI", - TextColorHex = "#64748B" - }, - - // Interactive Chart Element (BarColumn) - new PdfChartElement - { - X = 72, - Y = 286, - Width = 546, - Height = 345, - ZIndex = 400, - Title = "Quarterly Revenue Acceleration ($M)", - ChartType = ChartType.BarColumn, - BackgroundColorHex = "#FFFFFF", - BorderColorHex = "#E2E8F0", - Categories = new List { "Q1 2025", "Q2 2025", "Q3 2025", "Q4 2025", "Q1 2026", "Q2 2026" }, - Values = new List { 18.4, 24.1, 29.8, 36.5, 42.2, 48.6 }, - ValueLabels = new List { "$18.4M", "$24.1M", "$29.8M", "$36.5M", "$42.2M", "$48.6M" }, - BarColorsHex = new List { "#818CF8", "#6366F1", "#4F46E5", "#4338CA", "#3730A3", "#312E81" } - }, - - // Takeaway insight banner inside Chart card - new PdfShapeElement - { - X = 72, - Y = 645, - Width = 546, - Height = 65, - CornerRadius = 10, - FillColorHex = "#EEF2FF", - StrokeColorHex = "#C7D2FE", - StrokeThickness = 1 - }, - new PdfTextElement - { - X = 86, - Y = 655, - Width = 518, - Height = 48, - Text = "💡 Board Takeaway: The compounding trajectory demonstrates sustainable 40%+ expansion with accelerating enterprise net retention. Interactive presentation mode permits live exploration and real-time hover inspection.", - FontSize = 9.5, - FontFamily = "Segoe UI", - TextColorHex = "#3730A3", - TextWrap = true - }, - - // ----------------------------------------------------------------- - // ROW 2: RIGHT COLUMN: STRATEGIC GROWTH PILLARS & STICKY NOTE - // ----------------------------------------------------------------- - new PdfShapeElement - { - X = 660, - Y = 218, - Width = 421, - Height = 512, - CornerRadius = 16, - FillColorHex = "#FFFFFF", - StrokeColorHex = "#E2E8F0", - StrokeThickness = 1 - }, - new PdfTextElement - { - X = 682, - Y = 236, - Width = 380, - Height = 22, - Text = "Global ARR Contribution by Pillar", - FontSize = 14, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0F172A" - }, - new PdfTextElement - { - X = 682, - Y = 258, - Width = 380, - Height = 18, - Text = "Interactive Donut: Hover segments for share % or switch to table view.", - FontSize = 9.5, - FontFamily = "Segoe UI", - TextColorHex = "#64748B" - }, - - // Interactive Donut / Pie Chart Element - new PdfChartElement - { - X = 680, - Y = 282, - Width = 381, - Height = 225, - ZIndex = 400, - Title = "ARR by Product Pillar ($M)", - ChartType = ChartType.DonutPie, - BackgroundColorHex = "#FFFFFF", - BorderColorHex = "#E2E8F0", - Categories = new List { "AI Agent Mesh", "Sovereign Enclaves", "Edge Storage", "Post-Quantum Security" }, - Values = new List { 62.4, 41.6, 26.8, 17.8 }, - ValueLabels = new List { "$62.4M", "$41.6M", "$26.8M", "$17.8M" }, - BarColorsHex = new List { "#4F46E5", "#0284C7", "#10B981", "#8B5CF6" } - }, - - // Divider inside Right Card - new PdfDividerElement - { - X = 680, - Y = 516, - Width = 381, - Height = 1, - ColorHex = "#E2E8F0" - }, - - // Executive Sticky Note Callout - new PdfStickyNoteElement - { - X = 680, - Y = 526, - Width = 381, - Height = 184, - ZIndex = 600, - Author = "Elena Vance, CEO & Co-Founder", - Timestamp = "Sep 2026", - NoteText = "Our transition to interactive .frypdf presentations empowers our board, stakeholders, and partners to engage directly with living data rather than static snapshots. All numbers here are verifiable directly against our cloud warehouse.", - Status = "Verified Executive Note" - } - } - }; - - // ========================================================================= - // PAGE 2: INTERACTIVE OPERATIONAL LEDGER & SEGMENT MATRIX (1131 x 800 pt) - // ========================================================================= - var page2 = new PdfPageModel - { - PageNumber = 2, - Format = PageFormat.A4, - Orientation = PageOrientation.Landscape, - Width = 1131, - Height = 800, - BackgroundColorHex = "#FFFFFF", - HeaderLeft = "QUANTUMSCALE CLOUD SYSTEMS • OPERATIONAL LEDGER", - HeaderCenter = "LIVE AUDITABLE SEGMENT BREAKDOWN", - HeaderRight = "FY 2026-2027", - FooterLeft = "QUANTUMSCALE ENTERPRISE TELEMETRY • LIVE PRESENTATION DECK", - FooterCenter = "CONFIDENTIAL & PROPRIETARY", - FooterRight = "Slide 2 of 3", - Elements = new List - { - // Top Edge Accent Brand Band - new PdfShapeElement - { - X = 0, - Y = 0, - Width = 1131, - Height = 6, - FillColorHex = "#0284C7", - StrokeColorHex = "#00000000", - StrokeThickness = 0 - }, - - // Header Titles - new PdfTextElement - { - X = 50, - Y = 30, - Width = 550, - Height = 18, - Text = "FINANCE & OPERATIONS • INTERACTIVE SEGMENT LEDGER", - FontSize = 9.5, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0284C7", - CharacterSpacing = 1.0 - }, - new PdfTextElement - { - X = 50, - Y = 48, - Width = 680, - Height = 32, - Text = "Segment Revenue, Operating Expenditure & Gross Margin Matrix", - FontSize = 22, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0F172A" - }, - - // Interactive Instruction Pill Badge - new PdfShapeElement - { - X = 760, - Y = 36, - Width = 321, - Height = 34, - CornerRadius = 17, - FillColorHex = "#F0F9FF", - StrokeColorHex = "#BAE6FD", - StrokeThickness = 1, - Label = "🔍 Live Table: Type in search or click headers to sort", - LabelColorHex = "#0284C7", - LabelFontSize = 9.5 - }, - - // Top Accent Divider - new PdfDividerElement - { - X = 50, - Y = 94, - Width = 1031, - Height = 2, - ColorHex = "#E2E8F0" - }, - - // ----------------------------------------------------------------- - // MAIN LIVING DATA TABLE (Centerpiece Feature, ZIndex = 500) - // ----------------------------------------------------------------- - new PdfTableElement - { - X = 50, - Y = 108, - Width = 1031, - Height = 348, - ZIndex = 500, - HeaderBackgroundHex = "#0F6CBD", - HeaderTextHex = "#FFFFFF", - AlternateRowBackgroundHex = "#F8FAFC", - BorderColorHex = "#CBD5E1", - Headers = new List - { - "Business Unit & Segment", - "Primary Region", - "Contract Tier", - "FY26 ARR ($M)", - "Blended Margin", - "YoY Growth", - "Health Status" - }, - Rows = new List> - { - new() { "Enterprise Cloud Infrastructure", "North America", "Fortune 500", "$52.4M", "78.4%", "+42.1%", "Prime Exceeding" }, - new() { "Autonomous AI Agent Mesh", "Global / Multi-Region", "Enterprise Core", "$34.8M", "84.1%", "+115.4%", "Hyper-Growth" }, - new() { "Edge Compute & Telemetry Mesh", "Asia-Pacific (APAC)", "Strategic Tier", "$28.6M", "71.2%", "+38.5%", "On Track" }, - new() { "Zero-Trust Security & Vaults", "Europe / Middle East", "Government / FinServ", "$18.2M", "81.0%", "+27.8%", "Strong Retention" }, - new() { "Developer API & Neural Embeddings", "Global Direct", "Self-Serve & Scale", "$14.6M", "88.5%", "+64.2%", "Expanding" }, - new() { "Hardware Security Enclaves", "North America", "Defense & Healthcare", "$9.8M", "76.3%", "+19.0%", "Stable" }, - new() { "Global Managed Support SLA", "All Geographies", "Mission Critical", "$7.2M", "68.9%", "+14.5%", "High Satisfaction" } - } - }, - - // ----------------------------------------------------------------- - // BOTTOM ROW: GEOGRAPHIC ARR CHART + EFFICIENCY SCORECARD - // ----------------------------------------------------------------- - // Left Card: Regional Share Animated Chart - new PdfShapeElement - { - X = 50, - Y = 472, - Width = 560, - Height = 258, - CornerRadius = 14, - FillColorHex = "#FFFFFF", - StrokeColorHex = "#E2E8F0", - StrokeThickness = 1 - }, - new PdfTextElement - { - X = 72, - Y = 490, - Width = 400, - Height = 22, - Text = "Global Cloud Infrastructure Capacity & Node Load", - FontSize = 13, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0F172A" - }, - new PdfChartElement - { - X = 72, - Y = 518, - Width = 516, - Height = 195, - ZIndex = 400, - Title = "Regional Mesh Load (% Capacity)", - ChartType = ChartType.HorizontalBar, - BackgroundColorHex = "#FFFFFF", - BorderColorHex = "#E2E8F0", - Categories = new List { "Virginia US-East", "Frankfurt EU-Central", "Tokyo AP-Northeast", "Dubai ME-Central", "São Paulo SA-East" }, - Values = new List { 94.0, 88.5, 91.2, 76.4, 68.0 }, - ValueLabels = new List { "94% Load", "88% Load", "91% Load", "76% Load", "68% Load" }, - BarColorsHex = new List { "#3B82F6", "#10B981", "#8B5CF6", "#F59E0B", "#EC4899" } - }, - - // Right Card: Capital Efficiency & Rule of 40 Scorecard - new PdfShapeElement - { - X = 635, - Y = 472, - Width = 446, - Height = 258, - CornerRadius = 14, - FillColorHex = "#FFFFFF", - StrokeColorHex = "#E2E8F0", - StrokeThickness = 1 - }, - new PdfTextElement - { - X = 657, - Y = 490, - Width = 400, - Height = 22, - Text = "Capital Efficiency & Rule of 40 Metrics", - FontSize = 13, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0F172A" - }, - - // Metric 1: Rule of 40 Score - new PdfShapeElement - { - X = 657, - Y = 525, - Width = 72, - Height = 26, - CornerRadius = 13, - FillColorHex = "#ECFDF5", - StrokeThickness = 0, - Label = "58.6%", - LabelColorHex = "#059669", - LabelFontSize = 11 - }, - new PdfTextElement - { - X = 739, - Y = 529, - Width = 325, - Height = 20, - Text = "Rule of 40 Rating: +38.2% Growth + 20.4% Free Cash Flow", - FontSize = 10, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0F172A" - }, - - // Metric 2: Payback Period - new PdfShapeElement - { - X = 657, - Y = 565, - Width = 72, - Height = 26, - CornerRadius = 13, - FillColorHex = "#EFF6FF", - StrokeThickness = 0, - Label = "6.4 Mo", - LabelColorHex = "#0284C7", - LabelFontSize = 11 - }, - new PdfTextElement - { - X = 739, - Y = 569, - Width = 325, - Height = 20, - Text = "Customer Acquisition Payback Period (Industry avg: 14 mo)", - FontSize = 10, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0F172A" - }, - - // Metric 3: Magic Number - new PdfShapeElement - { - X = 657, - Y = 605, - Width = 72, - Height = 26, - CornerRadius = 13, - FillColorHex = "#F5F3FF", - StrokeThickness = 0, - Label = "1.42x", - LabelColorHex = "#7C3AED", - LabelFontSize = 11 - }, - new PdfTextElement - { - X = 739, - Y = 609, - Width = 325, - Height = 20, - Text = "Sales Efficiency Magic Number (Top decile tier > 1.0x)", - FontSize = 10, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0F172A" - }, - - // Export Callout Box - new PdfShapeElement - { - X = 657, - Y = 648, - Width = 404, - Height = 65, - CornerRadius = 8, - FillColorHex = "#F8FAFC", - StrokeColorHex = "#E2E8F0", - StrokeThickness = 1 - }, - new PdfTextElement - { - X = 670, - Y = 658, - Width = 378, - Height = 48, - Text = "📋 Instant Export: In .frypdf interactive mode, you can copy the full financial table directly as clean CSV to Excel or Google Sheets by clicking 'Copy CSV' in the table header above.", - FontSize = 9.5, - FontFamily = "Segoe UI", - TextColorHex = "#475569", - TextWrap = true - } - } - }; - - // ========================================================================= - // PAGE 3: PRODUCT ROADMAP, GOVERNANCE AUDIT & SIGN-OFF (1131 x 800 pt) - // ========================================================================= - var page3 = new PdfPageModel - { - PageNumber = 3, - Format = PageFormat.A4, - Orientation = PageOrientation.Landscape, - Width = 1131, - Height = 800, - BackgroundColorHex = "#FFFFFF", - HeaderLeft = "QUANTUMSCALE CLOUD SYSTEMS • GOVERNANCE & COMPLIANCE", - HeaderCenter = "AUDITED ENTERPRISE CLEARANCE", - HeaderRight = "FY 2026-2027", - FooterLeft = "QUANTUMSCALE ENTERPRISE TELEMETRY • LIVE PRESENTATION DECK", - FooterCenter = "CONFIDENTIAL & PROPRIETARY", - FooterRight = "Slide 3 of 3", - Elements = new List - { - // Top Edge Accent Brand Band - new PdfShapeElement - { - X = 0, - Y = 0, - Width = 1131, - Height = 6, - FillColorHex = "#059669", - StrokeColorHex = "#00000000", - StrokeThickness = 0 - }, - - // Header Titles - new PdfTextElement - { - X = 50, - Y = 30, - Width = 600, - Height = 18, - Text = "ROADMAP & GOVERNANCE • INTERACTIVE COMPLIANCE CLEARANCE", - FontSize = 9.5, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#059669", - CharacterSpacing = 1.0 - }, - new PdfTextElement - { - X = 50, - Y = 48, - Width = 680, - Height = 32, - Text = "Horizon Product Milestones & Enterprise Security Audit", - FontSize = 22, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0F172A" - }, - - // Verified Pill Badge - new PdfShapeElement - { - X = 870, - Y = 36, - Width = 211, - Height = 34, - CornerRadius = 17, - FillColorHex = "#ECFDF5", - StrokeColorHex = "#A7F3D0", - StrokeThickness = 1, - Label = "🛡️ ISO-27001 / SOC-2 CERTIFIED", - LabelColorHex = "#059669", - LabelFontSize = 9.5 - }, - - // Top Accent Divider - new PdfDividerElement - { - X = 50, - Y = 94, - Width = 1031, - Height = 2, - ColorHex = "#E2E8F0" - }, - - // ----------------------------------------------------------------- - // LEFT SECTION: 3-HORIZON PRODUCT ROADMAP (X = 50, Y = 108, W = 540) - // ----------------------------------------------------------------- - new PdfShapeElement - { - X = 50, - Y = 108, - Width = 540, - Height = 412, - CornerRadius = 16, - FillColorHex = "#FFFFFF", - StrokeColorHex = "#E2E8F0", - StrokeThickness = 1 - }, - new PdfTextElement - { - X = 72, - Y = 126, - Width = 490, - Height = 22, - Text = "Strategic Technology Roadmap Horizons", - FontSize = 13, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0F172A" - }, - new PdfTextElement - { - X = 72, - Y = 148, - Width = 490, - Height = 18, - Text = "Planned releases and R&D capital allocation for the next 18 months", - FontSize = 9.5, - FontFamily = "Segoe UI", - TextColorHex = "#64748B" - }, - - // Horizon 1: Now (Q4 2026) - new PdfShapeElement - { - X = 72, - Y = 176, - Width = 496, - Height = 65, - CornerRadius = 8, - FillColorHex = "#EFF6FF", - StrokeColorHex = "#BFDBFE", - StrokeThickness = 1 - }, - new PdfShapeElement - { - X = 84, - Y = 186, - Width = 110, - Height = 22, - CornerRadius = 11, - FillColorHex = "#0284C7", - StrokeThickness = 0, - Label = "HORIZON 1 (NOW)", - LabelColorHex = "#FFFFFF", - LabelFontSize = 8.5 - }, - new PdfTextElement - { - X = 204, - Y = 184, - Width = 350, - Height = 48, - Text = "Neural Vector Search Index v3.0 • Multi-Cluster Telemetry Streaming • Auto-Scaling Cryptographic Enclaves", - FontSize = 9.5, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0369A1", - TextWrap = true - }, - - // Horizon 2: Next 6-12 Months - new PdfShapeElement - { - X = 72, - Y = 252, - Width = 496, - Height = 65, - CornerRadius = 8, - FillColorHex = "#F5F3FF", - StrokeColorHex = "#DDD6FE", - StrokeThickness = 1 - }, - new PdfShapeElement - { - X = 84, - Y = 262, - Width = 110, - Height = 22, - CornerRadius = 11, - FillColorHex = "#7C3AED", - StrokeThickness = 0, - Label = "HORIZON 2 (H1 27)", - LabelColorHex = "#FFFFFF", - LabelFontSize = 8.5 - }, - new PdfTextElement - { - X = 204, - Y = 260, - Width = 350, - Height = 48, - Text = "Zero-Latency Distributed Mesh Cache • Self-Healing Cloud Edge • Autonomous Cross-Cloud Orchestrator", - FontSize = 9.5, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#5B21B6", - TextWrap = true - }, - - // Horizon 3: 12-18 Months - new PdfShapeElement - { - X = 72, - Y = 328, - Width = 496, - Height = 65, - CornerRadius = 8, - FillColorHex = "#ECFDF5", - StrokeColorHex = "#A7F3D0", - StrokeThickness = 1 - }, - new PdfShapeElement - { - X = 84, - Y = 338, - Width = 110, - Height = 22, - CornerRadius = 11, - FillColorHex = "#059669", - StrokeThickness = 0, - Label = "HORIZON 3 (H2 27)", - LabelColorHex = "#FFFFFF", - LabelFontSize = 8.5 - }, - new PdfTextElement - { - X = 204, - Y = 336, - Width = 350, - Height = 48, - Text = "Quantum-Resistant Key Exchange (NIST Post-Quantum) • Sovereign Autonomous Data Mesh Orchestration", - FontSize = 9.5, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#047857", - TextWrap = true - }, - - // R&D Commitment Box - new PdfShapeElement - { - X = 72, - Y = 405, - Width = 496, - Height = 98, - CornerRadius = 8, - FillColorHex = "#F8FAFC", - StrokeColorHex = "#E2E8F0", - StrokeThickness = 1 - }, - new PdfTextElement - { - X = 86, - Y = 416, - Width = 468, - Height = 78, - Text = "🔬 R&D Investment Commitment: 22.4% of top-line revenue ($33.2M annualized) is committed to forward-looking systems research, distributed consensus algorithms, and zero-knowledge privacy protocols to maintain competitive moat.", - FontSize = 9.5, - FontFamily = "Segoe UI", - TextColorHex = "#334155", - TextWrap = true - }, - - // ----------------------------------------------------------------- - // RIGHT SECTION: COMPLIANCE CHECKLIST & DIGITAL SIGNATURES (W = 466) - // ----------------------------------------------------------------- - new PdfShapeElement - { - X = 615, - Y = 108, - Width = 466, - Height = 412, - CornerRadius = 16, - FillColorHex = "#FFFFFF", - StrokeColorHex = "#E2E8F0", - StrokeThickness = 1 - }, - new PdfTextElement - { - X = 637, - Y = 126, - Width = 420, - Height = 22, - Text = "Interactive Governance & Compliance Checklist", - FontSize = 13, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0F172A" - }, - new PdfTextElement - { - X = 637, - Y = 148, - Width = 420, - Height = 18, - Text = "Living checklist for regulatory compliance and audit validation", - FontSize = 9.5, - FontFamily = "Segoe UI", - TextColorHex = "#64748B" - }, - - // Interactive Form Field Checkboxes - new PdfFormFieldElement - { - X = 637, - Y = 176, - Width = 420, - Height = 26, - FieldType = FormFieldType.Checkbox, - Label = "SOC-2 Type II & ISO/IEC 27001:2022 Recertification Completed", - Value = "true" - }, - new PdfFormFieldElement - { - X = 637, - Y = 208, - Width = 420, - Height = 26, - FieldType = FormFieldType.Checkbox, - Label = "EU-US Data Privacy Framework & GDPR Chapter V Enforced", - Value = "true" - }, - new PdfFormFieldElement - { - X = 637, - Y = 240, - Width = 420, - Height = 26, - FieldType = FormFieldType.Checkbox, - Label = "Hardware-Rooted Zero-Trust Cryptographic Enclave Attestation", - Value = "true" - }, - new PdfFormFieldElement - { - X = 637, - Y = 272, - Width = 420, - Height = 26, - FieldType = FormFieldType.Checkbox, - Label = "FedRAMP High In-Process Baseline Security Controls Validated", - Value = "true" - }, - new PdfFormFieldElement - { - X = 637, - Y = 304, - Width = 420, - Height = 26, - FieldType = FormFieldType.Checkbox, - Label = "NIST Post-Quantum Cryptography Migration Plan Formally Approved", - Value = "false" - }, - - // Digital Signatures Header - new PdfTextElement - { - X = 637, - Y = 344, - Width = 420, - Height = 18, - Text = "AUTHORIZED EXECUTIVE SIGN-OFF & CRYPTOGRAPHIC ATTESTATION", - FontSize = 8, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#64748B" - }, - - // Digital Signatures - new PdfFormFieldElement - { - X = 637, - Y = 366, - Width = 200, - Height = 44, - FieldType = FormFieldType.Signature, - Label = "Elena Vance, CEO", - Value = "DIGITALLY VERIFIED: E. Vance (QS-SEC-9842)" - }, - new PdfFormFieldElement - { - X = 852, - Y = 366, - Width = 205, - Height = 44, - FieldType = FormFieldType.Signature, - Label = "Marcus Chen, CFO", - Value = "DIGITALLY VERIFIED: M. Chen (QS-FIN-1402)" - }, - - new PdfTextElement - { - X = 637, - Y = 420, - Width = 420, - Height = 18, - Text = "Cryptographically signed & anchored to internal audit ledger • Sep 2026", - FontSize = 8.5, - FontFamily = "Segoe UI", - TextColorHex = "#64748B" - }, - - // Proprietary Commercial Secret Redaction Demo - new PdfRedactionElement - { - X = 637, - Y = 448, - Width = 420, - Height = 30, - ExemptionCode = "[FOIA (b)(4) PROPRIETARY COMMERCIAL SECRET]", - FillColorHex = "#1E293B", - TextColorHex = "#F8FAFC", - BorderColorHex = "#0F172A", - BorderThickness = 1 - }, - - // ----------------------------------------------------------------- - // BOTTOM BANNER: QR CODE, TRACKING BARCODE & PORTAL VERIFICATION - // ----------------------------------------------------------------- - new PdfShapeElement - { - X = 50, - Y = 538, - Width = 1031, - Height = 192, - CornerRadius = 14, - FillColorHex = "#F8FAFC", - StrokeColorHex = "#E2E8F0", - StrokeThickness = 1 - }, - - // Left Information & Barcode - new PdfTextElement - { - X = 72, - Y = 552, - Width = 310, - Height = 20, - Text = "Living Document Verification & Ledger", - FontSize = 12.5, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0F172A" - }, - new PdfTextElement - { - X = 72, - Y = 574, - Width = 310, - Height = 56, - Text = "Active presentation format with instant CSV export, interactive checklists, dynamic filtering, and cryptographic audit proofs.", - FontSize = 9.5, - FontFamily = "Segoe UI", - TextColorHex = "#475569", - TextWrap = true - }, - new PdfBarcodeElement - { - X = 72, - Y = 636, - Width = 300, - Height = 74, - CodeValue = "QS-SEC-2026-FRYPDF-9842", - BarcodeFormat = "Code128", - BarColorHex = "#0F172A", - BackgroundColorHex = "#FFFFFF", - ShowText = true - }, - - // Center Area Trend Chart (Multi-Chart Variety) - new PdfChartElement - { - X = 398, - Y = 550, - Width = 380, - Height = 166, - ZIndex = 400, - Title = "3-Year R&D Capital Investment ($M)", - ChartType = ChartType.Area, - BackgroundColorHex = "#FFFFFF", - BorderColorHex = "#E2E8F0", - Categories = new List { "2024", "2025", "2026", "2027 (P)", "2028 (P)" }, - Values = new List { 14.2, 22.8, 33.2, 48.0, 65.5 }, - ValueLabels = new List { "$14.2M", "$22.8M", "$33.2M", "$48.0M", "$65.5M" }, - BarColorsHex = new List { "#059669", "#10B981", "#34D399", "#6EE7B7", "#A7F3D0" } - }, - - // Right Live QR Code & Portal Link - new PdfQrCodeElement - { - X = 800, - Y = 554, - Width = 120, - Height = 120, - Content = "https://quantumscale.cloud/verify/doc?id=QS-2026-FRYPDF-9842", - Label = "SCAN TO VERIFY" - }, - new PdfTextElement - { - X = 934, - Y = 556, - Width = 135, - Height = 75, - Text = "Scan QR code to verify immutable ledger hash & cloud telemetry mirror.", - FontSize = 9.5, - FontFamily = "Segoe UI", - TextColorHex = "#475569", - TextWrap = true - }, - new PdfShapeElement - { - X = 934, - Y = 642, - Width = 135, - Height = 32, - CornerRadius = 16, - FillColorHex = "#4F46E5", - StrokeThickness = 0, - Label = "🔗 SHA-256 SECURED", - LabelColorHex = "#FFFFFF", - LabelFontSize = 9.5 - } - } - }; - - doc.Pages.Add(page1); - doc.Pages.Add(page2); - doc.Pages.Add(page3); - - return doc; - } -} diff --git a/src/PdfEditorApp/Templates/Corporate/OcrAnalysisReportTemplate.cs b/src/PdfEditorApp/Templates/Corporate/OcrAnalysisReportTemplate.cs deleted file mode 100644 index 1d81048..0000000 --- a/src/PdfEditorApp/Templates/Corporate/OcrAnalysisReportTemplate.cs +++ /dev/null @@ -1,556 +0,0 @@ -using System.Collections.Generic; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; - -namespace PdfEditorApp.Templates.Corporate; - -/// -/// Executive Document Intelligence & OCR Analysis Report Template. -/// Demonstrates automated optical character recognition, confidence heatmaps, -/// extracted multi-span entity streams, structured table reconstruction, and QR validation. -/// -public class OcrAnalysisReportTemplate : ITemplateDefinition -{ - public string Id => "ocranalysisreport"; - public string Name => "OCR Document Audit & Recognition Report"; - public string Description => "Automated document intelligence audit featuring OCR confidence metrics, extracted entity streams, structured table recovery, and QR verification"; - public string Category => "Corporate & Finance"; - public string IconKind => "TextBoxCheckOutline"; - public string AccentColorHex => "#059669"; - - public PdfDocumentModel Create() - { - return GenerateDocument(); - } - - public static PdfDocumentModel GenerateDocument() - { - var doc = new PdfDocumentModel - { - Title = "OCR_Document_Audit_Report.pdf", - Author = "FryPDF Document Intelligence Subsystem", - Subject = "Optical Character Recognition & Structured Layout Deconstruction Audit", - Keywords = "OCR, Document Intelligence, Extraction, Layout Analysis, Confidence, Audit" - }; - - var page = new PdfPageModel - { - PageNumber = 1, - Format = PageFormat.A4, - Orientation = PageOrientation.Portrait, - Width = 595.28, - Height = 841.89, - BackgroundColorHex = "#F8FAFC", - ShowHeaderFooter = true, - HeaderLeft = "FRYPDF DOCUMENT INTELLIGENCE • OCR AUDIT", - HeaderRight = "CONFIDENCE: 99.4% (HIGH)", - FooterLeft = "AUTOMATED OCR PIPELINE AUDIT", - FooterCenter = "SHA-256: 8f9a2b1c4e6d3f0a", - FooterRight = "PAGE 1 OF 1" - }; - - // ========================================== - // 1. TOP HEADER & METRIC BANNER - // ========================================== - - page.Elements.Add(new PdfShapeElement - { - X = 24, - Y = 24, - Width = 547.28, - Height = 105, - ShapeType = ShapeType.RoundedRectangle, - CornerRadius = 8, - FillColorHex = "#064E3B", - StrokeColorHex = "#065F46", - StrokeThickness = 1.5, - ZIndex = 0 - }); - - // Top Emerald Accent Stripe - page.Elements.Add(new PdfShapeElement - { - X = 24, - Y = 24, - Width = 547.28, - Height = 4, - ShapeType = ShapeType.Rectangle, - FillColorHex = "#10B981", - ZIndex = 1 - }); - - // Category Tag - page.Elements.Add(new PdfTextElement - { - X = 44, - Y = 38, - Width = 260, - Height = 18, - Text = "NEURAL OCR V4.2 • LAYOUT ANALYSIS", - FontFamily = "Segoe UI", - FontSize = 9.0, - IsBold = true, - TextColorHex = "#6EE7B7", - CharacterSpacing = 1.2, - ZIndex = 2 - }); - - // Main Report Title with Multi-Span - var mainTitle = new PdfTextElement - { - X = 44, - Y = 56, - Width = 480, - Height = 32, - FontFamily = "Segoe UI", - FontSize = 18, - TextColorHex = "#FFFFFF", - Spans = new List - { - new() { Text = "OCR Document Recognition ", IsBold = true, TextColorHex = "#FFFFFF" }, - new() { Text = "& Audit Report", IsBold = true, TextColorHex = "#6EE7B7" } - }, - ZIndex = 2 - }; - mainTitle.SynchronizePlainTextFromSpans(); - page.Elements.Add(mainTitle); - - // Document Meta Subtitle - var docMeta = new PdfTextElement - { - X = 44, - Y = 90, - Width = 500, - Height = 22, - FontFamily = "Segoe UI", - FontSize = 9.5, - TextColorHex = "#D1FAE5", - Spans = new List - { - new() { Text = "Target: " }, - new() { Text = "Commercial_Invoice_Scan_300DPI.pdf", IsBold = true, TextColorHex = "#FFFFFF" }, - new() { Text = " • Engine Accuracy: " }, - new() { Text = "99.4% (Pass)", IsBold = true, TextColorHex = "#6EE7B7" }, - new() { Text = " • Status: " }, - new() { Text = "Verified", IsBold = true, IsUnderline = true, TextColorHex = "#34D399" } - }, - ZIndex = 2 - }; - docMeta.SynchronizePlainTextFromSpans(); - page.Elements.Add(docMeta); - - // ========================================== - // 2. OCR STATS ROW (3 CARDS) - // ========================================== - - // Card 1: High Confidence - page.Elements.Add(new PdfShapeElement - { - X = 24, - Y = 140, - Width = 175, - Height = 65, - ShapeType = ShapeType.RoundedRectangle, - CornerRadius = 6, - FillColorHex = "#FFFFFF", - StrokeColorHex = "#E2E8F0", - StrokeThickness = 1.0, - ZIndex = 0 - }); - - page.Elements.Add(new PdfTextElement - { - X = 34, - Y = 148, - Width = 155, - Height = 48, - FontFamily = "Segoe UI", - FontSize = 8.5, - TextColorHex = "#64748B", - Spans = new List - { - new() { Text = "1,215 Words (97.4%)\n", IsBold = true, FontSize = 12.0, TextColorHex = "#059669" }, - new() { Text = "High Confidence (≥ 98%)" } - }, - ZIndex = 2 - }); - - // Card 2: Review Threshold - page.Elements.Add(new PdfShapeElement - { - X = 210, - Y = 140, - Width = 175, - Height = 65, - ShapeType = ShapeType.RoundedRectangle, - CornerRadius = 6, - FillColorHex = "#FFFFFF", - StrokeColorHex = "#E2E8F0", - StrokeThickness = 1.0, - ZIndex = 0 - }); - - page.Elements.Add(new PdfTextElement - { - X = 220, - Y = 148, - Width = 155, - Height = 48, - FontFamily = "Segoe UI", - FontSize = 8.5, - TextColorHex = "#64748B", - Spans = new List - { - new() { Text = "33 Words (2.6%)\n", IsBold = true, FontSize = 12.0, TextColorHex = "#D97706" }, - new() { Text = "Low Contrast / Script Review" } - }, - ZIndex = 2 - }); - - // Card 3: Deconstructed Blocks - page.Elements.Add(new PdfShapeElement - { - X = 396, - Y = 140, - Width = 175, - Height = 65, - ShapeType = ShapeType.RoundedRectangle, - CornerRadius = 6, - FillColorHex = "#FFFFFF", - StrokeColorHex = "#E2E8F0", - StrokeThickness = 1.0, - ZIndex = 0 - }); - - page.Elements.Add(new PdfTextElement - { - X = 406, - Y = 148, - Width = 155, - Height = 48, - FontFamily = "Segoe UI", - FontSize = 8.5, - TextColorHex = "#64748B", - Spans = new List - { - new() { Text = "18 Structured Blocks\n", IsBold = true, FontSize = 12.0, TextColorHex = "#0F6CBD" }, - new() { Text = "1 Table • 1 QR • 16 Texts" } - }, - ZIndex = 2 - }); - - // ========================================== - // 3. SECTION A: EXTRACTED ENTITY STREAMS (MULTI-SPAN) - // ========================================== - - page.Elements.Add(new PdfShapeElement - { - X = 24, - Y = 216, - Width = 547.28, - Height = 145, - ShapeType = ShapeType.RoundedRectangle, - CornerRadius = 6, - FillColorHex = "#FFFFFF", - StrokeColorHex = "#E2E8F0", - StrokeThickness = 1.0, - ZIndex = 0 - }); - - page.Elements.Add(new PdfShapeElement - { - X = 24, - Y = 216, - Width = 4, - Height = 145, - ShapeType = ShapeType.Rectangle, - FillColorHex = "#059669", - ZIndex = 1 - }); - - var entityHeader = new PdfTextElement - { - X = 40, - Y = 228, - Width = 450, - Height = 20, - FontFamily = "Segoe UI", - FontSize = 11.5, - TextColorHex = "#0F172A", - Spans = new List - { - new() { Text = "1. Recognized Key-Value Entities & ", IsBold = true }, - new() { Text = "Confidence Annotations", IsBold = true, TextColorHex = "#059669" } - }, - ZIndex = 2 - }; - entityHeader.SynchronizePlainTextFromSpans(); - page.Elements.Add(entityHeader); - - var entityStreamCol1 = new PdfTextElement - { - X = 40, - Y = 252, - Width = 250, - Height = 98, - FontFamily = "Segoe UI", - FontSize = 9.0, - LineHeight = 1.45, - TextColorHex = "#334155", - Spans = new List - { - new() { Text = "• Vendor / Merchant: " }, - new() { Text = "Acme Technologies Global Ltd.", IsBold = true, TextColorHex = "#0F172A" }, - new() { Text = " [99.8%]\n• Invoice Number: " }, - new() { Text = "INV-2026-8842", IsBold = true, TextColorHex = "#0F6CBD" }, - new() { Text = " [99.9%]\n• Issue Date: " }, - new() { Text = "2026-08-31", IsBold = true }, - new() { Text = " • Due Date: " }, - new() { Text = "2026-09-30", IsBold = true, TextColorHex = "#DC2626" }, - new() { Text = "\n• Tax Registration / VAT: " }, - new() { Text = "GB-984210547", IsBold = true, TextColorHex = "#059669" } - }, - ZIndex = 2 - }; - entityStreamCol1.SynchronizePlainTextFromSpans(); - page.Elements.Add(entityStreamCol1); - - var entityStreamCol2 = new PdfTextElement - { - X = 305, - Y = 252, - Width = 255, - Height = 98, - FontFamily = "Segoe UI", - FontSize = 9.0, - LineHeight = 1.45, - TextColorHex = "#334155", - Spans = new List - { - new() { Text = "• Subtotal (Net): " }, - new() { Text = "$14,500.00 USD", IsBold = true }, - new() { Text = " [99.9%]\n• Tax Rate (VAT 20%): " }, - new() { Text = "$2,900.00 USD", IsBold = true }, - new() { Text = " [99.7%]\n• Total Payable: " }, - new() { Text = "$17,400.00 USD", IsBold = true, FontSize = 10.0, TextColorHex = "#059669" }, - new() { Text = "\n• Payment Method: " }, - new() { Text = "SWIFT / Direct Deposit (Verified)", IsBold = true, IsUnderline = true } - }, - ZIndex = 2 - }; - entityStreamCol2.SynchronizePlainTextFromSpans(); - page.Elements.Add(entityStreamCol2); - - // ========================================== - // 4. SECTION B: RECONSTRUCTED STRUCTURED TABLE - // ========================================== - - page.Elements.Add(new PdfShapeElement - { - X = 24, - Y = 372, - Width = 547.28, - Height = 185, - ShapeType = ShapeType.RoundedRectangle, - CornerRadius = 6, - FillColorHex = "#FFFFFF", - StrokeColorHex = "#E2E8F0", - StrokeThickness = 1.0, - ZIndex = 0 - }); - - var tableHeader = new PdfTextElement - { - X = 40, - Y = 384, - Width = 450, - Height = 20, - FontFamily = "Segoe UI", - FontSize = 11.5, - TextColorHex = "#0F172A", - Spans = new List - { - new() { Text = "2. Reconstructed Line Items & ", IsBold = true }, - new() { Text = "Tabular Data Grid", IsBold = true, TextColorHex = "#0F6CBD" } - }, - ZIndex = 2 - }; - tableHeader.SynchronizePlainTextFromSpans(); - page.Elements.Add(tableHeader); - - // Table Element - var ocrTable = new PdfTableElement - { - X = 40, - Y = 410, - Width = 515, - Height = 130, - Headers = new List { "SKU / Code", "Description", "Qty", "Unit Price", "Total (USD)", "OCR Match" }, - Rows = new List> - { - new() { "CLD-SRV-01", "Enterprise Cloud Instance (48 vCPU, 192GB RAM)", "2", "$4,200.00", "$8,400.00", "99.8%" }, - new() { "AI-API-INF", "Neural OCR Document Intelligence API Tier", "1", "$3,500.00", "$3,500.00", "99.9%" }, - new() { "STG-NVME-04", "Dedicated NVMe High-IOPS Document Storage (4TB)", "4", "$650.00", "$2,600.00", "99.5%" }, - new() { "SUP-24X7-PRM", "24/7 Dedicated SLA Technical Support", "1", "$0.00", "$0.00", "100.0%" } - }, - HeaderBackgroundHex = "#0F172A", - HeaderTextHex = "#FFFFFF", - AlternateRowBackgroundHex = "#F8FAFC", - BorderColorHex = "#CBD5E1", - ZIndex = 2 - }; - page.Elements.Add(ocrTable); - - // ========================================== - // 5. SECTION C: SECURITY, QR VALIDATION & AUDIT SIGNATURE - // ========================================== - - page.Elements.Add(new PdfShapeElement - { - X = 24, - Y = 568, - Width = 350, - Height = 170, - ShapeType = ShapeType.RoundedRectangle, - CornerRadius = 6, - FillColorHex = "#FFFFFF", - StrokeColorHex = "#E2E8F0", - StrokeThickness = 1.0, - ZIndex = 0 - }); - - var secHeader = new PdfTextElement - { - X = 38, - Y = 580, - Width = 320, - Height = 20, - FontFamily = "Segoe UI", - FontSize = 11.0, - TextColorHex = "#0F172A", - Spans = new List - { - new() { Text = "3. Security & ", IsBold = true }, - new() { Text = "Compliance Validation", IsBold = true, TextColorHex = "#7C3AED" } - }, - ZIndex = 2 - }; - secHeader.SynchronizePlainTextFromSpans(); - page.Elements.Add(secHeader); - - var secBody = new PdfTextElement - { - X = 38, - Y = 604, - Width = 320, - Height = 120, - FontFamily = "Segoe UI", - FontSize = 9.0, - LineHeight = 1.45, - TextColorHex = "#334155", - Spans = new List - { - new() { Text = "• Digital Signature: " }, - new() { Text = "VALID (RSA-4096 / SHA-256)", IsBold = true, TextColorHex = "#059669" }, - new() { Text = "\n• Signer: " }, - new() { Text = "Acme Corp Authorized Officer", IsItalic = true }, - new() { Text = "\n• Timestamp: " }, - new() { Text = "2026-08-31T22:45:10 UTC (RFC 3161)" }, - new() { Text = "\n• PII Redaction Audit: " }, - new() { Text = "Zero Leaks Detected (Clean)", IsBold = true, TextColorHex = "#059669" }, - new() { Text = "\n• Forensic Verification: " }, - new() { Text = "Pass (Unaltered PDF Bitstream)", IsBold = true, IsUnderline = true } - }, - ZIndex = 2 - }; - secBody.SynchronizePlainTextFromSpans(); - page.Elements.Add(secBody); - - // QR Code Verification Card - page.Elements.Add(new PdfShapeElement - { - X = 385, - Y = 568, - Width = 186.28, - Height = 170, - ShapeType = ShapeType.RoundedRectangle, - CornerRadius = 6, - FillColorHex = "#FFFFFF", - StrokeColorHex = "#E2E8F0", - StrokeThickness = 1.0, - ZIndex = 0 - }); - - // QR Code Element - page.Elements.Add(new PdfQrCodeElement - { - X = 428, - Y = 582, - Width = 100, - Height = 100, - Content = "https://verify.frypdf.dev/audit/inv-2026-8842?sig=8f9a2b1c", - Label = "Scan to Verify Audit", - DarkColorHex = "#064E3B", - LightColorHex = "#FFFFFF", - ZIndex = 2 - }); - - page.Elements.Add(new PdfTextElement - { - X = 395, - Y = 690, - Width = 166, - Height = 40, - Alignment = TextAlignmentMode.Center, - FontFamily = "Segoe UI", - FontSize = 8.5, - LineHeight = 1.3, - TextColorHex = "#64748B", - Spans = new List - { - new() { Text = "Verified by " }, - new() { Text = "FryPDF OCR Engine\n", IsBold = true, TextColorHex = "#064E3B" }, - new() { Text = "Cryptographically Signed" } - }, - ZIndex = 2 - }); - - // Bottom Decorative Divider - page.Elements.Add(new PdfDividerElement - { - X = 24, - Y = 748, - Width = 547.28, - Height = 10, - Style = DividerStyle.Straight, - ColorHex = "#059669", - Thickness = 1.5, - ZIndex = 1 - }); - - // Bottom Audit Sign-off Note - var auditFooter = new PdfTextElement - { - X = 24, - Y = 764, - Width = 547.28, - Height = 22, - Alignment = TextAlignmentMode.Center, - FontFamily = "Segoe UI", - FontSize = 8.5, - TextColorHex = "#64748B", - Spans = new List - { - new() { Text = "Document Intelligence Engine • Generated by " }, - new() { Text = "FryPDF Studio", IsBold = true, TextColorHex = "#059669" }, - new() { Text = " • Automated Optical Verification Suite" } - }, - ZIndex = 2 - }; - auditFooter.SynchronizePlainTextFromSpans(); - page.Elements.Add(auditFooter); - - doc.Pages.Add(page); - return doc; - } -} diff --git a/src/PdfEditorApp/Templates/Education/BilingualExamPaperTemplate.cs b/src/PdfEditorApp/Templates/Education/BilingualExamPaperTemplate.cs deleted file mode 100644 index f5d3e5d..0000000 --- a/src/PdfEditorApp/Templates/Education/BilingualExamPaperTemplate.cs +++ /dev/null @@ -1,390 +0,0 @@ -using System.Collections.Generic; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; - -namespace PdfEditorApp.Templates.Education; - -public class BilingualExamPaperTemplate : ITemplateDefinition -{ - public string Id => "bilingual_exam_paper"; - public string Name => "Bilingual Exam Paper (Hindi & English)"; - public string Description => "Dual-language school & competitive test paper with Devanagari typography, formula reference box, numbered question cards, and answer key matrix"; - public string Category => "Education"; - public string IconKind => "Translate"; - public string AccentColorHex => "#B91C1C"; - - public PdfDocumentModel Create() - { - var doc = new PdfDocumentModel - { - Title = "Simple_Interest_Bilingual_Exam_Paper.pdf", - Author = "Department of Competitive Examinations", - Subject = "Bilingual Practice Exam: Simple Interest & Quantitative Aptitude" - }; - - // ========================================================================= - // PAGE 1: Header, Formulas, Questions 1 to 10 - // ========================================================================= - var page1 = new PdfPageModel - { - PageNumber = 1, - Format = PageFormat.A4, - Orientation = PageOrientation.Portrait, - Width = 800, - Height = 1131, - BackgroundColorHex = "#FFFFFF", - HeaderLeft = "अभ्यास प्रश्नमाला • Practice Test Series", - HeaderCenter = "साधारण ब्याज • Simple Interest", - HeaderRight = "Paper Code: SI-2026", - FooterLeft = "ACME Academy • आदर्श विद्यालय", - FooterCenter = "Bilingual Examination Series (Hindi & English)", - FooterRight = "Page 1 of 2", - Elements = new List - { - // Top Accent Stripe - new PdfShapeElement - { - X = 0, Y = 0, Width = 800, Height = 8, - FillColorHex = "#B91C1C", StrokeColorHex = "#00000000" - }, - - // Institution & Exam Title Box - new PdfShapeElement - { - X = 40, Y = 35, Width = 720, Height = 95, - CornerRadius = 8, FillColorHex = "#FEF2F2", - StrokeColorHex = "#FECACA", StrokeThickness = 1.5 - }, - new PdfTextElement - { - X = 55, Y = 45, Width = 690, Height = 28, - Text = "ACME Academy • आदर्श विद्यालय", - FontSize = 17, IsBold = true, TextColorHex = "#991B1B", - Alignment = TextAlignmentMode.Center, - FontFamily = "Noto Sans Devanagari" - }, - new PdfTextElement - { - X = 55, Y = 75, Width = 690, Height = 24, - Text = "साधारण ब्याज (Simple Interest) : प्रतियोगी परीक्षाओं हेतु 50 महत्वपूर्ण प्रश्न", - FontSize = 13, IsBold = true, TextColorHex = "#B91C1C", - Alignment = TextAlignmentMode.Center, - FontFamily = "Noto Sans Devanagari" - }, - new PdfTextElement - { - X = 55, Y = 102, Width = 690, Height = 20, - Text = "समय: 2 घण्टे (Time: 2 Hours) | पूर्णांक: 100 अंक (Max Marks: 100) | ऋणात्मक अंकन: 0.25", - FontSize = 10, TextColorHex = "#7F1D1D", - Alignment = TextAlignmentMode.Center, - FontFamily = "Noto Sans Devanagari" - }, - - // Student Metadata Strip - new PdfShapeElement - { - X = 40, Y = 140, Width = 720, Height = 42, - CornerRadius = 6, FillColorHex = "#F8FAFC", - StrokeColorHex = "#CBD5E1", StrokeThickness = 1 - }, - new PdfTextElement - { - X = 55, Y = 152, Width = 380, Height = 20, - Text = "छात्र/छात्रा का नाम (Student Name): __________________________", - FontSize = 10.5, IsBold = true, TextColorHex = "#334155", - FontFamily = "Noto Sans Devanagari" - }, - new PdfTextElement - { - X = 450, Y = 152, Width = 150, Height = 20, - Text = "रोल नं (Roll No): _________", - FontSize = 10.5, IsBold = true, TextColorHex = "#334155", - FontFamily = "Noto Sans Devanagari" - }, - new PdfTextElement - { - X = 615, Y = 152, Width = 130, Height = 20, - Text = "दिनांक (Date): _______", - FontSize = 10.5, IsBold = true, TextColorHex = "#334155", - FontFamily = "Noto Sans Devanagari" - }, - - // Important Formulas Callout Card - new PdfShapeElement - { - X = 40, Y = 192, Width = 720, Height = 88, - CornerRadius = 6, FillColorHex = "#FFFBEB", - StrokeColorHex = "#FDE68A", StrokeThickness = 1.5 - }, - new PdfTextElement - { - X = 55, Y = 200, Width = 690, Height = 20, - Text = "महत्वपूर्ण सूत्र (Important Formulas):", - FontSize = 11, IsBold = true, TextColorHex = "#92400E", - FontFamily = "Noto Sans Devanagari" - }, - new PdfMathElement - { - X = 55, Y = 222, Width = 690, Height = 50, - Formula = @"SI = \frac{P \times R \times T}{100}, \quad A = P + SI = P\left(1 + \frac{RT}{100}\right), \quad P = \frac{100 \times SI}{R \times T}, \quad R = \frac{100 \times SI}{P \times T}", - FontSize = 13, TextColorHex = "#78350F", - Category = MathCategory.SchoolArithmetic, - Alignment = TextAlignmentMode.Center - }, - - // Section 1 Header - new PdfShapeElement - { - X = 40, Y = 290, Width = 720, Height = 26, - CornerRadius = 4, FillColorHex = "#1E293B", - StrokeColorHex = "#00000000" - }, - new PdfTextElement - { - X = 50, Y = 295, Width = 700, Height = 18, - Text = "भाग 1: मूल संकल्पना एवं अभ्यास प्रश्न (Part 1: Basic Concept Problems)", - FontSize = 10.5, IsBold = true, TextColorHex = "#FFFFFF", - FontFamily = "Noto Sans Devanagari" - }, - - // Question 1 Card - new PdfShapeElement { X = 40, Y = 325, Width = 720, Height = 70, CornerRadius = 6, FillColorHex = "#FFFFFF", StrokeColorHex = "#E2E8F0", StrokeThickness = 1 }, - new PdfTextElement - { - X = 55, Y = 333, Width = 690, Height = 36, - Text = "प्रश्न 1. \u20b95,000 की राशि पर 10% वार्षिक साधारण ब्याज की दर से 3 वर्ष का साधारण ब्याज और मिश्रधन कितना होगा?\n(Find the simple interest and total amount on \u20b95,000 at 10% per annum for 3 years.)", - FontSize = 10.5, TextColorHex = "#0F172A", - FontFamily = "Noto Sans Devanagari" - }, - new PdfTextElement - { - X = 55, Y = 372, Width = 690, Height = 18, - Text = "(A) \u20b91,500, \u20b96,500 (B) \u20b91,200, \u20b96,200 (C) \u20b91,800, \u20b96,800 (D) \u20b92,000, \u20b97,000", - FontSize = 10, IsBold = true, TextColorHex = "#334155", - FontFamily = "Noto Sans Devanagari" - }, - - // Question 2 Card - new PdfShapeElement { X = 40, Y = 405, Width = 720, Height = 70, CornerRadius = 6, FillColorHex = "#FFFFFF", StrokeColorHex = "#E2E8F0", StrokeThickness = 1 }, - new PdfTextElement - { - X = 55, Y = 413, Width = 690, Height = 36, - Text = "प्रश्न 2. \u20b98,000 पर कितने प्रतिशत वार्षिक दर से 5 वर्ष का साधारण ब्याज \u20b92,400 हो जाएगा?\n(At what rate of simple interest per annum will \u20b98,000 yield an interest of \u20b92,400 in 5 years?)", - FontSize = 10.5, TextColorHex = "#0F172A", - FontFamily = "Noto Sans Devanagari" - }, - new PdfTextElement - { - X = 55, Y = 452, Width = 690, Height = 18, - Text = "(A) 5% वार्षिक (B) 6% वार्षिक (C) 8% वार्षिक (D) 10% वार्षिक", - FontSize = 10, IsBold = true, TextColorHex = "#334155", - FontFamily = "Noto Sans Devanagari" - }, - - // Question 3 Card - new PdfShapeElement { X = 40, Y = 485, Width = 720, Height = 70, CornerRadius = 6, FillColorHex = "#FFFFFF", StrokeColorHex = "#E2E8F0", StrokeThickness = 1 }, - new PdfTextElement - { - X = 55, Y = 493, Width = 690, Height = 36, - Text = "प्रश्न 3. कोई राशि 8% वार्षिक साधारण ब्याज की दर से कितने वर्षों में स्वयं की दोगुनी हो जाएगी?\n(In how many years will a sum of money double itself at 8% simple interest per annum?)", - FontSize = 10.5, TextColorHex = "#0F172A", - FontFamily = "Noto Sans Devanagari" - }, - new PdfTextElement - { - X = 55, Y = 532, Width = 690, Height = 18, - Text = "(A) 10 वर्ष (B) 12.5 वर्ष (C) 15 वर्ष (D) 16 वर्ष", - FontSize = 10, IsBold = true, TextColorHex = "#334155", - FontFamily = "Noto Sans Devanagari" - }, - - // Question 4 Card - new PdfShapeElement { X = 40, Y = 565, Width = 720, Height = 70, CornerRadius = 6, FillColorHex = "#FFFFFF", StrokeColorHex = "#E2E8F0", StrokeThickness = 1 }, - new PdfTextElement - { - X = 55, Y = 573, Width = 690, Height = 36, - Text = "प्रश्न 4. \u20b99,000 की राशि 5 वर्ष में किस ब्याज दर से \u20b913,500 हो जाएगी?\n(At what interest rate will a principal of \u20b99,000 amount to \u20b913,500 in 5 years?)", - FontSize = 10.5, TextColorHex = "#0F172A", - FontFamily = "Noto Sans Devanagari" - }, - new PdfTextElement - { - X = 55, Y = 612, Width = 690, Height = 18, - Text = "(A) 10% (B) 12% (C) 15% (D) 8%", - FontSize = 10, IsBold = true, TextColorHex = "#334155", - FontFamily = "Noto Sans Devanagari" - }, - - // Question 5 Card - new PdfShapeElement { X = 40, Y = 645, Width = 720, Height = 70, CornerRadius = 6, FillColorHex = "#FFFFFF", StrokeColorHex = "#E2E8F0", StrokeThickness = 1 }, - new PdfTextElement - { - X = 55, Y = 653, Width = 690, Height = 36, - Text = "प्रश्न 5. एक राशि 3 वर्ष में \u20b98,500 और 5 वर्ष में \u20b99,500 हो जाती है। मूलधन एवं वार्षिक दर ज्ञात कीजिए।\n(A sum amounts to \u20b98,500 in 3 years and \u20b99,500 in 5 years at simple interest. Find principal and rate.)", - FontSize = 10.5, TextColorHex = "#0F172A", - FontFamily = "Noto Sans Devanagari" - }, - new PdfTextElement - { - X = 55, Y = 692, Width = 690, Height = 18, - Text = "(A) \u20b97,000; 7.14% (B) \u20b97,200; 6.5% (C) \u20b96,800; 8% (D) \u20b97,500; 5%", - FontSize = 10, IsBold = true, TextColorHex = "#334155", - FontFamily = "Noto Sans Devanagari" - } - } - }; - - // ========================================================================= - // PAGE 2: Part II Advanced Problems & Answer Key Table - // ========================================================================= - var page2 = new PdfPageModel - { - PageNumber = 2, - Format = PageFormat.A4, - Orientation = PageOrientation.Portrait, - Width = 800, - Height = 1131, - BackgroundColorHex = "#FFFFFF", - HeaderLeft = "अभ्यास प्रश्नमाला • Practice Test Series", - HeaderCenter = "उत्तरमाला एवं व्याख्या • Solutions Matrix", - HeaderRight = "Paper Code: SI-2026", - FooterLeft = "ACME Academy • आदर्श विद्यालय", - FooterCenter = "Bilingual Examination Series (Hindi & English)", - FooterRight = "Page 2 of 2", - Elements = new List - { - new PdfShapeElement - { - X = 0, Y = 0, Width = 800, Height = 8, - FillColorHex = "#B91C1C", StrokeColorHex = "#00000000" - }, - - // Section 2 Header - new PdfShapeElement - { - X = 40, Y = 35, Width = 720, Height = 26, - CornerRadius = 4, FillColorHex = "#1E293B", - StrokeColorHex = "#00000000" - }, - new PdfTextElement - { - X = 50, Y = 40, Width = 700, Height = 18, - Text = "भाग 2: अनुप्रयोग एवं विभाजन समस्याएँ (Part 2: Applied Ratio & Division Problems)", - FontSize = 10.5, IsBold = true, TextColorHex = "#FFFFFF", - FontFamily = "Noto Sans Devanagari" - }, - - // Question 6 Card - new PdfShapeElement { X = 40, Y = 70, Width = 720, Height = 70, CornerRadius = 6, FillColorHex = "#FFFFFF", StrokeColorHex = "#E2E8F0", StrokeThickness = 1 }, - new PdfTextElement - { - X = 55, Y = 78, Width = 690, Height = 36, - Text = "प्रश्न 6. \u20b95,200 की राशि को दो भागों में इस प्रकार बांटा गया कि पहले भाग पर 8% दर से 5 वर्ष का ब्याज दूसरे भाग पर 10% दर से 4 वर्ष के ब्याज के बराबर है।\n(\u20b95,200 is divided into two parts such that the interest on the first part at 8% for 5 years equals interest on the second at 10% for 4 years.)", - FontSize = 10.5, TextColorHex = "#0F172A", - FontFamily = "Noto Sans Devanagari" - }, - new PdfTextElement - { - X = 55, Y = 117, Width = 690, Height = 18, - Text = "(A) \u20b92,600, \u20b92,600 (B) \u20b93,000, \u20b92,200 (C) \u20b92,800, \u20b92,400 (D) \u20b93,200, \u20b92,000", - FontSize = 10, IsBold = true, TextColorHex = "#334155", - FontFamily = "Noto Sans Devanagari" - }, - - // Question 7 Card - new PdfShapeElement { X = 40, Y = 150, Width = 720, Height = 70, CornerRadius = 6, FillColorHex = "#FFFFFF", StrokeColorHex = "#E2E8F0", StrokeThickness = 1 }, - new PdfTextElement - { - X = 55, Y = 158, Width = 690, Height = 36, - Text = "प्रश्न 7. यदि किसी धन पर 3 वर्ष का साधारण ब्याज मूलधन के 3/5 के बराबर है, तो ब्याज की वार्षिक दर क्या होगी?\n(If the simple interest on a sum of money for 3 years is equal to 3/5 of the principal, what is the annual rate?)", - FontSize = 10.5, TextColorHex = "#0F172A", - FontFamily = "Noto Sans Devanagari" - }, - new PdfTextElement - { - X = 55, Y = 197, Width = 690, Height = 18, - Text = "(A) 15% वार्षिक (B) 20% वार्षिक (C) 18% वार्षिक (D) 25% वार्षिक", - FontSize = 10, IsBold = true, TextColorHex = "#334155", - FontFamily = "Noto Sans Devanagari" - }, - - // Answer Key & Solutions Matrix Banner - new PdfShapeElement - { - X = 40, Y = 235, Width = 720, Height = 55, - CornerRadius = 6, FillColorHex = "#ECFDF5", - StrokeColorHex = "#A7F3D0", StrokeThickness = 1.5 - }, - new PdfTextElement - { - X = 55, Y = 243, Width = 690, Height = 22, - Text = "उत्तरमाला एवं हल सारांश (Answer Key & Solutions Summary Matrix)", - FontSize = 13, IsBold = true, TextColorHex = "#065F46", - FontFamily = "Noto Sans Devanagari" - }, - new PdfTextElement - { - X = 55, Y = 267, Width = 690, Height = 18, - Text = "प्रतियोगी परीक्षा अभ्यास पत्रक हेतु प्रामाणिक उत्तर एवं संक्षिप्त चरण", - FontSize = 9.5, TextColorHex = "#047857", - FontFamily = "Noto Sans Devanagari" - }, - - // Answer Matrix Table - new PdfTableElement - { - X = 40, Y = 300, Width = 720, Height = 320, - HeaderBackgroundHex = "#065F46", - HeaderTextHex = "#FFFFFF", - BorderColorHex = "#D1D5DB", - AlternateRowBackgroundHex = "#F9FAFB", - Headers = new List { "प्रश्न #", "उत्तर", "मुख्य सूत्र / चरण (Formula & Key Steps)", "अंतिम मान" }, - Rows = new List> - { - new() { "1", "(A)", "SI = (5000 \u00d7 10 \u00d7 3) / 100 = 1500; A = 5000 + 1500", "SI=\u20b91,500; A=\u20b96,500" }, - new() { "2", "(B)", "R = (100 \u00d7 2400) / (8000 \u00d7 5) = 240000 / 40000 = 6%", "R = 6% वार्षिक" }, - new() { "3", "(B)", "SI = P; T = (100 \u00d7 P) / (P \u00d7 8) = 100 / 8 = 12.5 वर्ष", "T = 12.5 वर्ष" }, - new() { "4", "(A)", "SI = 13500 - 9000 = 4500; R = (100 \u00d7 4500) / (9000 \u00d7 5) = 10%", "R = 10% वार्षिक" }, - new() { "5", "(A)", "2 वर्ष का ब्याज = 9500 - 8500 = 1000; 1 वर्ष का ब्याज = 500; P = 8500 - 1500", "P = \u20b97,000; R = 7.14%" }, - new() { "6", "(A)", "x \u00d7 8 \u00d7 5 = (5200 - x) \u00d7 10 \u00d7 4 \u2192 40x = 40(5200 - x) \u2192 2x = 5200", "x = \u20b92,600 प्रत्येक" }, - new() { "7", "(B)", "SI = 3P/5; R = (100 \u00d7 (3P/5)) / (P \u00d7 3) = (60P) / (3P) = 20%", "R = 20% वार्षिक" } - } - }, - - // Student Score & Performance Card - new PdfShapeElement - { - X = 40, Y = 640, Width = 720, Height = 130, - CornerRadius = 8, FillColorHex = "#F8FAFC", - StrokeColorHex = "#CBD5E1", StrokeThickness = 1.5 - }, - new PdfTextElement - { - X = 55, Y = 655, Width = 300, Height = 22, - Text = "मूल्यांकन एवं अंक तालिका (Evaluation & Score):", - FontSize = 11, IsBold = true, TextColorHex = "#334155", - FontFamily = "Noto Sans Devanagari" - }, - new PdfTextElement - { - X = 55, Y = 685, Width = 690, Height = 35, - Text = "कुल प्रश्न: 7 | सही उत्तर: ______ | गलत उत्तर: ______ | प्राप्तांक: _______ / 100\nपरीक्षक की टिप्पणी: ____________________________________________________________________", - FontSize = 10, TextColorHex = "#64748B", - FontFamily = "Noto Sans Devanagari" - }, - new PdfTextElement - { - X = 55, Y = 735, Width = 300, Height = 22, - Text = "परीक्षक हस्ताक्षर (Evaluator Signature): ____________________", - FontSize = 10, IsBold = true, TextColorHex = "#334155", - FontFamily = "Noto Sans Devanagari" - } - } - }; - - doc.Pages.Add(page1); - doc.Pages.Add(page2); - - return doc; - } -} diff --git a/src/PdfEditorApp/Templates/Education/FactorizationWorksheetTemplate.cs b/src/PdfEditorApp/Templates/Education/FactorizationWorksheetTemplate.cs deleted file mode 100644 index 391dcf9..0000000 --- a/src/PdfEditorApp/Templates/Education/FactorizationWorksheetTemplate.cs +++ /dev/null @@ -1,204 +0,0 @@ -using System.Collections.Generic; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; - -namespace PdfEditorApp.Templates.Education; - -public class FactorizationWorksheetTemplate : ITemplateDefinition -{ - public string Id => "factorization_worksheet"; - public string Name => "Algebra & Factorization Worksheet (150 Questions)"; - public string Description => "High-density multi-column algebra practice worksheet with algebraic identity cheat box, 3 balanced question columns, and answer key"; - public string Category => "Education"; - public string IconKind => "Variable"; - public string AccentColorHex => "#4F46E5"; - - public PdfDocumentModel Create() - { - var doc = new PdfDocumentModel - { - Title = "Factorization_150_Questions_Worksheet.pdf", - Author = "Algebra & High School Mathematics Department", - Subject = "150 Comprehensive Practice Questions on Algebraic Identities & Polynomial Factorization" - }; - - // ========================================================================= - // PAGE 1: Key Formulas & Section A (Difference of Squares & Perfect Squares) - // ========================================================================= - var page1 = new PdfPageModel - { - PageNumber = 1, - Format = PageFormat.A4, - Orientation = PageOrientation.Portrait, - Width = 800, - Height = 1131, - BackgroundColorHex = "#FFFFFF", - HeaderLeft = "Algebra Mastery Series", - HeaderCenter = "Polynomial Identities & Factorization", - HeaderRight = "Worksheet #03", - FooterLeft = "150 Comprehensive Factorization Practice Worksheet", - FooterCenter = "Authorized for Classroom & Homework Practice", - FooterRight = "Page 1 of 2", - Elements = new List - { - new PdfShapeElement { X = 0, Y = 0, Width = 800, Height = 8, FillColorHex = "#4F46E5", StrokeColorHex = "#00000000" }, - - // Title Banner - new PdfShapeElement { X = 40, Y = 35, Width = 720, Height = 75, CornerRadius = 8, FillColorHex = "#EEF2FF", StrokeColorHex = "#C7D2FE", StrokeThickness = 1.5 }, - new PdfTextElement - { - X = 55, Y = 43, Width = 690, Height = 28, - Text = "Factorization Practice Worksheet : 150 Questions", - FontSize = 17, IsBold = true, TextColorHex = "#3730A3", - FontFamily = "Inter" - }, - new PdfTextElement - { - X = 55, Y = 73, Width = 690, Height = 22, - Text = "Comprehensive Practice on Algebraic Identities, Common Monomials, Difference of Squares & Trinomials", - FontSize = 10.5, IsItalic = true, TextColorHex = "#4F46E5", - FontFamily = "Inter" - }, - - // Formula Header Callout - new PdfShapeElement { X = 40, Y = 120, Width = 720, Height = 75, CornerRadius = 6, FillColorHex = "#FFFBEB", StrokeColorHex = "#FDE68A", StrokeThickness = 1.5 }, - new PdfTextElement - { - X = 55, Y = 128, Width = 690, Height = 18, - Text = "KEY FORMULAS & IDENTITIES (महत्वपूर्ण सर्वसमिकाएं):", - FontSize = 10.5, IsBold = true, TextColorHex = "#92400E", - FontFamily = "Inter" - }, - new PdfMathElement - { - X = 55, Y = 148, Width = 690, Height = 40, - Formula = @"(a \pm b)^2 = a^2 \pm 2ab + b^2, \quad a^2 - b^2 = (a - b)(a + b), \quad a^3 \pm b^3 = (a \pm b)(a^2 \mp ab + b^2)", - FontSize = 12, TextColorHex = "#78350F", - Category = MathCategory.Algebra, - Alignment = TextAlignmentMode.Center - }, - - // Section A Header - new PdfShapeElement { X = 40, Y = 205, Width = 720, Height = 26, CornerRadius = 4, FillColorHex = "#1E293B", StrokeColorHex = "#00000000" }, - new PdfTextElement { X = 50, Y = 210, Width = 700, Height = 18, Text = "SECTION A: Difference of Two Squares [ a\u00b2 - b\u00b2 = (a - b)(a + b) ]", FontSize = 10.5, IsBold = true, TextColorHex = "#FFFFFF" }, - - // 3 Columns of Questions (Col 1: X=45, Col 2: X=285, Col 3: X=525) - new PdfTextElement { X = 45, Y = 240, Width = 230, Height = 35, Text = "1. x\u00b2 - 16 = ___________", FontSize = 11, TextColorHex = "#0F172A" }, - new PdfTextElement { X = 45, Y = 280, Width = 230, Height = 35, Text = "2. 4x\u00b2 - 25 = __________", FontSize = 11, TextColorHex = "#0F172A" }, - new PdfTextElement { X = 45, Y = 320, Width = 230, Height = 35, Text = "3. 9a\u00b2 - 49b\u00b2 = ________", FontSize = 11, TextColorHex = "#0F172A" }, - new PdfTextElement { X = 45, Y = 360, Width = 230, Height = 35, Text = "4. 16x\u00b2 - 1 = ___________", FontSize = 11, TextColorHex = "#0F172A" }, - new PdfTextElement { X = 45, Y = 400, Width = 230, Height = 35, Text = "5. 100 - p\u00b2 = ___________", FontSize = 11, TextColorHex = "#0F172A" }, - - new PdfTextElement { X = 285, Y = 240, Width = 230, Height = 35, Text = "6. 25x\u00b2 - 64y\u00b2 = _______", FontSize = 11, TextColorHex = "#0F172A" }, - new PdfTextElement { X = 285, Y = 280, Width = 230, Height = 35, Text = "7. x\u2074 - 81 = ____________", FontSize = 11, TextColorHex = "#0F172A" }, - new PdfTextElement { X = 285, Y = 320, Width = 230, Height = 35, Text = "8. 36a\u00b2b\u00b2 - 121 = ______", FontSize = 11, TextColorHex = "#0F172A" }, - new PdfTextElement { X = 285, Y = 360, Width = 230, Height = 35, Text = "9. (x+y)\u00b2 - z\u00b2 = _________", FontSize = 11, TextColorHex = "#0F172A" }, - new PdfTextElement { X = 285, Y = 400, Width = 230, Height = 35, Text = "10. a\u00b2 - (b - c)\u00b2 = _______", FontSize = 11, TextColorHex = "#0F172A" }, - - new PdfTextElement { X = 525, Y = 240, Width = 230, Height = 35, Text = "11. 49x\u00b2 - 144y\u00b2 = ______", FontSize = 11, TextColorHex = "#0F172A" }, - new PdfTextElement { X = 525, Y = 280, Width = 230, Height = 35, Text = "12. 64 - (x + 3)\u00b2 = _______", FontSize = 11, TextColorHex = "#0F172A" }, - new PdfTextElement { X = 525, Y = 320, Width = 230, Height = 35, Text = "13. 2x\u00b2 - 32 = ___________", FontSize = 11, TextColorHex = "#0F172A" }, - new PdfTextElement { X = 525, Y = 360, Width = 230, Height = 35, Text = "14. 3a\u00b3 - 75a = __________", FontSize = 11, TextColorHex = "#0F172A" }, - new PdfTextElement { X = 525, Y = 400, Width = 230, Height = 35, Text = "15. 1 - (2x - 3y)\u00b2 = ______", FontSize = 11, TextColorHex = "#0F172A" }, - - // Section B Header: Quadratic Trinomials - new PdfShapeElement { X = 40, Y = 450, Width = 720, Height = 26, CornerRadius = 4, FillColorHex = "#1E293B", StrokeColorHex = "#00000000" }, - new PdfTextElement { X = 50, Y = 455, Width = 700, Height = 18, Text = "SECTION B: Quadratic Trinomials [ x\u00b2 + (a+b)x + ab = (x+a)(x+b) ]", FontSize = 10.5, IsBold = true, TextColorHex = "#FFFFFF" }, - - new PdfTextElement { X = 45, Y = 485, Width = 230, Height = 35, Text = "16. x\u00b2 + 7x + 12 = _______", FontSize = 11, TextColorHex = "#0F172A" }, - new PdfTextElement { X = 45, Y = 525, Width = 230, Height = 35, Text = "17. x\u00b2 - 5x + 6 = ________", FontSize = 11, TextColorHex = "#0F172A" }, - new PdfTextElement { X = 45, Y = 565, Width = 230, Height = 35, Text = "18. x\u00b2 + 2x - 15 = _______", FontSize = 11, TextColorHex = "#0F172A" }, - new PdfTextElement { X = 45, Y = 605, Width = 230, Height = 35, Text = "19. x\u00b2 - 8x - 20 = _______", FontSize = 11, TextColorHex = "#0F172A" }, - new PdfTextElement { X = 45, Y = 645, Width = 230, Height = 35, Text = "20. x\u00b2 + 11x + 30 = ______", FontSize = 11, TextColorHex = "#0F172A" }, - - new PdfTextElement { X = 285, Y = 485, Width = 230, Height = 35, Text = "21. 2x\u00b2 + 7x + 3 = _______", FontSize = 11, TextColorHex = "#0F172A" }, - new PdfTextElement { X = 285, Y = 525, Width = 230, Height = 35, Text = "22. 3x\u00b2 - 10x + 8 = ______", FontSize = 11, TextColorHex = "#0F172A" }, - new PdfTextElement { X = 285, Y = 565, Width = 230, Height = 35, Text = "23. 6x\u00b2 + 17x + 12 = _____", FontSize = 11, TextColorHex = "#0F172A" }, - new PdfTextElement { X = 285, Y = 605, Width = 230, Height = 35, Text = "24. 4x\u00b2 - 12x + 9 = ______", FontSize = 11, TextColorHex = "#0F172A" }, - new PdfTextElement { X = 285, Y = 645, Width = 230, Height = 35, Text = "25. 12x\u00b2 - 7x - 10 = _____", FontSize = 11, TextColorHex = "#0F172A" }, - - new PdfTextElement { X = 525, Y = 485, Width = 230, Height = 35, Text = "26. x\u00b2 - 14x + 49 = ______", FontSize = 11, TextColorHex = "#0F172A" }, - new PdfTextElement { X = 525, Y = 525, Width = 230, Height = 35, Text = "27. 9x\u00b2 + 24x + 16 = _____", FontSize = 11, TextColorHex = "#0F172A" }, - new PdfTextElement { X = 525, Y = 565, Width = 230, Height = 35, Text = "28. 5x\u00b2 + 13x - 6 = ______", FontSize = 11, TextColorHex = "#0F172A" }, - new PdfTextElement { X = 525, Y = 605, Width = 230, Height = 35, Text = "29. 8x\u00b2 - 22x + 15 = _____", FontSize = 11, TextColorHex = "#0F172A" }, - new PdfTextElement { X = 525, Y = 645, Width = 230, Height = 35, Text = "30. 2x\u00b2 + 5xy + 2y\u00b2 = ____", FontSize = 11, TextColorHex = "#0F172A" }, - - // Section C Header: Sum and Difference of Cubes - new PdfShapeElement { X = 40, Y = 695, Width = 720, Height = 26, CornerRadius = 4, FillColorHex = "#1E293B", StrokeColorHex = "#00000000" }, - new PdfTextElement { X = 50, Y = 700, Width = 700, Height = 18, Text = "SECTION C: Sum & Difference of Cubes [ a\u00b3 \u00b1 b\u00b3 = (a \u00b1 b)(a\u00b2 \u2213 ab + b\u00b2) ]", FontSize = 10.5, IsBold = true, TextColorHex = "#FFFFFF" }, - - new PdfTextElement { X = 45, Y = 730, Width = 230, Height = 35, Text = "31. x\u00b3 - 8 = _____________", FontSize = 11, TextColorHex = "#0F172A" }, - new PdfTextElement { X = 45, Y = 770, Width = 230, Height = 35, Text = "32. 8a\u00b3 + 27 = ___________", FontSize = 11, TextColorHex = "#0F172A" }, - new PdfTextElement { X = 45, Y = 810, Width = 230, Height = 35, Text = "33. 64x\u00b3 - 125y\u00b3 = ______", FontSize = 11, TextColorHex = "#0F172A" }, - - new PdfTextElement { X = 285, Y = 730, Width = 230, Height = 35, Text = "34. 27x\u00b3 + 1 = ___________", FontSize = 11, TextColorHex = "#0F172A" }, - new PdfTextElement { X = 285, Y = 770, Width = 230, Height = 35, Text = "35. a\u00b3 - 216 = ___________", FontSize = 11, TextColorHex = "#0F172A" }, - new PdfTextElement { X = 285, Y = 810, Width = 230, Height = 35, Text = "36. 125x\u00b3 + 8y\u00b3 = _______", FontSize = 11, TextColorHex = "#0F172A" }, - - new PdfTextElement { X = 525, Y = 730, Width = 230, Height = 35, Text = "37. 2x\u00b4 - 16x = __________", FontSize = 11, TextColorHex = "#0F172A" }, - new PdfTextElement { X = 525, Y = 770, Width = 230, Height = 35, Text = "38. (a+b)\u00b3 - 8 = _________", FontSize = 11, TextColorHex = "#0F172A" }, - new PdfTextElement { X = 525, Y = 810, Width = 230, Height = 35, Text = "39. x\u2076 - y\u2076 = ____________", FontSize = 11, TextColorHex = "#0F172A" } - } - }; - - // ========================================================================= - // PAGE 2: Answer Key & Evaluation - // ========================================================================= - var page2 = new PdfPageModel - { - PageNumber = 2, - Format = PageFormat.A4, - Orientation = PageOrientation.Portrait, - Width = 800, - Height = 1131, - BackgroundColorHex = "#FFFFFF", - HeaderLeft = "Algebra Mastery Series", - HeaderCenter = "Factorization Solutions Matrix", - HeaderRight = "Worksheet #03 - Key", - FooterLeft = "150 Comprehensive Factorization Practice Worksheet", - FooterCenter = "Teacher Evaluation & Answer Guide", - FooterRight = "Page 2 of 2", - Elements = new List - { - new PdfShapeElement { X = 0, Y = 0, Width = 800, Height = 8, FillColorHex = "#10B981", StrokeColorHex = "#00000000" }, - - new PdfShapeElement { X = 40, Y = 35, Width = 720, Height = 60, CornerRadius = 8, FillColorHex = "#ECFDF5", StrokeColorHex = "#A7F3D0", StrokeThickness = 1.5 }, - new PdfTextElement { X = 55, Y = 43, Width = 690, Height = 26, Text = "Factorization Answer Key & Solutions Matrix", FontSize = 16, IsBold = true, TextColorHex = "#065F46" }, - new PdfTextElement { X = 55, Y = 70, Width = 690, Height = 20, Text = "Complete factorized expressions for Section A, B, and C", FontSize = 10, TextColorHex = "#047857" }, - - new PdfTableElement - { - X = 40, Y = 110, Width = 720, Height = 680, - HeaderBackgroundHex = "#047857", - HeaderTextHex = "#FFFFFF", - BorderColorHex = "#D1D5DB", - AlternateRowBackgroundHex = "#F9FAFB", - Headers = new List { "Q#", "Original Expression", "Factorized Result", "Q#", "Original Expression", "Factorized Result" }, - Rows = new List> - { - new() { "1", "x\u00b2 - 16", "(x - 4)(x + 4)", "21", "2x\u00b2 + 7x + 3", "(2x + 1)(x + 3)" }, - new() { "2", "4x\u00b2 - 25", "(2x - 5)(2x + 5)", "22", "3x\u00b2 - 10x + 8", "(3x - 4)(x - 2)" }, - new() { "3", "9a\u00b2 - 49b\u00b2", "(3a - 7b)(3a + 7b)", "23", "6x\u00b2 + 17x + 12", "(2x + 3)(3x + 4)" }, - new() { "4", "16x\u00b2 - 1", "(4x - 1)(4x + 1)", "24", "4x\u00b2 - 12x + 9", "(2x - 3)\u00b2" }, - new() { "5", "100 - p\u00b2", "(10 - p)(10 + p)", "25", "12x\u00b2 - 7x - 10", "(3x + 2)(4x - 5)" }, - new() { "6", "25x\u00b2 - 64y\u00b2", "(5x - 8y)(5x + 8y)", "26", "x\u00b2 - 14x + 49", "(x - 7)\u00b2" }, - new() { "7", "x\u2074 - 81", "(x\u00b2 + 9)(x - 3)(x + 3)", "27", "9x\u00b2 + 24x + 16", "(3x + 4)\u00b2" }, - new() { "8", "36a\u00b2b\u00b2 - 121", "(6ab - 11)(6ab + 11)", "28", "5x\u00b2 + 13x - 6", "(5x - 2)(x + 3)" }, - new() { "9", "(x+y)\u00b2 - z\u00b2", "(x + y - z)(x + y + z)", "29", "8x\u00b2 - 22x + 15", "(2x - 3)(4x - 5)" }, - new() { "10", "a\u00b2 - (b - c)\u00b2", "(a - b + c)(a + b - c)", "30", "2x\u00b2 + 5xy + 2y\u00b2", "(2x + y)(x + 2y)" }, - new() { "11", "49x\u00b2 - 144y\u00b2", "(7x - 12y)(7x + 12y)", "31", "x\u00b3 - 8", "(x - 2)(x\u00b2 + 2x + 4)" }, - new() { "12", "64 - (x + 3)\u00b2", "(5 - x)(11 + x)", "32", "8a\u00b3 + 27", "(2a + 3)(4a\u00b2 - 6a + 9)" }, - new() { "13", "2x\u00b2 - 32", "2(x - 4)(x + 4)", "33", "64x\u00b3 - 125y\u00b3", "(4x - 5y)(16x\u00b2 + 20xy + 25y\u00b2)" }, - new() { "14", "3a\u00b3 - 75a", "3a(a - 5)(a + 5)", "34", "27x\u00b3 + 1", "(3x + 1)(9x\u00b2 - 3x + 1)" }, - new() { "15", "1 - (2x - 3y)\u00b2", "(1 - 2x + 3y)(1 + 2x - 3y)", "35", "a\u00b3 - 216", "(a - 6)(a\u00b2 + 6a + 36)" } - } - } - } - }; - - doc.Pages.Add(page1); - doc.Pages.Add(page2); - - return doc; - } -} diff --git a/src/PdfEditorApp/Templates/Education/MathBODMASWorksheetTemplate.cs b/src/PdfEditorApp/Templates/Education/MathBODMASWorksheetTemplate.cs deleted file mode 100644 index 8272b13..0000000 --- a/src/PdfEditorApp/Templates/Education/MathBODMASWorksheetTemplate.cs +++ /dev/null @@ -1,390 +0,0 @@ -using System.Collections.Generic; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; - -namespace PdfEditorApp.Templates.Education; - -public class MathBODMASWorksheetTemplate : ITemplateDefinition -{ - public string Id => "bodmas_worksheet"; - public string Name => "Math Practice Worksheet (BODMAS)"; - public string Description => "Comprehensive school math worksheet with student header, score card, formula callout, 30 problems, and complete answer key table"; - public string Category => "Education"; - public string IconKind => "Calculator"; - public string AccentColorHex => "#2563EB"; - - public PdfDocumentModel Create() - { - var doc = new PdfDocumentModel - { - Title = "Class_6_BODMAS_Worksheet.pdf", - Author = "Mathematics Department", - Subject = "Order of Operations (BODMAS) Comprehensive Practice Worksheet" - }; - - // ========================================================================= - // PAGE 1: Header, Rule Callout, Section A & B - // ========================================================================= - var page1 = new PdfPageModel - { - PageNumber = 1, - Format = PageFormat.A4, - Orientation = PageOrientation.Portrait, - Width = 800, - Height = 1131, - BackgroundColorHex = "#FFFFFF", - HeaderLeft = "Mathematics Practice Series", - HeaderCenter = "Grade 6 • Order of Operations", - HeaderRight = "Worksheet #01", - FooterLeft = "Class 6 Mathematics: BODMAS Practice Worksheet", - FooterCenter = "Confidential - For Student Practice Only", - FooterRight = "Page 1 of 3", - Elements = new List - { - // Top Brand Accent Header - new PdfShapeElement - { - X = 0, Y = 0, Width = 800, Height = 8, - FillColorHex = "#2563EB", StrokeColorHex = "#00000000" - }, - - // Title Banner Box - new PdfShapeElement - { - X = 40, Y = 35, Width = 720, Height = 85, - CornerRadius = 8, FillColorHex = "#EFF6FF", - StrokeColorHex = "#BFDBFE", StrokeThickness = 1.5 - }, - new PdfTextElement - { - X = 55, Y = 45, Width = 690, Height = 30, - Text = "Class 6 Mathematics: BODMAS Practice Worksheet", - FontSize = 18, IsBold = true, TextColorHex = "#1E3A8A", - FontFamily = "Inter" - }, - new PdfTextElement - { - X = 55, Y = 78, Width = 690, Height = 22, - Text = "Topic: Order of Operations (Brackets, Orders/Of, Division, Multiplication, Addition, Subtraction)", - FontSize = 11, IsItalic = true, TextColorHex = "#1D4ED8", - FontFamily = "Inter" - }, - - // Student Metadata Strip - new PdfShapeElement - { - X = 40, Y = 130, Width = 720, Height = 48, - CornerRadius = 6, FillColorHex = "#F8FAFC", - StrokeColorHex = "#CBD5E1", StrokeThickness = 1 - }, - new PdfTextElement - { - X = 55, Y = 144, Width = 310, Height = 22, - Text = "Name: ___________________________________", - FontSize = 11, IsBold = true, TextColorHex = "#334155", - FontFamily = "Inter" - }, - new PdfTextElement - { - X = 380, Y = 144, Width = 180, Height = 22, - Text = "Date: ______________", - FontSize = 11, IsBold = true, TextColorHex = "#334155", - FontFamily = "Inter" - }, - new PdfShapeElement - { - X = 580, Y = 138, Width = 165, Height = 32, - CornerRadius = 4, FillColorHex = "#FEF2F2", - StrokeColorHex = "#F87171", StrokeThickness = 1.5 - }, - new PdfTextElement - { - X = 585, Y = 145, Width = 155, Height = 20, - Text = "Score: _______ / 30", - FontSize = 11, IsBold = true, TextColorHex = "#B91C1C", - Alignment = TextAlignmentMode.Center, - FontFamily = "Inter" - }, - - // BODMAS Rule Card - new PdfShapeElement - { - X = 40, Y = 190, Width = 720, Height = 80, - CornerRadius = 6, FillColorHex = "#FFFBEB", - StrokeColorHex = "#FCD34D", StrokeThickness = 1.5 - }, - new PdfTextElement - { - X = 55, Y = 200, Width = 690, Height = 20, - Text = "BODMAS RULE & ORDER OF PRECEDENCE:", - FontSize = 11, IsBold = true, TextColorHex = "#92400E", - FontFamily = "Inter" - }, - new PdfMathElement - { - X = 55, Y = 222, Width = 690, Height = 40, - Formula = @"\text{Brackets } [ \{ ( ) \} ] \;\longrightarrow\; \text{Orders (Powers/Roots)} \;\longrightarrow\; \text{Division } (\div) \;\longrightarrow\; \text{Multiplication } (\times) \;\longrightarrow\; \text{Addition } (+) \;\longrightarrow\; \text{Subtraction } (-)", - FontSize = 13, TextColorHex = "#78350F", - Category = MathCategory.SchoolArithmetic, - Alignment = TextAlignmentMode.Center - }, - - // Section A Header - new PdfShapeElement - { - X = 40, Y = 285, Width = 720, Height = 28, - CornerRadius = 4, FillColorHex = "#1E293B", - StrokeColorHex = "#00000000" - }, - new PdfTextElement - { - X = 50, Y = 290, Width = 700, Height = 20, - Text = "SECTION A: Basic Operations (Problems 1 to 10)", - FontSize = 11, IsBold = true, TextColorHex = "#FFFFFF", - FontFamily = "Inter" - }, - - // Questions Column 1 (Left) - new PdfTextElement { X = 55, Y = 325, Width = 320, Height = 40, Text = "1. 12 + 8 \u00f7 4 = ______________", FontSize = 12, TextColorHex = "#0F172A" }, - new PdfTextElement { X = 55, Y = 375, Width = 320, Height = 40, Text = "2. 25 - 3 \u00d7 6 = ______________", FontSize = 12, TextColorHex = "#0F172A" }, - new PdfTextElement { X = 55, Y = 425, Width = 320, Height = 40, Text = "3. (15 + 5) \u00d7 2 = ______________", FontSize = 12, TextColorHex = "#0F172A" }, - new PdfTextElement { X = 55, Y = 475, Width = 320, Height = 40, Text = "4. 40 \u00f7 (8 - 3) = ______________", FontSize = 12, TextColorHex = "#0F172A" }, - new PdfTextElement { X = 55, Y = 525, Width = 320, Height = 40, Text = "5. 18 + 12 \u00f7 3 \u00d7 2 = ___________", FontSize = 12, TextColorHex = "#0F172A" }, - - // Questions Column 2 (Right) - new PdfTextElement { X = 415, Y = 325, Width = 320, Height = 40, Text = "6. 36 \u00f7 4 + 5 \u00d7 3 = ___________", FontSize = 12, TextColorHex = "#0F172A" }, - new PdfTextElement { X = 415, Y = 375, Width = 320, Height = 40, Text = "7. 50 - 4 \u00d7 (6 + 2) = __________", FontSize = 12, TextColorHex = "#0F172A" }, - new PdfTextElement { X = 415, Y = 425, Width = 320, Height = 40, Text = "8. (24 \u00f7 6) + (18 \u00f7 3) = ________", FontSize = 12, TextColorHex = "#0F172A" }, - new PdfTextElement { X = 415, Y = 475, Width = 320, Height = 40, Text = "9. 100 - 50 \u00f7 5 + 10 = _________", FontSize = 12, TextColorHex = "#0F172A" }, - new PdfTextElement { X = 415, Y = 525, Width = 320, Height = 40, Text = "10. 7 \u00d7 (12 - 4) \u00f7 2 = ___________", FontSize = 12, TextColorHex = "#0F172A" }, - - // Section B Header - new PdfShapeElement - { - X = 40, Y = 580, Width = 720, Height = 28, - CornerRadius = 4, FillColorHex = "#1E293B", - StrokeColorHex = "#00000000" - }, - new PdfTextElement - { - X = 50, Y = 585, Width = 700, Height = 20, - Text = "SECTION B: Nested Operations & Parentheses (Problems 11 to 20)", - FontSize = 11, IsBold = true, TextColorHex = "#FFFFFF", - FontFamily = "Inter" - }, - - // Section B Column 1 - new PdfTextElement { X = 55, Y = 620, Width = 320, Height = 42, Text = "11. 30 - [12 + (8 - 5)] = _____________", FontSize = 12, TextColorHex = "#0F172A" }, - new PdfTextElement { X = 55, Y = 675, Width = 320, Height = 42, Text = "12. 4 \u00d7 [15 - (6 + 3)] = _____________", FontSize = 12, TextColorHex = "#0F172A" }, - new PdfTextElement { X = 55, Y = 730, Width = 320, Height = 42, Text = "13. 48 \u00f7 [16 - (4 \u00d7 2)] = ____________", FontSize = 12, TextColorHex = "#0F172A" }, - new PdfTextElement { X = 55, Y = 785, Width = 320, Height = 42, Text = "14. 20 + 2 \u00d7 [18 - (10 - 2)] = _________", FontSize = 12, TextColorHex = "#0F172A" }, - new PdfTextElement { X = 55, Y = 840, Width = 320, Height = 42, Text = "15. 75 - [25 + (15 - 5 \u00d7 2)] = ________", FontSize = 12, TextColorHex = "#0F172A" }, - - // Section B Column 2 - new PdfTextElement { X = 415, Y = 620, Width = 320, Height = 42, Text = "16. [40 - (18 + 2)] \u00f7 4 = ____________", FontSize = 12, TextColorHex = "#0F172A" }, - new PdfTextElement { X = 415, Y = 675, Width = 320, Height = 42, Text = "17. 60 \u00f7 [5 + (10 - 7)] = ____________", FontSize = 12, TextColorHex = "#0F172A" }, - new PdfTextElement { X = 415, Y = 730, Width = 320, Height = 42, Text = "18. [8 \u00d7 (9 - 4)] - (12 + 6) = _________", FontSize = 12, TextColorHex = "#0F172A" }, - new PdfTextElement { X = 415, Y = 785, Width = 320, Height = 42, Text = "19. 90 - [30 + 5 \u00d7 (8 - 4)] = _________", FontSize = 12, TextColorHex = "#0F172A" }, - new PdfTextElement { X = 415, Y = 840, Width = 320, Height = 42, Text = "20. 2 \u00d7 [50 - (20 + 15)] + 10 = ________", FontSize = 12, TextColorHex = "#0F172A" } - } - }; - - // ========================================================================= - // PAGE 2: Section C: Advanced Brackets & Step-by-Step Workspace - // ========================================================================= - var page2 = new PdfPageModel - { - PageNumber = 2, - Format = PageFormat.A4, - Orientation = PageOrientation.Portrait, - Width = 800, - Height = 1131, - BackgroundColorHex = "#FFFFFF", - HeaderLeft = "Mathematics Practice Series", - HeaderCenter = "Grade 6 • Order of Operations", - HeaderRight = "Worksheet #01", - FooterLeft = "Class 6 Mathematics: BODMAS Practice Worksheet", - FooterCenter = "Confidential - For Student Practice Only", - FooterRight = "Page 2 of 3", - Elements = new List - { - new PdfShapeElement - { - X = 0, Y = 0, Width = 800, Height = 8, - FillColorHex = "#2563EB", StrokeColorHex = "#00000000" - }, - - // Section C Header - new PdfShapeElement - { - X = 40, Y = 35, Width = 720, Height = 28, - CornerRadius = 4, FillColorHex = "#1E293B", - StrokeColorHex = "#00000000" - }, - new PdfTextElement - { - X = 50, Y = 40, Width = 700, Height = 20, - Text = "SECTION C: Advanced Multi-Level Brackets & Complex Expressions (Problems 21 to 30)", - FontSize = 11, IsBold = true, TextColorHex = "#FFFFFF", - FontFamily = "Inter" - }, - - // Questions 21 to 30 with working space - new PdfTextElement { X = 55, Y = 75, Width = 320, Height = 45, Text = "21. 45 - [18 + (12 - 6)] = ___________", FontSize = 12, TextColorHex = "#0F172A" }, - new PdfTextElement { X = 415, Y = 75, Width = 320, Height = 45, Text = "22. 2 \u00d7 [30 - (5 + 3 \u00d7 4)] = _________", FontSize = 12, TextColorHex = "#0F172A" }, - - new PdfTextElement { X = 55, Y = 130, Width = 320, Height = 45, Text = "23. 100 - {20 + [15 - (8 - 3)]} = ______", FontSize = 12, TextColorHex = "#0F172A" }, - new PdfTextElement { X = 415, Y = 130, Width = 320, Height = 45, Text = "24. [64 \u00f7 (16 - 8)] \u00d7 [3 + 2] = ________", FontSize = 12, TextColorHex = "#0F172A" }, - - new PdfTextElement { X = 55, Y = 185, Width = 320, Height = 45, Text = "25. {50 - [10 + (25 - 15)]} \u00f7 6 = ______", FontSize = 12, TextColorHex = "#0F172A" }, - new PdfTextElement { X = 415, Y = 185, Width = 320, Height = 45, Text = "26. 120 \u00f7 {15 + [12 - (7 - 2)]} = ______", FontSize = 12, TextColorHex = "#0F172A" }, - - new PdfTextElement { X = 55, Y = 240, Width = 320, Height = 45, Text = "27. [80 - (25 + 15)] \u00f7 [4 \u00d7 (5 - 3)] = __", FontSize = 12, TextColorHex = "#0F172A" }, - new PdfTextElement { X = 415, Y = 240, Width = 320, Height = 45, Text = "28. 25 + {35 - [20 + (10 - 5)]} = ______", FontSize = 12, TextColorHex = "#0F172A" }, - - new PdfTextElement { X = 55, Y = 295, Width = 320, Height = 45, Text = "29. 3 \u00d7 {18 - [14 - (8 - 4)]} = ________", FontSize = 12, TextColorHex = "#0F172A" }, - new PdfTextElement { X = 415, Y = 295, Width = 320, Height = 45, Text = "30. {100 - [40 + (15 - 5) \u00d7 2]} = _____", FontSize = 12, TextColorHex = "#0F172A" }, - - // Rough Working Space Box - new PdfShapeElement - { - X = 40, Y = 360, Width = 720, Height = 580, - CornerRadius = 8, FillColorHex = "#F8FAFC", - StrokeColorHex = "#CBD5E1", StrokeThickness = 1 - }, - new PdfTextElement - { - X = 55, Y = 375, Width = 690, Height = 22, - Text = "ROUGH WORKING SPACE / STEP-BY-STEP SOLUTION SCRATCHPAD", - FontSize = 11, IsBold = true, TextColorHex = "#64748B", - FontFamily = "Inter" - }, - new PdfDividerElement - { - X = 55, Y = 405, Width = 690, Height = 2, - ColorHex = "#E2E8F0" - } - } - }; - - // ========================================================================= - // PAGE 3: Answer Key & Solutions Summary Table - // ========================================================================= - var page3 = new PdfPageModel - { - PageNumber = 3, - Format = PageFormat.A4, - Orientation = PageOrientation.Portrait, - Width = 800, - Height = 1131, - BackgroundColorHex = "#FFFFFF", - HeaderLeft = "Mathematics Practice Series", - HeaderCenter = "Grade 6 • Solutions Summary", - HeaderRight = "Worksheet #01 - Key", - FooterLeft = "Class 6 Mathematics: BODMAS Practice Worksheet", - FooterCenter = "Confidential - Teacher & Grading Key", - FooterRight = "Page 3 of 3", - Elements = new List - { - new PdfShapeElement - { - X = 0, Y = 0, Width = 800, Height = 8, - FillColorHex = "#10B981", StrokeColorHex = "#00000000" - }, - - // Answer Key Banner - new PdfShapeElement - { - X = 40, Y = 35, Width = 720, Height = 65, - CornerRadius = 8, FillColorHex = "#ECFDF5", - StrokeColorHex = "#A7F3D0", StrokeThickness = 1.5 - }, - new PdfTextElement - { - X = 55, Y = 45, Width = 690, Height = 26, - Text = "Answer Key & Solutions Summary", - FontSize = 16, IsBold = true, TextColorHex = "#065F46", - FontFamily = "Inter" - }, - new PdfTextElement - { - X = 55, Y = 73, Width = 690, Height = 20, - Text = "Complete numerical answers and evaluation guide for Class 6 BODMAS Practice Worksheet", - FontSize = 10, TextColorHex = "#047857", - FontFamily = "Inter" - }, - - // Solutions Table - new PdfTableElement - { - X = 40, Y = 120, Width = 720, Height = 620, - HeaderBackgroundHex = "#047857", - HeaderTextHex = "#FFFFFF", - BorderColorHex = "#D1D5DB", - AlternateRowBackgroundHex = "#F9FAFB", - Headers = new List { "Q#", "Expression", "Answer", "Q#", "Expression", "Answer" }, - Rows = new List> - { - new() { "1", "12 + 8 \u00f7 4", "14", "16", "[40 - (18 + 2)] \u00f7 4", "5" }, - new() { "2", "25 - 3 \u00d7 6", "7", "17", "60 \u00f7 [5 + (10 - 7)]", "7.5" }, - new() { "3", "(15 + 5) \u00d7 2", "40", "18", "[8 \u00d7 (9 - 4)] - (12 + 6)", "22" }, - new() { "4", "40 \u00f7 (8 - 3)", "8", "19", "90 - [30 + 5 \u00d7 (8 - 4)]", "40" }, - new() { "5", "18 + 12 \u00f7 3 \u00d7 2", "26", "20", "2 \u00d7 [50 - 35] + 10", "40" }, - new() { "6", "36 \u00f7 4 + 5 \u00d7 3", "24", "21", "45 - [18 + (12 - 6)]", "21" }, - new() { "7", "50 - 4 \u00d7 (6 + 2)", "18", "22", "2 \u00d7 [30 - (5 + 12)]", "26" }, - new() { "8", "(24 \u00f7 6) + (18 \u00f7 3)", "10", "23", "100 - {20 + [15 - 5]}", "70" }, - new() { "9", "100 - 50 \u00f7 5 + 10", "100", "24", "[64 \u00f7 8] \u00d7 5", "40" }, - new() { "10", "7 \u00d7 (12 - 4) \u00f7 2", "28", "25", "{50 - [10 + 10]} \u00f7 6", "5" }, - new() { "11", "30 - [12 + 3]", "15", "26", "120 \u00f7 {15 + [12 - 5]}", "5.45" }, - new() { "12", "4 \u00d7 [15 - 9]", "24", "27", "[80 - 40] \u00f7 [4 \u00d7 2]", "5" }, - new() { "13", "48 \u00f7 [16 - 8]", "6", "28", "25 + {35 - [20 + 5]}", "35" }, - new() { "14", "20 + 2 \u00d7 [18 - 8]", "40", "29", "3 \u00d7 {18 - [14 - 4]}", "24" }, - new() { "15", "75 - [25 + 5]", "45", "30", "100 - [40 + 20]", "40" } - } - }, - - // Teacher Feedback & Signature Card - new PdfShapeElement - { - X = 40, Y = 770, Width = 720, Height = 150, - CornerRadius = 8, FillColorHex = "#F8FAFC", - StrokeColorHex = "#CBD5E1", StrokeThickness = 1.5 - }, - new PdfTextElement - { - X = 55, Y = 785, Width = 300, Height = 22, - Text = "Teacher Remarks & Feedback:", - FontSize = 11, IsBold = true, TextColorHex = "#334155", - FontFamily = "Inter" - }, - new PdfTextElement - { - X = 55, Y = 815, Width = 690, Height = 45, - Text = "[ ] Excellent Mastery [ ] Needs Practice with Nested Brackets [ ] Re-test Recommended\nComments: ___________________________________________________________________________________", - FontSize = 10, TextColorHex = "#64748B", - FontFamily = "Inter" - }, - new PdfTextElement - { - X = 55, Y = 880, Width = 300, Height = 22, - Text = "Teacher Signature: _______________________", - FontSize = 11, IsBold = true, TextColorHex = "#334155", - FontFamily = "Inter" - }, - new PdfTextElement - { - X = 450, Y = 880, Width = 280, Height = 22, - Text = "Grading Date: ____________________", - FontSize = 11, IsBold = true, TextColorHex = "#334155", - FontFamily = "Inter" - } - } - }; - - doc.Pages.Add(page1); - doc.Pages.Add(page2); - doc.Pages.Add(page3); - - return doc; - } -} diff --git a/src/PdfEditorApp/Templates/Education/QuadrilateralsGuideTemplate.cs b/src/PdfEditorApp/Templates/Education/QuadrilateralsGuideTemplate.cs deleted file mode 100644 index 20b9fb1..0000000 --- a/src/PdfEditorApp/Templates/Education/QuadrilateralsGuideTemplate.cs +++ /dev/null @@ -1,298 +0,0 @@ -using System.Collections.Generic; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; -using PdfEditorApp.Services; - -namespace PdfEditorApp.Templates.Education; - -public class QuadrilateralsGuideTemplate : ITemplateDefinition -{ - public string Id => "quadrilaterals_guide"; - public string Name => "Geometry Guide (Quadrilaterals)"; - public string Description => "Comprehensive bilingual geometry guide with vector quadrilateral illustrations, English & Hindi properties, and area/perimeter formula reference"; - public string Category => "Education"; - public string IconKind => "VectorSquare"; - public string AccentColorHex => "#7C3AED"; - - public PdfDocumentModel Create() - { - var doc = new PdfDocumentModel - { - Title = "Types_of_Quadrilaterals_Guide.pdf", - Author = "Mathematics & Geometry Department", - Subject = "Bilingual Illustrated Guide to Quadrilaterals and Geometric Properties" - }; - - // ========================================================================= - // PAGE 1: Overview, Vector Diagrams, Parallelogram & Rectangle - // ========================================================================= - var page1 = new PdfPageModel - { - PageNumber = 1, - Format = PageFormat.A4, - Orientation = PageOrientation.Portrait, - Width = 800, - Height = 1131, - BackgroundColorHex = "#FFFFFF", - HeaderLeft = "Geometry Visual Reference Series", - HeaderCenter = "Polygons & Quadrilaterals • चतुर्भुज", - HeaderRight = "Study Sheet #04", - FooterLeft = "Types of Quadrilaterals • चतुर्भुज के प्रकार (Bilingual Guide)", - FooterCenter = "Licensed for Classroom & Educational Distribution", - FooterRight = "Page 1 of 2", - Elements = new List - { - // Top Brand Stripe - new PdfShapeElement - { - X = 0, Y = 0, Width = 800, Height = 8, - FillColorHex = "#7C3AED", StrokeColorHex = "#00000000" - }, - - // Title Banner Box - new PdfShapeElement - { - X = 40, Y = 35, Width = 720, Height = 80, - CornerRadius = 8, FillColorHex = "#F5F3FF", - StrokeColorHex = "#DDD6FE", StrokeThickness = 1.5 - }, - new PdfTextElement - { - X = 55, Y = 45, Width = 690, Height = 28, - Text = "Types of Quadrilaterals • चतुर्भुज के प्रकार", - FontSize = 17, IsBold = true, TextColorHex = "#5B21B6", - FontFamily = "Noto Sans Devanagari" - }, - new PdfTextElement - { - X = 55, Y = 75, Width = 690, Height = 22, - Text = "Bilingual Visual Guide in English & Hindi with Geometric Properties, Angle Rules & Formulas", - FontSize = 10.5, IsItalic = true, TextColorHex = "#6D28D9", - FontFamily = "Inter" - }, - - // Definition Card - new PdfShapeElement - { - X = 40, Y = 125, Width = 720, Height = 65, - CornerRadius = 6, FillColorHex = "#F8FAFC", - StrokeColorHex = "#CBD5E1", StrokeThickness = 1 - }, - new PdfTextElement - { - X = 55, Y = 133, Width = 690, Height = 18, - Text = "WHAT IS A QUADRILATERAL? (चतुर्भुज क्या है?)", - FontSize = 10.5, IsBold = true, TextColorHex = "#334155", - FontFamily = "Noto Sans Devanagari" - }, - new PdfTextElement - { - X = 55, Y = 153, Width = 690, Height = 32, - Text = "• English: A closed 2D plane geometric figure bounded by four straight sides, four angles, and four vertices.\n• Hindi: चार सीधी भुजाओं, चार कोणों और चार शीर्षों से घिरी हुई बंद समतल आकृति को चतुर्भुज कहते हैं।", - FontSize = 9.5, TextColorHex = "#475569", - FontFamily = "Noto Sans Devanagari" - }, - - // Angle Sum Property Card - new PdfShapeElement - { - X = 40, Y = 200, Width = 720, Height = 65, - CornerRadius = 6, FillColorHex = "#FFFBEB", - StrokeColorHex = "#FDE68A", StrokeThickness = 1.5 - }, - new PdfTextElement - { - X = 55, Y = 208, Width = 690, Height = 18, - Text = "ANGLE SUM PROPERTY OF A QUADRILATERAL (कोण योग गुणधर्म):", - FontSize = 10.5, IsBold = true, TextColorHex = "#92400E", - FontFamily = "Noto Sans Devanagari" - }, - new PdfMathElement - { - X = 55, Y = 228, Width = 690, Height = 32, - Formula = @"\angle A + \angle B + \angle C + \angle D = 360^\circ \quad \text{(Four right angles: } 4 \times 90^\circ = 360^\circ\text{)}", - FontSize = 12, TextColorHex = "#78350F", - Category = MathCategory.Geometry, - Alignment = TextAlignmentMode.Center - }, - - // Quadrilateral Visual Diagram Set - new PdfSvgElement - { - X = 50, Y = 275, Width = 700, Height = 200, - SvgSource = SvgOrnamentLibrary.GetQuadrilateralSetDiagramSvg(), - PresetName = "Quadrilaterals Geometry Diagram" - }, - - // 1. Parallelogram Card - new PdfShapeElement { X = 40, Y = 490, Width = 720, Height = 135, CornerRadius = 6, FillColorHex = "#F8FAFC", StrokeColorHex = "#E2E8F0", StrokeThickness = 1 }, - new PdfTextElement - { - X = 55, Y = 498, Width = 690, Height = 22, - Text = "1. Parallelogram (समांतर चतुर्भुज)", - FontSize = 12, IsBold = true, TextColorHex = "#1E40AF", - FontFamily = "Noto Sans Devanagari" - }, - new PdfTextElement - { - X = 55, Y = 522, Width = 690, Height = 95, - Text = "• English Properties:\n - Opposite sides are equal and parallel (AB = CD, AD = BC).\n - Opposite angles are equal (\u2220A = \u2220C, \u2220B = \u2220D). Adjacent angles are supplementary (\u2220A + \u2220B = 180\u00b0).\n - Diagonals bisect each other into two equal halves.\n• Hindi Properties (हिंदी गुणधर्म):\n - आमने-सामने की भुजाएं समान और समानांतर होती हैं। सम्मुख कोण बराबर होते हैं और आसन्न कोण संपूरक (180\u00b0) होते हैं।\n - विकर्ण एक-दूसरे को समद्विभाजित (bisect) करते हैं। | क्षेत्रफल (Area) = b \u00d7 h", - FontSize = 9.5, TextColorHex = "#334155", - FontFamily = "Noto Sans Devanagari" - }, - - // 2. Rectangle Card - new PdfShapeElement { X = 40, Y = 635, Width = 720, Height = 135, CornerRadius = 6, FillColorHex = "#F8FAFC", StrokeColorHex = "#E2E8F0", StrokeThickness = 1 }, - new PdfTextElement - { - X = 55, Y = 643, Width = 690, Height = 22, - Text = "2. Rectangle (आयत)", - FontSize = 12, IsBold = true, TextColorHex = "#1E40AF", - FontFamily = "Noto Sans Devanagari" - }, - new PdfTextElement - { - X = 55, Y = 667, Width = 690, Height = 95, - Text = "• English Properties:\n - A parallelogram whose each internal angle is exactly 90\u00b0 (\u2220A = \u2220B = \u2220C = \u2220D = 90\u00b0).\n - Opposite sides are equal and parallel.\n - Both diagonals are equal in length and bisect each other (AC = BD).\n• Hindi Properties (हिंदी गुणधर्म):\n - प्रत्येक अंतःकोण समकोण (90\u00b0) होता है। सम्मुख भुजाएं समान एवं समानांतर होती हैं।\n - दोनों विकर्ण लंबाई में समान होते हैं। | क्षेत्रफल (Area) = l \u00d7 b | परिमाप (Perimeter) = 2(l + b)", - FontSize = 9.5, TextColorHex = "#334155", - FontFamily = "Noto Sans Devanagari" - } - } - }; - - // ========================================================================= - // PAGE 2: Rhombus, Square, Trapezoid, Kite & Formulas Table - // ========================================================================= - var page2 = new PdfPageModel - { - PageNumber = 2, - Format = PageFormat.A4, - Orientation = PageOrientation.Portrait, - Width = 800, - Height = 1131, - BackgroundColorHex = "#FFFFFF", - HeaderLeft = "Geometry Visual Reference Series", - HeaderCenter = "Polygons & Quadrilaterals • चतुर्भुज", - HeaderRight = "Study Sheet #04", - FooterLeft = "Types of Quadrilaterals • चतुर्भुज के प्रकार (Bilingual Guide)", - FooterCenter = "Licensed for Classroom & Educational Distribution", - FooterRight = "Page 2 of 2", - Elements = new List - { - new PdfShapeElement - { - X = 0, Y = 0, Width = 800, Height = 8, - FillColorHex = "#7C3AED", StrokeColorHex = "#00000000" - }, - - // 3. Rhombus Card - new PdfShapeElement { X = 40, Y = 35, Width = 720, Height = 115, CornerRadius = 6, FillColorHex = "#F8FAFC", StrokeColorHex = "#E2E8F0", StrokeThickness = 1 }, - new PdfTextElement - { - X = 55, Y = 43, Width = 690, Height = 22, - Text = "3. Rhombus (समचतुर्भुज)", - FontSize = 12, IsBold = true, TextColorHex = "#991B1B", - FontFamily = "Noto Sans Devanagari" - }, - new PdfTextElement - { - X = 55, Y = 67, Width = 690, Height = 75, - Text = "• English: All four sides are equal (AB = BC = CD = DA). Diagonals bisect each other at right angles (90\u00b0).\n• Hindi: चारों भुजाएं बराबर होती हैं। विकर्ण एक-दूसरे को परस्पर समकोण (90\u00b0) पर समद्विभाजित करते हैं।\n• सूत्र (Formulas): Area = \u00bd \u00d7 d\u2081 \u00d7 d\u2082 | Perimeter = 4a", - FontSize = 9.5, TextColorHex = "#334155", - FontFamily = "Noto Sans Devanagari" - }, - - // 4. Square Card - new PdfShapeElement { X = 40, Y = 160, Width = 720, Height = 115, CornerRadius = 6, FillColorHex = "#F8FAFC", StrokeColorHex = "#E2E8F0", StrokeThickness = 1 }, - new PdfTextElement - { - X = 55, Y = 168, Width = 690, Height = 22, - Text = "4. Square (वर्ग)", - FontSize = 12, IsBold = true, TextColorHex = "#15803D", - FontFamily = "Noto Sans Devanagari" - }, - new PdfTextElement - { - X = 55, Y = 192, Width = 690, Height = 75, - Text = "• English: A regular quadrilateral where all 4 sides are equal and all 4 angles are 90\u00b0. Diagonals are equal and perpendicular.\n• Hindi: सभी 4 भुजाएं बराबर और सभी कोण 90\u00b0 के होते हैं। दोनों विकर्ण बराबर होते हैं और 90\u00b0 पर काटते हैं।\n• सूत्र (Formulas): Area = a\u00b2 | Perimeter = 4a | Diagonal = a\u221a2", - FontSize = 9.5, TextColorHex = "#334155", - FontFamily = "Noto Sans Devanagari" - }, - - // 5. Trapezoid Card - new PdfShapeElement { X = 40, Y = 285, Width = 720, Height = 115, CornerRadius = 6, FillColorHex = "#F8FAFC", StrokeColorHex = "#E2E8F0", StrokeThickness = 1 }, - new PdfTextElement - { - X = 55, Y = 293, Width = 690, Height = 22, - Text = "5. Trapezoid / Trapezium (समलंब चतुर्भुज)", - FontSize = 12, IsBold = true, TextColorHex = "#047857", - FontFamily = "Noto Sans Devanagari" - }, - new PdfTextElement - { - X = 55, Y = 317, Width = 690, Height = 75, - Text = "• English: Has only one pair of parallel opposite sides called bases. Non-parallel sides are called legs.\n• Hindi: सम्मुख भुजाओं का केवल एक युग्म समानांतर होता है। समानांतर भुजाओं के बीच लंबवत दूरी ऊंचाई (h) कहलाती है।\n• सूत्र (Formulas): Area = \u00bd(a + b) \u00d7 h", - FontSize = 9.5, TextColorHex = "#334155", - FontFamily = "Noto Sans Devanagari" - }, - - // 6. Kite Card - new PdfShapeElement { X = 40, Y = 410, Width = 720, Height = 115, CornerRadius = 6, FillColorHex = "#F8FAFC", StrokeColorHex = "#E2E8F0", StrokeThickness = 1 }, - new PdfTextElement - { - X = 55, Y = 418, Width = 690, Height = 22, - Text = "6. Kite (पतंग रूपी चतुर्भुज)", - FontSize = 12, IsBold = true, TextColorHex = "#B45309", - FontFamily = "Noto Sans Devanagari" - }, - new PdfTextElement - { - X = 55, Y = 442, Width = 690, Height = 75, - Text = "• English: Two distinct pairs of adjacent sides are equal. Diagonals intersect at right angles, and the longer diagonal bisects the shorter.\n• Hindi: आसन्न भुजाओं के दो अलग-अलग जोड़े बराबर होते हैं। विकर्ण परस्पर समकोण (90\u00b0) पर प्रतिच्छेद करते हैं।\n• सूत्र (Formulas): Area = \u00bd \u00d7 d\u2081 \u00d7 d\u2082", - FontSize = 9.5, TextColorHex = "#334155", - FontFamily = "Noto Sans Devanagari" - }, - - // Summary Table Header - new PdfShapeElement - { - X = 40, Y = 540, Width = 720, Height = 26, - CornerRadius = 4, FillColorHex = "#1E293B", - StrokeColorHex = "#00000000" - }, - new PdfTextElement - { - X = 50, Y = 545, Width = 700, Height = 18, - Text = "FORMULA SUMMARY: PERIMETER & AREA (सूत्र संक्षेप तालिका)", - FontSize = 10.5, IsBold = true, TextColorHex = "#FFFFFF", - FontFamily = "Noto Sans Devanagari" - }, - - // Summary Table - new PdfTableElement - { - X = 40, Y = 575, Width = 720, Height = 260, - HeaderBackgroundHex = "#5B21B6", - HeaderTextHex = "#FFFFFF", - BorderColorHex = "#CBD5E1", - AlternateRowBackgroundHex = "#F5F3FF", - Headers = new List { "Quadrilateral (आकृति)", "Opposite Sides", "Diagonals (विकर्ण)", "Perimeter (परिमाप)", "Area (क्षेत्रफल)" }, - Rows = new List> - { - new() { "Square (वर्ग)", "Parallel & Equal", "Equal & \u22a5 (90\u00b0)", "4a", "a\u00b2" }, - new() { "Rectangle (आयत)", "Parallel & Equal", "Equal, not \u22a5", "2(l + b)", "l \u00d7 b" }, - new() { "Parallelogram (समांतर)", "Parallel & Equal", "Bisect each other", "2(a + b)", "b \u00d7 h" }, - new() { "Rhombus (समचतुर्भुज)", "Parallel & Equal (4)", "Unequal & \u22a5 (90\u00b0)", "4a", "\u00bd \u00d7 d\u2081 \u00d7 d\u2082" }, - new() { "Trapezoid (समलंब)", "1 Pair Parallel", "Unequal", "a + b + c + d", "\u00bd(a + b) \u00d7 h" }, - new() { "Kite (पतंग)", "Adjacent Equal", "Perpendicular (\u22a5)", "2(a + b)", "\u00bd \u00d7 d\u2081 \u00d7 d\u2082" } - } - } - } - }; - - doc.Pages.Add(page1); - doc.Pages.Add(page2); - - return doc; - } -} diff --git a/src/PdfEditorApp/Templates/Education/StatesOfMatterDiagramNotesTemplate.cs b/src/PdfEditorApp/Templates/Education/StatesOfMatterDiagramNotesTemplate.cs deleted file mode 100644 index f3c37ca..0000000 --- a/src/PdfEditorApp/Templates/Education/StatesOfMatterDiagramNotesTemplate.cs +++ /dev/null @@ -1,294 +0,0 @@ -using System.Collections.Generic; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; -using PdfEditorApp.Services; - -namespace PdfEditorApp.Templates.Education; - -public class StatesOfMatterDiagramNotesTemplate : ITemplateDefinition -{ - public string Id => "states_of_matter_notes"; - public string Name => "Science Visual Notes (States of Matter)"; - public string Description => "Science diagram study guide featuring triangular phase change cycle, particle arrangement models, comparison tables, and conceptual Q&A"; - public string Category => "Education"; - public string IconKind => "Atom"; - public string AccentColorHex => "#0284C7"; - - public PdfDocumentModel Create() - { - var doc = new PdfDocumentModel - { - Title = "States_of_Matter_Visual_Notes.pdf", - Author = "Science & Physics Faculty", - Subject = "Visual Study Notes: Interconversion of States of Matter & Kinetic Particle Theory" - }; - - // ========================================================================= - // PAGE 1: Triangular Phase Change Cycle & Particle Models - // ========================================================================= - var page1 = new PdfPageModel - { - PageNumber = 1, - Format = PageFormat.A4, - Orientation = PageOrientation.Portrait, - Width = 800, - Height = 1131, - BackgroundColorHex = "#FFFFFF", - HeaderLeft = "Science Visual Notes Series", - HeaderCenter = "General Science • Chemistry & Thermal Physics", - HeaderRight = "Topic: Matter & Phase Change", - FooterLeft = "Comparative Study of Three States of Matter", - FooterCenter = "Authorized Educational Study Notes", - FooterRight = "Page 1 of 2", - Elements = new List - { - // Top Brand Stripe - new PdfShapeElement - { - X = 0, Y = 0, Width = 800, Height = 8, - FillColorHex = "#0284C7", StrokeColorHex = "#00000000" - }, - - // Title Banner Box - new PdfShapeElement - { - X = 40, Y = 35, Width = 720, Height = 80, - CornerRadius = 8, FillColorHex = "#F0F9FF", - StrokeColorHex = "#BAE6FD", StrokeThickness = 1.5 - }, - new PdfTextElement - { - X = 55, Y = 45, Width = 690, Height = 28, - Text = "Interconversion of States of Matter • ठोस, द्रव और गैस का परस्पर परिवर्तन", - FontSize = 16, IsBold = true, TextColorHex = "#0369A1", - FontFamily = "Noto Sans Devanagari" - }, - new PdfTextElement - { - X = 55, Y = 75, Width = 690, Height = 22, - Text = "A Comprehensive Study on Phase Transitions, Latent Heat, and Kinetic Particle Theory", - FontSize = 10.5, IsItalic = true, TextColorHex = "#0284C7", - FontFamily = "Inter" - }, - - // Section 1 Header: Triangular Cycle - new PdfShapeElement - { - X = 40, Y = 125, Width = 720, Height = 26, - CornerRadius = 4, FillColorHex = "#0F172A", - StrokeColorHex = "#00000000" - }, - new PdfTextElement - { - X = 50, Y = 130, Width = 700, Height = 18, - Text = "1. TRIANGULAR INTERCONVERSION DIAGRAM (त्रिभुजीय परिवर्तन चक्र)", - FontSize = 10.5, IsBold = true, TextColorHex = "#FFFFFF", - FontFamily = "Noto Sans Devanagari" - }, - - // Triangular Phase Change Vector Diagram - new PdfSvgElement - { - X = 50, Y = 160, Width = 700, Height = 350, - SvgSource = SvgOrnamentLibrary.GetTriangularPhaseCycleSvg(), - PresetName = "Triangular Phase Cycle" - }, - - // Phase Transition Explanatory Box - new PdfShapeElement - { - X = 40, Y = 525, Width = 720, Height = 75, - CornerRadius = 6, FillColorHex = "#F8FAFC", - StrokeColorHex = "#CBD5E1", StrokeThickness = 1 - }, - new PdfTextElement - { - X = 55, Y = 533, Width = 690, Height = 60, - Text = "• Melting (गलनांक): Change of solid into liquid by heating.\n• Freezing (हिमीकरण): Liquid changing into solid upon cooling.\n• Vaporization (वाष्पीकरण): Liquid converting to vapor phase.\n• Condensation (संघनन): Gas cooling to liquid phase.\n• Sublimation (ऊर्ध्वपातन): Direct transition of solid to gas without entering liquid state (e.g. Camphor, Dry Ice).\n• Deposition (निक्षेपण): Direct change of gas into solid without becoming a liquid (e.g. Frost formation).", - FontSize = 9.5, TextColorHex = "#334155", - FontFamily = "Noto Sans Devanagari" - }, - - // Section 2 Header: Particle Lattice Models - new PdfShapeElement - { - X = 40, Y = 615, Width = 720, Height = 26, - CornerRadius = 4, FillColorHex = "#0F172A", - StrokeColorHex = "#00000000" - }, - new PdfTextElement - { - X = 50, Y = 620, Width = 700, Height = 18, - Text = "2. PARTICLE ARRANGEMENT & MOLECULAR PACKING (कणों की व्यवस्था)", - FontSize = 10.5, IsBold = true, TextColorHex = "#FFFFFF", - FontFamily = "Noto Sans Devanagari" - }, - - // Particle Arrangement Vector Grid - new PdfSvgElement - { - X = 50, Y = 650, Width = 700, Height = 175, - SvgSource = SvgOrnamentLibrary.GetParticleArrangementGridSvg(), - PresetName = "Particle Arrangement" - }, - - // Key Takeaway Card - new PdfShapeElement - { - X = 40, Y = 840, Width = 720, Height = 65, - CornerRadius = 6, FillColorHex = "#FFFBEB", - StrokeColorHex = "#FDE68A", StrokeThickness = 1.5 - }, - new PdfTextElement - { - X = 55, Y = 848, Width = 690, Height = 18, - Text = "KEY THERMODYNAMIC TAKEAWAY (मुख्य निष्कर्ष):", - FontSize = 10.5, IsBold = true, TextColorHex = "#92400E", - FontFamily = "Noto Sans Devanagari" - }, - new PdfTextElement - { - X = 55, Y = 870, Width = 690, Height = 25, - Text = "During phase transitions, temperature remains constant despite heat absorption due to Latent Heat (गुप्त ऊष्मा), which is consumed in breaking intermolecular bonds rather than increasing kinetic energy.", - FontSize = 9.5, TextColorHex = "#78350F", - FontFamily = "Inter" - } - } - }; - - // ========================================================================= - // PAGE 2: Comparison Table & Conceptual Q&A - // ========================================================================= - var page2 = new PdfPageModel - { - PageNumber = 2, - Format = PageFormat.A4, - Orientation = PageOrientation.Portrait, - Width = 800, - Height = 1131, - BackgroundColorHex = "#FFFFFF", - HeaderLeft = "Science Visual Notes Series", - HeaderCenter = "Properties Comparison & Conceptual Q&A", - HeaderRight = "Topic: Matter & Phase Change", - FooterLeft = "Comparative Study of Three States of Matter", - FooterCenter = "Authorized Educational Study Notes", - FooterRight = "Page 2 of 2", - Elements = new List - { - new PdfShapeElement - { - X = 0, Y = 0, Width = 800, Height = 8, - FillColorHex = "#0284C7", StrokeColorHex = "#00000000" - }, - - // Section 3 Header: Comparison Table - new PdfShapeElement - { - X = 40, Y = 35, Width = 720, Height = 26, - CornerRadius = 4, FillColorHex = "#0F172A", - StrokeColorHex = "#00000000" - }, - new PdfTextElement - { - X = 50, Y = 40, Width = 700, Height = 18, - Text = "3. COMPARATIVE STUDY TABLE (पदार्थ के तीनों अवस्थाओं का तुलनात्मक अध्ययन)", - FontSize = 10.5, IsBold = true, TextColorHex = "#FFFFFF", - FontFamily = "Noto Sans Devanagari" - }, - - // Comparison Table - new PdfTableElement - { - X = 40, Y = 70, Width = 720, Height = 340, - HeaderBackgroundHex = "#0284C7", - HeaderTextHex = "#FFFFFF", - BorderColorHex = "#CBD5E1", - AlternateRowBackgroundHex = "#F0F9FF", - Headers = new List { "Properties (गुण)", "Solid (ठोस)", "Liquid (द्रव)", "Gaseous (गैस)" }, - Rows = new List> - { - new() { "Shape (आकार)", "निश्चित आकार (Fixed Shape)", "अनिश्चित आकार (Takes container shape)", "अनिश्चित आकार (Indefinite)" }, - new() { "Volume (आयतन)", "निश्चित आयतन (Fixed Volume)", "निश्चित आयतन (Definite Volume)", "अनिश्चित आयतन (Indefinite Volume)" }, - new() { "Compressibility (संपीड्यता)", "नगण्य (Negligible)", "बहुत कम (Very Low)", "अत्यधिक उच्च (Highly Compressible)" }, - new() { "Intermolecular Force (आकर्षण बल)", "प्रबलतम (Strongest)", "मध्यम (Intermediate)", "नगण्य (Negligible / Weakest)" }, - new() { "Intermolecular Space (रिक्त स्थान)", "न्यूनतम (Minimum)", "मध्यम (Intermediate)", "अधिकतम (Maximum)" }, - new() { "Kinetic Energy (गतिज ऊर्जा)", "न्यूनतम (Minimum)", "मध्यम (Intermediate)", "अधिकतम (Maximum)" }, - new() { "Fluidity / Rigidity (प्रवाह)", "दृढ़ (Rigid, Cannot flow)", "प्रवाही (Fluid, Flows downwards)", "प्रवाही (Diffuses in all directions)" }, - new() { "Density (घनत्व)", "उच्च (High)", "मध्यम (Moderate)", "अति निम्न (Very Low)" } - } - }, - - // Section 4 Header: Conceptual Q&A - new PdfShapeElement - { - X = 40, Y = 430, Width = 720, Height = 26, - CornerRadius = 4, FillColorHex = "#0F172A", - StrokeColorHex = "#00000000" - }, - new PdfTextElement - { - X = 50, Y = 435, Width = 700, Height = 18, - Text = "4. CONCEPTUAL QUESTIONS & REASONING (अवधारणात्मक प्रश्न एवं वैज्ञानिक व्याख्या)", - FontSize = 10.5, IsBold = true, TextColorHex = "#FFFFFF", - FontFamily = "Noto Sans Devanagari" - }, - - // Q1 Card - new PdfShapeElement { X = 40, Y = 465, Width = 720, Height = 80, CornerRadius = 6, FillColorHex = "#F8FAFC", StrokeColorHex = "#E2E8F0", StrokeThickness = 1 }, - new PdfTextElement - { - X = 55, Y = 472, Width = 690, Height = 22, - Text = "Q1. Why does ice float on water despite being a solid? (ठोस होने पर भी बर्फ पानी पर क्यों तैरती है?)", - FontSize = 10.5, IsBold = true, TextColorHex = "#0369A1", - FontFamily = "Noto Sans Devanagari" - }, - new PdfTextElement - { - X = 55, Y = 496, Width = 690, Height = 42, - Text = "Answer: Ice has a 3D cage-like hexagonal crystal structure due to hydrogen bonding with vacant spaces trapped inside. Consequently, its density is lower than that of liquid water (0.917 g/cm³ vs 1.0 g/cm³), allowing ice to float.", - FontSize = 9.5, TextColorHex = "#334155", - FontFamily = "Inter" - }, - - // Q2 Card - new PdfShapeElement { X = 40, Y = 555, Width = 720, Height = 80, CornerRadius = 6, FillColorHex = "#F8FAFC", StrokeColorHex = "#E2E8F0", StrokeThickness = 1 }, - new PdfTextElement - { - X = 55, Y = 562, Width = 690, Height = 22, - Text = "Q2. Why does steam cause more severe burns than boiling water at 100\u00b0C? (100\u00b0C पर भाप अधिक जलन क्यों पैदा करती है?)", - FontSize = 10.5, IsBold = true, TextColorHex = "#0369A1", - FontFamily = "Noto Sans Devanagari" - }, - new PdfTextElement - { - X = 55, Y = 586, Width = 690, Height = 42, - Text = "Answer: Steam at 100\u00b0C contains an additional 22.6 \u00d7 10\u2075 J/kg of energy stored as Latent Heat of Vaporization (वाष्पीकरण की गुप्त ऊष्मा). When steam condenses upon touching the skin, it releases this extra latent energy before cooling.", - FontSize = 9.5, TextColorHex = "#334155", - FontFamily = "Inter" - }, - - // Q3 Card - new PdfShapeElement { X = 40, Y = 645, Width = 720, Height = 80, CornerRadius = 6, FillColorHex = "#F8FAFC", StrokeColorHex = "#E2E8F0", StrokeThickness = 1 }, - new PdfTextElement - { - X = 55, Y = 652, Width = 690, Height = 22, - Text = "Q3. Why do camphor and dry ice directly sublime without melting? (कपूर और शुष्क बर्फ सीधे वाष्प क्यों बन जाते हैं?)", - FontSize = 10.5, IsBold = true, TextColorHex = "#0369A1", - FontFamily = "Noto Sans Devanagari" - }, - new PdfTextElement - { - X = 55, Y = 676, Width = 690, Height = 42, - Text = "Answer: The vapor pressure of solid CO\u2082 (dry ice) and camphor exceeds atmospheric pressure (1 atm) at room temperature. Because their triple-point pressure is higher than 1 atm, the liquid phase cannot exist stably at normal atmospheric pressure.", - FontSize = 9.5, TextColorHex = "#334155", - FontFamily = "Inter" - } - } - }; - - doc.Pages.Add(page1); - doc.Pages.Add(page2); - - return doc; - } -} diff --git a/src/PdfEditorApp/Templates/Events/CreativeTypographyShowcaseTemplate.cs b/src/PdfEditorApp/Templates/Events/CreativeTypographyShowcaseTemplate.cs deleted file mode 100644 index d9fe4e7..0000000 --- a/src/PdfEditorApp/Templates/Events/CreativeTypographyShowcaseTemplate.cs +++ /dev/null @@ -1,781 +0,0 @@ -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; - -namespace PdfEditorApp.Templates.Events; - -/// -/// Professional Showcase Poster demonstrating Bézier curved typography, text outlines, -/// drop shadows, custom kerning/tracking, decorative wave dividers, curved connectors, -/// and Catmull-Rom smooth calligraphic ink signatures. -/// -public class CreativeTypographyShowcaseTemplate : ITemplateDefinition -{ - public string Id => "typographyshowcase"; - public string Name => "Bézier Arts & Typography Specimen"; - public string Description => "Executive creative showcase featuring Bézier wave typography, text outlines, drop shadows, decorative wave dividers, and smooth ink signatures"; - public string Category => "Design & Creative"; - public string IconKind => "FormatTextVariantOutline"; - public string AccentColorHex => "#6366F1"; - - public PdfDocumentModel Create() - { - return GenerateDocument(); - } - - public static PdfDocumentModel GenerateDocument() - { - var doc = new PdfDocumentModel - { - Title = "Bezier_Typography_Creative_Showcase.pdf", - Author = "CodeFryDev Typography Institute", - Subject = "Official Specimen & Showcase of Bézier Curve Typography & Vector Arts" - }; - - var page = new PdfPageModel - { - PageNumber = 1, - Format = PageFormat.A4, - Orientation = PageOrientation.Portrait, - Width = 595.28, - Height = 841.89, - BackgroundColorHex = "#0B0F19", - ShowHeaderFooter = false - }; - - // ========================================== - // 1. BACKGROUND CANVAS & AMBIENT ORGANIC ART - // ========================================== - - // Main Obsidian Card Container - page.Elements.Add(new PdfShapeElement - { - X = 0, - Y = 0, - Width = 595.28, - Height = 841.89, - ShapeType = ShapeType.Rectangle, - FillColorHex = "#0B0F19", - StrokeColorHex = "#1E293B", - StrokeThickness = 2.0, - ZIndex = 0 - }); - - // Top-Right Ambient Organic Blob (Deep Indigo Accent) - page.Elements.Add(new PdfShapeElement - { - X = 350, - Y = -20, - Width = 270, - Height = 220, - ShapeType = ShapeType.OrganicBlob, - FillColorHex = "#1E1B4B", - StrokeColorHex = "#312E81", - StrokeThickness = 1.0, - Opacity = 0.45, - ZIndex = 1 - }); - - // Bottom-Left Ambient Wave Ribbon (Midnight Teal Accent) - page.Elements.Add(new PdfShapeElement - { - X = -40, - Y = 720, - Width = 340, - Height = 140, - ShapeType = ShapeType.WaveRibbon, - FillColorHex = "#064E3B", - StrokeColorHex = "#065F46", - StrokeThickness = 1.0, - Opacity = 0.35, - ZIndex = 1 - }); - - // ========================================== - // 2. HERO HEADER & BÉZIER CURVED TYPOGRAPHY - // ========================================== - - // Top Tag Badge with Background Box & Character Tracking - page.Elements.Add(new PdfTextElement - { - Text = "✦ INTERNATIONAL TYPOGRAPHY & VECTOR ARTS SHOWCASE 2026 ✦", - FontFamily = "Montserrat", - FontSize = 8.5, - IsBold = true, - TextColorHex = "#818CF8", - Alignment = TextAlignmentMode.Center, - CharacterSpacing = 2.2, - BackgroundColorHex = "#1E1B4B", - BorderColorHex = "#4F46E5", - BorderThickness = 1.0, - CornerRadius = 12, - Padding = 6, - X = 65, - Y = 28, - Width = 465, - Height = 26, - ZIndex = 5 - }); - - // Hero Bézier Wave Curve Typography - page.Elements.Add(new PdfTextElement - { - Text = "SYMPHONY OF BÉZIER CURVES & TYPOGRAPHY", - FontFamily = "Cinzel", - FontSize = 20, - IsBold = true, - TextColorHex = "#F8FAFC", - ShapeMode = TextShapeMode.BezierCurve, - BezierPreset = BezierCurvePreset.Wave, - CharacterSpacing = 2.0, - HasShadow = true, - ShadowColorHex = "#80000000", - ShadowOffsetX = 2, - ShadowOffsetY = 3, - ShadowBlurRadius = 5, - HasStroke = true, - StrokeColorHex = "#6366F1", - StrokeWidth = 0.8, - X = 40, - Y = 62, - Width = 515, - Height = 72, - ZIndex = 6 - }); - - // Curved Bridge Arc Subtitle - page.Elements.Add(new PdfTextElement - { - Text = "EXPLORING MATHEMATICAL SPLINES, CALLIGRAPHY & ADVANCED TEXT MANIPULATION", - FontFamily = "Montserrat", - FontSize = 8.0, - IsBold = true, - TextColorHex = "#F59E0B", - ShapeMode = TextShapeMode.BezierCurve, - BezierPreset = BezierCurvePreset.Bridge, - CharacterSpacing = 2.0, - X = 50, - Y = 135, - Width = 495, - Height = 35, - ZIndex = 7 - }); - - // Calligraphic Flourish Gold Divider - page.Elements.Add(new PdfDividerElement - { - X = 50, - Y = 170, - Width = 495, - Height = 22, - Style = DividerStyle.CalligraphicFlourish, - WaveAmplitude = 6.0, - Thickness = 1.8, - ColorHex = "#D97706", - ZIndex = 8 - }); - - // ========================================== - // 3. LEFT COLUMN: TYPOGRAPHY ENGINE CARD - // ========================================== - - // Card Container - page.Elements.Add(new PdfShapeElement - { - X = 48, - Y = 198, - Width = 240, - Height = 252, - ShapeType = ShapeType.RoundedRectangle, - CornerRadius = 8, - FillColorHex = "#0F172A", - StrokeColorHex = "#334155", - StrokeThickness = 1.2, - ZIndex = 10 - }); - - // Card Header Title - page.Elements.Add(new PdfTextElement - { - Text = "01. ADVANCED TYPOGRAPHY", - FontFamily = "Montserrat", - FontSize = 9.5, - IsBold = true, - TextColorHex = "#38BDF8", - CharacterSpacing = 1.5, - X = 60, - Y = 210, - Width = 216, - Height = 18, - ZIndex = 11 - }); - - // Drop Shadow Text Demonstration - page.Elements.Add(new PdfTextElement - { - Text = "ELEGANT DROP SHADOWS", - FontFamily = "Playfair Display", - FontSize = 13, - IsBold = true, - TextColorHex = "#FFFFFF", - HasShadow = true, - ShadowColorHex = "#4F46E5", - ShadowOffsetX = 2, - ShadowOffsetY = 3, - ShadowBlurRadius = 4, - X = 60, - Y = 232, - Width = 216, - Height = 24, - ZIndex = 12 - }); - - // Hollow Outline Stroke Text Demonstration - page.Elements.Add(new PdfTextElement - { - Text = "HOLLOW OUTLINE STROKE", - FontFamily = "Cinzel", - FontSize = 12, - IsBold = true, - TextColorHex = "#0F172A", - HasStroke = true, - StrokeColorHex = "#A855F7", - StrokeWidth = 1.2, - X = 60, - Y = 262, - Width = 216, - Height = 22, - ZIndex = 13 - }); - - // Paragraph Formatting, Word Wrapping & Spacing Demonstration - page.Elements.Add(new PdfTextElement - { - Text = "Full typography layout engine with dynamic tracking, word wrapping, 1.4x line multipliers, and per-glyph arc-length parameterization.", - FontFamily = "Inter", - FontSize = 8.2, - TextColorHex = "#94A3B8", - LineHeight = 1.35, - X = 60, - Y = 292, - Width = 216, - Height = 50, - ZIndex = 14 - }); - - // Kerning & Tracking Badge - page.Elements.Add(new PdfTextElement - { - Text = "TRACKING & KERNING: +2.5 PT", - FontFamily = "Fira Code", - FontSize = 7.5, - IsBold = true, - TextColorHex = "#10B981", - CharacterSpacing = 1.5, - BackgroundColorHex = "#064E3B", - BorderColorHex = "#059669", - BorderThickness = 1.0, - CornerRadius = 4, - Padding = 4, - X = 60, - Y = 352, - Width = 216, - Height = 22, - ZIndex = 15 - }); - - // Wave Sub-divider inside Left Card - page.Elements.Add(new PdfDividerElement - { - X = 60, - Y = 382, - Width = 216, - Height = 12, - Style = DividerStyle.Wave, - WaveAmplitude = 3.0, - WaveFrequency = 4.0, - Thickness = 1.0, - ColorHex = "#38BDF8", - ZIndex = 16 - }); - - // Left Card Footer - page.Elements.Add(new PdfTextElement - { - Text = "✔ 100% Vector Quality at Any PDF Scale", - FontFamily = "Inter", - FontSize = 7.5, - IsBold = true, - TextColorHex = "#38BDF8", - X = 60, - Y = 402, - Width = 216, - Height = 18, - ZIndex = 17 - }); - - // ========================================== - // 4. RIGHT COLUMN: BÉZIER VECTOR SHAPES CARD - // ========================================== - - // Card Container - page.Elements.Add(new PdfShapeElement - { - X = 307, - Y = 198, - Width = 240, - Height = 252, - ShapeType = ShapeType.RoundedRectangle, - CornerRadius = 8, - FillColorHex = "#0F172A", - StrokeColorHex = "#334155", - StrokeThickness = 1.2, - ZIndex = 10 - }); - - // Card Header Title - page.Elements.Add(new PdfTextElement - { - Text = "02. BÉZIER VECTOR GRAPHICS", - FontFamily = "Montserrat", - FontSize = 9.5, - IsBold = true, - TextColorHex = "#EC4899", - CharacterSpacing = 1.5, - X = 319, - Y = 210, - Width = 216, - Height = 18, - ZIndex = 11 - }); - - // Medal Ribbon Badge Seal - page.Elements.Add(new PdfShapeElement - { - X = 318, - Y = 236, - Width = 62, - Height = 62, - ShapeType = ShapeType.MedalRibbonBadge, - FillColorHex = "#F59E0B", - SecondaryFillColorHex = "#990000", - StrokeColorHex = "#B45309", - StrokeThickness = 1.5, - Label = "GOLD 2026", - LabelFontSize = 7.5, - LabelColorHex = "#78350F", - ZIndex = 12 - }); - - // Curved Speech Callout Bubble - page.Elements.Add(new PdfShapeElement - { - X = 390, - Y = 236, - Width = 145, - Height = 58, - ShapeType = ShapeType.CurvedCallout, - FillColorHex = "#1E1B4B", - StrokeColorHex = "#6366F1", - StrokeThickness = 1.2, - Label = "Cubic Spline Math", - LabelFontSize = 8.5, - LabelColorHex = "#E0E7FF", - ZIndex = 13 - }); - - // Curved Arrow Demonstration - page.Elements.Add(new PdfShapeElement - { - X = 318, - Y = 308, - Width = 90, - Height = 36, - ShapeType = ShapeType.CurvedArrow, - StrokeColorHex = "#F43F5E", - StrokeThickness = 2.0, - EndCap = LineEndCap.Arrow, - ZIndex = 14 - }); - - // S-Curve Connector with Dashes - page.Elements.Add(new PdfShapeElement - { - X = 422, - Y = 312, - Width = 110, - Height = 30, - ShapeType = ShapeType.SCurveConnector, - StrokeColorHex = "#38BDF8", - StrokeThickness = 1.8, - DashStyle = LineDashStyle.Dashed, - ZIndex = 15 - }); - - // Calligraphic Curly Brace - page.Elements.Add(new PdfShapeElement - { - X = 318, - Y = 356, - Width = 24, - Height = 62, - ShapeType = ShapeType.CurlyBrace, - StrokeColorHex = "#FCD34D", - StrokeThickness = 1.8, - ZIndex = 16 - }); - - // Grouped Feature Description next to Brace - page.Elements.Add(new PdfTextElement - { - Text = "Smooth C¹ Tangents\nHarmonic Wave Cycles\nParametric Endcaps", - FontFamily = "Inter", - FontSize = 8.0, - TextColorHex = "#CBD5E1", - LineHeight = 1.3, - X = 348, - Y = 362, - Width = 185, - Height = 52, - ZIndex = 17 - }); - - // ========================================== - // 5. MIDDLE HARMONIC WAVE DIVIDER - // ========================================== - - page.Elements.Add(new PdfDividerElement - { - X = 50, - Y = 460, - Width = 495, - Height = 22, - Style = DividerStyle.DoubleWave, - WaveAmplitude = 5.5, - WaveFrequency = 6.0, - Thickness = 1.5, - ColorHex = "#6366F1", - ZIndex = 20 - }); - - // ========================================== - // 6. MASTERCLASSES & SCHEDULE SECTION - // ========================================== - - // Container Card - page.Elements.Add(new PdfShapeElement - { - X = 48, - Y = 490, - Width = 499, - Height = 175, - ShapeType = ShapeType.RoundedRectangle, - CornerRadius = 8, - FillColorHex = "#0F172A", - StrokeColorHex = "#334155", - StrokeThickness = 1.2, - ZIndex = 21 - }); - - // Section Title - page.Elements.Add(new PdfTextElement - { - Text = "FEATURED SYMPOSIUM SESSIONS & MASTERCLASSES", - FontFamily = "Cinzel", - FontSize = 11, - IsBold = true, - TextColorHex = "#F8FAFC", - Alignment = TextAlignmentMode.Center, - CharacterSpacing = 1.2, - X = 60, - Y = 500, - Width = 475, - Height = 18, - ZIndex = 22 - }); - - // Session 1 (Left) - page.Elements.Add(new PdfTextElement - { - Text = "10:00 AM • STAGE A", - FontFamily = "Montserrat", - FontSize = 7.5, - IsBold = true, - TextColorHex = "#38BDF8", - BackgroundColorHex = "#0C4A6E", - BorderColorHex = "#0284C7", - BorderThickness = 1.0, - CornerRadius = 3, - Padding = 3, - X = 62, - Y = 526, - Width = 115, - Height = 18, - ZIndex = 23 - }); - - page.Elements.Add(new PdfTextElement - { - Text = "Mathematical Foundations of Bézier Warping", - FontFamily = "Playfair Display", - FontSize = 10, - IsBold = true, - TextColorHex = "#FFFFFF", - X = 62, - Y = 548, - Width = 220, - Height = 18, - ZIndex = 24 - }); - - page.Elements.Add(new PdfTextElement - { - Text = "Dr. Jane Doe — Senior Computational Typographer", - FontFamily = "Inter", - FontSize = 7.8, - TextColorHex = "#94A3B8", - X = 62, - Y = 566, - Width = 220, - Height = 18, - ZIndex = 25 - }); - - // Session 2 (Right) - page.Elements.Add(new PdfTextElement - { - Text = "02:30 PM • STAGE B", - FontFamily = "Montserrat", - FontSize = 7.5, - IsBold = true, - TextColorHex = "#F472B6", - BackgroundColorHex = "#831843", - BorderColorHex = "#DB2777", - BorderThickness = 1.0, - CornerRadius = 3, - Padding = 3, - X = 308, - Y = 526, - Width = 115, - Height = 18, - ZIndex = 23 - }); - - page.Elements.Add(new PdfTextElement - { - Text = "Calligraphic Curves & Catmull-Rom Splines", - FontFamily = "Playfair Display", - FontSize = 10, - IsBold = true, - TextColorHex = "#FFFFFF", - X = 308, - Y = 548, - Width = 225, - Height = 18, - ZIndex = 24 - }); - - page.Elements.Add(new PdfTextElement - { - Text = "Prof. John Doe — Director of Vector Arts Institute", - FontFamily = "Inter", - FontSize = 7.8, - TextColorHex = "#94A3B8", - X = 308, - Y = 566, - Width = 225, - Height = 18, - ZIndex = 25 - }); - - // Wave Accent Line inside Schedule Card - page.Elements.Add(new PdfShapeElement - { - X = 62, - Y = 594, - Width = 471, - Height = 12, - ShapeType = ShapeType.WaveLine, - StrokeColorHex = "#4F46E5", - StrokeThickness = 1.0, - ZIndex = 26 - }); - - // Footer Note in Schedule Card - page.Elements.Add(new PdfTextElement - { - Text = "✦ All sessions include live hands-on Bézier text and curve manipulation workshops ✦", - FontFamily = "Inter", - FontSize = 7.8, - IsItalic = true, - TextColorHex = "#64748B", - Alignment = TextAlignmentMode.Center, - X = 62, - Y = 614, - Width = 471, - Height = 18, - ZIndex = 27 - }); - - // ========================================== - // 7. BOTTOM VERIFICATION & FREEHAND INK - // ========================================== - - // Arch Gold Rule - page.Elements.Add(new PdfDividerElement - { - X = 50, - Y = 675, - Width = 495, - Height = 16, - Style = DividerStyle.Arch, - WaveAmplitude = 5.0, - Thickness = 1.5, - ColorHex = "#D97706", - ZIndex = 30 - }); - - // QR Code Verification - page.Elements.Add(new PdfQrCodeElement - { - X = 60, - Y = 698, - Width = 68, - Height = 68, - Content = "https://codefrydev.in/showcase/bezier-typography-2026", - DarkColorHex = "#F8FAFC", - LightColorHex = "#0B0F19", - ZIndex = 31 - }); - - page.Elements.Add(new PdfTextElement - { - Text = "SCAN TO VERIFY\nVECTOR ASSETS", - FontFamily = "Montserrat", - FontSize = 6.0, - IsBold = true, - TextColorHex = "#64748B", - Alignment = TextAlignmentMode.Center, - X = 50, - Y = 770, - Width = 88, - Height = 22, - ZIndex = 32 - }); - - // Jury Header - page.Elements.Add(new PdfTextElement - { - Text = "EXECUTIVE CURATORS & TYPOGRAPHY JURY CERTIFICATION", - FontFamily = "Montserrat", - FontSize = 7.8, - IsBold = true, - TextColorHex = "#94A3B8", - CharacterSpacing = 1.2, - X = 175, - Y = 698, - Width = 370, - Height = 18, - ZIndex = 33 - }); - - // Signer 1: Smooth Ink Signature (Jane Doe) - page.Elements.Add(new PdfInkElement - { - X = 175, - Y = 716, - Width = 145, - Height = 40, - PointsData = "175,745 195,725 215,750 235,722 255,746 280,728 305,755", - StrokeColorHex = "#38BDF8", - StrokeThickness = 2.2, - Opacity = 0.95, - IsSmoothSpline = true, - ZIndex = 34 - }); - - page.Elements.Add(new PdfDividerElement - { - X = 175, - Y = 758, - Width = 145, - Height = 4, - Style = DividerStyle.Straight, - Thickness = 1.0, - ColorHex = "#475569", - ZIndex = 35 - }); - - page.Elements.Add(new PdfTextElement - { - Text = "Dr. Jane Doe\nLead Typographer & Jury Chair", - FontFamily = "Inter", - FontSize = 7.0, - TextColorHex = "#94A3B8", - X = 175, - Y = 766, - Width = 145, - Height = 22, - ZIndex = 36 - }); - - // Signer 2: Smooth Ink Signature (John Doe) - page.Elements.Add(new PdfInkElement - { - X = 355, - Y = 716, - Width = 145, - Height = 40, - PointsData = "355,748 375,726 395,752 420,724 445,750 475,732", - StrokeColorHex = "#F472B6", - StrokeThickness = 2.2, - Opacity = 0.95, - IsSmoothSpline = true, - ZIndex = 34 - }); - - page.Elements.Add(new PdfDividerElement - { - X = 355, - Y = 758, - Width = 145, - Height = 4, - Style = DividerStyle.Straight, - Thickness = 1.0, - ColorHex = "#475569", - ZIndex = 35 - }); - - page.Elements.Add(new PdfTextElement - { - Text = "Prof. John Doe\nDirector of Vector Arts Institute", - FontFamily = "Inter", - FontSize = 7.0, - TextColorHex = "#94A3B8", - X = 355, - Y = 766, - Width = 145, - Height = 22, - ZIndex = 36 - }); - - // Final Bottom Subtle Brand Footnote - page.Elements.Add(new PdfTextElement - { - Text = "DESIGNED WITH ADVANCED BÉZIER VECTOR & TYPOGRAPHY ENGINE • PURE VECTOR PDF EXPORT", - FontFamily = "Montserrat", - FontSize = 6.2, - IsBold = true, - TextColorHex = "#475569", - Alignment = TextAlignmentMode.Center, - CharacterSpacing = 1.5, - X = 40, - Y = 812, - Width = 515, - Height = 18, - ZIndex = 40 - }); - - doc.Pages.Add(page); - return doc; - } -} diff --git a/src/PdfEditorApp/Templates/Events/GalaInvitationTemplate.cs b/src/PdfEditorApp/Templates/Events/GalaInvitationTemplate.cs deleted file mode 100644 index 0b564be..0000000 --- a/src/PdfEditorApp/Templates/Events/GalaInvitationTemplate.cs +++ /dev/null @@ -1,264 +0,0 @@ -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; -using PdfEditorApp.Services; - -namespace PdfEditorApp.Templates.Events; - -/// -/// High-end Corporate Gala & Charity Award Night Invitation with Gold Art Deco styling. -/// -public class GalaInvitationTemplate : ITemplateDefinition -{ - public string Id => "galainvitation"; - public string Name => "Charity Gala & Award Night Invitation"; - public string Description => "Black-tie executive event with gold Art Deco geometric frame, schedule, and VIP RSVP QR Code"; - public string Category => "Events & Invitations"; - public string IconKind => "TicketConfirmationOutline"; - public string AccentColorHex => "#F59E0B"; - - public PdfDocumentModel Create() - { - return GenerateDocument(); - } - - public static PdfDocumentModel GenerateDocument() - { - var doc = new PdfDocumentModel - { - Title = "Annual_Charity_Gala_Invitation.pdf", - Author = "CodeFryDev Foundation", - Subject = "Annual Charity Gala & Award Night" - }; - - var page = new PdfPageModel - { - Width = 600, - Height = 850, - Orientation = PageOrientation.Portrait, - ShowHeaderFooter = false - }; - - // 1. Sleek Midnight Obsidian Background - page.Elements.Add(new PdfShapeElement - { - ShapeType = ShapeType.Rectangle, - X = 0, - Y = 0, - Width = 600, - Height = 850, - FillColorHex = "#0B0F19", // Deep obsidian navy - StrokeColorHex = "#D97706", - StrokeThickness = 2.0, - ZIndex = 0 - }); - - // 2. Art Deco Gold Frame - page.Elements.Add(new PdfSvgElement - { - PresetName = "ArtDecoFrame", - SvgSource = SvgOrnamentLibrary.GetArtDecoFrameSvg("#D97706"), - X = 20, - Y = 20, - Width = 560, - Height = 810, - ZIndex = 1 - }); - - // 3. Organization Host - page.Elements.Add(new PdfTextElement - { - Text = "THE CODEFRYDEV FOUNDATION CORDIALLY INVITES YOU TO THE", - FontFamily = "Montserrat", - FontSize = 9.5, - IsBold = true, - TextColorHex = "#9CA3AF", - Alignment = TextAlignmentMode.Center, - X = 50, - Y = 80, - Width = 500, - Height = 22, - ZIndex = 5 - }); - - // 4. Main Event Title - page.Elements.Add(new PdfTextElement - { - Text = "ANNUAL CHARITY\nGALA & AWARDS", - FontFamily = "Cinzel", - FontSize = 32, - IsBold = true, - TextColorHex = "#F59E0B", - Alignment = TextAlignmentMode.Center, - X = 50, - Y = 110, - Width = 500, - Height = 90, - ZIndex = 6 - }); - - // 5. Year & Theme Subtitle - page.Elements.Add(new PdfTextElement - { - Text = "— NIGHT OF ILLUMINATION 2026 —", - FontFamily = "Montserrat", - FontSize = 11, - IsBold = true, - TextColorHex = "#E5E7EB", - Alignment = TextAlignmentMode.Center, - X = 50, - Y = 205, - Width = 500, - Height = 22, - ZIndex = 6 - }); - - // 6. Gold Laurel Seal Emblem - page.Elements.Add(new PdfShapeElement - { - ShapeType = ShapeType.LaurelWreathSeal, - X = 260, - Y = 240, - Width = 80, - Height = 80, - FillColorHex = "#F59E0B", - StrokeColorHex = "#78350F", - StrokeThickness = 2.0, - ZIndex = 6 - }); - - // 7. Event Highlights & Keynote - page.Elements.Add(new PdfTextElement - { - Text = "AN EXCLUSIVE EVENING CELEBRATING GLOBAL HUMANITARIAN LEADERSHIP,\nFEATURING LIVE PHILHARMONIC ORCHESTRA & CHARITY AUCTION", - FontFamily = "Montserrat", - FontSize = 10, - IsBold = false, - TextColorHex = "#D1D5DB", - Alignment = TextAlignmentMode.Center, - X = 50, - Y = 340, - Width = 500, - Height = 44, - ZIndex = 6 - }); - - // 8. Schedule & Location Card - page.Elements.Add(new PdfShapeElement - { - ShapeType = ShapeType.RoundedRectangle, - X = 60, - Y = 400, - Width = 480, - Height = 180, - FillColorHex = "#111827", - StrokeColorHex = "#D97706", - StrokeThickness = 1.0, - CornerRadius = 8, - ZIndex = 5 - }); - - page.Elements.Add(new PdfTextElement - { - Text = "SATURDAY, NOVEMBER 14, 2026", - FontFamily = "Cinzel", - FontSize = 15, - IsBold = true, - TextColorHex = "#F59E0B", - Alignment = TextAlignmentMode.Center, - X = 70, - Y = 415, - Width = 460, - Height = 26, - ZIndex = 6 - }); - - page.Elements.Add(new PdfTextElement - { - Text = "6:00 PM Champagne Reception | 7:30 PM Three-Course Banquet & Awards\n9:30 PM Charity Auction & Live Jazz", - FontFamily = "Montserrat", - FontSize = 10, - IsBold = false, - TextColorHex = "#E5E7EB", - Alignment = TextAlignmentMode.Center, - X = 70, - Y = 445, - Width = 460, - Height = 40, - ZIndex = 6 - }); - - page.Elements.Add(new PdfDividerElement - { - Thickness = 1, - ColorHex = "#374151", - X = 100, - Y = 490, - Width = 400, - Height = 1, - ZIndex = 6 - }); - - page.Elements.Add(new PdfTextElement - { - Text = "THE METROPOLITAN OPERA HALL\n150 LINCOLN CENTER PLAZA, NEW YORK, NY", - FontFamily = "Cinzel", - FontSize = 12, - IsBold = true, - TextColorHex = "#F3F4F6", - Alignment = TextAlignmentMode.Center, - X = 70, - Y = 505, - Width = 460, - Height = 40, - ZIndex = 6 - }); - - page.Elements.Add(new PdfTextElement - { - Text = "DRESS CODE: BLACK TIE & EVENING GOWN", - FontFamily = "Montserrat", - FontSize = 10, - IsBold = true, - TextColorHex = "#F59E0B", - Alignment = TextAlignmentMode.Center, - X = 70, - Y = 548, - Width = 460, - Height = 22, - ZIndex = 6 - }); - - // 9. RSVP QR Code - page.Elements.Add(new PdfQrCodeElement - { - Content = "https://gala.codefrydev.in/rsvp/vip", - Label = "SCAN FOR VIP TABLE RESERVATION", - DarkColorHex = "#0B0F19", - LightColorHex = "#F59E0B", - X = 240, - Y = 610, - Width = 120, - Height = 140, - ZIndex = 7 - }); - - // 10. Footer Note - page.Elements.Add(new PdfTextElement - { - Text = "RSVP BY OCTOBER 15, 2026 • PROCEEDS BENEFIT GLOBAL CLEAN WATER INITIATIVE", - FontFamily = "Montserrat", - FontSize = 8.5, - IsBold = true, - TextColorHex = "#9CA3AF", - Alignment = TextAlignmentMode.Center, - X = 50, - Y = 770, - Width = 500, - Height = 22, - ZIndex = 6 - }); - - doc.Pages.Add(page); - return doc; - } -} diff --git a/src/PdfEditorApp/Templates/Events/WeddingInvitationRoyalFloralTemplate.cs b/src/PdfEditorApp/Templates/Events/WeddingInvitationRoyalFloralTemplate.cs deleted file mode 100644 index baac4ab..0000000 --- a/src/PdfEditorApp/Templates/Events/WeddingInvitationRoyalFloralTemplate.cs +++ /dev/null @@ -1,266 +0,0 @@ -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; -using PdfEditorApp.Services; - -namespace PdfEditorApp.Templates.Events; - -/// -/// Luxury Royal Botanical Floral Wedding Invitation with gold leaf wreath, cursive script, and RSVP block. -/// -public class WeddingInvitationRoyalFloralTemplate : ITemplateDefinition -{ - public string Id => "weddingroyalfloral"; - public string Name => "Royal Botanical Wedding Invitation"; - public string Description => "Luxury gold foil botanical laurel wreath, calligraphy couple script, and RSVP QR Code"; - public string Category => "Events & Invitations"; - public string IconKind => "FlowerTulipOutline"; - public string AccentColorHex => "#D97706"; - - public PdfDocumentModel Create() - { - return GenerateDocument(); - } - - public static PdfDocumentModel GenerateDocument() - { - var doc = new PdfDocumentModel - { - Title = "Wedding_Invitation_Royal_Floral.pdf", - Author = "CodeFryDev Events", - Subject = "Luxury Floral Wedding Invitation Card" - }; - - var page = new PdfPageModel - { - Width = 600, - Height = 850, - Orientation = PageOrientation.Portrait, - ShowHeaderFooter = false - }; - - // 1. Soft Linen White Background - page.Elements.Add(new PdfShapeElement - { - ShapeType = ShapeType.Rectangle, - X = 0, - Y = 0, - Width = 600, - Height = 850, - FillColorHex = "#FAFAFA", - StrokeColorHex = "#D97706", - StrokeThickness = 2.0, - ZIndex = 0 - }); - - // 2. Inner Double Gold Border - page.Elements.Add(new PdfShapeElement - { - ShapeType = ShapeType.Rectangle, - X = 18, - Y = 18, - Width = 564, - Height = 814, - FillColorHex = "#00000000", - StrokeColorHex = "#D97706", - StrokeThickness = 1.0, - ZIndex = 1 - }); - - // 3. Botanical Floral Wreath Monogram Crest at Top - page.Elements.Add(new PdfSvgElement - { - PresetName = "BotanicalWreath", - SvgSource = SvgOrnamentLibrary.GetBotanicalWreathSvg("#D97706", "#059669"), - X = 230, - Y = 40, - Width = 140, - Height = 140, - ZIndex = 4 - }); - - // Monogram Initial inside wreath - page.Elements.Add(new PdfTextElement - { - Text = "J & J", - FontFamily = "Great Vibes", - FontSize = 32, - IsBold = true, - TextColorHex = "#D97706", - Alignment = TextAlignmentMode.Center, - X = 230, - Y = 90, - Width = 140, - Height = 44, - ZIndex = 5 - }); - - // 4. Header Text - page.Elements.Add(new PdfTextElement - { - Text = "TOGETHER WITH THEIR FAMILIES", - FontFamily = "Montserrat", - FontSize = 11, - IsBold = true, - TextColorHex = "#6B7280", - Alignment = TextAlignmentMode.Center, - X = 50, - Y = 200, - Width = 500, - Height = 22, - ZIndex = 5 - }); - - // 5. Couple Names in Great Vibes Cursive Calligraphy - page.Elements.Add(new PdfTextElement - { - Text = "Jane Doe", - FontFamily = "Great Vibes", - FontSize = 48, - IsBold = true, - TextColorHex = "#1F2937", - Alignment = TextAlignmentMode.Center, - X = 50, - Y = 235, - Width = 500, - Height = 65, - ZIndex = 6 - }); - - page.Elements.Add(new PdfTextElement - { - Text = "and", - FontFamily = "Cinzel", - FontSize = 14, - IsItalic = true, - TextColorHex = "#D97706", - Alignment = TextAlignmentMode.Center, - X = 50, - Y = 300, - Width = 500, - Height = 24, - ZIndex = 6 - }); - - page.Elements.Add(new PdfTextElement - { - Text = "John Doe", - FontFamily = "Great Vibes", - FontSize = 48, - IsBold = true, - TextColorHex = "#1F2937", - Alignment = TextAlignmentMode.Center, - X = 50, - Y = 328, - Width = 500, - Height = 65, - ZIndex = 6 - }); - - // 6. Center Calligraphic Flourish - page.Elements.Add(new PdfSvgElement - { - PresetName = "CalligraphicFlourish", - SvgSource = SvgOrnamentLibrary.GetCalligraphicFlourishSvg("#D97706"), - X = 175, - Y = 395, - Width = 250, - Height = 35, - ZIndex = 6 - }); - - // 7. Request Line - page.Elements.Add(new PdfTextElement - { - Text = "REQUEST THE PLEASURE OF YOUR COMPANY\nAT THE CELEBRATION OF THEIR MARRIAGE", - FontFamily = "Montserrat", - FontSize = 11, - IsBold = true, - TextColorHex = "#4B5563", - Alignment = TextAlignmentMode.Center, - X = 50, - Y = 440, - Width = 500, - Height = 42, - ZIndex = 6 - }); - - // 8. Date & Time - page.Elements.Add(new PdfTextElement - { - Text = "SATURDAY, SEPTEMBER 19, 2026", - FontFamily = "Cinzel", - FontSize = 16, - IsBold = true, - TextColorHex = "#D97706", - Alignment = TextAlignmentMode.Center, - X = 50, - Y = 495, - Width = 500, - Height = 26, - ZIndex = 6 - }); - - page.Elements.Add(new PdfTextElement - { - Text = "AT FOUR O'CLOCK IN THE AFTERNOON", - FontFamily = "Montserrat", - FontSize = 11, - IsBold = false, - TextColorHex = "#374151", - Alignment = TextAlignmentMode.Center, - X = 50, - Y = 525, - Width = 500, - Height = 22, - ZIndex = 6 - }); - - // 9. Venue & Location - page.Elements.Add(new PdfTextElement - { - Text = "THE GRAND ORANGERIE ESTATE\n1042 HIGHLAND VALLEY ROAD\nNAPA VALLEY, CALIFORNIA", - FontFamily = "Cinzel", - FontSize = 12.5, - IsBold = true, - TextColorHex = "#1F2937", - Alignment = TextAlignmentMode.Center, - X = 50, - Y = 560, - Width = 500, - Height = 64, - ZIndex = 6 - }); - - // 10. Reception to follow & RSVP Block - page.Elements.Add(new PdfTextElement - { - Text = "RECEPTION, DINNER & DANCING TO FOLLOW", - FontFamily = "Montserrat", - FontSize = 11, - IsBold = true, - TextColorHex = "#D97706", - Alignment = TextAlignmentMode.Center, - X = 50, - Y = 640, - Width = 500, - Height = 22, - ZIndex = 6 - }); - - page.Elements.Add(new PdfQrCodeElement - { - Content = "https://wedding.codefrydev.in/jane-and-john", - Label = "SCAN TO RSVP ONLINE", - DarkColorHex = "#D97706", - LightColorHex = "#FAFAFA", - X = 245, - Y = 675, - Width = 110, - Height = 125, - ZIndex = 7 - }); - - doc.Pages.Add(page); - return doc; - } -} diff --git a/src/PdfEditorApp/Templates/Events/WeddingInvitationTraditionalTemplate.cs b/src/PdfEditorApp/Templates/Events/WeddingInvitationTraditionalTemplate.cs deleted file mode 100644 index 4e29529..0000000 --- a/src/PdfEditorApp/Templates/Events/WeddingInvitationTraditionalTemplate.cs +++ /dev/null @@ -1,429 +0,0 @@ -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; -using PdfEditorApp.Services; - -namespace PdfEditorApp.Templates.Events; - -/// -/// Authentic Traditional Indian Wedding Invitation Card template featuring Marigold Torans, -/// Lord Ganesha sacred crest, calligraphic couple names, dual Muhurtham & Reception schedule columns, -/// brass deepams, and ceremonial plantain tree accents. -/// -public class WeddingInvitationTraditionalTemplate : ITemplateDefinition -{ - public string Id => "weddingtraditional"; - public string Name => "Traditional Indian Wedding Invitation"; - public string Description => "Festive marigold toran, sacred Ganesha crest, dual Muhurtham & Reception schedule, and brass deepams"; - public string Category => "Events & Invitations"; - public string IconKind => "CardsHeartOutline"; - public string AccentColorHex => "#8B0000"; - - public PdfDocumentModel Create() - { - return GenerateDocument(); - } - - public static PdfDocumentModel GenerateDocument() - { - var doc = new PdfDocumentModel - { - Title = "Wedding_Invitation_Aarav_and_Ananya.pdf", - Author = "CodeFryDev Events", - Subject = "Traditional Indian Wedding Invitation Card" - }; - - // Standard Portrait Invitation (600 x 900 pt) - var page = new PdfPageModel - { - Width = 600, - Height = 900, - Orientation = PageOrientation.Portrait, - ShowHeaderFooter = false - }; - - // 1. Warm Luxury Parchment Cream Background - page.Elements.Add(new PdfShapeElement - { - ShapeType = ShapeType.Rectangle, - X = 0, - Y = 0, - Width = 600, - Height = 900, - FillColorHex = "#FFFDF7", // Warm parchment ivory - StrokeColorHex = "#F59E0B", - StrokeThickness = 2.0, - ZIndex = 0 - }); - - // 2. Inner Golden Delicate Border - page.Elements.Add(new PdfShapeElement - { - ShapeType = ShapeType.Rectangle, - X = 14, - Y = 14, - Width = 572, - Height = 872, - FillColorHex = "#00000000", - StrokeColorHex = "#D97706", - StrokeThickness = 1.0, - CornerRadius = 4, - ZIndex = 1 - }); - - // 3. Top Decorative Marigold Floral Toran Garland & Hanging Lamps - page.Elements.Add(new PdfSvgElement - { - PresetName = "MarigoldToran", - SvgSource = SvgOrnamentLibrary.GetMarigoldToranSvg(), - X = 15, - Y = 15, - Width = 570, - Height = 85, - ZIndex = 5 - }); - - // 4. Auspicious Sacred Lord Ganesha Vector Crest - page.Elements.Add(new PdfSvgElement - { - PresetName = "GaneshaCrest", - SvgSource = SvgOrnamentLibrary.GetGaneshaCrestSvg("#8B0000", "#D97706"), - X = 260, - Y = 100, - Width = 80, - Height = 85, - ZIndex = 6 - }); - - // 5. Sanskrit Sacred Invocation - page.Elements.Add(new PdfTextElement - { - Text = "|| Shree Ganeshay Namah ||", - FontFamily = "Cinzel", - FontSize = 13, - IsBold = true, - TextColorHex = "#8B0000", // Auspicious Crimson Maroon - Alignment = TextAlignmentMode.Center, - X = 50, - Y = 190, - Width = 500, - Height = 24, - ZIndex = 7 - }); - - // 6. Invitation Announcement Header - page.Elements.Add(new PdfTextElement - { - Text = "Together with their families, cordially invite you to celebrate the wedding of", - FontFamily = "Cinzel", - FontSize = 12.5, - IsBold = false, - TextColorHex = "#451A03", // Deep rich walnut - Alignment = TextAlignmentMode.Center, - X = 50, - Y = 220, - Width = 500, - Height = 46, - ZIndex = 7 - }); - - // 7. Groom & Bride Names in Calligraphic Typography with Ampersand - // Groom Name - page.Elements.Add(new PdfTextElement - { - Text = "Aarav", - FontFamily = "Great Vibes", - FontSize = 42, - IsBold = true, - TextColorHex = "#78350F", // Royal Amber Bronze - Alignment = TextAlignmentMode.Center, - X = 50, - Y = 270, - Width = 220, - Height = 56, - ZIndex = 8 - }); - - // Groom Parentage - page.Elements.Add(new PdfTextElement - { - Text = "Son of\nMrs. Sunita & Mr. Rajesh Sharma\nGrandson of Late Smt. Kamala Sharma", - FontFamily = "Montserrat", - FontSize = 9.5, - IsBold = true, - TextColorHex = "#451A03", - Alignment = TextAlignmentMode.Center, - X = 35, - Y = 328, - Width = 250, - Height = 58, - ZIndex = 8 - }); - - // Center Calligraphic Ampersand - page.Elements.Add(new PdfTextElement - { - Text = "&", - FontFamily = "Great Vibes", - FontSize = 36, - IsBold = true, - TextColorHex = "#D97706", // Gold - Alignment = TextAlignmentMode.Center, - X = 280, - Y = 295, - Width = 40, - Height = 40, - ZIndex = 8 - }); - - // Bride Name - page.Elements.Add(new PdfTextElement - { - Text = "Ananya", - FontFamily = "Great Vibes", - FontSize = 42, - IsBold = true, - TextColorHex = "#78350F", - Alignment = TextAlignmentMode.Center, - X = 330, - Y = 270, - Width = 220, - Height = 56, - ZIndex = 8 - }); - - // Bride Parentage - page.Elements.Add(new PdfTextElement - { - Text = "Daughter of\nMrs. Meenakshi & Mr. Suresh Iyer\nGranddaughter of Late Shri K. Iyer", - FontFamily = "Montserrat", - FontSize = 9.5, - IsBold = true, - TextColorHex = "#451A03", - Alignment = TextAlignmentMode.Center, - X = 315, - Y = 328, - Width = 250, - Height = 58, - ZIndex = 8 - }); - - // 8. Center Dotted Floral Lotus Divider - page.Elements.Add(new PdfSvgElement - { - PresetName = "DottedFloralDivider", - SvgSource = SvgOrnamentLibrary.GetDottedFloralDividerSvg("#D97706", "#8B0000"), - X = 80, - Y = 390, - Width = 440, - Height = 24, - ZIndex = 8 - }); - - // 9. Dual Event Schedules (MUHURTHAM & RECEPTION) - // Left: MUHURTHAM - page.Elements.Add(new PdfTextElement - { - Text = "MUHURTHAM", - FontFamily = "Cinzel", - FontSize = 14, - IsBold = true, - TextColorHex = "#8B0000", - Alignment = TextAlignmentMode.Center, - X = 40, - Y = 420, - Width = 240, - Height = 24, - ZIndex = 8 - }); - - page.Elements.Add(new PdfTextElement - { - Text = "Wednesday, 11th November 2026\n9:30 AM – 11:30 AM (Dhanu Lagna)", - FontFamily = "Montserrat", - FontSize = 10, - IsBold = true, - TextColorHex = "#451A03", - Alignment = TextAlignmentMode.Center, - X = 40, - Y = 445, - Width = 240, - Height = 40, - ZIndex = 8 - }); - - page.Elements.Add(new PdfTextElement - { - Text = "- Venue -\nThe Leela Palace, Grand Ballroom\nMG Road, Bengaluru, Karnataka", - FontFamily = "Montserrat", - FontSize = 9.5, - IsBold = false, - TextColorHex = "#522504", - Alignment = TextAlignmentMode.Center, - X = 40, - Y = 488, - Width = 240, - Height = 52, - ZIndex = 8 - }); - - // Vertical Dotted Divider between Muhurtham and Reception - page.Elements.Add(new PdfDividerElement - { - IsVertical = true, - Thickness = 1.5, - ColorHex = "#D97706", - X = 299, - Y = 420, - Width = 2, - Height = 115, - ZIndex = 8 - }); - - // Right: RECEPTION - page.Elements.Add(new PdfTextElement - { - Text = "RECEPTION", - FontFamily = "Cinzel", - FontSize = 14, - IsBold = true, - TextColorHex = "#8B0000", - Alignment = TextAlignmentMode.Center, - X = 320, - Y = 420, - Width = 240, - Height = 24, - ZIndex = 8 - }); - - page.Elements.Add(new PdfTextElement - { - Text = "Thursday, 12th November 2026\n7:00 PM Onwards", - FontFamily = "Montserrat", - FontSize = 10, - IsBold = true, - TextColorHex = "#451A03", - Alignment = TextAlignmentMode.Center, - X = 320, - Y = 445, - Width = 240, - Height = 40, - ZIndex = 8 - }); - - page.Elements.Add(new PdfTextElement - { - Text = "- Venue -\nThe Leela Palace, Royal Convention Lawn\nMG Road, Bengaluru, Karnataka", - FontFamily = "Montserrat", - FontSize = 9.5, - IsBold = false, - TextColorHex = "#522504", - Alignment = TextAlignmentMode.Center, - X = 320, - Y = 488, - Width = 240, - Height = 52, - ZIndex = 8 - }); - - // 10. Secondary Dotted Floral Divider - page.Elements.Add(new PdfSvgElement - { - PresetName = "DottedFloralDivider", - SvgSource = SvgOrnamentLibrary.GetDottedFloralDividerSvg("#D97706", "#8B0000"), - X = 120, - Y = 545, - Width = 360, - Height = 20, - ZIndex = 8 - }); - - // 11. RSVP / Best Compliments - page.Elements.Add(new PdfTextElement - { - Text = "With Best Compliments From: Doe Families • RSVP: +1 (555) 019-2834", - FontFamily = "Montserrat", - FontSize = 10.5, - IsBold = true, - TextColorHex = "#78350F", - Alignment = TextAlignmentMode.Center, - X = 50, - Y = 572, - Width = 500, - Height = 24, - ZIndex = 8 - }); - - // 12. Flanking Left & Right Ceremonial Banana Plantain Trees - page.Elements.Add(new PdfSvgElement - { - PresetName = "PlantainTrees", - SvgSource = SvgOrnamentLibrary.GetPlantainTreesSvg(), - X = 18, - Y = 640, - Width = 80, - Height = 160, - ZIndex = 6 - }); - - page.Elements.Add(new PdfSvgElement - { - PresetName = "PlantainTrees", - SvgSource = SvgOrnamentLibrary.GetPlantainTreesSvg(), - X = 502, - Y = 640, - Width = 80, - Height = 160, - ZIndex = 6 - }); - - // 13. Auspicious Brass Standing Deepam Lamps (Left & Right) - page.Elements.Add(new PdfSvgElement - { - PresetName = "TraditionalDeepam", - SvgSource = SvgOrnamentLibrary.GetTraditionalDeepamSvg(), - X = 85, - Y = 675, - Width = 55, - Height = 135, - ZIndex = 7 - }); - - page.Elements.Add(new PdfSvgElement - { - PresetName = "TraditionalDeepam", - SvgSource = SvgOrnamentLibrary.GetTraditionalDeepamSvg(), - X = 460, - Y = 675, - Width = 55, - Height = 135, - ZIndex = 7 - }); - - // 14. Center Vedic Kalash with Mango Leaves and Coconut - page.Elements.Add(new PdfSvgElement - { - PresetName = "AuspiciousKalash", - SvgSource = SvgOrnamentLibrary.GetAuspiciousKalashSvg(), - X = 265, - Y = 665, - Width = 70, - Height = 90, - ZIndex = 7 - }); - - // 15. Bottom Ornate Mandap Floor Border - page.Elements.Add(new PdfSvgElement - { - PresetName = "MandapArch", - SvgSource = SvgOrnamentLibrary.GetMandapArchSvg("#D97706", "#8B0000"), - X = 20, - Y = 820, - Width = 560, - Height = 55, - ZIndex = 7 - }); - - doc.Pages.Add(page); - return doc; - } -} diff --git a/src/PdfEditorApp/Templates/Finance/FinanceResearchPaperTemplate.cs b/src/PdfEditorApp/Templates/Finance/FinanceResearchPaperTemplate.cs deleted file mode 100644 index f27b1c6..0000000 --- a/src/PdfEditorApp/Templates/Finance/FinanceResearchPaperTemplate.cs +++ /dev/null @@ -1,579 +0,0 @@ -using System.Collections.Generic; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; - -namespace PdfEditorApp.Templates.Finance; - -public class FinanceResearchPaperTemplate : ITemplateDefinition -{ - public string Id => "financeresearch"; - public string Name => "Quantitative Finance & Econometrics Paper"; - public string Description => "Full 2-page quantitative finance paper with stochastic jump-diffusion SDEs, econometric calibration tables, and backtest metrics"; - public string Category => "Finance"; - public string IconKind => "ChartLineVariant"; - public string AccentColorHex => "#15803D"; - - public PdfDocumentModel Create() - { - var doc = new PdfDocumentModel - { - Title = "Quantitative_Finance_Jump_Diffusion_2026.pdf", - Author = "Dr. John Doe, CFA & Dr. Jane Doe", - Subject = "Quantitative Finance, Stochastic Volatility & High-Frequency Risk Modeling" - }; - - // ========================================================================= - // PAGE 1: Title, Abstract, SDEs, Estimation & Model Benchmark Table - // ========================================================================= - var page1 = new PdfPageModel - { - PageNumber = 1, - Format = PageFormat.A4, - Orientation = PageOrientation.Portrait, - Width = 800, - Height = 1131, - BackgroundColorHex = "#FFFFFF", - FooterLeft = "JOURNAL OF FINANCIAL ECONOMETRICS • VOL. 34, ISSUE 2 • JEL: G12, G13, C58, C63", - FooterCenter = "QUANTITATIVE RESEARCH ARTICLE", - FooterRight = "Page 1 of 2", - Elements = new List - { - // Top Header Rule & Journal Metadata - new PdfTextElement - { - X = 55, - Y = 32, - Width = 690, - Height = 18, - Text = "JOURNAL OF FINANCIAL ECONOMETRICS, VOL. 34 (2026), PP. 240–288 • DOI: 10.1093/jjfinec/nbad024", - FontSize = 8.5, - FontFamily = "Times New Roman", - TextColorHex = "#166534", - Alignment = TextAlignmentMode.Center - }, - new PdfDividerElement - { - X = 55, - Y = 52, - Width = 690, - Height = 1, - Thickness = 0.75, - ColorHex = "#86EFAC" - }, - - // Main Paper Title - new PdfTextElement - { - X = 55, - Y = 58, - Width = 690, - Height = 48, - Text = "Multi-Factor Jump-Diffusion Asset Pricing and Stochastic Volatility in High-Frequency Futures Markets", - FontSize = 16, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#14532D", - Alignment = TextAlignmentMode.Center - }, - - // Authors & Affiliation - new PdfTextElement - { - X = 55, - Y = 108, - Width = 690, - Height = 34, - Text = "John Doe, Ph.D., CFA¹ and Jane Doe, Ph.D.²\n¹Quantitative Investment Strategies, CodeFryDev Capital Management • ²Department of Finance, CodeFryDev Institute", - FontSize = 9.5, - FontFamily = "Times New Roman", - TextColorHex = "#334155", - Alignment = TextAlignmentMode.Center - }, - - // Abstract & JEL Codes Card - new PdfShapeElement - { - X = 75, - Y = 145, - Width = 650, - Height = 104, - CornerRadius = 4, - FillColorHex = "#F0FDF4", - StrokeColorHex = "#BBF7D0", - StrokeThickness = 1 - }, - new PdfTextElement - { - X = 90, - Y = 150, - Width = 620, - Height = 68, - Text = "Abstract— We develop a generalized continuous-time Bates jump-diffusion framework with state-dependent jump intensities calibrated to 100-microsecond order-book data for S&P 500 E-mini and Treasury futures. Out-of-sample hedging tests demonstrate a 32.8% reduction in pricing root-mean-square error (RMSE) during high-volatility regime shifts compared to classical local volatility surfaces.", - FontSize = 9, - FontFamily = "Times New Roman", - IsItalic = true, - LineHeight = 1.35, - TextColorHex = "#166534", - Alignment = TextAlignmentMode.Justify - }, - new PdfTextElement - { - X = 90, - Y = 222, - Width = 620, - Height = 22, - Text = "JEL Classification— G12 (Asset Pricing), G13 (Contingent Pricing), C58 (Financial Econometrics), C63 (Computational Techniques).", - FontSize = 8.5, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#15803D" - }, - - // Column Split Divider - new PdfDividerElement - { - X = 55, - Y = 254, - Width = 690, - Height = 1, - Thickness = 1, - ColorHex = "#86EFAC" - }, - - // ========================================== - // COLUMN 1 (Left: X = 55, Width = 330) - // ========================================== - new PdfTextElement - { - X = 55, - Y = 262, - Width = 330, - Height = 22, - Text = "1. STOCHASTIC DYNAMICS SPECIFICATION", - FontSize = 11, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#14532D" - }, - new PdfTextElement - { - X = 55, - Y = 286, - Width = 330, - Height = 90, - Text = "Let (Ω, ℱ, {ℱ_t}, ℙ) represent a filtered probability space satisfying usual conditions. Under the physical probability measure ℙ, the spot asset price process S_t and variance process V_t follow the coupled stochastic differential equations [1, 2]:", - FontSize = 9.5, - FontFamily = "Times New Roman", - LineHeight = 1.35, - TextColorHex = "#334155", - Alignment = TextAlignmentMode.Justify - }, - - // SDE Equation Box - new PdfShapeElement - { - X = 55, - Y = 380, - Width = 330, - Height = 52, - CornerRadius = 3, - FillColorHex = "#F0FDF4", - StrokeColorHex = "#BBF7D0", - StrokeThickness = 0.5 - }, - new PdfTextElement - { - X = 65, - Y = 386, - Width = 310, - Height = 40, - Text = "dS_t = (μ - λ k̄) S_t dt + √V_t S_t dW_t^S + (e^J - 1) S_t dN_t\ndV_t = κ(θ - V_t) dt + σ_v √V_t dW_t^V (1)", - FontSize = 8.5, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#14532D", - Alignment = TextAlignmentMode.Center - }, - - new PdfTextElement - { - X = 55, - Y = 438, - Width = 330, - Height = 110, - Text = "where d⟨W^S, W^V⟩_t = ρ dt represents the leverage correlation, N_t is a Poisson counting process with intensity λ_t = λ₀ + λ₁ V_t, and J ~ 𝒩(μ_J, σ_J²) denotes the log-jump amplitude distribution with mean percentage jump size k̄ = exp(μ_J + ½σ_J²) - 1.", - FontSize = 9, - FontFamily = "Times New Roman", - LineHeight = 1.35, - TextColorHex = "#334155", - Alignment = TextAlignmentMode.Justify - }, - - new PdfTextElement - { - X = 55, - Y = 554, - Width = 330, - Height = 22, - Text = "2. QUASI-MAXIMUM LIKELIHOOD ESTIMATION", - FontSize = 11, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#14532D" - }, - new PdfTextElement - { - X = 55, - Y = 578, - Width = 330, - Height = 130, - Text = "Parameter estimation is performed via Sequential Monte Carlo (particle filtering) combined with Fourier transform inversion of the characteristic function ϕ(u; t) = 𝔼[exp(i u ln S_t)]. The Feller condition 2κθ > σ_v² is strictly enforced across optimization iterations to ensure that the variance process V_t remains strictly positive almost surely [3].", - FontSize = 9, - FontFamily = "Times New Roman", - LineHeight = 1.35, - TextColorHex = "#334155", - Alignment = TextAlignmentMode.Justify - }, - - new PdfTextElement - { - X = 55, - Y = 712, - Width = 330, - Height = 22, - Text = "3. EMPIRICAL VOLATILITY SURFACE SMILE", - FontSize = 11, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#14532D" - }, - new PdfTextElement - { - X = 55, - Y = 736, - Width = 330, - Height = 110, - Text = "Short-maturity options exhibit pronounced implied volatility skews that cannot be replicated by diffusion-only models. Incorporating compound Poisson jump arrivals resolves the term-structure flattening problem and matches empirical kurtosis.", - FontSize = 9.5, - FontFamily = "Times New Roman", - LineHeight = 1.35, - TextColorHex = "#334155", - Alignment = TextAlignmentMode.Justify - }, - - // ========================================== - // COLUMN 2 (Right: X = 415, Width = 330) - // ========================================== - new PdfTextElement - { - X = 415, - Y = 262, - Width = 330, - Height = 22, - Text = "4. OUT-OF-SAMPLE MODEL BENCHMARKS", - FontSize = 11, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#14532D" - }, - new PdfTextElement - { - X = 415, - Y = 286, - Width = 330, - Height = 58, - Text = "Table I reports out-of-sample pricing RMSE, annualized Sharpe ratio, maximum portfolio drawdown, and 99% daily Value-at-Risk (VaR) exception rates across 10 years of tick data (2016–2026).", - FontSize = 9.5, - FontFamily = "Times New Roman", - LineHeight = 1.35, - TextColorHex = "#334155", - Alignment = TextAlignmentMode.Justify - }, - - // Econometric Performance Table - new PdfTableElement - { - X = 415, - Y = 348, - Width = 330, - Height = 145, - Headers = new List { "Model Specification", "RMSE", "Sharpe", "Max DD", "VaR 99%" }, - Rows = new List> - { - new() { "Black-Scholes (1973)", "$4.12", "0.84", "-28.4%", "3.8%" }, - new() { "Heston SV (1993)", "$1.89", "1.42", "-16.2%", "1.6%" }, - new() { "Rough Bergomi (2019)", "$1.34", "1.78", "-11.5%", "1.1%" }, - new() { "Proposed Jump-Diff", "$0.92", "2.14", "-7.8%", "0.9%" } - }, - HeaderBackgroundHex = "#15803D", - HeaderTextHex = "#FFFFFF", - AlternateRowBackgroundHex = "#F0FDF4", - BorderColorHex = "#CBD5E1" - }, - - new PdfTextElement - { - X = 415, - Y = 502, - Width = 330, - Height = 22, - Text = "5. RISK PARITY BACKTESTING", - FontSize = 11, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#14532D" - }, - new PdfTextElement - { - X = 415, - Y = 526, - Width = 330, - Height = 125, - Text = "Dynamic delta-gamma-vega hedging strategies derived from the calibrated jump-diffusion parameters achieved superior risk-adjusted alpha during market stress periods (e.g. Flash Crash events and interest rate spikes), cutting tail drawdown risk by 72% [4].", - FontSize = 9.5, - FontFamily = "Times New Roman", - LineHeight = 1.35, - TextColorHex = "#334155", - Alignment = TextAlignmentMode.Justify - }, - - new PdfTextElement - { - X = 415, - Y = 658, - Width = 330, - Height = 22, - Text = "6. CROSS-ASSET CALIBRATION METRICS", - FontSize = 11, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#14532D" - }, - new PdfTextElement - { - X = 415, - Y = 682, - Width = 330, - Height = 145, - Text = "Calibrated mean-reversion speeds κ ranged from 3.42 for S&P 500 index options to 7.85 for Crude Oil (WTI) futures, reflecting rapid information assimilation in physical commodity derivative markets.", - FontSize = 9.5, - FontFamily = "Times New Roman", - LineHeight = 1.35, - TextColorHex = "#334155", - Alignment = TextAlignmentMode.Justify - } - } - }; - - // ========================================================================= - // PAGE 2: Order-Book Microstructure, Basel IV, Author Bios & References - // ========================================================================= - var page2 = new PdfPageModel - { - PageNumber = 2, - Format = PageFormat.A4, - Orientation = PageOrientation.Portrait, - Width = 800, - Height = 1131, - BackgroundColorHex = "#FFFFFF", - FooterLeft = "JOURNAL OF FINANCIAL ECONOMETRICS • VOL. 34, ISSUE 2", - FooterRight = "Page 2 of 2", - Elements = new List - { - // Top Header Metadata Strip - new PdfTextElement - { - X = 55, - Y = 32, - Width = 690, - Height = 18, - Text = "VANCE & HOLMSTRÖM: MULTI-FACTOR JUMP-DIFFUSION IN FUTURES MARKETS", - FontSize = 8.5, - FontFamily = "Times New Roman", - TextColorHex = "#166534", - Alignment = TextAlignmentMode.Center - }, - new PdfDividerElement - { - X = 55, - Y = 52, - Width = 690, - Height = 1, - Thickness = 0.75, - ColorHex = "#86EFAC" - }, - - // ========================================== - // COLUMN 1 (Left: X = 55, Width = 330) - // ========================================== - new PdfTextElement - { - X = 55, - Y = 62, - Width = 330, - Height = 22, - Text = "7. ORDER-BOOK LEVEL II MICROSTRUCTURE", - FontSize = 11, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#14532D" - }, - new PdfTextElement - { - X = 55, - Y = 86, - Width = 330, - Height = 135, - Text = "By linking Poisson arrival intensities λ_t directly to limit order book imbalance (OFI_t = (V_t^bid - V_t^ask) / (V_t^bid + V_t^ask)), the model captures toxic flow arrivals preceding market-maker spread widening. Empirical tests indicate that order-flow toxicity accounts for 44.2% of jump arrival variance [5].", - FontSize = 9.5, - FontFamily = "Times New Roman", - LineHeight = 1.35, - TextColorHex = "#334155", - Alignment = TextAlignmentMode.Justify - }, - - new PdfTextElement - { - X = 55, - Y = 228, - Width = 330, - Height = 22, - Text = "8. BASEL IV & FRTB CAPITAL ADEQUACY", - FontSize = 11, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#14532D" - }, - new PdfTextElement - { - X = 55, - Y = 252, - Width = 330, - Height = 135, - Text = "Under the Fundamental Review of the Trading Book (FRTB), banks must compute Expected Shortfall (ES) under liquidity horizons ranging from 10 to 120 days. Incorporating heavy-tailed jump dynamics prevents systematic undercapitalization during market dislocation regimes [6].", - FontSize = 9.5, - FontFamily = "Times New Roman", - LineHeight = 1.35, - TextColorHex = "#334155", - Alignment = TextAlignmentMode.Justify - }, - - // Author Biographies - new PdfTextElement - { - X = 55, - Y = 395, - Width = 330, - Height = 22, - Text = "AUTHOR BIOGRAPHIES", - FontSize = 10.5, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#14532D" - }, - new PdfDividerElement - { - X = 55, - Y = 415, - Width = 330, - Height = 1, - Thickness = 0.75, - ColorHex = "#86EFAC" - }, - - new PdfShapeElement - { - X = 55, - Y = 425, - Width = 36, - Height = 36, - CornerRadius = 18, - FillColorHex = "#15803D", - Label = "JV", - LabelColorHex = "#FFFFFF", - LabelFontSize = 12 - }, - new PdfTextElement - { - X = 100, - Y = 423, - Width = 285, - Height = 70, - Text = "John Doe, CFA, received his Ph.D. in Finance. He is a Managing Director in Quantitative Strategies at CodeFryDev Capital Management.", - FontSize = 8, - FontFamily = "Times New Roman", - LineHeight = 1.3, - TextColorHex = "#334155" - }, - - new PdfShapeElement - { - X = 55, - Y = 500, - Width = 36, - Height = 36, - CornerRadius = 18, - FillColorHex = "#166534", - Label = "JD", - LabelColorHex = "#FFFFFF", - LabelFontSize = 12 - }, - new PdfTextElement - { - X = 100, - Y = 498, - Width = 285, - Height = 70, - Text = "Jane Doe is Associate Professor of Financial Econometrics at CodeFryDev Institute, specializing in continuous-time asset pricing and rough volatility surfaces.", - FontSize = 8, - FontFamily = "Times New Roman", - LineHeight = 1.3, - TextColorHex = "#334155" - }, - - // ========================================== - // COLUMN 2 (Right: X = 415, Width = 330) - // ========================================== - new PdfTextElement - { - X = 415, - Y = 62, - Width = 330, - Height = 22, - Text = "REFERENCES", - FontSize = 10.5, - FontFamily = "Times New Roman", - IsBold = true, - TextColorHex = "#14532D" - }, - new PdfDividerElement - { - X = 415, - Y = 85, - Width = 330, - Height = 1, - Thickness = 0.75, - ColorHex = "#86EFAC" - }, - new PdfTextElement - { - X = 415, - Y = 90, - Width = 330, - Height = 270, - Text = "[1] R. C. Merton, \"Option pricing when underlying stock returns are discontinuous,\" J. Financ. Econ., vol. 3, pp. 125–144, 1976.\n[2] S. L. Heston, \"A closed-form solution for options with stochastic volatility,\" Rev. Financ. Stud., vol. 6, pp. 327–343, 1993.\n[3] D. S. Bates, \"Jumps and stochastic volatility: Exchange rate processes implicit in Deutsche Mark options,\" Rev. Financ. Stud., vol. 9, pp. 69–107, 1996.\n[4] R. Cont and P. Tankov, Financial Modelling with Jump Processes, Chapman & Hall/CRC, 2004.\n[5] J. Gatheral, The Volatility Surface: A Practitioner's Guide, John Wiley & Sons, 2006.\n[6] Basel Committee on Banking Supervision, Minimum Capital Requirements for Market Risk (FRTB), Bank for International Settlements, 2019.\n[7] C. Bayer, P. Friz, and J. Gatheral, \"Pricing under rough volatility,\" Quant. Finance, vol. 16, pp. 887–904, 2016.\n[8] D. Duffie, J. Pan, and K. Singleton, \"Transform analysis and asset pricing for affine jump-diffusions,\" Econometrica, vol. 68, pp. 1343–1376, 2000.", - FontSize = 8, - FontFamily = "Times New Roman", - LineHeight = 1.35, - TextColorHex = "#475569", - Alignment = TextAlignmentMode.Justify - } - } - }; - - doc.Pages.Add(page1); - doc.Pages.Add(page2); - - return doc; - } -} diff --git a/src/PdfEditorApp/Templates/Finance/InvoiceTemplate.cs b/src/PdfEditorApp/Templates/Finance/InvoiceTemplate.cs deleted file mode 100644 index 9e4eda4..0000000 --- a/src/PdfEditorApp/Templates/Finance/InvoiceTemplate.cs +++ /dev/null @@ -1,388 +0,0 @@ -using System.Collections.Generic; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; - -namespace PdfEditorApp.Templates.Finance; - -public class InvoiceTemplate : ITemplateDefinition -{ - public string Id => "invoice"; - public string Name => "Commercial Enterprise Invoice"; - public string Description => "Full-page itemized billing invoice with bank wire details, tax breakdown, and instant payment QR code"; - public string Category => "Finance"; - public string IconKind => "ReceiptTextOutline"; - public string AccentColorHex => "#0F6CBD"; - - public PdfDocumentModel Create() - { - var doc = new PdfDocumentModel - { - Title = "Invoice_INV-2026-8492.pdf", - Author = "CodeFryDev Solutions Inc.", - Subject = "Enterprise Software & Cloud Engineering Services Invoice" - }; - - var page = new PdfPageModel - { - PageNumber = 1, - Format = PageFormat.A4, - Orientation = PageOrientation.Portrait, - Width = 800, - Height = 1131, - BackgroundColorHex = "#FFFFFF", - FooterLeft = "CodeFryDev Solutions Inc. • Tax ID: US-EIN 94-3829104 • support@codefrydev.in", - FooterCenter = "Payment Terms: Net 30 Days", - FooterRight = "Invoice #INV-2026-8492 • Page 1 of 1", - Elements = new List - { - // Top Brand Accent Header Bar - new PdfShapeElement - { - X = 0, - Y = 0, - Width = 800, - Height = 8, - FillColorHex = "#0F6CBD", - StrokeColorHex = "#00000000", - StrokeThickness = 0 - }, - - // 1. Company Logo Badge - new PdfShapeElement - { - X = 55, - Y = 38, - Width = 52, - Height = 52, - CornerRadius = 10, - FillColorHex = "#0F6CBD", - StrokeColorHex = "#0C599B", - StrokeThickness = 0, - Label = "CF", - LabelColorHex = "#FFFFFF", - LabelFontSize = 20 - }, - - // 2. Seller Company Name & Address - new PdfTextElement - { - X = 118, - Y = 38, - Width = 320, - Height = 26, - Text = "CODEFRYDEV SOLUTIONS INC.", - FontSize = 15, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0F172A" - }, - new PdfTextElement - { - X = 118, - Y = 64, - Width = 320, - Height = 58, - Text = "742 Market St, Suite 1200 • Financial District\nSan Francisco, CA 94111 • United States\nPhone: +1 (555) 019-2834 • billing@codefrydev.in", - FontSize = 9.5, - FontFamily = "Segoe UI", - LineHeight = 1.35, - TextColorHex = "#64748B" - }, - - // 3. Right Invoice Title & Metadata Card - new PdfTextElement - { - X = 490, - Y = 36, - Width = 255, - Height = 32, - Text = "COMMERCIAL INVOICE", - FontSize = 18, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0F6CBD", - Alignment = TextAlignmentMode.Right - }, - new PdfTextElement - { - X = 470, - Y = 68, - Width = 275, - Height = 68, - Text = "Invoice Number: INV-2026-8492\nIssue Date: August 29, 2026\nPayment Due: September 28, 2026\nPO Reference: PO-ENTERPRISE-9841", - FontSize = 9.5, - FontFamily = "Segoe UI", - LineHeight = 1.4, - TextColorHex = "#334155", - Alignment = TextAlignmentMode.Right - }, - - // Top Separator Line - new PdfDividerElement - { - X = 55, - Y = 138, - Width = 690, - Height = 2, - Thickness = 1.5, - ColorHex = "#E2E8F0" - }, - - // 4. Client Billing & Project Information - // Left: Bill To - new PdfTextElement - { - X = 55, - Y = 146, - Width = 320, - Height = 20, - Text = "BILLED TO (CLIENT):", - FontSize = 10, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0F6CBD" - }, - new PdfTextElement - { - X = 55, - Y = 166, - Width = 320, - Height = 72, - Text = "CodeFryDev Client Enterprises Inc.\nAttn: Accounts Payable & Financial Operations\n500 Technology Square, Floor 8\nCambridge, MA 02139 • United States\nClient Tax ID: US-EIN 04-2918471", - FontSize = 9.5, - FontFamily = "Segoe UI", - LineHeight = 1.35, - TextColorHex = "#1E293B" - }, - - // Right: Project / Contract Details - new PdfTextElement - { - X = 440, - Y = 146, - Width = 305, - Height = 20, - Text = "CONTRACT & ENGAGEMENT:", - FontSize = 10, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0F6CBD" - }, - new PdfTextElement - { - X = 440, - Y = 166, - Width = 305, - Height = 72, - Text = "Project: Cloud Architecture & High-Performance Publishing Suite\nEngagement Period: July 01, 2026 – August 28, 2026\nPayment Terms: Net 30 Days (Direct Wire / ACH)\nCurrency: USD ($)", - FontSize = 9.5, - FontFamily = "Segoe UI", - LineHeight = 1.35, - TextColorHex = "#1E293B" - }, - - // 5. Itemized Billing Table - new PdfTableElement - { - X = 55, - Y = 246, - Width = 690, - Height = 310, - Headers = new List { "Deliverable / Description", "Qty / Unit", "Rate (USD)", "Discount", "Line Total" }, - Rows = new List> - { - new() { "Enterprise UI/UX Design System & Material Tokens", "60 Hours", "$150.00", "$0.00", "$9,000.00" }, - new() { "Avalonia Multiplatform Desktop Architecture & Skia Engine", "140 Hours", "$160.00", "$500.00", "$21,900.00" }, - new() { "High-Fidelity QuestPDF Vector Document Pipeline", "45 Hours", "$160.00", "$0.00", "$7,200.00" }, - new() { "Cloud Synchronization & Scalable Microservices (AKS)", "35 Hours", "$150.00", "$0.00", "$5,250.00" }, - new() { "SOC2 Security Hardening, Audit & Automated CI/CD Setup", "25 Hours", "$170.00", "$250.00", "$4,000.00" }, - new() { "Performance Profiling & Memory Leak Optimization (60 FPS)", "15 Hours", "$150.00", "$0.00", "$2,250.00" } - }, - HeaderBackgroundHex = "#0F6CBD", - HeaderTextHex = "#FFFFFF", - AlternateRowBackgroundHex = "#F8FAFC", - BorderColorHex = "#E2E8F0" - }, - - // 6. Financial Summary Box (Right Side) - new PdfShapeElement - { - X = 430, - Y = 570, - Width = 315, - Height = 160, - CornerRadius = 8, - FillColorHex = "#F8FAFC", - StrokeColorHex = "#E2E8F0", - StrokeThickness = 1 - }, - new PdfTextElement - { - X = 445, - Y = 582, - Width = 150, - Height = 135, - Text = "Subtotal (Gross):\nPrompt Payment Discount (3%):\nNet Taxable Amount:\nState & Local Tax (8.5%):\n\nTOTAL BALANCE DUE:", - FontSize = 10, - FontFamily = "Segoe UI", - LineHeight = 1.6, - TextColorHex = "#475569" - }, - new PdfTextElement - { - X = 595, - Y = 582, - Width = 135, - Height = 135, - Text = "$49,600.00\n-$1,488.00\n$48,112.00\n$4,089.52\n\n$52,201.52", - FontSize = 10, - FontFamily = "Segoe UI", - IsBold = true, - LineHeight = 1.6, - TextColorHex = "#0F172A", - Alignment = TextAlignmentMode.Right - }, - - // 7. Payment Instructions Box (Left Side) - new PdfShapeElement - { - X = 55, - Y = 570, - Width = 360, - Height = 160, - CornerRadius = 8, - FillColorHex = "#F0F7FF", - StrokeColorHex = "#BFDBFE", - StrokeThickness = 1 - }, - new PdfTextElement - { - X = 70, - Y = 582, - Width = 330, - Height = 20, - Text = "WIRE / ACH PAYMENT INSTRUCTIONS", - FontSize = 10.5, - FontFamily = "Segoe UI", - IsBold = true, - TextColorHex = "#0F6CBD" - }, - new PdfTextElement - { - X = 70, - Y = 604, - Width = 330, - Height = 115, - Text = "Bank Name: First Commercial Bank, N.A.\nAccount Holder: CodeFryDev Solutions Inc.\nRouting / ABA (Domestic): 121000358\nAccount Number: 98402941829\nSWIFT / BIC (International): CFDEVUS6SXXX\nPayment Reference: INV-2026-8492", - FontSize = 9.5, - FontFamily = "Segoe UI", - LineHeight = 1.4, - TextColorHex = "#1E293B" - }, - - // 8. Instant Payment QR Code & Terms - new PdfQrCodeElement - { - X = 55, - Y = 746, - Width = 110, - Height = 110, - Content = "https://pay.codefrydev.in/invoice/INV-2026-8492", - Label = "SCAN TO PAY INVOICE", - DarkColorHex = "#0F6CBD", - LightColorHex = "#FFFFFF" - }, - - // 9. Terms & Late Fee Policy - new PdfTextElement - { - X = 180, - Y = 746, - Width = 565, - Height = 110, - Text = "TERMS & CONDITIONS:\n1. Payment is due strictly within thirty (30) calendar days from the invoice issuance date.\n2. Overdue balances are subject to a late service fee of 1.5% per month or the maximum permitted by law.\n3. All deliverables are licensed upon full settlement of this invoice according to Master Services Agreement #MSA-2026-11.\n4. For billing inquiries, discrepancies, or receipt confirmations, contact finance@codefrydev.in.", - FontSize = 9, - FontFamily = "Segoe UI", - LineHeight = 1.4, - TextColorHex = "#475569" - }, - - // Bottom Divider - new PdfDividerElement - { - X = 55, - Y = 870, - Width = 690, - Height = 1, - Thickness = 1, - ColorHex = "#CBD5E1" - }, - - // 10. Authorized Corporate Signatory & Official Stamp - new PdfTextElement - { - X = 55, - Y = 885, - Width = 320, - Height = 45, - Text = "John Doe", - FontSize = 22, - FontFamily = "Great Vibes", - IsItalic = true, - TextColorHex = "#0F172A" - }, - new PdfDividerElement - { - X = 55, - Y = 932, - Width = 280, - Height = 1, - Thickness = 1, - ColorHex = "#94A3B8" - }, - new PdfTextElement - { - X = 55, - Y = 938, - Width = 280, - Height = 35, - Text = "Authorized Corporate Signatory\nChief Financial Officer • CodeFryDev Solutions Inc.", - FontSize = 9, - FontFamily = "Segoe UI", - TextColorHex = "#64748B" - }, - - // Official Verification Seal Badge (Right) - new PdfShapeElement - { - X = 580, - Y = 880, - Width = 165, - Height = 85, - CornerRadius = 8, - FillColorHex = "#F0FDF4", - StrokeColorHex = "#86EFAC", - StrokeThickness = 1, - Label = "VERIFIED INVOICE", - LabelColorHex = "#166534", - LabelFontSize = 10 - }, - new PdfTextElement - { - X = 590, - Y = 920, - Width = 145, - Height = 38, - Text = "Cryptographically signed &\nverified by CodeFryDev Trust PKI", - FontSize = 8.5, - FontFamily = "Segoe UI", - TextColorHex = "#166534", - Alignment = TextAlignmentMode.Center - } - } - }; - - doc.Pages.Add(page); - return doc; - } -} diff --git a/src/PdfEditorApp/Templates/General/BlankDocumentTemplate.cs b/src/PdfEditorApp/Templates/General/BlankDocumentTemplate.cs deleted file mode 100644 index 0c79d43..0000000 --- a/src/PdfEditorApp/Templates/General/BlankDocumentTemplate.cs +++ /dev/null @@ -1,92 +0,0 @@ -using System.Collections.Generic; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; - -namespace PdfEditorApp.Templates.General; - -public class BlankDocumentTemplate : ITemplateDefinition -{ - public string Id => "blank"; - public string Name => "Blank Page"; - public string Description => "Start fresh with a clean customizable canvas"; - public string Category => "General"; - public string IconKind => "FileOutline"; - public string AccentColorHex => "#64748B"; - - public PdfDocumentModel Create() - { - return Create(PageFormat.A4, PageOrientation.Portrait); - } - - public PdfDocumentModel Create(PageFormat format = PageFormat.A4, PageOrientation orientation = PageOrientation.Portrait) - { - var doc = new PdfDocumentModel - { - Title = "Untitled_Document.pdf", - Author = "CodeFryDev", - Subject = "New PDF Document" - }; - - var width = format switch - { - PageFormat.A4 => 800.0, - PageFormat.Letter => 800.0, - PageFormat.Legal => 800.0, - PageFormat.Poster => 2592.0, - _ => 800.0 - }; - - var height = format switch - { - PageFormat.A4 => 1131.0, - PageFormat.Letter => 1035.0, - PageFormat.Legal => 1318.0, - PageFormat.Poster => 3456.0, - _ => 1131.0 - }; - - if (orientation == PageOrientation.Landscape) - { - (width, height) = (height, width); - } - - var page = new PdfPageModel - { - PageNumber = 1, - Format = format, - Orientation = orientation, - Width = width, - Height = height, - BackgroundColorHex = "#FFFFFF", - FooterLeft = "CONFIDENTIAL", - FooterRight = "Page 1 of 1", - Elements = new List - { - new PdfTextElement - { - X = 60, - Y = 60, - Width = 680, - Height = 40, - Text = "Click to Edit Heading", - FontSize = 24, - IsBold = true, - TextColorHex = "#111827" - }, - new PdfTextElement - { - X = 60, - Y = 110, - Width = 680, - Height = 60, - Text = "Start typing your content here, or use the Ribbon toolbar above to insert text blocks, images, tables, shapes, and watermarks.", - FontSize = 13, - TextColorHex = "#4B5563" - } - } - }; - - doc.Pages.Add(page); - return doc; - } -} diff --git a/src/PdfEditorApp/Templates/General/RichTextPublishingShowcaseTemplate.cs b/src/PdfEditorApp/Templates/General/RichTextPublishingShowcaseTemplate.cs deleted file mode 100644 index fe77928..0000000 --- a/src/PdfEditorApp/Templates/General/RichTextPublishingShowcaseTemplate.cs +++ /dev/null @@ -1,643 +0,0 @@ -using System.Collections.Generic; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; - -namespace PdfEditorApp.Templates.General; - -/// -/// Professional Publishing Specimen Template demonstrating inline rich text typography, -/// multi-span runs, scientific notations (H₂O, x²), highlighted legal clauses, custom colors, -/// and clickable hyperlinks. -/// -public class RichTextPublishingShowcaseTemplate : ITemplateDefinition -{ - public string Id => "richtextshowcase"; - public string Name => "Rich Typography & Publishing Specimen"; - public string Description => "Executive multi-span typography showcase featuring inline bold, italics, highlights, sub/superscript notations, custom colors, and links"; - public string Category => "Design & Creative"; - public string IconKind => "FormatColorText"; - public string AccentColorHex => "#0F6CBD"; - - public PdfDocumentModel Create() - { - return GenerateDocument(); - } - - public static PdfDocumentModel GenerateDocument() - { - var doc = new PdfDocumentModel - { - Title = "Rich_Text_Publishing_Specimen.pdf", - Author = "FryPDF Publishing Studio", - Subject = "Official Specimen Demonstrating Multi-Span Inline Typography and Rich Formatting", - Keywords = "RichText, Typography, Publishing, Specimen, Markdown, Superscript, Subscript" - }; - - var page = new PdfPageModel - { - PageNumber = 1, - Format = PageFormat.A4, - Orientation = PageOrientation.Portrait, - Width = 595.28, - Height = 841.89, - BackgroundColorHex = "#F8FAFC", - ShowHeaderFooter = true, - HeaderLeft = "FRYPDF TYPOGRAPHY SPECIMEN", - HeaderRight = "VOLUME IV • ISSUE 1", - FooterLeft = "CONFIDENTIAL & PROPRIETARY", - FooterCenter = "www.frypdf.dev", - FooterRight = "PAGE 1 OF 1" - }; - - // ========================================== - // 1. TOP HERO HEADER & BRANDING BANNER - // ========================================== - - // Header Background Banner Card - page.Elements.Add(new PdfShapeElement - { - X = 24, - Y = 24, - Width = 547.28, - Height = 110, - ShapeType = ShapeType.RoundedRectangle, - CornerRadius = 8, - FillColorHex = "#0F172A", - StrokeColorHex = "#1E293B", - StrokeThickness = 1.5, - ZIndex = 0 - }); - - // Top Accent Stripe - page.Elements.Add(new PdfShapeElement - { - X = 24, - Y = 24, - Width = 547.28, - Height = 4, - ShapeType = ShapeType.Rectangle, - FillColorHex = "#0F6CBD", - ZIndex = 1 - }); - - // Category Badge - page.Elements.Add(new PdfTextElement - { - X = 44, - Y = 40, - Width = 220, - Height = 18, - Text = "DESKTOP PUBLISHING ENGINE • V2.0", - FontFamily = "Segoe UI", - FontSize = 9.5, - IsBold = true, - TextColorHex = "#38BDF8", - CharacterSpacing = 1.2, - ZIndex = 2 - }); - - // Main Title with Multi-Span Rich Text (Mixed White and Cyan) - var heroTitle = new PdfTextElement - { - X = 44, - Y = 60, - Width = 480, - Height = 34, - FontFamily = "Segoe UI", - FontSize = 20, - TextColorHex = "#FFFFFF", - Spans = new List - { - new() { Text = "Rich Typography ", IsBold = true, TextColorHex = "#FFFFFF" }, - new() { Text = "& Inline Formatting ", IsBold = true, TextColorHex = "#38BDF8" }, - new() { Text = "Studio", IsBold = false, IsItalic = true, TextColorHex = "#94A3B8" } - }, - ZIndex = 2 - }; - heroTitle.SynchronizePlainTextFromSpans(); - page.Elements.Add(heroTitle); - - // Subtitle Description - var heroSub = new PdfTextElement - { - X = 44, - Y = 96, - Width = 500, - Height = 22, - FontFamily = "Segoe UI", - FontSize = 10, - TextColorHex = "#CBD5E1", - Spans = new List - { - new() { Text = "High-fidelity " }, - new() { Text = "multi-span runs", IsBold = true, TextColorHex = "#FFFFFF" }, - new() { Text = " with granular control over weights, italics, colors, subscripts, and links." } - }, - ZIndex = 2 - }; - heroSub.SynchronizePlainTextFromSpans(); - page.Elements.Add(heroSub); - - // ========================================== - // 2. SECTION A: EXECUTIVE SUMMARY & CALLOUT - // ========================================== - - page.Elements.Add(new PdfShapeElement - { - X = 24, - Y = 146, - Width = 547.28, - Height = 90, - ShapeType = ShapeType.RoundedRectangle, - CornerRadius = 6, - FillColorHex = "#FFFFFF", - StrokeColorHex = "#E2E8F0", - StrokeThickness = 1.0, - ZIndex = 0 - }); - - page.Elements.Add(new PdfShapeElement - { - X = 24, - Y = 146, - Width = 4, - Height = 90, - ShapeType = ShapeType.Rectangle, - FillColorHex = "#0F6CBD", - ZIndex = 1 - }); - - var execHeading = new PdfTextElement - { - X = 40, - Y = 158, - Width = 400, - Height = 20, - FontFamily = "Segoe UI", - FontSize = 12, - TextColorHex = "#0F172A", - Spans = new List - { - new() { Text = "1. Executive Summary & ", IsBold = true }, - new() { Text = "Inline Style Highlights", IsBold = true, TextColorHex = "#0F6CBD" } - }, - ZIndex = 2 - }; - execHeading.SynchronizePlainTextFromSpans(); - page.Elements.Add(execHeading); - - var execBody = new PdfTextElement - { - X = 40, - Y = 180, - Width = 515, - Height = 46, - FontFamily = "Segoe UI", - FontSize = 10, - LineHeight = 1.45, - TextColorHex = "#334155", - Spans = new List - { - new() { Text = "FryPDF empowers authors to craft documents with " }, - new() { Text = "extreme typographic precision", IsBold = true, TextColorHex = "#0F172A" }, - new() { Text = ". Sentences can effortlessly combine " }, - new() { Text = "bold emphasis", IsBold = true }, - new() { Text = ", " }, - new() { Text = "italic nuance", IsItalic = true }, - new() { Text = ", " }, - new() { Text = "underline anchors", IsUnderline = true, TextColorHex = "#0F6CBD" }, - new() { Text = ", and " }, - new() { Text = "strikethrough revisions", IsStrikethrough = true, TextColorHex = "#94A3B8" }, - new() { Text = " inside a single, unified text box without creating disjointed fragments." } - }, - ZIndex = 2 - }; - execBody.SynchronizePlainTextFromSpans(); - page.Elements.Add(execBody); - - // ========================================== - // 3. SECTION B: 2-COLUMN CARDS (TECHNICAL & LEGAL) - // ========================================== - - // Left Card: Scientific & Mathematical Notations - page.Elements.Add(new PdfShapeElement - { - X = 24, - Y = 248, - Width = 265, - Height = 220, - ShapeType = ShapeType.RoundedRectangle, - CornerRadius = 6, - FillColorHex = "#FFFFFF", - StrokeColorHex = "#E2E8F0", - StrokeThickness = 1.0, - ZIndex = 0 - }); - - // Left Card Top Badge - page.Elements.Add(new PdfTextElement - { - X = 38, - Y = 260, - Width = 240, - Height = 18, - FontFamily = "Segoe UI", - FontSize = 11, - TextColorHex = "#0F172A", - Spans = new List - { - new() { Text = "🔬 Scientific & ", IsBold = true }, - new() { Text = "Math Scripts", IsBold = true, TextColorHex = "#0284C7" } - }, - ZIndex = 2 - }); - - // Chemical Formulas - var chemText = new PdfTextElement - { - X = 38, - Y = 286, - Width = 238, - Height = 50, - FontFamily = "Segoe UI", - FontSize = 9.5, - LineHeight = 1.4, - TextColorHex = "#334155", - Spans = new List - { - new() { Text = "• Chemical Reactions:\n " }, - new() { Text = "2H", IsBold = true }, - new() { Text = "2", Script = TextScriptMode.Subscript }, - new() { Text = " + O", IsBold = true }, - new() { Text = "2", Script = TextScriptMode.Subscript }, - new() { Text = " → 2H", IsBold = true }, - new() { Text = "2", Script = TextScriptMode.Subscript }, - new() { Text = "O (Combustion)\n Photosynthesis: 6CO", TextColorHex = "#0284C7" }, - new() { Text = "2", Script = TextScriptMode.Subscript, TextColorHex = "#0284C7" }, - new() { Text = " + 6H", TextColorHex = "#0284C7" }, - new() { Text = "2", Script = TextScriptMode.Subscript, TextColorHex = "#0284C7" }, - new() { Text = "O → C", TextColorHex = "#0284C7" }, - new() { Text = "6", Script = TextScriptMode.Subscript, TextColorHex = "#0284C7" }, - new() { Text = "H", TextColorHex = "#0284C7" }, - new() { Text = "12", Script = TextScriptMode.Subscript, TextColorHex = "#0284C7" }, - new() { Text = "O", TextColorHex = "#0284C7" }, - new() { Text = "6", Script = TextScriptMode.Subscript, TextColorHex = "#0284C7" } - }, - ZIndex = 2 - }; - chemText.SynchronizePlainTextFromSpans(); - page.Elements.Add(chemText); - - // Mathematical Physics Exponents - var mathText = new PdfTextElement - { - X = 38, - Y = 344, - Width = 238, - Height = 55, - FontFamily = "Segoe UI", - FontSize = 9.5, - LineHeight = 1.4, - TextColorHex = "#334155", - Spans = new List - { - new() { Text = "• Physics & Algebra:\n " }, - new() { Text = "E = mc", IsBold = true }, - new() { Text = "2", Script = TextScriptMode.Superscript, IsBold = true }, - new() { Text = " (Mass-Energy Equivalence)\n Pythagoras: " }, - new() { Text = "a", IsItalic = true }, - new() { Text = "2", Script = TextScriptMode.Superscript }, - new() { Text = " + " }, - new() { Text = "b", IsItalic = true }, - new() { Text = "2", Script = TextScriptMode.Superscript }, - new() { Text = " = " }, - new() { Text = "c", IsItalic = true }, - new() { Text = "2", Script = TextScriptMode.Superscript }, - new() { Text = "\n Ordinal Ranks: " }, - new() { Text = "1", IsBold = true }, - new() { Text = "st", Script = TextScriptMode.Superscript }, - new() { Text = ", 2", IsBold = true }, - new() { Text = "nd", Script = TextScriptMode.Superscript }, - new() { Text = ", 3", IsBold = true }, - new() { Text = "rd", Script = TextScriptMode.Superscript }, - new() { Text = ", and n", IsBold = true }, - new() { Text = "th", Script = TextScriptMode.Superscript }, - new() { Text = " degree." } - }, - ZIndex = 2 - }; - mathText.SynchronizePlainTextFromSpans(); - page.Elements.Add(mathText); - - // Right Card: Legal, Financial & Revision Highlights - page.Elements.Add(new PdfShapeElement - { - X = 306, - Y = 248, - Width = 265, - Height = 220, - ShapeType = ShapeType.RoundedRectangle, - CornerRadius = 6, - FillColorHex = "#FFFFFF", - StrokeColorHex = "#E2E8F0", - StrokeThickness = 1.0, - ZIndex = 0 - }); - - // Right Card Top Badge - page.Elements.Add(new PdfTextElement - { - X = 320, - Y = 260, - Width = 240, - Height = 18, - FontFamily = "Segoe UI", - FontSize = 11, - TextColorHex = "#0F172A", - Spans = new List - { - new() { Text = "⚖️ Legal & ", IsBold = true }, - new() { Text = "Contract Revisions", IsBold = true, TextColorHex = "#EA580C" } - }, - ZIndex = 2 - }); - - // Contract Clauses with Redactions & Revisions - var legalText = new PdfTextElement - { - X = 320, - Y = 286, - Width = 238, - Height = 110, - FontFamily = "Segoe UI", - FontSize = 9.5, - LineHeight = 1.42, - TextColorHex = "#334155", - Spans = new List - { - new() { Text = "• Clause 4.2 (Payment Terms):\n The total consideration of " }, - new() { Text = "$850,000.00", IsStrikethrough = true, TextColorHex = "#94A3B8" }, - new() { Text = " " }, - new() { Text = "$1,250,000.00 USD", IsBold = true, TextColorHex = "#16A34A" }, - new() { Text = " shall be payable within " }, - new() { Text = "30 calendar days", IsBold = true, IsUnderline = true }, - new() { Text = " from notice delivery.\n\n• Governing Jurisdiction:\n All arbitration shall proceed in " }, - new() { Text = "London, UK", IsBold = true, TextColorHex = "#0F6CBD" }, - new() { Text = " under LCIA rules." } - }, - ZIndex = 2 - }; - legalText.SynchronizePlainTextFromSpans(); - page.Elements.Add(legalText); - - // Hyperlink Reference - var linkText = new PdfTextElement - { - X = 320, - Y = 412, - Width = 238, - Height = 35, - FontFamily = "Segoe UI", - FontSize = 9.5, - LineHeight = 1.35, - Spans = new List - { - new() { Text = "🔗 Full Document: " }, - new() { Text = "frypdf.dev/legal/terms", IsUnderline = true, TextColorHex = "#0F6CBD", LinkUrl = "https://frypdf.dev" } - }, - ZIndex = 2 - }; - linkText.SynchronizePlainTextFromSpans(); - page.Elements.Add(linkText); - - // ========================================== - // 4. SECTION C: IN-PLACE MARKDOWN SYNTAX GUIDE - // ========================================== - - page.Elements.Add(new PdfShapeElement - { - X = 24, - Y = 480, - Width = 547.28, - Height = 175, - ShapeType = ShapeType.RoundedRectangle, - CornerRadius = 6, - FillColorHex = "#F1F5F9", - StrokeColorHex = "#CBD5E1", - StrokeThickness = 1.0, - ZIndex = 0 - }); - - var guideHeading = new PdfTextElement - { - X = 40, - Y = 494, - Width = 450, - Height = 20, - FontFamily = "Segoe UI", - FontSize = 11.5, - TextColorHex = "#0F172A", - Spans = new List - { - new() { Text = "⌨️ Live Canvas ", IsBold = true }, - new() { Text = "Markdown & Tag Syntax Guide", IsBold = true, TextColorHex = "#0F6CBD" } - }, - ZIndex = 2 - }; - guideHeading.SynchronizePlainTextFromSpans(); - page.Elements.Add(guideHeading); - - var guideCol1 = new PdfTextElement - { - X = 40, - Y = 520, - Width = 245, - Height = 120, - FontFamily = "Consolas", - FontSize = 9.0, - LineHeight = 1.45, - TextColorHex = "#0F172A", - Spans = new List - { - new() { Text = "**Bold Text** → ", TextColorHex = "#64748B" }, - new() { Text = "Bold Text\n", IsBold = true }, - new() { Text = "*Italic Text* → ", TextColorHex = "#64748B" }, - new() { Text = "Italic Text\n", IsItalic = true }, - new() { Text = "Underline → ", TextColorHex = "#64748B" }, - new() { Text = "Underline\n", IsUnderline = true }, - new() { Text = "~~Strikethrough~~ → ", TextColorHex = "#64748B" }, - new() { Text = "Strikethrough", IsStrikethrough = true } - }, - ZIndex = 2 - }; - guideCol1.SynchronizePlainTextFromSpans(); - page.Elements.Add(guideCol1); - - var guideCol2 = new PdfTextElement - { - X = 300, - Y = 520, - Width = 260, - Height = 120, - FontFamily = "Consolas", - FontSize = 9.0, - LineHeight = 1.45, - TextColorHex = "#0F172A", - Spans = new List - { - new() { Text = "Formula: H~2~O → ", TextColorHex = "#64748B" }, - new() { Text = "H" }, - new() { Text = "2", Script = TextScriptMode.Subscript }, - new() { Text = "O\n" }, - new() { Text = "Exponent: E=mc^2^ → ", TextColorHex = "#64748B" }, - new() { Text = "E=mc" }, - new() { Text = "2\n", Script = TextScriptMode.Superscript }, - new() { Text = "Red → ", TextColorHex = "#64748B" }, - new() { Text = "Red\n", IsBold = true, TextColorHex = "#DC2626" }, - new() { Text = "[Link](https://...) → ", TextColorHex = "#64748B" }, - new() { Text = "Link", IsUnderline = true, TextColorHex = "#0F6CBD" } - }, - ZIndex = 2 - }; - guideCol2.SynchronizePlainTextFromSpans(); - page.Elements.Add(guideCol2); - - // ========================================== - // 5. SECTION D: KEY METRICS ROW & FOOTER - // ========================================== - - // Metric 1: 100% Lossless Roundtrip - page.Elements.Add(new PdfShapeElement - { - X = 24, - Y = 668, - Width = 175, - Height = 65, - ShapeType = ShapeType.RoundedRectangle, - CornerRadius = 6, - FillColorHex = "#FFFFFF", - StrokeColorHex = "#E2E8F0", - StrokeThickness = 1.0, - ZIndex = 0 - }); - - page.Elements.Add(new PdfTextElement - { - X = 34, - Y = 678, - Width = 155, - Height = 45, - FontFamily = "Segoe UI", - FontSize = 9.0, - TextColorHex = "#334155", - Spans = new List - { - new() { Text = "100% Lossless\n", IsBold = true, FontSize = 12.0, TextColorHex = "#0F6CBD" }, - new() { Text = "JSON & PDF roundtrip fidelity" } - }, - ZIndex = 2 - }); - - // Metric 2: QuestPDF Native - page.Elements.Add(new PdfShapeElement - { - X = 210, - Y = 668, - Width = 175, - Height = 65, - ShapeType = ShapeType.RoundedRectangle, - CornerRadius = 6, - FillColorHex = "#FFFFFF", - StrokeColorHex = "#E2E8F0", - StrokeThickness = 1.0, - ZIndex = 0 - }); - - page.Elements.Add(new PdfTextElement - { - X = 220, - Y = 678, - Width = 155, - Height = 45, - FontFamily = "Segoe UI", - FontSize = 9.0, - TextColorHex = "#334155", - Spans = new List - { - new() { Text = "QuestPDF Native\n", IsBold = true, FontSize = 12.0, TextColorHex = "#059669" }, - new() { Text = "Zero rasterization vector export" } - }, - ZIndex = 2 - }); - - // Metric 3: Deconstruction Clean - page.Elements.Add(new PdfShapeElement - { - X = 396, - Y = 668, - Width = 175, - Height = 65, - ShapeType = ShapeType.RoundedRectangle, - CornerRadius = 6, - FillColorHex = "#FFFFFF", - StrokeColorHex = "#E2E8F0", - StrokeThickness = 1.0, - ZIndex = 0 - }); - - page.Elements.Add(new PdfTextElement - { - X = 406, - Y = 678, - Width = 155, - Height = 45, - FontFamily = "Segoe UI", - FontSize = 9.0, - TextColorHex = "#334155", - Spans = new List - { - new() { Text = "No Fragmenting\n", IsBold = true, FontSize = 12.0, TextColorHex = "#7C3AED" }, - new() { Text = "Merged baseline paragraphs" } - }, - ZIndex = 2 - }); - - // Bottom Decorative Wave Divider - page.Elements.Add(new PdfDividerElement - { - X = 24, - Y = 746, - Width = 547.28, - Height = 12, - Style = DividerStyle.Wave, - ColorHex = "#0F6CBD", - Thickness = 1.5, - ZIndex = 1 - }); - - // Bottom Publication Note - var pubNote = new PdfTextElement - { - X = 24, - Y = 764, - Width = 547.28, - Height = 22, - Alignment = TextAlignmentMode.Center, - FontFamily = "Segoe UI", - FontSize = 9.0, - TextColorHex = "#64748B", - Spans = new List - { - new() { Text = "Designed with " }, - new() { Text = "FryPDF Studio", IsBold = true, TextColorHex = "#0F6CBD" }, - new() { Text = " • Cross-Platform High Performance Document Suite" } - }, - ZIndex = 2 - }; - pubNote.SynchronizePlainTextFromSpans(); - page.Elements.Add(pubNote); - - doc.Pages.Add(page); - return doc; - } -} diff --git a/src/PdfEditorApp/Templates/ITemplateDefinition.cs b/src/PdfEditorApp/Templates/ITemplateDefinition.cs deleted file mode 100644 index e9703fa..0000000 --- a/src/PdfEditorApp/Templates/ITemplateDefinition.cs +++ /dev/null @@ -1,10 +0,0 @@ -using PdfEditorApp.Core.Plugins.Descriptors; - -namespace PdfEditorApp.Templates; - -/// -/// Legacy interface for templates, inheriting from the plugin-extensible . -/// -public interface ITemplateDefinition : ITemplateDescriptor -{ -} diff --git a/src/PdfEditorApp/Templates/Technical/ArduinoCheatSheetTemplate.cs b/src/PdfEditorApp/Templates/Technical/ArduinoCheatSheetTemplate.cs deleted file mode 100644 index 4132ff8..0000000 --- a/src/PdfEditorApp/Templates/Technical/ArduinoCheatSheetTemplate.cs +++ /dev/null @@ -1,273 +0,0 @@ -using System.Collections.Generic; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; - -namespace PdfEditorApp.Templates.Technical; - -public class ArduinoCheatSheetTemplate : ITemplateDefinition -{ - public string Id => "arduino_cheatsheet"; - public string Name => "Technical Cheat Sheet (Embedded C & Arduino)"; - public string Description => "High-density developer reference poster featuring multi-column code blocks, control structures, pinout tables, and electrical ratings"; - public string Category => "Cheat Sheets"; - public string IconKind => "Chip"; - public string AccentColorHex => "#0D9488"; - - public PdfDocumentModel Create() - { - var doc = new PdfDocumentModel - { - Title = "Arduino_Developer_Reference_CheatSheet.pdf", - Author = "Embedded Engineering Systems", - Subject = "Technical Reference Poster: Arduino Language, Hardware Architecture & Pinout Map" - }; - - // Standard Landscape Blueprint Canvas (1920 x 1080 pt widescreen or 1600 x 1131 pt) - // We use 1600 x 1131 pt for clean viewing on all desktop screens - var page = new PdfPageModel - { - PageNumber = 1, - Format = PageFormat.Poster, - Orientation = PageOrientation.Landscape, - Width = 1600, - Height = 1131, - BackgroundColorHex = "#0F172A", // Sleek dark blueprint theme - HeaderLeft = "Embedded Systems Technical Reference Series", - HeaderCenter = "Arduino & Microcontroller Architecture Reference", - HeaderRight = "Rev 2.6 • Hardware Spec", - FooterLeft = "Embedded C/C++ Reference Cheat Sheet • Open-Hardware Reference", - FooterCenter = "Compatible with ATmega328P, AVR, RP2040 & ESP32 Platforms", - FooterRight = "Page 1 of 1", - Elements = new List - { - // Top Header Brand Band - new PdfShapeElement - { - X = 0, Y = 0, Width = 1600, Height = 10, - FillColorHex = "#0D9488", StrokeColorHex = "#00000000" - }, - - // Main Header Banner - new PdfShapeElement - { - X = 30, Y = 25, Width = 1540, Height = 75, - CornerRadius = 8, FillColorHex = "#1E293B", - StrokeColorHex = "#334155", StrokeThickness = 1.5 - }, - new PdfTextElement - { - X = 50, Y = 36, Width = 1000, Height = 30, - Text = "ARDUINO / EMBEDDED C++ QUICK REFERENCE CHEAT SHEET", - FontSize = 18, IsBold = true, TextColorHex = "#2DD4BF", - FontFamily = "Inter" - }, - new PdfTextElement - { - X = 50, Y = 68, Width = 1000, Height = 22, - Text = "Language Syntax • Hardware Timers • Serial Comm • Digital/Analog I/O • Memory & Pinout Architecture", - FontSize = 11, TextColorHex = "#94A3B8", - FontFamily = "Inter" - }, - new PdfShapeElement - { - X = 1350, Y = 38, Width = 200, Height = 48, - CornerRadius = 6, FillColorHex = "#0F766E", - StrokeColorHex = "#14B8A6", StrokeThickness = 1 - }, - new PdfTextElement - { - X = 1355, Y = 52, Width = 190, Height = 20, - Text = "PLATFORM: ATmega328P", - FontSize = 11, IsBold = true, TextColorHex = "#FFFFFF", - Alignment = TextAlignmentMode.Center, - FontFamily = "Inter" - }, - - // ========================================================================= - // COLUMN 1: STRUCTURE & FLOW (X: 30, W: 365) - // ========================================================================= - // Card 1.1: Program Structure - new PdfShapeElement { X = 30, Y = 115, Width = 365, Height = 220, CornerRadius = 6, FillColorHex = "#1E293B", StrokeColorHex = "#334155", StrokeThickness = 1 }, - new PdfShapeElement { X = 30, Y = 115, Width = 365, Height = 30, CornerRadius = 6, FillColorHex = "#0D9488", StrokeColorHex = "#00000000" }, - new PdfTextElement { X = 45, Y = 122, Width = 335, Height = 20, Text = "1. Basic Program Structure", FontSize = 12, IsBold = true, TextColorHex = "#FFFFFF" }, - new PdfTextElement - { - X = 45, Y = 152, Width = 335, Height = 175, - Text = "void setup() {\n // Runs once at power-up or reset\n pinMode(LED_BUILTIN, OUTPUT);\n Serial.begin(115200);\n}\n\nvoid loop() {\n // Runs repeatedly and continuously\n digitalWrite(LED_BUILTIN, HIGH);\n delay(500);\n digitalWrite(LED_BUILTIN, LOW);\n delay(500);\n}", - FontSize = 10, TextColorHex = "#E2E8F0", - FontFamily = "RobotoMono" - }, - - // Card 1.2: Control Flow & Loops - new PdfShapeElement { X = 30, Y = 345, Width = 365, Height = 290, CornerRadius = 6, FillColorHex = "#1E293B", StrokeColorHex = "#334155", StrokeThickness = 1 }, - new PdfShapeElement { X = 30, Y = 345, Width = 365, Height = 30, CornerRadius = 6, FillColorHex = "#0D9488", StrokeColorHex = "#00000000" }, - new PdfTextElement { X = 45, Y = 352, Width = 335, Height = 20, Text = "2. Control Structures & Branching", FontSize = 12, IsBold = true, TextColorHex = "#FFFFFF" }, - new PdfTextElement - { - X = 45, Y = 382, Width = 335, Height = 245, - Text = "if (val > 100) {\n // condition true\n} else if (val == 50) {\n // secondary branch\n} else {\n // default fallback\n}\n\nfor (int i = 0; i < 10; i++) {\n // counted loop\n}\n\nwhile (condition) {\n // while true\n}\n\ndo { ... } while (condition);\nswitch(var) { case 1: break; default: break; }", - FontSize = 9.5, TextColorHex = "#E2E8F0", - FontFamily = "RobotoMono" - }, - - // Card 1.3: Data Types & RAM Footprint - new PdfShapeElement { X = 30, Y = 645, Width = 365, Height = 340, CornerRadius = 6, FillColorHex = "#1E293B", StrokeColorHex = "#334155", StrokeThickness = 1 }, - new PdfShapeElement { X = 30, Y = 645, Width = 365, Height = 30, CornerRadius = 6, FillColorHex = "#0D9488", StrokeColorHex = "#00000000" }, - new PdfTextElement { X = 45, Y = 652, Width = 335, Height = 20, Text = "3. Variable Types & Memory", FontSize = 12, IsBold = true, TextColorHex = "#FFFFFF" }, - new PdfTextElement - { - X = 45, Y = 682, Width = 335, Height = 295, - Text = "boolean 1 bit true / false\nbyte 8 bits 0 to 255 (unsigned char)\nchar 8 bits -128 to 127 ('A')\nint 16 bits -32,768 to 32,767\nunsigned 16 bits 0 to 65,535\nword 16 bits same as unsigned int\nlong 32 bits -2,147,483,648 to 2,147,483,647\nu_long 32 bits 0 to 4,294,967,295\nfloat 32 bits 3.4028235E+38 (6-7 digits precision)\ndouble 32 bits identical to float on AVR\nconst qualifier marks variable read-only\nvolatile qualifier prevents compiler optimization", - FontSize = 9.5, TextColorHex = "#E2E8F0", - FontFamily = "RobotoMono" - }, - - // ========================================================================= - // COLUMN 2: DIGITAL & ANALOG I/O (X: 420, W: 365) - // ========================================================================= - // Card 2.1: Digital I/O - new PdfShapeElement { X = 420, Y = 115, Width = 365, Height = 230, CornerRadius = 6, FillColorHex = "#1E293B", StrokeColorHex = "#334155", StrokeThickness = 1 }, - new PdfShapeElement { X = 420, Y = 115, Width = 365, Height = 30, CornerRadius = 6, FillColorHex = "#2563EB", StrokeColorHex = "#00000000" }, - new PdfTextElement { X = 435, Y = 122, Width = 335, Height = 20, Text = "4. Digital I/O Operations", FontSize = 12, IsBold = true, TextColorHex = "#FFFFFF" }, - new PdfTextElement - { - X = 435, Y = 152, Width = 335, Height = 185, - Text = "pinMode(pin, mode);\n // mode: INPUT, OUTPUT, INPUT_PULLUP\n\ndigitalWrite(pin, value);\n // value: HIGH (5V/3.3V), LOW (0V)\n\nint state = digitalRead(pin);\n // returns HIGH or LOW\n\n// Fast direct port manipulation:\nPORTB |= (1 << PB5); // High Pin 13\nPORTB &= ~(1 << PB5); // Low Pin 13", - FontSize = 9.5, TextColorHex = "#E2E8F0", - FontFamily = "RobotoMono" - }, - - // Card 2.2: Analog I/O & PWM - new PdfShapeElement { X = 420, Y = 355, Width = 365, Height = 250, CornerRadius = 6, FillColorHex = "#1E293B", StrokeColorHex = "#334155", StrokeThickness = 1 }, - new PdfShapeElement { X = 420, Y = 355, Width = 365, Height = 30, CornerRadius = 6, FillColorHex = "#2563EB", StrokeColorHex = "#00000000" }, - new PdfTextElement { X = 435, Y = 362, Width = 335, Height = 20, Text = "5. Analog I/O & PWM Duty", FontSize = 12, IsBold = true, TextColorHex = "#FFFFFF" }, - new PdfTextElement - { - X = 435, Y = 392, Width = 335, Height = 205, - Text = "analogReference(type);\n // DEFAULT, INTERNAL, EXTERNAL\n\nint raw = analogRead(A0);\n // 10-bit ADC returns 0 to 1023 (0 to 5V)\n // Voltage = raw * (5.0 / 1023.0);\n\nanalogWrite(pin, duty);\n // 8-bit PWM (0 to 255) at 490Hz / 980Hz\n // PWM Pins: 3, 5, 6, 9, 10, 11 on Uno", - FontSize = 9.5, TextColorHex = "#E2E8F0", - FontFamily = "RobotoMono" - }, - - // Card 2.3: Timing & Delays - new PdfShapeElement { X = 420, Y = 615, Width = 365, Height = 175, CornerRadius = 6, FillColorHex = "#1E293B", StrokeColorHex = "#334155", StrokeThickness = 1 }, - new PdfShapeElement { X = 420, Y = 615, Width = 365, Height = 30, CornerRadius = 6, FillColorHex = "#2563EB", StrokeColorHex = "#00000000" }, - new PdfTextElement { X = 435, Y = 622, Width = 335, Height = 20, Text = "6. Timing & Scheduling", FontSize = 12, IsBold = true, TextColorHex = "#FFFFFF" }, - new PdfTextElement - { - X = 435, Y = 652, Width = 335, Height = 130, - Text = "unsigned long ms = millis();\n // Milliseconds since startup (overflow ~50 days)\n\nunsigned long us = micros();\n // Microseconds since startup (overflow ~70 mins)\n\ndelay(ms); // Blocking delay in milliseconds\ndelayMicroseconds(us); // Busy-wait in microseconds", - FontSize = 9.5, TextColorHex = "#E2E8F0", - FontFamily = "RobotoMono" - }, - - // Card 2.4: Math & Bitwise - new PdfShapeElement { X = 420, Y = 800, Width = 365, Height = 185, CornerRadius = 6, FillColorHex = "#1E293B", StrokeColorHex = "#334155", StrokeThickness = 1 }, - new PdfShapeElement { X = 420, Y = 800, Width = 365, Height = 30, CornerRadius = 6, FillColorHex = "#2563EB", StrokeColorHex = "#00000000" }, - new PdfTextElement { X = 435, Y = 807, Width = 335, Height = 20, Text = "7. Math & Mapping Utilities", FontSize = 12, IsBold = true, TextColorHex = "#FFFFFF" }, - new PdfTextElement - { - X = 435, Y = 837, Width = 335, Height = 140, - Text = "map(val, fromLow, fromHigh, toLow, toHigh);\nconstrain(x, a, b); // clips x between a and b\nmin(x, y); max(x, y); abs(x); sq(x); sqrt(x);\npow(base, exponent); sin(rad); cos(rad); tan(rad);\nbitRead(x, n); bitSet(x, n); bitClear(x, n);\nbitWrite(x, n, b); bit(n); // (1 << n)", - FontSize = 9.5, TextColorHex = "#E2E8F0", - FontFamily = "RobotoMono" - }, - - // ========================================================================= - // COLUMN 3: SERIAL & BUS PROTOCOLS (X: 810, W: 365) - // ========================================================================= - // Card 3.1: Hardware UART Serial - new PdfShapeElement { X = 810, Y = 115, Width = 365, Height = 250, CornerRadius = 6, FillColorHex = "#1E293B", StrokeColorHex = "#334155", StrokeThickness = 1 }, - new PdfShapeElement { X = 810, Y = 115, Width = 365, Height = 30, CornerRadius = 6, FillColorHex = "#D97706", StrokeColorHex = "#00000000" }, - new PdfTextElement { X = 825, Y = 122, Width = 335, Height = 20, Text = "8. Hardware UART Serial", FontSize = 12, IsBold = true, TextColorHex = "#FFFFFF" }, - new PdfTextElement - { - X = 825, Y = 152, Width = 335, Height = 205, - Text = "Serial.begin(baud);\n // Typical baud: 9600, 115200, 230400\n\nwhile (!Serial); // Wait for USB on Leonardo/RP2040\nSerial.print(\"Value: \");\nSerial.println(val, HEX); // BIN, DEC, HEX, OCT\n\nif (Serial.available() > 0) {\n int byteIn = Serial.read();\n String str = Serial.readStringUntil('\\n');\n}\nSerial.flush(); // Waits for transmission complete", - FontSize = 9.5, TextColorHex = "#E2E8F0", - FontFamily = "RobotoMono" - }, - - // Card 3.2: I2C & SPI Communication - new PdfShapeElement { X = 810, Y = 375, Width = 365, Height = 270, CornerRadius = 6, FillColorHex = "#1E293B", StrokeColorHex = "#334155", StrokeThickness = 1 }, - new PdfShapeElement { X = 810, Y = 375, Width = 365, Height = 30, CornerRadius = 6, FillColorHex = "#D97706", StrokeColorHex = "#00000000" }, - new PdfTextElement { X = 825, Y = 382, Width = 335, Height = 20, Text = "9. I2C (Wire) & SPI Protocols", FontSize = 12, IsBold = true, TextColorHex = "#FFFFFF" }, - new PdfTextElement - { - X = 825, Y = 412, Width = 335, Height = 225, - Text = "#include \nWire.begin(); // Join as Master\nWire.beginTransmission(0x68); // Device address\nWire.write(0x3B); // Register address\nWire.endTransmission();\nWire.requestFrom(0x68, 6);\nwhile (Wire.available()) { byte c = Wire.read(); }\n\n#include \nSPI.begin();\nSPI.beginTransaction(SPISettings(14000000, MSBFIRST, SPI_MODE0));\ndigitalWrite(SS, LOW);\nbyte response = SPI.transfer(0xAA);\ndigitalWrite(SS, HIGH);\nSPI.endTransaction();", - FontSize = 9.5, TextColorHex = "#E2E8F0", - FontFamily = "RobotoMono" - }, - - // Card 3.3: External Hardware Interrupts - new PdfShapeElement { X = 810, Y = 655, Width = 365, Height = 330, CornerRadius = 6, FillColorHex = "#1E293B", StrokeColorHex = "#334155", StrokeThickness = 1 }, - new PdfShapeElement { X = 810, Y = 655, Width = 365, Height = 30, CornerRadius = 6, FillColorHex = "#D97706", StrokeColorHex = "#00000000" }, - new PdfTextElement { X = 825, Y = 662, Width = 335, Height = 20, Text = "10. External Interrupts (ISR)", FontSize = 12, IsBold = true, TextColorHex = "#FFFFFF" }, - new PdfTextElement - { - X = 825, Y = 692, Width = 335, Height = 285, - Text = "attachInterrupt(digitalPinToInterrupt(pin), ISR, mode);\n\nModes:\n LOW: Trigger whenever pin is LOW\n CHANGE: Trigger on any state transition\n RISING: Trigger on LOW to HIGH\n FALLING: Trigger on HIGH to LOW\n\nISR Rules:\n - Keep execution ultra-short (no delay() or Serial)\n - All shared variables MUST be marked 'volatile'\n\nvolatile int counter = 0;\nvoid myISR() {\n counter++;\n}\n\ndetachInterrupt(digitalPinToInterrupt(pin));", - FontSize = 9.5, TextColorHex = "#E2E8F0", - FontFamily = "RobotoMono" - }, - - // ========================================================================= - // COLUMN 4: PINOUT MATRIX & ELECTRICAL RATINGS (X: 1200, W: 370) - // ========================================================================= - // Card 4.1: Pinout Table - new PdfShapeElement { X = 1200, Y = 115, Width = 370, Height = 580, CornerRadius = 6, FillColorHex = "#1E293B", StrokeColorHex = "#334155", StrokeThickness = 1 }, - new PdfShapeElement { X = 1200, Y = 115, Width = 370, Height = 30, CornerRadius = 6, FillColorHex = "#9333EA", StrokeColorHex = "#00000000" }, - new PdfTextElement { X = 1215, Y = 122, Width = 340, Height = 20, Text = "11. Hardware Pinout & Port Map", FontSize = 12, IsBold = true, TextColorHex = "#FFFFFF" }, - - new PdfTableElement - { - X = 1205, Y = 155, Width = 360, Height = 530, - HeaderBackgroundHex = "#6B21A8", - HeaderTextHex = "#FFFFFF", - BorderColorHex = "#334155", - AlternateRowBackgroundHex = "#0F172A", - Headers = new List { "Pin", "Port", "Function", "PWM", "Notes" }, - Rows = new List> - { - new() { "D0", "PD0", "RX", "-", "Hardware Serial In" }, - new() { "D1", "PD1", "TX", "-", "Hardware Serial Out" }, - new() { "D2", "PD2", "INT0", "-", "External Interrupt 0" }, - new() { "D3", "PD3", "INT1", "Yes", "Ext Int 1 / 490Hz" }, - new() { "D4", "PD4", "T0", "-", "Timer 0 ext clock" }, - new() { "D5", "PD5", "T1", "Yes", "Timer 1 / 980Hz" }, - new() { "D6", "PD6", "AIN0", "Yes", "Analog comp / 980Hz" }, - new() { "D7", "PD7", "AIN1", "-", "Analog comparator" }, - new() { "D8", "PB0", "ICP1", "-", "Timer 1 input capture" }, - new() { "D9", "PB1", "OC1A", "Yes", "Timer 1 / 490Hz" }, - new() { "D10", "PB2", "SS", "Yes", "SPI Chip Select" }, - new() { "D11", "PB3", "MOSI", "Yes", "SPI Master Out" }, - new() { "D12", "PB4", "MISO", "-", "SPI Master In" }, - new() { "D13", "PB5", "SCK", "-", "SPI Clock / Built-in LED" }, - new() { "A0", "PC0", "ADC0", "-", "Analog input 0" }, - new() { "A1", "PC1", "ADC1", "-", "Analog input 1" }, - new() { "A2", "PC2", "ADC2", "-", "Analog input 2" }, - new() { "A3", "PC3", "ADC3", "-", "Analog input 3" }, - new() { "A4", "PC4", "SDA", "-", "I2C Data line" }, - new() { "A5", "PC5", "SCL", "-", "I2C Clock line" } - } - }, - - // Card 4.2: Electrical Ratings - new PdfShapeElement { X = 1200, Y = 705, Width = 370, Height = 280, CornerRadius = 6, FillColorHex = "#1E293B", StrokeColorHex = "#334155", StrokeThickness = 1 }, - new PdfShapeElement { X = 1200, Y = 705, Width = 370, Height = 30, CornerRadius = 6, FillColorHex = "#DC2626", StrokeColorHex = "#00000000" }, - new PdfTextElement { X = 1215, Y = 712, Width = 340, Height = 20, Text = "12. Electrical Limits & Ratings", FontSize = 12, IsBold = true, TextColorHex = "#FFFFFF" }, - new PdfTextElement - { - X = 1215, Y = 742, Width = 340, Height = 235, - Text = "Operating Voltage: 5.0V\nInput Voltage (VIN): 7.0V - 12.0V (Limit: 6-20V)\nMax DC Current per I/O: 40 mA (Safe: 20 mA)\nTotal Microcontroller DC: 200 mA (Absolute Max VCC/GND)\n3.3V Pin Current Limit: 50 mA (From onboard LDO)\nFlash Memory: 32 KB (0.5 KB bootloader)\nSRAM: 2 KB (Static RAM)\nEEPROM: 1 KB (Internal non-volatile)\nClock Speed: 16 MHz Quartz Crystal\nADC Resolution: 10-bit (1024 discrete steps)", - FontSize = 9.5, TextColorHex = "#E2E8F0", - FontFamily = "RobotoMono" - } - } - }; - - doc.Pages.Add(page); - return doc; - } -} diff --git a/src/PdfEditorApp/ViewLocator.cs b/src/PdfEditorApp/ViewLocator.cs deleted file mode 100644 index 4a975f5..0000000 --- a/src/PdfEditorApp/ViewLocator.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System; -using System.Diagnostics.CodeAnalysis; -using Avalonia.Controls; -using Avalonia.Controls.Templates; -using PdfEditorApp.ViewModels; - -namespace PdfEditorApp; - -/// -/// Given a view model, returns the corresponding view if possible. -/// -[RequiresUnreferencedCode( - "Default implementation of ViewLocator involves reflection which may be trimmed away.", - Url = "https://docs.avaloniaui.net/docs/concepts/view-locator")] -public class ViewLocator : IDataTemplate -{ - public Control? Build(object? param) - { - if (param is null) - return null; - - var name = param.GetType().FullName!.Replace("ViewModel", "View", StringComparison.Ordinal); - var type = Type.GetType(name); - - if (type != null) - { - return (Control)Activator.CreateInstance(type)!; - } - - return new TextBlock { Text = "Not Found: " + name }; - } - - public bool Match(object? data) - { - return data is ViewModelBase; - } -} diff --git a/src/PdfEditorApp/ViewModels/AiAssistantViewModel.cs b/src/PdfEditorApp/ViewModels/AiAssistantViewModel.cs deleted file mode 100644 index c544269..0000000 --- a/src/PdfEditorApp/ViewModels/AiAssistantViewModel.cs +++ /dev/null @@ -1,889 +0,0 @@ -using System; -using System.Collections.ObjectModel; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using CommunityToolkit.Mvvm.ComponentModel; -using CommunityToolkit.Mvvm.Input; -using CommunityToolkit.Mvvm.Messaging; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Messages; -using PdfEditorApp.Models; -using PdfEditorApp.Services; -using PdfEditorApp.Services.AI; - -using PdfEditorApp.ViewModels.ElementViewModels; - -namespace PdfEditorApp.ViewModels; - -/// -/// Defines the active scope targeted by the AI Studio Assistant. -/// -public enum AiTargetKind -{ - Element, - EntirePage, - PointOnPage -} - -/// -/// ViewModel controlling the interactive AI Studio Assistant dialog/panel. -/// Powers natural language prompting, in-place element modifications, live tool invocation tracking, and atomic canvas undo. -/// -public partial class AiAssistantViewModel : ViewModelBase -{ - private readonly IPdfStudioAgentService _agentService; - private readonly IUiSettingsService _uiSettingsService; - private readonly IAiService _aiService; - private CancellationTokenSource? _generationCts; - - public Func? GetCurrentPage { get; set; } - public Func? GetSelectedElement { get; set; } - public IUndoRedoService? UndoRedo { get; set; } - public Action? RequestOpenSettings { get; set; } - public Action? RequestReturnToThumbnails { get; set; } - - [ObservableProperty] - private bool _isOpen; - - [ObservableProperty] - private string _promptText = string.Empty; - - [ObservableProperty] - private bool _isGenerating; - - [ObservableProperty] - private string _statusMessage = "Ready to generate document elements"; - - [ObservableProperty] - private string _lastGenerationSummary = string.Empty; - - [ObservableProperty] - private bool _canUndoLastGeneration; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(HasTargetElement))] - [NotifyPropertyChangedFor(nameof(HasTargetPoint))] - [NotifyPropertyChangedFor(nameof(IsPointTargetMode))] - [NotifyPropertyChangedFor(nameof(IsPageTargetMode))] - [NotifyPropertyChangedFor(nameof(TargetHeaderBadge))] - [NotifyPropertyChangedFor(nameof(TargetDescription))] - private AiTargetKind _targetKind = AiTargetKind.EntirePage; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(TargetPointX))] - [NotifyPropertyChangedFor(nameof(TargetPointY))] - [NotifyPropertyChangedFor(nameof(HasTargetPoint))] - [NotifyPropertyChangedFor(nameof(TargetPointDisplay))] - [NotifyPropertyChangedFor(nameof(TargetHeaderBadge))] - [NotifyPropertyChangedFor(nameof(TargetDescription))] - private (double X, double Y)? _targetPoint; - - public double TargetPointX => TargetPoint?.X ?? 0; - public double TargetPointY => TargetPoint?.Y ?? 0; - public bool HasTargetPoint => TargetPoint != null; - public bool IsPointTargetMode => TargetKind == AiTargetKind.PointOnPage; - public bool IsPageTargetMode => TargetKind == AiTargetKind.EntirePage; - public string TargetPointDisplay => TargetPoint.HasValue ? $"X: {TargetPoint.Value.X:0}, Y: {TargetPoint.Value.Y:0}" : ""; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(TargetPageNumber))] - [NotifyPropertyChangedFor(nameof(TargetPageDimensions))] - [NotifyPropertyChangedFor(nameof(TargetHeaderBadge))] - [NotifyPropertyChangedFor(nameof(TargetDescription))] - private PageViewModel? _targetPage; - - public int TargetPageNumber => TargetPage?.PageNumber ?? GetCurrentPage?.Invoke()?.PageNumber ?? 1; - public string TargetPageDimensions - { - get - { - var p = TargetPage ?? GetCurrentPage?.Invoke(); - return p != null ? $"{p.Width:0} × {p.Height:0} pt" : "800 × 1131 pt"; - } - } - - public string TargetHeaderBadge => TargetKind switch - { - AiTargetKind.Element when TargetElement != null => TargetElementKindBadge, - AiTargetKind.PointOnPage when TargetPoint.HasValue => $"Point ({TargetPointDisplay})", - _ => $"Page {TargetPageNumber}" - }; - - public string TargetDescription => TargetKind switch - { - AiTargetKind.Element when TargetElement != null => TargetElementTitle, - AiTargetKind.PointOnPage when TargetPoint.HasValue => $"Point at ({TargetPointDisplay}) on Page {TargetPageNumber}", - _ => $"Page {TargetPageNumber} ({TargetPageDimensions})" - }; - - public string TargetIcon => TargetKind switch - { - AiTargetKind.Element => TargetElementKindIcon, - AiTargetKind.PointOnPage => "Target", - _ => "FileDocumentOutline" - }; - - [ObservableProperty] - private ElementViewModelBase? _targetElement; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(HasTargetElement))] - private bool _isModifyMode; - - [ObservableProperty] - private string _targetElementTitle = string.Empty; - - [ObservableProperty] - private string _targetElementKindBadge = string.Empty; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(TargetIcon))] - private string _targetElementKindIcon = "AutoFixHigh"; - - public bool HasTargetElement => TargetElement != null; - - [ObservableProperty] - private string _activeModelDisplayName = "Llama 3.2"; - - [ObservableProperty] - private string _activeModelTierBadge = "Free / Local"; - - [ObservableProperty] - private AiModelTier _activeModelTier = AiModelTier.FreeLocal; - - [ObservableProperty] - private bool _isActiveModelFree = true; - - public bool IsActiveModelFreeLocal => ActiveModelTier == AiModelTier.FreeLocal; - public bool IsActiveModelFreeCloud => ActiveModelTier == AiModelTier.FreeCloud; - public bool IsActiveModelPaidCloud => ActiveModelTier == AiModelTier.PaidCloud; - - public ObservableCollection Sessions { get; } = new(); - - [ObservableProperty] - private AiChatSession? _currentSession; - - [ObservableProperty] - private bool _isHistoryDrawerOpen; - - public ObservableCollection ActivityLogs { get; } = new(); - public ObservableCollection SuggestedPrompts { get; } = new(); - - public AiAssistantViewModel( - IPdfStudioAgentService agentService, - IUiSettingsService uiSettingsService, - IAiService aiService) - { - _agentService = agentService ?? throw new ArgumentNullException(nameof(agentService)); - _uiSettingsService = uiSettingsService ?? throw new ArgumentNullException(nameof(uiSettingsService)); - _aiService = aiService ?? throw new ArgumentNullException(nameof(aiService)); - - EnsureActiveSession(); - PopulateDefaultSuggestions(); - UpdateActiveModelDisplay(); - - _uiSettingsService.SettingsChanged += _ => UpdateActiveModelDisplay(); - } - - public void PopulateDefaultSuggestions() - { - PopulateEntirePageSuggestions(); - } - - public void PopulateEntirePageSuggestions() - { - SuggestedPrompts.Clear(); - SuggestedPrompts.Add("Add a modern corporate invoice header with company name Acme Corp, invoice #1001, date today, and a blue accent bar"); - SuggestedPrompts.Add("Design a modern corporate invoice layout with header, 4-row itemized table, and payment summary"); - SuggestedPrompts.Add("Format this entire page as an elegant certificate with Georgia serif title and gold border"); - SuggestedPrompts.Add("Create a balanced two-column report page with executive summary callout card and statistics table"); - SuggestedPrompts.Add("Add a branded header with logo badge, full-width accent divider, and confidentiality footer"); - SuggestedPrompts.Add("Clean up page margins and organize all sections with consistent 20pt vertical spacing"); - } - - public void PopulatePointSuggestions() - { - SuggestedPrompts.Clear(); - SuggestedPrompts.Add("Insert a modern section heading and subheader here"); - SuggestedPrompts.Add("Add a 4-column financial data table starting at this point"); - SuggestedPrompts.Add("Insert an amber callout card with important notice title and description here"); - SuggestedPrompts.Add("Add a signature block with sign line, date, and verified badge here"); - SuggestedPrompts.Add("Insert a scannable QR code and payment pill badge here"); - SuggestedPrompts.Add("Add an elegant floral divider ornament at this position"); - } - - public void UpdateActiveModelDisplay() - { - var settings = _uiSettingsService.Settings.AiSettings; - var catalog = _aiService.GetUnifiedModelCatalog(settings); - var match = catalog.FirstOrDefault(m => m.Id.Equals(settings.SelectedModelId, StringComparison.OrdinalIgnoreCase)) - ?? catalog.FirstOrDefault(); - - if (match != null) - { - ActiveModelDisplayName = match.DisplayName; - ActiveModelTier = match.Tier; - ActiveModelTierBadge = match.TierBadgeText; - IsActiveModelFree = match.IsFree; - } - else - { - ActiveModelDisplayName = settings.SelectedModelId; - bool isOllama = settings.SelectedProvider == AiProviderType.OllamaLocal; - bool isRemote = isOllama && settings.IsOllamaRemote; - ActiveModelTier = isOllama ? (isRemote ? AiModelTier.FreeCloud : AiModelTier.FreeLocal) : AiModelTier.PaidCloud; - ActiveModelTierBadge = ActiveModelTier switch - { - AiModelTier.FreeLocal => "Free / Local", - AiModelTier.FreeCloud => "Free / Cloud", - _ => "Paid / Cloud" - }; - IsActiveModelFree = isOllama; - } - - OnPropertyChanged(nameof(IsActiveModelFreeLocal)); - OnPropertyChanged(nameof(IsActiveModelFreeCloud)); - OnPropertyChanged(nameof(IsActiveModelPaidCloud)); - } - - [RelayCommand] - public void Open() - { - UpdateActiveModelDisplay(); - var selected = GetSelectedElement?.Invoke(); - if (selected != null) - { - OpenForElement(selected); - return; - } - - if (TargetPoint.HasValue) - { - TargetKind = AiTargetKind.PointOnPage; - PopulatePointSuggestions(); - } - else - { - TargetEntirePage(GetCurrentPage?.Invoke()); - } - IsOpen = true; - } - - public void OpenForElement(ElementViewModelBase element) - { - UpdateActiveModelDisplay(); - TargetElement = element; - TargetPoint = null; - TargetKind = AiTargetKind.Element; - IsModifyMode = true; - TargetElementTitle = GetElementTitle(element); - TargetElementKindBadge = element.Kind.ToString(); - TargetElementKindIcon = GetElementIcon(element); - PopulateElementSuggestions(element); - IsOpen = true; - } - - public void UpdateTargetElement(ElementViewModelBase? element) - { - if (element != null) - { - TargetElement = element; - TargetPoint = null; - TargetKind = AiTargetKind.Element; - IsModifyMode = true; - TargetElementTitle = GetElementTitle(element); - TargetElementKindBadge = element.Kind.ToString(); - TargetElementKindIcon = GetElementIcon(element); - PopulateElementSuggestions(element); - } - else - { - TargetElement = null; - IsModifyMode = false; - if (TargetKind == AiTargetKind.Element) - { - if (TargetPoint.HasValue) - { - TargetKind = AiTargetKind.PointOnPage; - PopulatePointSuggestions(); - } - else - { - TargetEntirePage(GetCurrentPage?.Invoke()); - } - } - } - } - - [RelayCommand] - public void TargetEntirePage(PageViewModel? page = null) - { - TargetPage = page ?? GetCurrentPage?.Invoke(); - TargetPoint = null; - TargetElement = null; - IsModifyMode = false; - TargetKind = AiTargetKind.EntirePage; - PopulateEntirePageSuggestions(); - StatusMessage = $"Targeted Entire Page {TargetPageNumber} ({TargetPageDimensions})"; - } - - public void TargetPointOnPage(double x, double y, PageViewModel? page = null) - { - TargetPage = page ?? GetCurrentPage?.Invoke(); - TargetPoint = (Math.Max(0, x), Math.Max(0, y)); - TargetElement = null; - IsModifyMode = false; - TargetKind = AiTargetKind.PointOnPage; - PopulatePointSuggestions(); - StatusMessage = $"Targeted Point at ({TargetPointDisplay}) on Page {TargetPageNumber}"; - IsOpen = true; - } - - [RelayCommand] - public void ClearTargetPoint() - { - TargetEntirePage(); - } - - [RelayCommand] - public void SwitchToEntirePageMode() - { - TargetEntirePage(); - } - - [RelayCommand] - public void SwitchToPointTargetMode() - { - var page = TargetPage ?? GetCurrentPage?.Invoke(); - if (!TargetPoint.HasValue) - { - double cx = (page?.Width ?? 800) / 2.0; - double cy = 250.0; - TargetPointOnPage(cx, cy, page); - } - else - { - TargetKind = AiTargetKind.PointOnPage; - PopulatePointSuggestions(); - } - } - - [RelayCommand] - public void SwitchToModifyMode() - { - if (TargetElement != null) - { - TargetKind = AiTargetKind.Element; - IsModifyMode = true; - PopulateElementSuggestions(TargetElement); - } - } - - [RelayCommand] - public void SwitchToCreateMode() - { - IsModifyMode = false; - if (TargetPoint.HasValue) - { - TargetKind = AiTargetKind.PointOnPage; - PopulatePointSuggestions(); - } - else - { - TargetKind = AiTargetKind.EntirePage; - PopulateDefaultSuggestions(); - } - } - - [RelayCommand] - public void DeselectElementTarget() - { - TargetElement = null; - SwitchToCreateMode(); - } - - private static string GetElementTitle(ElementViewModelBase element) - { - if (element is ChartElementViewModel chart) - { - return string.IsNullOrWhiteSpace(chart.Title) ? "Untitled Chart" : chart.Title; - } - if (element is TextElementViewModel text) - { - string t = text.Text?.Replace("\r", " ").Replace("\n", " ").Trim() ?? ""; - return string.IsNullOrWhiteSpace(t) ? "Text Element" : (t.Length <= 35 ? t : t[..35] + "..."); - } - if (element is TableElementViewModel table) - { - return $"Table ({table.Rows.Count} rows, {table.Headers.Count} cols)"; - } - if (element is ShapeElementViewModel shape) - { - return $"{shape.ShapeType} Shape"; - } - if (element is ImageElementViewModel img) - { - return string.IsNullOrWhiteSpace(img.AltText) ? "Image Asset" : img.AltText; - } - if (element is MathElementViewModel math) - { - if (!string.IsNullOrWhiteSpace(math.PresetName)) - { - return math.PresetName; - } - string f = math.Formula?.Trim() ?? ""; - return string.IsNullOrWhiteSpace(f) ? "Math Formula" : (f.Length <= 35 ? f : f[..35] + "..."); - } - if (element is SvgElementViewModel) - { - return "Vector SVG Ornament"; - } - if (element is DividerElementViewModel) - { - return "Divider Line"; - } - if (element is FormFieldElementViewModel form) - { - return string.IsNullOrWhiteSpace(form.Label) ? "Form Field" : $"Field: {form.Label}"; - } - if (element is QrCodeElementViewModel qr) - { - return string.IsNullOrWhiteSpace(qr.Content) ? "QR Code" : $"QR: {qr.Content}"; - } - if (element is BarcodeElementViewModel barcode) - { - return string.IsNullOrWhiteSpace(barcode.CodeValue) ? "Barcode" : $"Barcode: {barcode.CodeValue}"; - } - if (element is StickyNoteElementViewModel note) - { - string nt = note.NoteText?.Trim() ?? ""; - return string.IsNullOrWhiteSpace(nt) ? "Sticky Note" : (nt.Length <= 30 ? nt : nt[..30] + "..."); - } - return $"{element.Kind} Element"; - } - - private static string GetElementIcon(ElementViewModelBase element) - { - return element switch - { - ChartElementViewModel => "ChartBoxOutline", - TextElementViewModel => "FormatText", - TableElementViewModel => "Table", - ShapeElementViewModel => "ShapeOutline", - ImageElementViewModel => "ImageOutline", - MathElementViewModel => "Sigma", - SvgElementViewModel => "VectorSquare", - DividerElementViewModel => "Minus", - FormFieldElementViewModel => "TextBoxOutline", - QrCodeElementViewModel => "Qrcode", - BarcodeElementViewModel => "Barcode", - StickyNoteElementViewModel => "NoteTextOutline", - _ => "AutoFixHigh" - }; - } - - private void PopulateElementSuggestions(ElementViewModelBase element) - { - SuggestedPrompts.Clear(); - - if (element is ChartElementViewModel) - { - SuggestedPrompts.Add("Switch chart type to a smooth Line chart"); - SuggestedPrompts.Add("Use Emerald Green / Mint color palette"); - SuggestedPrompts.Add("Add Q1 2027 Projections with +15% revenue growth"); - SuggestedPrompts.Add("Change to Donut Pie chart showing category share"); - SuggestedPrompts.Add("Sort categories in ascending order of values"); - SuggestedPrompts.Add("Convert to Horizontal Bar chart"); - } - else if (element is TextElementViewModel) - { - SuggestedPrompts.Add("Polish tone to be executive, authoritative, and concise"); - SuggestedPrompts.Add("Format with modern styled checkmarks (✔)"); - SuggestedPrompts.Add("Convert into a clean numbered list (1., 2., 3.)"); - SuggestedPrompts.Add("Summarize into 3 key bullet points"); - SuggestedPrompts.Add("Make title bold, 20pt, with #0F6CBD accent color"); - SuggestedPrompts.Add("Fix grammar, punctuation, and improve phrasing"); - SuggestedPrompts.Add("Translate content into Spanish"); - } - else if (element is TableElementViewModel) - { - SuggestedPrompts.Add("Add a Total summary row with computed column sums"); - SuggestedPrompts.Add("Format monetary columns with currency ($) and commas"); - SuggestedPrompts.Add("Change header theme to Emerald Green (#047857)"); - SuggestedPrompts.Add("Apply alternating row zebra shading"); - } - else if (element is ShapeElementViewModel) - { - SuggestedPrompts.Add("Change to soft rounded card with 12pt corner radius and subtle shadow"); - SuggestedPrompts.Add("Set fill to light blue tint (#EFF6FF) with blue stroke (#2563EB)"); - SuggestedPrompts.Add("Make shape a circle with emerald green theme"); - } - else if (element is MathElementViewModel) - { - SuggestedPrompts.Add("Add equation number (1.1) and right align"); - SuggestedPrompts.Add("Enlarge formula font to 18pt"); - SuggestedPrompts.Add("Set formula color to modern blue (#0F6CBD)"); - SuggestedPrompts.Add("Change to Pythagorean theorem: a^2 + b^2 = c^2"); - SuggestedPrompts.Add("Change to Quadratic formula: x = \\frac{-b \\pm \\sqrt{b^2 - 4ac}}{2a}"); - } - else if (element is ImageElementViewModel) - { - SuggestedPrompts.Add("Set opacity to 80% for clean watermark presentation"); - SuggestedPrompts.Add("Make image semi-transparent (50% opacity)"); - SuggestedPrompts.Add("Add rounded border (8pt) with blue accent"); - } - else if (element is SvgElementViewModel) - { - SuggestedPrompts.Add("Set tint color to Luxury Gold (#D97706)"); - SuggestedPrompts.Add("Set tint color to Modern Blue (#0F6CBD)"); - SuggestedPrompts.Add("Set tint color to Emerald Forest (#047857)"); - } - else if (element is DividerElementViewModel) - { - SuggestedPrompts.Add("Make divider line thicker (2.5pt)"); - SuggestedPrompts.Add("Set divider color to Modern Blue (#0F6CBD)"); - SuggestedPrompts.Add("Set divider color to Soft Slate (#CBD5E1)"); - } - else if (element is QrCodeElementViewModel) - { - SuggestedPrompts.Add("Update encoded URL to https://example.com"); - SuggestedPrompts.Add("Set dark color to Corporate Navy (#1E293B)"); - } - else if (element is BarcodeElementViewModel) - { - SuggestedPrompts.Add("Update barcode code value"); - SuggestedPrompts.Add("Set bar color to Corporate Navy (#1E293B)"); - } - else if (element is FormFieldElementViewModel) - { - SuggestedPrompts.Add("Make this a required field"); - SuggestedPrompts.Add("Set border color to Modern Blue (#0F6CBD)"); - } - else if (element is StickyNoteElementViewModel) - { - SuggestedPrompts.Add("Update status to Approved"); - SuggestedPrompts.Add("Change note color to Soft Amber (#FEF3C7)"); - SuggestedPrompts.Add("Change note color to Mint Green (#DCFCE7)"); - } - else - { - SuggestedPrompts.Add($"Enhance styling and appearance of this {element.Kind}"); - SuggestedPrompts.Add($"Resize and adjust alignment of this {element.Kind}"); - } - } - - [RelayCommand] - public void Close() - { - if (IsGenerating) - { - CancelGeneration(); - } - IsOpen = false; - RequestReturnToThumbnails?.Invoke(); - } - - public AiChatSession EnsureActiveSession() - { - if (CurrentSession != null) return CurrentSession; - - if (Sessions.Count > 0) - { - CurrentSession = Sessions[0]; - return CurrentSession; - } - - return CreateNewSession(); - } - - public AiChatSession CreateNewSession() - { - var session = new AiChatSession - { - Title = "New Chat" - }; - Sessions.Insert(0, session); - CurrentSession = session; - return session; - } - - [RelayCommand] - public void NewChat() - { - CreateNewSession(); - IsHistoryDrawerOpen = false; - ActivityLogs.Clear(); - CanUndoLastGeneration = false; - LastGenerationSummary = string.Empty; - StatusMessage = "Ready to generate document elements"; - } - - [RelayCommand] - public void SwitchSession(AiChatSession? session) - { - if (session != null && Sessions.Contains(session)) - { - CurrentSession = session; - IsHistoryDrawerOpen = false; - } - } - - [RelayCommand] - public void DeleteSession(AiChatSession? session) - { - if (session == null) return; - Sessions.Remove(session); - if (CurrentSession == session) - { - CurrentSession = Sessions.FirstOrDefault() ?? CreateNewSession(); - } - } - - [RelayCommand] - public void ClearCurrentChat() - { - CurrentSession?.Messages.Clear(); - ActivityLogs.Clear(); - CanUndoLastGeneration = false; - LastGenerationSummary = string.Empty; - } - - [RelayCommand] - public void ToggleHistoryDrawer() - { - IsHistoryDrawerOpen = !IsHistoryDrawerOpen; - } - - [RelayCommand] - public async Task SendSuggestedPromptAsync(string? prompt) - { - if (!string.IsNullOrWhiteSpace(prompt)) - { - PromptText = prompt; - await GenerateAsync(); - } - } - - [RelayCommand] - public void UsePrompt(string? prompt) - { - if (!string.IsNullOrWhiteSpace(prompt)) - { - PromptText = prompt; - } - } - - [RelayCommand] - public async Task GenerateAsync() - { - if (string.IsNullOrWhiteSpace(PromptText) || IsGenerating) return; - - var session = EnsureActiveSession(); - string prompt = PromptText.Trim(); - PromptText = string.Empty; - - if (session.Title == "New Chat") - { - session.Title = prompt.Length <= 28 ? prompt : prompt[..28] + "..."; - } - session.LastModified = DateTime.Now; - - var userMsg = new AiChatMessage - { - Role = AiChatRole.User, - Content = prompt, - TargetElementTitle = TargetKind switch - { - AiTargetKind.Element => TargetElementTitle, - AiTargetKind.PointOnPage => $"Point ({TargetPointDisplay})", - _ => $"Entire Page {TargetPageNumber}" - }, - TargetElementKind = TargetKind switch - { - AiTargetKind.Element => TargetElementKindBadge, - AiTargetKind.PointOnPage => "Point Target", - _ => "Entire Page" - } - }; - session.Messages.Add(userMsg); - - var assistantMsg = new AiChatMessage - { - Role = AiChatRole.Assistant, - IsGenerating = true, - Content = "Thinking & invoking agent tools..." - }; - session.Messages.Add(assistantMsg); - - IsGenerating = true; - CanUndoLastGeneration = false; - ActivityLogs.Clear(); - ActivityLogs.Add($"[{DateTime.Now:HH:mm:ss}] Prompt: \"{prompt}\""); - - _generationCts = new CancellationTokenSource(); - - try - { - var settings = _uiSettingsService.Settings.AiSettings; - - if (IsModifyMode && TargetElement != null && TargetKind == AiTargetKind.Element) - { - StatusMessage = $"Modifying {TargetElementKindBadge}..."; - var result = await _agentService.ModifyElementAsync( - TargetElement, - prompt, - settings, - msg => - { - StatusMessage = msg; - ActivityLogs.Add($"[{DateTime.Now:HH:mm:ss}] {msg}"); - assistantMsg.ToolCalls.Add($"[{DateTime.Now:HH:mm:ss}] {msg}"); - }, - _generationCts.Token); - - assistantMsg.IsGenerating = false; - assistantMsg.Duration = result.Duration; - assistantMsg.IsSuccess = result.Success; - assistantMsg.Content = result.Message; - - if (result.Success) - { - LastGenerationSummary = result.Message; - StatusMessage = $"Completed! {result.Message}"; - CanUndoLastGeneration = true; - assistantMsg.CanUndo = true; - assistantMsg.UndoAction = () => UndoGeneration(); - ActivityLogs.Add($"[{DateTime.Now:HH:mm:ss}] Finished successfully in {result.Duration.TotalSeconds:0.1}s"); - TriggerToast($"✨ AI updated {TargetElementKindBadge}!", ToastNotificationType.Success, "AutoFixHigh"); - TargetElementTitle = GetElementTitle(TargetElement); - } - else - { - LastGenerationSummary = result.Message; - StatusMessage = "Modification finished with notice."; - ActivityLogs.Add($"[{DateTime.Now:HH:mm:ss}] {result.Message}"); - TriggerToast(result.Message, ToastNotificationType.Warning, "InformationOutline"); - } - } - else - { - var targetPage = GetCurrentPage?.Invoke(); - if (targetPage == null) - { - assistantMsg.IsGenerating = false; - assistantMsg.IsSuccess = false; - assistantMsg.Content = "No active document page found. Please open or create a page."; - TriggerToast("No active document page found. Please open or create a page.", ToastNotificationType.Warning, "AlertOutline"); - return; - } - - var targetPt = TargetKind == AiTargetKind.PointOnPage ? TargetPoint : null; - StatusMessage = targetPt.HasValue - ? $"Generating elements at ({TargetPointDisplay})..." - : "Initializing AI agent on page..."; - - var result = await _agentService.ExecutePromptAsync( - prompt, - targetPage, - settings, - msg => - { - StatusMessage = msg; - ActivityLogs.Add($"[{DateTime.Now:HH:mm:ss}] {msg}"); - assistantMsg.ToolCalls.Add($"[{DateTime.Now:HH:mm:ss}] {msg}"); - }, - _generationCts.Token, - targetPt); - - assistantMsg.IsGenerating = false; - assistantMsg.Duration = result.Duration; - assistantMsg.IsSuccess = result.Success; - assistantMsg.Content = result.Message; - - if (result.Success) - { - LastGenerationSummary = result.Message; - StatusMessage = $"Completed! {result.ElementsCreatedCount} elements added."; - CanUndoLastGeneration = true; - assistantMsg.CanUndo = true; - assistantMsg.UndoAction = () => UndoGeneration(); - ActivityLogs.Add($"[{DateTime.Now:HH:mm:ss}] Finished successfully in {result.Duration.TotalSeconds:0.1}s"); - string successToast = targetPt.HasValue - ? $"AI generated {result.ElementsCreatedCount} elements at ({TargetPointDisplay})!" - : $"AI Studio generated {result.ElementsCreatedCount} elements on Page {targetPage.PageNumber}!"; - TriggerToast(successToast, ToastNotificationType.Success, "AutoFixHigh"); - } - else - { - LastGenerationSummary = result.Message; - StatusMessage = "Generation finished with notice."; - ActivityLogs.Add($"[{DateTime.Now:HH:mm:ss}] {result.Message}"); - TriggerToast(result.Message, ToastNotificationType.Warning, "InformationOutline"); - } - } - } - catch (OperationCanceledException) - { - assistantMsg.IsGenerating = false; - assistantMsg.IsSuccess = false; - assistantMsg.Content = "Generation cancelled by user."; - StatusMessage = "Generation cancelled."; - ActivityLogs.Add($"[{DateTime.Now:HH:mm:ss}] Generation was cancelled by user."); - TriggerToast("AI Generation cancelled", ToastNotificationType.General, "CloseCircleOutline"); - } - catch (Exception ex) - { - assistantMsg.IsGenerating = false; - assistantMsg.IsSuccess = false; - assistantMsg.Content = $"Error: {ex.Message}"; - StatusMessage = $"Error: {ex.Message}"; - ActivityLogs.Add($"[{DateTime.Now:HH:mm:ss}] Error: {ex.Message}"); - TriggerToast($"AI Error: {ex.Message}", ToastNotificationType.Danger, "AlertOctagonOutline"); - } - finally - { - IsGenerating = false; - _generationCts?.Dispose(); - _generationCts = null; - session.LastModified = DateTime.Now; - } - } - - [RelayCommand] - public void CancelGeneration() - { - _generationCts?.Cancel(); - } - - [RelayCommand] - public void UndoGeneration() - { - if (UndoRedo != null && UndoRedo.CanUndo) - { - string? undone = UndoRedo.Undo(); - CanUndoLastGeneration = false; - StatusMessage = "AI elements reverted."; - ActivityLogs.Add($"[{DateTime.Now:HH:mm:ss}] Reverted action: {undone}"); - TriggerToast("Reverted AI-generated elements", ToastNotificationType.Primary, "Undo"); - - var lastAssistant = CurrentSession?.Messages.LastOrDefault(m => m.IsAssistant && m.CanUndo); - if (lastAssistant != null) - { - lastAssistant.CanUndo = false; - } - } - } - - [RelayCommand] - public void OpenSettings() - { - IsOpen = false; - RequestOpenSettings?.Invoke(); - } - - private void TriggerToast(string message, ToastNotificationType type, string icon) - { - WeakReferenceMessenger.Default.Send(new ShowToastMessage(message, type, icon)); - } -} diff --git a/src/PdfEditorApp/ViewModels/AiSettingsViewModel.cs b/src/PdfEditorApp/ViewModels/AiSettingsViewModel.cs deleted file mode 100644 index b072db1..0000000 --- a/src/PdfEditorApp/ViewModels/AiSettingsViewModel.cs +++ /dev/null @@ -1,691 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Linq; -using System.Threading.Tasks; -using CommunityToolkit.Mvvm.ComponentModel; -using CommunityToolkit.Mvvm.Input; -using CommunityToolkit.Mvvm.Messaging; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Messages; -using PdfEditorApp.Models; -using PdfEditorApp.Services; -using PdfEditorApp.Services.AI; - -namespace PdfEditorApp.ViewModels; - -/// -/// ViewModel managing AI provider configuration, Ollama local model discovery, and model selection. -/// -public partial class AiSettingsViewModel : ViewModelBase -{ - private readonly IUiSettingsService _uiSettingsService; - private readonly IAiService _aiService; - - [ObservableProperty] - private AiProviderType _selectedProvider = AiProviderType.OllamaLocal; - - [ObservableProperty] - private string _ollamaEndpoint = "http://localhost:11434"; - - [ObservableProperty] - private string _ollamaApiKey = string.Empty; - - [ObservableProperty] - private string _selectedModelId = "llama3.2"; - - [ObservableProperty] - private string _openAiApiKey = string.Empty; - - [ObservableProperty] - private string _customBaseUrl = string.Empty; - - [ObservableProperty] - private string _customModelName = string.Empty; - - [ObservableProperty] - private float _temperature = 0.7f; - - [ObservableProperty] - private string _systemInstructions = string.Empty; - - [ObservableProperty] - private bool _isDetectingModels; - - [ObservableProperty] - private bool _isFetchingLibrary; - - [ObservableProperty] - private string _ollamaLibrarySearchQuery = string.Empty; - - [ObservableProperty] - private bool _isTestingConnection; - - [ObservableProperty] - private string _testConnectionStatus = string.Empty; - - [ObservableProperty] - private bool _testConnectionSuccess; - - [ObservableProperty] - private bool _hasTestedConnection; - - [ObservableProperty] - private AiModelInfo? _selectedModel; - - public ObservableCollection AvailableModels { get; } = new(); - - public ObservableCollection PopularModelSuggestions { get; } = new(); - - public ObservableCollection CustomModelHistory { get; } = new(); - - public bool IsOllamaProvider => SelectedProvider == AiProviderType.OllamaLocal; - public bool IsOpenAiProvider => SelectedProvider == AiProviderType.OpenAiCloud; - public bool IsCustomProvider => SelectedProvider == AiProviderType.CustomOpenAiCompatible; - - /// - /// Guaranteed non-null metadata for the currently active model (whether picked from library or custom typed). - /// - public AiModelInfo ActiveModelInfo - { - get - { - if (SelectedModel != null && string.Equals(SelectedModel.Id, SelectedModelId, StringComparison.OrdinalIgnoreCase)) - { - return SelectedModel; - } - - var match = AvailableModels.FirstOrDefault(m => m.Id.Equals(SelectedModelId, StringComparison.OrdinalIgnoreCase)); - if (match != null) - { - return match; - } - - bool isRemote = SelectedProvider switch - { - AiProviderType.OllamaLocal => !string.IsNullOrWhiteSpace(OllamaEndpoint) && - !OllamaEndpoint.Contains("localhost", StringComparison.OrdinalIgnoreCase) && - !OllamaEndpoint.Contains("127.0.0.1"), - AiProviderType.CustomOpenAiCompatible => !string.IsNullOrWhiteSpace(CustomBaseUrl) && - !CustomBaseUrl.Contains("localhost", StringComparison.OrdinalIgnoreCase) && - !CustomBaseUrl.Contains("127.0.0.1"), - _ => true - }; - - string? endpoint = SelectedProvider == AiProviderType.CustomOpenAiCompatible ? CustomBaseUrl : OllamaEndpoint; - return AiModelInfo.CreateForCustomId(SelectedModelId, SelectedProvider, isRemote, endpoint); - } - } - - /// - /// Contextual placeholder text for the active model input field. - /// - public string ModelInputPlaceholder => SelectedProvider switch - { - AiProviderType.OllamaLocal => "Type model name (e.g. llama3.2, mistral, deepseek-r1, qwen2.5)...", - AiProviderType.OpenAiCloud => "Type model name (e.g. gpt-4o, gpt-4o-mini, o3-mini)...", - _ => "Type ANY model name (e.g. openai/gpt-oss-120b, llama-3.3-70b-versatile, qwen/qwen3.6-27b)..." - }; - - /// - /// Subtitle description for Section C tailored to the active AI provider. - /// - public string ModelSectionSubtitle => SelectedProvider switch - { - AiProviderType.OllamaLocal => "Pick from installed models or enter any model tag from the Ollama library.", - AiProviderType.OpenAiCloud => "Select an official OpenAI model or enter an enterprise/fine-tuned model ID.", - _ => "Enter any custom model identifier supported by your endpoint. Future models are saved dynamically." - }; - - public AiSettingsViewModel() : this(new UiSettingsService(), new AiService()) - { - } - - public AiSettingsViewModel(IUiSettingsService uiSettingsService, IAiService aiService) - { - _uiSettingsService = uiSettingsService ?? throw new ArgumentNullException(nameof(uiSettingsService)); - _aiService = aiService ?? throw new ArgumentNullException(nameof(aiService)); - - LoadFromSettings(_uiSettingsService.Settings.AiSettings); - _uiSettingsService.SettingsChanged += s => LoadFromSettings(s.AiSettings); - - // Auto-discover models from Ollama daemon on startup (silent) - _ = DiscoverModelsCoreAsync(showToast: false); - } - - private bool _isSuppressingSave; - private bool _isSyncingModelProperties; - - private void LoadFromSettings(AiSettingsModel s) - { - _isSuppressingSave = true; - try - { - SelectedProvider = s.SelectedProvider; - OllamaEndpoint = s.OllamaEndpoint; - OllamaApiKey = s.OllamaApiKey; - SelectedModelId = s.SelectedModelId; - OpenAiApiKey = s.OpenAiApiKey; - CustomBaseUrl = s.CustomBaseUrl; - CustomModelName = s.CustomModelName; - Temperature = s.Temperature; - SystemInstructions = s.SystemInstructions; - - CustomModelHistory.Clear(); - if (s.CustomModelHistory != null && s.CustomModelHistory.Count > 0) - { - foreach (var m in s.CustomModelHistory) - { - if (!string.IsNullOrWhiteSpace(m) && !CustomModelHistory.Contains(m.Trim(), StringComparer.OrdinalIgnoreCase)) - { - CustomModelHistory.Add(m.Trim()); - } - } - } - - RefreshModelCatalog(s); - } - finally - { - _isSuppressingSave = false; - } - } - - public void RememberCustomModel(string modelId) - { - if (string.IsNullOrWhiteSpace(modelId)) return; - string clean = modelId.Trim(); - if (!CustomModelHistory.Contains(clean, StringComparer.OrdinalIgnoreCase)) - { - CustomModelHistory.Insert(0, clean); - if (!_isSuppressingSave) - { - SaveSettings(); - } - } - } - - [RelayCommand] - public void ApplyPreset(string? preset) - { - if (string.IsNullOrWhiteSpace(preset)) return; - - switch (preset.ToLowerInvariant()) - { - case "groq": - CustomBaseUrl = "https://api.groq.com/openai/v1"; - SelectedModelId = "openai/gpt-oss-120b"; - CustomModelName = "openai/gpt-oss-120b"; - RememberCustomModel("openai/gpt-oss-120b"); - TriggerToast("Preset applied: Groq (https://api.groq.com/openai/v1)", ToastNotificationType.Primary, "Flash"); - break; - - case "openrouter": - CustomBaseUrl = "https://openrouter.ai/api/v1"; - SelectedModelId = "meta-llama/llama-3.2-3b-instruct:free"; - CustomModelName = "meta-llama/llama-3.2-3b-instruct:free"; - RememberCustomModel("meta-llama/llama-3.2-3b-instruct:free"); - TriggerToast("Preset applied: OpenRouter (https://openrouter.ai/api/v1)", ToastNotificationType.Primary, "CloudOutline"); - break; - - case "together": - CustomBaseUrl = "https://api.together.xyz/v1"; - SelectedModelId = "meta-llama/Llama-3.3-70B-Instruct-Turbo"; - CustomModelName = "meta-llama/Llama-3.3-70B-Instruct-Turbo"; - RememberCustomModel("meta-llama/Llama-3.3-70B-Instruct-Turbo"); - TriggerToast("Preset applied: Together AI", ToastNotificationType.Primary, "Api"); - break; - - case "lmstudio": - CustomBaseUrl = "http://localhost:1234/v1"; - SelectedModelId = "local-model"; - CustomModelName = "local-model"; - TriggerToast("Preset applied: LM Studio (http://localhost:1234/v1)", ToastNotificationType.Primary, "Laptop"); - break; - } - - RefreshModelCatalog(); - } - - public void RefreshModelCatalog(AiSettingsModel? currentSettings = null) - { - var settings = currentSettings ?? BuildSettingsModel(); - var catalog = _aiService.GetUnifiedModelCatalog(settings); - - AvailableModels.Clear(); - PopularModelSuggestions.Clear(); - - if (IsOllamaProvider) - { - // Only Ollama local/cloud models - foreach (var m in catalog.Where(x => x.Provider == AiProviderType.OllamaLocal)) - { - AvailableModels.Add(m); - } - - foreach (var m in AvailableModels.Take(8)) - { - if (!string.IsNullOrEmpty(m?.Id)) - { - PopularModelSuggestions.Add(m.Id); - } - } - } - else if (IsOpenAiProvider) - { - // OpenAI models + cloud models - foreach (var m in catalog.Where(x => x.Provider != AiProviderType.OllamaLocal)) - { - AvailableModels.Add(m); - } - - PopularModelSuggestions.Add("gpt-4o-mini"); - PopularModelSuggestions.Add("gpt-4o"); - PopularModelSuggestions.Add("o1-mini"); - PopularModelSuggestions.Add("o3-mini"); - } - else // IsCustomProvider - { - var seenIds = new HashSet(StringComparer.OrdinalIgnoreCase); - - // 1. User's saved custom models from history (dynamic - never need to touch codebase) - foreach (var customM in CustomModelHistory.ToList()) - { - if (seenIds.Add(customM)) - { - AvailableModels.Add(AiModelInfo.CreateForCustomId(customM, AiProviderType.CustomOpenAiCompatible, isEndpointRemote: true)); - } - } - - // 2. Cloud-compatible models from catalog (Groq, OpenRouter) - NO Ollama models - foreach (var m in catalog.Where(x => x.Provider != AiProviderType.OllamaLocal)) - { - if (seenIds.Add(m.Id)) - { - AvailableModels.Add(m); - } - } - - // 3. Contextual Quick Picks based on entered endpoint - string baseUrl = (CustomBaseUrl ?? string.Empty).ToLowerInvariant(); - if (baseUrl.Contains("openrouter")) - { - PopularModelSuggestions.Add("meta-llama/llama-3.2-3b-instruct:free"); - PopularModelSuggestions.Add("deepseek/deepseek-r1"); - PopularModelSuggestions.Add("google/gemini-2.0-flash-exp:free"); - PopularModelSuggestions.Add("mistralai/mistral-7b-instruct:free"); - } - else // Default to Groq / high-speed LPU suggestions - { - PopularModelSuggestions.Add("openai/gpt-oss-120b"); - PopularModelSuggestions.Add("llama-3.3-70b-versatile"); - PopularModelSuggestions.Add("qwen/qwen-2.5-coder-32b"); - PopularModelSuggestions.Add("deepseek-r1-distill-llama-70b"); - PopularModelSuggestions.Add("llama-3.1-8b-instant"); - } - - // Append any user custom models to quick picks - var existingSuggestions = new HashSet(PopularModelSuggestions, StringComparer.OrdinalIgnoreCase); - foreach (var customM in CustomModelHistory.ToList().Take(4)) - { - if (existingSuggestions.Add(customM)) - { - PopularModelSuggestions.Add(customM); - } - } - } - - // Match selected model from catalog if present - var match = AvailableModels.FirstOrDefault(m => m != null && string.Equals(m.Id, SelectedModelId, StringComparison.OrdinalIgnoreCase)); - if (match != null) - { - SelectedModel = match; - } - else if (SelectedModel == null && !IsCustomProvider) - { - SelectedModel = AvailableModels.FirstOrDefault(); - if (SelectedModel != null && (string.IsNullOrWhiteSpace(SelectedModelId) || SelectedModelId == "llama3.2")) - { - SelectedModelId = SelectedModel.Id; - } - } - else if (match == null) - { - SelectedModel = null; - } - - OnPropertyChanged(nameof(ActiveModelInfo)); - } - - partial void OnSelectedProviderChanged(AiProviderType value) - { - OnPropertyChanged(nameof(IsOllamaProvider)); - OnPropertyChanged(nameof(IsOpenAiProvider)); - OnPropertyChanged(nameof(IsCustomProvider)); - OnPropertyChanged(nameof(ModelInputPlaceholder)); - OnPropertyChanged(nameof(ModelSectionSubtitle)); - OnPropertyChanged(nameof(ActiveModelInfo)); - if (!_isSuppressingSave) - { - SaveSettings(); - RefreshModelCatalog(); - } - } - - partial void OnOllamaEndpointChanged(string value) - { - if (!_isSuppressingSave) SaveSettings(); - } - - partial void OnOllamaApiKeyChanged(string value) - { - if (!_isSuppressingSave) SaveSettings(); - } - - partial void OnOpenAiApiKeyChanged(string value) - { - if (!_isSuppressingSave) SaveSettings(); - } - - partial void OnCustomBaseUrlChanged(string value) - { - OnPropertyChanged(nameof(ActiveModelInfo)); - if (!_isSuppressingSave) - { - SaveSettings(); - RefreshModelCatalog(); - } - } - - partial void OnCustomModelNameChanged(string value) - { - if (_isSuppressingSave || _isSyncingModelProperties) return; - - try - { - _isSyncingModelProperties = true; - if (IsCustomProvider && !string.IsNullOrWhiteSpace(value) && !string.Equals(SelectedModelId, value, StringComparison.OrdinalIgnoreCase)) - { - SelectedModelId = value.Trim(); - SelectedModel = AvailableModels.FirstOrDefault(m => m.Id.Equals(SelectedModelId, StringComparison.OrdinalIgnoreCase)); - OnPropertyChanged(nameof(ActiveModelInfo)); - } - } - finally - { - _isSyncingModelProperties = false; - } - - SaveSettings(); - } - - partial void OnTemperatureChanged(float value) - { - if (!_isSuppressingSave) SaveSettings(); - } - - partial void OnSystemInstructionsChanged(string value) - { - if (!_isSuppressingSave) SaveSettings(); - } - - partial void OnSelectedModelIdChanged(string value) - { - if (!string.IsNullOrWhiteSpace(value)) - { - var match = AvailableModels.FirstOrDefault(m => m.Id.Equals(value.Trim(), StringComparison.OrdinalIgnoreCase)); - if (!ReferenceEquals(SelectedModel, match)) - { - _isSuppressingSave = true; - SelectedModel = match; - _isSuppressingSave = false; - } - - if (!_isSyncingModelProperties && IsCustomProvider && !string.Equals(CustomModelName, value, StringComparison.OrdinalIgnoreCase)) - { - try - { - _isSyncingModelProperties = true; - CustomModelName = value.Trim(); - } - finally - { - _isSyncingModelProperties = false; - } - } - } - - OnPropertyChanged(nameof(ActiveModelInfo)); - if (!_isSuppressingSave) SaveSettings(); - } - - partial void OnSelectedModelChanged(AiModelInfo? value) - { - if (value != null && !_isSuppressingSave) - { - if (!string.Equals(SelectedModelId, value.Id, StringComparison.OrdinalIgnoreCase)) - { - SelectedModelId = value.Id; - } - OnPropertyChanged(nameof(ActiveModelInfo)); - SaveSettings(); - } - } - - [RelayCommand] - public void SelectModel(object? param) - { - if (param is AiModelInfo model) - { - SelectedModel = model; - SelectedModelId = model.Id; - } - else if (param is string modelId && !string.IsNullOrWhiteSpace(modelId)) - { - SelectedModelId = modelId.Trim(); - var match = AvailableModels.FirstOrDefault(m => m.Id.Equals(SelectedModelId, StringComparison.OrdinalIgnoreCase)); - if (match != null) - { - SelectedModel = match; - } - } - - if (IsCustomProvider && !string.IsNullOrWhiteSpace(SelectedModelId)) - { - RememberCustomModel(SelectedModelId); - } - } - - [RelayCommand] - public void SaveCustomModel(string? modelId) - { - var target = string.IsNullOrWhiteSpace(modelId) ? SelectedModelId : modelId; - if (!string.IsNullOrWhiteSpace(target)) - { - RememberCustomModel(target); - RefreshModelCatalog(); - TriggerToast($"Model '{target.Trim()}' saved to history!", ToastNotificationType.Success, "BookmarkCheckOutline"); - } - } - - [RelayCommand] - public void SetProvider(object? param) - { - AiProviderType provider; - if (param is AiProviderType p) provider = p; - else if (param is string s && Enum.TryParse(s, true, out var parsed)) provider = parsed; - else return; - - SelectedProvider = provider; - TriggerToast($"AI provider switched to {GetProviderTitle(provider)}", ToastNotificationType.Primary, "RobotOutline"); - } - - [RelayCommand] - public Task DiscoverModelsAsync() => DiscoverModelsCoreAsync(showToast: true); - - private async Task DiscoverModelsCoreAsync(bool showToast) - { - IsDetectingModels = true; - try - { - var discovered = await _aiService.DiscoverOllamaModelsAsync(OllamaEndpoint); - - if (discovered.Count > 0) - { - _uiSettingsService.UpdateSettings(s => - { - s.AiSettings.DiscoveredOllamaModels.Clear(); - s.AiSettings.DiscoveredOllamaModels.AddRange(discovered); - if (s.AiSettings.SelectedProvider == AiProviderType.OllamaLocal && - (string.IsNullOrWhiteSpace(s.AiSettings.SelectedModelId) || s.AiSettings.SelectedModelId == "llama3.2")) - { - s.AiSettings.SelectedModelId = discovered[0].Id; - } - }); - - RefreshModelCatalog(_uiSettingsService.Settings.AiSettings); - if (showToast) - { - TriggerToast($"Found {discovered.Count} local Ollama models!", ToastNotificationType.Success, "CheckCircleOutline"); - } - } - else if (showToast) - { - TriggerToast("No Ollama models detected. Ensure Ollama is running (`ollama serve`).", ToastNotificationType.Warning, "AlertOutline"); - } - } - catch (Exception ex) - { - if (showToast) - { - TriggerToast($"Ollama discovery error: {ex.Message}", ToastNotificationType.Danger, "AlertOctagonOutline"); - } - } - finally - { - IsDetectingModels = false; - } - } - - [RelayCommand] - public async Task FetchOnlineLibraryAsync() - { - IsFetchingLibrary = true; - try - { - var onlineModels = await _aiService.FetchOllamaOnlineLibraryAsync(OllamaLibrarySearchQuery); - if (onlineModels.Count > 0) - { - _uiSettingsService.UpdateSettings(s => - { - s.AiSettings.OllamaLibraryCache.Clear(); - s.AiSettings.OllamaLibraryCache.AddRange(onlineModels); - }); - - RefreshModelCatalog(_uiSettingsService.Settings.AiSettings); - TriggerToast($"Discovered {onlineModels.Count} models directly from Ollama library!", ToastNotificationType.Success, "CloudDownloadOutline"); - } - else - { - TriggerToast("No online models retrieved. Check internet connection.", ToastNotificationType.Warning, "AlertOutline"); - } - } - catch (Exception ex) - { - TriggerToast($"Error fetching Ollama library: {ex.Message}", ToastNotificationType.Danger, "AlertOctagonOutline"); - } - finally - { - IsFetchingLibrary = false; - } - } - - [RelayCommand] - public async Task TestConnectionAsync() - { - IsTestingConnection = true; - HasTestedConnection = false; - TestConnectionStatus = "Connecting..."; - - try - { - var settings = BuildSettingsModel(); - var (success, msg, latency) = await _aiService.TestConnectionAsync(settings); - - HasTestedConnection = true; - TestConnectionSuccess = success; - TestConnectionStatus = success - ? $"Connected ({latency.TotalMilliseconds:0}ms): {msg}" - : $"Failed ({latency.TotalMilliseconds:0}ms): {msg}"; - - if (success && IsCustomProvider && !string.IsNullOrWhiteSpace(SelectedModelId)) - { - RememberCustomModel(SelectedModelId); - } - - TriggerToast( - success ? "AI model connection verified!" : "Connection test failed.", - success ? ToastNotificationType.Success : ToastNotificationType.Danger, - success ? "CheckCircleOutline" : "AlertOctagonOutline"); - } - catch (Exception ex) - { - HasTestedConnection = true; - TestConnectionSuccess = false; - TestConnectionStatus = $"Error: {ex.Message}"; - TriggerToast($"Test error: {ex.Message}", ToastNotificationType.Danger, "AlertOctagonOutline"); - } - finally - { - IsTestingConnection = false; - } - } - - private AiSettingsModel BuildSettingsModel() - { - return new AiSettingsModel - { - SelectedProvider = SelectedProvider, - OllamaEndpoint = OllamaEndpoint, - OllamaApiKey = OllamaApiKey, - SelectedModelId = SelectedModelId, - OpenAiApiKey = OpenAiApiKey, - CustomBaseUrl = AiService.NormalizeCustomOpenAiBaseUrl(CustomBaseUrl), - CustomModelName = CustomModelName, - CustomModelHistory = CustomModelHistory.ToList(), - Temperature = Temperature, - SystemInstructions = SystemInstructions, - DiscoveredOllamaModels = _uiSettingsService.Settings.AiSettings.DiscoveredOllamaModels - }; - } - - private void SaveSettings() - { - _uiSettingsService.UpdateSettings(s => - { - s.AiSettings.SelectedProvider = SelectedProvider; - s.AiSettings.OllamaEndpoint = OllamaEndpoint; - s.AiSettings.OllamaApiKey = OllamaApiKey; - s.AiSettings.SelectedModelId = SelectedModelId; - s.AiSettings.OpenAiApiKey = OpenAiApiKey; - s.AiSettings.CustomBaseUrl = AiService.NormalizeCustomOpenAiBaseUrl(CustomBaseUrl); - s.AiSettings.CustomModelName = CustomModelName; - s.AiSettings.CustomModelHistory = CustomModelHistory.ToList(); - s.AiSettings.Temperature = Temperature; - s.AiSettings.SystemInstructions = SystemInstructions; - }); - } - - private void TriggerToast(string message, ToastNotificationType type, string icon) - { - WeakReferenceMessenger.Default.Send(new ShowToastMessage(message, type, icon)); - } - - private static string GetProviderTitle(AiProviderType provider) => provider switch - { - AiProviderType.OllamaLocal => "Local Ollama", - AiProviderType.OpenAiCloud => "OpenAI Cloud", - AiProviderType.CustomOpenAiCompatible => "Custom OpenAI-Compatible", - _ => "AI Provider" - }; -} diff --git a/src/PdfEditorApp/ViewModels/BatchGeneration/BatchGenerationViewModel.cs b/src/PdfEditorApp/ViewModels/BatchGeneration/BatchGenerationViewModel.cs deleted file mode 100644 index e8a35fc..0000000 --- a/src/PdfEditorApp/ViewModels/BatchGeneration/BatchGenerationViewModel.cs +++ /dev/null @@ -1,891 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Diagnostics; -using System.IO; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using Avalonia.Media.Imaging; -using Avalonia.Platform.Storage; -using CommunityToolkit.Mvvm.ComponentModel; -using CommunityToolkit.Mvvm.Input; -using PdfEditorApp.Core.Analysis; -using PdfEditorApp.Core.Data; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; -using PdfEditorApp.Models; -using PdfEditorApp.Services; -using PdfEditorApp.ViewModels.DataStudio; - -namespace PdfEditorApp.ViewModels.BatchGeneration; - -public partial class FieldMappingItemViewModel : ObservableObject -{ - [ObservableProperty] - private string _placeholderTag = string.Empty; - - [ObservableProperty] - private string _selectedColumnName = string.Empty; - - [ObservableProperty] - private FieldTransformType _transform = FieldTransformType.None; - - [ObservableProperty] - private string _customFormat = string.Empty; - - [ObservableProperty] - private string _defaultValue = string.Empty; - - [ObservableProperty] - private string _sampleValue = string.Empty; - - public ObservableCollection AvailableColumns { get; } = new(); - - public FieldMappingItem ToModel() - { - return new FieldMappingItem - { - PlaceholderTag = PlaceholderTag, - DataColumnName = SelectedColumnName, - Transform = Transform, - CustomFormat = CustomFormat, - DefaultValue = DefaultValue, - SampleValue = SampleValue - }; - } -} - -public class BuiltInTemplateOption -{ - public string Id { get; set; } = string.Empty; - public string Name { get; set; } = string.Empty; - public string Category { get; set; } = string.Empty; - public string IconKind { get; set; } = "FileDocumentOutline"; -} - -public partial class BatchGenerationViewModel : ViewModelBase -{ - private readonly IDataSourceService _dataSourceService; - private readonly IDataMergeEngine _mergeEngine; - private readonly IBatchPdfGenerator _batchGenerator; - private readonly ITemplateService _templateService; - - public IStorageProvider? StorageProvider { get; set; } - private CancellationTokenSource? _generationCts; - - [ObservableProperty] - private bool _isOpen; - - [ObservableProperty] - private string _dialogTitle = "Batch Mail Merge & Mass PDF Generator"; - - // 0: Data & Template, 1: Field Mapping, 2: Live Preview, 3: Output & Execution - [ObservableProperty] - private int _selectedStepIndex = 0; - - // --- Template Configuration --- - [ObservableProperty] - private string _selectedTemplateMode = "CurrentDocument"; // "CurrentDocument", "BuiltInTemplate" - - public ObservableCollection BuiltInTemplates { get; } = new(); - - [ObservableProperty] - private BuiltInTemplateOption? _selectedBuiltInTemplate; - - public PdfDocumentModel ActiveTemplateModel { get; private set; } = new(); - public ObservableCollection DetectedPlaceholders { get; } = new(); - - // --- Data Source Configuration --- - [ObservableProperty] - private int _selectedDataSourceTab = 0; // 0 = Excel/CSV, 1 = REST API, 2 = Manual/Paste - - [ObservableProperty] - private string _selectedFilePath = string.Empty; - - [ObservableProperty] - private string _selectedFileName = string.Empty; - - public ObservableCollection ExcelSheets { get; } = new(); - - [ObservableProperty] - private string? _selectedExcelSheet; - - [ObservableProperty] - private bool _hasMultipleSheets; - - [ObservableProperty] - private bool _firstRowIsHeader = true; - - [ObservableProperty] - private string _selectedDelimiter = ","; - - // --- REST API State --- - [ObservableProperty] - private string _apiUrl = "https://dummyjson.com/users?limit=8"; - - [ObservableProperty] - private string _apiAuthBearer = string.Empty; - - [ObservableProperty] - private string _apiKeyHeader = string.Empty; - - [ObservableProperty] - private string _apiKeyValue = string.Empty; - - [ObservableProperty] - private string _apiJsonPath = "users"; - - [ObservableProperty] - private bool _isFetchingApi; - - [ObservableProperty] - private string _apiStatusMessage = "Ready to connect"; - - [ObservableProperty] - private bool _apiHasError; - - // --- Manual / Raw Input State --- - [ObservableProperty] - private string _rawTextInput = ""; - - // --- Active Matrix & Grid --- - public DataMatrix CurrentMatrix { get; private set; } = new(); - public ObservableCollection MatrixHeaders { get; } = new(); - public ObservableCollection GridRows { get; } = new(); - - [ObservableProperty] - private string _matrixSummary = "0 rows, 0 columns loaded"; - - // --- Field Mappings --- - public ObservableCollection FieldMappings { get; } = new(); - - // --- Live Record Preview --- - [ObservableProperty] - private int _currentPreviewIndex = 0; - - [ObservableProperty] - private int _totalRecordsCount = 0; - - [ObservableProperty] - private string _currentRecordSummary = "Record 0 of 0"; - - [ObservableProperty] - private Bitmap? _previewBitmap; - - // --- Output Configuration --- - [ObservableProperty] - private BatchOutputMode _outputMode = BatchOutputMode.SeparateFiles; - - [ObservableProperty] - private string _outputDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "FryPDF_Batch_Export"); - - [ObservableProperty] - private string _outputFilePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "FryPDF_Batch_Export", "All_Batch_Documents.pdf"); - - [ObservableProperty] - private string _filenamePattern = "Payslip_{{EmployeeId}}_{{EmployeeName}}_{{PayPeriod}}.pdf"; - - [ObservableProperty] - private bool _skipEmptyRows = true; - - // --- Execution & Progress State --- - [ObservableProperty] - private bool _isGenerating; - - [ObservableProperty] - private bool _isCompleted; - - [ObservableProperty] - private double _progressPercentage; - - [ObservableProperty] - private string _progressMessage = "Ready to generate"; - - [ObservableProperty] - private string _currentItemName = ""; - - [ObservableProperty] - private int _succeededCount; - - [ObservableProperty] - private int _failedCount; - - [ObservableProperty] - private string _generationSummary = ""; - - public BatchGenerationResult? LastResult { get; private set; } - - public BatchGenerationViewModel( - IDataSourceService dataSourceService, - IDataMergeEngine mergeEngine, - IBatchPdfGenerator batchGenerator, - ITemplateService templateService) - { - _dataSourceService = dataSourceService ?? throw new ArgumentNullException(nameof(dataSourceService)); - _mergeEngine = mergeEngine ?? throw new ArgumentNullException(nameof(mergeEngine)); - _batchGenerator = batchGenerator ?? throw new ArgumentNullException(nameof(batchGenerator)); - _templateService = templateService ?? throw new ArgumentNullException(nameof(templateService)); - - InitializeBuiltInTemplates(); - LoadDefaultSamplePayslipDataset(); - } - - private void InitializeBuiltInTemplates() - { - BuiltInTemplates.Clear(); - BuiltInTemplates.Add(new BuiltInTemplateOption { Id = "payslip", Name = "Employee Monthly Payslip", Category = "Corporate", IconKind = "CashMultiple" }); - BuiltInTemplates.Add(new BuiltInTemplateOption { Id = "certificate", Name = "Achievement Certificate", Category = "Certificates", IconKind = "CertificateOutline" }); - BuiltInTemplates.Add(new BuiltInTemplateOption { Id = "invoice", Name = "Commercial Invoice", Category = "Finance", IconKind = "ReceiptTextOutline" }); - BuiltInTemplates.Add(new BuiltInTemplateOption { Id = "annualreport", Name = "Executive Report", Category = "Corporate", IconKind = "FileChartOutline" }); - BuiltInTemplates.Add(new BuiltInTemplateOption { Id = "interactive_executive_deck", Name = "Executive Strategy Deck (Landscape)", Category = "Corporate", IconKind = "PresentationPlay" }); - - SelectedBuiltInTemplate = BuiltInTemplates.FirstOrDefault(); - } - - public void OpenWithDocument(PdfDocumentModel currentDoc, DataMatrix? preloadedMatrix = null) - { - ActiveTemplateModel = currentDoc?.Clone() ?? _templateService.CreateEmployeePayslipTemplate(); - SelectedTemplateMode = "CurrentDocument"; - - if (preloadedMatrix != null && preloadedMatrix.RowCount > 0) - { - SetMatrix(preloadedMatrix); - } - else if (CurrentMatrix.RowCount == 0) - { - LoadDefaultSamplePayslipDataset(); - } - - RefreshTemplatePlaceholders(); - AutoMapFields(); - - SelectedStepIndex = 0; - IsGenerating = false; - IsCompleted = false; - IsOpen = true; - - UpdateLiveRecordPreview(); - } - - [RelayCommand] - public void SelectStep(string stepIndexStr) - { - if (int.TryParse(stepIndexStr, out int idx)) - { - SelectedStepIndex = Math.Clamp(idx, 0, 3); - if (SelectedStepIndex == 2) - { - UpdateLiveRecordPreview(); - } - } - } - - [RelayCommand] - public void SelectDataSourceTab(string tabIndexStr) - { - if (int.TryParse(tabIndexStr, out int idx)) - { - SelectedDataSourceTab = Math.Clamp(idx, 0, 2); - } - } - - [RelayCommand] - public void NextStep() - { - SelectedStepIndex = Math.Clamp(SelectedStepIndex + 1, 0, 3); - if (SelectedStepIndex == 2) - { - UpdateLiveRecordPreview(); - } - } - - [RelayCommand] - public void PreviousStep() - { - SelectedStepIndex = Math.Clamp(SelectedStepIndex - 1, 0, 3); - } - - [RelayCommand] - public void Close() - { - if (IsGenerating && _generationCts != null) - { - _generationCts.Cancel(); - } - IsOpen = false; - } - - public void SetTemplate(PdfDocumentModel doc) - { - ActiveTemplateModel = doc.Clone(); - RefreshTemplatePlaceholders(); - AutoMapFields(); - UpdateLiveRecordPreview(); - } - - partial void OnSelectedBuiltInTemplateChanged(BuiltInTemplateOption? value) - { - if (value != null && SelectedTemplateMode == "BuiltInTemplate") - { - var templateDoc = _templateService.CreateTemplate(value.Id); - SetTemplate(templateDoc); - } - } - - partial void OnSelectedTemplateModeChanged(string value) - { - if (value == "BuiltInTemplate" && SelectedBuiltInTemplate != null) - { - var templateDoc = _templateService.CreateTemplate(SelectedBuiltInTemplate.Id); - SetTemplate(templateDoc); - } - } - - public void RefreshTemplatePlaceholders() - { - DetectedPlaceholders.Clear(); - var tags = _mergeEngine.DetectPlaceholders(ActiveTemplateModel); - foreach (var t in tags) - { - DetectedPlaceholders.Add(t); - } - - // Adjust suggested filename pattern if placeholders detected - if (DetectedPlaceholders.Contains("EmployeeId") && DetectedPlaceholders.Contains("EmployeeName")) - { - FilenamePattern = "Payslip_{{EmployeeId}}_{{EmployeeName}}_{{PayPeriod}}.pdf"; - } - else if (DetectedPlaceholders.Count > 0) - { - FilenamePattern = $"Doc_{{{{Index}}}}_{{{{{DetectedPlaceholders[0]}}}}}.pdf"; - } - } - - public void SetMatrix(DataMatrix matrix) - { - CurrentMatrix = matrix; - MatrixHeaders.Clear(); - foreach (var h in matrix.Headers) MatrixHeaders.Add(h); - - GridRows.Clear(); - for (int r = 0; r < matrix.RowCount; r++) - { - GridRows.Add(new DataGridRowViewModel(r + 1, matrix.Rows[r])); - } - - TotalRecordsCount = matrix.RowCount; - MatrixSummary = $"{matrix.RowCount} records × {matrix.ColumnCount} columns ready for merge"; - CurrentPreviewIndex = 0; - - AutoMapFields(); - UpdateLiveRecordPreview(); - } - - [RelayCommand] - public void AutoMapFields() - { - FieldMappings.Clear(); - - foreach (var tag in DetectedPlaceholders) - { - var mapping = new FieldMappingItemViewModel - { - PlaceholderTag = tag - }; - - foreach (var col in MatrixHeaders) - { - mapping.AvailableColumns.Add(col); - } - - // Find best matching column name - string? matchedCol = MatrixHeaders.FirstOrDefault(h => string.Equals(h, tag, StringComparison.OrdinalIgnoreCase)); - if (matchedCol == null) - { - matchedCol = MatrixHeaders.FirstOrDefault(h => - h.Replace(" ", "").Replace("_", "").Equals(tag.Replace(" ", "").Replace("_", ""), StringComparison.OrdinalIgnoreCase)); - } - - mapping.SelectedColumnName = matchedCol ?? MatrixHeaders.FirstOrDefault() ?? string.Empty; - - // Infer transform - if (tag.Contains("Salary", StringComparison.OrdinalIgnoreCase) || - tag.Contains("Earnings", StringComparison.OrdinalIgnoreCase) || - tag.Contains("Deductions", StringComparison.OrdinalIgnoreCase) || - tag.Contains("Amount", StringComparison.OrdinalIgnoreCase) || - tag.Contains("Price", StringComparison.OrdinalIgnoreCase) || - tag.Contains("Bonus", StringComparison.OrdinalIgnoreCase) || - tag.Contains("Allowance", StringComparison.OrdinalIgnoreCase) || - tag.Contains("HRA", StringComparison.OrdinalIgnoreCase) || - tag.Contains("Tax", StringComparison.OrdinalIgnoreCase)) - { - mapping.Transform = FieldTransformType.Currency; - } - else if (tag.Contains("Date", StringComparison.OrdinalIgnoreCase) || tag.Contains("Period", StringComparison.OrdinalIgnoreCase)) - { - mapping.Transform = FieldTransformType.Date; - } - - // Populate sample value from Row 0 - if (CurrentMatrix.RowCount > 0 && !string.IsNullOrEmpty(mapping.SelectedColumnName)) - { - int colIdx = CurrentMatrix.Headers.IndexOf(mapping.SelectedColumnName); - if (colIdx >= 0) - { - mapping.SampleValue = CurrentMatrix.GetCellValue(0, colIdx); - } - } - - FieldMappings.Add(mapping); - } - } - - [RelayCommand] - public void LoadDefaultSamplePayslipDataset() - { - // 1. Create Payslip Template - var payslipDoc = _templateService.CreateEmployeePayslipTemplate(); - SetTemplate(payslipDoc); - - // 2. High-fidelity CSV dataset with 6 realistic employee records - string sampleCsv = -@"EmployeeId,EmployeeName,Designation,Department,JoiningDate,BankName,AccountNumber,TaxId,WorkingDays,BasicSalary,HRA,SpecialAllowance,Bonus,MedicalAllowance,GrossEarnings,ProvidentFund,IncomeTax,ProfessionalTax,Insurance,OtherDeductions,TotalDeductions,NetSalary,NetSalaryInWords,PayPeriod,CompanyName,AuthHash -EMP-2026-0842,John Doe,Senior Software Architect,Cloud Infrastructure,2021-03-15,First National Bank,****8492,US-TAX-8429,30,8500,3400,1800,1200,600,15500,950,1850,200,350,0,3350,12150,Twelve Thousand One Hundred Fifty US Dollars,August 2026,CodeFryDev Inc.,9A4F-8201-B732 -EMP-2026-0914,Jane Doe,Principal UI/UX Designer,Product Experience,2022-06-01,Metro Commercial Bank,****3198,US-TAX-1942,30,7800,3120,1500,900,500,13820,850,1550,200,300,0,2900,10920,Ten Thousand Nine Hundred Twenty US Dollars,August 2026,CodeFryDev Inc.,7E2B-9410-C311 -EMP-2026-1052,Alex Doe,Lead DevOps & Reliability Engineer,Cloud Infrastructure,2020-11-10,Standard City Bank,****9041,US-TAX-7731,30,8200,3280,1650,1100,550,14780,900,1720,200,320,0,3140,11640,Eleven Thousand Six Hundred Forty US Dollars,August 2026,CodeFryDev Inc.,4D1C-8822-A904 -EMP-2026-1188,Sam Doe,VP of Product Management,Executive Staff,2019-08-20,Apex Commerce Bank,****4412,US-TAX-5510,30,11000,4400,2400,2000,800,20600,1200,2900,200,450,0,4750,15850,Fifteen Thousand Eight Hundred Fifty US Dollars,August 2026,CodeFryDev Inc.,8F3D-1190-E542 -EMP-2026-1240,Taylor Doe,Senior QA Automation Engineer,Quality Assurance,2023-01-16,Pacific Trust Bank,****6720,US-TAX-3398,30,6900,2760,1300,750,450,12160,780,1320,200,280,0,2580,9580,Nine Thousand Five Hundred Eighty US Dollars,August 2026,CodeFryDev Inc.,2A9E-6541-D881 -EMP-2026-1315,Jordan Doe,Director of People & Culture,Human Resources,2021-09-01,Union Federal Bank,****5593,US-TAX-6624,30,9200,3680,1900,1400,650,16830,1050,2150,200,380,0,3780,13050,Thirteen Thousand Fifty US Dollars,August 2026,CodeFryDev Inc.,5C7F-3309-F104"; - - var matrix = _dataSourceService.ParseCsv(sampleCsv, ',', true); - SetMatrix(matrix); - } - - [RelayCommand] - public async Task BrowseFileAsync() - { - if (StorageProvider == null) return; - - var files = await StorageProvider.OpenFilePickerAsync(new FilePickerOpenOptions - { - Title = "Select Dataset for Batch Merge (Excel, CSV, TSV)", - AllowMultiple = false, - FileTypeFilter = new[] - { - new FilePickerFileType("Supported Datasets (*.xlsx, *.csv, *.tsv)") - { - Patterns = new[] { "*.xlsx", "*.csv", "*.tsv", "*.txt" } - }, - new FilePickerFileType("Excel Workbooks (*.xlsx)") - { - Patterns = new[] { "*.xlsx" } - }, - new FilePickerFileType("CSV Delimited (*.csv, *.tsv)") - { - Patterns = new[] { "*.csv", "*.tsv" } - } - } - }); - - if (files != null && files.Count > 0) - { - var file = files[0]; - await LoadFileAsync(file.Path.LocalPath); - } - } - - public async Task LoadFileAsync(string filePath) - { - if (!File.Exists(filePath)) return; - - SelectedFilePath = filePath; - SelectedFileName = Path.GetFileName(filePath); - string ext = Path.GetExtension(filePath).ToLowerInvariant(); - - try - { - if (ext == ".xlsx") - { - using var fs = File.OpenRead(filePath); - var sheetNames = _dataSourceService.GetExcelSheetNames(fs); - ExcelSheets.Clear(); - foreach (var name in sheetNames) ExcelSheets.Add(name); - - HasMultipleSheets = ExcelSheets.Count > 1; - SelectedExcelSheet = ExcelSheets.FirstOrDefault(); - - fs.Position = 0; - var matrix = _dataSourceService.ParseExcel(fs, SelectedExcelSheet, FirstRowIsHeader); - SetMatrix(matrix); - } - else - { - HasMultipleSheets = false; - ExcelSheets.Clear(); - string text = await File.ReadAllTextAsync(filePath); - char? delim = ext == ".tsv" ? '\t' : (SelectedDelimiter.Length > 0 ? SelectedDelimiter[0] : (char?)null); - var matrix = _dataSourceService.ParseCsv(text, delim, FirstRowIsHeader); - SetMatrix(matrix); - } - } - catch (Exception ex) - { - ApiHasError = true; - ApiStatusMessage = $"File error: {ex.Message}"; - } - } - - [RelayCommand] - public async Task FetchApiDataAsync() - { - if (string.IsNullOrWhiteSpace(ApiUrl)) return; - - IsFetchingApi = true; - ApiHasError = false; - ApiStatusMessage = "Connecting to API endpoint..."; - - try - { - var headers = new Dictionary(); - if (!string.IsNullOrWhiteSpace(ApiAuthBearer)) - { - headers["Authorization"] = ApiAuthBearer.StartsWith("Bearer ", StringComparison.OrdinalIgnoreCase) - ? ApiAuthBearer - : $"Bearer {ApiAuthBearer}"; - } - if (!string.IsNullOrWhiteSpace(ApiKeyHeader) && !string.IsNullOrWhiteSpace(ApiKeyValue)) - { - headers[ApiKeyHeader] = ApiKeyValue; - } - - var matrix = await _dataSourceService.FetchFromRestApiAsync(ApiUrl, headers, ApiJsonPath); - if (matrix.RowCount == 0) - { - ApiHasError = true; - ApiStatusMessage = "API returned 0 records."; - } - else - { - SetMatrix(matrix); - ApiStatusMessage = $"Successfully fetched {matrix.RowCount} records from REST API!"; - } - } - catch (Exception ex) - { - ApiHasError = true; - ApiStatusMessage = $"API Error: {ex.Message}"; - } - finally - { - IsFetchingApi = false; - } - } - - [RelayCommand] - public async Task BrowseOutputDirectoryAsync() - { - if (StorageProvider == null) return; - - var folders = await StorageProvider.OpenFolderPickerAsync(new FolderPickerOpenOptions - { - Title = "Select Output Directory for Generated PDFs", - AllowMultiple = false - }); - - if (folders != null && folders.Count > 0) - { - OutputDirectory = folders[0].Path.LocalPath; - OutputFilePath = Path.Combine(OutputDirectory, "All_Merged_Documents.pdf"); - } - } - - [RelayCommand] - public async Task BrowseOutputFilePathAsync() - { - if (StorageProvider == null) return; - - string defaultExt = OutputMode == BatchOutputMode.ZipArchive ? "zip" : "pdf"; - string filterName = OutputMode == BatchOutputMode.ZipArchive ? "ZIP Archive (*.zip)" : "PDF Document (*.pdf)"; - string defaultPattern = OutputMode == BatchOutputMode.ZipArchive ? "*.zip" : "*.pdf"; - - var file = await StorageProvider.SaveFilePickerAsync(new FilePickerSaveOptions - { - Title = "Select Output Destination File", - DefaultExtension = defaultExt, - SuggestedFileName = OutputMode == BatchOutputMode.ZipArchive ? "Batch_PDFs_Archive.zip" : "All_Merged_Documents.pdf", - FileTypeChoices = new[] - { - new FilePickerFileType(filterName) { Patterns = new[] { defaultPattern } } - } - }); - - if (file != null) - { - OutputFilePath = file.Path.LocalPath; - } - } - - [RelayCommand] - public void InsertPlaceholderToFilename(string tag) - { - if (!string.IsNullOrWhiteSpace(tag)) - { - FilenamePattern += $"_{{{{{tag}}}}}"; - } - } - - // --- Live Record Navigation --- - [RelayCommand] - public void NextPreviewRecord() - { - if (CurrentMatrix.RowCount > 0) - { - CurrentPreviewIndex = (CurrentPreviewIndex + 1) % CurrentMatrix.RowCount; - UpdateLiveRecordPreview(); - } - } - - [RelayCommand] - public void PreviousPreviewRecord() - { - if (CurrentMatrix.RowCount > 0) - { - CurrentPreviewIndex = (CurrentPreviewIndex - 1 + CurrentMatrix.RowCount) % CurrentMatrix.RowCount; - UpdateLiveRecordPreview(); - } - } - - public void UpdateLiveRecordPreview() - { - if (CurrentMatrix.RowCount == 0 || ActiveTemplateModel == null) - { - PreviewBitmap = null; - CurrentRecordSummary = "No records available"; - return; - } - - CurrentPreviewIndex = Math.Clamp(CurrentPreviewIndex, 0, CurrentMatrix.RowCount - 1); - var mappings = FieldMappings.Select(m => m.ToModel()).ToList(); - var record = BatchPdfGeneratorService.BuildRecordDictionary(CurrentMatrix, CurrentPreviewIndex, mappings); - - // Build brief summary for UI display - string primaryName = record.TryGetValue("EmployeeName", out var name) ? name : - (record.TryGetValue("Name", out var n) ? n : - (CurrentMatrix.ColumnCount > 1 ? CurrentMatrix.GetCellValue(CurrentPreviewIndex, 1) : "")); - - string primaryId = record.TryGetValue("EmployeeId", out var id) ? id : - (record.TryGetValue("Id", out var i) ? i : - (CurrentMatrix.ColumnCount > 0 ? CurrentMatrix.GetCellValue(CurrentPreviewIndex, 0) : "")); - - CurrentRecordSummary = $"Record {CurrentPreviewIndex + 1} of {CurrentMatrix.RowCount}: {primaryName} (ID: {primaryId})"; - - try - { - // Hydrate document model - var hydratedDoc = _mergeEngine.HydrateDocument(ActiveTemplateModel, record); - - // Rasterize preview using Skia renderer - if (hydratedDoc.Pages.Count > 0) - { - var firstPage = hydratedDoc.Pages[0]; - float w = (float)firstPage.Width; - float h = (float)firstPage.Height; - - using var surface = SkiaSharp.SKSurface.Create(new SkiaSharp.SKImageInfo((int)w, (int)h)); - var canvas = surface.Canvas; - canvas.Clear(SkiaSharp.SKColors.White); - - // Render basic elements preview - foreach (var el in firstPage.Elements.OrderBy(e => e.ZIndex)) - { - if (el is PdfShapeElement shape) - { - using var paint = new SkiaSharp.SKPaint - { - Color = SkiaSharp.SKColor.TryParse(shape.FillColorHex, out var c) ? c : SkiaSharp.SKColors.LightGray, - Style = SkiaSharp.SKPaintStyle.Fill, - IsAntialias = true - }; - canvas.DrawRoundRect(new SkiaSharp.SKRect((float)shape.X, (float)shape.Y, (float)(shape.X + shape.Width), (float)(shape.Y + shape.Height)), (float)shape.CornerRadius, (float)shape.CornerRadius, paint); - } - else if (el is PdfTextElement text) - { - using var font = new SkiaSharp.SKFont(SkiaSharp.SKTypeface.Default, (float)Math.Max(8, text.FontSize)); - font.Embolden = text.IsBold; - using var textPaint = new SkiaSharp.SKPaint - { - Color = SkiaSharp.SKColor.TryParse(text.TextColorHex, out var tc) ? tc : SkiaSharp.SKColors.Black, - IsAntialias = true - }; - float yOffset = (float)text.Y + (float)text.FontSize; - string[] lines = text.Text.Split('\n'); - foreach (var l in lines) - { - canvas.DrawText(l, (float)text.X, yOffset, SkiaSharp.SKTextAlign.Left, font, textPaint); - yOffset += (float)(text.FontSize * text.LineHeight); - } - } - else if (el is PdfTableElement table) - { - using var headerBg = new SkiaSharp.SKPaint { Color = SkiaSharp.SKColor.Parse(table.HeaderBackgroundHex), Style = SkiaSharp.SKPaintStyle.Fill }; - canvas.DrawRect(new SkiaSharp.SKRect((float)table.X, (float)table.Y, (float)(table.X + table.Width), (float)(table.Y + 24)), headerBg); - - using var fontHeader = new SkiaSharp.SKFont(SkiaSharp.SKTypeface.Default, 10); - fontHeader.Embolden = true; - using var textPaint = new SkiaSharp.SKPaint { Color = SkiaSharp.SKColors.White, IsAntialias = true }; - canvas.DrawText(table.Headers.FirstOrDefault() ?? "TABLE", (float)table.X + 8, (float)table.Y + 16, SkiaSharp.SKTextAlign.Left, fontHeader, textPaint); - - float rowY = (float)table.Y + 24; - using var fontCell = new SkiaSharp.SKFont(SkiaSharp.SKTypeface.Default, 9); - using var cellPaint = new SkiaSharp.SKPaint { Color = SkiaSharp.SKColors.Black, IsAntialias = true }; - - for (int r = 0; r < Math.Min(6, table.Rows.Count); r++) - { - using var rowBg = new SkiaSharp.SKPaint { Color = r % 2 == 0 ? SkiaSharp.SKColors.White : SkiaSharp.SKColor.Parse("#F8FAFC"), Style = SkiaSharp.SKPaintStyle.Fill }; - canvas.DrawRect(new SkiaSharp.SKRect((float)table.X, rowY, (float)(table.X + table.Width), rowY + 20), rowBg); - - string cellText = string.Join(" | ", table.Rows[r]); - canvas.DrawText(cellText, (float)table.X + 8, rowY + 14, SkiaSharp.SKTextAlign.Left, fontCell, cellPaint); - rowY += 20; - } - } - else if (el is PdfQrCodeElement qr) - { - using var qrPaint = new SkiaSharp.SKPaint { Color = SkiaSharp.SKColor.Parse(qr.DarkColorHex), Style = SkiaSharp.SKPaintStyle.Fill }; - canvas.DrawRect(new SkiaSharp.SKRect((float)qr.X, (float)qr.Y, (float)(qr.X + qr.Width), (float)(qr.Y + qr.Height)), qrPaint); - - using var fontQr = new SkiaSharp.SKFont(SkiaSharp.SKTypeface.Default, 9); - using var tPaint = new SkiaSharp.SKPaint { Color = SkiaSharp.SKColors.White, IsAntialias = true }; - canvas.DrawText("QR CODE", (float)qr.X + 10, (float)qr.Y + (float)qr.Height / 2, SkiaSharp.SKTextAlign.Left, fontQr, tPaint); - } - } - - using var image = surface.Snapshot(); - using var data = image.Encode(SkiaSharp.SKEncodedImageFormat.Png, 90); - using var ms = new MemoryStream(data.ToArray()); - PreviewBitmap = new Bitmap(ms); - } - } - catch - { - PreviewBitmap = null; - } - } - - // --- Execution --- - [RelayCommand] - public async Task StartGenerationAsync() - { - if (CurrentMatrix.RowCount == 0) - { - ProgressMessage = "No data rows loaded to generate."; - return; - } - - IsGenerating = true; - IsCompleted = false; - ProgressPercentage = 0; - SucceededCount = 0; - FailedCount = 0; - ProgressMessage = "Initializing batch generation engine..."; - - _generationCts = new CancellationTokenSource(); - - var config = new BatchGenerationConfig - { - OutputMode = OutputMode, - OutputDirectory = OutputDirectory, - OutputFilePath = OutputFilePath, - FilenamePattern = FilenamePattern, - SkipEmptyRows = SkipEmptyRows - }; - - var mappings = FieldMappings.Select(m => m.ToModel()).ToList(); - - var progress = new Progress(report => - { - ProgressPercentage = report.Percentage; - SucceededCount = report.SucceededCount; - FailedCount = report.FailedCount; - CurrentItemName = report.CurrentItemName; - ProgressMessage = report.StatusMessage; - }); - - try - { - LastResult = await _batchGenerator.GenerateBatchAsync( - ActiveTemplateModel, - CurrentMatrix, - mappings, - config, - progress, - _generationCts.Token); - - IsCompleted = true; - ProgressPercentage = 100; - ProgressMessage = $"Batch generation complete! {LastResult.SuccessfulCount} documents created successfully."; - GenerationSummary = $"Successfully created {LastResult.SuccessfulCount} PDFs in {LastResult.ElapsedTime.TotalSeconds:F2} seconds. Output: {(OutputMode == BatchOutputMode.SeparateFiles ? OutputDirectory : OutputFilePath)}"; - } - catch (OperationCanceledException) - { - ProgressMessage = "Batch generation was cancelled by user."; - } - catch (Exception ex) - { - ProgressMessage = $"Error during batch generation: {ex.Message}"; - } - finally - { - IsGenerating = false; - } - } - - [RelayCommand] - public void CancelGeneration() - { - _generationCts?.Cancel(); - } - - [RelayCommand] - public void OpenOutputFolder() - { - try - { - string folder = OutputMode == BatchOutputMode.SeparateFiles - ? OutputDirectory - : (Path.GetDirectoryName(OutputFilePath) ?? OutputDirectory); - - if (Directory.Exists(folder)) - { - Process.Start(new ProcessStartInfo - { - FileName = folder, - UseShellExecute = true - }); - } - } - catch { } - } - - [RelayCommand] - public void OpenOutputFile() - { - try - { - string target = OutputMode == BatchOutputMode.SeparateFiles - ? LastResult?.GeneratedFiles.FirstOrDefault() ?? OutputDirectory - : OutputFilePath; - - if (File.Exists(target) || Directory.Exists(target)) - { - Process.Start(new ProcessStartInfo - { - FileName = target, - UseShellExecute = true - }); - } - } - catch { } - } -} diff --git a/src/PdfEditorApp/ViewModels/DataStudio/DataStudioViewModel.cs b/src/PdfEditorApp/ViewModels/DataStudio/DataStudioViewModel.cs deleted file mode 100644 index e16939c..0000000 --- a/src/PdfEditorApp/ViewModels/DataStudio/DataStudioViewModel.cs +++ /dev/null @@ -1,646 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.IO; -using System.Linq; -using System.Threading.Tasks; -using Avalonia.Input.Platform; -using Avalonia.Media.Imaging; -using Avalonia.Platform.Storage; -using CommunityToolkit.Mvvm.ComponentModel; -using CommunityToolkit.Mvvm.Input; -using PdfEditorApp.Core.Analysis; -using PdfEditorApp.Core.Data; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; -using PdfEditorApp.Models; -using PdfEditorApp.Services; -using PdfEditorApp.ViewModels.ElementViewModels; - -namespace PdfEditorApp.ViewModels.DataStudio; - -public class DataColumnSelectionItem : ObservableObject -{ - public int Index { get; set; } - public string Header { get; set; } = string.Empty; - public DataColumnType ColumnType { get; set; } - - private bool _isSelected; - public bool IsSelected - { - get => _isSelected; - set => SetProperty(ref _isSelected, value); - } -} - -public class DataGridRowViewModel : ObservableObject -{ - public int RowIndex { get; set; } - public ObservableCollection Cells { get; } = new(); - - public DataGridRowViewModel(int rowIndex, IEnumerable cells) - { - RowIndex = rowIndex; - foreach (var c in cells) Cells.Add(c); - } -} - -public partial class DataStudioViewModel : ViewModelBase -{ - private readonly IDataSourceService _dataSourceService; - private readonly IDataBindingService _dataBindingService; - - public IStorageProvider? StorageProvider { get; set; } - public IUndoRedoService? UndoRedo { get; set; } - - [ObservableProperty] - private bool _isOpen; - - [ObservableProperty] - private string _dialogTitle = "Data Studio & Connector"; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(IsChartTarget))] - [NotifyPropertyChangedFor(nameof(IsTableTarget))] - private string _targetMode = "Chart"; // "Chart", "Table", "NewChart", "NewTable" - - public bool IsChartTarget => TargetMode == "Chart" || TargetMode == "NewChart"; - public bool IsTableTarget => TargetMode == "Table" || TargetMode == "NewTable"; - - public ChartElementViewModel? TargetChart { get; private set; } - public TableElementViewModel? TargetTable { get; private set; } - public PageViewModel? TargetPage { get; private set; } - - // Active Source Tab: 0 = Excel/Files, 1 = REST API, 2 = Spreadsheet / Clipboard - [ObservableProperty] - private int _selectedTabIndex = 0; - - // --- File Import State --- - [ObservableProperty] - private string _selectedFilePath = string.Empty; - - [ObservableProperty] - private string _selectedFileName = string.Empty; - - public ObservableCollection ExcelSheets { get; } = new(); - - [ObservableProperty] - private string? _selectedExcelSheet; - - [ObservableProperty] - private bool _hasMultipleSheets; - - [ObservableProperty] - private bool _firstRowIsHeader = true; - - [ObservableProperty] - private string _selectedDelimiter = ","; - - // --- REST API State --- - [ObservableProperty] - private string _apiUrl = "https://dummyjson.com/products?limit=6"; - - [ObservableProperty] - private string _apiAuthBearer = string.Empty; - - [ObservableProperty] - private string _apiKeyHeader = string.Empty; - - [ObservableProperty] - private string _apiKeyValue = string.Empty; - - [ObservableProperty] - private string _apiJsonPath = "products"; - - [ObservableProperty] - private bool _isFetchingApi; - - [ObservableProperty] - private string _apiStatusMessage = "Ready to connect"; - - [ObservableProperty] - private bool _apiHasError; - - // --- Manual / Raw Text Input State --- - [ObservableProperty] - private string _rawTextInput = "Category\t2025 Actual\t2026 Target\nQ1\t120\t140\nQ2\t150\t175\nQ3\t180\t210\nQ4\t200\t240"; - - // --- Live Matrix & Grid State --- - public DataMatrix CurrentMatrix { get; private set; } = new(); - - public ObservableCollection MatrixHeaders { get; } = new(); - public ObservableCollection GridRows { get; } = new(); - public ObservableCollection AvailableColumns { get; } = new(); - - [ObservableProperty] - private int _selectedCategoryColumnIndex = 0; - - [ObservableProperty] - private Bitmap? _chartPreviewBitmap; - - [ObservableProperty] - private string _matrixSummary = "0 rows, 0 columns loaded"; - - public event Action? OnElementCreated; - public event Action? OpenBatchMergeRequested; - - public DataStudioViewModel(IDataSourceService dataSourceService, IDataBindingService dataBindingService) - { - _dataSourceService = dataSourceService; - _dataBindingService = dataBindingService; - - LoadDefaultSampleMatrix(); - } - - public void OpenForChart(ChartElementViewModel chart, PageViewModel? page) - { - TargetChart = chart; - TargetTable = null; - TargetPage = page; - TargetMode = "Chart"; - DialogTitle = $"Data Studio — Edit Data for '{chart.Title}'"; - - // Extract current data from chart into matrix - var model = (PdfChartElement)chart.ToModel(); - var matrix = _dataBindingService.ExtractFromChart(model); - SetMatrix(matrix); - - IsOpen = true; - } - - public void OpenForTable(TableElementViewModel table, PageViewModel? page) - { - TargetChart = null; - TargetTable = table; - TargetPage = page; - TargetMode = "Table"; - DialogTitle = $"Data Studio — Edit Data for Table"; - - var model = (PdfTableElement)table.ToModel(); - var matrix = _dataBindingService.ExtractFromTable(model); - SetMatrix(matrix); - - IsOpen = true; - } - - [RelayCommand] - public void SelectTab(string tabIndexStr) - { - if (int.TryParse(tabIndexStr, out int idx)) - { - SelectedTabIndex = idx; - } - } - - [RelayCommand] - public void SetPresetApi(string presetKey) - { - switch (presetKey.ToLowerInvariant()) - { - case "products": - case "dummyjson": - ApiUrl = "https://dummyjson.com/products?limit=8"; - ApiJsonPath = "products"; - break; - - case "crypto": - case "coingecko": - ApiUrl = "https://api.coingecko.com/api/v3/coins/markets?vs_currency=usd&order=market_cap_desc&per_page=8&page=1"; - ApiJsonPath = ""; - break; - - case "users": - case "jsonplaceholder": - ApiUrl = "https://jsonplaceholder.typicode.com/users"; - ApiJsonPath = ""; - break; - - case "sales": - ApiUrl = "https://dummyjson.com/carts/1"; - ApiJsonPath = "products"; - break; - } - - ApiStatusMessage = "Preset configured. Click 'Fetch API Data' to connect."; - ApiHasError = false; - } - - public void OpenForNew(string mode, PageViewModel? page) - { - TargetChart = null; - TargetTable = null; - TargetPage = page; - TargetMode = mode; - DialogTitle = mode == "NewChart" ? "Data Studio — Import Data to New Chart" : "Data Studio — Import Data to New Table"; - - LoadDefaultSampleMatrix(); - IsOpen = true; - } - - [RelayCommand] - public void Close() - { - IsOpen = false; - } - - private void LoadDefaultSampleMatrix() - { - var matrix = _dataSourceService.ParseTsv(RawTextInput, true); - SetMatrix(matrix); - } - - public void SetMatrix(DataMatrix matrix) - { - CurrentMatrix = matrix; - MatrixHeaders.Clear(); - foreach (var h in matrix.Headers) MatrixHeaders.Add(h); - - GridRows.Clear(); - for (int r = 0; r < matrix.RowCount; r++) - { - GridRows.Add(new DataGridRowViewModel(r + 1, matrix.Rows[r])); - } - - AvailableColumns.Clear(); - for (int c = 0; c < matrix.ColumnCount; c++) - { - var colType = matrix.InferColumnType(c); - AvailableColumns.Add(new DataColumnSelectionItem - { - Index = c, - Header = matrix.Headers[c], - ColumnType = colType, - IsSelected = c != SelectedCategoryColumnIndex - }); - } - - SelectedCategoryColumnIndex = Math.Clamp(SelectedCategoryColumnIndex, 0, Math.Max(0, matrix.ColumnCount - 1)); - MatrixSummary = $"{matrix.RowCount} rows × {matrix.ColumnCount} columns loaded"; - - UpdateChartPreview(); - } - - partial void OnSelectedCategoryColumnIndexChanged(int value) - { - UpdateChartPreview(); - } - - partial void OnFirstRowIsHeaderChanged(bool value) - { - if (!string.IsNullOrEmpty(SelectedFilePath) && File.Exists(SelectedFilePath)) - { - ReloadCurrentFile(); - } - } - - partial void OnSelectedExcelSheetChanged(string? value) - { - if (!string.IsNullOrEmpty(value) && !string.IsNullOrEmpty(SelectedFilePath) && File.Exists(SelectedFilePath)) - { - ReloadCurrentFile(); - } - } - - [RelayCommand] - public async Task BrowseFileAsync() - { - if (StorageProvider == null) return; - - var files = await StorageProvider.OpenFilePickerAsync(new FilePickerOpenOptions - { - Title = "Select Excel Workbook, CSV, or Data File", - AllowMultiple = false, - FileTypeFilter = new[] - { - new FilePickerFileType("Supported Data Files (*.xlsx, *.csv, *.tsv, *.txt)") - { - Patterns = new[] { "*.xlsx", "*.csv", "*.tsv", "*.txt" } - }, - new FilePickerFileType("Excel Workbooks (*.xlsx)") - { - Patterns = new[] { "*.xlsx" } - }, - new FilePickerFileType("CSV / Delimited (*.csv, *.tsv)") - { - Patterns = new[] { "*.csv", "*.tsv", "*.txt" } - } - } - }); - - if (files != null && files.Count > 0) - { - var file = files[0]; - string path = file.Path.LocalPath; - await LoadFileAsync(path); - } - } - - public async Task LoadFileAsync(string filePath) - { - if (!File.Exists(filePath)) return; - - SelectedFilePath = filePath; - SelectedFileName = Path.GetFileName(filePath); - string ext = Path.GetExtension(filePath).ToLowerInvariant(); - - try - { - if (ext == ".xlsx") - { - using var fs = File.OpenRead(filePath); - var sheetNames = _dataSourceService.GetExcelSheetNames(fs); - ExcelSheets.Clear(); - foreach (var name in sheetNames) ExcelSheets.Add(name); - - HasMultipleSheets = ExcelSheets.Count > 1; - SelectedExcelSheet = ExcelSheets.FirstOrDefault(); - - fs.Position = 0; - var matrix = _dataSourceService.ParseExcel(fs, SelectedExcelSheet, FirstRowIsHeader); - SetMatrix(matrix); - } - else - { - HasMultipleSheets = false; - ExcelSheets.Clear(); - string text = await File.ReadAllTextAsync(filePath); - char? delim = ext == ".tsv" ? '\t' : (SelectedDelimiter.Length > 0 ? SelectedDelimiter[0] : (char?)null); - var matrix = _dataSourceService.ParseCsv(text, delim, FirstRowIsHeader); - SetMatrix(matrix); - } - } - catch (Exception ex) - { - ApiHasError = true; - ApiStatusMessage = $"File read error: {ex.Message}"; - } - } - - private void ReloadCurrentFile() - { - if (!string.IsNullOrEmpty(SelectedFilePath) && File.Exists(SelectedFilePath)) - { - _ = LoadFileAsync(SelectedFilePath); - } - } - - [RelayCommand] - public async Task FetchApiDataAsync() - { - if (string.IsNullOrWhiteSpace(ApiUrl)) return; - - IsFetchingApi = true; - ApiHasError = false; - ApiStatusMessage = "Connecting to API endpoint..."; - - try - { - var headers = new Dictionary(); - if (!string.IsNullOrWhiteSpace(ApiAuthBearer)) - { - headers["Authorization"] = ApiAuthBearer.StartsWith("Bearer ", StringComparison.OrdinalIgnoreCase) - ? ApiAuthBearer - : $"Bearer {ApiAuthBearer}"; - } - if (!string.IsNullOrWhiteSpace(ApiKeyHeader) && !string.IsNullOrWhiteSpace(ApiKeyValue)) - { - headers[ApiKeyHeader] = ApiKeyValue; - } - - var matrix = await _dataSourceService.FetchFromRestApiAsync(ApiUrl, headers, ApiJsonPath); - if (matrix.RowCount == 0) - { - ApiHasError = true; - ApiStatusMessage = "API returned 0 rows or empty structure."; - } - else - { - SetMatrix(matrix); - ApiStatusMessage = $"Successfully fetched {matrix.RowCount} rows from API!"; - } - } - catch (Exception ex) - { - ApiHasError = true; - ApiStatusMessage = $"API Error: {ex.Message}"; - } - finally - { - IsFetchingApi = false; - } - } - - [RelayCommand] - public async Task PasteFromClipboardAsync() - { - if (Avalonia.Application.Current?.ApplicationLifetime is Avalonia.Controls.ApplicationLifetimes.IClassicDesktopStyleApplicationLifetime desktop && - desktop.MainWindow?.Clipboard != null) - { - string? text = await desktop.MainWindow.Clipboard.TryGetTextAsync(); - if (!string.IsNullOrWhiteSpace(text)) - { - RawTextInput = text; - var matrix = _dataSourceService.ParseCsv(text, null, FirstRowIsHeader); - SetMatrix(matrix); - } - } - } - - [RelayCommand] - public void ParseRawTextInput() - { - if (!string.IsNullOrWhiteSpace(RawTextInput)) - { - var matrix = _dataSourceService.ParseCsv(RawTextInput, null, FirstRowIsHeader); - SetMatrix(matrix); - } - } - - [RelayCommand] - public void AddRow() - { - var cells = Enumerable.Range(1, CurrentMatrix.ColumnCount).Select(c => $"New {GridRows.Count + 1}.{c}"); - CurrentMatrix.AddRow(cells); - SetMatrix(CurrentMatrix); - } - - [RelayCommand] - public void RemoveRow() - { - if (CurrentMatrix.RowCount > 1) - { - CurrentMatrix.RemoveRow(CurrentMatrix.RowCount - 1); - SetMatrix(CurrentMatrix); - } - } - - [RelayCommand] - public void AddColumn() - { - CurrentMatrix.AddColumn($"Col {CurrentMatrix.ColumnCount + 1}"); - SetMatrix(CurrentMatrix); - } - - [RelayCommand] - public void RemoveColumn() - { - if (CurrentMatrix.ColumnCount > 1) - { - CurrentMatrix.RemoveColumn(CurrentMatrix.ColumnCount - 1); - SetMatrix(CurrentMatrix); - } - } - - private void UpdateChartPreview() - { - if (CurrentMatrix.RowCount == 0 || CurrentMatrix.ColumnCount == 0) - { - ChartPreviewBitmap = null; - return; - } - - try - { - var previewChart = new PdfChartElement - { - Width = 360, - Height = 200, - Title = TargetChart?.Title ?? "Data Preview", - ChartType = TargetChart?.ChartType ?? ChartType.BarColumn, - Palette = TargetChart?.Palette ?? ChartPalette.CorporateBlue, - LegendPosition = ChartLegendPosition.Top - }; - - int catCol = SelectedCategoryColumnIndex; - var valCols = AvailableColumns.Where(c => c.IsSelected && c.Index != catCol).Select(c => c.Index).ToList(); - if (valCols.Count == 0) - { - valCols.Add(catCol == 0 ? Math.Min(1, CurrentMatrix.ColumnCount - 1) : 0); - } - - _dataBindingService.ApplyToChart(CurrentMatrix, previewChart, catCol, valCols); - - byte[] png = LiveChartsRenderer.RenderChartToPngBytes(previewChart, 360, 200, 2.0f); - if (png != null && png.Length > 0) - { - using var ms = new MemoryStream(png); - ChartPreviewBitmap = new Bitmap(ms); - } - } - catch - { - ChartPreviewBitmap = null; - } - } - - [RelayCommand] - public void ApplyData() - { - if (CurrentMatrix.RowCount == 0 || CurrentMatrix.ColumnCount == 0) - { - IsOpen = false; - return; - } - - int catCol = SelectedCategoryColumnIndex; - var valCols = AvailableColumns.Where(c => c.IsSelected && c.Index != catCol).Select(c => c.Index).ToList(); - if (valCols.Count == 0) - { - valCols.Add(catCol == 0 ? Math.Min(1, CurrentMatrix.ColumnCount - 1) : 0); - } - - if (TargetMode == "Chart" && TargetChart != null) - { - var oldModel = (PdfChartElement)TargetChart.ToModel(); - var newModel = (PdfChartElement)oldModel.Clone(); - - _dataBindingService.ApplyToChart(CurrentMatrix, newModel, catCol, valCols); - - TargetChart.LoadFromModel(newModel); - UndoRedo?.RecordAction( - "Update Chart Data", - () => TargetChart.LoadFromModel(oldModel), - () => TargetChart.LoadFromModel(newModel) - ); - } - else if (TargetMode == "Table" && TargetTable != null) - { - var oldModel = (PdfTableElement)TargetTable.ToModel(); - var newModel = (PdfTableElement)oldModel.Clone(); - - _dataBindingService.ApplyToTable(CurrentMatrix, newModel); - - TargetTable.LoadFromModel(newModel); - UndoRedo?.RecordAction( - "Update Table Data", - () => TargetTable.LoadFromModel(oldModel), - () => TargetTable.LoadFromModel(newModel) - ); - } - else if (TargetMode == "NewChart" && TargetPage != null) - { - var newChartModel = new PdfChartElement - { - X = 50, - Y = 150, - Width = 420, - Height = 240, - Title = "Imported Data Analysis", - ChartType = ChartType.BarColumn, - Palette = ChartPalette.CorporateBlue - }; - _dataBindingService.ApplyToChart(CurrentMatrix, newChartModel, catCol, valCols); - - var chartVm = new ChartElementViewModel(); - chartVm.LoadFromModel(newChartModel); - OnElementCreated?.Invoke(chartVm, "Imported Chart Data"); - } - else if (TargetMode == "NewTable" && TargetPage != null) - { - var newTableModel = new PdfTableElement - { - X = 50, - Y = 150, - Width = 450, - Height = 35 + (CurrentMatrix.RowCount * 26) - }; - _dataBindingService.ApplyToTable(CurrentMatrix, newTableModel); - - var tableVm = new TableElementViewModel(); - tableVm.LoadFromModel(newTableModel); - OnElementCreated?.Invoke(tableVm, "Imported Table Data"); - } - - IsOpen = false; - } - - [RelayCommand] - public async Task ExportToCsvAsync() - { - if (StorageProvider == null || CurrentMatrix.RowCount == 0) return; - - var file = await StorageProvider.SaveFilePickerAsync(new FilePickerSaveOptions - { - Title = "Export Data as CSV", - DefaultExtension = "csv", - SuggestedFileName = "dataset_export.csv", - FileTypeChoices = new[] - { - new FilePickerFileType("CSV (Comma Delimited) (*.csv)") { Patterns = new[] { "*.csv" } } - } - }); - - if (file != null) - { - string csvContent = _dataSourceService.FormatAsCsv(CurrentMatrix); - await File.WriteAllTextAsync(file.Path.LocalPath, csvContent); - } - } - - [RelayCommand] - public void OpenBatchMerge() - { - IsOpen = false; - OpenBatchMergeRequested?.Invoke(CurrentMatrix); - } -} diff --git a/src/PdfEditorApp/ViewModels/DynamicInspectorSectionViewModel.cs b/src/PdfEditorApp/ViewModels/DynamicInspectorSectionViewModel.cs deleted file mode 100644 index a1eeeb2..0000000 --- a/src/PdfEditorApp/ViewModels/DynamicInspectorSectionViewModel.cs +++ /dev/null @@ -1,27 +0,0 @@ -using CommunityToolkit.Mvvm.ComponentModel; - -namespace PdfEditorApp.ViewModels; - -/// -/// Presentation model for a dynamic inspector property panel section contributed by a plugin. -/// -public partial class DynamicInspectorSectionViewModel : ViewModelBase -{ - [ObservableProperty] - private string _sectionId = ""; - - [ObservableProperty] - private string _title = ""; - - [ObservableProperty] - private string _iconKind = "Tune"; - - [ObservableProperty] - private int _order = 100; - - [ObservableProperty] - private object? _content; - - [ObservableProperty] - private bool _isExpanded = true; -} diff --git a/src/PdfEditorApp/ViewModels/DynamicRibbonGroupViewModel.cs b/src/PdfEditorApp/ViewModels/DynamicRibbonGroupViewModel.cs deleted file mode 100644 index 9ae2ed2..0000000 --- a/src/PdfEditorApp/ViewModels/DynamicRibbonGroupViewModel.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System.Collections.ObjectModel; -using PdfEditorApp.Core.Plugins.Descriptors; - -namespace PdfEditorApp.ViewModels; - -/// -/// Presentation model for a dynamic ribbon group containing contributed actions. -/// -public sealed class DynamicRibbonGroupViewModel -{ - public required string Id { get; init; } - public required string TabId { get; init; } - public required string Title { get; init; } - public ObservableCollection Actions { get; } = new(); -} diff --git a/src/PdfEditorApp/ViewModels/DynamicRibbonTabViewModel.cs b/src/PdfEditorApp/ViewModels/DynamicRibbonTabViewModel.cs deleted file mode 100644 index 7c74461..0000000 --- a/src/PdfEditorApp/ViewModels/DynamicRibbonTabViewModel.cs +++ /dev/null @@ -1,17 +0,0 @@ -using CommunityToolkit.Mvvm.ComponentModel; -using PdfEditorApp.Core.Plugins.Descriptors; - -namespace PdfEditorApp.ViewModels; - -/// -/// Presentation wrapper for dynamic plugin ribbon tabs. -/// -public sealed partial class DynamicRibbonTabViewModel : ViewModelBase -{ - public required RibbonTabDescriptor Descriptor { get; init; } - public string Id => Descriptor.Id; - public string Title => Descriptor.Title; - - [ObservableProperty] - private bool _isActive; -} diff --git a/src/PdfEditorApp/ViewModels/DynamicSidebarTabViewModel.cs b/src/PdfEditorApp/ViewModels/DynamicSidebarTabViewModel.cs deleted file mode 100644 index 83ea888..0000000 --- a/src/PdfEditorApp/ViewModels/DynamicSidebarTabViewModel.cs +++ /dev/null @@ -1,19 +0,0 @@ -using CommunityToolkit.Mvvm.ComponentModel; -using PdfEditorApp.Core.Plugins.Descriptors; - -namespace PdfEditorApp.ViewModels; - -/// -/// Presentation wrapper for dynamic plugin sidebar tabs. -/// -public sealed partial class DynamicSidebarTabViewModel : ViewModelBase -{ - public required SidebarTabDescriptor Descriptor { get; init; } - public string Id => Descriptor.Id; - public string Title => Descriptor.Title; - public string IconKind => Descriptor.IconKind; - public string Tooltip => Descriptor.Tooltip; - - [ObservableProperty] - private bool _isActive; -} diff --git a/src/PdfEditorApp/ViewModels/ElementViewModels/BarcodeElementViewModel.cs b/src/PdfEditorApp/ViewModels/ElementViewModels/BarcodeElementViewModel.cs deleted file mode 100644 index 51c4678..0000000 --- a/src/PdfEditorApp/ViewModels/ElementViewModels/BarcodeElementViewModel.cs +++ /dev/null @@ -1,83 +0,0 @@ -using CommunityToolkit.Mvvm.ComponentModel; -using CommunityToolkit.Mvvm.Input; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; -using PdfEditorApp.Models; - -namespace PdfEditorApp.ViewModels.ElementViewModels; - -public partial class BarcodeElementViewModel : ElementViewModelBase -{ - [ObservableProperty] - private string _codeValue = "DOC-2026-984210"; - - [ObservableProperty] - private string _barcodeFormat = "Code128"; - - [ObservableProperty] - private string _barColorHex = "#0F172A"; - - [ObservableProperty] - private string _backgroundColorHex = "#FFFFFF"; - - [ObservableProperty] - private bool _showText = true; - - [RelayCommand] - public void SetFormat(string formatStr) - { - BarcodeFormat = formatStr; - } - - public override ElementKind Kind => ElementKind.Barcode; - public override string DisplayName => $"Barcode ({CodeValue})"; - - public BarcodeElementViewModel() - { - Width = 220; - Height = 70; - } - - public override PdfElementBase ToModel() - { - return new PdfBarcodeElement - { - Id = Id, - X = X, - Y = Y, - Width = Width, - Height = Height, - ZIndex = ZIndex, - Rotation = Rotation, - Opacity = Opacity, - IsLocked = IsLocked, - CodeValue = CodeValue, - BarcodeFormat = BarcodeFormat, - BarColorHex = BarColorHex, - BackgroundColorHex = BackgroundColorHex, - ShowText = ShowText - }; - } - - public override void LoadFromModel(PdfElementBase model) - { - if (model is PdfBarcodeElement barcode) - { - Id = barcode.Id; - X = barcode.X; - Y = barcode.Y; - Width = barcode.Width; - Height = barcode.Height; - ZIndex = barcode.ZIndex; - Rotation = barcode.Rotation; - Opacity = barcode.Opacity; - IsLocked = barcode.IsLocked; - - CodeValue = barcode.CodeValue; - BarcodeFormat = barcode.BarcodeFormat; - BarColorHex = barcode.BarColorHex; - BackgroundColorHex = barcode.BackgroundColorHex; - ShowText = barcode.ShowText; - } - } -} diff --git a/src/PdfEditorApp/ViewModels/ElementViewModels/ChartElementViewModel.cs b/src/PdfEditorApp/ViewModels/ElementViewModels/ChartElementViewModel.cs deleted file mode 100644 index 46df4b3..0000000 --- a/src/PdfEditorApp/ViewModels/ElementViewModels/ChartElementViewModel.cs +++ /dev/null @@ -1,710 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using CommunityToolkit.Mvvm.ComponentModel; -using CommunityToolkit.Mvvm.Input; -using LiveChartsCore; -using LiveChartsCore.Defaults; -using LiveChartsCore.Drawing; -using LiveChartsCore.Measure; -using LiveChartsCore.SkiaSharpView; -using LiveChartsCore.SkiaSharpView.Painting; -using LiveChartsCore.SkiaSharpView.VisualElements; -using PdfEditorApp.Core.Analysis; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; -using PdfEditorApp.Models; -using SkiaSharp; - -namespace PdfEditorApp.ViewModels.ElementViewModels; - -public class ChartBarItem : ObservableObject -{ - private string _category = "Q1"; - public string Category - { - get => _category; - set => SetProperty(ref _category, value); - } - - private double _value = 1.0; - public double Value - { - get => _value; - set - { - if (SetProperty(ref _value, value)) - { - OnPropertyChanged(nameof(BarHeightPx)); - } - } - } - - private string _valueLabel = "$1.0B"; - public string ValueLabel - { - get => _valueLabel; - set => SetProperty(ref _valueLabel, value); - } - - private string _colorHex = "#0F6CBD"; - public string ColorHex - { - get => _colorHex; - set => SetProperty(ref _colorHex, value); - } - - public double BarHeightPx => Math.Max(10, Value * 35); -} - -public partial class ChartElementViewModel : ElementViewModelBase -{ - [ObservableProperty] - private string _title = "Revenue Growth (Q1-Q4)"; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(IsBarColumn))] - [NotifyPropertyChangedFor(nameof(IsHorizontalBar))] - [NotifyPropertyChangedFor(nameof(IsLine))] - [NotifyPropertyChangedFor(nameof(IsSmoothLine))] - [NotifyPropertyChangedFor(nameof(IsArea))] - [NotifyPropertyChangedFor(nameof(IsDonutPie))] - [NotifyPropertyChangedFor(nameof(IsStackedBar))] - [NotifyPropertyChangedFor(nameof(IsStackedHorizontalBar))] - [NotifyPropertyChangedFor(nameof(IsRadar))] - [NotifyPropertyChangedFor(nameof(IsPolarArea))] - [NotifyPropertyChangedFor(nameof(IsFunnel))] - [NotifyPropertyChangedFor(nameof(IsWaterfall))] - [NotifyPropertyChangedFor(nameof(IsGaugeProgress))] - [NotifyPropertyChangedFor(nameof(IsStepLine))] - [NotifyPropertyChangedFor(nameof(IsPyramid))] - [NotifyPropertyChangedFor(nameof(IsScatterPlot))] - [NotifyPropertyChangedFor(nameof(IsCandlestick))] - [NotifyPropertyChangedFor(nameof(IsCartesianChart))] - [NotifyPropertyChangedFor(nameof(IsPieChart))] - [NotifyPropertyChangedFor(nameof(IsPolarChart))] - [NotifyPropertyChangedFor(nameof(ChartTypeDescription))] - private ChartType _chartType = ChartType.BarColumn; - - public bool IsBarColumn => ChartType == ChartType.BarColumn; - public bool IsHorizontalBar => ChartType == ChartType.HorizontalBar; - public bool IsLine => ChartType == ChartType.Line; - public bool IsSmoothLine => ChartType == ChartType.SmoothLine; - public bool IsArea => ChartType == ChartType.Area; - public bool IsDonutPie => ChartType == ChartType.DonutPie; - public bool IsStackedBar => ChartType == ChartType.StackedBar; - public bool IsStackedHorizontalBar => ChartType == ChartType.StackedHorizontalBar; - public bool IsRadar => ChartType == ChartType.Radar; - public bool IsPolarArea => ChartType == ChartType.PolarArea; - public bool IsFunnel => ChartType == ChartType.Funnel; - public bool IsWaterfall => ChartType == ChartType.Waterfall; - public bool IsGaugeProgress => ChartType == ChartType.GaugeProgress; - public bool IsStepLine => ChartType == ChartType.StepLine; - public bool IsPyramid => ChartType == ChartType.Pyramid; - public bool IsScatterPlot => ChartType == ChartType.ScatterPlot; - public bool IsCandlestick => ChartType == ChartType.Candlestick; - - public bool IsPieChart => ChartType == ChartType.DonutPie || ChartType == ChartType.GaugeProgress; - public bool IsPolarChart => ChartType == ChartType.Radar || ChartType == ChartType.PolarArea; - public bool IsCartesianChart => !IsPieChart && !IsPolarChart; - - public string ChartTypeDescription => ChartType.ToString(); - - [ObservableProperty] - private ChartPalette _palette = ChartPalette.CorporateBlue; - - [ObservableProperty] - private ChartLegendPosition _legendPosition = ChartLegendPosition.Top; - - [ObservableProperty] - private bool _showDataLabels = true; - - [ObservableProperty] - private bool _showGridlines = true; - - [ObservableProperty] - private double _donutHoleRatio = 0.6; - - [ObservableProperty] - private double _curveSmoothness = 0.65; - - [ObservableProperty] - private double _strokeThickness = 3.0; - - [ObservableProperty] - private string _backgroundColorHex = "#FAFAFA"; - - [ObservableProperty] - private string _borderColorHex = "#E2E8F0"; - - public ObservableCollection Bars { get; } = new(); - - // LiveCharts2 Series & Axes - [ObservableProperty] - private ISeries[] _cartesianSeries = Array.Empty(); - - [ObservableProperty] - private ISeries[] _pieSeries = Array.Empty(); - - [ObservableProperty] - private ISeries[] _polarSeries = Array.Empty(); - - [ObservableProperty] - private Axis[] _xAxes = Array.Empty(); - - [ObservableProperty] - private Axis[] _yAxes = Array.Empty(); - - [ObservableProperty] - private PolarAxis[] _angleAxes = Array.Empty(); - - [ObservableProperty] - private PolarAxis[] _radiusAxes = Array.Empty(); - - [ObservableProperty] - private LiveChartsCore.Measure.LegendPosition _liveLegendPosition = LiveChartsCore.Measure.LegendPosition.Top; - - [ObservableProperty] - private double _pieMaxAngle = 360; - - [ObservableProperty] - private double _pieInitialRotation = -90; - - [ObservableProperty] - private Avalonia.Media.Imaging.Bitmap? _chartBitmap; - - private Avalonia.Media.Imaging.Bitmap? _previousChartBitmap; - - /// Disposes the outgoing bitmap whenever a new one is rasterized — - /// is re-rasterized on nearly every property change with no other lifecycle owner, so without this - /// the old native bitmap leaks. - partial void OnChartBitmapChanged(Avalonia.Media.Imaging.Bitmap? value) - { - if (_previousChartBitmap != null && _previousChartBitmap != value) - { - _previousChartBitmap.Dispose(); - } - _previousChartBitmap = value; - } - - public override ElementKind Kind => ElementKind.Chart; - public override string DisplayName => Title; - - public ChartElementViewModel() - { - LiveChartsRenderer.EnsureConfigured(); - - // Default sample bars - Bars.Add(new ChartBarItem { Category = "Q1", Value = 1.2, ValueLabel = "$1.2B", ColorHex = "#93C5FD" }); - Bars.Add(new ChartBarItem { Category = "Q2", Value = 1.8, ValueLabel = "$1.8B", ColorHex = "#60A5FA" }); - Bars.Add(new ChartBarItem { Category = "Q3", Value = 2.5, ValueLabel = "$2.5B", ColorHex = "#3B82F6" }); - Bars.Add(new ChartBarItem { Category = "Q4", Value = 3.1, ValueLabel = "$3.1B", ColorHex = "#0F6CBD" }); - - Bars.CollectionChanged += (s, e) => { if (!_suppressChartUpdate) UpdateLiveChart(); }; - PropertyChanged += (s, e) => - { - if (e.PropertyName == nameof(Width) || e.PropertyName == nameof(Height)) - { - // Width/Height fire on every pointer-move during an interactive resize drag — - // rasterizing a fresh chart bitmap on every one of those would make resize feel - // like it's dragging through mud. Coalesce to roughly one rasterize per settle. - RequestChartUpdate(); - } - }; - UpdateLiveChart(); - } - - private bool _suppressChartUpdate; - private CancellationTokenSource? _chartUpdateDebounceCts; - - private void RequestChartUpdate() - { - _chartUpdateDebounceCts?.Cancel(); - _chartUpdateDebounceCts = new CancellationTokenSource(); - var token = _chartUpdateDebounceCts.Token; - - _ = Task.Run(async () => - { - try - { - await Task.Delay(120, token); - } - catch (TaskCanceledException) - { - return; - } - if (token.IsCancellationRequested) return; - - Avalonia.Threading.Dispatcher.UIThread.Post(() => - { - if (!token.IsCancellationRequested) - { - UpdateLiveChart(); - } - }); - }, token); - } - - partial void OnChartTypeChanged(ChartType value) => UpdateLiveChart(); - partial void OnPaletteChanged(ChartPalette value) => UpdateLiveChart(); - partial void OnLegendPositionChanged(ChartLegendPosition value) => UpdateLiveChart(); - partial void OnShowDataLabelsChanged(bool value) => UpdateLiveChart(); - partial void OnShowGridlinesChanged(bool value) => UpdateLiveChart(); - partial void OnDonutHoleRatioChanged(double value) => UpdateLiveChart(); - partial void OnCurveSmoothnessChanged(double value) => UpdateLiveChart(); - partial void OnStrokeThicknessChanged(double value) => UpdateLiveChart(); - partial void OnTitleChanged(string value) => UpdateLiveChart(); - - [RelayCommand] - public void SetChartType(string typeStr) - { - if (Enum.TryParse(typeStr, true, out var type)) - { - ChartType = type; - } - } - - [RelayCommand] - public void SetPalette(string paletteStr) - { - if (Enum.TryParse(paletteStr, true, out var pal)) - { - Palette = pal; - } - } - - [RelayCommand] - public void SetLegendPosition(string posStr) - { - if (Enum.TryParse(posStr, true, out var pos)) - { - LegendPosition = pos; - } - } - - [RelayCommand] - public void AddDataPoint() - { - int nextNum = Bars.Count + 1; - var palette = LiveChartsRenderer.GetPaletteHexColors(Palette); - string color = palette[(nextNum - 1) % palette.Count]; - double val = Math.Round(1.0 + (nextNum * 0.5), 1); - - _suppressChartUpdate = true; - Bars.Add(new ChartBarItem - { - Category = $"Q{nextNum}", - Value = val, - ValueLabel = $"${val:F1}B", - ColorHex = color - }); - _suppressChartUpdate = false; - OnPropertyChanged(nameof(Bars)); - UpdateLiveChart(); - } - - [RelayCommand] - public void RemoveDataPoint() - { - if (Bars.Count > 1) - { - _suppressChartUpdate = true; - Bars.RemoveAt(Bars.Count - 1); - _suppressChartUpdate = false; - OnPropertyChanged(nameof(Bars)); - UpdateLiveChart(); - } - } - - public void UpdateLiveChart() - { - var palette = LiveChartsRenderer.GetPaletteHexColors(Palette); - LiveLegendPosition = LegendPosition switch - { - ChartLegendPosition.Top => LiveChartsCore.Measure.LegendPosition.Top, - ChartLegendPosition.Bottom => LiveChartsCore.Measure.LegendPosition.Bottom, - ChartLegendPosition.Left => LiveChartsCore.Measure.LegendPosition.Left, - ChartLegendPosition.Right => LiveChartsCore.Measure.LegendPosition.Right, - _ => LiveChartsCore.Measure.LegendPosition.Hidden - }; - - var categories = Bars.Select(b => b.Category).ToArray(); - var values = Bars.Select(b => b.Value).ToArray(); - - // 1. Cartesian Series - var cSeries = new List(); - switch (ChartType) - { - case ChartType.HorizontalBar: - { - var color = LiveChartsRenderer.ParseColor(Bars.FirstOrDefault()?.ColorHex ?? palette[0], SKColors.RoyalBlue); - cSeries.Add(new RowSeries - { - Name = Title, - Values = values, - Fill = new SolidColorPaint(color), - Stroke = null, - DataLabelsPaint = ShowDataLabels ? new SolidColorPaint(SKColors.DarkSlateGray) : null - }); - break; - } - - case ChartType.StackedBar: - { - for (int i = 0; i < values.Length; i++) - { - var color = LiveChartsRenderer.ParseColor(i < Bars.Count ? Bars[i].ColorHex : palette[i % palette.Count], SKColors.RoyalBlue); - cSeries.Add(new StackedColumnSeries - { - Name = i < categories.Length ? categories[i] : $"Segment {i + 1}", - Values = new double[] { values[i] }, - Fill = new SolidColorPaint(color), - Stroke = null - }); - } - break; - } - - case ChartType.StackedHorizontalBar: - { - var color = LiveChartsRenderer.ParseColor(Bars.FirstOrDefault()?.ColorHex ?? palette[0], SKColors.RoyalBlue); - cSeries.Add(new StackedRowSeries - { - Name = Title, - Values = values, - Fill = new SolidColorPaint(color), - Stroke = null - }); - break; - } - - case ChartType.Line: - { - var color = LiveChartsRenderer.ParseColor(Bars.FirstOrDefault()?.ColorHex ?? palette[0], SKColors.RoyalBlue); - cSeries.Add(new LineSeries - { - Name = Title, - Values = values, - Stroke = new SolidColorPaint(color, (float)StrokeThickness), - Fill = null, - GeometrySize = 7, - GeometryStroke = new SolidColorPaint(color, 2), - GeometryFill = new SolidColorPaint(SKColors.White), - LineSmoothness = 0.0 - }); - break; - } - - case ChartType.SmoothLine: - { - var color = LiveChartsRenderer.ParseColor(Bars.FirstOrDefault()?.ColorHex ?? palette[0], SKColors.RoyalBlue); - cSeries.Add(new LineSeries - { - Name = Title, - Values = values, - Stroke = new SolidColorPaint(color, (float)StrokeThickness), - Fill = null, - GeometrySize = 8, - GeometryStroke = new SolidColorPaint(color, 2), - GeometryFill = new SolidColorPaint(SKColors.White), - LineSmoothness = (float)CurveSmoothness - }); - break; - } - - case ChartType.Area: - { - var color = LiveChartsRenderer.ParseColor(Bars.FirstOrDefault()?.ColorHex ?? palette[0], SKColors.RoyalBlue); - var fillColor = color.WithAlpha(65); - cSeries.Add(new LineSeries - { - Name = Title, - Values = values, - Stroke = new SolidColorPaint(color, (float)StrokeThickness), - Fill = new SolidColorPaint(fillColor), - GeometrySize = 7, - GeometryStroke = new SolidColorPaint(color, 2), - GeometryFill = new SolidColorPaint(SKColors.White), - LineSmoothness = (float)CurveSmoothness - }); - break; - } - - case ChartType.StepLine: - { - var color = LiveChartsRenderer.ParseColor(Bars.FirstOrDefault()?.ColorHex ?? palette[0], SKColors.RoyalBlue); - cSeries.Add(new StepLineSeries - { - Name = Title, - Values = values, - Stroke = new SolidColorPaint(color, (float)StrokeThickness), - Fill = null, - GeometrySize = 7, - GeometryStroke = new SolidColorPaint(color, 2), - GeometryFill = new SolidColorPaint(SKColors.White) - }); - break; - } - - case ChartType.ScatterPlot: - { - var color = LiveChartsRenderer.ParseColor(Bars.FirstOrDefault()?.ColorHex ?? palette[0], SKColors.RoyalBlue); - var points = new List(); - for (int i = 0; i < values.Length; i++) - { - points.Add(new ObservablePoint(i + 1, values[i])); - } - cSeries.Add(new ScatterSeries - { - Name = Title, - Values = points, - Stroke = new SolidColorPaint(color, 2), - Fill = new SolidColorPaint(color.WithAlpha(180)), - GeometrySize = 12 - }); - break; - } - - case ChartType.Candlestick: - { - var financialPoints = new List(); - for (int i = 0; i < values.Length; i++) - { - double close = values[i]; - double open = i > 0 ? values[i - 1] : close * 0.95; - double high = Math.Max(open, close) * 1.08; - double low = Math.Min(open, close) * 0.92; - financialPoints.Add(new FinancialPoint(new DateTime(2026, 1, 1).AddDays(i), high, open, close, low)); - } - cSeries.Add(new CandlesticksSeries - { - Name = Title, - Values = financialPoints, - UpStroke = new SolidColorPaint(SKColors.ForestGreen, 2), - UpFill = new SolidColorPaint(SKColors.ForestGreen.WithAlpha(200)), - DownStroke = new SolidColorPaint(SKColors.IndianRed, 2), - DownFill = new SolidColorPaint(SKColors.IndianRed.WithAlpha(200)) - }); - break; - } - - case ChartType.Waterfall: - case ChartType.Funnel: - case ChartType.Pyramid: - case ChartType.BarColumn: - default: - { - var color = LiveChartsRenderer.ParseColor(Bars.FirstOrDefault()?.ColorHex ?? palette[0], SKColors.RoyalBlue); - cSeries.Add(new ColumnSeries - { - Name = Title, - Values = values, - Fill = new SolidColorPaint(color), - Stroke = null, - Rx = 4, - Ry = 4, - DataLabelsPaint = ShowDataLabels ? new SolidColorPaint(SKColors.DarkSlateGray) : null - }); - break; - } - } - CartesianSeries = cSeries.ToArray(); - - // Cartesian Axes - XAxes = new Axis[] - { - new Axis - { - Labels = categories, - LabelsPaint = new SolidColorPaint(SKColors.DarkSlateGray), - TextSize = 11, - SeparatorsPaint = ShowGridlines ? new SolidColorPaint(SKColors.LightGray.WithAlpha(110)) { StrokeThickness = 1 } : null - } - }; - - YAxes = new Axis[] - { - new Axis - { - LabelsPaint = new SolidColorPaint(SKColors.DarkSlateGray), - TextSize = 11, - SeparatorsPaint = ShowGridlines ? new SolidColorPaint(SKColors.LightGray.WithAlpha(110)) { StrokeThickness = 1 } : null - } - }; - - // 2. Pie & Donut Series - var pSeries = new List(); - double innerRadius = ChartType == ChartType.DonutPie ? Math.Max(0.1, DonutHoleRatio) : 0.0; - PieMaxAngle = ChartType == ChartType.GaugeProgress ? 180 : 360; - PieInitialRotation = ChartType == ChartType.GaugeProgress ? -180 : -90; - - for (int i = 0; i < values.Length; i++) - { - var color = LiveChartsRenderer.ParseColor(i < Bars.Count ? Bars[i].ColorHex : palette[i % palette.Count], SKColors.RoyalBlue); - string name = i < categories.Length ? categories[i] : $"Segment {i + 1}"; - string valLabel = i < Bars.Count && !string.IsNullOrEmpty(Bars[i].ValueLabel) ? Bars[i].ValueLabel : values[i].ToString("G"); - - pSeries.Add(new PieSeries - { - Name = $"{name} ({valLabel})", - Values = new double[] { values[i] }, - Fill = new SolidColorPaint(color), - Stroke = new SolidColorPaint(SKColors.White, 2), - InnerRadius = innerRadius, - DataLabelsPaint = ShowDataLabels ? new SolidColorPaint(SKColors.White) : null - }); - } - PieSeries = pSeries.ToArray(); - - // 3. Polar & Radar Series - var polSeries = new List(); - var polColor = LiveChartsRenderer.ParseColor(Bars.FirstOrDefault()?.ColorHex ?? palette[0], SKColors.RoyalBlue); - bool isArea = ChartType == ChartType.PolarArea; - - polSeries.Add(new PolarLineSeries - { - Name = Title, - Values = values, - Stroke = new SolidColorPaint(polColor, (float)StrokeThickness), - Fill = isArea ? new SolidColorPaint(polColor.WithAlpha(90)) : null, - GeometrySize = 7, - GeometryStroke = new SolidColorPaint(polColor, 2), - GeometryFill = new SolidColorPaint(SKColors.White), - IsClosed = true - }); - PolarSeries = polSeries.ToArray(); - - AngleAxes = new PolarAxis[] - { - new PolarAxis - { - Labels = categories, - LabelsPaint = new SolidColorPaint(SKColors.DarkSlateGray), - TextSize = 10, - SeparatorsPaint = ShowGridlines ? new SolidColorPaint(SKColors.LightGray.WithAlpha(120)) { StrokeThickness = 1 } : null - } - }; - - RadiusAxes = new PolarAxis[] - { - new PolarAxis - { - LabelsPaint = new SolidColorPaint(SKColors.Gray), - TextSize = 9, - SeparatorsPaint = ShowGridlines ? new SolidColorPaint(SKColors.LightGray.WithAlpha(100)) { StrokeThickness = 1 } : null - } - }; - - // Render high-DPI live bitmap for native Avalonia canvas - try - { - var model = (PdfChartElement)ToModel(); - int renderW = Math.Max(200, (int)Width); - int renderH = Math.Max(120, (int)Height); - byte[] pngBytes = LiveChartsRenderer.RenderChartToPngBytes(model, renderW, renderH, 2.0f); - if (pngBytes != null && pngBytes.Length > 0) - { - using var ms = new System.IO.MemoryStream(pngBytes); - ChartBitmap = new Avalonia.Media.Imaging.Bitmap(ms); - } - } - catch - { - // Fallback for edge cases - } - } - - public List MultiSeries { get; set; } = new(); - - public override PdfElementBase ToModel() - { - var model = new PdfChartElement - { - Id = Id, - X = X, - Y = Y, - Width = Width, - Height = Height, - ZIndex = ZIndex, - Rotation = Rotation, - Opacity = Opacity, - IsLocked = IsLocked, - Title = Title, - ChartType = ChartType, - Palette = Palette, - LegendPosition = LegendPosition, - ShowDataLabels = ShowDataLabels, - ShowGridlines = ShowGridlines, - DonutHoleRatio = DonutHoleRatio, - CurveSmoothness = CurveSmoothness, - StrokeThickness = StrokeThickness, - BackgroundColorHex = BackgroundColorHex, - BorderColorHex = BorderColorHex, - Categories = new List(), - Values = new List(), - ValueLabels = new List(), - BarColorsHex = new List(), - MultiSeries = MultiSeries.Select(s => s.Clone()).ToList() - }; - - foreach (var bar in Bars) - { - model.Categories.Add(bar.Category); - model.Values.Add(bar.Value); - model.ValueLabels.Add(bar.ValueLabel); - model.BarColorsHex.Add(bar.ColorHex); - } - - return model; - } - - public override void LoadFromModel(PdfElementBase model) - { - if (model is PdfChartElement chart) - { - Id = chart.Id; - X = chart.X; - Y = chart.Y; - Width = chart.Width; - Height = chart.Height; - ZIndex = chart.ZIndex; - Rotation = chart.Rotation; - Opacity = chart.Opacity; - IsLocked = chart.IsLocked; - - Title = chart.Title; - ChartType = chart.ChartType; - Palette = chart.Palette; - LegendPosition = chart.LegendPosition; - ShowDataLabels = chart.ShowDataLabels; - ShowGridlines = chart.ShowGridlines; - DonutHoleRatio = chart.DonutHoleRatio; - CurveSmoothness = chart.CurveSmoothness; - StrokeThickness = chart.StrokeThickness; - BackgroundColorHex = chart.BackgroundColorHex; - BorderColorHex = chart.BorderColorHex; - MultiSeries = chart.MultiSeries?.Select(s => s.Clone()).ToList() ?? new(); - - // Adding N bars one at a time would otherwise fire UpdateLiveChart() (and a full - // chart rasterization) once per bar — suppress until the whole set has loaded, - // then rasterize exactly once. - _suppressChartUpdate = true; - Bars.Clear(); - for (int i = 0; i < chart.Categories.Count; i++) - { - Bars.Add(new ChartBarItem - { - Category = chart.Categories[i], - Value = i < chart.Values.Count ? chart.Values[i] : 1.0, - ValueLabel = i < chart.ValueLabels.Count ? chart.ValueLabels[i] : "", - ColorHex = i < chart.BarColorsHex.Count ? chart.BarColorsHex[i] : "#0F6CBD" - }); - } - _suppressChartUpdate = false; - UpdateLiveChart(); - } - } -} diff --git a/src/PdfEditorApp/ViewModels/ElementViewModels/DividerElementViewModel.cs b/src/PdfEditorApp/ViewModels/ElementViewModels/DividerElementViewModel.cs deleted file mode 100644 index d8dc449..0000000 --- a/src/PdfEditorApp/ViewModels/ElementViewModels/DividerElementViewModel.cs +++ /dev/null @@ -1,103 +0,0 @@ -using System.ComponentModel; -using CommunityToolkit.Mvvm.ComponentModel; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; -using PdfEditorApp.Models; -using PdfEditorApp.Services; - -namespace PdfEditorApp.ViewModels.ElementViewModels; - -public partial class DividerElementViewModel : ElementViewModelBase -{ - [ObservableProperty] - private string _colorHex = "#0F6CBD"; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(PathData))] - [NotifyPropertyChangedFor(nameof(DashArrayString))] - private double _thickness = 2; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(PathData))] - private bool _isVertical; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(PathData))] - private DividerStyle _style = DividerStyle.Straight; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(PathData))] - private double _waveAmplitude = 6.0; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(PathData))] - private double _waveFrequency = 4.0; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(DashArrayString))] - private LineDashStyle _dashStyle = LineDashStyle.Solid; - - public override ElementKind Kind => ElementKind.Divider; - public override string DisplayName => $"Divider ({Style})"; - - public string PathData => SvgShapeHelper.GenerateDividerSvgPath(Style, Width, Height > 0 ? Height : 16, WaveAmplitude, WaveFrequency, IsVertical); - public string? DashArrayString => SvgShapeHelper.GetDashArray(DashStyle, Thickness); - - protected override void OnPropertyChanged(PropertyChangedEventArgs e) - { - base.OnPropertyChanged(e); - if (e.PropertyName is nameof(Width) or nameof(Height) or nameof(Thickness) or nameof(Style) or nameof(WaveAmplitude) or nameof(WaveFrequency) or nameof(IsVertical) or nameof(DashStyle)) - { - OnPropertyChanged(nameof(PathData)); - OnPropertyChanged(nameof(DashArrayString)); - } - } - - public override PdfElementBase ToModel() - { - return new PdfDividerElement - { - Id = Id, - X = X, - Y = Y, - Width = Width, - Height = Height, - ZIndex = ZIndex, - Rotation = Rotation, - Opacity = Opacity, - IsLocked = IsLocked, - ColorHex = ColorHex, - Thickness = Thickness, - IsVertical = IsVertical, - Style = Style, - WaveAmplitude = WaveAmplitude, - WaveFrequency = WaveFrequency, - DashStyle = DashStyle - }; - } - - public override void LoadFromModel(PdfElementBase model) - { - if (model is PdfDividerElement div) - { - Id = div.Id; - X = div.X; - Y = div.Y; - Width = div.Width; - Height = div.Height; - ZIndex = div.ZIndex; - Rotation = div.Rotation; - Opacity = div.Opacity; - IsLocked = div.IsLocked; - - ColorHex = div.ColorHex; - Thickness = div.Thickness; - IsVertical = div.IsVertical; - Style = div.Style; - WaveAmplitude = div.WaveAmplitude; - WaveFrequency = div.WaveFrequency; - DashStyle = div.DashStyle; - } - } -} - diff --git a/src/PdfEditorApp/ViewModels/ElementViewModels/ElementViewModelBase.cs b/src/PdfEditorApp/ViewModels/ElementViewModels/ElementViewModelBase.cs deleted file mode 100644 index 97838f9..0000000 --- a/src/PdfEditorApp/ViewModels/ElementViewModels/ElementViewModelBase.cs +++ /dev/null @@ -1,163 +0,0 @@ -using System; -using CommunityToolkit.Mvvm.ComponentModel; -using CommunityToolkit.Mvvm.Input; -using CommunityToolkit.Mvvm.Messaging; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; -using PdfEditorApp.Models; - -namespace PdfEditorApp.ViewModels.ElementViewModels; - -public abstract partial class ElementViewModelBase : ViewModelBase -{ - [ObservableProperty] - private string _id = Guid.NewGuid().ToString("N"); - - [ObservableProperty] - private double _x; - - [ObservableProperty] - private double _y; - - [ObservableProperty] - private double _width = 200; - - [ObservableProperty] - private double _height = 100; - - [ObservableProperty] - private int _zIndex = 0; - - [ObservableProperty] - private double _rotation = 0; - - [ObservableProperty] - private double _opacity = 1.0; - - [ObservableProperty] - private bool _isSelected; - - [ObservableProperty] - private bool _isInEditMode; - - partial void OnIsInEditModeChanged(bool value) - { - OnEditModeChanged(value); - } - - protected virtual void OnEditModeChanged(bool isInEditMode) - { - } - - [ObservableProperty] - private bool _isLocked; - - [ObservableProperty] - private string? _groupId; - - public abstract ElementKind Kind { get; } - public abstract string DisplayName { get; } - - public abstract PdfElementBase ToModel(); - public abstract void LoadFromModel(PdfElementBase model); - - protected void CopyBasePropertiesTo(PdfElementBase model) - { - model.Id = Id; - model.X = X; - model.Y = Y; - model.Width = Width; - model.Height = Height; - model.ZIndex = ZIndex; - model.Rotation = Rotation; - model.Opacity = Opacity; - model.IsLocked = IsLocked; - model.GroupId = GroupId; - } - - protected void PopulateBaseProperties(PdfElementBase model) - { - Id = model.Id; - X = model.X; - Y = model.Y; - Width = model.Width; - Height = model.Height; - ZIndex = model.ZIndex; - Rotation = model.Rotation; - Opacity = model.Opacity; - IsLocked = model.IsLocked; - GroupId = model.GroupId; - } - - public virtual void MoveBy(double deltaX, double deltaY, double canvasWidth, double canvasHeight) - { - if (IsLocked) return; - - double newX = Math.Max(0, Math.Min(canvasWidth - Width, X + deltaX)); - double newY = Math.Max(0, Math.Min(canvasHeight - Height, Y + deltaY)); - - X = Math.Round(newX, 1); - Y = Math.Round(newY, 1); - } - - public virtual void Resize(string handle, double deltaX, double deltaY, double minW = 30, double minH = 20) - { - if (IsLocked) return; - - switch (handle.ToLowerInvariant()) - { - case "topleft": - double newW = Math.Max(minW, Width - deltaX); - double newH = Math.Max(minH, Height - deltaY); - X += Width - newW; - Y += Height - newH; - Width = newW; - Height = newH; - break; - - case "top": - double newTopH = Math.Max(minH, Height - deltaY); - Y += Height - newTopH; - Height = newTopH; - break; - - case "topright": - Width = Math.Max(minW, Width + deltaX); - double newTRH = Math.Max(minH, Height - deltaY); - Y += Height - newTRH; - Height = newTRH; - break; - - case "left": - double newLeftW = Math.Max(minW, Width - deltaX); - X += Width - newLeftW; - Width = newLeftW; - break; - - case "right": - Width = Math.Max(minW, Width + deltaX); - break; - - case "bottomleft": - double newBLW = Math.Max(minW, Width - deltaX); - X += Width - newBLW; - Width = newBLW; - Height = Math.Max(minH, Height + deltaY); - break; - - case "bottom": - Height = Math.Max(minH, Height + deltaY); - break; - - case "bottomright": - Width = Math.Max(minW, Width + deltaX); - Height = Math.Max(minH, Height + deltaY); - break; - } - - X = Math.Round(X, 1); - Y = Math.Round(Y, 1); - Width = Math.Round(Width, 1); - Height = Math.Round(Height, 1); - } -} diff --git a/src/PdfEditorApp/ViewModels/ElementViewModels/FormFieldElementViewModel.cs b/src/PdfEditorApp/ViewModels/ElementViewModels/FormFieldElementViewModel.cs deleted file mode 100644 index cda5255..0000000 --- a/src/PdfEditorApp/ViewModels/ElementViewModels/FormFieldElementViewModel.cs +++ /dev/null @@ -1,179 +0,0 @@ -using System.Collections.ObjectModel; -using CommunityToolkit.Mvvm.ComponentModel; -using CommunityToolkit.Mvvm.Input; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; -using PdfEditorApp.Models; - -namespace PdfEditorApp.ViewModels.ElementViewModels; - -public partial class FormFieldElementViewModel : ElementViewModelBase -{ - [ObservableProperty] - private FormFieldType _fieldType = FormFieldType.Text; - - [ObservableProperty] - private string _fieldName = "form_field_1"; - - [ObservableProperty] - private string _label = "Full Legal Name:"; - - [ObservableProperty] - private string _placeholder = "Type text here..."; - - [ObservableProperty] - private string _value = ""; - - [ObservableProperty] - private string _defaultValue = ""; - - [ObservableProperty] - private string _tooltip = ""; - - [ObservableProperty] - private bool _isRequired = true; - - [ObservableProperty] - private bool _isReadOnly = false; - - [ObservableProperty] - private bool _isChecked; - - [ObservableProperty] - private FormValidationType _validationType = FormValidationType.None; - - [ObservableProperty] - private string _customValidationRegex = ""; - - [ObservableProperty] - private string _borderColorHex = "#0F6CBD"; - - [ObservableProperty] - private string _backgroundColorHex = "#F8FAFC"; - - [ObservableProperty] - private double _fontSize = 12; - - // Acrobat Form Calculations & Action Buttons - [ObservableProperty] - private CalculationFormula _calculationFormula = CalculationFormula.None; - - [ObservableProperty] - private string _calculationSourceFields = ""; - - [ObservableProperty] - private FormButtonAction _buttonAction = FormButtonAction.SubmitForm; - - [ObservableProperty] - private string _actionTarget = ""; - - public ObservableCollection Options { get; } = new(); - - public override ElementKind Kind => ElementKind.FormField; - public override string DisplayName => $"Form: {Label} ({FieldType})"; - - public FormFieldElementViewModel() - { - Options.Add("Approved"); - Options.Add("Under Review"); - Options.Add("Declined"); - } - - [RelayCommand] - public void ToggleChecked() - { - IsChecked = !IsChecked; - } - - [RelayCommand] - public void AddOption(string? optionText) - { - string text = string.IsNullOrWhiteSpace(optionText) ? $"Option {Options.Count + 1}" : optionText.Trim(); - Options.Add(text); - } - - [RelayCommand] - public void RemoveOption(string? optionText) - { - if (optionText != null && Options.Contains(optionText)) - { - Options.Remove(optionText); - } - } - - public override PdfElementBase ToModel() - { - var model = new PdfFormFieldElement - { - Id = Id, - X = X, - Y = Y, - Width = Width, - Height = Height, - ZIndex = ZIndex, - Rotation = Rotation, - Opacity = Opacity, - IsLocked = IsLocked, - FieldType = FieldType, - FieldName = FieldName, - Label = Label, - Placeholder = Placeholder, - Value = Value, - DefaultValue = DefaultValue, - Tooltip = Tooltip, - IsRequired = IsRequired, - IsReadOnly = IsReadOnly, - IsChecked = IsChecked, - ValidationType = ValidationType, - CustomValidationRegex = CustomValidationRegex, - BorderColorHex = BorderColorHex, - BackgroundColorHex = BackgroundColorHex, - FontSize = FontSize, - CalculationFormula = CalculationFormula, - CalculationSourceFields = CalculationSourceFields, - ButtonAction = ButtonAction, - ActionTarget = ActionTarget, - Options = new System.Collections.Generic.List(Options) - }; - return model; - } - - public override void LoadFromModel(PdfElementBase model) - { - if (model is PdfFormFieldElement form) - { - Id = form.Id; - X = form.X; - Y = form.Y; - Width = form.Width; - Height = form.Height; - ZIndex = form.ZIndex; - Rotation = form.Rotation; - Opacity = form.Opacity; - IsLocked = form.IsLocked; - - FieldType = form.FieldType; - FieldName = form.FieldName; - Label = form.Label; - Placeholder = form.Placeholder; - Value = form.Value; - DefaultValue = form.DefaultValue; - Tooltip = form.Tooltip; - IsRequired = form.IsRequired; - IsReadOnly = form.IsReadOnly; - IsChecked = form.IsChecked; - ValidationType = form.ValidationType; - CustomValidationRegex = form.CustomValidationRegex; - BorderColorHex = form.BorderColorHex; - BackgroundColorHex = form.BackgroundColorHex; - FontSize = form.FontSize; - CalculationFormula = form.CalculationFormula; - CalculationSourceFields = form.CalculationSourceFields; - ButtonAction = form.ButtonAction; - ActionTarget = form.ActionTarget; - - Options.Clear(); - foreach (var opt in form.Options) Options.Add(opt); - } - } -} diff --git a/src/PdfEditorApp/ViewModels/ElementViewModels/ImageElementViewModel.cs b/src/PdfEditorApp/ViewModels/ElementViewModels/ImageElementViewModel.cs deleted file mode 100644 index 969f3fa..0000000 --- a/src/PdfEditorApp/ViewModels/ElementViewModels/ImageElementViewModel.cs +++ /dev/null @@ -1,180 +0,0 @@ -using System; -using System.IO; -using Avalonia.Media.Imaging; -using CommunityToolkit.Mvvm.ComponentModel; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; -using PdfEditorApp.Models; - -namespace PdfEditorApp.ViewModels.ElementViewModels; - -public partial class ImageElementViewModel : ElementViewModelBase -{ - [ObservableProperty] - private string? _imagePath; - - [ObservableProperty] - private byte[]? _imageData; - - [ObservableProperty] - private string? _base64Data; - - [ObservableProperty] - private Bitmap? _previewBitmap; - - private Bitmap? _previousPreviewBitmap; - - /// Disposes the outgoing bitmap whenever a new one is decoded — - /// is re-decoded on every path/data change with no other lifecycle owner, so without this the old - /// native bitmap leaks. - partial void OnPreviewBitmapChanged(Bitmap? value) - { - if (_previousPreviewBitmap != null && _previousPreviewBitmap != value) - { - _previousPreviewBitmap.Dispose(); - } - _previousPreviewBitmap = value; - } - - [ObservableProperty] - private bool _keepAspectRatio = true; - - [ObservableProperty] - private double _cornerRadius = 4; - - [ObservableProperty] - private string _borderColorHex = "#E1DFDD"; - - [ObservableProperty] - private double _borderThickness = 1; - - [ObservableProperty] - private string _altText = "Image Placeholder"; - - public override ElementKind Kind => ElementKind.Image; - public override string DisplayName => !string.IsNullOrEmpty(ImagePath) - ? Path.GetFileName(ImagePath) - : (!string.IsNullOrEmpty(AltText) ? AltText : "Image"); - - partial void OnImagePathChanged(string? value) - { - UpdateBitmap(); - } - - partial void OnImageDataChanged(byte[]? value) - { - UpdateBitmap(); - } - - partial void OnBase64DataChanged(string? value) - { - UpdateBitmap(); - } - - public void UpdateBitmap() - { - if (!string.IsNullOrEmpty(ImagePath) && File.Exists(ImagePath)) - { - try - { - PreviewBitmap = new Bitmap(ImagePath); - return; - } - catch - { - PreviewBitmap = null; - } - } - - if (ImageData != null && ImageData.Length > 0) - { - try - { - using var ms = new MemoryStream(ImageData); - PreviewBitmap = new Bitmap(ms); - return; - } - catch - { - PreviewBitmap = null; - } - } - - if (!string.IsNullOrEmpty(Base64Data)) - { - try - { - byte[] bytes = Convert.FromBase64String(Base64Data); - using var ms = new MemoryStream(bytes); - PreviewBitmap = new Bitmap(ms); - return; - } - catch - { - PreviewBitmap = null; - } - } - - PreviewBitmap = null; - } - - public override PdfElementBase ToModel() - { - var model = new PdfImageElement - { - Id = Id, - X = X, - Y = Y, - Width = Width, - Height = Height, - ZIndex = ZIndex, - Rotation = Rotation, - Opacity = Opacity, - IsLocked = IsLocked, - ImagePath = ImagePath, - KeepAspectRatio = KeepAspectRatio, - CornerRadius = CornerRadius, - BorderColorHex = BorderColorHex, - BorderThickness = BorderThickness, - AltText = AltText - }; - - if (ImageData != null) - { - model.ImageData = ImageData; - } - if (!string.IsNullOrEmpty(Base64Data)) - { - model.Base64Data = Base64Data; - } - - return model; - } - - public override void LoadFromModel(PdfElementBase model) - { - if (model is PdfImageElement img) - { - Id = img.Id; - X = img.X; - Y = img.Y; - Width = img.Width; - Height = img.Height; - ZIndex = img.ZIndex; - Rotation = img.Rotation; - Opacity = img.Opacity; - IsLocked = img.IsLocked; - - ImagePath = img.ImagePath; - ImageData = img.ImageData; - Base64Data = img.Base64Data; - KeepAspectRatio = img.KeepAspectRatio; - CornerRadius = img.CornerRadius; - BorderColorHex = img.BorderColorHex; - BorderThickness = img.BorderThickness; - AltText = img.AltText; - - UpdateBitmap(); - } - } -} diff --git a/src/PdfEditorApp/ViewModels/ElementViewModels/InkElementViewModel.cs b/src/PdfEditorApp/ViewModels/ElementViewModels/InkElementViewModel.cs deleted file mode 100644 index d50adc2..0000000 --- a/src/PdfEditorApp/ViewModels/ElementViewModels/InkElementViewModel.cs +++ /dev/null @@ -1,92 +0,0 @@ -using System.ComponentModel; -using CommunityToolkit.Mvvm.ComponentModel; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; -using PdfEditorApp.Models; -using PdfEditorApp.Services; - -namespace PdfEditorApp.ViewModels.ElementViewModels; - -public partial class InkElementViewModel : ElementViewModelBase -{ - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(PathData))] - private string _pointsData = "10,10 50,40 100,20 180,60 220,30"; - - [ObservableProperty] - private string _strokeColorHex = "#0F6CBD"; - - [ObservableProperty] - private double _strokeThickness = 3.0; - - [ObservableProperty] - private bool _isHighlighter; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(PathData))] - private bool _isSmoothSpline = true; - - public override ElementKind Kind => ElementKind.Ink; - public override string DisplayName => IsHighlighter ? "Highlighter Path" : "Freehand Ink Drawing"; - - public string PathData => SvgShapeHelper.GenerateSmoothInkSvgPath(PointsData, IsSmoothSpline); - - public InkElementViewModel() - { - Width = 240; - Height = 80; - } - - protected override void OnPropertyChanged(PropertyChangedEventArgs e) - { - base.OnPropertyChanged(e); - if (e.PropertyName is nameof(PointsData) or nameof(IsSmoothSpline)) - { - OnPropertyChanged(nameof(PathData)); - } - } - - public override PdfElementBase ToModel() - { - return new PdfInkElement - { - Id = Id, - X = X, - Y = Y, - Width = Width, - Height = Height, - ZIndex = ZIndex, - Rotation = Rotation, - Opacity = Opacity, - IsLocked = IsLocked, - PointsData = PointsData, - StrokeColorHex = StrokeColorHex, - StrokeThickness = StrokeThickness, - IsHighlighter = IsHighlighter, - IsSmoothSpline = IsSmoothSpline - }; - } - - public override void LoadFromModel(PdfElementBase model) - { - if (model is PdfInkElement ink) - { - Id = ink.Id; - X = ink.X; - Y = ink.Y; - Width = ink.Width; - Height = ink.Height; - ZIndex = ink.ZIndex; - Rotation = ink.Rotation; - Opacity = ink.Opacity; - IsLocked = ink.IsLocked; - - PointsData = ink.PointsData; - StrokeColorHex = ink.StrokeColorHex; - StrokeThickness = ink.StrokeThickness; - IsHighlighter = ink.IsHighlighter; - IsSmoothSpline = ink.IsSmoothSpline; - } - } -} - diff --git a/src/PdfEditorApp/ViewModels/ElementViewModels/MathElementViewModel.cs b/src/PdfEditorApp/ViewModels/ElementViewModels/MathElementViewModel.cs deleted file mode 100644 index ce63c39..0000000 --- a/src/PdfEditorApp/ViewModels/ElementViewModels/MathElementViewModel.cs +++ /dev/null @@ -1,227 +0,0 @@ -using System; -using System.Collections.ObjectModel; -using System.Linq; -using CommunityToolkit.Mvvm.ComponentModel; -using CommunityToolkit.Mvvm.Input; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; -using PdfEditorApp.Models; -using PdfEditorApp.Services.MathEngine; - -namespace PdfEditorApp.ViewModels.ElementViewModels; - -public partial class MathElementViewModel : ElementViewModelBase -{ - [ObservableProperty] - private string _formula = @"\int_{-\infty}^{\infty} e^{-x^2} \, dx = \sqrt{\pi}"; - - [ObservableProperty] - private double _fontSize = 16; - - [ObservableProperty] - private string _textColorHex = "#0F172A"; - - [ObservableProperty] - private string _backgroundColorHex = "#00000000"; - - [ObservableProperty] - private string _borderColorHex = "#00000000"; - - [ObservableProperty] - private double _borderThickness = 0; - - [ObservableProperty] - private double _cornerRadius = 4; - - [ObservableProperty] - private double _padding = 8; - - [ObservableProperty] - private bool _showBackground; - - [ObservableProperty] - private bool _showBorder; - - [ObservableProperty] - private bool _showEquationNumber; - - [ObservableProperty] - private string _equationNumber = "(1)"; - - [ObservableProperty] - private TextAlignmentMode _alignment = TextAlignmentMode.Center; - - [ObservableProperty] - private MathDisplayStyle _displayStyle = MathDisplayStyle.DisplayBlock; - - [ObservableProperty] - private MathCategory _category = MathCategory.Calculus; - - [ObservableProperty] - private string? _presetName = "Gaussian Integral"; - - [ObservableProperty] - private string? _description = "Euler-Poisson Gaussian Integral"; - - [ObservableProperty] - private string _svgSource = ""; - - [ObservableProperty] - private string _pathGeometryData = ""; - - [ObservableProperty] - private bool _hasError; - - [ObservableProperty] - private string? _errorMessage; - - public override ElementKind Kind => ElementKind.Math; - public override string DisplayName => !string.IsNullOrWhiteSpace(PresetName) ? $"Formula ({PresetName})" : "Math Equation"; - - public ObservableCollection AvailablePresets { get; } = new(MathPresetsLibrary.AllPresets); - - public MathElementViewModel() - { - Width = 280; - Height = 60; - RenderSvg(); - } - - partial void OnFormulaChanged(string value) => RenderSvg(); - partial void OnFontSizeChanged(double value) => RenderSvg(); - partial void OnTextColorHexChanged(string value) => RenderSvg(); - partial void OnBackgroundColorHexChanged(string value) => RenderSvg(); - partial void OnBorderColorHexChanged(string value) => RenderSvg(); - partial void OnBorderThicknessChanged(double value) => RenderSvg(); - partial void OnCornerRadiusChanged(double value) => RenderSvg(); - partial void OnPaddingChanged(double value) => RenderSvg(); - partial void OnShowBackgroundChanged(bool value) => RenderSvg(); - partial void OnShowBorderChanged(bool value) => RenderSvg(); - partial void OnShowEquationNumberChanged(bool value) => RenderSvg(); - partial void OnEquationNumberChanged(string value) => RenderSvg(); - partial void OnAlignmentChanged(TextAlignmentMode value) => RenderSvg(); - partial void OnDisplayStyleChanged(MathDisplayStyle value) => RenderSvg(); - - public void RenderSvg() - { - var options = new MathRenderOptions( - FontSize: FontSize, - TextColorHex: TextColorHex, - BackgroundColorHex: BackgroundColorHex, - BorderColorHex: BorderColorHex, - BorderThickness: BorderThickness, - CornerRadius: CornerRadius, - Padding: Padding, - ShowBackground: ShowBackground, - ShowBorder: ShowBorder, - ShowEquationNumber: ShowEquationNumber, - EquationNumber: EquationNumber, - Alignment: Alignment, - DisplayStyle: DisplayStyle, - TargetWidth: Width, - TargetHeight: Height - ); - - var result = MathLayoutEngine.RenderToSvg(Formula, options); - SvgSource = result.SvgXml; - PathGeometryData = result.PathGeometryData; - HasError = !result.IsSuccess; - ErrorMessage = result.ErrorMessage; - } - - [RelayCommand] - public void ApplyPreset(string? presetId) - { - if (string.IsNullOrEmpty(presetId)) return; - - var preset = MathPresetsLibrary.FindById(presetId) ?? MathPresetsLibrary.FindByName(presetId); - if (preset != null) - { - Formula = preset.Formula; - PresetName = preset.Name; - Description = preset.Description; - Category = preset.Category; - EquationNumber = preset.DefaultEquationNumber; - Width = Math.Max(Width, preset.DefaultWidth); - Height = Math.Max(Height, preset.DefaultHeight); - RenderSvg(); - } - } - - [RelayCommand] - public void InsertSymbol(string snippet) - { - if (string.IsNullOrEmpty(snippet)) return; - string resolved = MathPresetsLibrary.ResolveSnippet(snippet); - Formula = string.IsNullOrEmpty(Formula) ? resolved : $"{Formula} {resolved}"; - } - - public override PdfElementBase ToModel() - { - return new PdfMathElement - { - Id = Id, - X = X, - Y = Y, - Width = Width, - Height = Height, - ZIndex = ZIndex, - Rotation = Rotation, - Opacity = Opacity, - IsLocked = IsLocked, - Formula = Formula, - FontSize = FontSize, - TextColorHex = TextColorHex, - BackgroundColorHex = BackgroundColorHex, - BorderColorHex = BorderColorHex, - BorderThickness = BorderThickness, - CornerRadius = CornerRadius, - Padding = Padding, - ShowBackground = ShowBackground, - ShowBorder = ShowBorder, - ShowEquationNumber = ShowEquationNumber, - EquationNumber = EquationNumber, - Alignment = Alignment, - DisplayStyle = DisplayStyle, - Category = Category, - PresetName = PresetName, - Description = Description - }; - } - - public override void LoadFromModel(PdfElementBase model) - { - if (model is PdfMathElement math) - { - Id = math.Id; - X = math.X; - Y = math.Y; - Width = math.Width; - Height = math.Height; - ZIndex = math.ZIndex; - Rotation = math.Rotation; - Opacity = math.Opacity; - IsLocked = math.IsLocked; - - Formula = math.Formula; - FontSize = math.FontSize; - TextColorHex = math.TextColorHex; - BackgroundColorHex = math.BackgroundColorHex; - BorderColorHex = math.BorderColorHex; - BorderThickness = math.BorderThickness; - CornerRadius = math.CornerRadius; - Padding = math.Padding; - ShowBackground = math.ShowBackground; - ShowBorder = math.ShowBorder; - ShowEquationNumber = math.ShowEquationNumber; - EquationNumber = math.EquationNumber; - Alignment = math.Alignment; - DisplayStyle = math.DisplayStyle; - Category = math.Category; - PresetName = math.PresetName; - Description = math.Description; - - RenderSvg(); - } - } -} diff --git a/src/PdfEditorApp/ViewModels/ElementViewModels/MeasurementElementViewModel.cs b/src/PdfEditorApp/ViewModels/ElementViewModels/MeasurementElementViewModel.cs deleted file mode 100644 index 1fbf52c..0000000 --- a/src/PdfEditorApp/ViewModels/ElementViewModels/MeasurementElementViewModel.cs +++ /dev/null @@ -1,110 +0,0 @@ -using System; -using CommunityToolkit.Mvvm.ComponentModel; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; -using PdfEditorApp.Models; - -namespace PdfEditorApp.ViewModels.ElementViewModels; - -public partial class MeasurementElementViewModel : ElementViewModelBase -{ - [ObservableProperty] - private RulerUnit _unit = RulerUnit.Points; - - [ObservableProperty] - private double _scaleFactor = 1.0; - - [ObservableProperty] - private string _customLabel = ""; - - [ObservableProperty] - private string _strokeColorHex = "#DC2626"; - - [ObservableProperty] - private double _strokeThickness = 1.5; - - [ObservableProperty] - private double _arrowSize = 6.0; - - [ObservableProperty] - private double _extensionLineLength = 10.0; - - [ObservableProperty] - private double _fontSize = 10.0; - - public override ElementKind Kind => ElementKind.Measurement; - public override string DisplayName => "Measurement Dimension"; - - public string FormattedDistance => GetFormattedDistance(); - - partial void OnUnitChanged(RulerUnit value) => OnPropertyChanged(nameof(FormattedDistance)); - partial void OnCustomLabelChanged(string value) => OnPropertyChanged(nameof(FormattedDistance)); - - public double CalculateDistance() - { - return Width; - } - - public string GetFormattedDistance() - { - if (!string.IsNullOrWhiteSpace(CustomLabel)) - return CustomLabel; - - double distancePts = CalculateDistance(); - return Unit switch - { - RulerUnit.Inches => $"{distancePts / 72.0:F2} in", - RulerUnit.Millimeters => $"{distancePts * 25.4 / 72.0:F1} mm", - _ => $"{distancePts:F1} pt" - }; - } - - public override PdfElementBase ToModel() - { - return new PdfMeasurementElement - { - Id = Id, - X = X, - Y = Y, - Width = Width, - Height = Height, - ZIndex = ZIndex, - Rotation = Rotation, - Opacity = Opacity, - IsLocked = IsLocked, - Unit = Unit, - ScaleFactor = ScaleFactor, - CustomLabel = CustomLabel, - StrokeColorHex = StrokeColorHex, - StrokeThickness = StrokeThickness, - ArrowSize = ArrowSize, - ExtensionLineLength = ExtensionLineLength, - FontSize = FontSize - }; - } - - public override void LoadFromModel(PdfElementBase model) - { - if (model is PdfMeasurementElement m) - { - Id = m.Id; - X = m.X; - Y = m.Y; - Width = m.Width; - Height = m.Height; - ZIndex = m.ZIndex; - Rotation = m.Rotation; - Opacity = m.Opacity; - IsLocked = m.IsLocked; - - Unit = m.Unit; - ScaleFactor = m.ScaleFactor; - CustomLabel = m.CustomLabel; - StrokeColorHex = m.StrokeColorHex; - StrokeThickness = m.StrokeThickness; - ArrowSize = m.ArrowSize; - ExtensionLineLength = m.ExtensionLineLength; - FontSize = m.FontSize; - } - } -} diff --git a/src/PdfEditorApp/ViewModels/ElementViewModels/QrCodeElementViewModel.cs b/src/PdfEditorApp/ViewModels/ElementViewModels/QrCodeElementViewModel.cs deleted file mode 100644 index d3966e0..0000000 --- a/src/PdfEditorApp/ViewModels/ElementViewModels/QrCodeElementViewModel.cs +++ /dev/null @@ -1,174 +0,0 @@ -using System; -using System.IO; -using Avalonia.Media.Imaging; -using CommunityToolkit.Mvvm.ComponentModel; -using CommunityToolkit.Mvvm.Input; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; -using PdfEditorApp.Models; -using PdfEditorApp.Services; - -namespace PdfEditorApp.ViewModels.ElementViewModels; - -public partial class QrCodeElementViewModel : ElementViewModelBase -{ - [ObservableProperty] - private string _content = "https://github.com/PrashantUnity/PDFCreator"; - - [ObservableProperty] - private string _darkColorHex = "#0F172A"; - - [ObservableProperty] - private string _lightColorHex = "#FFFFFF"; - - [ObservableProperty] - private string _label = "SCAN TO VERIFY CREDENTIAL"; - - [ObservableProperty] - private QrCodeEccLevel _eccLevel = QrCodeEccLevel.M; - - [ObservableProperty] - private bool _drawQuietZones = true; - - [ObservableProperty] - private byte[]? _qrPngBytes; - - [ObservableProperty] - private Bitmap? _qrBitmap; - - partial void OnContentChanged(string value) => RefreshQrBitmap(); - partial void OnDarkColorHexChanged(string value) => RefreshQrBitmap(); - partial void OnLightColorHexChanged(string value) => RefreshQrBitmap(); - partial void OnEccLevelChanged(QrCodeEccLevel value) => RefreshQrBitmap(); - partial void OnDrawQuietZonesChanged(bool value) => RefreshQrBitmap(); - - public void RefreshQrBitmap() - { - QrPngBytes = QrCodeHelper.GeneratePngBytes(Content, DarkColorHex, LightColorHex, EccLevel, pixelsPerModule: 8, drawQuietZones: DrawQuietZones); - try - { - if (QrPngBytes != null && QrPngBytes.Length > 0) - { - using var ms = new MemoryStream(QrPngBytes); - QrBitmap = new Bitmap(ms); - } - else - { - QrBitmap = null; - } - } - catch - { - // In headless/mock test runner without Skia rendering context - QrBitmap = null; - } - } - - [RelayCommand] - public void ApplyPresetType(string presetStr) - { - if (Enum.TryParse(presetStr, true, out var kind)) - { - switch (kind) - { - case QrCodePresetKind.Url: - Content = "https://github.com/PrashantUnity/PDFCreator"; - Label = "SCAN TO VISIT WEBSITE"; - break; - case QrCodePresetKind.Wifi: - Content = "WIFI:S:Enterprise-Secure;T:WPA2;P:Passcode2026;;"; - Label = "SCAN TO CONNECT WI-FI"; - break; - case QrCodePresetKind.VCard: - Content = "BEGIN:VCARD\nVERSION:3.0\nN:Doe;John\nORG:CodeFryDev\nTEL:+1-555-0149\nEMAIL:john.doe@codefrydev.in\nEND:VCARD"; - Label = "SCAN FOR DIGITAL VCARD"; - break; - case QrCodePresetKind.Email: - Content = "mailto:legal@codefrydev.in?subject=Document%20Verification"; - Label = "SCAN TO SEND EMAIL"; - break; - case QrCodePresetKind.PhoneCall: - Content = "tel:+18005550199"; - Label = "SCAN TO DIAL DIRECT"; - break; - case QrCodePresetKind.Sms: - Content = "SMSTO:+18005550199:Verified Document Request"; - Label = "SCAN TO SEND SMS"; - break; - case QrCodePresetKind.GeoLocation: - Content = "geo:37.7749,-122.4194"; - Label = "SCAN FOR GPS LOCATION"; - break; - case QrCodePresetKind.CryptoAddress: - Content = "bitcoin:bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh?amount=0.005"; - Label = "SCAN TO PAY CRYPTO"; - break; - case QrCodePresetKind.EventCalendar: - Content = "BEGIN:VEVENT\nSUMMARY:Global Tech Summit 2026\nLOCATION:Moscone Center, SF\nDESCRIPTION:Official PDF Session\nEND:VEVENT"; - Label = "SCAN TO ADD CALENDAR EVENT"; - break; - case QrCodePresetKind.PlainText: - Content = "AUTHENTICATED-DOCUMENT-HASH-892401924"; - Label = "SCAN TO VERIFY TOKEN"; - break; - } - } - } - - public override ElementKind Kind => ElementKind.QrCode; - public override string DisplayName => $"QR Code ({Content})"; - - public QrCodeElementViewModel() - { - Width = 140; - Height = 160; - RefreshQrBitmap(); - } - - public override PdfElementBase ToModel() - { - return new PdfQrCodeElement - { - Id = Id, - X = X, - Y = Y, - Width = Width, - Height = Height, - ZIndex = ZIndex, - Rotation = Rotation, - Opacity = Opacity, - IsLocked = IsLocked, - Content = Content, - DarkColorHex = DarkColorHex, - LightColorHex = LightColorHex, - Label = Label, - EccLevel = EccLevel, - DrawQuietZones = DrawQuietZones - }; - } - - public override void LoadFromModel(PdfElementBase model) - { - if (model is PdfQrCodeElement qr) - { - Id = qr.Id; - X = qr.X; - Y = qr.Y; - Width = qr.Width; - Height = qr.Height; - ZIndex = qr.ZIndex; - Rotation = qr.Rotation; - Opacity = qr.Opacity; - IsLocked = qr.IsLocked; - - Content = qr.Content; - DarkColorHex = qr.DarkColorHex; - LightColorHex = qr.LightColorHex; - Label = qr.Label; - EccLevel = qr.EccLevel; - DrawQuietZones = qr.DrawQuietZones; - - RefreshQrBitmap(); - } - } -} diff --git a/src/PdfEditorApp/ViewModels/ElementViewModels/RedactionElementViewModel.cs b/src/PdfEditorApp/ViewModels/ElementViewModels/RedactionElementViewModel.cs deleted file mode 100644 index 61bcf38..0000000 --- a/src/PdfEditorApp/ViewModels/ElementViewModels/RedactionElementViewModel.cs +++ /dev/null @@ -1,86 +0,0 @@ -using CommunityToolkit.Mvvm.ComponentModel; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; -using PdfEditorApp.Models; - -namespace PdfEditorApp.ViewModels.ElementViewModels; - -public partial class RedactionElementViewModel : ElementViewModelBase -{ - [ObservableProperty] - private RedactionMode _mode = RedactionMode.Blackout; - - [ObservableProperty] - private string _exemptionCode = "[REDACTED - (b)(4) PRIVILEGED]"; - - [ObservableProperty] - private string _fillColorHex = "#0F172A"; - - [ObservableProperty] - private string _textColorHex = "#FFFFFF"; - - [ObservableProperty] - private string _borderColorHex = "#DC2626"; - - [ObservableProperty] - private double _borderThickness = 1.5; - - [ObservableProperty] - private bool _showOverlayText = true; - - public override ElementKind Kind => ElementKind.Redaction; - public override string DisplayName => $"Redaction ({ExemptionCode})"; - - public RedactionElementViewModel() - { - Width = 240; - Height = 40; - } - - public override PdfElementBase ToModel() - { - return new PdfRedactionElement - { - Id = Id, - X = X, - Y = Y, - Width = Width, - Height = Height, - ZIndex = ZIndex, - Rotation = Rotation, - Opacity = Opacity, - IsLocked = IsLocked, - Mode = Mode, - ExemptionCode = ExemptionCode, - FillColorHex = FillColorHex, - TextColorHex = TextColorHex, - BorderColorHex = BorderColorHex, - BorderThickness = BorderThickness, - ShowOverlayText = ShowOverlayText - }; - } - - public override void LoadFromModel(PdfElementBase model) - { - if (model is PdfRedactionElement r) - { - Id = r.Id; - X = r.X; - Y = r.Y; - Width = r.Width; - Height = r.Height; - ZIndex = r.ZIndex; - Rotation = r.Rotation; - Opacity = r.Opacity; - IsLocked = r.IsLocked; - - Mode = r.Mode; - ExemptionCode = r.ExemptionCode; - FillColorHex = r.FillColorHex; - TextColorHex = r.TextColorHex; - BorderColorHex = r.BorderColorHex; - BorderThickness = r.BorderThickness; - ShowOverlayText = r.ShowOverlayText; - } - } -} diff --git a/src/PdfEditorApp/ViewModels/ElementViewModels/ShapeElementViewModel.cs b/src/PdfEditorApp/ViewModels/ElementViewModels/ShapeElementViewModel.cs deleted file mode 100644 index 8f1b6d7..0000000 --- a/src/PdfEditorApp/ViewModels/ElementViewModels/ShapeElementViewModel.cs +++ /dev/null @@ -1,201 +0,0 @@ -using System; -using System.ComponentModel; -using CommunityToolkit.Mvvm.ComponentModel; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; -using PdfEditorApp.Models; -using PdfEditorApp.Services; - -namespace PdfEditorApp.ViewModels.ElementViewModels; - -public partial class ShapeElementViewModel : ElementViewModelBase -{ - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(PathData))] - [NotifyPropertyChangedFor(nameof(DisplayName))] - private ShapeType _shapeType = ShapeType.Rectangle; - - [ObservableProperty] - private string _fillColorHex = "#F8F9FA"; - - [ObservableProperty] - private string _strokeColorHex = "#0F6CBD"; - - [ObservableProperty] - private double _strokeThickness = 1.5; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(PathData))] - private double _cornerRadius = 4; - - [ObservableProperty] - private string? _label; - - [ObservableProperty] - private string? _labelColorHex = "#201F1E"; - - [ObservableProperty] - private double _labelFontSize = 12; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(PathData))] - private string? _customPathData; - - [ObservableProperty] - private string? _secondaryFillColorHex; - - [ObservableProperty] - private string? _secondaryStrokeColorHex; - - // Bézier Curves, Connectors & Line Caps - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(PathData))] - private double _bezierP0X = 0.0; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(PathData))] - private double _bezierP0Y = 0.5; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(PathData))] - private double _bezierP1X = 0.33; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(PathData))] - private double _bezierP1Y = 0.10; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(PathData))] - private double _bezierP2X = 0.67; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(PathData))] - private double _bezierP2Y = 0.90; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(PathData))] - private double _bezierP3X = 1.0; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(PathData))] - private double _bezierP3Y = 0.5; - - [ObservableProperty] - private LineEndCap _startCap = LineEndCap.None; - - [ObservableProperty] - private LineEndCap _endCap = LineEndCap.None; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(DashArrayString))] - private LineDashStyle _dashStyle = LineDashStyle.Solid; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(PathData))] - private double _waveFrequency = 2.0; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(PathData))] - private double _curvatureDepth = 40.0; - - public override ElementKind Kind => ElementKind.Shape; - public override string DisplayName => string.IsNullOrEmpty(Label) ? $"Shape ({ShapeType})" : Label; - - public bool IsLineOrCurve => ShapeType is ShapeType.Line or ShapeType.Arrow or ShapeType.BezierCurve or ShapeType.CurvedArrow or ShapeType.SCurveConnector or ShapeType.WaveLine or ShapeType.ArcLine or ShapeType.CurlyBrace; - - public string PathData => SvgShapeHelper.GetVectorPath(ShapeType, Width, Height, CornerRadius, CustomPathData); - public string? DashArrayString => SvgShapeHelper.GetDashArray(DashStyle, StrokeThickness); - - protected override void OnPropertyChanged(PropertyChangedEventArgs e) - { - base.OnPropertyChanged(e); - if (e.PropertyName is nameof(Width) or nameof(Height) or nameof(CornerRadius) or nameof(ShapeType) or nameof(CustomPathData) or nameof(StrokeThickness) or nameof(DashStyle)) - { - OnPropertyChanged(nameof(PathData)); - OnPropertyChanged(nameof(DashArrayString)); - } - } - - public override PdfElementBase ToModel() - { - return new PdfShapeElement - { - Id = Id, - X = X, - Y = Y, - Width = Width, - Height = Height, - ZIndex = ZIndex, - Rotation = Rotation, - Opacity = Opacity, - IsLocked = IsLocked, - GroupId = GroupId, - ShapeType = ShapeType, - FillColorHex = FillColorHex, - StrokeColorHex = StrokeColorHex, - StrokeThickness = StrokeThickness, - CornerRadius = CornerRadius, - Label = Label, - LabelColorHex = LabelColorHex, - LabelFontSize = LabelFontSize, - CustomPathData = CustomPathData, - SecondaryFillColorHex = SecondaryFillColorHex, - SecondaryStrokeColorHex = SecondaryStrokeColorHex, - BezierP0X = BezierP0X, - BezierP0Y = BezierP0Y, - BezierP1X = BezierP1X, - BezierP1Y = BezierP1Y, - BezierP2X = BezierP2X, - BezierP2Y = BezierP2Y, - BezierP3X = BezierP3X, - BezierP3Y = BezierP3Y, - StartCap = StartCap, - EndCap = EndCap, - DashStyle = DashStyle, - WaveFrequency = WaveFrequency, - CurvatureDepth = CurvatureDepth - }; - } - - public override void LoadFromModel(PdfElementBase model) - { - if (model is PdfShapeElement shape) - { - Id = shape.Id; - X = shape.X; - Y = shape.Y; - Width = shape.Width; - Height = shape.Height; - ZIndex = shape.ZIndex; - Rotation = shape.Rotation; - Opacity = shape.Opacity; - IsLocked = shape.IsLocked; - GroupId = shape.GroupId; - - ShapeType = shape.ShapeType; - FillColorHex = shape.FillColorHex; - StrokeColorHex = shape.StrokeColorHex; - StrokeThickness = shape.StrokeThickness; - CornerRadius = shape.CornerRadius; - Label = shape.Label; - LabelColorHex = shape.LabelColorHex; - LabelFontSize = shape.LabelFontSize; - CustomPathData = shape.CustomPathData; - SecondaryFillColorHex = shape.SecondaryFillColorHex; - SecondaryStrokeColorHex = shape.SecondaryStrokeColorHex; - BezierP0X = shape.BezierP0X; - BezierP0Y = shape.BezierP0Y; - BezierP1X = shape.BezierP1X; - BezierP1Y = shape.BezierP1Y; - BezierP2X = shape.BezierP2X; - BezierP2Y = shape.BezierP2Y; - BezierP3X = shape.BezierP3X; - BezierP3Y = shape.BezierP3Y; - StartCap = shape.StartCap; - EndCap = shape.EndCap; - DashStyle = shape.DashStyle; - WaveFrequency = shape.WaveFrequency; - CurvatureDepth = shape.CurvatureDepth; - } - } -} diff --git a/src/PdfEditorApp/ViewModels/ElementViewModels/StickyNoteElementViewModel.cs b/src/PdfEditorApp/ViewModels/ElementViewModels/StickyNoteElementViewModel.cs deleted file mode 100644 index 9340a7a..0000000 --- a/src/PdfEditorApp/ViewModels/ElementViewModels/StickyNoteElementViewModel.cs +++ /dev/null @@ -1,95 +0,0 @@ -using System; -using CommunityToolkit.Mvvm.ComponentModel; -using CommunityToolkit.Mvvm.Input; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; -using PdfEditorApp.Models; - -namespace PdfEditorApp.ViewModels.ElementViewModels; - -public partial class StickyNoteElementViewModel : ElementViewModelBase -{ - [ObservableProperty] - private string _author = "Reviewer"; - - [ObservableProperty] - private string _timestamp = DateTime.Now.ToString("MMM dd, yyyy HH:mm"); - - [ObservableProperty] - private string _noteText = "Please verify the audit figures with the legal compliance team prior to final PDF release."; - - [ObservableProperty] - private string _status = "Pending Review"; - - [ObservableProperty] - private string _colorHex = "#FEF3C7"; - - [ObservableProperty] - private string _borderColorHex = "#F59E0B"; - - [ObservableProperty] - private bool _isExpanded = true; - - public override ElementKind Kind => ElementKind.StickyNote; - public override string DisplayName => $"Sticky Note ({Author})"; - - public StickyNoteElementViewModel() - { - Width = 200; - Height = 150; - } - - [RelayCommand] - public void ToggleExpanded() - { - IsExpanded = !IsExpanded; - Height = IsExpanded ? 150 : 36; - } - - public override PdfElementBase ToModel() - { - return new PdfStickyNoteElement - { - Id = Id, - X = X, - Y = Y, - Width = Width, - Height = Height, - ZIndex = ZIndex, - Rotation = Rotation, - Opacity = Opacity, - IsLocked = IsLocked, - Author = Author, - Timestamp = Timestamp, - NoteText = NoteText, - Status = Status, - ColorHex = ColorHex, - BorderColorHex = BorderColorHex, - IsExpanded = IsExpanded - }; - } - - public override void LoadFromModel(PdfElementBase model) - { - if (model is PdfStickyNoteElement note) - { - Id = note.Id; - X = note.X; - Y = note.Y; - Width = note.Width; - Height = note.Height; - ZIndex = note.ZIndex; - Rotation = note.Rotation; - Opacity = note.Opacity; - IsLocked = note.IsLocked; - - Author = note.Author; - Timestamp = note.Timestamp; - NoteText = note.NoteText; - Status = note.Status; - ColorHex = note.ColorHex; - BorderColorHex = note.BorderColorHex; - IsExpanded = note.IsExpanded; - } - } -} diff --git a/src/PdfEditorApp/ViewModels/ElementViewModels/SvgElementViewModel.cs b/src/PdfEditorApp/ViewModels/ElementViewModels/SvgElementViewModel.cs deleted file mode 100644 index e6b715c..0000000 --- a/src/PdfEditorApp/ViewModels/ElementViewModels/SvgElementViewModel.cs +++ /dev/null @@ -1,208 +0,0 @@ -using System; -using System.IO; -using System.Text.RegularExpressions; -using Avalonia.Media.Imaging; -using CommunityToolkit.Mvvm.ComponentModel; -using CommunityToolkit.Mvvm.Input; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; -using PdfEditorApp.Models; -using PdfEditorApp.Services; -using PdfEditorApp.Services.Tools.Core; - -namespace PdfEditorApp.ViewModels.ElementViewModels; - -public partial class SvgElementViewModel : ElementViewModelBase, IDisposable -{ - [ObservableProperty] - private string _svgSource = SvgOrnamentLibrary.GetGaneshaCrestSvg(); - - [ObservableProperty] - private string? _filePath; - - [ObservableProperty] - private string? _tintColorHex; - - [ObservableProperty] - private string? _presetName = "GaneshaCrest"; - - [ObservableProperty] - private bool _keepAspectRatio = true; - - [ObservableProperty] - private double _cornerRadius = 0; - - [ObservableProperty] - private string? _borderColorHex; - - [ObservableProperty] - private double _borderThickness = 0; - - [ObservableProperty] - private string _pathGeometryData = ""; - - [ObservableProperty] - private Bitmap? _previewBitmap; - - private Bitmap? _previousPreviewBitmap; - - /// - /// Disposes the outgoing native bitmap whenever a new SVG is rasterized, - /// preventing unmanaged Skia memory leaks per AGENTS.md Section 4.E. - /// - partial void OnPreviewBitmapChanged(Bitmap? value) - { - if (_previousPreviewBitmap != null && _previousPreviewBitmap != value) - { - _previousPreviewBitmap.Dispose(); - } - _previousPreviewBitmap = value; - } - - public override ElementKind Kind => ElementKind.Svg; - public override string DisplayName => !string.IsNullOrEmpty(PresetName) ? $"SVG ({PresetName})" : (!string.IsNullOrEmpty(FilePath) ? Path.GetFileName(FilePath) : "Vector SVG"); - - public SvgElementViewModel() - { - Width = 160; - Height = 160; - RefreshSvgPreview(); - } - - partial void OnSvgSourceChanged(string value) => RefreshSvgPreview(); - partial void OnPresetNameChanged(string? value) => RefreshSvgPreview(); - partial void OnTintColorHexChanged(string? value) => RefreshSvgPreview(); - - public void RefreshSvgPreview() - { - UpdatePathGeometry(); - - if (string.IsNullOrWhiteSpace(SvgSource)) - { - PreviewBitmap = null; - return; - } - - try - { - string svgData = SvgSource; - if (!string.IsNullOrWhiteSpace(TintColorHex)) - { - svgData = svgData.Replace("currentColor", TintColorHex); - } - - var bmp = PdfPageRenderer.RenderSvgToBitmap(svgData, Width, Height); - if (bmp != null) - { - PreviewBitmap = bmp; - } - } - catch - { - // Retain existing or fallback - } - } - - public void UpdatePathGeometry() - { - if (string.IsNullOrWhiteSpace(SvgSource)) - { - PathGeometryData = ""; - return; - } - - // Extract the primary or combined path 'd' attributes from the SVG markup for Avalonia Vector rendering - var match = Regex.Match(SvgSource, @"]*\sd=[""']([^""']+)[""']", RegexOptions.IgnoreCase); - if (match.Success) - { - PathGeometryData = match.Groups[1].Value; - } - else - { - PathGeometryData = "M 10,10 L 90,10 L 90,90 L 10,90 Z"; - } - } - - [RelayCommand] - public void ApplyPreset(string preset) - { - PresetName = preset; - SvgSource = SvgOrnamentLibrary.GetSvg(preset, TintColorHex); - FilePath = null; - RefreshSvgPreview(); - } - - public void LoadFromFile(string path) - { - if (File.Exists(path)) - { - FilePath = path; - SvgSource = File.ReadAllText(path); - PresetName = Path.GetFileNameWithoutExtension(path); - RefreshSvgPreview(); - } - } - - public override PdfElementBase ToModel() - { - return new PdfSvgElement - { - Id = Id, - X = X, - Y = Y, - Width = Width, - Height = Height, - ZIndex = ZIndex, - Rotation = Rotation, - Opacity = Opacity, - IsLocked = IsLocked, - SvgSource = SvgSource, - FilePath = FilePath, - TintColorHex = TintColorHex, - PresetName = PresetName, - KeepAspectRatio = KeepAspectRatio, - CornerRadius = CornerRadius, - BorderColorHex = BorderColorHex, - BorderThickness = BorderThickness - }; - } - - public override void LoadFromModel(PdfElementBase model) - { - if (model is PdfSvgElement svg) - { - Id = svg.Id; - X = svg.X; - Y = svg.Y; - Width = svg.Width; - Height = svg.Height; - ZIndex = svg.ZIndex; - Rotation = svg.Rotation; - Opacity = svg.Opacity; - IsLocked = svg.IsLocked; - - SvgSource = !string.IsNullOrWhiteSpace(svg.SvgSource) - ? svg.SvgSource - : (!string.IsNullOrWhiteSpace(svg.PresetName) - ? SvgOrnamentLibrary.GetSvg(svg.PresetName, svg.TintColorHex) - : SvgOrnamentLibrary.GetGaneshaCrestSvg()); - FilePath = svg.FilePath; - TintColorHex = svg.TintColorHex; - PresetName = svg.PresetName; - KeepAspectRatio = svg.KeepAspectRatio; - CornerRadius = svg.CornerRadius; - BorderColorHex = svg.BorderColorHex; - BorderThickness = svg.BorderThickness; - - RefreshSvgPreview(); - } - } - - public void Dispose() - { - _previousPreviewBitmap?.Dispose(); - _previousPreviewBitmap = null; - PreviewBitmap?.Dispose(); - PreviewBitmap = null; - } -} diff --git a/src/PdfEditorApp/ViewModels/ElementViewModels/TableElementViewModel.cs b/src/PdfEditorApp/ViewModels/ElementViewModels/TableElementViewModel.cs deleted file mode 100644 index 6593278..0000000 --- a/src/PdfEditorApp/ViewModels/ElementViewModels/TableElementViewModel.cs +++ /dev/null @@ -1,248 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Linq; -using CommunityToolkit.Mvvm.ComponentModel; -using CommunityToolkit.Mvvm.Input; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; -using PdfEditorApp.Models; - -namespace PdfEditorApp.ViewModels.ElementViewModels; - -public partial class TableHeaderItem : ObservableObject -{ - [ObservableProperty] - private string _text = ""; - - public TableHeaderItem(string text = "") - { - _text = text; - } - - public override string ToString() => Text; -} - -public partial class TableCellItem : ObservableObject -{ - [ObservableProperty] - private string _text = ""; - - public TableCellItem(string text = "") - { - _text = text; - } - - public override string ToString() => Text; -} - -public class TableRowItem : ObservableObject -{ - public ObservableCollection Cells { get; } = new(); - - public TableRowItem(IEnumerable cells) - { - foreach (var c in cells) Cells.Add(new TableCellItem(c)); - } - - public TableRowItem(IEnumerable cells) - { - foreach (var c in cells) Cells.Add(c); - } -} - -public partial class TableElementViewModel : ElementViewModelBase -{ - [ObservableProperty] - private string _headerBackgroundHex = "#0F6CBD"; - - [ObservableProperty] - private string _headerTextHex = "#FFFFFF"; - - [ObservableProperty] - private string _alternateRowBackgroundHex = "#F8F9FA"; - - [ObservableProperty] - private string _borderColorHex = "#E1DFDD"; - - public ObservableCollection Headers { get; } = new(); - public ObservableCollection Rows { get; } = new(); - - public override ElementKind Kind => ElementKind.Table; - public override string DisplayName => $"Table ({Headers.Count} cols, {Rows.Count} rows)"; - - public TableElementViewModel() - { - Headers.Add(new TableHeaderItem("Item Description")); - Headers.Add(new TableHeaderItem("Qty")); - Headers.Add(new TableHeaderItem("Rate")); - Headers.Add(new TableHeaderItem("Amount")); - - Rows.Add(new TableRowItem(new[] { "Cloud Architecture Consulting", "40 hrs", "$150.00", "$6,000.00" })); - Rows.Add(new TableRowItem(new[] { "Avalonia Desktop UI Engineering", "60 hrs", "$140.00", "$8,400.00" })); - Rows.Add(new TableRowItem(new[] { "QuestPDF Engine Integration", "25 hrs", "$160.00", "$4,000.00" })); - } - - [RelayCommand] - public void AddRow() - { - var cells = new List(); - for (int i = 0; i < Headers.Count; i++) - { - cells.Add($"Data {Rows.Count + 1}.{i + 1}"); - } - Rows.Add(new TableRowItem(cells)); - Height = System.Math.Max(Height, 40 + (Rows.Count * 28)); - OnPropertyChanged(nameof(DisplayName)); - } - - [RelayCommand] - public void RemoveRow() - { - if (Rows.Count > 1) - { - Rows.RemoveAt(Rows.Count - 1); - OnPropertyChanged(nameof(DisplayName)); - } - } - - [RelayCommand] - public void AddColumn() - { - string headerName = $"Col {Headers.Count + 1}"; - Headers.Add(new TableHeaderItem(headerName)); - foreach (var r in Rows) - { - r.Cells.Add(new TableCellItem("---")); - } - OnPropertyChanged(nameof(DisplayName)); - } - - [RelayCommand] - public void RemoveColumn() - { - if (Headers.Count > 1) - { - int colIdx = Headers.Count - 1; - Headers.RemoveAt(colIdx); - foreach (var r in Rows) - { - if (r.Cells.Count > colIdx) - { - r.Cells.RemoveAt(colIdx); - } - } - OnPropertyChanged(nameof(DisplayName)); - } - } - - [RelayCommand] - public void ApplyPresetStyle(string styleStr) - { - if (Enum.TryParse(styleStr, true, out var style)) - { - switch (style) - { - case TablePresetStyle.ModernMinimal: - HeaderBackgroundHex = "#F1F5F9"; - HeaderTextHex = "#0F172A"; - AlternateRowBackgroundHex = "#FFFFFF"; - BorderColorHex = "#E2E8F0"; - break; - case TablePresetStyle.EnterpriseBlue: - HeaderBackgroundHex = "#0F6CBD"; - HeaderTextHex = "#FFFFFF"; - AlternateRowBackgroundHex = "#F0F7FD"; - BorderColorHex = "#CBD5E1"; - break; - case TablePresetStyle.DarkModeSlate: - HeaderBackgroundHex = "#1E293B"; - HeaderTextHex = "#FFFFFF"; - AlternateRowBackgroundHex = "#F8FAFC"; - BorderColorHex = "#334155"; - break; - case TablePresetStyle.ZebraStriped: - HeaderBackgroundHex = "#475569"; - HeaderTextHex = "#FFFFFF"; - AlternateRowBackgroundHex = "#F1F5F9"; - BorderColorHex = "#CBD5E1"; - break; - case TablePresetStyle.EmeraldGreen: - HeaderBackgroundHex = "#047857"; - HeaderTextHex = "#FFFFFF"; - AlternateRowBackgroundHex = "#ECFDF5"; - BorderColorHex = "#A7F3D0"; - break; - case TablePresetStyle.AmberAccent: - HeaderBackgroundHex = "#D97706"; - HeaderTextHex = "#FFFFFF"; - AlternateRowBackgroundHex = "#FFFBEB"; - BorderColorHex = "#FDE68A"; - break; - case TablePresetStyle.FinancialBordered: - HeaderBackgroundHex = "#0F172A"; - HeaderTextHex = "#FFFFFF"; - AlternateRowBackgroundHex = "#FFFFFF"; - BorderColorHex = "#0F172A"; - break; - case TablePresetStyle.CompactClean: - HeaderBackgroundHex = "#E2E8F0"; - HeaderTextHex = "#1E293B"; - AlternateRowBackgroundHex = "#FAFAFA"; - BorderColorHex = "#E2E8F0"; - break; - } - } - } - - public override PdfElementBase ToModel() - { - var model = new PdfTableElement - { - Id = Id, - X = X, - Y = Y, - Width = Width, - Height = Height, - ZIndex = ZIndex, - Rotation = Rotation, - Opacity = Opacity, - IsLocked = IsLocked, - HeaderBackgroundHex = HeaderBackgroundHex, - HeaderTextHex = HeaderTextHex, - AlternateRowBackgroundHex = AlternateRowBackgroundHex, - BorderColorHex = BorderColorHex, - Headers = Headers.Select(h => h.Text).ToList(), - Rows = Rows.Select(r => r.Cells.Select(c => c.Text).ToList()).ToList() - }; - - return model; - } - - public override void LoadFromModel(PdfElementBase model) - { - if (model is PdfTableElement table) - { - Id = table.Id; - X = table.X; - Y = table.Y; - Width = table.Width; - Height = table.Height; - ZIndex = table.ZIndex; - Rotation = table.Rotation; - Opacity = table.Opacity; - IsLocked = table.IsLocked; - - HeaderBackgroundHex = table.HeaderBackgroundHex; - HeaderTextHex = table.HeaderTextHex; - AlternateRowBackgroundHex = table.AlternateRowBackgroundHex; - BorderColorHex = table.BorderColorHex; - - Headers.Clear(); - foreach (var h in table.Headers) Headers.Add(new TableHeaderItem(h)); - - Rows.Clear(); - foreach (var r in table.Rows) Rows.Add(new TableRowItem(r)); - } - } -} diff --git a/src/PdfEditorApp/ViewModels/ElementViewModels/TextElementViewModel.cs b/src/PdfEditorApp/ViewModels/ElementViewModels/TextElementViewModel.cs deleted file mode 100644 index 148d8cf..0000000 --- a/src/PdfEditorApp/ViewModels/ElementViewModels/TextElementViewModel.cs +++ /dev/null @@ -1,798 +0,0 @@ -using System; -using System.Linq; -using Avalonia.Media; -using CommunityToolkit.Mvvm.ComponentModel; -using CommunityToolkit.Mvvm.Input; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; -using PdfEditorApp.Models; -using PdfEditorApp.Services; -using PdfEditorApp.Services.Typography; - -namespace PdfEditorApp.ViewModels.ElementViewModels; - -public partial class TextElementViewModel : ElementViewModelBase -{ - [ObservableProperty] - private string _text = "Enter text here"; - - [ObservableProperty] - private System.Collections.Generic.List? _spans; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(AvaloniaFontFamily))] - private string _fontFamily = "Arial"; - - public FontFamily AvaloniaFontFamily => FontHelper.CreateFontFamily(FontFamily); - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(ComputedLineHeight))] - private double _fontSize = 14; - - [ObservableProperty] - private bool _isBold; - - [ObservableProperty] - private bool _isItalic; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(TextDecorations))] - private bool _isUnderline; - - [ObservableProperty] - private bool _isDoubleUnderline; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(TextDecorations))] - private bool _isStrikethrough; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(TextBrush))] - private string _textColorHex = "#201F1E"; - - public IBrush TextBrush => HexToBrush(TextColorHex, "#201F1E"); - - [ObservableProperty] - private double _textOpacity = 1.0; - - [ObservableProperty] - private TextAlignmentMode _alignment = TextAlignmentMode.Left; - - [ObservableProperty] - private TextVerticalAlignment _verticalAlignment = TextVerticalAlignment.Top; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(ComputedLineHeight))] - private double _lineHeight = 1.4; - - [ObservableProperty] - private double _characterSpacing = 0; - - [ObservableProperty] - private double _wordSpacing = 0; - - [ObservableProperty] - private double _paragraphSpacing = 0; - - [ObservableProperty] - private bool _textWrap = true; - - // Stroke / Outline - [ObservableProperty] - private bool _hasStroke; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(StrokeBrush))] - private string _strokeColorHex = "#000000"; - - public IBrush StrokeBrush => HexToBrush(StrokeColorHex, "#000000"); - - [ObservableProperty] - private double _strokeWidth = 1.0; - - // Shadow & Glow - [ObservableProperty] - private bool _hasShadow; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(ShadowBrush))] - private string _shadowColorHex = "#80000000"; - - public IBrush ShadowBrush => HexToBrush(ShadowColorHex, "#80000000"); - - [ObservableProperty] - private double _shadowOffsetX = 2.0; - - [ObservableProperty] - private double _shadowOffsetY = 2.0; - - [ObservableProperty] - private double _shadowBlurRadius = 4.0; - - [ObservableProperty] - private double _shadowOpacity = 0.5; - - // Box Background, Border & Padding - [ObservableProperty] - private double _padding = 0; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(BackgroundBrush))] - private string _backgroundColorHex = "#00000000"; - - public IBrush BackgroundBrush => HexToBrush(BackgroundColorHex, "#00000000"); - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(BorderBrush))] - private string _borderColorHex = "#00000000"; - - public IBrush BorderBrush => HexToBrush(BorderColorHex, "#00000000"); - - [ObservableProperty] - private double _borderThickness = 0; - - [ObservableProperty] - private double _cornerRadius = 0; - - // Curved & Circular Typography - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(IsNormalMode))] - [NotifyPropertyChangedFor(nameof(IsCurvedMode))] - [NotifyPropertyChangedFor(nameof(IsCircularMode))] - private TextShapeMode _shapeMode = TextShapeMode.Normal; - - public bool IsNormalMode => ShapeMode == TextShapeMode.Normal; - public bool IsCurvedMode => ShapeMode == TextShapeMode.Curved; - public bool IsCircularMode => ShapeMode == TextShapeMode.Circular; - public bool IsBezierMode => ShapeMode == TextShapeMode.BezierCurve; - - [ObservableProperty] - private double _curveRadius = 120; - - [ObservableProperty] - private double _curveArcAngle = 180; - - [ObservableProperty] - private double _curveStartAngle = 0; - - [ObservableProperty] - private bool _curveClockwise = true; - - [ObservableProperty] - private bool _curveInvert; - - [ObservableProperty] - private CircularTextPlacement _circularPlacement = CircularTextPlacement.TopArc; - - // Per-Character Transforms & Baseline Offsets - [ObservableProperty] - private double _baselineShift = 0; - - [ObservableProperty] - private double _characterRotation = 0; - - [ObservableProperty] - private double _scaleX = 1.0; - - [ObservableProperty] - private double _scaleY = 1.0; - - [ObservableProperty] - private bool _flipX; - - [ObservableProperty] - private bool _flipY; - - // Bézier Curve Typography (Normalized 0.0 to 1.0) - [ObservableProperty] - private BezierCurvePreset _bezierPreset = BezierCurvePreset.Wave; - - [ObservableProperty] - private double _bezierP0X = 0.0; - - [ObservableProperty] - private double _bezierP0Y = 0.5; - - [ObservableProperty] - private double _bezierP1X = 0.33; - - [ObservableProperty] - private double _bezierP1Y = 0.10; - - [ObservableProperty] - private double _bezierP2X = 0.67; - - [ObservableProperty] - private double _bezierP2Y = 0.90; - - [ObservableProperty] - private double _bezierP3X = 1.0; - - [ObservableProperty] - private double _bezierP3Y = 0.5; - - public TextDecorationCollection? TextDecorations - { - get - { - if (IsUnderline && IsStrikethrough) - { - var decs = new TextDecorationCollection(); - foreach (var d in Avalonia.Media.TextDecorations.Underline) decs.Add(d); - foreach (var d in Avalonia.Media.TextDecorations.Strikethrough) decs.Add(d); - return decs; - } - if (IsUnderline) return Avalonia.Media.TextDecorations.Underline; - if (IsStrikethrough) return Avalonia.Media.TextDecorations.Strikethrough; - return null; - } - } - - public double ComputedLineHeight => FontSize * (LineHeight > 0.1 ? LineHeight : 1.2); - - public override ElementKind Kind => ElementKind.Text; - public override string DisplayName => Text.Length > 20 ? Text.Substring(0, 17) + "..." : (string.IsNullOrWhiteSpace(Text) ? "Text Box" : Text); - - public TextElementViewModel(PdfTextElement? element = null) - { - if (element != null) - { - LoadFromModel(element); - } - } - - private static IBrush HexToBrush(string? hex, string fallbackHex = "#00000000") - { - try - { - string targetHex = !string.IsNullOrWhiteSpace(hex) ? hex : fallbackHex; - if (targetHex.Equals("Transparent", StringComparison.OrdinalIgnoreCase) || targetHex == "#00000000") - { - return Brushes.Transparent; - } - if (Color.TryParse(targetHex, out var color)) - { - return new SolidColorBrush(color); - } - } - catch { } - return Brushes.Transparent; - } - - public void TransformUppercase() - { - if (!string.IsNullOrEmpty(Text)) Text = Text.ToUpperInvariant(); - } - - public void TransformLowercase() - { - if (!string.IsNullOrEmpty(Text)) Text = Text.ToLowerInvariant(); - } - - public void TransformTitleCase() - { - if (!string.IsNullOrEmpty(Text)) - { - var ti = System.Globalization.CultureInfo.CurrentCulture.TextInfo; - Text = ti.ToTitleCase(Text.ToLower()); - } - } - - public void TransformCapitalize() - { - if (!string.IsNullOrEmpty(Text)) - { - var sentences = Text.Split('.'); - for (int i = 0; i < sentences.Length; i++) - { - var s = sentences[i].TrimStart(); - if (s.Length > 0) - { - sentences[i] = char.ToUpperInvariant(s[0]) + (s.Length > 1 ? s.Substring(1) : ""); - } - } - Text = string.Join(". ", sentences); - } - } - - public void ToggleBulletList() - { - if (string.IsNullOrEmpty(Text)) return; - var lines = Text.Split('\n'); - bool allBulleted = lines.All(l => l.TrimStart().StartsWith("• ")); - if (allBulleted) - { - Text = string.Join('\n', lines.Select(l => l.TrimStart().StartsWith("• ") ? l.TrimStart().Substring(2) : l)); - } - else - { - Text = string.Join('\n', lines.Select(l => string.IsNullOrWhiteSpace(l) ? l : (l.TrimStart().StartsWith("• ") ? l : $"• {l}"))); - } - } - - public void ToggleNumberedList() - { - if (string.IsNullOrEmpty(Text)) return; - var lines = Text.Split('\n'); - int count = 1; - Text = string.Join('\n', lines.Select(l => - { - if (string.IsNullOrWhiteSpace(l)) return l; - var trimmed = l.TrimStart(); - int dotIdx = trimmed.IndexOf('.'); - if (dotIdx > 0 && int.TryParse(trimmed.Substring(0, dotIdx), out _)) - { - return trimmed.Substring(dotIdx + 1).TrimStart(); - } - return $"{count++}. {trimmed}"; - })); - } - - public void ApplyTypographyPreset(string presetName) - { - switch (presetName.ToLowerInvariant()) - { - case "archup": - case "arch-up": - ShapeMode = TextShapeMode.Curved; - CurveClockwise = true; - CurveRadius = Math.Max(60, Width * 0.6); - CurveArcAngle = 140; - CurveStartAngle = 0; - CurveInvert = false; - break; - - case "archdown": - case "arch-down": - ShapeMode = TextShapeMode.Curved; - CurveClockwise = false; - CurveRadius = Math.Max(60, Width * 0.6); - CurveArcAngle = 140; - CurveStartAngle = 0; - CurveInvert = false; - break; - - case "circlebadge": - case "circle-badge": - ShapeMode = TextShapeMode.Circular; - CircularPlacement = CircularTextPlacement.FullCircle; - CurveRadius = Math.Max(40, Math.Min(Width, Height) / 2.0 - FontSize); - CurveArcAngle = 360; - CurveClockwise = true; - CurveInvert = false; - break; - - case "toparc": - case "top-arc": - ShapeMode = TextShapeMode.Circular; - CircularPlacement = CircularTextPlacement.TopArc; - CurveRadius = Math.Max(40, Math.Min(Width, Height) / 2.0 - FontSize); - CurveArcAngle = 180; - CurveClockwise = true; - CurveInvert = false; - break; - - case "bottomarc": - case "bottom-arc": - ShapeMode = TextShapeMode.Circular; - CircularPlacement = CircularTextPlacement.BottomArc; - CurveRadius = Math.Max(40, Math.Min(Width, Height) / 2.0 - FontSize); - CurveArcAngle = 180; - CurveClockwise = true; - CurveInvert = false; - break; - - case "outlined": - HasStroke = true; - StrokeColorHex = "#0F6CBD"; - StrokeWidth = 1.5; - TextColorHex = "#FFFFFF"; - break; - - case "shadowheading": - case "shadow-heading": - HasShadow = true; - ShadowColorHex = "#60000000"; - ShadowOffsetX = 3.0; - ShadowOffsetY = 3.0; - ShadowBlurRadius = 6.0; - ShadowOpacity = 0.6; - break; - - case "wave": - ShapeMode = TextShapeMode.BezierCurve; - ApplyBezierPreset(BezierCurvePreset.Wave); - break; - - case "scurve": - case "s-curve": - ShapeMode = TextShapeMode.BezierCurve; - ApplyBezierPreset(BezierCurvePreset.SCurve); - break; - - case "bridge": - ShapeMode = TextShapeMode.BezierCurve; - ApplyBezierPreset(BezierCurvePreset.Bridge); - break; - - case "valley": - ShapeMode = TextShapeMode.BezierCurve; - ApplyBezierPreset(BezierCurvePreset.Valley); - break; - - case "rise": - ShapeMode = TextShapeMode.BezierCurve; - ApplyBezierPreset(BezierCurvePreset.Rise); - break; - - case "neonglow": - case "neon-glow": - HasShadow = true; - ShadowColorHex = "#00F0FF"; - ShadowOffsetX = 0.0; - ShadowOffsetY = 0.0; - ShadowBlurRadius = 12.0; - ShadowOpacity = 0.85; - TextColorHex = "#FFFFFF"; - break; - - case "reset": - case "normal": - ShapeMode = TextShapeMode.Normal; - HasStroke = false; - HasShadow = false; - ScaleX = 1.0; - ScaleY = 1.0; - FlipX = false; - FlipY = false; - BaselineShift = 0; - CharacterRotation = 0; - break; - } - } - - public void ApplyBezierPreset(BezierCurvePreset preset) - { - BezierPreset = preset; - var pts = TextLayoutEngine.GetPresetBezierControlPoints(preset); - BezierP0X = pts.P0.X; - BezierP0Y = pts.P0.Y; - BezierP1X = pts.P1.X; - BezierP1Y = pts.P1.Y; - BezierP2X = pts.P2.X; - BezierP2Y = pts.P2.Y; - BezierP3X = pts.P3.X; - BezierP3Y = pts.P3.Y; - } - - public void ResetTransforms() - { - ScaleX = 1.0; - ScaleY = 1.0; - FlipX = false; - FlipY = false; - BaselineShift = 0; - CharacterRotation = 0; - } - - public double CalculateRequiredHeight() - { - var model = (PdfTextElement)ToModel(); - var dims = TextLayoutEngine.CalculateRequiredDimensions(model); - return dims.Height; - } - - public double CalculateRequiredWidth() - { - var model = (PdfTextElement)ToModel(); - var dims = TextLayoutEngine.CalculateRequiredDimensions(model); - return dims.Width; - } - - [RelayCommand] - public void AutoFitHeight() - { - double req = CalculateRequiredHeight(); - if (req > 0) - { - Height = Math.Ceiling(req); - } - } - - [RelayCommand] - public void AutoFitWidth() - { - double req = CalculateRequiredWidth(); - if (req > 0) - { - Width = Math.Ceiling(req); - } - } - - [RelayCommand] - public void AutoFitBoth() - { - var model = (PdfTextElement)ToModel(); - var dims = TextLayoutEngine.CalculateRequiredDimensions(model); - Width = Math.Ceiling(dims.Width); - Height = Math.Ceiling(dims.Height); - } - - public void SetMarkdownText(string markdown) - { - var model = (PdfTextElement)ToModel(); - var parsedSpans = RichTextHelper.ParseMarkdownToSpans(markdown, model); - if (parsedSpans.Count > 1 || parsedSpans.Any(s => s.IsBold == true || s.IsItalic == true || s.IsUnderline == true || s.IsStrikethrough == true || !string.IsNullOrEmpty(s.TextColorHex) || s.Script != TextScriptMode.Normal)) - { - Spans = parsedSpans; - Text = RichTextHelper.SpansToPlainText(parsedSpans); - } - else - { - Spans = null; - Text = RichTextHelper.SpansToPlainText(parsedSpans); - } - } - - public string GetMarkdownText() - { - if (Spans != null && Spans.Count > 0) - { - var model = (PdfTextElement)ToModel(); - return RichTextHelper.SpansToMarkdown(Spans, model); - } - return Text ?? string.Empty; - } - - public void ClearSpans() - { - Spans = null; - } - - [ObservableProperty] - private int _activeSelectionStart; - - [ObservableProperty] - private int _activeSelectionLength; - - [ObservableProperty] - private string _activeSelectedText = string.Empty; - - public bool HasTextSelection => !string.IsNullOrEmpty(ActiveSelectedText) && ActiveSelectionLength > 0; - - public void UpdateTextSelection(int start, int length, string selectedText) - { - ActiveSelectionStart = start; - ActiveSelectionLength = length; - ActiveSelectedText = selectedText ?? string.Empty; - OnPropertyChanged(nameof(HasTextSelection)); - } - - public void ClearTextSelection() - { - ActiveSelectionStart = 0; - ActiveSelectionLength = 0; - ActiveSelectedText = string.Empty; - OnPropertyChanged(nameof(HasTextSelection)); - } - - public bool ApplyInlineFormatting(InlineFormatType formatType, string? argument = null) - { - if (!HasTextSelection || string.IsNullOrEmpty(Text)) return false; - - var result = RichTextHelper.ToggleInlineFormatting( - Text, - ActiveSelectionStart, - ActiveSelectionLength, - formatType, - argument); - - if (result.NewText == Text) return false; - - Text = result.NewText; - ActiveSelectionStart = result.NewSelectionStart; - ActiveSelectionLength = result.NewSelectionLength; - ActiveSelectedText = result.NewSelectionLength > 0 && result.NewSelectionStart + result.NewSelectionLength <= Text.Length - ? Text.Substring(result.NewSelectionStart, result.NewSelectionLength) - : string.Empty; - OnPropertyChanged(nameof(HasTextSelection)); - - // Update parsed spans in real-time - var model = (PdfTextElement)ToModel(); - var parsed = RichTextHelper.ParseMarkdownToSpans(Text, model); - Spans = (parsed.Count > 1 || parsed.Any(s => s.IsBold == true || s.IsItalic == true || s.IsUnderline == true || s.IsStrikethrough == true || !string.IsNullOrEmpty(s.TextColorHex) || s.Script != TextScriptMode.Normal)) - ? parsed - : null; - - if (!IsInEditMode && Spans != null && Spans.Count > 0) - { - Text = RichTextHelper.SpansToPlainText(Spans); - } - - return true; - } - - protected override void OnEditModeChanged(bool isInEditMode) - { - if (isInEditMode) - { - if (Spans != null && Spans.Count > 0) - { - Text = GetMarkdownText(); - } - } - else - { - ClearTextSelection(); - if (!string.IsNullOrEmpty(Text)) - { - SetMarkdownText(Text); - } - } - } - - public override PdfElementBase ToModel() - { - var el = new PdfTextElement - { - Id = Id, - X = X, - Y = Y, - Width = Width, - Height = Height, - ZIndex = ZIndex, - Rotation = Rotation, - Opacity = Opacity, - IsLocked = IsLocked, - GroupId = GroupId, - Text = Text, - FontFamily = FontFamily, - FontSize = FontSize, - IsBold = IsBold, - IsItalic = IsItalic, - IsUnderline = IsUnderline, - IsDoubleUnderline = IsDoubleUnderline, - IsStrikethrough = IsStrikethrough, - TextColorHex = TextColorHex, - TextOpacity = TextOpacity, - Alignment = Alignment, - VerticalAlignment = VerticalAlignment, - LineHeight = LineHeight, - CharacterSpacing = CharacterSpacing, - WordSpacing = WordSpacing, - ParagraphSpacing = ParagraphSpacing, - TextWrap = TextWrap, - HasStroke = HasStroke, - StrokeColorHex = StrokeColorHex, - StrokeWidth = StrokeWidth, - HasShadow = HasShadow, - ShadowColorHex = ShadowColorHex, - ShadowOffsetX = ShadowOffsetX, - ShadowOffsetY = ShadowOffsetY, - ShadowBlurRadius = ShadowBlurRadius, - ShadowOpacity = ShadowOpacity, - Padding = Padding, - BackgroundColorHex = BackgroundColorHex, - BorderColorHex = BorderColorHex, - BorderThickness = BorderThickness, - CornerRadius = CornerRadius, - ShapeMode = ShapeMode, - CurveRadius = CurveRadius, - CurveArcAngle = CurveArcAngle, - CurveStartAngle = CurveStartAngle, - CurveClockwise = CurveClockwise, - CurveInvert = CurveInvert, - CircularPlacement = CircularPlacement, - BaselineShift = BaselineShift, - CharacterRotation = CharacterRotation, - ScaleX = ScaleX, - ScaleY = ScaleY, - FlipX = FlipX, - FlipY = FlipY, - BezierPreset = BezierPreset, - BezierP0X = BezierP0X, - BezierP0Y = BezierP0Y, - BezierP1X = BezierP1X, - BezierP1Y = BezierP1Y, - BezierP2X = BezierP2X, - BezierP2Y = BezierP2Y, - BezierP3X = BezierP3X, - BezierP3Y = BezierP3Y - }; - - if (Spans != null) - { - el.Spans = new System.Collections.Generic.List(Spans.Count); - foreach (var span in Spans) - { - el.Spans.Add(span.Clone()); - } - } - - return el; - } - - public override void LoadFromModel(PdfElementBase model) - { - if (model is PdfTextElement textModel) - { - Id = textModel.Id; - X = textModel.X; - Y = textModel.Y; - Width = textModel.Width; - Height = textModel.Height; - ZIndex = textModel.ZIndex; - Rotation = textModel.Rotation; - Opacity = textModel.Opacity; - IsLocked = textModel.IsLocked; - GroupId = textModel.GroupId; - - Text = textModel.Text; - FontFamily = textModel.FontFamily; - FontSize = textModel.FontSize; - IsBold = textModel.IsBold; - IsItalic = textModel.IsItalic; - IsUnderline = textModel.IsUnderline; - IsDoubleUnderline = textModel.IsDoubleUnderline; - IsStrikethrough = textModel.IsStrikethrough; - TextColorHex = textModel.TextColorHex; - TextOpacity = textModel.TextOpacity; - Alignment = textModel.Alignment; - VerticalAlignment = textModel.VerticalAlignment; - LineHeight = textModel.LineHeight; - CharacterSpacing = textModel.CharacterSpacing; - WordSpacing = textModel.WordSpacing; - ParagraphSpacing = textModel.ParagraphSpacing; - TextWrap = textModel.TextWrap; - HasStroke = textModel.HasStroke; - StrokeColorHex = textModel.StrokeColorHex; - StrokeWidth = textModel.StrokeWidth; - HasShadow = textModel.HasShadow; - ShadowColorHex = textModel.ShadowColorHex; - ShadowOffsetX = textModel.ShadowOffsetX; - ShadowOffsetY = textModel.ShadowOffsetY; - ShadowBlurRadius = textModel.ShadowBlurRadius; - ShadowOpacity = textModel.ShadowOpacity; - Padding = textModel.Padding; - BackgroundColorHex = textModel.BackgroundColorHex; - BorderColorHex = textModel.BorderColorHex; - BorderThickness = textModel.BorderThickness; - CornerRadius = textModel.CornerRadius; - ShapeMode = textModel.ShapeMode; - CurveRadius = textModel.CurveRadius; - CurveArcAngle = textModel.CurveArcAngle; - CurveStartAngle = textModel.CurveStartAngle; - CurveClockwise = textModel.CurveClockwise; - CurveInvert = textModel.CurveInvert; - CircularPlacement = textModel.CircularPlacement; - BaselineShift = textModel.BaselineShift; - CharacterRotation = textModel.CharacterRotation; - ScaleX = textModel.ScaleX; - ScaleY = textModel.ScaleY; - FlipX = textModel.FlipX; - FlipY = textModel.FlipY; - BezierPreset = textModel.BezierPreset; - BezierP0X = textModel.BezierP0X; - BezierP0Y = textModel.BezierP0Y; - BezierP1X = textModel.BezierP1X; - BezierP1Y = textModel.BezierP1Y; - BezierP2X = textModel.BezierP2X; - BezierP2Y = textModel.BezierP2Y; - BezierP3X = textModel.BezierP3X; - BezierP3Y = textModel.BezierP3Y; - - if (textModel.Spans != null) - { - Spans = new System.Collections.Generic.List(textModel.Spans.Count); - foreach (var span in textModel.Spans) - { - Spans.Add(span.Clone()); - } - } - else - { - Spans = null; - } - } - } -} diff --git a/src/PdfEditorApp/ViewModels/ElementViewModels/WatermarkElementViewModel.cs b/src/PdfEditorApp/ViewModels/ElementViewModels/WatermarkElementViewModel.cs deleted file mode 100644 index 20a12f7..0000000 --- a/src/PdfEditorApp/ViewModels/ElementViewModels/WatermarkElementViewModel.cs +++ /dev/null @@ -1,72 +0,0 @@ -using CommunityToolkit.Mvvm.ComponentModel; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; -using PdfEditorApp.Models; - -namespace PdfEditorApp.ViewModels.ElementViewModels; - -public partial class WatermarkElementViewModel : ElementViewModelBase -{ - [ObservableProperty] - private string _text = "CONFIDENTIAL"; - - [ObservableProperty] - private double _fontSize = 48; - - [ObservableProperty] - private string _colorHex = "#CC0000"; - - [ObservableProperty] - private double _angle = -35; - - public override ElementKind Kind => ElementKind.Watermark; - public override string DisplayName => $"Watermark ({Text})"; - - public WatermarkElementViewModel() - { - Opacity = 0.15; - Width = 600; - Height = 300; - } - - public override PdfElementBase ToModel() - { - return new PdfWatermarkElement - { - Id = Id, - X = X, - Y = Y, - Width = Width, - Height = Height, - ZIndex = ZIndex, - Rotation = Rotation, - Opacity = Opacity, - IsLocked = IsLocked, - Text = Text, - FontSize = FontSize, - ColorHex = ColorHex, - Angle = Angle - }; - } - - public override void LoadFromModel(PdfElementBase model) - { - if (model is PdfWatermarkElement wm) - { - Id = wm.Id; - X = wm.X; - Y = wm.Y; - Width = wm.Width; - Height = wm.Height; - ZIndex = wm.ZIndex; - Rotation = wm.Rotation; - Opacity = wm.Opacity; - IsLocked = wm.IsLocked; - - Text = wm.Text; - FontSize = wm.FontSize; - ColorHex = wm.ColorHex; - Angle = wm.Angle; - } - } -} diff --git a/src/PdfEditorApp/ViewModels/FontManagerViewModel.cs b/src/PdfEditorApp/ViewModels/FontManagerViewModel.cs deleted file mode 100644 index ed06da3..0000000 --- a/src/PdfEditorApp/ViewModels/FontManagerViewModel.cs +++ /dev/null @@ -1,310 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Diagnostics; -using System.IO; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using CommunityToolkit.Mvvm.ComponentModel; -using CommunityToolkit.Mvvm.Input; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Services; -using PdfEditorApp.Services; - -namespace PdfEditorApp.ViewModels; - -/// -/// ViewModel representing an individual downloadable language / font package card. -/// -public partial class FontPackageItemViewModel : ObservableObject -{ - private readonly IFontPackageService _fontService; - - public FontPackageInfo Model { get; } - - public string Id => Model.Id; - public string Name => Model.Name; - public string NativeName => Model.NativeName; - public string FlagEmoji => Model.FlagEmoji; - public string Region => Model.Region; - public FontPackageCategory Category => Model.Category; - public string Description => Model.Description; - public string SampleText => Model.SampleText; - public string FormattedSize => Model.FormattedSize; - public IReadOnlyList SupportedLanguages => Model.SupportedLanguages; - public IReadOnlyList IncludedFontFamilies => Model.IncludedFontFamilies; - - [ObservableProperty] - private bool _isInstalled; - - [ObservableProperty] - private bool _isDownloading; - - [ObservableProperty] - private double _downloadProgress; - - [ObservableProperty] - private string _statusText = "Available"; - - [ObservableProperty] - private string _progressText = ""; - - public FontPackageItemViewModel(FontPackageInfo model, IFontPackageService fontService) - { - Model = model; - _fontService = fontService; - RefreshStatus(); - } - - public void RefreshStatus() - { - IsInstalled = _fontService.IsPackageInstalled(Model); - if (IsInstalled) - { - StatusText = "Installed"; - DownloadProgress = 1.0; - } - else - { - StatusText = $"Available ({FormattedSize})"; - DownloadProgress = 0.0; - } - } - - [RelayCommand] - public async Task DownloadAsync() - { - if (IsDownloading || IsInstalled) return; - - IsDownloading = true; - StatusText = "Connecting..."; - ProgressText = "0%"; - DownloadProgress = 0.0; - - var progress = new Progress(p => - { - DownloadProgress = p; - ProgressText = $"{p * 100:F0}%"; - StatusText = $"Downloading {ProgressText} ({FormattedSize})"; - }); - - bool success = await _fontService.DownloadPackageAsync(Model, progress, status => - { - StatusText = status; - }); - - IsDownloading = false; - IsInstalled = success; - - if (success) - { - StatusText = "Installed & Active"; - DownloadProgress = 1.0; - } - else - { - StatusText = "Download Failed (Click to retry)"; - } - } - - [RelayCommand] - public async Task DeleteAsync() - { - if (IsDownloading) return; - - bool deleted = await _fontService.DeletePackageAsync(Model); - if (deleted) - { - IsInstalled = false; - StatusText = $"Available ({FormattedSize})"; - DownloadProgress = 0.0; - } - } -} - -/// -/// Main ViewModel for the Font & Language Pack Management Studio. -/// Empowers users to download, inspect, and delete international font packs to keep the app ultra-lightweight. -/// -public partial class FontManagerViewModel : ViewModelBase -{ - private readonly IFontPackageService _fontService; - - [ObservableProperty] - private string _searchQuery = ""; - - [ObservableProperty] - private string _selectedCategory = "All"; - - [ObservableProperty] - private string _totalCacheSizeFormatted = "0 MB"; - - [ObservableProperty] - private int _installedCount; - - [ObservableProperty] - private int _totalPackagesCount; - - [ObservableProperty] - private bool _isDownloadingAll; - - [ObservableProperty] - private string _globalStatusMessage = ""; - - public string UserFontDirectory => _fontService.GetUserFontDirectory(); - - public ObservableCollection AllPackages { get; } = new(); - public ObservableCollection FilteredPackages { get; } = new(); - - public FontManagerViewModel() : this(new FontPackageService()) { } - - public FontManagerViewModel(IFontPackageService fontService) - { - _fontService = fontService; - _fontService.FontLibraryChanged += OnFontLibraryChanged; - - InitializePackages(); - _ = RefreshStatsAsync(); - } - - private void InitializePackages() - { - AllPackages.Clear(); - foreach (var pack in _fontService.GetAllPackages()) - { - AllPackages.Add(new FontPackageItemViewModel(pack, _fontService)); - } - - TotalPackagesCount = AllPackages.Count; - ApplyFilter(); - } - - private void OnFontLibraryChanged() - { - foreach (var item in AllPackages) - { - item.RefreshStatus(); - } - _ = RefreshStatsAsync(); - ApplyFilter(); - } - - public async Task RefreshStatsAsync() - { - long bytes = await _fontService.GetTotalCacheSizeBytesAsync(); - TotalCacheSizeFormatted = FontPackageInfo.FormatBytes(bytes); - InstalledCount = AllPackages.Count(p => p.IsInstalled); - } - - partial void OnSearchQueryChanged(string value) => ApplyFilter(); - partial void OnSelectedCategoryChanged(string value) => ApplyFilter(); - - [RelayCommand] - public void SelectCategory(string category) - { - SelectedCategory = category; - } - - private void ApplyFilter() - { - FilteredPackages.Clear(); - string query = SearchQuery.Trim().ToLowerInvariant(); - - foreach (var pack in AllPackages) - { - // Category filter - bool matchesCategory = SelectedCategory switch - { - "All" => true, - "Installed" => pack.IsInstalled, - "EastAsia" => pack.Category == FontPackageCategory.EastAsia, - "SouthAsia" => pack.Category == FontPackageCategory.SouthAsia, - "MiddleEast" => pack.Category == FontPackageCategory.MiddleEast, - "SoutheastAsia" => pack.Category == FontPackageCategory.SoutheastAsia, - "EuropeAndEurasia" => pack.Category == FontPackageCategory.EuropeAndEurasia, - "DesignAndTypography" => pack.Category == FontPackageCategory.DesignAndTypography, - _ => true - }; - - if (!matchesCategory) continue; - - // Search query - if (!string.IsNullOrEmpty(query)) - { - bool matchesSearch = - pack.Name.ToLowerInvariant().Contains(query) || - pack.NativeName.ToLowerInvariant().Contains(query) || - pack.Region.ToLowerInvariant().Contains(query) || - pack.Description.ToLowerInvariant().Contains(query) || - pack.SupportedLanguages.Any(l => l.ToLowerInvariant().Contains(query)) || - pack.IncludedFontFamilies.Any(f => f.ToLowerInvariant().Contains(query)); - - if (!matchesSearch) continue; - } - - FilteredPackages.Add(pack); - } - } - - [RelayCommand] - public async Task DownloadAllAsync() - { - if (IsDownloadingAll) return; - - IsDownloadingAll = true; - GlobalStatusMessage = "Downloading all language packs..."; - - var uninstalled = AllPackages.Where(p => !p.IsInstalled).ToList(); - int completed = 0; - - foreach (var pack in uninstalled) - { - GlobalStatusMessage = $"Downloading {pack.Name} ({completed + 1}/{uninstalled.Count})..."; - await pack.DownloadAsync(); - completed++; - } - - IsDownloadingAll = false; - GlobalStatusMessage = "All packs downloaded successfully!"; - await RefreshStatsAsync(); - } - - [RelayCommand] - public async Task ClearAllCacheAsync() - { - await _fontService.ClearAllCacheAsync(); - foreach (var pack in AllPackages) - { - pack.RefreshStatus(); - } - await RefreshStatsAsync(); - ApplyFilter(); - GlobalStatusMessage = "Font cache cleared. All local font downloads removed."; - } - - [RelayCommand] - public void OpenFontFolder() - { - try - { - string dir = UserFontDirectory; - if (!Directory.Exists(dir)) - Directory.CreateDirectory(dir); - - if (OperatingSystem.IsMacOS()) - { - Process.Start("open", dir); - } - else if (OperatingSystem.IsWindows()) - { - Process.Start("explorer.exe", dir); - } - else - { - Process.Start("xdg-open", dir); - } - } - catch { } - } -} diff --git a/src/PdfEditorApp/ViewModels/FryPdfViewer/FryPdfPageViewerViewModel.cs b/src/PdfEditorApp/ViewModels/FryPdfViewer/FryPdfPageViewerViewModel.cs deleted file mode 100644 index 73853e8..0000000 --- a/src/PdfEditorApp/ViewModels/FryPdfViewer/FryPdfPageViewerViewModel.cs +++ /dev/null @@ -1,177 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Linq; -using CommunityToolkit.Mvvm.ComponentModel; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; -using PdfEditorApp.ViewModels.ElementViewModels; - -namespace PdfEditorApp.ViewModels.FryPdfViewer; - -/// -/// Page ViewModel specifically designed for read-only presentation and interactive document viewing. -/// Separates standard visual elements from rich interactive elements (tables, charts, living forms). -/// -public partial class FryPdfPageViewerViewModel : ObservableObject -{ - [ObservableProperty] - private string _id = Guid.NewGuid().ToString("N"); - - [ObservableProperty] - private int _pageNumber = 1; - - [ObservableProperty] - private PageFormat _format = PageFormat.A4; - - [ObservableProperty] - private PageOrientation _orientation = PageOrientation.Portrait; - - [ObservableProperty] - private int _rotationAngle = 0; - - [ObservableProperty] - private double _width = 800; - - [ObservableProperty] - private double _height = 1131; - - [ObservableProperty] - private string _backgroundColorHex = "#FFFFFF"; - - [ObservableProperty] - private bool _showHeaderFooter = true; - - [ObservableProperty] - private string? _headerLeft; - - [ObservableProperty] - private string? _headerCenter; - - [ObservableProperty] - private string? _headerRight; - - [ObservableProperty] - private string? _footerLeft; - - [ObservableProperty] - private string? _footerCenter; - - [ObservableProperty] - private string? _footerRight; - - /// Unified collection of all presentation elements on this page in natural Z-index order. - public ObservableCollection Elements { get; } = new(); - - /// Interactive living data tables with real-time row search, sorting, and CSV export. - public IEnumerable InteractiveTables => Elements.OfType(); - - /// Interactive animated charts with hover tooltips and dynamic animations. - public IEnumerable InteractiveCharts => Elements.OfType(); - - /// Standard visual elements (text, vector shapes, images, math formulas, svgs, barcodes, stamps). - public IEnumerable StandardElements => Elements.Where(e => e is not InteractiveTableViewModel && e is not InteractiveChartViewModel); - - public FryPdfPageViewerViewModel() - { - } - - public static FryPdfPageViewerViewModel FromPageModel(PdfPageModel pageModel) - { - var vm = new FryPdfPageViewerViewModel - { - Id = pageModel.Id, - PageNumber = pageModel.PageNumber, - Format = pageModel.Format, - Orientation = pageModel.Orientation, - RotationAngle = pageModel.RotationAngle, - Width = pageModel.Width, - Height = pageModel.Height, - BackgroundColorHex = pageModel.BackgroundColorHex, - ShowHeaderFooter = pageModel.ShowHeaderFooter, - HeaderLeft = pageModel.HeaderLeft, - HeaderCenter = pageModel.HeaderCenter, - HeaderRight = pageModel.HeaderRight, - FooterLeft = pageModel.FooterLeft, - FooterCenter = pageModel.FooterCenter, - FooterRight = pageModel.FooterRight - }; - - foreach (var el in pageModel.Elements) - { - if (el is PdfTableElement tableModel) - { - vm.Elements.Add(new InteractiveTableViewModel(tableModel)); - } - else if (el is PdfChartElement chartModel) - { - vm.Elements.Add(new InteractiveChartViewModel(chartModel)); - } - else - { - // Create standard view model using default service - var standardVm = PageViewModel.DefaultElementService.CreateViewModel(el); - // Ensure edit mode is false in viewer - standardVm.IsSelected = false; - standardVm.IsInEditMode = false; - vm.Elements.Add(standardVm); - } - } - - return vm; - } - - public static FryPdfPageViewerViewModel FromPageViewModel(PageViewModel pageVm) - { - var vm = new FryPdfPageViewerViewModel - { - Id = pageVm.Id, - PageNumber = pageVm.PageNumber, - Format = pageVm.Format, - Orientation = pageVm.Orientation, - RotationAngle = pageVm.RotationAngle, - Width = pageVm.Width, - Height = pageVm.Height, - BackgroundColorHex = pageVm.BackgroundColorHex, - ShowHeaderFooter = pageVm.ShowHeaderFooter, - HeaderLeft = pageVm.HeaderLeft, - HeaderCenter = pageVm.HeaderCenter, - HeaderRight = pageVm.HeaderRight, - FooterLeft = pageVm.FooterLeft, - FooterCenter = pageVm.FooterCenter, - FooterRight = pageVm.FooterRight - }; - - foreach (var el in pageVm.Elements) - { - if (el is TableElementViewModel tableVm) - { - vm.Elements.Add(new InteractiveTableViewModel(tableVm)); - } - else if (el is ChartElementViewModel chartVm) - { - vm.Elements.Add(new InteractiveChartViewModel(chartVm)); - } - else - { - // Ensure selection / edit mode is disabled in read-only presentation - el.IsSelected = false; - el.IsInEditMode = false; - vm.Elements.Add(el); - } - } - - return vm; - } - - /// - /// Replays entrance animations on all interactive charts on this page. - /// - public void ReplayChartAnimations() - { - foreach (var chart in InteractiveCharts) - { - chart.ReplayAnimation(); - } - } -} diff --git a/src/PdfEditorApp/ViewModels/FryPdfViewer/FryPdfViewerViewModel.cs b/src/PdfEditorApp/ViewModels/FryPdfViewer/FryPdfViewerViewModel.cs deleted file mode 100644 index f96262c..0000000 --- a/src/PdfEditorApp/ViewModels/FryPdfViewer/FryPdfViewerViewModel.cs +++ /dev/null @@ -1,463 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.IO; -using System.Linq; -using System.Threading.Tasks; -using Avalonia; -using Avalonia.Controls.Primitives; -using Avalonia.Media; -using Avalonia.Platform.Storage; -using CommunityToolkit.Mvvm.ComponentModel; -using CommunityToolkit.Mvvm.Input; -using CommunityToolkit.Mvvm.Messaging; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Messages; -using PdfEditorApp.Models; -using PdfEditorApp.Services; - -namespace PdfEditorApp.ViewModels.FryPdfViewer; - -/// -/// Result item for text searches across pages in a .frypdf document. -/// -public record FryPdfSearchResult(int PageIndex, int PageNumber, string Snippet, string ElementId); - -/// -/// Master ViewModel for the dedicated .frypdf Interactive Document Viewer & Presentation Reader. -/// Provides a distraction-free, read-only presentation experience with dynamic capabilities -/// impossible in static binary PDFs (scrolling data tables, animated charts, live forms, slide show mode). -/// -public partial class FryPdfViewerViewModel : ViewModelBase -{ - private readonly IProjectPersistenceService _persistenceService; - private readonly IPdfExportService _exportService; - - public IStorageProvider? StorageProvider { get; set; } - - [ObservableProperty] - private string _documentTitle = "Document.frypdf"; - - [ObservableProperty] - private string _filePath = ""; - - [ObservableProperty] - private bool _isLoading = false; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(TotalPagesCount))] - [NotifyPropertyChangedFor(nameof(HasPages))] - [NotifyPropertyChangedFor(nameof(ShowHeaderFooterInView))] - private FryPdfPageViewerViewModel? _currentPage; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(CurrentPageNumber))] - [NotifyPropertyChangedFor(nameof(CanGoNextPage))] - [NotifyPropertyChangedFor(nameof(CanGoPreviousPage))] - [NotifyCanExecuteChangedFor(nameof(NextPageCommand))] - [NotifyCanExecuteChangedFor(nameof(PreviousPageCommand))] - private int _currentPageIndex = 0; - - [ObservableProperty] - private double _zoomLevel = 1.0; - - [ObservableProperty] - private bool _isContinuousScroll = false; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(CanGoNextPage))] - [NotifyPropertyChangedFor(nameof(CanGoPreviousPage))] - [NotifyPropertyChangedFor(nameof(IsSidebarVisibleInView))] - [NotifyPropertyChangedFor(nameof(ViewportBackgroundBrush))] - [NotifyPropertyChangedFor(nameof(ViewportPadding))] - [NotifyPropertyChangedFor(nameof(ViewportScrollVisibility))] - [NotifyPropertyChangedFor(nameof(PageBorderThickness))] - [NotifyPropertyChangedFor(nameof(PageCornerRadius))] - [NotifyPropertyChangedFor(nameof(PageBoxShadow))] - [NotifyPropertyChangedFor(nameof(ShowHeaderFooterInView))] - [NotifyCanExecuteChangedFor(nameof(NextPageCommand))] - [NotifyCanExecuteChangedFor(nameof(PreviousPageCommand))] - private bool _isPresentationMode = false; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(IsSidebarVisibleInView))] - private bool _isThumbnailSidebarOpen = true; - - [ObservableProperty] - private PdfReaderTheme _readingTheme = PdfReaderTheme.Default; - - [ObservableProperty] - private string _searchQuery = ""; - - [ObservableProperty] - private int _activeSearchResultIndex = 0; - - public ObservableCollection Pages { get; } = new(); - public ObservableCollection SearchResults { get; } = new(); - - public int TotalPagesCount => Pages.Count; - public bool HasPages => Pages.Count > 0; - public int CurrentPageNumber => CurrentPageIndex + 1; - public bool CanGoNextPage => IsPresentationMode ? Pages.Count > 1 : (Pages.Count > 0 && CurrentPageIndex < Pages.Count - 1); - public bool CanGoPreviousPage => IsPresentationMode ? Pages.Count > 1 : (Pages.Count > 0 && CurrentPageIndex > 0); - - public bool IsSidebarVisibleInView => IsThumbnailSidebarOpen && !IsPresentationMode; - public string ViewportBackgroundBrush => IsPresentationMode ? "#000000" : "Transparent"; - public Thickness ViewportPadding => IsPresentationMode ? new Thickness(0) : new Thickness(36); - public ScrollBarVisibility ViewportScrollVisibility => IsPresentationMode ? ScrollBarVisibility.Disabled : ScrollBarVisibility.Auto; - public double PageBorderThickness => IsPresentationMode ? 0 : 1; - public CornerRadius PageCornerRadius => IsPresentationMode ? new CornerRadius(0) : new CornerRadius(4); - public BoxShadows PageBoxShadow => IsPresentationMode ? new BoxShadows(new BoxShadow()) : BoxShadows.Parse("0 8 32 #18000000"); - public bool ShowHeaderFooterInView => CurrentPage != null && CurrentPage.ShowHeaderFooter && !IsPresentationMode; - - public PdfDocumentModel? CurrentDocumentModel { get; private set; } - - public FryPdfViewerViewModel( - IProjectPersistenceService? persistenceService = null, - IPdfExportService? exportService = null) - { - _persistenceService = persistenceService ?? new ProjectPersistenceService(); - _exportService = exportService ?? new PdfExportService(); - } - - /// - /// Loads a .frypdf document file from disk into the interactive viewer. - /// - public async Task LoadDocumentAsync(string filePath) - { - if (string.IsNullOrWhiteSpace(filePath) || !File.Exists(filePath)) - return; - - IsLoading = true; - FilePath = filePath; - DocumentTitle = Path.GetFileName(filePath); - - try - { - var model = await _persistenceService.LoadProjectAsync(filePath); - if (model != null) - { - LoadFromModel(model, filePath); - } - } - finally - { - IsLoading = false; - } - } - - /// - /// Loads an in-memory PdfDocumentModel into the viewer. - /// - public void LoadFromModel(PdfDocumentModel model, string? filePath = null) - { - CurrentDocumentModel = model; - FilePath = filePath ?? string.Empty; - DocumentTitle = !string.IsNullOrWhiteSpace(filePath) - ? Path.GetFileName(filePath) - : (!string.IsNullOrWhiteSpace(model.Title) - ? (model.Title.EndsWith(".frypdf", StringComparison.OrdinalIgnoreCase) - ? model.Title - : $"{Path.GetFileNameWithoutExtension(model.Title)}.frypdf") - : "Document.frypdf"); - - Pages.Clear(); - foreach (var pageModel in model.Pages) - { - var pageVm = FryPdfPageViewerViewModel.FromPageModel(pageModel); - Pages.Add(pageVm); - } - - CurrentPageIndex = 0; - CurrentPage = Pages.FirstOrDefault(); - - // Trigger chart entry animations on first page - CurrentPage?.ReplayChartAnimations(); - - OnPropertyChanged(nameof(TotalPagesCount)); - OnPropertyChanged(nameof(HasPages)); - OnPropertyChanged(nameof(CurrentPageNumber)); - OnPropertyChanged(nameof(CanGoNextPage)); - OnPropertyChanged(nameof(CanGoPreviousPage)); - NextPageCommand.NotifyCanExecuteChanged(); - PreviousPageCommand.NotifyCanExecuteChanged(); - } - - partial void OnCurrentPageIndexChanged(int value) - { - if (value >= 0 && value < Pages.Count) - { - CurrentPage = Pages[value]; - CurrentPage.ReplayChartAnimations(); - } - } - - // --- PAGE NAVIGATION COMMANDS --- - - [RelayCommand(CanExecute = nameof(CanGoNextPage))] - public void NextPage() - { - if (Pages.Count <= 1) return; - - if (CurrentPageIndex < Pages.Count - 1) - { - CurrentPageIndex++; - } - else if (IsPresentationMode) - { - // Smooth wrap-around in presentation mode - CurrentPageIndex = 0; - } - } - - [RelayCommand(CanExecute = nameof(CanGoPreviousPage))] - public void PreviousPage() - { - if (Pages.Count <= 1) return; - - if (CurrentPageIndex > 0) - { - CurrentPageIndex--; - } - else if (IsPresentationMode) - { - // Smooth wrap-around in presentation mode - CurrentPageIndex = Pages.Count - 1; - } - } - - [RelayCommand] - public void FirstPage() - { - if (Pages.Count > 0) - { - CurrentPageIndex = 0; - } - } - - [RelayCommand] - public void LastPage() - { - if (Pages.Count > 0) - { - CurrentPageIndex = Pages.Count - 1; - } - } - - [RelayCommand] - public void GoToPage(int pageNumber) - { - int targetIdx = pageNumber - 1; - if (targetIdx >= 0 && targetIdx < Pages.Count) - { - CurrentPageIndex = targetIdx; - } - } - - // --- ZOOM COMMANDS --- - - [RelayCommand] - public void ZoomIn() - { - ZoomLevel = Math.Min(5.0, Math.Round(ZoomLevel + 0.15, 2)); - } - - [RelayCommand] - public void ZoomOut() - { - ZoomLevel = Math.Max(0.25, Math.Round(ZoomLevel - 0.15, 2)); - } - - [RelayCommand] - public void ResetZoom() - { - ZoomLevel = 1.0; - } - - [RelayCommand] - public void FitToWidth() - { - ZoomLevel = 1.25; - } - - public void FitToViewport(double viewportWidth, double viewportHeight) - { - if (CurrentPage == null || CurrentPage.Width <= 0 || CurrentPage.Height <= 0) - return; - - double availWidth = Math.Max(100, viewportWidth); - double availHeight = Math.Max(100, viewportHeight); - - double scaleX = availWidth / CurrentPage.Width; - double scaleY = availHeight / CurrentPage.Height; - double fitScale = Math.Min(scaleX, scaleY); - - if (fitScale > 0.1 && fitScale < 10.0) - { - ZoomLevel = Math.Round(fitScale, 3); - } - } - - [RelayCommand] - public void FitToPage() - { - ZoomLevel = 0.85; - } - - // --- INTERACTIVE FEATURES COMMANDS --- - - [RelayCommand] - public void TogglePresentationMode() - { - IsPresentationMode = !IsPresentationMode; - } - - [RelayCommand] - public void ToggleThumbnailSidebar() - { - IsThumbnailSidebarOpen = !IsThumbnailSidebarOpen; - } - - [RelayCommand] - public void ReplayAnimations() - { - CurrentPage?.ReplayChartAnimations(); - } - - [RelayCommand] - public void SetReadingTheme(PdfReaderTheme theme) - { - ReadingTheme = theme; - } - - // --- SEARCH COMMANDS --- - - partial void OnSearchQueryChanged(string value) - { - PerformSearch(); - } - - private void PerformSearch() - { - SearchResults.Clear(); - if (string.IsNullOrWhiteSpace(SearchQuery)) - { - ActiveSearchResultIndex = 0; - return; - } - - string q = SearchQuery.Trim(); - for (int p = 0; p < Pages.Count; p++) - { - var page = Pages[p]; - foreach (var el in page.Elements) - { - if (el is ElementViewModels.TextElementViewModel textEl && - !string.IsNullOrEmpty(textEl.Text) && - textEl.Text.Contains(q, StringComparison.OrdinalIgnoreCase)) - { - string snippet = textEl.Text.Length > 60 ? textEl.Text.Substring(0, 57) + "..." : textEl.Text; - SearchResults.Add(new FryPdfSearchResult(p, p + 1, snippet, textEl.Id)); - } - } - - foreach (var table in page.InteractiveTables) - { - if (table.AllRows.Any(r => r.MatchesFilter(q))) - { - SearchResults.Add(new FryPdfSearchResult(p, p + 1, $"Table match on page {p + 1}", string.Empty)); - } - } - } - - if (SearchResults.Count > 0) - { - ActiveSearchResultIndex = 0; - GoToSearchResult(0); - } - } - - [RelayCommand] - public void NextSearchResult() - { - if (SearchResults.Count == 0) return; - ActiveSearchResultIndex = (ActiveSearchResultIndex + 1) % SearchResults.Count; - GoToSearchResult(ActiveSearchResultIndex); - } - - [RelayCommand] - public void PreviousSearchResult() - { - if (SearchResults.Count == 0) return; - ActiveSearchResultIndex = (ActiveSearchResultIndex - 1 + SearchResults.Count) % SearchResults.Count; - GoToSearchResult(ActiveSearchResultIndex); - } - - private void GoToSearchResult(int index) - { - if (index >= 0 && index < SearchResults.Count) - { - CurrentPageIndex = SearchResults[index].PageIndex; - } - } - - // --- APPLICATION WORKFLOW COMMANDS --- - - /// - /// Navigates back to the Home Dashboard. - /// - [RelayCommand] - public void BackToHome() - { - WeakReferenceMessenger.Default.Send(new NavigateToHomeMessage()); - } - - /// - /// Switches from read-only Interactive Viewer into full Studio Editor for the active document. - /// - [RelayCommand] - public void OpenInEditor() - { - if (!string.IsNullOrWhiteSpace(FilePath)) - { - WeakReferenceMessenger.Default.Send(new OpenInEditorMessage(FilePath)); - } - } - - /// - /// Exports the current document to standard binary PDF via QuestPDF. - /// - [RelayCommand] - public async Task ExportPdfAsync() - { - if (CurrentDocumentModel == null) return; - - try - { - if (StorageProvider != null) - { - var file = await StorageProvider.SaveFilePickerAsync(new FilePickerSaveOptions - { - Title = "Export .frypdf to Vector PDF", - SuggestedFileName = Path.ChangeExtension(DocumentTitle, ".pdf"), - DefaultExtension = "pdf", - FileTypeChoices = new[] - { - new FilePickerFileType("PDF Document (*.pdf)") { Patterns = new[] { "*.pdf" } } - } - }); - - if (file != null) - { - string targetPath = file.Path.LocalPath; - await _exportService.ExportToFileAsync(CurrentDocumentModel, targetPath); - WeakReferenceMessenger.Default.Send(new ShowToastMessage($"Exported PDF: {Path.GetFileName(targetPath)}")); - } - } - } - catch (Exception ex) - { - WeakReferenceMessenger.Default.Send(new ShowToastMessage($"Export error: {ex.Message}", ToastNotificationType.Danger)); - } - } -} diff --git a/src/PdfEditorApp/ViewModels/FryPdfViewer/InteractiveChartViewModel.cs b/src/PdfEditorApp/ViewModels/FryPdfViewer/InteractiveChartViewModel.cs deleted file mode 100644 index d471a2b..0000000 --- a/src/PdfEditorApp/ViewModels/FryPdfViewer/InteractiveChartViewModel.cs +++ /dev/null @@ -1,337 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Linq; -using Avalonia.Threading; -using CommunityToolkit.Mvvm.ComponentModel; -using CommunityToolkit.Mvvm.Input; -using PdfEditorApp.Core.Analysis; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; -using PdfEditorApp.ViewModels.ElementViewModels; - -namespace PdfEditorApp.ViewModels.FryPdfViewer; - -/// -/// Individual interactive bar/data item with animation interpolation and hover details. -/// -public partial class InteractiveChartItem : ObservableObject -{ - [ObservableProperty] - private string _category = ""; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(AnimatedValue))] - [NotifyPropertyChangedFor(nameof(AnimatedHeightPx))] - private double _targetValue; - - [ObservableProperty] - private string _valueLabel = ""; - - [ObservableProperty] - private string _colorHex = "#0F6CBD"; - - [ObservableProperty] - private double _percentage; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(AnimatedValue))] - [NotifyPropertyChangedFor(nameof(AnimatedHeightPx))] - [NotifyPropertyChangedFor(nameof(AnimatedWidthPx))] - private double _animationProgress = 1.0; - - public double AnimatedValue => TargetValue * AnimationProgress; - - public double MaxPlotHeight { get; set; } = 150.0; - public double MaxPlotWidth { get; set; } = 260.0; - public double MaxValue { get; set; } = 1.0; - - public double AnimatedHeightPx - { - get - { - if (MaxValue <= 0) return 6; - double ratio = Math.Clamp(AnimatedValue / MaxValue, 0.0, 1.0); - return Math.Max(6, ratio * MaxPlotHeight); - } - } - - public double AnimatedWidthPx - { - get - { - if (MaxValue <= 0) return 8; - double ratio = Math.Clamp(AnimatedValue / MaxValue, 0.0, 1.0); - return Math.Max(8, ratio * MaxPlotWidth); - } - } - - public string ProgressPercentageString => $"{Percentage:F1}%"; - public string TooltipText => $"{Category}: {ValueLabel} ({Percentage:F1}%)"; -} - -/// -/// Interactive ViewModel wrapping a chart in the .frypdf document. -/// Provides dynamic capabilities impossible in static binary PDFs: -/// - Smooth animated chart transitions & entry animations -/// - Interactive hover tooltips showing category, value, and share % -/// - Multi-chart support: Column Bar, Horizontal Bar, Donut/Pie, Line/Area, and Gauge -/// - Instant toggle between visual chart and underlying data table -/// - Replay animation trigger for presentations -/// -public partial class InteractiveChartViewModel : ElementViewModelBase -{ - private DispatcherTimer? _animationTimer; - private int _animationStep = 0; - private const int TotalAnimationSteps = 24; - private PdfChartElement? _sourceModel; - - public override ElementKind Kind => ElementKind.Chart; - public override string DisplayName => "Interactive Chart"; - - [ObservableProperty] - private string _title = "Chart Overview"; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(ChartTypeDescription))] - [NotifyPropertyChangedFor(nameof(IsBarColumn))] - [NotifyPropertyChangedFor(nameof(IsHorizontalBar))] - [NotifyPropertyChangedFor(nameof(IsDonutPie))] - [NotifyPropertyChangedFor(nameof(IsLineOrArea))] - [NotifyPropertyChangedFor(nameof(IsGaugeProgress))] - private ChartType _chartType = ChartType.BarColumn; - - [ObservableProperty] - private string _backgroundColorHex = "#FFFFFF"; - - [ObservableProperty] - private string _borderColorHex = "#E2E8F0"; - - [ObservableProperty] - private bool _isShowingDataTable = false; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(CenterSummaryValue))] - [NotifyPropertyChangedFor(nameof(CenterSummaryLabel))] - private InteractiveChartItem? _hoveredItem; - - [ObservableProperty] - private double _animationProgress = 1.0; - - [ObservableProperty] - private Avalonia.Media.Imaging.Bitmap? _chartBitmap; - - public ObservableCollection Items { get; } = new(); - - public string ChartTypeDescription => ChartType.ToString(); - public bool IsBarColumn => ChartType == ChartType.BarColumn; - public bool IsHorizontalBar => ChartType == ChartType.HorizontalBar; - public bool IsDonutPie => ChartType == ChartType.DonutPie; - public bool IsLineOrArea => ChartType == ChartType.Line || ChartType == ChartType.Area || ChartType == ChartType.SmoothLine; - public bool IsGaugeProgress => ChartType == ChartType.GaugeProgress; - - public double TotalSum => Items.Sum(i => i.TargetValue); - public double MaxItemValue => Items.Count > 0 ? Math.Max(1.0, Items.Max(i => i.TargetValue)) : 1.0; - - public string CenterSummaryValue => HoveredItem != null - ? HoveredItem.ValueLabel - : (TotalSum >= 1000 ? $"${TotalSum / 1000.0:F1}B" : (TotalSum > 0 ? $"${TotalSum:F1}M" : "100%")); - - public string CenterSummaryLabel => HoveredItem != null - ? HoveredItem.Category - : (IsDonutPie ? "Total ARR" : (IsGaugeProgress ? "Attainment" : "Portfolio")); - - public InteractiveChartViewModel() - { - Width = 460; - Height = 260; - ZIndex = 400; - } - - public InteractiveChartViewModel(ChartElementViewModel chartVm) - { - Id = chartVm.Id; - X = chartVm.X; - Y = chartVm.Y; - Width = chartVm.Width; - Height = chartVm.Height; - ZIndex = chartVm.ZIndex; - Rotation = chartVm.Rotation; - Opacity = chartVm.Opacity; - Title = chartVm.Title; - ChartType = chartVm.ChartType; - BackgroundColorHex = chartVm.BackgroundColorHex; - BorderColorHex = chartVm.BorderColorHex; - ChartBitmap = chartVm.ChartBitmap; - - PopulateFromBars(chartVm.Bars.Select(b => (b.Category, b.Value, b.ValueLabel, b.ColorHex))); - } - - public InteractiveChartViewModel(PdfChartElement chartModel) - { - _sourceModel = chartModel; - PopulateBaseProperties(chartModel); - LoadFromChartModel(chartModel); - } - - private void LoadFromChartModel(PdfChartElement chartModel) - { - Title = chartModel.Title; - ChartType = chartModel.ChartType; - BackgroundColorHex = chartModel.BackgroundColorHex; - BorderColorHex = chartModel.BorderColorHex; - - var palette = LiveChartsRenderer.GetPaletteHexColors(chartModel.Palette); - var barData = new List<(string Category, double Value, string ValueLabel, string ColorHex)>(); - - var categories = chartModel.Categories.Count > 0 ? chartModel.Categories : new List { "A", "B", "C", "D" }; - - for (int i = 0; i < categories.Count; i++) - { - double val = (i < chartModel.Values.Count) ? chartModel.Values[i] : 0.0; - string label = (i < chartModel.ValueLabels.Count && !string.IsNullOrWhiteSpace(chartModel.ValueLabels[i])) - ? chartModel.ValueLabels[i] - : val.ToString("N0"); - string color = (i < chartModel.BarColorsHex.Count && !string.IsNullOrWhiteSpace(chartModel.BarColorsHex[i])) - ? chartModel.BarColorsHex[i] - : palette[i % palette.Count]; - barData.Add((categories[i], val, label, color)); - } - - PopulateFromBars(barData); - - if (IsLineOrArea || ChartType == ChartType.Radar || ChartType == ChartType.PolarArea || ChartType == ChartType.ScatterPlot) - { - try - { - var pngBytes = LiveChartsRenderer.RenderChartToPngBytes(chartModel, (int)Width, (int)Height, 2.0f); - if (pngBytes.Length > 0) - { - using var ms = new System.IO.MemoryStream(pngBytes); - var oldBmp = ChartBitmap; - ChartBitmap = new Avalonia.Media.Imaging.Bitmap(ms); - oldBmp?.Dispose(); - } - } - catch - { - // Fallback gracefully in headless test environments - } - } - } - - public override PdfElementBase ToModel() - { - var model = _sourceModel ?? new PdfChartElement(); - CopyBasePropertiesTo(model); - model.Title = Title; - model.ChartType = ChartType; - model.BackgroundColorHex = BackgroundColorHex; - model.BorderColorHex = BorderColorHex; - model.Categories = Items.Select(i => i.Category).ToList(); - model.Values = Items.Select(i => i.TargetValue).ToList(); - model.ValueLabels = Items.Select(i => i.ValueLabel).ToList(); - model.BarColorsHex = Items.Select(i => i.ColorHex).ToList(); - return model; - } - - public override void LoadFromModel(PdfElementBase model) - { - if (model is PdfChartElement chart) - { - _sourceModel = chart; - PopulateBaseProperties(chart); - LoadFromChartModel(chart); - } - } - - private void PopulateFromBars(IEnumerable<(string Category, double Value, string ValueLabel, string ColorHex)> bars) - { - Items.Clear(); - var barList = bars.ToList(); - double sum = barList.Sum(b => b.Value); - double max = barList.Count > 0 ? Math.Max(1.0, barList.Max(b => b.Value)) : 1.0; - double plotHeight = Math.Max(60, Height - 80); - double plotWidth = Math.Max(80, Width - 190); - - foreach (var (cat, val, label, color) in barList) - { - double pct = sum > 0 ? (val / sum) * 100.0 : 0.0; - Items.Add(new InteractiveChartItem - { - Category = cat, - TargetValue = val, - ValueLabel = string.IsNullOrWhiteSpace(label) ? val.ToString("N0") : label, - ColorHex = color, - Percentage = pct, - MaxPlotHeight = plotHeight, - MaxPlotWidth = plotWidth, - MaxValue = max, - AnimationProgress = 1.0 - }); - } - } - - /// - /// Smoothly triggers or replays the chart entry animation. - /// - [RelayCommand] - public void ReplayAnimation() - { - _animationTimer?.Stop(); - _animationStep = 0; - AnimationProgress = 0.0; - - foreach (var item in Items) - { - item.AnimationProgress = 0.0; - } - - _animationTimer = new DispatcherTimer - { - Interval = TimeSpan.FromMilliseconds(16) // ~60 FPS - }; - - _animationTimer.Tick += (s, e) => - { - _animationStep++; - double t = (double)_animationStep / TotalAnimationSteps; - - // Ease-out cubic: 1 - (1 - t)^3 - double eased = 1.0 - Math.Pow(1.0 - t, 3.0); - AnimationProgress = Math.Clamp(eased, 0.0, 1.0); - - foreach (var item in Items) - { - item.AnimationProgress = AnimationProgress; - } - - if (_animationStep >= TotalAnimationSteps) - { - _animationTimer.Stop(); - AnimationProgress = 1.0; - foreach (var item in Items) - { - item.AnimationProgress = 1.0; - } - } - }; - - _animationTimer.Start(); - } - - /// - /// Toggles between visual chart and underlying tabular data view. - /// - [RelayCommand] - public void ToggleDataTable() - { - IsShowingDataTable = !IsShowingDataTable; - } - - [RelayCommand] - public void SetHoveredItem(InteractiveChartItem? item) - { - HoveredItem = item; - } -} diff --git a/src/PdfEditorApp/ViewModels/FryPdfViewer/InteractiveTableViewModel.cs b/src/PdfEditorApp/ViewModels/FryPdfViewer/InteractiveTableViewModel.cs deleted file mode 100644 index 5d51ec7..0000000 --- a/src/PdfEditorApp/ViewModels/FryPdfViewer/InteractiveTableViewModel.cs +++ /dev/null @@ -1,307 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Avalonia.Input.Platform; -using CommunityToolkit.Mvvm.ComponentModel; -using CommunityToolkit.Mvvm.Input; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; -using PdfEditorApp.ViewModels.ElementViewModels; - -namespace PdfEditorApp.ViewModels.FryPdfViewer; - -/// -/// Represents a row in an interactive data table with cell lookup and formatted display. -/// -public class InteractiveTableRowItem : ObservableObject -{ - public List Cells { get; } - - public InteractiveTableRowItem(IEnumerable cells) - { - Cells = cells.ToList(); - } - - public string GetCell(int index) => (index >= 0 && index < Cells.Count) ? Cells[index] : string.Empty; - - public bool MatchesFilter(string query) - { - if (string.IsNullOrWhiteSpace(query)) return true; - for (int i = 0; i < Cells.Count; i++) - { - if (Cells[i].Contains(query, StringComparison.OrdinalIgnoreCase)) - return true; - } - return false; - } -} - -/// -/// Interactive ViewModel wrapping a data table in the .frypdf document. -/// Provides capabilities impossible in static binary PDFs: -/// - Real-time in-table row search & filtering -/// - Clickable column headers with automatic ascending/descending sorting -/// - Sticky header and smooth virtualized scrolling -/// - One-click "Copy Table as CSV" to clipboard -/// - Alternating row styling & row selection highlighting -/// -public partial class InteractiveTableViewModel : ElementViewModelBase -{ - private PdfTableElement? _sourceModel; - - public override ElementKind Kind => ElementKind.Table; - public override string DisplayName => "Interactive Table"; - - [ObservableProperty] - private string _headerBackgroundHex = "#0F6CBD"; - - [ObservableProperty] - private string _headerTextHex = "#FFFFFF"; - - [ObservableProperty] - private string _alternateRowBackgroundHex = "#F8FAFC"; - - [ObservableProperty] - private string _borderColorHex = "#E2E8F0"; - - [ObservableProperty] - private string _filterQuery = ""; - - [ObservableProperty] - private int? _sortedColumnIndex = null; - - [ObservableProperty] - private bool _sortAscending = true; - - [ObservableProperty] - private InteractiveTableRowItem? _selectedRow; - - public ObservableCollection Headers { get; } = new(); - public List AllRows { get; } = new(); - public ObservableCollection DisplayedRows { get; } = new(); - - public int TotalRowCount => AllRows.Count; - public int FilteredRowCount => DisplayedRows.Count; - - public string RowCountSummary => string.IsNullOrWhiteSpace(FilterQuery) - ? $"{TotalRowCount} rows" - : $"{FilteredRowCount} of {TotalRowCount} rows match"; - - public InteractiveTableViewModel() - { - Width = 500; - Height = 240; - ZIndex = 500; - } - - public InteractiveTableViewModel(TableElementViewModel tableVm) - { - Id = tableVm.Id; - X = tableVm.X; - Y = tableVm.Y; - Width = tableVm.Width; - Height = tableVm.Height; - ZIndex = tableVm.ZIndex; - Rotation = tableVm.Rotation; - Opacity = tableVm.Opacity; - HeaderBackgroundHex = tableVm.HeaderBackgroundHex; - HeaderTextHex = tableVm.HeaderTextHex; - AlternateRowBackgroundHex = tableVm.AlternateRowBackgroundHex; - BorderColorHex = tableVm.BorderColorHex; - - foreach (var h in tableVm.Headers) - { - Headers.Add(h.Text); - } - - foreach (var r in tableVm.Rows) - { - var cellValues = r.Cells.Select(c => c.Text).ToList(); - var rowItem = new InteractiveTableRowItem(cellValues); - AllRows.Add(rowItem); - DisplayedRows.Add(rowItem); - } - } - - public InteractiveTableViewModel(PdfTableElement tableModel) - { - _sourceModel = tableModel; - PopulateBaseProperties(tableModel); - LoadFromTableModel(tableModel); - } - - private void LoadFromTableModel(PdfTableElement tableModel) - { - HeaderBackgroundHex = tableModel.HeaderBackgroundHex; - HeaderTextHex = tableModel.HeaderTextHex; - AlternateRowBackgroundHex = tableModel.AlternateRowBackgroundHex; - BorderColorHex = tableModel.BorderColorHex; - - Headers.Clear(); - foreach (var h in tableModel.Headers) - { - Headers.Add(h); - } - - AllRows.Clear(); - DisplayedRows.Clear(); - foreach (var r in tableModel.Rows) - { - var rowItem = new InteractiveTableRowItem(r); - AllRows.Add(rowItem); - DisplayedRows.Add(rowItem); - } - } - - public override PdfElementBase ToModel() - { - var model = _sourceModel ?? new PdfTableElement(); - CopyBasePropertiesTo(model); - model.HeaderBackgroundHex = HeaderBackgroundHex; - model.HeaderTextHex = HeaderTextHex; - model.AlternateRowBackgroundHex = AlternateRowBackgroundHex; - model.BorderColorHex = BorderColorHex; - model.Headers = Headers.ToList(); - model.Rows = AllRows.Select(r => r.Cells.ToList()).ToList(); - return model; - } - - public override void LoadFromModel(PdfElementBase model) - { - if (model is PdfTableElement table) - { - _sourceModel = table; - PopulateBaseProperties(table); - LoadFromTableModel(table); - } - } - - partial void OnFilterQueryChanged(string value) - { - ApplyFilterAndSort(); - } - - /// - /// Sorts the table rows by the specified column index. - /// Toggles between ascending and descending if the same column is clicked repeatedly. - /// - [RelayCommand] - public void SortByColumn(int columnIndex) - { - if (columnIndex < 0 || columnIndex >= Headers.Count) return; - - if (SortedColumnIndex == columnIndex) - { - SortAscending = !SortAscending; - } - else - { - SortedColumnIndex = columnIndex; - SortAscending = true; - } - - ApplyFilterAndSort(); - } - - /// - /// Clears the current table filter query. - /// - [RelayCommand] - public void ClearFilter() - { - FilterQuery = string.Empty; - } - - /// - /// Copies the currently filtered table data as CSV to the system clipboard. - /// - [RelayCommand] - public async Task CopyToClipboardAsync() - { - var csv = GenerateCsv(); - if (Avalonia.Application.Current?.ApplicationLifetime is Avalonia.Controls.ApplicationLifetimes.IClassicDesktopStyleApplicationLifetime desktop && desktop.MainWindow?.Clipboard != null) - { - await desktop.MainWindow.Clipboard.SetTextAsync(csv); - } - } - - /// - /// Generates a standardized comma-separated CSV string of headers and currently filtered rows. - /// - public string GenerateCsv() - { - var sb = new StringBuilder(); - - // Headers - sb.AppendLine(string.Join(",", Headers.Select(EscapeCsvValue))); - - // Rows - foreach (var row in DisplayedRows) - { - sb.AppendLine(string.Join(",", row.Cells.Select(EscapeCsvValue))); - } - - return sb.ToString(); - } - - private static string EscapeCsvValue(string? value) - { - if (string.IsNullOrEmpty(value)) return "\"\""; - if (value.Contains(',') || value.Contains('\"') || value.Contains('\n') || value.Contains('\r')) - { - return $"\"{value.Replace("\"", "\"\"")}\""; - } - return value; - } - - private void ApplyFilterAndSort() - { - IEnumerable rows = AllRows; - - if (!string.IsNullOrWhiteSpace(FilterQuery)) - { - rows = rows.Where(r => r.MatchesFilter(FilterQuery)); - } - - if (SortedColumnIndex.HasValue && SortedColumnIndex.Value < Headers.Count) - { - int colIdx = SortedColumnIndex.Value; - bool isNumeric = rows.All(r => - { - var val = r.GetCell(colIdx).Trim('$', '€', '£', '%', ' ', ','); - return double.TryParse(val, out _); - }); - - if (isNumeric) - { - rows = SortAscending - ? rows.OrderBy(r => ParseNumericCell(r.GetCell(colIdx))) - : rows.OrderByDescending(r => ParseNumericCell(r.GetCell(colIdx))); - } - else - { - rows = SortAscending - ? rows.OrderBy(r => r.GetCell(colIdx), StringComparer.CurrentCultureIgnoreCase) - : rows.OrderByDescending(r => r.GetCell(colIdx), StringComparer.CurrentCultureIgnoreCase); - } - } - - DisplayedRows.Clear(); - foreach (var r in rows) - { - DisplayedRows.Add(r); - } - - OnPropertyChanged(nameof(RowCountSummary)); - OnPropertyChanged(nameof(FilteredRowCount)); - } - - private static double ParseNumericCell(string text) - { - string cleaned = text.Trim('$', '€', '£', '%', ' ', ','); - return double.TryParse(cleaned, out var num) ? num : 0.0; - } -} diff --git a/src/PdfEditorApp/ViewModels/HelpGuideViewModel.cs b/src/PdfEditorApp/ViewModels/HelpGuideViewModel.cs deleted file mode 100644 index df0ec9d..0000000 --- a/src/PdfEditorApp/ViewModels/HelpGuideViewModel.cs +++ /dev/null @@ -1,208 +0,0 @@ -using System; -using System.Collections.ObjectModel; -using System.Linq; -using CommunityToolkit.Mvvm.ComponentModel; -using CommunityToolkit.Mvvm.Input; -using PdfEditorApp.Models; -using PdfEditorApp.Services; - -namespace PdfEditorApp.ViewModels; - -/// -/// ViewModel for the interactive Help & Guides Page in FryPDF. -/// Provides live multi-term search, category filtering, detailed step-by-step walkthroughs, pro tips, and direct tool launching. -/// -public partial class HelpGuideViewModel : ViewModelBase -{ - private readonly IHelpGuideService _helpService; - - // --- Events --- - public event Action? ToolLaunchRequested; - - // --- Observable State --- - - [ObservableProperty] - private string _searchQuery = ""; - - [ObservableProperty] - private string _selectedCategory = "All Guides"; - - [ObservableProperty] - private HelpGuideItem? _selectedGuide; - - [ObservableProperty] - private bool _isDetailViewActive; - - public ObservableCollection AllGuides { get; } = new(); - public ObservableCollection FilteredGuides { get; } = new(); - public ObservableCollection FeaturedGuides { get; } = new(); - public ObservableCollection Categories { get; } = new(); - - public int MatchingGuidesCount => FilteredGuides.Count; - public bool HasNoMatchingGuides => FilteredGuides.Count == 0; - public bool HasActiveSearch => !string.IsNullOrWhiteSpace(SearchQuery); - - public HelpGuideViewModel() : this(new HelpGuideService()) { } - - public HelpGuideViewModel(IHelpGuideService helpService) - { - _helpService = helpService ?? new HelpGuideService(); - InitializeGuides(); - } - - private void InitializeGuides() - { - AllGuides.Clear(); - FeaturedGuides.Clear(); - Categories.Clear(); - - var categories = _helpService.GetAllCategories(); - foreach (var cat in categories) - { - Categories.Add(cat); - } - - var all = _helpService.GetAllGuides(); - foreach (var item in all) - { - AllGuides.Add(item); - if (item.IsFeatured) - { - FeaturedGuides.Add(item); - } - } - - UpdateFilteredGuides(); - } - - // --- Search & Filter Synchronization --- - - partial void OnSearchQueryChanged(string value) - { - OnPropertyChanged(nameof(HasActiveSearch)); - UpdateFilteredGuides(); - } - - partial void OnSelectedCategoryChanged(string value) - { - UpdateFilteredGuides(); - } - - partial void OnSelectedGuideChanged(HelpGuideItem? value) - { - IsDetailViewActive = value != null; - } - - private void UpdateFilteredGuides() - { - FilteredGuides.Clear(); - - string query = SearchQuery.Trim(); - bool hasQuery = !string.IsNullOrWhiteSpace(query); - string category = SelectedCategory; - bool isAllCategory = string.IsNullOrWhiteSpace(category) || - category.Equals("All Guides", StringComparison.OrdinalIgnoreCase) || - category.Equals("All", StringComparison.OrdinalIgnoreCase); - - foreach (var guide in AllGuides) - { - bool matchesCategory = isAllCategory || guide.Category.Equals(category, StringComparison.OrdinalIgnoreCase); - bool matchesQuery = !hasQuery || MatchesSearch(guide, query); - - if (matchesCategory && matchesQuery) - { - FilteredGuides.Add(guide); - } - } - - OnPropertyChanged(nameof(MatchingGuidesCount)); - OnPropertyChanged(nameof(HasNoMatchingGuides)); - } - - private bool MatchesSearch(HelpGuideItem guide, string query) - { - var terms = query.Split(new[] { ' ', ',', '+', '&' }, StringSplitOptions.RemoveEmptyEntries); - if (terms.Length == 0) return true; - - string aggregate = $"{guide.Title} {guide.Summary} {guide.Description} {guide.Category} {guide.Keywords} {guide.Badge} {guide.SupportedFormats} {string.Join(" ", guide.Steps)} {string.Join(" ", guide.KeyFeatures)} {string.Join(" ", guide.ProTips)}"; - - return terms.All(term => aggregate.Contains(term, StringComparison.OrdinalIgnoreCase)); - } - - // --- Commands --- - - [RelayCommand] - public void SetCategory(string category) - { - SelectedCategory = category; - IsDetailViewActive = false; - SelectedGuide = null; - } - - [RelayCommand] - public void SelectGuide(HelpGuideItem? guide) - { - if (guide == null) return; - SelectedGuide = guide; - IsDetailViewActive = true; - } - - [RelayCommand] - public void BackToGrid() - { - SelectedGuide = null; - IsDetailViewActive = false; - } - - [RelayCommand] - public void ClearSearch() - { - SearchQuery = ""; - } - - [RelayCommand] - public void LaunchTool(HelpGuideItem? guide) - { - var target = guide ?? SelectedGuide; - if (target?.RelatedToolId.HasValue == true) - { - ToolLaunchRequested?.Invoke(target.RelatedToolId.Value); - } - } - - [RelayCommand] - public void OpenTopicById(string topicId) - { - var match = _helpService.GetGuideById(topicId); - if (match != null) - { - SelectedGuide = match; - IsDetailViewActive = true; - } - } - - [RelayCommand] - public void OpenGuideForTool(PdfToolId toolId) - { - var match = _helpService.GetGuideByToolId(toolId); - if (match != null) - { - SelectedGuide = match; - IsDetailViewActive = true; - } - } - - [RelayCommand] - public void OpenExternalLink(string? url) - { - if (string.IsNullOrWhiteSpace(url)) return; - try - { - if (Avalonia.Application.Current?.ApplicationLifetime is Avalonia.Controls.ApplicationLifetimes.IClassicDesktopStyleApplicationLifetime desktop && desktop.MainWindow?.Launcher != null) - { - _ = desktop.MainWindow.Launcher.LaunchUriAsync(new Uri(url)); - } - } - catch { } - } -} diff --git a/src/PdfEditorApp/ViewModels/HomeViewModel.cs b/src/PdfEditorApp/ViewModels/HomeViewModel.cs deleted file mode 100644 index 9567ccf..0000000 --- a/src/PdfEditorApp/ViewModels/HomeViewModel.cs +++ /dev/null @@ -1,1925 +0,0 @@ -using PdfEditorApp.Services.Tools.Core; -using PdfEditorApp.ViewModels.Tools.Core; -using PdfEditorApp.Core.Plugins; -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.IO; -using System.Linq; -using System.Threading.Tasks; -using Avalonia.Input.Platform; -using CommunityToolkit.Mvvm.ComponentModel; -using CommunityToolkit.Mvvm.Input; -using CommunityToolkit.Mvvm.Messaging; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Messages; -using PdfEditorApp.Models; -using PdfEditorApp.Services; -using PdfEditorApp.Services.Tools; -using PdfEditorApp.Templates; -using PdfEditorApp.Templates.General; -using PdfEditorApp.ViewModels.Tools; - -namespace PdfEditorApp.ViewModels; - -/// -/// ViewModel for the Google Docs, Canva, and Adobe Acrobat inspired Home / Tools Dashboard. -/// Provides a comprehensive PDF Tools Studio (all 32 tools), expandable template gallery, and recent document management. -/// -public partial class HomeViewModel : ViewModelBase, IServiceProvider -{ - private readonly IRecentDocumentsService _recentService; - private readonly ITemplateService _templateService; - private readonly IProjectPersistenceService _persistenceService; - private readonly IPdfToolRegistry _toolRegistry = null!; - private readonly IPdfToolViewModelFactory? _toolViewModelFactory; - private readonly IThemeService? _themeService; - private readonly IUiSettingsService? _uiSettingsService; - private readonly PdfEditorApp.Core.Plugins.Descriptors.INavigationRegistry? _navigationRegistry; - private readonly IServiceProvider? _serviceProvider; - - public ObservableCollection DynamicNavigationItems { get; } = new(); - - /// - /// Fully plugin-driven, grouped navigation items rendered in the sidebar. - /// Populated from by . - /// - public ObservableCollection NavGroups { get; } = new(); - - [ObservableProperty] - private object? _dynamicPageView; - - private readonly Dictionary _dynamicViewCache = new(StringComparer.OrdinalIgnoreCase); - - /// True when navigation is fully driven by the plugin registry (NavGroups is populated). - public bool IsPluginDrivenNavigation => NavGroups.Count > 0; - - // --- Events to tell the shell what to do --- - - public event Action? OpenTemplateRequested; // templateName (null = blank) - public event Action? OpenFileRequested; - public event Action? OpenWorkflowBuilderRequested; - public event Action? OpenBatchGenerationRequested; - public event Action? DocumentRenamed; // oldPath, newPath - public event Action? DocumentDeleted; // deletedPath - - // --- Observable State --- - - // Rename Dialog State - [ObservableProperty] - private bool _isRenameDialogOpen; - - [ObservableProperty] - private string _renameTargetFilePath = ""; - - [ObservableProperty] - private string _renameNewName = ""; - - [ObservableProperty] - private string _renameExtension = ""; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(HasRenameError))] - private string _renameErrorMessage = ""; - - public bool HasRenameError => !string.IsNullOrWhiteSpace(RenameErrorMessage); - - // Delete Confirmation Dialog State - [ObservableProperty] - private bool _isDeleteConfirmDialogOpen; - - [ObservableProperty] - private string _deleteTargetFilePath = ""; - - [ObservableProperty] - private string _deleteTargetFileName = ""; - - [ObservableProperty] - private bool _isDarkMode; - - [ObservableProperty] - private string _searchQuery = ""; - - [ObservableProperty] - private string _selectedToolCategory = "All"; - - [ObservableProperty] - private string _selectedTemplateCategory = "All"; - - [ObservableProperty] - private string _selectedLicenseCategory = "All"; - - [ObservableProperty] - private HomeNavSection _selectedNavSection = HomeNavSection.Home; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(IsPluginsWorkspaceActive))] - [NotifyPropertyChangedFor(nameof(IsStandardScrollableContentActive))] - private bool _isToolPageActive; - - [ObservableProperty] - private PdfToolCardViewModel? _activeToolCard; - - [ObservableProperty] - private PdfToolViewModelBase? _activeToolViewModel; - - [ObservableProperty] - private bool _isTemplateGalleryExpanded; - - public ObservableCollection AllTools { get; } = new(); - public ObservableCollection QuickTools { get; } = new(); - public ObservableCollection FilteredTools { get; } = new(); - public ObservableCollection StarredTools { get; } = new(); - public ObservableCollection AllTemplates { get; } = new(); - public ObservableCollection FilteredTemplates { get; } = new(); - public ObservableCollection FeaturedTemplates { get; } = new(); - public ObservableCollection RecentDocuments { get; } = new(); - public ObservableCollection AllLicenses { get; } = new(); - public ObservableCollection FilteredLicenses { get; } = new(); - - public PdfToolCardViewModel? WorkflowBannerCard { get; private set; } - - public PdfToolRunnerViewModel? ToolRunner { get; } - - public bool IsHomeSection => SelectedNavSection == HomeNavSection.Home; - public bool IsNewDocumentSection => SelectedNavSection == HomeNavSection.NewDocument; - public bool IsPdfReaderSection => SelectedNavSection == HomeNavSection.PdfReader; - public bool IsToolsSection => SelectedNavSection is >= HomeNavSection.AllTools and <= HomeNavSection.AiAndAutomation; - public bool IsStarredSection => SelectedNavSection == HomeNavSection.Starred; - public bool IsTrashSection => SelectedNavSection == HomeNavSection.Trash; - public bool IsLicensingSection => SelectedNavSection == HomeNavSection.Licensing; - public bool IsFontPackagesSection => SelectedNavSection == HomeNavSection.FontPackages; - public bool IsTesseractDataSection => SelectedNavSection == HomeNavSection.TesseractData; - public bool IsHelpSection => SelectedNavSection == HomeNavSection.Help; - public bool IsSettingsSection => SelectedNavSection == HomeNavSection.Settings; - public bool IsPluginsSection => SelectedNavSection == HomeNavSection.Plugins; - public bool IsPluginsWorkspaceActive => SelectedNavSection == HomeNavSection.Plugins && !IsToolPageActive; - public bool IsStandardScrollableContentActive => !IsToolPageActive && !IsPluginsWorkspaceActive; - - public FontManagerViewModel FontManager { get; } = new(); - public TesseractManagerViewModel TesseractManager { get; } = new(); - public HelpGuideViewModel HelpGuide { get; } = new(); - public SettingsViewModel Settings { get; } - public PluginsManagerViewModel PluginsManager { get; } - - public void TriggerToast(string msg, ToastNotificationType type = ToastNotificationType.Primary, string? icon = null) - { - WeakReferenceMessenger.Default.Send(new ShowToastMessage(msg, type, icon)); - } - - public int MatchingToolsCount => FilteredTools.Count; - public bool HasNoMatchingTools => FilteredTools.Count == 0; - public int MatchingTemplatesCount => FilteredTemplates.Count; - public bool HasNoMatchingTemplates => FilteredTemplates.Count == 0; - public int MatchingLicensesCount => FilteredLicenses.Count; - public bool HasNoMatchingLicenses => FilteredLicenses.Count == 0; - public bool HasRecentDocuments => RecentDocuments.Count > 0; - public bool HasStarredTools => StarredTools.Count > 0; - - // --- Constructor --- - - public HomeViewModel() : this(new RecentDocumentsService(), new TemplateService(), new ProjectPersistenceService(), new PdfToolRegistry(), null, null, new ThemeService(), new UiSettingsService(), null, null) { } - - public HomeViewModel( - IRecentDocumentsService recentService, - ITemplateService templateService, - IProjectPersistenceService persistenceService, - IPdfToolRegistry toolRegistry, - PdfToolRunnerViewModel? toolRunner = null, - IPdfToolViewModelFactory? toolViewModelFactory = null, - IThemeService? themeService = null, - IUiSettingsService? uiSettingsService = null, - PdfEditorApp.Core.Plugins.Descriptors.INavigationRegistry? navigationRegistry = null, - IServiceProvider? serviceProvider = null) - { - _recentService = recentService; - _templateService = templateService; - _persistenceService = persistenceService; - _toolRegistry = toolRegistry; - _toolViewModelFactory = toolViewModelFactory; - _themeService = themeService; - _uiSettingsService = uiSettingsService; - _navigationRegistry = navigationRegistry; - _serviceProvider = serviceProvider; - ToolRunner = toolRunner; - - Settings = new SettingsViewModel(_uiSettingsService ?? new UiSettingsService(), _themeService); - PluginsManager = (serviceProvider?.GetService(typeof(PluginsManagerViewModel)) as PluginsManagerViewModel) - ?? new PluginsManagerViewModel( - serviceProvider?.GetService(typeof(PluginHost)) as PluginHost, - serviceProvider?.GetService(typeof(PdfEditorApp.Core.Plugins.Marketplace.IPluginMarketplaceService)) as PdfEditorApp.Core.Plugins.Marketplace.IPluginMarketplaceService, - _toolRegistry); - PluginsManager.ShowToastCallback = msg => TriggerToast(msg); - - if (_themeService != null) - { - IsDarkMode = _themeService.IsDarkMode; - _themeService.ThemeChanged += (mode) => - { - IsDarkMode = _themeService.IsDarkMode; - }; - } - - if (ToolRunner != null) - { - ToolRunner.BackRequested += BackToTools; - } - - HelpGuide.ToolLaunchRequested += (id) => OpenToolPage(id); - - if (_navigationRegistry != null) - { - _navigationRegistry.RegistryChanged += RefreshDynamicNavigationItems; - RefreshDynamicNavigationItems(); - } - - if (_toolRegistry != null) - { - _toolRegistry.RegistryChanged += InitializeTools; - } - - InitializeTools(); - InitializeTemplates(); - InitializeLicenses(); - RefreshRecent(); - } - - - [RelayCommand] - public void ToggleTheme() - { - if (_themeService != null) - { - _themeService.ToggleTheme(); - IsDarkMode = _themeService.IsDarkMode; - } - else - { - IsDarkMode = !IsDarkMode; - } - } - - // --- Tools Initialization --- - - private void InitializeTools() - { - AllTools.Clear(); - var toolDefs = _toolRegistry.GetAllTools(); - - foreach (var def in toolDefs) - { - var cardVm = new PdfToolCardViewModel(def); - cardVm.ToolSelected += (id) => - { - if (id == PdfToolId.WorkflowBuilder) - { - WeakReferenceMessenger.Default.Send(new OpenWorkflowStudioMessage()); - OpenWorkflowBuilderRequested?.Invoke(); - } - else - { - OpenToolPage(id); - } - }; - cardVm.StarToggled += (id) => - { - RefreshStarredTools(); - }; - - if (def.IsWorkflowBanner) - { - WorkflowBannerCard = cardVm; - } - else - { - AllTools.Add(cardVm); - } - } - - UpdateFilteredTools(); - - QuickTools.Clear(); - var quickIds = new[] { PdfToolId.MergePdf, PdfToolId.CompressPdf, PdfToolId.PdfToWord, PdfToolId.SignPdf, PdfToolId.OcrPdf, PdfToolId.AiSummarizer }; - foreach (var qid in quickIds) - { - var match = AllTools.FirstOrDefault(t => t.Id == qid); - if (match != null) QuickTools.Add(match); - } - } - - // --- Template Initialization --- - - private void InitializeTemplates() - { - AllTemplates.Clear(); - - // 1. Blank Canvas - var blankDoc = _templateService.CreateBlankDocument(); - var blankPageVm = new PageViewModel(); - blankPageVm.LoadFromModel(blankDoc.Pages[0]); - AllTemplates.Add(new TemplateCardViewModel - { - Id = "", - Name = "Blank Canvas", - Category = "General", - Subtitle = "Clean Canvas", - Description = "Start fresh with a clean customizable canvas", - Badge = "Blank", - AccentColorHex = "#0F6CBD", - IconKind = "FilePlusOutline", - PagePreview = blankPageVm, - IsBlank = true, - IsFeatured = true, - IsLandscape = false - }); - - // 2. Templates from ITemplateService - var templateDefs = _templateService.GetAllTemplates(); - foreach (var def in templateDefs) - { - if (def is BlankDocumentTemplate) continue; - - try - { - var doc = def.Create(); - var page = doc.Pages.FirstOrDefault() ?? new PdfPageModel(); - var pageVm = new PageViewModel(); - pageVm.LoadFromModel(page); - - bool isFeatured = def.Id is "interactive_executive_deck" or "annualreport" or "invoice" or "resume" or "resumemodern" or "academic" or "mathresearch" or "physicsresearch" or "certificate" or "typographyshowcase" - or "bodmas_worksheet" or "bilingual_exam_paper" or "states_of_matter_notes" or "arduino_cheatsheet" or "factorization_worksheet"; - string subtitle = def.Id switch - { - "interactive_executive_deck" => "Interactive Landscape Deck", - "annualreport" => "Executive Summary & Charts", - "invoice" => "Itemized Billing & Terms", - "resume" => "Executive CV with Live QR", - "resumemodern" => "Two-Column Tech & Product", - "resumecreative" => "Creative Director & Portfolio", - "resumeacademic" => "Faculty Dossier & Grants", - "academic" => "2-Column Systems Research", - "mathresearch" => "Discrete Hodge Theory", - "physicsresearch" => "Cavity QED & Quantum Spin", - "historyresearch" => "Mediterranean Trade Ledgers", - "financeresearch" => "Jump-Diffusion Econometrics", - "certificate" => "Crimson & Gold Award", - "certificatenavygold" => "Navy & Gold Crest", - "diploma" => "Collegiate Degree", - "weddingtraditional" => "Marigold & Ganesha Crest", - "weddingroyalfloral" => "Botanical Laurel Wreath", - "galainvitation" => "Black-Tie Art Deco", - "typographyshowcase" => "Bézier Waves & Ink Specimen", - "bodmas_worksheet" => "BODMAS & Student Header", - "factorization_worksheet" => "150 Questions & Identities", - "bilingual_exam_paper" => "Hindi & English Exam Paper", - "states_of_matter_notes" => "Phase Cycle & Particle Models", - "quadrilaterals_guide" => "Geometric Properties & Formulas", - "arduino_cheatsheet" => "Embedded C & Pinout Map", - _ => def.Category - }; - - string badge = def.Id switch - { - "interactive_executive_deck" => "Live Deck", - "annualreport" => "Popular", - "invoice" => "Finance", - "resume" => "Executive", - "resumemodern" => "Tech", - "resumecreative" => "Design", - "resumeacademic" => "Academic", - "academic" => "Systems", - "mathresearch" => "Pure Math", - "physicsresearch" => "Quantum", - "historyresearch" => "History", - "financeresearch" => "Quant", - "certificate" => "Award", - "certificatenavygold" => "Executive", - "diploma" => "Degree", - "weddingtraditional" => "Festive", - "weddingroyalfloral" => "Luxury", - "galainvitation" => "Art Deco", - "typographyshowcase" => "Featured", - "bodmas_worksheet" => "Worksheet", - "factorization_worksheet" => "Algebra", - "bilingual_exam_paper" => "Bilingual", - "states_of_matter_notes" => "Science", - "quadrilaterals_guide" => "Geometry", - "arduino_cheatsheet" => "Cheat Sheet", - _ => def.Category - }; - - AllTemplates.Add(new TemplateCardViewModel - { - Id = def.Id, - Name = def.Name, - Category = def.Category, - Subtitle = subtitle, - Description = def.Description, - Badge = badge, - AccentColorHex = def.AccentColorHex, - IconKind = def.IconKind, - PagePreview = pageVm, - IsBlank = false, - IsFeatured = isFeatured, - IsLandscape = page.Orientation == PageOrientation.Landscape || page.Width > page.Height - }); - } - catch - { - // Fallback for safe startup - } - } - - UpdateFilteredTemplates(); - } - - // --- Search & Filter Synchronization --- - - partial void OnSearchQueryChanged(string value) - { - UpdateFilteredTools(); - UpdateFilteredTemplates(); - UpdateFilteredLicenses(); - } - - partial void OnSelectedToolCategoryChanged(string value) => UpdateFilteredTools(); - partial void OnSelectedTemplateCategoryChanged(string value) => UpdateFilteredTemplates(); - partial void OnSelectedLicenseCategoryChanged(string value) => UpdateFilteredLicenses(); - - partial void OnSelectedNavSectionChanged(HomeNavSection value) - { - OnPropertyChanged(nameof(IsHomeSection)); - OnPropertyChanged(nameof(IsNewDocumentSection)); - OnPropertyChanged(nameof(IsPdfReaderSection)); - OnPropertyChanged(nameof(IsToolsSection)); - OnPropertyChanged(nameof(IsStarredSection)); - OnPropertyChanged(nameof(IsTrashSection)); - OnPropertyChanged(nameof(IsLicensingSection)); - OnPropertyChanged(nameof(IsFontPackagesSection)); - OnPropertyChanged(nameof(IsTesseractDataSection)); - OnPropertyChanged(nameof(IsHelpSection)); - OnPropertyChanged(nameof(IsSettingsSection)); - OnPropertyChanged(nameof(IsPluginsSection)); - OnPropertyChanged(nameof(IsPluginsWorkspaceActive)); - OnPropertyChanged(nameof(IsStandardScrollableContentActive)); - - if (value == HomeNavSection.TesseractData) - { - _ = TesseractManager.RefreshStatsAsync(); - } - } - - [RelayCommand] - public void OpenHelpGuide(string? topicId = null) - { - SelectedNavSection = HomeNavSection.Help; - IsToolPageActive = false; - DynamicPageView = null; - if (!string.IsNullOrWhiteSpace(topicId)) - { - HelpGuide.OpenTopicById(topicId); - } - else - { - HelpGuide.BackToGrid(); - } - } - - [RelayCommand] - public void OpenHelpForTool(PdfToolId toolId) - { - SelectedNavSection = HomeNavSection.Help; - IsToolPageActive = false; - DynamicPageView = null; - HelpGuide.OpenGuideForTool(toolId); - } - - private void UpdateFilteredTools() - { - FilteredTools.Clear(); - foreach (var tool in AllTools) - { - if (MatchesToolCategory(tool) && MatchesToolSearch(tool)) - { - FilteredTools.Add(tool); - } - } - - OnPropertyChanged(nameof(MatchingToolsCount)); - OnPropertyChanged(nameof(HasNoMatchingTools)); - } - - private bool MatchesToolCategory(PdfToolCardViewModel card) - { - if (SelectedToolCategory == "All") return true; - - return SelectedToolCategory switch - { - "Organize & Page" => card.Category == PdfToolCategory.OrganizeAndPage, - "Optimize & Security" => card.Category == PdfToolCategory.OptimizeAndSecurity, - "Convert from PDF" => card.Category == PdfToolCategory.ConvertFromPdf, - "Convert to PDF" => card.Category == PdfToolCategory.ConvertToPdf, - "Edit & Forms" => card.Category == PdfToolCategory.EditAndForms, - "AI & Automation" => card.Category == PdfToolCategory.AiAndAutomation, - _ => true - }; - } - - private bool MatchesToolSearch(PdfToolCardViewModel card) - { - if (string.IsNullOrWhiteSpace(SearchQuery)) return true; - var q = SearchQuery.Trim(); - return card.Name.Contains(q, StringComparison.OrdinalIgnoreCase) - || card.Description.Contains(q, StringComparison.OrdinalIgnoreCase) - || card.CategoryDisplayName.Contains(q, StringComparison.OrdinalIgnoreCase); - } - - private void UpdateFilteredTemplates() - { - FilteredTemplates.Clear(); - FeaturedTemplates.Clear(); - - foreach (var t in AllTemplates) - { - if (MatchesTemplateFilter(t)) - { - FilteredTemplates.Add(t); - if (t.IsFeatured) - { - FeaturedTemplates.Add(t); - } - } - } - - if (FeaturedTemplates.Count == 0 && FilteredTemplates.Count > 0) - { - foreach (var t in FilteredTemplates) - { - FeaturedTemplates.Add(t); - } - } - - OnPropertyChanged(nameof(MatchingTemplatesCount)); - OnPropertyChanged(nameof(HasNoMatchingTemplates)); - } - - private bool MatchesTemplateFilter(TemplateCardViewModel card) - { - if (SelectedTemplateCategory != "All" && - !string.Equals(SelectedTemplateCategory, card.Category, StringComparison.OrdinalIgnoreCase)) - return false; - - if (string.IsNullOrWhiteSpace(SearchQuery)) return true; - - var q = SearchQuery.Trim(); - return card.Name.Contains(q, StringComparison.OrdinalIgnoreCase) - || card.Description.Contains(q, StringComparison.OrdinalIgnoreCase) - || card.Category.Contains(q, StringComparison.OrdinalIgnoreCase) - || card.Subtitle.Contains(q, StringComparison.OrdinalIgnoreCase); - } - - // --- Commands --- - - [RelayCommand] - public void SetToolCategory(string? category) - { - SelectedToolCategory = string.IsNullOrWhiteSpace(category) ? "All" : category; - } - - [RelayCommand] - public void SetTemplateCategory(string? category) - { - SelectedTemplateCategory = string.IsNullOrWhiteSpace(category) ? "All" : category; - } - - [RelayCommand] - public void ClearSearch() - { - SearchQuery = ""; - } - - [RelayCommand] - public void ToggleTemplateGallery() - { - IsTemplateGalleryExpanded = !IsTemplateGalleryExpanded; - } - - [RelayCommand] - public void CollapseTemplateGallery() - { - IsTemplateGalleryExpanded = false; - } - - [RelayCommand] - public void ClearTemplateSearch() - { - SearchQuery = ""; - SelectedTemplateCategory = "All"; - UpdateFilteredTools(); - UpdateFilteredTemplates(); - } - - // Kept for backward-compatibility with unit tests that assert on ContributedNavigationItems - public ObservableCollection ContributedNavigationItems { get; } = new(); - - public void RefreshDynamicNavigationItems() - { - if (_navigationRegistry == null) return; - - DynamicNavigationItems.Clear(); - ContributedNavigationItems.Clear(); - NavGroups.Clear(); - - var allItems = _navigationRegistry.GetAllItems(); - var currentSectionId = SelectedNavSection.ToString(); - - // Flat list (for active-state tracking) - foreach (var desc in allItems) - { - var item = new NavigationItemViewModel(desc) - { - IsActive = string.Equals(desc.Id, currentSectionId, StringComparison.OrdinalIgnoreCase) - }; - DynamicNavigationItems.Add(item); - - // Contributed = items NOT in the built-in standard set (for legacy EXTENSIONS section) - if (!StandardNavSectionIds.Contains(desc.Id)) - { - ContributedNavigationItems.Add(item); - } - } - - // Grouped list (for fully plugin-driven sidebar rendering) - var groups = allItems - .GroupBy(d => d.Group) - .OrderBy(g => allItems.First(d => d.Group == g.Key).Order) - .Select(g => - { - var items = g - .OrderBy(d => d.Order) - .Select(d => DynamicNavigationItems.First(v => v.Id == d.Id)) - .ToList(); - return new NavGroupViewModel(g.Key, items); - }) - .ToList(); - - foreach (var group in groups) - { - NavGroups.Add(group); - } - - OnPropertyChanged(nameof(IsPluginDrivenNavigation)); - } - - - private static readonly HashSet StandardNavSectionIds = new(StringComparer.OrdinalIgnoreCase) - { - "Home", "PdfReader", "NewDocument", "AllTools", "OrganizeAndPage", "OptimizeAndSecurity", - "ConvertFromPdf", "ConvertToPdf", "EditAndForms", "AiAndAutomation", "Starred", - "FontPackages", "TesseractData", "Trash", "Help", "Licensing", "Settings", "Plugins" - }; - - [RelayCommand] - public void SelectNavSection(string sectionName) - { - // Special case for Plugins: HomeView hosts a dedicated full-viewport PluginsManagerPageView - if (string.Equals(sectionName, "Plugins", StringComparison.OrdinalIgnoreCase)) - { - DynamicPageView = null; - } - else if (_navigationRegistry != null) - { - var desc = _navigationRegistry.GetItem(sectionName); - if (desc?.ViewFactory != null) - { - if (!_dynamicViewCache.TryGetValue(sectionName, out var cachedView)) - { - try - { - var sp = _serviceProvider ?? (IServiceProvider)this; - cachedView = desc.ViewFactory(sp); - _dynamicViewCache[sectionName] = cachedView; - } - catch (Exception ex) - { - System.Diagnostics.Debug.WriteLine($"[HomeViewModel] Failed to create plugin view for '{sectionName}': {ex}"); - cachedView = null; - } - } - DynamicPageView = cachedView; - } - else - { - DynamicPageView = null; - } - } - else - { - DynamicPageView = null; - } - - // Update active states across all flat nav items - foreach (var item in DynamicNavigationItems) - { - item.IsActive = string.Equals(item.Id, sectionName, StringComparison.OrdinalIgnoreCase); - } - - if (IsToolPageActive) - { - BackToTools(); - } - - if (Enum.TryParse(sectionName, true, out var section)) - { - SelectedNavSection = section; - - if (section == HomeNavSection.NewDocument) - { - IsTemplateGalleryExpanded = true; - } - - // Automatically set tool category filter according to selected section - var category = section switch - { - HomeNavSection.OrganizeAndPage => "Organize & Page", - HomeNavSection.OptimizeAndSecurity => "Optimize & Security", - HomeNavSection.ConvertFromPdf => "Convert from PDF", - HomeNavSection.ConvertToPdf => "Convert to PDF", - HomeNavSection.EditAndForms => "Edit & Forms", - HomeNavSection.AiAndAutomation => "AI & Automation", - _ => "All" - }; - - if (SelectedToolCategory != category) - { - SelectedToolCategory = category; - } - else - { - UpdateFilteredTools(); - } - } - } - - - [RelayCommand] - public void OpenToolPage(PdfToolId toolId) - { - OpenToolPage(toolId, null); - } - - public void OpenToolPage(PdfToolId toolId, string? initialFilePath = null) - { - if (toolId == PdfToolId.BatchMailMerge) - { - WeakReferenceMessenger.Default.Send(new OpenBatchGenerationMessage()); - OpenBatchGenerationRequested?.Invoke(); - return; - } - - var card = AllTools.FirstOrDefault(t => t.Id == toolId); - if (card != null) - { - ActiveToolCard = card; - IsToolPageActive = true; - - if (_toolViewModelFactory != null) - { - if (ActiveToolViewModel != null) - { - ActiveToolViewModel.BackRequested -= BackToTools; - ActiveToolViewModel.NavigateToToolRequested -= OnToolNavigateToToolRequested; - ActiveToolViewModel.HelpGuideRequested -= OnToolHelpGuideRequested; - } - - ActiveToolViewModel = _toolViewModelFactory.Create(toolId); - ActiveToolViewModel.StorageProvider = MainViewModel.StorageProvider; - ActiveToolViewModel.IsToolStarred = card.IsStarred; - if (!string.IsNullOrEmpty(initialFilePath)) - { - ActiveToolViewModel.SetupInitialFiles(new[] { initialFilePath }); - } - ActiveToolViewModel.BackRequested += BackToTools; - ActiveToolViewModel.NavigateToToolRequested += OnToolNavigateToToolRequested; - ActiveToolViewModel.HelpGuideRequested += OnToolHelpGuideRequested; - ActiveToolViewModel.PropertyChanged += (s, e) => - { - if (e.PropertyName == nameof(PdfToolViewModelBase.IsToolStarred) && ActiveToolCard != null && ActiveToolViewModel != null) - { - if (ActiveToolCard.IsStarred != ActiveToolViewModel.IsToolStarred) - { - ActiveToolCard.ToggleStar(); - RefreshStarredTools(); - } - } - }; - } - } - } - - private void OnToolNavigateToToolRequested(PdfToolId nextToolId, string targetFile) - { - OpenToolPage(nextToolId, targetFile); - } - - private void OnToolHelpGuideRequested(PdfToolId toolId) - { - OpenHelpForTool(toolId); - } - - [RelayCommand] - public void BackToTools() - { - IsToolPageActive = false; - ActiveToolCard = null; - if (ActiveToolViewModel != null) - { - ActiveToolViewModel.BackRequested -= BackToTools; - ActiveToolViewModel.NavigateToToolRequested -= OnToolNavigateToToolRequested; - ActiveToolViewModel.HelpGuideRequested -= OnToolHelpGuideRequested; - ActiveToolViewModel = null; - } - } - - [RelayCommand] - public void ToggleStarActiveTool() - { - if (ActiveToolCard != null) - { - ActiveToolCard.ToggleStar(); - if (ActiveToolViewModel != null) - { - ActiveToolViewModel.IsToolStarred = ActiveToolCard.IsStarred; - } - if (ToolRunner != null) - { - ToolRunner.IsToolStarred = ActiveToolCard.IsStarred; - } - RefreshStarredTools(); - } - } - - public void RefreshStarredTools() - { - StarredTools.Clear(); - foreach (var tool in AllTools.Where(t => t.IsStarred)) - { - StarredTools.Add(tool); - } - OnPropertyChanged(nameof(HasStarredTools)); - } - - [RelayCommand] - public void SelectTool(PdfToolId toolId) - { - if (toolId == PdfToolId.WorkflowBuilder) - { - WeakReferenceMessenger.Default.Send(new OpenWorkflowStudioMessage()); - OpenWorkflowBuilderRequested?.Invoke(); - } - else - { - OpenToolPage(toolId); - } - } - - [RelayCommand] - public void OpenWorkflowBuilder() - { - WeakReferenceMessenger.Default.Send(new OpenWorkflowStudioMessage()); - OpenWorkflowBuilderRequested?.Invoke(); - } - - [RelayCommand] - public void SelectTemplate(string? templateName) - { - WeakReferenceMessenger.Default.Send(new OpenTemplateMessage(templateName)); - OpenTemplateRequested?.Invoke(templateName); - } - - [RelayCommand] - public void OpenFile() - { - WeakReferenceMessenger.Default.Send(new OpenProjectFileMessage()); - OpenFileRequested?.Invoke(); - } - - [RelayCommand] - public void OpenRecent(string filePath) - { - WeakReferenceMessenger.Default.Send(new OpenInEditorMessage(filePath)); - } - - [RelayCommand] - public void OpenInViewer(string? filePath) - { - var path = filePath ?? string.Empty; - WeakReferenceMessenger.Default.Send(new OpenInViewerMessage(path)); - } - - [RelayCommand] - public void OpenInInteractiveViewer(string? filePath) - { - var path = filePath ?? string.Empty; - WeakReferenceMessenger.Default.Send(new OpenInFryPdfViewerMessage(path)); - } - - [RelayCommand] - public void LaunchInteractiveDeck() - { - WeakReferenceMessenger.Default.Send(new LaunchInteractiveDeckMessage()); - } - - [RelayCommand] - public void PromptRename(string? filePath) - { - if (string.IsNullOrWhiteSpace(filePath)) return; - RenameTargetFilePath = filePath; - RenameNewName = Path.GetFileNameWithoutExtension(filePath); - RenameExtension = Path.GetExtension(filePath); - RenameErrorMessage = ""; - IsRenameDialogOpen = true; - } - - [RelayCommand] - public void ConfirmRename() - { - if (!FileOperationHelper.RenameFile(RenameTargetFilePath, RenameNewName, out var newPath, out var error)) - { - RenameErrorMessage = error ?? "Failed to rename document."; - return; - } - - var oldPath = RenameTargetFilePath; - var finalNewPath = newPath!; - var newTitle = Path.GetFileName(finalNewPath); - - _recentService.Rename(oldPath, finalNewPath, newTitle); - RefreshRecent(); - - IsRenameDialogOpen = false; - WeakReferenceMessenger.Default.Send(new ProjectRenamedMessage(oldPath, finalNewPath)); - DocumentRenamed?.Invoke(oldPath, finalNewPath); - TriggerToast($"Renamed to {newTitle}", ToastNotificationType.Success, "PencilOutline"); - } - - [RelayCommand] - public void CancelRename() - { - IsRenameDialogOpen = false; - RenameErrorMessage = ""; - } - - [RelayCommand] - public void PromptDelete(string? filePath) - { - if (string.IsNullOrWhiteSpace(filePath)) return; - DeleteTargetFilePath = filePath; - DeleteTargetFileName = Path.GetFileName(filePath); - IsDeleteConfirmDialogOpen = true; - } - - [RelayCommand] - public void ConfirmDelete() - { - var targetPath = DeleteTargetFilePath; - var targetName = DeleteTargetFileName; - IsDeleteConfirmDialogOpen = false; - - if (!FileOperationHelper.DeleteFile(targetPath, out var error)) - { - TriggerToast($"Could not delete file: {error}", ToastNotificationType.Danger, "AlertCircleOutline"); - return; - } - - _recentService.Remove(targetPath); - RefreshRecent(); - WeakReferenceMessenger.Default.Send(new ProjectDeletedMessage(targetPath)); - DocumentDeleted?.Invoke(targetPath); - TriggerToast($"Deleted {targetName}", ToastNotificationType.Success, "TrashCanOutline"); - } - - [RelayCommand] - public void CancelDelete() - { - IsDeleteConfirmDialogOpen = false; - } - - [RelayCommand] - public void DuplicateDocument(string? filePath) - { - if (string.IsNullOrWhiteSpace(filePath)) return; - if (!FileOperationHelper.DuplicateFile(filePath, out var newPath, out var error)) - { - TriggerToast($"Could not duplicate document: {error}", ToastNotificationType.Danger, "AlertCircleOutline"); - return; - } - - var copyTitle = Path.GetFileName(newPath!); - _recentService.Add(new RecentDocumentItem - { - FilePath = newPath!, - Title = copyTitle, - LastOpened = DateTime.UtcNow - }); - RefreshRecent(); - TriggerToast($"Created duplicate: {copyTitle}", ToastNotificationType.Success, "ContentCopy"); - } - - [RelayCommand] - public void RevealInFileManager(string? filePath) - { - if (string.IsNullOrWhiteSpace(filePath)) return; - if (!FileOperationHelper.RevealInFileManager(filePath, out var error)) - { - TriggerToast($"Could not reveal file: {error}", ToastNotificationType.Danger, "AlertCircleOutline"); - return; - } - TriggerToast("Opened containing folder", ToastNotificationType.Primary, "FolderOpenOutline"); - } - - [RelayCommand] - public async Task CopyPath(string? filePath) - { - if (string.IsNullOrWhiteSpace(filePath)) return; - await CopyToClipboardAsync(filePath); - TriggerToast("Copied file path to clipboard", ToastNotificationType.Primary, "ClipboardTextOutline"); - } - - [RelayCommand] - public void RemoveRecent(string filePath) - { - _recentService.Remove(filePath); - RefreshRecent(); - TriggerToast("Removed from recent documents", ToastNotificationType.Primary, "BookmarkRemoveOutline"); - } - - [RelayCommand] - public void ClearRecent() - { - _recentService.Clear(); - RefreshRecent(); - TriggerToast("Cleared recent document history", ToastNotificationType.Primary, "TrashCanOutline"); - } - - // --- Licensing & Third-Party Open Source Initialization --- - - private void InitializeLicenses() - { - AllLicenses.Clear(); - - AllLicenses.Add(new ThirdPartyToolLicense - { - Name = "Avalonia UI", - Version = "12.1.1", - LicenseType = "MIT License", - Category = "UI & Graphics Frameworks", - Purpose = "Core cross-platform modern XAML UI application framework providing high-performance GPU-accelerated graphics, styling, smooth vector transitions, and native window management on macOS, Windows, and Linux.", - Maintainer = "AvaloniaUI Team & .NET Foundation Community", - ProjectUrl = "https://avaloniaui.net", - IconKind = "ApplicationOutline", - AccentColorHex = "#7029E6", - LicenseText = """ -MIT License - -Copyright (c) 2014-2026 AvaloniaUI OÜ - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -""" - }); - - AllLicenses.Add(new ThirdPartyToolLicense - { - Name = "QuestPDF", - Version = "2026.8.0", - LicenseType = "Community / MIT", - Category = "PDF & Document Engines", - Purpose = "High-performance vector PDF rendering and generation engine utilizing fluent layout APIs, smart pagination, table structures, vector shapes, and sub-millimeter typographical accuracy.", - Maintainer = "Marcin Ziąbek & QuestPDF Contributors", - ProjectUrl = "https://www.questpdf.com", - IconKind = "FilePdfBox", - AccentColorHex = "#FF4500", - LicenseText = """ -QuestPDF Community License / MIT License - -Copyright (c) 2020-2026 Marcin Ziąbek - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -""" - }); - - AllLicenses.Add(new ThirdPartyToolLicense - { - Name = "PdfPig & Skia Rendering", - Version = "0.1.16.1", - LicenseType = "Apache 2.0", - Category = "PDF & Document Engines", - Purpose = "Pure C# low-level PDF parsing and extraction engine. Extracts structured text glyphs, font matrices, bounding boxes, vector curves, and rasterizes high-fidelity pages to Skia surfaces for the PDF viewer.", - Maintainer = "Eli White (UglyToad) & Open Source Contributors", - ProjectUrl = "https://github.com/UglyToad/PdfPig", - IconKind = "VectorCircle", - AccentColorHex = "#0284C7", - LicenseText = """ -Apache License -Version 2.0, January 2004 -http://www.apache.org/licenses/ - -Copyright 2018-2026 UglyToad (Eli White) and contributors - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -""" - }); - - AllLicenses.Add(new ThirdPartyToolLicense - { - Name = "PdfSharpCore", - Version = "1.3.67", - LicenseType = "MIT License", - Category = "PDF & Document Engines", - Purpose = "Low-level PDF manipulation engine handling direct binary page extraction, PDF merging, page splitting, rotation, AES-128/256 document security encryption, metadata injection, and Bates stamping.", - Maintainer = "Stefan Lange, empira Software & Community", - ProjectUrl = "https://github.com/stefan-lange/pdfsharpcore", - IconKind = "ShieldLockOutline", - AccentColorHex = "#10B981", - LicenseText = """ -MIT License - -Copyright (c) 2005-2026 empira Software GmbH, Troisdorf (Germany) -Copyright (c) 2017-2026 Stefan Lange and PdfSharpCore contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -""" - }); - - AllLicenses.Add(new ThirdPartyToolLicense - { - Name = "SkiaSharp", - Version = "3.116.1", - LicenseType = "MIT License", - Category = "UI & Graphics Frameworks", - Purpose = "Cross-platform 2D graphics API based on Google's Skia Graphics Library. Powers fluid continuous canvas zooming, anti-aliased Bézier curve evaluation, sub-pixel text rendering, and image caching.", - Maintainer = "Mono Project & .NET Foundation", - ProjectUrl = "https://github.com/mono/SkiaSharp", - IconKind = "Draw", - AccentColorHex = "#0EA5E9", - LicenseText = """ -MIT License - -Copyright (c) 2015-2026 Xamarin Inc. -Copyright (c) 2017-2026 Microsoft Corporation - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -""" - }); - - AllLicenses.Add(new ThirdPartyToolLicense - { - Name = "Tabula Table Extractor", - Version = "1.0.1", - LicenseType = "MIT License", - Category = "Office & Data Formats", - Purpose = "Spatial table extraction engine that detects table boundaries, cell grids, columns, and data coordinates from unstructured PDF documents for CSV, JSON, and Excel tabular conversions.", - Maintainer = "Manuel Aristarán & Tabula Contributors", - ProjectUrl = "https://github.com/tabulapdf/tabula-java", - IconKind = "Table", - AccentColorHex = "#F59E0B", - LicenseText = """ -MIT License - -Copyright (c) 2014-2026 Manuel Aristarán, Mike Tigas, and Jeremy B. Merrill - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -""" - }); - - AllLicenses.Add(new ThirdPartyToolLicense - { - Name = "DocumentFormat.OpenXml", - Version = "3.5.1", - LicenseType = "MIT License", - Category = "Office & Data Formats", - Purpose = "High-speed OpenXML engine for reading, parsing, and exporting structured Microsoft Word (.docx), Excel (.xlsx), and PowerPoint (.pptx) documents from converted PDF files.", - Maintainer = "Microsoft Corporation & .NET Foundation", - ProjectUrl = "https://github.com/dotnet/Open-XML-SDK", - IconKind = "FileWordOutline", - AccentColorHex = "#2563EB", - LicenseText = """ -MIT License - -Copyright (c) Microsoft Corporation. All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -""" - }); - - AllLicenses.Add(new ThirdPartyToolLicense - { - Name = "Material.Icons.Avalonia", - Version = "3.0.2", - LicenseType = "MIT License", - Category = "UI & Graphics Frameworks", - Purpose = "Vector iconography library supplying thousands of scalable Material Design icon glyphs across toolbars, ribbon bars, inspectors, tool cards, and dialogs.", - Maintainer = "SKFox5330 & Pictogrammers Community", - ProjectUrl = "https://github.com/SKFox5330/Material.Icons.Avalonia", - IconKind = "StarFourPointsOutline", - AccentColorHex = "#8B5CF6", - LicenseText = """ -MIT License - -Copyright (c) 2020-2026 SKFox5330 & Pictogrammers - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -""" - }); - - AllLicenses.Add(new ThirdPartyToolLicense - { - Name = "CommunityToolkit.Mvvm", - Version = "8.4.2", - LicenseType = "MIT License", - Category = "Architecture & Runtime", - Purpose = "Official Microsoft .NET Community Toolkit MVVM framework providing high-performance source-generated ObservableObject, RelayCommand, and reactive property notifications.", - Maintainer = "Microsoft Corporation & Community Toolkit Team", - ProjectUrl = "https://github.com/CommunityToolkit/dotnet", - IconKind = "LightningBoltOutline", - AccentColorHex = "#6366F1", - LicenseText = """ -MIT License - -Copyright (c) .NET Foundation and Contributors. All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -""" - }); - - AllLicenses.Add(new ThirdPartyToolLicense - { - Name = "QRCoder", - Version = "1.8.0", - LicenseType = "MIT License", - Category = "Office & Data Formats", - Purpose = "Pure C# QR code generating library powering dynamic vector URL, Wi-Fi, vCard, SMS, Email, Crypto, and plain text QR code elements in FryPDF document authoring.", - Maintainer = "Raffael Herrmann (codebude) & Contributors", - ProjectUrl = "https://github.com/codebude/QRCoder", - IconKind = "Qrcode", - AccentColorHex = "#EC4899", - LicenseText = """ -MIT License - -Copyright (c) 2013-2026 Raffael Herrmann - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -""" - }); - - AllLicenses.Add(new ThirdPartyToolLicense - { - Name = "Microsoft.Extensions.DependencyInjection", - Version = "10.0.11", - LicenseType = "MIT License", - Category = "Architecture & Runtime", - Purpose = "High-performance Inversion of Control (IoC) dependency injection container powering modular service registration, loose coupling, and decoupled testing across all 32 PDF tools.", - Maintainer = "Microsoft Corporation & .NET Runtime Team", - ProjectUrl = "https://github.com/dotnet/runtime", - IconKind = "ToyBrickOutline", - AccentColorHex = "#0078D4", - LicenseText = """ -MIT License - -Copyright (c) .NET Foundation and Contributors. All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -""" - }); - - AllLicenses.Add(new ThirdPartyToolLicense - { - Name = ".NET 10 Runtime & Base Libraries", - Version = "10.0", - LicenseType = "MIT License", - Category = "Architecture & Runtime", - Purpose = "Modern cross-platform .NET 10 runtime engine providing hardware-accelerated SIMD (AVX/NEON) vector mathematics, AES-256 cryptography primitives, Task-based asynchronous I/O, and garbage collection.", - Maintainer = "Microsoft Corporation & .NET Foundation", - ProjectUrl = "https://dotnet.microsoft.com", - IconKind = "Microsoft", - AccentColorHex = "#512BD4", - LicenseText = """ -MIT License - -Copyright (c) .NET Foundation and Contributors. All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -""" - }); - - AllLicenses.Add(new ThirdPartyToolLicense - { - Name = "LiveChartsCore & LiveChartsCore.SkiaSharpView", - Version = "2.0.5", - LicenseType = "MIT License", - Category = "UI & Graphics Frameworks", - Purpose = "Modern, fluid, and hardware-accelerated charting library for .NET. Renders high-performance bar charts, line graphs, and pie/doughnut charts with SkiaSharp integration directly into PDF documents and vector canvases.", - Maintainer = "Alberto Rodriguez (beto-rodriguez) & LiveCharts Contributors", - ProjectUrl = "https://github.com/beto-rodriguez/LiveCharts2", - IconKind = "ChartBoxOutline", - AccentColorHex = "#3B82F6", - LicenseText = """ -MIT License - -Copyright (c) 2020-2026 Alberto Rodriguez - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -""" - }); - - AllLicenses.Add(new ThirdPartyToolLicense - { - Name = "Microsoft.Extensions.Logging.Abstractions", - Version = "10.0.1", - LicenseType = "MIT License", - Category = "Architecture & Runtime", - Purpose = "Structured logging abstractions and diagnostic interfaces for .NET. Powers logging pipelines, diagnostic tracing, and pipeline telemetry across core PDF deconstruction, OCR processing, and document layout engines.", - Maintainer = "Microsoft Corporation & .NET Foundation", - ProjectUrl = "https://github.com/dotnet/runtime", - IconKind = "FormatListBulleted", - AccentColorHex = "#2563EB", - LicenseText = """ -MIT License - -Copyright (c) .NET Foundation and Contributors. All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -""" - }); - - AllLicenses.Add(new ThirdPartyToolLicense - { - Name = "SIL Open Font License (OFL 1.1) Typeface Collection", - Version = "1.1", - LicenseType = "SIL OFL 1.1", - Category = "Typography & Typefaces", - Purpose = "Comprehensive open-source multilingual font collection powering FryPDF typography, including Google Noto Sans (Devanagari, Tamil, Telugu, Bengali, Gujarati, Kannada, Malayalam, Arabic, Urdu, Hebrew, Thai, Lao, Khmer, Myanmar, Sinhala, CJK), Inter, Poppins, Montserrat, Raleway, Lato, Fira Code, Caveat, Orbitron, and Oswald.", - Maintainer = "SIL International, Google Fonts & Type Designers", - ProjectUrl = "https://scripts.sil.org/OFL", - IconKind = "FormatFont", - AccentColorHex = "#D946EF", - LicenseText = """ -SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 - -PREAMBLE -The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others. - -The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives. - -PERMISSION & CONDITIONS -Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions: - -1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself. -2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. -3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. -4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission. -5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. - -TERMINATION -This license becomes null and void if any of the above conditions are not met. - -DISCLAIMER -THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. -""" - }); - - AllLicenses.Add(new ThirdPartyToolLicense - { - Name = "Roboto & Roboto Mono Font Family", - Version = "2.138", - LicenseType = "Apache 2.0", - Category = "Typography & Typefaces", - Purpose = "Google's flagship sans-serif and monospaced typefaces designed by Christian Robertson. Serves as the primary document reader font, technical tables, code spans, and corporate report templates.", - Maintainer = "Google LLC & Christian Robertson", - ProjectUrl = "https://github.com/googlefonts/roboto", - IconKind = "FormatText", - AccentColorHex = "#EA4335", - LicenseText = """ -Apache License -Version 2.0, January 2004 -http://www.apache.org/licenses/ - -Copyright 2011 Google Inc. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -""" - }); - - AllLicenses.Add(new ThirdPartyToolLicense - { - Name = "Ubuntu Font Family", - Version = "0.83", - LicenseType = "Ubuntu Font Licence 1.0", - Category = "Typography & Typefaces", - Purpose = "Distinctive contemporary humanist sans-serif typeface designed by Dalton Maag for Canonical Ltd. Included in the Creative & Design typography package for modern headings, branded certificates, and flyers.", - Maintainer = "Canonical Ltd & Dalton Maag", - ProjectUrl = "https://design.ubuntu.com/font/", - IconKind = "Alphabetical", - AccentColorHex = "#E95420", - LicenseText = """ -Ubuntu Font Licence - Version 1.0 -https://ubuntu.com/legal/font-licence - -Copyright 2010 Canonical Ltd. -Licensed under the Ubuntu Font Licence version 1.0. - -Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions: - -1. Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself. -2. Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. -3. No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. -4. The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version. -5. The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license. - -THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -""" - }); - - AllLicenses.Add(new ThirdPartyToolLicense - { - Name = "Microsoft.Extensions.AI & OpenAI", - Version = "10.9.0", - LicenseType = "MIT License", - Category = "AI & Document Intelligence", - Purpose = "Official Microsoft unified AI abstractions and OpenAI connector enabling autonomous AI studio agent workflows, generative PDF document composition from natural language prompts, text summarization, and neural translation.", - Maintainer = "Microsoft Corporation & .NET AI Team", - ProjectUrl = "https://github.com/dotnet/extensions", - IconKind = "RobotOutline", - AccentColorHex = "#6366F1", - LicenseText = """ -MIT License - -Copyright (c) .NET Foundation and Contributors. All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -""" - }); - - AllLicenses.Add(new ThirdPartyToolLicense - { - Name = "OllamaSharp", - Version = "5.4.30", - LicenseType = "MIT License", - Category = "AI & Document Intelligence", - Purpose = "High-performance .NET API client for Ollama enabling 100% private, offline, and zero-telemetry local LLM inference (Llama 3.2, Mistral, Gemma, Phi-3) to create PDF documents and analyze text locally on CPU/GPU hardware.", - Maintainer = "Andreas Müller (awaescher) & Open Source Community", - ProjectUrl = "https://github.com/awaescher/OllamaSharp", - IconKind = "LaptopAccount", - AccentColorHex = "#EC4899", - LicenseText = """ -MIT License - -Copyright (c) 2023-2026 Andreas Müller - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -""" - }); - - AllLicenses.Add(new ThirdPartyToolLicense - { - Name = "Tesseract OCR Engine", - Version = "5.4.0", - LicenseType = "Apache 2.0", - Category = "AI & Document Intelligence", - Purpose = "Industrial open-source Optical Character Recognition engine with support for multi-language traineddata models, powering local scanned document text extraction, word bounding-box discovery, and searchable PDF compilation.", - Maintainer = "Ray Smith, Google LLC & Tesseract Community", - ProjectUrl = "https://github.com/tesseract-ocr/tesseract", - IconKind = "TextRecognition", - AccentColorHex = "#0EA5E9", - LicenseText = """ -Apache License -Version 2.0, January 2004 -http://www.apache.org/licenses/ - -Copyright (c) 1985-2026 Ray Smith, Google LLC, and Tesseract contributors - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -""" - }); - - UpdateFilteredLicenses(); - } - - private void UpdateFilteredLicenses() - { - FilteredLicenses.Clear(); - foreach (var lib in AllLicenses) - { - if (MatchesLicenseCategory(lib) && MatchesLicenseSearch(lib)) - { - FilteredLicenses.Add(lib); - } - } - - OnPropertyChanged(nameof(MatchingLicensesCount)); - OnPropertyChanged(nameof(HasNoMatchingLicenses)); - } - - private bool MatchesLicenseCategory(ThirdPartyToolLicense lib) - { - if (SelectedLicenseCategory == "All") return true; - - return string.Equals(SelectedLicenseCategory, lib.Category, StringComparison.OrdinalIgnoreCase); - } - - private bool MatchesLicenseSearch(ThirdPartyToolLicense lib) - { - if (string.IsNullOrWhiteSpace(SearchQuery)) return true; - var q = SearchQuery.Trim(); - return lib.Name.Contains(q, StringComparison.OrdinalIgnoreCase) - || lib.Category.Contains(q, StringComparison.OrdinalIgnoreCase) - || lib.LicenseType.Contains(q, StringComparison.OrdinalIgnoreCase) - || lib.Purpose.Contains(q, StringComparison.OrdinalIgnoreCase) - || lib.Maintainer.Contains(q, StringComparison.OrdinalIgnoreCase); - } - - [RelayCommand] - public void SetLicenseCategory(string? category) - { - SelectedLicenseCategory = string.IsNullOrWhiteSpace(category) ? "All" : category; - } - - [RelayCommand] - public void ClearLicenseSearch() - { - SearchQuery = ""; - SelectedLicenseCategory = "All"; - UpdateFilteredLicenses(); - } - - [RelayCommand] - public void ToggleLicenseExpand(ThirdPartyToolLicense? license) - { - if (license != null) - { - license.IsExpanded = !license.IsExpanded; - } - } - - [RelayCommand] - public async Task CopyLicenseText(ThirdPartyToolLicense? license) - { - if (license == null) return; - var textToCopy = $"--- {license.Name} ({license.Version}) ---\nLicense: {license.LicenseType}\nMaintainer: {license.Maintainer}\nProject URL: {license.ProjectUrl}\n\n{license.LicenseText}"; - await CopyToClipboardAsync(textToCopy); - } - - [RelayCommand] - public async Task CopyFullAttributions() - { - var sb = new System.Text.StringBuilder(); - sb.AppendLine("================================================================================"); - sb.AppendLine("FryPDF — Open Source & Third-Party Software Attribution Notice"); - sb.AppendLine("Copyright (c) 2026 Code Fry Dev. All rights reserved."); - sb.AppendLine("================================================================================\n"); - - foreach (var lib in AllLicenses) - { - sb.AppendLine($"--------------------------------------------------------------------------------"); - sb.AppendLine($"Package: {lib.Name} (v{lib.Version})"); - sb.AppendLine($"Category: {lib.Category}"); - sb.AppendLine($"License: {lib.LicenseType}"); - sb.AppendLine($"Maintainer: {lib.Maintainer}"); - sb.AppendLine($"URL: {lib.ProjectUrl}"); - sb.AppendLine($"Purpose: {lib.Purpose}"); - sb.AppendLine($"--------------------------------------------------------------------------------"); - sb.AppendLine(lib.LicenseText.Trim()); - sb.AppendLine(); - } - - await CopyToClipboardAsync(sb.ToString()); - } - - [RelayCommand] - public async Task OpenLibraryWebsite(string? url) - { - if (string.IsNullOrWhiteSpace(url)) return; - try - { - if (Avalonia.Application.Current?.ApplicationLifetime is Avalonia.Controls.ApplicationLifetimes.IClassicDesktopStyleApplicationLifetime desktop && desktop.MainWindow?.Launcher != null) - { - await desktop.MainWindow.Launcher.LaunchUriAsync(new Uri(url)); - } - else - { - System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo { FileName = url, UseShellExecute = true }); - } - } - catch - { - await CopyToClipboardAsync(url); - } - } - - private static async Task CopyToClipboardAsync(string text) - { - try - { - if (Avalonia.Application.Current?.ApplicationLifetime is Avalonia.Controls.ApplicationLifetimes.IClassicDesktopStyleApplicationLifetime desktop && desktop.MainWindow?.Clipboard != null) - { - await desktop.MainWindow.Clipboard.SetTextAsync(text); - } - } - catch { } - } - - // --- Helpers --- - - public void RefreshRecent() - { - RecentDocuments.Clear(); - var items = _recentService.Load(); - foreach (var item in items) - { - RecentDocuments.Add(item); - } - OnPropertyChanged(nameof(HasRecentDocuments)); - - _ = LoadRecentPreviewsAsync(items); - } - - private async Task LoadRecentPreviewsAsync(List items) - { - foreach (var item in items) - { - if (string.IsNullOrWhiteSpace(item.FilePath) || !File.Exists(item.FilePath)) - continue; - - try - { - if (item.FilePath.EndsWith(".frypdf", StringComparison.OrdinalIgnoreCase) || - item.FilePath.EndsWith(".json", StringComparison.OrdinalIgnoreCase)) - { - var doc = await _persistenceService.LoadProjectAsync(item.FilePath); - if (doc != null && doc.Pages.Count > 0) - { - var pageVm = new PageViewModel(); - pageVm.LoadFromModel(doc.Pages[0]); - item.PagePreview = pageVm; - item.PageCount = doc.Pages.Count; - item.FormatDescription = $"{doc.Pages[0].Format} {doc.Pages[0].Orientation}"; - } - } - } - catch { } - } - } - - /// - /// Resolves services and child ViewModels requested by plugin-driven navigation page factories. - /// - public object? GetService(Type serviceType) - { - if (serviceType == typeof(HomeViewModel)) return this; - if (serviceType == typeof(SettingsViewModel)) return Settings; - if (serviceType == typeof(PluginsManagerViewModel)) return PluginsManager; - if (serviceType == typeof(FontManagerViewModel)) return FontManager; - if (serviceType == typeof(TesseractManagerViewModel)) return TesseractManager; - if (serviceType == typeof(HelpGuideViewModel)) return HelpGuide; - if (serviceType == typeof(PdfToolRunnerViewModel) && ToolRunner != null) return ToolRunner; - if (serviceType == typeof(IRecentDocumentsService)) return _recentService; - if (serviceType == typeof(ITemplateService)) return _templateService; - if (serviceType == typeof(IProjectPersistenceService)) return _persistenceService; - if (serviceType == typeof(IPdfToolRegistry)) return _toolRegistry; - if (serviceType == typeof(IThemeService) && _themeService != null) return _themeService; - if (serviceType == typeof(IUiSettingsService) && _uiSettingsService != null) return _uiSettingsService; - if (serviceType == typeof(PdfEditorApp.Core.Plugins.Descriptors.INavigationRegistry) && _navigationRegistry != null) return _navigationRegistry; - return _serviceProvider?.GetService(serviceType) ?? App.Services?.GetService(serviceType); - } -} - diff --git a/src/PdfEditorApp/ViewModels/InspectorViewModel.cs b/src/PdfEditorApp/ViewModels/InspectorViewModel.cs deleted file mode 100644 index 0d198c9..0000000 --- a/src/PdfEditorApp/ViewModels/InspectorViewModel.cs +++ /dev/null @@ -1,2477 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Globalization; -using System.Linq; -using System.Threading.Tasks; -using CommunityToolkit.Mvvm.ComponentModel; -using CommunityToolkit.Mvvm.Input; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; -using PdfEditorApp.Models; -using PdfEditorApp.Services; -using PdfEditorApp.Services.Canvas; -using PdfEditorApp.Services.Typography; -using PdfEditorApp.ViewModels.ElementViewModels; - -namespace PdfEditorApp.ViewModels; - -public class ColorSwatchItem -{ - public string Name { get; set; } = "Black"; - public string Hex { get; set; } = "#201F1E"; -} - -public partial class InspectorViewModel : ViewModelBase -{ - private readonly ICanvasElementService _elementService; - private readonly PdfEditorApp.Core.Plugins.Descriptors.IInspectorRegistry? _inspectorRegistry; - - public ObservableCollection DynamicSections { get; } = new(); - - public InspectorViewModel( - ICanvasElementService? elementService = null, - PdfEditorApp.Core.Plugins.Descriptors.IInspectorRegistry? inspectorRegistry = null) - { - _elementService = elementService ?? PageViewModel.DefaultElementService; - _inspectorRegistry = inspectorRegistry; - if (_inspectorRegistry != null) - { - _inspectorRegistry.RegistryChanged += () => - { - Avalonia.Threading.Dispatcher.UIThread.Post(() => RefreshDynamicSections(SelectedElement)); - }; - } - } - - public void RefreshDynamicSections(object? element) - { - DynamicSections.Clear(); - if (_inspectorRegistry != null) - { - var sections = _inspectorRegistry.GetSectionsForTarget(element); - foreach (var sec in sections) - { - var content = sec.Factory(null!, element); - if (content is DynamicInspectorSectionViewModel dvm) - { - DynamicSections.Add(dvm); - } - else - { - DynamicSections.Add(new DynamicInspectorSectionViewModel - { - SectionId = sec.SectionId, - Title = sec.Title, - IconKind = sec.IconKind, - Order = sec.Order, - Content = content - }); - } - } - } - } - - public UndoRedoService? UndoRedo { get; set; } - - public static Action? OnActiveTextFormattingApplied { get; set; } - - [ObservableProperty] - private ElementViewModelBase? _selectedElement; - - [ObservableProperty] - private PageViewModel? _selectedPage; - - [ObservableProperty] - [NotifyCanExecuteChangedFor(nameof(DeleteSelectedElementCommand))] - [NotifyCanExecuteChangedFor(nameof(DuplicateSelectedElementCommand))] - private bool _hasSelectedElement; - - [ObservableProperty] - private bool _hasMultiSelection; - - [ObservableProperty] - private int _selectionCount; - - [ObservableProperty] - private bool _isTextElement; - - [ObservableProperty] - private bool _isShapeElement; - - [ObservableProperty] - private bool _isImageElement; - - [ObservableProperty] - private bool _isTableElement; - - [ObservableProperty] - private bool _isChartElement; - - [ObservableProperty] - private bool _isDividerElement; - - [ObservableProperty] - private bool _isWatermarkElement; - - [ObservableProperty] - private bool _isFormFieldElement; - - [ObservableProperty] - private bool _isQrCodeElement; - - [ObservableProperty] - private bool _isBarcodeElement; - - [ObservableProperty] - private bool _isRedactionElement; - - [ObservableProperty] - private bool _isStickyNoteElement; - - [ObservableProperty] - private bool _isMeasurementElement; - - [ObservableProperty] - private bool _isSvgElement; - - [ObservableProperty] - private bool _isMathElement; - - // Collapsible Inspector Sections / Accordions (Default true for instant discovery) - [ObservableProperty] - private bool _isPageSetupExpanded = true; - - [ObservableProperty] - private bool _isPresetGeometryExpanded = true; - - [ObservableProperty] - private bool _isLineStrokePatternExpanded = true; - - [ObservableProperty] - private bool _isColorsExpanded = true; - - [ObservableProperty] - private bool _isDimensionsExpanded = true; - - [ObservableProperty] - private bool _isTypographyExpanded = true; - - [ObservableProperty] - private bool _isParagraphExpanded = true; - - [ObservableProperty] - private bool _isTransformExpanded = true; - - [ObservableProperty] - private bool _isShadowExpanded = true; - - [ObservableProperty] - private bool _isImageAdjustmentsExpanded = true; - - [ObservableProperty] - private bool _isTablePropertiesExpanded = true; - - [ObservableProperty] - private bool _isMathFormulaExpanded = true; - - [RelayCommand] - public void TogglePresetGeometryExpanded() => IsPresetGeometryExpanded = !IsPresetGeometryExpanded; - - [RelayCommand] - public void ToggleLineStrokePatternExpanded() => IsLineStrokePatternExpanded = !IsLineStrokePatternExpanded; - - [RelayCommand] - public void ToggleColorsExpanded() => IsColorsExpanded = !IsColorsExpanded; - - [RelayCommand] - public void ToggleDimensionsExpanded() => IsDimensionsExpanded = !IsDimensionsExpanded; - - [RelayCommand] - public void ToggleTypographyExpanded() => IsTypographyExpanded = !IsTypographyExpanded; - - [RelayCommand] - public void ToggleParagraphExpanded() => IsParagraphExpanded = !IsParagraphExpanded; - - [RelayCommand] - public void ToggleTransformExpanded() => IsTransformExpanded = !IsTransformExpanded; - - [RelayCommand] - public void ToggleShadowExpanded() => IsShadowExpanded = !IsShadowExpanded; - - [RelayCommand] - public void TogglePageSetupExpanded() => IsPageSetupExpanded = !IsPageSetupExpanded; - - [RelayCommand] - public void ToggleImageAdjustmentsExpanded() => IsImageAdjustmentsExpanded = !IsImageAdjustmentsExpanded; - - [RelayCommand] - public void ToggleTablePropertiesExpanded() => IsTablePropertiesExpanded = !IsTablePropertiesExpanded; - - [RelayCommand] - public void ToggleMathFormulaExpanded() => IsMathFormulaExpanded = !IsMathFormulaExpanded; - - [RelayCommand] - public void ExpandAllSections() - { - IsPageSetupExpanded = true; - IsPresetGeometryExpanded = true; - IsLineStrokePatternExpanded = true; - IsColorsExpanded = true; - IsDimensionsExpanded = true; - IsTypographyExpanded = true; - IsParagraphExpanded = true; - IsTransformExpanded = true; - IsShadowExpanded = true; - IsImageAdjustmentsExpanded = true; - IsTablePropertiesExpanded = true; - IsMathFormulaExpanded = true; - } - - [RelayCommand] - public void CollapseAllSections() - { - IsPageSetupExpanded = false; - IsPresetGeometryExpanded = false; - IsLineStrokePatternExpanded = false; - IsColorsExpanded = false; - IsDimensionsExpanded = false; - IsTypographyExpanded = false; - IsParagraphExpanded = false; - IsTransformExpanded = false; - IsShadowExpanded = false; - IsImageAdjustmentsExpanded = false; - IsTablePropertiesExpanded = false; - IsMathFormulaExpanded = false; - } - - [ObservableProperty] - private string _selectedFontFamily = "Arial"; - - partial void OnSelectedFontFamilyChanged(string value) - { - if (TextElement != null && !string.IsNullOrEmpty(value)) - { - if (TryApplyInlineFormatting(InlineFormatType.Font, $"Font: {value}", value)) return; - - if (TextElement.FontFamily != value) - { - var el = TextElement; - string oldFont = el.FontFamily; - el.FontFamily = value; - UndoRedo?.RecordAction( - $"Font: {value}", - () => { el.FontFamily = oldFont; SelectedFontFamily = oldFont; }, - () => { el.FontFamily = value; SelectedFontFamily = value; } - ); - } - } - } - - [ObservableProperty] - private double _selectedFontSize = 14; - - partial void OnSelectedFontSizeChanged(double value) - { - if (TextElement != null && value > 0) - { - if (TryApplyInlineFormatting(InlineFormatType.Size, $"Font Size: {value}pt", value.ToString("0.#", CultureInfo.InvariantCulture))) return; - - if (Math.Abs(TextElement.FontSize - value) > 0.1) - { - var el = TextElement; - double oldSize = el.FontSize; - el.FontSize = value; - UndoRedo?.RecordAction( - $"Font Size: {value}pt", - () => { el.FontSize = oldSize; SelectedFontSize = oldSize; }, - () => { el.FontSize = value; SelectedFontSize = value; } - ); - } - } - } - - public ObservableCollection AvailableFontFamilies { get; } = new() - { - // ── Sans-Serif (Modern) ───────────────────────────────────────────── - "Inter", - "Roboto", - "Open Sans", - "Lato", - "Poppins", - "Nunito", - "Raleway", - "Montserrat", - "Source Sans 3", - "Ubuntu", - "Cabin", - "Josefin Sans", - "Titillium Web", - "Exo 2", - "Noto Sans", - "Oswald", - - // ── Sans-Serif (System) ───────────────────────────────────────────── - "Arial", - "Verdana", - "Segoe UI", - "Helvetica", - "Trebuchet MS", - - // ── Serif ─────────────────────────────────────────────────────────── - "Playfair Display", - "Merriweather", - "Lora", - "PT Serif", - "Noto Serif", - "Crimson Text", - "Libre Baskerville", - "Libre Franklin", - "Cinzel", - "Times New Roman", - "Georgia", - "Palatino", - - // ── Monospace ─────────────────────────────────────────────────────── - "Fira Code", - "Roboto Mono", - "Courier New", - "Consolas", - "Menlo", - - // ── Display & Decorative ──────────────────────────────────────────── - "Bebas Neue", - "Orbitron", - "Lobster", - "Pacifico", - "Impact", - - // ── Handwriting & Script ──────────────────────────────────────────── - "Dancing Script", - "Caveat", - "Great Vibes", - "Comic Neue", - - // ── Indian Scripts ────────────────────────────────────────────────── - "Noto Sans Devanagari", - "Tiro Devanagari Hindi", - "Noto Sans Tamil", - "Noto Sans Telugu", - "Noto Sans Bengali", - "Noto Sans Gujarati", - "Noto Sans Kannada", - "Noto Sans Malayalam", - "Noto Sans Sinhala", - - // ── CJK — Chinese ─────────────────────────────────────────────────── - "Noto Sans SC", // Simplified Chinese - "Noto Sans TC", // Traditional Chinese - - // ── CJK — Japanese ────────────────────────────────────────────────── - "Noto Sans JP", - "Noto Serif JP", - - // ── CJK — Korean ──────────────────────────────────────────────────── - "Noto Sans KR", - "Nanum Gothic", - - // ── Southeast Asian ────────────────────────────────────────────────── - "Noto Sans Thai", - "Sarabun", - "Noto Sans Myanmar", - "Noto Sans Khmer", - "Noto Sans Lao", - "Be Vietnam Pro", - - // ── Middle Eastern / RTL ───────────────────────────────────────────── - "Noto Sans Arabic", - "Vazirmatn", - "Noto Nastaliq Urdu", - "Noto Sans Hebrew", - "Heebo", - - // ── Eurasian ───────────────────────────────────────────────────────── - "Golos Text", - "Russo One", - "GFS Neohellenic", - "Noto Sans Georgian", - "Noto Sans Armenian", - "Noto Sans Ethiopic", - }; - - public ObservableCollection AvailableFontSizes { get; } = new() - { - 8, 9, 10, 11, 12, 13, 13.5, 14, 15, 16, 18, 20, 22, 24, 28, 32, 36, 48, 72 - }; - - public ObservableCollection Swatches { get; } = new() - { - new ColorSwatchItem { Name = "Black", Hex = "#201F1E" }, - new ColorSwatchItem { Name = "Charcoal", Hex = "#4B5563" }, - new ColorSwatchItem { Name = "Accent Blue", Hex = "#0F6CBD" }, - new ColorSwatchItem { Name = "Navy", Hex = "#1E3A8A" }, - new ColorSwatchItem { Name = "Green", Hex = "#16A34A" }, - new ColorSwatchItem { Name = "Red", Hex = "#DC2626" }, - new ColorSwatchItem { Name = "Orange", Hex = "#EA580C" }, - new ColorSwatchItem { Name = "Purple", Hex = "#7C3AED" }, - new ColorSwatchItem { Name = "White", Hex = "#FFFFFF" } - }; - - public ObservableCollection MeasurementUnits { get; } = new() - { - RulerUnit.Points, - RulerUnit.Inches, - RulerUnit.Millimeters - }; - - public TextElementViewModel? TextElement => SelectedElement as TextElementViewModel; - public ShapeElementViewModel? ShapeElement => SelectedElement as ShapeElementViewModel; - public ImageElementViewModel? ImageElement => SelectedElement as ImageElementViewModel; - public TableElementViewModel? TableElement => SelectedElement as TableElementViewModel; - public ChartElementViewModel? ChartElement => SelectedElement as ChartElementViewModel; - public DividerElementViewModel? DividerElement => SelectedElement as DividerElementViewModel; - public WatermarkElementViewModel? WatermarkElement => SelectedElement as WatermarkElementViewModel; - public FormFieldElementViewModel? FormFieldElement => SelectedElement as FormFieldElementViewModel; - public QrCodeElementViewModel? QrCodeElement => SelectedElement as QrCodeElementViewModel; - public BarcodeElementViewModel? BarcodeElement => SelectedElement as BarcodeElementViewModel; - public RedactionElementViewModel? RedactionElement => SelectedElement as RedactionElementViewModel; - public InkElementViewModel? InkElement => SelectedElement as InkElementViewModel; - public StickyNoteElementViewModel? StickyNoteElement => SelectedElement as StickyNoteElementViewModel; - public MeasurementElementViewModel? MeasurementElement => SelectedElement as MeasurementElementViewModel; - public SvgElementViewModel? SvgElement => SelectedElement as SvgElementViewModel; - public MathElementViewModel? MathElement => SelectedElement as MathElementViewModel; - - public string ActiveCategoryName => SelectedElement != null ? SelectedElement.Kind.ToString() : "Document"; - public ObservableCollection ColorSwatches => Swatches; - - public void UpdateSelection(ElementViewModelBase? element, PageViewModel? page) - { - SelectedElement = element; - SelectedPage = page; - - HasSelectedElement = element != null; - HasMultiSelection = page != null && page.SelectedElements.Count > 1; - SelectionCount = page != null ? page.SelectedElements.Count : (element != null ? 1 : 0); - - IsTextElement = element is TextElementViewModel; - IsShapeElement = element is ShapeElementViewModel; - IsImageElement = element is ImageElementViewModel; - IsTableElement = element is TableElementViewModel; - IsChartElement = element is ChartElementViewModel; - IsDividerElement = element is DividerElementViewModel; - IsWatermarkElement = element is WatermarkElementViewModel; - IsFormFieldElement = element is FormFieldElementViewModel; - IsQrCodeElement = element is QrCodeElementViewModel; - IsBarcodeElement = element is BarcodeElementViewModel; - IsRedactionElement = element is RedactionElementViewModel; - IsStickyNoteElement = element is StickyNoteElementViewModel; - IsMeasurementElement = element is MeasurementElementViewModel; - IsSvgElement = element is SvgElementViewModel; - IsMathElement = element is MathElementViewModel; - - RefreshDynamicSections(element); - - if (element is TextElementViewModel textVm) - { - SelectedFontFamily = textVm.FontFamily; - SelectedFontSize = textVm.FontSize; - - if (!AvailableFontSizes.Contains(textVm.FontSize)) - { - AvailableFontSizes.Add(textVm.FontSize); - } - } - - OnPropertyChanged(nameof(TextElement)); - OnPropertyChanged(nameof(ShapeElement)); - OnPropertyChanged(nameof(ImageElement)); - OnPropertyChanged(nameof(TableElement)); - OnPropertyChanged(nameof(ChartElement)); - OnPropertyChanged(nameof(DividerElement)); - OnPropertyChanged(nameof(WatermarkElement)); - OnPropertyChanged(nameof(FormFieldElement)); - OnPropertyChanged(nameof(QrCodeElement)); - OnPropertyChanged(nameof(BarcodeElement)); - OnPropertyChanged(nameof(RedactionElement)); - OnPropertyChanged(nameof(InkElement)); - OnPropertyChanged(nameof(StickyNoteElement)); - OnPropertyChanged(nameof(MeasurementElement)); - OnPropertyChanged(nameof(SvgElement)); - OnPropertyChanged(nameof(MathElement)); - OnPropertyChanged(nameof(ActiveCategoryName)); - } - - private bool TryApplyInlineFormatting(InlineFormatType formatType, string actionName, string? argument = null) - { - if (TextElement != null && TextElement.HasTextSelection) - { - var el = TextElement; - string oldText = el.Text; - int oldSelStart = el.ActiveSelectionStart; - int oldSelLen = el.ActiveSelectionLength; - if (el.ApplyInlineFormatting(formatType, argument)) - { - string newText = el.Text; - int newSelStart = el.ActiveSelectionStart; - int newSelLen = el.ActiveSelectionLength; - OnActiveTextFormattingApplied?.Invoke(el); - UndoRedo?.RecordAction( - actionName, - () => - { - el.Text = oldText; - int s = Math.Min(oldSelStart, el.Text.Length); - int l = Math.Min(oldSelLen, el.Text.Length - s); - el.UpdateTextSelection(s, l, el.Text.Substring(s, l)); - OnActiveTextFormattingApplied?.Invoke(el); - }, - () => - { - el.Text = newText; - int s = Math.Min(newSelStart, el.Text.Length); - int l = Math.Min(newSelLen, el.Text.Length - s); - el.UpdateTextSelection(s, l, el.Text.Substring(s, l)); - OnActiveTextFormattingApplied?.Invoke(el); - } - ); - return true; - } - } - return false; - } - - [RelayCommand] - public void SetTextColor(string hex) - { - if (string.IsNullOrEmpty(hex) || TextElement == null) return; - - if (TryApplyInlineFormatting(InlineFormatType.Color, "Format Color Selection", hex)) return; - - if (TextElement.TextColorHex != hex) - { - var el = TextElement; - string oldHex = el.TextColorHex; - el.TextColorHex = hex; - UndoRedo?.RecordAction( - "Change Text Color", - () => el.TextColorHex = oldHex, - () => el.TextColorHex = hex - ); - } - } - - [RelayCommand] - public void SetShapeFillColor(string hex) - { - if (ShapeElement != null && ShapeElement.FillColorHex != hex) - { - var el = ShapeElement; - string oldHex = el.FillColorHex; - el.FillColorHex = hex; - UndoRedo?.RecordAction( - "Change Fill Color", - () => el.FillColorHex = oldHex, - () => el.FillColorHex = hex - ); - } - } - - [RelayCommand] - public void SetShapeStrokeColor(string hex) - { - if (ShapeElement != null && ShapeElement.StrokeColorHex != hex) - { - var el = ShapeElement; - string oldHex = el.StrokeColorHex; - el.StrokeColorHex = hex; - UndoRedo?.RecordAction( - "Change Stroke Color", - () => el.StrokeColorHex = oldHex, - () => el.StrokeColorHex = hex - ); - } - } - - [RelayCommand] - public void SetAlignment(string alignmentStr) - { - if (TextElement != null && Enum.TryParse(alignmentStr, true, out var mode) && TextElement.Alignment != mode) - { - var el = TextElement; - var oldMode = el.Alignment; - el.Alignment = mode; - UndoRedo?.RecordAction( - $"Align Text {mode}", - () => el.Alignment = oldMode, - () => el.Alignment = mode - ); - } - } - - [RelayCommand] - public void ToggleBold() - { - if (TextElement != null) - { - if (TryApplyInlineFormatting(InlineFormatType.Bold, "Format Bold Selection")) return; - - var el = TextElement; - bool oldVal = el.IsBold; - bool newVal = !oldVal; - el.IsBold = newVal; - UndoRedo?.RecordAction( - newVal ? "Format Bold" : "Remove Bold", - () => el.IsBold = oldVal, - () => el.IsBold = newVal - ); - } - } - - [RelayCommand] - public void ToggleItalic() - { - if (TextElement != null) - { - if (TryApplyInlineFormatting(InlineFormatType.Italic, "Format Italic Selection")) return; - - var el = TextElement; - bool oldVal = el.IsItalic; - bool newVal = !oldVal; - el.IsItalic = newVal; - UndoRedo?.RecordAction( - newVal ? "Format Italic" : "Remove Italic", - () => el.IsItalic = oldVal, - () => el.IsItalic = newVal - ); - } - } - - [RelayCommand] - public void ToggleUnderline() - { - if (TextElement != null) - { - if (TryApplyInlineFormatting(InlineFormatType.Underline, "Format Underline Selection")) return; - - var el = TextElement; - bool oldVal = el.IsUnderline; - bool newVal = !oldVal; - el.IsUnderline = newVal; - UndoRedo?.RecordAction( - newVal ? "Format Underline" : "Remove Underline", - () => el.IsUnderline = oldVal, - () => el.IsUnderline = newVal - ); - } - } - - [RelayCommand] - public void AutoFitTextHeight() - { - if (TextElement != null) - { - var el = TextElement; - double oldH = el.Height; - double newH = el.CalculateRequiredHeight(); - if (Math.Abs(newH - oldH) > 0.5) - { - el.Height = newH; - UndoRedo?.RecordAction( - "Auto-Fit Text Height", - () => el.Height = oldH, - () => el.Height = newH - ); - } - } - } - - [RelayCommand(CanExecute = nameof(HasSelectedElement))] - public void DeleteSelectedElement() - { - if (SelectedPage == null) return; - var page = SelectedPage; - - if (page.SelectedElements.Count > 1) - { - var targets = page.SelectedElements.ToList(); - foreach (var el in targets) page.RemoveElement(el); - UpdateSelection(null, page); - - UndoRedo?.RecordAction( - $"Delete {targets.Count} Elements", - () => { - foreach (var el in targets) page.AddElement(el); - page.SelectElements(targets); - UpdateSelection(page.SelectedElement, page); - }, - () => { - foreach (var el in targets) page.RemoveElement(el); - UpdateSelection(null, page); - }, - onDiscarded: () => { foreach (var el in targets) ReleaseElementResources(el); } - ); - } - else if (SelectedElement != null) - { - var el = SelectedElement; - page.RemoveElement(el); - UpdateSelection(null, page); - - UndoRedo?.RecordAction( - $"Delete {el.DisplayName}", - () => { page.AddElement(el); UpdateSelection(el, page); }, - () => { page.RemoveElement(el); UpdateSelection(null, page); }, - onDiscarded: () => ReleaseElementResources(el) - ); - } - } - - /// - /// Releases the decoded bitmap of a deleted chart/image element once its undo entry is - /// discarded (capacity eviction or document teardown) — safe specifically because a - /// discarded delete-type undo entry is, by construction, not reachable from the live page - /// any more. Relies on ChartElementViewModel/ImageElementViewModel already disposing their - /// previous bitmap whenever the property is reassigned. - /// - private static void ReleaseElementResources(ElementViewModelBase element) - { - switch (element) - { - case ImageElementViewModel img: - img.PreviewBitmap = null; - break; - case ChartElementViewModel chart: - chart.ChartBitmap = null; - break; - } - } - - [RelayCommand(CanExecute = nameof(HasSelectedElement))] - public void DuplicateSelectedElement() - { - if (SelectedPage == null) return; - var page = SelectedPage; - - if (page.SelectedElements.Count > 1) - { - var targets = page.SelectedElements.ToList(); - var newElements = new List(); - - foreach (var el in targets) - { - var model = el.ToModel(); - var clone = model.Clone(); - clone.Id = Guid.NewGuid().ToString("N"); - clone.X += 20; - clone.Y += 20; - - ElementViewModelBase newVm = _elementService.CreateViewModel(clone); - page.AddElement(newVm); - newElements.Add(newVm); - } - - page.SelectElements(newElements); - UpdateSelection(page.SelectedElement, page); - - UndoRedo?.RecordAction( - $"Duplicate {targets.Count} Elements", - () => { - foreach (var el in newElements) page.RemoveElement(el); - page.SelectElements(targets); - UpdateSelection(page.SelectedElement, page); - }, - () => { - foreach (var el in newElements) page.AddElement(el); - page.SelectElements(newElements); - UpdateSelection(page.SelectedElement, page); - } - ); - } - else if (SelectedElement != null) - { - var model = SelectedElement.ToModel(); - var clone = model.Clone(); - clone.Id = Guid.NewGuid().ToString("N"); - clone.X += 20; - clone.Y += 20; - - ElementViewModelBase newVm = _elementService.CreateViewModel(clone); - page.AddElement(newVm); - UpdateSelection(newVm, page); - - UndoRedo?.RecordAction( - $"Duplicate {newVm.DisplayName}", - () => { page.RemoveElement(newVm); UpdateSelection(null, page); }, - () => { page.AddElement(newVm); UpdateSelection(newVm, page); } - ); - } - } - - [RelayCommand] - public void BringToFront() - { - if (SelectedElement != null && SelectedPage != null) - { - var el = SelectedElement; - var page = SelectedPage; - int oldIdx = page.Elements.IndexOf(el); - if (oldIdx < 0 || oldIdx == page.Elements.Count - 1) return; - - page.BringToFront(el); - int newIdx = page.Elements.IndexOf(el); - - UndoRedo?.RecordAction( - $"Bring {el.DisplayName} to Front", - () => { - if (page.Elements.Contains(el)) - { - int cur = page.Elements.IndexOf(el); - if (cur != oldIdx && oldIdx >= 0 && oldIdx < page.Elements.Count) page.Elements.Move(cur, oldIdx); - page.NormalizeZIndices(); - } - }, - () => { - if (page.Elements.Contains(el)) - { - int cur = page.Elements.IndexOf(el); - if (cur != newIdx && newIdx >= 0 && newIdx < page.Elements.Count) page.Elements.Move(cur, newIdx); - page.NormalizeZIndices(); - } - } - ); - } - } - - [RelayCommand] - public void SendToBack() - { - if (SelectedElement != null && SelectedPage != null) - { - var el = SelectedElement; - var page = SelectedPage; - int oldIdx = page.Elements.IndexOf(el); - if (oldIdx <= 0) return; - - page.SendToBack(el); - int newIdx = page.Elements.IndexOf(el); - - UndoRedo?.RecordAction( - $"Send {el.DisplayName} to Back", - () => { - if (page.Elements.Contains(el)) - { - int cur = page.Elements.IndexOf(el); - if (cur != oldIdx && oldIdx >= 0 && oldIdx < page.Elements.Count) page.Elements.Move(cur, oldIdx); - page.NormalizeZIndices(); - } - }, - () => { - if (page.Elements.Contains(el)) - { - int cur = page.Elements.IndexOf(el); - if (cur != newIdx && newIdx >= 0 && newIdx < page.Elements.Count) page.Elements.Move(cur, newIdx); - page.NormalizeZIndices(); - } - } - ); - } - } - - [RelayCommand] - public void BringForward() - { - if (SelectedElement != null && SelectedPage != null) - { - var el = SelectedElement; - var page = SelectedPage; - int oldIdx = page.Elements.IndexOf(el); - if (oldIdx < 0 || oldIdx >= page.Elements.Count - 1) return; - - page.BringForward(el); - int newIdx = page.Elements.IndexOf(el); - - UndoRedo?.RecordAction( - $"Bring {el.DisplayName} Forward", - () => { - if (page.Elements.Contains(el)) - { - int cur = page.Elements.IndexOf(el); - if (cur != oldIdx && oldIdx >= 0 && oldIdx < page.Elements.Count) page.Elements.Move(cur, oldIdx); - page.NormalizeZIndices(); - } - }, - () => { - if (page.Elements.Contains(el)) - { - int cur = page.Elements.IndexOf(el); - if (cur != newIdx && newIdx >= 0 && newIdx < page.Elements.Count) page.Elements.Move(cur, newIdx); - page.NormalizeZIndices(); - } - } - ); - } - } - - [RelayCommand] - public void SendBackward() - { - if (SelectedElement != null && SelectedPage != null) - { - var el = SelectedElement; - var page = SelectedPage; - int oldIdx = page.Elements.IndexOf(el); - if (oldIdx <= 0) return; - - page.SendBackward(el); - int newIdx = page.Elements.IndexOf(el); - - UndoRedo?.RecordAction( - $"Send {el.DisplayName} Backward", - () => { - if (page.Elements.Contains(el)) - { - int cur = page.Elements.IndexOf(el); - if (cur != oldIdx && oldIdx >= 0 && oldIdx < page.Elements.Count) page.Elements.Move(cur, oldIdx); - page.NormalizeZIndices(); - } - }, - () => { - if (page.Elements.Contains(el)) - { - int cur = page.Elements.IndexOf(el); - if (cur != newIdx && newIdx >= 0 && newIdx < page.Elements.Count) page.Elements.Move(cur, newIdx); - page.NormalizeZIndices(); - } - } - ); - } - } - - [RelayCommand] - public void SetShapeType(string shapeTypeStr) - { - if (ShapeElement != null && Enum.TryParse(shapeTypeStr, true, out var type) && ShapeElement.ShapeType != type) - { - var el = ShapeElement; - var oldType = el.ShapeType; - double oldRadius = el.CornerRadius; - double newRadius = type == ShapeType.Circle ? el.Width / 2 : (type == ShapeType.RoundedRectangle ? 12 : 0); - - el.ShapeType = type; - el.CornerRadius = newRadius; - - UndoRedo?.RecordAction( - $"Shape: {type}", - () => { el.ShapeType = oldType; el.CornerRadius = oldRadius; }, - () => { el.ShapeType = type; el.CornerRadius = newRadius; } - ); - } - } - - [RelayCommand] - public void SetWatermarkColor(string hex) - { - if (WatermarkElement != null && WatermarkElement.ColorHex != hex) - { - var el = WatermarkElement; - string oldHex = el.ColorHex; - el.ColorHex = hex; - UndoRedo?.RecordAction( - "Change Watermark Color", - () => el.ColorHex = oldHex, - () => el.ColorHex = hex - ); - } - } - - [RelayCommand] - public void AlignLeft() - { - if (SelectedPage == null) return; - var page = SelectedPage; - - if (page.SelectedElements.Count > 1) - { - var targets = page.SelectedElements.ToList(); - double minX = targets.Min(e => e.X); - var prevPositions = targets.Select(e => (Element: e, e.X, e.Y)).ToList(); - - foreach (var el in targets) el.X = minX; - page.UpdateSelectionBoundingBox(); - - UndoRedo?.RecordAction( - "Align Left", - () => { foreach (var item in prevPositions) item.Element.X = item.X; page.UpdateSelectionBoundingBox(); }, - () => { foreach (var el in targets) el.X = minX; page.UpdateSelectionBoundingBox(); } - ); - } - else if (SelectedElement != null) - { - var el = SelectedElement; - double oldX = el.X; - double newX = 60.0; - el.X = newX; - page.UpdateSelectionBoundingBox(); - - UndoRedo?.RecordAction( - "Align Left to Margin", - () => { el.X = oldX; page.UpdateSelectionBoundingBox(); }, - () => { el.X = newX; page.UpdateSelectionBoundingBox(); } - ); - } - } - - [RelayCommand] - public void AlignCenter() - { - if (SelectedPage == null) return; - var page = SelectedPage; - - if (page.SelectedElements.Count > 1) - { - var targets = page.SelectedElements.ToList(); - double minX = targets.Min(e => e.X); - double maxX = targets.Max(e => e.X + Math.Max(1, e.Width)); - double centerX = (minX + maxX) / 2.0; - var prevPositions = targets.Select(e => (Element: e, e.X, e.Y)).ToList(); - - foreach (var el in targets) el.X = centerX - (el.Width / 2.0); - page.UpdateSelectionBoundingBox(); - - UndoRedo?.RecordAction( - "Align Center", - () => { foreach (var item in prevPositions) item.Element.X = item.X; page.UpdateSelectionBoundingBox(); }, - () => { foreach (var el in targets) el.X = centerX - (el.Width / 2.0); page.UpdateSelectionBoundingBox(); } - ); - } - else if (SelectedElement != null) - { - var el = SelectedElement; - double oldX = el.X; - double newX = Math.Max(0, (page.Width - el.Width) / 2.0); - el.X = newX; - page.UpdateSelectionBoundingBox(); - - UndoRedo?.RecordAction( - "Align Center on Page", - () => { el.X = oldX; page.UpdateSelectionBoundingBox(); }, - () => { el.X = newX; page.UpdateSelectionBoundingBox(); } - ); - } - } - - [RelayCommand] - public void AlignRight() - { - if (SelectedPage == null) return; - var page = SelectedPage; - - if (page.SelectedElements.Count > 1) - { - var targets = page.SelectedElements.ToList(); - double maxX = targets.Max(e => e.X + Math.Max(1, e.Width)); - var prevPositions = targets.Select(e => (Element: e, e.X, e.Y)).ToList(); - - foreach (var el in targets) el.X = maxX - el.Width; - page.UpdateSelectionBoundingBox(); - - UndoRedo?.RecordAction( - "Align Right", - () => { foreach (var item in prevPositions) item.Element.X = item.X; page.UpdateSelectionBoundingBox(); }, - () => { foreach (var el in targets) el.X = maxX - el.Width; page.UpdateSelectionBoundingBox(); } - ); - } - else if (SelectedElement != null) - { - var el = SelectedElement; - double oldX = el.X; - double newX = Math.Max(0, page.Width - el.Width - 60.0); - el.X = newX; - page.UpdateSelectionBoundingBox(); - - UndoRedo?.RecordAction( - "Align Right to Margin", - () => { el.X = oldX; page.UpdateSelectionBoundingBox(); }, - () => { el.X = newX; page.UpdateSelectionBoundingBox(); } - ); - } - } - - [RelayCommand] - public void AlignTop() - { - if (SelectedPage == null) return; - var page = SelectedPage; - - if (page.SelectedElements.Count > 1) - { - var targets = page.SelectedElements.ToList(); - double minY = targets.Min(e => e.Y); - var prevPositions = targets.Select(e => (Element: e, e.X, e.Y)).ToList(); - - foreach (var el in targets) el.Y = minY; - page.UpdateSelectionBoundingBox(); - - UndoRedo?.RecordAction( - "Align Top", - () => { foreach (var item in prevPositions) item.Element.Y = item.Y; page.UpdateSelectionBoundingBox(); }, - () => { foreach (var el in targets) el.Y = minY; page.UpdateSelectionBoundingBox(); } - ); - } - else if (SelectedElement != null) - { - var el = SelectedElement; - double oldY = el.Y; - double newY = 60.0; - el.Y = newY; - page.UpdateSelectionBoundingBox(); - - UndoRedo?.RecordAction( - "Align Top to Margin", - () => { el.Y = oldY; page.UpdateSelectionBoundingBox(); }, - () => { el.Y = newY; page.UpdateSelectionBoundingBox(); } - ); - } - } - - [RelayCommand] - public void AlignMiddle() - { - if (SelectedPage == null) return; - var page = SelectedPage; - - if (page.SelectedElements.Count > 1) - { - var targets = page.SelectedElements.ToList(); - double minY = targets.Min(e => e.Y); - double maxY = targets.Max(e => e.Y + Math.Max(1, e.Height)); - double centerY = (minY + maxY) / 2.0; - var prevPositions = targets.Select(e => (Element: e, e.X, e.Y)).ToList(); - - foreach (var el in targets) el.Y = centerY - (el.Height / 2.0); - page.UpdateSelectionBoundingBox(); - - UndoRedo?.RecordAction( - "Align Middle", - () => { foreach (var item in prevPositions) item.Element.Y = item.Y; page.UpdateSelectionBoundingBox(); }, - () => { foreach (var el in targets) el.Y = centerY - (el.Height / 2.0); page.UpdateSelectionBoundingBox(); } - ); - } - else if (SelectedElement != null) - { - var el = SelectedElement; - double oldY = el.Y; - double newY = Math.Max(0, (page.Height - el.Height) / 2.0); - el.Y = newY; - page.UpdateSelectionBoundingBox(); - - UndoRedo?.RecordAction( - "Align Middle on Page", - () => { el.Y = oldY; page.UpdateSelectionBoundingBox(); }, - () => { el.Y = newY; page.UpdateSelectionBoundingBox(); } - ); - } - } - - [RelayCommand] - public void AlignBottom() - { - if (SelectedPage == null) return; - var page = SelectedPage; - - if (page.SelectedElements.Count > 1) - { - var targets = page.SelectedElements.ToList(); - double maxY = targets.Max(e => e.Y + Math.Max(1, e.Height)); - var prevPositions = targets.Select(e => (Element: e, e.X, e.Y)).ToList(); - - foreach (var el in targets) el.Y = maxY - el.Height; - page.UpdateSelectionBoundingBox(); - - UndoRedo?.RecordAction( - "Align Bottom", - () => { foreach (var item in prevPositions) item.Element.Y = item.Y; page.UpdateSelectionBoundingBox(); }, - () => { foreach (var el in targets) el.Y = maxY - el.Height; page.UpdateSelectionBoundingBox(); } - ); - } - else if (SelectedElement != null) - { - var el = SelectedElement; - double oldY = el.Y; - double newY = Math.Max(0, page.Height - el.Height - 60.0); - el.Y = newY; - page.UpdateSelectionBoundingBox(); - - UndoRedo?.RecordAction( - "Align Bottom to Margin", - () => { el.Y = oldY; page.UpdateSelectionBoundingBox(); }, - () => { el.Y = newY; page.UpdateSelectionBoundingBox(); } - ); - } - } - - [RelayCommand] - public void DistributeHorizontally() - { - if (SelectedPage == null) return; - var page = SelectedPage; - - var targets = page.SelectedElements.Count >= 3 ? page.SelectedElements.ToList() : page.Elements.ToList(); - if (targets.Count < 3) return; - - var sorted = targets.OrderBy(e => e.X).ToList(); - double firstX = sorted.First().X; - double lastRight = sorted.Last().X + sorted.Last().Width; - double totalElementsWidth = sorted.Sum(e => e.Width); - double totalSpan = lastRight - firstX; - double totalGaps = totalSpan - totalElementsWidth; - double gap = Math.Max(0, totalGaps / (sorted.Count - 1)); - - var prevPositions = sorted.Select(e => (Element: e, e.X, e.Y)).ToList(); - double curX = firstX; - var newPositions = new List<(ElementViewModelBase Element, double X)>(); - - for (int i = 0; i < sorted.Count; i++) - { - var el = sorted[i]; - if (i == 0) - { - newPositions.Add((el, firstX)); - curX += el.Width + gap; - } - else if (i == sorted.Count - 1) - { - newPositions.Add((el, lastRight - el.Width)); - } - else - { - newPositions.Add((el, curX)); - curX += el.Width + gap; - } - } - - foreach (var p in newPositions) p.Element.X = p.X; - page.UpdateSelectionBoundingBox(); - - UndoRedo?.RecordAction( - "Distribute Horizontally", - () => { foreach (var p in prevPositions) p.Element.X = p.X; page.UpdateSelectionBoundingBox(); }, - () => { foreach (var p in newPositions) p.Element.X = p.X; page.UpdateSelectionBoundingBox(); } - ); - } - - [RelayCommand] - public void DistributeVertically() - { - if (SelectedPage == null) return; - var page = SelectedPage; - - var targets = page.SelectedElements.Count >= 3 ? page.SelectedElements.ToList() : page.Elements.ToList(); - if (targets.Count < 3) return; - - var sorted = targets.OrderBy(e => e.Y).ToList(); - double firstY = sorted.First().Y; - double lastBottom = sorted.Last().Y + sorted.Last().Height; - double totalElementsHeight = sorted.Sum(e => e.Height); - double totalSpan = lastBottom - firstY; - double totalGaps = totalSpan - totalElementsHeight; - double gap = Math.Max(0, totalGaps / (sorted.Count - 1)); - - var prevPositions = sorted.Select(e => (Element: e, e.X, e.Y)).ToList(); - double curY = firstY; - var newPositions = new List<(ElementViewModelBase Element, double Y)>(); - - for (int i = 0; i < sorted.Count; i++) - { - var el = sorted[i]; - if (i == 0) - { - newPositions.Add((el, firstY)); - curY += el.Height + gap; - } - else if (i == sorted.Count - 1) - { - newPositions.Add((el, lastBottom - el.Height)); - } - else - { - newPositions.Add((el, curY)); - curY += el.Height + gap; - } - } - - foreach (var p in newPositions) p.Element.Y = p.Y; - page.UpdateSelectionBoundingBox(); - - UndoRedo?.RecordAction( - "Distribute Vertically", - () => { foreach (var p in prevPositions) p.Element.Y = p.Y; page.UpdateSelectionBoundingBox(); }, - () => { foreach (var p in newPositions) p.Element.Y = p.Y; page.UpdateSelectionBoundingBox(); } - ); - } - - [RelayCommand] - public void ToggleLock() - { - if (SelectedPage == null) return; - var page = SelectedPage; - - if (page.SelectedElements.Count > 1) - { - var targets = page.SelectedElements.ToList(); - bool allLocked = targets.All(e => e.IsLocked); - bool targetLock = !allLocked; - var prevStates = targets.Select(e => (Element: e, e.IsLocked)).ToList(); - - foreach (var el in targets) el.IsLocked = targetLock; - - UndoRedo?.RecordAction( - targetLock ? $"Lock {targets.Count} Elements" : $"Unlock {targets.Count} Elements", - () => { foreach (var item in prevStates) item.Element.IsLocked = item.IsLocked; }, - () => { foreach (var el in targets) el.IsLocked = targetLock; } - ); - } - else if (SelectedElement != null) - { - var el = SelectedElement; - bool oldLock = el.IsLocked; - bool newLock = !oldLock; - el.IsLocked = newLock; - UndoRedo?.RecordAction( - newLock ? "Lock Element" : "Unlock Element", - () => el.IsLocked = oldLock, - () => el.IsLocked = newLock - ); - } - } - - [RelayCommand] - public void ApplyTableStyle(string styleStr) - { - if (TableElement != null) - { - var el = TableElement; - string oldHeader = el.HeaderBackgroundHex; - string oldAlt = el.AlternateRowBackgroundHex; - string oldBorder = el.BorderColorHex; - - el.ApplyPresetStyle(styleStr); - - string newHeader = el.HeaderBackgroundHex; - string newAlt = el.AlternateRowBackgroundHex; - string newBorder = el.BorderColorHex; - - UndoRedo?.RecordAction( - $"Apply Table Style ({styleStr})", - () => { el.HeaderBackgroundHex = oldHeader; el.AlternateRowBackgroundHex = oldAlt; el.BorderColorHex = oldBorder; }, - () => { el.HeaderBackgroundHex = newHeader; el.AlternateRowBackgroundHex = newAlt; el.BorderColorHex = newBorder; } - ); - } - } - - [RelayCommand] - public void SetChartType(string typeStr) - { - if (ChartElement != null && Enum.TryParse(typeStr, true, out var parsed) && ChartElement.ChartType != parsed) - { - var el = ChartElement; - var oldType = el.ChartType; - el.SetChartType(typeStr); - UndoRedo?.RecordAction( - $"Change Chart to {parsed}", - () => el.ChartType = oldType, - () => el.ChartType = parsed - ); - } - } - - [RelayCommand] - public void SetChartPalette(string paletteStr) - { - if (ChartElement != null && Enum.TryParse(paletteStr, true, out var parsed) && ChartElement.Palette != parsed) - { - var el = ChartElement; - var oldPal = el.Palette; - el.SetPalette(paletteStr); - UndoRedo?.RecordAction( - $"Change Palette to {parsed}", - () => el.Palette = oldPal, - () => el.Palette = parsed - ); - } - } - - [RelayCommand] - public void SetChartLegendPosition(string posStr) - { - if (ChartElement != null && Enum.TryParse(posStr, true, out var parsed) && ChartElement.LegendPosition != parsed) - { - var el = ChartElement; - var oldPos = el.LegendPosition; - el.SetLegendPosition(posStr); - UndoRedo?.RecordAction( - $"Change Legend to {parsed}", - () => el.LegendPosition = oldPos, - () => el.LegendPosition = parsed - ); - } - } - - public PdfEditorApp.ViewModels.DataStudio.DataStudioViewModel? DataStudio { get; set; } - - [RelayCommand] - public void OpenDataStudioForChart() - { - if (ChartElement != null && DataStudio != null) - { - DataStudio.OpenForChart(ChartElement, SelectedPage); - } - } - - [RelayCommand] - public void OpenDataStudioForTable() - { - if (TableElement != null && DataStudio != null) - { - DataStudio.OpenForTable(TableElement, SelectedPage); - } - } - - [RelayCommand] - public void ConvertTableToChart() - { - if (TableElement != null && SelectedPage != null) - { - var bindingService = new PdfEditorApp.Core.Data.DataBindingService(); - var chartModel = bindingService.ConvertTableToChart((PdfTableElement)TableElement.ToModel()); - var chartVm = new ChartElementViewModel(); - chartVm.LoadFromModel(chartModel); - - var oldTable = TableElement; - var page = SelectedPage; - int idx = page.Elements.IndexOf(oldTable); - - page.Elements.Remove(oldTable); - page.Elements.Insert(Math.Max(0, idx), chartVm); - page.SelectedElement = chartVm; - - UndoRedo?.RecordAction( - "Convert Table to Chart", - () => - { - int cIdx = page.Elements.IndexOf(chartVm); - if (cIdx >= 0) page.Elements.RemoveAt(cIdx); - page.Elements.Insert(Math.Max(0, idx), oldTable); - page.SelectedElement = oldTable; - }, - () => - { - int tIdx = page.Elements.IndexOf(oldTable); - if (tIdx >= 0) page.Elements.RemoveAt(tIdx); - page.Elements.Insert(Math.Max(0, idx), chartVm); - page.SelectedElement = chartVm; - } - ); - } - } - - [RelayCommand] - public void ConvertChartToTable() - { - if (ChartElement != null && SelectedPage != null) - { - var bindingService = new PdfEditorApp.Core.Data.DataBindingService(); - var tableModel = bindingService.ConvertChartToTable((PdfChartElement)ChartElement.ToModel()); - var tableVm = new TableElementViewModel(); - tableVm.LoadFromModel(tableModel); - - var oldChart = ChartElement; - var page = SelectedPage; - int idx = page.Elements.IndexOf(oldChart); - - page.Elements.Remove(oldChart); - page.Elements.Insert(Math.Max(0, idx), tableVm); - page.SelectedElement = tableVm; - - UndoRedo?.RecordAction( - "Convert Chart to Table", - () => - { - int tIdx = page.Elements.IndexOf(tableVm); - if (tIdx >= 0) page.Elements.RemoveAt(tIdx); - page.Elements.Insert(Math.Max(0, idx), oldChart); - page.SelectedElement = oldChart; - }, - () => - { - int cIdx = page.Elements.IndexOf(oldChart); - if (cIdx >= 0) page.Elements.RemoveAt(cIdx); - page.Elements.Insert(Math.Max(0, idx), tableVm); - page.SelectedElement = tableVm; - } - ); - } - } - - [RelayCommand] - public async Task QuickPasteDataToChart() - { - if (ChartElement != null && DataStudio != null) - { - await DataStudio.PasteFromClipboardAsync(); - DataStudio.OpenForChart(ChartElement, SelectedPage); - DataStudio.ApplyData(); - } - } - - [RelayCommand] - public async Task QuickPasteDataToTable() - { - if (TableElement != null && DataStudio != null) - { - await DataStudio.PasteFromClipboardAsync(); - DataStudio.OpenForTable(TableElement, SelectedPage); - DataStudio.ApplyData(); - } - } - - [RelayCommand] - public void SetBarcodeFormat(string formatStr) - { - if (BarcodeElement != null && BarcodeElement.BarcodeFormat != formatStr) - { - var el = BarcodeElement; - string oldFmt = el.BarcodeFormat; - el.SetFormat(formatStr); - UndoRedo?.RecordAction( - $"Barcode Format: {formatStr}", - () => el.BarcodeFormat = oldFmt, - () => el.BarcodeFormat = formatStr - ); - } - } - - [RelayCommand] - public void ApplyQrPreset(string presetStr) - { - if (QrCodeElement != null) - { - var el = QrCodeElement; - string oldContent = el.Content; - string oldLabel = el.Label; - el.ApplyPresetType(presetStr); - string newContent = el.Content; - string newLabel = el.Label; - - UndoRedo?.RecordAction( - $"QR Preset: {presetStr}", - () => { el.Content = oldContent; el.Label = oldLabel; }, - () => { el.Content = newContent; el.Label = newLabel; } - ); - } - } - - // --- TYPOGRAPHY EXTENSIONS --- - - [RelayCommand] - public void ToggleStrikethrough() - { - if (TextElement != null) - { - if (TryApplyInlineFormatting(InlineFormatType.Strikethrough, "Format Strikethrough Selection")) return; - - var el = TextElement; - bool oldVal = el.IsStrikethrough; - bool newVal = !oldVal; - el.IsStrikethrough = newVal; - UndoRedo?.RecordAction( - newVal ? "Format Strikethrough" : "Remove Strikethrough", - () => el.IsStrikethrough = oldVal, - () => el.IsStrikethrough = newVal - ); - } - } - - [RelayCommand] - public void TransformTextCase(string caseType) - { - if (TextElement != null) - { - var el = TextElement; - string oldText = el.Text; - if (caseType.Equals("Upper", StringComparison.OrdinalIgnoreCase)) el.TransformUppercase(); - else if (caseType.Equals("Lower", StringComparison.OrdinalIgnoreCase)) el.TransformLowercase(); - else if (caseType.Equals("Title", StringComparison.OrdinalIgnoreCase)) el.TransformTitleCase(); - string newText = el.Text; - - UndoRedo?.RecordAction( - $"Case: {caseType}", - () => el.Text = oldText, - () => el.Text = newText - ); - } - } - - [RelayCommand] - public void ToggleBullets() - { - if (TextElement != null) - { - var el = TextElement; - string oldText = el.Text; - el.ToggleBulletList(); - string newText = el.Text; - - UndoRedo?.RecordAction( - "Toggle Bullet List", - () => el.Text = oldText, - () => el.Text = newText - ); - } - } - - [RelayCommand] - public void ToggleNumbering() - { - if (TextElement != null) - { - var el = TextElement; - string oldText = el.Text; - el.ToggleNumberedList(); - string newText = el.Text; - - UndoRedo?.RecordAction( - "Toggle Numbered List", - () => el.Text = oldText, - () => el.Text = newText - ); - } - } - - [RelayCommand] - public void ToggleDoubleUnderline() - { - if (TextElement != null) - { - var el = TextElement; - bool oldVal = el.IsDoubleUnderline; - bool newVal = !oldVal; - el.IsDoubleUnderline = newVal; - UndoRedo?.RecordAction( - newVal ? "Format Double Underline" : "Remove Double Underline", - () => el.IsDoubleUnderline = oldVal, - () => el.IsDoubleUnderline = newVal - ); - } - } - - [RelayCommand] - public void SetVerticalAlignment(string vAlignStr) - { - if (TextElement != null && Enum.TryParse(vAlignStr, true, out var vAlign) && TextElement.VerticalAlignment != vAlign) - { - var el = TextElement; - var oldVal = el.VerticalAlignment; - el.VerticalAlignment = vAlign; - UndoRedo?.RecordAction( - $"Vertical Align {vAlign}", - () => el.VerticalAlignment = oldVal, - () => el.VerticalAlignment = vAlign - ); - } - } - - [RelayCommand] - public void SetTextShapeMode(string modeStr) - { - if (TextElement != null && Enum.TryParse(modeStr, true, out var mode) && TextElement.ShapeMode != mode) - { - var el = TextElement; - var oldVal = el.ShapeMode; - el.ShapeMode = mode; - UndoRedo?.RecordAction( - $"Change Text Shape {mode}", - () => el.ShapeMode = oldVal, - () => el.ShapeMode = mode - ); - } - } - - [RelayCommand] - public void SetCircularPlacement(string placementStr) - { - if (TextElement != null && Enum.TryParse(placementStr, true, out var placement) && TextElement.CircularPlacement != placement) - { - var el = TextElement; - var oldVal = el.CircularPlacement; - el.CircularPlacement = placement; - UndoRedo?.RecordAction( - $"Circular Placement {placement}", - () => el.CircularPlacement = oldVal, - () => el.CircularPlacement = placement - ); - } - } - - [RelayCommand] - public void SetBezierPreset(string presetStr) - { - if (TextElement != null && Enum.TryParse(presetStr, true, out var preset)) - { - var el = TextElement; - var oldPreset = el.BezierPreset; - double p0x = el.BezierP0X, p0y = el.BezierP0Y; - double p1x = el.BezierP1X, p1y = el.BezierP1Y; - double p2x = el.BezierP2X, p2y = el.BezierP2Y; - double p3x = el.BezierP3X, p3y = el.BezierP3Y; - - el.ApplyBezierPreset(preset); - - UndoRedo?.RecordAction( - $"Bézier Curve Preset: {preset}", - () => - { - el.BezierPreset = oldPreset; - el.BezierP0X = p0x; el.BezierP0Y = p0y; - el.BezierP1X = p1x; el.BezierP1Y = p1y; - el.BezierP2X = p2x; el.BezierP2Y = p2y; - el.BezierP3X = p3x; el.BezierP3Y = p3y; - }, - () => el.ApplyBezierPreset(preset) - ); - } - } - - [RelayCommand] - public void ResetBezierControlPoints() - { - if (TextElement != null) - { - var el = TextElement; - el.ApplyBezierPreset(BezierCurvePreset.Wave); - } - } - - [RelayCommand] - public void ApplyTypographyPreset(string presetName) - { - if (TextElement != null) - { - var el = TextElement; - var oldModel = (PdfTextElement)el.ToModel(); - el.ApplyTypographyPreset(presetName); - var newModel = (PdfTextElement)el.ToModel(); - - UndoRedo?.RecordAction( - $"Typography Preset: {presetName}", - () => el.LoadFromModel(oldModel), - () => el.LoadFromModel(newModel) - ); - } - } - - [RelayCommand] - public void ToggleTextStroke() - { - if (TextElement != null) - { - var el = TextElement; - bool oldVal = el.HasStroke; - bool newVal = !oldVal; - el.HasStroke = newVal; - UndoRedo?.RecordAction( - newVal ? "Enable Text Outline" : "Disable Text Outline", - () => el.HasStroke = oldVal, - () => el.HasStroke = newVal - ); - } - } - - [RelayCommand] - public void SetTextStrokeColor(string hex) - { - if (TextElement != null && TextElement.StrokeColorHex != hex) - { - var el = TextElement; - string oldHex = el.StrokeColorHex; - el.StrokeColorHex = hex; - el.HasStroke = true; - UndoRedo?.RecordAction( - "Change Text Stroke Color", - () => el.StrokeColorHex = oldHex, - () => el.StrokeColorHex = hex - ); - } - } - - [RelayCommand] - public void ToggleTextShadow() - { - if (TextElement != null) - { - var el = TextElement; - bool oldVal = el.HasShadow; - bool newVal = !oldVal; - el.HasShadow = newVal; - UndoRedo?.RecordAction( - newVal ? "Enable Text Shadow" : "Disable Text Shadow", - () => el.HasShadow = oldVal, - () => el.HasShadow = newVal - ); - } - } - - [RelayCommand] - public void SetTextShadowColor(string hex) - { - if (TextElement != null && TextElement.ShadowColorHex != hex) - { - var el = TextElement; - string oldHex = el.ShadowColorHex; - el.ShadowColorHex = hex; - el.HasShadow = true; - UndoRedo?.RecordAction( - "Change Text Shadow Color", - () => el.ShadowColorHex = oldHex, - () => el.ShadowColorHex = hex - ); - } - } - - [RelayCommand] - public void ToggleCurveDirection() - { - if (TextElement != null) - { - var el = TextElement; - bool oldVal = el.CurveClockwise; - bool newVal = !oldVal; - el.CurveClockwise = newVal; - UndoRedo?.RecordAction( - newVal ? "Curve Clockwise" : "Curve Counter-Clockwise", - () => el.CurveClockwise = oldVal, - () => el.CurveClockwise = newVal - ); - } - } - - [RelayCommand] - public void ToggleCurveInvert() - { - if (TextElement != null) - { - var el = TextElement; - bool oldVal = el.CurveInvert; - bool newVal = !oldVal; - el.CurveInvert = newVal; - UndoRedo?.RecordAction( - newVal ? "Invert Text Orientation" : "Normal Text Orientation", - () => el.CurveInvert = oldVal, - () => el.CurveInvert = newVal - ); - } - } - - [RelayCommand] - public void AutoFitTextWidth() - { - if (TextElement != null) - { - var el = TextElement; - double oldW = el.Width; - double newW = el.CalculateRequiredWidth(); - if (Math.Abs(newW - oldW) > 0.5) - { - el.Width = newW; - UndoRedo?.RecordAction( - "Auto-Fit Text Width", - () => el.Width = oldW, - () => el.Width = newW - ); - } - } - } - - [RelayCommand] - public void AutoFitTextBoth() - { - if (TextElement != null) - { - var el = TextElement; - double oldW = el.Width, oldH = el.Height; - double newW = el.CalculateRequiredWidth(); - double newH = el.CalculateRequiredHeight(); - el.Width = newW; - el.Height = newH; - UndoRedo?.RecordAction( - "Auto-Fit Text Dimensions", - () => { el.Width = oldW; el.Height = oldH; }, - () => { el.Width = newW; el.Height = newH; } - ); - } - } - - [RelayCommand] - public void IncreaseFontSize() - { - if (TextElement != null) - { - double step = TextElement.FontSize < 24 ? 1.0 : (TextElement.FontSize < 48 ? 2.0 : 4.0); - double newSize = Math.Min(288, Math.Round(TextElement.FontSize + step)); - SelectedFontSize = newSize; - } - } - - [RelayCommand] - public void DecreaseFontSize() - { - if (TextElement != null) - { - double step = TextElement.FontSize <= 24 ? 1.0 : (TextElement.FontSize <= 48 ? 2.0 : 4.0); - double newSize = Math.Max(4, Math.Round(TextElement.FontSize - step)); - SelectedFontSize = newSize; - } - } - - [RelayCommand] - public void StartEditMode() - { - if (SelectedElement != null) - { - SelectedElement.IsInEditMode = true; - } - } - - [RelayCommand] - public void ToggleEditMode() - { - if (SelectedElement != null) - { - SelectedElement.IsInEditMode = !SelectedElement.IsInEditMode; - } - } - - [RelayCommand] - public void FinishEditMode() - { - if (SelectedElement != null) - { - SelectedElement.IsInEditMode = false; - } - } - - [RelayCommand] - public void ResetTextTransforms() - { - if (TextElement != null) - { - var el = TextElement; - double sx = el.ScaleX, sy = el.ScaleY, bShift = el.BaselineShift, cRot = el.CharacterRotation; - bool fx = el.FlipX, fy = el.FlipY; - - el.ResetTransforms(); - UndoRedo?.RecordAction( - "Reset Text Transforms", - () => { el.ScaleX = sx; el.ScaleY = sy; el.FlipX = fx; el.FlipY = fy; el.BaselineShift = bShift; el.CharacterRotation = cRot; }, - () => { el.ResetTransforms(); } - ); - } - } - - [RelayCommand] - public void ToggleTextFlipX() - { - if (TextElement != null) - { - var el = TextElement; - bool oldVal = el.FlipX; - bool newVal = !oldVal; - el.FlipX = newVal; - UndoRedo?.RecordAction( - newVal ? "Flip Text Horizontally" : "Unflip Text Horizontally", - () => el.FlipX = oldVal, - () => el.FlipX = newVal - ); - } - } - - [RelayCommand] - public void ToggleTextFlipY() - { - if (TextElement != null) - { - var el = TextElement; - bool oldVal = el.FlipY; - bool newVal = !oldVal; - el.FlipY = newVal; - UndoRedo?.RecordAction( - newVal ? "Flip Text Vertically" : "Unflip Text Vertically", - () => el.FlipY = oldVal, - () => el.FlipY = newVal - ); - } - } - - [RelayCommand] - public void SetTextBackground(string hex) - { - if (TextElement != null) - { - var el = TextElement; - string oldHex = el.BackgroundColorHex; - el.BackgroundColorHex = hex; - UndoRedo?.RecordAction( - "Text Background Color", - () => el.BackgroundColorHex = oldHex, - () => el.BackgroundColorHex = hex - ); - } - } - - // --- FORM FIELD VALIDATION --- - - [RelayCommand] - public void SetFormFieldValidation(string valTypeStr) - { - if (FormFieldElement != null && Enum.TryParse(valTypeStr, true, out var valType)) - { - var el = FormFieldElement; - var oldType = el.ValidationType; - el.ValidationType = valType; - UndoRedo?.RecordAction( - $"Field Validation: {valType}", - () => el.ValidationType = oldType, - () => el.ValidationType = valType - ); - } - } - - [RelayCommand] - public void SetDividerStyle(string styleStr) - { - if (DividerElement != null && Enum.TryParse(styleStr, true, out var style)) - { - var el = DividerElement; - var oldStyle = el.Style; - el.Style = style; - UndoRedo?.RecordAction($"Divider Style: {style}", () => el.Style = oldStyle, () => el.Style = style); - } - } - - [RelayCommand] - public void SetDividerDashStyle(string dashStr) - { - if (DividerElement != null && Enum.TryParse(dashStr, true, out var dash)) - { - var el = DividerElement; - var oldDash = el.DashStyle; - el.DashStyle = dash; - UndoRedo?.RecordAction($"Divider Pattern: {dash}", () => el.DashStyle = oldDash, () => el.DashStyle = dash); - } - } - - [RelayCommand] - public void SetShapeDashStyle(string dashStr) - { - if (ShapeElement != null && Enum.TryParse(dashStr, true, out var dash)) - { - var el = ShapeElement; - var oldDash = el.DashStyle; - el.DashStyle = dash; - UndoRedo?.RecordAction($"Line Pattern: {dash}", () => el.DashStyle = oldDash, () => el.DashStyle = dash); - } - } - - [RelayCommand] - public void SetShapeStartCap(string capStr) - { - if (ShapeElement != null && Enum.TryParse(capStr, true, out var cap)) - { - var el = ShapeElement; - var oldCap = el.StartCap; - el.StartCap = cap; - UndoRedo?.RecordAction($"Start Cap: {cap}", () => el.StartCap = oldCap, () => el.StartCap = cap); - } - } - - [RelayCommand] - public void SetShapeEndCap(string capStr) - { - if (ShapeElement != null && Enum.TryParse(capStr, true, out var cap)) - { - var el = ShapeElement; - var oldCap = el.EndCap; - el.EndCap = cap; - UndoRedo?.RecordAction($"End Cap: {cap}", () => el.EndCap = oldCap, () => el.EndCap = cap); - } - } - - [RelayCommand] - public void ToggleInkSmoothSpline() - { - if (InkElement != null) - { - var el = InkElement; - bool oldVal = el.IsSmoothSpline; - bool newVal = !oldVal; - el.IsSmoothSpline = newVal; - UndoRedo?.RecordAction(newVal ? "Enable Bézier Ink Smoothing" : "Disable Bézier Ink Smoothing", - () => el.IsSmoothSpline = oldVal, () => el.IsSmoothSpline = newVal); - } - } - - [RelayCommand] - public void SetDividerColor(string hex) - { - if (DividerElement != null) - { - var el = DividerElement; - string oldHex = el.ColorHex; - el.ColorHex = hex; - UndoRedo?.RecordAction("Change Divider Color", () => el.ColorHex = oldHex, () => el.ColorHex = hex); - } - } - - [RelayCommand] - public void SetInkColor(string hex) - { - if (InkElement != null) - { - var el = InkElement; - string oldHex = el.StrokeColorHex; - el.StrokeColorHex = hex; - UndoRedo?.RecordAction("Change Ink Color", () => el.StrokeColorHex = oldHex, () => el.StrokeColorHex = hex); - } - } - - [RelayCommand] - public void SetStickyNoteColor(string hex) - { - if (StickyNoteElement != null) - { - var el = StickyNoteElement; - string oldHex = el.ColorHex; - el.ColorHex = hex; - UndoRedo?.RecordAction("Change Note Color", () => el.ColorHex = oldHex, () => el.ColorHex = hex); - } - } - - [RelayCommand] - public void SetRedactionFillColor(string hex) - { - if (RedactionElement != null) - { - var el = RedactionElement; - string oldHex = el.FillColorHex; - el.FillColorHex = hex; - UndoRedo?.RecordAction("Change Redaction Fill", () => el.FillColorHex = oldHex, () => el.FillColorHex = hex); - } - } - - [RelayCommand] - public void SetImageBorderColor(string hex) - { - if (ImageElement != null) - { - var el = ImageElement; - string oldHex = el.BorderColorHex; - el.BorderColorHex = hex; - UndoRedo?.RecordAction("Change Image Border Color", () => el.BorderColorHex = oldHex, () => el.BorderColorHex = hex); - } - } - - [RelayCommand] - public void SetFormFieldBackgroundColor(string hex) - { - if (FormFieldElement != null) - { - var el = FormFieldElement; - string oldHex = el.BackgroundColorHex; - el.BackgroundColorHex = hex; - UndoRedo?.RecordAction("Change Field Background", () => el.BackgroundColorHex = oldHex, () => el.BackgroundColorHex = hex); - } - } - - [RelayCommand] - public void SetFormFieldBorderColor(string hex) - { - if (FormFieldElement != null) - { - var el = FormFieldElement; - string oldHex = el.BorderColorHex; - el.BorderColorHex = hex; - UndoRedo?.RecordAction("Change Field Border", () => el.BorderColorHex = oldHex, () => el.BorderColorHex = hex); - } - } - - [RelayCommand] - public void SetFormFieldType(string typeStr) - { - if (FormFieldElement != null && Enum.TryParse(typeStr, true, out var type)) - { - var el = FormFieldElement; - var oldType = el.FieldType; - el.FieldType = type; - UndoRedo?.RecordAction($"Change Field to {type}", () => el.FieldType = oldType, () => el.FieldType = type); - } - } - - [RelayCommand] - public void SetShapeLabelColor(string hex) - { - if (ShapeElement != null) - { - var el = ShapeElement; - string? oldHex = el.LabelColorHex; - el.LabelColorHex = hex; - UndoRedo?.RecordAction("Change Shape Label Color", () => el.LabelColorHex = oldHex, () => el.LabelColorHex = hex); - } - } - - [RelayCommand] - public void SetQrCodeDarkColor(string hex) - { - if (QrCodeElement != null) - { - var el = QrCodeElement; - string oldHex = el.DarkColorHex; - el.DarkColorHex = hex; - UndoRedo?.RecordAction("Change QR Color", () => el.DarkColorHex = oldHex, () => el.DarkColorHex = hex); - } - } - - [RelayCommand] - public void SetQrCodeLightColor(string hex) - { - if (QrCodeElement != null) - { - var el = QrCodeElement; - string oldHex = el.LightColorHex; - el.LightColorHex = hex; - UndoRedo?.RecordAction("Change QR Background", () => el.LightColorHex = oldHex, () => el.LightColorHex = hex); - } - } - - [RelayCommand] - public void SetQrCodeEccLevel(string eccStr) - { - if (QrCodeElement != null && Enum.TryParse(eccStr, true, out var ecc)) - { - var el = QrCodeElement; - var oldEcc = el.EccLevel; - el.EccLevel = ecc; - UndoRedo?.RecordAction($"Change QR ECC: {ecc}", () => el.EccLevel = oldEcc, () => el.EccLevel = ecc); - } - } - - [RelayCommand] - public void SetBarcodeColor(string hex) - { - if (BarcodeElement != null) - { - var el = BarcodeElement; - string oldHex = el.BarColorHex; - el.BarColorHex = hex; - UndoRedo?.RecordAction("Change Barcode Color", () => el.BarColorHex = oldHex, () => el.BarColorHex = hex); - } - } - - [RelayCommand] - public void SetFormFieldCalculation(string calcStr) - { - if (FormFieldElement != null && Enum.TryParse(calcStr, true, out var calc)) - { - var el = FormFieldElement; - var oldCalc = el.CalculationFormula; - el.CalculationFormula = calc; - SelectedPage?.RecalculateFormFields(); - UndoRedo?.RecordAction($"Set Formula to {calc}", () => { el.CalculationFormula = oldCalc; SelectedPage?.RecalculateFormFields(); }, () => { el.CalculationFormula = calc; SelectedPage?.RecalculateFormFields(); }); - } - } - - [RelayCommand] - public void SetMeasurementColor(string hex) - { - if (MeasurementElement != null) - { - var el = MeasurementElement; - string oldHex = el.StrokeColorHex; - el.StrokeColorHex = hex; - UndoRedo?.RecordAction("Change Measurement Color", () => el.StrokeColorHex = oldHex, () => el.StrokeColorHex = hex); - } - } - - // --- DOCUMENT & PAGE LEVEL INSPECTOR COMMANDS --- - - [RelayCommand] - public void RotatePageClockwise() - { - if (SelectedPage != null) - { - var page = SelectedPage; - int oldAngle = page.RotationAngle; - int newAngle = (oldAngle + 90) % 360; - page.RotationAngle = newAngle; - UndoRedo?.RecordAction("Rotate Page 90° CW", () => page.RotationAngle = oldAngle, () => page.RotationAngle = newAngle); - } - } - - [RelayCommand] - public void RotatePageCounterClockwise() - { - if (SelectedPage != null) - { - var page = SelectedPage; - int oldAngle = page.RotationAngle; - int newAngle = (oldAngle + 270) % 360; - page.RotationAngle = newAngle; - UndoRedo?.RecordAction("Rotate Page 90° CCW", () => page.RotationAngle = oldAngle, () => page.RotationAngle = newAngle); - } - } - - [RelayCommand] - public void SetPageFormat(string formatStr) - { - if (SelectedPage != null && Enum.TryParse(formatStr, true, out var fmt)) - { - var page = SelectedPage; - var oldFmt = page.Format; - double oldW = page.Width; - double oldH = page.Height; - - (double w, double h) = fmt switch - { - PageFormat.A4 => (800.0, 1131.0), - PageFormat.Letter => (816.0, 1056.0), - PageFormat.Legal => (816.0, 1344.0), - PageFormat.A3 => (1131.0, 1600.0), - PageFormat.A5 => (565.0, 800.0), - PageFormat.Tabloid => (1056.0, 1632.0), - _ => (800.0, 1131.0) - }; - - if (page.Orientation == PageOrientation.Landscape) - { - (w, h) = (h, w); - } - - page.Format = fmt; - page.Width = w; - page.Height = h; - - UndoRedo?.RecordAction( - $"Page Format: {fmt}", - () => { page.Format = oldFmt; page.Width = oldW; page.Height = oldH; }, - () => { page.Format = fmt; page.Width = w; page.Height = h; } - ); - } - } - - [RelayCommand] - public void SetPageOrientation(string orientStr) - { - if (SelectedPage != null && Enum.TryParse(orientStr, true, out var orient)) - { - var page = SelectedPage; - if (page.Orientation == orient) return; - - var oldOrient = page.Orientation; - double oldW = page.Width; - double oldH = page.Height; - - double newW = oldH; - double newH = oldW; - - page.Orientation = orient; - page.Width = newW; - page.Height = newH; - - UndoRedo?.RecordAction( - $"Orientation: {orient}", - () => { page.Orientation = oldOrient; page.Width = oldW; page.Height = oldH; }, - () => { page.Orientation = orient; page.Width = newW; page.Height = newH; } - ); - } - } - - [RelayCommand] - public void SetPageBackgroundColor(string hex) - { - if (SelectedPage != null && SelectedPage.BackgroundColorHex != hex) - { - var page = SelectedPage; - string oldHex = page.BackgroundColorHex; - page.BackgroundColorHex = hex; - UndoRedo?.RecordAction("Change Page Background Color", () => page.BackgroundColorHex = oldHex, () => page.BackgroundColorHex = hex); - } - } - - [RelayCommand] - public void ApplyHeaderFooterPreset(string preset) - { - if (SelectedPage != null) - { - var page = SelectedPage; - page.ShowHeaderFooter = true; - if (preset == "Standard") - { - page.FooterLeft = "CONFIDENTIAL & PROPRIETARY"; - page.FooterRight = $"Page {page.PageNumber}"; - } - else if (preset == "Minimal") - { - page.FooterLeft = ""; - page.FooterRight = $"{page.PageNumber}"; - } - else if (preset == "Corporate") - { - page.HeaderLeft = "CodeFryDev"; - page.HeaderRight = DateTime.Now.ToString("yyyy-MM-dd"); - page.FooterLeft = "INTERNAL USE ONLY"; - page.FooterRight = $"Page {page.PageNumber}"; - } - } - } - - [RelayCommand] - public void SetSvgPreset(string preset) - { - if (SvgElement != null) - { - var el = SvgElement; - string? oldPreset = el.PresetName; - string oldSource = el.SvgSource; - el.ApplyPreset(preset); - UndoRedo?.RecordAction( - $"SVG Preset: {preset}", - () => { el.PresetName = oldPreset; el.SvgSource = oldSource; }, - () => el.ApplyPreset(preset) - ); - } - } - - [RelayCommand] - public void SetSvgTintColor(string hex) - { - if (SvgElement != null) - { - var el = SvgElement; - string? oldTint = el.TintColorHex; - string oldSource = el.SvgSource; - el.TintColorHex = hex; - if (!string.IsNullOrEmpty(el.PresetName)) - { - el.SvgSource = SvgOrnamentLibrary.GetSvg(el.PresetName, hex); - } - UndoRedo?.RecordAction( - "Change SVG Tint Color", - () => { el.TintColorHex = oldTint; el.SvgSource = oldSource; }, - () => { - el.TintColorHex = hex; - if (!string.IsNullOrEmpty(el.PresetName)) - el.SvgSource = SvgOrnamentLibrary.GetSvg(el.PresetName, hex); - } - ); - } - } -} diff --git a/src/PdfEditorApp/ViewModels/MainViewModel.Elements.cs b/src/PdfEditorApp/ViewModels/MainViewModel.Elements.cs deleted file mode 100644 index 869e577..0000000 --- a/src/PdfEditorApp/ViewModels/MainViewModel.Elements.cs +++ /dev/null @@ -1,1891 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using Avalonia.Platform.Storage; -using CommunityToolkit.Mvvm.Input; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; -using PdfEditorApp.Models; -using PdfEditorApp.Services; -using PdfEditorApp.Services.MathEngine; -using PdfEditorApp.ViewModels.ElementViewModels; - -namespace PdfEditorApp.ViewModels; - -public partial class MainViewModel -{ - // --- ELEMENT UNDO/REDO WRAPPER --- - - public void AddElementWithUndo(ElementViewModelBase element, string description = "") - { - if (CurrentPage == null) return; - var page = CurrentPage; - page.AddElement(element); - string desc = string.IsNullOrEmpty(description) ? $"Add {element.DisplayName}" : description; - - UndoRedo.RecordAction( - desc, - () => page.RemoveElement(element), - () => page.AddElement(element) - ); - - ShowToast(desc, "PlusCircleOutline"); - } - - public IReadOnlyList InsertableElements => _elementService.GetInsertableElements(); - - [RelayCommand] - public void InsertCanvasElement(string elementTypeId) - { - if (CurrentPage == null) return; - var descriptor = _elementService.GetDescriptor(elementTypeId); - if (descriptor == null) return; - - var vm = _elementService.CreateViewModel(elementTypeId); - var (posX, posY) = _placementService.GetPlacementPosition(CurrentPage, descriptor.DefaultWidth, descriptor.DefaultHeight); - vm.X = posX; - vm.Y = posY; - vm.Width = descriptor.DefaultWidth; - vm.Height = descriptor.DefaultHeight; - - AddElementWithUndo(vm, $"Added {descriptor.DisplayName}"); - CurrentPage.SelectedElement = vm; - Inspector.SelectedElement = vm; - } - - // --- ELEMENT CREATION COMMANDS --- - - [RelayCommand] - public void AddTextElement() - { - if (CurrentPage == null) return; - - var (posX, posY) = _placementService.GetPlacementPosition(CurrentPage, 400, 80); - var textEl = new TextElementViewModel - { - X = posX, - Y = posY, - Width = 400, - Height = 80, - Text = "New editable paragraph. Double-click or use inspector to customize text, fonts, colors, and alignments.", - FontSize = 13, - TextColorHex = "#201F1E" - }; - - AddElementWithUndo(textEl, "Added Text Paragraph"); - } - - [RelayCommand] - public void AddHeadingElement() - { - if (CurrentPage == null) return; - - var (posX, posY) = _placementService.GetPlacementPosition(CurrentPage, 500, 45); - var headingEl = new TextElementViewModel - { - X = posX, - Y = posY, - Width = 500, - Height = 45, - Text = "Section Heading", - FontSize = 22, - FontFamily = "Georgia", - IsBold = true, - TextColorHex = "#111827" - }; - - AddElementWithUndo(headingEl, "Added Section Heading"); - } - - [RelayCommand] - public void AddShapeElement(string? shapeTypeStr = "Rectangle") - { - if (CurrentPage == null) return; - - var shapeType = ShapeType.Rectangle; - if (!string.IsNullOrEmpty(shapeTypeStr) && Enum.TryParse(shapeTypeStr, true, out var parsed)) - { - shapeType = parsed; - } - - double width = shapeType == ShapeType.Circle ? 120 : 240; - double height = 120; - var (posX, posY) = _placementService.GetPlacementPosition(CurrentPage, width, height); - - var shapeEl = new ShapeElementViewModel - { - X = posX, - Y = posY, - Width = width, - Height = height, - ShapeType = shapeType, - FillColorHex = "#F0F7FD", - StrokeColorHex = "#0F6CBD", - StrokeThickness = 1.5, - CornerRadius = shapeType == ShapeType.Circle ? 60 : (shapeType == ShapeType.RoundedRectangle ? 16 : 6) - }; - - AddElementWithUndo(shapeEl, $"Added Shape ({shapeType})"); - } - - [RelayCommand] - public void AddMedalBadgeElement() - { - if (CurrentPage == null) return; - var (posX, posY) = _placementService.GetPlacementPosition(CurrentPage, 140, 170); - - var badgeEl = new ShapeElementViewModel - { - X = posX, - Y = posY, - Width = 140, - Height = 170, - ShapeType = ShapeType.MedalRibbonBadge, - FillColorHex = "#F59E0B", - StrokeColorHex = "#B45309", - StrokeThickness = 2.5, - SecondaryFillColorHex = "#990000", - ZIndex = 5 - }; - - AddElementWithUndo(badgeEl, "Added Medal Ribbon Badge"); - } - - [RelayCommand] - public void AddLaurelSealElement() - { - if (CurrentPage == null) return; - var (posX, posY) = _placementService.GetPlacementPosition(CurrentPage, 110, 110); - - var sealEl = new ShapeElementViewModel - { - X = posX, - Y = posY, - Width = 110, - Height = 110, - ShapeType = ShapeType.LaurelWreathSeal, - FillColorHex = "#FEF3C7", - StrokeColorHex = "#B45309", - StrokeThickness = 2.0, - Label = "OFFICIAL", - LabelColorHex = "#92400E", - LabelFontSize = 10, - ZIndex = 5 - }; - - AddElementWithUndo(sealEl, "Added Laurel Gold Seal"); - } - - [RelayCommand] - public void AddRibbonBannerElement() - { - if (CurrentPage == null) return; - var (posX, posY) = _placementService.GetPlacementPosition(CurrentPage, 320, 50); - - var bannerEl = new ShapeElementViewModel - { - X = posX, - Y = posY, - Width = 320, - Height = 50, - ShapeType = ShapeType.RibbonBanner, - FillColorHex = "#990000", - StrokeColorHex = "#F59E0B", - StrokeThickness = 1.5, - Label = "AWARD OF EXCELLENCE", - LabelColorHex = "#FFFFFF", - LabelFontSize = 13, - ZIndex = 5 - }; - - AddElementWithUndo(bannerEl, "Added Ribbon Banner"); - } - - [RelayCommand] - public void AddCornerAccentElement(string? corner = "TopLeft") - { - if (CurrentPage == null) return; - - bool isBottomRight = string.Equals(corner, "BottomRight", StringComparison.OrdinalIgnoreCase); - double w = 240; - double h = 240; - double posX = isBottomRight ? Math.Max(0, CurrentPage.Width - w) : 0; - double posY = isBottomRight ? Math.Max(0, CurrentPage.Height - h) : 0; - - var cornerEl = new ShapeElementViewModel - { - X = posX, - Y = posY, - Width = w, - Height = h, - ShapeType = isBottomRight ? ShapeType.CornerPolygonalAccentBottomRight : ShapeType.CornerPolygonalAccentTopLeft, - FillColorHex = "#990000", - StrokeColorHex = "#F59E0B", - StrokeThickness = 2.0, - ZIndex = 1 - }; - - AddElementWithUndo(cornerEl, $"Added Corner Accent ({corner})"); - } - - [RelayCommand] - public void AddSignatureBlock() - { - if (CurrentPage == null) return; - var (posX, posY) = _placementService.GetPlacementPosition(CurrentPage, 260, 110); - - var scriptEl = new TextElementViewModel - { - X = posX, - Y = posY, - Width = 260, - Height = 45, - Text = "John Smith", - FontSize = 28, - FontFamily = "Great Vibes", - IsItalic = true, - TextColorHex = "#1E293B", - Alignment = TextAlignmentMode.Center, - ZIndex = 5 - }; - - var lineEl = new DividerElementViewModel - { - X = posX, - Y = posY + 50, - Width = 260, - Thickness = 1.5, - ColorHex = "#1E293B", - ZIndex = 5 - }; - - var nameEl = new TextElementViewModel - { - X = posX, - Y = posY + 58, - Width = 260, - Height = 24, - Text = "Mr. John Smith", - FontSize = 15, - FontFamily = "Inter", - IsBold = true, - TextColorHex = "#1E293B", - Alignment = TextAlignmentMode.Center, - ZIndex = 5 - }; - - var titleEl = new TextElementViewModel - { - X = posX, - Y = posY + 82, - Width = 260, - Height = 22, - Text = "President & Dean", - FontSize = 13, - FontFamily = "Inter", - TextColorHex = "#64748B", - Alignment = TextAlignmentMode.Center, - ZIndex = 5 - }; - - AddElementWithUndo(scriptEl, "Added Signature Block"); - if (CurrentPage != null) - { - CurrentPage.AddElement(lineEl); - CurrentPage.AddElement(nameEl); - CurrentPage.AddElement(titleEl); - } - } - - [RelayCommand] - public void AddDateBlock() - { - if (CurrentPage == null) return; - var (posX, posY) = _placementService.GetPlacementPosition(CurrentPage, 240, 70); - - var dateEl = new TextElementViewModel - { - X = posX, - Y = posY, - Width = 240, - Height = 28, - Text = DateTime.Now.ToString("MMMM dd, yyyy"), - FontSize = 15, - FontFamily = "Inter", - IsBold = true, - TextColorHex = "#1E293B", - Alignment = TextAlignmentMode.Center, - ZIndex = 5 - }; - - var lineEl = new DividerElementViewModel - { - X = posX, - Y = posY + 32, - Width = 240, - Thickness = 1.5, - ColorHex = "#1E293B", - ZIndex = 5 - }; - - var labelEl = new TextElementViewModel - { - X = posX, - Y = posY + 40, - Width = 240, - Height = 24, - Text = "Date of Issuance", - FontSize = 14, - FontFamily = "Inter", - IsBold = true, - TextColorHex = "#1E293B", - Alignment = TextAlignmentMode.Center, - ZIndex = 5 - }; - - AddElementWithUndo(dateEl, "Added Date Block"); - if (CurrentPage != null) - { - CurrentPage.AddElement(lineEl); - CurrentPage.AddElement(labelEl); - } - } - - [RelayCommand] - public async Task AddImageElementAsync() - { - if (CurrentPage == null) return; - - try - { - if (StorageProvider != null) - { - var files = await StorageProvider.OpenFilePickerAsync(new FilePickerOpenOptions - { - Title = "Insert Image", - AllowMultiple = false, - FileTypeFilter = new[] - { - new FilePickerFileType("Image Files (*.png, *.jpg, *.jpeg, *.webp)") - { - Patterns = new[] { "*.png", "*.jpg", "*.jpeg", "*.webp", "*.bmp" } - } - } - }); - - if (files.Count > 0) - { - string filePath = files[0].Path.LocalPath; - var (posX, posY) = _placementService.GetPlacementPosition(CurrentPage, 260, 180); - var imgEl = new ImageElementViewModel - { - X = posX, - Y = posY, - Width = 260, - Height = 180, - ImagePath = filePath - }; - - AddElementWithUndo(imgEl, $"Inserted Image: {Path.GetFileName(filePath)}"); - return; - } - } - - // Fallback placeholder image element - var (fallbackX, fallbackY) = _placementService.GetPlacementPosition(CurrentPage, 260, 180); - var fallbackImg = new ImageElementViewModel - { - X = fallbackX, - Y = fallbackY, - Width = 260, - Height = 180, - AltText = "Inserted Graphic" - }; - AddElementWithUndo(fallbackImg, "Inserted Image Placeholder"); - } - catch (Exception ex) - { - ShowToast($"Image error: {ex.Message}", "AlertCircleOutline"); - } - } - - [RelayCommand] - public void AddStampElement(string? stampTypeStr = "Approved") - { - if (CurrentPage == null) return; - - string label = stampTypeStr?.ToUpper() ?? "APPROVED"; - string fillHex = stampTypeStr?.ToLower() switch - { - "approved" => "#DCFCE7", - "confidential" => "#FEE2E2", - "draft" => "#F1F5F9", - "urgent" => "#FEF3C7", - "void" => "#FFEDD5", - _ => "#EFF6FF" - }; - string strokeHex = stampTypeStr?.ToLower() switch - { - "approved" => "#16A34A", - "confidential" => "#DC2626", - "draft" => "#64748B", - "urgent" => "#D97706", - "void" => "#EA580C", - _ => "#0F6CBD" - }; - - var (posX, posY) = _placementService.GetPlacementPosition(CurrentPage, 180, 60); - var stampEl = new ShapeElementViewModel - { - X = posX, - Y = posY, - Width = 180, - Height = 60, - ShapeType = ShapeType.RoundedRectangle, - CornerRadius = 8, - FillColorHex = fillHex, - StrokeColorHex = strokeHex, - StrokeThickness = 2.0, - Label = label, - LabelColorHex = strokeHex, - LabelFontSize = 18 - }; - - AddElementWithUndo(stampEl, $"Added Stamp ({label})"); - } - - [RelayCommand] - public void AddStickyNoteElement() - { - if (CurrentPage == null) return; - - var (posX, posY) = _placementService.GetPlacementPosition(CurrentPage, 200, 150); - var noteEl = new StickyNoteElementViewModel - { - X = posX, - Y = posY, - Width = 200, - Height = 150, - Author = "Lead Reviewer", - NoteText = "Please verify financial data and audit metrics prior to final executive sign-off.", - Status = "Pending Review", - ColorHex = "#FEF3C7", - BorderColorHex = "#F59E0B" - }; - - AddElementWithUndo(noteEl, "Added Sticky Note"); - RefreshComments(); - } - - [RelayCommand] - public void AddDividerElement() - { - if (CurrentPage == null) return; - - double width = Math.Max(200, CurrentPage.Width - 80); - var (posX, posY) = _placementService.GetPlacementPosition(CurrentPage, width, 16); - var divEl = new DividerElementViewModel - { - X = posX, - Y = posY, - Width = width, - Height = 3, - Thickness = 2, - ColorHex = "#0F6CBD" - }; - - AddElementWithUndo(divEl, "Added Divider Line"); - } - - [RelayCommand] - public void AddWaveDividerElement() - { - if (CurrentPage == null) return; - double width = Math.Max(200, CurrentPage.Width - 80); - var (posX, posY) = _placementService.GetPlacementPosition(CurrentPage, width, 24); - var divEl = new DividerElementViewModel - { - X = posX, - Y = posY, - Width = width, - Height = 24, - Thickness = 2.0, - Style = DividerStyle.Wave, - WaveAmplitude = 8.0, - WaveFrequency = 5.0, - ColorHex = "#2563EB" - }; - AddElementWithUndo(divEl, "Added Wave Divider"); - } - - [RelayCommand] - public void AddFlourishDividerElement() - { - if (CurrentPage == null) return; - double width = Math.Max(200, CurrentPage.Width - 80); - var (posX, posY) = _placementService.GetPlacementPosition(CurrentPage, width, 24); - var divEl = new DividerElementViewModel - { - X = posX, - Y = posY, - Width = width, - Height = 24, - Thickness = 1.8, - Style = DividerStyle.CalligraphicFlourish, - WaveAmplitude = 6.0, - ColorHex = "#D97706" - }; - AddElementWithUndo(divEl, "Added Calligraphic Flourish Divider"); - } - - [RelayCommand] - public void AddBezierCurveElement() - { - if (CurrentPage == null) return; - var (posX, posY) = _placementService.GetPlacementPosition(CurrentPage, 220, 90); - var curveEl = new ShapeElementViewModel - { - X = posX, - Y = posY, - Width = 220, - Height = 90, - ShapeType = ShapeType.BezierCurve, - FillColorHex = "#00000000", - StrokeColorHex = "#2563EB", - StrokeThickness = 2.5, - StartCap = LineEndCap.None, - EndCap = LineEndCap.None - }; - AddElementWithUndo(curveEl, "Added Bézier Curve Line"); - } - - [RelayCommand] - public void AddCurvedArrowElement() - { - if (CurrentPage == null) return; - var (posX, posY) = _placementService.GetPlacementPosition(CurrentPage, 220, 90); - var arrowEl = new ShapeElementViewModel - { - X = posX, - Y = posY, - Width = 220, - Height = 90, - ShapeType = ShapeType.CurvedArrow, - FillColorHex = "#00000000", - StrokeColorHex = "#7C3AED", - StrokeThickness = 2.5, - EndCap = LineEndCap.Arrow - }; - AddElementWithUndo(arrowEl, "Added Curved Arrow"); - } - - [RelayCommand] - public void AddCurlyBraceElement() - { - if (CurrentPage == null) return; - var (posX, posY) = _placementService.GetPlacementPosition(CurrentPage, 40, 160); - var braceEl = new ShapeElementViewModel - { - X = posX, - Y = posY, - Width = 40, - Height = 160, - ShapeType = ShapeType.CurlyBrace, - FillColorHex = "#00000000", - StrokeColorHex = "#0F6CBD", - StrokeThickness = 2.0 - }; - AddElementWithUndo(braceEl, "Added Calligraphic Curly Brace"); - } - - [RelayCommand] - public void AddTableElement() - { - if (CurrentPage == null) return; - - double width = Math.Max(300, CurrentPage.Width - 80); - var (posX, posY) = _placementService.GetPlacementPosition(CurrentPage, width, 180); - var tableEl = new TableElementViewModel - { - X = posX, - Y = posY, - Width = width, - Height = 180 - }; - - AddElementWithUndo(tableEl, "Added Table"); - } - - [RelayCommand] - public void AddChartElement(string? chartTypeStr = "BarColumn") - { - if (CurrentPage == null) return; - - var chartType = ChartType.BarColumn; - if (!string.IsNullOrEmpty(chartTypeStr) && Enum.TryParse(chartTypeStr, true, out var parsed)) - { - chartType = parsed; - } - - var (posX, posY) = _placementService.GetPlacementPosition(CurrentPage, 400, 220); - var chartEl = new ChartElementViewModel - { - X = posX, - Y = posY, - Width = 400, - Height = 220, - ChartType = chartType, - Title = $"{chartType} Chart Analysis" - }; - - AddElementWithUndo(chartEl, $"Added {chartType} Chart"); - } - - [RelayCommand] - public void OpenDataStudio(string? mode = "NewChart") - { - DataStudio.StorageProvider = StorageProvider; - if (Inspector.ChartElement != null) - { - DataStudio.OpenForChart(Inspector.ChartElement, CurrentPage); - } - else if (Inspector.TableElement != null) - { - DataStudio.OpenForTable(Inspector.TableElement, CurrentPage); - } - else - { - DataStudio.OpenForNew(mode ?? "NewChart", CurrentPage); - } - } - - [RelayCommand] - public void OpenBatchGeneration(string? preset = null) - { - BatchGeneration.StorageProvider = StorageProvider; - var doc = (IsEditorVisible && Pages.Count > 0) ? ToDocumentModel() : _templateService.CreateEmployeePayslipTemplate(); - BatchGeneration.OpenWithDocument(doc); - if (preset == "payslip") - { - BatchGeneration.LoadDefaultSamplePayslipDataset(); - } - } - - [RelayCommand] - public async Task ImportExcelToChartAsync() - { - DataStudio.StorageProvider = StorageProvider; - DataStudio.OpenForNew("NewChart", CurrentPage); - DataStudio.SelectedTabIndex = 0; - await DataStudio.BrowseFileAsync(); - } - - [RelayCommand] - public async Task ImportExcelToTableAsync() - { - DataStudio.StorageProvider = StorageProvider; - DataStudio.OpenForNew("NewTable", CurrentPage); - DataStudio.SelectedTabIndex = 0; - await DataStudio.BrowseFileAsync(); - } - - [RelayCommand] - public void FetchRestApiToChart() - { - DataStudio.StorageProvider = StorageProvider; - DataStudio.OpenForNew("NewChart", CurrentPage); - DataStudio.SelectedTabIndex = 1; - } - - [RelayCommand] - public void FetchRestApiToTable() - { - DataStudio.StorageProvider = StorageProvider; - DataStudio.OpenForNew("NewTable", CurrentPage); - DataStudio.SelectedTabIndex = 1; - } - - [RelayCommand] - public void AddWatermarkElement() - { - if (CurrentPage == null) return; - - var (posX, posY) = _placementService.GetPlacementPosition(CurrentPage, 400, 100); - var wmEl = new WatermarkElementViewModel - { - X = posX, - Y = posY, - Text = "CONFIDENTIAL", - FontSize = 56, - ColorHex = "#DC2626", - Opacity = 0.15, - Angle = -35 - }; - - AddElementWithUndo(wmEl, "Added Watermark Overlay"); - } - - [RelayCommand] - public void AddFormFieldElement(string? formTypeStr = "Text") - { - if (CurrentPage == null) return; - - var fieldType = FormFieldType.Text; - if (!string.IsNullOrEmpty(formTypeStr) && Enum.TryParse(formTypeStr, true, out var parsed)) - { - fieldType = parsed; - } - - double width = fieldType == FormFieldType.Checkbox ? 180 : (fieldType == FormFieldType.Signature ? 260 : 340); - double height = fieldType == FormFieldType.Signature ? 90 : (fieldType == FormFieldType.MultilineText ? 80 : 42); - var (posX, posY) = _placementService.GetPlacementPosition(CurrentPage, width, height); - - var formEl = new FormFieldElementViewModel - { - X = posX, - Y = posY, - Width = width, - Height = height, - FieldType = fieldType, - Label = fieldType switch - { - FormFieldType.Text => "Full Legal Name:", - FormFieldType.MultilineText => "Additional Notes / Comments:", - FormFieldType.Checkbox => "I accept the Terms & Conditions", - FormFieldType.Radio => "Select Option:", - FormFieldType.Dropdown => "Country / Jurisdiction:", - FormFieldType.Signature => "Authorized Officer Signature:", - _ => "Field:" - }, - Placeholder = fieldType == FormFieldType.Signature ? "Click to Sign / Verify Identity" : "Enter value..." - }; - - AddElementWithUndo(formEl, $"Added Form Field ({fieldType})"); - } - - [RelayCommand] - public void AddQrCodeElement() - { - if (CurrentPage == null) return; - - var (posX, posY) = _placementService.GetPlacementPosition(CurrentPage, 130, 150); - var qrEl = new QrCodeElementViewModel - { - X = posX, - Y = posY, - Width = 130, - Height = 150, - Content = "https://github.com/PrashantUnity/PDFCreator", - Label = "SCAN TO VERIFY CREDENTIAL" - }; - - AddElementWithUndo(qrEl, "Added Vector QR Code"); - } - - [RelayCommand] - public void AddBarcodeElement() - { - if (CurrentPage == null) return; - - var (posX, posY) = _placementService.GetPlacementPosition(CurrentPage, 240, 65); - var barcodeEl = new BarcodeElementViewModel - { - X = posX, - Y = posY, - Width = 240, - Height = 65, - CodeValue = $"DOC-2026-{Random.Shared.Next(100000, 999999)}" - }; - - AddElementWithUndo(barcodeEl, "Added Barcode"); - } - - [RelayCommand] - public void AddRedactionElement(string? exemptionCode = "[REDACTED - (b)(4) PRIVILEGED]") - { - if (CurrentPage == null) return; - - var (posX, posY) = _placementService.GetPlacementPosition(CurrentPage, 320, 36); - var redEl = new RedactionElementViewModel - { - X = posX, - Y = posY, - Width = 320, - Height = 36, - ExemptionCode = exemptionCode ?? "[REDACTED]" - }; - - AddElementWithUndo(redEl, "Added Redaction Box"); - } - - [RelayCommand] - public void AddInkElement(object? isHighlighterParam = null) - { - if (CurrentPage == null) return; - - bool isHighlighter = isHighlighterParam switch - { - bool b => b, - string s when bool.TryParse(s, out var parsed) => parsed, - _ => false - }; - - double height = isHighlighter ? 24 : 12; - var (posX, posY) = _placementService.GetPlacementPosition(CurrentPage, 260, height); - - var inkEl = new InkElementViewModel - { - X = posX, - Y = posY, - Width = 260, - Height = height, - StrokeColorHex = isHighlighter ? "#FEF08A" : "#0F6CBD", - StrokeThickness = isHighlighter ? 14.0 : 3.0, - Opacity = isHighlighter ? 0.45 : 1.0, - IsHighlighter = isHighlighter - }; - - AddElementWithUndo(inkEl, isHighlighter ? "Added Highlighter Stroke" : "Added Freehand Ink Stroke"); - } - - [RelayCommand] - public void AddSvgElement(string? presetName = null) - { - if (CurrentPage == null) return; - - string preset = string.IsNullOrWhiteSpace(presetName) ? "GaneshaCrest" : presetName; - double w = preset switch - { - "MarigoldToran" => 500, - "DottedFloralDivider" => 400, - "MandapArch" => 480, - "PlantainTrees" => 90, - "TraditionalDeepam" => 60, - _ => 150 - }; - double h = preset switch - { - "MarigoldToran" => 75, - "DottedFloralDivider" => 25, - "MandapArch" => 55, - "PlantainTrees" => 180, - "TraditionalDeepam" => 140, - _ => 150 - }; - - var (posX, posY) = _placementService.GetPlacementPosition(CurrentPage, w, h); - var svgEl = new SvgElementViewModel - { - X = posX, - Y = posY, - Width = w, - Height = h, - PresetName = preset, - SvgSource = SvgOrnamentLibrary.GetSvg(preset) - }; - - AddElementWithUndo(svgEl, $"Added Vector Ornament ({preset})"); - } - - [RelayCommand] - public void AddOrnamentElement(string ornamentName) - { - AddSvgElement(ornamentName); - } - - // --- MATHEMATICAL EQUATIONS & FORMULA STUDIO --- - - [RelayCommand] - public void AddMathElement(string? presetId = null) - { - if (CurrentPage == null) return; - - var mathEl = new MathElementViewModel(); - - if (!string.IsNullOrEmpty(presetId)) - { - var preset = MathPresetsLibrary.FindById(presetId) ?? MathPresetsLibrary.FindByName(presetId); - if (preset != null) - { - mathEl.Formula = preset.Formula; - mathEl.PresetName = preset.Name; - mathEl.Description = preset.Description; - mathEl.Category = preset.Category; - mathEl.EquationNumber = preset.DefaultEquationNumber; - mathEl.Width = preset.DefaultWidth; - mathEl.Height = preset.DefaultHeight; - } - } - - var (posX, posY) = _placementService.GetPlacementPosition(CurrentPage, mathEl.Width, mathEl.Height); - mathEl.X = posX; - mathEl.Y = posY; - mathEl.RenderSvg(); - - AddElementWithUndo(mathEl, $"Added Equation: {mathEl.DisplayName}"); - } - - [RelayCommand] - public void OpenMathStudio(MathElementViewModel? target = null) - { - EditingMathElement = target; - if (target != null) - { - MathStudioFormula = target.Formula; - MathStudioPresetName = target.PresetName ?? "Custom Formula"; - MathStudioEquationNumber = target.EquationNumber; - MathStudioShowNumber = target.ShowEquationNumber; - MathStudioCategory = target.Category; - } - else - { - MathStudioFormula = @"\int_{-\infty}^{\infty} e^{-x^2} \, dx = \sqrt{\pi}"; - MathStudioPresetName = "Gaussian Integral"; - MathStudioEquationNumber = "(1)"; - MathStudioShowNumber = false; - MathStudioCategory = MathCategory.Calculus; - } - - UpdateMathStudioPreview(); - IsMathStudioOpen = true; - OpenRegisteredDialog("frypdf.dialog.math"); - } - - [RelayCommand] - public void CloseMathStudio() - { - IsMathStudioOpen = false; - EditingMathElement = null; - CloseDynamicDialog(); - } - - [RelayCommand] - public void ApplyMathStudioEquation() - { - if (EditingMathElement != null) - { - var el = EditingMathElement; - string oldFormula = el.Formula; - string newFormula = MathStudioFormula; - bool oldNum = el.ShowEquationNumber; - bool newNum = MathStudioShowNumber; - string oldNumVal = el.EquationNumber; - string newNumVal = MathStudioEquationNumber; - - el.Formula = newFormula; - el.ShowEquationNumber = newNum; - el.EquationNumber = newNumVal; - el.PresetName = MathStudioPresetName; - el.Category = MathStudioCategory; - el.RenderSvg(); - - UndoRedo.RecordAction( - "Edit Equation", - () => { el.Formula = oldFormula; el.ShowEquationNumber = oldNum; el.EquationNumber = oldNumVal; el.RenderSvg(); }, - () => { el.Formula = newFormula; el.ShowEquationNumber = newNum; el.EquationNumber = newNumVal; el.RenderSvg(); } - ); - - ShowToast("Equation Updated", "Sigma"); - } - else if (CurrentPage != null) - { - var (posX, posY) = _placementService.GetPlacementPosition(CurrentPage, 320, 60); - var newEl = new MathElementViewModel - { - X = posX, - Y = posY, - Width = 320, - Height = 60, - Formula = MathStudioFormula, - PresetName = MathStudioPresetName, - ShowEquationNumber = MathStudioShowNumber, - EquationNumber = MathStudioEquationNumber, - Category = MathStudioCategory - }; - newEl.RenderSvg(); - AddElementWithUndo(newEl, "Inserted Math Equation"); - } - - CloseMathStudio(); - } - - [RelayCommand] - public void InsertMathStudioSymbol(string snippet) - { - if (string.IsNullOrEmpty(snippet)) return; - string resolved = MathPresetsLibrary.ResolveSnippet(snippet); - MathStudioFormula = string.IsNullOrWhiteSpace(MathStudioFormula) ? resolved : $"{MathStudioFormula} {resolved}"; - } - - [RelayCommand] - public void ApplyMathStudioPreset(string presetId) - { - if (string.IsNullOrEmpty(presetId)) return; - var preset = MathPresetsLibrary.FindById(presetId) ?? MathPresetsLibrary.FindByName(presetId); - if (preset != null) - { - MathStudioFormula = preset.Formula; - MathStudioPresetName = preset.Name; - MathStudioEquationNumber = preset.DefaultEquationNumber; - MathStudioCategory = preset.Category; - } - } - - // --- FILL & SIGN / DIGITAL SIGNATURE STUDIO --- - - [RelayCommand] - public void OpenSignatureStudio() - { - IsSignatureStudioOpen = true; - OpenRegisteredDialog("frypdf.dialog.signature"); - } - - [RelayCommand] - public void CloseSignatureStudio() - { - IsSignatureStudioOpen = false; - CloseDynamicDialog(); - } - - [RelayCommand] - public void PlaceSignatureFromStudio() - { - if (CurrentPage == null) return; - string name = string.IsNullOrWhiteSpace(SignatureSignerName) ? "Jane Doe" : SignatureSignerName.Trim(); - - var (posX, posY) = _placementService.GetPlacementPosition(CurrentPage, 260, 55); - var sigEl = _signatureService.CreateCursiveSignatureElement(name, SelectedSignatureStyle, posX, posY); - var vm = new TextElementViewModel(); - vm.LoadFromModel(sigEl); - - AddElementWithUndo(vm, $"Placed Signature ({name})"); - CloseSignatureStudio(); - } - - [RelayCommand] - public void AddDateStamp() - { - if (CurrentPage == null) return; - var (posX, posY) = _placementService.GetPlacementPosition(CurrentPage, 180, 35); - var dateEl = _signatureService.CreateDateStampElement(posX, posY); - var vm = new TextElementViewModel(); - vm.LoadFromModel(dateEl); - AddElementWithUndo(vm, "Added Date Stamp"); - } - - [RelayCommand] - public void AddInitialsBadge(string? initials = "JD") - { - if (CurrentPage == null) return; - var (posX, posY) = _placementService.GetPlacementPosition(CurrentPage, 55, 55); - var initEl = _signatureService.CreateInitialsElement(initials ?? "JD", posX, posY); - var vm = new ShapeElementViewModel(); - vm.LoadFromModel(initEl); - AddElementWithUndo(vm, $"Added Initials ({initEl.Label})"); - } - - [RelayCommand] - public void AddCheckmarkBadge() - { - if (CurrentPage == null) return; - var (posX, posY) = _placementService.GetPlacementPosition(CurrentPage, 42, 42); - var badge = _signatureService.CreateMarkupBadge("✓", "#16A34A", posX, posY); - var vm = new ShapeElementViewModel(); - vm.LoadFromModel(badge); - AddElementWithUndo(vm, "Added Checkmark (✓)"); - } - - [RelayCommand] - public void AddCrossBadge() - { - if (CurrentPage == null) return; - var (posX, posY) = _placementService.GetPlacementPosition(CurrentPage, 42, 42); - var badge = _signatureService.CreateMarkupBadge("✕", "#DC2626", posX, posY); - var vm = new ShapeElementViewModel(); - vm.LoadFromModel(badge); - AddElementWithUndo(vm, "Added Cross Mark (✕)"); - } - - // --- WATERMARK MANAGER --- - - [RelayCommand] - public void OpenWatermarkManager() - { - IsWatermarkManagerOpen = true; - OpenRegisteredDialog("frypdf.dialog.watermark"); - } - - [RelayCommand] - public void CloseWatermarkManager() - { - IsWatermarkManagerOpen = false; - CloseDynamicDialog(); - } - - [RelayCommand] - public void ApplyWatermarkToAllPages() - { - string text = string.IsNullOrWhiteSpace(WatermarkPresetText) ? "CONFIDENTIAL" : WatermarkPresetText.Trim(); - foreach (var page in Pages) - { - var wm = new WatermarkElementViewModel - { - Text = text, - ColorHex = WatermarkColorHex, - Opacity = WatermarkOpacity, - Angle = WatermarkAngle, - FontSize = 56, - X = Math.Max(0, (page.Width - 400) / 2), - Y = Math.Max(0, (page.Height - 100) / 2) - }; - - // Remove existing watermark if any - var existing = page.Elements.OfType().ToList(); - foreach (var ex in existing) page.RemoveElement(ex); - - page.AddElement(wm); - } - - CloseWatermarkManager(); - ShowToast($"Applied watermark '{text}' to all {Pages.Count} pages", "Watermark"); - } - - [RelayCommand] - public void RemoveAllWatermarks() - { - int count = 0; - foreach (var page in Pages) - { - var existing = page.Elements.OfType().ToList(); - foreach (var ex in existing) - { - page.RemoveElement(ex); - count++; - } - } - CloseWatermarkManager(); - ShowToast($"Removed {count} watermarks from document", "WatermarkOff"); - } - - // --- SEARCH & REDACT (FOIA / PRIVACY) --- - - [RelayCommand] - public void OpenSearchRedactDialog() - { - IsSearchRedactDialogOpen = true; - OpenRegisteredDialog("frypdf.dialog.searchredact"); - } - - [RelayCommand] - public void CloseSearchRedactDialog() - { - IsSearchRedactDialogOpen = false; - CloseDynamicDialog(); - } - - [RelayCommand] - public void ExecuteSearchAndRedact() - { - if (string.IsNullOrWhiteSpace(SearchRedactQuery) || CurrentPage == null) return; - string query = SearchRedactQuery.Trim(); - string exemption = SelectedExemptionCode ?? "[REDACTED]"; - - int matchesCount = 0; - var textElements = CurrentPage.Elements.OfType().ToList(); - - foreach (var textEl in textElements) - { - if (textEl.Text.Contains(query, StringComparison.OrdinalIgnoreCase)) - { - var redEl = new RedactionElementViewModel - { - X = textEl.X, - Y = textEl.Y, - Width = textEl.Width, - Height = textEl.Height, - ExemptionCode = exemption - }; - CurrentPage.AddElement(redEl); - matchesCount++; - } - } - - CloseSearchRedactDialog(); - ShowToast($"Placed {matchesCount} redaction boxes matching '{query}'", "EyeOffOutline"); - } - - [RelayCommand] - public void BurnInAllRedactions() - { - int burned = 0; - foreach (var page in Pages) - { - var redactions = page.Elements.OfType().ToList(); - foreach (var red in redactions) - { - red.FillColorHex = "#000000"; - red.BorderColorHex = "#000000"; - red.TextColorHex = "#FFFFFF"; - red.ShowOverlayText = true; - burned++; - } - } - ShowToast($"Permanently committed & burned in {burned} redactions", "ShieldCheckOutline"); - } - - // --- CUSTOM STAMP CREATOR --- - - [RelayCommand] - public void OpenCustomStampDialog() - { - IsCustomStampDialogOpen = true; - OpenRegisteredDialog("frypdf.dialog.customstamp"); - } - - [RelayCommand] - public void CloseCustomStampDialog() - { - IsCustomStampDialogOpen = false; - CloseDynamicDialog(); - } - - [RelayCommand] - public void PlaceCustomStamp() - { - if (CurrentPage == null) return; - string text = string.IsNullOrWhiteSpace(CustomStampText) ? "RECEIVED" : CustomStampText.Trim().ToUpper(); - string color = string.IsNullOrWhiteSpace(CustomStampColorHex) ? "#0F6CBD" : CustomStampColorHex; - - var (posX, posY) = _placementService.GetPlacementPosition(CurrentPage, 220, 65); - var stampEl = new ShapeElementViewModel - { - X = posX, - Y = posY, - Width = 220, - Height = 65, - ShapeType = ShapeType.RoundedRectangle, - CornerRadius = 8, - FillColorHex = "#FFFFFF", - StrokeColorHex = color, - StrokeThickness = 2.5, - Label = $"{text}\n{DateTime.Now:yyyy-MM-dd HH:mm}", - LabelColorHex = color, - LabelFontSize = 13 - }; - - AddElementWithUndo(stampEl, $"Placed Custom Stamp ({text})"); - CloseCustomStampDialog(); - } - - // --- PREFLIGHT & HEALTH DIAGNOSTICS --- - - [RelayCommand] - public async Task OpenPreflightDialogAsync() - { - IsPreflightDialogOpen = true; - OpenRegisteredDialog("frypdf.dialog.preflight"); - IsAuditRunning = true; - try - { - var docModel = ToDocumentModel(); - ActiveAuditReport = await _auditService.RunAuditAsync(docModel); - } - finally - { - IsAuditRunning = false; - } - } - - [RelayCommand] - public async Task AutoFixPreflightIssuesAsync() - { - var docModel = ToDocumentModel(); - int fixedCount = _auditService.AutoFixAllIssues(docModel); - - if (fixedCount > 0) - { - for (int pIdx = 0; pIdx < docModel.Pages.Count && pIdx < Pages.Count; pIdx++) - { - var pModel = docModel.Pages[pIdx]; - var pVm = Pages[pIdx]; - - for (int eIdx = 0; eIdx < pModel.Elements.Count && eIdx < pVm.Elements.Count; eIdx++) - { - var elModel = pModel.Elements[eIdx]; - var elVm = pVm.Elements[eIdx]; - - if (elModel is PdfTextElement textModel && elVm is TextElementViewModel textVm) - { - textVm.TextColorHex = textModel.TextColorHex; - } - else if (elModel is PdfImageElement imgModel && elVm is ImageElementViewModel imgVm) - { - imgVm.AltText = imgModel.AltText; - } - } - } - - if (!string.IsNullOrWhiteSpace(docModel.Title)) DocumentTitle = docModel.Title; - - IsAuditRunning = true; - try - { - ActiveAuditReport = await _auditService.RunAuditAsync(docModel); - } - finally - { - IsAuditRunning = false; - } - ShowToast($"Auto-remediated {fixedCount} compliance issues", "CheckCircleOutline"); - } - else - { - ShowToast("No auto-fixable issues detected", "InformationOutline"); - } - } - - [RelayCommand] - public void NavigateToPreflightIssue(AuditIssueItem? issue) - { - if (issue == null) return; - - int pageIdx = Math.Clamp(issue.PageIndex - 1, 0, Pages.Count - 1); - if (pageIdx >= 0 && pageIdx < Pages.Count) - { - CurrentPage = Pages[pageIdx]; - - if (!string.IsNullOrWhiteSpace(issue.ElementId)) - { - var el = CurrentPage.Elements.FirstOrDefault(e => e.Id == issue.ElementId); - if (el != null) - { - CurrentPage.SelectElement(el); - Inspector.UpdateSelection(el, CurrentPage); - } - } - - IsPreflightDialogOpen = false; - ShowToast($"Jumped to Page {issue.PageIndex}: {issue.Title}", "Magnify"); - } - } - - [RelayCommand] - public void ClosePreflightDialog() - { - IsPreflightDialogOpen = false; - CloseDynamicDialog(); - } - - [RelayCommand] - public async Task ExportPreflightReportAsync() - { - if (ActiveAuditReport == null) - { - var docModel = ToDocumentModel(); - ActiveAuditReport = await _auditService.RunAuditAsync(docModel); - } - - var sb = new System.Text.StringBuilder(); - sb.AppendLine($"# PDF Preflight Audit Report: {DocumentTitle}"); - sb.AppendLine($"Generated on: {DateTime.Now:yyyy-MM-dd HH:mm:ss} UTC"); - sb.AppendLine($"Health Score: {ActiveAuditReport.HealthScore}/100 (Grade {ActiveAuditReport.Grade})"); - sb.AppendLine($"Total Pages: {ActiveAuditReport.TotalPages} | Total Elements: {ActiveAuditReport.TotalElements}"); - sb.AppendLine($"Word Count: {ActiveAuditReport.TotalWordCount} | Est. Reading Time: {ActiveAuditReport.ReadingTimeDisplay}"); - sb.AppendLine($"Fonts Used ({ActiveAuditReport.UniqueFontsUsed.Count}): {string.Join(", ", ActiveAuditReport.UniqueFontsUsed)}"); - sb.AppendLine(); - sb.AppendLine("## Audit Findings & Checks"); - foreach (var issue in ActiveAuditReport.Issues) - { - sb.AppendLine($"- [{issue.Severity.ToUpper()}] (Page {issue.PageIndex}) {issue.Title}: {issue.Description}"); - } - - string reportText = sb.ToString(); - string reportPath = ""; - - if (StorageProvider != null) - { - var file = await StorageProvider.SaveFilePickerAsync(new FilePickerSaveOptions - { - Title = "Save Preflight Audit Report", - DefaultExtension = "md", - SuggestedFileName = $"{System.IO.Path.GetFileNameWithoutExtension(DocumentTitle)}_Audit_Report.md" - }); - if (file != null) - { - reportPath = file.Path.LocalPath; - } - else - { - UpdateStatus("Export cancelled."); - return; - } - } - else - { - reportPath = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), $"{System.IO.Path.GetFileNameWithoutExtension(DocumentTitle)}_Audit_Report.md"); - } - - await System.IO.File.WriteAllTextAsync(reportPath, reportText); - ShowToast($"Saved audit report to {System.IO.Path.GetFileName(reportPath)}", "FileCheckOutline"); - } - - [RelayCommand] - public async Task ExportCommentsSummaryAsync() - { - var sb = new System.Text.StringBuilder(); - sb.AppendLine($"# Review & Annotations Summary: {DocumentTitle}"); - sb.AppendLine($"Generated: {DateTime.Now:yyyy-MM-dd HH:mm:ss}"); - sb.AppendLine(); - - RefreshComments(); - if (CommentItems.Count == 0) - { - sb.AppendLine("No comments or sticky notes found in this document."); - } - else - { - foreach (var comment in CommentItems) - { - sb.AppendLine($"### Page {comment.PageIndex} - {comment.Author} ({comment.Status})"); - sb.AppendLine($"> {comment.Text}"); - sb.AppendLine(); - } - } - - string exportPath = ""; - if (StorageProvider != null) - { - var file = await StorageProvider.SaveFilePickerAsync(new FilePickerSaveOptions - { - Title = "Save Comments Summary", - DefaultExtension = "md", - SuggestedFileName = $"{System.IO.Path.GetFileNameWithoutExtension(DocumentTitle)}_Review_Notes.md" - }); - if (file != null) - { - exportPath = file.Path.LocalPath; - } - else - { - UpdateStatus("Export cancelled."); - return; - } - } - else - { - exportPath = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), $"{System.IO.Path.GetFileNameWithoutExtension(DocumentTitle)}_Review_Notes.md"); - } - - await System.IO.File.WriteAllTextAsync(exportPath, sb.ToString()); - ShowToast($"Saved review summary to {System.IO.Path.GetFileName(exportPath)}", "CommentTextMultipleOutline"); - } - - // --- CANVAS GRID & SNAP COMMANDS --- - - [RelayCommand] - public void ToggleGrid() - { - ShowGrid = !ShowGrid; - ShowToast(ShowGrid ? "Canvas Grid Enabled" : "Canvas Grid Disabled", "Grid"); - } - - [RelayCommand] - public void ToggleSnapToGrid() - { - SnapToGrid = !SnapToGrid; - ShowToast(SnapToGrid ? $"Snap to Grid Active ({(int)GridSnapSize}pt)" : "Snap to Grid Disabled", "Magnet"); - } - - [RelayCommand] - public void SetGridSnapSize(string sizeStr) - { - if (Enum.TryParse(sizeStr, true, out var size)) - { - GridSnapSize = size; - ShowToast($"Grid Snap Interval: {(int)size}pt", "GridLarge"); - } - } - - // --- BATES NUMBERING STUDIO COMMANDS --- - - public string BatesSamplePreview => - $"{BatesPrefix}{BatesStartingNumber.ToString().PadLeft(BatesNumberOfDigits, '0')}{BatesSuffix}"; - - [RelayCommand] - public void OpenBatesNumberingDialog() - { - OnPropertyChanged(nameof(BatesSamplePreview)); - IsBatesNumberingDialogOpen = true; - OpenRegisteredDialog("frypdf.dialog.bates"); - } - - [RelayCommand] - public void CloseBatesNumberingDialog() - { - IsBatesNumberingDialogOpen = false; - CloseDynamicDialog(); - } - - [RelayCommand] - public void SetBatesPosition(BatesPosition pos) - { - BatesPosition = pos; - } - - private CancellationTokenSource? _batesCts; - - [RelayCommand] - public async Task ApplyBatesNumberingAsync() - { - IsApplyingBatesNumbers = true; - BatesProgressPercentage = 0; - _batesCts = new CancellationTokenSource(); - var ct = _batesCts.Token; - - int currentNum = BatesStartingNumber; - int total = Pages.Count; - - try - { - for (int i = 0; i < Pages.Count; i++) - { - ct.ThrowIfCancellationRequested(); - - var page = Pages[i]; - string batesText = $"{BatesPrefix}{currentNum.ToString().PadLeft(BatesNumberOfDigits, '0')}{BatesSuffix}"; - - // Remove any existing Bates on page - var existing = page.Elements.OfType().Where(e => e.Text.StartsWith(BatesPrefix) || e.DisplayName.Contains("Bates")).ToList(); - foreach (var el in existing) page.RemoveElement(el); - - double x = 40; - double y = 40; - double pageWidth = page.Width > 0 ? page.Width : 800; - double pageHeight = page.Height > 0 ? page.Height : 1131; - - switch (BatesPosition) - { - case BatesPosition.TopLeft: - page.HeaderLeft = batesText; - page.ShowHeaderFooter = true; - x = 40; y = 25; break; - case BatesPosition.TopCenter: - page.HeaderCenter = batesText; - page.ShowHeaderFooter = true; - x = (pageWidth - 220) / 2; y = 25; break; - case BatesPosition.TopRight: - page.HeaderRight = batesText; - page.ShowHeaderFooter = true; - x = pageWidth - 240; y = 25; break; - case BatesPosition.BottomLeft: - page.FooterLeft = batesText; - page.ShowHeaderFooter = true; - x = 40; y = pageHeight - 45; break; - case BatesPosition.BottomCenter: - page.FooterCenter = batesText; - page.ShowHeaderFooter = true; - x = (pageWidth - 220) / 2; y = pageHeight - 45; break; - case BatesPosition.BottomRight: - page.FooterRight = batesText; - page.ShowHeaderFooter = true; - x = pageWidth - 240; y = pageHeight - 45; break; - } - - var batesEl = new TextElementViewModel - { - X = x, - Y = y, - Width = 200, - Height = 25, - Text = batesText, - FontSize = BatesFontSize, - FontFamily = "Consolas", - TextColorHex = BatesFontColorHex, - IsBold = true - }; - - page.AddElement(batesEl); - currentNum++; - - BatesProgressPercentage = total > 0 ? (i + 1) * 100.0 / total : 100.0; - if ((i + 1) % 5 == 0) - { - await Task.Yield(); - } - } - - ShowToast($"Applied legal Bates stamp across all {Pages.Count} pages", "Numeric"); - } - catch (OperationCanceledException) - { - ShowToast("Bates numbering cancelled.", "CloseCircleOutline"); - } - finally - { - IsApplyingBatesNumbers = false; - IsBatesNumberingDialogOpen = false; - } - } - - [RelayCommand] - public void CancelBatesNumbering() - { - _batesCts?.Cancel(); - } - - [RelayCommand] - public void RemoveBatesNumbering() - { - IsBatesNumberingDialogOpen = false; - int removed = 0; - foreach (var page in Pages) - { - if (page.HeaderLeft?.StartsWith(BatesPrefix) == true) page.HeaderLeft = ""; - if (page.HeaderCenter?.StartsWith(BatesPrefix) == true) page.HeaderCenter = ""; - if (page.HeaderRight?.StartsWith(BatesPrefix) == true) page.HeaderRight = ""; - if (page.FooterLeft?.StartsWith(BatesPrefix) == true) page.FooterLeft = ""; - if (page.FooterCenter?.StartsWith(BatesPrefix) == true) page.FooterCenter = ""; - if (page.FooterRight?.StartsWith(BatesPrefix) == true) page.FooterRight = ""; - - var existing = page.Elements.OfType().Where(e => e.Text.StartsWith(BatesPrefix) || e.DisplayName.Contains("Bates")).ToList(); - foreach (var el in existing) - { - page.RemoveElement(el); - removed++; - } - } - ShowToast($"Removed {removed} Bates stamps from document", "DeleteOutline"); - } - - // --- DOCUMENT COMPARISON DIFF COMMANDS --- - - [RelayCommand] - public async Task OpenCompareDialogAsync() - { - IsCompareDialogOpen = true; - OpenRegisteredDialog("frypdf.dialog.compare"); - IsComparing = true; - try - { - var compareService = new DocumentCompareService(); - var currentDoc = ToDocumentModel(); - var templateDoc = _templateService.CreateAnnualReportTemplate(); // Compare against standard baseline - ActiveComparisonReport = await compareService.CompareDocumentsAsync(templateDoc, currentDoc); - } - finally - { - IsComparing = false; - } - } - - [RelayCommand] - public void CloseCompareDialog() - { - IsCompareDialogOpen = false; - CloseDynamicDialog(); - } - - // --- IN-CANVAS FIND & REPLACE COMMANDS --- - - [RelayCommand] - public void OpenFindReplace() - { - IsFindReplaceOpen = true; - if (!string.IsNullOrWhiteSpace(FindQuery)) - { - FindNext(); - } - } - - [RelayCommand] - public void CloseFindReplace() - { - IsFindReplaceOpen = false; - } - - [RelayCommand] - public void FindNext() - { - if (string.IsNullOrWhiteSpace(FindQuery) || Pages.Count == 0) return; - - var comparison = FindMatchCase ? StringComparison.Ordinal : StringComparison.OrdinalIgnoreCase; - int totalMatches = 0; - bool found = false; - - foreach (var page in Pages) - { - var textElements = page.Elements.OfType().ToList(); - foreach (var el in textElements) - { - if (el.Text.Contains(FindQuery, comparison)) - { - totalMatches++; - if (!found) - { - SelectPage(page); - page.SelectElement(el); - found = true; - } - } - } - } - - FindMatchesCount = totalMatches; - if (totalMatches > 0) - { - ShowToast($"Found {totalMatches} match(es) for \"{FindQuery}\"", "Magnify"); - } - else - { - ShowToast($"No matches found for \"{FindQuery}\"", "InformationOutline"); - } - } - - [RelayCommand] - public void FindPrevious() - { - FindNext(); - } - - [RelayCommand] - public void ReplaceNext() - { - if (CurrentPage?.SelectedElement is TextElementViewModel txt && !string.IsNullOrWhiteSpace(FindQuery)) - { - var comparison = FindMatchCase ? StringComparison.Ordinal : StringComparison.OrdinalIgnoreCase; - if (txt.Text.Contains(FindQuery, comparison)) - { - txt.Text = txt.Text.Replace(FindQuery, ReplaceQuery ?? "", comparison); - ShowToast("Replaced occurrence", "FindReplace"); - FindNext(); - } - } - else - { - FindNext(); - } - } - - [RelayCommand] - public void ReplaceAll() - { - if (string.IsNullOrWhiteSpace(FindQuery)) return; - - var comparison = FindMatchCase ? StringComparison.Ordinal : StringComparison.OrdinalIgnoreCase; - int replacements = 0; - - foreach (var page in Pages) - { - var textElements = page.Elements.OfType().ToList(); - foreach (var el in textElements) - { - if (el.Text.Contains(FindQuery, comparison)) - { - el.Text = el.Text.Replace(FindQuery, ReplaceQuery ?? "", comparison); - replacements++; - } - } - } - - ShowToast($"Replaced {replacements} occurrences with \"{ReplaceQuery}\"", "FindReplace"); - FindMatchesCount = 0; - } - - // --- MEASUREMENT & ACROBAT ANNOTATION COMMANDS --- - - [RelayCommand] - public void AddMeasurementElement() - { - if (CurrentPage == null) return; - - var (posX, posY) = _placementService.GetPlacementPosition(CurrentPage, 240, 36); - var measureEl = new MeasurementElementViewModel - { - X = posX, - Y = posY, - Width = 240, - Height = 36, - Unit = RulerUnit, - StrokeColorHex = "#DC2626", - StrokeThickness = 1.5, - FontSize = 10 - }; - - AddElementWithUndo(measureEl, "Added Measurement Dimension"); - } - - [RelayCommand] - public void AddCalloutElement() - { - if (CurrentPage == null) return; - - var (posX, posY) = _placementService.GetPlacementPosition(CurrentPage, 220, 80); - var callout = new ShapeElementViewModel - { - X = posX, - Y = posY, - Width = 220, - Height = 80, - ShapeType = ShapeType.Callout, - FillColorHex = "#EFF6FF", - StrokeColorHex = "#0F6CBD", - StrokeThickness = 1.5, - Label = "Important: Review Section", - LabelFontSize = 11, - LabelColorHex = "#0F6CBD" - }; - - AddElementWithUndo(callout, "Added Callout Note"); - } - - [RelayCommand] - public void AddRevisionCloudElement() - { - if (CurrentPage == null) return; - - var (posX, posY) = _placementService.GetPlacementPosition(CurrentPage, 260, 140); - var cloud = new ShapeElementViewModel - { - X = posX, - Y = posY, - Width = 260, - Height = 140, - ShapeType = ShapeType.RevisionCloud, - FillColorHex = "#FEF2F2", - StrokeColorHex = "#DC2626", - StrokeThickness = 2.0, - Opacity = 0.85 - }; - - AddElementWithUndo(cloud, "Added Revision Cloud Markup"); - } - - // --- RULERS, PRESENTATION & THEME COMMANDS --- - - [RelayCommand] - public void ToggleRulers() - { - ShowRulers = !ShowRulers; - ShowToast(ShowRulers ? "Canvas Rulers Visible" : "Canvas Rulers Hidden", "Ruler"); - } - - [RelayCommand] - public void SetRulerUnit(string unitStr) - { - if (Enum.TryParse(unitStr, true, out var unit)) - { - RulerUnit = unit; - ShowToast($"Ruler Units: {unit}", "RulerSquare"); - } - } - - [RelayCommand] - public void TogglePresentationMode() - { - IsPresentationMode = !IsPresentationMode; - ShowToast(IsPresentationMode ? "Entered Full-Screen Presentation Mode (Esc to Exit)" : "Exited Presentation Mode", "Presentation"); - } -} diff --git a/src/PdfEditorApp/ViewModels/MainViewModel.Pages.cs b/src/PdfEditorApp/ViewModels/MainViewModel.Pages.cs deleted file mode 100644 index 00d3b5b..0000000 --- a/src/PdfEditorApp/ViewModels/MainViewModel.Pages.cs +++ /dev/null @@ -1,693 +0,0 @@ -using System; -using System.Linq; -using CommunityToolkit.Mvvm.Input; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Models; -using PdfEditorApp.Services; -using PdfEditorApp.ViewModels.ElementViewModels; - -namespace PdfEditorApp.ViewModels; - -public partial class MainViewModel -{ - // --- PAGE COLLECTION & SELECTION COMMANDS --- - - [RelayCommand] - public void SelectPage(PageViewModel? page) - { - if (page == null) return; - - foreach (var p in Pages) - { - p.IsSelected = (p == page); - } - - CurrentPage = page; - OnPropertyChanged(nameof(CurrentPageNumber)); - OnPropertyChanged(nameof(PageDimensionsDisplay)); - - Inspector.UpdateSelection(page.SelectedElement, page); - UpdateStatus($"Viewing Page {page.PageNumber} of {Pages.Count}"); - } - - [RelayCommand] - public void SelectSidebarTab(SidebarTabKind tab) - { - ActiveDynamicSidebarTabId = null; - ActiveDynamicSidebarView = null; - ActiveSidebarTab = tab; - if (IsLeftSidebarCollapsed) - { - IsLeftSidebarCollapsed = false; - } - if (tab == SidebarTabKind.Outline) RefreshOutline(); - if (tab == SidebarTabKind.Comments) RefreshComments(); - if (tab == SidebarTabKind.AiAssistant) OpenAiAssistant(); - } - - [RelayCommand] - public void SelectDynamicSidebarTab(DynamicSidebarTabViewModel tabVm) - { - if (tabVm == null) return; - var descriptor = tabVm.Descriptor; - ActiveDynamicSidebarTabId = descriptor.Id; - ActiveSidebarTab = (SidebarTabKind)(-1); - foreach (var t in DynamicSidebarTabs) - { - t.IsActive = string.Equals(t.Id, descriptor.Id, StringComparison.OrdinalIgnoreCase); - } - if (IsLeftSidebarCollapsed) - { - IsLeftSidebarCollapsed = false; - } - - try - { - var sp = _pluginHost?.Context ?? (IServiceProvider)this; - if (descriptor.ViewFactory != null) - { - ActiveDynamicSidebarView = descriptor.ViewFactory(sp); - } - else if (descriptor.ViewModelFactory != null) - { - ActiveDynamicSidebarView = descriptor.ViewModelFactory(sp); - } - } - catch (Exception ex) - { - ShowToast($"Failed to open sidebar '{descriptor.Title}': {ex.Message}", ToastNotificationType.Danger, "AlertCircleOutline"); - } - } - - [RelayCommand] - public void AddPage() - { - var newPage = new PageViewModel - { - PageNumber = Pages.Count + 1, - Format = CurrentPage?.Format ?? PageFormat.A4, - Orientation = CurrentPage?.Orientation ?? PageOrientation.Portrait, - Width = CurrentPage?.Width ?? 800, - Height = CurrentPage?.Height ?? 1131, - FooterRight = $"Page {Pages.Count + 1} of {Pages.Count + 1}" - }; - - newPage.SelectionChanged += OnElementSelectionChanged; - Pages.Add(newPage); - SelectPage(newPage); - - int addedIndex = Pages.IndexOf(newPage); - UndoRedo.RecordAction( - $"Add Page {newPage.PageNumber}", - () => - { - if (Pages.Contains(newPage)) - { - Pages.Remove(newPage); - RenumberPages(); - if (Pages.Count > 0) SelectPage(Pages[Math.Max(0, addedIndex - 1)]); - } - }, - () => - { - if (!Pages.Contains(newPage)) - { - Pages.Insert(Math.Min(addedIndex, Pages.Count), newPage); - RenumberPages(); - SelectPage(newPage); - } - } - ); - - ShowToast($"Added Page {newPage.PageNumber}", "FilePlusOutline"); - } - - [RelayCommand] - public void DuplicateCurrentPage() - { - if (CurrentPage == null) return; - var model = CurrentPage.ToModel(); - var clonedPage = new PageViewModel(); - clonedPage.LoadFromModel(model); - clonedPage.PageNumber = Pages.Count + 1; - clonedPage.SelectionChanged += OnElementSelectionChanged; - Pages.Add(clonedPage); - SelectPage(clonedPage); - - int addedIndex = Pages.IndexOf(clonedPage); - UndoRedo.RecordAction( - $"Duplicate Page {CurrentPage.PageNumber}", - () => - { - if (Pages.Contains(clonedPage)) - { - Pages.Remove(clonedPage); - RenumberPages(); - if (Pages.Count > 0) SelectPage(Pages[Math.Max(0, addedIndex - 1)]); - } - }, - () => - { - if (!Pages.Contains(clonedPage)) - { - Pages.Insert(Math.Min(addedIndex, Pages.Count), clonedPage); - RenumberPages(); - SelectPage(clonedPage); - } - } - ); - - ShowToast($"Duplicated Page {CurrentPage.PageNumber}", "FileMultipleOutline"); - } - - [RelayCommand] - public void DeleteCurrentPage() - { - if (Pages.Count <= 1 || CurrentPage == null) - { - ShowToast("Cannot delete the only page in the document", "AlertCircleOutline"); - return; - } - - int index = Pages.IndexOf(CurrentPage); - var removedPage = CurrentPage; - Pages.Remove(removedPage); - RenumberPages(); - - int newIndex = Math.Min(index, Pages.Count - 1); - SelectPage(Pages[newIndex]); - - UndoRedo.RecordAction( - $"Delete Page {removedPage.PageNumber}", - () => - { - Pages.Insert(Math.Min(index, Pages.Count), removedPage); - RenumberPages(); - SelectPage(removedPage); - }, - () => - { - if (Pages.Contains(removedPage)) - { - Pages.Remove(removedPage); - RenumberPages(); - SelectPage(Pages[Math.Min(index, Pages.Count - 1)]); - } - } - ); - - ShowToast($"Deleted Page {index + 1}", "DeleteOutline"); - } - - [RelayCommand] - public void RotateCurrentPage() - { - if (CurrentPage == null) return; - var targetPage = CurrentPage; - int oldAngle = targetPage.RotationAngle; - targetPage.RotateClockwise(); - int newAngle = targetPage.RotationAngle; - - UndoRedo.RecordAction( - $"Rotate Page {targetPage.PageNumber}", - () => targetPage.RotationAngle = oldAngle, - () => targetPage.RotationAngle = newAngle - ); - - ShowToast($"Page rotated to {newAngle}°", "RotateRight"); - } - - [RelayCommand] - public void RotateCurrentPageCounterClockwise() - { - if (CurrentPage == null) return; - var targetPage = CurrentPage; - int oldAngle = targetPage.RotationAngle; - targetPage.RotationAngle = (targetPage.RotationAngle + 270) % 360; - int newAngle = targetPage.RotationAngle; - - UndoRedo.RecordAction( - $"Rotate Page {targetPage.PageNumber}", - () => targetPage.RotationAngle = oldAngle, - () => targetPage.RotationAngle = newAngle - ); - - ShowToast($"Page rotated to {newAngle}°", "RotateLeft"); - } - - [RelayCommand] - public void MovePageUp() - { - if (CurrentPage == null) return; - int idx = Pages.IndexOf(CurrentPage); - if (idx > 0) - { - Pages.Move(idx, idx - 1); - RenumberPages(); - SelectPage(Pages[idx - 1]); - - UndoRedo.RecordAction( - $"Move Page {idx + 1} Up", - () => { Pages.Move(idx - 1, idx); RenumberPages(); SelectPage(Pages[idx]); }, - () => { Pages.Move(idx, idx - 1); RenumberPages(); SelectPage(Pages[idx - 1]); } - ); - - ShowToast($"Moved Page {idx + 1} to position {idx}", "ChevronUp"); - } - } - - [RelayCommand] - public void MovePageDown() - { - if (CurrentPage == null) return; - int idx = Pages.IndexOf(CurrentPage); - if (idx < Pages.Count - 1) - { - Pages.Move(idx, idx + 1); - RenumberPages(); - SelectPage(Pages[idx + 1]); - - UndoRedo.RecordAction( - $"Move Page {idx + 1} Down", - () => { Pages.Move(idx + 1, idx); RenumberPages(); SelectPage(Pages[idx]); }, - () => { Pages.Move(idx, idx + 1); RenumberPages(); SelectPage(Pages[idx + 1]); } - ); - - ShowToast($"Moved Page {idx + 1} to position {idx + 2}", "ChevronDown"); - } - } - - public void ReorderPage(int fromIndex, int toIndex) - { - if (fromIndex < 0 || fromIndex >= Pages.Count || toIndex < 0 || toIndex >= Pages.Count || fromIndex == toIndex) - return; - - Pages.Move(fromIndex, toIndex); - RenumberPages(); - SelectPage(Pages[toIndex]); - - UndoRedo.RecordAction( - $"Reorder Page {fromIndex + 1} to {toIndex + 1}", - () => { Pages.Move(toIndex, fromIndex); RenumberPages(); SelectPage(Pages[fromIndex]); }, - () => { Pages.Move(fromIndex, toIndex); RenumberPages(); SelectPage(Pages[toIndex]); } - ); - - ShowToast($"Reordered Page {fromIndex + 1} to position {toIndex + 1}", "SwapVertical"); - } - - // --- PAGE NAVIGATION SHORTCUT COMMANDS --- - - [RelayCommand] - public void NextPage() - { - if (IsPdfViewerVisible && PdfViewer != null) - { - PdfViewer.NextPage(); - return; - } - if (CurrentPage == null || Pages.Count == 0) return; - int idx = Pages.IndexOf(CurrentPage); - if (idx < Pages.Count - 1) - { - SelectPage(Pages[idx + 1]); - } - } - - [RelayCommand] - public void PreviousPage() - { - if (IsPdfViewerVisible && PdfViewer != null) - { - PdfViewer.PreviousPage(); - return; - } - if (CurrentPage == null || Pages.Count == 0) return; - int idx = Pages.IndexOf(CurrentPage); - if (idx > 0) - { - SelectPage(Pages[idx - 1]); - } - } - - [RelayCommand] - public void FirstPage() - { - if (IsPdfViewerVisible && PdfViewer != null) - { - PdfViewer.FirstPage(); - return; - } - if (Pages.Count > 0) - { - SelectPage(Pages[0]); - } - } - - [RelayCommand] - public void LastPage() - { - if (IsPdfViewerVisible && PdfViewer != null) - { - PdfViewer.LastPage(); - return; - } - if (Pages.Count > 0) - { - SelectPage(Pages[^1]); - } - } - - private void RenumberPages() - { - for (int i = 0; i < Pages.Count; i++) - { - Pages[i].PageNumber = i + 1; - } - OnPropertyChanged(nameof(CurrentPageNumber)); - OnPropertyChanged(nameof(TotalPagesCount)); - } - - // --- OUTLINE & COMMENTS STREAM SYNC --- - - public void RefreshOutline() - { - OutlineItems.Clear(); - for (int i = 0; i < Pages.Count; i++) - { - var p = Pages[i]; - var headings = p.Elements.OfType() - .Where(t => t.IsBold || t.FontSize >= 16) - .ToList(); - - if (headings.Count > 0) - { - foreach (var h in headings) - { - OutlineItems.Add(new OutlineItem - { - Title = string.IsNullOrWhiteSpace(h.Text) ? "Section Header" : h.Text.Trim(), - PageIndex = i + 1, - Kind = h.FontSize >= 20 ? "Heading 1" : "Heading 2" - }); - } - } - else - { - OutlineItems.Add(new OutlineItem - { - Title = $"Page {i + 1}", - PageIndex = i + 1, - Kind = "Page" - }); - } - } - } - - public void RefreshComments() - { - CommentItems.Clear(); - for (int i = 0; i < Pages.Count; i++) - { - var p = Pages[i]; - var stickies = p.Elements.OfType().ToList(); - foreach (var note in stickies) - { - CommentItems.Add(new CommentItem - { - Author = note.Author, - Timestamp = "Today, 10:30 AM", - Text = note.NoteText, - Status = note.Status, - PageIndex = i + 1 - }); - } - } - } - - [RelayCommand] - public void JumpToOutlineItem(OutlineItem? item) - { - if (item != null && item.PageIndex >= 1 && item.PageIndex <= Pages.Count) - { - SelectPage(Pages[item.PageIndex - 1]); - } - } - - [RelayCommand] - public void JumpToCommentItem(CommentItem? item) - { - if (item != null && item.PageIndex >= 1 && item.PageIndex <= Pages.Count) - { - SelectPage(Pages[item.PageIndex - 1]); - } - } - - // --- HEADER & FOOTER MANAGER --- - - [RelayCommand] - public void OpenHeaderFooterDialog() - { - if (CurrentPage != null) - { - HeaderLeftText = CurrentPage.HeaderLeft ?? ""; - HeaderRightText = CurrentPage.HeaderRight ?? ""; - FooterLeftText = CurrentPage.FooterLeft ?? "CONFIDENTIAL & PROPRIETARY"; - FooterRightText = CurrentPage.FooterRight ?? "Page {P} of {N}"; - } - IsHeaderFooterDialogOpen = true; - OpenRegisteredDialog("frypdf.dialog.headerfooter"); - } - - [RelayCommand] - public void CloseHeaderFooterDialog() - { - IsHeaderFooterDialogOpen = false; - CloseDynamicDialog(); - } - - [RelayCommand] - public void ApplyHeaderFooterToAllPages() - { - for (int i = 0; i < Pages.Count; i++) - { - var p = Pages[i]; - p.ShowHeaderFooter = true; - p.HeaderLeft = ExpandMacros(HeaderLeftText, i + 1, Pages.Count); - p.HeaderRight = ExpandMacros(HeaderRightText, i + 1, Pages.Count); - p.FooterLeft = ExpandMacros(FooterLeftText, i + 1, Pages.Count); - p.FooterRight = ExpandMacros(FooterRightText, i + 1, Pages.Count); - } - - CloseHeaderFooterDialog(); - ShowToast($"Updated headers & footers across {Pages.Count} pages", "PageLayoutHeaderFooter"); - } - - private string ExpandMacros(string? template, int pageNum, int totalPages) - { - if (string.IsNullOrEmpty(template)) return ""; - return template - .Replace("{P}", pageNum.ToString()) - .Replace("{N}", totalPages.ToString()) - .Replace("[PageNumber]", pageNum.ToString()) - .Replace("[TotalPages]", totalPages.ToString()) - .Replace("[Title]", DocumentTitle) - .Replace("[Author]", DocumentAuthor) - .Replace("[Date]", DateTime.Now.ToString("yyyy-MM-dd")); - } - - // --- DOCUMENT SECURITY & SANITIZATION --- - - [RelayCommand] - public void OpenSecurityDialog() - { - IsSecurityDialogOpen = true; - OpenRegisteredDialog("frypdf.dialog.security"); - } - - [RelayCommand] - public void CloseSecurityDialog() - { - IsSecurityDialogOpen = false; - CloseDynamicDialog(); - OnPropertyChanged(nameof(SecurityStatusDisplay)); - } - - [RelayCommand] - public void SanitizeDocument() - { - DocumentAuthor = "Anonymous"; - DocumentSubject = ""; - - int commentsRemoved = 0; - foreach (var page in Pages) - { - var notes = page.Elements.OfType().ToList(); - foreach (var note in notes) - { - page.RemoveElement(note); - commentsRemoved++; - } - } - - SecuritySettings.ScrubMetadataOnExport = true; - SecuritySettings.RemoveCommentsOnExport = true; - - RefreshComments(); - ShowToast($"Sanitized document (cleared metadata & removed {commentsRemoved} internal review notes)", "ShieldCheck"); - } - - // --- PAGE SETUP & GEOMETRY COMMANDS --- - - [RelayCommand] - public void SetPageFormat(string formatStr) - { - if (CurrentPage == null) return; - if (Enum.TryParse(formatStr, true, out var format)) - { - CurrentPage.Format = format; - double w = format switch - { - PageFormat.A4 => 800, - PageFormat.Letter => 816, - PageFormat.Legal => 816, - PageFormat.Executive => 700, - PageFormat.A3 => 1131, - PageFormat.A5 => 565, - PageFormat.Poster => 2592, - _ => 800 - }; - double h = format switch - { - PageFormat.A4 => 1131, - PageFormat.Letter => 1056, - PageFormat.Legal => 1344, - PageFormat.Executive => 950, - PageFormat.A3 => 1600, - PageFormat.A5 => 800, - PageFormat.Poster => 3456, - _ => 1131 - }; - - if (CurrentPage.Orientation == PageOrientation.Landscape) - { - (w, h) = (h, w); - } - - CurrentPage.Width = w; - CurrentPage.Height = h; - OnPropertyChanged(nameof(PageDimensionsDisplay)); - ShowToast($"Page format changed to {format}", "AspectRatio"); - } - } - - [RelayCommand] - public void SetPageOrientation(string orientationStr) - { - if (CurrentPage == null) return; - if (Enum.TryParse(orientationStr, true, out var orient)) - { - if (CurrentPage.Orientation != orient) - { - CurrentPage.Orientation = orient; - (CurrentPage.Width, CurrentPage.Height) = (CurrentPage.Height, CurrentPage.Width); - OnPropertyChanged(nameof(PageDimensionsDisplay)); - ShowToast($"Orientation changed to {orient}", "PhoneRotateLandscape"); - } - } - } - - // --- ORGANIZE: SPLIT, EXTRACT & BATCH ROTATION COMMANDS --- - - [RelayCommand] - public void OpenSplitExtractDialog() - { - IsSplitExtractDialogOpen = true; - OpenRegisteredDialog("frypdf.dialog.splitextract"); - } - - [RelayCommand] - public void CloseSplitExtractDialog() - { - IsSplitExtractDialogOpen = false; - CloseDynamicDialog(); - } - - [RelayCommand] - public void SetSplitExtractMode(SplitExtractMode mode) - { - SplitExtractMode = mode; - } - - [RelayCommand] - public void ExecuteSplitExtract() - { - IsSplitExtractDialogOpen = false; - if (Pages.Count == 0) return; - - var currentDoc = ToDocumentModel(); - - if (SplitExtractMode == SplitExtractMode.ExtractSelectedPages) - { - if (CurrentPage != null) - { - int currentIdx = Math.Clamp(Pages.IndexOf(CurrentPage), 0, Pages.Count - 1); - var extracted = _pageOrganizerService.ExtractPages(currentDoc, new[] { currentIdx }); - LoadFromDocumentModel(extracted); - ShowToast($"Extracted Page {currentIdx + 1} to new active project", "CallSplit"); - } - } - else if (SplitExtractMode == SplitExtractMode.SplitEveryNPages) - { - int interval = Math.Max(1, SplitPageInterval); - var parts = _pageOrganizerService.SplitEveryNPages(currentDoc, interval); - if (parts.Count > 0) - { - // Open first split part as active document - LoadFromDocumentModel(parts[0]); - ShowToast($"Document split into {parts.Count} parts (Loaded Part 1 of {parts.Count})", "CallSplit"); - } - } - else if (SplitExtractMode == SplitExtractMode.SplitByPageRanges) - { - var parts = _pageOrganizerService.SplitByRanges(currentDoc, SplitPageRanges); - if (parts.Count > 0) - { - LoadFromDocumentModel(parts[0]); - ShowToast($"Split document into {parts.Count} ranges (Loaded Range 1)", "CallSplit"); - } - else - { - ShowToast("Invalid page ranges specified (e.g. use '1-2, 3-4')", "AlertCircleOutline"); - } - } - } - - [RelayCommand] - public void BatchRotatePages(string target) - { - var targetEnum = target.ToLowerInvariant() switch - { - "all" => PageFilterTarget.All, - "even" => PageFilterTarget.EvenPages, - "odd" => PageFilterTarget.OddPages, - "landscape" => PageFilterTarget.LandscapePages, - "portrait" => PageFilterTarget.PortraitPages, - _ => PageFilterTarget.All - }; - - var doc = ToDocumentModel(); - int rotatedCount = _pageOrganizerService.BatchRotatePages(doc, targetEnum, 90); - if (rotatedCount > 0) - { - for (int i = 0; i < doc.Pages.Count && i < Pages.Count; i++) - { - Pages[i].RotationAngle = doc.Pages[i].RotationAngle; - } - ShowToast($"Rotated {rotatedCount} {target} pages by 90°", "RotateRight"); - } - else - { - ShowToast($"No {target} pages matched for rotation", "InformationOutline"); - } - } -} diff --git a/src/PdfEditorApp/ViewModels/MainViewModel.Palette.cs b/src/PdfEditorApp/ViewModels/MainViewModel.Palette.cs deleted file mode 100644 index cc97deb..0000000 --- a/src/PdfEditorApp/ViewModels/MainViewModel.Palette.cs +++ /dev/null @@ -1,943 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Linq; -using System.Reflection; -using Avalonia.Input.Platform; -using Avalonia.Platform.Storage; -using CommunityToolkit.Mvvm.ComponentModel; -using CommunityToolkit.Mvvm.Input; -using Microsoft.Extensions.DependencyInjection; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Plugins; -using PdfEditorApp.Core.Plugins.Descriptors; -using PdfEditorApp.Models; -using PdfEditorApp.Services.Tools.Core; - -namespace PdfEditorApp.ViewModels; - -public partial class MainViewModel -{ - public string AppVersion - { - get - { - try - { - var assembly = Assembly.GetExecutingAssembly(); - var infoVer = assembly.GetCustomAttribute()?.InformationalVersion; - if (!string.IsNullOrWhiteSpace(infoVer)) - { - return infoVer.Split('+')[0]; - } - - var ver = assembly.GetName().Version; - if (ver != null) - { - return $"{ver.Major}.{ver.Minor}.{ver.Build}"; - } - } - catch - { - // fallback - } - - return "1.0.0"; - } - } - - public string AppVersionDisplay => $"v{AppVersion} Open Source"; - - // --- COMMAND PALETTE & SHORTCUTS HELP STATE --- - - [ObservableProperty] - private bool _isCommandPaletteOpen; - - [ObservableProperty] - private string _commandSearchQuery = ""; - - [ObservableProperty] - private int _selectedPaletteIndex; - - [ObservableProperty] - private bool _isShortcutsHelpDialogOpen; - - [ObservableProperty] - private bool _isAboutDialogOpen; - - [ObservableProperty] - private bool _isPluginsDialogOpen; - - [ObservableProperty] - private string _pluginSearchQuery = ""; - - public ObservableCollection FilteredPluginsList { get; } = new(); - private readonly List _allLoadedPlugins = new(); - - partial void OnPluginSearchQueryChanged(string value) - { - FilterLoadedPlugins(value); - } - - private void FilterLoadedPlugins(string query) - { - FilteredPluginsList.Clear(); - var q = query.Trim().ToLowerInvariant(); - foreach (var p in _allLoadedPlugins) - { - if (string.IsNullOrWhiteSpace(q) || - p.Name.ToLowerInvariant().Contains(q) || - p.Id.ToLowerInvariant().Contains(q) || - p.Category.ToLowerInvariant().Contains(q) || - p.Description.ToLowerInvariant().Contains(q)) - { - FilteredPluginsList.Add(p); - } - } - } - - [RelayCommand] - public void OpenPluginsDialog() - { - PopulateLoadedPlugins(); - PluginSearchQuery = ""; - FilterLoadedPlugins(""); - IsPluginsDialogOpen = true; - // Route through plugin dialog registry - OpenRegisteredDialog("frypdf.dialog.plugins"); - } - - [ObservableProperty] - private string _activeProfileName = "desktop"; - - [RelayCommand] - public void SwitchProfile(string profileName) - { - try - { - var host = PluginHost ?? _pluginHost ?? App.Services?.GetService(); - if (host == null) return; - - string profilePath = System.IO.Path.Combine(AppContext.BaseDirectory, "profiles", $"{profileName}.profile.json"); - if (!System.IO.File.Exists(profilePath)) - { - profilePath = $"profiles/{profileName}.profile.json"; - } - - if (System.IO.File.Exists(profilePath)) - { - var profile = PdfEditorApp.Core.Plugins.Profiles.ProfileLoader.LoadFromFile(profilePath); - ActiveProfileName = profile.ProfileName; - - var availableBundles = new PdfEditorApp.Core.Plugins.Profiles.IFryPluginBundle[] - { - new PdfEditorApp.Plugins.Bundles.ToolsOrganizeBundle(), - new PdfEditorApp.Plugins.Bundles.ToolsSecurityBundle(), - new PdfEditorApp.Plugins.Bundles.ToolsConversionBundle(), - new PdfEditorApp.Plugins.Bundles.ToolsIntelligenceBundle(), - new PdfEditorApp.Plugins.Bundles.DataStudioBundle(), - new PdfEditorApp.Plugins.Bundles.CanvasElementsBundle(), - new PdfEditorApp.Plugins.Bundles.DocumentIoBundle(), - new PdfEditorApp.Plugins.Bundles.AiProvidersBundle(), - new PdfEditorApp.Plugins.Bundles.OcrEnginesBundle(), - new PdfEditorApp.Plugins.Bundles.StandardTemplatesBundle(), - new PdfEditorApp.Plugins.Bundles.StatusBarBundle(), - new PdfEditorApp.Plugins.Bundles.InspectorBundle(), - new PdfEditorApp.Plugins.Bundles.CommandPaletteBundle(), - new PdfEditorApp.Plugins.Bundles.WorkspacePagesBundle(), - new PdfEditorApp.Plugins.Bundles.DialogsBundle(), - new PdfEditorApp.Plugins.Bundles.EditorSidebarsBundle() - }; - - PdfEditorApp.Core.Plugins.Profiles.ProfileLoader.ApplyProfile(profile, host, availableBundles); - PopulateLoadedPlugins(); - ShowToast($"Switched to '{profileName}' profile!", ToastNotificationType.Success, "Tune"); - } - } - catch (Exception ex) - { - ShowToast($"Failed to switch profile: {ex.Message}", ToastNotificationType.Danger, "AlertCircleOutline"); - } - } - - [RelayCommand] - public void ClosePluginsDialog() - { - IsPluginsDialogOpen = false; - CloseDynamicDialog(); - } - - public void PopulateLoadedPlugins() - { - _allLoadedPlugins.Clear(); - try - { - var host = PluginHost ?? _pluginHost ?? App.Services?.GetService(); - var toolRegistry = _toolRegistry ?? App.Services?.GetService(); - var toolDefs = toolRegistry?.GetAllTools() ?? Array.Empty(); - var toolMap = new Dictionary(StringComparer.OrdinalIgnoreCase); - foreach (var t in toolDefs) - { - if (!string.IsNullOrWhiteSpace(t.StringId)) - { - toolMap[t.StringId] = t; - } - } - - if (host != null) - { - var pluginsToShow = host.RegisteredPlugins.Count > 0 ? host.RegisteredPlugins : host.LoadedPlugins; - foreach (var plugin in pluginsToShow) - { - toolMap.TryGetValue(plugin.Id, out var tool); - - string category = tool?.CategoryDisplayName ?? "Plugin Extension"; - string description = tool?.Description ?? $"Plugin component '{plugin.Name}'"; - string iconKind = tool?.IconKind ?? "PuzzleOutline"; - string iconColor = tool?.IconColorHex ?? "#7C3AED"; - - if (tool == null) - { - if (plugin.Id.StartsWith("frypdf.page.", StringComparison.OrdinalIgnoreCase)) - { - category = "Workspace Navigation"; - iconKind = "ViewDashboardOutline"; - iconColor = "#0D9488"; - description = $"Modular workspace view and navigation page '{plugin.Name}'"; - } - else if (plugin.Id.StartsWith("frypdf.overlay", StringComparison.OrdinalIgnoreCase)) - { - category = "Shell Overlays"; - iconKind = "GamepadVariantOutline"; - iconColor = "#10B981"; - description = $"Floating interactive shell overlay '{plugin.Name}'"; - } - else if (plugin.Id.StartsWith("frypdf.dialog", StringComparison.OrdinalIgnoreCase)) - { - category = "Modal Studios & Dialogs"; - iconKind = "WindowMaximize"; - iconColor = "#F97316"; - description = $"Modal studio overlay and interactive dialog '{plugin.Name}'"; - } - else if (plugin.Id.StartsWith("frypdf.sidebar", StringComparison.OrdinalIgnoreCase)) - { - category = "Editor Sidebars"; - iconKind = "DockLeft"; - iconColor = "#84CC16"; - description = $"Document editor sidebar panel '{plugin.Name}'"; - } - else if (plugin.Id.StartsWith("frypdf.element.", StringComparison.OrdinalIgnoreCase)) - { - category = "Canvas Elements"; - iconKind = "ShapeOutline"; - iconColor = "#0284C7"; - description = $"Canvas element provider '{plugin.Name}'"; - } - else if (plugin.Id.StartsWith("frypdf.io.", StringComparison.OrdinalIgnoreCase)) - { - category = "Document I/O"; - iconKind = "SwapHorizontal"; - iconColor = "#10B981"; - description = $"Document format import/export filter '{plugin.Name}'"; - } - else if (plugin.Id.StartsWith("frypdf.ai.", StringComparison.OrdinalIgnoreCase)) - { - category = "AI Providers"; - iconKind = "Brain"; - iconColor = "#8B5CF6"; - description = $"LLM intelligence and analysis provider '{plugin.Name}'"; - } - else if (plugin.Id.StartsWith("frypdf.ocr.", StringComparison.OrdinalIgnoreCase)) - { - category = "OCR Engines"; - iconKind = "TextRecognition"; - iconColor = "#F59E0B"; - description = $"Optical character recognition engine '{plugin.Name}'"; - } - else if (plugin.Id.StartsWith("frypdf.template", StringComparison.OrdinalIgnoreCase)) - { - category = "Document Templates"; - iconKind = "FileDocumentOutline"; - iconColor = "#EC4899"; - description = $"Structured document template pack '{plugin.Name}'"; - } - else if (plugin.Id.StartsWith("frypdf.status", StringComparison.OrdinalIgnoreCase)) - { - category = "Status Bar Widgets"; - iconKind = "DockBottom"; - iconColor = "#06B6D4"; - description = $"Status bar metric and diagnostic widget '{plugin.Name}'"; - } - else if (plugin.Id.StartsWith("frypdf.inspector.", StringComparison.OrdinalIgnoreCase)) - { - category = "Property Inspector"; - iconKind = "CardBulletedOutline"; - iconColor = "#3B82F6"; - description = $"Live element property inspector section '{plugin.Name}'"; - } - else if (plugin.Id.StartsWith("frypdf.command", StringComparison.OrdinalIgnoreCase) || plugin.Id.StartsWith("frypdf.palette", StringComparison.OrdinalIgnoreCase)) - { - category = "Command Palette"; - iconKind = "ConsoleLine"; - iconColor = "#6366F1"; - description = $"Quick command and shortcut provider '{plugin.Name}'"; - } - } - - _allLoadedPlugins.Add(new PluginItemViewModel - { - Id = plugin.Id, - Name = plugin.Name, - Version = plugin.Version.ToString(), - Category = category, - Description = description, - IconKind = iconKind, - IconColorHex = iconColor, - IsActive = host.IsPluginActive(plugin.Id), - IsExternal = plugin.GetType().Assembly != typeof(MainViewModel).Assembly, - SourceAssembly = plugin.GetType().Assembly.GetName().Name ?? "FryPDF", - SettingsSchema = plugin.SettingsSchema - }); - } - } - } - catch (Exception ex) - { - System.Diagnostics.Debug.WriteLine($"[Plugins] Failed to populate plugins: {ex.Message}"); - } - } - - [ObservableProperty] - private PluginItemViewModel? _selectedConfiguringPlugin; - - [ObservableProperty] - private bool _isConfiguringPluginOpen; - - public ObservableCollection ActivePluginConfigSettings { get; } = new(); - - [RelayCommand] - public void OpenPluginSettings(PluginItemViewModel plugin) - { - if (plugin?.SettingsSchema == null || plugin.SettingsSchema.Count == 0) return; - SelectedConfiguringPlugin = plugin; - ActivePluginConfigSettings.Clear(); - - var store = App.Services?.GetService(); - - foreach (var (key, def) in plugin.SettingsSchema) - { - var item = new PluginSettingItemViewModel - { - Key = key, - Label = string.IsNullOrWhiteSpace(def.Label) ? key : def.Label, - Description = def.Description, - Type = def.Type?.ToLowerInvariant() ?? "string", - Options = def.Options ?? new() - }; - - if (store != null) - { - if (item.Type == "boolean") - { - bool defBool = def.DefaultValue is bool b ? b : (bool.TryParse(def.DefaultValue?.ToString(), out var parsedB) && parsedB); - item.BoolValue = store.GetSetting(plugin.Id, key, defBool); - } - else if (item.Type == "number") - { - double defNum = def.DefaultValue is double d ? d : (double.TryParse(def.DefaultValue?.ToString(), out var parsedD) ? parsedD : 0); - item.NumberValue = store.GetSetting(plugin.Id, key, defNum); - } - else - { - string defStr = def.DefaultValue?.ToString() ?? ""; - item.StringValue = store.GetSetting(plugin.Id, key, defStr); - } - } - else - { - item.StringValue = def.DefaultValue?.ToString() ?? ""; - if (def.DefaultValue is bool b) item.BoolValue = b; - if (def.DefaultValue is double d) item.NumberValue = d; - } - - ActivePluginConfigSettings.Add(item); - } - - IsConfiguringPluginOpen = true; - } - - [RelayCommand] - public void SavePluginSettings() - { - if (SelectedConfiguringPlugin == null) return; - var store = App.Services?.GetService(); - if (store != null) - { - foreach (var item in ActivePluginConfigSettings) - { - if (item.Type == "boolean") - { - store.SetSetting(SelectedConfiguringPlugin.Id, item.Key, item.BoolValue); - } - else if (item.Type == "number") - { - store.SetSetting(SelectedConfiguringPlugin.Id, item.Key, item.NumberValue); - } - else - { - store.SetSetting(SelectedConfiguringPlugin.Id, item.Key, item.StringValue); - } - } - store.Save(); - ShowToast($"Saved preferences for {SelectedConfiguringPlugin.Name}!", ToastNotificationType.Success, "CheckCircle"); - } - IsConfiguringPluginOpen = false; - } - - [RelayCommand] - public void ClosePluginSettings() - { - IsConfiguringPluginOpen = false; - } - - [RelayCommand] - public async System.Threading.Tasks.Task LoadExternalPluginDialogAsync() - { - if (StorageProvider == null) return; - - var files = await StorageProvider.OpenFilePickerAsync(new FilePickerOpenOptions - { - Title = "Select Plugin Package (.fryplugin) or Assembly (.dll)", - AllowMultiple = false, - FileTypeFilter = new[] - { - new FilePickerFileType("FryPDF Plugins (*.fryplugin; *.dll)") - { - Patterns = new[] { "*.fryplugin", "*.dll" } - }, - new FilePickerFileType("FryPDF Plugin Package (*.fryplugin)") - { - Patterns = new[] { "*.fryplugin" } - }, - new FilePickerFileType(".NET Assembly (*.dll)") - { - Patterns = new[] { "*.dll" } - } - } - }); - - if (files.Count > 0) - { - var filePath = files[0].Path.LocalPath; - await InstallAndMountPluginPathAsync(filePath); - } - } - - public async System.Threading.Tasks.Task InstallAndMountPluginPathAsync(string filePath) - { - try - { - var host = App.Services?.GetService(); - if (host == null) return; - - IReadOnlyList plugins; - string displayName; - - if (string.Equals(System.IO.Path.GetExtension(filePath), ".fryplugin", StringComparison.OrdinalIgnoreCase)) - { - var pkgResult = PdfEditorApp.Plugins.Loader.FryPluginPackageLoader.UnpackAndLoad(filePath); - plugins = pkgResult.AssemblyPackage.Plugins; - displayName = pkgResult.Manifest.Name; - } - else - { - var pkg = PdfEditorApp.Plugins.Loader.PluginAssemblyLoader.LoadPluginAssembly(filePath); - plugins = pkg.Plugins; - displayName = System.IO.Path.GetFileName(filePath); - } - - if (plugins.Count == 0) - { - ShowToast("No IFryPlugin implementations found in package.", ToastNotificationType.Warning, "AlertCircleOutline"); - return; - } - - foreach (var p in plugins) - { - host.RegisterPlugin(p); - } - await host.StartAsync(); - - PopulateLoadedPlugins(); - FilterLoadedPlugins(PluginSearchQuery); - ShowToast($"Successfully mounted {plugins.Count} plugin(s) from {displayName}!", ToastNotificationType.Success, "CheckCircle"); - } - catch (Exception ex) - { - ShowToast($"Failed to load plugin: {ex.Message}", ToastNotificationType.Danger, "AlertCircleOutline"); - } - } - - public ObservableCollection FilteredPaletteCommands { get; } = new(); - public List AllPaletteCommands { get; } = new(); - - partial void OnCommandSearchQueryChanged(string value) - { - FilterPaletteCommands(value); - } - - [RelayCommand] - public void OpenCommandPalette() - { - InitCommandPalette(); - CommandSearchQuery = ""; - FilterPaletteCommands(""); - IsCommandPaletteOpen = true; - } - - [RelayCommand] - public void CloseCommandPalette() - { - IsCommandPaletteOpen = false; - CommandSearchQuery = ""; - } - - [RelayCommand] - public void OpenShortcutsHelp() - { - IsShortcutsHelpDialogOpen = true; - OpenRegisteredDialog("frypdf.dialog.shortcuts"); - } - - [RelayCommand] - public void CloseShortcutsHelp() - { - IsShortcutsHelpDialogOpen = false; - CloseDynamicDialog(); - } - - [RelayCommand] - public void OpenAboutDialog() - { - IsAboutDialogOpen = true; - OpenRegisteredDialog("frypdf.dialog.about"); - } - - [RelayCommand] - public void CloseAboutDialog() - { - IsAboutDialogOpen = false; - CloseDynamicDialog(); - } - - [RelayCommand] - public void NavigateToLicensing() - { - IsAboutDialogOpen = false; - CloseDynamicDialog(); - IsHomePageVisible = true; - IsEditorVisible = false; - IsPdfViewerVisible = false; - Home.SelectNavSectionCommand.Execute("Licensing"); - } - - [RelayCommand] - public void NavigateToPluginsPage() - { - IsPluginsDialogOpen = false; - CloseDynamicDialog(); - IsHomePageVisible = true; - IsEditorVisible = false; - IsPdfViewerVisible = false; - Home.SelectNavSectionCommand.Execute("Plugins"); - } - - [RelayCommand] - public void NavigateToHelp(string? topicId = null) - { - IsAboutDialogOpen = false; - IsShortcutsHelpDialogOpen = false; - CloseDynamicDialog(); - IsHomePageVisible = true; - IsEditorVisible = false; - IsPdfViewerVisible = false; - Home.OpenHelpGuideCommand.Execute(topicId); - } - - [RelayCommand] - public void NavigateToSettings() - { - IsAboutDialogOpen = false; - IsShortcutsHelpDialogOpen = false; - CloseDynamicDialog(); - IsHomePageVisible = true; - IsEditorVisible = false; - IsPdfViewerVisible = false; - Home.SelectNavSectionCommand.Execute("Settings"); - } - - [RelayCommand] - public async System.Threading.Tasks.Task CopySupportEmail() - { - const string email = "codefrydev@gmail.com"; - try - { - if (Avalonia.Application.Current?.ApplicationLifetime is Avalonia.Controls.ApplicationLifetimes.IClassicDesktopStyleApplicationLifetime desktop && desktop.MainWindow?.Clipboard != null) - { - await desktop.MainWindow.Clipboard.SetTextAsync(email); - } - } - catch { } - ShowToast($"Copied support email: {email}", "EmailOutline"); - } - - [RelayCommand] - public async System.Threading.Tasks.Task OpenCompanyWebsite() - { - const string url = "https://codefrydev.in"; - try - { - if (Avalonia.Application.Current?.ApplicationLifetime is Avalonia.Controls.ApplicationLifetimes.IClassicDesktopStyleApplicationLifetime desktop && desktop.MainWindow?.Launcher != null) - { - await desktop.MainWindow.Launcher.LaunchUriAsync(new Uri(url)); - } - else - { - System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo { FileName = url, UseShellExecute = true }); - } - } - catch - { - try - { - if (Avalonia.Application.Current?.ApplicationLifetime is Avalonia.Controls.ApplicationLifetimes.IClassicDesktopStyleApplicationLifetime desktop && desktop.MainWindow?.Clipboard != null) - { - await desktop.MainWindow.Clipboard.SetTextAsync(url); - } - } - catch { } - ShowToast($"Copied website link: {url}", "Web"); - return; - } - ShowToast("Opening codefrydev.in...", "Web"); - } - - [RelayCommand] - public async System.Threading.Tasks.Task OpenMicrosoftStore() - { - const string storeUrl = "https://apps.microsoft.com/detail/9P5GW2Q81B33"; - try - { - if (Avalonia.Application.Current?.ApplicationLifetime is Avalonia.Controls.ApplicationLifetimes.IClassicDesktopStyleApplicationLifetime desktop && desktop.MainWindow?.Launcher != null) - { - await desktop.MainWindow.Launcher.LaunchUriAsync(new Uri(storeUrl)); - } - else - { - System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo { FileName = storeUrl, UseShellExecute = true }); - } - } - catch - { - try - { - if (Avalonia.Application.Current?.ApplicationLifetime is Avalonia.Controls.ApplicationLifetimes.IClassicDesktopStyleApplicationLifetime desktop && desktop.MainWindow?.Clipboard != null) - { - await desktop.MainWindow.Clipboard.SetTextAsync(storeUrl); - } - } - catch { } - ShowToast($"Copied Microsoft Store link: {storeUrl}", "Microsoft"); - return; - } - ShowToast("Opening Microsoft Store...", "Microsoft"); - } - - [RelayCommand] - public async System.Threading.Tasks.Task OpenGitHub() - { - const string url = "https://github.com/codefrydev"; - try - { - if (Avalonia.Application.Current?.ApplicationLifetime is Avalonia.Controls.ApplicationLifetimes.IClassicDesktopStyleApplicationLifetime desktop && desktop.MainWindow?.Launcher != null) - { - await desktop.MainWindow.Launcher.LaunchUriAsync(new Uri(url)); - } - else - { - System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo { FileName = url, UseShellExecute = true }); - } - } - catch - { - try - { - if (Avalonia.Application.Current?.ApplicationLifetime is Avalonia.Controls.ApplicationLifetimes.IClassicDesktopStyleApplicationLifetime desktop && desktop.MainWindow?.Clipboard != null) - { - await desktop.MainWindow.Clipboard.SetTextAsync(url); - } - } - catch { } - ShowToast($"Copied GitHub link: {url}", "Github"); - return; - } - ShowToast("Opening GitHub...", "Github"); - } - - [RelayCommand] - public async System.Threading.Tasks.Task CopyDiagnostics() - { - var diagnostics = $"FryPDF Open-Source Edition v{AppVersion}\n" + - $"Publisher: Code Fry Dev (CN=7E83DE15-E15F-41B6-B068-989D9548D0BF)\n" + - $"Package Family Name: CodeFryDev.FryPDF_ntemjm2faw5zw\n" + - $"Store ID: 9P5GW2Q81B33 (https://apps.microsoft.com/detail/9P5GW2Q81B33)\n" + - $"MSA App ID: 4d091113-f7b6-4421-9318-220eb8b7234e\n" + - $"Website: https://codefrydev.in\n" + - $"GitHub: https://github.com/codefrydev\n" + - $"Support: codefrydev@gmail.com\n" + - $"OS: {System.Runtime.InteropServices.RuntimeInformation.OSDescription} ({System.Runtime.InteropServices.RuntimeInformation.OSArchitecture})\n" + - $"Runtime: .NET {Environment.Version}\n" + - $"Avalonia UI: 12.1.1\n" + - $"Engine: QuestPDF 2026.8.0 + SkiaSharp\n" + - $"Timestamp: {DateTime.UtcNow:yyyy-MM-dd HH:mm:ss} UTC"; - try - { - if (Avalonia.Application.Current?.ApplicationLifetime is Avalonia.Controls.ApplicationLifetimes.IClassicDesktopStyleApplicationLifetime desktop && desktop.MainWindow?.Clipboard != null) - { - await desktop.MainWindow.Clipboard.SetTextAsync(diagnostics); - } - } - catch { } - ShowToast("System diagnostics copied to clipboard", "InformationOutline"); - } - - public void SelectNextPaletteCommand() - { - if (FilteredPaletteCommands.Count == 0) return; - SelectedPaletteIndex = (SelectedPaletteIndex + 1) % FilteredPaletteCommands.Count; - } - - public void SelectPreviousPaletteCommand() - { - if (FilteredPaletteCommands.Count == 0) return; - SelectedPaletteIndex = (SelectedPaletteIndex - 1 + FilteredPaletteCommands.Count) % FilteredPaletteCommands.Count; - } - - public void ExecuteSelectedPaletteCommand() - { - if (SelectedPaletteIndex >= 0 && SelectedPaletteIndex < FilteredPaletteCommands.Count) - { - var item = FilteredPaletteCommands[SelectedPaletteIndex]; - CloseCommandPalette(); - item.Action?.Invoke(); - } - } - - public void InitCommandPalette() - { - AllPaletteCommands.Clear(); - - // 1. File Operations - AllPaletteCommands.Add(new CommandPaletteItem { Title = "AI Assistant: Generate Canvas Elements", Subtitle = "Prompt local Ollama or cloud AI to generate document elements", Category = "AI Studio", IconKind = "AutoFixHigh", Shortcut = "⌘I", Action = () => OpenAiAssistantCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Open PDF to Read (PDF Reader Mode)", Subtitle = "Acrobat-style distraction-free reading, bookmarks & text search", Category = "File", IconKind = "BookOpenPageVariantOutline", Action = () => OpenPdfReaderCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Save Project", Subtitle = "Save editable FryPDF project archive (.frypdf)", Category = "File", IconKind = "ContentSaveOutline", Shortcut = "⌘S", Action = () => SaveProjectCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Open Project", Subtitle = "Open existing FryPDF project archive (.frypdf)", Category = "File", IconKind = "FolderOpenOutline", Shortcut = "⌘O", Action = () => OpenProjectCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Rename Document...", Subtitle = "Rename the current document file or title", Category = "File", IconKind = "PencilOutline", Shortcut = "F2", Action = () => RenameCurrentDocumentCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Duplicate Document", Subtitle = "Create a copy of current document on disk", Category = "File", IconKind = "ContentCopy", Action = () => DuplicateCurrentDocumentCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Reveal in File Manager / Finder", Subtitle = "Highlight document file in native OS file explorer", Category = "File", IconKind = "FolderOpenOutline", Action = () => RevealCurrentDocumentInFileManagerCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Copy Document Path", Subtitle = "Copy absolute file path to clipboard", Category = "File", IconKind = "ClipboardTextOutline", Action = () => _ = CopyCurrentDocumentPathCommand.ExecuteAsync(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Delete Document File...", Subtitle = "Permanently delete document from disk and recents", Category = "File", IconKind = "TrashCanOutline", Action = () => DeleteCurrentDocumentCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "New Document / Templates", Subtitle = "Browse and create from executive templates", Category = "File", IconKind = "FilePlusOutline", Shortcut = "⌘N", Action = () => OpenNewDocumentDialogCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Export Production PDF", Subtitle = "Compile document to high-resolution vector PDF", Category = "File", IconKind = "FilePdfBox", Shortcut = "⌘E", Action = () => ExportPdfCommand.Execute(null) }); - - // 2. Edit & History - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Undo Action", Subtitle = "Revert last canvas or page operation", Category = "Edit", IconKind = "Undo", Shortcut = "⌘Z", Action = () => UndoCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Redo Action", Subtitle = "Reapply reverted operation", Category = "Edit", IconKind = "Redo", Shortcut = "⌘Y", Action = () => RedoCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Copy Element", Subtitle = "Copy selected element to internal clipboard", Category = "Edit", IconKind = "ContentCopy", Shortcut = "⌘C", Action = () => CopyCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Cut Element", Subtitle = "Cut selected element to internal clipboard", Category = "Edit", IconKind = "ContentCut", Shortcut = "⌘X", Action = () => CutCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Paste Element", Subtitle = "Paste element from clipboard to current page", Category = "Edit", IconKind = "ContentPaste", Shortcut = "⌘V", Action = () => PasteCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Duplicate Element", Subtitle = "Clone selected element with offset", Category = "Edit", IconKind = "ContentDuplicate", Shortcut = "⌘D", Action = () => DuplicateCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Delete Selected Element", Subtitle = "Remove active element from canvas", Category = "Edit", IconKind = "DeleteOutline", Shortcut = "⌫", Action = () => Inspector.DeleteSelectedElementCommand.Execute(null) }); - - // 3. Insert Elements - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Insert Text Paragraph", Subtitle = "Add multi-line editable rich text block", Category = "Insert", IconKind = "FormatColorText", Shortcut = "T", Action = () => AddTextElementCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Insert Section Heading", Subtitle = "Add bold Georgia 22pt section title", Category = "Insert", IconKind = "FormatHeader1", Shortcut = "H", Action = () => AddHeadingElementCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Insert Image Graphic", Subtitle = "Import PNG, JPEG, or WebP graphic from disk", Category = "Insert", IconKind = "ImageOutline", Shortcut = "⌘I", Action = () => AddImageElementCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Insert Divider Line", Subtitle = "Add horizontal section divider line", Category = "Insert", IconKind = "VectorLine", Action = () => AddDividerElementCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Insert Data Table", Subtitle = "Add customizable multi-column data grid", Category = "Insert", IconKind = "TableLarge", Action = () => AddTableElementCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Insert Watermark Overlay", Subtitle = "Add confidential watermark stamp", Category = "Insert", IconKind = "Watermark", Action = () => AddWatermarkElementCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Insert Math Equation", Subtitle = "Add vector LaTeX mathematical equation / formula", Category = "Equations", IconKind = "Sigma", Shortcut = "⌘M", Action = () => AddMathElementCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Open Math Equation Studio", Subtitle = "Visual formula builder, live preview, and symbol palettes", Category = "Equations", IconKind = "FunctionVariant", Action = () => OpenMathStudioCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Insert Gaussian Integral", Subtitle = "∫ e^(-x²) dx = √π definite integral", Category = "Equations", IconKind = "Sigma", Action = () => AddMathElementCommand.Execute("gaussian_integral") }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Insert Quadratic Formula", Subtitle = "x = (-b ± √(b² - 4ac)) / 2a", Category = "Equations", IconKind = "Calculator", Action = () => AddMathElementCommand.Execute("quadratic_formula") }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Insert Schrödinger Equation", Subtitle = "iℏ ∂Ψ/∂t = ĤΨ quantum wave equation", Category = "Equations", IconKind = "Atom", Action = () => AddMathElementCommand.Execute("schrodinger_time_dependent") }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Insert Black-Scholes PDE", Subtitle = "∂V/∂t + ½σ²S² ∂²V/∂S² + rS ∂V/∂S - rV = 0 derivative pricing", Category = "Equations", IconKind = "ChartLineVariant", Action = () => AddMathElementCommand.Execute("black_scholes_pde") }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Insert Normal Distribution PDF", Subtitle = "Gaussian bell-curve probability density function", Category = "Equations", IconKind = "ChartBellCurve", Action = () => AddMathElementCommand.Execute("normal_distribution") }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Insert Euler's Identity", Subtitle = "e^(iπ) + 1 = 0 fundamental constants relation", Category = "Equations", IconKind = "Pi", Action = () => AddMathElementCommand.Execute("eulers_identity") }); - - // 4. Shapes & Stamps - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Insert Rectangle Shape", Subtitle = "Add geometric rectangle with fill & stroke", Category = "Shapes", IconKind = "SquareOutline", Shortcut = "R", Action = () => AddShapeElementCommand.Execute("Rectangle") }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Insert Circle / Ellipse Shape", Subtitle = "Add circular vector shape", Category = "Shapes", IconKind = "CircleOutline", Action = () => AddShapeElementCommand.Execute("Circle") }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Insert 5-Point Star", Subtitle = "Add decorative badge star", Category = "Shapes", IconKind = "StarOutline", Action = () => AddShapeElementCommand.Execute("Star5") }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Insert 'APPROVED' Stamp", Subtitle = "Green legal certification stamp", Category = "Stamps", IconKind = "CheckCircleOutline", Action = () => AddStampElementCommand.Execute("Approved") }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Insert 'CONFIDENTIAL' Stamp", Subtitle = "Red security classification stamp", Category = "Stamps", IconKind = "ShieldLockOutline", Action = () => AddStampElementCommand.Execute("Confidential") }); - - // 5. Data & Charts - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Insert Bar / Column Chart", Subtitle = "LiveCharts2 vertical bar comparison chart", Category = "Charts", IconKind = "ChartBar", Action = () => AddChartElementCommand.Execute("BarColumn") }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Insert Donut Pie Chart", Subtitle = "LiveCharts2 proportional breakdown donut chart", Category = "Charts", IconKind = "ChartPie", Action = () => AddChartElementCommand.Execute("DonutPie") }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Insert Smooth Spline Chart", Subtitle = "LiveCharts2 fluid bezier curve chart", Category = "Charts", IconKind = "ChartLineSmooth", Action = () => AddChartElementCommand.Execute("SmoothLine") }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Insert Area Gradient Chart", Subtitle = "LiveCharts2 filled area volume chart", Category = "Charts", IconKind = "ChartAreaspline", Action = () => AddChartElementCommand.Execute("Area") }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Insert Candlestick Chart", Subtitle = "LiveCharts2 OHLC stock and crypto financial chart", Category = "Charts", IconKind = "ChartCandlestick", Action = () => AddChartElementCommand.Execute("Candlestick") }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Insert Radar / Spider Chart", Subtitle = "LiveCharts2 multi-metric evaluation polygon", Category = "Charts", IconKind = "Radar", Action = () => AddChartElementCommand.Execute("Radar") }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Insert KPI Gauge Dial", Subtitle = "LiveCharts2 speedometer metric gauge", Category = "Charts", IconKind = "Gauge", Action = () => AddChartElementCommand.Execute("GaugeProgress") }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Insert Waterfall Chart", Subtitle = "LiveCharts2 financial revenue-to-profit variance bridge", Category = "Charts", IconKind = "ChartWaterfall", Action = () => AddChartElementCommand.Execute("Waterfall") }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Open Data Studio & Connector", Subtitle = "Ingest data from Excel (.xlsx), CSV, REST API, or Clipboard", Category = "Data", IconKind = "DatabaseArrowDownOutline", Action = () => OpenDataStudioCommand.Execute("NewChart") }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Batch Mail Merge & Mass PDF", Subtitle = "Generate 100s of personalized PDFs (payslips, invoices, certificates) in 1-click", Category = "Data", IconKind = "DatabaseArrowDownOutline", Action = () => OpenBatchGenerationCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Mass Payslips Generator", Subtitle = "Generate Employee Monthly Payslips from salary data", Category = "Data", IconKind = "CashMultiple", Action = () => OpenBatchGenerationCommand.Execute("payslip") }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Import Excel (.xlsx) to Chart", Subtitle = "Generate LiveCharts2 visualization from Excel workbook", Category = "Data", IconKind = "FileExcelOutline", Action = () => _ = ImportExcelToChartAsync() }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Import Excel (.xlsx) to Table", Subtitle = "Generate formatted Table from Excel workbook", Category = "Data", IconKind = "TableLarge", Action = () => _ = ImportExcelToTableAsync() }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Fetch REST API / JSON to Chart", Subtitle = "Live HTTP JSON endpoint ingestion for charts", Category = "Data", IconKind = "Api", Action = () => FetchRestApiToChartCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Fetch REST API / JSON to Table", Subtitle = "Live HTTP JSON endpoint ingestion for tables", Category = "Data", IconKind = "CodeJson", Action = () => FetchRestApiToTableCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Convert Table to Chart", Subtitle = "Transform selected Table into interactive LiveCharts2 chart", Category = "Data", IconKind = "ChartBoxOutline", Action = () => Inspector.ConvertTableToChartCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Convert Chart to Table", Subtitle = "Transform selected Chart into editable structured Table", Category = "Data", IconKind = "Table", Action = () => Inspector.ConvertChartToTableCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Insert Vector QR Code", Subtitle = "Dynamic URL, Wi-Fi, or vCard QR generator", Category = "Data", IconKind = "Qrcode", Action = () => AddQrCodeElementCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Insert Barcode", Subtitle = "Code128 / EAN / PDF417 optical barcode", Category = "Data", IconKind = "Barcode", Action = () => AddBarcodeElementCommand.Execute(null) }); - - // 6. Security & Markup - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Insert Sticky Review Note", Subtitle = "Collaborative annotation note", Category = "Markup", IconKind = "NoteTextOutline", Shortcut = "N", Action = () => AddStickyNoteElementCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Insert Highlighter Stroke", Subtitle = "Yellow semi-transparent highlight marker", Category = "Markup", IconKind = "Marker", Shortcut = "H", Action = () => AddInkElementCommand.Execute(true) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Insert Freehand Ink Drawing", Subtitle = "Freehand pen stroke vector element", Category = "Markup", IconKind = "DrawPen", Shortcut = "D", Action = () => AddInkElementCommand.Execute(false) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Insert Redaction Blackout Box", Subtitle = "Permanent FOIA / GDPR privileged blackout", Category = "Security", IconKind = "EyeOffOutline", Action = () => AddRedactionElementCommand.Execute("[REDACTED]") }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Search & Redact Pattern", Subtitle = "Auto-redact text occurrences on current page", Category = "Security", IconKind = "DatabaseSearchOutline", Action = () => OpenSearchRedactDialogCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Burn In All Redactions", Subtitle = "Permanently commit solid blackouts to PDF", Category = "Security", IconKind = "ShieldCheckOutline", Action = () => BurnInAllRedactionsCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Document Security & Passwords", Subtitle = "Configure password protection and permissions", Category = "Security", IconKind = "ShieldLockOutline", Action = () => OpenSecurityDialogCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Sanitize Document", Subtitle = "Scrub author metadata and internal review notes", Category = "Security", IconKind = "ShieldCheck", Action = () => SanitizeDocumentCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Apply Bates Numbering", Subtitle = "Sequential legal discovery numbering (CONF-BATES-000001)", Category = "Security", IconKind = "Numeric", Action = () => ApplyBatesNumberingCommand.Execute(null) }); - - // 7. Fill & Sign Studio - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Open Signature Studio", Subtitle = "Draw, type cursive calligraphy, or upload digital signature", Category = "Sign", IconKind = "Draw", Action = () => OpenSignatureStudioCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Stamp Today's Date", Subtitle = "Insert dynamic verified date badge", Category = "Sign", IconKind = "CalendarClockOutline", Action = () => AddDateStampCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Stamp Signer Initials", Subtitle = "Insert circular monogram initial stamp", Category = "Sign", IconKind = "AccountOutline", Action = () => AddInitialsBadgeCommand.Execute("JD") }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Stamp Checkmark (✓)", Subtitle = "Insert green verification checkmark", Category = "Sign", IconKind = "CheckBold", Action = () => AddCheckmarkBadgeCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Stamp Cross (✕)", Subtitle = "Insert red rejection cross mark", Category = "Sign", IconKind = "CloseThick", Action = () => AddCrossBadgeCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Custom Stamp Creator", Subtitle = "Create timestamped custom legal certification stamp", Category = "Stamps", IconKind = "Stamp", Action = () => OpenCustomStampDialogCommand.Execute(null) }); - - // 8. Watermarks & Headers/Footers - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Header & Footer Studio", Subtitle = "Configure multi-zone header/footer with dynamic macros", Category = "Organize", IconKind = "PageLayoutHeaderFooter", Action = () => OpenHeaderFooterDialogCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Watermark Manager", Subtitle = "Apply CONFIDENTIAL/DRAFT watermark across all pages", Category = "Organize", IconKind = "Watermark", Action = () => OpenWatermarkManagerCommand.Execute(null) }); - - // 9. Preflight Audit & Health Diagnostics - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Preflight Health Check & Audit", Subtitle = "Inspect PDF compliance, fonts, broken links, accessibility", Category = "Audit", IconKind = "FileCheckOutline", Action = () => OpenPreflightDialogCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Export Comments Summary", Subtitle = "Export all review notes to Markdown document", Category = "Audit", IconKind = "CommentTextMultipleOutline", Action = () => ExportCommentsSummaryCommand.Execute(null) }); - - // 10. Pages & Navigation - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Add Blank Page", Subtitle = "Insert new page at end of document", Category = "Pages", IconKind = "FilePlusOutline", Shortcut = "⌘⇧N", Action = () => AddPageCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Duplicate Current Page", Subtitle = "Clone active page with all elements", Category = "Pages", IconKind = "FileMultipleOutline", Shortcut = "⌘⇧D", Action = () => DuplicateCurrentPageCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Rotate Page 90° Clockwise", Subtitle = "Rotate current page orientation", Category = "Pages", IconKind = "RotateRight", Shortcut = "⌘⇧R", Action = () => RotateCurrentPageCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Delete Current Page", Subtitle = "Remove active page from document", Category = "Pages", IconKind = "DeleteOutline", Shortcut = "⌘⇧⌫", Action = () => DeleteCurrentPageCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Next Page", Subtitle = "Go to next document page", Category = "Navigation", IconKind = "ChevronRight", Shortcut = "PgDn", Action = () => NextPageCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Previous Page", Subtitle = "Go to previous document page", Category = "Navigation", IconKind = "ChevronLeft", Shortcut = "PgUp", Action = () => PreviousPageCommand.Execute(null) }); - - // 11. View, Workspace Panels & Guides - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Toggle Ribbon Toolbar", Subtitle = "Collapse or expand top ribbon tools panel", Category = "View", IconKind = "ViewAgendaOutline", Shortcut = "⌘F1", Action = () => ToggleRibbonCollapseCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Toggle Pages Sidebar", Subtitle = "Collapse or expand left thumbnails & outline sidebar", Category = "View", IconKind = "DockLeft", Shortcut = "⌘B", Action = () => ToggleLeftSidebarCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Toggle Properties Inspector", Subtitle = "Collapse or expand right formatting & properties panel", Category = "View", IconKind = "DockRight", Shortcut = "⌘⇧P", Action = () => ToggleInspectorCollapseCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Expand All Panels", Subtitle = "Restore all ribbon and sidebar panels", Category = "View", IconKind = "ViewQuiltOutline", Action = () => ExpandAllPanelsCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Toggle Canvas Grid", Subtitle = "Show/hide alignment grid dots", Category = "View", IconKind = "Grid", Action = () => ToggleGridCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Toggle Snap to Grid", Subtitle = "Snap elements to precise 20pt intervals", Category = "View", IconKind = "Magnet", Action = () => ToggleSnapToGridCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Zoom In", Subtitle = "Increase canvas scale by 10%", Category = "View", IconKind = "MagnifyPlusOutline", Shortcut = "⌘+", Action = () => ZoomInCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Zoom Out", Subtitle = "Decrease canvas scale by 10%", Category = "View", IconKind = "MagnifyMinusOutline", Shortcut = "⌘-", Action = () => ZoomOutCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Reset Zoom (100%)", Subtitle = "Reset canvas view to 1:1 scale", Category = "View", IconKind = "Magnify", Shortcut = "⌘0", Action = () => ResetZoomCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Fit to Width", Subtitle = "Scale page to fill viewport width", Category = "View", IconKind = "ArrowExpandHorizontal", Shortcut = "⌘1", Action = () => FitToWidthCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Fit to Page", Subtitle = "Scale page to view whole sheet", Category = "View", IconKind = "FitToPageOutline", Shortcut = "⌘9", Action = () => FitToPageCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Toggle Dark / Light Theme", Subtitle = "Switch between Dark and Light studio theme variants", Category = "Theme", IconKind = "ThemeLightDark", Shortcut = "⌘⇧T", Action = () => ToggleThemeCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Switch to Dark Theme", Subtitle = "Activate deep dark studio palette for low-light environments", Category = "Theme", IconKind = "WeatherNight", Action = () => SetDarkThemeCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Switch to Light Theme", Subtitle = "Activate crisp clean light studio palette", Category = "Theme", IconKind = "WeatherSunny", Action = () => SetLightThemeCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Use System Theme", Subtitle = "Follow operating system dark/light theme preference", Category = "Theme", IconKind = "Laptop", Action = () => SetSystemThemeCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Help & User Guides", Subtitle = "Open comprehensive guides for all 32 tools, editor & workflows", Category = "Help", IconKind = "HelpCircleOutline", Action = () => NavigateToHelpCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Help: 32 PDF Tools Guide", Subtitle = "Step-by-step guides, formats & pro tips for every PDF tool", Category = "Help", IconKind = "Tools", Action = () => NavigateToHelpCommand.Execute("tool-merge") }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Help: Live Document Editor Guide", Subtitle = "Guide to canvas tools, typography, math LaTeX & vector layers", Category = "Help", IconKind = "Draw", Action = () => NavigateToHelpCommand.Execute("editor-canvas-basics") }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Help: Batch PDF Generation Guide", Subtitle = "Guide to CSV/JSON Data Studio and mass PDF generation", Category = "Help", IconKind = "DatabaseArrowRightOutline", Action = () => NavigateToHelpCommand.Execute("automation-data-studio") }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Plugins & Extensions Studio", Subtitle = "Full-screen plugin store, installed extensions, and configuration studio", Category = "Preferences", IconKind = "PuzzleOutline", Action = () => NavigateToPluginsPageCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Plugins & Extensions (Quick Dialog)", Subtitle = "Quick popup to toggle plugins, profiles, and load assemblies", Category = "Help", IconKind = "PuzzleOutline", Action = () => OpenPluginsDialogCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "About FryPDF", Subtitle = "View app version, system info, open-source credits, and support", Category = "Help", IconKind = "InformationOutline", Action = () => OpenAboutDialogCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Keyboard Shortcuts Reference", Subtitle = "Open keyboard cheatsheet dialog", Category = "Help", IconKind = "KeyboardOutline", Shortcut = "F1", Action = () => OpenShortcutsHelpCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Open Source Licenses & Third-Party Tools", Subtitle = "View all 12 libraries, licenses, maintainers & attribution text", Category = "Help", IconKind = "CertificateOutline", Action = () => NavigateToLicensingCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Copy Open Source Attributions", Subtitle = "Copy full open source license notices & copyright text", Category = "Help", IconKind = "ContentCopy", Action = () => { _ = Home.CopyFullAttributionsCommand.ExecuteAsync(null); ShowToast("Copied open source license attributions", "CertificateOutline"); } }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Contact Support (codefrydev@gmail.com)", Subtitle = "Copy developer support email to clipboard", Category = "Help", IconKind = "EmailOutline", Action = () => CopySupportEmailCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Visit CodeFryDev Website", Subtitle = "Open official codefrydev.in developer portal", Category = "Help", IconKind = "Web", Action = () => OpenCompanyWebsiteCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "GitHub Repository", Subtitle = "View open-source repository and star the project", Category = "Help", IconKind = "Github", Action = () => OpenGitHubCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Microsoft Store Page", Subtitle = "View FryPDF on Microsoft Store (9P5GW2Q81B33)", Category = "Help", IconKind = "Microsoft", Action = () => OpenMicrosoftStoreCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Copy System Diagnostics", Subtitle = "Copy OS, framework, store identity, and app version report", Category = "Help", IconKind = "BugOutline", Action = () => CopyDiagnosticsCommand.Execute(null) }); - AllPaletteCommands.Add(new CommandPaletteItem { Title = "Settings & UI Preferences", Subtitle = "Configure notification placement, snackbar style, themes, and workspace defaults", Category = "Preferences", IconKind = "CogOutline", Shortcut = "⌘,", Action = () => NavigateToSettingsCommand.Execute(null) }); - - // 12. Dynamic Plugin Tools - var tools = _toolRegistry?.GetAllTools() ?? (IReadOnlyList)Array.Empty(); - foreach (var tool in tools) - { - var targetTool = tool; - AllPaletteCommands.Add(new CommandPaletteItem - { - Title = $"Tool: {targetTool.Name}", - Subtitle = targetTool.Description, - Category = "PDF Tools", - IconKind = targetTool.IconKind, - Action = () => OpenTool(targetTool.Id) - }); - } - - // 13. Dynamic Plugin Ribbon Actions - var actions = _ribbonRegistry?.GetAllActions() ?? (IReadOnlyList)Array.Empty(); - foreach (var action in actions) - { - var targetAction = action; - AllPaletteCommands.Add(new CommandPaletteItem - { - Title = targetAction.Label, - Subtitle = targetAction.Tooltip ?? $"Contributed by plugin ({targetAction.TabId} tab)", - Category = "Plugins", - IconKind = targetAction.IconKind, - Action = () => ExecuteRibbonAction(targetAction) - }); - } - - // 14. Dynamic Plugin Contributed Commands - var dynamicCommands = _commandPaletteRegistry?.GetAllCommands() ?? (IReadOnlyList)Array.Empty(); - foreach (var cmd in dynamicCommands) - { - var targetCmd = cmd; - AllPaletteCommands.Add(new CommandPaletteItem - { - Title = targetCmd.Title, - Subtitle = targetCmd.Subtitle, - Category = targetCmd.Category, - IconKind = targetCmd.IconKind, - Shortcut = targetCmd.Shortcut ?? "", - Action = () => targetCmd.Action?.Invoke(_pluginHost?.Context ?? (IServiceProvider)this) - }); - } - - FilterPaletteCommands(""); - } - - public void FilterPaletteCommands(string query) - { - FilteredPaletteCommands.Clear(); - var q = query?.Trim() ?? ""; - - var matching = string.IsNullOrEmpty(q) - ? AllPaletteCommands - : AllPaletteCommands.Where(c => - c.Title.Contains(q, StringComparison.OrdinalIgnoreCase) || - c.Subtitle.Contains(q, StringComparison.OrdinalIgnoreCase) || - c.Category.Contains(q, StringComparison.OrdinalIgnoreCase) || - c.Shortcut.Contains(q, StringComparison.OrdinalIgnoreCase)); - - foreach (var cmd in matching) - { - FilteredPaletteCommands.Add(cmd); - } - - SelectedPaletteIndex = FilteredPaletteCommands.Count > 0 ? 0 : -1; - } -} diff --git a/src/PdfEditorApp/ViewModels/MainViewModel.Persistence.cs b/src/PdfEditorApp/ViewModels/MainViewModel.Persistence.cs deleted file mode 100644 index 806bf3a..0000000 --- a/src/PdfEditorApp/ViewModels/MainViewModel.Persistence.cs +++ /dev/null @@ -1,444 +0,0 @@ -using System; -using System.IO; -using System.Threading.Tasks; -using Avalonia.Platform.Storage; -using CommunityToolkit.Mvvm.ComponentModel; -using CommunityToolkit.Mvvm.Input; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Plugins.Descriptors; -using PdfEditorApp.Models; -using PdfEditorApp.ViewModels.ElementViewModels; - -namespace PdfEditorApp.ViewModels; - -public partial class MainViewModel -{ - // --- PERSISTENCE & EXPORT STATE --- - - [ObservableProperty] - private bool _isNewDocumentDialogOpen; - - [ObservableProperty] - private bool _isExportSuccessDialogOpen; - - [ObservableProperty] - private string _lastExportedFilePath = ""; - - // --- EXPORT & PERSISTENCE COMMANDS --- - - [RelayCommand] - public async Task ExportPdfAsync() - { - try - { - UpdateStatus("Generating PDF with QuestPDF engine..."); - - string defaultFileName = Path.ChangeExtension(DocumentTitle, ".pdf"); - if (string.IsNullOrEmpty(defaultFileName)) defaultFileName = "Document.pdf"; - - string exportPath = ""; - - if (StorageProvider != null) - { - var file = await StorageProvider.SaveFilePickerAsync(new FilePickerSaveOptions - { - Title = "Export PDF Document", - DefaultExtension = "pdf", - SuggestedFileName = defaultFileName, - FileTypeChoices = new[] - { - new FilePickerFileType("PDF Documents (*.pdf)") - { - Patterns = new[] { "*.pdf" } - } - } - }); - - if (file != null) - { - exportPath = file.Path.LocalPath; - } - else - { - UpdateStatus("Export cancelled."); - return; - } - } - else - { - exportPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), defaultFileName); - } - - var docModel = ToDocumentModel(); - IsBusy = true; - try - { - var progress = new Progress(p => UpdateStatus($"Generating PDF... {p:F0}%")); - await _exportService.ExportToFileAsync(docModel, exportPath, progress); - } - finally - { - IsBusy = false; - } - - LastExportedFilePath = exportPath; - IsExportSuccessDialogOpen = true; - OpenRegisteredDialog("frypdf.dialog.exportsuccess"); - ShowToast($"Exported PDF: {Path.GetFileName(exportPath)}", "ExportVariant"); - } - catch (Exception ex) - { - IsBusy = false; - ShowToast($"Export error: {ex.Message}", "AlertCircleOutline"); - } - } - - [RelayCommand] - public async Task ExportDocumentAsAsync(string exporterId) - { - try - { - var exporterRegistry = _pluginHost?.Context.GetService(); - var exporter = exporterRegistry?.GetExporter(exporterId); - if (exporter == null) - { - await ExportPdfAsync(); - return; - } - - UpdateStatus($"Exporting document using {exporter.DisplayName}..."); - string defaultFileName = Path.ChangeExtension(DocumentTitle, exporter.DefaultExtension); - string exportPath = ""; - - if (StorageProvider != null) - { - var file = await StorageProvider.SaveFilePickerAsync(new FilePickerSaveOptions - { - Title = $"Export {exporter.DisplayName}", - DefaultExtension = exporter.DefaultExtension.TrimStart('.'), - SuggestedFileName = defaultFileName, - FileTypeChoices = new[] - { - new FilePickerFileType(exporter.FileFilterDescription) - { - Patterns = new[] { $"*{exporter.DefaultExtension}" } - } - } - }); - - if (file != null) - { - exportPath = file.Path.LocalPath; - } - else - { - UpdateStatus("Export cancelled."); - return; - } - } - else - { - exportPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), defaultFileName); - } - - var docModel = ToDocumentModel(); - var bytes = await exporter.ExportAsync(docModel, new DocumentExportOptions { OutputPath = exportPath }); - await File.WriteAllBytesAsync(exportPath, bytes); - - LastExportedFilePath = exportPath; - IsExportSuccessDialogOpen = true; - OpenRegisteredDialog("frypdf.dialog.exportsuccess"); - UpdateStatus($"Exported to {Path.GetFileName(exportPath)} successfully!"); - ShowToast($"Exported {Path.GetFileName(exportPath)} successfully!", "CheckCircleOutline"); - } - catch (Exception ex) - { - UpdateStatus($"Export failed: {ex.Message}"); - ShowToast($"Export failed: {ex.Message}", ToastNotificationType.Danger, "AlertCircleOutline"); - } - } - - [RelayCommand] - public async Task SaveProjectAsync() - { - try - { - string savePath = ""; - string defaultFileName = Path.ChangeExtension(DocumentTitle, ".frypdf"); - - if (StorageProvider != null) - { - var file = await StorageProvider.SaveFilePickerAsync(new FilePickerSaveOptions - { - Title = "Save FryPDF Project", - DefaultExtension = "frypdf", - SuggestedFileName = defaultFileName, - FileTypeChoices = new[] - { - new FilePickerFileType("FryPDF Project (*.frypdf)") - { - Patterns = new[] { "*.frypdf", "*.pdfproj", "*.json" } - } - } - }); - - if (file != null) - { - savePath = file.Path.LocalPath; - } - else - { - UpdateStatus("Save cancelled."); - return; - } - } - else - { - savePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), defaultFileName); - } - - var docModel = ToDocumentModel(); - await _persistenceService.SaveProjectAsync(docModel, savePath); - CurrentFilePath = savePath; - // Record in recent documents - _recentService.Add(new RecentDocumentItem - { - FilePath = savePath, - Title = DocumentTitle, - LastOpened = DateTime.UtcNow - }); - Home.RefreshRecent(); - ShowToast($"Project saved to {Path.GetFileName(savePath)}", "ContentSaveOutline"); - } - catch (Exception ex) - { - ShowToast($"Save error: {ex.Message}", "AlertCircleOutline"); - } - } - - [RelayCommand] - public async Task OpenProjectAsync() - { - // When in editor, use the file picker directly - await OpenProjectAndEnterEditorAsync(); - } - - // --- TEMPLATE SELECTION & GALLERY DIALOG STATE --- - - [ObservableProperty] - private string _templateSearchQuery = ""; - - [ObservableProperty] - private string _selectedTemplateCategory = "All"; - - [RelayCommand] - public void SetTemplateCategory(string? category) - { - SelectedTemplateCategory = string.IsNullOrWhiteSpace(category) ? "All" : category; - } - - [RelayCommand] - public void ClearTemplateSearch() - { - TemplateSearchQuery = ""; - } - - partial void OnTemplateSearchQueryChanged(string value) - { - NotifyTemplateVisibilities(); - } - - partial void OnSelectedTemplateCategoryChanged(string value) - { - NotifyTemplateVisibilities(); - } - - private void NotifyTemplateVisibilities() - { - OnPropertyChanged(nameof(IsAnnualReportTemplateVisible)); - OnPropertyChanged(nameof(IsInvoiceTemplateVisible)); - OnPropertyChanged(nameof(IsResumeTemplateVisible)); - OnPropertyChanged(nameof(IsAcademicPaperTemplateVisible)); - OnPropertyChanged(nameof(IsCertificateTemplateVisible)); - OnPropertyChanged(nameof(IsBlankTemplateVisible)); - OnPropertyChanged(nameof(HasNoMatchingTemplates)); - } - - private bool CheckTemplateMatch(string templateId, string category, string name, string description) - { - if (SelectedTemplateCategory != "All" && !string.Equals(SelectedTemplateCategory, category, StringComparison.OrdinalIgnoreCase)) - { - return false; - } - - if (string.IsNullOrWhiteSpace(TemplateSearchQuery)) - { - return true; - } - - string q = TemplateSearchQuery.Trim(); - return name.Contains(q, StringComparison.OrdinalIgnoreCase) - || description.Contains(q, StringComparison.OrdinalIgnoreCase) - || category.Contains(q, StringComparison.OrdinalIgnoreCase) - || templateId.Contains(q, StringComparison.OrdinalIgnoreCase); - } - - public bool IsAnnualReportTemplateVisible => CheckTemplateMatch("annualreport", "Corporate", "Annual Corporate Report", "Executive summary, financial metrics, and chart"); - public bool IsInvoiceTemplateVisible => CheckTemplateMatch("invoice", "Finance", "Modern Service Invoice", "Itemized billing table and payment terms"); - public bool IsResumeTemplateVisible => CheckTemplateMatch("resume", "Career", "Executive Resume / CV", "Complete CV with QR code, competencies, and verified metrics"); - public bool IsAcademicPaperTemplateVisible => CheckTemplateMatch("academic", "Academic", "Academic Research Paper", "2-column formatted research paper layout"); - public bool IsCertificateTemplateVisible => CheckTemplateMatch("certificate", "Certificates", "Certificate of Achievement", "Award of excellence and official recognition credential"); - public bool IsBlankTemplateVisible => CheckTemplateMatch("blank", "General", "Blank Canvas", "Start fresh with a clean customizable canvas"); - - public bool HasNoMatchingTemplates => !IsAnnualReportTemplateVisible - && !IsInvoiceTemplateVisible - && !IsResumeTemplateVisible - && !IsAcademicPaperTemplateVisible - && !IsCertificateTemplateVisible - && !IsBlankTemplateVisible; - - // --- TEMPLATE SELECTION DIALOG COMMANDS --- - - [RelayCommand] - public void OpenNewDocumentDialog() - { - TemplateSearchQuery = ""; - SelectedTemplateCategory = "All"; - IsNewDocumentDialogOpen = true; - OpenRegisteredDialog("frypdf.dialog.newdocument"); - } - - [RelayCommand] - public void CloseNewDocumentDialog() - { - IsNewDocumentDialogOpen = false; - CloseDynamicDialog(); - } - - [RelayCommand] - public void CloseExportSuccessDialog() - { - IsExportSuccessDialogOpen = false; - CloseDynamicDialog(); - } - - [RelayCommand] - public void CloseExportDialog() - { - IsExportSuccessDialogOpen = false; - CloseDynamicDialog(); - } - - [RelayCommand] - public void SelectTemplate(string? templateName) - { - CloseDynamicDialog(); - OpenEditorWithTemplate(templateName); - } - - [RelayCommand] - public void CreateNewFromTemplate(string? templateName) - { - CloseDynamicDialog(); - OpenEditorWithTemplate(templateName); - } - - // --- MODEL CONVERSION & SERIALIZATION --- - - public PdfDocumentModel ToDocumentModel() - { - var doc = new PdfDocumentModel - { - Title = DocumentTitle, - Author = DocumentAuthor, - Subject = DocumentSubject, - Keywords = DocumentKeywords, - Creator = string.IsNullOrWhiteSpace(DocumentCreator) ? "FryPDF" : DocumentCreator, - Producer = string.IsNullOrWhiteSpace(DocumentProducer) ? "codefrydev.in" : DocumentProducer, - SecuritySettings = SecuritySettings.Clone() - }; - - foreach (var pageVm in Pages) - { - doc.Pages.Add(pageVm.ToModel()); - } - - return doc; - } - - public void LoadFromDocumentModel(PdfDocumentModel model) - { - ApplyDocumentMetadata(model); - - // The previous document's undo/redo history is meaningless once its pages are gone — - // undoing after switching documents must never resurrect a replaced document's state. - // This also releases any deleted chart/image bitmaps still pinned by that history. - UndoRedo.Clear(); - - Pages.Clear(); - foreach (var pageModel in model.Pages) - { - var pageVm = new PageViewModel(); - pageVm.LoadFromModel(pageModel); - pageVm.SelectionChanged += OnElementSelectionChanged; - Pages.Add(pageVm); - } - - FinishLoadingDocument(); - } - - /// - /// Same as but yields back to the dispatcher every - /// few pages, so opening a large document doesn't freeze the UI thread for the whole - /// build — used by every user-facing "open a document" path. - /// - public async Task LoadFromDocumentModelAsync(PdfDocumentModel model) - { - ApplyDocumentMetadata(model); - - // See LoadFromDocumentModel — the outgoing document's undo/redo history must not - // survive the switch. - UndoRedo.Clear(); - - Pages.Clear(); - int i = 0; - foreach (var pageModel in model.Pages) - { - var pageVm = new PageViewModel(); - pageVm.LoadFromModel(pageModel); - pageVm.SelectionChanged += OnElementSelectionChanged; - Pages.Add(pageVm); - - if (++i % 8 == 0) - { - await Task.Yield(); - } - } - - FinishLoadingDocument(); - } - - private void ApplyDocumentMetadata(PdfDocumentModel model) - { - DocumentTitle = model.Title; - DocumentAuthor = model.Author; - DocumentSubject = model.Subject; - DocumentKeywords = model.Keywords ?? ""; - DocumentCreator = string.IsNullOrWhiteSpace(model.Creator) ? "FryPDF" : model.Creator; - DocumentProducer = string.IsNullOrWhiteSpace(model.Producer) ? "codefrydev.in" : model.Producer; - SecuritySettings = model.SecuritySettings?.Clone() ?? new PdfSecuritySettings(); - } - - private void FinishLoadingDocument() - { - if (Pages.Count > 0) - { - SelectPage(Pages[0]); - } - - RefreshOutline(); - RefreshComments(); - UpdateStatus($"Loaded document: {DocumentTitle}"); - IsBusy = false; - } -} diff --git a/src/PdfEditorApp/ViewModels/MainViewModel.cs b/src/PdfEditorApp/ViewModels/MainViewModel.cs deleted file mode 100644 index 0abb8d2..0000000 --- a/src/PdfEditorApp/ViewModels/MainViewModel.cs +++ /dev/null @@ -1,2277 +0,0 @@ -using PdfEditorApp.Services.Tools.Core; -using PdfEditorApp.Services.Tools.Organize; -using PdfEditorApp.Services.Tools.Security; -using PdfEditorApp.Services.Tools.Conversion; -using PdfEditorApp.Services.Tools.Intelligence; -using PdfEditorApp.ViewModels.Tools.Core; -using PdfEditorApp.Core.Data; -using PdfEditorApp.ViewModels.DataStudio; -using PdfEditorApp.ViewModels.BatchGeneration; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Plugins; -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Linq; -using System.IO; -using System.Threading; -using System.Threading.Tasks; -using Avalonia; -using Avalonia.Controls; -using Avalonia.Layout; -using Avalonia.Media; -using Avalonia.Platform.Storage; -using Avalonia.Threading; -using CommunityToolkit.Mvvm.ComponentModel; -using CommunityToolkit.Mvvm.Input; -using CommunityToolkit.Mvvm.Messaging; -using PdfEditorApp.Messages; -using PdfEditorApp.Models; -using PdfEditorApp.Services; -using PdfEditorApp.Services.Canvas; -using PdfEditorApp.Services.Ribbon; -using PdfEditorApp.Core.Plugins.Descriptors; -using PdfEditorApp.ViewModels.ElementViewModels; - -namespace PdfEditorApp.ViewModels; - -public partial class MainViewModel : ViewModelBase -{ - private readonly IPdfExportService _exportService; - private readonly ITemplateService _templateService; - private readonly IProjectPersistenceService _persistenceService; - private readonly IDocumentAuditService _auditService; - private readonly ISignatureService _signatureService; - private readonly ISmartPlacementService _placementService; - private readonly IRecentDocumentsService _recentService; - private readonly IPageOrganizerService _pageOrganizerService; - private readonly IPdfDocumentOperationsService _pdfOperationsService; - private readonly IPdfToolRegistry _toolRegistry; - private readonly ICanvasElementService _elementService; - private readonly IRibbonRegistry _ribbonRegistry; - private readonly PdfEditorApp.Core.Plugins.Descriptors.ISidebarRegistry? _sidebarRegistry; - private readonly PdfEditorApp.Core.Plugins.Descriptors.IDialogRegistry? _dialogRegistry; - private readonly PdfEditorApp.Core.Plugins.Descriptors.IOverlayRegistry? _overlayRegistry; - - public IRibbonRegistry RibbonRegistry => _ribbonRegistry; - public PdfEditorApp.Core.Plugins.Descriptors.ISidebarRegistry? SidebarRegistry => _sidebarRegistry; - public PdfEditorApp.Core.Plugins.Descriptors.IDialogRegistry? DialogRegistry => _dialogRegistry; - public PdfEditorApp.Core.Plugins.Descriptors.IOverlayRegistry? OverlayRegistry => _overlayRegistry; - public ObservableCollection ActiveOverlays => (_overlayRegistry as PdfEditorApp.Services.Overlays.OverlayRegistry)?.ActiveOverlays ?? _fallbackActiveOverlays; - private readonly ObservableCollection _fallbackActiveOverlays = new(); - - public ObservableCollection PluginRibbonActions { get; } = new(); - public ObservableCollection DynamicRibbonTabs { get; } = new(); - public ObservableCollection DynamicRibbonGroups { get; } = new(); - public ObservableCollection DynamicGroupsForActiveTab { get; } = new(); - public ObservableCollection DynamicSidebarTabs { get; } = new(); - - [ObservableProperty] - private string? _activeDynamicRibbonTabId; - - [ObservableProperty] - private string? _activeDynamicSidebarTabId; - - [ObservableProperty] - private object? _activeDynamicSidebarView; - - [ObservableProperty] - private object? _activeDynamicDialog; - - [ObservableProperty] - private bool _isDynamicDialogOpen; - - public ISmartPlacementService SmartPlacement => _placementService; - public IPageOrganizerService PageOrganizer => _pageOrganizerService; - public IPdfDocumentOperationsService PdfOperations => _pdfOperationsService; - - // PDF Tool Studio Subsystems - public PdfToolRunnerViewModel ToolRunner { get; } - - public WorkflowBuilderViewModel WorkflowBuilder { get; } - public PdfViewerViewModel PdfViewer { get; } - public FryPdfViewer.FryPdfViewerViewModel FryPdfViewer { get; } - public DataStudioViewModel DataStudio { get; } - public BatchGenerationViewModel BatchGeneration { get; } - public AiAssistantViewModel AiAssistant { get; } - - // --- HOME / EDITOR / VIEWER VIEW-SWITCHING --- - - [ObservableProperty] - private bool _isHomePageVisible = true; - - [ObservableProperty] - private bool _isEditorVisible = false; - - [ObservableProperty] - private bool _isPdfViewerVisible = false; - - [ObservableProperty] - private bool _isFryPdfViewerVisible = false; - - [ObservableProperty] - private WindowState _mainWindowState = WindowState.Normal; - - /// - /// Dynamic window title that accurately reflects the active application context: - /// Home dashboard ("FryPDF - Privacy-First PDF Studio"), specific tool ("Merge PDF - FryPDF"), - /// PDF Reader ("Document.pdf - FryPDF"), or Editor Studio ("Document.pdf - FryPDF"). - /// - public string WindowTitle - { - get - { - if (IsHomePageVisible) - { - if (Home != null && Home.IsToolPageActive && Home.ActiveToolCard != null) - { - return $"{Home.ActiveToolCard.Name} - FryPDF"; - } - if (Home != null && Home.IsToolPageActive && Home.ActiveToolViewModel != null) - { - return $"{Home.ActiveToolViewModel.Tool.Name} - FryPDF"; - } - if (Home != null && Home.SelectedNavSection == HomeNavSection.Licensing) - { - return "Licenses & Third-Party Tools - FryPDF"; - } - return "FryPDF - Privacy-First PDF Studio"; - } - else if (IsFryPdfViewerVisible) - { - if (FryPdfViewer != null && !string.IsNullOrWhiteSpace(FryPdfViewer.DocumentTitle)) - { - return $"{FryPdfViewer.DocumentTitle} - Interactive Reader - FryPDF"; - } - return "Interactive Reader - FryPDF"; - } - else if (IsPdfViewerVisible) - { - if (PdfViewer != null && !string.IsNullOrWhiteSpace(PdfViewer.DocumentTitle) && PdfViewer.DocumentTitle != "Document.pdf") - { - return $"{PdfViewer.DocumentTitle} - FryPDF"; - } - return "PDF Reader - FryPDF"; - } - else if (IsEditorVisible) - { - if (!string.IsNullOrWhiteSpace(DocumentTitle)) - { - return $"{DocumentTitle} - FryPDF"; - } - return "FryPDF Editor"; - } - return "FryPDF"; - } - } - - partial void OnIsHomePageVisibleChanged(bool value) => OnPropertyChanged(nameof(WindowTitle)); - partial void OnIsEditorVisibleChanged(bool value) => OnPropertyChanged(nameof(WindowTitle)); - partial void OnIsPdfViewerVisibleChanged(bool value) => OnPropertyChanged(nameof(WindowTitle)); - partial void OnIsFryPdfViewerVisibleChanged(bool value) => OnPropertyChanged(nameof(WindowTitle)); - partial void OnDocumentTitleChanged(string value) => OnPropertyChanged(nameof(WindowTitle)); - - /// ViewModel for the Home / Start Screen. - public HomeViewModel Home { get; } - - private List _clipboardElements = new(); - private CancellationTokenSource? _toastCts; - - // --- CORE OBSERVABLE PROPERTIES --- - - [ObservableProperty] - private string _documentTitle = "Document_2026.pdf"; - - [ObservableProperty] - private string _currentFilePath = ""; - - [ObservableProperty] - private string _documentAuthor = "CodeFryDev"; - - [ObservableProperty] - private string _documentSubject = "PDF Document"; - - [ObservableProperty] - private string _documentKeywords = ""; - - [ObservableProperty] - private string _documentCreator = "FryPDF"; - - [ObservableProperty] - private string _documentProducer = "codefrydev.in"; - - [ObservableProperty] - private RibbonTabKind _activeRibbonTab = RibbonTabKind.Edit; - - [ObservableProperty] - private SidebarTabKind _activeSidebarTab = SidebarTabKind.Thumbnails; - - // Workspace Panel Collapse & Expand States - [ObservableProperty] - private bool _isRibbonCollapsed; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(IsLeftSidebarResizable))] - private bool _isLeftSidebarCollapsed; - - [ObservableProperty] - private GridLength _leftSidebarGridLength = new(340, GridUnitType.Pixel); - - private double _savedExpandedLeftSidebarWidth = 340; - - public bool IsLeftSidebarResizable => !IsLeftSidebarCollapsed && !IsPresentationMode; - - partial void OnIsLeftSidebarCollapsedChanged(bool value) - { - if (value) - { - if (LeftSidebarGridLength.IsAbsolute && LeftSidebarGridLength.Value > 100) - { - _savedExpandedLeftSidebarWidth = LeftSidebarGridLength.Value; - } - LeftSidebarGridLength = new GridLength(38, GridUnitType.Pixel); - } - else - { - LeftSidebarGridLength = new GridLength(Math.Max(260, _savedExpandedLeftSidebarWidth), GridUnitType.Pixel); - } - OnPropertyChanged(nameof(IsLeftSidebarResizable)); - } - - partial void OnLeftSidebarGridLengthChanged(GridLength value) - { - if (!IsLeftSidebarCollapsed && value.IsAbsolute && value.Value >= 200) - { - _savedExpandedLeftSidebarWidth = value.Value; - } - } - - [ObservableProperty] - private bool _isInspectorCollapsed; - - [ObservableProperty] - private ToolMode _activeToolMode = ToolMode.Select; - - [ObservableProperty] - private double _zoomLevel = 1.0; // 100% - - [ObservableProperty] - private string _statusMessage = "Ready"; - - /// - /// True while a document open/template load/export is in progress. Drives the - /// status-bar busy indicator so the app never looks idle while it's actually working. - /// - [ObservableProperty] - private bool _isBusy; - - [ObservableProperty] - private string _searchQuery = ""; - - [ObservableProperty] - private PageViewModel? _currentPage; - - partial void OnCurrentPageChanged(PageViewModel? oldValue, PageViewModel? newValue) - { - if (oldValue != null) - { - oldValue.SelectionChanged -= OnElementSelectionChanged; - oldValue.MultiSelectionChanged -= OnMultiSelectionChanged; - } - - if (newValue != null) - { - newValue.SelectionChanged += OnElementSelectionChanged; - newValue.MultiSelectionChanged += OnMultiSelectionChanged; - Inspector.UpdateSelection(newValue.SelectedElement, newValue); - } - else - { - Inspector.UpdateSelection(null, null); - } - } - - private void OnMultiSelectionChanged() - { - Inspector.UpdateSelection(CurrentPage?.SelectedElement, CurrentPage); - } - - // Canvas Grid & Snap-to-Grid - [ObservableProperty] - private bool _showGrid; - - [ObservableProperty] - private bool _snapToGrid; - - [ObservableProperty] - private GridSnapSize _gridSnapSize = GridSnapSize.Points20; - - // Toast HUD State - [ObservableProperty] - private string _toastMessage = ""; - - [ObservableProperty] - private string _toastIcon = "CheckCircleOutline"; - - [ObservableProperty] - private bool _isToastVisible; - - [ObservableProperty] - private ToastNotificationType _toastType = ToastNotificationType.Primary; - - [ObservableProperty] - private ToastPosition _toastPosition = ToastPosition.BottomCenter; - - [ObservableProperty] - private ToastStyleVariant _toastStyleVariant = ToastStyleVariant.Solid; - - [ObservableProperty] - private bool _toastShowCloseButton = true; - - partial void OnToastTypeChanged(ToastNotificationType value) => RefreshToastVisuals(); - partial void OnToastPositionChanged(ToastPosition value) => RefreshToastVisuals(); - partial void OnToastStyleVariantChanged(ToastStyleVariant value) => RefreshToastVisuals(); - partial void OnToastShowCloseButtonChanged(bool value) => RefreshToastVisuals(); - - public bool ToastIsSolid - { - get - { - if (ToastStyleVariant == ToastStyleVariant.Auto) - return IsDarkMode; - return ToastStyleVariant == ToastStyleVariant.Solid; - } - } - - public IBrush ToastBackgroundBrush - { - get - { - if (ToastIsSolid) - { - return ToastType switch - { - ToastNotificationType.Primary => Brush("#0F6CBD"), - ToastNotificationType.Success => Brush("#15803D"), - ToastNotificationType.Danger => Brush("#DC2626"), - ToastNotificationType.Warning => Brush("#D97706"), - ToastNotificationType.General => Brush("#1E293B"), - _ => Brush("#1E293B") - }; - } - - if (IsDarkMode) - { - return ToastType switch - { - ToastNotificationType.Primary => Brush("#172554"), - ToastNotificationType.Success => Brush("#052E16"), - ToastNotificationType.Danger => Brush("#450A0A"), - ToastNotificationType.Warning => Brush("#451A03"), - ToastNotificationType.General => Brush("#18181B"), - _ => Brush("#18181B") - }; - } - else - { - return ToastType switch - { - ToastNotificationType.Primary => Brush("#EFF6FF"), - ToastNotificationType.Success => Brush("#F0FDF4"), - ToastNotificationType.Danger => Brush("#FEF2F2"), - ToastNotificationType.Warning => Brush("#FFFBEB"), - ToastNotificationType.General => Brush("#F8FAFC"), - _ => Brush("#F8FAFC") - }; - } - } - } - - public IBrush ToastForegroundBrush - { - get - { - if (ToastIsSolid) return WhiteBrush; - - if (IsDarkMode) - { - return ToastType switch - { - ToastNotificationType.Primary => Brush("#93C5FD"), - ToastNotificationType.Success => Brush("#86EFAC"), - ToastNotificationType.Danger => Brush("#FCA5A5"), - ToastNotificationType.Warning => Brush("#FCD34D"), - ToastNotificationType.General => Brush("#E2E8F0"), - _ => Brush("#E2E8F0") - }; - } - else - { - return ToastType switch - { - ToastNotificationType.Primary => Brush("#1D4ED8"), - ToastNotificationType.Success => Brush("#15803D"), - ToastNotificationType.Danger => Brush("#B91C1C"), - ToastNotificationType.Warning => Brush("#B45309"), - ToastNotificationType.General => Brush("#334155"), - _ => Brush("#334155") - }; - } - } - } - - public IBrush ToastBorderBrush - { - get - { - if (ToastIsSolid) - { - return ToastType switch - { - ToastNotificationType.Primary => Brush("#0D5CA0"), - ToastNotificationType.Success => Brush("#166534"), - ToastNotificationType.Danger => Brush("#B91C1C"), - ToastNotificationType.Warning => Brush("#B45309"), - ToastNotificationType.General => Brush("#0F172A"), - _ => Brush("#0F172A") - }; - } - - if (IsDarkMode) - { - return ToastType switch - { - ToastNotificationType.Primary => Brush("#1E40AF"), - ToastNotificationType.Success => Brush("#166534"), - ToastNotificationType.Danger => Brush("#991B1B"), - ToastNotificationType.Warning => Brush("#92400E"), - ToastNotificationType.General => Brush("#3F3F46"), - _ => Brush("#3F3F46") - }; - } - else - { - return ToastType switch - { - ToastNotificationType.Primary => Brush("#BFDBFE"), - ToastNotificationType.Success => Brush("#BBF7D0"), - ToastNotificationType.Danger => Brush("#FECACA"), - ToastNotificationType.Warning => Brush("#FDE68A"), - ToastNotificationType.General => Brush("#CBD5E1"), - _ => Brush("#CBD5E1") - }; - } - } - } - - public IBrush ToastIconBrush => ToastIsSolid ? WhiteBrush : ToastForegroundBrush; - public IBrush ToastCloseBrush => ToastIsSolid ? WhiteBrush : ToastForegroundBrush; - - public HorizontalAlignment ToastHorizontalAlignment => ToastPosition switch - { - ToastPosition.TopLeft or ToastPosition.BottomLeft => HorizontalAlignment.Left, - ToastPosition.TopRight or ToastPosition.BottomRight => HorizontalAlignment.Right, - _ => HorizontalAlignment.Center - }; - - public VerticalAlignment ToastVerticalAlignment => ToastPosition switch - { - ToastPosition.TopLeft or ToastPosition.TopCenter or ToastPosition.TopRight => VerticalAlignment.Top, - _ => VerticalAlignment.Bottom - }; - - public Thickness ToastMargin => ToastPosition switch - { - ToastPosition.TopLeft => new Thickness(32, 54, 0, 0), - ToastPosition.TopCenter => new Thickness(0, 54, 0, 0), - ToastPosition.TopRight => new Thickness(0, 54, 32, 0), - ToastPosition.BottomLeft => new Thickness(32, 0, 0, 48), - ToastPosition.BottomCenter => new Thickness(0, 0, 0, 48), - ToastPosition.BottomRight => new Thickness(0, 0, 32, 48), - _ => new Thickness(0, 0, 0, 48) - }; - - private static readonly SolidColorBrush WhiteBrush = new(Color.Parse("#FFFFFF")); - private static SolidColorBrush Brush(string hex) => new(Color.Parse(hex)); - - public void RefreshToastVisuals() - { - OnPropertyChanged(nameof(ToastIsSolid)); - OnPropertyChanged(nameof(ToastBackgroundBrush)); - OnPropertyChanged(nameof(ToastForegroundBrush)); - OnPropertyChanged(nameof(ToastBorderBrush)); - OnPropertyChanged(nameof(ToastIconBrush)); - OnPropertyChanged(nameof(ToastCloseBrush)); - OnPropertyChanged(nameof(ToastHorizontalAlignment)); - OnPropertyChanged(nameof(ToastVerticalAlignment)); - OnPropertyChanged(nameof(ToastMargin)); - } - - // Acrobat Suite Dialogs State - [ObservableProperty] - private bool _isSignatureStudioOpen; - - [ObservableProperty] - private string _signatureSignerName = "Jane Doe"; - - [ObservableProperty] - private SignatureStyle _selectedSignatureStyle = SignatureStyle.CursiveElegance; - - [ObservableProperty] - private bool _isSecurityDialogOpen; - - [ObservableProperty] - private PdfSecuritySettings _securitySettings = new(); - - [ObservableProperty] - private bool _isPreflightDialogOpen; - - [ObservableProperty] - private DocumentAuditReport? _activeAuditReport; - - [ObservableProperty] - private bool _isAuditRunning; - - [ObservableProperty] - private bool _isHeaderFooterDialogOpen; - - [ObservableProperty] - private string _headerLeftText = ""; - - [ObservableProperty] - private string _headerCenterText = ""; - - [ObservableProperty] - private string _headerRightText = ""; - - [ObservableProperty] - private string _footerLeftText = "CONFIDENTIAL & PROPRIETARY"; - - [ObservableProperty] - private string _footerCenterText = ""; - - [ObservableProperty] - private string _footerRightText = "Page {P} of {N}"; - - [ObservableProperty] - private bool _isWatermarkManagerOpen; - - [ObservableProperty] - private string _watermarkPresetText = "CONFIDENTIAL"; - - [ObservableProperty] - private string _watermarkColorHex = "#DC2626"; - - [ObservableProperty] - private double _watermarkOpacity = 0.15; - - [ObservableProperty] - private double _watermarkAngle = -35; - - [ObservableProperty] - private bool _isSearchRedactDialogOpen; - - [ObservableProperty] - private string _searchRedactQuery = ""; - - [ObservableProperty] - private string _selectedExemptionCode = "[REDACTED - (b)(4) PRIVILEGED]"; - - [ObservableProperty] - private bool _isCustomStampDialogOpen; - - [ObservableProperty] - private string _customStampText = "CERTIFIED TRUE COPY"; - - [ObservableProperty] - private string _customStampColorHex = "#0F6CBD"; - - // Bates Numbering Studio - [ObservableProperty] - private bool _isBatesNumberingDialogOpen; - - [ObservableProperty] - private string _batesPrefix = "CONF-BATES-"; - - [ObservableProperty] - private string _batesSuffix = ""; - - [ObservableProperty] - private int _batesStartingNumber = 1; - - [ObservableProperty] - private int _batesNumberOfDigits = 6; - - [ObservableProperty] - private BatesPosition _batesPosition = BatesPosition.BottomLeft; - - [ObservableProperty] - private string _batesFontColorHex = "#0F172A"; - - [ObservableProperty] - private double _batesFontSize = 9.0; - - [ObservableProperty] - private bool _isApplyingBatesNumbers; - - [ObservableProperty] - private double _batesProgressPercentage; - - // Organize Pages: Split & Extract Studio - [ObservableProperty] - private bool _isSplitExtractDialogOpen; - - [ObservableProperty] - private SplitExtractMode _splitExtractMode = SplitExtractMode.SplitEveryNPages; - - [ObservableProperty] - private int _splitPageInterval = 1; - - [ObservableProperty] - private string _splitPageRanges = "1-2"; - - // Document Comparison Diff Studio - [ObservableProperty] - private bool _isCompareDialogOpen; - - [ObservableProperty] - private DocumentComparisonReport? _activeComparisonReport; - - [ObservableProperty] - private bool _isComparing; - - // Math & Scientific Equation Studio - [ObservableProperty] - private bool _isMathStudioOpen; - - [ObservableProperty] - private string _mathStudioFormula = @"\int_{-\infty}^{\infty} e^{-x^2} \, dx = \sqrt{\pi}"; - - [ObservableProperty] - private string _mathStudioPresetName = "Gaussian Integral"; - - [ObservableProperty] - private string _mathStudioEquationNumber = "(1)"; - - [ObservableProperty] - private bool _mathStudioShowNumber = false; - - [ObservableProperty] - private MathCategory _mathStudioCategory = MathCategory.Calculus; - - [ObservableProperty] - private string _mathStudioSvgPreview = ""; - - [ObservableProperty] - private MathElementViewModel? _editingMathElement; - - partial void OnMathStudioFormulaChanged(string value) => UpdateMathStudioPreview(); - partial void OnMathStudioShowNumberChanged(bool value) => UpdateMathStudioPreview(); - partial void OnMathStudioEquationNumberChanged(string value) => UpdateMathStudioPreview(); - - public void UpdateMathStudioPreview() - { - var options = new Services.MathEngine.MathRenderOptions( - FontSize: 18, - TextColorHex: "#0F172A", - ShowEquationNumber: MathStudioShowNumber, - EquationNumber: MathStudioEquationNumber, - TargetWidth: 460, - TargetHeight: 80 - ); - var result = Services.MathEngine.MathLayoutEngine.RenderToSvg(MathStudioFormula, options); - MathStudioSvgPreview = result.SvgXml; - } - - // In-Canvas Interactive Find & Replace - [ObservableProperty] - private bool _isFindReplaceOpen; - - [ObservableProperty] - private string _findQuery = ""; - - [ObservableProperty] - private string _replaceQuery = ""; - - [ObservableProperty] - private bool _findMatchCase; - - [ObservableProperty] - private int _findMatchesCount; - - // Canvas Rulers & Measure Tool - [ObservableProperty] - private bool _showRulers = true; - - [ObservableProperty] - private RulerUnit _rulerUnit = RulerUnit.Points; - - [ObservableProperty] - private double _cursorCanvasX; - - [ObservableProperty] - private double _cursorCanvasY; - - // Presentation / Read Mode & Theme - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(IsLeftSidebarResizable))] - private bool _isPresentationMode; - - [ObservableProperty] - private bool _isDarkMode; - - // Collections - public ObservableCollection Pages { get; } = new(); - public ObservableCollection OutlineItems { get; } = new(); - public ObservableCollection CommentItems { get; } = new(); - - // Child Subsystems - public InspectorViewModel Inspector { get; } - public UndoRedoService UndoRedo { get; } = new(); - public static IStorageProvider? StorageProvider { get; set; } - - // Calculated Properties - public int CurrentPageNumber => CurrentPage != null ? Pages.IndexOf(CurrentPage) + 1 : 1; - public int TotalPagesCount => Pages.Count; - public string PageDimensionsDisplay => CurrentPage != null ? $"{CurrentPage.Width:F0} × {CurrentPage.Height:F0} pt" : "800 × 1131 pt"; - public string SecurityStatusDisplay => SecuritySettings.IsPasswordProtected ? "Protected (Password Required)" : "Standard (No Security)"; - - // --- CONSTRUCTORS --- - - public MainViewModel() : this( - new PdfExportService(), - new TemplateService(), - new ProjectPersistenceService(), - new DocumentAuditService(), - new SignatureService(), - new SmartPlacementService(), - new RecentDocumentsService(), - new PageOrganizerService(), - null, - null, - new ThemeService(), - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - new UiSettingsService()) - { - } - - private readonly IThemeService? _themeService; - private readonly IUiSettingsService? _uiSettingsService; - private readonly PluginHost? _pluginHost; - private readonly PdfEditorApp.Core.Plugins.Descriptors.ICommandPaletteRegistry? _commandPaletteRegistry; - private readonly PdfEditorApp.Core.Plugins.Descriptors.IStatusBarRegistry? _statusBarRegistry; - - public ObservableCollection LeftStatusBarWidgets { get; } = new(); - public ObservableCollection RightStatusBarWidgets { get; } = new(); - - public PluginHost? PluginHost { get; set; } - - public MainViewModel( - IPdfExportService exportService, - ITemplateService templateService, - IProjectPersistenceService persistenceService, - IDocumentAuditService? auditService = null, - ISignatureService? signatureService = null, - ISmartPlacementService? placementService = null, - IRecentDocumentsService? recentService = null, - IPageOrganizerService? pageOrganizerService = null, - IPdfDocumentOperationsService? pdfOperationsService = null, - IPdfToolRegistry? toolRegistry = null, - IThemeService? themeService = null, - IPdfToolViewModelFactory? toolViewModelFactory = null, - IPdfWorkflowEngine? workflowEngine = null, - IDataSourceService? dataSourceService = null, - IDataBindingService? dataBindingService = null, - IDataMergeEngine? dataMergeEngine = null, - IBatchPdfGenerator? batchPdfGenerator = null, - PdfToolRunnerViewModel? toolRunner = null, - WorkflowBuilderViewModel? workflowBuilder = null, - DataStudioViewModel? dataStudio = null, - BatchGenerationViewModel? batchGeneration = null, - HomeViewModel? homeViewModel = null, - PdfViewerViewModel? pdfViewer = null, - InspectorViewModel? inspector = null, - IUiSettingsService? uiSettingsService = null, - PluginHost? pluginHost = null, - ICanvasElementService? elementService = null, - IRibbonRegistry? ribbonRegistry = null, - PdfEditorApp.Core.Plugins.Descriptors.ICommandPaletteRegistry? commandPaletteRegistry = null, - PdfEditorApp.Core.Plugins.Descriptors.IStatusBarRegistry? statusBarRegistry = null, - PdfEditorApp.Core.Plugins.Descriptors.ISidebarRegistry? sidebarRegistry = null, - PdfEditorApp.Core.Plugins.Descriptors.IDialogRegistry? dialogRegistry = null, - PdfEditorApp.Core.Plugins.Descriptors.INavigationRegistry? navigationRegistry = null, - PdfEditorApp.Core.Plugins.Descriptors.IOverlayRegistry? overlayRegistry = null) - { - _exportService = exportService; - _templateService = templateService; - _persistenceService = persistenceService; - _auditService = auditService ?? new DocumentAuditService(); - _signatureService = signatureService ?? new SignatureService(); - _placementService = placementService ?? new SmartPlacementService(); - _recentService = recentService ?? new RecentDocumentsService(); - _pageOrganizerService = pageOrganizerService ?? new PageOrganizerService(); - _themeService = themeService; - _toolRegistry = toolRegistry ?? new PdfToolRegistry(); - _uiSettingsService = uiSettingsService ?? new UiSettingsService(); - _pluginHost = pluginHost; - PluginHost = pluginHost; - _elementService = elementService ?? PageViewModel.DefaultElementService; - _ribbonRegistry = ribbonRegistry ?? new RibbonRegistry(); - _ribbonRegistry.RegistryChanged += RefreshPluginRibbonActions; - RefreshPluginRibbonActions(); - - _commandPaletteRegistry = commandPaletteRegistry; - _statusBarRegistry = statusBarRegistry; - _sidebarRegistry = sidebarRegistry; - _dialogRegistry = dialogRegistry; - _overlayRegistry = overlayRegistry; - - if (_overlayRegistry != null) - { - _overlayRegistry.ActiveOverlaysChanged += () => OnPropertyChanged(nameof(ActiveOverlays)); - } - - if (_statusBarRegistry != null) - { - _statusBarRegistry.RegistryChanged += RefreshStatusBarWidgets; - RefreshStatusBarWidgets(); - } - - if (_sidebarRegistry != null) - { - _sidebarRegistry.RegistryChanged += RefreshSidebarTabs; - RefreshSidebarTabs(); - } - - - if (_uiSettingsService != null) - { - var s = _uiSettingsService.Settings; - ToastPosition = s.ToastPosition; - ToastStyleVariant = s.ToastStyleVariant; - ToastShowCloseButton = s.ToastShowCloseButton; - _uiSettingsService.SettingsChanged += (newSettings) => - { - ToastPosition = newSettings.ToastPosition; - ToastStyleVariant = newSettings.ToastStyleVariant; - ToastShowCloseButton = newSettings.ToastShowCloseButton; - RefreshToastVisuals(); - }; - } - - if (_themeService != null) - { - IsDarkMode = _themeService.IsDarkMode; - _themeService.ThemeChanged += (mode) => - { - IsDarkMode = _themeService.IsDarkMode; - if (Home != null) Home.IsDarkMode = IsDarkMode; - RefreshToastVisuals(); - }; - } - - var effectiveWorkflowEngine = workflowEngine ?? (pdfOperationsService?.WorkflowEngine) ?? new PdfWorkflowEngine(); - _pdfOperationsService = pdfOperationsService ?? new PdfDocumentOperationsService( - _toolRegistry, - new PdfPageService(), - new PdfOptimizationService(), - new PdfSecurityService(), - new PdfConversionService(), - new PdfOcrService(), - new PdfFormService(), - new AiDocumentService(), - new DocumentTranslationService(), - effectiveWorkflowEngine); - - var effectiveToolFactory = toolViewModelFactory ?? new PdfToolViewModelFactory(_pdfOperationsService, _toolRegistry); - - ToolRunner = toolRunner ?? new PdfToolRunnerViewModel(_pdfOperationsService); - - WorkflowBuilder = workflowBuilder ?? new WorkflowBuilderViewModel(effectiveWorkflowEngine, _toolRegistry); - - var effectiveDataSource = dataSourceService ?? new DataSourceService(); - var effectiveDataBinding = dataBindingService ?? new DataBindingService(); - var effectiveMerge = dataMergeEngine ?? new DataMergeEngine(); - var effectiveBatch = batchPdfGenerator ?? new BatchPdfGeneratorService(effectiveMerge, _exportService); - - DataStudio = dataStudio ?? new DataStudioViewModel(effectiveDataSource, effectiveDataBinding); - DataStudio.UndoRedo = UndoRedo; - DataStudio.OnElementCreated += (el, desc) => AddElementWithUndo(el, desc); - - BatchGeneration = batchGeneration ?? new BatchGenerationViewModel(effectiveDataSource, effectiveMerge, effectiveBatch, _templateService); - DataStudio.OpenBatchMergeRequested += (matrix) => - { - BatchGeneration.StorageProvider = StorageProvider; - var doc = (IsEditorVisible && Pages.Count > 0) ? ToDocumentModel() : _templateService.CreateEmployeePayslipTemplate(); - BatchGeneration.OpenWithDocument(doc, matrix); - }; - - Inspector = inspector ?? new InspectorViewModel(); - Inspector.UndoRedo = UndoRedo; - Inspector.DataStudio = DataStudio; - - PdfViewer = pdfViewer ?? new PdfViewerViewModel(); - FryPdfViewer = new FryPdfViewer.FryPdfViewerViewModel(_persistenceService, _exportService); - if (_themeService != null) - { - PdfViewer.ReadingTheme = _themeService.ReadingTheme; - FryPdfViewer.ReadingTheme = _themeService.ReadingTheme; - _themeService.ReadingThemeChanged += (rt) => - { - if (PdfViewer.ReadingTheme != rt) - { - PdfViewer.ReadingTheme = rt; - } - if (FryPdfViewer.ReadingTheme != rt) - { - FryPdfViewer.ReadingTheme = rt; - } - }; - } - - var aiService = new Services.AI.AiService(); - var studioAgent = new Services.AI.PdfStudioAgentService(aiService, UndoRedo); - AiAssistant = new AiAssistantViewModel(studioAgent, _uiSettingsService ?? new UiSettingsService(), aiService) - { - GetCurrentPage = () => CurrentPage, - GetSelectedElement = () => CurrentPage?.SelectedElement ?? Inspector.SelectedElement, - UndoRedo = UndoRedo, - RequestOpenSettings = () => NavigateToSettingsCommand.Execute(null), - RequestReturnToThumbnails = () => SelectSidebarTab(SidebarTabKind.Thumbnails) - }; - - // Set up Home page - Home = homeViewModel ?? new HomeViewModel(_recentService, _templateService, _persistenceService, _toolRegistry, ToolRunner, effectiveToolFactory, _themeService, _uiSettingsService, navigationRegistry, _pluginHost?.Context); - - UndoRedo.StateChanged += (s, e) => - { - OnPropertyChanged(nameof(CanUndo)); - OnPropertyChanged(nameof(CanRedo)); - UndoCommand.NotifyCanExecuteChanged(); - RedoCommand.NotifyCanExecuteChanged(); - }; - - RegisterMessengerHandlers(); - - RefreshToastVisuals(); - - // Synchronize inspector when selection changes - Inspector.PropertyChanged += (s, e) => - { - if (e.PropertyName == nameof(Inspector.SelectedElement)) - { - OnPropertyChanged(nameof(CurrentPage)); - } - }; - - // Update window title dynamically when Home state or PDF Viewer title changes - Home.PropertyChanged += (s, e) => - { - if (e.PropertyName is nameof(Home.IsToolPageActive) or nameof(Home.ActiveToolViewModel) or nameof(Home.SelectedNavSection)) - { - OnPropertyChanged(nameof(WindowTitle)); - } - }; - - PdfViewer.PropertyChanged += (s, e) => - { - if (e.PropertyName == nameof(PdfViewer.DocumentTitle)) - { - OnPropertyChanged(nameof(WindowTitle)); - } - }; - - FryPdfViewer.PropertyChanged += (s, e) => - { - if (e.PropertyName == nameof(FryPdfViewer.DocumentTitle)) - { - OnPropertyChanged(nameof(WindowTitle)); - } - else if (e.PropertyName == nameof(FryPdfViewer.IsPresentationMode)) - { - MainWindowState = FryPdfViewer.IsPresentationMode ? WindowState.FullScreen : WindowState.Normal; - } - }; - - // Initialize quick command palette indexing - InitCommandPalette(); - - // Initialize default document model - var defaultDoc = _templateService.CreateAnnualReportTemplate(); - LoadFromDocumentModel(defaultDoc); - } - - private void RegisterMessengerHandlers() - { - WeakReferenceMessenger.Default.Register(this, (r, m) => r.ShowToast(m.Message, m.Type, m.ActionLabel)); - WeakReferenceMessenger.Default.Register(this, (r, m) => r.NavigateToHome()); - WeakReferenceMessenger.Default.Register(this, (r, m) => r.OpenEditorWithFile(m.FilePath)); - WeakReferenceMessenger.Default.Register(this, (r, m) => r.OpenInViewer(m.FilePath)); - WeakReferenceMessenger.Default.Register(this, (r, m) => r.OpenInFryPdfViewer(m.FilePath)); - WeakReferenceMessenger.Default.Register(this, (r, m) => r.OpenInteractiveDeckTemplate()); - WeakReferenceMessenger.Default.Register(this, (r, m) => r.OpenToolWithInitialFile(m.ToolId, m.FilePath)); - WeakReferenceMessenger.Default.Register(this, (r, m) => - { - if (r._themeService != null && r._themeService.ReadingTheme != m.Theme) - { - r._themeService.SetReadingTheme(m.Theme); - } - }); - WeakReferenceMessenger.Default.Register(this, (r, m) => - { - if (string.Equals(r.CurrentFilePath, m.OldPath, StringComparison.OrdinalIgnoreCase)) - { - r.CurrentFilePath = m.NewPath; - r.DocumentTitle = Path.GetFileName(m.NewPath); - } - if (string.Equals(r.PdfViewer.CurrentFilePath, m.OldPath, StringComparison.OrdinalIgnoreCase)) - { - r.PdfViewer.CurrentFilePath = m.NewPath; - r.PdfViewer.DocumentTitle = Path.GetFileName(m.NewPath); - } - }); - WeakReferenceMessenger.Default.Register(this, (r, m) => - { - if (string.Equals(r.CurrentFilePath, m.DeletedPath, StringComparison.OrdinalIgnoreCase)) - { - r.CurrentFilePath = ""; - r.DocumentTitle = "Untitled.pdf"; - r.IsEditorVisible = false; - r.IsHomePageVisible = true; - } - if (string.Equals(r.PdfViewer.CurrentFilePath, m.DeletedPath, StringComparison.OrdinalIgnoreCase)) - { - r.PdfViewer.CurrentFilePath = ""; - r.IsPdfViewerVisible = false; - r.IsHomePageVisible = true; - } - }); - WeakReferenceMessenger.Default.Register(this, (r, m) => r.Home.PromptRename(m.FilePath)); - WeakReferenceMessenger.Default.Register(this, (r, m) => r.Home.PromptDelete(m.FilePath)); - WeakReferenceMessenger.Default.Register(this, (r, m) => r.OpenEditorWithTemplate(m.TemplateName)); - WeakReferenceMessenger.Default.Register(this, (r, m) => _ = r.OpenProjectAndEnterEditorAsync()); - WeakReferenceMessenger.Default.Register(this, (r, m) => r.OpenWorkflowStudio()); - WeakReferenceMessenger.Default.Register(this, (r, m) => r.OpenBatchGeneration()); - WeakReferenceMessenger.Default.Register(this, (r, m) => _ = r.OpenPdfToReadWithPickerAsync()); - } - - [RelayCommand] - public void OpenTool(PdfToolId toolId) - { - IsHomePageVisible = true; - IsEditorVisible = false; - IsPdfViewerVisible = false; - Home.OpenToolPage(toolId); - } - - public void OpenToolWithInitialFile(PdfToolId toolId, string initialFilePath) - { - IsHomePageVisible = true; - IsEditorVisible = false; - IsPdfViewerVisible = false; - Home.OpenToolPage(toolId, initialFilePath); - } - - [RelayCommand] - public void OpenWorkflowStudio() - { - WorkflowBuilder.StorageProvider = StorageProvider; - WorkflowBuilder.Open(); - } - - [RelayCommand] - public void OpenAiAssistant() - { - if (IsLeftSidebarCollapsed) - { - IsLeftSidebarCollapsed = false; - } - if (LeftSidebarGridLength.IsAbsolute && LeftSidebarGridLength.Value < 340) - { - LeftSidebarGridLength = new GridLength(340, GridUnitType.Pixel); - } - ActiveDynamicSidebarTabId = null; - ActiveDynamicSidebarView = null; - ActiveSidebarTab = SidebarTabKind.AiAssistant; - - var target = CurrentPage?.SelectedElement ?? Inspector.SelectedElement; - if (target != null) - { - AiAssistant.OpenForElement(target); - } - else - { - AiAssistant.Open(); - } - } - - [RelayCommand] - public void AskAiToModify(ElementViewModelBase? element = null) - { - if (IsLeftSidebarCollapsed) - { - IsLeftSidebarCollapsed = false; - } - if (LeftSidebarGridLength.IsAbsolute && LeftSidebarGridLength.Value < 340) - { - LeftSidebarGridLength = new GridLength(340, GridUnitType.Pixel); - } - ActiveDynamicSidebarTabId = null; - ActiveDynamicSidebarView = null; - ActiveSidebarTab = SidebarTabKind.AiAssistant; - - var target = element ?? CurrentPage?.SelectedElement ?? Inspector.SelectedElement; - if (target != null) - { - AiAssistant.OpenForElement(target); - } - else - { - AiAssistant.Open(); - } - } - - [ObservableProperty] - private (double X, double Y)? _lastCanvasClickPoint; - - [RelayCommand] - public void AskAiAtPoint(object? param = null) - { - if (IsLeftSidebarCollapsed) - { - IsLeftSidebarCollapsed = false; - } - if (LeftSidebarGridLength.IsAbsolute && LeftSidebarGridLength.Value < 340) - { - LeftSidebarGridLength = new GridLength(340, GridUnitType.Pixel); - } - ActiveDynamicSidebarTabId = null; - ActiveDynamicSidebarView = null; - ActiveSidebarTab = SidebarTabKind.AiAssistant; - - double targetX = LastCanvasClickPoint?.X ?? 100; - double targetY = LastCanvasClickPoint?.Y ?? 150; - - if (param is (double px, double py)) - { - targetX = px; - targetY = py; - } - - AiAssistant.TargetPointOnPage(targetX, targetY, CurrentPage); - } - - [RelayCommand] - public void SelectEntirePageForAi() - { - if (CurrentPage != null) - { - CurrentPage.ClearSelection(); - } - if (IsLeftSidebarCollapsed) - { - IsLeftSidebarCollapsed = false; - } - if (LeftSidebarGridLength.IsAbsolute && LeftSidebarGridLength.Value < 340) - { - LeftSidebarGridLength = new GridLength(340, GridUnitType.Pixel); - } - ActiveDynamicSidebarTabId = null; - ActiveDynamicSidebarView = null; - ActiveSidebarTab = SidebarTabKind.AiAssistant; - - AiAssistant.TargetEntirePage(CurrentPage); - } - - [RelayCommand] - public void ToggleTheme() - { - if (_themeService != null) - { - _themeService.ToggleTheme(); - IsDarkMode = _themeService.IsDarkMode; - Home.IsDarkMode = IsDarkMode; - ShowToast(IsDarkMode ? "Switched to Dark Studio Theme" : "Switched to Light Studio Theme", IsDarkMode ? "WeatherNight" : "WeatherSunny"); - } - else - { - IsDarkMode = !IsDarkMode; - Home.IsDarkMode = IsDarkMode; - } - } - - [RelayCommand] - public void SetLightTheme() - { - _themeService?.SetTheme(AppThemeMode.Light); - IsDarkMode = false; - Home.IsDarkMode = false; - ShowToast("Switched to Light Studio Theme", "WeatherSunny"); - } - - [RelayCommand] - public void SetDarkTheme() - { - _themeService?.SetTheme(AppThemeMode.Dark); - IsDarkMode = true; - Home.IsDarkMode = true; - ShowToast("Switched to Dark Studio Theme", "WeatherNight"); - } - - [RelayCommand] - public void SetSystemTheme() - { - _themeService?.SetTheme(AppThemeMode.System); - IsDarkMode = _themeService?.IsDarkMode ?? false; - Home.IsDarkMode = IsDarkMode; - ShowToast("Using System Theme Preference", "Laptop"); - } - - // --- HOME / EDITOR / VIEWER NAVIGATION --- - - /// Switches to the editor and loads the requested template. - public void OpenEditorWithTemplate(string? templateName) - { - IsHomePageVisible = false; - IsPdfViewerVisible = false; - IsEditorVisible = true; - - var model = string.IsNullOrWhiteSpace(templateName) - ? _templateService.CreateBlankDocument() - : _templateService.CreateTemplate(templateName); - - LoadFromDocumentModel(model); - ShowToast($"Created new document from {templateName ?? "Blank"} template", "FilePlusOutline"); - } - - /// Switches to the editor and loads a project from a file path. - public void OpenEditorWithFile(string path) - { - _ = OpenEditorWithFileAsync(path); - } - - /// Asynchronously switches to the editor and loads a project from a file path. - public async Task OpenEditorWithFileAsync(string path) - { - // Navigate to the (still-empty) editor shell immediately so the user sees the app - // respond right away, then populate it — mirrors OpenInViewerAsync's approach. - IsHomePageVisible = false; - IsPdfViewerVisible = false; - IsFryPdfViewerVisible = false; - IsEditorVisible = true; - IsBusy = true; - UpdateStatus($"Opening {Path.GetFileName(path)}..."); - - try - { - var model = await _persistenceService.LoadProjectAsync(path); - if (model != null) - { - await LoadFromDocumentModelAsync(model); - CurrentFilePath = path; - _recentService.Add(new RecentDocumentItem - { - FilePath = path, - Title = model.Title, - LastOpened = DateTime.UtcNow - }); - Home.RefreshRecent(); - ShowToast($"Opened: {Path.GetFileName(path)}", "FolderOpenOutline"); - } - else - { - IsBusy = false; - IsEditorVisible = false; - IsHomePageVisible = true; - ShowToast("Could not open file: unrecognized or corrupted document.", "AlertCircleOutline"); - } - } - catch (Exception ex) - { - IsBusy = false; - IsEditorVisible = false; - IsHomePageVisible = true; - ShowToast($"Could not open file: {ex.Message}", "AlertCircleOutline"); - } - } - - /// Opens any PDF in the dedicated PDF Viewer subsystem. - [RelayCommand] - public void OpenPdfReader() - { - _ = OpenPdfToReadWithPickerAsync(); - } - - /// Opens any PDF in the dedicated PDF Viewer subsystem. - public void OpenInViewer(string path) - { - if (string.IsNullOrEmpty(path)) - { - _ = OpenPdfToReadWithPickerAsync(); - } - else - { - _ = OpenInViewerAsync(path); - } - } - - /// Prompts user to select a PDF file and opens it in PDF Reader mode. - public async Task OpenPdfToReadWithPickerAsync() - { - try - { - if (StorageProvider != null) - { - var files = await StorageProvider.OpenFilePickerAsync(new FilePickerOpenOptions - { - Title = "Open PDF Document to Read (PDF Reader Mode)", - AllowMultiple = false, - FileTypeFilter = new[] - { - new FilePickerFileType("PDF Documents (*.pdf)") - { - Patterns = new[] { "*.pdf" } - } - } - }); - - if (files.Count > 0) - { - string chosenPath = files[0].Path.LocalPath; - await OpenInViewerAsync(chosenPath); - } - } - } - catch (Exception ex) - { - ShowToast($"Could not open PDF: {ex.Message}", "AlertCircleOutline"); - } - } - - /// Asynchronously opens a PDF document in the viewer. - public async Task OpenInViewerAsync(string path) - { - try - { - // Immediately transition to PDF Viewer with zero delay - DocumentTitle = Path.GetFileName(path); - IsHomePageVisible = false; - IsEditorVisible = false; - IsFryPdfViewerVisible = false; - IsPdfViewerVisible = true; - ShowToast($"Opening: {Path.GetFileName(path)}", "FilePdfBox"); - - PdfViewer.StorageProvider = StorageProvider; - await PdfViewer.LoadDocumentAsync(path); - - _recentService.Add(new RecentDocumentItem - { - FilePath = path, - Title = Path.GetFileName(path), - LastOpened = DateTime.UtcNow - }); - Home.RefreshRecent(); - } - catch (Exception ex) - { - ShowToast($"Could not open in Viewer: {ex.Message}", "AlertCircleOutline"); - } - } - - /// Asynchronously opens a .frypdf document in the interactive presentation reader. - public async Task OpenInFryPdfViewerAsync(string path) - { - try - { - DocumentTitle = Path.GetFileName(path); - IsHomePageVisible = false; - IsEditorVisible = false; - IsPdfViewerVisible = false; - IsFryPdfViewerVisible = true; - ShowToast($"Reading interactive: {Path.GetFileName(path)}", "BookOpenPageVariantOutline"); - - FryPdfViewer.StorageProvider = StorageProvider; - await FryPdfViewer.LoadDocumentAsync(path); - - _recentService.Add(new RecentDocumentItem - { - FilePath = path, - Title = Path.GetFileName(path), - LastOpened = DateTime.UtcNow - }); - Home.RefreshRecent(); - } - catch (Exception ex) - { - ShowToast($"Could not open in Interactive Viewer: {ex.Message}", "AlertCircleOutline"); - } - } - - /// Opens a .frypdf document in the interactive presentation reader. - public void OpenInFryPdfViewer(string path) - { - if (string.IsNullOrEmpty(path)) - { - _ = OpenFryPdfToReadWithPickerAsync(); - } - else - { - _ = OpenInFryPdfViewerAsync(path); - } - } - - /// Prompts user to select a .frypdf file and opens it in Interactive Reader mode. - public async Task OpenFryPdfToReadWithPickerAsync() - { - try - { - if (StorageProvider != null) - { - var files = await StorageProvider.OpenFilePickerAsync(new FilePickerOpenOptions - { - Title = "Open FryPDF Project to Read (Interactive Reader Mode)", - AllowMultiple = false, - FileTypeFilter = new[] - { - new FilePickerFileType("FryPDF Projects (*.frypdf, *.json)") - { - Patterns = new[] { "*.frypdf", "*.json" } - } - } - }); - - if (files.Count > 0) - { - string chosenPath = files[0].Path.LocalPath; - await OpenInFryPdfViewerAsync(chosenPath); - } - } - } - catch (Exception ex) - { - ShowToast($"Could not open project: {ex.Message}", "AlertCircleOutline"); - } - } - - /// Switches the currently active editor document into the Interactive Reader. - [RelayCommand] - public void OpenCurrentInInteractiveReader() - { - var model = ToDocumentModel(); - IsHomePageVisible = false; - IsEditorVisible = false; - IsPdfViewerVisible = false; - IsFryPdfViewerVisible = true; - FryPdfViewer.StorageProvider = StorageProvider; - FryPdfViewer.LoadFromModel(model, CurrentFilePath); - } - - /// Launches the showcase landscape interactive presentation deck directly in the Interactive Reader. - [RelayCommand] - public void OpenInteractiveDeckTemplate() - { - var model = _templateService.CreateInteractiveExecutiveBriefTemplate(); - DocumentTitle = "QuantumScale_Global_Executive_Strategic_Brief_2026.frypdf"; - IsHomePageVisible = false; - IsEditorVisible = false; - IsPdfViewerVisible = false; - IsFryPdfViewerVisible = true; - FryPdfViewer.StorageProvider = StorageProvider; - FryPdfViewer.LoadFromModel(model, "QuantumScale_Global_Executive_Strategic_Brief_2026.frypdf"); - ShowToast("Loaded QuantumScale Interactive Landscape Presentation Deck", "PresentationPlay"); - } - - private async Task OpenProjectAndEnterEditorAsync() - { - try - { - if (StorageProvider != null) - { - var files = await StorageProvider.OpenFilePickerAsync(new FilePickerOpenOptions - { - Title = "Open PDF Document or FryPDF Project", - AllowMultiple = false, - FileTypeFilter = new[] - { - new FilePickerFileType("All Supported Documents (*.pdf, *.frypdf, *.pdfproj, *.json)") - { - Patterns = new[] { "*.pdf", "*.frypdf", "*.pdfproj", "*.json" } - }, - new FilePickerFileType("PDF Documents (*.pdf)") - { - Patterns = new[] { "*.pdf" } - }, - new FilePickerFileType("FryPDF Projects (*.frypdf, *.pdfproj, *.json)") - { - Patterns = new[] { "*.frypdf", "*.pdfproj", "*.json" } - } - } - }); - - if (files.Count > 0) - { - string chosenPath = files[0].Path.LocalPath; - OpenEditorWithFile(chosenPath); - } - } - } - catch (Exception ex) - { - ShowToast($"Open error: {ex.Message}", "AlertCircleOutline"); - } - } - - /// Returns to the Home page from the editor or viewer. - [RelayCommand] - public void NavigateToHome() - { - Home.RefreshRecent(); - Home.BackToTools(); - Home.SelectedNavSection = HomeNavSection.Home; - IsEditorVisible = false; - IsPdfViewerVisible = false; - IsFryPdfViewerVisible = false; - IsHomePageVisible = true; - } - - public void OnElementSelectionChanged(ElementViewModelBase? selectedElement) - { - Inspector.UpdateSelection(selectedElement, CurrentPage); - if (ActiveSidebarTab == SidebarTabKind.AiAssistant) - { - AiAssistant.UpdateTargetElement(selectedElement); - } - } - - // --- TOAST HUD NOTIFICATION FEEDBACK --- - - [RelayCommand] - public void DismissToast() - { - _toastCts?.Cancel(); - IsToastVisible = false; - } - - public void ShowToast(string message, string? iconKind = null) - { - var inferred = InferToastType(message, iconKind); - ShowToast(message, inferred, iconKind); - } - - public void ShowToast(string message, ToastNotificationType type, string? iconKind = null, int? customDurationMs = null) - { - _toastCts?.Cancel(); - _toastCts = new CancellationTokenSource(); - var token = _toastCts.Token; - - ToastMessage = message; - ToastType = type; - ToastIcon = !string.IsNullOrWhiteSpace(iconKind) ? iconKind : GetDefaultIconForType(type); - RefreshToastVisuals(); - IsToastVisible = true; - UpdateStatus(message); - - int duration = customDurationMs ?? (_uiSettingsService?.Settings.ToastDurationMs ?? 3500); - if (duration > 0) - { - Task.Delay(duration, token).ContinueWith(t => - { - if (!t.IsCanceled) - { - Dispatcher.UIThread.Post(() => IsToastVisible = false); - } - }, TaskScheduler.Default); - } - } - - public static ToastNotificationType InferToastType(string message, string? iconKind) - { - if (string.IsNullOrWhiteSpace(message)) - return ToastNotificationType.General; - - var lowerMsg = message.ToLowerInvariant(); - var lowerIcon = iconKind?.ToLowerInvariant() ?? ""; - - if (lowerMsg.Contains("error") || lowerMsg.Contains("failed") || lowerMsg.Contains("could not") || - lowerMsg.Contains("corrupt") || lowerMsg.Contains("unrecognized") || lowerIcon.Contains("alertcircle") || lowerIcon.Contains("alertoctagon")) - { - return ToastNotificationType.Danger; - } - - if (lowerMsg.Contains("warning") || lowerMsg.Contains("caution") || lowerMsg.Contains("nothing to")) - { - return ToastNotificationType.Warning; - } - - if (lowerMsg.Contains("saved") || lowerMsg.Contains("success") || lowerMsg.Contains("copied") || - lowerMsg.Contains("pasted") || lowerMsg.Contains("done") || lowerMsg.Contains("applied") || - lowerMsg.Contains("created new document") || lowerIcon.Contains("check")) - { - return ToastNotificationType.Success; - } - - if (lowerMsg.Contains("open") || lowerMsg.Contains("zoom") || lowerMsg.Contains("fit to") || - lowerMsg.Contains("switched to") || lowerMsg.Contains("active tool") || lowerMsg.Contains("ribbon") || - lowerMsg.Contains("sidebar") || lowerMsg.Contains("inspector") || lowerMsg.Contains("undone") || lowerMsg.Contains("redone")) - { - return ToastNotificationType.Primary; - } - - return ToastNotificationType.General; - } - - public static string GetDefaultIconForType(ToastNotificationType type) => type switch - { - ToastNotificationType.Primary => "InformationOutline", - ToastNotificationType.Success => "CheckCircleOutline", - ToastNotificationType.Danger => "AlertOctagonOutline", - ToastNotificationType.Warning => "AlertOutline", - ToastNotificationType.General => "InformationOutline", - _ => "InformationOutline" - }; - - public void UpdateStatus(string message) - { - StatusMessage = message; - } - - // --- TAB & TOOL MODE SELECTION --- - - [RelayCommand] - public void SelectDynamicRibbonTab(string tabId) - { - ActiveDynamicRibbonTabId = tabId; - if (IsRibbonCollapsed) - { - IsRibbonCollapsed = false; - } - RefreshActiveRibbonGroups(); - } - - [RelayCommand] - public void SelectRibbonTab(RibbonTabKind tab) - { - ActiveDynamicRibbonTabId = null; - ActiveRibbonTab = tab; - if (IsRibbonCollapsed) - { - IsRibbonCollapsed = false; - } - RefreshActiveRibbonGroups(); - } - - public void RefreshActiveRibbonGroups() - { - Dispatcher.UIThread.Post(() => - { - DynamicGroupsForActiveTab.Clear(); - - string currentTabId = ActiveDynamicRibbonTabId ?? ActiveRibbonTab.ToString(); - - // 1. Get explicitly registered groups for this tab - var groups = _ribbonRegistry.GetGroupsForTab(currentTabId); - var seenActionIds = new HashSet(StringComparer.OrdinalIgnoreCase); - - foreach (var grp in groups) - { - var groupVm = new DynamicRibbonGroupViewModel - { - Id = grp.Id, - TabId = grp.TabId, - Title = grp.Title - }; - - var actions = _ribbonRegistry.GetActionsForGroup(currentTabId, grp.Id); - foreach (var act in actions) - { - groupVm.Actions.Add(act); - seenActionIds.Add(act.Id); - } - - if (groupVm.Actions.Count > 0) - { - DynamicGroupsForActiveTab.Add(groupVm); - } - } - - // 2. Any orphan actions for this tab that weren't assigned to an explicit group - var tabActions = _ribbonRegistry.GetActionsForTab(currentTabId); - var orphanActions = tabActions.Where(a => !seenActionIds.Contains(a.Id)).ToList(); - if (orphanActions.Count > 0) - { - var defaultGroup = new DynamicRibbonGroupViewModel - { - Id = "default.plugins", - TabId = currentTabId, - Title = "Extensions" - }; - foreach (var act in orphanActions) - { - defaultGroup.Actions.Add(act); - } - DynamicGroupsForActiveTab.Add(defaultGroup); - } - }); - } - - private void RefreshPluginRibbonActions() - { - Dispatcher.UIThread.Post(() => - { - PluginRibbonActions.Clear(); - foreach (var action in _ribbonRegistry.GetAllActions()) - { - PluginRibbonActions.Add(action); - } - - DynamicRibbonTabs.Clear(); - var allTabs = _ribbonRegistry.GetAllTabs(); - foreach (var tab in allTabs) - { - DynamicRibbonTabs.Add(new DynamicRibbonTabViewModel - { - Descriptor = tab, - IsActive = string.Equals(tab.Id, ActiveDynamicRibbonTabId, StringComparison.OrdinalIgnoreCase) - }); - } - - DynamicRibbonGroups.Clear(); - foreach (var group in _ribbonRegistry.GetGroupsForTab(ActiveDynamicRibbonTabId ?? ActiveRibbonTab.ToString())) - { - DynamicRibbonGroups.Add(group); - } - - if (ActiveDynamicRibbonTabId != null && !allTabs.Any(t => string.Equals(t.Id, ActiveDynamicRibbonTabId, StringComparison.OrdinalIgnoreCase))) - { - ActiveDynamicRibbonTabId = null; - ActiveRibbonTab = RibbonTabKind.Home; - } - - RefreshActiveRibbonGroups(); - }); - } - - private void RefreshSidebarTabs() - { - if (_sidebarRegistry == null) return; - Dispatcher.UIThread.Post(() => - { - DynamicSidebarTabs.Clear(); - var allTabs = _sidebarRegistry.GetAllTabs(); - foreach (var tab in allTabs) - { - DynamicSidebarTabs.Add(new DynamicSidebarTabViewModel - { - Descriptor = tab, - IsActive = string.Equals(tab.Id, ActiveDynamicSidebarTabId, StringComparison.OrdinalIgnoreCase) - }); - } - - if (ActiveDynamicSidebarTabId != null && !allTabs.Any(t => string.Equals(t.Id, ActiveDynamicSidebarTabId, StringComparison.OrdinalIgnoreCase))) - { - ActiveDynamicSidebarTabId = null; - ActiveDynamicSidebarView = null; - ActiveSidebarTab = SidebarTabKind.Thumbnails; - } - }); - } - - [RelayCommand] - public void OpenRegisteredDialog(string dialogId) - { - if (_dialogRegistry == null) return; - var desc = _dialogRegistry.GetDialog(dialogId); - if (desc == null) return; - - object? dialogView = null; - if (desc.ViewFactory != null) - { - try - { - dialogView = desc.ViewFactory(_pluginHost?.Context ?? (IServiceProvider)this); - } - catch { } - } - else if (desc.ViewType != null) - { - try - { - dialogView = Activator.CreateInstance(desc.ViewType); - } - catch { } - } - - if (dialogView != null) - { - ActiveDynamicDialog = dialogView; - IsDynamicDialogOpen = true; - } - } - - [RelayCommand] - public void CloseDynamicDialog() - { - IsDynamicDialogOpen = false; - ActiveDynamicDialog = null; - } - - [RelayCommand] - public void ToggleOverlay(string overlayId) - { - _overlayRegistry?.ToggleOverlay(overlayId); - } - - [RelayCommand] - public void ShowOverlay(string overlayId) - { - _overlayRegistry?.ShowOverlay(overlayId); - } - - [RelayCommand] - public void HideOverlay(string overlayId) - { - _overlayRegistry?.HideOverlay(overlayId); - } - - - private void RefreshStatusBarWidgets() - { - if (_statusBarRegistry == null) return; - Dispatcher.UIThread.Post(() => - { - LeftStatusBarWidgets.Clear(); - RightStatusBarWidgets.Clear(); - - var left = _statusBarRegistry.GetWidgets(PdfEditorApp.Core.Plugins.Descriptors.StatusBarAlignment.Left); - foreach (var w in left) - { - var item = w.Factory(_pluginHost?.Context ?? (IServiceProvider)this); - if (item is StatusBarWidgetViewModel vm) - { - LeftStatusBarWidgets.Add(vm); - } - else if (item != null) - { - LeftStatusBarWidgets.Add(new StatusBarWidgetViewModel - { - WidgetId = w.WidgetId, - ToolTip = w.ToolTip, - Content = item - }); - } - } - - var right = _statusBarRegistry.GetWidgets(PdfEditorApp.Core.Plugins.Descriptors.StatusBarAlignment.Right); - foreach (var w in right) - { - var item = w.Factory(_pluginHost?.Context ?? (IServiceProvider)this); - if (item is StatusBarWidgetViewModel vm) - { - RightStatusBarWidgets.Add(vm); - } - else if (item != null) - { - RightStatusBarWidgets.Add(new StatusBarWidgetViewModel - { - WidgetId = w.WidgetId, - ToolTip = w.ToolTip, - Content = item - }); - } - } - }); - } - - [RelayCommand] - public void ExecuteRibbonAction(RibbonActionDescriptor action) - { - if (action?.Action != null) - { - try - { - action.Action(_pluginHost?.Context ?? (IServiceProvider)this); - } - catch (Exception ex) - { - ShowToast($"Plugin action error: {ex.Message}", ToastNotificationType.Danger, "AlertCircleOutline"); - } - } - } - - [RelayCommand] - public void ToggleRibbonCollapse() - { - IsRibbonCollapsed = !IsRibbonCollapsed; - ShowToast(IsRibbonCollapsed ? "Ribbon Minimized (⌘F1 to expand)" : "Ribbon Expanded", IsRibbonCollapsed ? "ChevronDown" : "ChevronUp"); - } - - [RelayCommand] - public void ToggleLeftSidebar() - { - IsLeftSidebarCollapsed = !IsLeftSidebarCollapsed; - ShowToast(IsLeftSidebarCollapsed ? "Pages Sidebar Minimized (⌘B to expand)" : "Pages Sidebar Expanded", IsLeftSidebarCollapsed ? "DockLeft" : "FileDocumentMultipleOutline"); - } - - [RelayCommand] - public void ToggleInspectorCollapse() - { - IsInspectorCollapsed = !IsInspectorCollapsed; - ShowToast(IsInspectorCollapsed ? "Inspector Minimized (⌘⇧P to expand)" : "Properties Inspector Expanded", IsInspectorCollapsed ? "DockRight" : "TuneVariant"); - } - - [RelayCommand] - public void ExpandAllPanels() - { - IsRibbonCollapsed = false; - IsLeftSidebarCollapsed = false; - IsInspectorCollapsed = false; - ShowToast("All Workspace Panels Expanded", "ViewQuiltOutline"); - } - - [RelayCommand] - public void SetToolMode(string modeStr) - { - if (Enum.TryParse(modeStr, true, out var parsed)) - { - ActiveToolMode = parsed; - ShowToast($"Active Tool: {parsed}", "CursorDefaultOutline"); - } - } - - // --- UNDO / REDO & CLIPBOARD COMMANDS --- - - public bool CanUndo => UndoRedo.CanUndo; - public bool CanRedo => UndoRedo.CanRedo; - - [RelayCommand(CanExecute = nameof(CanUndo))] - public void Undo() - { - if (UndoRedo.CanUndo) - { - var desc = UndoRedo.Undo(); - ShowToast($"Undone: {desc ?? "Action"}", "Undo"); - } - else - { - ShowToast("Nothing to undo", "InformationOutline"); - } - } - - [RelayCommand(CanExecute = nameof(CanRedo))] - public void Redo() - { - if (UndoRedo.CanRedo) - { - var desc = UndoRedo.Redo(); - ShowToast($"Redone: {desc ?? "Action"}", "Redo"); - } - else - { - ShowToast("Nothing to redo", "InformationOutline"); - } - } - - [RelayCommand] - public void Copy() - { - if (CurrentPage == null) return; - if (CurrentPage.SelectedElements.Count > 0) - { - _clipboardElements = CurrentPage.SelectedElements.ToList(); - ShowToast(_clipboardElements.Count == 1 ? $"Copied: {_clipboardElements[0].DisplayName}" : $"Copied {_clipboardElements.Count} Elements", "ContentCopy"); - } - } - - [RelayCommand] - public void Cut() - { - if (CurrentPage == null || CurrentPage.SelectedElements.Count == 0) return; - _clipboardElements = CurrentPage.SelectedElements.ToList(); - var page = CurrentPage; - var targets = _clipboardElements.ToList(); - - foreach (var el in targets) page.RemoveElement(el); - Inspector.UpdateSelection(null, page); - - UndoRedo.RecordAction( - targets.Count == 1 ? $"Cut {targets[0].DisplayName}" : $"Cut {targets.Count} Elements", - () => { - foreach (var el in targets) page.AddElement(el); - page.SelectElements(targets); - Inspector.UpdateSelection(page.SelectedElement, page); - }, - () => { - foreach (var el in targets) page.RemoveElement(el); - Inspector.UpdateSelection(null, page); - } - ); - - ShowToast(targets.Count == 1 ? $"Cut: {targets[0].DisplayName}" : $"Cut {targets.Count} Elements", "ContentCut"); - } - - [RelayCommand] - public void Paste() - { - if (_clipboardElements.Count == 0 || CurrentPage == null) return; - var page = CurrentPage; - var newVms = new List(); - - if (_clipboardElements.Count == 1) - { - var el = _clipboardElements[0]; - var model = el.ToModel(); - var clone = model.Clone(); - clone.Id = Guid.NewGuid().ToString("N"); - - var (posX, posY) = _placementService.GetPlacementPosition(CurrentPage, clone.Width, clone.Height); - clone.X = posX; - clone.Y = posY; - - ElementViewModelBase newVm = _elementService.CreateViewModel(clone); - page.AddElement(newVm); - newVms.Add(newVm); - } - else - { - double minX = _clipboardElements.Min(e => e.X); - double minY = _clipboardElements.Min(e => e.Y); - double maxX = _clipboardElements.Max(e => e.X + e.Width); - double maxY = _clipboardElements.Max(e => e.Y + e.Height); - double groupW = maxX - minX; - double groupH = maxY - minY; - - var (targetX, targetY) = _placementService.GetPlacementPosition(CurrentPage, groupW, groupH); - double offsetX = targetX - minX; - double offsetY = targetY - minY; - - foreach (var el in _clipboardElements) - { - var model = el.ToModel(); - var clone = model.Clone(); - clone.Id = Guid.NewGuid().ToString("N"); - clone.X += offsetX; - clone.Y += offsetY; - - ElementViewModelBase newVm = _elementService.CreateViewModel(clone); - page.AddElement(newVm); - newVms.Add(newVm); - } - } - - page.SelectElements(newVms); - Inspector.UpdateSelection(page.SelectedElement, page); - - UndoRedo.RecordAction( - newVms.Count == 1 ? $"Paste {newVms[0].DisplayName}" : $"Paste {newVms.Count} Elements", - () => { - foreach (var el in newVms) page.RemoveElement(el); - Inspector.UpdateSelection(null, page); - }, - () => { - foreach (var el in newVms) page.AddElement(el); - page.SelectElements(newVms); - Inspector.UpdateSelection(page.SelectedElement, page); - } - ); - - ShowToast(newVms.Count == 1 ? $"Pasted: {newVms[0].DisplayName}" : $"Pasted {newVms.Count} Elements", "ContentPaste"); - } - - [RelayCommand] - public void Duplicate() - { - Inspector.DuplicateSelectedElementCommand.Execute(null); - } - - [RelayCommand] - public void SelectAll() - { - CurrentPage?.SelectAll(); - Inspector.UpdateSelection(CurrentPage?.SelectedElement, CurrentPage); - } - - // --- ZOOM COMMANDS --- - - [RelayCommand] - public void ZoomIn() - { - if (IsPdfViewerVisible && PdfViewer != null) - { - PdfViewer.ZoomIn(); - return; - } - ZoomLevel = Math.Clamp(Math.Round(ZoomLevel * 1.2, 2), 0.1, 5.0); - ShowToast($"Zoom: {(int)(ZoomLevel * 100)}%", "MagnifyPlusOutline"); - } - - [RelayCommand] - public void ZoomOut() - { - if (IsPdfViewerVisible && PdfViewer != null) - { - PdfViewer.ZoomOut(); - return; - } - ZoomLevel = Math.Clamp(Math.Round(ZoomLevel / 1.2, 2), 0.1, 5.0); - ShowToast($"Zoom: {(int)(ZoomLevel * 100)}%", "MagnifyMinusOutline"); - } - - [RelayCommand] - public void ResetZoom() - { - if (IsPdfViewerVisible && PdfViewer != null) - { - PdfViewer.ResetZoom(); - return; - } - ZoomLevel = 1.0; - ShowToast("Zoom Reset (100%)", "Magnify"); - } - - [RelayCommand] - public void FitToWidth() - { - if (IsPdfViewerVisible && PdfViewer != null) - { - PdfViewer.FitToWidth(); - return; - } - ZoomLevel = 1.15; - ShowToast("Fit to Width", "ArrowExpandHorizontal"); - } - - public void FitToWidthDynamic(double viewportWidth) - { - if (IsPdfViewerVisible && PdfViewer != null) - { - PdfViewer.FitToWidthDynamic(viewportWidth); - return; - } - if (CurrentPage != null && viewportWidth > 100) - { - ZoomLevel = Math.Clamp(Math.Round((viewportWidth - 64.0) / CurrentPage.Width, 2), 0.1, 5.0); - ShowToast($"Fit to Width ({(int)(ZoomLevel * 100)}%)", "ArrowExpandHorizontal"); - } - else - { - FitToWidth(); - } - } - - [RelayCommand] - public void FitToPage() - { - if (IsPdfViewerVisible && PdfViewer != null) - { - PdfViewer.FitToPage(); - return; - } - ZoomLevel = 0.85; - ShowToast("Fit to Page", "FitToPageOutline"); - } - - public void FitToPageDynamic(double viewportWidth, double viewportHeight) - { - if (IsPdfViewerVisible && PdfViewer != null) - { - PdfViewer.FitToPageDynamic(viewportWidth, viewportHeight); - return; - } - if (CurrentPage != null && viewportWidth > 100 && viewportHeight > 100) - { - double scaleX = (viewportWidth - 64.0) / CurrentPage.Width; - double scaleY = (viewportHeight - 64.0) / CurrentPage.Height; - ZoomLevel = Math.Clamp(Math.Round(Math.Min(scaleX, scaleY), 2), 0.1, 5.0); - ShowToast($"Fit to Page ({(int)(ZoomLevel * 100)}%)", "FitToPageOutline"); - } - else - { - FitToPage(); - } - } - - [RelayCommand] - public void RenameCurrentDocument() - { - if (IsPdfViewerVisible && !string.IsNullOrEmpty(PdfViewer.CurrentFilePath)) - { - Home.PromptRename(PdfViewer.CurrentFilePath); - } - else if (IsEditorVisible) - { - if (!string.IsNullOrEmpty(CurrentFilePath) && File.Exists(CurrentFilePath)) - { - Home.PromptRename(CurrentFilePath); - } - else - { - var fallbackPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), DocumentTitle); - Home.PromptRename(fallbackPath); - } - } - } - - [RelayCommand] - public void DuplicateCurrentDocument() - { - var target = IsPdfViewerVisible ? PdfViewer.CurrentFilePath : CurrentFilePath; - if (!string.IsNullOrEmpty(target) && File.Exists(target)) - { - Home.DuplicateDocument(target); - } - else - { - ShowToast("Please save the document before duplicating", "AlertCircleOutline"); - } - } - - [RelayCommand] - public void RevealCurrentDocumentInFileManager() - { - var target = IsPdfViewerVisible ? PdfViewer.CurrentFilePath : CurrentFilePath; - if (!string.IsNullOrEmpty(target) && File.Exists(target)) - { - Home.RevealInFileManager(target); - } - else - { - ShowToast("Document has not been saved to disk yet", "InformationOutline"); - } - } - - [RelayCommand] - public async Task CopyCurrentDocumentPath() - { - var target = IsPdfViewerVisible ? PdfViewer.CurrentFilePath : CurrentFilePath; - if (!string.IsNullOrEmpty(target)) - { - await Home.CopyPath(target); - } - else - { - ShowToast("Document has no saved disk path yet", "InformationOutline"); - } - } - - [RelayCommand] - public void DeleteCurrentDocument() - { - var target = IsPdfViewerVisible ? PdfViewer.CurrentFilePath : CurrentFilePath; - if (!string.IsNullOrEmpty(target) && File.Exists(target)) - { - Home.PromptDelete(target); - } - } -} diff --git a/src/PdfEditorApp/ViewModels/NavigationItemViewModel.cs b/src/PdfEditorApp/ViewModels/NavigationItemViewModel.cs deleted file mode 100644 index 9e89711..0000000 --- a/src/PdfEditorApp/ViewModels/NavigationItemViewModel.cs +++ /dev/null @@ -1,68 +0,0 @@ -using System.Collections.Generic; -using System.Collections.ObjectModel; -using CommunityToolkit.Mvvm.ComponentModel; -using PdfEditorApp.Core.Plugins.Descriptors; - -namespace PdfEditorApp.ViewModels; - -/// -/// ViewModel representing a dynamic workspace navigation section contributed by a plugin. -/// -public partial class NavigationItemViewModel : ObservableObject -{ - [ObservableProperty] - private string _id; - - [ObservableProperty] - private string _title; - - [ObservableProperty] - private string _group; - - [ObservableProperty] - private string _iconKind; - - [ObservableProperty] - private string? _badgeText; - - [ObservableProperty] - private string? _badgeColorHex; - - [ObservableProperty] - private int _order; - - [ObservableProperty] - private bool _isActive; - - public NavigationItemDescriptor Descriptor { get; } - - public NavigationItemViewModel(NavigationItemDescriptor descriptor) - { - Descriptor = descriptor; - _id = descriptor.Id; - _title = descriptor.Title; - _group = descriptor.Group; - _iconKind = descriptor.IconKind; - _badgeText = descriptor.BadgeText; - _badgeColorHex = descriptor.BadgeColorHex; - _order = descriptor.Order; - } -} - -/// -/// Groups a set of navigation items under a single section header for plugin-driven sidebar rendering. -/// -public sealed class NavGroupViewModel -{ - /// Header label displayed above the group (e.g. "OVERVIEW", "CATEGORIES"). - public string Header { get; } - - /// Ordered navigation items belonging to this group. - public IReadOnlyList Items { get; } - - public NavGroupViewModel(string header, IReadOnlyList items) - { - Header = header.ToUpperInvariant(); - Items = items; - } -} diff --git a/src/PdfEditorApp/ViewModels/OverlayInstanceViewModel.cs b/src/PdfEditorApp/ViewModels/OverlayInstanceViewModel.cs deleted file mode 100644 index 02aab29..0000000 --- a/src/PdfEditorApp/ViewModels/OverlayInstanceViewModel.cs +++ /dev/null @@ -1,135 +0,0 @@ -using System; -using CommunityToolkit.Mvvm.ComponentModel; -using CommunityToolkit.Mvvm.Input; -using PdfEditorApp.Core.Plugins.Descriptors; - -namespace PdfEditorApp.ViewModels; - -/// -/// ViewModel representing an active, floating, draggable overlay instance in the 'shell.overlay' slot. -/// Supports 60+ FPS dragging, minimizing to a pill, and clean dismissal. -/// -public partial class OverlayInstanceViewModel : ObservableObject -{ - private readonly Action? _onClose; - - [ObservableProperty] - private string _id = string.Empty; - - [ObservableProperty] - private string _title = string.Empty; - - [ObservableProperty] - private string _iconKind = "WindowRestore"; - - [ObservableProperty] - private double _x; - - [ObservableProperty] - private double _y; - - [ObservableProperty] - private double _width = 340; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(EffectiveHeight))] - private double _height = 420; - - [ObservableProperty] - private int _zIndex = 1; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(CanResize))] - private bool _isResizable = true; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(HasStandardChrome))] - [NotifyPropertyChangedFor(nameof(HasCustomChrome))] - [NotifyPropertyChangedFor(nameof(HasFloatingPill))] - [NotifyPropertyChangedFor(nameof(CustomChromeContent))] - [NotifyPropertyChangedFor(nameof(StandardChromeContent))] - private OverlayChromeMode _chromeMode = OverlayChromeMode.StandardCard; - - [ObservableProperty] - private bool _isPinned; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(EffectiveHeight))] - [NotifyPropertyChangedFor(nameof(EffectiveMinHeight))] - [NotifyPropertyChangedFor(nameof(CanResize))] - private bool _isMinimized; - - [ObservableProperty] - private bool _isVisible = true; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(CustomChromeContent))] - [NotifyPropertyChangedFor(nameof(StandardChromeContent))] - private object? _content; - - public bool HasStandardChrome => ChromeMode == OverlayChromeMode.StandardCard; - public bool HasCustomChrome => ChromeMode == OverlayChromeMode.CustomChrome; - public bool HasFloatingPill => ChromeMode == OverlayChromeMode.FloatingPill; - - public double EffectiveHeight => IsMinimized ? double.NaN : Height; - public double EffectiveMinHeight => IsMinimized ? 42 : Descriptor.MinHeight; - public bool CanResize => IsResizable && !IsMinimized; - - public object? CustomChromeContent => HasCustomChrome ? Content : null; - public object? StandardChromeContent => HasStandardChrome ? Content : null; - - public OverlayDescriptor Descriptor { get; } - - public OverlayInstanceViewModel(OverlayDescriptor descriptor, Action? onClose = null) - { - Descriptor = descriptor ?? throw new ArgumentNullException(nameof(descriptor)); - _id = descriptor.Id; - _title = descriptor.Title; - _iconKind = descriptor.IconKind; - _width = descriptor.DefaultWidth; - _height = descriptor.DefaultHeight; - _isResizable = descriptor.IsResizable; - _chromeMode = descriptor.ChromeMode; - _onClose = onClose; - } - - public void Resize(double newWidth, double newHeight, double maxCanvasWidth = double.PositiveInfinity, double maxCanvasHeight = double.PositiveInfinity) - { - var minW = Math.Max(120, Descriptor.MinWidth); - var minH = Math.Max(80, Descriptor.MinHeight); - var maxW = Math.Min(Descriptor.MaxWidth, maxCanvasWidth); - var maxH = Math.Min(Descriptor.MaxHeight, maxCanvasHeight); - - Width = Math.Clamp(newWidth, minW, Math.Max(minW, maxW)); - Height = Math.Clamp(newHeight, minH, Math.Max(minH, maxH)); - } - - [RelayCommand] - public void ToggleMinimize() - { - IsMinimized = !IsMinimized; - } - - [RelayCommand] - public void TogglePin() - { - IsPinned = !IsPinned; - } - - [RelayCommand] - public void Close() - { - IsVisible = false; - _onClose?.Invoke(this); - } - - public void BringToFront(System.Collections.Generic.IEnumerable allOverlays) - { - int max = 0; - foreach (var o in allOverlays) - { - if (o.ZIndex > max) max = o.ZIndex; - } - ZIndex = max + 1; - } -} diff --git a/src/PdfEditorApp/ViewModels/PageViewModel.cs b/src/PdfEditorApp/ViewModels/PageViewModel.cs deleted file mode 100644 index 7868ae3..0000000 --- a/src/PdfEditorApp/ViewModels/PageViewModel.cs +++ /dev/null @@ -1,501 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Linq; -using Avalonia; -using CommunityToolkit.Mvvm.ComponentModel; -using CommunityToolkit.Mvvm.Input; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; -using PdfEditorApp.Models; -using PdfEditorApp.Services.Canvas; -using PdfEditorApp.ViewModels.ElementViewModels; - -namespace PdfEditorApp.ViewModels; - -public partial class PageViewModel : ViewModelBase -{ - private readonly ICanvasElementService _elementService; - - public PageViewModel(ICanvasElementService? elementService = null) - { - _elementService = elementService ?? DefaultElementService; - } - - private static ICanvasElementService? _defaultElementService; - public static ICanvasElementService DefaultElementService - { - get => _defaultElementService ??= new CanvasElementRegistry(); - set => _defaultElementService = value; - } - - [ObservableProperty] - private string _id = Guid.NewGuid().ToString("N"); - - [ObservableProperty] - private int _pageNumber = 1; - - [ObservableProperty] - private PageFormat _format = PageFormat.A4; - - [ObservableProperty] - private PageOrientation _orientation = PageOrientation.Portrait; - - [ObservableProperty] - private int _rotationAngle = 0; - - [ObservableProperty] - private double _width = 800; - - [ObservableProperty] - private double _height = 1131; - - [ObservableProperty] - private string _backgroundColorHex = "#FFFFFF"; - - [ObservableProperty] - private bool _showHeaderFooter = true; - - [ObservableProperty] - private string? _headerLeft; - - [ObservableProperty] - private string? _headerCenter; - - [ObservableProperty] - private string? _headerRight; - - [ObservableProperty] - private string? _footerLeft = "CONFIDENTIAL & PROPRIETARY"; - - [ObservableProperty] - private string? _footerCenter; - - [ObservableProperty] - private string? _footerRight = "Page 1 of 1"; - - [ObservableProperty] - private bool _isSelected; - - [ObservableProperty] - private ElementViewModelBase? _selectedElement; - - [ObservableProperty] - private bool _hasMultiSelection; - - [ObservableProperty] - private int _selectionCount; - - [ObservableProperty] - private Rect _selectionBoundingBox; - - public ObservableCollection Elements { get; } = new(); - - public ObservableCollection SelectedElements { get; } = new(); - - public event Action? SelectionChanged; - public event Action? MultiSelectionChanged; - - public void SelectElement(ElementViewModelBase? element) - { - SelectedElements.Clear(); - - foreach (var el in Elements) - { - el.IsSelected = (el == element); - if (!el.IsSelected) el.IsInEditMode = false; - } - - if (element != null) - { - SelectedElements.Add(element); - } - - SelectedElement = element; - HasMultiSelection = false; - SelectionCount = SelectedElements.Count; - UpdateSelectionBoundingBox(); - - SelectionChanged?.Invoke(element); - MultiSelectionChanged?.Invoke(); - } - - public void ToggleElementSelection(ElementViewModelBase element) - { - if (SelectedElements.Contains(element)) - { - element.IsSelected = false; - element.IsInEditMode = false; - SelectedElements.Remove(element); - } - else - { - element.IsSelected = true; - SelectedElements.Add(element); - } - - SelectedElement = SelectedElements.LastOrDefault(); - HasMultiSelection = SelectedElements.Count > 1; - SelectionCount = SelectedElements.Count; - UpdateSelectionBoundingBox(); - - SelectionChanged?.Invoke(SelectedElement); - MultiSelectionChanged?.Invoke(); - } - - public void SelectElements(IEnumerable elements) - { - var targetSet = new HashSet(elements); - SelectedElements.Clear(); - - foreach (var el in Elements) - { - bool isSel = targetSet.Contains(el); - el.IsSelected = isSel; - if (!isSel) el.IsInEditMode = false; - if (isSel) SelectedElements.Add(el); - } - - SelectedElement = SelectedElements.LastOrDefault(); - HasMultiSelection = SelectedElements.Count > 1; - SelectionCount = SelectedElements.Count; - UpdateSelectionBoundingBox(); - - SelectionChanged?.Invoke(SelectedElement); - MultiSelectionChanged?.Invoke(); - } - - public void SelectAll() - { - SelectElements(Elements); - } - - public void ClearSelection() - { - SelectElement(null); - } - - public void UpdateSelectionBoundingBox() - { - if (SelectedElements.Count == 0) - { - SelectionBoundingBox = default; - return; - } - - double minX = SelectedElements.Min(e => e.X); - double minY = SelectedElements.Min(e => e.Y); - double maxX = SelectedElements.Max(e => e.X + Math.Max(1, e.Width)); - double maxY = SelectedElements.Max(e => e.Y + Math.Max(1, e.Height)); - - SelectionBoundingBox = new Rect(minX, minY, Math.Max(1, maxX - minX), Math.Max(1, maxY - minY)); - } - - public void AddElement(ElementViewModelBase element) - { - int maxZ = Elements.Count > 0 ? Elements.Max(e => e.ZIndex) + 1 : 1; - element.ZIndex = maxZ; - Elements.Add(element); - SelectElement(element); - } - - public void RemoveElement(ElementViewModelBase element) - { - if (SelectedElements.Contains(element)) - { - SelectedElements.Remove(element); - element.IsSelected = false; - } - - if (SelectedElement == element) - { - SelectedElement = SelectedElements.LastOrDefault(); - } - - Elements.Remove(element); - HasMultiSelection = SelectedElements.Count > 1; - SelectionCount = SelectedElements.Count; - UpdateSelectionBoundingBox(); - SelectionChanged?.Invoke(SelectedElement); - } - - public void BringToFront(ElementViewModelBase element) - { - if (!Elements.Contains(element) || Elements.Count <= 1) return; - int oldIndex = Elements.IndexOf(element); - if (oldIndex != Elements.Count - 1) - { - Elements.Move(oldIndex, Elements.Count - 1); - } - NormalizeZIndices(); - } - - public void SendToBack(ElementViewModelBase element) - { - if (!Elements.Contains(element) || Elements.Count <= 1) return; - int oldIndex = Elements.IndexOf(element); - if (oldIndex != 0) - { - Elements.Move(oldIndex, 0); - } - NormalizeZIndices(); - } - - public void BringForward(ElementViewModelBase element) - { - if (!Elements.Contains(element) || Elements.Count <= 1) return; - int oldIndex = Elements.IndexOf(element); - if (oldIndex < Elements.Count - 1) - { - Elements.Move(oldIndex, oldIndex + 1); - NormalizeZIndices(); - } - } - - public void SendBackward(ElementViewModelBase element) - { - if (!Elements.Contains(element) || Elements.Count <= 1) return; - int oldIndex = Elements.IndexOf(element); - if (oldIndex > 0) - { - Elements.Move(oldIndex, oldIndex - 1); - NormalizeZIndices(); - } - } - - public void NormalizeZIndices() - { - for (int i = 0; i < Elements.Count; i++) - { - Elements[i].ZIndex = i + 1; - } - } - - public void GroupSelected() - { - if (SelectedElements.Count < 2) return; - string newGroupId = Guid.NewGuid().ToString("N"); - foreach (var el in SelectedElements) - { - el.GroupId = newGroupId; - } - } - - public void UngroupSelected() - { - foreach (var el in SelectedElements) - { - el.GroupId = null; - } - } - - public void AlignSelectedLeft() - { - if (SelectedElements.Count < 2) return; - double minX = SelectedElements.Min(e => e.X); - foreach (var el in SelectedElements.Where(e => !e.IsLocked)) - { - el.X = minX; - } - UpdateSelectionBoundingBox(); - } - - public void AlignSelectedRight() - { - if (SelectedElements.Count < 2) return; - double maxRight = SelectedElements.Max(e => e.X + e.Width); - foreach (var el in SelectedElements.Where(e => !e.IsLocked)) - { - el.X = Math.Round(maxRight - el.Width, 1); - } - UpdateSelectionBoundingBox(); - } - - public void AlignSelectedCenter() - { - if (SelectedElements.Count < 2) return; - double minX = SelectedElements.Min(e => e.X); - double maxRight = SelectedElements.Max(e => e.X + e.Width); - double midX = (minX + maxRight) / 2.0; - - foreach (var el in SelectedElements.Where(e => !e.IsLocked)) - { - el.X = Math.Round(midX - (el.Width / 2.0), 1); - } - UpdateSelectionBoundingBox(); - } - - public void AlignSelectedTop() - { - if (SelectedElements.Count < 2) return; - double minY = SelectedElements.Min(e => e.Y); - foreach (var el in SelectedElements.Where(e => !e.IsLocked)) - { - el.Y = minY; - } - UpdateSelectionBoundingBox(); - } - - public void AlignSelectedBottom() - { - if (SelectedElements.Count < 2) return; - double maxBottom = SelectedElements.Max(e => e.Y + e.Height); - foreach (var el in SelectedElements.Where(e => !e.IsLocked)) - { - el.Y = Math.Round(maxBottom - el.Height, 1); - } - UpdateSelectionBoundingBox(); - } - - public void AlignSelectedMiddle() - { - if (SelectedElements.Count < 2) return; - double minY = SelectedElements.Min(e => e.Y); - double maxBottom = SelectedElements.Max(e => e.Y + e.Height); - double midY = (minY + maxBottom) / 2.0; - - foreach (var el in SelectedElements.Where(e => !e.IsLocked)) - { - el.Y = Math.Round(midY - (el.Height / 2.0), 1); - } - UpdateSelectionBoundingBox(); - } - - public void DistributeSelectedHorizontally() - { - if (SelectedElements.Count < 3) return; - var ordered = SelectedElements.Where(e => !e.IsLocked).OrderBy(e => e.X).ToList(); - if (ordered.Count < 3) return; - - double startX = ordered.First().X; - double endX = ordered.Last().X + ordered.Last().Width; - double totalItemW = ordered.Sum(e => e.Width); - double availableGap = endX - startX - totalItemW; - double gapPerItem = Math.Max(0, availableGap / (ordered.Count - 1)); - - double currentX = startX; - for (int i = 0; i < ordered.Count; i++) - { - ordered[i].X = Math.Round(currentX, 1); - currentX += ordered[i].Width + gapPerItem; - } - UpdateSelectionBoundingBox(); - } - - public void DistributeSelectedVertically() - { - if (SelectedElements.Count < 3) return; - var ordered = SelectedElements.Where(e => !e.IsLocked).OrderBy(e => e.Y).ToList(); - if (ordered.Count < 3) return; - - double startY = ordered.First().Y; - double endY = ordered.Last().Y + ordered.Last().Height; - double totalItemH = ordered.Sum(e => e.Height); - double availableGap = endY - startY - totalItemH; - double gapPerItem = Math.Max(0, availableGap / (ordered.Count - 1)); - - double currentY = startY; - for (int i = 0; i < ordered.Count; i++) - { - ordered[i].Y = Math.Round(currentY, 1); - currentY += ordered[i].Height + gapPerItem; - } - UpdateSelectionBoundingBox(); - } - - [RelayCommand] - public void RotateClockwise() - { - RotationAngle = (RotationAngle + 90) % 360; - } - - public PdfPageModel ToModel() - { - var model = new PdfPageModel - { - Id = Id, - PageNumber = PageNumber, - Format = Format, - Orientation = Orientation, - RotationAngle = RotationAngle, - Width = Width, - Height = Height, - BackgroundColorHex = BackgroundColorHex, - ShowHeaderFooter = ShowHeaderFooter, - HeaderLeft = HeaderLeft, - HeaderCenter = HeaderCenter, - HeaderRight = HeaderRight, - FooterLeft = FooterLeft, - FooterCenter = FooterCenter, - FooterRight = FooterRight - }; - - foreach (var el in Elements) - { - model.Elements.Add(el.ToModel()); - } - - return model; - } - - public void LoadFromModel(PdfPageModel model) - { - Id = model.Id; - PageNumber = model.PageNumber; - Format = model.Format; - Orientation = model.Orientation; - RotationAngle = model.RotationAngle; - Width = model.Width; - Height = model.Height; - BackgroundColorHex = model.BackgroundColorHex; - ShowHeaderFooter = model.ShowHeaderFooter; - HeaderLeft = model.HeaderLeft; - HeaderCenter = model.HeaderCenter; - HeaderRight = model.HeaderRight; - FooterLeft = model.FooterLeft; - FooterCenter = model.FooterCenter; - FooterRight = model.FooterRight; - - Elements.Clear(); - SelectedElements.Clear(); - SelectedElement = null; - HasMultiSelection = false; - SelectionCount = 0; - - foreach (var elModel in model.Elements) - { - ElementViewModelBase vm = _elementService.CreateViewModel(elModel); - Elements.Add(vm); - } - } - - public void RecalculateFormFields() - { - var formFields = Elements.OfType().ToList(); - foreach (var field in formFields.Where(f => f.CalculationFormula != CalculationFormula.None)) - { - if (string.IsNullOrWhiteSpace(field.CalculationSourceFields)) continue; - var sourceNames = field.CalculationSourceFields - .Split(new[] { ',', ';', ' ' }, StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries); - - var values = formFields - .Where(f => sourceNames.Contains(f.FieldName, StringComparer.OrdinalIgnoreCase)) - .Select(f => double.TryParse(f.Value, out var v) ? v : (double.TryParse(f.DefaultValue, out var dv) ? dv : 0.0)) - .ToList(); - - if (values.Count == 0) continue; - - double result = field.CalculationFormula switch - { - CalculationFormula.Sum => values.Sum(), - CalculationFormula.Average => values.Average(), - CalculationFormula.Product => values.Aggregate(1.0, (acc, x) => acc * x), - CalculationFormula.Min => values.Min(), - CalculationFormula.Max => values.Max(), - _ => 0 - }; - - field.Value = result.ToString("F2"); - } - } -} diff --git a/src/PdfEditorApp/ViewModels/PdfToolCardViewModel.cs b/src/PdfEditorApp/ViewModels/PdfToolCardViewModel.cs deleted file mode 100644 index 28c0978..0000000 --- a/src/PdfEditorApp/ViewModels/PdfToolCardViewModel.cs +++ /dev/null @@ -1,49 +0,0 @@ -using PdfEditorApp.Services.Tools.Core; -using PdfEditorApp.ViewModels.Tools.Core; -using System; -using CommunityToolkit.Mvvm.ComponentModel; -using CommunityToolkit.Mvvm.Input; -using PdfEditorApp.Models; - -namespace PdfEditorApp.ViewModels; - -public partial class PdfToolCardViewModel : ViewModelBase -{ - public PdfToolDefinition Definition { get; } - - public PdfToolId Id => Definition.Id; - public string Name => Definition.Name; - public string Description => Definition.Description; - public PdfToolCategory Category => Definition.Category; - public string CategoryDisplayName => Definition.CategoryDisplayName; - public string IconKind => Definition.IconKind; - public string IconColorHex => Definition.IconColorHex; - public string BackgroundAccentHex => Definition.BackgroundAccentHex; - public bool IsNew => Definition.IsNew; - public bool IsWorkflowBanner => Definition.IsWorkflowBanner; - public bool SupportsMultiFile => Definition.SupportsMultiFile; - - [ObservableProperty] - private bool _isStarred; - - public event Action? ToolSelected; - public event Action? StarToggled; - - public PdfToolCardViewModel(PdfToolDefinition definition) - { - Definition = definition; - } - - [RelayCommand] - public void SelectTool() - { - ToolSelected?.Invoke(Id); - } - - [RelayCommand] - public void ToggleStar() - { - IsStarred = !IsStarred; - StarToggled?.Invoke(Id); - } -} diff --git a/src/PdfEditorApp/ViewModels/PdfToolRunnerViewModel.cs b/src/PdfEditorApp/ViewModels/PdfToolRunnerViewModel.cs deleted file mode 100644 index 5949824..0000000 --- a/src/PdfEditorApp/ViewModels/PdfToolRunnerViewModel.cs +++ /dev/null @@ -1,577 +0,0 @@ -using PdfEditorApp.Services.Tools.Core; -using PdfEditorApp.ViewModels.Tools.Core; -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Diagnostics; -using System.IO; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using Avalonia.Platform.Storage; -using CommunityToolkit.Mvvm.ComponentModel; -using CommunityToolkit.Mvvm.Input; -using CommunityToolkit.Mvvm.Messaging; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Messages; -using PdfEditorApp.Models; -using PdfEditorApp.Services; - -namespace PdfEditorApp.ViewModels; - -public partial class PdfToolRunnerViewModel : ViewModelBase -{ - private readonly IPdfDocumentOperationsService _operationsService; - private CancellationTokenSource? _cts; - - public IStorageProvider? StorageProvider { get; set; } - - [ObservableProperty] - private PdfToolDefinition _tool = new(); - - [ObservableProperty] - private bool _isOpen; - - [ObservableProperty] - private bool _isRunning; - - [ObservableProperty] - private bool _isComplete; - - [ObservableProperty] - private bool _hasError; - - [ObservableProperty] - private string _errorMessage = string.Empty; - - [ObservableProperty] - private string _statusMessage = "Ready"; - - [ObservableProperty] - private double _progressPercentage; - - [ObservableProperty] - private string _lastOutputFilePath = string.Empty; - - [ObservableProperty] - private string _resultSummaryMessage = string.Empty; - - public ObservableCollection SelectedFiles { get; } = new(); - - public bool HasSelectedFiles => SelectedFiles.Count > 0; - public string SelectedFilesCountText => SelectedFiles.Count == 1 ? "1 file selected" : $"{SelectedFiles.Count} files selected"; - - // --- TOOL-SPECIFIC OBSERVABLE OPTIONS --- - - // Split - [ObservableProperty] private SplitExtractMode _splitMode = SplitExtractMode.SplitEveryNPages; - [ObservableProperty] private int _splitPagesInterval = 1; - [ObservableProperty] private string _splitRangeExpression = "1-3, 5, 7-10"; - [ObservableProperty] private bool _splitOddEven; - - // Compress - [ObservableProperty] private PdfCompressionLevel _compressionLevel = PdfCompressionLevel.Balanced; - [ObservableProperty] private bool _compressRemoveMetadata; - - // Watermark - [ObservableProperty] private string _watermarkText = "CONFIDENTIAL"; - [ObservableProperty] private double _watermarkOpacity = 0.35; - [ObservableProperty] private double _watermarkRotation = -45; - [ObservableProperty] private WatermarkPosition _watermarkPosition = WatermarkPosition.Center; - [ObservableProperty] private string _watermarkColorHex = "#EF4444"; - [ObservableProperty] private double _watermarkFontSize = 48; - - // Rotate - [ObservableProperty] private int _rotateDegrees = 90; - [ObservableProperty] private PageFilterTarget _rotateFilter = PageFilterTarget.All; - - // Security & Unlock - [ObservableProperty] private string _userPassword = string.Empty; - [ObservableProperty] private string _ownerPassword = string.Empty; - [ObservableProperty] private bool _allowPrinting = true; - [ObservableProperty] private bool _allowCopying = false; - [ObservableProperty] private bool _allowModifying = false; - - // Page Numbers - [ObservableProperty] private PageNumberPosition _pageNumberPosition = PageNumberPosition.BottomCenter; - [ObservableProperty] private string _pageNumberTemplate = "Page {n} of {total}"; - [ObservableProperty] private int _pageNumberStart = 1; - [ObservableProperty] private string _pageNumberColorHex = "#334155"; - - // OCR - [ObservableProperty] private string _ocrLanguage = "eng"; - [ObservableProperty] private bool _ocrSearchablePdf = true; - - // AI Summary - [ObservableProperty] private int _aiMaxBullets = 7; - [ObservableProperty] private bool _aiIncludeExecutive = true; - [ObservableProperty] private bool _aiIncludeActions = true; - - // Translation - [ObservableProperty] private string _targetLanguage = "Spanish"; - - // HTML / Web - [ObservableProperty] private string _htmlInputTextOrUrl = "https://"; - - // Image to PDF / PDF to Image - [ObservableProperty] private string _imageExportFormat = "jpg"; - [ObservableProperty] private int _imageDpi = 300; - [ObservableProperty] private bool _imageFitToPage = true; - - // Cropping - [ObservableProperty] private double _cropMarginTop = 36; - [ObservableProperty] private double _cropMarginBottom = 36; - [ObservableProperty] private double _cropMarginLeft = 36; - [ObservableProperty] private double _cropMarginRight = 36; - - // Scan - [ObservableProperty] private bool _scanAutoDeskew = true; - [ObservableProperty] private bool _scanEnhanceContrast = true; - [ObservableProperty] private bool _scanWhitenBackground = true; - - // Redaction - [ObservableProperty] private string _redactSearchPattern = "CONFIDENTIAL"; - [ObservableProperty] private bool _redactCaseSensitive = false; - [ObservableProperty] private bool _redactPermanentScrub = true; - - // Forms - [ObservableProperty] private bool _formFlattenFields = false; - [ObservableProperty] private bool _formExportJson = false; - - // Markdown - [ObservableProperty] private bool _markdownIncludeTables = true; - [ObservableProperty] private bool _markdownExtractImages = false; - - // Compare - [ObservableProperty] private string _compareDocBPath = string.Empty; - - // Starred state for active tool - [ObservableProperty] private bool _isToolStarred; - - // Navigation events - public event Action? BackRequested; - - public PdfToolRunnerViewModel(IPdfDocumentOperationsService operationsService) - { - _operationsService = operationsService; - } - - [RelayCommand] - public void GoBack() - { - BackRequested?.Invoke(); - } - - [RelayCommand] - public void OpenInEditor() - { - if (!string.IsNullOrEmpty(LastOutputFilePath) && File.Exists(LastOutputFilePath)) - { - WeakReferenceMessenger.Default.Send(new OpenInEditorMessage(LastOutputFilePath)); - } - } - - [RelayCommand] - public void OpenInViewer() - { - string targetPath = !string.IsNullOrEmpty(LastOutputFilePath) && File.Exists(LastOutputFilePath) - ? LastOutputFilePath - : (SelectedFiles.Count > 0 && File.Exists(SelectedFiles[0]) ? SelectedFiles[0] : string.Empty); - - if (!string.IsNullOrEmpty(targetPath)) - { - WeakReferenceMessenger.Default.Send(new OpenInViewerMessage(targetPath)); - } - } - - public void SetupForTool(PdfToolDefinition tool, string? initialFilePath = null) - { - Tool = tool; - SelectedFiles.Clear(); - if (!string.IsNullOrEmpty(initialFilePath) && File.Exists(initialFilePath)) - { - SelectedFiles.Add(initialFilePath); - } - - ResetState(); - IsOpen = true; - } - - public void ResetState() - { - IsRunning = false; - IsComplete = false; - HasError = false; - ErrorMessage = string.Empty; - StatusMessage = "Ready"; - ProgressPercentage = 0; - LastOutputFilePath = string.Empty; - ResultSummaryMessage = string.Empty; - OnPropertyChanged(nameof(HasSelectedFiles)); - OnPropertyChanged(nameof(SelectedFilesCountText)); - } - - [RelayCommand] - public async Task AddFilesAsync() - { - if (StorageProvider == null) return; - - var patterns = Tool.AcceptedFileExtensions.Split(new[] { ',', ';' }, StringSplitOptions.RemoveEmptyEntries) - .Select(e => e.Trim().StartsWith("*") ? e.Trim() : "*" + e.Trim()) - .ToArray(); - - var files = await StorageProvider.OpenFilePickerAsync(new FilePickerOpenOptions - { - Title = $"Select Files for {Tool.Name}", - AllowMultiple = Tool.SupportsMultiFile, - FileTypeFilter = new[] - { - new FilePickerFileType($"{Tool.Name} Inputs") - { - Patterns = patterns.Length > 0 ? patterns : new[] { "*.pdf" } - } - } - }); - - if (files != null && files.Count > 0) - { - if (!Tool.SupportsMultiFile) SelectedFiles.Clear(); - foreach (var f in files) - { - string path = f.Path.LocalPath; - if (!SelectedFiles.Contains(path)) SelectedFiles.Add(path); - } - ResetState(); - } - } - - [RelayCommand] - public void RemoveFile(string filePath) - { - SelectedFiles.Remove(filePath); - ResetState(); - } - - [RelayCommand] - public void ClearFiles() - { - SelectedFiles.Clear(); - ResetState(); - } - - [RelayCommand] - public void Close() - { - CancelExecution(); - IsOpen = false; - } - - [RelayCommand] - public void CancelExecution() - { - if (_cts != null && !_cts.IsCancellationRequested) - { - _cts.Cancel(); - StatusMessage = "Cancelling..."; - } - } - - [RelayCommand] - public async Task ExecuteToolAsync() - { - if (SelectedFiles.Count == 0 && Tool.Id != PdfToolId.HtmlToPdf) - { - HasError = true; - ErrorMessage = "Please select at least one file to process."; - return; - } - - IsRunning = true; - IsComplete = false; - HasError = false; - ErrorMessage = string.Empty; - ProgressPercentage = 5.0; - StatusMessage = $"Processing {Tool.Name}..."; - - _cts = new CancellationTokenSource(); - var progress = new Progress(p => - { - ProgressPercentage = p; - StatusMessage = $"Processing ({p:F0}%)..."; - }); - - try - { - object options = BuildOptionsObject(); - var result = await _operationsService.ExecuteToolAsync(Tool.Id, options, progress, _cts.Token); - - if (result.Success) - { - IsComplete = true; - LastOutputFilePath = result.OutputFilePath ?? ""; - ResultSummaryMessage = result.Message ?? "Operation completed successfully."; - StatusMessage = "Completed successfully!"; - ProgressPercentage = 100.0; - } - else - { - HasError = true; - ErrorMessage = result.ErrorMessage ?? "Operation failed."; - StatusMessage = "Failed"; - } - } - catch (OperationCanceledException) - { - StatusMessage = "Operation cancelled."; - } - catch (Exception ex) - { - HasError = true; - ErrorMessage = $"Unexpected error: {ex.Message}"; - StatusMessage = "Error"; - } - finally - { - IsRunning = false; - _cts = null; - } - } - - [RelayCommand] - public void OpenOutputFile() - { - if (!string.IsNullOrEmpty(LastOutputFilePath) && File.Exists(LastOutputFilePath)) - { - try - { - Process.Start(new ProcessStartInfo - { - FileName = LastOutputFilePath, - UseShellExecute = true - }); - } - catch { } - } - } - - [RelayCommand] - public void OpenOutputFolder() - { - if (!string.IsNullOrEmpty(LastOutputFilePath)) - { - string? dir = Directory.Exists(LastOutputFilePath) ? LastOutputFilePath : Path.GetDirectoryName(LastOutputFilePath); - if (!string.IsNullOrEmpty(dir) && Directory.Exists(dir)) - { - try - { - Process.Start(new ProcessStartInfo - { - FileName = dir, - UseShellExecute = true - }); - } - catch { } - } - } - } - - private object BuildOptionsObject() - { - string firstFile = SelectedFiles.FirstOrDefault() ?? ""; - - switch (Tool.Id) - { - case PdfToolId.MergePdf: - return new MergeToolOptions { InputFiles = SelectedFiles.ToList() }; - - case PdfToolId.SplitPdf: - return new SplitToolOptions - { - InputFilePath = firstFile, - Mode = SplitMode, - PagesPerSplit = SplitPagesInterval, - RangeExpression = SplitRangeExpression, - SplitOddEven = SplitOddEven - }; - - case PdfToolId.CompressPdf: - return new CompressToolOptions - { - InputFilePath = firstFile, - Level = CompressionLevel, - RemoveMetadata = CompressRemoveMetadata - }; - - case PdfToolId.Watermark: - return new WatermarkToolOptions - { - InputFilePath = firstFile, - Text = WatermarkText, - Opacity = WatermarkOpacity, - RotationAngle = WatermarkRotation, - Position = WatermarkPosition, - ColorHex = WatermarkColorHex, - FontSize = WatermarkFontSize - }; - - case PdfToolId.RotatePdf: - return new RotateToolOptions - { - InputFilePath = firstFile, - RotationDegrees = RotateDegrees, - TargetFilter = RotateFilter - }; - - case PdfToolId.ProtectPdf: - return new SecurityToolOptions - { - InputFilePath = firstFile, - UserPassword = UserPassword, - OwnerPassword = OwnerPassword, - AllowPrinting = AllowPrinting, - AllowCopying = AllowCopying, - AllowModifying = AllowModifying - }; - - case PdfToolId.UnlockPdf: - return new UnlockToolOptions - { - InputFilePath = firstFile, - Password = UserPassword - }; - - case PdfToolId.PageNumbers: - return new PageNumberToolOptions - { - InputFilePath = firstFile, - Template = PageNumberTemplate, - Position = PageNumberPosition, - StartingNumber = PageNumberStart, - ColorHex = PageNumberColorHex - }; - - case PdfToolId.PdfToWord: - return new WordConversionOptions { InputFilePath = firstFile }; - - case PdfToolId.PdfToExcel: - return new ExcelConversionOptions { InputFilePath = firstFile }; - - case PdfToolId.PdfToPowerPoint: - return new PptxConversionOptions { InputFilePath = firstFile }; - - case PdfToolId.WordToPdf: - case PdfToolId.ExcelToPdf: - case PdfToolId.PowerPointToPdf: - return new OfficeToPdfOptions { InputFilePath = firstFile }; - - case PdfToolId.PdfToJpg: - return new ImageConversionOptions - { - InputFilePath = firstFile, - OutputFormat = ImageExportFormat, - Dpi = ImageDpi - }; - - case PdfToolId.JpgToPdf: - return new ImagesToPdfOptions - { - ImageFiles = SelectedFiles.ToList(), - FitToPage = ImageFitToPage - }; - - case PdfToolId.HtmlToPdf: - return new HtmlToPdfOptions - { - HtmlContentOrUrl = HtmlInputTextOrUrl, - IsUrl = HtmlInputTextOrUrl.StartsWith("http", StringComparison.OrdinalIgnoreCase) - }; - - case PdfToolId.PdfToPdfA: - return new PdfAToolOptions { InputFilePath = firstFile }; - - case PdfToolId.RepairPdf: - return new RepairToolOptions { InputFilePath = firstFile }; - - case PdfToolId.OcrPdf: - return new OcrToolOptions { InputFilePath = firstFile, Language = OcrLanguage }; - - case PdfToolId.ScanToPdf: - return new ScanToolOptions - { - InputImageFiles = SelectedFiles.ToList(), - AutoDeskew = ScanAutoDeskew, - EnhanceContrast = ScanEnhanceContrast, - WhitenBackground = ScanWhitenBackground - }; - - case PdfToolId.AiSummarizer: - return new AiSummaryOptions - { - InputFilePath = firstFile, - MaxBulletPoints = AiMaxBullets, - IncludeExecutiveSummary = AiIncludeExecutive, - IncludeActionItems = AiIncludeActions - }; - - case PdfToolId.TranslatePdf: - return new TranslationOptions - { - InputFilePath = firstFile, - TargetLanguage = TargetLanguage - }; - - case PdfToolId.PdfToMarkdown: - return new MarkdownConversionOptions - { - InputFilePath = firstFile, - IncludeTables = MarkdownIncludeTables, - IncludeImages = MarkdownExtractImages - }; - - case PdfToolId.SignPdf: - return new SignToolOptions - { - InputFilePath = firstFile, - SignerName = "Authorized Signatory", - Style = SignatureStyle.CursiveElegance - }; - - case PdfToolId.RedactPdf: - return new RedactionToolOptions - { - InputFilePath = firstFile, - SearchPatternToRedact = RedactSearchPattern, - CaseSensitive = RedactCaseSensitive, - PermanentScrubText = RedactPermanentScrub - }; - - case PdfToolId.CropPdf: - return new CropToolOptions - { - InputFilePath = firstFile, - CropTopPoints = CropMarginTop, - CropBottomPoints = CropMarginBottom, - CropLeftPoints = CropMarginLeft, - CropRightPoints = CropMarginRight - }; - - case PdfToolId.PdfForms: - return new FormToolOptions - { - InputFilePath = firstFile, - FlattenFields = FormFlattenFields, - ExportFieldValuesJson = FormExportJson - }; - - case PdfToolId.ComparePdf: - return new CompareToolOptions - { - DocumentAPath = firstFile, - DocumentBPath = !string.IsNullOrEmpty(CompareDocBPath) ? CompareDocBPath : (SelectedFiles.Count > 1 ? SelectedFiles[1] : firstFile) - }; - - default: - return new { InputFilePath = firstFile }; - } - } -} diff --git a/src/PdfEditorApp/ViewModels/PdfViewerModels.cs b/src/PdfEditorApp/ViewModels/PdfViewerModels.cs deleted file mode 100644 index 3475c2d..0000000 --- a/src/PdfEditorApp/ViewModels/PdfViewerModels.cs +++ /dev/null @@ -1,398 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Linq; -using System.Text; -using Avalonia; -using Avalonia.Media.Imaging; -using CommunityToolkit.Mvvm.ComponentModel; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Services; - -namespace PdfEditorApp.ViewModels; - -public enum PdfViewerSidebarTab -{ - Thumbnails, - Bookmarks, - Annotations, - Search, - Info -} - -public enum PdfViewerSelectionMode -{ - Text, - Area -} - -public class PdfViewerGlyphItem -{ - public char Character { get; set; } - public Rect Bounds { get; set; } -} - -public class PdfViewerWordItem -{ - public string Text { get; set; } = string.Empty; - public Rect Bounds { get; set; } - public int LineIndex { get; set; } - public int WordIndex { get; set; } - public List Glyphs { get; } = new(); -} - -public class PdfViewerTextLineItem -{ - public int LineIndex { get; set; } - public Rect Bounds { get; set; } - public string Text { get; set; } = string.Empty; - public List Words { get; } = new(); -} - -public partial class PdfViewerPageItem : ObservableObject, IDisposable -{ - /// - /// Rasterization scale for a page shown at 100% zoom. Matches the ~2x device pixel ratio of - /// a HiDPI display, which is what mainstream PDF viewers target. This was 2.75x, which - /// oversampled by roughly 1.9x in area for no visible benefit — and since render cost scales - /// with pixel count, that directly inflated how long every page took to appear. - /// Every site that renders or records a scale must use this same value: a mismatch makes - /// think the page needs re-rendering and - /// silently doubles the work. - /// - internal const float BasePageRenderScale = 2.0f; - - [ObservableProperty] - private bool _isSelected; - - [ObservableProperty] - private int _rotationAngle; - - [ObservableProperty] - private float _renderedScale = BasePageRenderScale; - - private Bitmap? _thumbnailBitmap; - private Bitmap? _bitmap; - - [ObservableProperty] - private string _selectedText = string.Empty; - - partial void OnSelectedTextChanged(string value) - { - HasSelection = !string.IsNullOrEmpty(value); - } - - [ObservableProperty] - private bool _hasSelection; - - private bool _isDisposed; - - public PdfReaderTheme AppliedReadingTheme { get; set; } = PdfReaderTheme.Default; - - /// Guards against piling up redundant background geometry-extraction tasks - /// while pointer-move events keep firing before the first one completes. - public bool IsGeometryLoading { get; set; } - - /// Guards against queueing duplicate bitmap renders for this page while one is - /// already in flight — scroll events fire far faster than a page can be rasterized. - public bool IsRenderLoading { get; set; } - - public int PageNumber { get; set; } - public double WidthPoints { get; set; } - public double HeightPoints { get; set; } - public string DimensionsText => $"{Math.Round(WidthPoints):F0} × {Math.Round(HeightPoints):F0} pt"; - public string PageLabel => $"Page {PageNumber}"; - public string PageSummary { get; set; } = string.Empty; - public string ExtractedText { get; set; } = string.Empty; - - public List Words { get; set; } = new(); - public List TextLines { get; set; } = new(); - - public List SelectionRects { get; } = new(); - - public event Action? SelectionChanged; - - public void NotifySelectionChanged() - { - OnPropertyChanged(nameof(SelectedText)); - OnPropertyChanged(nameof(HasSelection)); - SelectionChanged?.Invoke(); - } - - public void ClearSelection() - { - if (SelectionRects.Count > 0 || !string.IsNullOrEmpty(SelectedText)) - { - SelectionRects.Clear(); - SelectedText = string.Empty; - NotifySelectionChanged(); - } - } - - public void SelectWord(PdfViewerWordItem word) - { - SelectionRects.Clear(); - SelectionRects.Add(word.Bounds); - SelectedText = word.Text; - NotifySelectionChanged(); - } - - public void SelectLine(PdfViewerTextLineItem line) - { - SelectionRects.Clear(); - SelectionRects.Add(line.Bounds); - SelectedText = line.Text; - NotifySelectionChanged(); - } - - public void SelectAll() - { - SelectionRects.Clear(); - if (Words.Count == 0 && TextLines.Count == 0) - { - SelectedText = string.Empty; - NotifySelectionChanged(); - return; - } - - if (TextLines.Count > 0) - { - foreach (var line in TextLines) - { - SelectionRects.Add(line.Bounds); - } - } - else - { - foreach (var word in Words) - { - SelectionRects.Add(word.Bounds); - } - } - - SelectedText = ExtractedText; - NotifySelectionChanged(); - } - - public void SetSelectionRange(Point start, Point end) - { - SelectionRects.Clear(); - if (Words.Count == 0 || TextLines.Count == 0) - { - SelectedText = string.Empty; - NotifySelectionChanged(); - return; - } - - // Determine natural reading order start & end - bool isStartFirst = (start.Y < end.Y - 4) || (Math.Abs(start.Y - end.Y) <= 4 && start.X <= end.X); - Point firstPoint = isStartFirst ? start : end; - Point secondPoint = isStartFirst ? end : start; - - var startLine = TextLines - .Where(l => firstPoint.Y >= l.Bounds.Top - 4 && firstPoint.Y <= l.Bounds.Bottom + 4) - .OrderBy(l => Math.Max(0, Math.Max(l.Bounds.Left - firstPoint.X, firstPoint.X - l.Bounds.Right))) - .FirstOrDefault() - ?? TextLines.OrderBy(l => Math.Abs(l.Bounds.Center.Y - firstPoint.Y) * 10 + Math.Abs(l.Bounds.Center.X - firstPoint.X)).FirstOrDefault(); - - var endLine = TextLines - .Where(l => secondPoint.Y >= l.Bounds.Top - 4 && secondPoint.Y <= l.Bounds.Bottom + 4) - .OrderBy(l => Math.Max(0, Math.Max(l.Bounds.Left - secondPoint.X, secondPoint.X - l.Bounds.Right))) - .FirstOrDefault() - ?? TextLines.OrderBy(l => Math.Abs(l.Bounds.Center.Y - secondPoint.Y) * 10 + Math.Abs(l.Bounds.Center.X - secondPoint.X)).FirstOrDefault(); - - if (startLine == null || endLine == null) - { - SelectedText = string.Empty; - NotifySelectionChanged(); - return; - } - - int startLineIdx = Math.Min(startLine.LineIndex, endLine.LineIndex); - int endLineIdx = Math.Max(startLine.LineIndex, endLine.LineIndex); - - var sb = new StringBuilder(); - - for (int lIdx = startLineIdx; lIdx <= endLineIdx; lIdx++) - { - var line = TextLines.FirstOrDefault(l => l.LineIndex == lIdx); - if (line == null || line.Words.Count == 0) continue; - - List lineSelectedWords; - - if (startLineIdx == endLineIdx) - { - double minX = Math.Min(start.X, end.X); - double maxX = Math.Max(start.X, end.X); - - lineSelectedWords = line.Words - .Where(w => w.Bounds.Right >= minX && w.Bounds.Left <= maxX) - .ToList(); - - if (lineSelectedWords.Count == 0 && line.Bounds.Left <= maxX && line.Bounds.Right >= minX) - { - lineSelectedWords = line.Words.ToList(); - } - } - else if (lIdx == startLineIdx) - { - double fromX = firstPoint.X; - lineSelectedWords = line.Words - .Where(w => w.Bounds.Right >= fromX) - .ToList(); - - if (lineSelectedWords.Count == 0 && fromX <= line.Bounds.Left) - { - lineSelectedWords = line.Words.ToList(); - } - } - else if (lIdx == endLineIdx) - { - double toX = secondPoint.X; - lineSelectedWords = line.Words - .Where(w => w.Bounds.Left <= toX) - .ToList(); - - if (lineSelectedWords.Count == 0 && toX >= line.Bounds.Right) - { - lineSelectedWords = line.Words.ToList(); - } - } - else - { - lineSelectedWords = line.Words.ToList(); - } - - if (lineSelectedWords.Count > 0) - { - double left = lineSelectedWords.Min(w => w.Bounds.Left); - double right = lineSelectedWords.Max(w => w.Bounds.Right); - double top = lineSelectedWords.Min(w => w.Bounds.Top); - double bottom = lineSelectedWords.Max(w => w.Bounds.Bottom); - SelectionRects.Add(new Rect(left, top, Math.Max(1, right - left), Math.Max(1, bottom - top))); - - string lineTxt = string.Join(" ", lineSelectedWords.Select(w => w.Text)); - if (sb.Length > 0) sb.AppendLine(); - sb.Append(lineTxt); - } - } - - SelectedText = sb.ToString(); - NotifySelectionChanged(); - } - - public Bitmap? ThumbnailBitmap - { - get => _thumbnailBitmap ?? _bitmap; - set - { - var old = _thumbnailBitmap; - if (SetProperty(ref _thumbnailBitmap, value) && old != null && old != _bitmap) - { - old.Dispose(); - } - } - } - - public Bitmap? Bitmap - { - get => _bitmap; - set - { - var old = _bitmap; - if (SetProperty(ref _bitmap, value)) - { - OnPropertyChanged(nameof(ThumbnailBitmap)); - if (old != null && old != _thumbnailBitmap) - { - old.Dispose(); - } - } - } - } - - public ObservableCollection PageAnnotations { get; } = new(); - - /// Releases the rendered bitmaps. Safe to call more than once. - public void Dispose() - { - if (_isDisposed) return; - _isDisposed = true; - - var bmp = _bitmap; - var thumb = _thumbnailBitmap; - _bitmap = null; - _thumbnailBitmap = null; - - bmp?.Dispose(); - if (thumb != null && thumb != bmp) - { - thumb.Dispose(); - } - } -} - -public partial class PdfViewerPageSpreadItem : ObservableObject -{ - [ObservableProperty] - private bool _isSelected; - - public int SpreadIndex { get; set; } - public PdfViewerPageItem? LeftPage { get; set; } - public PdfViewerPageItem? RightPage { get; set; } - public string SpreadLabel { get; set; } = string.Empty; -} - -public class PdfViewerBookmarkItem -{ - public string Title { get; set; } = string.Empty; - public int PageNumber { get; set; } = 1; - public ObservableCollection Children { get; } = new(); - public bool HasChildren => Children.Count > 0; -} - -public partial class PdfViewerAnnotationItem : ObservableObject -{ - [ObservableProperty] - private string _id = Guid.NewGuid().ToString("N"); - - [ObservableProperty] - private string _type = "Highlight"; // Highlight, StickyNote, Stamp, Ink, Signature - - [ObservableProperty] - private int _pageNumber = 1; - - [ObservableProperty] - private string _author = "Reader"; - - [ObservableProperty] - private string _content = string.Empty; - - [ObservableProperty] - private string _colorHex = "#FEF08A"; - - [ObservableProperty] - private string _iconKind = "FormatColorHighlight"; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(TimeFormatted))] - private DateTime _createdAt = DateTime.Now; - - public string TimeFormatted => CreatedAt.ToString("HH:mm · MMM d"); - public List HighlightRects { get; set; } = new(); -} - -public class PdfViewerMetadataItem -{ - public string Label { get; set; } = string.Empty; - public string Value { get; set; } = string.Empty; - public string IconKind { get; set; } = "InformationOutline"; -} - -public class PdfViewerSearchMatch -{ - public int PageNumber { get; set; } - public string Snippet { get; set; } = string.Empty; - public int MatchIndex { get; set; } -} - diff --git a/src/PdfEditorApp/ViewModels/PdfViewerViewModel.Annotations.cs b/src/PdfEditorApp/ViewModels/PdfViewerViewModel.Annotations.cs deleted file mode 100644 index bc524c9..0000000 --- a/src/PdfEditorApp/ViewModels/PdfViewerViewModel.Annotations.cs +++ /dev/null @@ -1,149 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using Avalonia; -using CommunityToolkit.Mvvm.Input; - -namespace PdfEditorApp.ViewModels; - -public partial class PdfViewerViewModel -{ - // --- Interactive Annotations & Review Markups --- - - [RelayCommand] - public void SetHighlightColor(string? colorHex) - { - if (!string.IsNullOrWhiteSpace(colorHex)) - { - SelectedHighlightColorHex = colorHex; - } - } - - [RelayCommand] - public void AddHighlightAnnotation(string? customColorHex = null) - { - var page = Pages.FirstOrDefault(p => p.PageNumber == ActiveSelectedPageNumber) ?? SelectedPage; - if (page == null) return; - string color = string.IsNullOrWhiteSpace(customColorHex) ? SelectedHighlightColorHex : customColorHex; - string textToHighlight = !string.IsNullOrWhiteSpace(ActiveSelectedText) ? ActiveSelectedText : page.SelectedText; - - var highlightRects = new List(page.SelectionRects); - - var ann = new PdfViewerAnnotationItem - { - Type = "Highlight", - PageNumber = page.PageNumber, - Author = "Reader Reviewer", - Content = !string.IsNullOrWhiteSpace(textToHighlight) ? textToHighlight : $"Highlighted text passage on Page {page.PageNumber}", - ColorHex = color, - IconKind = "FormatColorHighlight", - HighlightRects = highlightRects - }; - Annotations.Add(ann); - page.PageAnnotations.Add(ann); - OnPropertyChanged(nameof(HasAnnotations)); - page.ClearSelection(); - ClearSelection(); - SelectedSidebarTab = PdfViewerSidebarTab.Annotations; - ShowToast($"Added Highlight on Page {page.PageNumber}"); - } - - [RelayCommand] - public void HighlightSelectedText(string? customColorHex = null) - { - AddHighlightAnnotation(customColorHex); - } - - [RelayCommand] - public void OpenAddNoteDialog() - { - NewNoteText = string.Empty; - IsAddNoteOpen = true; - } - - [RelayCommand] - public void AddNoteFromSelection() - { - if (!string.IsNullOrWhiteSpace(ActiveSelectedText)) - { - NewNoteText = $"Re: \"{ActiveSelectedText}\"\n\n"; - } - else - { - NewNoteText = string.Empty; - } - IsAddNoteOpen = true; - } - - [RelayCommand] - public void ConfirmAddNote() - { - if (SelectedPage == null || string.IsNullOrWhiteSpace(NewNoteText)) - { - IsAddNoteOpen = false; - return; - } - - var ann = new PdfViewerAnnotationItem - { - Type = "StickyNote", - PageNumber = SelectedPage.PageNumber, - Author = "Reader Note", - Content = NewNoteText.Trim(), - ColorHex = "#38BDF8", - IconKind = "NoteTextOutline" - }; - Annotations.Add(ann); - SelectedPage.PageAnnotations.Add(ann); - OnPropertyChanged(nameof(HasAnnotations)); - IsAddNoteOpen = false; - SelectedSidebarTab = PdfViewerSidebarTab.Annotations; - ShowToast($"Added Sticky Note on Page {SelectedPage.PageNumber}"); - } - - [RelayCommand] - public void AddStamp(string? stampText) - { - if (SelectedPage == null) return; - string text = string.IsNullOrWhiteSpace(stampText) ? "APPROVED" : stampText; - string color = text switch - { - "REJECTED" => "#EF4444", - "CONFIDENTIAL" => "#DC2626", - "DRAFT" => "#F59E0B", - "FINAL" => "#8B5CF6", - "REVIEWED" => "#3B82F6", - _ => "#10B981" // APPROVED - }; - - var ann = new PdfViewerAnnotationItem - { - Type = "Stamp", - PageNumber = SelectedPage.PageNumber, - Author = "Auditor", - Content = $"Stamp: {text}", - ColorHex = color, - IconKind = "Stamp" - }; - Annotations.Add(ann); - SelectedPage.PageAnnotations.Add(ann); - OnPropertyChanged(nameof(HasAnnotations)); - IsAddStampOpen = false; - SelectedSidebarTab = PdfViewerSidebarTab.Annotations; - ShowToast($"Applied '{text}' stamp on Page {SelectedPage.PageNumber}"); - } - - [RelayCommand] - public void DeleteAnnotation(PdfViewerAnnotationItem? ann) - { - if (ann == null) return; - Annotations.Remove(ann); - foreach (var p in Pages) - { - p.PageAnnotations.Remove(ann); - p.NotifySelectionChanged(); - } - OnPropertyChanged(nameof(HasAnnotations)); - } - -} diff --git a/src/PdfEditorApp/ViewModels/PdfViewerViewModel.Document.cs b/src/PdfEditorApp/ViewModels/PdfViewerViewModel.Document.cs deleted file mode 100644 index 83da5fe..0000000 --- a/src/PdfEditorApp/ViewModels/PdfViewerViewModel.Document.cs +++ /dev/null @@ -1,723 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using System.Threading; -using System.Threading.Tasks; -using Avalonia; -using Avalonia.Input.Platform; -using Avalonia.Media.Imaging; -using Avalonia.Platform.Storage; -using CommunityToolkit.Mvvm.Input; -using CommunityToolkit.Mvvm.Messaging; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Messages; -using PdfEditorApp.Models; -using PdfEditorApp.Services; -using PdfEditorApp.Services.Ocr; -using PdfEditorApp.Services.Tools.Core; -using UglyToad.PdfPig; -using UglyToad.PdfPig.Content; -using UglyToad.PdfPig.Outline; -using UglyToad.PdfPig.Rendering.Skia; - -namespace PdfEditorApp.ViewModels; - -public partial class PdfViewerViewModel -{ - // --- Core Document Loading & Text Geometry Extraction --- - - public static (string text, List words, List lines) ExtractPageTextGeometry(Page page) - { - double pageHeight = Math.Max(100, page.Height); - var rawWords = page.GetWords().Where(w => !string.IsNullOrWhiteSpace(w.Text)).ToList(); - if (rawWords.Count == 0) - { - return (page.Text ?? string.Empty, new List(), new List()); - } - - var wordItems = new List(); - int wordIdx = 0; - foreach (var w in rawWords) - { - double x = Math.Max(0, w.BoundingBox.Left); - double y = Math.Max(0, pageHeight - w.BoundingBox.Top); - double width = Math.Max(1, w.BoundingBox.Width); - double height = Math.Max(1, w.BoundingBox.Height); - - var wordItem = new PdfViewerWordItem - { - Text = w.Text, - Bounds = new Rect(x, y, width, height), - WordIndex = wordIdx++ - }; - - if (w.Letters != null && w.Letters.Count > 0) - { - foreach (var letter in w.Letters) - { - if (string.IsNullOrEmpty(letter.Value)) continue; - double lx = Math.Max(0, letter.BoundingBox.Left); - double ly = Math.Max(0, pageHeight - letter.BoundingBox.Top); - double lw = Math.Max(0.5, letter.BoundingBox.Width); - double lh = Math.Max(1, letter.BoundingBox.Height); - - wordItem.Glyphs.Add(new PdfViewerGlyphItem - { - Character = letter.Value[0], - Bounds = new Rect(lx, ly, lw, lh) - }); - } - } - - wordItems.Add(wordItem); - } - - // Group words into lines based on vertical overlap - var sortedWords = wordItems.OrderBy(w => w.Bounds.Top).ThenBy(w => w.Bounds.Left).ToList(); - var lineList = new List(); - - foreach (var word in sortedWords) - { - var line = lineList.FirstOrDefault(l => - { - double overlapTop = Math.Max(l.Bounds.Top, word.Bounds.Top); - double overlapBottom = Math.Min(l.Bounds.Bottom, word.Bounds.Bottom); - double overlap = overlapBottom - overlapTop; - return overlap > Math.Min(l.Bounds.Height, word.Bounds.Height) * 0.45; - }); - - if (line == null) - { - line = new PdfViewerTextLineItem - { - LineIndex = lineList.Count, - Bounds = word.Bounds - }; - line.Words.Add(word); - lineList.Add(line); - } - else - { - line.Words.Add(word); - line.Bounds = line.Bounds.Union(word.Bounds); - } - } - - // Sort words in each line horizontally and build line text - var sb = new StringBuilder(); - int lineIdx = 0; - foreach (var line in lineList.OrderBy(l => l.Bounds.Top)) - { - line.LineIndex = lineIdx++; - var sortedLineWords = line.Words.OrderBy(w => w.Bounds.Left).ToList(); - line.Words.Clear(); - line.Words.AddRange(sortedLineWords); - - foreach (var w in line.Words) - { - w.LineIndex = line.LineIndex; - } - - line.Text = string.Join(" ", line.Words.Select(w => w.Text)); - sb.AppendLine(line.Text); - } - - string fullText = sb.ToString().TrimEnd(); - if (string.IsNullOrWhiteSpace(fullText)) - { - fullText = page.Text ?? string.Empty; - } - - return (fullText, wordItems, lineList.OrderBy(l => l.Bounds.Top).ToList()); - } - - /// - /// Performs OCR on a rendered page image if vector text extraction yields no words (e.g. scanned documents). - /// - public (string text, List words, List lines) ExtractOcrPageTextGeometry(int pageNumber, double width, double height) - { - try - { - var ocrProvider = CompositeOcrProvider.Default; - if (!ocrProvider.IsAvailable) - { - return (string.Empty, new List(), new List()); - } - - byte[]? pagePng = RenderPageBytesAtScale(pageNumber, 1.5f); - if (pagePng == null || pagePng.Length == 0) - { - return (string.Empty, new List(), new List()); - } - - var ocrResult = ocrProvider.RecognizeTextAsync(pagePng).GetAwaiter().GetResult(); - if (!ocrResult.Success || ocrResult.Words.Count == 0) - { - return (string.Empty, new List(), new List()); - } - - var words = new List(); - int wIdx = 0; - foreach (var ow in ocrResult.Words) - { - double wx = Math.Max(0, ow.NormalizedBounds.X * width); - double wy = Math.Max(0, ow.NormalizedBounds.Y * height); - double ww = Math.Max(1, ow.NormalizedBounds.Width * width); - double wh = Math.Max(1, ow.NormalizedBounds.Height * height); - - var wordItem = new PdfViewerWordItem - { - Text = ow.Text, - Bounds = new Rect(wx, wy, ww, wh), - WordIndex = wIdx++ - }; - - double charW = ww / Math.Max(1, ow.Text.Length); - for (int ci = 0; ci < ow.Text.Length; ci++) - { - wordItem.Glyphs.Add(new PdfViewerGlyphItem - { - Character = ow.Text[ci], - Bounds = new Rect(wx + ci * charW, wy, Math.Max(0.5, charW), wh) - }); - } - - words.Add(wordItem); - } - - var lines = new List(); - int lIdx = 0; - foreach (var ol in ocrResult.Lines) - { - double lx = Math.Max(0, ol.NormalizedBounds.X * width); - double ly = Math.Max(0, ol.NormalizedBounds.Y * height); - double lw = Math.Max(1, ol.NormalizedBounds.Width * width); - double lh = Math.Max(1, ol.NormalizedBounds.Height * height); - - var lineItem = new PdfViewerTextLineItem - { - LineIndex = lIdx++, - Bounds = new Rect(lx, ly, lw, lh) - }; - - var lineWords = words - .Where(w => w.Bounds.Top >= ly - 4 && w.Bounds.Bottom <= ly + lh + 4) - .OrderBy(w => w.Bounds.Left) - .ToList(); - - foreach (var lw_item in lineWords) - { - lw_item.LineIndex = lineItem.LineIndex; - } - - lineItem.Words.AddRange(lineWords); - lineItem.Text = string.Join(" ", lineItem.Words.Select(w => w.Text)); - lines.Add(lineItem); - } - - return (ocrResult.FullText, words, lines); - } - catch - { - return (string.Empty, new List(), new List()); - } - } - - public byte[]? CurrentPdfBytes => _currentPdfBytes; - - /// - /// Populates a page's word/line geometry for hit-testing (hover cursor, click-to-select-word). - /// Runs off the UI thread — the first hover/click on a page the background sweep hasn't - /// reached yet used to open and fully parse the PDF synchronously on the dispatcher thread. - /// - public void EnsurePageGeometry(PdfViewerPageItem page) - { - if (page.Words.Count > 0 || page.IsGeometryLoading || _currentPdfBytes == null || _currentPdfBytes.Length == 0) return; - - page.IsGeometryLoading = true; - int pageNumber = page.PageNumber; - - Task.Run(() => - { - string? text = null; - List? words = null; - List? lines = null; - double width = 0, height = 0; - - try - { - lock (_renderLock) - { - var doc = OpenOrReuseDocument(); - if (doc != null && pageNumber >= 1 && pageNumber <= doc.NumberOfPages) - { - var p = doc.GetPage(pageNumber); - (text, words, lines) = ExtractPageTextGeometry(p); - if (p.Width > 0 && p.Height > 0) - { - width = p.Width; - height = p.Height; - } - } - } - } - catch { } - - // Automatic OCR fallback for scanned pages with zero vector text - if ((words == null || words.Count == 0) && width > 0 && height > 0) - { - var (ocrText, ocrWords, ocrLines) = ExtractOcrPageTextGeometry(pageNumber, width, height); - if (ocrWords.Count > 0) - { - text = ocrText; - words = ocrWords; - lines = ocrLines; - } - } - - // Assign geometry data directly so both UI and headless test runners receive words immediately - if (text != null && words != null && lines != null) - { - page.ExtractedText = text; - page.Words = words; - page.TextLines = lines; - if (width > 0 && height > 0) - { - page.WidthPoints = width; - page.HeightPoints = height; - } - } - page.IsGeometryLoading = false; - - try - { - Avalonia.Threading.Dispatcher.UIThread.Post(() => - { - if (SelectedPage != null && SelectedPage.PageNumber == pageNumber) - { - IsCurrentPageScanned = (page.Words.Count == 0 && string.IsNullOrWhiteSpace(page.ExtractedText)); - } - page.NotifySelectionChanged(); - }); - } - catch { } - }); - } - - public async Task LoadDocumentAsync(string filePath, string? password = null) - { - if (!File.Exists(filePath)) - { - StatusMessage = $"File not found: {filePath}"; - return; - } - - try - { - byte[] bytes = await File.ReadAllBytesAsync(filePath); - await LoadDocumentFromBytesAsync(bytes, filePath, password); - } - catch (Exception ex) - { - StatusMessage = $"Error loading document: {ex.Message}"; - } - } - - public Task LoadDocumentBytesAsync(byte[] pdfBytes, string? documentTitle = null, string? password = null) - => LoadDocumentFromBytesAsync(pdfBytes, documentTitle ?? "Document.pdf", password); - - public async Task LoadDocumentFromBytesAsync(byte[] pdfBytes, string sourceFilePath = "", string? password = null) - { - _renderCts?.Cancel(); - _renderCts = new CancellationTokenSource(); - var ct = _renderCts.Token; - - _backgroundRenderCts?.Cancel(); - _backgroundRenderCts = new CancellationTokenSource(); - - IsLoading = true; - IsOpeningDocument = true; - HasDocument = true; - StatusMessage = "Opening PDF document..."; - _currentPdfBytes = pdfBytes; - _currentPassword = password; - CurrentFilePath = sourceFilePath; - DocumentTitle = string.IsNullOrWhiteSpace(sourceFilePath) ? "Document.pdf" : Path.GetFileName(sourceFilePath); - - // Release the previous document's rendered bitmaps before replacing it — this - // ViewModel is a long-lived singleton reused across every document open, so - // nothing else ever frees this memory otherwise. - foreach (var oldPage in Pages) - { - oldPage.Dispose(); - } - _lastVisibleFirstPage = -1; - _lastVisibleLastPage = -1; - - lock (_renderLock) - { - _openDocument?.Dispose(); - _openDocument = null; - } - - Pages.Clear(); - PageSpreads.Clear(); - Bookmarks.Clear(); - Annotations.Clear(); - MetadataItems.Clear(); - SearchResults.Clear(); - - try - { - byte[] sanitizedBytes = PdfFileHelper.SanitizePdfBytes(pdfBytes); - _currentPdfBytes = sanitizedBytes; - - var (metaList, pagesList, total) = await Task.Run(() => - { - var parsingOptions = new ParsingOptions(); - if (!string.IsNullOrEmpty(password)) - { - parsingOptions.Password = password; - } - - PdfDocument? doc = null; - try - { - doc = PdfDocument.Open(sanitizedBytes, parsingOptions); - } - catch - { - try - { - byte[] repaired = PdfFileHelper.SalvageAndRepairPdfBytes(sanitizedBytes); - doc = PdfDocument.Open(repaired, parsingOptions); - } - catch - { - doc = PdfDocument.Open(pdfBytes, parsingOptions); - } - } - - try - { - try - { - PdfPigExtensions.AddSkiaPageFactory(doc); - } - catch { } - - int total = doc.NumberOfPages; - if (total == 0) - { - doc.Dispose(); - return (new List(), new List(), 0); - } - - // 1. Fast Page 1 extraction & immediate render - var firstPage = doc.GetPage(1); - double defaultWidth = Math.Max(100, firstPage.Width); - double defaultHeight = Math.Max(100, firstPage.Height); - int defaultRot = (int)firstPage.Rotation.Value; - var (firstPageText, firstWords, firstLines) = ExtractPageTextGeometry(firstPage); - string firstPageSummary = ""; - if (!string.IsNullOrWhiteSpace(firstPageText)) - { - var firstLine = firstPageText.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries).FirstOrDefault() ?? ""; - firstPageSummary = firstLine.Length > 50 ? firstLine.Substring(0, 50) + "..." : firstLine; - } - - Bitmap? bmp1 = null; - try - { - using var pngStream = PdfPigExtensions.GetPageAsPng(doc, 1, PdfViewerPageItem.BasePageRenderScale, 100); - if (pngStream != null && pngStream.Length > 0) - { - pngStream.Position = 0; - bmp1 = new Bitmap(pngStream); - } - } - catch { } - - // 2. Instant Skeleton Generation, with REAL per-page dimensions. Reading a - // page's declared size is cheap (the page dictionary's MediaBox) — nothing - // like the cost of full word/text extraction — so it's worth doing for every - // page right now rather than defaulting every page to page 1's size until - // the much slower progressive background sweep happens to reach it. Every - // scroll-position and click-to-navigate calculation sums page heights across - // however many preceding pages there are, so a wrong default anywhere in - // that chain drifts every page after it out of sync until the real value - // loads — for a large document, that's most of the book for a long time. - var pagesList = new List(total); - for (int i = 1; i <= total; i++) - { - double pageWidth = defaultWidth; - double pageHeight = defaultHeight; - int pageRot = (i == 1) ? defaultRot : 0; - - if (i > 1) - { - try - { - var pg = doc.GetPage(i); - if (pg.Width > 0) pageWidth = pg.Width; - if (pg.Height > 0) pageHeight = pg.Height; - pageRot = (int)pg.Rotation.Value; - } - catch { } - } - - pagesList.Add(new PdfViewerPageItem - { - PageNumber = i, - WidthPoints = pageWidth, - HeightPoints = pageHeight, - RotationAngle = pageRot, - ExtractedText = (i == 1) ? firstPageText : "", - Words = (i == 1) ? firstWords : new List(), - TextLines = (i == 1) ? firstLines : new List(), - PageSummary = (i == 1) ? firstPageSummary : "", - Bitmap = (i == 1) ? bmp1 : null, - RenderedScale = PdfViewerPageItem.BasePageRenderScale, - IsSelected = (i == 1) - }); - } - - // 3. Metadata - var info = doc.Information; - string dimsInches = $"{defaultWidth / 72.0:F1}\" × {defaultHeight / 72.0:F1}\""; - string dimsMm = $"{defaultWidth * 25.4 / 72.0:F0} × {defaultHeight * 25.4 / 72.0:F0} mm"; - - var metaList = new List - { - new PdfViewerMetadataItem { Label = "File Name", Value = DocumentTitle, IconKind = "FileDocumentOutline" }, - new PdfViewerMetadataItem { Label = "File Size", Value = PdfFilePreviewItem.FormatBytes(pdfBytes.Length), IconKind = "DatabaseOutline" }, - new PdfViewerMetadataItem { Label = "Total Pages", Value = $"{total} Pages", IconKind = "BookOpenPageVariantOutline" }, - new PdfViewerMetadataItem { Label = "Page Dimensions", Value = $"{dimsInches} ({dimsMm})", IconKind = "AspectRatio" }, - new PdfViewerMetadataItem { Label = "Title", Value = string.IsNullOrWhiteSpace(info.Title) ? "Untitled Document" : info.Title, IconKind = "FormatTitle" }, - new PdfViewerMetadataItem { Label = "Author", Value = string.IsNullOrWhiteSpace(info.Author) ? "Unknown Author" : info.Author, IconKind = "AccountOutline" }, - new PdfViewerMetadataItem { Label = "Subject", Value = string.IsNullOrWhiteSpace(info.Subject) ? "None specified" : info.Subject, IconKind = "Subject" }, - new PdfViewerMetadataItem { Label = "Keywords", Value = string.IsNullOrWhiteSpace(info.Keywords) ? "None" : info.Keywords, IconKind = "TagOutline" }, - new PdfViewerMetadataItem { Label = "Creator Application", Value = string.IsNullOrWhiteSpace(info.Creator) ? "FryPDF" : info.Creator, IconKind = "CogOutline" }, - new PdfViewerMetadataItem { Label = "PDF Producer", Value = string.IsNullOrWhiteSpace(info.Producer) ? "codefrydev.in" : info.Producer, IconKind = "ApplicationOutline" }, - new PdfViewerMetadataItem { Label = "PDF Version", Value = $"PDF {doc.Version}", IconKind = "ShieldCheckOutline" }, - new PdfViewerMetadataItem { Label = "Security Status", Value = doc.IsEncrypted ? "Password Protected (Encrypted)" : "Standard (No Security)", IconKind = doc.IsEncrypted ? "LockOutline" : "LockOpenOutline" } - }; - - // Keep this document open for reuse by on-demand rendering/geometry - // extraction instead of parsing the whole PDF from scratch again on the - // very first page request right after this. - lock (_renderLock) - { - _openDocument?.Dispose(); - _openDocument = doc; - } - - return (metaList, pagesList, total); - } - catch - { - doc.Dispose(); - throw; - } - }, ct); - - foreach (var m in metaList) MetadataItems.Add(m); - foreach (var p in pagesList) Pages.Add(p); - - TotalPagesCount = total; - CurrentPageNumber = 1; - JumpPageText = "1"; - SelectedPage = Pages.FirstOrDefault(); - HasDocument = true; - IsLoading = false; - IsOpeningDocument = false; - StatusMessage = $"Ready • {total} pages"; - - bool page1HasNoText = (SelectedPage != null && SelectedPage.Words.Count == 0 && string.IsNullOrWhiteSpace(SelectedPage.ExtractedText)); - IsScannedDocument = page1HasNoText; - IsCurrentPageScanned = page1HasNoText; - IsScannedBannerDismissed = false; - - RebuildPageSpreads(); - - // Start progressive background worker to render remaining pages, thumbnails, and bookmarks - StartBackgroundWorker(_backgroundRenderCts.Token); - } - catch (OperationCanceledException) - { - StatusMessage = "Loading cancelled."; - IsLoading = false; - IsOpeningDocument = false; - } - catch (Exception ex) - { - StatusMessage = $"Error: {ex.Message}"; - IsLoading = false; - IsOpeningDocument = false; - } - } - - /// Renders a specific page at the specified scale directly from PDF bytes using Skia. - /// Renders a specific page at the specified scale directly to image bytes. - - private static void ExtractBookmarksRecursive(IEnumerable nodes, IList targetList) - { - if (nodes == null) return; - foreach (var node in nodes) - { - if (node is DocumentBookmarkNode docNode) - { - var bm = new PdfViewerBookmarkItem - { - Title = docNode.Title ?? "Section", - PageNumber = Math.Max(1, docNode.PageNumber) - }; - if (docNode.Children != null && docNode.Children.Count > 0) - { - ExtractBookmarksRecursive(docNode.Children, bm.Children); - } - targetList.Add(bm); - } - } - } - - - [RelayCommand] - public void RenameDocument() - { - if (!string.IsNullOrEmpty(CurrentFilePath)) - { - WeakReferenceMessenger.Default.Send(new PromptRenameMessage(CurrentFilePath)); - } - } - - [RelayCommand] - public void DeleteDocument() - { - if (!string.IsNullOrEmpty(CurrentFilePath)) - { - WeakReferenceMessenger.Default.Send(new PromptDeleteMessage(CurrentFilePath)); - } - } - - [RelayCommand] - public void DuplicateDocument() - { - if (!string.IsNullOrEmpty(CurrentFilePath)) - { - if (FileOperationHelper.DuplicateFile(CurrentFilePath, out var newPath, out var error)) - { - ShowToast($"Created duplicate: {Path.GetFileName(newPath!)}"); - } - else - { - ShowToast($"Could not duplicate: {error}"); - } - } - } - - [RelayCommand] - public void RevealInFileManager() - { - if (!string.IsNullOrEmpty(CurrentFilePath)) - { - if (FileOperationHelper.RevealInFileManager(CurrentFilePath, out var error)) - { - ShowToast("Opened containing folder"); - } - else - { - ShowToast($"Could not reveal file: {error}"); - } - } - } - - [RelayCommand] - public async Task CopyPath() - { - if (!string.IsNullOrEmpty(CurrentFilePath)) - { - try - { - if (Avalonia.Application.Current?.ApplicationLifetime is Avalonia.Controls.ApplicationLifetimes.IClassicDesktopStyleApplicationLifetime desktop && desktop.MainWindow?.Clipboard != null) - { - await desktop.MainWindow.Clipboard.SetTextAsync(CurrentFilePath); - } - } - catch { } - ShowToast("Copied file path to clipboard"); - } - } - - - - [RelayCommand] - public async Task OpenAnotherPdfAsync() - { - if (StorageProvider == null) - { - WeakReferenceMessenger.Default.Send(new OpenPdfPickerMessage()); - return; - } - - var files = await StorageProvider.OpenFilePickerAsync(new FilePickerOpenOptions - { - Title = "Open PDF Document to Read", - AllowMultiple = false, - FileTypeFilter = new[] - { - new FilePickerFileType("PDF Documents (*.pdf)") - { - Patterns = new[] { "*.pdf" } - } - } - }); - - if (files.Count > 0) - { - string chosenPath = files[0].Path.LocalPath; - await LoadDocumentAsync(chosenPath); - ShowToast($"Reading: {Path.GetFileName(chosenPath)}"); - } - } - - [RelayCommand] - public async Task SaveAsAsync() - { - if (_currentPdfBytes == null || _currentPdfBytes.Length == 0 || StorageProvider == null) return; - - var file = await StorageProvider.SaveFilePickerAsync(new FilePickerSaveOptions - { - Title = "Save PDF As", - DefaultExtension = "pdf", - SuggestedFileName = DocumentTitle, - FileTypeChoices = new[] - { - new FilePickerFileType("PDF Documents (*.pdf)") - { - Patterns = new[] { "*.pdf" } - } - } - }); - - if (file != null) - { - try - { - await File.WriteAllBytesAsync(file.Path.LocalPath, _currentPdfBytes); - ShowToast($"Saved copy: {Path.GetFileName(file.Path.LocalPath)}"); - } - catch (IOException) - { - ShowToast($"Cannot save: '{Path.GetFileName(file.Path.LocalPath)}' is open in another program."); - } - catch (Exception ex) - { - ShowToast($"Save failed: {ex.Message}"); - } - } - } - -} diff --git a/src/PdfEditorApp/ViewModels/PdfViewerViewModel.Navigation.cs b/src/PdfEditorApp/ViewModels/PdfViewerViewModel.Navigation.cs deleted file mode 100644 index b19d5ab..0000000 --- a/src/PdfEditorApp/ViewModels/PdfViewerViewModel.Navigation.cs +++ /dev/null @@ -1,590 +0,0 @@ -using System; -using System.IO; -using System.Linq; -using CommunityToolkit.Mvvm.Input; -using CommunityToolkit.Mvvm.Messaging; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Messages; -using PdfEditorApp.Models; -using PdfEditorApp.Services; - -namespace PdfEditorApp.ViewModels; - -public partial class PdfViewerViewModel -{ - // --- Navigation & Page Selection --- - - public void RequestScrollToPage(int pageNumber) - { - if (pageNumber >= 1 && pageNumber <= TotalPagesCount) - { - ScrollToPageRequested?.Invoke(pageNumber); - } - } - - - [RelayCommand] - public void SelectPage(PdfViewerPageItem? page) - { - if (page == null) return; - SelectedPage = page; - CurrentPageNumber = page.PageNumber; - RequestScrollToPage(page.PageNumber); - } - - [RelayCommand] - public void SelectSpread(PdfViewerPageSpreadItem? spread) - { - if (spread == null) return; - SelectedSpread = spread; - if (spread.LeftPage != null) - { - CurrentPageNumber = spread.LeftPage.PageNumber; - } - else if (spread.RightPage != null) - { - CurrentPageNumber = spread.RightPage.PageNumber; - } - RequestScrollToPage(CurrentPageNumber); - } - - [RelayCommand] - public void JumpToBookmark(PdfViewerBookmarkItem? bookmark) - { - if (bookmark == null) return; - int pageIndex = bookmark.PageNumber - 1; - if (pageIndex >= 0 && pageIndex < Pages.Count) - { - SelectedPage = Pages[pageIndex]; - CurrentPageNumber = bookmark.PageNumber; - RequestScrollToPage(bookmark.PageNumber); - } - } - - [RelayCommand] - public void JumpToAnnotation(PdfViewerAnnotationItem? ann) - { - if (ann == null) return; - int pageIndex = ann.PageNumber - 1; - if (pageIndex >= 0 && pageIndex < Pages.Count) - { - SelectedPage = Pages[pageIndex]; - CurrentPageNumber = ann.PageNumber; - RequestScrollToPage(ann.PageNumber); - } - } - - [RelayCommand] - public void CommitJumpPage() - { - if (int.TryParse(JumpPageText, out int target) && target >= 1 && target <= TotalPagesCount) - { - CurrentPageNumber = target; - RequestScrollToPage(target); - } - else - { - JumpPageText = CurrentPageNumber.ToString(); - } - } - - [RelayCommand] - public void NextPage() - { - if (IsTwoPageSpreadMode) - { - if (CurrentPageNumber + 2 <= TotalPagesCount) - { - CurrentPageNumber += 2; - } - else if (CurrentPageNumber < TotalPagesCount) - { - CurrentPageNumber = TotalPagesCount; - } - } - else - { - if (CurrentPageNumber < TotalPagesCount) - { - CurrentPageNumber++; - } - } - RequestScrollToPage(CurrentPageNumber); - } - - [RelayCommand] - public void PreviousPage() - { - if (IsTwoPageSpreadMode) - { - if (CurrentPageNumber - 2 >= 1) - { - CurrentPageNumber -= 2; - } - else - { - CurrentPageNumber = 1; - } - } - else - { - if (CurrentPageNumber > 1) - { - CurrentPageNumber--; - } - } - RequestScrollToPage(CurrentPageNumber); - } - - [RelayCommand] - public void FirstPage() - { - if (TotalPagesCount > 0) - { - CurrentPageNumber = 1; - RequestScrollToPage(1); - } - } - - [RelayCommand] - public void LastPage() - { - if (TotalPagesCount > 0) - { - CurrentPageNumber = TotalPagesCount; - RequestScrollToPage(TotalPagesCount); - } - } - - - // --- Layout & View Modes --- - - [RelayCommand] - public void SetContinuousScrollLayout() - { - SetLayoutMode("ContinuousScroll"); - } - - [RelayCommand] - public void SetSinglePageLayout() - { - SetLayoutMode("SinglePage"); - } - - [RelayCommand] - public void SetTwoPageSpreadLayout() - { - SetLayoutMode("TwoPageSpread"); - } - - [RelayCommand] - public void SetLayoutMode(string? modeStr) - { - if (Enum.TryParse(modeStr, true, out var mode)) - { - SelectedLayoutMode = mode; - ShowToast(mode switch - { - PdfViewLayoutMode.ContinuousScroll => "Continuous Scroll Layout", - PdfViewLayoutMode.SinglePage => "Single Page Fit Layout", - PdfViewLayoutMode.TwoPageSpread => "Two-Page Book Spread Layout", - _ => "Layout Changed" - }); - } - } - - // --- Reading Themes --- - - [RelayCommand] - public void SetDefaultReadingTheme() - { - SetReadingTheme("Default"); - } - - [RelayCommand] - public void SetSepiaReadingTheme() - { - SetReadingTheme("Sepia"); - } - - [RelayCommand] - public void SetDarkReadingTheme() - { - SetReadingTheme("Dark"); - } - - [RelayCommand] - public void SetHighContrastReadingTheme() - { - SetReadingTheme("HighContrast"); - } - - [RelayCommand] - public void SetReadingTheme(string? themeStr) - { - if (Enum.TryParse(themeStr, true, out var theme)) - { - ReadingTheme = theme; - ShowToast(theme switch - { - PdfReaderTheme.Sepia => "Warm Sepia Book Reading Mode", - PdfReaderTheme.Dark => "Dark Night Reading Mode", - PdfReaderTheme.HighContrast => "High Contrast Reading Mode", - _ => "Standard Daylight Reading Mode" - }); - } - } - - // --- Zoom Controls --- - - [RelayCommand] - public void ZoomIn() - { - ZoomMode = PdfViewerZoomMode.Custom; - ZoomLevel = Math.Min(5.0, Math.Round(ZoomLevel + 0.25, 2)); - } - - [RelayCommand] - public void ZoomOut() - { - ZoomMode = PdfViewerZoomMode.Custom; - ZoomLevel = Math.Max(0.25, Math.Round(ZoomLevel - 0.25, 2)); - } - - [RelayCommand] - public void ResetZoom() - { - ZoomMode = PdfViewerZoomMode.Custom; - ZoomLevel = 1.0; - } - - [RelayCommand] - public void FitToWidth() - { - if (ViewportSizeProvider != null) - { - var dims = ViewportSizeProvider(); - if (dims.ViewportWidth > 100) - { - FitToWidthDynamic(dims.ViewportWidth, dims.HorizontalPadding); - return; - } - } - - _isApplyingFitZoom = true; - try - { - ZoomMode = PdfViewerZoomMode.FitWidth; - ZoomLevel = 1.35; - } - finally - { - _isApplyingFitZoom = false; - } - } - - public void FitToWidthDynamic(double viewportWidth, double horizontalPadding = 64.0) - { - if (viewportWidth <= 100) return; - - var page = SelectedPage ?? Pages.FirstOrDefault(p => p.PageNumber == CurrentPageNumber) ?? Pages.FirstOrDefault(); - if (page == null) - { - _isApplyingFitZoom = true; - try - { - ZoomMode = PdfViewerZoomMode.FitWidth; - ZoomLevel = 1.35; - } - finally - { - _isApplyingFitZoom = false; - } - return; - } - - double availableWidth = Math.Max(100.0, viewportWidth - horizontalPadding - 8.0); - double targetWidth = (page.RotationAngle % 180 == 0) ? page.WidthPoints : page.HeightPoints; - - if (IsTwoPageSpreadMode && SelectedSpread != null) - { - if (SelectedSpread.LeftPage != null && SelectedSpread.RightPage != null) - { - double leftW = (SelectedSpread.LeftPage.RotationAngle % 180 == 0) ? SelectedSpread.LeftPage.WidthPoints : SelectedSpread.LeftPage.HeightPoints; - double rightW = (SelectedSpread.RightPage.RotationAngle % 180 == 0) ? SelectedSpread.RightPage.WidthPoints : SelectedSpread.RightPage.HeightPoints; - targetWidth = leftW + rightW; - availableWidth = Math.Max(100.0, availableWidth - 16.0); // 16px gap between pages - } - else - { - var single = SelectedSpread.LeftPage ?? SelectedSpread.RightPage ?? page; - targetWidth = (single.RotationAngle % 180 == 0) ? single.WidthPoints : single.HeightPoints; - } - } - - if (targetWidth > 10.0) - { - double calculatedZoom = Math.Clamp(Math.Round(availableWidth / targetWidth, 2), 0.25, 5.0); - if (calculatedZoom * targetWidth > availableWidth && calculatedZoom > 0.25) - { - calculatedZoom = Math.Max(0.25, Math.Round(calculatedZoom - 0.01, 2)); - } - - _isApplyingFitZoom = true; - try - { - ZoomMode = PdfViewerZoomMode.FitWidth; - ZoomLevel = calculatedZoom; - } - finally - { - _isApplyingFitZoom = false; - } - - StatusMessage = $"Fit to Width ({(int)Math.Round(ZoomLevel * 100)}%)"; - ShowToast($"Fit to Width ({(int)Math.Round(ZoomLevel * 100)}%)"); - } - } - - [RelayCommand] - public void FitToPage() - { - if (ViewportSizeProvider != null) - { - var dims = ViewportSizeProvider(); - if (dims.ViewportWidth > 100 && dims.ViewportHeight > 100) - { - FitToPageDynamic(dims.ViewportWidth, dims.ViewportHeight, dims.HorizontalPadding, dims.VerticalPadding); - return; - } - } - - _isApplyingFitZoom = true; - try - { - ZoomMode = PdfViewerZoomMode.FitPage; - ZoomLevel = 0.95; - } - finally - { - _isApplyingFitZoom = false; - } - } - - public void FitToPageDynamic(double viewportWidth, double viewportHeight, double horizontalPadding = 64.0, double verticalPadding = 64.0) - { - if (viewportWidth <= 100 || viewportHeight <= 100) return; - - var page = SelectedPage ?? Pages.FirstOrDefault(p => p.PageNumber == CurrentPageNumber) ?? Pages.FirstOrDefault(); - if (page == null) - { - _isApplyingFitZoom = true; - try - { - ZoomMode = PdfViewerZoomMode.FitPage; - ZoomLevel = 0.95; - } - finally - { - _isApplyingFitZoom = false; - } - return; - } - - double availableWidth = Math.Max(100.0, viewportWidth - horizontalPadding - 8.0); - // Reserve 36px for page footnote indicator and card vertical spacing - double availableHeight = Math.Max(100.0, viewportHeight - verticalPadding - 36.0); - - double targetWidth = (page.RotationAngle % 180 == 0) ? page.WidthPoints : page.HeightPoints; - double targetHeight = (page.RotationAngle % 180 == 0) ? page.HeightPoints : page.WidthPoints; - - if (IsTwoPageSpreadMode && SelectedSpread != null) - { - if (SelectedSpread.LeftPage != null && SelectedSpread.RightPage != null) - { - double leftW = (SelectedSpread.LeftPage.RotationAngle % 180 == 0) ? SelectedSpread.LeftPage.WidthPoints : SelectedSpread.LeftPage.HeightPoints; - double leftH = (SelectedSpread.LeftPage.RotationAngle % 180 == 0) ? SelectedSpread.LeftPage.HeightPoints : SelectedSpread.LeftPage.WidthPoints; - double rightW = (SelectedSpread.RightPage.RotationAngle % 180 == 0) ? SelectedSpread.RightPage.WidthPoints : SelectedSpread.RightPage.HeightPoints; - double rightH = (SelectedSpread.RightPage.RotationAngle % 180 == 0) ? SelectedSpread.RightPage.HeightPoints : SelectedSpread.RightPage.WidthPoints; - targetWidth = leftW + rightW; - targetHeight = Math.Max(leftH, rightH); - availableWidth = Math.Max(100.0, availableWidth - 16.0); - } - else - { - var single = SelectedSpread.LeftPage ?? SelectedSpread.RightPage ?? page; - targetWidth = (single.RotationAngle % 180 == 0) ? single.WidthPoints : single.HeightPoints; - targetHeight = (single.RotationAngle % 180 == 0) ? single.HeightPoints : single.WidthPoints; - } - } - - if (targetWidth > 10.0 && targetHeight > 10.0) - { - double scaleX = availableWidth / targetWidth; - double scaleY = availableHeight / targetHeight; - double calculatedZoom = Math.Clamp(Math.Round(Math.Min(scaleX, scaleY), 2), 0.25, 5.0); - if ((calculatedZoom * targetWidth > availableWidth || calculatedZoom * targetHeight > availableHeight) && calculatedZoom > 0.25) - { - calculatedZoom = Math.Max(0.25, Math.Round(calculatedZoom - 0.01, 2)); - } - - _isApplyingFitZoom = true; - try - { - ZoomMode = PdfViewerZoomMode.FitPage; - ZoomLevel = calculatedZoom; - } - finally - { - _isApplyingFitZoom = false; - } - - StatusMessage = $"Fit to Page ({(int)Math.Round(ZoomLevel * 100)}%)"; - ShowToast($"Fit to Page ({(int)Math.Round(ZoomLevel * 100)}%)"); - } - } - - [RelayCommand] - public void SetZoomPreset(string? preset) - { - if (string.IsNullOrWhiteSpace(preset)) return; - string clean = preset.Replace("%", "").Trim(); - if (double.TryParse(clean, out double val)) - { - ZoomMode = PdfViewerZoomMode.Custom; - ZoomLevel = Math.Clamp(val / 100.0, 0.25, 5.0); - } - } - - // --- Page Operations & Visual Rotation --- - - [RelayCommand] - public void RotateClockwise() - { - var page = SelectedPage ?? Pages.FirstOrDefault(p => p.PageNumber == CurrentPageNumber) ?? Pages.FirstOrDefault(); - if (page != null) - { - SelectedPage = page; - page.RotationAngle = (page.RotationAngle + 90) % 360; - StatusMessage = $"Page {page.PageNumber} rotated 90° CW ({page.RotationAngle}°)."; - ShowToast($"Page {page.PageNumber} rotated 90° CW ({page.RotationAngle}°)"); - - if (IsFitToPageActive) - { - FitToPage(); - } - else if (IsFitToWidthActive) - { - FitToWidth(); - } - } - } - - [RelayCommand] - public void RotateCounterClockwise() - { - var page = SelectedPage ?? Pages.FirstOrDefault(p => p.PageNumber == CurrentPageNumber) ?? Pages.FirstOrDefault(); - if (page != null) - { - SelectedPage = page; - page.RotationAngle = (page.RotationAngle + 270) % 360; - StatusMessage = $"Page {page.PageNumber} rotated 90° CCW ({page.RotationAngle}°)."; - ShowToast($"Page {page.PageNumber} rotated 90° CCW ({page.RotationAngle}°)"); - - if (IsFitToPageActive) - { - FitToPage(); - } - else if (IsFitToWidthActive) - { - FitToWidth(); - } - } - } - - [RelayCommand] - public void RotateAllPagesClockwise() - { - foreach (var p in Pages) - { - p.RotationAngle = (p.RotationAngle + 90) % 360; - } - StatusMessage = "Rotated all pages 90° clockwise."; - ShowToast("Rotated all pages 90° CW"); - - if (IsFitToPageActive) - { - FitToPage(); - } - else if (IsFitToWidthActive) - { - FitToWidth(); - } - } - - - // --- Sidebar & Layout Commands --- - - [RelayCommand] - public void SelectSidebarTab(string tabName) - { - if (Enum.TryParse(tabName, true, out var tab)) - { - SelectedSidebarTab = tab; - IsSidebarOpen = true; - } - } - - [RelayCommand] - public void ToggleSidebar() - { - IsSidebarOpen = !IsSidebarOpen; - } - - [RelayCommand] - public void ToggleFullscreen() - { - IsFullscreen = !IsFullscreen; - string msg = IsFullscreen ? "Entered Presentation Reading Mode (Esc to exit)" : "Exited Fullscreen Mode"; - ShowToast(msg); - } - - // --- Bridge to Studio & Tools --- - - [RelayCommand] - public void EditInStudio() - { - string? targetPath = null; - if (!string.IsNullOrEmpty(CurrentFilePath) && File.Exists(CurrentFilePath)) - { - targetPath = CurrentFilePath; - } - else if (_currentPdfBytes != null) - { - string tempPath = Path.Combine(Path.GetTempPath(), DocumentTitle); - File.WriteAllBytes(tempPath, _currentPdfBytes); - targetPath = tempPath; - } - - if (targetPath != null) - { - WeakReferenceMessenger.Default.Send(new OpenInEditorMessage(targetPath)); - } - } - - [RelayCommand] - public void RunToolOnDocument(string? toolIdStr) - { - if (!string.IsNullOrEmpty(CurrentFilePath) && File.Exists(CurrentFilePath) && Enum.TryParse(toolIdStr, true, out var toolId)) - { - WeakReferenceMessenger.Default.Send(new RunToolMessage(toolId, CurrentFilePath)); - } - } - - [RelayCommand] - public void BackToHome() - { - WeakReferenceMessenger.Default.Send(new NavigateToHomeMessage()); - } -} - diff --git a/src/PdfEditorApp/ViewModels/PdfViewerViewModel.Rendering.cs b/src/PdfEditorApp/ViewModels/PdfViewerViewModel.Rendering.cs deleted file mode 100644 index 5fc6bb0..0000000 --- a/src/PdfEditorApp/ViewModels/PdfViewerViewModel.Rendering.cs +++ /dev/null @@ -1,468 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using Avalonia.Media.Imaging; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Services; -using SkiaSharp; -using UglyToad.PdfPig.Rendering.Skia; - -namespace PdfEditorApp.ViewModels; - -public partial class PdfViewerViewModel -{ - /// Renders a specific page at the specified scale directly from PDF bytes using Skia. - /// Renders a specific page at the specified scale directly to image bytes. - public byte[]? RenderPageBytesAtScale(int pageNumber, float scale) - { - if (_currentPdfBytes == null) return null; - lock (_renderLock) - { - try - { - var doc = OpenOrReuseDocument(); - if (doc == null) return null; - - using var stream = PdfPigExtensions.GetPageAsPng(doc, pageNumber, scale, 100); - if (stream != null && stream.Length > 0) - { - return stream.ToArray(); - } - } - catch { } - } - return null; - } - - /// Renders a specific page at the specified scale directly from PDF bytes using Skia. - public Bitmap? RenderPageAtScale(int pageNumber, float scale, PdfReaderTheme? theme = null) - { - var bytes = RenderPageBytesAtScale(pageNumber, scale); - if (bytes != null && bytes.Length > 0) - { - try - { - var activeTheme = theme ?? ReadingTheme; - if (activeTheme == PdfReaderTheme.Default) - { - using var ms = new MemoryStream(bytes); - return new Bitmap(ms); - } - - // Apply theme color filter using SkiaSharp - using var stream = new MemoryStream(bytes); - using var skBitmap = SKBitmap.Decode(stream); - if (skBitmap != null) - { - using var themed = ApplyThemeToSkBitmap(skBitmap, activeTheme); - using var img = SKImage.FromBitmap(themed); - using var data = img.Encode(SKEncodedImageFormat.Png, 95); - using var outStream = data.AsStream(); - return new Bitmap(outStream); - } - - using var fallbackMs = new MemoryStream(bytes); - return new Bitmap(fallbackMs); - } - catch { } - } - return null; - } - - public static SKBitmap ApplyThemeToSkBitmap(SKBitmap source, PdfReaderTheme theme) - { - var dest = new SKBitmap(source.Width, source.Height, source.ColorType, source.AlphaType); - using var canvas = new SKCanvas(dest); - using var paint = new SKPaint(); - - if (theme == PdfReaderTheme.Sepia) - { - // Warm eye-care sepia matrix - float[] sepiaMatrix = new float[] - { - 0.393f, 0.769f, 0.189f, 0, 0, - 0.349f, 0.686f, 0.168f, 0, 0, - 0.272f, 0.534f, 0.131f, 0, 0, - 0, 0, 0, 1, 0 - }; - paint.ColorFilter = SKColorFilter.CreateColorMatrix(sepiaMatrix); - } - else if (theme == PdfReaderTheme.Dark) - { - // Comfortable dark mode: converts pure white (1.0) to dark slate (30,41,59) - // and pure black (0.0) to soft off-white (241,245,249) - float scale = -0.827f; - float[] darkMatrix = new float[] - { - scale, 0, 0, 0, 241f / 255f, - 0, scale, 0, 0, 245f / 255f, - 0, 0, scale, 0, 249f / 255f, - 0, 0, 0, 1, 0 - }; - paint.ColorFilter = SKColorFilter.CreateColorMatrix(darkMatrix); - } - else if (theme == PdfReaderTheme.HighContrast) - { - // High contrast accessibility: inverted black background with sharp yellow text - float[] hcMatrix = new float[] - { - -1.0f, 0, 0, 0, 1.0f, - -0.1f, -0.9f, 0, 0, 1.0f, - 0, 0, -1.0f, 0, 40f / 255f, - 0, 0, 0, 1, 0 - }; - paint.ColorFilter = SKColorFilter.CreateColorMatrix(hcMatrix); - } - - canvas.DrawBitmap(source, 0, 0, paint); - return dest; - } - - /// Ensures a page is rendered at the appropriate scale with top priority. - public void EnsurePageRendered(int pageNumber, float? scale = null) - { - var page = Pages.FirstOrDefault(p => p.PageNumber == pageNumber); - if (page == null) return; - - float targetScale = scale ?? Math.Clamp((float)(ZoomLevel * 2.25f), PdfViewerPageItem.BasePageRenderScale, 5.0f); - if (page.Bitmap == null || Math.Abs(page.RenderedScale - targetScale) > 0.5f || page.AppliedReadingTheme != ReadingTheme) - { - // Scrolling fires this repeatedly for the same pages, and a page's Bitmap stays - // null until its render finishes — so without this guard, scrolling back and forth - // queues up redundant renders of pages already being rendered. Since every render - // serializes behind the single render lock, that backlog delays the pages the user - // is actually looking at and makes scrolling feel unresponsive. - if (page.IsRenderLoading) return; - page.IsRenderLoading = true; - Interlocked.Increment(ref _pendingForegroundRenders); - - var theme = ReadingTheme; - Task.Run(() => - { - Bitmap? bmp = null; - try - { - bmp = RenderPageAtScale(pageNumber, targetScale, theme); - } - finally - { - // Released on the worker thread, not inside the dispatcher callback, so the - // background sweep can resume as soon as the render itself is done rather - // than waiting on UI-thread scheduling. - Interlocked.Decrement(ref _pendingForegroundRenders); - - Avalonia.Threading.Dispatcher.UIThread.Post(() => - { - if (bmp != null) - { - page.Bitmap = bmp; - page.RenderedScale = targetScale; - page.AppliedReadingTheme = theme; - } - page.IsRenderLoading = false; - }); - } - }); - } - } - - private void ReRenderActivePagesForTheme() - { - if (Pages == null || Pages.Count == 0) return; - - foreach (var page in Pages) - { - if (page.Bitmap != null) - { - EnsurePageRendered(page.PageNumber, page.RenderedScale); - } - } - - if (IsSinglePageMode && SelectedPage != null) - { - EnsurePageRendered(SelectedPage.PageNumber); - } - else if (IsTwoPageSpreadMode && SelectedSpread != null) - { - if (SelectedSpread.LeftPage != null) EnsurePageRendered(SelectedSpread.LeftPage.PageNumber); - if (SelectedSpread.RightPage != null) EnsurePageRendered(SelectedSpread.RightPage.PageNumber); - } - } - - /// - /// Tells the viewer which pages are actually on screen right now (called from the view's - /// scroll handler). Renders full-resolution bitmaps for the visible range plus a small - /// lookahead, and releases them for pages that have scrolled well out of view — so memory - /// stays bounded by what's near the viewport instead of growing with document length. - /// - public void RequestPagesVisible(int firstPageNumber, int lastPageNumber) - { - if (Pages.Count == 0) return; - - // Small lookahead by design. Every render serializes behind a single lock, so a wide - // window just builds a queue that delays the pages actually on screen. - const int renderLookahead = 2; - const int keepAliveLookahead = 40; - - int renderFirst = Math.Max(1, firstPageNumber - renderLookahead); - int renderLast = Math.Min(Pages.Count, lastPageNumber + renderLookahead); - - if (renderFirst == _lastVisibleFirstPage && renderLast == _lastVisibleLastPage) return; - _lastVisibleFirstPage = renderFirst; - _lastVisibleLastPage = renderLast; - - // 1. On-screen pages first. Order matters: renders are serialized, so anything queued - // ahead of the visible pages directly delays what the user is waiting to see. This - // used to iterate from (firstVisible - lookahead) upward, which meant the pages just - // ABOVE the viewport were always rasterized before the page being looked at. - for (int p = firstPageNumber; p <= lastPageNumber; p++) - { - EnsurePageRendered(p); - } - - // 2. Then the lookahead, nearest-first outward. - for (int d = 1; d <= renderLookahead; d++) - { - int before = firstPageNumber - d; - if (before >= 1) EnsurePageRendered(before); - - int after = lastPageNumber + d; - if (after <= Pages.Count) EnsurePageRendered(after); - } - - // Note: text geometry is deliberately NOT warmed here. It's as expensive as a render - // and shares the same lock, so warming it for every page in the window starved the - // visible pages' renders. It stays on-demand (first pointer interaction with a page). - - // 3. Release bitmaps for pages far outside the viewport. - int keepFirst = Math.Max(1, firstPageNumber - keepAliveLookahead); - int keepLast = Math.Min(Pages.Count, lastPageNumber + keepAliveLookahead); - - for (int i = 0; i < Pages.Count; i++) - { - int pageNum = i + 1; - if (pageNum < keepFirst || pageNum > keepLast) - { - // The "Fallback when loading" placeholder shows again if the user scrolls back; - // ThumbnailBitmap is left alone since the thumbnail rail may show a wider - // range than the main viewport and thumbnails are cheap to keep resident. - Pages[i].Bitmap = null; - } - } - } - - private void StartBackgroundWorker(CancellationToken ct) - { - Task.Run(async () => - { - if (_currentPdfBytes == null) return; - - // 1. Asynchronously extract Bookmarks/Outlines without blocking initial page display - try - { - List? bookmarksList = null; - lock (_renderLock) - { - var doc = OpenOrReuseDocument(); - if (doc != null && doc.TryGetBookmarks(out var bookmarks) && bookmarks != null && bookmarks.Roots != null) - { - bookmarksList = new List(); - ExtractBookmarksRecursive(bookmarks.Roots, bookmarksList); - } - } - - if (bookmarksList != null && bookmarksList.Count > 0 && !ct.IsCancellationRequested) - { - Avalonia.Threading.Dispatcher.UIThread.Post(() => - { - Bookmarks.Clear(); - foreach (var b in bookmarksList) Bookmarks.Add(b); - OnPropertyChanged(nameof(HasBookmarks)); - }); - } - } - catch { } - - // 2. Progressively build thumbnails and extract accurate text / geometry for every - // page — full-resolution page bitmaps are NOT rendered here (beyond the first - // screenful below); those are rendered on demand for the pages actually scrolled - // into view (see RequestPagesVisible), otherwise a large document would render - // every page's full-res bitmap up front and hold them all in memory regardless of - // whether they're ever looked at. - const int eagerFirstScreenfulPages = 8; - for (int i = 1; i <= Pages.Count; i++) - { - if (ct.IsCancellationRequested) return; - - int pageNum = i; - var page = Pages.FirstOrDefault(p => p.PageNumber == pageNum); - if (page != null) - { - // Stand aside whenever the user is waiting on a visible page. Everything in - // this sweep competes for the same render lock, and over a long document - // it's minutes of work — without yielding, a scrolled-to page's render sits - // behind hundreds of thumbnail renders and text extractions and takes so - // long to arrive that scrolling looks like it does nothing at all. - if (pageNum > eagerFirstScreenfulPages) - { - await WaitForForegroundIdleAsync(ct); - if (ct.IsCancellationRequested) return; - } - - // Render a bounded first screenful eagerly and unconditionally — a safety - // net independent of the view's own viewport/scroll wiring, so the pages a - // user sees immediately after opening a document are never left waiting on - // that wiring alone. - if (pageNum <= eagerFirstScreenfulPages && page.Bitmap == null) - { - var eagerBmp = RenderPageAtScale(pageNum, PdfViewerPageItem.BasePageRenderScale); - if (eagerBmp != null && !ct.IsCancellationRequested) - { - Avalonia.Threading.Dispatcher.UIThread.Post(() => - { - page.Bitmap = eagerBmp; - page.RenderedScale = PdfViewerPageItem.BasePageRenderScale; - }); - } - } - - // Render lightweight thumbnail (0.4f scale) if needed - if (page.ThumbnailBitmap == null) - { - var thumbBmp = RenderPageAtScale(pageNum, 0.4f); - if (thumbBmp != null && !ct.IsCancellationRequested) - { - Avalonia.Threading.Dispatcher.UIThread.Post(() => - { - page.ThumbnailBitmap = thumbBmp; - }); - } - } - - // Extract accurate dimensions and text if page > 1 - if (pageNum > 1 && (page.Words.Count == 0 || string.IsNullOrEmpty(page.ExtractedText))) - { - try - { - string? txt = null; - List? words = null; - List? lines = null; - double w = 0, h = 0; - int rot = 0; - - lock (_renderLock) - { - var doc = OpenOrReuseDocument(); - if (doc != null && pageNum <= doc.NumberOfPages) - { - var p = doc.GetPage(pageNum); - (txt, words, lines) = ExtractPageTextGeometry(p); - w = Math.Max(100, p.Width); - h = Math.Max(100, p.Height); - rot = (int)p.Rotation.Value; - } - } - - if ((words == null || words.Count == 0) && w > 0 && h > 0) - { - var (ocrTxt, ocrWords, ocrLines) = ExtractOcrPageTextGeometry(pageNum, w, h); - if (ocrWords.Count > 0) - { - txt = ocrTxt; - words = ocrWords; - lines = ocrLines; - } - } - - string summary = ""; - if (!string.IsNullOrWhiteSpace(txt)) - { - var firstLine = txt.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries).FirstOrDefault() ?? ""; - summary = firstLine.Length > 50 ? firstLine.Substring(0, 50) + "..." : firstLine; - } - - if (txt != null && !ct.IsCancellationRequested) - { - Avalonia.Threading.Dispatcher.UIThread.Post(() => - { - page.WidthPoints = w; - page.HeightPoints = h; - page.RotationAngle = rot; - page.ExtractedText = txt; - page.Words = words!; - page.TextLines = lines!; - page.PageSummary = summary; - }); - } - } - catch { } - } - } - - await Task.Yield(); - } - }, ct); - } - - private void RebuildPageSpreads() - { - PageSpreads.Clear(); - if (Pages.Count == 0) return; - - // Page 1 is Cover (Alone on right or single spread) - int spreadIdx = 1; - var coverSpread = new PdfViewerPageSpreadItem - { - SpreadIndex = spreadIdx++, - LeftPage = null, - RightPage = Pages[0], - SpreadLabel = "Page 1 (Cover)", - IsSelected = true - }; - PageSpreads.Add(coverSpread); - - // Subsequent pages paired (2-3, 4-5, etc.) - for (int i = 1; i < Pages.Count; i += 2) - { - var left = Pages[i]; - var right = (i + 1 < Pages.Count) ? Pages[i + 1] : null; - string lbl = right != null ? $"Pages {left.PageNumber} - {right.PageNumber}" : $"Page {left.PageNumber}"; - - PageSpreads.Add(new PdfViewerPageSpreadItem - { - SpreadIndex = spreadIdx++, - LeftPage = left, - RightPage = right, - SpreadLabel = lbl, - IsSelected = false - }); - } - - SelectedSpread = PageSpreads.FirstOrDefault(); - } - - private void UpdateSelectedSpreadForPage(int pageNum) - { - if (PageSpreads.Count == 0) return; - - foreach (var s in PageSpreads) - { - bool match = (s.LeftPage?.PageNumber == pageNum || s.RightPage?.PageNumber == pageNum); - s.IsSelected = match; - if (match) - { - SelectedSpread = s; - } - } - - if (IsTwoPageSpreadMode && SelectedSpread != null) - { - if (SelectedSpread.LeftPage != null) EnsurePageRendered(SelectedSpread.LeftPage.PageNumber); - if (SelectedSpread.RightPage != null) EnsurePageRendered(SelectedSpread.RightPage.PageNumber); - } - } - -} diff --git a/src/PdfEditorApp/ViewModels/PdfViewerViewModel.Search.cs b/src/PdfEditorApp/ViewModels/PdfViewerViewModel.Search.cs deleted file mode 100644 index df31437..0000000 --- a/src/PdfEditorApp/ViewModels/PdfViewerViewModel.Search.cs +++ /dev/null @@ -1,143 +0,0 @@ -using System; -using System.Linq; -using System.Text.RegularExpressions; -using CommunityToolkit.Mvvm.Input; - -namespace PdfEditorApp.ViewModels; - -public partial class PdfViewerViewModel -{ - // --- Text Search & Find in Document --- - - [RelayCommand] - public void ToggleSearchBar() - { - IsSearchBarVisible = !IsSearchBarVisible; - if (IsSearchBarVisible) - { - SelectedSidebarTab = PdfViewerSidebarTab.Search; - IsSidebarOpen = true; - } - } - - [RelayCommand] - public void PerformSearch() - { - SearchResults.Clear(); - if (string.IsNullOrWhiteSpace(SearchQuery)) - { - TotalMatchesCount = 0; - CurrentMatchIndex = 0; - SearchStatusText = string.Empty; - OnPropertyChanged(nameof(HasSearchResults)); - return; - } - - string q = SearchQuery.Trim(); - int matchIdx = 1; - - if (SearchWholeWord) - { - var regexOptions = SearchMatchCase ? RegexOptions.None : RegexOptions.IgnoreCase; - string pattern = $@"\b{Regex.Escape(q)}\b"; - - foreach (var page in Pages) - { - if (string.IsNullOrEmpty(page.ExtractedText)) continue; - - var matches = Regex.Matches(page.ExtractedText, pattern, regexOptions); - foreach (Match m in matches) - { - int snippetStart = Math.Max(0, m.Index - 25); - int snippetLen = Math.Min(page.ExtractedText.Length - snippetStart, m.Length + 50); - string snippet = "..." + page.ExtractedText.Substring(snippetStart, snippetLen).Replace('\r', ' ').Replace('\n', ' ') + "..."; - - SearchResults.Add(new PdfViewerSearchMatch - { - PageNumber = page.PageNumber, - Snippet = snippet, - MatchIndex = matchIdx++ - }); - } - } - } - else - { - var comp = SearchMatchCase ? StringComparison.Ordinal : StringComparison.OrdinalIgnoreCase; - foreach (var page in Pages) - { - if (string.IsNullOrEmpty(page.ExtractedText)) continue; - - int startIndex = 0; - while ((startIndex = page.ExtractedText.IndexOf(q, startIndex, comp)) != -1) - { - int snippetStart = Math.Max(0, startIndex - 25); - int snippetLen = Math.Min(page.ExtractedText.Length - snippetStart, q.Length + 50); - string snippet = "..." + page.ExtractedText.Substring(snippetStart, snippetLen).Replace('\r', ' ').Replace('\n', ' ') + "..."; - - SearchResults.Add(new PdfViewerSearchMatch - { - PageNumber = page.PageNumber, - Snippet = snippet, - MatchIndex = matchIdx++ - }); - - startIndex += q.Length; - } - } - } - - TotalMatchesCount = SearchResults.Count; - CurrentMatchIndex = TotalMatchesCount > 0 ? 1 : 0; - SearchStatusText = TotalMatchesCount > 0 ? $"{CurrentMatchIndex} of {TotalMatchesCount} matches" : "No matches found"; - OnPropertyChanged(nameof(HasSearchResults)); - - if (TotalMatchesCount > 0) - { - JumpToMatch(SearchResults[0]); - } - } - - [RelayCommand] - public void NextMatch() - { - if (TotalMatchesCount == 0) return; - CurrentMatchIndex = (CurrentMatchIndex % TotalMatchesCount) + 1; - SearchStatusText = $"{CurrentMatchIndex} of {TotalMatchesCount} matches"; - JumpToMatch(SearchResults[CurrentMatchIndex - 1]); - } - - [RelayCommand] - public void PreviousMatch() - { - if (TotalMatchesCount == 0) return; - CurrentMatchIndex = (CurrentMatchIndex - 2 + TotalMatchesCount) % TotalMatchesCount + 1; - SearchStatusText = $"{CurrentMatchIndex} of {TotalMatchesCount} matches"; - JumpToMatch(SearchResults[CurrentMatchIndex - 1]); - } - - [RelayCommand] - public void JumpToMatch(PdfViewerSearchMatch? match) - { - if (match == null) return; - int pageIdx = match.PageNumber - 1; - if (pageIdx >= 0 && pageIdx < Pages.Count) - { - SelectedPage = Pages[pageIdx]; - CurrentPageNumber = match.PageNumber; - RequestScrollToPage(match.PageNumber); - } - } - - [RelayCommand] - public void ClearSearch() - { - SearchQuery = string.Empty; - SearchResults.Clear(); - TotalMatchesCount = 0; - CurrentMatchIndex = 0; - SearchStatusText = string.Empty; - OnPropertyChanged(nameof(HasSearchResults)); - } - -} diff --git a/src/PdfEditorApp/ViewModels/PdfViewerViewModel.Selection.cs b/src/PdfEditorApp/ViewModels/PdfViewerViewModel.Selection.cs deleted file mode 100644 index 2805aea..0000000 --- a/src/PdfEditorApp/ViewModels/PdfViewerViewModel.Selection.cs +++ /dev/null @@ -1,516 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Linq; -using System.Text; -using System.Threading; -using System.Threading.Tasks; -using Avalonia; -using Avalonia.Input.Platform; -using Avalonia.Media.Imaging; -using CommunityToolkit.Mvvm.Input; -using PdfEditorApp.Services; -using PdfEditorApp.Services.Ocr; -using SkiaSharp; - -namespace PdfEditorApp.ViewModels; - -public partial class PdfViewerViewModel -{ - // --- Interactive Selection & Clipboard Operations --- - - [RelayCommand] - public async Task CopySelectedTextAsync() - { - if (string.IsNullOrWhiteSpace(ActiveSelectedText)) - { - if (SelectedPage != null && !string.IsNullOrWhiteSpace(SelectedPage.ExtractedText)) - { - await CopyPageTextAsync(); - } - return; - } - - if (Avalonia.Application.Current?.ApplicationLifetime is Avalonia.Controls.ApplicationLifetimes.IClassicDesktopStyleApplicationLifetime desktop && desktop.MainWindow != null) - { - var topLevel = Avalonia.Controls.TopLevel.GetTopLevel(desktop.MainWindow); - if (topLevel?.Clipboard != null) - { - await topLevel.Clipboard.SetTextAsync(ActiveSelectedText); - string snippet = ActiveSelectedText.Length > 40 ? ActiveSelectedText.Substring(0, 40) + "..." : ActiveSelectedText; - ShowToast($"Copied: \"{snippet}\""); - } - } - } - - [RelayCommand] - public async Task CopySelectedCitationAsync() - { - if (string.IsNullOrWhiteSpace(ActiveSelectedText)) return; - - string citation = $"\"{ActiveSelectedText}\"\n— Page {ActiveSelectedPageNumber}, {DocumentTitle}"; - if (Avalonia.Application.Current?.ApplicationLifetime is Avalonia.Controls.ApplicationLifetimes.IClassicDesktopStyleApplicationLifetime desktop && desktop.MainWindow != null) - { - var topLevel = Avalonia.Controls.TopLevel.GetTopLevel(desktop.MainWindow); - if (topLevel?.Clipboard != null) - { - await topLevel.Clipboard.SetTextAsync(citation); - ShowToast("Copied citation with page reference"); - } - } - } - - [RelayCommand] - public void SearchSelectedText() - { - if (string.IsNullOrWhiteSpace(ActiveSelectedText)) return; - SearchQuery = ActiveSelectedText.Trim(); - IsSearchBarVisible = true; - SelectedSidebarTab = PdfViewerSidebarTab.Search; - IsSidebarOpen = true; - PerformSearch(); - } - - [RelayCommand] - public void SearchWebSelectedText() - { - if (string.IsNullOrWhiteSpace(ActiveSelectedText)) return; - try - { - string query = Uri.EscapeDataString(ActiveSelectedText.Trim()); - string url = $"https://www.google.com/search?q={query}"; - var psi = new System.Diagnostics.ProcessStartInfo - { - FileName = url, - UseShellExecute = true - }; - System.Diagnostics.Process.Start(psi); - } - catch { } - } - - [RelayCommand] - public void SelectAllPageText() - { - var page = SelectedPage ?? Pages.FirstOrDefault(p => p.PageNumber == CurrentPageNumber); - if (page == null) return; - page.SelectAll(); - ActiveSelectedText = page.SelectedText; - ActiveSelectedPageNumber = page.PageNumber; - HasTextSelection = !string.IsNullOrEmpty(ActiveSelectedText); - ShowToast($"Selected all text on Page {page.PageNumber}"); - } - - [RelayCommand] - public void ClearSelection() - { - ActiveSelectedText = string.Empty; - HasTextSelection = false; - LastSelectedAreaRect = null; - foreach (var p in Pages) - { - p.ClearSelection(); - } - } - - [RelayCommand] - public void SetTextSelectionMode() - { - SelectionMode = PdfViewerSelectionMode.Text; - ShowToast("Text Selection Mode (I-Beam)"); - } - - [RelayCommand] - public void SetAreaSelectionMode() - { - SelectionMode = PdfViewerSelectionMode.Area; - ShowToast("Area / Marquee Selection Mode (Box / Snapshot)"); - } - - [RelayCommand] - public void ToggleSelectionMode() - { - if (SelectionMode == PdfViewerSelectionMode.Text) - SetAreaSelectionMode(); - else - SetTextSelectionMode(); - } - - [RelayCommand] - public void DismissScannedBanner() - { - IsScannedBannerDismissed = true; - } - - [RelayCommand] - public void CancelOcr() - { - _ocrCts?.Cancel(); - IsOcrRunning = false; - OcrStatusText = "Cancelled"; - ShowToast("OCR cancelled."); - } - - [RelayCommand] - public async Task RecognizeActivePageOcrAsync() - { - var page = SelectedPage ?? Pages.FirstOrDefault(p => p.PageNumber == CurrentPageNumber) ?? Pages.FirstOrDefault(); - if (page == null || IsOcrRunning) return; - - _ocrCts?.Cancel(); - _ocrCts = new CancellationTokenSource(); - var ct = _ocrCts.Token; - - IsOcrRunning = true; - OcrProgress = 15; - OcrStatusText = $"Recognizing text on Page {page.PageNumber}..."; - - try - { - await Task.Run(() => - { - double width = page.WidthPoints > 0 ? page.WidthPoints : 612; - double height = page.HeightPoints > 0 ? page.HeightPoints : 792; - var (ocrText, ocrWords, ocrLines) = ExtractOcrPageTextGeometry(page.PageNumber, width, height); - - if (ocrWords.Count > 0) - { - page.Words = ocrWords; - page.TextLines = ocrLines; - page.ExtractedText = ocrText; - } - }, ct); - - OcrProgress = 100; - IsCurrentPageScanned = page.Words.Count == 0; - page.NotifySelectionChanged(); - ShowToast($"OCR Complete: {page.Words.Count} words recognized on Page {page.PageNumber}."); - } - catch (OperationCanceledException) - { - ShowToast("OCR cancelled."); - } - catch (Exception ex) - { - ShowToast($"OCR failed: {ex.Message}"); - } - finally - { - IsOcrRunning = false; - OcrStatusText = string.Empty; - } - } - - [RelayCommand] - public async Task RecognizeDocumentOcrAsync() - { - if (Pages.Count == 0 || IsOcrRunning) return; - - _ocrCts?.Cancel(); - _ocrCts = new CancellationTokenSource(); - var ct = _ocrCts.Token; - - IsOcrRunning = true; - int total = Pages.Count; - int recognizedPages = 0; - int totalWords = 0; - - try - { - for (int i = 0; i < total; i++) - { - ct.ThrowIfCancellationRequested(); - var page = Pages[i]; - int pageNum = page.PageNumber; - OcrProgress = (double)(i + 1) / total * 100.0; - OcrStatusText = $"Recognizing text... Page {pageNum} of {total} ({(int)OcrProgress}%)"; - - if (page.Words.Count == 0) - { - await Task.Run(() => - { - double width = page.WidthPoints > 0 ? page.WidthPoints : 612; - double height = page.HeightPoints > 0 ? page.HeightPoints : 792; - var (ocrText, ocrWords, ocrLines) = ExtractOcrPageTextGeometry(pageNum, width, height); - if (ocrWords.Count > 0) - { - page.Words = ocrWords; - page.TextLines = ocrLines; - page.ExtractedText = ocrText; - Interlocked.Add(ref totalWords, ocrWords.Count); - Interlocked.Increment(ref recognizedPages); - } - }, ct); - - page.NotifySelectionChanged(); - } - } - - IsScannedDocument = false; - if (SelectedPage != null) - { - IsCurrentPageScanned = SelectedPage.Words.Count == 0; - } - ShowToast($"OCR Complete: {totalWords} words recognized across {recognizedPages} scanned page(s)."); - } - catch (OperationCanceledException) - { - ShowToast("OCR processing cancelled."); - } - catch (Exception ex) - { - ShowToast($"OCR error: {ex.Message}"); - } - finally - { - IsOcrRunning = false; - OcrStatusText = string.Empty; - } - } - - [RelayCommand] - public async Task RecognizeSelectedTextOcrAsync() - { - var page = SelectedPage ?? Pages.FirstOrDefault(p => p.PageNumber == CurrentPageNumber); - if (page == null || IsOcrRunning) return; - - // Determine bounding box of selection - Rect targetRect = default; - if (LastSelectedAreaRect.HasValue && LastSelectedAreaRect.Value.Width > 5 && LastSelectedAreaRect.Value.Height > 5) - { - targetRect = LastSelectedAreaRect.Value; - } - else if (page.SelectionRects.Count > 0) - { - double minX = page.SelectionRects.Min(r => r.Left); - double minY = page.SelectionRects.Min(r => r.Top); - double maxX = page.SelectionRects.Max(r => r.Right); - double maxY = page.SelectionRects.Max(r => r.Bottom); - targetRect = new Rect(minX, minY, Math.Max(5, maxX - minX), Math.Max(5, maxY - minY)); - } - - if (targetRect.Width <= 2 || targetRect.Height <= 2) - { - await RecognizeActivePageOcrAsync(); - return; - } - - IsOcrRunning = true; - OcrStatusText = "Recognizing selection with OCR..."; - OcrProgress = 30; - - try - { - string ocrText = await ExtractOcrTextFromRegionAsync(page, targetRect, forceOcr: true); - if (!string.IsNullOrWhiteSpace(ocrText)) - { - page.SelectedText = ocrText; - ActiveSelectedText = ocrText; - HasTextSelection = true; - ShowToast("Text recognized with OCR."); - } - else - { - ShowToast("OCR did not detect text in the selected area."); - } - } - catch (Exception ex) - { - ShowToast($"OCR failed: {ex.Message}"); - } - finally - { - IsOcrRunning = false; - OcrStatusText = string.Empty; - } - } - - public async Task ExtractOcrTextFromRegionAsync(PdfViewerPageItem page, Rect region, bool forceOcr = false) - { - if (page == null || region.Width <= 2 || region.Height <= 2) return string.Empty; - - // If words already exist and not forced, check if they are valid readable text - if (!forceOcr && page.Words.Count > 0) - { - var intersectingWords = page.Words - .Where(w => w.Bounds.Intersects(region)) - .OrderBy(w => w.Bounds.Top) - .ThenBy(w => w.Bounds.Left) - .ToList(); - - if (intersectingWords.Count > 0) - { - string combined = string.Join(" ", intersectingWords.Select(w => w.Text)); - if (!IsGarbledText(combined)) - { - return combined; - } - } - } - - // Targeted OCR on cropped rectangle - try - { - var ocrProvider = CompositeOcrProvider.Default; - if (!ocrProvider.IsAvailable) return string.Empty; - - const float ocrScale = 2.0f; - byte[]? pagePng = RenderPageBytesAtScale(page.PageNumber, ocrScale); - if (pagePng == null || pagePng.Length == 0) return string.Empty; - - byte[]? croppedBytes = await Task.Run(() => - { - using var ms = new MemoryStream(pagePng); - using var codec = SKCodec.Create(ms); - if (codec == null) return null; - using var origBitmap = SKBitmap.Decode(codec); - if (origBitmap == null) return null; - - int cropX = Math.Clamp((int)(region.X * ocrScale), 0, Math.Max(0, origBitmap.Width - 1)); - int cropY = Math.Clamp((int)(region.Y * ocrScale), 0, Math.Max(0, origBitmap.Height - 1)); - int cropW = Math.Clamp((int)(region.Width * ocrScale), 1, origBitmap.Width - cropX); - int cropH = Math.Clamp((int)(region.Height * ocrScale), 1, origBitmap.Height - cropY); - - using var cropped = new SKBitmap(); - origBitmap.ExtractSubset(cropped, new SKRectI(cropX, cropY, cropX + cropW, cropY + cropH)); - using var image = SKImage.FromBitmap(cropped); - using var data = image.Encode(SKEncodedImageFormat.Png, 100); - return data.ToArray(); - }); - - if (croppedBytes == null || croppedBytes.Length == 0) return string.Empty; - - var ocrResult = await ocrProvider.RecognizeTextAsync(croppedBytes); - if (ocrResult.Success && !string.IsNullOrWhiteSpace(ocrResult.FullText)) - { - // Register newly extracted words into page geometry so they become permanently selectable - int wIdx = page.Words.Count; - foreach (var ow in ocrResult.Words) - { - double wx = region.X + (ow.NormalizedBounds.X * region.Width); - double wy = region.Y + (ow.NormalizedBounds.Y * region.Height); - double ww = Math.Max(1, ow.NormalizedBounds.Width * region.Width); - double wh = Math.Max(1, ow.NormalizedBounds.Height * region.Height); - - page.Words.Add(new PdfViewerWordItem - { - Text = ow.Text, - Bounds = new Rect(wx, wy, ww, wh), - WordIndex = wIdx++ - }); - } - - return ocrResult.FullText.Trim(); - } - } - catch { } - - return string.Empty; - } - - [RelayCommand] - public async Task CopySelectedAreaImageAsync() - { - var page = SelectedPage ?? Pages.FirstOrDefault(p => p.PageNumber == ActiveSelectedPageNumber); - if (page == null || page.SelectionRects.Count == 0) return; - - var region = page.SelectionRects[0]; - if (region.Width <= 2 || region.Height <= 2) return; - - const float snapshotScale = 2.0f; - byte[]? pagePng = RenderPageBytesAtScale(page.PageNumber, snapshotScale); - if (pagePng == null || pagePng.Length == 0) return; - - byte[]? croppedBytes = await Task.Run(() => - { - try - { - using var ms = new MemoryStream(pagePng); - using var codec = SKCodec.Create(ms); - if (codec == null) return null; - using var origBitmap = SKBitmap.Decode(codec); - if (origBitmap == null) return null; - - int cropX = Math.Clamp((int)(region.X * snapshotScale), 0, Math.Max(0, origBitmap.Width - 1)); - int cropY = Math.Clamp((int)(region.Y * snapshotScale), 0, Math.Max(0, origBitmap.Height - 1)); - int cropW = Math.Clamp((int)(region.Width * snapshotScale), 1, origBitmap.Width - cropX); - int cropH = Math.Clamp((int)(region.Height * snapshotScale), 1, origBitmap.Height - cropY); - - using var cropped = new SKBitmap(); - origBitmap.ExtractSubset(cropped, new SKRectI(cropX, cropY, cropX + cropW, cropY + cropH)); - using var image = SKImage.FromBitmap(cropped); - using var data = image.Encode(SKEncodedImageFormat.Png, 100); - return data.ToArray(); - } - catch { return null; } - }); - - if (croppedBytes != null && croppedBytes.Length > 0) - { - if (Avalonia.Application.Current?.ApplicationLifetime is Avalonia.Controls.ApplicationLifetimes.IClassicDesktopStyleApplicationLifetime desktop && desktop.MainWindow != null) - { - var topLevel = Avalonia.Controls.TopLevel.GetTopLevel(desktop.MainWindow); - if (topLevel?.Clipboard != null) - { - string tempPng = Path.Combine(Path.GetTempPath(), $"PdfSnapshot_{Guid.NewGuid():N}.png"); - await File.WriteAllBytesAsync(tempPng, croppedBytes); - await topLevel.Clipboard.SetTextAsync(tempPng); - ShowToast($"Snapshot saved to {Path.GetFileName(tempPng)}"); - } - } - } - } - - [RelayCommand] - public async Task CopyPageTextAsync() - { - if (SelectedPage == null || string.IsNullOrWhiteSpace(SelectedPage.ExtractedText)) - { - ShowToast("No text on current page to copy."); - return; - } - - if (Avalonia.Application.Current?.ApplicationLifetime is Avalonia.Controls.ApplicationLifetimes.IClassicDesktopStyleApplicationLifetime desktop && desktop.MainWindow != null) - { - var topLevel = Avalonia.Controls.TopLevel.GetTopLevel(desktop.MainWindow); - if (topLevel?.Clipboard != null) - { - await topLevel.Clipboard.SetTextAsync(SelectedPage.ExtractedText); - ShowToast($"Copied all text from Page {SelectedPage.PageNumber} to Clipboard."); - } - } - } - - [RelayCommand] - public async Task CopyAllDocumentTextAsync() - { - var sb = new StringBuilder(); - foreach (var page in Pages) - { - if (!string.IsNullOrWhiteSpace(page.ExtractedText)) - { - sb.AppendLine($"--- Page {page.PageNumber} ---"); - sb.AppendLine(page.ExtractedText); - sb.AppendLine(); - } - } - - if (sb.Length == 0) - { - ShowToast("No text found in document."); - return; - } - - if (Avalonia.Application.Current?.ApplicationLifetime is Avalonia.Controls.ApplicationLifetimes.IClassicDesktopStyleApplicationLifetime desktop && desktop.MainWindow != null) - { - var topLevel = Avalonia.Controls.TopLevel.GetTopLevel(desktop.MainWindow); - if (topLevel?.Clipboard != null) - { - await topLevel.Clipboard.SetTextAsync(sb.ToString()); - ShowToast($"Copied text from all {Pages.Count} pages to Clipboard."); - } - } - } - -} diff --git a/src/PdfEditorApp/ViewModels/PdfViewerViewModel.cs b/src/PdfEditorApp/ViewModels/PdfViewerViewModel.cs deleted file mode 100644 index 5cd23dc..0000000 --- a/src/PdfEditorApp/ViewModels/PdfViewerViewModel.cs +++ /dev/null @@ -1,600 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using Avalonia; -using Avalonia.Platform.Storage; -using CommunityToolkit.Mvvm.ComponentModel; -using CommunityToolkit.Mvvm.Messaging; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Messages; -using PdfEditorApp.Models; -using PdfEditorApp.Services; -using PdfEditorApp.Services.Tools.Core; -using UglyToad.PdfPig; -using UglyToad.PdfPig.Rendering.Skia; - -namespace PdfEditorApp.ViewModels; - -/// -/// Professional, Adobe Acrobat-style standalone PDF Reader & Viewer ViewModel. -/// Features continuous scroll, single-page, and two-page spread viewing, sharp Skia rendering, -/// eye-comfort reading themes (Sepia, Night/Dark, High Contrast), real page thumbnails, -/// document outline / bookmarks, in-document search, annotations, and seamless bridge to FryPDF Editor. -/// -public partial class PdfViewerViewModel : ViewModelBase -{ - private CancellationTokenSource? _renderCts; - private CancellationTokenSource? _zoomDebounceCts; - private CancellationTokenSource? _backgroundRenderCts; - private readonly object _renderLock = new(); - private byte[]? _currentPdfBytes; - private string? _currentPassword; - private int _lastVisibleFirstPage = -1; - private int _lastVisibleLastPage = -1; - - /// - /// Count of in-flight renders for pages the user is actually looking at. Every rasterization - /// and text extraction serializes behind (the shared PdfPig document - /// is not thread-safe), so the whole-document background sweep must stand aside while this is - /// non-zero — otherwise a visible page's render queues behind hundreds of background jobs and - /// effectively never arrives. - /// - private int _pendingForegroundRenders; - - /// Parks background sweep work while user-visible renders are outstanding. - private async Task WaitForForegroundIdleAsync(CancellationToken ct) - { - while (!ct.IsCancellationRequested && Volatile.Read(ref _pendingForegroundRenders) > 0) - { - try - { - await Task.Delay(40, ct); - } - catch (TaskCanceledException) - { - return; - } - } - } - - /// - /// The currently-open document, kept alive and reused for every on-demand page render and - /// geometry extraction — opening/parsing a large PDF from bytes is expensive, and doing it - /// fresh on every single page request (as this used to) meant every page you touched paid - /// a whole-document re-parse instead of just the cost of that one page. Always access under - /// ; PdfPig documents aren't safe for concurrent multi-thread use. - /// - private PdfDocument? _openDocument; - - /// Returns the shared open document for , opening it - /// (with the same repair fallback used elsewhere) if this is the first access since the - /// document loaded. Caller must hold . - private PdfDocument? OpenOrReuseDocument() - { - if (_openDocument != null) return _openDocument; - if (_currentPdfBytes == null) return null; - - var parsingOptions = new ParsingOptions(); - if (!string.IsNullOrEmpty(_currentPassword)) - { - parsingOptions.Password = _currentPassword; - } - - PdfDocument? doc = null; - try - { - doc = PdfDocument.Open(_currentPdfBytes, parsingOptions); - } - catch - { - try - { - byte[] repaired = PdfFileHelper.SalvageAndRepairPdfBytes(_currentPdfBytes); - doc = PdfDocument.Open(repaired, parsingOptions); - } - catch - { - return null; - } - } - - try { PdfPigExtensions.AddSkiaPageFactory(doc); } catch { } - _openDocument = doc; - return doc; - } - - public IStorageProvider? StorageProvider { get; set; } - - // --- Events --- - public event Action? ScrollToPageRequested; - - /// - /// Broadcasts a user-facing toast notification via WeakReferenceMessenger. - /// - public void ShowToast(string message, ToastNotificationType type = ToastNotificationType.Primary, string? iconKind = null) - { - WeakReferenceMessenger.Default.Send(new ShowToastMessage(message, type, iconKind)); - } - - // --- Observable Properties --- - - [ObservableProperty] - private string _currentFilePath = string.Empty; - - [ObservableProperty] - private string _documentTitle = "Document.pdf"; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(PageNavigationDisplay))] - private int _currentPageNumber = 1; - - [ObservableProperty] - private string _jumpPageText = "1"; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(PageNavigationDisplay))] - private int _totalPagesCount = 0; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(ZoomPercentageText))] - private double _zoomLevel = 1.0; // 100% - - [ObservableProperty] - private PdfViewerZoomMode _zoomMode = PdfViewerZoomMode.Custom; - - [ObservableProperty] - private bool _isFitToWidthActive = false; - - [ObservableProperty] - private bool _isFitToPageActive = false; - - private bool _isApplyingFitZoom = false; - - /// - /// Optional provider supplied by the view (e.g. PdfViewerView) to return the current - /// viewport dimensions (ViewportWidth, ViewportHeight, HorizontalPadding, VerticalPadding). - /// - public Func<(double ViewportWidth, double ViewportHeight, double HorizontalPadding, double VerticalPadding)>? ViewportSizeProvider { get; set; } - - // Layout Modes: Continuous Scroll, Single Page, Two-Page Spread - [ObservableProperty] - private PdfViewLayoutMode _selectedLayoutMode = PdfViewLayoutMode.ContinuousScroll; - - [ObservableProperty] - private bool _isContinuousScroll = true; - - [ObservableProperty] - private bool _isSinglePageMode = false; - - [ObservableProperty] - private bool _isTwoPageSpreadMode = false; - - // Reading Themes: Default (White), Sepia (Book comfort), Dark (Night mode), High Contrast - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(IsThemeDefault))] - [NotifyPropertyChangedFor(nameof(IsThemeSepia))] - [NotifyPropertyChangedFor(nameof(IsThemeDark))] - [NotifyPropertyChangedFor(nameof(IsThemeHighContrast))] - private PdfReaderTheme _readingTheme = PdfReaderTheme.Default; - - [ObservableProperty] - private string _themeBackgroundHex = "#F1F5F9"; - - [ObservableProperty] - private string _themePaperBackgroundHex = "#FFFFFF"; - - [ObservableProperty] - private string _themeTextColorHex = "#0F172A"; - - [ObservableProperty] - private string _themeBorderColorHex = "#E2E8F0"; - - [ObservableProperty] - private PdfViewerSidebarTab _selectedSidebarTab = PdfViewerSidebarTab.Thumbnails; - - [ObservableProperty] - private bool _isSidebarOpen = true; - - [ObservableProperty] - private bool _isLoading = false; - - [ObservableProperty] - private bool _isOpeningDocument = false; - - [ObservableProperty] - private string _statusMessage = "Ready"; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(ShowScannedDocumentBanner))] - private bool _hasDocument = false; - - [ObservableProperty] - private PdfViewerPageItem? _selectedPage; - - [ObservableProperty] - private PdfViewerPageSpreadItem? _selectedSpread; - - // In-Document Search - [ObservableProperty] - private bool _isSearchBarVisible = false; - - [ObservableProperty] - private string _searchQuery = string.Empty; - - [ObservableProperty] - private bool _searchMatchCase = false; - - [ObservableProperty] - private bool _searchWholeWord = false; - - [ObservableProperty] - private int _currentMatchIndex = 0; - - [ObservableProperty] - private int _totalMatchesCount = 0; - - [ObservableProperty] - private string _searchStatusText = string.Empty; - - // Sticky Note quick add popup - [ObservableProperty] - private bool _isAddNoteOpen = false; - - [ObservableProperty] - private string _newNoteText = string.Empty; - - // Stamp quick add popup - [ObservableProperty] - private bool _isAddStampOpen = false; - - // Highlight color selection - [ObservableProperty] - private string _selectedHighlightColorHex = "#FEF08A"; // Yellow default - - // Presentation / Fullscreen Mode - [ObservableProperty] - private bool _isFullscreen = false; - - // Interactive Text Selection State - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(SelectedTextSnippet))] - [NotifyPropertyChangedFor(nameof(IsSelectionTextGarbled))] - private string _activeSelectedText = string.Empty; - - [ObservableProperty] - private bool _hasTextSelection = false; - - [ObservableProperty] - private int _activeSelectedPageNumber = 1; - - public string SelectedTextSnippet - { - get - { - if (string.IsNullOrWhiteSpace(ActiveSelectedText)) return string.Empty; - string clean = ActiveSelectedText.Replace('\r', ' ').Replace('\n', ' ').Trim(); - return clean.Length > 35 ? clean.Substring(0, 35) + "…" : clean; - } - } - - partial void OnActiveSelectedTextChanged(string value) - { - HasTextSelection = !string.IsNullOrWhiteSpace(value); - } - - public bool IsSelectionTextGarbled => IsGarbledText(ActiveSelectedText); - - public static bool IsGarbledText(string? text) - { - if (string.IsNullOrWhiteSpace(text)) return false; - string t = text.Trim(); - if (t.Length < 2) return false; - - string[] words = t.Split(' ', StringSplitOptions.RemoveEmptyEntries); - if (words.Length == 0) return false; - - int strangeWords = 0; - foreach (var w in words) - { - // Standalone or embedded unmapped/corrupted symbols - if (w.Any(c => c == '?' || c == '*' || c == '^' || c == '~' || c == '\uFFFD' || c == '|' || c == '`' || c == '§')) - { - strangeWords++; - } - else if (w.Length >= 4) - { - int upperTransitions = 0; - for (int i = 1; i < w.Length; i++) - { - if (char.IsLower(w[i - 1]) && char.IsUpper(w[i])) upperTransitions++; - } - if (upperTransitions >= 2) strangeWords++; - } - else if (w.Length == 1 && !char.IsLetterOrDigit(w[0])) - { - strangeWords++; - } - } - - if (strangeWords >= 2 || (double)strangeWords / words.Length >= 0.25) - { - return true; - } - - int unmappedChars = t.Count(c => c == '?' || c == '*' || c == '^' || c == '~' || c == '\uFFFD' || c == '|'); - return unmappedChars > 0 && (double)unmappedChars / t.Length >= 0.10; - } - - // Selection Mode (Text vs Area/Marquee) - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(IsTextSelectionMode))] - [NotifyPropertyChangedFor(nameof(IsAreaSelectionMode))] - private PdfViewerSelectionMode _selectionMode = PdfViewerSelectionMode.Text; - - public bool IsTextSelectionMode => SelectionMode == PdfViewerSelectionMode.Text; - public bool IsAreaSelectionMode => SelectionMode == PdfViewerSelectionMode.Area; - - [ObservableProperty] - private Rect? _lastSelectedAreaRect; - - // Scanned Document Detection & OCR Banner State - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(ShowScannedDocumentBanner))] - private bool _isScannedDocument = false; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(ShowScannedDocumentBanner))] - private bool _isCurrentPageScanned = false; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(ShowScannedDocumentBanner))] - private bool _isScannedBannerDismissed = false; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(ShowScannedDocumentBanner))] - private bool _isOcrRunning = false; - - private CancellationTokenSource? _ocrCts; - - [ObservableProperty] - private double _ocrProgress = 0.0; - - [ObservableProperty] - private string _ocrStatusText = string.Empty; - - public bool ShowScannedDocumentBanner => - (IsScannedDocument || IsCurrentPageScanned) && - !IsScannedBannerDismissed && - !IsOcrRunning && - HasDocument; - - // Collections - public ObservableCollection Pages { get; } = new(); - public ObservableCollection PageSpreads { get; } = new(); - public ObservableCollection Bookmarks { get; } = new(); - public ObservableCollection Annotations { get; } = new(); - public ObservableCollection MetadataItems { get; } = new(); - public ObservableCollection SearchResults { get; } = new(); - - public static readonly string[] AvailableZoomPresets = new[] - { - "50%", "75%", "100%", "125%", "150%", "200%", "300%", "400%" - }; - - public bool HasBookmarks => Bookmarks.Count > 0; - public bool HasAnnotations => Annotations.Count > 0; - public bool HasSearchResults => SearchResults.Count > 0; - public int MatchCount => SearchResults.Count; - - public string ZoomPercentageText => $"{(int)Math.Round(ZoomLevel * 100)}%"; - public string PageNavigationDisplay => TotalPagesCount > 0 ? $"{CurrentPageNumber} / {TotalPagesCount}" : "0 / 0"; - - public bool IsThemeDefault => ReadingTheme == PdfReaderTheme.Default; - public bool IsThemeSepia => ReadingTheme == PdfReaderTheme.Sepia; - public bool IsThemeDark => ReadingTheme == PdfReaderTheme.Dark; - public bool IsThemeHighContrast => ReadingTheme == PdfReaderTheme.HighContrast; - - partial void OnZoomModeChanged(PdfViewerZoomMode value) - { - IsFitToWidthActive = (value == PdfViewerZoomMode.FitWidth); - IsFitToPageActive = (value == PdfViewerZoomMode.FitPage); - } - - partial void OnZoomLevelChanged(double value) - { - if (!_isApplyingFitZoom) - { - ZoomMode = PdfViewerZoomMode.Custom; - } - - InvalidateVisiblePageCache(); - - // Dynamic High-DPI Vector Re-render on Zoom Change (Debounced) - _zoomDebounceCts?.Cancel(); - _zoomDebounceCts = new CancellationTokenSource(); - var token = _zoomDebounceCts.Token; - - Task.Run(async () => - { - try - { - await Task.Delay(140, token); - if (token.IsCancellationRequested) return; - - float dynamicScale = Math.Clamp((float)(value * 2.25f), PdfViewerPageItem.BasePageRenderScale, 5.0f); - if (SelectedPage != null && Math.Abs(SelectedPage.RenderedScale - dynamicScale) > 0.4f) - { - var highResBmp = RenderPageAtScale(SelectedPage.PageNumber, dynamicScale); - if (highResBmp != null && !token.IsCancellationRequested) - { - Avalonia.Threading.Dispatcher.UIThread.Post(() => - { - SelectedPage.Bitmap = highResBmp; - SelectedPage.RenderedScale = dynamicScale; - }); - } - } - } - catch (OperationCanceledException) { } - }, token); - } - - public void InvalidateVisiblePageCache() - { - _lastVisibleFirstPage = -1; - _lastVisibleLastPage = -1; - } - - partial void OnCurrentPageNumberChanged(int value) - { - JumpPageText = value.ToString(); - if (value >= 1 && value <= Pages.Count) - { - var targetPage = Pages[value - 1]; - if (SelectedPage != targetPage) - { - SelectedPage = targetPage; - } - foreach (var p in Pages) - { - p.IsSelected = (p.PageNumber == value); - } - EnsurePageRendered(value); - if (value > 1) EnsurePageRendered(value - 1); - if (value < Pages.Count) EnsurePageRendered(value + 1); - } - UpdateSelectedSpreadForPage(value); - } - - partial void OnSelectedPageChanged(PdfViewerPageItem? value) - { - if (value != null) - { - foreach (var p in Pages) - { - p.IsSelected = (p.PageNumber == value.PageNumber); - } - if (CurrentPageNumber != value.PageNumber) - { - CurrentPageNumber = value.PageNumber; - } - if (value.Words.Count == 0 && !value.IsGeometryLoading) - { - EnsurePageGeometry(value); - } - IsCurrentPageScanned = (value.Words.Count == 0 && string.IsNullOrWhiteSpace(value.ExtractedText)); - } - } - - partial void OnSelectedLayoutModeChanged(PdfViewLayoutMode value) - { - IsContinuousScroll = (value == PdfViewLayoutMode.ContinuousScroll); - IsSinglePageMode = (value == PdfViewLayoutMode.SinglePage); - IsTwoPageSpreadMode = (value == PdfViewLayoutMode.TwoPageSpread); - - if (IsTwoPageSpreadMode) - { - if (PageSpreads.Count == 0 && Pages.Count > 0) - { - RebuildPageSpreads(); - } - else - { - UpdateSelectedSpreadForPage(CurrentPageNumber); - } - - if (SelectedSpread?.LeftPage != null) EnsurePageRendered(SelectedSpread.LeftPage.PageNumber); - if (SelectedSpread?.RightPage != null) EnsurePageRendered(SelectedSpread.RightPage.PageNumber); - - FitToPage(); - } - else if (IsSinglePageMode) - { - if (CurrentPageNumber >= 1 && CurrentPageNumber <= Pages.Count) - { - SelectedPage = Pages[CurrentPageNumber - 1]; - } - EnsurePageRendered(CurrentPageNumber); - - FitToPage(); - } - else if (IsContinuousScroll) - { - if (IsFitToWidthActive) - { - FitToWidth(); - } - else if (IsFitToPageActive) - { - FitToPage(); - } - } - } - - partial void OnReadingThemeChanged(PdfReaderTheme value) - { - switch (value) - { - case PdfReaderTheme.Sepia: - ThemeBackgroundHex = "#EDE3C9"; - ThemePaperBackgroundHex = "#FBF0D9"; - ThemeTextColorHex = "#433422"; - ThemeBorderColorHex = "#E6D5B8"; - break; - case PdfReaderTheme.Dark: - ThemeBackgroundHex = "#0F172A"; - ThemePaperBackgroundHex = "#1E293B"; - ThemeTextColorHex = "#F1F5F9"; - ThemeBorderColorHex = "#334155"; - break; - case PdfReaderTheme.HighContrast: - ThemeBackgroundHex = "#000000"; - ThemePaperBackgroundHex = "#000000"; - ThemeTextColorHex = "#FFFF00"; - ThemeBorderColorHex = "#FFFF00"; - break; - case PdfReaderTheme.Default: - default: - ThemeBackgroundHex = "#F1F5F9"; - ThemePaperBackgroundHex = "#FFFFFF"; - ThemeTextColorHex = "#0F172A"; - ThemeBorderColorHex = "#E2E8F0"; - break; - } - - ReRenderActivePagesForTheme(); - WeakReferenceMessenger.Default.Send(new ReadingThemeChangedMessage(value)); - } - - partial void OnSearchQueryChanged(string value) - { - if (string.IsNullOrWhiteSpace(value)) - { - ClearSearch(); - } - else - { - PerformSearch(); - } - } - - partial void OnSearchMatchCaseChanged(bool value) - { - if (!string.IsNullOrWhiteSpace(SearchQuery)) - { - PerformSearch(); - } - } - - partial void OnSearchWholeWordChanged(bool value) - { - if (!string.IsNullOrWhiteSpace(SearchQuery)) - { - PerformSearch(); - } - } - -} diff --git a/src/PdfEditorApp/ViewModels/PluginItemViewModel.cs b/src/PdfEditorApp/ViewModels/PluginItemViewModel.cs deleted file mode 100644 index 421fa09..0000000 --- a/src/PdfEditorApp/ViewModels/PluginItemViewModel.cs +++ /dev/null @@ -1,102 +0,0 @@ -using System; -using System.Threading.Tasks; -using CommunityToolkit.Mvvm.ComponentModel; -using Microsoft.Extensions.DependencyInjection; -using PdfEditorApp.Core.Plugins; - -namespace PdfEditorApp.ViewModels; - -/// -/// Presentation model for an active or loaded plugin in the FryPDF Plugin & Extension Studio. -/// -public partial class PluginItemViewModel : ViewModelBase -{ - private bool _isToggling; - - [ObservableProperty] - private string _id = string.Empty; - - [ObservableProperty] - private string _name = string.Empty; - - [ObservableProperty] - private string _version = "1.0.0"; - - [ObservableProperty] - private string _category = "General"; - - [ObservableProperty] - private string _description = string.Empty; - - [ObservableProperty] - private string _iconKind = "PuzzleOutline"; - - [ObservableProperty] - private string _iconColorHex = "#7C3AED"; - - [ObservableProperty] - private bool _isActive = true; - - [ObservableProperty] - private bool _isExternal; - - [ObservableProperty] - private string _sourceAssembly = "Built-in"; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(HasSettings))] - private System.Collections.Generic.IReadOnlyDictionary? _settingsSchema; - - public bool HasSettings => SettingsSchema != null && SettingsSchema.Count > 0; - - /// - /// Optional custom handler for toggling active status. - /// - public Func? ToggleHandler { get; set; } - - partial void OnIsActiveChanged(bool value) - { - if (_isToggling) return; - _ = HandleToggleAsync(value); - } - - private async Task HandleToggleAsync(bool active) - { - if (string.IsNullOrWhiteSpace(Id)) return; - - _isToggling = true; - try - { - if (ToggleHandler != null) - { - await ToggleHandler(Id, active); - } - else - { - var host = App.Services?.GetService(); - if (host != null) - { - if (active) - { - await host.EnablePluginAsync(Id); - } - else - { - await host.DisablePluginAsync(Id); - } - } - } - } - catch (Exception ex) - { - System.Diagnostics.Debug.WriteLine($"[PluginItemViewModel] Toggle failed for '{Id}': {ex.Message}"); - _isToggling = true; - IsActive = !active; - _isToggling = false; - } - finally - { - _isToggling = false; - } - } -} diff --git a/src/PdfEditorApp/ViewModels/PluginSettingItemViewModel.cs b/src/PdfEditorApp/ViewModels/PluginSettingItemViewModel.cs deleted file mode 100644 index e229b8f..0000000 --- a/src/PdfEditorApp/ViewModels/PluginSettingItemViewModel.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System.Collections.Generic; -using CommunityToolkit.Mvvm.ComponentModel; - -namespace PdfEditorApp.ViewModels; - -/// -/// Presentation model for an individual configurable setting inside a plugin's declarative schema. -/// -public sealed partial class PluginSettingItemViewModel : ViewModelBase -{ - public required string Key { get; init; } - public required string Label { get; init; } - public string Description { get; init; } = ""; - public string Type { get; init; } = "string"; // string, boolean, number, select, secret - public List Options { get; init; } = new(); - - [ObservableProperty] - private string _stringValue = string.Empty; - - [ObservableProperty] - private bool _boolValue; - - [ObservableProperty] - private double _numberValue; -} diff --git a/src/PdfEditorApp/ViewModels/PluginsManagerDetailViewModel.cs b/src/PdfEditorApp/ViewModels/PluginsManagerDetailViewModel.cs deleted file mode 100644 index a8e412c..0000000 --- a/src/PdfEditorApp/ViewModels/PluginsManagerDetailViewModel.cs +++ /dev/null @@ -1,328 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Threading.Tasks; -using CommunityToolkit.Mvvm.ComponentModel; -using CommunityToolkit.Mvvm.Input; -using PdfEditorApp.Core.Plugins.Marketplace; - -namespace PdfEditorApp.ViewModels; - -public enum ExtensionDetailTab -{ - Overview, - Contributions, - Settings, - Runtime -} - -/// -/// Detail presentation model for the selected plugin in the Plugins & Extensions Studio. -/// Displays comprehensive metadata, stats, action controls, and 4 dedicated tabs: -/// Overview, Feature Contributions, Declarative Settings, and Runtime/Dependencies. -/// -public partial class PluginsManagerDetailViewModel : ViewModelBase -{ - [ObservableProperty] - private string _id = string.Empty; - - [ObservableProperty] - private string _name = string.Empty; - - [ObservableProperty] - private string _version = "1.0.0"; - - [ObservableProperty] - private string _publisher = "FryPDF Official"; - - [ObservableProperty] - private string _category = "General"; - - [ObservableProperty] - private string _description = string.Empty; - - [ObservableProperty] - private string _longDescription = string.Empty; - - [ObservableProperty] - private string _iconKind = "PuzzleOutline"; - - [ObservableProperty] - private string _iconColorHex = "#7C3AED"; - - [ObservableProperty] - private double _rating = 4.8; - - [ObservableProperty] - private int _ratingCount = 120; - - [ObservableProperty] - private int _installCount = 1500; - - [ObservableProperty] - private string _formattedSize = "1.2 MB"; - - [ObservableProperty] - private string _license = "MIT"; - - [ObservableProperty] - private bool _isOfficial = true; - - [ObservableProperty] - private bool _isVerified = true; - - [ObservableProperty] - private bool _isInstalled = true; - - [ObservableProperty] - private bool _isActive = true; - - [ObservableProperty] - private bool _isExternal; - - [ObservableProperty] - private string _sourceAssembly = "Built-in"; - - [ObservableProperty] - private ExtensionDetailTab _selectedTab = ExtensionDetailTab.Overview; - - [ObservableProperty] - private string _runtimeStatus = "Active (Mounted in Kernel)"; - - [ObservableProperty] - private string _assemblyPath = "In-memory AppContext"; - - [ObservableProperty] - private string _assemblyLoadContextName = "Default AssemblyLoadContext"; - - public ObservableCollection ContributedFeatures { get; } = new(); - public ObservableCollection Highlights { get; } = new(); - public ObservableCollection Dependencies { get; } = new(); - public ObservableCollection SettingsList { get; } = new(); - - public bool HasSettings => SettingsList.Count > 0; - public bool HasContributions => ContributedFeatures.Count > 0; - - public Func? ToggleActiveCallback { get; set; } - public Func? InstallCallback { get; set; } - public Func? UninstallCallback { get; set; } - public Action? CopyToClipboardCallback { get; set; } - public Action? ShowToastCallback { get; set; } - - [RelayCommand] - public void SelectTab(string tabName) - { - if (Enum.TryParse(tabName, true, out var tab)) - { - SelectedTab = tab; - } - } - - [RelayCommand] - public async Task ToggleActiveAsync() - { - if (!IsInstalled || ToggleActiveCallback == null) return; - var next = !IsActive; - IsActive = next; - RuntimeStatus = next ? "Active (Mounted in Kernel)" : "Disabled (Unloaded)"; - await ToggleActiveCallback(Id, next); - } - - [RelayCommand] - public async Task InstallAsync() - { - if (InstallCallback == null) return; - await InstallCallback(Id); - } - - [RelayCommand] - public async Task UninstallAsync() - { - if (UninstallCallback == null) return; - await UninstallCallback(Id); - } - - [RelayCommand] - public void CopyId() - { - if (string.IsNullOrWhiteSpace(Id)) return; - CopyToClipboardCallback?.Invoke(Id); - ShowToastCallback?.Invoke($"Copied extension ID '{Id}' to clipboard"); - } - - [RelayCommand] - public void SaveSettings() - { - ShowToastCallback?.Invoke($"Saved preferences for '{Name}'"); - } - - /// - /// Populates detail from an installed plugin item. - /// - public static PluginsManagerDetailViewModel FromInstalledPlugin( - PluginItemViewModel plugin, - IReadOnlyList? contributions = null) - { - var vm = new PluginsManagerDetailViewModel - { - Id = plugin.Id, - Name = plugin.Name, - Version = plugin.Version, - Publisher = plugin.IsExternal ? "3rd-Party Developer" : "FryPDF Core Team", - Category = plugin.Category, - Description = plugin.Description, - LongDescription = string.IsNullOrWhiteSpace(plugin.Description) - ? $"Official module '{plugin.Name}' providing high-performance capabilities in {plugin.Category}." - : $"{plugin.Description}\n\nThis extension is deeply integrated into FryPDF's modular microkernel architecture. It registers tools, services, and visual controls dynamically with isolated execution and zero memory leak guarantees.", - IconKind = plugin.IconKind, - IconColorHex = plugin.IconColorHex, - IsInstalled = true, - IsActive = plugin.IsActive, - IsExternal = plugin.IsExternal, - IsOfficial = !plugin.IsExternal, - IsVerified = true, - License = "MIT", - FormattedSize = plugin.IsExternal ? "2.1 MB" : "Built-in (.NET 10)", - SourceAssembly = plugin.SourceAssembly, - AssemblyPath = plugin.IsExternal ? plugin.SourceAssembly : "src/PdfEditorApp/bin/Debug/net10.0/PdfEditorApp.dll", - AssemblyLoadContextName = plugin.IsExternal ? "IsolatedAssemblyLoadContext (ALC)" : "System.Runtime.Loader.Default", - RuntimeStatus = plugin.IsActive ? "Active (Mounted in Kernel)" : "Disabled (Suspended)" - }; - - if (contributions != null && contributions.Count > 0) - { - foreach (var c in contributions) - { - vm.ContributedFeatures.Add(c); - } - } - else - { - // Default contributions inferred from ID and category - vm.ContributedFeatures.Add($"Module Component: {plugin.Name}"); - vm.ContributedFeatures.Add($"Category Registration: {plugin.Category}"); - if (plugin.Id.Contains(".tool.")) - { - vm.ContributedFeatures.Add("Interactive Tool: Studio Canvas & Quick Action Ribbon"); - } - if (plugin.Id.Contains(".page.")) - { - vm.ContributedFeatures.Add("Workspace Navigation: First-class studio page"); - } - if (plugin.Id.Contains(".dialog.")) - { - vm.ContributedFeatures.Add("Modal Studio: Material Design 3 Dialog"); - } - if (plugin.Id.Contains(".sidebar.")) - { - vm.ContributedFeatures.Add("Dockable Sidebar: Inspector / Thumbnails / Tool Palette"); - } - } - - if (plugin.Category.Contains("AI", StringComparison.OrdinalIgnoreCase)) - { - vm.Highlights.Add("Multimodal document understanding & streaming intelligence"); - vm.Highlights.Add("Zero data retention with local or privacy-first inference"); - vm.Highlights.Add("Interactive prompts and contextual summaries"); - } - else if (plugin.Category.Contains("Conversion", StringComparison.OrdinalIgnoreCase)) - { - vm.Highlights.Add("High-fidelity document structure and layout reconstruction"); - vm.Highlights.Add("Preserves embedded vector shapes, images, and fonts"); - vm.Highlights.Add("Hardware-accelerated Skia rendering and export"); - } - else if (plugin.Category.Contains("Security", StringComparison.OrdinalIgnoreCase)) - { - vm.Highlights.Add("Enterprise-grade cryptographic security and validation"); - vm.Highlights.Add("Permanent, irreversible sanitization and redaction"); - vm.Highlights.Add("FIPS-compliant AES-256 document protection"); - } - else if (plugin.Category.Contains("Canvas", StringComparison.OrdinalIgnoreCase)) - { - vm.Highlights.Add("Full-fidelity visual canvas editing with drag handles"); - vm.Highlights.Add("Real-time property inspector two-way data binding"); - vm.Highlights.Add("Script-aware layout engine with Unicode font fallback"); - } - else - { - vm.Highlights.Add("High-performance .NET 10 modular execution"); - vm.Highlights.Add("Isolated microkernel lifecycle management"); - vm.Highlights.Add("Integrated undo/redo and atomic command history"); - } - - vm.Dependencies.Add("PdfEditorApp.Core (v1.0.0+)"); - vm.Dependencies.Add("Avalonia UI (v12.x+)"); - - // Load settings schema if available - if (plugin.SettingsSchema != null) - { - foreach (var kvp in plugin.SettingsSchema) - { - var def = kvp.Value; - vm.SettingsList.Add(new PluginSettingItemViewModel - { - Key = kvp.Key, - Label = def.Label ?? kvp.Key, - Description = def.Description ?? "", - Type = def.Type ?? "string", - Options = def.Options != null ? new List(def.Options) : new List(), - StringValue = def.DefaultValue?.ToString() ?? "", - BoolValue = bool.TryParse(def.DefaultValue?.ToString(), out var b) && b - }); - } - } - - return vm; - } - - /// - /// Populates detail from a marketplace extension item. - /// - public static PluginsManagerDetailViewModel FromMarketplaceItem(MarketplacePluginItem item) - { - var isInstalled = item.Status == MarketplacePluginStatus.Installed; - var vm = new PluginsManagerDetailViewModel - { - Id = item.Id, - Name = item.Name, - Version = item.Version, - Publisher = item.Publisher, - Category = item.Category, - Description = item.Description, - LongDescription = !string.IsNullOrWhiteSpace(item.LongDescription) ? item.LongDescription : item.Description, - IconKind = item.IconKind, - IconColorHex = item.IconColorHex, - Rating = item.Rating, - RatingCount = item.RatingCount, - InstallCount = item.InstallCount, - FormattedSize = item.FormattedSize, - License = item.License, - IsOfficial = item.IsOfficial, - IsVerified = item.IsVerified, - IsInstalled = isInstalled, - IsActive = isInstalled, - IsExternal = true, - SourceAssembly = isInstalled ? $"plugins/{item.Id}/{item.Id}.dll" : "FryPDF Marketplace Remote Registry", - AssemblyPath = isInstalled ? $"plugins/{item.Id}/{item.Id}.dll" : "Remote Package Archive (.fryplugin)", - AssemblyLoadContextName = "PluginAssemblyLoadContext (Isolated)", - RuntimeStatus = isInstalled ? "Active (Mounted in Kernel)" : "Available in Marketplace" - }; - - foreach (var c in item.ContributedFeatures) - { - vm.ContributedFeatures.Add(c); - } - - foreach (var h in item.Highlights) - { - vm.Highlights.Add(h); - } - - foreach (var d in item.Dependencies) - { - vm.Dependencies.Add(d); - } - - return vm; - } -} diff --git a/src/PdfEditorApp/ViewModels/PluginsManagerViewModel.cs b/src/PdfEditorApp/ViewModels/PluginsManagerViewModel.cs deleted file mode 100644 index abd51a8..0000000 --- a/src/PdfEditorApp/ViewModels/PluginsManagerViewModel.cs +++ /dev/null @@ -1,802 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.IO; -using System.Linq; -using System.Threading.Tasks; -using Avalonia.Input.Platform; -using Avalonia.Platform.Storage; -using CommunityToolkit.Mvvm.ComponentModel; -using CommunityToolkit.Mvvm.Input; -using PdfEditorApp.Core.Plugins; -using PdfEditorApp.Core.Plugins.Marketplace; -using PdfEditorApp.Core.Plugins.Profiles; -using PdfEditorApp.Plugins.Bundles; -using PdfEditorApp.Plugins.Loader; -using PdfEditorApp.Services.Plugins; -using PdfEditorApp.Services.Tools.Core; - -namespace PdfEditorApp.ViewModels; - -public enum PluginsManagerTab -{ - Installed, - Marketplace, - Updates -} - -/// -/// Master ViewModel for the VS Code-inspired Plugins & Extensions Manager Studio Page. -/// Coordinates search, category filtering, installed modules list, marketplace catalog, -/// local package installation (.fryplugin/.dll), profile switching, and detail inspection. -/// -public partial class PluginsManagerViewModel : ViewModelBase -{ - private readonly PluginHost? _pluginHost; - private readonly IPluginMarketplaceService _marketplaceService; - private readonly IPdfToolRegistry? _toolRegistry; - private readonly List _allInstalled = new(); - private readonly List _allMarketplace = new(); - - public IStorageProvider? StorageProvider { get; set; } - public IClipboard? Clipboard { get; set; } - public Action? ShowToastCallback { get; set; } - - [ObservableProperty] - private PluginsManagerTab _selectedTab = PluginsManagerTab.Installed; - - [ObservableProperty] - private string _searchQuery = string.Empty; - - [ObservableProperty] - private string _selectedCategory = "All"; - - [ObservableProperty] - private string _activeProfileName = "desktop"; - - [ObservableProperty] - private bool _isBusy; - - [ObservableProperty] - private string _statusMessage = string.Empty; - - [ObservableProperty] - private PluginItemViewModel? _selectedInstalledPlugin; - - [ObservableProperty] - private MarketplacePluginItem? _selectedMarketplacePlugin; - - [ObservableProperty] - private PluginsManagerDetailViewModel? _selectedDetail; - - public ObservableCollection FilteredInstalledPlugins { get; } = new(); - public ObservableCollection FilteredMarketplacePlugins { get; } = new(); - public ObservableCollection AvailableCategories { get; } = new(); - - public int InstalledCount => _allInstalled.Count; - public int ActiveInstalledCount => _allInstalled.Count(p => p.IsActive); - public int MarketplaceCount => _allMarketplace.Count; - - public bool HasSelectedDetail => SelectedDetail != null; - - public PluginsManagerViewModel( - PluginHost? pluginHost = null, - IPluginMarketplaceService? marketplaceService = null, - IPdfToolRegistry? toolRegistry = null) - { - _pluginHost = pluginHost; - _marketplaceService = marketplaceService ?? new PluginMarketplaceService(pluginHost); - _toolRegistry = toolRegistry; - - InitializeCategories(); - _ = LoadAllDataAsync(); - } - - private void InitializeCategories() - { - AvailableCategories.Clear(); - var cats = new[] - { - "All", - "Tools & Productivity", - "Conversion & Office", - "AI & Intelligence", - "Security & Signatures", - "Workspace Pages", - "Canvas Elements", - "Document I/O", - "UI & Extensions" - }; - foreach (var c in cats) AvailableCategories.Add(c); - } - - partial void OnSearchQueryChanged(string value) - { - ApplyFilters(); - } - - partial void OnSelectedCategoryChanged(string value) - { - ApplyFilters(); - } - - partial void OnSelectedTabChanged(PluginsManagerTab value) - { - ApplyFilters(); - // Update detail selection based on the new tab - if (value == PluginsManagerTab.Installed && SelectedInstalledPlugin != null) - { - UpdateDetailFromInstalled(SelectedInstalledPlugin); - } - else if (value == PluginsManagerTab.Marketplace) - { - if (SelectedMarketplacePlugin != null) - { - UpdateDetailFromMarketplace(SelectedMarketplacePlugin); - } - - // Auto-sync with remote GitHub CDN registry in background - _ = SyncRemoteRegistrySilentlyAsync(); - } - } - - private async Task SyncRemoteRegistrySilentlyAsync() - { - try - { - await _marketplaceService.FetchRemoteCatalogAsync(); - var catalog = await _marketplaceService.GetCatalogAsync(); - void Update() - { - _allMarketplace.Clear(); - _allMarketplace.AddRange(catalog); - ApplyFilters(); - OnPropertyChanged(nameof(MarketplaceCount)); - } - - if (Avalonia.Threading.Dispatcher.UIThread.CheckAccess()) - { - Update(); - } - else - { - await Avalonia.Threading.Dispatcher.UIThread.InvokeAsync(Update); - } - } - catch - { - // Silent fallback to curated offline items - } - } - - partial void OnSelectedInstalledPluginChanged(PluginItemViewModel? value) - { - if (value != null && SelectedTab == PluginsManagerTab.Installed) - { - UpdateDetailFromInstalled(value); - } - } - - partial void OnSelectedMarketplacePluginChanged(MarketplacePluginItem? value) - { - if (value != null && SelectedTab == PluginsManagerTab.Marketplace) - { - UpdateDetailFromMarketplace(value); - } - } - - [RelayCommand] - public void SelectTab(string tabName) - { - if (Enum.TryParse(tabName, true, out var tab)) - { - SelectedTab = tab; - } - } - - [RelayCommand] - public void SelectCategory(string category) - { - SelectedCategory = category; - } - - [RelayCommand] - public async Task RefreshAllAsync() - { - await LoadAllDataAsync(); - } - - public async Task LoadAllDataAsync() - { - IsBusy = true; - StatusMessage = "Refreshing loaded plugins and marketplace catalog..."; - - try - { - PopulateInstalledPlugins(); - await _marketplaceService.FetchRemoteCatalogAsync(); - var catalog = await _marketplaceService.GetCatalogAsync(); - _allMarketplace.Clear(); - _allMarketplace.AddRange(catalog); - - ApplyFilters(); - OnPropertyChanged(nameof(MarketplaceCount)); - - if (SelectedDetail == null && FilteredInstalledPlugins.Count > 0) - { - SelectedInstalledPlugin = FilteredInstalledPlugins[0]; - } - } - catch (Exception ex) - { - StatusMessage = $"Error loading plugins: {ex.Message}"; - } - finally - { - IsBusy = false; - } - } - - [RelayCommand] - public async Task SyncRemoteRegistryAsync() - { - try - { - StatusMessage = "Syncing with remote FryPDF registry..."; - await _marketplaceService.FetchRemoteCatalogAsync(forceRefresh: true); - var catalog = await _marketplaceService.GetCatalogAsync(); - _allMarketplace.Clear(); - _allMarketplace.AddRange(catalog); - ApplyFilters(); - OnPropertyChanged(nameof(MarketplaceCount)); - ShowToastCallback?.Invoke($"Registry synced: {catalog.Count} extensions available."); - } - catch (Exception ex) - { - StatusMessage = $"Sync error: {ex.Message}"; - } - } - - [RelayCommand] - public async Task CheckForUpdatesAsync() - { - IsBusy = true; - StatusMessage = "Checking remote registry for plugin updates..."; - - try - { - var updates = await _marketplaceService.CheckForUpdatesAsync(); - if (updates.Count > 0) - { - ShowToastCallback?.Invoke($"Found {updates.Count} plugin update(s) available!"); - } - else - { - ShowToastCallback?.Invoke("All installed plugins are up to date."); - } - await LoadAllDataAsync(); - } - catch (Exception ex) - { - ShowToastCallback?.Invoke($"Failed to check updates: {ex.Message}"); - } - finally - { - IsBusy = false; - } - } - - public void PopulateInstalledPlugins() - { - _allInstalled.Clear(); - - if (_pluginHost != null) - { - foreach (var plugin in _pluginHost.LoadedPlugins) - { - var vm = new PluginItemViewModel - { - Id = plugin.Id, - Name = plugin.Name, - Version = plugin.Version?.ToString() ?? "1.0.0", - Category = InferCategory(plugin), - Description = InferDescription(plugin), - IconKind = InferIcon(plugin), - IconColorHex = InferColor(plugin), - IsActive = true, - IsExternal = plugin.GetType().Assembly != typeof(App).Assembly && - plugin.GetType().Assembly != typeof(PluginHost).Assembly, - SourceAssembly = plugin.GetType().Assembly.GetName().Name ?? "Core", - ToggleHandler = async (id, active) => - { - if (active) - { - await _pluginHost.EnablePluginAsync(id); - } - else - { - await _pluginHost.DisablePluginAsync(id); - } - OnPropertyChanged(nameof(ActiveInstalledCount)); - } - }; - _allInstalled.Add(vm); - } - } - - OnPropertyChanged(nameof(InstalledCount)); - OnPropertyChanged(nameof(ActiveInstalledCount)); - } - - private void ApplyFilters() - { - var q = SearchQuery.Trim().ToLowerInvariant(); - var cat = SelectedCategory; - - // Filter Installed - FilteredInstalledPlugins.Clear(); - foreach (var p in _allInstalled) - { - if (cat != "All" && !string.Equals(p.Category, cat, StringComparison.OrdinalIgnoreCase)) - continue; - - if (string.IsNullOrWhiteSpace(q) || - p.Name.ToLowerInvariant().Contains(q) || - p.Id.ToLowerInvariant().Contains(q) || - p.Category.ToLowerInvariant().Contains(q) || - p.Description.ToLowerInvariant().Contains(q)) - { - FilteredInstalledPlugins.Add(p); - } - } - - // Filter Marketplace - var matchedMarketplace = new List(); - foreach (var m in _allMarketplace) - { - if (cat != "All" && !string.Equals(m.Category, cat, StringComparison.OrdinalIgnoreCase)) - continue; - - if (string.IsNullOrWhiteSpace(q) || - m.Name.ToLowerInvariant().Contains(q) || - m.Id.ToLowerInvariant().Contains(q) || - m.Publisher.ToLowerInvariant().Contains(q) || - m.Description.ToLowerInvariant().Contains(q) || - m.Tags.Any(t => t.ToLowerInvariant().Contains(q))) - { - matchedMarketplace.Add(m); - } - } - - if (!string.IsNullOrWhiteSpace(q)) - { - matchedMarketplace = matchedMarketplace - .OrderByDescending(m => - { - var name = m.Name.ToLowerInvariant(); - var id = m.Id.ToLowerInvariant(); - if (name == q || id == q) return 100; - if (name.StartsWith(q)) return 80; - if (name.Contains(q)) return 60; - if (id.Contains(q)) return 40; - return 10; - }) - .ToList(); - } - - FilteredMarketplacePlugins.Clear(); - foreach (var item in matchedMarketplace) - { - FilteredMarketplacePlugins.Add(item); - } - - // Maintain selection stability or select the first item so the detail pane is never left blank unexpectedly - if (SelectedTab == PluginsManagerTab.Installed) - { - if (SelectedInstalledPlugin == null || !FilteredInstalledPlugins.Contains(SelectedInstalledPlugin)) - { - SelectedInstalledPlugin = FilteredInstalledPlugins.Count > 0 ? FilteredInstalledPlugins[0] : null; - } - else - { - UpdateDetailFromInstalled(SelectedInstalledPlugin); - } - } - else if (SelectedTab == PluginsManagerTab.Marketplace) - { - if (SelectedMarketplacePlugin == null || !FilteredMarketplacePlugins.Contains(SelectedMarketplacePlugin)) - { - SelectedMarketplacePlugin = FilteredMarketplacePlugins.Count > 0 ? FilteredMarketplacePlugins[0] : null; - } - else - { - UpdateDetailFromMarketplace(SelectedMarketplacePlugin); - } - } - } - - private void UpdateDetailFromInstalled(PluginItemViewModel plugin) - { - var detail = PluginsManagerDetailViewModel.FromInstalledPlugin(plugin); - WireDetailCallbacks(detail); - SelectedDetail = detail; - OnPropertyChanged(nameof(HasSelectedDetail)); - } - - private void UpdateDetailFromMarketplace(MarketplacePluginItem item) - { - var detail = PluginsManagerDetailViewModel.FromMarketplaceItem(item); - WireDetailCallbacks(detail); - SelectedDetail = detail; - OnPropertyChanged(nameof(HasSelectedDetail)); - } - - private void WireDetailCallbacks(PluginsManagerDetailViewModel detail) - { - detail.ToggleActiveCallback = async (id, active) => - { - if (_pluginHost != null) - { - if (active) await _pluginHost.EnablePluginAsync(id); - else await _pluginHost.DisablePluginAsync(id); - } - OnPropertyChanged(nameof(ActiveInstalledCount)); - }; - - detail.InstallCallback = async (id) => - { - await InstallMarketplacePluginAsync(id); - }; - - detail.UninstallCallback = async (id) => - { - await UninstallMarketplacePluginAsync(id); - }; - - detail.CopyToClipboardCallback = async (text) => - { - if (Clipboard != null) - { - await Clipboard.SetTextAsync(text); - } - }; - - detail.ShowToastCallback = (msg) => - { - ShowToastCallback?.Invoke(msg); - }; - } - - [RelayCommand] - public async Task InstallMarketplacePluginAsync(string pluginId) - { - IsBusy = true; - StatusMessage = $"Installing extension '{pluginId}' from store..."; - - try - { - var progress = new Progress(p => - { - StatusMessage = $"Installing {pluginId} ({(int)(p * 100)}%)..."; - }); - - bool success = await _marketplaceService.InstallPluginAsync(pluginId, progress, s => StatusMessage = s); - if (success) - { - ShowToastCallback?.Invoke($"Installed extension '{pluginId}' successfully!"); - await LoadAllDataAsync(); - SelectedTab = PluginsManagerTab.Installed; - } - else - { - ShowToastCallback?.Invoke($"Failed to install extension '{pluginId}'"); - } - } - catch (Exception ex) - { - ShowToastCallback?.Invoke($"Install error: {ex.Message}"); - } - finally - { - IsBusy = false; - } - } - - [RelayCommand] - public async Task UninstallMarketplacePluginAsync(string pluginId) - { - IsBusy = true; - try - { - await _marketplaceService.UninstallPluginAsync(pluginId); - ShowToastCallback?.Invoke($"Uninstalled extension '{pluginId}'"); - await LoadAllDataAsync(); - } - catch (Exception ex) - { - ShowToastCallback?.Invoke($"Uninstall error: {ex.Message}"); - } - finally - { - IsBusy = false; - } - } - - [RelayCommand] - public async Task InstallFromFileAsync() - { - if (StorageProvider == null) return; - - var files = await StorageProvider.OpenFilePickerAsync(new FilePickerOpenOptions - { - Title = "Select FryPDF Plugin Package (.fryplugin) or Assembly (.dll)", - AllowMultiple = false, - FileTypeFilter = new[] - { - new FilePickerFileType("FryPDF Plugins (*.fryplugin; *.dll)") - { - Patterns = new[] { "*.fryplugin", "*.dll" } - }, - new FilePickerFileType("FryPDF Plugin Package (*.fryplugin)") - { - Patterns = new[] { "*.fryplugin" } - }, - new FilePickerFileType(".NET Assembly (*.dll)") - { - Patterns = new[] { "*.dll" } - } - } - }); - - if (files.Count > 0) - { - var path = files[0].Path.LocalPath; - await InstallLocalPackageAsync(path); - } - } - - public async Task InstallLocalPackageAsync(string filePath) - { - if (!File.Exists(filePath)) return; - - IsBusy = true; - StatusMessage = $"Mounting '{Path.GetFileName(filePath)}'..."; - - try - { - if (_pluginHost == null) - { - ShowToastCallback?.Invoke("PluginHost is not initialized."); - return; - } - - IReadOnlyList plugins; - string displayName; - - if (string.Equals(Path.GetExtension(filePath), ".fryplugin", StringComparison.OrdinalIgnoreCase)) - { - var pkgResult = FryPluginPackageLoader.UnpackAndLoad(filePath); - plugins = pkgResult.AssemblyPackage.Plugins; - displayName = pkgResult.Manifest.Name; - } - else - { - var pkg = PluginAssemblyLoader.LoadPluginAssembly(filePath); - plugins = pkg.Plugins; - displayName = Path.GetFileName(filePath); - } - - _pluginHost.RegisterPlugins(plugins); - foreach (var p in plugins) - { - await _pluginHost.EnablePluginAsync(p.Id); - } - - PopulateInstalledPlugins(); - ApplyFilters(); - - ShowToastCallback?.Invoke($"Successfully installed and mounted '{displayName}' ({plugins.Count} plugins)!"); - SelectedTab = PluginsManagerTab.Installed; - } - catch (Exception ex) - { - ShowToastCallback?.Invoke($"Failed to install plugin: {ex.Message}"); - } - finally - { - IsBusy = false; - } - } - - [RelayCommand] - public void SwitchProfile(string profileName) - { - try - { - if (_pluginHost == null) return; - - string profilePath = Path.Combine(AppContext.BaseDirectory, "profiles", $"{profileName}.profile.json"); - if (!File.Exists(profilePath)) - { - profilePath = $"profiles/{profileName}.profile.json"; - } - - if (File.Exists(profilePath)) - { - var profile = ProfileLoader.LoadFromFile(profilePath); - ActiveProfileName = profile.ProfileName; - - var availableBundles = new IFryPluginBundle[] - { - new ToolsOrganizeBundle(), - new ToolsSecurityBundle(), - new ToolsConversionBundle(), - new ToolsIntelligenceBundle(), - new DataStudioBundle(), - new CanvasElementsBundle(), - new DocumentIoBundle(), - new AiProvidersBundle(), - new OcrEnginesBundle(), - new StandardTemplatesBundle(), - new StatusBarBundle(), - new InspectorBundle(), - new CommandPaletteBundle(), - new WorkspacePagesBundle(), - new DialogsBundle(), - new EditorSidebarsBundle() - }; - - ProfileLoader.ApplyProfile(profile, _pluginHost, availableBundles); - PopulateInstalledPlugins(); - ApplyFilters(); - ShowToastCallback?.Invoke($"Switched to profile '{profileName}'"); - } - } - catch (Exception ex) - { - ShowToastCallback?.Invoke($"Failed to switch profile: {ex.Message}"); - } - } - - private record struct PluginMeta(string Category, string Description, string Icon, string Color); - - private static readonly Dictionary KnownPluginMetas = new(StringComparer.OrdinalIgnoreCase) - { - // Organize & Page Tools - ["frypdf.tool.merge"] = new("Tools & Productivity", "Combine multiple PDF documents or pages into a single organized file.", "CallMerge", "#3B82F6"), - ["frypdf.tool.split"] = new("Tools & Productivity", "Extract individual pages or split documents by bookmarks and ranges.", "CallSplit", "#6366F1"), - ["frypdf.tool.rotate"] = new("Tools & Productivity", "Rotate portrait/landscape pages 90°, 180°, or 270° with live preview.", "RotateRight", "#8B5CF6"), - ["frypdf.tool.organize"] = new("Tools & Productivity", "Reorder, duplicate, delete, and sort pages visually in grid mode.", "ViewGridOutline", "#EC4899"), - ["frypdf.tool.crop"] = new("Tools & Productivity", "Trim margins and adjust page bounding boxes interactively.", "Crop", "#F43F5E"), - ["frypdf.tool.pagenumbers"] = new("Tools & Productivity", "Add customizable headers, footers, bates stamps, and pagination.", "Numeric1BoxOutline", "#10B981"), - - // Optimize & Security Tools - ["frypdf.tool.compress"] = new("Tools & Productivity", "Optimize raster images and remove redundant streams to reduce file size.", "ZipBoxOutline", "#06B6D4"), - ["frypdf.tool.repair"] = new("Tools & Productivity", "Recover damaged PDF xref tables and repair broken font dictionaries.", "AutoFix", "#F59E0B"), - ["frypdf.tool.protect"] = new("Security & Signatures", "Encrypt documents with AES-256 and restrict printing or copying.", "LockOutline", "#DC2626"), - ["frypdf.tool.unlock"] = new("Security & Signatures", "Remove owner permissions and passwords from authorized files.", "LockOpenVariantOutline", "#EA580C"), - ["frypdf.tool.sign"] = new("Security & Signatures", "Place cryptographic digital signatures, stamps, and handwritten initials.", "Draw", "#7C3AED"), - ["frypdf.tool.watermark"] = new("Tools & Productivity", "Apply transparent diagonal text, company logos, and draft stamps.", "Watermark", "#0284C7"), - ["frypdf.tool.redact"] = new("Security & Signatures", "Permanently sanitize sensitive text, PII, and rectangular regions.", "EyeOffOutline", "#334155"), - ["frypdf.tool.flatten"] = new("Tools & Productivity", "Burn annotations, form fields, and layers into page background raster.", "LayersTripleOutline", "#64748B"), - ["frypdf.tool.metadata"] = new("Tools & Productivity", "Inspect and edit XMP metadata: title, author, subject, keywords.", "CardTextOutline", "#6366F1"), - - // Convert To/From PDF - ["frypdf.tool.excel2pdf"] = new("Conversion & Office", "Convert spreadsheet sheets, tables, and workbooks to PDF.", "FileExcelOutline", "#107C41"), - ["frypdf.tool.pdf2excel"] = new("Conversion & Office", "Extract structured tabular data from PDF into editable XLSX.", "FileExcel", "#107C41"), - ["frypdf.tool.word2pdf"] = new("Conversion & Office", "Convert DOCX/DOC documents preserving typography and formatting.", "FileWordOutline", "#2B579A"), - ["frypdf.tool.pdf2word"] = new("Conversion & Office", "Reconstruct editable Word documents from fixed-layout PDFs.", "FileWord", "#2B579A"), - ["frypdf.tool.ppt2pdf"] = new("Conversion & Office", "Export presentation slides to high-resolution vector PDF.", "FilePowerpointOutline", "#D24726"), - ["frypdf.tool.pdf2ppt"] = new("Conversion & Office", "Convert presentation slides into editable PPTX decks.", "FilePowerpoint", "#D24726"), - ["frypdf.tool.pdf2jpg"] = new("Conversion & Office", "Rasterize PDF pages into high-resolution JPEG images.", "FileImageOutline", "#0284C7"), - ["frypdf.tool.jpg2pdf"] = new("Conversion & Office", "Assemble photo galleries and image scans into a PDF document.", "ImageMultipleOutline", "#0284C7"), - ["frypdf.tool.html2pdf"] = new("Conversion & Office", "Render responsive web pages and HTML reports with CSS styling.", "LanguageHtml5", "#E44D26"), - ["frypdf.tool.pdf2markdown"] = new("Conversion & Office", "Deconstruct PDF text into clean CommonMark/GitHub Markdown.", "LanguageMarkdown", "#0EA5E9"), - ["frypdf.tool.pdf2pdfa"] = new("Conversion & Office", "Convert documents to ISO 19005 archiving standards (PDF/A).", "ShieldCheckOutline", "#059669"), - ["frypdf.tool.scan2pdf"] = new("Tools & Productivity", "Acquire documents from hardware scanners and apply OCR cleanup.", "Scanner", "#64748B"), - - // Intelligence & AI Tools - ["frypdf.tool.aisummarizer"] = new("AI & Intelligence", "Generate executive summaries and key takeaway bullet points using LLMs.", "Creation", "#8B5CF6"), - ["frypdf.tool.translate"] = new("AI & Intelligence", "Translate document text into 50+ languages while preserving layout.", "Translate", "#3B82F6"), - ["frypdf.tool.ocr"] = new("Tools & Productivity", "Recognize scanned text using Tesseract 5 with Indic/CJK script support.", "TextRecognition", "#059669"), - ["frypdf.tool.compare"] = new("Tools & Productivity", "Visual side-by-side diff highlighting text and graphic alterations.", "CompareHorizontal", "#F59E0B"), - ["frypdf.tool.edit"] = new("Tools & Productivity", "Full-fidelity canvas editing: modify text, vectors, shapes, and images.", "FileDocumentEditOutline", "#4F46E5"), - - // AI Inference Providers - ["frypdf.ai.groq"] = new("AI & Intelligence", "Ultra-fast cloud inference provider powered by Groq LPUs.", "LightningBolt", "#F97316"), - ["frypdf.ai.ollama"] = new("AI & Intelligence", "100% private, local on-device LLM inference via Ollama.", "Laptop", "#10B981"), - ["frypdf.ai.openai"] = new("AI & Intelligence", "Cloud multimodal AI intelligence provider via OpenAI.", "Brain", "#06B6D4"), - - // Workspace Navigation Pages - ["frypdf.page.home"] = new("Workspace Pages", "Main dashboard landing page with quick launch and recent files.", "HomeOutline", "#3B82F6"), - ["frypdf.page.reader"] = new("Workspace Pages", "Dedicated full-screen PDF reader with continuous smooth scrolling.", "BookOpenPageVariantOutline", "#0284C7"), - ["frypdf.page.new"] = new("Workspace Pages", "Template gallery for creating professional documents from scratch.", "FileDocumentPlusOutline", "#10B981"), - ["frypdf.page.tools"] = new("Workspace Pages", "Centralized studio catalog featuring all 32 PDF tools.", "ViewGridOutline", "#8B5CF6"), - ["frypdf.page.starred"] = new("Workspace Pages", "Quick-access shelf for your favorite and pinned tools.", "StarOutline", "#F59E0B"), - ["frypdf.page.trash"] = new("Workspace Pages", "Cache management and disk storage cleaner for temp files.", "TrashCanOutline", "#64748B"), - ["frypdf.page.licensing"] = new("Workspace Pages", "Open-source attribution, third-party libraries, and license info.", "License", "#64748B"), - ["frypdf.page.fonts"] = new("Workspace Pages", "On-demand typography downloader and multi-script font packages.", "FormatFont", "#EC4899"), - ["frypdf.page.tesseract"] = new("Workspace Pages", "OCR language pack installer for offline text recognition.", "Translate", "#059669"), - ["frypdf.page.help"] = new("Workspace Pages", "Interactive tutorials, user manuals, and keyboard shortcut guides.", "HelpCircleOutline", "#0284C7"), - ["frypdf.page.settings"] = new("Workspace Pages", "Application preferences, theme switching, and hardware acceleration.", "CogOutline", "#64748B"), - ["frypdf.page.plugins"] = new("Workspace Pages", "Manage installed extensions, install packages, and browse the store.", "PuzzleOutline", "#7C3AED"), - - // Canvas Elements - ["frypdf.element.text"] = new("Canvas Elements", "Interactive typography block with Indic/CJK script-aware rendering.", "FormatText", "#3B82F6"), - ["frypdf.element.image"] = new("Canvas Elements", "Bitmap image container supporting PNG, JPEG, WebP, and SVG vectors.", "ImageOutline", "#10B981"), - ["frypdf.element.shape"] = new("Canvas Elements", "Bézier vector graphics, rectangles, ellipses, and arrow callouts.", "ShapeOutline", "#F59E0B"), - ["frypdf.element.table"] = new("Canvas Elements", "Data grid element with auto-pagination and cell styling.", "TableLarge", "#6366F1"), - ["frypdf.element.chart"] = new("Canvas Elements", "Vector charts: bar, line, pie, donut, and scatter plots.", "ChartBar", "#EC4899"), - ["frypdf.element.math"] = new("Canvas Elements", "LaTeX mathematical formula typesetting rendered via SkiaSharp.", "Sigma", "#8B5CF6"), - ["frypdf.element.form"] = new("Canvas Elements", "Fillable PDF form controls: textboxes, checkboxes, and signatures.", "FormSelect", "#06B6D4"), - - // Document I/O Engines - ["frypdf.io.questpdf"] = new("Document I/O", "High-performance vector PDF rendering and generation engine.", "FilePdfBox", "#DC2626"), - ["frypdf.io.pdfpig"] = new("Document I/O", "Deep structural PDF deconstruction, text clustering, and font extraction.", "BookSearchOutline", "#0284C7"), - ["frypdf.io.skia"] = new("Document I/O", "Cross-platform hardware-accelerated 2D raster and graphics pipeline.", "Draw", "#10B981"), - - // UI & Extensions - ["frypdf.sidebar.thumbnails"] = new("UI & Extensions", "Interactive visual page thumbnail sidebar with drag reordering.", "ViewListOutline", "#64748B"), - ["frypdf.sidebar.inspector"] = new("UI & Extensions", "Context-sensitive property inspector for selected canvas elements.", "TuneVertical", "#4F46E5"), - ["frypdf.dialog.plugins"] = new("UI & Extensions", "Fast-access modal dialog for quickly viewing installed extensions.", "WindowMaximize", "#7C3AED"), - ["frypdf.statusbar.core"] = new("UI & Extensions", "Status bar telemetry showing page count, zoom level, and ALC memory.", "DockBottom", "#64748B"), - ["frypdf.overlay.snake"] = new("UI & Extensions", "Playable, draggable retro-arcade Snake game floating over the application canvas in the 'shell.overlay' slot.", "GamepadVariantOutline", "#10B981") - }; - - private static string InferCategory(IFryPlugin plugin) - { - if (KnownPluginMetas.TryGetValue(plugin.Id, out var meta)) - return meta.Category; - - var id = plugin.Id.ToLowerInvariant(); - if (id.Contains("page")) return "Workspace Pages"; - if (id.Contains("tool")) return "Tools & Productivity"; - if (id.Contains("element")) return "Canvas Elements"; - if (id.Contains("io") || id.Contains("documentio")) return "Document I/O"; - if (id.Contains("ai")) return "AI & Intelligence"; - if (id.Contains("security") || id.Contains("sign") || id.Contains("protect")) return "Security & Signatures"; - if (id.Contains("convert") || id.Contains("excel") || id.Contains("word") || id.Contains("ppt")) return "Conversion & Office"; - if (id.Contains("sidebar") || id.Contains("dialog") || id.Contains("status")) return "UI & Extensions"; - return "General"; - } - - private static string InferDescription(IFryPlugin plugin) - { - if (KnownPluginMetas.TryGetValue(plugin.Id, out var meta)) - return meta.Description; - - return $"Modular studio component '{plugin.Name}' dynamically mounted into FryPDF microkernel."; - } - - private static string InferIcon(IFryPlugin plugin) - { - if (KnownPluginMetas.TryGetValue(plugin.Id, out var meta)) - return meta.Icon; - - var id = plugin.Id.ToLowerInvariant(); - if (id.Contains("ai")) return "Creation"; - if (id.Contains("ocr")) return "TextRecognition"; - if (id.Contains("tool")) return "WrenchOutline"; - if (id.Contains("element")) return "ShapeOutline"; - if (id.Contains("io")) return "FileDocumentOutline"; - if (id.Contains("page")) return "BookOpenPageVariantOutline"; - if (id.Contains("dialog")) return "WindowMaximize"; - if (id.Contains("sidebar")) return "DockRight"; - return "PuzzleOutline"; - } - - private static string InferColor(IFryPlugin plugin) - { - if (KnownPluginMetas.TryGetValue(plugin.Id, out var meta)) - return meta.Color; - - var id = plugin.Id.ToLowerInvariant(); - if (id.Contains("ai")) return "#8B5CF6"; - if (id.Contains("ocr")) return "#10B981"; - if (id.Contains("tool")) return "#3B82F6"; - if (id.Contains("element")) return "#EC4899"; - if (id.Contains("io")) return "#F59E0B"; - if (id.Contains("page")) return "#0284C7"; - return "#7C3AED"; - } -} diff --git a/src/PdfEditorApp/ViewModels/SettingsViewModel.cs b/src/PdfEditorApp/ViewModels/SettingsViewModel.cs deleted file mode 100644 index 6793dd5..0000000 --- a/src/PdfEditorApp/ViewModels/SettingsViewModel.cs +++ /dev/null @@ -1,459 +0,0 @@ -using System; -using Avalonia.Media; -using CommunityToolkit.Mvvm.ComponentModel; -using CommunityToolkit.Mvvm.Input; -using CommunityToolkit.Mvvm.Messaging; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Messages; -using PdfEditorApp.Models; -using PdfEditorApp.Services; - -namespace PdfEditorApp.ViewModels; - -/// -/// ViewModel managing user UI customization preferences, notification placements, and workspace behaviors. -/// -public partial class SettingsViewModel : ViewModelBase -{ - private readonly IUiSettingsService _uiSettingsService; - private readonly IThemeService? _themeService; - - public void TriggerToast(string message, ToastNotificationType type = ToastNotificationType.Primary, string? icon = null) - { - WeakReferenceMessenger.Default.Send(new ShowToastMessage(message, type, icon)); - } - - [ObservableProperty] - private ToastPosition _toastPosition; - - [ObservableProperty] - private ToastStyleVariant _toastStyleVariant; - - [ObservableProperty] - private int _toastDurationMs; - - [ObservableProperty] - private bool _toastShowCloseButton; - - [ObservableProperty] - private bool _toastSoundEnabled; - - [ObservableProperty] - private AppThemeMode _themeMode; - - [ObservableProperty] - private PdfReaderTheme _readingTheme; - - [ObservableProperty] - private bool _showGridByDefault; - - [ObservableProperty] - private bool _snapToGridByDefault; - - [ObservableProperty] - private GridSnapSize _gridSnapSize; - - [ObservableProperty] - private PdfViewerZoomMode _defaultZoomMode; - - [ObservableProperty] - private bool _compactRibbonByDefault; - - [ObservableProperty] - private bool _autoExpandInspectorOnSelect; - - [ObservableProperty] - private bool _showShortcutHints; - - // --- Interactive Live Preview State --- - - [ObservableProperty] - private ToastNotificationType _previewToastType = ToastNotificationType.Primary; - - [ObservableProperty] - private string _previewToastMessage = "Primary message comes here"; - - [ObservableProperty] - private string _previewToastIcon = "InformationOutline"; - - public bool PreviewIsSolid => ToastStyleVariant switch - { - ToastStyleVariant.Subtle => false, - ToastStyleVariant.Solid => true, - ToastStyleVariant.Auto => _themeService?.IsDarkMode ?? false, - _ => true - }; - - public IBrush PreviewBackgroundBrush - { - get - { - if (PreviewIsSolid) - { - return PreviewToastType switch - { - ToastNotificationType.Primary => Brush("#0F6CBD"), - ToastNotificationType.Success => Brush("#15803D"), - ToastNotificationType.Danger => Brush("#DC2626"), - ToastNotificationType.Warning => Brush("#D97706"), - ToastNotificationType.General => Brush("#1E293B"), - _ => Brush("#1E293B") - }; - } - - return (_themeService?.IsDarkMode == true) ? PreviewToastType switch - { - ToastNotificationType.Primary => Brush("#172554"), - ToastNotificationType.Success => Brush("#052E16"), - ToastNotificationType.Danger => Brush("#450A0A"), - ToastNotificationType.Warning => Brush("#451A03"), - ToastNotificationType.General => Brush("#18181B"), - _ => Brush("#18181B") - } : PreviewToastType switch - { - ToastNotificationType.Primary => Brush("#EFF6FF"), - ToastNotificationType.Success => Brush("#F0FDF4"), - ToastNotificationType.Danger => Brush("#FEF2F2"), - ToastNotificationType.Warning => Brush("#FFFBEB"), - ToastNotificationType.General => Brush("#F8FAFC"), - _ => Brush("#F8FAFC") - }; - } - } - - public IBrush PreviewForegroundBrush - { - get - { - if (PreviewIsSolid) return WhiteBrush; - - return (_themeService?.IsDarkMode == true) ? PreviewToastType switch - { - ToastNotificationType.Primary => Brush("#93C5FD"), - ToastNotificationType.Success => Brush("#86EFAC"), - ToastNotificationType.Danger => Brush("#FCA5A5"), - ToastNotificationType.Warning => Brush("#FCD34D"), - ToastNotificationType.General => Brush("#E2E8F0"), - _ => Brush("#E2E8F0") - } : PreviewToastType switch - { - ToastNotificationType.Primary => Brush("#1D4ED8"), - ToastNotificationType.Success => Brush("#15803D"), - ToastNotificationType.Danger => Brush("#B91C1C"), - ToastNotificationType.Warning => Brush("#B45309"), - ToastNotificationType.General => Brush("#334155"), - _ => Brush("#334155") - }; - } - } - - public IBrush PreviewBorderBrush - { - get - { - if (PreviewIsSolid) - { - return PreviewToastType switch - { - ToastNotificationType.Primary => Brush("#0D5CA0"), - ToastNotificationType.Success => Brush("#166534"), - ToastNotificationType.Danger => Brush("#B91C1C"), - ToastNotificationType.Warning => Brush("#B45309"), - ToastNotificationType.General => Brush("#0F172A"), - _ => Brush("#0F172A") - }; - } - - return (_themeService?.IsDarkMode == true) ? PreviewToastType switch - { - ToastNotificationType.Primary => Brush("#1E40AF"), - ToastNotificationType.Success => Brush("#166534"), - ToastNotificationType.Danger => Brush("#991B1B"), - ToastNotificationType.Warning => Brush("#92400E"), - ToastNotificationType.General => Brush("#3F3F46"), - _ => Brush("#3F3F46") - } : PreviewToastType switch - { - ToastNotificationType.Primary => Brush("#BFDBFE"), - ToastNotificationType.Success => Brush("#BBF7D0"), - ToastNotificationType.Danger => Brush("#FECACA"), - ToastNotificationType.Warning => Brush("#FDE68A"), - ToastNotificationType.General => Brush("#CBD5E1"), - _ => Brush("#CBD5E1") - }; - } - } - - public IBrush PreviewIconBrush => PreviewForegroundBrush; - public IBrush PreviewCloseBrush => PreviewIsSolid ? Brush("#CCFFFFFF") : PreviewForegroundBrush; - - private static readonly SolidColorBrush WhiteBrush = new(Color.Parse("#FFFFFF")); - private static SolidColorBrush Brush(string hex) => new(Color.Parse(hex)); - - public void RefreshPreview() - { - OnPropertyChanged(nameof(PreviewIsSolid)); - OnPropertyChanged(nameof(PreviewBackgroundBrush)); - OnPropertyChanged(nameof(PreviewForegroundBrush)); - OnPropertyChanged(nameof(PreviewBorderBrush)); - OnPropertyChanged(nameof(PreviewIconBrush)); - OnPropertyChanged(nameof(PreviewCloseBrush)); - } - - public AiSettingsViewModel AiSettings { get; } - - public SettingsViewModel() : this(new UiSettingsService(), new ThemeService()) - { - } - - public SettingsViewModel(IUiSettingsService uiSettingsService, IThemeService? themeService = null) - { - _uiSettingsService = uiSettingsService; - _themeService = themeService; - AiSettings = new AiSettingsViewModel(_uiSettingsService, new Services.AI.AiService()); - - LoadFromSettings(_uiSettingsService.Settings); - _uiSettingsService.SettingsChanged += LoadFromSettings; - - if (_themeService != null) - { - _themeService.ThemeChanged += (_) => RefreshPreview(); - } - } - - private void LoadFromSettings(UiSettingsModel s) - { - ToastPosition = s.ToastPosition; - ToastStyleVariant = s.ToastStyleVariant; - ToastDurationMs = s.ToastDurationMs; - ToastShowCloseButton = s.ToastShowCloseButton; - ToastSoundEnabled = s.ToastSoundEnabled; - ThemeMode = s.ThemeMode; - ReadingTheme = s.ReadingTheme; - ShowGridByDefault = s.ShowGridByDefault; - SnapToGridByDefault = s.SnapToGridByDefault; - GridSnapSize = s.GridSnapSize; - DefaultZoomMode = s.DefaultZoomMode; - CompactRibbonByDefault = s.CompactRibbonByDefault; - AutoExpandInspectorOnSelect = s.AutoExpandInspectorOnSelect; - ShowShortcutHints = s.ShowShortcutHints; - RefreshPreview(); - } - - // --- Position Selection Commands --- - - [RelayCommand] - public void SetToastPosition(object? param) - { - ToastPosition pos; - if (param is ToastPosition p) pos = p; - else if (param is string s && Enum.TryParse(s, true, out var parsed)) pos = parsed; - else return; - - ToastPosition = pos; - _uiSettingsService.UpdateSettings(s => s.ToastPosition = pos); - TriggerToast($"Notification placement set to {GetPositionName(pos)}", ToastNotificationType.Primary, "DockBottom"); - RefreshPreview(); - } - - [RelayCommand] - public void SetToastStyleVariant(object? param) - { - ToastStyleVariant variant; - if (param is ToastStyleVariant v) variant = v; - else if (param is string s && Enum.TryParse(s, true, out var parsed)) variant = parsed; - else return; - - ToastStyleVariant = variant; - _uiSettingsService.UpdateSettings(s => s.ToastStyleVariant = variant); - TriggerToast($"Snackbar visual style changed to {variant}", ToastNotificationType.Primary, "PaletteOutline"); - RefreshPreview(); - } - - [RelayCommand] - public void SetToastDuration(object? param) - { - int durationMs; - if (param is int d) durationMs = d; - else if (param is string s && int.TryParse(s, out var parsed)) durationMs = parsed; - else return; - - ToastDurationMs = durationMs; - _uiSettingsService.UpdateSettings(s => s.ToastDurationMs = durationMs); - string durLabel = durationMs > 0 ? $"{durationMs / 1000.0:0.#} seconds" : "Manual Close Only"; - TriggerToast($"Notification timeout set to {durLabel}", ToastNotificationType.General, "ClockOutline"); - } - - [RelayCommand] - public void ToggleToastCloseButton() - { - ToastShowCloseButton = !ToastShowCloseButton; - _uiSettingsService.UpdateSettings(s => s.ToastShowCloseButton = ToastShowCloseButton); - RefreshPreview(); - } - - [RelayCommand] - public void ToggleToastSound() - { - ToastSoundEnabled = !ToastSoundEnabled; - _uiSettingsService.UpdateSettings(s => s.ToastSoundEnabled = ToastSoundEnabled); - } - - [RelayCommand] - public void SetThemeMode(object? param) - { - AppThemeMode mode; - if (param is AppThemeMode m) mode = m; - else if (param is string s && Enum.TryParse(s, true, out var parsed)) mode = parsed; - else return; - - ThemeMode = mode; - _uiSettingsService.UpdateSettings(s => s.ThemeMode = mode); - _themeService?.SetTheme(mode); - RefreshPreview(); - } - - [RelayCommand] - public void SetReadingTheme(object? param) - { - PdfReaderTheme theme; - if (param is PdfReaderTheme t) theme = t; - else if (param is string s && Enum.TryParse(s, true, out var parsed)) theme = parsed; - else return; - - ReadingTheme = theme; - _uiSettingsService.UpdateSettings(s => s.ReadingTheme = theme); - _themeService?.SetReadingTheme(theme); - } - - [RelayCommand] - public void ToggleGridByDefault() - { - ShowGridByDefault = !ShowGridByDefault; - _uiSettingsService.UpdateSettings(s => s.ShowGridByDefault = ShowGridByDefault); - } - - [RelayCommand] - public void ToggleSnapByDefault() - { - SnapToGridByDefault = !SnapToGridByDefault; - _uiSettingsService.UpdateSettings(s => s.SnapToGridByDefault = SnapToGridByDefault); - } - - [RelayCommand] - public void SetGridSnapSize(object? param) - { - GridSnapSize size; - if (param is GridSnapSize g) size = g; - else if (param is string s && Enum.TryParse(s, true, out var parsed)) size = parsed; - else return; - - GridSnapSize = size; - _uiSettingsService.UpdateSettings(s => s.GridSnapSize = size); - } - - [RelayCommand] - public void SetDefaultZoomMode(object? param) - { - PdfViewerZoomMode mode; - if (param is PdfViewerZoomMode m) mode = m; - else if (param is string s && Enum.TryParse(s, true, out var parsed)) mode = parsed; - else return; - - DefaultZoomMode = mode; - _uiSettingsService.UpdateSettings(s => s.DefaultZoomMode = mode); - } - - [RelayCommand] - public void ToggleCompactRibbon() - { - CompactRibbonByDefault = !CompactRibbonByDefault; - _uiSettingsService.UpdateSettings(s => s.CompactRibbonByDefault = CompactRibbonByDefault); - } - - [RelayCommand] - public void ToggleAutoExpandInspector() - { - AutoExpandInspectorOnSelect = !AutoExpandInspectorOnSelect; - _uiSettingsService.UpdateSettings(s => s.AutoExpandInspectorOnSelect = AutoExpandInspectorOnSelect); - } - - [RelayCommand] - public void ToggleShortcutHints() - { - ShowShortcutHints = !ShowShortcutHints; - _uiSettingsService.UpdateSettings(s => s.ShowShortcutHints = ShowShortcutHints); - } - - [RelayCommand] - public void ResetAllDefaults() - { - _uiSettingsService.ResetToDefaults(); - LoadFromSettings(_uiSettingsService.Settings); - RefreshPreview(); - TriggerToast("All UI preferences reset to factory defaults", ToastNotificationType.Success, "Restore"); - } - - // --- Interactive Live Test Playground Commands --- - - [RelayCommand] - public void TestPrimaryNotification() - { - PreviewToastType = ToastNotificationType.Primary; - PreviewToastMessage = "Primary message comes here"; - PreviewToastIcon = "InformationOutline"; - RefreshPreview(); - TriggerToast("Primary message comes here", ToastNotificationType.Primary, "InformationOutline"); - } - - [RelayCommand] - public void TestSuccessNotification() - { - PreviewToastType = ToastNotificationType.Success; - PreviewToastMessage = "Success message comes here"; - PreviewToastIcon = "CheckCircleOutline"; - RefreshPreview(); - TriggerToast("Success message comes here", ToastNotificationType.Success, "CheckCircleOutline"); - } - - [RelayCommand] - public void TestDangerNotification() - { - PreviewToastType = ToastNotificationType.Danger; - PreviewToastMessage = "Danger message comes here"; - PreviewToastIcon = "AlertOctagonOutline"; - RefreshPreview(); - TriggerToast("Danger message comes here", ToastNotificationType.Danger, "AlertOctagonOutline"); - } - - [RelayCommand] - public void TestWarningNotification() - { - PreviewToastType = ToastNotificationType.Warning; - PreviewToastMessage = "Warning message comes here"; - PreviewToastIcon = "AlertOutline"; - RefreshPreview(); - TriggerToast("Warning message comes here", ToastNotificationType.Warning, "AlertOutline"); - } - - [RelayCommand] - public void TestGeneralNotification() - { - PreviewToastType = ToastNotificationType.General; - PreviewToastMessage = "General message comes here"; - PreviewToastIcon = "InformationOutline"; - RefreshPreview(); - TriggerToast("General message comes here", ToastNotificationType.General, "InformationOutline"); - } - - private static string GetPositionName(ToastPosition pos) => pos switch - { - ToastPosition.TopLeft => "Top-Left", - ToastPosition.TopCenter => "Top-Center", - ToastPosition.TopRight => "Top-Right", - ToastPosition.BottomLeft => "Bottom-Left", - ToastPosition.BottomCenter => "Bottom-Center", - ToastPosition.BottomRight => "Bottom-Right", - _ => "Bottom-Center" - }; -} diff --git a/src/PdfEditorApp/ViewModels/Shell/PdfLivePreviewViewModel.cs b/src/PdfEditorApp/ViewModels/Shell/PdfLivePreviewViewModel.cs deleted file mode 100644 index 8399cf5..0000000 --- a/src/PdfEditorApp/ViewModels/Shell/PdfLivePreviewViewModel.cs +++ /dev/null @@ -1,313 +0,0 @@ -using System; -using System.Collections.ObjectModel; -using System.IO; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using Avalonia.Threading; -using CommunityToolkit.Mvvm.ComponentModel; -using CommunityToolkit.Mvvm.Input; -using PdfEditorApp.Models; -using PdfEditorApp.Services.Tools.Core; - -namespace PdfEditorApp.ViewModels.Shell; - -/// -/// Shared live-preview state (page navigation, zoom, rendered pages) for tool screens, -/// built on . One instance is owned by -/// so every tool gets -/// the same reader-style preview instead of reimplementing rendering/zoom/page-nav -/// per tool (as RedactPdfToolViewModel previously did independently). -/// -public partial class PdfLivePreviewViewModel : ObservableObject -{ - private const float ThumbnailScale = 0.35f; - private const double MinZoom = 0.5; - private const double MaxZoom = 3.0; - private const double ZoomStep = 0.25; - - private string? _loadedFilePath; - private CancellationTokenSource? _loadCts; - private CancellationTokenSource? _zoomRenderCts; - - public ObservableCollection Pages { get; } = new(); - - [ObservableProperty] - private int _currentPageNumber = 1; - - [ObservableProperty] - private int _totalPages; - - [ObservableProperty] - private double _zoomLevel = 1.0; - - [ObservableProperty] - private bool _isLoading; - - [ObservableProperty] - private PdfToolPreviewPage? _selectedPage; - - [ObservableProperty] - private bool _isTextDocument; - - [ObservableProperty] - private string _textDocumentContent = string.Empty; - - [ObservableProperty] - private int _textDocumentLinesCount; - - [ObservableProperty] - private int _textDocumentWordsCount; - - [ObservableProperty] - private string _textDocumentFileName = string.Empty; - - public bool HasDocument => TotalPages > 0 || IsTextDocument; - public string ZoomPercentText => $"{ZoomLevel * 100:F0}%"; - public string PageIndicatorText => IsTextDocument - ? (TextDocumentLinesCount > 0 ? $"{TextDocumentLinesCount} lines" : "Text Document") - : (TotalPages > 0 ? $"Page {CurrentPageNumber} of {TotalPages}" : "No document"); - public bool CanGoToPreviousPage => CurrentPageNumber > 1; - public bool CanGoToNextPage => CurrentPageNumber < TotalPages; - public bool CanZoomIn => ZoomLevel < MaxZoom - 0.001; - public bool CanZoomOut => ZoomLevel > MinZoom + 0.001; - - partial void OnCurrentPageNumberChanged(int value) - { - OnPropertyChanged(nameof(PageIndicatorText)); - OnPropertyChanged(nameof(CanGoToPreviousPage)); - OnPropertyChanged(nameof(CanGoToNextPage)); - - foreach (var page in Pages) - { - page.IsSelected = page.PageNumber == value; - } - SelectedPage = Pages.FirstOrDefault(p => p.PageNumber == value); - - EnsurePageRendered(value); - } - - partial void OnTotalPagesChanged(int value) - { - OnPropertyChanged(nameof(HasDocument)); - OnPropertyChanged(nameof(PageIndicatorText)); - OnPropertyChanged(nameof(CanGoToNextPage)); - } - - partial void OnZoomLevelChanged(double value) - { - OnPropertyChanged(nameof(ZoomPercentText)); - OnPropertyChanged(nameof(CanZoomIn)); - OnPropertyChanged(nameof(CanZoomOut)); - - // Debounced so rapid zooming doesn't trigger a render per tick (matches the - // PDF Reader's own zoom-debounce behavior). - _zoomRenderCts?.Cancel(); - var cts = new CancellationTokenSource(); - _zoomRenderCts = cts; - _ = RerenderCurrentPageAfterZoomDebounceAsync(cts.Token); - } - - private async Task RerenderCurrentPageAfterZoomDebounceAsync(CancellationToken ct) - { - try { await Task.Delay(150, ct); } - catch (OperationCanceledException) { return; } - if (ct.IsCancellationRequested) return; - EnsurePageRendered(CurrentPageNumber, forceRerender: true); - } - - [RelayCommand] - private void ZoomIn() => ZoomLevel = Math.Min(MaxZoom, Math.Round(ZoomLevel + ZoomStep, 2)); - - [RelayCommand] - private void ZoomOut() => ZoomLevel = Math.Max(MinZoom, Math.Round(ZoomLevel - ZoomStep, 2)); - - [RelayCommand] - private void ResetZoom() => ZoomLevel = 1.0; - - [RelayCommand] - private void NextPage() - { - if (CanGoToNextPage) CurrentPageNumber++; - } - - [RelayCommand] - private void PreviousPage() - { - if (CanGoToPreviousPage) CurrentPageNumber--; - } - - [RelayCommand] - private void SelectPage(PdfToolPreviewPage? page) - { - if (page != null) CurrentPageNumber = page.PageNumber; - } - - /// - /// Loads (or clears, if is null/empty) the document the - /// preview shows. Safe to call repeatedly as the tool's selected file changes. - /// Supports both PDF documents and plain text / markdown files (.txt, .md, .csv, .log). - /// - public async Task LoadDocumentAsync(string? filePath) - { - _loadCts?.Cancel(); - var cts = new CancellationTokenSource(); - _loadCts = cts; - - Pages.Clear(); - CurrentPageNumber = 1; - TotalPages = 0; - ZoomLevel = 1.0; - SelectedPage = null; - _loadedFilePath = filePath; - IsTextDocument = false; - TextDocumentContent = string.Empty; - TextDocumentFileName = string.Empty; - TextDocumentLinesCount = 0; - TextDocumentWordsCount = 0; - - if (string.IsNullOrEmpty(filePath) || !File.Exists(filePath)) - { - return; - } - - string ext = Path.GetExtension(filePath).ToLowerInvariant(); - if (ext is ".txt" or ".text" or ".md" or ".json" or ".csv" or ".tsv" or ".log") - { - IsLoading = true; - try - { - string text = await File.ReadAllTextAsync(filePath, cts.Token); - if (cts.Token.IsCancellationRequested || filePath != _loadedFilePath) return; - - TextDocumentContent = text; - TextDocumentFileName = Path.GetFileName(filePath); - var lines = text.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None); - TextDocumentLinesCount = lines.Length; - TextDocumentWordsCount = text.Split(new[] { ' ', '\r', '\n', '\t' }, StringSplitOptions.RemoveEmptyEntries).Length; - TotalPages = 1; - CurrentPageNumber = 1; - IsTextDocument = true; - } - catch (Exception ex) - { - TextDocumentContent = $"[Error loading text file: {ex.Message}]"; - IsTextDocument = true; - } - finally - { - IsLoading = false; - } - return; - } - - IsLoading = true; - try - { - int total = await Task.Run(() => PdfFileHelper.InspectPageCountSafely(filePath), cts.Token); - if (cts.Token.IsCancellationRequested || filePath != _loadedFilePath) return; - - TotalPages = total; - for (int i = 1; i <= total; i++) - { - Pages.Add(new PdfToolPreviewPage { PageNumber = i, IsSelected = i == 1 }); - } - SelectedPage = Pages.FirstOrDefault(); - - if (total > 0) - { - await RenderPageCoreAsync(1, BaseScaleForZoom(ZoomLevel), cts.Token); - _ = LoadThumbnailsInBackgroundAsync(filePath, cts.Token); - } - } - finally - { - IsLoading = false; - } - } - - /// - /// Directly loads text content into the live preview canvas without requiring a file on disk. - /// - public void LoadTextContent(string text, string title = "Extracted_Text.txt") - { - _loadCts?.Cancel(); - Pages.Clear(); - SelectedPage = null; - TotalPages = 1; - CurrentPageNumber = 1; - ZoomLevel = 1.0; - _loadedFilePath = null; - - TextDocumentContent = text; - TextDocumentFileName = title; - var lines = text.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None); - TextDocumentLinesCount = lines.Length; - TextDocumentWordsCount = text.Split(new[] { ' ', '\r', '\n', '\t' }, StringSplitOptions.RemoveEmptyEntries).Length; - IsTextDocument = true; - } - - private async Task LoadThumbnailsInBackgroundAsync(string filePath, CancellationToken ct) - { - foreach (var page in Pages.ToList()) - { - if (ct.IsCancellationRequested || filePath != _loadedFilePath) return; - - var (bitmap, widthPoints, heightPoints) = await Task.Run( - () => PdfPageRenderer.RenderPageAtScale(filePath, page.PageNumber, ThumbnailScale), ct); - - if (ct.IsCancellationRequested || filePath != _loadedFilePath) return; - - if (widthPoints > 0) page.WidthPoints = widthPoints; - if (heightPoints > 0) page.HeightPoints = heightPoints; - if (bitmap != null) page.ThumbnailBitmap = bitmap; - } - } - - private float BaseScaleForZoom(double zoomLevel) => (float)Math.Clamp(1.75 * zoomLevel, 1.25, 4.0); - - /// Re-renders a page at a zoom-appropriate resolution if it hasn't been rendered yet, or the zoom level has moved enough to need a sharper bitmap. - private void EnsurePageRendered(int pageNumber, bool forceRerender = false) - { - var page = Pages.FirstOrDefault(p => p.PageNumber == pageNumber); - if (page == null || string.IsNullOrEmpty(_loadedFilePath)) return; - - float targetScale = BaseScaleForZoom(ZoomLevel); - if (!forceRerender && page.Bitmap != null && Math.Abs(page.RenderedScale - targetScale) <= 0.4f) return; - - string filePath = _loadedFilePath; - Task.Run(() => - { - var (bitmap, widthPoints, heightPoints) = PdfPageRenderer.RenderPageAtScale(filePath, pageNumber, targetScale); - if (bitmap == null || filePath != _loadedFilePath) return; - - Dispatcher.UIThread.Post(() => - { - if (filePath != _loadedFilePath) return; - page.Bitmap = bitmap; - page.RenderedScale = targetScale; - if (widthPoints > 0) page.WidthPoints = widthPoints; - if (heightPoints > 0) page.HeightPoints = heightPoints; - }); - }); - } - - private async Task RenderPageCoreAsync(int pageNumber, float scale, CancellationToken ct) - { - var page = Pages.FirstOrDefault(p => p.PageNumber == pageNumber); - if (page == null) return; - - string? filePath = _loadedFilePath; - if (string.IsNullOrEmpty(filePath)) return; - - var (bitmap, widthPoints, heightPoints) = await Task.Run( - () => PdfPageRenderer.RenderPageAtScale(filePath, pageNumber, scale), ct); - - if (ct.IsCancellationRequested || filePath != _loadedFilePath) return; - - page.Bitmap = bitmap; - page.RenderedScale = scale; - if (widthPoints > 0) page.WidthPoints = widthPoints; - if (heightPoints > 0) page.HeightPoints = heightPoints; - } -} diff --git a/src/PdfEditorApp/ViewModels/StatusBarWidgetViewModel.cs b/src/PdfEditorApp/ViewModels/StatusBarWidgetViewModel.cs deleted file mode 100644 index 9158cdb..0000000 --- a/src/PdfEditorApp/ViewModels/StatusBarWidgetViewModel.cs +++ /dev/null @@ -1,34 +0,0 @@ -using System.Windows.Input; -using CommunityToolkit.Mvvm.ComponentModel; - -namespace PdfEditorApp.ViewModels; - -/// -/// Presentation model for a status bar widget contributed dynamically by a plugin. -/// -public partial class StatusBarWidgetViewModel : ViewModelBase -{ - [ObservableProperty] - private string _widgetId = ""; - - [ObservableProperty] - private string? _label; - - [ObservableProperty] - private string? _toolTip; - - [ObservableProperty] - private string? _iconKind; - - [ObservableProperty] - private bool _isActive = true; - - [ObservableProperty] - private object? _content; - - [ObservableProperty] - private ICommand? _command; - - [ObservableProperty] - private object? _commandParameter; -} diff --git a/src/PdfEditorApp/ViewModels/TemplateCardViewModel.cs b/src/PdfEditorApp/ViewModels/TemplateCardViewModel.cs deleted file mode 100644 index 055a1d4..0000000 --- a/src/PdfEditorApp/ViewModels/TemplateCardViewModel.cs +++ /dev/null @@ -1,49 +0,0 @@ -using CommunityToolkit.Mvvm.ComponentModel; -using PdfEditorApp.Models; - -namespace PdfEditorApp.ViewModels; - -/// -/// Represents a template card in the Home View and Template Gallery, -/// holding its metadata and high-fidelity live preview. -/// -public partial class TemplateCardViewModel : ViewModelBase -{ - [ObservableProperty] - private string _id = ""; - - [ObservableProperty] - private string _name = ""; - - [ObservableProperty] - private string _category = "General"; - - [ObservableProperty] - private string _subtitle = ""; - - [ObservableProperty] - private string _description = ""; - - [ObservableProperty] - private string _badge = ""; - - [ObservableProperty] - private string _accentColorHex = "#0F6CBD"; - - [ObservableProperty] - private string _iconKind = "FileDocumentOutline"; - - [ObservableProperty] - private PageViewModel _pagePreview = new(); - - [ObservableProperty] - private bool _isBlank; - - [ObservableProperty] - private bool _isLandscape; - - [ObservableProperty] - private bool _isFeatured; - - public double AspectRatio => PagePreview.Height > 0 ? PagePreview.Width / PagePreview.Height : 0.707; -} diff --git a/src/PdfEditorApp/ViewModels/TesseractManagerViewModel.cs b/src/PdfEditorApp/ViewModels/TesseractManagerViewModel.cs deleted file mode 100644 index 9684d30..0000000 --- a/src/PdfEditorApp/ViewModels/TesseractManagerViewModel.cs +++ /dev/null @@ -1,325 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Diagnostics; -using System.IO; -using System.Linq; -using System.Threading.Tasks; -using CommunityToolkit.Mvvm.ComponentModel; -using CommunityToolkit.Mvvm.Input; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Services.Ocr; - -namespace PdfEditorApp.ViewModels; - -/// -/// ViewModel representing an individual downloadable Tesseract OCR language model (.traineddata). -/// -public partial class TesseractLanguageItemViewModel : ObservableObject -{ - private readonly ITesseractModelService _modelService; - - public TesseractLanguagePackageInfo Model { get; } - - public string Code => Model.Code; - public string DisplayName => Model.DisplayName; - public string NativeName => Model.NativeName; - public string FlagEmoji => Model.FlagEmoji; - public string Category => Model.Category; - public string Description => Model.Description; - public string SampleText => Model.SampleText; - public string FormattedSize => Model.FormattedSize; - public string FileName => Model.FileName; - - [ObservableProperty] - private bool _isInstalled; - - [ObservableProperty] - private bool _isDownloading; - - [ObservableProperty] - private double _downloadProgress; - - [ObservableProperty] - private string _statusText = "Available"; - - [ObservableProperty] - private string _progressText = ""; - - public TesseractLanguageItemViewModel(TesseractLanguagePackageInfo model, ITesseractModelService modelService) - { - Model = model; - _modelService = modelService; - RefreshStatus(); - } - - public void RefreshStatus() - { - IsInstalled = _modelService.IsLanguageInstalled(Model.Code); - Model.IsInstalled = IsInstalled; - if (IsInstalled) - { - StatusText = "Installed & Active"; - DownloadProgress = 1.0; - } - else - { - StatusText = $"Available ({FormattedSize})"; - DownloadProgress = 0.0; - } - } - - [RelayCommand] - public async Task DownloadAsync() - { - if (IsDownloading || IsInstalled) return; - - IsDownloading = true; - StatusText = "Connecting..."; - ProgressText = "0%"; - DownloadProgress = 0.0; - - var progress = new Progress(p => - { - DownloadProgress = p; - ProgressText = $"{p * 100:F0}%"; - StatusText = $"Downloading {ProgressText} ({FormattedSize})"; - }); - - bool success = await _modelService.DownloadLanguageAsync(Model.Code, progress, status => - { - StatusText = status; - }); - - IsDownloading = false; - IsInstalled = success; - Model.IsInstalled = success; - - if (success) - { - StatusText = "Installed & Ready"; - DownloadProgress = 1.0; - } - else - { - StatusText = "Download Failed (Retry)"; - } - } - - [RelayCommand] - public async Task DeleteAsync() - { - if (IsDownloading) return; - - bool deleted = await _modelService.DeleteLanguageAsync(Model.Code); - if (deleted) - { - IsInstalled = false; - Model.IsInstalled = false; - StatusText = $"Available ({FormattedSize})"; - DownloadProgress = 0.0; - } - } -} - -/// -/// Main ViewModel for the On-Demand Tesseract OCR Models & Language Studio. -/// Allows users to browse, search, download, and delete trained neural models on demand. -/// -public partial class TesseractManagerViewModel : ViewModelBase -{ - private readonly ITesseractModelService _modelService; - - [ObservableProperty] - private string _searchQuery = ""; - - [ObservableProperty] - private string _selectedCategory = "All"; - - [ObservableProperty] - private string _totalCacheSizeFormatted = "0 MB"; - - [ObservableProperty] - private int _installedCount; - - [ObservableProperty] - private int _totalLanguagesCount; - - [ObservableProperty] - private bool _isDownloadingAll; - - [ObservableProperty] - private string _globalStatusMessage = ""; - - [ObservableProperty] - private bool _isTesseractCliInstalled; - - [ObservableProperty] - private string _tesseractCliStatusText = "Checking runtime..."; - - public string TessDataDirectory => _modelService.TessDataDirectory; - - public ObservableCollection AllLanguages { get; } = new(); - public ObservableCollection FilteredLanguages { get; } = new(); - - public TesseractManagerViewModel() : this(new TesseractModelService()) { } - - public TesseractManagerViewModel(ITesseractModelService modelService) - { - _modelService = modelService; - _modelService.LanguageLibraryChanged += OnLanguageLibraryChanged; - - CheckCliRuntime(); - InitializeLanguages(); - _ = RefreshStatsAsync(); - } - - private void CheckCliRuntime() - { - string? path = _modelService.GetTesseractCliPath(); - IsTesseractCliInstalled = !string.IsNullOrEmpty(path); - TesseractCliStatusText = IsTesseractCliInstalled - ? $"Tesseract Runtime Active ({Path.GetFileName(path)})" - : "No CLI on PATH (OS Native OCR or .traineddata will be used)"; - } - - private void InitializeLanguages() - { - AllLanguages.Clear(); - foreach (var lang in _modelService.AvailableLanguages) - { - AllLanguages.Add(new TesseractLanguageItemViewModel(lang, _modelService)); - } - - TotalLanguagesCount = AllLanguages.Count; - ApplyFilter(); - } - - private void OnLanguageLibraryChanged() - { - foreach (var item in AllLanguages) - { - item.RefreshStatus(); - } - _ = RefreshStatsAsync(); - ApplyFilter(); - } - - public async Task RefreshStatsAsync() - { - long bytes = await _modelService.GetTotalCacheSizeBytesAsync(); - TotalCacheSizeFormatted = TesseractLanguagePackageInfo.FormatBytes(bytes); - InstalledCount = AllLanguages.Count(l => l.IsInstalled); - } - - partial void OnSearchQueryChanged(string value) => ApplyFilter(); - partial void OnSelectedCategoryChanged(string value) => ApplyFilter(); - - [RelayCommand] - public void SelectCategory(string category) - { - SelectedCategory = category; - } - - private void ApplyFilter() - { - FilteredLanguages.Clear(); - string query = SearchQuery.Trim().ToLowerInvariant(); - - foreach (var item in AllLanguages) - { - // Category filter - bool matchesCategory = SelectedCategory switch - { - "All" => true, - "Installed" => item.IsInstalled, - "European" => item.Category.Contains("Latin", StringComparison.OrdinalIgnoreCase) || item.Category.Contains("European", StringComparison.OrdinalIgnoreCase), - "EastAsia" => item.Category.Contains("East Asia", StringComparison.OrdinalIgnoreCase) && !item.Category.Contains("Southeast", StringComparison.OrdinalIgnoreCase), - "SouthAsia" => item.Category.Contains("South Asia", StringComparison.OrdinalIgnoreCase) || item.Category.Contains("Indic", StringComparison.OrdinalIgnoreCase), - "MiddleEast" => item.Category.Contains("Middle East", StringComparison.OrdinalIgnoreCase), - "SoutheastAsia" => item.Category.Contains("Southeast", StringComparison.OrdinalIgnoreCase), - "Specialized" => item.Category.Contains("Specialized", StringComparison.OrdinalIgnoreCase) || item.Category.Contains("Math", StringComparison.OrdinalIgnoreCase), - _ => true - }; - - if (!matchesCategory) continue; - - // Search query filter - if (!string.IsNullOrEmpty(query)) - { - bool matchesSearch = - item.Code.ToLowerInvariant().Contains(query) || - item.DisplayName.ToLowerInvariant().Contains(query) || - item.NativeName.ToLowerInvariant().Contains(query) || - item.Description.ToLowerInvariant().Contains(query) || - item.Category.ToLowerInvariant().Contains(query) || - item.FileName.ToLowerInvariant().Contains(query); - - if (!matchesSearch) continue; - } - - FilteredLanguages.Add(item); - } - } - - [RelayCommand] - public async Task DownloadAllAsync() - { - if (IsDownloadingAll) return; - - IsDownloadingAll = true; - GlobalStatusMessage = "Downloading all OCR language models..."; - - var uninstalled = AllLanguages.Where(l => !l.IsInstalled).ToList(); - int completed = 0; - - foreach (var lang in uninstalled) - { - GlobalStatusMessage = $"Downloading {lang.DisplayName} ({completed + 1}/{uninstalled.Count})..."; - await lang.DownloadAsync(); - completed++; - } - - IsDownloadingAll = false; - GlobalStatusMessage = "All OCR models downloaded successfully!"; - await RefreshStatsAsync(); - } - - [RelayCommand] - public async Task ClearAllCacheAsync() - { - await _modelService.ClearAllCacheAsync(); - foreach (var lang in AllLanguages) - { - lang.RefreshStatus(); - } - await RefreshStatsAsync(); - ApplyFilter(); - GlobalStatusMessage = "OCR models cache cleared. Storage reclaimed."; - } - - [RelayCommand] - public void OpenTessDataFolder() - { - try - { - string dir = TessDataDirectory; - if (!Directory.Exists(dir)) - Directory.CreateDirectory(dir); - - if (OperatingSystem.IsMacOS()) - { - Process.Start("open", dir); - } - else if (OperatingSystem.IsWindows()) - { - Process.Start("explorer.exe", dir); - } - else - { - Process.Start("xdg-open", dir); - } - } - catch { } - } -} diff --git a/src/PdfEditorApp/ViewModels/Tools/Conversion/ExcelToPdfToolViewModel.cs b/src/PdfEditorApp/ViewModels/Tools/Conversion/ExcelToPdfToolViewModel.cs deleted file mode 100644 index d690d67..0000000 --- a/src/PdfEditorApp/ViewModels/Tools/Conversion/ExcelToPdfToolViewModel.cs +++ /dev/null @@ -1,32 +0,0 @@ -using PdfEditorApp.ViewModels.Tools.Core; -using System; -using System.Threading; -using System.Threading.Tasks; -using CommunityToolkit.Mvvm.ComponentModel; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Models; -using PdfEditorApp.Services; - -namespace PdfEditorApp.ViewModels.Tools.Conversion; - -public partial class ExcelToPdfToolViewModel : PdfToolViewModelBase -{ - [ObservableProperty] - private PageOrientation _orientation = PageOrientation.Landscape; - - public override bool UsesWorkspaceShell => true; - - public ExcelToPdfToolViewModel(IPdfDocumentOperationsService operationsService, PdfToolDefinition tool) - : base(operationsService, tool) - { - } - - protected override async Task ExecuteCoreAsync(IProgress progress, CancellationToken ct) - { - return await ExecuteBatchAsync(file => new OfficeToPdfOptions - { - InputFilePath = file, - Orientation = Orientation - }, progress, ct); - } -} diff --git a/src/PdfEditorApp/ViewModels/Tools/Conversion/HtmlToPdfToolViewModel.cs b/src/PdfEditorApp/ViewModels/Tools/Conversion/HtmlToPdfToolViewModel.cs deleted file mode 100644 index b5be15f..0000000 --- a/src/PdfEditorApp/ViewModels/Tools/Conversion/HtmlToPdfToolViewModel.cs +++ /dev/null @@ -1,64 +0,0 @@ -using PdfEditorApp.ViewModels.Tools.Core; -using System; -using System.Threading; -using System.Threading.Tasks; -using CommunityToolkit.Mvvm.ComponentModel; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Models; -using PdfEditorApp.Services; - -namespace PdfEditorApp.ViewModels.Tools.Conversion; - -public partial class HtmlToPdfToolViewModel : PdfToolViewModelBase -{ - [ObservableProperty] - private string _htmlContentOrUrl = "https://"; - - [ObservableProperty] - private PageFormat _format = PageFormat.A4; - - [ObservableProperty] - private PageOrientation _orientation = PageOrientation.Portrait; - - [ObservableProperty] - private double _marginPoints = 36; - - [ObservableProperty] - private bool _includePageNumbers = true; - - public override bool UsesWorkspaceShell => true; - - public HtmlToPdfToolViewModel(IPdfDocumentOperationsService operationsService, PdfToolDefinition tool) - : base(operationsService, tool) - { - } - - protected override bool ValidateInputs(out string errorMessage) - { - if (string.IsNullOrWhiteSpace(HtmlContentOrUrl)) - { - errorMessage = "Please enter a valid URL or HTML content."; - return false; - } - errorMessage = string.Empty; - return true; - } - - protected override async Task ExecuteCoreAsync(IProgress progress, CancellationToken ct) - { - bool isUrl = HtmlContentOrUrl.StartsWith("http://", StringComparison.OrdinalIgnoreCase) || - HtmlContentOrUrl.StartsWith("https://", StringComparison.OrdinalIgnoreCase); - - var options = new HtmlToPdfOptions - { - HtmlContentOrUrl = HtmlContentOrUrl, - IsUrl = isUrl, - Format = Format, - Orientation = Orientation, - MarginPoints = MarginPoints, - IncludePageNumbers = IncludePageNumbers - }; - - return await OperationsService.ExecuteToolAsync(PdfToolId.HtmlToPdf, options, progress, ct); - } -} diff --git a/src/PdfEditorApp/ViewModels/Tools/Conversion/JpgToPdfToolViewModel.cs b/src/PdfEditorApp/ViewModels/Tools/Conversion/JpgToPdfToolViewModel.cs deleted file mode 100644 index 0e912fd..0000000 --- a/src/PdfEditorApp/ViewModels/Tools/Conversion/JpgToPdfToolViewModel.cs +++ /dev/null @@ -1,55 +0,0 @@ -using PdfEditorApp.ViewModels.Tools.Core; -using System; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using CommunityToolkit.Mvvm.ComponentModel; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Models; -using PdfEditorApp.Services; - -namespace PdfEditorApp.ViewModels.Tools.Conversion; - -public partial class JpgToPdfToolViewModel : PdfToolViewModelBase -{ - [ObservableProperty] - private PageFormat _pageFormat = PageFormat.A4; - - [ObservableProperty] - private PageOrientation _orientation = PageOrientation.Portrait; - - [ObservableProperty] - private bool _autoOrientation = true; - - [ObservableProperty] - private bool _fitToPage = true; - - [ObservableProperty] - private double _marginPoints = 20; - - [ObservableProperty] - private int _imagesPerPage = 1; - - public override bool UsesWorkspaceShell => true; - - public JpgToPdfToolViewModel(IPdfDocumentOperationsService operationsService, PdfToolDefinition tool) - : base(operationsService, tool) - { - } - - protected override async Task ExecuteCoreAsync(IProgress progress, CancellationToken ct) - { - var options = new ImagesToPdfOptions - { - ImageFiles = SelectedFiles.ToList(), - PageFormat = PageFormat, - Orientation = Orientation, - AutoOrientation = AutoOrientation, - FitToPage = FitToPage, - MarginPoints = MarginPoints, - ImagesPerPage = ImagesPerPage - }; - - return await OperationsService.ExecuteToolAsync(PdfToolId.JpgToPdf, options, progress, ct); - } -} diff --git a/src/PdfEditorApp/ViewModels/Tools/Conversion/PdfToExcelToolViewModel.cs b/src/PdfEditorApp/ViewModels/Tools/Conversion/PdfToExcelToolViewModel.cs deleted file mode 100644 index 0ab21f7..0000000 --- a/src/PdfEditorApp/ViewModels/Tools/Conversion/PdfToExcelToolViewModel.cs +++ /dev/null @@ -1,35 +0,0 @@ -using PdfEditorApp.ViewModels.Tools.Core; -using System; -using System.Threading; -using System.Threading.Tasks; -using CommunityToolkit.Mvvm.ComponentModel; -using PdfEditorApp.Models; -using PdfEditorApp.Services; - -namespace PdfEditorApp.ViewModels.Tools.Conversion; - -public partial class PdfToExcelToolViewModel : PdfToolViewModelBase -{ - [ObservableProperty] - private bool _detectAllTables = true; - - [ObservableProperty] - private bool _separateSheetsPerPage; - - public override bool UsesWorkspaceShell => true; - - public PdfToExcelToolViewModel(IPdfDocumentOperationsService operationsService, PdfToolDefinition tool) - : base(operationsService, tool) - { - } - - protected override async Task ExecuteCoreAsync(IProgress progress, CancellationToken ct) - { - return await ExecuteBatchAsync(file => new ExcelConversionOptions - { - InputFilePath = file, - DetectAllTables = DetectAllTables, - SeparateSheetsPerPage = SeparateSheetsPerPage - }, progress, ct); - } -} diff --git a/src/PdfEditorApp/ViewModels/Tools/Conversion/PdfToJpgToolViewModel.cs b/src/PdfEditorApp/ViewModels/Tools/Conversion/PdfToJpgToolViewModel.cs deleted file mode 100644 index e98ea91..0000000 --- a/src/PdfEditorApp/ViewModels/Tools/Conversion/PdfToJpgToolViewModel.cs +++ /dev/null @@ -1,51 +0,0 @@ -using PdfEditorApp.ViewModels.Tools.Core; -using System; -using System.Threading; -using System.Threading.Tasks; -using CommunityToolkit.Mvvm.ComponentModel; -using PdfEditorApp.Models; -using PdfEditorApp.Services; - -namespace PdfEditorApp.ViewModels.Tools.Conversion; - -public partial class PdfToJpgToolViewModel : PdfToolViewModelBase -{ - [ObservableProperty] - private string _outputFormat = "jpg"; - - [ObservableProperty] - private int _dpi = 300; - - [ObservableProperty] - private int _jpgQuality = 90; - - [ObservableProperty] - private bool _grayscale; - - [ObservableProperty] - private PageTargetSelection _targetPages = PageTargetSelection.AllPages; - - [ObservableProperty] - private string _pageRange = "1"; - - public override bool UsesWorkspaceShell => true; - - public PdfToJpgToolViewModel(IPdfDocumentOperationsService operationsService, PdfToolDefinition tool) - : base(operationsService, tool) - { - } - - protected override async Task ExecuteCoreAsync(IProgress progress, CancellationToken ct) - { - return await ExecuteBatchAsync(file => new ImageConversionOptions - { - InputFilePath = file, - OutputFormat = OutputFormat, - Dpi = Dpi, - JpgQuality = JpgQuality, - Grayscale = Grayscale, - TargetPages = TargetPages, - PageRange = PageRange - }, progress, ct); - } -} diff --git a/src/PdfEditorApp/ViewModels/Tools/Conversion/PdfToMarkdownToolViewModel.cs b/src/PdfEditorApp/ViewModels/Tools/Conversion/PdfToMarkdownToolViewModel.cs deleted file mode 100644 index 47465be..0000000 --- a/src/PdfEditorApp/ViewModels/Tools/Conversion/PdfToMarkdownToolViewModel.cs +++ /dev/null @@ -1,39 +0,0 @@ -using PdfEditorApp.ViewModels.Tools.Core; -using System; -using System.Threading; -using System.Threading.Tasks; -using CommunityToolkit.Mvvm.ComponentModel; -using PdfEditorApp.Models; -using PdfEditorApp.Services; - -namespace PdfEditorApp.ViewModels.Tools.Conversion; - -public partial class PdfToMarkdownToolViewModel : PdfToolViewModelBase -{ - [ObservableProperty] - private bool _includeTables = true; - - [ObservableProperty] - private bool _includeImages; - - [ObservableProperty] - private bool _includeMetadataHeader = true; - - public override bool UsesWorkspaceShell => true; - - public PdfToMarkdownToolViewModel(IPdfDocumentOperationsService operationsService, PdfToolDefinition tool) - : base(operationsService, tool) - { - } - - protected override async Task ExecuteCoreAsync(IProgress progress, CancellationToken ct) - { - return await ExecuteBatchAsync(file => new MarkdownConversionOptions - { - InputFilePath = file, - IncludeTables = IncludeTables, - IncludeImages = IncludeImages, - IncludeMetadataHeader = IncludeMetadataHeader - }, progress, ct); - } -} diff --git a/src/PdfEditorApp/ViewModels/Tools/Conversion/PdfToPdfAToolViewModel.cs b/src/PdfEditorApp/ViewModels/Tools/Conversion/PdfToPdfAToolViewModel.cs deleted file mode 100644 index eda726e..0000000 --- a/src/PdfEditorApp/ViewModels/Tools/Conversion/PdfToPdfAToolViewModel.cs +++ /dev/null @@ -1,31 +0,0 @@ -using PdfEditorApp.ViewModels.Tools.Core; -using System; -using System.Threading; -using System.Threading.Tasks; -using CommunityToolkit.Mvvm.ComponentModel; -using PdfEditorApp.Models; -using PdfEditorApp.Services; - -namespace PdfEditorApp.ViewModels.Tools.Conversion; - -public partial class PdfToPdfAToolViewModel : PdfToolViewModelBase -{ - [ObservableProperty] - private PdfAStandard _standard = PdfAStandard.PdfA2b; - - public override bool UsesWorkspaceShell => true; - - public PdfToPdfAToolViewModel(IPdfDocumentOperationsService operationsService, PdfToolDefinition tool) - : base(operationsService, tool) - { - } - - protected override async Task ExecuteCoreAsync(IProgress progress, CancellationToken ct) - { - return await ExecuteBatchAsync(file => new PdfAToolOptions - { - InputFilePath = file, - Standard = Standard - }, progress, ct); - } -} diff --git a/src/PdfEditorApp/ViewModels/Tools/Conversion/PdfToPowerPointToolViewModel.cs b/src/PdfEditorApp/ViewModels/Tools/Conversion/PdfToPowerPointToolViewModel.cs deleted file mode 100644 index 20ceb39..0000000 --- a/src/PdfEditorApp/ViewModels/Tools/Conversion/PdfToPowerPointToolViewModel.cs +++ /dev/null @@ -1,31 +0,0 @@ -using PdfEditorApp.ViewModels.Tools.Core; -using System; -using System.Threading; -using System.Threading.Tasks; -using CommunityToolkit.Mvvm.ComponentModel; -using PdfEditorApp.Models; -using PdfEditorApp.Services; - -namespace PdfEditorApp.ViewModels.Tools.Conversion; - -public partial class PdfToPowerPointToolViewModel : PdfToolViewModelBase -{ - [ObservableProperty] - private bool _editableText = true; - - public override bool UsesWorkspaceShell => true; - - public PdfToPowerPointToolViewModel(IPdfDocumentOperationsService operationsService, PdfToolDefinition tool) - : base(operationsService, tool) - { - } - - protected override async Task ExecuteCoreAsync(IProgress progress, CancellationToken ct) - { - return await ExecuteBatchAsync(file => new PptxConversionOptions - { - InputFilePath = file, - EditableText = EditableText - }, progress, ct); - } -} diff --git a/src/PdfEditorApp/ViewModels/Tools/Conversion/PdfToWordToolViewModel.cs b/src/PdfEditorApp/ViewModels/Tools/Conversion/PdfToWordToolViewModel.cs deleted file mode 100644 index eeb1c99..0000000 --- a/src/PdfEditorApp/ViewModels/Tools/Conversion/PdfToWordToolViewModel.cs +++ /dev/null @@ -1,39 +0,0 @@ -using PdfEditorApp.ViewModels.Tools.Core; -using System; -using System.Threading; -using System.Threading.Tasks; -using CommunityToolkit.Mvvm.ComponentModel; -using PdfEditorApp.Models; -using PdfEditorApp.Services; - -namespace PdfEditorApp.ViewModels.Tools.Conversion; - -public partial class PdfToWordToolViewModel : PdfToolViewModelBase -{ - [ObservableProperty] - private bool _extractTables = true; - - [ObservableProperty] - private bool _extractImages = true; - - [ObservableProperty] - private bool _ocrFallback; - - public override bool UsesWorkspaceShell => true; - - public PdfToWordToolViewModel(IPdfDocumentOperationsService operationsService, PdfToolDefinition tool) - : base(operationsService, tool) - { - } - - protected override async Task ExecuteCoreAsync(IProgress progress, CancellationToken ct) - { - return await ExecuteBatchAsync(file => new WordConversionOptions - { - InputFilePath = file, - ExtractTables = ExtractTables, - ExtractImages = ExtractImages, - OcrFallback = OcrFallback - }, progress, ct); - } -} diff --git a/src/PdfEditorApp/ViewModels/Tools/Conversion/PowerPointToPdfToolViewModel.cs b/src/PdfEditorApp/ViewModels/Tools/Conversion/PowerPointToPdfToolViewModel.cs deleted file mode 100644 index ed59fa8..0000000 --- a/src/PdfEditorApp/ViewModels/Tools/Conversion/PowerPointToPdfToolViewModel.cs +++ /dev/null @@ -1,32 +0,0 @@ -using PdfEditorApp.ViewModels.Tools.Core; -using System; -using System.Threading; -using System.Threading.Tasks; -using CommunityToolkit.Mvvm.ComponentModel; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Models; -using PdfEditorApp.Services; - -namespace PdfEditorApp.ViewModels.Tools.Conversion; - -public partial class PowerPointToPdfToolViewModel : PdfToolViewModelBase -{ - [ObservableProperty] - private PageOrientation _orientation = PageOrientation.Landscape; - - public override bool UsesWorkspaceShell => true; - - public PowerPointToPdfToolViewModel(IPdfDocumentOperationsService operationsService, PdfToolDefinition tool) - : base(operationsService, tool) - { - } - - protected override async Task ExecuteCoreAsync(IProgress progress, CancellationToken ct) - { - return await ExecuteBatchAsync(file => new OfficeToPdfOptions - { - InputFilePath = file, - Orientation = Orientation - }, progress, ct); - } -} diff --git a/src/PdfEditorApp/ViewModels/Tools/Conversion/ScanToPdfToolViewModel.cs b/src/PdfEditorApp/ViewModels/Tools/Conversion/ScanToPdfToolViewModel.cs deleted file mode 100644 index 3815f25..0000000 --- a/src/PdfEditorApp/ViewModels/Tools/Conversion/ScanToPdfToolViewModel.cs +++ /dev/null @@ -1,51 +0,0 @@ -using PdfEditorApp.ViewModels.Tools.Core; -using System; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using CommunityToolkit.Mvvm.ComponentModel; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Models; -using PdfEditorApp.Services; - -namespace PdfEditorApp.ViewModels.Tools.Conversion; - -public partial class ScanToPdfToolViewModel : PdfToolViewModelBase -{ - [ObservableProperty] - private bool _autoDeskew = true; - - [ObservableProperty] - private bool _enhanceContrast = true; - - [ObservableProperty] - private bool _whitenBackground = true; - - [ObservableProperty] - private bool _convertToGrayscale; - - [ObservableProperty] - private PageFormat _format = PageFormat.A4; - - public override bool UsesWorkspaceShell => true; - - public ScanToPdfToolViewModel(IPdfDocumentOperationsService operationsService, PdfToolDefinition tool) - : base(operationsService, tool) - { - } - - protected override async Task ExecuteCoreAsync(IProgress progress, CancellationToken ct) - { - var options = new ScanToolOptions - { - InputImageFiles = SelectedFiles.ToList(), - AutoDeskew = AutoDeskew, - EnhanceContrast = EnhanceContrast, - WhitenBackground = WhitenBackground, - ConvertToGrayscale = ConvertToGrayscale, - Format = Format - }; - - return await OperationsService.ExecuteToolAsync(PdfToolId.ScanToPdf, options, progress, ct); - } -} diff --git a/src/PdfEditorApp/ViewModels/Tools/Conversion/WordToPdfToolViewModel.cs b/src/PdfEditorApp/ViewModels/Tools/Conversion/WordToPdfToolViewModel.cs deleted file mode 100644 index 3b16b7c..0000000 --- a/src/PdfEditorApp/ViewModels/Tools/Conversion/WordToPdfToolViewModel.cs +++ /dev/null @@ -1,32 +0,0 @@ -using PdfEditorApp.ViewModels.Tools.Core; -using System; -using System.Threading; -using System.Threading.Tasks; -using CommunityToolkit.Mvvm.ComponentModel; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Models; -using PdfEditorApp.Services; - -namespace PdfEditorApp.ViewModels.Tools.Conversion; - -public partial class WordToPdfToolViewModel : PdfToolViewModelBase -{ - [ObservableProperty] - private PageOrientation _orientation = PageOrientation.Portrait; - - public override bool UsesWorkspaceShell => true; - - public WordToPdfToolViewModel(IPdfDocumentOperationsService operationsService, PdfToolDefinition tool) - : base(operationsService, tool) - { - } - - protected override async Task ExecuteCoreAsync(IProgress progress, CancellationToken ct) - { - return await ExecuteBatchAsync(file => new OfficeToPdfOptions - { - InputFilePath = file, - Orientation = Orientation - }, progress, ct); - } -} diff --git a/src/PdfEditorApp/ViewModels/Tools/Core/PdfToolViewModelBase.cs b/src/PdfEditorApp/ViewModels/Tools/Core/PdfToolViewModelBase.cs deleted file mode 100644 index 304b218..0000000 --- a/src/PdfEditorApp/ViewModels/Tools/Core/PdfToolViewModelBase.cs +++ /dev/null @@ -1,788 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Diagnostics; -using System.IO; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using Avalonia.Platform.Storage; -using CommunityToolkit.Mvvm.ComponentModel; -using CommunityToolkit.Mvvm.Input; -using CommunityToolkit.Mvvm.Messaging; -using PdfEditorApp.Messages; -using PdfEditorApp.Models; -using PdfEditorApp.Services; -using PdfEditorApp.Services.Tools.Core; -using PdfEditorApp.ViewModels.Shell; -using UglyToad.PdfPig; - -namespace PdfEditorApp.ViewModels.Tools.Core; - -/// -/// Abstract base class for all individual PDF tool ViewModels. -/// Provides unified lifecycle, file management, visual previews, asynchronous execution, cancellation, and navigation. -/// -public abstract partial class PdfToolViewModelBase : ViewModelBase -{ - protected readonly IPdfDocumentOperationsService OperationsService; - private CancellationTokenSource? _cts; - - /// - /// Remembers the user's last chosen save/export directory across tool executions. - /// - public static string? RememberedSaveDirectory { get; set; } - - public IStorageProvider? StorageProvider { get; set; } - - [ObservableProperty] - private PdfToolDefinition _tool = new(); - - [ObservableProperty] - private bool _isOpen; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(CanExecuteTool))] - [NotifyCanExecuteChangedFor(nameof(ExecuteToolCommand))] - private bool _isRunning; - - [ObservableProperty] - private bool _isComplete; - - [ObservableProperty] - private bool _hasError; - - [ObservableProperty] - private string _errorMessage = string.Empty; - - [ObservableProperty] - private string _statusMessage = "Ready"; - - [ObservableProperty] - private double _progressPercentage; - - [ObservableProperty] - private string _lastOutputFilePath = string.Empty; - - [ObservableProperty] - private string _resultSummaryMessage = string.Empty; - - [ObservableProperty] - private bool _isToolStarred; - - [ObservableProperty] - private PdfFilePreviewItem? _outputFilePreview; - - [ObservableProperty] - private PdfPagePreviewThumbnail? _selectedOutputPage; - - [ObservableProperty] - private string _savedNotificationMessage = string.Empty; - - [ObservableProperty] - private bool _hasSavedNotification; - - [ObservableProperty] - private long _originalSizeBytes; - - [ObservableProperty] - private long _outputSizeBytes; - - [ObservableProperty] - private double _sizeReductionPercentage; - - public bool HasSizeReduction => OriginalSizeBytes > 0 && OutputSizeBytes > 0 && OutputSizeBytes < OriginalSizeBytes; - public string SizeComparisonText => OriginalSizeBytes > 0 && OutputSizeBytes > 0 - ? $"{PdfFilePreviewItem.FormatBytes(OriginalSizeBytes)} → {PdfFilePreviewItem.FormatBytes(OutputSizeBytes)}" - : ""; - public string SizeReductionBadgeText => $"{SizeReductionPercentage:F0}% SAVED"; - - public ObservableCollection SelectedFiles { get; } = new(); - - public ObservableCollection SelectedFilePreviewItems { get; } = new(); - - /// - /// Reader-style live preview (page render, zoom, page nav) of the currently - /// selected input file, shared by the reader-matching tool shell - /// (). Reloads - /// automatically whenever changes. - /// - public PdfLivePreviewViewModel Preview { get; } = new(); - - /// - /// True for tools migrated to the shared reader-style workspace shell - /// (), which has its own - /// back button, tool identity, and toolbar. - /// hides its separate header banner for these so there's exactly one toolbar row, - /// matching the PDF Reader, instead of two stacked bars. - /// - public virtual bool UsesWorkspaceShell => false; - - public ObservableCollection OutputPageThumbnails { get; } = new(); - - public bool HasSelectedFiles => SelectedFiles.Count > 0; - public virtual bool CanExecuteTool => !IsRunning; - public string SelectedFilesCountText => SelectedFiles.Count == 1 ? "1 file selected" : $"{SelectedFiles.Count} files selected"; - public string PrimaryInputFile => SelectedFiles.FirstOrDefault() ?? string.Empty; - - public int TotalSelectedPages => SelectedFilePreviewItems.Sum(p => p.PageCount); - - public string TotalSummaryText - { - get - { - if (SelectedFilePreviewItems.Count == 0) return "No files selected"; - long totalBytes = SelectedFilePreviewItems.Sum(p => p.FileSizeBytes); - int pages = TotalSelectedPages; - if (SelectedFilePreviewItems.Count == 1) - return $"1 Document · {pages} Page{(pages != 1 ? "s" : "")} · {PdfFilePreviewItem.FormatBytes(totalBytes)}"; - return $"{SelectedFilePreviewItems.Count} Documents · {pages} Total Pages · {PdfFilePreviewItem.FormatBytes(totalBytes)}"; - } - } - - // Events - public event Action? BackRequested; - public event Action? NavigateToToolRequested; - public event Action? HelpGuideRequested; - - [RelayCommand] - public void OpenToolHelpGuide() - { - HelpGuideRequested?.Invoke(Tool.Id); - } - - [RelayCommand] - public void NavigateToTool(string toolName) - { - if (Enum.TryParse(toolName, true, out var toolId)) - { - string targetFile = !string.IsNullOrEmpty(LastOutputFilePath) && File.Exists(LastOutputFilePath) - ? LastOutputFilePath - : PrimaryInputFile; - NavigateToToolRequested?.Invoke(toolId, targetFile); - } - } - - protected PdfToolViewModelBase(IPdfDocumentOperationsService operationsService, PdfToolDefinition tool) - { - OperationsService = operationsService; - Tool = tool; - SelectedFiles.CollectionChanged += (_, _) => { _ = Preview.LoadDocumentAsync(PrimaryInputFile); }; - } - - [RelayCommand] - public void GoBack() - { - BackRequested?.Invoke(); - } - - [RelayCommand] - public void OpenInEditor() - { - string? targetPath = (!string.IsNullOrEmpty(LastOutputFilePath) && File.Exists(LastOutputFilePath)) - ? LastOutputFilePath - : ((HasSelectedFiles && File.Exists(PrimaryInputFile)) ? PrimaryInputFile : null); - - if (!string.IsNullOrEmpty(targetPath)) - { - WeakReferenceMessenger.Default.Send(new OpenInEditorMessage(targetPath)); - } - } - - [RelayCommand] - public void OpenInViewer() - { - string targetPath = !string.IsNullOrEmpty(LastOutputFilePath) && File.Exists(LastOutputFilePath) - ? LastOutputFilePath - : (HasSelectedFiles && File.Exists(PrimaryInputFile) ? PrimaryInputFile : string.Empty); - - if (!string.IsNullOrEmpty(targetPath)) - { - WeakReferenceMessenger.Default.Send(new OpenInViewerMessage(targetPath)); - } - } - - public virtual void SetupInitialFiles(IEnumerable? filePaths) - { - SelectedFiles.Clear(); - if (filePaths != null) - { - foreach (var file in filePaths) - { - if (!string.IsNullOrEmpty(file) && File.Exists(file)) - { - SelectedFiles.Add(file); - } - } - } - SyncPreviewItems(); - ResetState(); - IsOpen = true; - } - - public virtual void ResetState() - { - IsRunning = false; - IsComplete = false; - HasError = false; - ErrorMessage = string.Empty; - StatusMessage = "Ready"; - ProgressPercentage = 0; - LastOutputFilePath = string.Empty; - ResultSummaryMessage = string.Empty; - OutputFilePreview = null; - OutputPageThumbnails.Clear(); - SelectedOutputPage = null; - SavedNotificationMessage = string.Empty; - HasSavedNotification = false; - OnPropertyChanged(nameof(HasSelectedFiles)); - OnPropertyChanged(nameof(SelectedFilesCountText)); - OnPropertyChanged(nameof(PrimaryInputFile)); - OnPropertyChanged(nameof(TotalSelectedPages)); - OnPropertyChanged(nameof(TotalSummaryText)); - } - - public void SyncPreviewItems() - { - SelectedFilePreviewItems.Clear(); - for (int i = 0; i < SelectedFiles.Count; i++) - { - string path = SelectedFiles[i]; - int pageCount = 1; - if (File.Exists(path)) - { - pageCount = PdfFileHelper.InspectPageCountSafely(path); - } - var item = PdfFilePreviewItem.CreateFromFile(path, i + 1, pageCount); - SelectedFilePreviewItems.Add(item); - } - - OnPropertyChanged(nameof(HasSelectedFiles)); - OnPropertyChanged(nameof(SelectedFilesCountText)); - OnPropertyChanged(nameof(PrimaryInputFile)); - OnPropertyChanged(nameof(TotalSelectedPages)); - OnPropertyChanged(nameof(TotalSummaryText)); - } - - [RelayCommand] - public async Task AddFilesAsync() - { - if (StorageProvider == null) return; - - var patterns = Tool.AcceptedFileExtensions - .Split(new[] { ',', ';' }, StringSplitOptions.RemoveEmptyEntries) - .Select(e => e.Trim().StartsWith("*") ? e.Trim() : "*" + e.Trim()) - .ToArray(); - - IStorageFolder? startFolder = null; - if (!string.IsNullOrEmpty(RememberedSaveDirectory) && Directory.Exists(RememberedSaveDirectory)) - { - try - { - startFolder = await StorageProvider.TryGetFolderFromPathAsync(RememberedSaveDirectory); - } - catch { } - } - - var files = await StorageProvider.OpenFilePickerAsync(new FilePickerOpenOptions - { - Title = $"Select Files for {Tool.Name}", - AllowMultiple = Tool.SupportsMultiFile, - SuggestedStartLocation = startFolder, - FileTypeFilter = new[] - { - new FilePickerFileType($"{Tool.Name} Inputs") - { - Patterns = patterns.Length > 0 ? patterns : new[] { "*.pdf" } - } - } - }); - - if (files != null && files.Count > 0) - { - if (!Tool.SupportsMultiFile) SelectedFiles.Clear(); - foreach (var f in files) - { - string path = f.Path.LocalPath; - if (!SelectedFiles.Contains(path)) - { - SelectedFiles.Add(path); - } - string? dir = Path.GetDirectoryName(path); - if (!string.IsNullOrEmpty(dir)) RememberedSaveDirectory = dir; - } - SyncPreviewItems(); - ResetState(); - } - } - - [RelayCommand] - public void MoveFileUp(object? parameter) - { - string? filePath = parameter switch - { - string s => s, - PdfFilePreviewItem item => item.FilePath, - _ => null - }; - - if (string.IsNullOrEmpty(filePath)) return; - - int index = SelectedFiles.IndexOf(filePath); - if (index > 0) - { - SelectedFiles.Move(index, index - 1); - SyncPreviewItems(); - ResetState(); - } - } - - [RelayCommand] - public void MoveFileDown(object? parameter) - { - string? filePath = parameter switch - { - string s => s, - PdfFilePreviewItem item => item.FilePath, - _ => null - }; - - if (string.IsNullOrEmpty(filePath)) return; - - int index = SelectedFiles.IndexOf(filePath); - if (index >= 0 && index < SelectedFiles.Count - 1) - { - SelectedFiles.Move(index, index + 1); - SyncPreviewItems(); - ResetState(); - } - } - - [RelayCommand] - public void RemoveFile(object? parameter) - { - string? filePath = parameter switch - { - string s => s, - PdfFilePreviewItem item => item.FilePath, - _ => null - }; - - if (string.IsNullOrEmpty(filePath)) return; - - SelectedFiles.Remove(filePath); - SyncPreviewItems(); - ResetState(); - } - - [RelayCommand] - public void ClearFiles() - { - SelectedFiles.Clear(); - SelectedFilePreviewItems.Clear(); - ResetState(); - } - - [RelayCommand] - public void Close() - { - CancelExecution(); - IsOpen = false; - } - - [RelayCommand] - public void CancelExecution() - { - if (_cts != null && !_cts.IsCancellationRequested) - { - _cts.Cancel(); - StatusMessage = "Cancelling..."; - } - } - - [RelayCommand(CanExecute = nameof(CanExecuteTool))] - public async Task ExecuteToolAsync() - { - if (!ValidateInputs(out var validationError)) - { - HasError = true; - ErrorMessage = validationError; - return; - } - - IsRunning = true; - IsComplete = false; - HasError = false; - ErrorMessage = string.Empty; - ProgressPercentage = 5.0; - StatusMessage = $"Processing {Tool.Name}..."; - - _cts = new CancellationTokenSource(); - var progress = new Progress(p => - { - ProgressPercentage = p; - StatusMessage = $"Processing ({p:F0}%)..."; - }); - - try - { - var result = await ExecuteCoreAsync(progress, _cts.Token); - - if (result.Success) - { - IsComplete = true; - LastOutputFilePath = result.OutputFilePath ?? ""; - ResultSummaryMessage = result.Message ?? "Operation completed successfully."; - StatusMessage = "Completed successfully!"; - ProgressPercentage = 100.0; - - OriginalSizeBytes = result.OriginalSizeBytes; - OutputSizeBytes = result.OutputSizeBytes; - if (result.OriginalSizeBytes > 0 && result.OutputSizeBytes > 0 && result.OutputSizeBytes < result.OriginalSizeBytes) - { - SizeReductionPercentage = ((result.OriginalSizeBytes - result.OutputSizeBytes) / (double)result.OriginalSizeBytes) * 100.0; - } - else - { - SizeReductionPercentage = 0.0; - } - OnPropertyChanged(nameof(HasSizeReduction)); - OnPropertyChanged(nameof(SizeComparisonText)); - OnPropertyChanged(nameof(SizeReductionBadgeText)); - - // Load rich in-app preview for the output document - if (!string.IsNullOrEmpty(LastOutputFilePath) && File.Exists(LastOutputFilePath)) - { - int pages = PdfFileHelper.InspectPageCountSafely(LastOutputFilePath); - OutputFilePreview = PdfFilePreviewItem.CreateFromFile(LastOutputFilePath, 1, pages); - LoadOutputPreviewThumbnails(LastOutputFilePath); - _ = Preview.LoadDocumentAsync(LastOutputFilePath); - } - } - else - { - HasError = true; - ErrorMessage = result.ErrorMessage ?? "Operation failed."; - StatusMessage = "Failed"; - } - } - catch (OperationCanceledException) - { - StatusMessage = "Operation cancelled."; - } - catch (Exception ex) - { - HasError = true; - ErrorMessage = $"Unexpected error: {ex.Message}"; - StatusMessage = "Error"; - } - finally - { - IsRunning = false; - } - } - - private void LoadOutputPreviewThumbnails(string filePath) - { - OutputPageThumbnails.Clear(); - if (!File.Exists(filePath)) return; - - try - { - using var pig = UglyToad.PdfPig.PdfDocument.Open(filePath); - int total = pig.NumberOfPages; - for (int i = 1; i <= total; i++) - { - var page = pig.GetPage(i); - bool isLandscape = page.Width > page.Height; - string summary = string.Empty; - if (!string.IsNullOrWhiteSpace(page.Text)) - { - string firstLine = page.Text.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries).FirstOrDefault() ?? ""; - if (firstLine.Length > 40) firstLine = firstLine.Substring(0, 40) + "..."; - summary = firstLine; - } - - var thumb = new PdfPagePreviewThumbnail - { - PageNumber = i, - PageLabel = $"Page {i} of {total}", - WidthPoints = Math.Round(page.Width, 1), - HeightPoints = Math.Round(page.Height, 1), - IsLandscape = isLandscape, - DimensionsText = $"{Math.Round(page.Width):F0} × {Math.Round(page.Height):F0} pt", - PageSummary = summary, - IsSelected = (i == 1) - }; - OutputPageThumbnails.Add(thumb); - } - SelectedOutputPage = OutputPageThumbnails.FirstOrDefault(); - } - catch - { - int pageCount = PdfFileHelper.InspectPageCountSafely(filePath); - for (int i = 1; i <= Math.Max(1, pageCount); i++) - { - OutputPageThumbnails.Add(new PdfPagePreviewThumbnail - { - PageNumber = i, - PageLabel = $"Page {i} of {pageCount}", - WidthPoints = 595, - HeightPoints = 842, - IsLandscape = false, - DimensionsText = "595 × 842 pt", - IsSelected = (i == 1) - }); - } - SelectedOutputPage = OutputPageThumbnails.FirstOrDefault(); - } - } - - [RelayCommand] - public void SelectPageThumbnail(PdfPagePreviewThumbnail? page) - { - if (page == null) return; - foreach (var p in OutputPageThumbnails) - { - p.IsSelected = (p.PageNumber == page.PageNumber); - } - SelectedOutputPage = page; - } - - [RelayCommand] - public async Task SaveOutputFileAsAsync() - { - if (StorageProvider == null || string.IsNullOrWhiteSpace(LastOutputFilePath) || !File.Exists(LastOutputFilePath)) return; - - IStorageFolder? startFolder = null; - if (!string.IsNullOrEmpty(RememberedSaveDirectory) && Directory.Exists(RememberedSaveDirectory)) - { - try - { - startFolder = await StorageProvider.TryGetFolderFromPathAsync(RememberedSaveDirectory); - } - catch { } - } - - string suggestedName = Path.GetFileName(LastOutputFilePath); - string ext = Path.GetExtension(LastOutputFilePath).TrimStart('.'); - if (string.IsNullOrEmpty(ext)) ext = "pdf"; - - var file = await StorageProvider.SaveFilePickerAsync(new FilePickerSaveOptions - { - Title = $"Save {Tool.Name} Output File", - SuggestedFileName = suggestedName, - DefaultExtension = ext, - SuggestedStartLocation = startFolder, - FileTypeChoices = new[] - { - new FilePickerFileType($"{ext.ToUpperInvariant()} File") - { - Patterns = new[] { $"*.{ext}" } - } - } - }); - - if (file != null) - { - SaveOutputFileToPath(file.Path.LocalPath); - } - } - - /// - /// Saves the current output file to . - /// Gracefully prevents self-copy errors and handles locked file IO exceptions. - /// - public void SaveOutputFileToPath(string targetPath) - { - if (string.IsNullOrWhiteSpace(targetPath) || string.IsNullOrWhiteSpace(LastOutputFilePath) || !File.Exists(LastOutputFilePath)) return; - - string fullSource = Path.GetFullPath(LastOutputFilePath); - string fullTarget = Path.GetFullPath(targetPath); - - // If the user picked the exact same path where the output is already stored, - // copying the file onto itself will throw an IOException ("used by another process"). - // Since it's already there, simply update notification and return successfully. - if (string.Equals(fullSource, fullTarget, StringComparison.OrdinalIgnoreCase)) - { - RememberedSaveDirectory = Path.GetDirectoryName(targetPath); - SavedNotificationMessage = $"Saved successfully to: {targetPath}"; - HasSavedNotification = true; - HasError = false; - return; - } - - try - { - File.Copy(LastOutputFilePath, targetPath, overwrite: true); - RememberedSaveDirectory = Path.GetDirectoryName(targetPath); - SavedNotificationMessage = $"Saved successfully to: {targetPath}"; - HasSavedNotification = true; - HasError = false; - } - catch (IOException) - { - HasSavedNotification = false; - HasError = true; - ErrorMessage = $"Cannot save to '{Path.GetFileName(targetPath)}': The file is currently open or in use by another application. Please close it and try again."; - } - catch (UnauthorizedAccessException) - { - HasSavedNotification = false; - HasError = true; - ErrorMessage = $"Cannot save to '{Path.GetFileName(targetPath)}': Access denied. Please choose a different folder."; - } - catch (Exception ex) - { - HasSavedNotification = false; - HasError = true; - ErrorMessage = $"Failed to save file: {ex.Message}"; - } - } - - [RelayCommand] - public void OpenOutputFile() - { - if (string.IsNullOrWhiteSpace(LastOutputFilePath) || !File.Exists(LastOutputFilePath)) return; - - try - { - var psi = new ProcessStartInfo - { - FileName = LastOutputFilePath, - UseShellExecute = true - }; - Process.Start(psi); - } - catch { } - } - - [RelayCommand] - public void OpenOutputFolder() - { - if (string.IsNullOrWhiteSpace(LastOutputFilePath)) return; - - try - { - string? dir = File.Exists(LastOutputFilePath) ? Path.GetDirectoryName(LastOutputFilePath) : LastOutputFilePath; - if (!string.IsNullOrWhiteSpace(dir) && Directory.Exists(dir)) - { - var psi = new ProcessStartInfo - { - FileName = dir, - UseShellExecute = true - }; - Process.Start(psi); - } - } - catch { } - } - - [RelayCommand] - public void StartOver() - { - ClearFiles(); - ResetState(); - } - - [RelayCommand] - public void ToggleStar() - { - IsToolStarred = !IsToolStarred; - } - - protected virtual bool ValidateInputs(out string errorMessage) - { - if (!HasSelectedFiles) - { - errorMessage = "Please select at least one document to proceed."; - return false; - } - errorMessage = string.Empty; - return true; - } - - /// - /// Runs the tool once per file in via the standard - /// PdfToolId dispatch, instead of silently processing only . - /// One failing file does not abort the rest; the aggregated result reports exactly - /// how many files succeeded/failed instead of a blanket success. - /// - protected async Task ExecuteBatchAsync( - Func buildOptions, - IProgress progress, - CancellationToken ct) - { - var files = SelectedFiles.ToList(); - var results = new List<(string File, ToolExecutionResult Result)>(); - - for (int i = 0; i < files.Count; i++) - { - ct.ThrowIfCancellationRequested(); - string file = files[i]; - int index = i; - int total = files.Count; - var fileProgress = new Progress(p => - progress.Report((index + Math.Clamp(p, 0, 100) / 100.0) / total * 100.0)); - - ToolExecutionResult result; - try - { - result = await OperationsService.ExecuteToolAsync(Tool.Id, buildOptions(file), fileProgress, ct); - } - catch (OperationCanceledException) - { - throw; - } - catch (Exception ex) - { - result = new ToolExecutionResult { Success = false, ErrorMessage = ex.Message }; - } - - results.Add((file, result)); - } - - progress.Report(100); - - // Single file: return the underlying result untouched so existing single-file - // behavior (messages, ExtraData, etc.) is unaffected. - if (results.Count == 1) - { - return results[0].Result; - } - - var succeeded = results.Where(r => r.Result.Success).ToList(); - var failed = results.Where(r => !r.Result.Success).ToList(); - string DescribeFailure((string File, ToolExecutionResult Result) f) => - $"{Path.GetFileName(f.File)} ({f.Result.ErrorMessage ?? "failed"})"; - - if (succeeded.Count == 0) - { - return new ToolExecutionResult - { - Success = false, - ErrorMessage = $"All {results.Count} files failed: {string.Join("; ", failed.Select(DescribeFailure))}" - }; - } - - string message = failed.Count == 0 - ? $"Successfully processed {succeeded.Count} of {results.Count} files." - : $"Processed {succeeded.Count} of {results.Count} files. Failed: {string.Join("; ", failed.Select(DescribeFailure))}"; - - return new ToolExecutionResult - { - Success = true, - OutputFilePath = succeeded[^1].Result.OutputFilePath, - OutputFiles = succeeded - .Select(s => s.Result.OutputFilePath) - .Where(p => !string.IsNullOrEmpty(p)) - .Select(p => p!) - .ToList(), - Message = message, - OriginalSizeBytes = succeeded.Sum(s => s.Result.OriginalSizeBytes), - OutputSizeBytes = succeeded.Sum(s => s.Result.OutputSizeBytes) - }; - } - - protected abstract Task ExecuteCoreAsync(IProgress progress, CancellationToken ct); -} diff --git a/src/PdfEditorApp/ViewModels/Tools/Intelligence/AiSummarizerToolViewModel.cs b/src/PdfEditorApp/ViewModels/Tools/Intelligence/AiSummarizerToolViewModel.cs deleted file mode 100644 index 1121daf..0000000 --- a/src/PdfEditorApp/ViewModels/Tools/Intelligence/AiSummarizerToolViewModel.cs +++ /dev/null @@ -1,49 +0,0 @@ -using PdfEditorApp.ViewModels.Tools.Core; -using System; -using System.Threading; -using System.Threading.Tasks; -using CommunityToolkit.Mvvm.ComponentModel; -using PdfEditorApp.Models; -using PdfEditorApp.Services; - -namespace PdfEditorApp.ViewModels.Tools.Intelligence; - -public partial class AiSummarizerToolViewModel : PdfToolViewModelBase -{ - [ObservableProperty] - private int _maxBulletPoints = 7; - - [ObservableProperty] - private bool _includeExecutiveSummary = true; - - [ObservableProperty] - private bool _includeActionItems = true; - - [ObservableProperty] - private string _targetLanguage = "English"; - - [ObservableProperty] - private string _customPrompt = string.Empty; - - public override bool UsesWorkspaceShell => true; - - public AiSummarizerToolViewModel(IPdfDocumentOperationsService operationsService, PdfToolDefinition tool) - : base(operationsService, tool) - { - } - - protected override async Task ExecuteCoreAsync(IProgress progress, CancellationToken ct) - { - var options = new AiSummaryOptions - { - InputFilePath = PrimaryInputFile, - MaxBulletPoints = MaxBulletPoints, - IncludeExecutiveSummary = IncludeExecutiveSummary, - IncludeActionItems = IncludeActionItems, - TargetLanguage = TargetLanguage, - CustomPrompt = string.IsNullOrWhiteSpace(CustomPrompt) ? null : CustomPrompt - }; - - return await OperationsService.ExecuteToolAsync(PdfToolId.AiSummarizer, options, progress, ct); - } -} diff --git a/src/PdfEditorApp/ViewModels/Tools/Intelligence/ComparePdfToolViewModel.cs b/src/PdfEditorApp/ViewModels/Tools/Intelligence/ComparePdfToolViewModel.cs deleted file mode 100644 index 195bfbe..0000000 --- a/src/PdfEditorApp/ViewModels/Tools/Intelligence/ComparePdfToolViewModel.cs +++ /dev/null @@ -1,119 +0,0 @@ -using PdfEditorApp.ViewModels.Tools.Core; -using System; -using System.Threading; -using System.Threading.Tasks; -using Avalonia.Platform.Storage; -using CommunityToolkit.Mvvm.ComponentModel; -using CommunityToolkit.Mvvm.Input; -using PdfEditorApp.Models; -using PdfEditorApp.Services; - -namespace PdfEditorApp.ViewModels.Tools.Intelligence; - -public partial class ComparePdfToolViewModel : PdfToolViewModelBase -{ - [ObservableProperty] - private string _documentAPath = string.Empty; - - [ObservableProperty] - private string _documentBPath = string.Empty; - - [ObservableProperty] - private bool _detectTextDiff = true; - - [ObservableProperty] - private bool _detectVisualDiff = true; - - public override bool UsesWorkspaceShell => true; - - public ComparePdfToolViewModel(IPdfDocumentOperationsService operationsService, PdfToolDefinition tool) - : base(operationsService, tool) - { - } - - [RelayCommand] - public async Task PickDocumentAAsync() - { - if (StorageProvider == null) return; - var files = await StorageProvider.OpenFilePickerAsync(new FilePickerOpenOptions - { - Title = "Select First PDF (Original Document A)", - AllowMultiple = false, - FileTypeFilter = new[] { new FilePickerFileType("PDF Document") { Patterns = new[] { "*.pdf" } } } - }); - - if (files != null && files.Count > 0) - { - DocumentAPath = files[0].Path.LocalPath; - if (!SelectedFiles.Contains(DocumentAPath)) - { - if (SelectedFiles.Count == 0) SelectedFiles.Add(DocumentAPath); - else SelectedFiles[0] = DocumentAPath; - } - ResetState(); - } - } - - [RelayCommand] - public async Task PickDocumentBAsync() - { - if (StorageProvider == null) return; - var files = await StorageProvider.OpenFilePickerAsync(new FilePickerOpenOptions - { - Title = "Select Second PDF (Modified Document B)", - AllowMultiple = false, - FileTypeFilter = new[] { new FilePickerFileType("PDF Document") { Patterns = new[] { "*.pdf" } } } - }); - - if (files != null && files.Count > 0) - { - DocumentBPath = files[0].Path.LocalPath; - if (SelectedFiles.Count > 1) - { - SelectedFiles[1] = DocumentBPath; - } - else - { - SelectedFiles.Add(DocumentBPath); - } - ResetState(); - } - } - - public override void SetupInitialFiles(System.Collections.Generic.IEnumerable? filePaths) - { - base.SetupInitialFiles(filePaths); - if (SelectedFiles.Count > 0) DocumentAPath = SelectedFiles[0]; - if (SelectedFiles.Count > 1) DocumentBPath = SelectedFiles[1]; - } - - protected override bool ValidateInputs(out string errorMessage) - { - string docA = !string.IsNullOrEmpty(DocumentAPath) ? DocumentAPath : PrimaryInputFile; - string docB = !string.IsNullOrEmpty(DocumentBPath) ? DocumentBPath : (SelectedFiles.Count > 1 ? SelectedFiles[1] : ""); - - if (string.IsNullOrEmpty(docA) || string.IsNullOrEmpty(docB)) - { - errorMessage = "Please select both Document A and Document B to compare."; - return false; - } - errorMessage = string.Empty; - return true; - } - - protected override async Task ExecuteCoreAsync(IProgress progress, CancellationToken ct) - { - string docA = !string.IsNullOrEmpty(DocumentAPath) ? DocumentAPath : PrimaryInputFile; - string docB = !string.IsNullOrEmpty(DocumentBPath) ? DocumentBPath : (SelectedFiles.Count > 1 ? SelectedFiles[1] : ""); - - var options = new CompareToolOptions - { - DocumentAPath = docA, - DocumentBPath = docB, - DetectTextDiff = DetectTextDiff, - DetectVisualDiff = DetectVisualDiff - }; - - return await OperationsService.ExecuteToolAsync(PdfToolId.ComparePdf, options, progress, ct); - } -} diff --git a/src/PdfEditorApp/ViewModels/Tools/Intelligence/EditPdfToolViewModel.cs b/src/PdfEditorApp/ViewModels/Tools/Intelligence/EditPdfToolViewModel.cs deleted file mode 100644 index ad10dde..0000000 --- a/src/PdfEditorApp/ViewModels/Tools/Intelligence/EditPdfToolViewModel.cs +++ /dev/null @@ -1,37 +0,0 @@ -using PdfEditorApp.ViewModels.Tools.Core; -using System; -using System.Threading; -using System.Threading.Tasks; -using CommunityToolkit.Mvvm.Input; -using PdfEditorApp.Models; -using PdfEditorApp.Services; - -namespace PdfEditorApp.ViewModels.Tools.Intelligence; - -public partial class EditPdfToolViewModel : PdfToolViewModelBase -{ - public EditPdfToolViewModel(IPdfDocumentOperationsService operationsService, PdfToolDefinition tool) - : base(operationsService, tool) - { - } - - [RelayCommand] - public void LaunchEditor() - { - OpenInEditor(); - } - - protected override Task ExecuteCoreAsync(IProgress progress, CancellationToken ct) - { - progress.Report(50); - OpenInEditor(); - progress.Report(100); - - return Task.FromResult(new ToolExecutionResult - { - Success = true, - OutputFilePath = PrimaryInputFile, - Message = "Document opened in FryPDF Editor." - }); - } -} diff --git a/src/PdfEditorApp/ViewModels/Tools/Intelligence/OcrPdfToolViewModel.cs b/src/PdfEditorApp/ViewModels/Tools/Intelligence/OcrPdfToolViewModel.cs deleted file mode 100644 index 42771ce..0000000 --- a/src/PdfEditorApp/ViewModels/Tools/Intelligence/OcrPdfToolViewModel.cs +++ /dev/null @@ -1,434 +0,0 @@ -using PdfEditorApp.ViewModels.Tools.Core; -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Diagnostics; -using System.IO; -using System.Linq; -using System.Text; -using System.Threading; -using System.Threading.Tasks; -using Avalonia.Input.Platform; -using CommunityToolkit.Mvvm.ComponentModel; -using CommunityToolkit.Mvvm.Input; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Models; -using PdfEditorApp.Services; -using PdfEditorApp.Services.Ocr; - -namespace PdfEditorApp.ViewModels.Tools.Intelligence; - -public partial class OcrPdfToolViewModel : PdfToolViewModelBase -{ - private readonly ICompositeOcrProvider _ocrProvider; - private readonly Dictionary _pageTextCache = new(); - private CancellationTokenSource? _pageExtractCts; - - [ObservableProperty] - private string _language = "eng"; - - [ObservableProperty] - private bool _generateSearchablePdf = true; - - [ObservableProperty] - private bool _generateTextFile = true; - - [ObservableProperty] - private bool _extractTextOnly; - - [ObservableProperty] - private OcrEngineType _selectedEngine = OcrEngineType.Auto; - - [ObservableProperty] - private string _activeEngineDescription = string.Empty; - - [ObservableProperty] - private bool _isDownloadingModel; - - [ObservableProperty] - private double _downloadProgress; - - [ObservableProperty] - private string _downloadStatusText = string.Empty; - - [ObservableProperty] - private bool _isSideBySideVisible = true; - - [ObservableProperty] - private string _currentPageExtractedText = string.Empty; - - [ObservableProperty] - private string _fullDocumentExtractedText = string.Empty; - - [ObservableProperty] - private bool _showFullDocumentText; - - [ObservableProperty] - private bool _isExtractingPageText; - - [ObservableProperty] - private string _wordCountText = "0 words"; - - [ObservableProperty] - private string _charCountText = "0 chars"; - - [ObservableProperty] - private string _copyStatusMessage = string.Empty; - - [ObservableProperty] - private string? _lastGeneratedTextFilePath; - - public bool HasGeneratedTextFile => !string.IsNullOrEmpty(LastGeneratedTextFilePath) && File.Exists(LastGeneratedTextFilePath); - - public string ViewModeButtonText => ShowFullDocumentText ? "Doc View" : "Page View"; - - public string ActiveDisplayedText - { - get => ShowFullDocumentText ? FullDocumentExtractedText : CurrentPageExtractedText; - set - { - if (ShowFullDocumentText) - { - FullDocumentExtractedText = value; - } - else - { - CurrentPageExtractedText = value; - if (Preview.SelectedPage != null) - { - _pageTextCache[Preview.SelectedPage.PageNumber] = value; - } - } - UpdateStats(); - } - } - - public ObservableCollection Languages { get; } = new(); - - public override bool UsesWorkspaceShell => true; - - public OcrPdfToolViewModel(IPdfDocumentOperationsService operationsService, PdfToolDefinition tool, ICompositeOcrProvider? ocrProvider = null) - : base(operationsService, tool) - { - _ocrProvider = ocrProvider ?? CompositeOcrProvider.Default; - UpdateActiveEngineDescription(); - LoadLanguages(); - - Preview.PropertyChanged += (s, e) => - { - if (e.PropertyName == nameof(Preview.SelectedPage) && Preview.SelectedPage != null) - { - _ = ExtractTextForPageAsync(Preview.SelectedPage.PageNumber); - } - }; - } - - partial void OnSelectedEngineChanged(OcrEngineType value) - { - _ocrProvider.PreferredEngine = value; - UpdateActiveEngineDescription(); - } - - partial void OnCurrentPageExtractedTextChanged(string value) - { - OnPropertyChanged(nameof(ActiveDisplayedText)); - UpdateStats(); - } - - partial void OnFullDocumentExtractedTextChanged(string value) - { - OnPropertyChanged(nameof(ActiveDisplayedText)); - UpdateStats(); - } - - partial void OnShowFullDocumentTextChanged(bool value) - { - OnPropertyChanged(nameof(ActiveDisplayedText)); - OnPropertyChanged(nameof(ViewModeButtonText)); - UpdateStats(); - } - - partial void OnLastGeneratedTextFilePathChanged(string? value) - { - OnPropertyChanged(nameof(HasGeneratedTextFile)); - } - - private void UpdateActiveEngineDescription() - { - ActiveEngineDescription = _ocrProvider.ActiveEngine.EngineName; - } - - private void LoadLanguages() - { - Languages.Clear(); - foreach (var lang in _ocrProvider.ModelService.AvailableLanguages) - { - Languages.Add(lang); - } - } - - [RelayCommand] - public void ToggleViewMode() - { - ShowFullDocumentText = !ShowFullDocumentText; - } - - [RelayCommand] - public void ToggleSideBySide() - { - IsSideBySideVisible = !IsSideBySideVisible; - } - - [RelayCommand] - public async Task ExtractCurrentPageTextAsync() - { - if (Preview.SelectedPage != null) - { - _pageTextCache.Remove(Preview.SelectedPage.PageNumber); - await ExtractTextForPageAsync(Preview.SelectedPage.PageNumber); - } - } - - private int _currentlyExtractingPage = -1; - - public async Task ExtractTextForPageAsync(int pageNumber) - { - if (SelectedFiles.Count == 0 || !File.Exists(SelectedFiles[0])) return; - - if (_pageTextCache.TryGetValue(pageNumber, out var cachedText)) - { - CurrentPageExtractedText = cachedText; - return; - } - - if (_currentlyExtractingPage == pageNumber && IsExtractingPageText) - { - return; - } - - _pageExtractCts?.Cancel(); - _pageExtractCts = new CancellationTokenSource(); - var ct = _pageExtractCts.Token; - _currentlyExtractingPage = pageNumber; - - IsExtractingPageText = true; - try - { - string filePath = SelectedFiles[0]; - string recognizedText = await Task.Run(() => - { - using var pdfPigDoc = UglyToad.PdfPig.PdfDocument.Open(filePath); - if (pageNumber < 1 || pageNumber > pdfPigDoc.NumberOfPages) return string.Empty; - - var page = pdfPigDoc.GetPage(pageNumber); - var vectorWords = page.GetWords().ToList(); - if (vectorWords.Count > 0) - { - return page.Text; - } - - // Scanned page: render image and run OCR - try { UglyToad.PdfPig.Rendering.Skia.PdfPigExtensions.AddSkiaPageFactory(pdfPigDoc); } catch { } - using var pngStream = UglyToad.PdfPig.Rendering.Skia.PdfPigExtensions.GetPageAsPng(pdfPigDoc, pageNumber, 1.5f, 100); - if (pngStream == null || pngStream.Length == 0) return string.Empty; - - var ocrRes = _ocrProvider.RecognizeTextAsync(pngStream.ToArray(), Language, ct).GetAwaiter().GetResult(); - return ocrRes.Success ? ocrRes.FullText : string.Empty; - }, ct); - - if (!ct.IsCancellationRequested) - { - _pageTextCache[pageNumber] = recognizedText; - CurrentPageExtractedText = recognizedText; - } - } - catch (OperationCanceledException) { } - catch (Exception ex) - { - CurrentPageExtractedText = $"[Error extracting page {pageNumber}: {ex.Message}]"; - } - finally - { - if (_currentlyExtractingPage == pageNumber) - { - _currentlyExtractingPage = -1; - IsExtractingPageText = false; - } - } - } - - private void UpdateStats() - { - string text = ActiveDisplayedText; - if (string.IsNullOrWhiteSpace(text)) - { - WordCountText = "0 words"; - CharCountText = "0 chars"; - return; - } - - int words = text.Split(new[] { ' ', '\r', '\n', '\t' }, StringSplitOptions.RemoveEmptyEntries).Length; - WordCountText = $"{words:N0} words"; - CharCountText = $"{text.Length:N0} chars"; - } - - [RelayCommand] - public async Task CopyCurrentTextAsync() - { - string text = ActiveDisplayedText; - if (string.IsNullOrEmpty(text)) return; - - if (Avalonia.Application.Current?.ApplicationLifetime is Avalonia.Controls.ApplicationLifetimes.IClassicDesktopStyleApplicationLifetime desktop && desktop.MainWindow?.Clipboard != null) - { - await desktop.MainWindow.Clipboard.SetTextAsync(text); - } - - CopyStatusMessage = "Copied to clipboard!"; - await Task.Delay(2000); - CopyStatusMessage = string.Empty; - } - - [RelayCommand] - public async Task ExportTextFileAsync() - { - string text = ActiveDisplayedText; - if (string.IsNullOrWhiteSpace(text) && Preview.SelectedPage != null) - { - await ExtractTextForPageAsync(Preview.SelectedPage.PageNumber); - text = ActiveDisplayedText; - } - - if (string.IsNullOrWhiteSpace(text)) return; - - if (StorageProvider != null) - { - string defaultName = SelectedFiles.Count > 0 - ? $"{Path.GetFileNameWithoutExtension(SelectedFiles[0])}_extracted.txt" - : "Extracted_Text.txt"; - - var file = await StorageProvider.SaveFilePickerAsync(new Avalonia.Platform.Storage.FilePickerSaveOptions - { - Title = "Save Extracted Text File", - SuggestedFileName = defaultName, - DefaultExtension = "txt", - FileTypeChoices = new[] - { - new Avalonia.Platform.Storage.FilePickerFileType("Text Document (*.txt)") - { - Patterns = new[] { "*.txt" } - } - } - }); - - if (file != null) - { - await File.WriteAllTextAsync(file.Path.LocalPath, text, Encoding.UTF8); - LastGeneratedTextFilePath = file.Path.LocalPath; - CopyStatusMessage = $"Saved to {Path.GetFileName(file.Path.LocalPath)}!"; - await Task.Delay(2500); - CopyStatusMessage = string.Empty; - } - } - } - - [RelayCommand] - public void OpenGeneratedTextFile() - { - if (!string.IsNullOrEmpty(LastGeneratedTextFilePath) && File.Exists(LastGeneratedTextFilePath)) - { - try - { - Process.Start(new ProcessStartInfo - { - FileName = LastGeneratedTextFilePath, - UseShellExecute = true - }); - } - catch { } - } - } - - [RelayCommand] - public async Task DownloadSelectedLanguageAsync() - { - if (IsDownloadingModel) return; - - IsDownloadingModel = true; - DownloadProgress = 0.0; - DownloadStatusText = $"Starting download for {Language}..."; - - var progress = new Progress(p => DownloadProgress = p * 100); - - try - { - bool ok = await _ocrProvider.ModelService.DownloadLanguageAsync( - Language, - progress, - status => DownloadStatusText = status, - CancellationToken.None); - - LoadLanguages(); - DownloadStatusText = ok ? "Language model ready!" : "Failed to download model."; - } - catch (Exception ex) - { - DownloadStatusText = $"Download error: {ex.Message}"; - } - finally - { - IsDownloadingModel = false; - } - } - - protected override async Task ExecuteCoreAsync(IProgress progress, CancellationToken ct) - { - _ocrProvider.PreferredEngine = SelectedEngine; - var result = await ExecuteBatchAsync(file => new OcrToolOptions - { - InputFilePath = file, - Language = Language, - GenerateSearchablePdf = GenerateSearchablePdf, - GenerateTextFile = GenerateTextFile, - ExtractTextOnly = ExtractTextOnly - }, progress, ct); - - // Find the generated text file in result.OutputFiles if any - if (result.OutputFiles != null) - { - var txt = result.OutputFiles.FirstOrDefault(f => f.EndsWith(".txt", StringComparison.OrdinalIgnoreCase)); - if (txt != null && File.Exists(txt)) - { - LastGeneratedTextFilePath = txt; - FullDocumentExtractedText = await File.ReadAllTextAsync(txt, ct); - ShowFullDocumentText = true; - } - } - - OnPropertyChanged(nameof(HasSearchablePdfOutput)); - return result; - } - - public bool HasSearchablePdfOutput => !string.IsNullOrEmpty(LastOutputFilePath) && File.Exists(LastOutputFilePath) && LastOutputFilePath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase); - - [RelayCommand] - public async Task PreviewTextFileAsync() - { - if (!string.IsNullOrEmpty(LastGeneratedTextFilePath) && File.Exists(LastGeneratedTextFilePath)) - { - await Preview.LoadDocumentAsync(LastGeneratedTextFilePath); - } - else if (!string.IsNullOrEmpty(FullDocumentExtractedText)) - { - Preview.LoadTextContent(FullDocumentExtractedText, "Extracted_Text.txt"); - } - } - - [RelayCommand] - public async Task PreviewSearchablePdfAsync() - { - if (!string.IsNullOrEmpty(LastOutputFilePath) && File.Exists(LastOutputFilePath) && LastOutputFilePath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase)) - { - await Preview.LoadDocumentAsync(LastOutputFilePath); - } - } -} diff --git a/src/PdfEditorApp/ViewModels/Tools/Intelligence/PdfFormsToolViewModel.cs b/src/PdfEditorApp/ViewModels/Tools/Intelligence/PdfFormsToolViewModel.cs deleted file mode 100644 index 87c8c1d..0000000 --- a/src/PdfEditorApp/ViewModels/Tools/Intelligence/PdfFormsToolViewModel.cs +++ /dev/null @@ -1,37 +0,0 @@ -using PdfEditorApp.ViewModels.Tools.Core; -using System; -using System.Threading; -using System.Threading.Tasks; -using CommunityToolkit.Mvvm.ComponentModel; -using PdfEditorApp.Models; -using PdfEditorApp.Services; - -namespace PdfEditorApp.ViewModels.Tools.Intelligence; - -public partial class PdfFormsToolViewModel : PdfToolViewModelBase -{ - [ObservableProperty] - private bool _flattenFields; - - [ObservableProperty] - private bool _exportFieldValuesJson; - - public override bool UsesWorkspaceShell => true; - - public PdfFormsToolViewModel(IPdfDocumentOperationsService operationsService, PdfToolDefinition tool) - : base(operationsService, tool) - { - } - - protected override async Task ExecuteCoreAsync(IProgress progress, CancellationToken ct) - { - var options = new FormToolOptions - { - InputFilePath = PrimaryInputFile, - FlattenFields = FlattenFields, - ExportFieldValuesJson = ExportFieldValuesJson - }; - - return await OperationsService.ExecuteToolAsync(PdfToolId.PdfForms, options, progress, ct); - } -} diff --git a/src/PdfEditorApp/ViewModels/Tools/Intelligence/TranslatePdfToolViewModel.cs b/src/PdfEditorApp/ViewModels/Tools/Intelligence/TranslatePdfToolViewModel.cs deleted file mode 100644 index 00e4f80..0000000 --- a/src/PdfEditorApp/ViewModels/Tools/Intelligence/TranslatePdfToolViewModel.cs +++ /dev/null @@ -1,41 +0,0 @@ -using PdfEditorApp.ViewModels.Tools.Core; -using System; -using System.Threading; -using System.Threading.Tasks; -using CommunityToolkit.Mvvm.ComponentModel; -using PdfEditorApp.Models; -using PdfEditorApp.Services; - -namespace PdfEditorApp.ViewModels.Tools.Intelligence; - -public partial class TranslatePdfToolViewModel : PdfToolViewModelBase -{ - [ObservableProperty] - private string _sourceLanguage = "Auto"; - - [ObservableProperty] - private string _targetLanguage = "Spanish"; - - [ObservableProperty] - private bool _preserveLayout = true; - - public override bool UsesWorkspaceShell => true; - - public TranslatePdfToolViewModel(IPdfDocumentOperationsService operationsService, PdfToolDefinition tool) - : base(operationsService, tool) - { - } - - protected override async Task ExecuteCoreAsync(IProgress progress, CancellationToken ct) - { - var options = new TranslationOptions - { - InputFilePath = PrimaryInputFile, - SourceLanguage = SourceLanguage, - TargetLanguage = TargetLanguage, - PreserveLayout = PreserveLayout - }; - - return await OperationsService.ExecuteToolAsync(PdfToolId.TranslatePdf, options, progress, ct); - } -} diff --git a/src/PdfEditorApp/ViewModels/Tools/Organize/CropPdfToolViewModel.cs b/src/PdfEditorApp/ViewModels/Tools/Organize/CropPdfToolViewModel.cs deleted file mode 100644 index 28524f8..0000000 --- a/src/PdfEditorApp/ViewModels/Tools/Organize/CropPdfToolViewModel.cs +++ /dev/null @@ -1,51 +0,0 @@ -using PdfEditorApp.ViewModels.Tools.Core; -using System; -using System.Threading; -using System.Threading.Tasks; -using CommunityToolkit.Mvvm.ComponentModel; -using PdfEditorApp.Models; -using PdfEditorApp.Services; - -namespace PdfEditorApp.ViewModels.Tools.Organize; - -public partial class CropPdfToolViewModel : PdfToolViewModelBase -{ - [ObservableProperty] - private double _cropMarginTop = 36; - - [ObservableProperty] - private double _cropMarginBottom = 36; - - [ObservableProperty] - private double _cropMarginLeft = 36; - - [ObservableProperty] - private double _cropMarginRight = 36; - - [ObservableProperty] - private PageTargetSelection _targetPages = PageTargetSelection.AllPages; - - [ObservableProperty] - private string _customRange = string.Empty; - - public override bool UsesWorkspaceShell => true; - - public CropPdfToolViewModel(IPdfDocumentOperationsService operationsService, PdfToolDefinition tool) - : base(operationsService, tool) - { - } - - protected override async Task ExecuteCoreAsync(IProgress progress, CancellationToken ct) - { - return await ExecuteBatchAsync(file => new CropToolOptions - { - InputFilePath = file, - CropTopPoints = CropMarginTop, - CropBottomPoints = CropMarginBottom, - CropLeftPoints = CropMarginLeft, - CropRightPoints = CropMarginRight, - TargetPages = TargetPages, - CustomRange = CustomRange - }, progress, ct); - } -} diff --git a/src/PdfEditorApp/ViewModels/Tools/Organize/MergePdfToolViewModel.cs b/src/PdfEditorApp/ViewModels/Tools/Organize/MergePdfToolViewModel.cs deleted file mode 100644 index 1aea237..0000000 --- a/src/PdfEditorApp/ViewModels/Tools/Organize/MergePdfToolViewModel.cs +++ /dev/null @@ -1,75 +0,0 @@ -using PdfEditorApp.ViewModels.Tools.Core; -using System; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using CommunityToolkit.Mvvm.ComponentModel; -using PdfEditorApp.Models; -using PdfEditorApp.Services; - -namespace PdfEditorApp.ViewModels.Tools.Organize; - -public partial class MergePdfToolViewModel : PdfToolViewModelBase -{ - [ObservableProperty] - private bool _normalizePageSizes; - - [ObservableProperty] - private bool _preserveBookmarks = true; - - [ObservableProperty] - private PdfProcessingEngine _processingEngine = PdfProcessingEngine.StandardPdfSharp; - - public bool IsQuestPdfEngine - { - get => ProcessingEngine == PdfProcessingEngine.QuestPdfNative; - set - { - if (value) ProcessingEngine = PdfProcessingEngine.QuestPdfNative; - OnPropertyChanged(); - OnPropertyChanged(nameof(IsStandardEngine)); - } - } - - public bool IsStandardEngine - { - get => ProcessingEngine == PdfProcessingEngine.StandardPdfSharp; - set - { - if (value) ProcessingEngine = PdfProcessingEngine.StandardPdfSharp; - OnPropertyChanged(); - OnPropertyChanged(nameof(IsQuestPdfEngine)); - } - } - - public override bool UsesWorkspaceShell => true; - - public MergePdfToolViewModel(IPdfDocumentOperationsService operationsService, PdfToolDefinition tool) - : base(operationsService, tool) - { - } - - protected override bool ValidateInputs(out string errorMessage) - { - if (SelectedFiles.Count < 2) - { - errorMessage = "Please select at least 2 PDF documents to merge."; - return false; - } - errorMessage = string.Empty; - return true; - } - - protected override async Task ExecuteCoreAsync(IProgress progress, CancellationToken ct) - { - var options = new MergeToolOptions - { - InputFiles = SelectedFiles.ToList(), - NormalizePageSizes = NormalizePageSizes, - PreserveBookmarks = PreserveBookmarks, - Engine = ProcessingEngine - }; - - return await OperationsService.ExecuteToolAsync(PdfToolId.MergePdf, options, progress, ct); - } -} diff --git a/src/PdfEditorApp/ViewModels/Tools/Organize/OrganizePdfToolViewModel.cs b/src/PdfEditorApp/ViewModels/Tools/Organize/OrganizePdfToolViewModel.cs deleted file mode 100644 index 7f88f29..0000000 --- a/src/PdfEditorApp/ViewModels/Tools/Organize/OrganizePdfToolViewModel.cs +++ /dev/null @@ -1,50 +0,0 @@ -using PdfEditorApp.ViewModels.Tools.Core; -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using CommunityToolkit.Mvvm.ComponentModel; -using PdfEditorApp.Models; -using PdfEditorApp.Services; - -namespace PdfEditorApp.ViewModels.Tools.Organize; - -public partial class OrganizePdfToolViewModel : PdfToolViewModelBase -{ - [ObservableProperty] - private List _pageOrder = new(); - - [ObservableProperty] - private List _pagesToDelete = new(); - - public override bool UsesWorkspaceShell => true; - - public OrganizePdfToolViewModel(IPdfDocumentOperationsService operationsService, PdfToolDefinition tool) - : base(operationsService, tool) - { - } - - protected override async Task ExecuteCoreAsync(IProgress progress, CancellationToken ct) - { - // This standalone view has no reorder/delete/rotate controls yet, so PageOrder and - // PagesToDelete can never be populated here — calling through would silently save an - // unchanged copy while claiming success. Say so honestly instead of faking a result. - if (PageOrder.Count == 0 && PagesToDelete.Count == 0) - { - return new ToolExecutionResult - { - Success = false, - ErrorMessage = "This standalone tool doesn't have page reorder/delete/rotate controls yet, so there's nothing to apply. Use the FryPDF Pages Sidebar in the Editor for visual drag-and-drop reordering, rotation, and deletion." - }; - } - - var options = new OrganizeToolOptions - { - InputFilePath = PrimaryInputFile, - PageOrder = PageOrder, - PagesToDelete = PagesToDelete - }; - - return await OperationsService.ExecuteToolAsync(PdfToolId.OrganizePdf, options, progress, ct); - } -} diff --git a/src/PdfEditorApp/ViewModels/Tools/Organize/PageNumbersToolViewModel.cs b/src/PdfEditorApp/ViewModels/Tools/Organize/PageNumbersToolViewModel.cs deleted file mode 100644 index 6794579..0000000 --- a/src/PdfEditorApp/ViewModels/Tools/Organize/PageNumbersToolViewModel.cs +++ /dev/null @@ -1,63 +0,0 @@ -using PdfEditorApp.ViewModels.Tools.Core; -using System; -using System.Threading; -using System.Threading.Tasks; -using CommunityToolkit.Mvvm.ComponentModel; -using PdfEditorApp.Models; -using PdfEditorApp.Services; - -namespace PdfEditorApp.ViewModels.Tools.Organize; - -public partial class PageNumbersToolViewModel : PdfToolViewModelBase -{ - [ObservableProperty] - private PageNumberPosition _position = PageNumberPosition.BottomCenter; - - [ObservableProperty] - private string _template = "Page {n} of {total}"; - - [ObservableProperty] - private int _startingNumber = 1; - - [ObservableProperty] - private string _fontFamily = "Helvetica"; - - [ObservableProperty] - private double _fontSize = 10; - - [ObservableProperty] - private string _colorHex = "#334155"; - - [ObservableProperty] - private PageTargetSelection _targetPages = PageTargetSelection.AllPages; - - [ObservableProperty] - private string _customRange = string.Empty; - - [ObservableProperty] - private double _marginPoints = 28; - - public override bool UsesWorkspaceShell => true; - - public PageNumbersToolViewModel(IPdfDocumentOperationsService operationsService, PdfToolDefinition tool) - : base(operationsService, tool) - { - } - - protected override async Task ExecuteCoreAsync(IProgress progress, CancellationToken ct) - { - return await ExecuteBatchAsync(file => new PageNumberToolOptions - { - InputFilePath = file, - Position = Position, - Template = Template, - StartingNumber = StartingNumber, - FontFamily = FontFamily, - FontSize = FontSize, - ColorHex = ColorHex, - TargetPages = TargetPages, - CustomRange = CustomRange, - MarginPoints = MarginPoints - }, progress, ct); - } -} diff --git a/src/PdfEditorApp/ViewModels/Tools/Organize/RotatePdfToolViewModel.cs b/src/PdfEditorApp/ViewModels/Tools/Organize/RotatePdfToolViewModel.cs deleted file mode 100644 index 8b3bbf4..0000000 --- a/src/PdfEditorApp/ViewModels/Tools/Organize/RotatePdfToolViewModel.cs +++ /dev/null @@ -1,39 +0,0 @@ -using PdfEditorApp.ViewModels.Tools.Core; -using System; -using System.Threading; -using System.Threading.Tasks; -using CommunityToolkit.Mvvm.ComponentModel; -using PdfEditorApp.Models; -using PdfEditorApp.Services; - -namespace PdfEditorApp.ViewModels.Tools.Organize; - -public partial class RotatePdfToolViewModel : PdfToolViewModelBase -{ - [ObservableProperty] - private int _rotationDegrees = 90; - - [ObservableProperty] - private PageFilterTarget _targetFilter = PageFilterTarget.All; - - [ObservableProperty] - private string _customRange = string.Empty; - - public override bool UsesWorkspaceShell => true; - - public RotatePdfToolViewModel(IPdfDocumentOperationsService operationsService, PdfToolDefinition tool) - : base(operationsService, tool) - { - } - - protected override async Task ExecuteCoreAsync(IProgress progress, CancellationToken ct) - { - return await ExecuteBatchAsync(file => new RotateToolOptions - { - InputFilePath = file, - RotationDegrees = RotationDegrees, - TargetFilter = TargetFilter, - CustomRange = CustomRange - }, progress, ct); - } -} diff --git a/src/PdfEditorApp/ViewModels/Tools/Organize/SplitPdfToolViewModel.cs b/src/PdfEditorApp/ViewModels/Tools/Organize/SplitPdfToolViewModel.cs deleted file mode 100644 index b9281e7..0000000 --- a/src/PdfEditorApp/ViewModels/Tools/Organize/SplitPdfToolViewModel.cs +++ /dev/null @@ -1,50 +0,0 @@ -using PdfEditorApp.ViewModels.Tools.Core; -using System; -using System.Threading; -using System.Threading.Tasks; -using CommunityToolkit.Mvvm.ComponentModel; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Models; -using PdfEditorApp.Services; - -namespace PdfEditorApp.ViewModels.Tools.Organize; - -public partial class SplitPdfToolViewModel : PdfToolViewModelBase -{ - [ObservableProperty] - private SplitExtractMode _splitMode = SplitExtractMode.SplitEveryNPages; - - [ObservableProperty] - private int _splitPagesInterval = 1; - - [ObservableProperty] - private string _splitRangeExpression = "1-3, 5, 7-10"; - - [ObservableProperty] - private bool _splitOddEven; - - [ObservableProperty] - private bool _extractOddPages; - - public override bool UsesWorkspaceShell => true; - - public SplitPdfToolViewModel(IPdfDocumentOperationsService operationsService, PdfToolDefinition tool) - : base(operationsService, tool) - { - } - - protected override async Task ExecuteCoreAsync(IProgress progress, CancellationToken ct) - { - var options = new SplitToolOptions - { - InputFilePath = PrimaryInputFile, - Mode = SplitMode, - PagesPerSplit = SplitPagesInterval, - RangeExpression = SplitRangeExpression, - SplitOddEven = SplitOddEven, - ExtractOddPages = ExtractOddPages - }; - - return await OperationsService.ExecuteToolAsync(PdfToolId.SplitPdf, options, progress, ct); - } -} diff --git a/src/PdfEditorApp/ViewModels/Tools/Security/CompressPdfToolViewModel.cs b/src/PdfEditorApp/ViewModels/Tools/Security/CompressPdfToolViewModel.cs deleted file mode 100644 index 8755f73..0000000 --- a/src/PdfEditorApp/ViewModels/Tools/Security/CompressPdfToolViewModel.cs +++ /dev/null @@ -1,205 +0,0 @@ -using PdfEditorApp.ViewModels.Tools.Core; -using System; -using System.Threading; -using System.Threading.Tasks; -using CommunityToolkit.Mvvm.ComponentModel; -using CommunityToolkit.Mvvm.Input; -using PdfEditorApp.Models; -using PdfEditorApp.Services; - -namespace PdfEditorApp.ViewModels.Tools.Security; - -public partial class CompressPdfToolViewModel : PdfToolViewModelBase -{ - [ObservableProperty] - private PdfCompressionLevel _compressionLevel = PdfCompressionLevel.Balanced; - - [ObservableProperty] - private int _imageQualityDpi = 150; - - [ObservableProperty] - private int _jpegQuality = 66; - - [ObservableProperty] - private bool _convertToGrayscale; - - [ObservableProperty] - private bool _isCustomMode; - - [ObservableProperty] - private bool _removeMetadata; - - [ObservableProperty] - private bool _removeDuplicateObjects = true; - - [ObservableProperty] - private bool _compressStreams = true; - - [ObservableProperty] - private bool _linearizeForWeb; - - [ObservableProperty] - private string _qualityFeedbackMessage = "✅ Balanced clarity & high compression (~70% reduction). Recommended for general use."; - - [ObservableProperty] - private string _qualityFeedbackSeverity = "Success"; // "Success", "Warning", "Info" - - public override bool UsesWorkspaceShell => true; - - public bool IsExtremeCompression => !IsCustomMode && CompressionLevel == PdfCompressionLevel.MaximumCompression; - public bool IsRecommendedCompression => !IsCustomMode && (CompressionLevel == PdfCompressionLevel.Balanced || CompressionLevel == PdfCompressionLevel.SmallSize); - public bool IsLessCompression => !IsCustomMode && (CompressionLevel == PdfCompressionLevel.HighQuality || CompressionLevel == PdfCompressionLevel.MaximumQuality); - - public CompressPdfToolViewModel(IPdfDocumentOperationsService operationsService, PdfToolDefinition tool) - : base(operationsService, tool) - { - UpdateQualityFeedback(); - } - - [RelayCommand] - public void SelectPreset(string preset) - { - IsCustomMode = false; - switch (preset.ToLowerInvariant()) - { - case "extreme": - case "maximum": - CompressionLevel = PdfCompressionLevel.MaximumCompression; - ImageQualityDpi = 96; - JpegQuality = 52; - break; - - case "recommended": - case "balanced": - CompressionLevel = PdfCompressionLevel.Balanced; - ImageQualityDpi = 125; - JpegQuality = 66; - break; - - case "less": - case "high": - CompressionLevel = PdfCompressionLevel.HighQuality; - ImageQualityDpi = 180; - JpegQuality = 82; - break; - - case "custom": - IsCustomMode = true; - break; - } - - RefreshPresetStates(); - UpdateQualityFeedback(); - } - - [RelayCommand] - public void ToggleCustomMode() - { - IsCustomMode = !IsCustomMode; - RefreshPresetStates(); - UpdateQualityFeedback(); - } - - partial void OnImageQualityDpiChanged(int value) - { - // Safe input clamp - int clamped = Math.Clamp(value, 50, 600); - if (clamped != value) - { - ImageQualityDpi = clamped; - return; - } - UpdateQualityFeedback(); - } - - partial void OnJpegQualityChanged(int value) - { - // Safe input clamp - int clamped = Math.Clamp(value, 20, 100); - if (clamped != value) - { - JpegQuality = clamped; - return; - } - UpdateQualityFeedback(); - } - - partial void OnConvertToGrayscaleChanged(bool value) - { - UpdateQualityFeedback(); - } - - partial void OnCompressionLevelChanged(PdfCompressionLevel value) - { - RefreshPresetStates(); - UpdateQualityFeedback(); - } - - partial void OnIsCustomModeChanged(bool value) - { - RefreshPresetStates(); - UpdateQualityFeedback(); - } - - private void RefreshPresetStates() - { - OnPropertyChanged(nameof(IsExtremeCompression)); - OnPropertyChanged(nameof(IsRecommendedCompression)); - OnPropertyChanged(nameof(IsLessCompression)); - } - - private void UpdateQualityFeedback() - { - if (ImageQualityDpi < 72) - { - QualityFeedbackSeverity = "Warning"; - QualityFeedbackMessage = "⚠️ Low DPI (<72 DPI): Scanned text or fine lines may become blurry and difficult to read."; - } - else if (JpegQuality < 45) - { - QualityFeedbackSeverity = "Warning"; - QualityFeedbackMessage = "⚠️ Low JPEG Quality (<45%): Visible compression artifacts, grain, and blockiness will appear around text."; - } - else if (ImageQualityDpi >= 300 && JpegQuality >= 90) - { - QualityFeedbackSeverity = "Info"; - QualityFeedbackMessage = "ℹ️ Ultra-high print resolution selected: Original fidelity is pristine, but file size reduction will be minimal (<25%)."; - } - else if (ConvertToGrayscale) - { - QualityFeedbackSeverity = "Success"; - QualityFeedbackMessage = "✨ Grayscale Mode: Color channels removed. Saves an extra ~20-30% on scanned forms, receipts, and invoices."; - } - else if (IsExtremeCompression || (ImageQualityDpi <= 100 && JpegQuality <= 55)) - { - QualityFeedbackSeverity = "Success"; - QualityFeedbackMessage = "⚡ Maximum Compression (~75–85% reduction): Highly compact output, ideal for email and strict upload limits."; - } - else if (IsLessCompression || (ImageQualityDpi >= 180 && JpegQuality >= 80)) - { - QualityFeedbackSeverity = "Info"; - QualityFeedbackMessage = "💎 High Fidelity Compression (~35–50% reduction): High clarity with moderate file size savings."; - } - else - { - QualityFeedbackSeverity = "Success"; - QualityFeedbackMessage = "✅ Balanced Compression (~65–75% reduction): Great visual quality and substantial file size savings."; - } - } - - protected override async Task ExecuteCoreAsync(IProgress progress, CancellationToken ct) - { - return await ExecuteBatchAsync(file => new CompressToolOptions - { - InputFilePath = file, - Level = CompressionLevel, - ImageQualityDpi = Math.Clamp(ImageQualityDpi, 50, 600), - JpegQuality = Math.Clamp(JpegQuality, 20, 100), - ConvertToGrayscale = ConvertToGrayscale, - RemoveMetadata = RemoveMetadata, - RemoveDuplicateObjects = RemoveDuplicateObjects, - CompressStreams = CompressStreams, - LinearizeForWeb = LinearizeForWeb - }, progress, ct); - } -} diff --git a/src/PdfEditorApp/ViewModels/Tools/Security/ProtectPdfToolViewModel.cs b/src/PdfEditorApp/ViewModels/Tools/Security/ProtectPdfToolViewModel.cs deleted file mode 100644 index f459f73..0000000 --- a/src/PdfEditorApp/ViewModels/Tools/Security/ProtectPdfToolViewModel.cs +++ /dev/null @@ -1,127 +0,0 @@ -using PdfEditorApp.ViewModels.Tools.Core; -using System; -using System.Threading; -using System.Threading.Tasks; -using CommunityToolkit.Mvvm.ComponentModel; -using PdfEditorApp.Models; -using PdfEditorApp.Services; - -namespace PdfEditorApp.ViewModels.Tools.Security; - -public partial class ProtectPdfToolViewModel : PdfToolViewModelBase -{ - [ObservableProperty] - private string _userPassword = string.Empty; - - [ObservableProperty] - private string _ownerPassword = string.Empty; - - [ObservableProperty] - private bool _allowPrinting = true; - - [ObservableProperty] - private bool _allowModifying; - - [ObservableProperty] - private bool _allowCopying; - - [ObservableProperty] - private bool _allowAnnotating = true; - - [ObservableProperty] - private bool _allowFormFilling = true; - - [ObservableProperty] - private bool _allowAssembly = true; - - [ObservableProperty] - private bool _encryptMetadata = true; - - [ObservableProperty] - private PdfProcessingEngine _processingEngine = PdfProcessingEngine.StandardPdfSharp; - - [ObservableProperty] - private PdfEncryptionLevel _encryptionLevel = PdfEncryptionLevel.Aes256Bit; - - public bool IsQuestPdfEngine - { - get => ProcessingEngine == PdfProcessingEngine.QuestPdfNative; - set - { - if (value) ProcessingEngine = PdfProcessingEngine.QuestPdfNative; - OnPropertyChanged(); - OnPropertyChanged(nameof(IsStandardEngine)); - } - } - - public bool IsStandardEngine - { - get => ProcessingEngine == PdfProcessingEngine.StandardPdfSharp; - set - { - if (value) ProcessingEngine = PdfProcessingEngine.StandardPdfSharp; - OnPropertyChanged(); - OnPropertyChanged(nameof(IsQuestPdfEngine)); - } - } - - public bool IsAes256 - { - get => EncryptionLevel == PdfEncryptionLevel.Aes256Bit; - set - { - if (value) EncryptionLevel = PdfEncryptionLevel.Aes256Bit; - OnPropertyChanged(); - OnPropertyChanged(nameof(IsAes128)); - } - } - - public bool IsAes128 - { - get => EncryptionLevel == PdfEncryptionLevel.Aes128Bit; - set - { - if (value) EncryptionLevel = PdfEncryptionLevel.Aes128Bit; - OnPropertyChanged(); - OnPropertyChanged(nameof(IsAes256)); - } - } - - public override bool UsesWorkspaceShell => true; - - public ProtectPdfToolViewModel(IPdfDocumentOperationsService operationsService, PdfToolDefinition tool) - : base(operationsService, tool) - { - } - - protected override bool ValidateInputs(out string errorMessage) - { - if (!base.ValidateInputs(out errorMessage)) return false; - - if (string.IsNullOrEmpty(UserPassword) && string.IsNullOrEmpty(OwnerPassword)) - { - errorMessage = "Please enter a user or owner password to encrypt the document."; - return false; - } - return true; - } - - protected override async Task ExecuteCoreAsync(IProgress progress, CancellationToken ct) - { - return await ExecuteBatchAsync(file => new SecurityToolOptions - { - InputFilePath = file, - UserPassword = UserPassword, - OwnerPassword = OwnerPassword, - AllowPrinting = AllowPrinting, - AllowModifying = AllowModifying, - AllowCopying = AllowCopying, - AllowAnnotating = AllowAnnotating, - AllowFormFilling = AllowFormFilling, - AllowAssembly = AllowAssembly, - EncryptMetadata = EncryptMetadata, - Engine = ProcessingEngine, - EncryptionLevel = EncryptionLevel - }, progress, ct); - } -} diff --git a/src/PdfEditorApp/ViewModels/Tools/Security/RedactPdfToolViewModel.cs b/src/PdfEditorApp/ViewModels/Tools/Security/RedactPdfToolViewModel.cs deleted file mode 100644 index c1465cf..0000000 --- a/src/PdfEditorApp/ViewModels/Tools/Security/RedactPdfToolViewModel.cs +++ /dev/null @@ -1,344 +0,0 @@ -using PdfEditorApp.ViewModels.Tools.Core; -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.IO; -using System.Linq; -using System.Threading.Tasks; -using Avalonia; -using CommunityToolkit.Mvvm.ComponentModel; -using CommunityToolkit.Mvvm.Input; -using PdfEditorApp.Models; -using PdfEditorApp.Services; -using PdfEditorApp.Services.Tools.Core; -using PdfEditorApp.ViewModels; - -namespace PdfEditorApp.ViewModels.Tools.Security; - -public partial class RedactPdfToolViewModel : PdfToolViewModelBase -{ - private List _currentPageWords = new(); - - [ObservableProperty] - private string _searchPattern = "CONFIDENTIAL"; - - [ObservableProperty] - private bool _caseSensitive; - - [ObservableProperty] - private bool _permanentScrubText = true; - - [ObservableProperty] - private bool _isSearching; - - [ObservableProperty] - private string _searchStatusMessage = string.Empty; - - public ObservableCollection Marks { get; } = new(); - - public ObservableCollection CurrentPageMarks { get; } = new(); - - public override bool UsesWorkspaceShell => true; - - public bool HasMarks => Marks.Count > 0; - public bool HasSearchStatusMessage => !string.IsNullOrEmpty(SearchStatusMessage); - - /// - /// Increments each time word geometry finishes refreshing for the current page. - /// Word extraction runs independently of Preview's own page rendering (both react - /// to the same file/page-change signals but complete on their own schedule), so - /// this is the only reliable way to know marking is ready to snap to text — there's - /// no user-visible "loading words" state to show instead. - /// - public int WordsRefreshedCount { get; private set; } - - partial void OnSearchStatusMessageChanged(string value) => OnPropertyChanged(nameof(HasSearchStatusMessage)); - - public RedactPdfToolViewModel(IPdfDocumentOperationsService operationsService, PdfToolDefinition tool) - : base(operationsService, tool) - { - Marks.CollectionChanged += (_, _) => OnPropertyChanged(nameof(HasMarks)); - - // Rendering/zoom/page-nav now lives entirely in the shared Preview (from - // PdfToolViewModelBase), which reloads itself on SelectedFiles changes. This - // handler only clears the redaction-specific state that Preview doesn't know - // about. - SelectedFiles.CollectionChanged += (_, _) => - { - Marks.Clear(); - CurrentPageMarks.Clear(); - SearchStatusMessage = string.Empty; - }; - - // Marks are positioned/scaled relative to the current page and zoom, and - // word-snap marking needs the current page's word geometry — both need to be - // recomputed whenever Preview's document, page, or zoom changes. - Preview.PropertyChanged += (_, e) => - { - if (e.PropertyName == nameof(Preview.IsLoading) && !Preview.IsLoading && Preview.HasDocument) - { - _ = RefreshCurrentPageWordsAsync(); - } - else if (e.PropertyName == nameof(Preview.CurrentPageNumber)) - { - _ = RefreshCurrentPageWordsAsync(); - } - else if (e.PropertyName == nameof(Preview.ZoomLevel)) - { - RecomputeCurrentPageMarks(); - } - }; - } - - /// - /// Re-extracts word geometry for whatever page Preview is currently showing, reusing - /// the PDF Reader's own extraction () - /// rather than duplicating it. Independent of Preview's own bitmap rendering — this - /// only needs the page's text layer, not a rasterized image. - /// - private async Task RefreshCurrentPageWordsAsync() - { - string path = PrimaryInputFile; - int pageNumber = Preview.CurrentPageNumber; - - if (string.IsNullOrEmpty(path) || !File.Exists(path) || pageNumber < 1) - { - _currentPageWords = new List(); - RecomputeCurrentPageMarks(); - return; - } - - var words = await Task.Run(() => - { - try - { - byte[] bytes = File.ReadAllBytes(path); - UglyToad.PdfPig.PdfDocument? doc = null; - try - { - doc = UglyToad.PdfPig.PdfDocument.Open(bytes); - } - catch - { - try - { - byte[] repaired = PdfFileHelper.SalvageAndRepairPdfBytes(bytes); - doc = UglyToad.PdfPig.PdfDocument.Open(repaired); - } - catch - { - return new List(); - } - } - - using (doc) - { - if (doc == null || pageNumber > doc.NumberOfPages) return new List(); - - var page = doc.GetPage(pageNumber); - var (_, extractedWords, _) = PdfViewerViewModel.ExtractPageTextGeometry(page); - return extractedWords; - } - } - catch - { - return new List(); - } - }); - - if (path != PrimaryInputFile || pageNumber != Preview.CurrentPageNumber) return; - - _currentPageWords = words; - WordsRefreshedCount++; - RecomputeCurrentPageMarks(); - } - - private void RecomputeCurrentPageMarks() - { - CurrentPageMarks.Clear(); - - double pageWidthPoints = Preview.SelectedPage?.WidthPoints ?? 0; - if (pageWidthPoints <= 0) return; - - // Preview renders each page at WidthPoints * ZoomLevel pixels (same convention as - // the PDF Reader), so ZoomLevel alone is the points-to-pixels scale factor. - double scale = Preview.ZoomLevel; - foreach (var mark in Marks.Where(m => m.Region.PageIndex == Preview.CurrentPageNumber - 1)) - { - mark.DisplayX = mark.Region.X * scale; - mark.DisplayY = mark.Region.Y * scale; - mark.DisplayWidth = Math.Max(2, mark.Region.Width * scale); - mark.DisplayHeight = Math.Max(2, mark.Region.Height * scale); - CurrentPageMarks.Add(mark); - } - } - - [RelayCommand] - private async Task FindAndMarkAsync() - { - if (string.IsNullOrWhiteSpace(SearchPattern) || string.IsNullOrEmpty(PrimaryInputFile)) return; - - IsSearching = true; - try - { - var matches = await OperationsService.SecurityService.FindRedactionMatchesAsync(PrimaryInputFile, SearchPattern, CaseSensitive); - - if (matches.Count == 0) - { - SearchStatusMessage = $"No matches found for \"{SearchPattern}\"."; - return; - } - - int added = 0; - foreach (var region in matches) - { - bool alreadyMarked = Marks.Any(m => - m.Region.PageIndex == region.PageIndex && - Math.Abs(m.Region.X - region.X) < 0.5 && - Math.Abs(m.Region.Y - region.Y) < 0.5); - if (alreadyMarked) continue; - - Marks.Add(new RedactionMarkItem { Region = region, Label = SearchPattern }); - added++; - } - - SearchStatusMessage = added > 0 - ? $"Marked {added} new match(es) for \"{SearchPattern}\" ({matches.Count} found total)." - : $"All {matches.Count} match(es) for \"{SearchPattern}\" were already marked."; - - RecomputeCurrentPageMarks(); - } - finally - { - IsSearching = false; - } - } - - [RelayCommand] - private void RemoveMark(RedactionMarkItem? item) - { - if (item == null) return; - Marks.Remove(item); - CurrentPageMarks.Remove(item); - } - - [RelayCommand] - private void ClearMarks() - { - Marks.Clear(); - CurrentPageMarks.Clear(); - SearchStatusMessage = string.Empty; - } - - /// - /// Adds a manual mark for the given on-screen rectangle. Snaps to touched text by default - /// (matching the PDF Reader's selection UX); holding Alt/Option bypasses text snap and - /// draws a raw box for non-text areas. If no text words are touched, it gracefully falls - /// back to a raw box so the user's selection is never dropped. - /// - public void AddManualMark(Rect displayRect, bool forceDrawBox = false) - { - double pageWidthPoints = Preview.SelectedPage?.WidthPoints ?? 0; - if (pageWidthPoints <= 0 || displayRect.Width < 2 || displayRect.Height < 2) return; - - double scale = Preview.ZoomLevel > 0 ? Preview.ZoomLevel : 1.0; - double pdfX = displayRect.X / scale; - double pdfY = displayRect.Y / scale; - double pdfWidth = Math.Max(1, displayRect.Width / scale); - double pdfHeight = Math.Max(1, displayRect.Height / scale); - int pageIndex = Preview.CurrentPageNumber - 1; - - RedactionRegion region; - string label; - - if (!forceDrawBox) - { - // Use generous vertical tolerance (±8pt) so horizontal text drags comfortably catch words - var searchRect = new Rect(pdfX, Math.Max(0, pdfY - 8), pdfWidth, pdfHeight + 16); - var touched = _currentPageWords.Where(w => w.Bounds.Intersects(searchRect)).ToList(); - - if (touched.Count > 0) - { - double left = touched.Min(w => w.Bounds.Left); - double top = touched.Min(w => w.Bounds.Top); - double right = touched.Max(w => w.Bounds.Right); - double bottom = touched.Max(w => w.Bounds.Bottom); - - region = new RedactionRegion - { - PageIndex = pageIndex, - X = left, - Y = top, - Width = Math.Max(1, right - left), - Height = Math.Max(1, bottom - top), - Reason = "Manual selection" - }; - - label = string.Join(" ", touched.OrderBy(w => w.Bounds.Left).Select(w => w.Text)); - if (label.Length > 60) label = label.Substring(0, 60) + "…"; - } - else - { - // Minor click/twitch on empty area (<= 5x5) adds nothing - if (displayRect.Width <= 5 && displayRect.Height <= 5) - { - return; - } - - // Dragging a box over images, signatures, or text not yet parsed as words - region = new RedactionRegion - { - PageIndex = pageIndex, - X = pdfX, - Y = pdfY, - Width = pdfWidth, - Height = pdfHeight, - Reason = "Manual selection" - }; - label = "Manual selection"; - } - } - else - { - region = new RedactionRegion - { - PageIndex = pageIndex, - X = pdfX, - Y = pdfY, - Width = pdfWidth, - Height = pdfHeight, - Reason = "Manual selection" - }; - label = "Manual selection"; - } - - SearchStatusMessage = string.Empty; - Marks.Add(new RedactionMarkItem { Region = region, Label = label }); - RecomputeCurrentPageMarks(); - } - - protected override bool ValidateInputs(out string errorMessage) - { - if (!base.ValidateInputs(out errorMessage)) return false; - - if (Marks.Count == 0) - { - errorMessage = "Search for text to redact and review the matches below before running Redact."; - return false; - } - errorMessage = string.Empty; - return true; - } - - protected override async Task ExecuteCoreAsync(IProgress progress, System.Threading.CancellationToken ct) - { - var options = new RedactionToolOptions - { - InputFilePath = PrimaryInputFile, - Regions = Marks.Select(m => m.Region).ToList(), - PermanentScrubText = PermanentScrubText - }; - - return await OperationsService.ExecuteToolAsync(PdfToolId.RedactPdf, options, progress, ct); - } -} diff --git a/src/PdfEditorApp/ViewModels/Tools/Security/RepairPdfToolViewModel.cs b/src/PdfEditorApp/ViewModels/Tools/Security/RepairPdfToolViewModel.cs deleted file mode 100644 index 855185e..0000000 --- a/src/PdfEditorApp/ViewModels/Tools/Security/RepairPdfToolViewModel.cs +++ /dev/null @@ -1,26 +0,0 @@ -using PdfEditorApp.ViewModels.Tools.Core; -using System; -using System.Threading; -using System.Threading.Tasks; -using PdfEditorApp.Models; -using PdfEditorApp.Services; - -namespace PdfEditorApp.ViewModels.Tools.Security; - -public partial class RepairPdfToolViewModel : PdfToolViewModelBase -{ - public override bool UsesWorkspaceShell => true; - - public RepairPdfToolViewModel(IPdfDocumentOperationsService operationsService, PdfToolDefinition tool) - : base(operationsService, tool) - { - } - - protected override async Task ExecuteCoreAsync(IProgress progress, CancellationToken ct) - { - return await ExecuteBatchAsync(file => new RepairToolOptions - { - InputFilePath = file - }, progress, ct); - } -} diff --git a/src/PdfEditorApp/ViewModels/Tools/Security/SignPdfToolViewModel.cs b/src/PdfEditorApp/ViewModels/Tools/Security/SignPdfToolViewModel.cs deleted file mode 100644 index c43cbcf..0000000 --- a/src/PdfEditorApp/ViewModels/Tools/Security/SignPdfToolViewModel.cs +++ /dev/null @@ -1,66 +0,0 @@ -using PdfEditorApp.ViewModels.Tools.Core; -using System; -using System.Threading; -using System.Threading.Tasks; -using CommunityToolkit.Mvvm.ComponentModel; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Models; -using PdfEditorApp.Services; - -namespace PdfEditorApp.ViewModels.Tools.Security; - -public partial class SignPdfToolViewModel : PdfToolViewModelBase -{ - [ObservableProperty] - private string _signerName = "Jane Doe"; - - [ObservableProperty] - private SignatureStyle _style = SignatureStyle.CursiveElegance; - - [ObservableProperty] - private string _reason = "Document Approved and Verified"; - - [ObservableProperty] - private string _location = string.Empty; - - [ObservableProperty] - private int _targetPageNumber = 1; - - [ObservableProperty] - private double _x = 100; - - [ObservableProperty] - private double _y = 600; - - [ObservableProperty] - private double _width = 200; - - [ObservableProperty] - private double _height = 70; - - public override bool UsesWorkspaceShell => true; - - public SignPdfToolViewModel(IPdfDocumentOperationsService operationsService, PdfToolDefinition tool) - : base(operationsService, tool) - { - } - - protected override async Task ExecuteCoreAsync(IProgress progress, CancellationToken ct) - { - var options = new SignToolOptions - { - InputFilePath = PrimaryInputFile, - SignerName = SignerName, - Style = Style, - Reason = Reason, - Location = string.IsNullOrWhiteSpace(Location) ? null : Location, - TargetPageNumber = TargetPageNumber, - X = X, - Y = Y, - Width = Width, - Height = Height - }; - - return await OperationsService.ExecuteToolAsync(PdfToolId.SignPdf, options, progress, ct); - } -} diff --git a/src/PdfEditorApp/ViewModels/Tools/Security/UnlockPdfToolViewModel.cs b/src/PdfEditorApp/ViewModels/Tools/Security/UnlockPdfToolViewModel.cs deleted file mode 100644 index d741763..0000000 --- a/src/PdfEditorApp/ViewModels/Tools/Security/UnlockPdfToolViewModel.cs +++ /dev/null @@ -1,31 +0,0 @@ -using PdfEditorApp.ViewModels.Tools.Core; -using System; -using System.Threading; -using System.Threading.Tasks; -using CommunityToolkit.Mvvm.ComponentModel; -using PdfEditorApp.Models; -using PdfEditorApp.Services; - -namespace PdfEditorApp.ViewModels.Tools.Security; - -public partial class UnlockPdfToolViewModel : PdfToolViewModelBase -{ - [ObservableProperty] - private string _password = string.Empty; - - public override bool UsesWorkspaceShell => true; - - public UnlockPdfToolViewModel(IPdfDocumentOperationsService operationsService, PdfToolDefinition tool) - : base(operationsService, tool) - { - } - - protected override async Task ExecuteCoreAsync(IProgress progress, CancellationToken ct) - { - return await ExecuteBatchAsync(file => new UnlockToolOptions - { - InputFilePath = file, - Password = Password - }, progress, ct); - } -} diff --git a/src/PdfEditorApp/ViewModels/Tools/Security/WatermarkToolViewModel.cs b/src/PdfEditorApp/ViewModels/Tools/Security/WatermarkToolViewModel.cs deleted file mode 100644 index 359cbf9..0000000 --- a/src/PdfEditorApp/ViewModels/Tools/Security/WatermarkToolViewModel.cs +++ /dev/null @@ -1,59 +0,0 @@ -using PdfEditorApp.ViewModels.Tools.Core; -using System; -using System.Threading; -using System.Threading.Tasks; -using CommunityToolkit.Mvvm.ComponentModel; -using PdfEditorApp.Models; -using PdfEditorApp.Services; - -namespace PdfEditorApp.ViewModels.Tools.Security; - -public partial class WatermarkToolViewModel : PdfToolViewModelBase -{ - [ObservableProperty] - private string _watermarkText = "CONFIDENTIAL"; - - [ObservableProperty] - private double _opacity = 0.35; - - [ObservableProperty] - private double _rotationAngle = -45; - - [ObservableProperty] - private WatermarkPosition _position = WatermarkPosition.Center; - - [ObservableProperty] - private string _colorHex = "#EF4444"; - - [ObservableProperty] - private double _fontSize = 48; - - [ObservableProperty] - private PageTargetSelection _targetPages = PageTargetSelection.AllPages; - - [ObservableProperty] - private string _customRange = string.Empty; - - public override bool UsesWorkspaceShell => true; - - public WatermarkToolViewModel(IPdfDocumentOperationsService operationsService, PdfToolDefinition tool) - : base(operationsService, tool) - { - } - - protected override async Task ExecuteCoreAsync(IProgress progress, CancellationToken ct) - { - return await ExecuteBatchAsync(file => new WatermarkToolOptions - { - InputFilePath = file, - Text = WatermarkText, - Opacity = Opacity, - RotationAngle = RotationAngle, - Position = Position, - ColorHex = ColorHex, - FontSize = FontSize, - TargetPages = TargetPages, - CustomRange = CustomRange - }, progress, ct); - } -} diff --git a/src/PdfEditorApp/ViewModels/ViewModelBase.cs b/src/PdfEditorApp/ViewModels/ViewModelBase.cs deleted file mode 100644 index 0d2dc3b..0000000 --- a/src/PdfEditorApp/ViewModels/ViewModelBase.cs +++ /dev/null @@ -1,7 +0,0 @@ -using CommunityToolkit.Mvvm.ComponentModel; - -namespace PdfEditorApp.ViewModels; - -public abstract class ViewModelBase : ObservableObject -{ -} diff --git a/src/PdfEditorApp/ViewModels/WorkflowBuilderViewModel.cs b/src/PdfEditorApp/ViewModels/WorkflowBuilderViewModel.cs deleted file mode 100644 index 928240c..0000000 --- a/src/PdfEditorApp/ViewModels/WorkflowBuilderViewModel.cs +++ /dev/null @@ -1,296 +0,0 @@ -using PdfEditorApp.Services.Tools.Core; -using PdfEditorApp.ViewModels.Tools.Core; -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.IO; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using Avalonia.Platform.Storage; -using CommunityToolkit.Mvvm.ComponentModel; -using CommunityToolkit.Mvvm.Input; -using PdfEditorApp.Models; -using PdfEditorApp.Services.Tools; - -namespace PdfEditorApp.ViewModels; - -public partial class WorkflowBuilderViewModel : ViewModelBase -{ - private readonly IPdfWorkflowEngine _workflowEngine; - private readonly IPdfToolRegistry _toolRegistry; - private CancellationTokenSource? _cts; - - public IStorageProvider? StorageProvider { get; set; } - - [ObservableProperty] - private bool _isOpen; - - [ObservableProperty] - private WorkflowDefinition _currentWorkflow = new(); - - [ObservableProperty] - private WorkflowStepDefinition? _selectedStep; - - [ObservableProperty] - private bool _isRunning; - - [ObservableProperty] - private double _progressPercentage; - - [ObservableProperty] - private string _statusMessage = "Ready"; - - [ObservableProperty] - private bool _hasError; - - [ObservableProperty] - private string _errorMessage = string.Empty; - - [ObservableProperty] - private bool _isComplete; - - [ObservableProperty] - private string _resultSummary = string.Empty; - - public ObservableCollection InputFiles { get; } = new(); - public ObservableCollection Steps { get; } = new(); - public ObservableCollection AvailableTools { get; } = new(); - public ObservableCollection PresetWorkflows { get; } = new(); - - public WorkflowBuilderViewModel(IPdfWorkflowEngine workflowEngine, IPdfToolRegistry toolRegistry) - { - _workflowEngine = workflowEngine; - _toolRegistry = toolRegistry; - - // Populate available tool palette for workflow steps - foreach (var t in _toolRegistry.GetAllTools().Where(x => !x.IsWorkflowBanner)) - { - AvailableTools.Add(t); - } - - // Load Presets - foreach (var p in _workflowEngine.GetPresetWorkflows()) - { - PresetWorkflows.Add(p); - } - - LoadWorkflow(PresetWorkflows.FirstOrDefault() ?? new WorkflowDefinition()); - } - - public void Open() - { - IsOpen = true; - ResetState(); - } - - public void ResetState() - { - IsRunning = false; - IsComplete = false; - HasError = false; - ErrorMessage = string.Empty; - StatusMessage = "Ready"; - ProgressPercentage = 0; - ResultSummary = string.Empty; - } - - public void LoadWorkflow(WorkflowDefinition workflow) - { - CurrentWorkflow = workflow.Clone(); - Steps.Clear(); - foreach (var s in CurrentWorkflow.Steps) - { - Steps.Add(s); - } - SelectedStep = Steps.FirstOrDefault(); - ResetState(); - } - - [RelayCommand] - public void SelectPreset(WorkflowDefinition preset) - { - if (preset != null) - { - LoadWorkflow(preset); - } - } - - [RelayCommand] - public void AddStep(PdfToolDefinition tool) - { - if (tool == null) return; - var step = new WorkflowStepDefinition - { - Id = Guid.NewGuid().ToString("N"), - ToolId = tool.Id, - StepName = tool.Name, - StepDescription = tool.Description, - IsEnabled = true - }; - Steps.Add(step); - CurrentWorkflow.Steps.Add(step); - SelectedStep = step; - } - - [RelayCommand] - public void RemoveStep(WorkflowStepDefinition step) - { - if (step == null) return; - Steps.Remove(step); - CurrentWorkflow.Steps.Remove(step); - SelectedStep = Steps.FirstOrDefault(); - } - - [RelayCommand] - public void MoveStepUp(WorkflowStepDefinition step) - { - if (step == null) return; - int idx = Steps.IndexOf(step); - if (idx > 0) - { - Steps.Move(idx, idx - 1); - CurrentWorkflow.Steps.Clear(); - CurrentWorkflow.Steps.AddRange(Steps); - SelectedStep = step; - } - } - - [RelayCommand] - public void MoveStepDown(WorkflowStepDefinition step) - { - if (step == null) return; - int idx = Steps.IndexOf(step); - if (idx >= 0 && idx < Steps.Count - 1) - { - Steps.Move(idx, idx + 1); - CurrentWorkflow.Steps.Clear(); - CurrentWorkflow.Steps.AddRange(Steps); - SelectedStep = step; - } - } - - [RelayCommand] - public async Task AddInputFilesAsync() - { - if (StorageProvider == null) return; - - var files = await StorageProvider.OpenFilePickerAsync(new FilePickerOpenOptions - { - Title = "Select Input PDF Files for Pipeline", - AllowMultiple = true, - FileTypeFilter = new[] - { - new FilePickerFileType("PDF Documents (*.pdf)") - { - Patterns = new[] { "*.pdf" } - } - } - }); - - if (files != null && files.Count > 0) - { - foreach (var f in files) - { - string path = f.Path.LocalPath; - if (!InputFiles.Contains(path)) InputFiles.Add(path); - } - } - } - - [RelayCommand] - public void RemoveInputFile(string filePath) - { - InputFiles.Remove(filePath); - } - - [RelayCommand] - public void ClearInputFiles() - { - InputFiles.Clear(); - } - - [RelayCommand] - public async Task RunWorkflowAsync() - { - if (InputFiles.Count == 0) - { - HasError = true; - ErrorMessage = "Please add at least one input PDF file to process."; - return; - } - - if (Steps.Count == 0 || !Steps.Any(s => s.IsEnabled)) - { - HasError = true; - ErrorMessage = "Please add at least one enabled step to the pipeline."; - return; - } - - IsRunning = true; - IsComplete = false; - HasError = false; - ErrorMessage = string.Empty; - StatusMessage = "Starting pipeline..."; - ProgressPercentage = 0; - - _cts = new CancellationTokenSource(); - var progress = new Progress(p => - { - ProgressPercentage = p.OverallProgressPercentage; - StatusMessage = p.StatusMessage; - }); - - try - { - CurrentWorkflow.Steps = Steps.ToList(); - var result = await _workflowEngine.ExecuteWorkflowAsync(CurrentWorkflow, InputFiles, progress, _cts.Token); - - if (result.Success) - { - IsComplete = true; - ResultSummary = result.Message ?? "Workflow pipeline executed successfully."; - StatusMessage = "Workflow Complete!"; - ProgressPercentage = 100.0; - } - else - { - HasError = true; - ErrorMessage = result.ErrorMessage ?? "Workflow execution failed."; - StatusMessage = "Failed"; - } - } - catch (OperationCanceledException) - { - StatusMessage = "Workflow cancelled."; - } - catch (Exception ex) - { - HasError = true; - ErrorMessage = $"Execution error: {ex.Message}"; - StatusMessage = "Error"; - } - finally - { - IsRunning = false; - _cts = null; - } - } - - [RelayCommand] - public void CancelWorkflow() - { - if (_cts != null && !_cts.IsCancellationRequested) - { - _cts.Cancel(); - StatusMessage = "Cancelling pipeline..."; - } - } - - [RelayCommand] - public void Close() - { - CancelWorkflow(); - IsOpen = false; - } -} diff --git a/src/PdfEditorApp/Views/AiAssistantSidebarView.axaml b/src/PdfEditorApp/Views/AiAssistantSidebarView.axaml deleted file mode 100644 index 62887b5..0000000 --- a/src/PdfEditorApp/Views/AiAssistantSidebarView.axaml +++ /dev/null @@ -1,641 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/AiAssistantSidebarView.axaml.cs b/src/PdfEditorApp/Views/AiAssistantSidebarView.axaml.cs deleted file mode 100644 index d8b3b93..0000000 --- a/src/PdfEditorApp/Views/AiAssistantSidebarView.axaml.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Avalonia.Controls; - -namespace PdfEditorApp.Views; - -public partial class AiAssistantSidebarView : UserControl -{ - public AiAssistantSidebarView() - { - InitializeComponent(); - } -} diff --git a/src/PdfEditorApp/Views/CanvasRulerControl.cs b/src/PdfEditorApp/Views/CanvasRulerControl.cs deleted file mode 100644 index d0028e7..0000000 --- a/src/PdfEditorApp/Views/CanvasRulerControl.cs +++ /dev/null @@ -1,236 +0,0 @@ -using System; -using System.Globalization; -using Avalonia; -using Avalonia.Controls; -using Avalonia.Layout; -using Avalonia.Media; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Models; - -namespace PdfEditorApp.Views; - -public class CanvasRulerControl : Control -{ - public static readonly StyledProperty OrientationProperty = - AvaloniaProperty.Register(nameof(Orientation), Orientation.Horizontal); - - public static readonly StyledProperty UnitProperty = - AvaloniaProperty.Register(nameof(Unit), RulerUnit.Points); - - public static readonly StyledProperty ZoomLevelProperty = - AvaloniaProperty.Register(nameof(ZoomLevel), 1.0); - - public static readonly StyledProperty CursorPositionProperty = - AvaloniaProperty.Register(nameof(CursorPosition), -1); - - public static readonly StyledProperty PageOffsetProperty = - AvaloniaProperty.Register(nameof(PageOffset), 0.0); - - public static readonly StyledProperty PageDimensionProperty = - AvaloniaProperty.Register(nameof(PageDimension), 800.0); - - public Orientation Orientation - { - get => GetValue(OrientationProperty); - set => SetValue(OrientationProperty, value); - } - - public RulerUnit Unit - { - get => GetValue(UnitProperty); - set => SetValue(UnitProperty, value); - } - - public double ZoomLevel - { - get => GetValue(ZoomLevelProperty); - set => SetValue(ZoomLevelProperty, value); - } - - public double CursorPosition - { - get => GetValue(CursorPositionProperty); - set => SetValue(CursorPositionProperty, value); - } - - public double PageOffset - { - get => GetValue(PageOffsetProperty); - set => SetValue(PageOffsetProperty, value); - } - - public double PageDimension - { - get => GetValue(PageDimensionProperty); - set => SetValue(PageDimensionProperty, value); - } - - // Default Fallback Resources - private static readonly IBrush s_defBgBrush = new SolidColorBrush(Color.Parse("#F8FAFC")); - private static readonly IPen s_defBorderPen = new Pen(new SolidColorBrush(Color.Parse("#E2E8F0")), 1); - private static readonly IPen s_defTickPen = new Pen(new SolidColorBrush(Color.Parse("#94A3B8")), 1); - private static readonly IPen s_defMajorTickPen = new Pen(new SolidColorBrush(Color.Parse("#64748B")), 1); - private static readonly IPen s_defPageBorderPen = new Pen(new SolidColorBrush(Color.Parse("#CBD5E1")), 1.5); - private static readonly IPen s_cursorPen = new Pen(new SolidColorBrush(Color.Parse("#0F6CBD")), 1.5); - private static readonly IBrush s_defPageShadeBrush = new SolidColorBrush(Color.Parse("#FFFFFF")); - private static readonly IBrush s_defLabelBrush = new SolidColorBrush(Color.Parse("#64748B")); - private static readonly Typeface s_typeface = new("Segoe UI, -apple-system, sans-serif"); - - static CanvasRulerControl() - { - AffectsRender( - OrientationProperty, - UnitProperty, - ZoomLevelProperty, - CursorPositionProperty, - PageOffsetProperty, - PageDimensionProperty); - } - - public override void Render(DrawingContext context) - { - base.Render(context); - - var bounds = Bounds; - if (bounds.Width <= 0 || bounds.Height <= 0) return; - - bool isHorizontal = Orientation == Orientation.Horizontal; - - // Resolve Dynamic Theme Brushes - var bgBrush = (this.TryFindResource("WinInputBgBrush", out var bgObj) && bgObj is IBrush b1) ? b1 : s_defBgBrush; - var borderBrush = (this.TryFindResource("WinBorderBrush", out var bdrObj) && bdrObj is IBrush b2) ? b2 : s_defBorderPen.Brush; - var borderPen = new Pen(borderBrush, 1); - var tickBrush = (this.TryFindResource("WinSubtleBrush", out var tObj) && tObj is IBrush b3) ? b3 : s_defTickPen.Brush; - var tickPen = new Pen(tickBrush, 1); - var majorTickBrush = (this.TryFindResource("WinMutedBrush", out var mtObj) && mtObj is IBrush b4) ? b4 : s_defMajorTickPen.Brush; - var majorTickPen = new Pen(majorTickBrush, 1); - var pageShadeBrush = (this.TryFindResource("WinPanelBrush", out var psObj) && psObj is IBrush b5) ? b5 : s_defPageShadeBrush; - var labelBrush = majorTickBrush ?? s_defLabelBrush; - - // Draw ruler background - context.FillRectangle(bgBrush, new Rect(0, 0, bounds.Width, bounds.Height)); - - if (isHorizontal) - { - // Bottom edge border - context.DrawLine(borderPen, new Point(0, bounds.Height), new Point(bounds.Width, bounds.Height)); - - double zoom = Math.Max(0.1, ZoomLevel); - double stepPts = Unit == RulerUnit.Inches ? 72.0 : (Unit == RulerUnit.Millimeters ? 72.0 / 2.54 : 50.0); - double minorStepPts = stepPts / 5.0; - - double startX = PageOffset; - double endX = startX + (PageDimension * zoom); - - // Draw page range shade - context.FillRectangle(pageShadeBrush, new Rect(Math.Max(0, startX), 0, Math.Max(0, endX - Math.Max(0, startX)), bounds.Height)); - context.DrawLine(borderPen, new Point(startX, 0), new Point(startX, bounds.Height)); - context.DrawLine(borderPen, new Point(endX, 0), new Point(endX, bounds.Height)); - - // Draw ticks across canvas - double maxPts = PageDimension + 200; - for (double pt = 0; pt <= maxPts; pt += minorStepPts) - { - double x = startX + (pt * zoom); - if (x < 0 || x > bounds.Width) continue; - - bool isMajor = Math.Abs(pt % stepPts) < 0.01; - double tickH = isMajor ? bounds.Height * 0.55 : bounds.Height * 0.25; - - context.DrawLine(isMajor ? majorTickPen : tickPen, new Point(x, bounds.Height - tickH), new Point(x, bounds.Height)); - - if (isMajor) - { - string label = Unit switch - { - RulerUnit.Inches => $"{pt / 72.0:0}\"", - RulerUnit.Millimeters => $"{pt * 25.4 / 72.0:0}", - _ => $"{pt:0}" - }; - - var formattedText = new FormattedText( - label, - CultureInfo.InvariantCulture, - FlowDirection.LeftToRight, - s_typeface, - 8.5, - labelBrush - ); - - context.DrawText(formattedText, new Point(x + 2, 2)); - } - } - - // Draw cursor tracker - if (CursorPosition >= 0) - { - double cursorX = startX + (CursorPosition * zoom); - if (cursorX >= 0 && cursorX <= bounds.Width) - { - context.DrawLine(s_cursorPen, new Point(cursorX, 0), new Point(cursorX, bounds.Height)); - } - } - } - else - { - // Right edge border - context.DrawLine(borderPen, new Point(bounds.Width, 0), new Point(bounds.Width, bounds.Height)); - - double zoom = Math.Max(0.1, ZoomLevel); - double stepPts = Unit == RulerUnit.Inches ? 72.0 : (Unit == RulerUnit.Millimeters ? 72.0 / 2.54 : 50.0); - double minorStepPts = stepPts / 5.0; - - double startY = PageOffset; - double endY = startY + (PageDimension * zoom); - - // Draw page range shade - context.FillRectangle(pageShadeBrush, new Rect(0, Math.Max(0, startY), bounds.Width, Math.Max(0, endY - Math.Max(0, startY)))); - context.DrawLine(borderPen, new Point(0, startY), new Point(bounds.Width, startY)); - context.DrawLine(borderPen, new Point(0, endY), new Point(bounds.Width, endY)); - - // Draw ticks across canvas - double maxPts = PageDimension + 200; - for (double pt = 0; pt <= maxPts; pt += minorStepPts) - { - double y = startY + (pt * zoom); - if (y < 0 || y > bounds.Height) continue; - - bool isMajor = Math.Abs(pt % stepPts) < 0.01; - double tickW = isMajor ? bounds.Width * 0.55 : bounds.Width * 0.25; - - context.DrawLine(isMajor ? majorTickPen : tickPen, new Point(bounds.Width - tickW, y), new Point(bounds.Width, y)); - - if (isMajor) - { - string label = Unit switch - { - RulerUnit.Inches => $"{pt / 72.0:0}\"", - RulerUnit.Millimeters => $"{pt * 25.4 / 72.0:0}", - _ => $"{pt:0}" - }; - - var formattedText = new FormattedText( - label, - CultureInfo.InvariantCulture, - FlowDirection.LeftToRight, - s_typeface, - 8.0, - labelBrush - ); - - context.DrawText(formattedText, new Point(2, y + 2)); - } - } - - // Draw cursor tracker - if (CursorPosition >= 0) - { - double cursorY = startY + (CursorPosition * zoom); - if (cursorY >= 0 && cursorY <= bounds.Height) - { - context.DrawLine(s_cursorPen, new Point(0, cursorY), new Point(bounds.Width, cursorY)); - } - } - } - } -} diff --git a/src/PdfEditorApp/Views/CanvasTextHudView.axaml b/src/PdfEditorApp/Views/CanvasTextHudView.axaml deleted file mode 100644 index 6f2b027..0000000 --- a/src/PdfEditorApp/Views/CanvasTextHudView.axaml +++ /dev/null @@ -1,226 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/CanvasTextHudView.axaml.cs b/src/PdfEditorApp/Views/CanvasTextHudView.axaml.cs deleted file mode 100644 index 668bc29..0000000 --- a/src/PdfEditorApp/Views/CanvasTextHudView.axaml.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Avalonia.Controls; -using Avalonia.Input; -using Avalonia.Interactivity; - -namespace PdfEditorApp.Views; - -public partial class CanvasTextHudView : UserControl -{ - public CanvasTextHudView() - { - InitializeComponent(); - } -} diff --git a/src/PdfEditorApp/Views/Controls/AdvancedTextControl.cs b/src/PdfEditorApp/Views/Controls/AdvancedTextControl.cs deleted file mode 100644 index 60c3771..0000000 --- a/src/PdfEditorApp/Views/Controls/AdvancedTextControl.cs +++ /dev/null @@ -1,692 +0,0 @@ -using System; -using System.Globalization; -using Avalonia; -using Avalonia.Controls; -using Avalonia.Media; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; -using PdfEditorApp.Models; -using PdfEditorApp.Services; -using PdfEditorApp.Services.Typography; - -namespace PdfEditorApp.Views.Controls; - -public class AdvancedTextControl : Control -{ - public static readonly StyledProperty TextProperty = - AvaloniaProperty.Register(nameof(Text), defaultValue: "Enter text here"); - - public static readonly StyledProperty FontFamilyNameProperty = - AvaloniaProperty.Register(nameof(FontFamilyName), defaultValue: "Segoe UI"); - - public static readonly StyledProperty FontSizeProperty = - AvaloniaProperty.Register(nameof(FontSize), defaultValue: 14.0); - - public static readonly StyledProperty IsBoldProperty = - AvaloniaProperty.Register(nameof(IsBold), defaultValue: false); - - public static readonly StyledProperty IsItalicProperty = - AvaloniaProperty.Register(nameof(IsItalic), defaultValue: false); - - public static readonly StyledProperty IsUnderlineProperty = - AvaloniaProperty.Register(nameof(IsUnderline), defaultValue: false); - - public static readonly StyledProperty IsDoubleUnderlineProperty = - AvaloniaProperty.Register(nameof(IsDoubleUnderline), defaultValue: false); - - public static readonly StyledProperty IsStrikethroughProperty = - AvaloniaProperty.Register(nameof(IsStrikethrough), defaultValue: false); - - public static readonly StyledProperty TextBrushProperty = - AvaloniaProperty.Register(nameof(TextBrush), defaultValue: Brushes.Black); - - public static readonly StyledProperty TextOpacityProperty = - AvaloniaProperty.Register(nameof(TextOpacity), defaultValue: 1.0); - - public static readonly StyledProperty AlignmentProperty = - AvaloniaProperty.Register(nameof(Alignment), defaultValue: TextAlignmentMode.Left); - - public static readonly StyledProperty TextVerticalAlignmentProperty = - AvaloniaProperty.Register(nameof(TextVerticalAlignment), defaultValue: TextVerticalAlignment.Top); - - public static readonly StyledProperty LineHeightProperty = - AvaloniaProperty.Register(nameof(LineHeight), defaultValue: 1.4); - - public static readonly StyledProperty CharacterSpacingProperty = - AvaloniaProperty.Register(nameof(CharacterSpacing), defaultValue: 0.0); - - public static readonly StyledProperty WordSpacingProperty = - AvaloniaProperty.Register(nameof(WordSpacing), defaultValue: 0.0); - - public static readonly StyledProperty ParagraphSpacingProperty = - AvaloniaProperty.Register(nameof(ParagraphSpacing), defaultValue: 0.0); - - public static readonly StyledProperty TextWrapProperty = - AvaloniaProperty.Register(nameof(TextWrap), defaultValue: true); - - // Stroke / Outline - public static readonly StyledProperty HasStrokeProperty = - AvaloniaProperty.Register(nameof(HasStroke), defaultValue: false); - - public static readonly StyledProperty StrokeBrushProperty = - AvaloniaProperty.Register(nameof(StrokeBrush), defaultValue: Brushes.Black); - - public static readonly StyledProperty StrokeWidthProperty = - AvaloniaProperty.Register(nameof(StrokeWidth), defaultValue: 1.0); - - // Shadow & Glow - public static readonly StyledProperty HasShadowProperty = - AvaloniaProperty.Register(nameof(HasShadow), defaultValue: false); - - public static readonly StyledProperty ShadowBrushProperty = - AvaloniaProperty.Register(nameof(ShadowBrush), defaultValue: Brushes.DarkGray); - - public static readonly StyledProperty ShadowOffsetXProperty = - AvaloniaProperty.Register(nameof(ShadowOffsetX), defaultValue: 2.0); - - public static readonly StyledProperty ShadowOffsetYProperty = - AvaloniaProperty.Register(nameof(ShadowOffsetY), defaultValue: 2.0); - - public static readonly StyledProperty ShadowBlurRadiusProperty = - AvaloniaProperty.Register(nameof(ShadowBlurRadius), defaultValue: 4.0); - - public static readonly StyledProperty ShadowOpacityProperty = - AvaloniaProperty.Register(nameof(ShadowOpacity), defaultValue: 0.5); - - // Box Background, Border, Padding - public static readonly StyledProperty BackgroundBrushProperty = - AvaloniaProperty.Register(nameof(BackgroundBrush), defaultValue: Brushes.Transparent); - - public static readonly StyledProperty BorderBrushProperty = - AvaloniaProperty.Register(nameof(BorderBrush), defaultValue: Brushes.Transparent); - - public static readonly StyledProperty BorderThicknessProperty = - AvaloniaProperty.Register(nameof(BorderThickness), defaultValue: 0.0); - - public static readonly StyledProperty CornerRadiusProperty = - AvaloniaProperty.Register(nameof(CornerRadius), defaultValue: 0.0); - - public static readonly StyledProperty PaddingProperty = - AvaloniaProperty.Register(nameof(Padding), defaultValue: 0.0); - - // Shape / Curved / Circular Typography - public static readonly StyledProperty ShapeModeProperty = - AvaloniaProperty.Register(nameof(ShapeMode), defaultValue: TextShapeMode.Normal); - - public static readonly StyledProperty CurveRadiusProperty = - AvaloniaProperty.Register(nameof(CurveRadius), defaultValue: 120.0); - - public static readonly StyledProperty CurveArcAngleProperty = - AvaloniaProperty.Register(nameof(CurveArcAngle), defaultValue: 180.0); - - public static readonly StyledProperty CurveStartAngleProperty = - AvaloniaProperty.Register(nameof(CurveStartAngle), defaultValue: 0.0); - - public static readonly StyledProperty CurveClockwiseProperty = - AvaloniaProperty.Register(nameof(CurveClockwise), defaultValue: true); - - public static readonly StyledProperty CurveInvertProperty = - AvaloniaProperty.Register(nameof(CurveInvert), defaultValue: false); - - public static readonly StyledProperty CircularPlacementProperty = - AvaloniaProperty.Register(nameof(CircularPlacement), defaultValue: CircularTextPlacement.TopArc); - - // Transformations - public static readonly StyledProperty BaselineShiftProperty = - AvaloniaProperty.Register(nameof(BaselineShift), defaultValue: 0.0); - - public static readonly StyledProperty CharacterRotationProperty = - AvaloniaProperty.Register(nameof(CharacterRotation), defaultValue: 0.0); - - public static readonly StyledProperty ScaleXProperty = - AvaloniaProperty.Register(nameof(ScaleX), defaultValue: 1.0); - - public static readonly StyledProperty ScaleYProperty = - AvaloniaProperty.Register(nameof(ScaleY), defaultValue: 1.0); - - public static readonly StyledProperty FlipXProperty = - AvaloniaProperty.Register(nameof(FlipX), defaultValue: false); - - public static readonly StyledProperty FlipYProperty = - AvaloniaProperty.Register(nameof(FlipY), defaultValue: false); - - // Bézier Curve Typography - public static readonly StyledProperty BezierPresetProperty = - AvaloniaProperty.Register(nameof(BezierPreset), defaultValue: BezierCurvePreset.Wave); - - public static readonly StyledProperty BezierP0XProperty = - AvaloniaProperty.Register(nameof(BezierP0X), defaultValue: 0.0); - - public static readonly StyledProperty BezierP0YProperty = - AvaloniaProperty.Register(nameof(BezierP0Y), defaultValue: 0.5); - - public static readonly StyledProperty BezierP1XProperty = - AvaloniaProperty.Register(nameof(BezierP1X), defaultValue: 0.33); - - public static readonly StyledProperty BezierP1YProperty = - AvaloniaProperty.Register(nameof(BezierP1Y), defaultValue: 0.10); - - public static readonly StyledProperty BezierP2XProperty = - AvaloniaProperty.Register(nameof(BezierP2X), defaultValue: 0.67); - - public static readonly StyledProperty BezierP2YProperty = - AvaloniaProperty.Register(nameof(BezierP2Y), defaultValue: 0.90); - - public static readonly StyledProperty BezierP3XProperty = - AvaloniaProperty.Register(nameof(BezierP3X), defaultValue: 1.0); - - public static readonly StyledProperty BezierP3YProperty = - AvaloniaProperty.Register(nameof(BezierP3Y), defaultValue: 0.5); - - public static readonly StyledProperty?> SpansProperty = - AvaloniaProperty.Register?>(nameof(Spans), defaultValue: null); - - static AdvancedTextControl() - { - AffectsRender( - TextProperty, SpansProperty, FontFamilyNameProperty, FontSizeProperty, IsBoldProperty, IsItalicProperty, - IsUnderlineProperty, IsDoubleUnderlineProperty, IsStrikethroughProperty, TextBrushProperty, - TextOpacityProperty, AlignmentProperty, TextVerticalAlignmentProperty, LineHeightProperty, - CharacterSpacingProperty, WordSpacingProperty, ParagraphSpacingProperty, TextWrapProperty, - HasStrokeProperty, StrokeBrushProperty, StrokeWidthProperty, HasShadowProperty, - ShadowBrushProperty, ShadowOffsetXProperty, ShadowOffsetYProperty, ShadowBlurRadiusProperty, - ShadowOpacityProperty, BackgroundBrushProperty, BorderBrushProperty, BorderThicknessProperty, - CornerRadiusProperty, PaddingProperty, ShapeModeProperty, CurveRadiusProperty, - CurveArcAngleProperty, CurveStartAngleProperty, CurveClockwiseProperty, CurveInvertProperty, - CircularPlacementProperty, BaselineShiftProperty, CharacterRotationProperty, ScaleXProperty, - ScaleYProperty, FlipXProperty, FlipYProperty, - BezierPresetProperty, BezierP0XProperty, BezierP0YProperty, BezierP1XProperty, BezierP1YProperty, - BezierP2XProperty, BezierP2YProperty, BezierP3XProperty, BezierP3YProperty - ); - } - - #region Properties Accessors - public System.Collections.Generic.IReadOnlyList? Spans { get => GetValue(SpansProperty); set => SetValue(SpansProperty, value); } - public string Text { get => GetValue(TextProperty); set => SetValue(TextProperty, value); } - public string FontFamilyName { get => GetValue(FontFamilyNameProperty); set => SetValue(FontFamilyNameProperty, value); } - public double FontSize { get => GetValue(FontSizeProperty); set => SetValue(FontSizeProperty, value); } - public bool IsBold { get => GetValue(IsBoldProperty); set => SetValue(IsBoldProperty, value); } - public bool IsItalic { get => GetValue(IsItalicProperty); set => SetValue(IsItalicProperty, value); } - public bool IsUnderline { get => GetValue(IsUnderlineProperty); set => SetValue(IsUnderlineProperty, value); } - public bool IsDoubleUnderline { get => GetValue(IsDoubleUnderlineProperty); set => SetValue(IsDoubleUnderlineProperty, value); } - public bool IsStrikethrough { get => GetValue(IsStrikethroughProperty); set => SetValue(IsStrikethroughProperty, value); } - public IBrush? TextBrush { get => GetValue(TextBrushProperty); set => SetValue(TextBrushProperty, value); } - public double TextOpacity { get => GetValue(TextOpacityProperty); set => SetValue(TextOpacityProperty, value); } - public TextAlignmentMode Alignment { get => GetValue(AlignmentProperty); set => SetValue(AlignmentProperty, value); } - public TextVerticalAlignment TextVerticalAlignment { get => GetValue(TextVerticalAlignmentProperty); set => SetValue(TextVerticalAlignmentProperty, value); } - public double LineHeight { get => GetValue(LineHeightProperty); set => SetValue(LineHeightProperty, value); } - public double CharacterSpacing { get => GetValue(CharacterSpacingProperty); set => SetValue(CharacterSpacingProperty, value); } - public double WordSpacing { get => GetValue(WordSpacingProperty); set => SetValue(WordSpacingProperty, value); } - public double ParagraphSpacing { get => GetValue(ParagraphSpacingProperty); set => SetValue(ParagraphSpacingProperty, value); } - public bool TextWrap { get => GetValue(TextWrapProperty); set => SetValue(TextWrapProperty, value); } - - public bool HasStroke { get => GetValue(HasStrokeProperty); set => SetValue(HasStrokeProperty, value); } - public IBrush? StrokeBrush { get => GetValue(StrokeBrushProperty); set => SetValue(StrokeBrushProperty, value); } - public double StrokeWidth { get => GetValue(StrokeWidthProperty); set => SetValue(StrokeWidthProperty, value); } - - public bool HasShadow { get => GetValue(HasShadowProperty); set => SetValue(HasShadowProperty, value); } - public IBrush? ShadowBrush { get => GetValue(ShadowBrushProperty); set => SetValue(ShadowBrushProperty, value); } - public double ShadowOffsetX { get => GetValue(ShadowOffsetXProperty); set => SetValue(ShadowOffsetXProperty, value); } - public double ShadowOffsetY { get => GetValue(ShadowOffsetYProperty); set => SetValue(ShadowOffsetYProperty, value); } - public double ShadowBlurRadius { get => GetValue(ShadowBlurRadiusProperty); set => SetValue(ShadowBlurRadiusProperty, value); } - public double ShadowOpacity { get => GetValue(ShadowOpacityProperty); set => SetValue(ShadowOpacityProperty, value); } - - public IBrush? BackgroundBrush { get => GetValue(BackgroundBrushProperty); set => SetValue(BackgroundBrushProperty, value); } - public IBrush? BorderBrush { get => GetValue(BorderBrushProperty); set => SetValue(BorderBrushProperty, value); } - public double BorderThickness { get => GetValue(BorderThicknessProperty); set => SetValue(BorderThicknessProperty, value); } - public double CornerRadius { get => GetValue(CornerRadiusProperty); set => SetValue(CornerRadiusProperty, value); } - public double Padding { get => GetValue(PaddingProperty); set => SetValue(PaddingProperty, value); } - - public TextShapeMode ShapeMode { get => GetValue(ShapeModeProperty); set => SetValue(ShapeModeProperty, value); } - public double CurveRadius { get => GetValue(CurveRadiusProperty); set => SetValue(CurveRadiusProperty, value); } - public double CurveArcAngle { get => GetValue(CurveArcAngleProperty); set => SetValue(CurveArcAngleProperty, value); } - public double CurveStartAngle { get => GetValue(CurveStartAngleProperty); set => SetValue(CurveStartAngleProperty, value); } - public bool CurveClockwise { get => GetValue(CurveClockwiseProperty); set => SetValue(CurveClockwiseProperty, value); } - public bool CurveInvert { get => GetValue(CurveInvertProperty); set => SetValue(CurveInvertProperty, value); } - public CircularTextPlacement CircularPlacement { get => GetValue(CircularPlacementProperty); set => SetValue(CircularPlacementProperty, value); } - - public double BaselineShift { get => GetValue(BaselineShiftProperty); set => SetValue(BaselineShiftProperty, value); } - public double CharacterRotation { get => GetValue(CharacterRotationProperty); set => SetValue(CharacterRotationProperty, value); } - public double ScaleX { get => GetValue(ScaleXProperty); set => SetValue(ScaleXProperty, value); } - public double ScaleY { get => GetValue(ScaleYProperty); set => SetValue(ScaleYProperty, value); } - public bool FlipX { get => GetValue(FlipXProperty); set => SetValue(FlipXProperty, value); } - public bool FlipY { get => GetValue(FlipYProperty); set => SetValue(FlipYProperty, value); } - - public BezierCurvePreset BezierPreset { get => GetValue(BezierPresetProperty); set => SetValue(BezierPresetProperty, value); } - public double BezierP0X { get => GetValue(BezierP0XProperty); set => SetValue(BezierP0XProperty, value); } - public double BezierP0Y { get => GetValue(BezierP0YProperty); set => SetValue(BezierP0YProperty, value); } - public double BezierP1X { get => GetValue(BezierP1XProperty); set => SetValue(BezierP1XProperty, value); } - public double BezierP1Y { get => GetValue(BezierP1YProperty); set => SetValue(BezierP1YProperty, value); } - public double BezierP2X { get => GetValue(BezierP2XProperty); set => SetValue(BezierP2XProperty, value); } - public double BezierP2Y { get => GetValue(BezierP2YProperty); set => SetValue(BezierP2YProperty, value); } - public double BezierP3X { get => GetValue(BezierP3XProperty); set => SetValue(BezierP3XProperty, value); } - public double BezierP3Y { get => GetValue(BezierP3YProperty); set => SetValue(BezierP3YProperty, value); } - #endregion - - public override void Render(DrawingContext context) - { - base.Render(context); - - double w = Bounds.Width; - double h = Bounds.Height; - if (w <= 0 || h <= 0) return; - - // Apply Opacity - using var opacityScope = TextOpacity < 0.99 ? context.PushOpacity(TextOpacity) : default; - - // Draw Background and Border - if (BackgroundBrush != null || (BorderBrush != null && BorderThickness > 0)) - { - var bgPen = (BorderBrush != null && BorderThickness > 0) ? new Pen(BorderBrush, BorderThickness) : null; - var rect = new RoundedRect(new Rect(0, 0, w, h), CornerRadius); - context.DrawRectangle(BackgroundBrush, bgPen, rect); - } - - // Apply Scaling & Flipping Matrix around center - bool hasCustomTransform = FlipX || FlipY || Math.Abs(ScaleX - 1.0) > 0.001 || Math.Abs(ScaleY - 1.0) > 0.001; - IDisposable? transformScope = null; - if (hasCustomTransform) - { - double sx = (FlipX ? -1.0 : 1.0) * (ScaleX != 0 ? ScaleX : 1.0); - double sy = (FlipY ? -1.0 : 1.0) * (ScaleY != 0 ? ScaleY : 1.0); - var center = new Point(w / 2.0, h / 2.0); - var transform = Matrix.CreateTranslation(-center.X, -center.Y) * - Matrix.CreateScale(sx, sy) * - Matrix.CreateTranslation(center.X, center.Y); - transformScope = context.PushTransform(transform); - } - - try - { - var avaloniaFamily = FontHelper.CreateFontFamily(FontFamilyName); - var typeface = new Typeface( - avaloniaFamily, - IsItalic ? FontStyle.Italic : FontStyle.Normal, - IsBold ? FontWeight.Bold : FontWeight.Normal); - - var fillBrush = TextBrush ?? Brushes.Black; - Pen? strokePen = (HasStroke && StrokeWidth > 0 && StrokeBrush != null) ? new Pen(StrokeBrush, StrokeWidth) : null; - IBrush? shadowBrush = (HasShadow && ShadowBrush != null) ? ShadowBrush : null; - - if (ShapeMode == TextShapeMode.Normal) - { - RenderNormalText(context, typeface, fillBrush, strokePen, shadowBrush, w, h); - } - else if (ShapeMode == TextShapeMode.BezierCurve) - { - RenderBezierText(context, typeface, fillBrush, strokePen, shadowBrush, w, h); - } - else - { - RenderCurvedText(context, typeface, fillBrush, strokePen, shadowBrush, w, h); - } - } - finally - { - transformScope?.Dispose(); - } - } - - private void RenderNormalText( - DrawingContext context, - Typeface typeface, - IBrush fillBrush, - Pen? strokePen, - IBrush? shadowBrush, - double w, - double h) - { - var layout = TextLayoutEngine.CalculateNormalLayout( - Text, - FontFamilyName, - FontSize, - IsBold, - IsItalic, - w, - LineHeight, - CharacterSpacing, - WordSpacing, - ParagraphSpacing, - Alignment, - TextVerticalAlignment, - h, - TextWrap, - Padding - ); - - int docIndex = 0; - string docText = Text ?? ""; - - foreach (var line in layout.Lines) - { - if (string.IsNullOrEmpty(line.Text)) - { - docIndex++; - continue; - } - - int lineOffset = docText.IndexOf(line.Text, Math.Min(docIndex, docText.Length), StringComparison.Ordinal); - if (lineOffset < 0) lineOffset = docIndex; - docIndex = lineOffset + line.Text.Length; - - // Draw Shadow - if (HasShadow && shadowBrush != null) - { - using (context.PushOpacity(ShadowOpacity)) - { - var shadowFt = new FormattedText( - line.Text, - CultureInfo.CurrentCulture, - FlowDirection.LeftToRight, - typeface, - FontSize, - shadowBrush); - ApplySpanTypography(shadowFt, line.Text, shadowBrush, lineOffset); - context.DrawText(shadowFt, new Point(line.X + ShadowOffsetX, line.Y + ShadowOffsetY)); - } - } - - var ft = new FormattedText( - line.Text, - CultureInfo.CurrentCulture, - FlowDirection.LeftToRight, - typeface, - FontSize, - fillBrush); - ApplySpanTypography(ft, line.Text, null, lineOffset); - - // Draw Stroke Outline - if (strokePen != null) - { - var geom = ft.BuildGeometry(new Point(line.X, line.Y)); - if (geom != null) - { - context.DrawGeometry(null, strokePen, geom); - } - } - - // Draw Fill Text - context.DrawText(ft, new Point(line.X, line.Y)); - - // Double Underline - if (IsDoubleUnderline) - { - double uY1 = line.BaselineY + 2; - double uY2 = line.BaselineY + 5; - var uPen = new Pen(fillBrush, 1.0); - context.DrawLine(uPen, new Point(line.X, uY1), new Point(line.X + line.Width, uY1)); - context.DrawLine(uPen, new Point(line.X, uY2), new Point(line.X + line.Width, uY2)); - } - } - } - - private void ApplySpanTypography(FormattedText ft, string lineText, IBrush? forceBrush, int lineOffset) - { - if (Spans == null || Spans.Count == 0 || string.IsNullOrEmpty(lineText)) return; - - int spanStartInDoc = 0; - int lineEndInDoc = lineOffset + lineText.Length; - - foreach (var span in Spans) - { - if (string.IsNullOrEmpty(span.Text)) continue; - int spanLength = span.Text.Length; - int spanEndInDoc = spanStartInDoc + spanLength; - - int overlapStartInDoc = Math.Max(spanStartInDoc, lineOffset); - int overlapEndInDoc = Math.Min(spanEndInDoc, lineEndInDoc); - - if (overlapEndInDoc > overlapStartInDoc) - { - int localIndex = overlapStartInDoc - lineOffset; - int localLength = overlapEndInDoc - overlapStartInDoc; - - // 1. Font family, weight, italic - bool spanBold = span.IsBold ?? IsBold; - bool spanItalic = span.IsItalic ?? IsItalic; - string spanFamily = span.FontFamily ?? FontFamilyName; - - if (spanBold != IsBold || spanItalic != IsItalic || spanFamily != FontFamilyName) - { - if (spanFamily != FontFamilyName) - { - ft.SetFontFamily(FontHelper.CreateFontFamily(spanFamily), localIndex, localLength); - } - if (spanBold != IsBold) - { - ft.SetFontWeight(spanBold ? FontWeight.Bold : FontWeight.Normal, localIndex, localLength); - } - if (spanItalic != IsItalic) - { - ft.SetFontStyle(spanItalic ? FontStyle.Italic : FontStyle.Normal, localIndex, localLength); - } - } - - // 2. Font size / script scaling - double spanSize = span.FontSize ?? FontSize; - if (span.Script == TextScriptMode.Superscript || span.Script == TextScriptMode.Subscript) - { - spanSize = Math.Max(6, spanSize * 0.75); - } - - if (Math.Abs(spanSize - FontSize) > 0.01) - { - ft.SetFontSize(spanSize, localIndex, localLength); - } - - // 3. Foreground Brush (if not overriding with shadow brush) - if (forceBrush == null && !string.IsNullOrEmpty(span.TextColorHex)) - { - if (Color.TryParse(span.TextColorHex, out var col)) - { - ft.SetForegroundBrush(new SolidColorBrush(col), localIndex, localLength); - } - } - - // 4. Text decorations (underline / strikethrough) - bool spanUnderline = span.IsUnderline ?? IsUnderline; - bool spanStrikethrough = span.IsStrikethrough ?? IsStrikethrough; - if (spanUnderline || spanStrikethrough) - { - var decs = new TextDecorationCollection(); - if (spanUnderline) foreach (var d in Avalonia.Media.TextDecorations.Underline) decs.Add(d); - if (spanStrikethrough) foreach (var d in Avalonia.Media.TextDecorations.Strikethrough) decs.Add(d); - ft.SetTextDecorations(decs, localIndex, localLength); - } - } - - spanStartInDoc = spanEndInDoc; - } - } - - private void RenderCurvedText( - DrawingContext context, - Typeface typeface, - IBrush fillBrush, - Pen? strokePen, - IBrush? shadowBrush, - double w, - double h) - { - var curvedLayout = TextLayoutEngine.CalculateCurvedGlyphs( - Text, - FontFamilyName, - FontSize, - IsBold, - IsItalic, - w, - h, - CurveRadius, - CurveArcAngle, - CurveStartAngle, - CurveClockwise, - CurveInvert, - CharacterSpacing, - CircularPlacement, - ShapeMode, - BaselineShift - ); - - var decorations = new TextDecorationCollection(); - if (IsUnderline) foreach (var d in TextDecorations.Underline) decorations.Add(d); - if (IsStrikethrough) foreach (var d in TextDecorations.Strikethrough) decorations.Add(d); - - foreach (var g in curvedLayout.Glyphs) - { - if (char.IsWhiteSpace(g.Character)) continue; - - double angleDeg = g.TangentAngleDeg + CharacterRotation; - double angleRad = (angleDeg * Math.PI) / 180.0; - - // Rotate around glyph center - var glyphCenter = new Point(g.X, g.Y); - var transform = Matrix.CreateTranslation(-glyphCenter.X, -glyphCenter.Y) * - Matrix.CreateRotation(angleRad) * - Matrix.CreateTranslation(glyphCenter.X, glyphCenter.Y); - - using (context.PushTransform(transform)) - { - // Shadow - if (HasShadow && shadowBrush != null) - { - using (context.PushOpacity(ShadowOpacity)) - { - var sFt = new FormattedText( - g.Text, - CultureInfo.CurrentCulture, - FlowDirection.LeftToRight, - typeface, - FontSize, - shadowBrush); - context.DrawText(sFt, new Point(g.X - (g.Width / 2.0) + ShadowOffsetX, g.Y - g.BaselineOffset + ShadowOffsetY)); - } - } - - var ft = new FormattedText( - g.Text, - CultureInfo.CurrentCulture, - FlowDirection.LeftToRight, - typeface, - FontSize, - fillBrush); - - var origin = new Point(g.X - (g.Width / 2.0), g.Y - g.BaselineOffset); - - // Stroke Outline - if (strokePen != null) - { - var geom = ft.BuildGeometry(origin); - if (geom != null) - { - context.DrawGeometry(null, strokePen, geom); - } - } - - // Fill - context.DrawText(ft, origin); - } - } - } - - private void RenderBezierText( - DrawingContext context, - Typeface typeface, - IBrush fillBrush, - Pen? strokePen, - IBrush? shadowBrush, - double w, - double h) - { - var layout = TextLayoutEngine.CalculateBezierGlyphs( - Text, - FontFamilyName, - FontSize, - IsBold, - IsItalic, - w, - h, - new Point(BezierP0X, BezierP0Y), - new Point(BezierP1X, BezierP1Y), - new Point(BezierP2X, BezierP2Y), - new Point(BezierP3X, BezierP3Y), - CurveInvert, - CharacterSpacing, - BaselineShift - ); - - foreach (var g in layout.Glyphs) - { - if (string.IsNullOrEmpty(g.Text) || char.IsWhiteSpace(g.Character)) continue; - - double totalAngle = g.TangentAngleDeg + CharacterRotation; - double angleRad = (totalAngle * Math.PI) / 180.0; - - var transform = Matrix.CreateTranslation(-g.X, -g.Y) * - Matrix.CreateRotation(angleRad) * - Matrix.CreateTranslation(g.X, g.Y); - - using (context.PushTransform(transform)) - { - // Shadow - if (HasShadow && shadowBrush != null) - { - using (context.PushOpacity(ShadowOpacity)) - { - var sFt = new FormattedText( - g.Text, - CultureInfo.CurrentCulture, - FlowDirection.LeftToRight, - typeface, - FontSize, - shadowBrush); - context.DrawText(sFt, new Point(g.X - (g.Width / 2.0) + ShadowOffsetX, g.Y - g.BaselineOffset + ShadowOffsetY)); - } - } - - var ft = new FormattedText( - g.Text, - CultureInfo.CurrentCulture, - FlowDirection.LeftToRight, - typeface, - FontSize, - fillBrush); - - var origin = new Point(g.X - (g.Width / 2.0), g.Y - g.BaselineOffset); - - // Stroke Outline - if (strokePen != null) - { - var geom = ft.BuildGeometry(origin); - if (geom != null) - { - context.DrawGeometry(null, strokePen, geom); - } - } - - // Fill Text - context.DrawText(ft, origin); - - // Underline & Strikethrough along character local axis - if (IsUnderline || IsDoubleUnderline) - { - var uPen = new Pen(fillBrush, Math.Max(1.0, FontSize * 0.07)); - double uY = g.Y + (FontSize * 0.45); - context.DrawLine(uPen, new Point(g.X - (g.Width / 2.0), uY), new Point(g.X + (g.Width / 2.0), uY)); - - if (IsDoubleUnderline) - { - double uY2 = uY + Math.Max(2.0, FontSize * 0.12); - context.DrawLine(uPen, new Point(g.X - (g.Width / 2.0), uY2), new Point(g.X + (g.Width / 2.0), uY2)); - } - } - - if (IsStrikethrough) - { - var sPen = new Pen(fillBrush, Math.Max(1.0, FontSize * 0.07)); - double sY = g.Y; - context.DrawLine(sPen, new Point(g.X - (g.Width / 2.0), sY), new Point(g.X + (g.Width / 2.0), sY)); - } - } - } - } -} diff --git a/src/PdfEditorApp/Views/Controls/AskAiButton.cs b/src/PdfEditorApp/Views/Controls/AskAiButton.cs deleted file mode 100644 index 5287c98..0000000 --- a/src/PdfEditorApp/Views/Controls/AskAiButton.cs +++ /dev/null @@ -1,239 +0,0 @@ -using System; -using Avalonia; -using Avalonia.Controls; -using Avalonia.Input; -using Avalonia.Layout; -using Avalonia.Media; -using Avalonia.VisualTree; -using Material.Icons; -using Material.Icons.Avalonia; -using PdfEditorApp.ViewModels; - -namespace PdfEditorApp.Views.Controls; - -/// -/// Display variant style for the . -/// -public enum AskAiButtonVariant -{ - /// - /// Vibrant purple floating pill badge positioned above element selection borders. - /// - FloatingPill, - - /// - /// Soft lilac themed badge designed for properties inspectors and toolbars. - /// - Subtle -} - -/// -/// Reusable, context-aware "Ask AI" button control for FryPDF Studio. -/// Can be dropped anywhere in the canvas or sidebar UI via <controls:AskAiButton />. -/// Automatically resolves the target element from DataContext/CommandParameter and executes -/// . -/// -public class AskAiButton : Button -{ - public static readonly StyledProperty VariantProperty = - AvaloniaProperty.Register(nameof(Variant), AskAiButtonVariant.FloatingPill); - - public static readonly StyledProperty ButtonTextProperty = - AvaloniaProperty.Register(nameof(ButtonText), "Ask AI"); - - public static readonly StyledProperty ToolTipTextProperty = - AvaloniaProperty.Register(nameof(ToolTipText), "Ask AI to Modify (Ctrl+I / ⌘I)"); - - public AskAiButtonVariant Variant - { - get => GetValue(VariantProperty); - set => SetValue(VariantProperty, value); - } - - public string ButtonText - { - get => GetValue(ButtonTextProperty); - set => SetValue(ButtonTextProperty, value); - } - - public string ToolTipText - { - get => GetValue(ToolTipTextProperty); - set => SetValue(ToolTipTextProperty, value); - } - - protected override Type StyleKeyOverride => typeof(Button); - - private readonly MaterialIcon _icon; - private readonly TextBlock _textBlock; - - public AskAiButton() - { - try - { - Cursor = new Cursor(StandardCursorType.Hand); - } - catch - { - // Headless / mock test runner without platform cursor service - } - - _icon = new MaterialIcon - { - VerticalAlignment = VerticalAlignment.Center - }; - - try - { - _icon.Kind = MaterialIconKind.AutoFixHigh; - } - catch - { - // Headless unit test environment without Avalonia rendering interface - } - - _textBlock = new TextBlock - { - FontWeight = FontWeight.SemiBold, - VerticalAlignment = VerticalAlignment.Center - }; - - var stack = new StackPanel - { - Orientation = Orientation.Horizontal, - Spacing = 4, - VerticalAlignment = VerticalAlignment.Center, - Children = { _icon, _textBlock } - }; - - Content = stack; - - ApplyVariant(Variant); - UpdateTextAndToolTip(); - } - - static AskAiButton() - { - VariantProperty.Changed.AddClassHandler((btn, e) => - { - if (e.NewValue is AskAiButtonVariant v) btn.ApplyVariant(v); - }); - - ButtonTextProperty.Changed.AddClassHandler((btn, e) => - { - btn.UpdateTextAndToolTip(); - }); - - ToolTipTextProperty.Changed.AddClassHandler((btn, e) => - { - btn.UpdateTextAndToolTip(); - }); - } - - private void UpdateTextAndToolTip() - { - _textBlock.Text = ButtonText; - ToolTip.SetTip(this, ToolTipText); - } - - private void ApplyVariant(AskAiButtonVariant variant) - { - if (variant == AskAiButtonVariant.FloatingPill) - { - HorizontalAlignment = HorizontalAlignment.Right; - VerticalAlignment = VerticalAlignment.Top; - Margin = new Thickness(0, -24, 0, 0); - Height = 22; - Padding = new Thickness(6, 2); - Background = Brush.Parse("#7C3AED"); - BorderBrush = Brush.Parse("#6D28D9"); - BorderThickness = new Thickness(1); - CornerRadius = new CornerRadius(11); - - _icon.Width = 12; - _icon.Height = 12; - _icon.Foreground = Brushes.White; - - _textBlock.FontSize = 10; - _textBlock.Foreground = Brushes.White; - } - else // Subtle - { - HorizontalAlignment = HorizontalAlignment.Left; - VerticalAlignment = VerticalAlignment.Center; - Margin = new Thickness(0); - Height = 24; - Padding = new Thickness(6, 2); - Background = Brush.Parse("#EDE9FE"); - BorderBrush = Brush.Parse("#C4B5FD"); - BorderThickness = new Thickness(1); - CornerRadius = new CornerRadius(5); - - _icon.Width = 13; - _icon.Height = 13; - _icon.Foreground = Brush.Parse("#7C3AED"); - - _textBlock.FontSize = 10.5; - _textBlock.Foreground = Brush.Parse("#7C3AED"); - } - } - - protected override void OnPointerEntered(PointerEventArgs e) - { - base.OnPointerEntered(e); - if (Variant == AskAiButtonVariant.FloatingPill) - { - Background = Brush.Parse("#6D28D9"); - BorderBrush = Brush.Parse("#5B21B6"); - } - else - { - Background = Brush.Parse("#DDD6FE"); - BorderBrush = Brush.Parse("#A78BFA"); - } - } - - protected override void OnPointerExited(PointerEventArgs e) - { - base.OnPointerExited(e); - if (Variant == AskAiButtonVariant.FloatingPill) - { - Background = Brush.Parse("#7C3AED"); - BorderBrush = Brush.Parse("#6D28D9"); - } - else - { - Background = Brush.Parse("#EDE9FE"); - BorderBrush = Brush.Parse("#C4B5FD"); - } - } - - protected override void OnClick() - { - if (Command != null) - { - base.OnClick(); - return; - } - - // Automatic smart invocation: - // 1. Resolve target element (from CommandParameter, or from DataContext) - var targetParam = CommandParameter ?? DataContext; - - // 2. Discover MainViewModel in visual ancestor hierarchy - var mainVm = this.FindAncestorOfType()?.DataContext as MainViewModel - ?? this.FindAncestorOfType()?.DataContext as MainViewModel - ?? (TopLevel.GetTopLevel(this) as Window)?.DataContext as MainViewModel; - - if (mainVm != null) - { - if (mainVm.AskAiToModifyCommand.CanExecute(targetParam)) - { - mainVm.AskAiToModifyCommand.Execute(targetParam); - } - return; - } - - base.OnClick(); - } -} diff --git a/src/PdfEditorApp/Views/Controls/PdfTextOverlayControl.cs b/src/PdfEditorApp/Views/Controls/PdfTextOverlayControl.cs deleted file mode 100644 index 3ea719e..0000000 --- a/src/PdfEditorApp/Views/Controls/PdfTextOverlayControl.cs +++ /dev/null @@ -1,666 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using Avalonia; -using Avalonia.Controls; -using Avalonia.Input; -using Avalonia.Media; -using Avalonia.VisualTree; -using Material.Icons; -using Material.Icons.Avalonia; -using PdfEditorApp.ViewModels; - -namespace PdfEditorApp.Views.Controls; - -/// -/// High-performance, pixel-perfect text selection and highlight markup overlay for PDF Viewer pages. -/// Provides continuous mouse drag selection, multi-click word/line selection, I-beam hover cursor, -/// Acrobat-style vibrant visual selection highlights, permanent vector highlight annotations, -/// and rich right-click context menu actions (Copy, Citation, Highlight, Note, Search). -/// -public class PdfTextOverlayControl : Control -{ - public static readonly StyledProperty PageProperty = - AvaloniaProperty.Register(nameof(Page)); - - public static readonly StyledProperty ZoomLevelProperty = - AvaloniaProperty.Register(nameof(ZoomLevel), defaultValue: 1.0); - - public static readonly StyledProperty ViewerViewModelProperty = - AvaloniaProperty.Register(nameof(ViewerViewModel)); - - public PdfViewerPageItem? Page - { - get => GetValue(PageProperty); - set => SetValue(PageProperty, value); - } - - public double ZoomLevel - { - get => GetValue(ZoomLevelProperty); - set => SetValue(ZoomLevelProperty, value); - } - - public PdfViewerViewModel? ViewerViewModel - { - get => GetValue(ViewerViewModelProperty); - set => SetValue(ViewerViewModelProperty, value); - } - - // Interaction state - private bool _isPointerDown; - private Point _dragStartPoint; - private bool _hasMovedSinceDown; - private PdfViewerPageItem? _subscribedPage; - private bool _isAreaSelecting; - private Rect _currentMarqueeRect; - private Point? _lastAnchorPoint; - private bool _isTargetedOcrRunning; - - // Visual brushes (cached for maximum performance) - private static readonly IBrush SelectionFillBrush = new SolidColorBrush(Color.FromArgb(95, 59, 130, 246)); - private static readonly IPen SelectionBorderPen = new Pen(new SolidColorBrush(Color.FromArgb(160, 37, 99, 235)), 1.0); - private static readonly IBrush MarqueeFillBrush = new SolidColorBrush(Color.FromArgb(45, 15, 108, 189)); - private static readonly IPen MarqueeBorderPen = new Pen(new SolidColorBrush(Color.FromArgb(200, 15, 108, 189)), 1.5, DashStyle.Dash); - private static readonly IBrush HandleFillBrush = new SolidColorBrush(Colors.White); - private static readonly IPen HandleBorderPen = new Pen(new SolidColorBrush(Color.FromArgb(220, 15, 108, 189)), 1.0); - - static PdfTextOverlayControl() - { - AffectsRender(PageProperty, ZoomLevelProperty); - } - - public PdfTextOverlayControl() - { - ClipToBounds = true; - IsHitTestVisible = true; - ContextMenu = CreateSelectionContextMenu(); - } - - private PdfViewerViewModel? ResolveViewModel() - { - if (ViewerViewModel != null) return ViewerViewModel; - if (DataContext is PdfViewerViewModel vm) return vm; - var parent = this.FindAncestorOfType(); - return parent?.DataContext as PdfViewerViewModel; - } - - protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change) - { - base.OnPropertyChanged(change); - - if (change.Property == PageProperty) - { - if (_subscribedPage != null) - { - _subscribedPage.SelectionChanged -= OnPageSelectionChanged; - } - - _subscribedPage = change.GetNewValue(); - - if (_subscribedPage != null) - { - _subscribedPage.SelectionChanged += OnPageSelectionChanged; - } - - InvalidateVisual(); - } - else if (change.Property == ZoomLevelProperty) - { - InvalidateVisual(); - } - } - - private void OnPageSelectionChanged() - { - InvalidateVisual(); - } - - private (double scaleX, double scaleY) GetEffectiveScales(PdfViewerPageItem page) - { - double fallbackZoom = Math.Max(0.1, ZoomLevel > 0 ? ZoomLevel : 1.0); - double sx = (page.WidthPoints > 0 && Bounds.Width > 0) ? Bounds.Width / page.WidthPoints : fallbackZoom; - double sy = (page.HeightPoints > 0 && Bounds.Height > 0) ? Bounds.Height / page.HeightPoints : fallbackZoom; - return (sx, sy); - } - - protected override void OnPointerMoved(PointerEventArgs e) - { - base.OnPointerMoved(e); - - var page = Page; - if (page == null) return; - - var vm = ResolveViewModel(); - if (page.Words.Count == 0 && vm != null) - { - vm.EnsurePageGeometry(page); - } - - var (scaleX, scaleY) = GetEffectiveScales(page); - var pos = e.GetPosition(this); - var unscaledPos = new Point(pos.X / scaleX, pos.Y / scaleY); - - if (_isPointerDown) - { - _hasMovedSinceDown = true; - - if (_isAreaSelecting) - { - double minX = Math.Min(_dragStartPoint.X, unscaledPos.X); - double minY = Math.Min(_dragStartPoint.Y, unscaledPos.Y); - double maxX = Math.Max(_dragStartPoint.X, unscaledPos.X); - double maxY = Math.Max(_dragStartPoint.Y, unscaledPos.Y); - _currentMarqueeRect = new Rect(minX, minY, Math.Max(1, maxX - minX), Math.Max(1, maxY - minY)); - - page.SelectionRects.Clear(); - page.SelectionRects.Add(_currentMarqueeRect); - - if (vm != null) - { - vm.LastSelectedAreaRect = _currentMarqueeRect; - } - - InvalidateVisual(); - e.Handled = true; - } - else - { - page.SetSelectionRange(_dragStartPoint, unscaledPos); - - if (vm != null) - { - vm.ActiveSelectedText = page.SelectedText; - vm.ActiveSelectedPageNumber = page.PageNumber; - vm.HasTextSelection = !string.IsNullOrEmpty(page.SelectedText); - } - - InvalidateVisual(); - e.Handled = true; - } - } - else - { - // Dynamic Cursor - bool isAreaMode = (vm != null && vm.SelectionMode == PdfViewerSelectionMode.Area) || e.KeyModifiers.HasFlag(KeyModifiers.Alt); - if (isAreaMode) - { - Cursor = new Cursor(StandardCursorType.Cross); - } - else - { - bool isOverText = page.Words != null && page.Words.Any(w => w.Bounds.Contains(unscaledPos)); - if (isOverText) - { - Cursor = new Cursor(StandardCursorType.Ibeam); - } - else if (page.Words == null || page.Words.Count == 0) - { - Cursor = new Cursor(StandardCursorType.Cross); - } - else - { - Cursor = Cursor.Default; - } - } - } - } - - protected override void OnPointerPressed(PointerPressedEventArgs e) - { - base.OnPointerPressed(e); - - var page = Page; - if (page == null) return; - - var vm = ResolveViewModel(); - if (page.Words.Count == 0 && vm != null) - { - vm.EnsurePageGeometry(page); - } - - var (scaleX, scaleY) = GetEffectiveScales(page); - var currentPoint = e.GetCurrentPoint(this); - var pos = e.GetPosition(this); - var unscaledPos = new Point(pos.X / scaleX, pos.Y / scaleY); - - if (currentPoint.Properties.IsLeftButtonPressed) - { - int clickCount = e.ClickCount; - bool isShift = e.KeyModifiers.HasFlag(KeyModifiers.Shift); - bool isAlt = e.KeyModifiers.HasFlag(KeyModifiers.Alt); - bool isAreaMode = (vm != null && vm.SelectionMode == PdfViewerSelectionMode.Area) || isAlt || (page.Words.Count == 0); - - if (clickCount == 1) - { - // Synchronize active page and thumbnail selection on click - if (vm != null) - { - vm.SelectPage(page); - if (vm.ActiveSelectedPageNumber != page.PageNumber) - { - vm.ClearSelection(); - } - } - - if (isShift && _lastAnchorPoint.HasValue && !isAreaMode && page.Words.Count > 0) - { - // Shift + Click: Extend selection from previous anchor to clicked point - page.SetSelectionRange(_lastAnchorPoint.Value, unscaledPos); - SyncSelectionToViewModel(page, vm); - InvalidateVisual(); - e.Handled = true; - return; - } - - _isPointerDown = true; - _dragStartPoint = unscaledPos; - _lastAnchorPoint = unscaledPos; - _hasMovedSinceDown = false; - _isAreaSelecting = isAreaMode; - _currentMarqueeRect = default; - - e.Pointer.Capture(this); - e.Handled = true; - } - else if (clickCount == 2 && !isAreaMode) - { - // Double-click: Select word under cursor - var word = page.Words?.FirstOrDefault(w => w.Bounds.Contains(unscaledPos)) - ?? page.Words?.OrderBy(w => Math.Abs(w.Bounds.Center.X - unscaledPos.X) + Math.Abs(w.Bounds.Center.Y - unscaledPos.Y) * 2).FirstOrDefault(); - if (word != null) - { - page.SelectWord(word); - _lastAnchorPoint = word.Bounds.TopLeft; - SyncSelectionToViewModel(page, vm); - InvalidateVisual(); - e.Handled = true; - } - } - else if (clickCount >= 3 && !isAreaMode) - { - // Triple-click: Select entire line under cursor - var line = page.TextLines?.FirstOrDefault(l => l.Bounds.Contains(unscaledPos)) - ?? page.TextLines?.OrderBy(l => Math.Abs(l.Bounds.Center.Y - unscaledPos.Y)).FirstOrDefault(); - if (line != null) - { - page.SelectLine(line); - _lastAnchorPoint = line.Bounds.TopLeft; - SyncSelectionToViewModel(page, vm); - InvalidateVisual(); - e.Handled = true; - } - } - } - else if (currentPoint.Properties.IsRightButtonPressed) - { - // Right click: If clicking inside existing selection, keep it; otherwise select word under cursor - bool isInsideSelection = page.SelectionRects != null && page.SelectionRects.Any(r => r.Contains(unscaledPos)); - if (!isInsideSelection) - { - var word = page.Words?.FirstOrDefault(w => w.Bounds.Contains(unscaledPos)); - if (word != null) - { - page.SelectWord(word); - SyncSelectionToViewModel(page, vm); - InvalidateVisual(); - } - } - } - } - - protected override void OnPointerReleased(PointerReleasedEventArgs e) - { - base.OnPointerReleased(e); - - if (_isPointerDown) - { - _isPointerDown = false; - e.Pointer.Capture(null); - - var page = Page; - var vm = ResolveViewModel(); - if (page != null) - { - if (!_hasMovedSinceDown && e.InitialPressMouseButton == MouseButton.Left) - { - // Single click with no drag on blank space: clear selection - var (scaleX, scaleY) = GetEffectiveScales(page); - var pos = e.GetPosition(this); - var unscaledPos = new Point(pos.X / scaleX, pos.Y / scaleY); - bool hitWord = page.Words != null && page.Words.Any(w => w.Bounds.Contains(unscaledPos)); - - if (!hitWord) - { - page.ClearSelection(); - vm?.ClearSelection(); - _currentMarqueeRect = default; - } - else - { - var word = page.Words!.First(w => w.Bounds.Contains(unscaledPos)); - page.SelectWord(word); - _lastAnchorPoint = word.Bounds.TopLeft; - SyncSelectionToViewModel(page, vm); - } - } - else if (_isAreaSelecting && _hasMovedSinceDown) - { - if (vm != null) - { - vm.LastSelectedAreaRect = _currentMarqueeRect; - } - - List selectedWords = new(); - if (page.Words != null && page.Words.Count > 0) - { - selectedWords = page.Words - .Where(w => w.Bounds.Intersects(_currentMarqueeRect)) - .OrderBy(w => w.Bounds.Top) - .ThenBy(w => w.Bounds.Left) - .ToList(); - } - - bool wordsAreGarbled = selectedWords.Count > 0 && selectedWords.All(w => PdfViewerViewModel.IsGarbledText(w.Text)); - - if (selectedWords.Count > 0 && !wordsAreGarbled) - { - page.SelectedText = string.Join(" ", selectedWords.Select(w => w.Text)); - SyncSelectionToViewModel(page, vm); - } - else if (vm != null && _currentMarqueeRect.Width > 5 && _currentMarqueeRect.Height > 5) - { - // Scanned page (zero words) or garbled words in area: perform targeted OCR on cropped rect - _isTargetedOcrRunning = true; - InvalidateVisual(); - var rectToOcr = _currentMarqueeRect; - - _ = Task.Run(async () => - { - try - { - string text = await vm.ExtractOcrTextFromRegionAsync(page, rectToOcr, forceOcr: true); - Avalonia.Threading.Dispatcher.UIThread.Post(() => - { - _isTargetedOcrRunning = false; - if (!string.IsNullOrWhiteSpace(text)) - { - page.SelectedText = text; - SyncSelectionToViewModel(page, vm); - } - InvalidateVisual(); - }); - } - catch - { - Avalonia.Threading.Dispatcher.UIThread.Post(() => - { - _isTargetedOcrRunning = false; - InvalidateVisual(); - }); - } - }); - } - } - else - { - SyncSelectionToViewModel(page, vm); - } - } - - InvalidateVisual(); - e.Handled = true; - } - } - - private void SyncSelectionToViewModel(PdfViewerPageItem page, PdfViewerViewModel? vm) - { - if (vm != null) - { - vm.ActiveSelectedText = page.SelectedText; - vm.ActiveSelectedPageNumber = page.PageNumber; - vm.HasTextSelection = !string.IsNullOrEmpty(page.SelectedText); - } - } - - public override void Render(DrawingContext context) - { - base.Render(context); - - // 1. Fill transparent bounds to guarantee 100% reliable mouse hit-testing across entire page card - context.FillRectangle(Brushes.Transparent, new Rect(0, 0, Math.Max(1, Bounds.Width), Math.Max(1, Bounds.Height))); - - var page = Page; - if (page == null) return; - - var (scaleX, scaleY) = GetEffectiveScales(page); - - // 2. Draw Permanent Highlight Annotations on this page - if (page.PageAnnotations != null && page.PageAnnotations.Count > 0) - { - foreach (var ann in page.PageAnnotations) - { - if (ann.Type == "Highlight" && ann.HighlightRects != null && ann.HighlightRects.Count > 0) - { - IBrush highlightBrush = CreateHighlightBrush(ann.ColorHex); - foreach (var rect in ann.HighlightRects) - { - var scaledRect = new Rect( - rect.X * scaleX, - rect.Y * scaleY, - Math.Max(2, rect.Width * scaleX), - Math.Max(2, rect.Height * scaleY)); - - context.FillRectangle(highlightBrush, scaledRect, 2.0f); - } - } - } - } - - // 3. Draw Active User Text Selection - if (page.SelectionRects != null && page.SelectionRects.Count > 0) - { - var vm = ResolveViewModel(); - bool isMarquee = _isAreaSelecting || (vm != null && vm.SelectionMode == PdfViewerSelectionMode.Area) || (page.Words.Count == 0); - - foreach (var rect in page.SelectionRects) - { - var scaledRect = new Rect( - rect.X * scaleX, - rect.Y * scaleY, - Math.Max(2, rect.Width * scaleX), - Math.Max(2, rect.Height * scaleY)); - - if (isMarquee) - { - // Draw Area / Marquee Box - context.FillRectangle(MarqueeFillBrush, scaledRect, 2.0f); - context.DrawRectangle(MarqueeBorderPen, scaledRect, 2.0f); - - // Draw 4 corner handles - const double handleSize = 6.0; - const double halfHandle = handleSize / 2.0; - var corners = new[] - { - new Point(scaledRect.Left, scaledRect.Top), - new Point(scaledRect.Right, scaledRect.Top), - new Point(scaledRect.Left, scaledRect.Bottom), - new Point(scaledRect.Right, scaledRect.Bottom) - }; - - foreach (var corner in corners) - { - var handleRect = new Rect(corner.X - halfHandle, corner.Y - halfHandle, handleSize, handleSize); - context.FillRectangle(HandleFillBrush, handleRect); - context.DrawRectangle(HandleBorderPen, handleRect); - } - - if (_isTargetedOcrRunning) - { - // Draw "⚡ OCR..." badge - var badgeRect = new Rect(scaledRect.Left + 4, Math.Max(0, scaledRect.Top - 22), 65, 18); - context.FillRectangle(new SolidColorBrush(Color.FromArgb(230, 15, 108, 189)), badgeRect, 4.0f); - var typeface = new Typeface(FontFamily.Default, FontStyle.Normal, FontWeight.SemiBold); - var formattedText = new FormattedText("⚡ OCR...", System.Globalization.CultureInfo.InvariantCulture, FlowDirection.LeftToRight, typeface, 10.5, Brushes.White); - context.DrawText(formattedText, new Point(badgeRect.Left + 6, badgeRect.Top + 2)); - } - } - else - { - context.FillRectangle(SelectionFillBrush, scaledRect, 2.0f); - context.DrawRectangle(SelectionBorderPen, scaledRect, 2.0f); - } - } - } - } - - private static IBrush CreateHighlightBrush(string colorHex) - { - try - { - if (Color.TryParse(colorHex, out var parsed)) - { - return new SolidColorBrush(Color.FromArgb(98, parsed.R, parsed.G, parsed.B)); - } - } - catch { } - - return new SolidColorBrush(Color.FromArgb(98, 254, 240, 138)); // Default yellow - } - - private ContextMenu CreateSelectionContextMenu() - { - var menu = new ContextMenu(); - - // 1. Copy - var copyItem = new MenuItem - { - Header = "Copy Text", - InputGesture = new KeyGesture(Key.C, KeyModifiers.Control | KeyModifiers.Meta) - }; - copyItem.Icon = new MaterialIcon { Kind = MaterialIconKind.ContentCopy, Width = 15, Height = 15 }; - copyItem.Click += (s, e) => ResolveViewModel()?.CopySelectedTextCommand.Execute(null); - menu.Items.Add(copyItem); - - // 2. Copy with Citation - var citationItem = new MenuItem - { - Header = "Copy with Page Reference", - InputGesture = new KeyGesture(Key.C, KeyModifiers.Control | KeyModifiers.Shift) - }; - citationItem.Icon = new MaterialIcon { Kind = MaterialIconKind.FormatQuoteClose, Width = 15, Height = 15 }; - citationItem.Click += (s, e) => ResolveViewModel()?.CopySelectedCitationCommand.Execute(null); - menu.Items.Add(citationItem); - - // 3. Copy Area Snapshot Image - var copySnapshotItem = new MenuItem - { - Header = "Copy Area Snapshot", - InputGesture = new KeyGesture(Key.S, KeyModifiers.Control | KeyModifiers.Shift) - }; - copySnapshotItem.Icon = new MaterialIcon { Kind = MaterialIconKind.CameraOutline, Width = 15, Height = 15, Foreground = new SolidColorBrush(Color.Parse("#0284C7")) }; - copySnapshotItem.Click += (s, e) => ResolveViewModel()?.CopySelectedAreaImageCommand.Execute(null); - menu.Items.Add(copySnapshotItem); - - // 4. Recognize Selection with OCR - var ocrSelectionItem = new MenuItem - { - Header = "Recognize Selection with OCR", - InputGesture = new KeyGesture(Key.R, KeyModifiers.Control | KeyModifiers.Shift) - }; - ocrSelectionItem.Icon = new MaterialIcon { Kind = MaterialIconKind.ScanHelper, Width = 15, Height = 15, Foreground = new SolidColorBrush(Color.Parse("#0F6CBD")) }; - ocrSelectionItem.Click += (s, e) => ResolveViewModel()?.RecognizeSelectedTextOcrCommand.Execute(null); - menu.Items.Add(ocrSelectionItem); - - // 5. Recognize Entire Page (OCR) - var ocrItem = new MenuItem - { - Header = "Recognize Page (OCR)" - }; - ocrItem.Icon = new MaterialIcon { Kind = MaterialIconKind.TextRecognition, Width = 15, Height = 15, Foreground = new SolidColorBrush(Color.Parse("#0F6CBD")) }; - ocrItem.Click += (s, e) => ResolveViewModel()?.RecognizeActivePageOcrCommand.Execute(null); - menu.Items.Add(ocrItem); - - menu.Items.Add(new Separator()); - - // 3. Highlight submenu - var highlightMenu = new MenuItem - { - Header = "Highlight Selection" - }; - highlightMenu.Icon = new MaterialIcon { Kind = MaterialIconKind.FormatColorHighlight, Width = 15, Height = 15, Foreground = new SolidColorBrush(Color.Parse("#CA8A04")) }; - - var yellowHl = new MenuItem { Header = "Yellow Highlight" }; - yellowHl.Icon = new Border { Width = 12, Height = 12, CornerRadius = new CornerRadius(2), Background = new SolidColorBrush(Color.Parse("#FEF08A")), BorderBrush = new SolidColorBrush(Color.Parse("#CA8A04")), BorderThickness = new Thickness(1) }; - yellowHl.Click += (s, e) => ResolveViewModel()?.HighlightSelectedTextCommand.Execute("#FEF08A"); - highlightMenu.Items.Add(yellowHl); - - var greenHl = new MenuItem { Header = "Green Highlight" }; - greenHl.Icon = new Border { Width = 12, Height = 12, CornerRadius = new CornerRadius(2), Background = new SolidColorBrush(Color.Parse("#A7F3D0")), BorderBrush = new SolidColorBrush(Color.Parse("#059669")), BorderThickness = new Thickness(1) }; - greenHl.Click += (s, e) => ResolveViewModel()?.HighlightSelectedTextCommand.Execute("#A7F3D0"); - highlightMenu.Items.Add(greenHl); - - var blueHl = new MenuItem { Header = "Blue Highlight" }; - blueHl.Icon = new Border { Width = 12, Height = 12, CornerRadius = new CornerRadius(2), Background = new SolidColorBrush(Color.Parse("#BAE6FD")), BorderBrush = new SolidColorBrush(Color.Parse("#0284C7")), BorderThickness = new Thickness(1) }; - blueHl.Click += (s, e) => ResolveViewModel()?.HighlightSelectedTextCommand.Execute("#BAE6FD"); - highlightMenu.Items.Add(blueHl); - - var pinkHl = new MenuItem { Header = "Pink Highlight" }; - pinkHl.Icon = new Border { Width = 12, Height = 12, CornerRadius = new CornerRadius(2), Background = new SolidColorBrush(Color.Parse("#FBCFE8")), BorderBrush = new SolidColorBrush(Color.Parse("#DB2777")), BorderThickness = new Thickness(1) }; - pinkHl.Click += (s, e) => ResolveViewModel()?.HighlightSelectedTextCommand.Execute("#FBCFE8"); - highlightMenu.Items.Add(pinkHl); - - var orangeHl = new MenuItem { Header = "Orange Highlight" }; - orangeHl.Icon = new Border { Width = 12, Height = 12, CornerRadius = new CornerRadius(2), Background = new SolidColorBrush(Color.Parse("#FED7AA")), BorderBrush = new SolidColorBrush(Color.Parse("#EA580C")), BorderThickness = new Thickness(1) }; - orangeHl.Click += (s, e) => ResolveViewModel()?.HighlightSelectedTextCommand.Execute("#FED7AA"); - highlightMenu.Items.Add(orangeHl); - - menu.Items.Add(highlightMenu); - - // 4. Add Sticky Note from selection - var noteItem = new MenuItem - { - Header = "Add Note on Selection...", - InputGesture = new KeyGesture(Key.N, KeyModifiers.Control | KeyModifiers.Meta) - }; - noteItem.Icon = new MaterialIcon { Kind = MaterialIconKind.CommentTextOutline, Width = 15, Height = 15, Foreground = new SolidColorBrush(Color.Parse("#0284C7")) }; - noteItem.Click += (s, e) => ResolveViewModel()?.AddNoteFromSelectionCommand.Execute(null); - menu.Items.Add(noteItem); - - menu.Items.Add(new Separator()); - - // 5. Search in document - var searchItem = new MenuItem - { - Header = "Find in PDF", - InputGesture = new KeyGesture(Key.F, KeyModifiers.Control | KeyModifiers.Meta) - }; - searchItem.Icon = new MaterialIcon { Kind = MaterialIconKind.Magnify, Width = 15, Height = 15 }; - searchItem.Click += (s, e) => ResolveViewModel()?.SearchSelectedTextCommand.Execute(null); - menu.Items.Add(searchItem); - - // 6. Search on web - var webSearchItem = new MenuItem - { - Header = "Search with Google" - }; - webSearchItem.Icon = new MaterialIcon { Kind = MaterialIconKind.Web, Width = 15, Height = 15, Foreground = new SolidColorBrush(Color.Parse("#2563EB")) }; - webSearchItem.Click += (s, e) => ResolveViewModel()?.SearchWebSelectedTextCommand.Execute(null); - menu.Items.Add(webSearchItem); - - menu.Items.Add(new Separator()); - - // 7. Select All - var selectAllItem = new MenuItem - { - Header = "Select All on Page", - InputGesture = new KeyGesture(Key.A, KeyModifiers.Control | KeyModifiers.Meta) - }; - selectAllItem.Icon = new MaterialIcon { Kind = MaterialIconKind.SelectAll, Width = 15, Height = 15 }; - selectAllItem.Click += (s, e) => ResolveViewModel()?.SelectAllPageTextCommand.Execute(null); - menu.Items.Add(selectAllItem); - - return menu; - } -} diff --git a/src/PdfEditorApp/Views/Dialogs/AboutDialog.axaml b/src/PdfEditorApp/Views/Dialogs/AboutDialog.axaml deleted file mode 100644 index 7e24def..0000000 --- a/src/PdfEditorApp/Views/Dialogs/AboutDialog.axaml +++ /dev/null @@ -1,510 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/Dialogs/AboutDialog.axaml.cs b/src/PdfEditorApp/Views/Dialogs/AboutDialog.axaml.cs deleted file mode 100644 index 0f10446..0000000 --- a/src/PdfEditorApp/Views/Dialogs/AboutDialog.axaml.cs +++ /dev/null @@ -1,31 +0,0 @@ -using Avalonia.Controls; -using Avalonia.Input; -using PdfEditorApp.ViewModels; - -namespace PdfEditorApp.Views.Dialogs; - -public partial class AboutDialog : UserControl -{ - public AboutDialog() - { - InitializeComponent(); - } - - private void OnBackdropPointerPressed(object? sender, PointerPressedEventArgs e) - { - if (DataContext is MainViewModel vm) - { - vm.CloseAboutDialog(); - } - } - - protected override void OnKeyDown(KeyEventArgs e) - { - base.OnKeyDown(e); - if (e.Key == Key.Escape && DataContext is MainViewModel vm) - { - vm.CloseAboutDialog(); - e.Handled = true; - } - } -} diff --git a/src/PdfEditorApp/Views/Dialogs/AiAssistantDialog.axaml b/src/PdfEditorApp/Views/Dialogs/AiAssistantDialog.axaml deleted file mode 100644 index e59e085..0000000 --- a/src/PdfEditorApp/Views/Dialogs/AiAssistantDialog.axaml +++ /dev/null @@ -1,325 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/Dialogs/AiAssistantDialog.axaml.cs b/src/PdfEditorApp/Views/Dialogs/AiAssistantDialog.axaml.cs deleted file mode 100644 index 7fa8758..0000000 --- a/src/PdfEditorApp/Views/Dialogs/AiAssistantDialog.axaml.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Avalonia.Controls; - -namespace PdfEditorApp.Views.Dialogs; - -public partial class AiAssistantDialog : UserControl -{ - public AiAssistantDialog() - { - InitializeComponent(); - } -} diff --git a/src/PdfEditorApp/Views/Dialogs/BatchGenerationDialog.axaml b/src/PdfEditorApp/Views/Dialogs/BatchGenerationDialog.axaml deleted file mode 100644 index d316dbb..0000000 --- a/src/PdfEditorApp/Views/Dialogs/BatchGenerationDialog.axaml +++ /dev/null @@ -1,532 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/Dialogs/BatchGenerationDialog.axaml.cs b/src/PdfEditorApp/Views/Dialogs/BatchGenerationDialog.axaml.cs deleted file mode 100644 index 91570a1..0000000 --- a/src/PdfEditorApp/Views/Dialogs/BatchGenerationDialog.axaml.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Avalonia.Controls; - -namespace PdfEditorApp.Views.Dialogs; - -public partial class BatchGenerationDialog : UserControl -{ - public BatchGenerationDialog() - { - InitializeComponent(); - } -} diff --git a/src/PdfEditorApp/Views/Dialogs/BatesNumberingDialog.axaml b/src/PdfEditorApp/Views/Dialogs/BatesNumberingDialog.axaml deleted file mode 100644 index bc28343..0000000 --- a/src/PdfEditorApp/Views/Dialogs/BatesNumberingDialog.axaml +++ /dev/null @@ -1,167 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/Dialogs/BatesNumberingDialog.axaml.cs b/src/PdfEditorApp/Views/Dialogs/BatesNumberingDialog.axaml.cs deleted file mode 100644 index 56b2791..0000000 --- a/src/PdfEditorApp/Views/Dialogs/BatesNumberingDialog.axaml.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Avalonia.Controls; - -namespace PdfEditorApp.Views.Dialogs; - -public partial class BatesNumberingDialog : UserControl -{ - public BatesNumberingDialog() - { - InitializeComponent(); - } -} diff --git a/src/PdfEditorApp/Views/Dialogs/CommandPaletteDialog.axaml b/src/PdfEditorApp/Views/Dialogs/CommandPaletteDialog.axaml deleted file mode 100644 index 8f9419b..0000000 --- a/src/PdfEditorApp/Views/Dialogs/CommandPaletteDialog.axaml +++ /dev/null @@ -1,195 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/Dialogs/CommandPaletteDialog.axaml.cs b/src/PdfEditorApp/Views/Dialogs/CommandPaletteDialog.axaml.cs deleted file mode 100644 index 413ec35..0000000 --- a/src/PdfEditorApp/Views/Dialogs/CommandPaletteDialog.axaml.cs +++ /dev/null @@ -1,77 +0,0 @@ -using System; -using Avalonia; -using Avalonia.Controls; -using Avalonia.Input; -using Avalonia.Interactivity; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Models; -using PdfEditorApp.ViewModels; - -namespace PdfEditorApp.Views.Dialogs; - -public partial class CommandPaletteDialog : UserControl -{ - public CommandPaletteDialog() - { - InitializeComponent(); - PropertyChanged += OnDialogPropertyChanged; - } - - private void OnDialogPropertyChanged(object? sender, AvaloniaPropertyChangedEventArgs e) - { - if (e.Property == IsVisibleProperty && e.NewValue is true) - { - Avalonia.Threading.Dispatcher.UIThread.Post(() => - { - SearchInputTextBox?.Focus(); - SearchInputTextBox?.SelectAll(); - }, Avalonia.Threading.DispatcherPriority.Loaded); - } - } - - private void OnBackdropPointerPressed(object? sender, PointerPressedEventArgs e) - { - if (DataContext is MainViewModel vm) - { - vm.CloseCommandPalette(); - } - } - - private void OnSearchInputKeyDown(object? sender, KeyEventArgs e) - { - if (DataContext is not MainViewModel vm) return; - - switch (e.Key) - { - case Key.Escape: - vm.CloseCommandPalette(); - e.Handled = true; - break; - case Key.Enter: - vm.ExecuteSelectedPaletteCommand(); - e.Handled = true; - break; - case Key.Down: - vm.SelectNextPaletteCommand(); - e.Handled = true; - break; - case Key.Up: - vm.SelectPreviousPaletteCommand(); - e.Handled = true; - break; - } - } - - private void OnCommandItemPointerPressed(object? sender, PointerPressedEventArgs e) - { - if (sender is Control control && control.DataContext is CommandPaletteItem item) - { - if (DataContext is MainViewModel vm) - { - vm.CloseCommandPalette(); - item.Action?.Invoke(); - e.Handled = true; - } - } - } -} diff --git a/src/PdfEditorApp/Views/Dialogs/CompareDocumentsDialog.axaml b/src/PdfEditorApp/Views/Dialogs/CompareDocumentsDialog.axaml deleted file mode 100644 index 1012cac..0000000 --- a/src/PdfEditorApp/Views/Dialogs/CompareDocumentsDialog.axaml +++ /dev/null @@ -1,140 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/Dialogs/CompareDocumentsDialog.axaml.cs b/src/PdfEditorApp/Views/Dialogs/CompareDocumentsDialog.axaml.cs deleted file mode 100644 index e2f6566..0000000 --- a/src/PdfEditorApp/Views/Dialogs/CompareDocumentsDialog.axaml.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Avalonia.Controls; - -namespace PdfEditorApp.Views.Dialogs; - -public partial class CompareDocumentsDialog : UserControl -{ - public CompareDocumentsDialog() - { - InitializeComponent(); - } -} diff --git a/src/PdfEditorApp/Views/Dialogs/CustomStampDialog.axaml b/src/PdfEditorApp/Views/Dialogs/CustomStampDialog.axaml deleted file mode 100644 index c36ed8a..0000000 --- a/src/PdfEditorApp/Views/Dialogs/CustomStampDialog.axaml +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/Dialogs/CustomStampDialog.axaml.cs b/src/PdfEditorApp/Views/Dialogs/CustomStampDialog.axaml.cs deleted file mode 100644 index e29e618..0000000 --- a/src/PdfEditorApp/Views/Dialogs/CustomStampDialog.axaml.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Avalonia.Controls; - -namespace PdfEditorApp.Views.Dialogs; - -public partial class CustomStampDialog : UserControl -{ - public CustomStampDialog() - { - InitializeComponent(); - } -} diff --git a/src/PdfEditorApp/Views/Dialogs/DataStudioDialog.axaml b/src/PdfEditorApp/Views/Dialogs/DataStudioDialog.axaml deleted file mode 100644 index 454f984..0000000 --- a/src/PdfEditorApp/Views/Dialogs/DataStudioDialog.axaml +++ /dev/null @@ -1,346 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/Dialogs/DataStudioDialog.axaml.cs b/src/PdfEditorApp/Views/Dialogs/DataStudioDialog.axaml.cs deleted file mode 100644 index bd974aa..0000000 --- a/src/PdfEditorApp/Views/Dialogs/DataStudioDialog.axaml.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Avalonia.Controls; - -namespace PdfEditorApp.Views.Dialogs; - -public partial class DataStudioDialog : UserControl -{ - public DataStudioDialog() - { - InitializeComponent(); - } -} diff --git a/src/PdfEditorApp/Views/Dialogs/DeleteConfirmationDialog.axaml b/src/PdfEditorApp/Views/Dialogs/DeleteConfirmationDialog.axaml deleted file mode 100644 index 16804e7..0000000 --- a/src/PdfEditorApp/Views/Dialogs/DeleteConfirmationDialog.axaml +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/Dialogs/DocumentSecurityDialog.axaml.cs b/src/PdfEditorApp/Views/Dialogs/DocumentSecurityDialog.axaml.cs deleted file mode 100644 index 1e0e75c..0000000 --- a/src/PdfEditorApp/Views/Dialogs/DocumentSecurityDialog.axaml.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Avalonia.Controls; - -namespace PdfEditorApp.Views.Dialogs; - -public partial class DocumentSecurityDialog : UserControl -{ - public DocumentSecurityDialog() - { - InitializeComponent(); - } -} diff --git a/src/PdfEditorApp/Views/Dialogs/ExportSuccessDialog.axaml b/src/PdfEditorApp/Views/Dialogs/ExportSuccessDialog.axaml deleted file mode 100644 index 66797aa..0000000 --- a/src/PdfEditorApp/Views/Dialogs/ExportSuccessDialog.axaml +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/Dialogs/HeaderFooterDialog.axaml.cs b/src/PdfEditorApp/Views/Dialogs/HeaderFooterDialog.axaml.cs deleted file mode 100644 index b1f8cb2..0000000 --- a/src/PdfEditorApp/Views/Dialogs/HeaderFooterDialog.axaml.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Avalonia.Controls; - -namespace PdfEditorApp.Views.Dialogs; - -public partial class HeaderFooterDialog : UserControl -{ - public HeaderFooterDialog() - { - InitializeComponent(); - } -} diff --git a/src/PdfEditorApp/Views/Dialogs/MathEquationStudioDialog.axaml b/src/PdfEditorApp/Views/Dialogs/MathEquationStudioDialog.axaml deleted file mode 100644 index 38f9390..0000000 --- a/src/PdfEditorApp/Views/Dialogs/MathEquationStudioDialog.axaml +++ /dev/null @@ -1,317 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/Dialogs/MathEquationStudioDialog.axaml.cs b/src/PdfEditorApp/Views/Dialogs/MathEquationStudioDialog.axaml.cs deleted file mode 100644 index c292e93..0000000 --- a/src/PdfEditorApp/Views/Dialogs/MathEquationStudioDialog.axaml.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Avalonia.Controls; - -namespace PdfEditorApp.Views.Dialogs; - -public partial class MathEquationStudioDialog : UserControl -{ - public MathEquationStudioDialog() - { - InitializeComponent(); - } -} diff --git a/src/PdfEditorApp/Views/Dialogs/NewDocumentDialog.axaml b/src/PdfEditorApp/Views/Dialogs/NewDocumentDialog.axaml deleted file mode 100644 index b268fc5..0000000 --- a/src/PdfEditorApp/Views/Dialogs/NewDocumentDialog.axaml +++ /dev/null @@ -1,561 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/Dialogs/PdfToolRunnerDialog.axaml.cs b/src/PdfEditorApp/Views/Dialogs/PdfToolRunnerDialog.axaml.cs deleted file mode 100644 index 3dd9da2..0000000 --- a/src/PdfEditorApp/Views/Dialogs/PdfToolRunnerDialog.axaml.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Avalonia.Controls; - -namespace PdfEditorApp.Views.Dialogs; - -public partial class PdfToolRunnerDialog : UserControl -{ - public PdfToolRunnerDialog() - { - InitializeComponent(); - } -} diff --git a/src/PdfEditorApp/Views/Dialogs/PluginsDialog.axaml b/src/PdfEditorApp/Views/Dialogs/PluginsDialog.axaml deleted file mode 100644 index 54dd180..0000000 --- a/src/PdfEditorApp/Views/Dialogs/PluginsDialog.axaml +++ /dev/null @@ -1,424 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/Dialogs/PluginsDialog.axaml.cs b/src/PdfEditorApp/Views/Dialogs/PluginsDialog.axaml.cs deleted file mode 100644 index 85112df..0000000 --- a/src/PdfEditorApp/Views/Dialogs/PluginsDialog.axaml.cs +++ /dev/null @@ -1,60 +0,0 @@ -using System; -using System.Linq; -using Avalonia.Controls; -using Avalonia.Input; -using PdfEditorApp.ViewModels; - -namespace PdfEditorApp.Views.Dialogs; - -public partial class PluginsDialog : UserControl -{ - public PluginsDialog() - { - InitializeComponent(); - DragDrop.SetAllowDrop(this, true); - AddHandler(DragDrop.DragOverEvent, OnDragOver); - AddHandler(DragDrop.DropEvent, OnDrop); - } - - private void OnDragOver(object? sender, DragEventArgs e) - { - if (e.DataTransfer.Formats.Any(f => f == DataFormat.File)) - { - e.DragEffects = DragDropEffects.Copy; - } - else - { - e.DragEffects = DragDropEffects.None; - } - e.Handled = true; - } - - private async void OnDrop(object? sender, DragEventArgs e) - { - if (DataContext is MainViewModel vm && e.DataTransfer.Formats.Any(f => f == DataFormat.File)) - { - var files = e.DataTransfer.TryGetFiles(); - if (files != null) - { - foreach (var file in files) - { - var path = file.Path.LocalPath; - if (path.EndsWith(".dll", StringComparison.OrdinalIgnoreCase) || - path.EndsWith(".fryplugin", StringComparison.OrdinalIgnoreCase)) - { - await vm.InstallAndMountPluginPathAsync(path); - } - } - } - } - e.Handled = true; - } - - private void OnBackdropPointerPressed(object? sender, PointerPressedEventArgs e) - { - if (DataContext is MainViewModel vm) - { - vm.ClosePluginsDialog(); - } - } -} diff --git a/src/PdfEditorApp/Views/Dialogs/PreflightDiagnosticsDialog.axaml b/src/PdfEditorApp/Views/Dialogs/PreflightDiagnosticsDialog.axaml deleted file mode 100644 index ad95159..0000000 --- a/src/PdfEditorApp/Views/Dialogs/PreflightDiagnosticsDialog.axaml +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/Dialogs/PreflightDiagnosticsDialog.axaml.cs b/src/PdfEditorApp/Views/Dialogs/PreflightDiagnosticsDialog.axaml.cs deleted file mode 100644 index 809b9c8..0000000 --- a/src/PdfEditorApp/Views/Dialogs/PreflightDiagnosticsDialog.axaml.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Avalonia.Controls; - -namespace PdfEditorApp.Views.Dialogs; - -public partial class PreflightDiagnosticsDialog : UserControl -{ - public PreflightDiagnosticsDialog() - { - InitializeComponent(); - } -} diff --git a/src/PdfEditorApp/Views/Dialogs/RenameDocumentDialog.axaml b/src/PdfEditorApp/Views/Dialogs/RenameDocumentDialog.axaml deleted file mode 100644 index 039d1eb..0000000 --- a/src/PdfEditorApp/Views/Dialogs/RenameDocumentDialog.axaml +++ /dev/null @@ -1,141 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/Dialogs/SearchRedactDialog.axaml.cs b/src/PdfEditorApp/Views/Dialogs/SearchRedactDialog.axaml.cs deleted file mode 100644 index f4b05ee..0000000 --- a/src/PdfEditorApp/Views/Dialogs/SearchRedactDialog.axaml.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Avalonia.Controls; - -namespace PdfEditorApp.Views.Dialogs; - -public partial class SearchRedactDialog : UserControl -{ - public SearchRedactDialog() - { - InitializeComponent(); - } -} diff --git a/src/PdfEditorApp/Views/Dialogs/ShortcutsHelpDialog.axaml b/src/PdfEditorApp/Views/Dialogs/ShortcutsHelpDialog.axaml deleted file mode 100644 index 0a0ff77..0000000 --- a/src/PdfEditorApp/Views/Dialogs/ShortcutsHelpDialog.axaml +++ /dev/null @@ -1,320 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/Dialogs/ShortcutsHelpDialog.axaml.cs b/src/PdfEditorApp/Views/Dialogs/ShortcutsHelpDialog.axaml.cs deleted file mode 100644 index e18d2b5..0000000 --- a/src/PdfEditorApp/Views/Dialogs/ShortcutsHelpDialog.axaml.cs +++ /dev/null @@ -1,21 +0,0 @@ -using Avalonia.Controls; -using Avalonia.Input; -using PdfEditorApp.ViewModels; - -namespace PdfEditorApp.Views.Dialogs; - -public partial class ShortcutsHelpDialog : UserControl -{ - public ShortcutsHelpDialog() - { - InitializeComponent(); - } - - private void OnBackdropPointerPressed(object? sender, PointerPressedEventArgs e) - { - if (DataContext is MainViewModel vm) - { - vm.CloseShortcutsHelp(); - } - } -} diff --git a/src/PdfEditorApp/Views/Dialogs/SignatureStudioDialog.axaml b/src/PdfEditorApp/Views/Dialogs/SignatureStudioDialog.axaml deleted file mode 100644 index eb22136..0000000 --- a/src/PdfEditorApp/Views/Dialogs/SignatureStudioDialog.axaml +++ /dev/null @@ -1,141 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/Dialogs/SignatureStudioDialog.axaml.cs b/src/PdfEditorApp/Views/Dialogs/SignatureStudioDialog.axaml.cs deleted file mode 100644 index a7c25ba..0000000 --- a/src/PdfEditorApp/Views/Dialogs/SignatureStudioDialog.axaml.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Avalonia.Controls; - -namespace PdfEditorApp.Views.Dialogs; - -public partial class SignatureStudioDialog : UserControl -{ - public SignatureStudioDialog() - { - InitializeComponent(); - } -} diff --git a/src/PdfEditorApp/Views/Dialogs/SplitExtractDialog.axaml b/src/PdfEditorApp/Views/Dialogs/SplitExtractDialog.axaml deleted file mode 100644 index 592b60b..0000000 --- a/src/PdfEditorApp/Views/Dialogs/SplitExtractDialog.axaml +++ /dev/null @@ -1,114 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/Dialogs/SplitExtractDialog.axaml.cs b/src/PdfEditorApp/Views/Dialogs/SplitExtractDialog.axaml.cs deleted file mode 100644 index 0ec7dfe..0000000 --- a/src/PdfEditorApp/Views/Dialogs/SplitExtractDialog.axaml.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Avalonia.Controls; - -namespace PdfEditorApp.Views.Dialogs; - -public partial class SplitExtractDialog : UserControl -{ - public SplitExtractDialog() - { - InitializeComponent(); - } -} diff --git a/src/PdfEditorApp/Views/Dialogs/WatermarkManagerDialog.axaml b/src/PdfEditorApp/Views/Dialogs/WatermarkManagerDialog.axaml deleted file mode 100644 index 1c21e82..0000000 --- a/src/PdfEditorApp/Views/Dialogs/WatermarkManagerDialog.axaml +++ /dev/null @@ -1,130 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/Dialogs/WatermarkManagerDialog.axaml.cs b/src/PdfEditorApp/Views/Dialogs/WatermarkManagerDialog.axaml.cs deleted file mode 100644 index 99e01af..0000000 --- a/src/PdfEditorApp/Views/Dialogs/WatermarkManagerDialog.axaml.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Avalonia.Controls; - -namespace PdfEditorApp.Views.Dialogs; - -public partial class WatermarkManagerDialog : UserControl -{ - public WatermarkManagerDialog() - { - InitializeComponent(); - } -} diff --git a/src/PdfEditorApp/Views/Dialogs/WorkflowBuilderDialog.axaml b/src/PdfEditorApp/Views/Dialogs/WorkflowBuilderDialog.axaml deleted file mode 100644 index 64a0a7e..0000000 --- a/src/PdfEditorApp/Views/Dialogs/WorkflowBuilderDialog.axaml +++ /dev/null @@ -1,303 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/Dialogs/WorkflowBuilderDialog.axaml.cs b/src/PdfEditorApp/Views/Dialogs/WorkflowBuilderDialog.axaml.cs deleted file mode 100644 index 261d4bd..0000000 --- a/src/PdfEditorApp/Views/Dialogs/WorkflowBuilderDialog.axaml.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Avalonia.Controls; - -namespace PdfEditorApp.Views.Dialogs; - -public partial class WorkflowBuilderDialog : UserControl -{ - public WorkflowBuilderDialog() - { - InitializeComponent(); - } -} diff --git a/src/PdfEditorApp/Views/DocumentCanvasView.axaml b/src/PdfEditorApp/Views/DocumentCanvasView.axaml deleted file mode 100644 index d113caa..0000000 --- a/src/PdfEditorApp/Views/DocumentCanvasView.axaml +++ /dev/null @@ -1,1163 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/DocumentCanvasView.axaml.cs b/src/PdfEditorApp/Views/DocumentCanvasView.axaml.cs deleted file mode 100644 index 166eb6e..0000000 --- a/src/PdfEditorApp/Views/DocumentCanvasView.axaml.cs +++ /dev/null @@ -1,1414 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using Avalonia; -using Avalonia.Controls; -using Avalonia.Input; -using Avalonia.Interactivity; -using Avalonia.VisualTree; -using PdfEditorApp.Core.Models; -using PdfEditorApp.ViewModels; -using PdfEditorApp.ViewModels.ElementViewModels; - -namespace PdfEditorApp.Views; - -public partial class DocumentCanvasView : UserControl -{ - private bool _isDraggingElement; - private bool _isResizingHandle; - private bool _isMarqueeSelecting; - private Point _marqueeStartPoint; - private DateTime _lastMarqueeSelectionUpdate = DateTime.MinValue; - private string? _activeResizeHandle; - private Point _lastPointerPosition; - private ElementViewModelBase? _draggedElement; - private List _draggedElements = new(); - - // Potential Drag Tracking (for reliable click vs drag detection) - private bool _isPotentialDrag; - private ElementViewModelBase? _potentialDragElement; - private Point _potentialDragStartPos; - private bool _wasAlreadySelectedOnPress; - - // In-place text editing baseline tracking - private readonly Dictionary _initialEditContents = new(); - - // Movement & Resize Undo Tracking - private double _dragStartElementX; - private double _dragStartElementY; - private List<(ElementViewModelBase Element, double X, double Y)> _dragStartPositions = new(); - private double _resizeStartX; - private double _resizeStartY; - private double _resizeStartW; - private double _resizeStartH; - - // Pan state - private bool _isSpacePressed; - private bool _isPanning; - private Point _panStart; - private Vector _scrollStart; - - // Pinch Gesture state - private bool _isPinching; - private double _pinchStartZoom = 1.0; - - // Zoom commit throttle — wheel/trackpad/pinch events can fire far faster than the - // LayoutTransformControl-driven canvas can afford to re-measure/re-arrange for. The delta - // math below still runs on every raw event (so a fast flick still compounds correctly and - // the cursor-anchor point stays accurate); only the actual write to ZoomLevel/Offset — - // the part that triggers an expensive layout pass — is coalesced to roughly once per frame. - private CancellationTokenSource? _zoomThrottleCts; - private double _pendingZoomLevel; - private Vector _pendingCanvasOffset; - - private double EffectiveZoomLevel => _zoomThrottleCts != null - ? _pendingZoomLevel - : (ViewModel != null && ViewModel.ZoomLevel > 0 ? ViewModel.ZoomLevel : 1.0); - - private Vector EffectiveCanvasOffset => _zoomThrottleCts != null - ? _pendingCanvasOffset - : (CanvasScrollViewer?.Offset ?? default); - - private void RequestZoomLevelChange(double newZoom, Vector newOffset) - { - if (ViewModel == null) return; - - _pendingZoomLevel = newZoom; - _pendingCanvasOffset = newOffset; - - if (_zoomThrottleCts != null) return; // a commit is already scheduled; it will pick up these latest values - - _zoomThrottleCts = new CancellationTokenSource(); - var token = _zoomThrottleCts.Token; - - _ = Task.Run(async () => - { - try - { - await Task.Delay(16, token); - } - catch (TaskCanceledException) - { - return; - } - if (token.IsCancellationRequested) return; - - Avalonia.Threading.Dispatcher.UIThread.Post(() => CommitPendingZoom(token)); - }, token); - } - - private void CommitPendingZoom(CancellationToken token) - { - if (token.IsCancellationRequested) return; - _zoomThrottleCts = null; - var targetOffset = _pendingCanvasOffset; - if (ViewModel != null) ViewModel.ZoomLevel = _pendingZoomLevel; - if (CanvasScrollViewer != null) - { - CanvasScrollViewer.Offset = targetOffset; - Avalonia.Threading.Dispatcher.UIThread.Post(() => - { - if (CanvasScrollViewer != null) - { - CanvasScrollViewer.Offset = targetOffset; - } - }, Avalonia.Threading.DispatcherPriority.Loaded); - } - } - - /// Applies the pending zoom immediately instead of waiting out the throttle — - /// used when a gesture explicitly ends, so the canvas settles crisply. - private void FlushPendingZoom() - { - if (_zoomThrottleCts == null) return; - _zoomThrottleCts.Cancel(); - _zoomThrottleCts = null; - var targetOffset = _pendingCanvasOffset; - if (ViewModel != null) ViewModel.ZoomLevel = _pendingZoomLevel; - if (CanvasScrollViewer != null) - { - CanvasScrollViewer.Offset = targetOffset; - Avalonia.Threading.Dispatcher.UIThread.Post(() => - { - if (CanvasScrollViewer != null) - { - CanvasScrollViewer.Offset = targetOffset; - } - }, Avalonia.Threading.DispatcherPriority.Loaded); - } - } - - public DocumentCanvasView() - { - InitializeComponent(); - - GestureRecognizers.Add(new PinchGestureRecognizer()); - - AddHandler(PointerMovedEvent, OnGlobalPointerMoved, RoutingStrategies.Tunnel); - AddHandler(PointerReleasedEvent, OnGlobalPointerReleased, RoutingStrategies.Bubble); - AddHandler(PointerWheelChangedEvent, OnCanvasPointerWheelChanged, RoutingStrategies.Bubble | RoutingStrategies.Tunnel, handledEventsToo: true); - AddHandler(PointerTouchPadGestureMagnifyEvent, OnCanvasTouchPadGestureMagnify, RoutingStrategies.Bubble | RoutingStrategies.Tunnel, handledEventsToo: true); - AddHandler(PinchEvent, OnCanvasPinch, RoutingStrategies.Bubble | RoutingStrategies.Tunnel, handledEventsToo: true); - AddHandler(PinchEndedEvent, OnCanvasPinchEnded, RoutingStrategies.Bubble | RoutingStrategies.Tunnel, handledEventsToo: true); - AddHandler(DoubleTappedEvent, OnCanvasDoubleTapped, RoutingStrategies.Tunnel); - AddHandler(KeyDownEvent, OnCanvasKeyDown, RoutingStrategies.Tunnel); - AddHandler(KeyUpEvent, OnCanvasKeyUp, RoutingStrategies.Tunnel); - - InspectorViewModel.OnActiveTextFormattingApplied = textVm => - { - if (ActiveInPlaceTextBox != null && ActiveInPlaceTextBox.DataContext == textVm) - { - ActiveInPlaceTextBox.Text = textVm.Text; - ActiveInPlaceTextBox.SelectionStart = textVm.ActiveSelectionStart; - ActiveInPlaceTextBox.SelectionEnd = textVm.ActiveSelectionStart + textVm.ActiveSelectionLength; - ActiveInPlaceTextBox.Focus(); - } - }; - } - - protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e) - { - base.OnAttachedToVisualTree(e); - - if (CanvasScrollViewer != null) - { - CanvasScrollViewer.PropertyChanged += (s, ev) => - { - if (ev.Property == ScrollViewer.OffsetProperty || ev.Property == ScrollViewer.ViewportProperty) - { - UpdateViewportOnPlacementService(); - } - }; - } - } - - private void UpdateViewportOnPlacementService() - { - if (CanvasScrollViewer == null || PageElementsCanvas == null || ViewModel?.CurrentPage == null) return; - - double zoom = ViewModel.ZoomLevel > 0 ? ViewModel.ZoomLevel : 1.0; - var scrollCenter = new Point(CanvasScrollViewer.Viewport.Width / 2.0, CanvasScrollViewer.Viewport.Height / 2.0); - var canvasCenter = CanvasScrollViewer.TranslatePoint(scrollCenter, PageElementsCanvas); - - if (canvasCenter.HasValue) - { - double pageCenterX = canvasCenter.Value.X / zoom; - double pageCenterY = canvasCenter.Value.Y / zoom; - double visibleWidth = CanvasScrollViewer.Viewport.Width / zoom; - double visibleHeight = CanvasScrollViewer.Viewport.Height / zoom; - - ViewModel.SmartPlacement.UpdateViewport(pageCenterX, pageCenterY, visibleWidth, visibleHeight); - } - } - - private MainViewModel? ViewModel => DataContext as MainViewModel; - - private void OnCanvasPointerWheelChanged(object? sender, PointerWheelEventArgs e) - { - // Support Cmd (Meta), Ctrl, and Option (Alt) modifier keys as well as Zoom tool mode - bool isZoomModifier = e.KeyModifiers.HasFlag(KeyModifiers.Control) || - e.KeyModifiers.HasFlag(KeyModifiers.Meta) || - e.KeyModifiers.HasFlag(KeyModifiers.Alt); - bool isZoomTool = ViewModel?.ActiveToolMode == ToolMode.Zoom; - - if ((isZoomModifier || isZoomTool) && ViewModel != null && CanvasScrollViewer != null) - { - double oldZoom = EffectiveZoomLevel; - double effectiveDelta = Math.Abs(e.Delta.Y) >= Math.Abs(e.Delta.X) ? e.Delta.Y : e.Delta.X; - - // Proportional smooth zoom supporting both discrete mouse wheel ticks and continuous trackpad pinch gestures - double zoomDeltaFactor; - if (Math.Abs(effectiveDelta) >= 1.0) - { - // Discrete mouse wheel tick (e.g. standard external wheel) - zoomDeltaFactor = effectiveDelta > 0 ? 1.15 : (1.0 / 1.15); - } - else if (Math.Abs(effectiveDelta) > 0.0001) - { - // High-precision smooth trackpad pinch / scroll gesture - zoomDeltaFactor = Math.Pow(1.002, effectiveDelta * 100); - } - else - { - zoomDeltaFactor = 1.0; - } - - double newZoom = Math.Clamp(Math.Round(oldZoom * zoomDeltaFactor, 3), 0.1, 5.0); - - if (Math.Abs(newZoom - oldZoom) > 0.001) - { - var mouseInViewer = e.GetPosition(CanvasScrollViewer); - double ratio = newZoom / oldZoom; - var baseOffset = EffectiveCanvasOffset; - double targetOffsetX = (baseOffset.X + mouseInViewer.X) * ratio - mouseInViewer.X; - double targetOffsetY = (baseOffset.Y + mouseInViewer.Y) * ratio - mouseInViewer.Y; - - RequestZoomLevelChange(newZoom, new Vector(Math.Max(0, targetOffsetX), Math.Max(0, targetOffsetY))); - } - - UpdateViewportOnPlacementService(); - e.Handled = true; - } - else if (e.KeyModifiers.HasFlag(KeyModifiers.Shift) && CanvasScrollViewer != null) - { - // Shift + Wheel -> Horizontal scroll - double delta = e.Delta.Y != 0 ? e.Delta.Y : e.Delta.X; - CanvasScrollViewer.Offset = new Vector( - Math.Max(0, CanvasScrollViewer.Offset.X - (delta * 40)), - CanvasScrollViewer.Offset.Y); - e.Handled = true; - } - } - - private void OnCanvasTouchPadGestureMagnify(object? sender, PointerDeltaEventArgs e) - { - if (ViewModel != null && CanvasScrollViewer != null) - { - double oldZoom = EffectiveZoomLevel; - double delta = Math.Abs(e.Delta.Y) >= Math.Abs(e.Delta.X) ? e.Delta.Y : e.Delta.X; - if (delta == 0 && (e.Delta.X != 0 || e.Delta.Y != 0)) - { - delta = e.Delta.X != 0 ? e.Delta.X : e.Delta.Y; - } - - double zoomFactor = 1.0 + delta; - double newZoom = Math.Clamp(Math.Round(oldZoom * zoomFactor, 3), 0.1, 5.0); - - if (Math.Abs(newZoom - oldZoom) > 0.001) - { - var mouseInViewer = e.GetPosition(CanvasScrollViewer); - double ratio = newZoom / oldZoom; - var baseOffset = EffectiveCanvasOffset; - double targetOffsetX = (baseOffset.X + mouseInViewer.X) * ratio - mouseInViewer.X; - double targetOffsetY = (baseOffset.Y + mouseInViewer.Y) * ratio - mouseInViewer.Y; - - RequestZoomLevelChange(newZoom, new Vector(Math.Max(0, targetOffsetX), Math.Max(0, targetOffsetY))); - } - - UpdateViewportOnPlacementService(); - e.Handled = true; - } - } - - private void OnCanvasPinch(object? sender, PinchEventArgs e) - { - if (ViewModel != null && CanvasScrollViewer != null) - { - if (!_isPinching) - { - _isPinching = true; - _pinchStartZoom = ViewModel.ZoomLevel > 0 ? ViewModel.ZoomLevel : 1.0; - } - - // e.Scale is the total cumulative scale of the pinch gesture since start (starts at 1.0) - double targetZoom = Math.Clamp(Math.Round(_pinchStartZoom * e.Scale, 3), 0.1, 5.0); - double oldZ = EffectiveZoomLevel; - if (Math.Abs(targetZoom - oldZ) > 0.002 && oldZ > 0) - { - var origin = e.ScaleOrigin; - double ratio = targetZoom / oldZ; - var baseOffset = EffectiveCanvasOffset; - double newOffsetX = (baseOffset.X + origin.X) * ratio - origin.X; - double newOffsetY = (baseOffset.Y + origin.Y) * ratio - origin.Y; - RequestZoomLevelChange(targetZoom, new Vector(Math.Max(0, newOffsetX), Math.Max(0, newOffsetY))); - } - e.Handled = true; - } - } - - private void OnCanvasPinchEnded(object? sender, PinchEndedEventArgs e) - { - _isPinching = false; - FlushPendingZoom(); - UpdateViewportOnPlacementService(); - e.Handled = true; - } - - private void OnCanvasDoubleTapped(object? sender, TappedEventArgs e) - { - if (ViewModel == null || CanvasScrollViewer == null) return; - - if (ViewModel.ActiveToolMode == ToolMode.Pan || _isSpacePressed) - { - ViewModel.FitToPageDynamic(CanvasScrollViewer.Viewport.Width, CanvasScrollViewer.Viewport.Height); - e.Handled = true; - return; - } - else if (ViewModel.ActiveToolMode == ToolMode.Zoom) - { - ViewModel.ResetZoom(); - e.Handled = true; - return; - } - - // Ignore double-taps originating inside overlays (CanvasTextHudView, FindReplaceBarView) - if (e.Source is Visual sourceVisual && (sourceVisual.FindAncestorOfType() != null || sourceVisual.FindAncestorOfType() != null)) - { - return; - } - - // Direct in-place editing trigger on double-click - if (ViewModel.CurrentPage == null || PageElementsCanvas == null) return; - - // 1. Check if the double-tap happened directly on an element visual or its ancestor - ElementViewModelBase? targetElement = null; - if (e.Source is Visual visual) - { - targetElement = (visual as Control)?.DataContext as ElementViewModelBase ?? - visual.FindAncestorOfType()?.DataContext as ElementViewModelBase; - } - - // 2. If not found from visual source, check geometric coordinates on the canvas - if (targetElement == null) - { - var canvasPos = e.GetPosition(PageElementsCanvas); - double zoom = ViewModel.ZoomLevel > 0 ? ViewModel.ZoomLevel : 1.0; - double docX = canvasPos.X / zoom; - double docY = canvasPos.Y / zoom; - - targetElement = ViewModel.CurrentPage.Elements - .Where(el => !el.IsLocked && docX >= el.X && docX <= el.X + el.Width && docY >= el.Y && docY <= el.Y + el.Height) - .OrderByDescending(el => el.ZIndex) - .FirstOrDefault(); - } - - if (targetElement == null) - { - targetElement = ViewModel.CurrentPage.SelectedElement; - } - - if (targetElement != null && !targetElement.IsLocked) - { - ViewModel.CurrentPage.SelectElement(targetElement); - - if (targetElement is TextElementViewModel textVm) - { - textVm.IsInEditMode = true; - e.Handled = true; - - Avalonia.Threading.Dispatcher.UIThread.Post(() => - { - FocusInPlaceTextBox(textVm); - }, Avalonia.Threading.DispatcherPriority.Input); - } - else if (targetElement is ShapeElementViewModel shapeVm) - { - shapeVm.IsInEditMode = true; - e.Handled = true; - - Avalonia.Threading.Dispatcher.UIThread.Post(() => - { - FocusInPlaceTextBox(shapeVm); - }, Avalonia.Threading.DispatcherPriority.Input); - } - else if (targetElement is StickyNoteElementViewModel stickyVm) - { - stickyVm.IsInEditMode = true; - e.Handled = true; - - Avalonia.Threading.Dispatcher.UIThread.Post(() => - { - FocusInPlaceTextBox(stickyVm); - }, Avalonia.Threading.DispatcherPriority.Loaded); - } - else if (targetElement is MathElementViewModel mathVm) - { - mathVm.IsInEditMode = true; - e.Handled = true; - - Avalonia.Threading.Dispatcher.UIThread.Post(() => - { - FocusInPlaceTextBox(mathVm); - }, Avalonia.Threading.DispatcherPriority.Loaded); - } - } - } - - private void OnCanvasBackgroundPointerPressed(object? sender, PointerPressedEventArgs e) - { - if (ViewModel?.CurrentPage == null || PageElementsCanvas == null) return; - Focus(); - - var pointerPoint = e.GetCurrentPoint(this); - - // Middle button click, Spacebar held, or Pan Tool mode => Pan mode - if (_isSpacePressed || pointerPoint.Properties.IsMiddleButtonPressed || ViewModel.ActiveToolMode == ToolMode.Pan) - { - _isPanning = true; - _panStart = e.GetPosition(this); - if (CanvasScrollViewer != null) - { - _scrollStart = new Vector(CanvasScrollViewer.Offset.X, CanvasScrollViewer.Offset.Y); - } - Cursor = new Cursor(StandardCursorType.Hand); - e.Handled = true; - return; - } - - // Zoom Tool mode => Click to Zoom In / Alt-Click to Zoom Out - if (ViewModel.ActiveToolMode == ToolMode.Zoom) - { - if (pointerPoint.Properties.IsLeftButtonPressed) - { - bool isAlt = e.KeyModifiers.HasFlag(KeyModifiers.Alt); - if (isAlt) - { - ViewModel.ZoomOut(); - } - else - { - ViewModel.ZoomIn(); - } - UpdateViewportOnPlacementService(); - e.Handled = true; - return; - } - } - - var pos = e.GetPosition(PageElementsCanvas); - double zoom = ViewModel.ZoomLevel > 0 ? ViewModel.ZoomLevel : 1.0; - double canvasX = Math.Max(0, pos.X / zoom); - double canvasY = Math.Max(0, pos.Y / zoom); - - ViewModel.LastCanvasClickPoint = (canvasX, canvasY); - - // Register right-click point for context-menu placement and AI Studio point targeting - if (pointerPoint.Properties.IsRightButtonPressed) - { - ViewModel.SmartPlacement.SetContextMenuPointer(canvasX, canvasY); - } - else if (ViewModel.AiAssistant.IsPointTargetMode) - { - ViewModel.AiAssistant.TargetPointOnPage(canvasX, canvasY, ViewModel.CurrentPage); - } - - if (ViewModel.ActiveToolMode == ToolMode.Draw || ViewModel.ActiveToolMode == ToolMode.Highlight) - { - bool isHighlighter = ViewModel.ActiveToolMode == ToolMode.Highlight; - var ink = new InkElementViewModel - { - X = Math.Max(0, canvasX), - Y = Math.Max(0, canvasY), - Width = 20, - Height = isHighlighter ? 18 : 6, - StrokeColorHex = isHighlighter ? "#FEF08A" : "#0F6CBD", - StrokeThickness = isHighlighter ? 14.0 : 3.0, - Opacity = isHighlighter ? 0.45 : 1.0, - IsHighlighter = isHighlighter - }; - - ViewModel.AddElementWithUndo(ink, isHighlighter ? "Added Highlighter Stroke" : "Added Ink Stroke"); - _isResizingHandle = true; - _activeResizeHandle = "bottomright"; - _draggedElement = ink; - _resizeStartX = ink.X; - _resizeStartY = ink.Y; - _resizeStartW = ink.Width; - _resizeStartH = ink.Height; - _lastPointerPosition = pos; - e.Pointer.Capture(this); - e.Handled = true; - return; - } - - // Marquee Selection Drag on background - bool isToggle = e.KeyModifiers.HasFlag(KeyModifiers.Shift) || e.KeyModifiers.HasFlag(KeyModifiers.Control) || e.KeyModifiers.HasFlag(KeyModifiers.Meta); - if (!isToggle) - { - ViewModel.CurrentPage.ClearSelection(); - } - - if (pointerPoint.Properties.IsLeftButtonPressed && e.Pointer.Type != PointerType.Touch) - { - _isMarqueeSelecting = true; - _marqueeStartPoint = pos; - if (MarqueeSelectionBox != null) - { - Canvas.SetLeft(MarqueeSelectionBox, pos.X); - Canvas.SetTop(MarqueeSelectionBox, pos.Y); - MarqueeSelectionBox.Width = 0; - MarqueeSelectionBox.Height = 0; - MarqueeSelectionBox.IsVisible = true; - } - e.Pointer.Capture(this); - e.Handled = true; - } - } - - private void OnElementPointerPressed(object? sender, PointerPressedEventArgs e) - { - if (_isSpacePressed || e.GetCurrentPoint(this).Properties.IsMiddleButtonPressed) - { - _isPanning = true; - _panStart = e.GetPosition(this); - if (CanvasScrollViewer != null) - { - _scrollStart = new Vector(CanvasScrollViewer.Offset.X, CanvasScrollViewer.Offset.Y); - } - e.Pointer.Capture(this); - e.Handled = true; - return; - } - - if (sender is Control control && control.DataContext is ElementViewModelBase elementVm) - { - // If the clicked element is locked (e.g. background watermark or full-page frame), - // check if there is an unlocked element under the cursor to select and edit instead. - if (elementVm.IsLocked && PageElementsCanvas != null && ViewModel?.CurrentPage != null) - { - var canvasPos = e.GetPosition(PageElementsCanvas); - double zoom = ViewModel.ZoomLevel > 0 ? ViewModel.ZoomLevel : 1.0; - double docX = canvasPos.X / zoom; - double docY = canvasPos.Y / zoom; - - var topUnlocked = ViewModel.CurrentPage.Elements - .Where(el => !el.IsLocked && docX >= el.X && docX <= el.X + el.Width && docY >= el.Y && docY <= el.Y + el.Height) - .OrderByDescending(el => el.ZIndex) - .FirstOrDefault(); - - if (topUnlocked != null) - { - elementVm = topUnlocked; - } - } - - bool wasAlreadySelected = elementVm.IsSelected; - bool isToggle = e.KeyModifiers.HasFlag(KeyModifiers.Shift) || e.KeyModifiers.HasFlag(KeyModifiers.Control) || e.KeyModifiers.HasFlag(KeyModifiers.Meta); - - if (isToggle) - { - ViewModel?.CurrentPage?.ToggleElementSelection(elementVm); - } - else if (!elementVm.IsSelected) - { - ViewModel?.CurrentPage?.SelectElement(elementVm); - } - - if (!elementVm.IsInEditMode) - { - Focus(); - } - - if (e.GetCurrentPoint(this).Properties.IsRightButtonPressed && PageElementsCanvas != null && ViewModel != null) - { - var pos = e.GetPosition(PageElementsCanvas); - double zoom = ViewModel.ZoomLevel > 0 ? ViewModel.ZoomLevel : 1.0; - ViewModel.SmartPlacement.SetContextMenuPointer(pos.X / zoom, pos.Y / zoom); - } - - if (e.GetCurrentPoint(this).Properties.IsLeftButtonPressed && ViewModel?.CurrentPage != null && !elementVm.IsLocked) - { - if (elementVm.IsInEditMode) - { - return; - } - - _isPotentialDrag = true; - _potentialDragElement = elementVm; - _potentialDragStartPos = e.GetPosition(PageElementsCanvas); - _wasAlreadySelectedOnPress = wasAlreadySelected; - _lastPointerPosition = _potentialDragStartPos; - e.Handled = true; - } - } - } - - private void OnHandlePointerPressed(object? sender, PointerPressedEventArgs e) - { - if (sender is Control control && control.Tag is string handleName && control.DataContext is ElementViewModelBase elementVm) - { - Focus(); - _isResizingHandle = true; - _activeResizeHandle = handleName; - _draggedElement = elementVm; - _resizeStartX = elementVm.X; - _resizeStartY = elementVm.Y; - _resizeStartW = elementVm.Width; - _resizeStartH = elementVm.Height; - _lastPointerPosition = e.GetPosition(PageElementsCanvas); - e.Pointer.Capture(this); - e.Handled = true; - } - } - - private void FocusInPlaceTextBox(ElementViewModelBase elementVm) - { - if (PageElementsCanvas == null) return; - - var textBox = PageElementsCanvas.GetVisualDescendants() - .OfType() - .FirstOrDefault(tb => tb.DataContext == elementVm && tb.IsVisible); - - if (textBox != null) - { - textBox.Focus(); - textBox.CaretIndex = textBox.Text?.Length ?? 0; - textBox.SelectAll(); - } - } - - public static TextBox? ActiveInPlaceTextBox { get; private set; } - - private static void UpdateSelectionFromTextBox(TextBox textBox) - { - if (textBox.DataContext is TextElementViewModel textVm) - { - int start = Math.Min(textBox.SelectionStart, textBox.SelectionEnd); - int end = Math.Max(textBox.SelectionStart, textBox.SelectionEnd); - int len = end - start; - - // If TextBox temporarily lost focus and reports 0 length while ViewModel already has a selection, - // preserve the selection so toolbar/HUD commands can format it! - if (!textBox.IsFocused && len == 0 && textVm.HasTextSelection) - { - return; - } - - string text = textBox.Text ?? ""; - string sel = len > 0 && start + len <= text.Length - ? text.Substring(start, len) - : string.Empty; - - textVm.UpdateTextSelection(start, len, sel); - } - } - - private void OnInPlaceTextBoxAttached(object? sender, VisualTreeAttachmentEventArgs e) - { - if (sender is TextBox textBox) - { - textBox.GotFocus += (s, args) => - { - ActiveInPlaceTextBox = textBox; - UpdateSelectionFromTextBox(textBox); - if (textBox.DataContext is ElementViewModelBase el) - { - _initialEditContents[el.Id] = textBox.Text ?? ""; - } - }; - - textBox.LostFocus += (s, args) => - { - if (textBox.DataContext is TextElementViewModel textVm && textVm.IsInEditMode) - { - // User is still in edit mode (e.g. interacting with HUD, Ribbon, or Sidebar). - // Keep ActiveInPlaceTextBox assigned so inline formatting commands continue working! - return; - } - - if (ActiveInPlaceTextBox == textBox) - { - ActiveInPlaceTextBox = null; - } - }; - - textBox.PropertyChanged += (s, args) => - { - if (args.Property == Visual.IsVisibleProperty && textBox.IsVisible) - { - ActiveInPlaceTextBox = textBox; - if (textBox.DataContext is ElementViewModelBase el) - { - _initialEditContents[el.Id] = textBox.Text ?? ""; - } - - Avalonia.Threading.Dispatcher.UIThread.Post(() => - { - textBox.Focus(); - textBox.CaretIndex = textBox.Text?.Length ?? 0; - textBox.SelectAll(); - UpdateSelectionFromTextBox(textBox); - }, Avalonia.Threading.DispatcherPriority.Input); - } - else if (args.Property == TextBox.SelectionStartProperty || args.Property == TextBox.SelectionEndProperty || args.Property == TextBox.TextProperty) - { - UpdateSelectionFromTextBox(textBox); - } - }; - - textBox.PointerReleased += (s, args) => - { - UpdateSelectionFromTextBox(textBox); - }; - - textBox.KeyUp += (s, args) => - { - UpdateSelectionFromTextBox(textBox); - }; - - if (textBox.IsVisible) - { - ActiveInPlaceTextBox = textBox; - if (textBox.DataContext is ElementViewModelBase el) - { - _initialEditContents[el.Id] = textBox.Text ?? ""; - } - - Avalonia.Threading.Dispatcher.UIThread.Post(() => - { - textBox.Focus(); - textBox.CaretIndex = textBox.Text?.Length ?? 0; - textBox.SelectAll(); - UpdateSelectionFromTextBox(textBox); - }, Avalonia.Threading.DispatcherPriority.Input); - } - } - } - - private void OnTextElementDoubleTapped(object? sender, TappedEventArgs e) - { - if (sender is Control control && control.DataContext is TextElementViewModel textVm) - { - if (textVm.IsLocked) return; - - if (textVm.Spans != null && textVm.Spans.Count > 0) - { - textVm.Text = textVm.GetMarkdownText(); - } - - textVm.IsInEditMode = true; - e.Handled = true; - - Avalonia.Threading.Dispatcher.UIThread.Post(() => - { - FocusInPlaceTextBox(textVm); - }, Avalonia.Threading.DispatcherPriority.Input); - } - } - - private void OnTextBoxLostFocus(object? sender, RoutedEventArgs e) - { - if (sender is Control control && control.DataContext is TextElementViewModel textVm) - { - // If the element is still in edit mode (e.g. interacting with HUD, Ribbon, or Sidebar), - // DO NOT exit edit mode or wipe spans! - if (textVm.IsInEditMode) - { - return; - } - - _initialEditContents.TryGetValue(textVm.Id, out var oldTxt); - string finalPlain = textVm.Text ?? ""; - var finalSpans = textVm.Spans?.Select(s => s.Clone()).ToList(); - - if (finalPlain != oldTxt) - { - _initialEditContents[textVm.Id] = finalPlain; - var savedSpans = finalSpans; - ViewModel?.UndoRedo.RecordAction( - "Edit Text", - () => { - textVm.Text = oldTxt ?? ""; - textVm.Spans = null; - }, - () => { - textVm.Text = finalPlain; - textVm.Spans = savedSpans != null ? savedSpans.Select(s => s.Clone()).ToList() : null; - } - ); - } - } - } - - private void OnShapeElementDoubleTapped(object? sender, TappedEventArgs e) - { - if (sender is Control control && control.DataContext is ShapeElementViewModel shapeVm) - { - shapeVm.IsInEditMode = true; - e.Handled = true; - - Avalonia.Threading.Dispatcher.UIThread.Post(() => - { - FocusInPlaceTextBox(shapeVm); - }, Avalonia.Threading.DispatcherPriority.Input); - } - } - - private void OnShapeTextBoxLostFocus(object? sender, RoutedEventArgs e) - { - if (sender is Control control && control.DataContext is ShapeElementViewModel shapeVm) - { - string currentLabel = shapeVm.Label ?? ""; - if (_initialEditContents.TryGetValue(shapeVm.Id, out var oldTxt) && currentLabel != oldTxt) - { - _initialEditContents[shapeVm.Id] = currentLabel; - ViewModel?.UndoRedo.RecordAction( - "Edit Shape Label", - () => shapeVm.Label = oldTxt, - () => shapeVm.Label = currentLabel - ); - } - } - } - - private void OnTableCellLostFocus(object? sender, RoutedEventArgs e) - { - // Table cells have two-way binding directly to TableHeaderItem/TableCellItem - } - - private void OnStickyNoteTextBoxLostFocus(object? sender, RoutedEventArgs e) - { - // Sticky note text has two-way binding directly to NoteText - } - - private void OnMathElementDoubleTapped(object? sender, TappedEventArgs e) - { - if (sender is Control control && control.DataContext is MathElementViewModel mathVm) - { - ViewModel?.OpenMathStudioCommand.Execute(mathVm); - e.Handled = true; - } - } - - private void OnMathTextBoxLostFocus(object? sender, RoutedEventArgs e) - { - if (sender is Control control && control.DataContext is MathElementViewModel mathVm) - { - if (_initialEditContents.TryGetValue(mathVm.Id, out var oldFormula) && mathVm.Formula != oldFormula) - { - string newFormula = mathVm.Formula; - _initialEditContents[mathVm.Id] = newFormula; - ViewModel?.UndoRedo.RecordAction( - "Edit Formula", - () => { mathVm.Formula = oldFormula; mathVm.RenderSvg(); }, - () => { mathVm.Formula = newFormula; mathVm.RenderSvg(); } - ); - } - mathVm.IsInEditMode = false; - mathVm.RenderSvg(); - } - } - - private void OnGlobalPointerMoved(object? sender, PointerEventArgs e) - { - if (_isPanning && CanvasScrollViewer != null) - { - var curPos = e.GetPosition(this); - var delta = curPos - _panStart; - CanvasScrollViewer.Offset = new Vector( - Math.Max(0, _scrollStart.X - delta.X), - Math.Max(0, _scrollStart.Y - delta.Y)); - e.Handled = true; - return; - } - - if (PageElementsCanvas != null && ViewModel != null) - { - var pPos = e.GetPosition(PageElementsCanvas); - double z = ViewModel.ZoomLevel > 0 ? ViewModel.ZoomLevel : 1.0; - ViewModel.CursorCanvasX = Math.Max(0, pPos.X / z); - ViewModel.CursorCanvasY = Math.Max(0, pPos.Y / z); - } - - if (_isMarqueeSelecting && PageElementsCanvas != null && ViewModel?.CurrentPage != null) - { - var curPos = e.GetPosition(PageElementsCanvas); - double minX = Math.Min(_marqueeStartPoint.X, curPos.X); - double minY = Math.Min(_marqueeStartPoint.Y, curPos.Y); - double w = Math.Abs(curPos.X - _marqueeStartPoint.X); - double h = Math.Abs(curPos.Y - _marqueeStartPoint.Y); - - // The box itself tracks the cursor on every move (cheap, needs to feel precise). - // Recomputing which elements intersect it is an O(n) scan over the whole page - // followed by another O(n) pass inside SelectElements, so that part is throttled — - // OnGlobalPointerReleased always does one final, unthrottled pass so the committed - // selection is never stale. - if (MarqueeSelectionBox != null) - { - Canvas.SetLeft(MarqueeSelectionBox, minX); - Canvas.SetTop(MarqueeSelectionBox, minY); - MarqueeSelectionBox.Width = w; - MarqueeSelectionBox.Height = h; - } - - var now = DateTime.UtcNow; - if ((now - _lastMarqueeSelectionUpdate).TotalMilliseconds >= 16) - { - _lastMarqueeSelectionUpdate = now; - UpdateMarqueeSelection(minX, minY, w, h); - } - - e.Handled = true; - return; - } - - if (_isPotentialDrag && !_isDraggingElement && PageElementsCanvas != null && ViewModel?.CurrentPage != null) - { - var curPos = e.GetPosition(PageElementsCanvas); - double distSq = Math.Pow(curPos.X - _potentialDragStartPos.X, 2) + Math.Pow(curPos.Y - _potentialDragStartPos.Y, 2); - if (distSq > 9.0) // 3px drag threshold - { - _isDraggingElement = true; - _draggedElement = _potentialDragElement; - _draggedElements = ViewModel.CurrentPage.SelectedElements.Where(el => !el.IsLocked).ToList(); - if (_draggedElement != null && !_draggedElements.Contains(_draggedElement)) _draggedElements.Add(_draggedElement); - - if (_draggedElement != null && !string.IsNullOrEmpty(_draggedElement.GroupId)) - { - var groupMembers = ViewModel.CurrentPage.Elements.Where(el => el.GroupId == _draggedElement.GroupId && !el.IsLocked); - foreach (var gm in groupMembers) - { - if (!_draggedElements.Contains(gm)) _draggedElements.Add(gm); - } - } - - _dragStartPositions = _draggedElements.Select(el => (Element: el, el.X, el.Y)).ToList(); - if (_draggedElement != null) - { - _dragStartElementX = _draggedElement.X; - _dragStartElementY = _draggedElement.Y; - } - _lastPointerPosition = curPos; - e.Pointer.Capture(this); - } - } - - if (PageElementsCanvas == null || ViewModel?.CurrentPage == null) return; - if (!_isResizingHandle && !_isDraggingElement) return; - - var currentPos = e.GetPosition(PageElementsCanvas); - double deltaX = currentPos.X - _lastPointerPosition.X; - double deltaY = currentPos.Y - _lastPointerPosition.Y; - - double zoom = ViewModel.ZoomLevel > 0 ? ViewModel.ZoomLevel : 1.0; - deltaX /= zoom; - deltaY /= zoom; - - if (_isResizingHandle && _draggedElement != null && !string.IsNullOrEmpty(_activeResizeHandle)) - { - _draggedElement.Resize(_activeResizeHandle, deltaX, deltaY); - _lastPointerPosition = currentPos; - ViewModel.CurrentPage.UpdateSelectionBoundingBox(); - } - else if (_isDraggingElement && _draggedElements.Count > 0) - { - foreach (var el in _draggedElements) - { - el.MoveBy(deltaX, deltaY, ViewModel.CurrentPage.Width, ViewModel.CurrentPage.Height); - } - _lastPointerPosition = currentPos; - ViewModel.CurrentPage.UpdateSelectionBoundingBox(); - } - } - - private void OnCanvasPointerMoved(object? sender, PointerEventArgs e) - { - // Handled by tunnel/bubble or direct event - } - - private void UpdateMarqueeSelection(double boxLeft, double boxTop, double boxWidth, double boxHeight) - { - if (ViewModel?.CurrentPage == null) return; - - double z = ViewModel.ZoomLevel > 0 ? ViewModel.ZoomLevel : 1.0; - var marqueeRect = new Rect(boxLeft / z, boxTop / z, Math.Max(1, boxWidth / z), Math.Max(1, boxHeight / z)); - - var intersecting = ViewModel.CurrentPage.Elements - .Where(el => marqueeRect.Intersects(new Rect(el.X, el.Y, Math.Max(1, el.Width), Math.Max(1, el.Height)))) - .ToList(); - - ViewModel.CurrentPage.SelectElements(intersecting); - } - - private void OnGlobalPointerReleased(object? sender, PointerReleasedEventArgs e) - { - if (_isPotentialDrag && !_isDraggingElement && !_isResizingHandle && !_isMarqueeSelecting) - { - // Click without drag occurred! - if (_wasAlreadySelectedOnPress && _potentialDragElement != null && !_potentialDragElement.IsInEditMode) - { - // Second click on already selected element enters in-place edit mode! - if (_potentialDragElement is TextElementViewModel textVm) - { - textVm.IsInEditMode = true; - Avalonia.Threading.Dispatcher.UIThread.Post(() => FocusInPlaceTextBox(textVm), Avalonia.Threading.DispatcherPriority.Input); - } - else if (_potentialDragElement is ShapeElementViewModel shapeVm) - { - shapeVm.IsInEditMode = true; - Avalonia.Threading.Dispatcher.UIThread.Post(() => FocusInPlaceTextBox(shapeVm), Avalonia.Threading.DispatcherPriority.Input); - } - } - } - _isPotentialDrag = false; - _potentialDragElement = null; - - if (_isMarqueeSelecting) - { - // Final, unthrottled pass — guarantees the committed selection matches exactly - // where the box ended up, regardless of the move handler's throttle timing. Only - // for an actual drag: a plain click (no move at all, box still at its 0x0 press - // size) must leave selection untouched, matching the previous behavior — otherwise - // a shift/ctrl-click with no drag would wipe out the existing selection. - if (MarqueeSelectionBox != null) - { - if (MarqueeSelectionBox.Width > 2 || MarqueeSelectionBox.Height > 2) - { - UpdateMarqueeSelection(Canvas.GetLeft(MarqueeSelectionBox), Canvas.GetTop(MarqueeSelectionBox), MarqueeSelectionBox.Width, MarqueeSelectionBox.Height); - } - MarqueeSelectionBox.IsVisible = false; - } - _isMarqueeSelecting = false; - } - else if (_isResizingHandle && _draggedElement != null) - { - var el = _draggedElement; - if (ViewModel != null && ViewModel.SnapToGrid) - { - double snap = (double)(int)ViewModel.GridSnapSize; - if (snap > 1) - { - el.X = Math.Round(el.X / snap) * snap; - el.Y = Math.Round(el.Y / snap) * snap; - el.Width = Math.Max(snap, Math.Round(el.Width / snap) * snap); - el.Height = Math.Max(snap, Math.Round(el.Height / snap) * snap); - } - } - - double fromX = _resizeStartX, fromY = _resizeStartY, fromW = _resizeStartW, fromH = _resizeStartH; - double toX = el.X, toY = el.Y, toW = el.Width, toH = el.Height; - if (Math.Abs(toW - fromW) > 0.5 || Math.Abs(toH - fromH) > 0.5 || Math.Abs(toX - fromX) > 0.5 || Math.Abs(toY - fromY) > 0.5) - { - ViewModel?.UndoRedo.RecordAction( - $"Resize {el.DisplayName}", - () => { el.X = fromX; el.Y = fromY; el.Width = fromW; el.Height = fromH; ViewModel?.CurrentPage?.UpdateSelectionBoundingBox(); }, - () => { el.X = toX; el.Y = toY; el.Width = toW; el.Height = toH; ViewModel?.CurrentPage?.UpdateSelectionBoundingBox(); } - ); - } - } - else if (_isDraggingElement && _draggedElements.Count > 0) - { - if (ViewModel != null && ViewModel.SnapToGrid) - { - double snap = (double)(int)ViewModel.GridSnapSize; - if (snap > 1) - { - foreach (var el in _draggedElements) - { - el.X = Math.Round(el.X / snap) * snap; - el.Y = Math.Round(el.Y / snap) * snap; - } - } - } - - var initialPositions = _dragStartPositions.ToList(); - var finalPositions = _draggedElements.Select(el => (Element: el, el.X, el.Y)).ToList(); - - bool anyMoved = false; - for (int i = 0; i < initialPositions.Count; i++) - { - if (Math.Abs(initialPositions[i].X - finalPositions[i].X) > 0.5 || Math.Abs(initialPositions[i].Y - finalPositions[i].Y) > 0.5) - { - anyMoved = true; - break; - } - } - - if (anyMoved) - { - string desc = _draggedElements.Count == 1 ? $"Move {_draggedElements[0].DisplayName}" : $"Move {_draggedElements.Count} Elements"; - ViewModel?.UndoRedo.RecordAction( - desc, - () => { - foreach (var p in initialPositions) { p.Element.X = p.X; p.Element.Y = p.Y; } - ViewModel?.CurrentPage?.UpdateSelectionBoundingBox(); - }, - () => { - foreach (var p in finalPositions) { p.Element.X = p.X; p.Element.Y = p.Y; } - ViewModel?.CurrentPage?.UpdateSelectionBoundingBox(); - } - ); - } - } - - if (e.Pointer.Captured == this) - { - e.Pointer.Capture(null); - } - _isDraggingElement = false; - _isResizingHandle = false; - _activeResizeHandle = null; - _draggedElement = null; - _draggedElements.Clear(); - _dragStartPositions.Clear(); - _isPanning = false; - } - - protected override void OnPointerCaptureLost(PointerCaptureLostEventArgs e) - { - base.OnPointerCaptureLost(e); - if (MarqueeSelectionBox != null) MarqueeSelectionBox.IsVisible = false; - _isMarqueeSelecting = false; - _isDraggingElement = false; - _isResizingHandle = false; - _activeResizeHandle = null; - _draggedElement = null; - _draggedElements.Clear(); - _dragStartPositions.Clear(); - _isPanning = false; - } - - private void OnCanvasKeyUp(object? sender, KeyEventArgs e) - { - if (e.Key == Key.Space) - { - _isSpacePressed = false; - Cursor = Cursor.Default; - } - } - - private void OnCanvasKeyDown(object? sender, KeyEventArgs e) - { - if (ViewModel?.CurrentPage == null) return; - - var selected = ViewModel.CurrentPage.SelectedElement; - - // Check if user is actively typing inside any TextBox / TextPresenter - var topLevel = TopLevel.GetTopLevel(this); - var focused = topLevel?.FocusManager?.GetFocusedElement(); - bool isFocusedInTextBox = focused is TextBox || - focused is Avalonia.Controls.Presenters.TextPresenter || - (focused is Control ctrl && ctrl.FindAncestorOfType() != null); - - bool isSourceTextBox = e.Source is TextBox || - e.Source is Avalonia.Controls.Presenters.TextPresenter || - (e.Source is Control sCtrl && sCtrl.FindAncestorOfType() != null); - - bool isEditingText = isFocusedInTextBox || isSourceTextBox || (selected != null && selected.IsInEditMode); - - if (isEditingText) - { - if (e.Key == Key.Escape) - { - if (selected != null) - { - selected.IsInEditMode = false; - } - e.Handled = true; - } - else if (e.Key == Key.Enter && (e.KeyModifiers.HasFlag(KeyModifiers.Control) || e.KeyModifiers.HasFlag(KeyModifiers.Meta))) - { - if (selected != null) - { - selected.IsInEditMode = false; - } - e.Handled = true; - } - // Allow all typing, backspace, delete, arrows, and shortcuts to flow to the TextBox - return; - } - - if (e.Key == Key.Space && !_isSpacePressed) - { - _isSpacePressed = true; - Cursor = new Cursor(StandardCursorType.Hand); - return; - } - - bool isCtrlOrCmd = e.KeyModifiers.HasFlag(KeyModifiers.Control) || e.KeyModifiers.HasFlag(KeyModifiers.Meta); - double step = e.KeyModifiers.HasFlag(KeyModifiers.Shift) ? 10.0 : 1.0; - - if (isCtrlOrCmd) - { - switch (e.Key) - { - case Key.D0: - case Key.NumPad0: - ViewModel.ResetZoom(); - e.Handled = true; - break; - case Key.D1: - case Key.NumPad1: - ViewModel.FitToWidthDynamic(CanvasScrollViewer?.Viewport.Width ?? 800); - e.Handled = true; - break; - case Key.D9: - case Key.NumPad9: - ViewModel.FitToPageDynamic(CanvasScrollViewer?.Viewport.Width ?? 800, CanvasScrollViewer?.Viewport.Height ?? 800); - e.Handled = true; - break; - case Key.D2: - case Key.NumPad2: - ViewModel.FitToWidthDynamic(CanvasScrollViewer?.Viewport.Width ?? 800); - e.Handled = true; - break; - case Key.OemPlus: - case Key.Add: - ViewModel.ZoomIn(); - e.Handled = true; - break; - case Key.OemMinus: - case Key.Subtract: - ViewModel.ZoomOut(); - e.Handled = true; - break; - case Key.A: - ViewModel.CurrentPage?.SelectAll(); - e.Handled = true; - break; - case Key.C: - ViewModel.CopyCommand.Execute(null); - e.Handled = true; - break; - case Key.X: - ViewModel.CutCommand.Execute(null); - e.Handled = true; - break; - case Key.V: - ViewModel.PasteCommand.Execute(null); - e.Handled = true; - break; - case Key.D: - ViewModel.DuplicateCommand.Execute(null); - e.Handled = true; - break; - case Key.Z: - ViewModel.UndoCommand.Execute(null); - e.Handled = true; - break; - case Key.Y: - ViewModel.RedoCommand.Execute(null); - e.Handled = true; - break; - case Key.S: - ViewModel.SaveProjectCommand.Execute(null); - e.Handled = true; - break; - case Key.OemCloseBrackets: - ViewModel.Inspector.BringToFrontCommand.Execute(null); - e.Handled = true; - break; - case Key.OemOpenBrackets: - ViewModel.Inspector.SendToBackCommand.Execute(null); - e.Handled = true; - break; - } - } - else if (selected != null || (ViewModel.CurrentPage?.SelectedElements.Count ?? 0) > 0) - { - // If user starts typing any alphanumeric or punctuation character while a text element is selected, - // immediately enter in-place edit mode and route focus to the TextBox! - if (selected is TextElementViewModel textEl && !textEl.IsInEditMode && !isCtrlOrCmd && !e.KeyModifiers.HasFlag(KeyModifiers.Alt)) - { - bool isPrintable = (e.Key >= Key.A && e.Key <= Key.Z) || - (e.Key >= Key.D0 && e.Key <= Key.D9) || - (e.Key >= Key.NumPad0 && e.Key <= Key.NumPad9) || - e.Key == Key.Space || e.Key == Key.Enter || e.Key == Key.F2 || - e.Key == Key.OemPeriod || e.Key == Key.OemComma || e.Key == Key.OemMinus || e.Key == Key.OemPlus; - - if (isPrintable) - { - textEl.IsInEditMode = true; - - Avalonia.Threading.Dispatcher.UIThread.Post(() => - { - FocusInPlaceTextBox(textEl); - }, Avalonia.Threading.DispatcherPriority.Input); - - if (e.Key == Key.Enter || e.Key == Key.F2) - { - e.Handled = true; - return; - } - return; - } - } - else if (selected is ShapeElementViewModel shapeEl && !shapeEl.IsInEditMode && !isCtrlOrCmd && !e.KeyModifiers.HasFlag(KeyModifiers.Alt)) - { - if (e.Key == Key.Enter || e.Key == Key.F2) - { - shapeEl.IsInEditMode = true; - e.Handled = true; - Avalonia.Threading.Dispatcher.UIThread.Post(() => FocusInPlaceTextBox(shapeEl), Avalonia.Threading.DispatcherPriority.Input); - return; - } - } - - switch (e.Key) - { - case Key.Enter: - case Key.F2: - break; - case Key.Delete: - case Key.Back: - ViewModel.Inspector.DeleteSelectedElementCommand.Execute(null); - e.Handled = true; - break; - case Key.Escape: - ViewModel.CurrentPage?.ClearSelection(); - e.Handled = true; - break; - case Key.Left: - case Key.Right: - case Key.Up: - case Key.Down: - if (selected != null && ViewModel?.CurrentPage is { } page) - { - double oldX = selected.X; - double oldY = selected.Y; - - if (e.Key == Key.Left) selected.X = Math.Max(0, selected.X - step); - else if (e.Key == Key.Right) selected.X = Math.Min(page.Width - selected.Width, selected.X + step); - else if (e.Key == Key.Up) selected.Y = Math.Max(0, selected.Y - step); - else if (e.Key == Key.Down) selected.Y = Math.Min(page.Height - selected.Height, selected.Y + step); - - double newX = selected.X; - double newY = selected.Y; - var el = selected; - ViewModel.UndoRedo.RecordAction( - $"Nudge {el.DisplayName}", - () => { el.X = oldX; el.Y = oldY; }, - () => { el.X = newX; el.Y = newY; } - ); - e.Handled = true; - } - break; - case Key.OemCloseBrackets: - ViewModel.Inspector.BringToFrontCommand.Execute(null); - e.Handled = true; - break; - case Key.OemOpenBrackets: - ViewModel.Inspector.SendToBackCommand.Execute(null); - e.Handled = true; - break; - } - } - else - { - // Global quick single-key tool switches (when no element is selected) - switch (e.Key) - { - case Key.V: - ViewModel.SetToolModeCommand.Execute("Select"); - e.Handled = true; - break; - case Key.H: - ViewModel.SetToolModeCommand.Execute("Pan"); - e.Handled = true; - break; - case Key.Z: - ViewModel.SetToolModeCommand.Execute("Zoom"); - e.Handled = true; - break; - case Key.T: - ViewModel.AddTextElementCommand.Execute(null); - e.Handled = true; - break; - case Key.R: - ViewModel.AddShapeElementCommand.Execute("Rectangle"); - e.Handled = true; - break; - case Key.N: - ViewModel.AddStickyNoteElementCommand.Execute(null); - e.Handled = true; - break; - case Key.D: - ViewModel.AddInkElementCommand.Execute(false); - e.Handled = true; - break; - } - } - } -} diff --git a/src/PdfEditorApp/Views/FindReplaceBarView.axaml b/src/PdfEditorApp/Views/FindReplaceBarView.axaml deleted file mode 100644 index df4d4fe..0000000 --- a/src/PdfEditorApp/Views/FindReplaceBarView.axaml +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/FindReplaceBarView.axaml.cs b/src/PdfEditorApp/Views/FindReplaceBarView.axaml.cs deleted file mode 100644 index 880ea77..0000000 --- a/src/PdfEditorApp/Views/FindReplaceBarView.axaml.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Avalonia.Controls; - -namespace PdfEditorApp.Views; - -public partial class FindReplaceBarView : UserControl -{ - public FindReplaceBarView() - { - InitializeComponent(); - } -} diff --git a/src/PdfEditorApp/Views/FontManagerPageView.axaml b/src/PdfEditorApp/Views/FontManagerPageView.axaml deleted file mode 100644 index 91325fa..0000000 --- a/src/PdfEditorApp/Views/FontManagerPageView.axaml +++ /dev/null @@ -1,412 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/FontManagerPageView.axaml.cs b/src/PdfEditorApp/Views/FontManagerPageView.axaml.cs deleted file mode 100644 index 7492942..0000000 --- a/src/PdfEditorApp/Views/FontManagerPageView.axaml.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Avalonia.Controls; - -namespace PdfEditorApp.Views; - -public partial class FontManagerPageView : UserControl -{ - public FontManagerPageView() - { - InitializeComponent(); - } -} diff --git a/src/PdfEditorApp/Views/FryPdfViewerView.axaml b/src/PdfEditorApp/Views/FryPdfViewerView.axaml deleted file mode 100644 index 4e4c389..0000000 --- a/src/PdfEditorApp/Views/FryPdfViewerView.axaml +++ /dev/null @@ -1,1035 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/FryPdfViewerView.axaml.cs b/src/PdfEditorApp/Views/FryPdfViewerView.axaml.cs deleted file mode 100644 index d77a8e1..0000000 --- a/src/PdfEditorApp/Views/FryPdfViewerView.axaml.cs +++ /dev/null @@ -1,94 +0,0 @@ -using Avalonia.Controls; -using Avalonia.Input; -using Avalonia.Markup.Xaml; -using PdfEditorApp.ViewModels.FryPdfViewer; - -namespace PdfEditorApp.Views; - -public partial class FryPdfViewerView : UserControl -{ - public FryPdfViewerView() - { - InitializeComponent(); - Loaded += (s, e) => Focus(); - PointerPressed += (s, e) => Focus(); - - var scrollViewer = this.FindControl("ViewportScrollViewer"); - if (scrollViewer != null) - { - scrollViewer.SizeChanged += (s, e) => - { - if (DataContext is FryPdfViewerViewModel vm && vm.IsPresentationMode) - { - vm.FitToViewport(e.NewSize.Width, e.NewSize.Height); - } - }; - } - - DataContextChanged += (s, e) => - { - if (DataContext is FryPdfViewerViewModel vm) - { - vm.PropertyChanged += (sender, args) => - { - if (args.PropertyName == nameof(FryPdfViewerViewModel.IsPresentationMode)) - { - if (vm.IsPresentationMode && scrollViewer != null) - { - vm.FitToViewport(scrollViewer.Bounds.Width, scrollViewer.Bounds.Height); - } - } - }; - } - }; - } - - private void InitializeComponent() - { - AvaloniaXamlLoader.Load(this); - } - - protected override void OnKeyDown(KeyEventArgs e) - { - base.OnKeyDown(e); - - if (DataContext is not FryPdfViewerViewModel vm) - return; - - // If focus is currently inside a text input or search bar, don't hijack typing - if (TopLevel.GetTopLevel(this)?.FocusManager?.GetFocusedElement() is TextBox) - return; - - if (e.Key == Key.Right || e.Key == Key.Down || e.Key == Key.PageDown || e.Key == Key.Space) - { - if (vm.CanGoNextPage) - { - vm.NextPage(); - e.Handled = true; - } - } - else if (e.Key == Key.Left || e.Key == Key.Up || e.Key == Key.PageUp || e.Key == Key.Back) - { - if (vm.CanGoPreviousPage) - { - vm.PreviousPage(); - e.Handled = true; - } - } - else if (e.Key == Key.Home) - { - vm.FirstPage(); - e.Handled = true; - } - else if (e.Key == Key.End) - { - vm.LastPage(); - e.Handled = true; - } - else if (e.Key == Key.Escape && vm.IsPresentationMode) - { - vm.IsPresentationMode = false; - e.Handled = true; - } - } -} diff --git a/src/PdfEditorApp/Views/HelpGuidePageView.axaml b/src/PdfEditorApp/Views/HelpGuidePageView.axaml deleted file mode 100644 index dd9ec02..0000000 --- a/src/PdfEditorApp/Views/HelpGuidePageView.axaml +++ /dev/null @@ -1,526 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/HelpGuidePageView.axaml.cs b/src/PdfEditorApp/Views/HelpGuidePageView.axaml.cs deleted file mode 100644 index 78fc891..0000000 --- a/src/PdfEditorApp/Views/HelpGuidePageView.axaml.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Avalonia.Controls; - -namespace PdfEditorApp.Views; - -public partial class HelpGuidePageView : UserControl -{ - public HelpGuidePageView() - { - InitializeComponent(); - } -} diff --git a/src/PdfEditorApp/Views/HomeDashboardView.axaml b/src/PdfEditorApp/Views/HomeDashboardView.axaml deleted file mode 100644 index b944e4e..0000000 --- a/src/PdfEditorApp/Views/HomeDashboardView.axaml +++ /dev/null @@ -1,761 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/HomeDashboardView.axaml.cs b/src/PdfEditorApp/Views/HomeDashboardView.axaml.cs deleted file mode 100644 index 07fdefc..0000000 --- a/src/PdfEditorApp/Views/HomeDashboardView.axaml.cs +++ /dev/null @@ -1,13 +0,0 @@ -using PdfEditorApp.Services.Tools.Core; -using PdfEditorApp.ViewModels.Tools.Core; -using Avalonia.Controls; - -namespace PdfEditorApp.Views; - -public partial class HomeDashboardView : UserControl -{ - public HomeDashboardView() - { - InitializeComponent(); - } -} diff --git a/src/PdfEditorApp/Views/HomeView.axaml b/src/PdfEditorApp/Views/HomeView.axaml deleted file mode 100644 index 79cf865..0000000 --- a/src/PdfEditorApp/Views/HomeView.axaml +++ /dev/null @@ -1,627 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/HomeView.axaml.cs b/src/PdfEditorApp/Views/HomeView.axaml.cs deleted file mode 100644 index 6ccb105..0000000 --- a/src/PdfEditorApp/Views/HomeView.axaml.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System; -using System.ComponentModel; -using Avalonia; -using Avalonia.Controls; -using PdfEditorApp.ViewModels; - -namespace PdfEditorApp.Views; - -public partial class HomeView : UserControl -{ - public HomeView() - { - InitializeComponent(); - } - - protected override void OnDataContextChanged(EventArgs e) - { - base.OnDataContextChanged(e); - if (DataContext is HomeViewModel vm) - { - vm.PropertyChanged -= OnHomeViewModelPropertyChanged; - vm.PropertyChanged += OnHomeViewModelPropertyChanged; - } - } - - private void OnHomeViewModelPropertyChanged(object? sender, PropertyChangedEventArgs e) - { - if (e.PropertyName == nameof(HomeViewModel.SelectedNavSection)) - { - if (MainContentScrollViewer != null) - { - MainContentScrollViewer.Offset = new Vector(0, 0); - } - } - } -} diff --git a/src/PdfEditorApp/Views/InspectorSidebarView.axaml b/src/PdfEditorApp/Views/InspectorSidebarView.axaml deleted file mode 100644 index e6fe13a..0000000 --- a/src/PdfEditorApp/Views/InspectorSidebarView.axaml +++ /dev/null @@ -1,3319 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/InspectorSidebarView.axaml.cs b/src/PdfEditorApp/Views/InspectorSidebarView.axaml.cs deleted file mode 100644 index d296acc..0000000 --- a/src/PdfEditorApp/Views/InspectorSidebarView.axaml.cs +++ /dev/null @@ -1,142 +0,0 @@ -using System; -using Avalonia; -using Avalonia.Controls; -using Avalonia.Input; -using Avalonia.Interactivity; -using Material.Icons; -using Material.Icons.Avalonia; -using PdfEditorApp.ViewModels; - -namespace PdfEditorApp.Views; - -public partial class InspectorSidebarView : UserControl -{ - private bool _isResizingTextEditor; - private Point _resizeStartPoint; - private double _resizeStartHeight; - private const double DefaultEditorHeight = 72.0; - private const double ExpandedEditorHeight = 180.0; - private const double MinEditorHeight = 44.0; - private const double MaxEditorHeight = 450.0; - - public InspectorSidebarView() - { - InitializeComponent(); - } - - private void OnSidebarTextBoxAttached(object? sender, VisualTreeAttachmentEventArgs e) - { - if (sender is TextBox textBox) - { - textBox.PropertyChanged += (s, args) => - { - if (args.Property == TextBox.SelectionStartProperty || args.Property == TextBox.SelectionEndProperty || args.Property == TextBox.TextProperty) - { - UpdateSidebarSelection(textBox); - } - }; - - textBox.PointerReleased += (s, args) => UpdateSidebarSelection(textBox); - textBox.KeyUp += (s, args) => UpdateSidebarSelection(textBox); - } - } - - private void OnTextEditorResizeGripPointerPressed(object? sender, PointerPressedEventArgs e) - { - if (sender is Control grip && e.GetCurrentPoint(grip).Properties.IsLeftButtonPressed) - { - _isResizingTextEditor = true; - _resizeStartPoint = e.GetPosition(this); - var textBox = this.FindControl("SidebarTextEditor"); - _resizeStartHeight = textBox?.Bounds.Height > 0 ? textBox.Bounds.Height : (textBox?.Height ?? DefaultEditorHeight); - e.Pointer.Capture(grip); - e.Handled = true; - } - } - - private void OnTextEditorResizeGripPointerMoved(object? sender, PointerEventArgs e) - { - if (_isResizingTextEditor) - { - var currentPoint = e.GetPosition(this); - double deltaY = currentPoint.Y - _resizeStartPoint.Y; - double newHeight = Math.Clamp(_resizeStartHeight + deltaY, MinEditorHeight, MaxEditorHeight); - var textBox = this.FindControl("SidebarTextEditor"); - if (textBox != null) - { - textBox.Height = newHeight; - } - e.Handled = true; - } - } - - private void OnTextEditorResizeGripPointerReleased(object? sender, PointerReleasedEventArgs e) - { - if (_isResizingTextEditor) - { - _isResizingTextEditor = false; - e.Pointer.Capture(null); - e.Handled = true; - UpdateExpandIcon(); - } - } - - private void OnTextEditorResizeGripDoubleTapped(object? sender, TappedEventArgs e) - { - ToggleEditorSize(); - e.Handled = true; - } - - private void OnToggleTextEditorExpandClicked(object? sender, RoutedEventArgs e) - { - ToggleEditorSize(); - } - - private void ToggleEditorSize() - { - var textBox = this.FindControl("SidebarTextEditor"); - if (textBox != null) - { - double current = textBox.Height; - if (double.IsNaN(current) || current <= DefaultEditorHeight + 20) - { - textBox.Height = ExpandedEditorHeight; - } - else - { - textBox.Height = DefaultEditorHeight; - } - UpdateExpandIcon(); - } - } - - private void UpdateExpandIcon() - { - var textBox = this.FindControl("SidebarTextEditor"); - var icon = this.FindControl("TextEditorExpandIcon"); - if (textBox != null && icon != null) - { - bool isExpanded = textBox.Height > DefaultEditorHeight + 20; - icon.Kind = isExpanded ? MaterialIconKind.ArrowCollapseVertical : MaterialIconKind.ArrowExpandVertical; - } - } - - private void UpdateSidebarSelection(TextBox textBox) - { - if (DataContext is InspectorViewModel inspector && inspector.TextElement != null) - { - int start = Math.Min(textBox.SelectionStart, textBox.SelectionEnd); - int end = Math.Max(textBox.SelectionStart, textBox.SelectionEnd); - int len = end - start; - - if (!textBox.IsFocused && len == 0 && inspector.TextElement.HasTextSelection) - { - return; - } - - string text = textBox.Text ?? ""; - string sel = len > 0 && start + len <= text.Length ? text.Substring(start, len) : string.Empty; - inspector.TextElement.UpdateTextSelection(start, len, sel); - } - } -} diff --git a/src/PdfEditorApp/Views/LicensingPageView.axaml b/src/PdfEditorApp/Views/LicensingPageView.axaml deleted file mode 100644 index b8ffc4a..0000000 --- a/src/PdfEditorApp/Views/LicensingPageView.axaml +++ /dev/null @@ -1,567 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/LicensingPageView.axaml.cs b/src/PdfEditorApp/Views/LicensingPageView.axaml.cs deleted file mode 100644 index cdba26f..0000000 --- a/src/PdfEditorApp/Views/LicensingPageView.axaml.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Avalonia.Controls; - -namespace PdfEditorApp.Views; - -public partial class LicensingPageView : UserControl -{ - public LicensingPageView() - { - InitializeComponent(); - } -} diff --git a/src/PdfEditorApp/Views/MainWindow.axaml b/src/PdfEditorApp/Views/MainWindow.axaml deleted file mode 100644 index 04a14b0..0000000 --- a/src/PdfEditorApp/Views/MainWindow.axaml +++ /dev/null @@ -1,561 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/NewDocumentPageView.axaml.cs b/src/PdfEditorApp/Views/NewDocumentPageView.axaml.cs deleted file mode 100644 index 9c7878e..0000000 --- a/src/PdfEditorApp/Views/NewDocumentPageView.axaml.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Avalonia.Controls; - -namespace PdfEditorApp.Views; - -public partial class NewDocumentPageView : UserControl -{ - public NewDocumentPageView() - { - InitializeComponent(); - } -} diff --git a/src/PdfEditorApp/Views/Overlays/ShellOverlayHost.axaml b/src/PdfEditorApp/Views/Overlays/ShellOverlayHost.axaml deleted file mode 100644 index 060d9e6..0000000 --- a/src/PdfEditorApp/Views/Overlays/ShellOverlayHost.axaml +++ /dev/null @@ -1,171 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/Overlays/ShellOverlayHost.axaml.cs b/src/PdfEditorApp/Views/Overlays/ShellOverlayHost.axaml.cs deleted file mode 100644 index 43cd828..0000000 --- a/src/PdfEditorApp/Views/Overlays/ShellOverlayHost.axaml.cs +++ /dev/null @@ -1,210 +0,0 @@ -using System; -using System.Collections.Specialized; -using Avalonia; -using Avalonia.Controls; -using Avalonia.Input; -using PdfEditorApp.ViewModels; - -namespace PdfEditorApp.Views.Overlays; - -public partial class ShellOverlayHost : UserControl -{ - private MainViewModel? _observedVm; - - public ShellOverlayHost() - { - InitializeComponent(); - } - - protected override void OnDataContextChanged(EventArgs e) - { - base.OnDataContextChanged(e); - - if (_observedVm != null) - { - _observedVm.ActiveOverlays.CollectionChanged -= OnActiveOverlaysChanged; - } - - _observedVm = DataContext as MainViewModel; - - if (_observedVm != null) - { - _observedVm.ActiveOverlays.CollectionChanged += OnActiveOverlaysChanged; - ClampAndPositionOverlays(); - } - } - - private void OnActiveOverlaysChanged(object? sender, NotifyCollectionChangedEventArgs e) - { - ClampAndPositionOverlays(); - } - - protected override void OnSizeChanged(SizeChangedEventArgs e) - { - base.OnSizeChanged(e); - ClampAndPositionOverlays(); - } - - private Point _dragStartPoint; - private bool _isDraggingStandardHeader; - - private enum ResizeMode - { - None, - Right, - Bottom, - BottomRight - } - - private ResizeMode _currentResizeMode = ResizeMode.None; - private Point _resizeStartPointer; - private double _resizeStartWidth; - private double _resizeStartHeight; - private OverlayInstanceViewModel? _resizingVm; - - private void OnOverlayPointerPressed(object? sender, PointerPressedEventArgs e) - { - if (sender is Control ctrl && ctrl.DataContext is OverlayInstanceViewModel vm && _observedVm != null) - { - vm.BringToFront(_observedVm.ActiveOverlays); - } - } - - private void OnStandardHeaderPointerPressed(object? sender, PointerPressedEventArgs e) - { - if (e.GetCurrentPoint(this).Properties.IsLeftButtonPressed) - { - _isDraggingStandardHeader = true; - var root = this.VisualRoot as Visual ?? this; - _dragStartPoint = e.GetPosition(root); - e.Pointer.Capture(sender as Control); - - if (sender is Control ctrl && ctrl.DataContext is OverlayInstanceViewModel vm && _observedVm != null) - { - vm.BringToFront(_observedVm.ActiveOverlays); - } - e.Handled = true; - } - } - - private void OnStandardHeaderPointerMoved(object? sender, PointerEventArgs e) - { - if (_isDraggingStandardHeader && sender is Control ctrl && ctrl.DataContext is OverlayInstanceViewModel vm) - { - var root = this.VisualRoot as Visual ?? this; - var currentPoint = e.GetPosition(root); - var deltaX = currentPoint.X - _dragStartPoint.X; - var deltaY = currentPoint.Y - _dragStartPoint.Y; - _dragStartPoint = currentPoint; - - var maxCanvasX = Bounds.Width > 100 ? Math.Max(20, Bounds.Width - 80) : double.PositiveInfinity; - var maxCanvasY = Bounds.Height > 100 ? Math.Max(20, Bounds.Height - 60) : double.PositiveInfinity; - - vm.X = Math.Clamp(vm.X + deltaX, 0, maxCanvasX); - vm.Y = Math.Clamp(vm.Y + deltaY, 0, maxCanvasY); - e.Handled = true; - } - } - - private void OnStandardHeaderPointerReleased(object? sender, PointerReleasedEventArgs e) - { - if (_isDraggingStandardHeader) - { - _isDraggingStandardHeader = false; - e.Pointer.Capture(null); - e.Handled = true; - } - } - - private void OnResizeRightPointerPressed(object? sender, PointerPressedEventArgs e) - => StartResize(sender, e, ResizeMode.Right); - - private void OnResizeBottomPointerPressed(object? sender, PointerPressedEventArgs e) - => StartResize(sender, e, ResizeMode.Bottom); - - private void OnResizeBottomRightPointerPressed(object? sender, PointerPressedEventArgs e) - => StartResize(sender, e, ResizeMode.BottomRight); - - private void StartResize(object? sender, PointerPressedEventArgs e, ResizeMode mode) - { - if (e.GetCurrentPoint(this).Properties.IsLeftButtonPressed && sender is Control ctrl && ctrl.DataContext is OverlayInstanceViewModel vm) - { - _currentResizeMode = mode; - _resizingVm = vm; - _resizeStartWidth = vm.Width; - _resizeStartHeight = vm.Height; - - var root = this.VisualRoot as Visual ?? this; - _resizeStartPointer = e.GetPosition(root); - - e.Pointer.Capture(ctrl); - - if (_observedVm != null) - { - vm.BringToFront(_observedVm.ActiveOverlays); - } - e.Handled = true; - } - } - - private void OnResizePointerMoved(object? sender, PointerEventArgs e) - { - if (_currentResizeMode != ResizeMode.None && _resizingVm != null) - { - var root = this.VisualRoot as Visual ?? this; - var currentPoint = e.GetPosition(root); - var deltaX = currentPoint.X - _resizeStartPointer.X; - var deltaY = currentPoint.Y - _resizeStartPointer.Y; - - var newWidth = _resizeStartWidth; - var newHeight = _resizeStartHeight; - - if (_currentResizeMode is ResizeMode.Right or ResizeMode.BottomRight) - { - newWidth += deltaX; - } - - if (_currentResizeMode is ResizeMode.Bottom or ResizeMode.BottomRight) - { - newHeight += deltaY; - } - - var maxCanvasWidth = Bounds.Width > 0 ? Math.Max(120, Bounds.Width - _resizingVm.X) : double.PositiveInfinity; - var maxCanvasHeight = Bounds.Height > 0 ? Math.Max(80, Bounds.Height - _resizingVm.Y) : double.PositiveInfinity; - - _resizingVm.Resize(newWidth, newHeight, maxCanvasWidth, maxCanvasHeight); - e.Handled = true; - } - } - - private void OnResizePointerReleased(object? sender, PointerReleasedEventArgs e) - { - if (_currentResizeMode != ResizeMode.None) - { - _currentResizeMode = ResizeMode.None; - _resizingVm = null; - e.Pointer.Capture(null); - e.Handled = true; - } - } - - private void ClampAndPositionOverlays() - { - if (_observedVm?.ActiveOverlays == null) return; - if (Bounds.Width < 200 || Bounds.Height < 200) return; - - foreach (var overlay in _observedVm.ActiveOverlays) - { - // If overlay is unpositioned or placed off-screen, dock it near the top-right / middle-right - if (overlay.X <= 0 || overlay.X + overlay.Width > Bounds.Width) - { - overlay.X = Math.Max(20, Bounds.Width - overlay.Width - 36); - } - - if (overlay.Y <= 0 || overlay.Y + overlay.Height > Bounds.Height) - { - overlay.Y = Math.Max(60, Math.Min(100, Bounds.Height - overlay.Height - 60)); - } - } - } -} diff --git a/src/PdfEditorApp/Views/PdfReaderLandingPageView.axaml b/src/PdfEditorApp/Views/PdfReaderLandingPageView.axaml deleted file mode 100644 index fd2e0a0..0000000 --- a/src/PdfEditorApp/Views/PdfReaderLandingPageView.axaml +++ /dev/null @@ -1,525 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/PdfReaderLandingPageView.axaml.cs b/src/PdfEditorApp/Views/PdfReaderLandingPageView.axaml.cs deleted file mode 100644 index 47b5928..0000000 --- a/src/PdfEditorApp/Views/PdfReaderLandingPageView.axaml.cs +++ /dev/null @@ -1,17 +0,0 @@ -using Avalonia.Controls; -using Avalonia.Markup.Xaml; - -namespace PdfEditorApp.Views; - -public partial class PdfReaderLandingPageView : UserControl -{ - public PdfReaderLandingPageView() - { - InitializeComponent(); - } - - private void InitializeComponent() - { - AvaloniaXamlLoader.Load(this); - } -} diff --git a/src/PdfEditorApp/Views/PdfToolPageView.axaml b/src/PdfEditorApp/Views/PdfToolPageView.axaml deleted file mode 100644 index 27ad2ef..0000000 --- a/src/PdfEditorApp/Views/PdfToolPageView.axaml +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/PdfToolPageView.axaml.cs b/src/PdfEditorApp/Views/PdfToolPageView.axaml.cs deleted file mode 100644 index 3eaf397..0000000 --- a/src/PdfEditorApp/Views/PdfToolPageView.axaml.cs +++ /dev/null @@ -1,13 +0,0 @@ -using PdfEditorApp.Services.Tools.Core; -using PdfEditorApp.ViewModels.Tools.Core; -using Avalonia.Controls; - -namespace PdfEditorApp.Views; - -public partial class PdfToolPageView : UserControl -{ - public PdfToolPageView() - { - InitializeComponent(); - } -} diff --git a/src/PdfEditorApp/Views/PdfToolsStudioView.axaml b/src/PdfEditorApp/Views/PdfToolsStudioView.axaml deleted file mode 100644 index fb8fe0f..0000000 --- a/src/PdfEditorApp/Views/PdfToolsStudioView.axaml +++ /dev/null @@ -1,282 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/PdfToolsStudioView.axaml.cs b/src/PdfEditorApp/Views/PdfToolsStudioView.axaml.cs deleted file mode 100644 index 3b2d689..0000000 --- a/src/PdfEditorApp/Views/PdfToolsStudioView.axaml.cs +++ /dev/null @@ -1,13 +0,0 @@ -using PdfEditorApp.Services.Tools.Core; -using PdfEditorApp.ViewModels.Tools.Core; -using Avalonia.Controls; - -namespace PdfEditorApp.Views; - -public partial class PdfToolsStudioView : UserControl -{ - public PdfToolsStudioView() - { - InitializeComponent(); - } -} diff --git a/src/PdfEditorApp/Views/PdfViewerView.axaml b/src/PdfEditorApp/Views/PdfViewerView.axaml deleted file mode 100644 index 2d3799c..0000000 --- a/src/PdfEditorApp/Views/PdfViewerView.axaml +++ /dev/null @@ -1,1299 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/PdfViewerView.axaml.cs b/src/PdfEditorApp/Views/PdfViewerView.axaml.cs deleted file mode 100644 index 7dbf619..0000000 --- a/src/PdfEditorApp/Views/PdfViewerView.axaml.cs +++ /dev/null @@ -1,897 +0,0 @@ -using System; -using System.ComponentModel; -using Avalonia; -using Avalonia.Controls; -using Avalonia.Input; -using Avalonia.Interactivity; -using Avalonia.Markup.Xaml; -using Avalonia.Threading; -using PdfEditorApp.ViewModels; - -namespace PdfEditorApp.Views; - -public partial class PdfViewerView : UserControl -{ - // Pan state - private bool _isSpacePressed; - private bool _isPanning; - private Point _panStart; - private Vector _scrollStart; - - // Pinch Gesture state - private bool _isPinching; - private double _pinchStartZoom = 1.0; - - // Scroll synchronization flags to prevent feedback loops - private bool _isProgrammaticScroll; - private bool _isUpdatingFromUserScroll; - private DateTime _lastWheelPageTurnTime = DateTime.MinValue; - private PdfViewerViewModel? _subscribedVm; - private IDisposable? _scrollOffsetSubscription; - - public PdfViewerView() - { - InitializeComponent(); - - GestureRecognizers.Add(new PinchGestureRecognizer()); - - AddHandler(PointerWheelChangedEvent, OnViewerPointerWheelChanged, RoutingStrategies.Bubble | RoutingStrategies.Tunnel, handledEventsToo: true); - AddHandler(PointerTouchPadGestureMagnifyEvent, OnViewerTouchPadGestureMagnify, RoutingStrategies.Bubble | RoutingStrategies.Tunnel, handledEventsToo: true); - AddHandler(PinchEvent, OnViewerPinch, RoutingStrategies.Bubble | RoutingStrategies.Tunnel, handledEventsToo: true); - AddHandler(PinchEndedEvent, OnViewerPinchEnded, RoutingStrategies.Bubble | RoutingStrategies.Tunnel, handledEventsToo: true); - AddHandler(PointerPressedEvent, OnViewerPointerPressed, RoutingStrategies.Tunnel); - AddHandler(PointerMovedEvent, OnViewerPointerMoved, RoutingStrategies.Tunnel); - AddHandler(PointerReleasedEvent, OnViewerPointerReleased, RoutingStrategies.Tunnel); - AddHandler(KeyDownEvent, OnViewerKeyDown, RoutingStrategies.Tunnel); - AddHandler(KeyUpEvent, OnViewerKeyUp, RoutingStrategies.Tunnel); - - DataContextChanged += OnDataContextChanged; - Loaded += OnLoaded; - Unloaded += OnUnloaded; - - this.GetObservable(Visual.IsVisibleProperty).Subscribe(new ActionObserver(visible => - { - if (visible) - { - SetupScrollListeners(); - SubscribeViewModel(ViewModel); - Dispatcher.UIThread.Post(OnContinuousScrollOffsetChanged); - } - })); - } - - private void InitializeComponent() - { - AvaloniaXamlLoader.Load(this); - } - - public static readonly DirectProperty ViewModelProperty = - AvaloniaProperty.RegisterDirect( - nameof(ViewModel), - o => o.ViewModel); - - public PdfViewerViewModel? ViewModel => DataContext as PdfViewerViewModel; - - private ScrollViewer? ActiveScrollViewer - { - get - { - if (ViewModel == null) return null; - if (ViewModel.IsContinuousScroll) return ContinuousScrollViewer; - if (ViewModel.IsSinglePageMode) return SinglePageScrollViewer; - if (ViewModel.IsTwoPageSpreadMode) return TwoPageSpreadScrollViewer; - return null; - } - } - - public (double ViewportWidth, double ViewportHeight, double HorizontalPadding, double VerticalPadding) GetViewportDimensions() - { - var sv = ActiveScrollViewer; - if (sv != null) - { - double vw = sv.Viewport.Width > 0 ? sv.Viewport.Width : sv.Bounds.Width; - double vh = sv.Viewport.Height > 0 ? sv.Viewport.Height : sv.Bounds.Height; - if (vw > 0 && vh > 0) - { - double hp = sv.Padding.Left + sv.Padding.Right; - double vp = sv.Padding.Top + sv.Padding.Bottom; - return (vw, vh, hp, vp); - } - } - - // If the newly active scrollviewer hasn't had a measure pass yet, check sibling viewers - // which share the exact same grid column bounds - var sibling = ContinuousScrollViewer ?? SinglePageScrollViewer ?? TwoPageSpreadScrollViewer; - if (sibling != null) - { - double svW = sibling.Viewport.Width > 0 ? sibling.Viewport.Width : sibling.Bounds.Width; - double svH = sibling.Viewport.Height > 0 ? sibling.Viewport.Height : sibling.Bounds.Height; - if (svW > 0 && svH > 0) - { - double hp = sibling.Padding.Left + sibling.Padding.Right; - double vp = sibling.Padding.Top + sibling.Padding.Bottom; - return (svW, svH, hp, vp); - } - } - - double w = Bounds.Width; - double h = Bounds.Height; - if (w > 0 && h > 0) - { - if (ViewModel?.IsSidebarOpen == true) - { - w = Math.Max(100, w - 260); - } - return (w, h, 64.0, 64.0); - } - - return (800, 600, 64.0, 64.0); - } - - protected override void OnSizeChanged(SizeChangedEventArgs e) - { - base.OnSizeChanged(e); - if (ViewModel != null && ViewModel.HasDocument && (e.WidthChanged || e.HeightChanged)) - { - if (ViewModel.IsFitToWidthActive) - { - ViewModel.FitToWidth(); - } - else if (ViewModel.IsFitToPageActive) - { - ViewModel.FitToPage(); - } - } - } - - private void OnLoaded(object? sender, RoutedEventArgs e) - { - SetupScrollListeners(); - SubscribeViewModel(ViewModel); - } - - private void OnUnloaded(object? sender, RoutedEventArgs e) - { - _scrollOffsetSubscription?.Dispose(); - _scrollOffsetSubscription = null; - UnsubscribeViewModel(); - } - - private void OnDataContextChanged(object? sender, EventArgs e) - { - var oldVm = _subscribedVm; - var newVm = ViewModel; - RaisePropertyChanged(ViewModelProperty, oldVm, newVm); - SubscribeViewModel(newVm); - SetupScrollListeners(); - } - - private void SubscribeViewModel(PdfViewerViewModel? vm) - { - if (_subscribedVm != null) - { - _subscribedVm.ScrollToPageRequested -= OnScrollToPageRequested; - _subscribedVm.PropertyChanged -= OnViewModelPropertyChanged; - _subscribedVm.ViewportSizeProvider = null; - _subscribedVm = null; - } - - if (vm != null) - { - _subscribedVm = vm; - _subscribedVm.ScrollToPageRequested += OnScrollToPageRequested; - _subscribedVm.PropertyChanged += OnViewModelPropertyChanged; - _subscribedVm.ViewportSizeProvider = GetViewportDimensions; - } - } - - private void UnsubscribeViewModel() - { - _scrollOffsetSubscription?.Dispose(); - _scrollOffsetSubscription = null; - - if (_subscribedVm != null) - { - _subscribedVm.ScrollToPageRequested -= OnScrollToPageRequested; - _subscribedVm.PropertyChanged -= OnViewModelPropertyChanged; - _subscribedVm.ViewportSizeProvider = null; - _subscribedVm = null; - } - } - - private void SetupScrollListeners() - { - var continuousViewer = ContinuousScrollViewer; - if (continuousViewer != null) - { - continuousViewer.PropertyChanged -= OnContinuousViewerPropertyChanged; - continuousViewer.PropertyChanged += OnContinuousViewerPropertyChanged; - - continuousViewer.RemoveHandler(ScrollViewer.ScrollChangedEvent, OnContinuousViewerScrollChanged); - continuousViewer.AddHandler(ScrollViewer.ScrollChangedEvent, OnContinuousViewerScrollChanged); - - _scrollOffsetSubscription?.Dispose(); - _scrollOffsetSubscription = continuousViewer.GetObservable(ScrollViewer.OffsetProperty) - .Subscribe(new ActionObserver(_ => OnContinuousScrollOffsetChanged())); - } - } - - public void OnContinuousViewerScrollChanged(object? sender, ScrollChangedEventArgs e) - { - OnContinuousScrollOffsetChanged(); - } - - private sealed class ActionObserver(Action onNext) : IObserver - { - public void OnCompleted() { } - public void OnError(Exception error) { } - public void OnNext(T value) => onNext(value); - } - - private void OnContinuousViewerPropertyChanged(object? sender, AvaloniaPropertyChangedEventArgs ev) - { - if (ev.Property == ScrollViewer.OffsetProperty) - { - OnContinuousScrollOffsetChanged(); - } - } - - private void OnViewModelPropertyChanged(object? sender, PropertyChangedEventArgs e) - { - if (e.PropertyName == nameof(PdfViewerViewModel.CurrentPageNumber)) - { - if (!_isUpdatingFromUserScroll && ViewModel != null) - { - Dispatcher.UIThread.Post(() => - { - ScrollToPage(ViewModel.CurrentPageNumber); - ScrollThumbnailIntoView(ViewModel.CurrentPageNumber); - }); - } - } - else if (e.PropertyName == nameof(PdfViewerViewModel.SelectedLayoutMode)) - { - if (ViewModel != null) - { - Dispatcher.UIThread.Post(() => - { - ScrollToPage(ViewModel.CurrentPageNumber); - if (ViewModel.IsFitToPageActive) - { - ViewModel.FitToPage(); - } - else if (ViewModel.IsFitToWidthActive) - { - ViewModel.FitToWidth(); - } - }, DispatcherPriority.Loaded); - } - } - else if (e.PropertyName == nameof(PdfViewerViewModel.IsLoading)) - { - // A fresh document just finished loading. The ScrollViewer's offset is likely - // still (0,0) from before, so no Offset-changed event will fire on its own — - // without this, only page 1 (rendered eagerly by the load itself) would show - // anything until the user scrolled. - if (ViewModel != null && !ViewModel.IsLoading && ViewModel.HasDocument) - { - Dispatcher.UIThread.Post(OnContinuousScrollOffsetChanged); - } - } - else if (e.PropertyName == nameof(PdfViewerViewModel.ZoomLevel)) - { - if (ViewModel != null && ViewModel.IsContinuousScroll) - { - Dispatcher.UIThread.Post(OnContinuousScrollOffsetChanged, DispatcherPriority.Background); - } - } - } - - private void OnScrollToPageRequested(int pageNumber) - { - Dispatcher.UIThread.Post(() => - { - ScrollToPage(pageNumber); - ScrollThumbnailIntoView(pageNumber); - }); - } - - public void ScrollToPage(int pageNumber) - { - if (ViewModel == null || pageNumber < 1) return; - - if (ViewModel.IsContinuousScroll) - { - var viewer = ContinuousScrollViewer; - if (viewer == null) return; - - _isProgrammaticScroll = true; - try - { - double zoom = ViewModel.ZoomLevel > 0 ? ViewModel.ZoomLevel : 1.0; - var itemsCtrl = ContinuousItemsControl; - double top = 32.0; - - for (int i = 0; i < pageNumber - 1 && i < ViewModel.Pages.Count; i++) - { - var page = ViewModel.Pages[i]; - double pageH = page.HeightPoints > 0 ? (page.HeightPoints * zoom) : (842.0 * zoom); - double itemTotalH = pageH + 26.0; - top += itemTotalH + 28.0; - } - - double margin = pageNumber == 1 ? 0 : 16.0; - double targetOffsetY = Math.Max(0, top - margin); - viewer.Offset = new Vector(viewer.Offset.X, targetOffsetY); - } - finally - { - _isProgrammaticScroll = false; - } - - // Programmatic scroll updated the offset while _isProgrammaticScroll suppressed - // OnContinuousScrollOffsetChanged. Now that the offset is settled and the flag is cleared, - // immediately trigger visible-page resolution and background rendering for the destination page. - OnContinuousScrollOffsetChanged(); - } - else if (ViewModel.IsSinglePageMode) - { - var singleViewer = SinglePageScrollViewer; - if (singleViewer != null) - { - singleViewer.Offset = new Vector(singleViewer.Offset.X, 0); - } - } - else if (ViewModel.IsTwoPageSpreadMode) - { - var spreadViewer = TwoPageSpreadScrollViewer; - if (spreadViewer != null) - { - spreadViewer.Offset = new Vector(spreadViewer.Offset.X, 0); - } - } - } - - public void ScrollThumbnailIntoView(int pageNumber) - { - var thumbViewer = ThumbnailsScrollViewer; - if (thumbViewer == null || ViewModel == null || pageNumber < 1) return; - - try - { - double viewportH = thumbViewer.Viewport.Height; - if (viewportH <= 0) viewportH = 600; - - double thumbHeight = 270.0; - double targetY = (pageNumber - 1) * thumbHeight; - double currentY = thumbViewer.Offset.Y; - - if (targetY < currentY || targetY + thumbHeight > currentY + viewportH) - { - thumbViewer.Offset = new Vector(0, Math.Max(0, targetY - 20)); - } - } - catch { } - } - - /// - /// Resolves which pages are visible in the viewport and detects which page has the maximum - /// visible vertical overlap on screen. Uses exact, deterministic pixel geometry calculated - /// from ScrollViewer.Offset.Y, page dimensions, zoom level, and spacing. - /// - private bool ResolveVisiblePages(out int firstVisiblePage, out int lastVisiblePage, out int anchorPage) - { - firstVisiblePage = 1; - lastVisiblePage = 1; - anchorPage = 1; - - var viewer = ContinuousScrollViewer; - if (viewer == null || ViewModel == null) return false; - - int count = ViewModel.Pages.Count; - if (count == 0) return false; - - double viewportHeight = viewer.Viewport.Height; - if (viewportHeight <= 0) viewportHeight = viewer.Bounds.Height; - if (viewportHeight <= 0) viewportHeight = 800; - - double zoom = ViewModel.ZoomLevel > 0 ? ViewModel.ZoomLevel : 1.0; - double currentScrollY = viewer.Offset.Y; - - double currentY = 32.0; - int firstIdx = -1; - int lastIdx = -1; - int bestActiveIdx = -1; - double maxVisibleHeight = -1; - - for (int i = 0; i < count; i++) - { - var page = ViewModel.Pages[i]; - double pageH = page.HeightPoints > 0 ? (page.HeightPoints * zoom) : (842.0 * zoom); - double itemTotalH = pageH + 26.0; - - double top = currentY - currentScrollY; - double bottom = top + itemTotalH; - - if (bottom > 0 && top < viewportHeight) - { - if (firstIdx == -1) firstIdx = i; - lastIdx = i; - - double visibleTop = Math.Max(0, top); - double visibleBottom = Math.Min(viewportHeight, bottom); - double visibleH = Math.Max(0, visibleBottom - visibleTop); - if (visibleH > maxVisibleHeight) - { - maxVisibleHeight = visibleH; - bestActiveIdx = i; - } - } - - currentY += itemTotalH + 28.0; - } - - if (firstIdx == -1) - { - if (currentScrollY <= 32.0) - { - firstIdx = 0; - lastIdx = Math.Min(count - 1, 1); - bestActiveIdx = 0; - } - else - { - bestActiveIdx = count - 1; - firstIdx = Math.Max(0, count - 2); - lastIdx = count - 1; - } - } - - firstVisiblePage = ViewModel.Pages[firstIdx].PageNumber; - lastVisiblePage = ViewModel.Pages[lastIdx].PageNumber; - anchorPage = ViewModel.Pages[bestActiveIdx].PageNumber; - return true; - } - - private void OnContinuousScrollOffsetChanged() - { - if (_isProgrammaticScroll || _isUpdatingFromUserScroll) return; - var vm = ViewModel; - if (vm == null || !vm.IsContinuousScroll || vm.Pages.Count == 0) return; - var viewer = ContinuousScrollViewer; - if (viewer == null) return; - - if (!ResolveVisiblePages(out int firstVisiblePage, out int lastVisiblePage, out int detectedPageNum)) return; - - vm.RequestPagesVisible(firstVisiblePage, lastVisiblePage); - - if (detectedPageNum >= 1 && detectedPageNum <= vm.Pages.Count && vm.CurrentPageNumber != detectedPageNum) - { - _isUpdatingFromUserScroll = true; - try - { - vm.CurrentPageNumber = detectedPageNum; - ScrollThumbnailIntoView(detectedPageNum); - } - finally - { - _isUpdatingFromUserScroll = false; - } - } - } - - private void OnViewerPointerWheelChanged(object? sender, PointerWheelEventArgs e) - { - // Support Cmd (Meta), Ctrl, and Option (Alt) modifier keys - bool isZoomModifier = e.KeyModifiers.HasFlag(KeyModifiers.Control) || - e.KeyModifiers.HasFlag(KeyModifiers.Meta) || - e.KeyModifiers.HasFlag(KeyModifiers.Alt); - - if (isZoomModifier && ViewModel != null) - { - double oldZoom = ViewModel.ZoomLevel > 0 ? ViewModel.ZoomLevel : 1.0; - double effectiveDelta = Math.Abs(e.Delta.Y) >= Math.Abs(e.Delta.X) ? e.Delta.Y : e.Delta.X; - - // Proportional smooth zoom supporting discrete mouse wheel ticks and fractional continuous trackpad gestures - double zoomDeltaFactor; - if (Math.Abs(effectiveDelta) >= 1.0) - { - zoomDeltaFactor = effectiveDelta > 0 ? 1.15 : (1.0 / 1.15); - } - else if (Math.Abs(effectiveDelta) > 0.0001) - { - zoomDeltaFactor = Math.Pow(1.002, effectiveDelta * 100); - } - else - { - zoomDeltaFactor = 1.0; - } - - double newZoom = Math.Clamp(Math.Round(oldZoom * zoomDeltaFactor, 3), 0.25, 5.0); - - if (Math.Abs(newZoom - oldZoom) > 0.001) - { - var scrollViewer = ActiveScrollViewer; - if (scrollViewer != null) - { - var mouseInViewer = e.GetPosition(scrollViewer); - double ratio = newZoom / oldZoom; - double targetOffsetX = (scrollViewer.Offset.X + mouseInViewer.X) * ratio - mouseInViewer.X; - double targetOffsetY = (scrollViewer.Offset.Y + mouseInViewer.Y) * ratio - mouseInViewer.Y; - - ViewModel.ZoomLevel = newZoom; - scrollViewer.Offset = new Vector(Math.Max(0, targetOffsetX), Math.Max(0, targetOffsetY)); - } - else - { - ViewModel.ZoomLevel = newZoom; - } - } - - e.Handled = true; - } - else if (e.KeyModifiers.HasFlag(KeyModifiers.Shift)) - { - var scrollViewer = ActiveScrollViewer; - if (scrollViewer != null) - { - double delta = e.Delta.Y != 0 ? e.Delta.Y : e.Delta.X; - scrollViewer.Offset = new Vector( - Math.Max(0, scrollViewer.Offset.X - (delta * 40)), - scrollViewer.Offset.Y); - e.Handled = true; - } - } - else if (ViewModel != null && (ViewModel.IsSinglePageMode || ViewModel.IsTwoPageSpreadMode)) - { - var scrollViewer = ActiveScrollViewer; - if (scrollViewer != null) - { - double deltaY = e.Delta.Y; - if (Math.Abs(deltaY) > 0.15) - { - bool atBottom = scrollViewer.Offset.Y >= (scrollViewer.Extent.Height - scrollViewer.Viewport.Height - 4.0); - bool atTop = scrollViewer.Offset.Y <= 4.0; - - if (deltaY < 0 && atBottom) - { - if (DateTime.UtcNow - _lastWheelPageTurnTime > TimeSpan.FromMilliseconds(250)) - { - _lastWheelPageTurnTime = DateTime.UtcNow; - ViewModel.NextPageCommand.Execute(null); - scrollViewer.Offset = new Vector(scrollViewer.Offset.X, 0); - e.Handled = true; - } - } - else if (deltaY > 0 && atTop) - { - if (DateTime.UtcNow - _lastWheelPageTurnTime > TimeSpan.FromMilliseconds(250)) - { - _lastWheelPageTurnTime = DateTime.UtcNow; - ViewModel.PreviousPageCommand.Execute(null); - scrollViewer.Offset = new Vector(scrollViewer.Offset.X, Math.Max(0, scrollViewer.Extent.Height - scrollViewer.Viewport.Height)); - e.Handled = true; - } - } - } - } - } - } - - private void OnViewerTouchPadGestureMagnify(object? sender, PointerDeltaEventArgs e) - { - if (ViewModel != null) - { - double oldZoom = ViewModel.ZoomLevel > 0 ? ViewModel.ZoomLevel : 1.0; - double delta = Math.Abs(e.Delta.Y) >= Math.Abs(e.Delta.X) ? e.Delta.Y : e.Delta.X; - if (delta == 0 && (e.Delta.X != 0 || e.Delta.Y != 0)) - { - delta = e.Delta.X != 0 ? e.Delta.X : e.Delta.Y; - } - - double zoomFactor = 1.0 + delta; - double newZoom = Math.Clamp(Math.Round(oldZoom * zoomFactor, 3), 0.25, 5.0); - - if (Math.Abs(newZoom - oldZoom) > 0.001) - { - var scrollViewer = ActiveScrollViewer; - if (scrollViewer != null) - { - var mouseInViewer = e.GetPosition(scrollViewer); - double ratio = newZoom / oldZoom; - double targetOffsetX = (scrollViewer.Offset.X + mouseInViewer.X) * ratio - mouseInViewer.X; - double targetOffsetY = (scrollViewer.Offset.Y + mouseInViewer.Y) * ratio - mouseInViewer.Y; - - ViewModel.ZoomLevel = newZoom; - scrollViewer.Offset = new Vector(Math.Max(0, targetOffsetX), Math.Max(0, targetOffsetY)); - } - else - { - ViewModel.ZoomLevel = newZoom; - } - } - - e.Handled = true; - } - } - - private void OnViewerPinch(object? sender, PinchEventArgs e) - { - if (ViewModel != null) - { - if (!_isPinching) - { - _isPinching = true; - _pinchStartZoom = ViewModel.ZoomLevel > 0 ? ViewModel.ZoomLevel : 1.0; - } - - // e.Scale is the total cumulative scale of the pinch gesture since start (starts at 1.0) - double targetZoom = Math.Clamp(Math.Round(_pinchStartZoom * e.Scale, 3), 0.25, 5.0); - if (Math.Abs(targetZoom - ViewModel.ZoomLevel) > 0.002) - { - double oldZ = ViewModel.ZoomLevel; - var scrollViewer = ActiveScrollViewer; - - ViewModel.ZoomLevel = targetZoom; - - if (oldZ > 0 && scrollViewer != null) - { - var origin = e.ScaleOrigin; - double ratio = targetZoom / oldZ; - double newOffsetX = (scrollViewer.Offset.X + origin.X) * ratio - origin.X; - double newOffsetY = (scrollViewer.Offset.Y + origin.Y) * ratio - origin.Y; - scrollViewer.Offset = new Vector(Math.Max(0, newOffsetX), Math.Max(0, newOffsetY)); - } - } - e.Handled = true; - } - } - - private void OnViewerPinchEnded(object? sender, PinchEndedEventArgs e) - { - _isPinching = false; - e.Handled = true; - } - - private void OnViewerPointerPressed(object? sender, PointerPressedEventArgs e) - { - var pt = e.GetCurrentPoint(this); - if (_isSpacePressed || pt.Properties.IsMiddleButtonPressed) - { - _isPanning = true; - _panStart = e.GetPosition(this); - var scrollViewer = ActiveScrollViewer; - if (scrollViewer != null) - { - _scrollStart = scrollViewer.Offset; - } - e.Pointer.Capture(this); - Cursor = new Cursor(StandardCursorType.Hand); - e.Handled = true; - } - } - - private void OnViewerPointerMoved(object? sender, PointerEventArgs e) - { - if (_isPanning) - { - var scrollViewer = ActiveScrollViewer; - if (scrollViewer != null) - { - var curPos = e.GetPosition(this); - var delta = curPos - _panStart; - scrollViewer.Offset = new Vector( - Math.Max(0, _scrollStart.X - delta.X), - Math.Max(0, _scrollStart.Y - delta.Y)); - e.Handled = true; - } - } - } - - private void OnViewerPointerReleased(object? sender, PointerReleasedEventArgs e) - { - if (_isPanning) - { - _isPanning = false; - e.Pointer.Capture(null); - Cursor = _isSpacePressed ? new Cursor(StandardCursorType.Hand) : Cursor.Default; - e.Handled = true; - } - } - - private void OnViewerKeyUp(object? sender, KeyEventArgs e) - { - if (e.Key == Key.Space) - { - _isSpacePressed = false; - if (!_isPanning) - { - Cursor = Cursor.Default; - } - } - } - - private void OnViewerKeyDown(object? sender, KeyEventArgs e) - { - if (ViewModel == null) return; - - // If typing inside a TextBox, handle Enter & Escape specifically - if (e.Source is TextBox textBox) - { - if (e.Key == Key.Enter) - { - if (textBox.Name == "JumpPageTextBox" || textBox == this.FindControl("JumpPageTextBox")) - { - ViewModel.CommitJumpPage(); - e.Handled = true; - } - else if (textBox.Name == "SearchQueryTextBox" || textBox == this.FindControl("SearchQueryTextBox") || ViewModel.IsSearchBarVisible) - { - if (e.KeyModifiers.HasFlag(KeyModifiers.Shift)) - { - ViewModel.PreviousMatchCommand.Execute(null); - } - else - { - ViewModel.NextMatchCommand.Execute(null); - } - e.Handled = true; - } - } - else if (e.Key == Key.Escape) - { - if (ViewModel.IsSearchBarVisible) - { - ViewModel.IsSearchBarVisible = false; - } - this.Focus(); - e.Handled = true; - } - return; - } - - if (e.Key == Key.Space && !_isSpacePressed) - { - _isSpacePressed = true; - Cursor = new Cursor(StandardCursorType.Hand); - return; - } - - bool isCtrlOrCmd = e.KeyModifiers.HasFlag(KeyModifiers.Control) || e.KeyModifiers.HasFlag(KeyModifiers.Meta); - - if (isCtrlOrCmd) - { - switch (e.Key) - { - case Key.C: - if (e.KeyModifiers.HasFlag(KeyModifiers.Shift)) - { - ViewModel.CopySelectedCitationCommand.Execute(null); - } - else if (ViewModel.HasTextSelection) - { - ViewModel.CopySelectedTextCommand.Execute(null); - } - else - { - ViewModel.CopyPageTextCommand.Execute(null); - } - e.Handled = true; - break; - case Key.A: - ViewModel.SelectAllPageTextCommand.Execute(null); - e.Handled = true; - break; - case Key.D0: - case Key.NumPad0: - ViewModel.ResetZoomCommand.Execute(null); - e.Handled = true; - break; - case Key.D1: - case Key.NumPad1: - ViewModel.FitToWidthCommand.Execute(null); - e.Handled = true; - break; - case Key.D9: - case Key.NumPad9: - ViewModel.FitToPageCommand.Execute(null); - e.Handled = true; - break; - case Key.OemPlus: - case Key.Add: - ViewModel.ZoomInCommand.Execute(null); - e.Handled = true; - break; - case Key.OemMinus: - case Key.Subtract: - ViewModel.ZoomOutCommand.Execute(null); - e.Handled = true; - break; - case Key.F: - if (ViewModel.HasTextSelection) - { - ViewModel.SearchSelectedTextCommand.Execute(null); - } - else - { - ViewModel.ToggleSearchBarCommand.Execute(null); - } - e.Handled = true; - break; - case Key.R: - if (e.KeyModifiers.HasFlag(KeyModifiers.Shift)) - { - ViewModel.RotateCounterClockwiseCommand.Execute(null); - } - else - { - ViewModel.RotateClockwiseCommand.Execute(null); - } - e.Handled = true; - break; - case Key.B: - ViewModel.ToggleSidebarCommand.Execute(null); - e.Handled = true; - break; - } - } - else - { - switch (e.Key) - { - case Key.PageDown: - case Key.Right: - case Key.Down: - ViewModel.NextPageCommand.Execute(null); - e.Handled = true; - break; - case Key.PageUp: - case Key.Left: - case Key.Up: - ViewModel.PreviousPageCommand.Execute(null); - e.Handled = true; - break; - case Key.Home: - ViewModel.FirstPageCommand.Execute(null); - e.Handled = true; - break; - case Key.End: - ViewModel.LastPageCommand.Execute(null); - e.Handled = true; - break; - case Key.F3: - if (e.KeyModifiers.HasFlag(KeyModifiers.Shift)) - { - ViewModel.PreviousMatchCommand.Execute(null); - } - else - { - ViewModel.NextMatchCommand.Execute(null); - } - e.Handled = true; - break; - case Key.F11: - ViewModel.ToggleFullscreenCommand.Execute(null); - e.Handled = true; - break; - case Key.Escape: - if (ViewModel.IsFullscreen) - { - ViewModel.IsFullscreen = false; - e.Handled = true; - } - else if (ViewModel.HasTextSelection) - { - ViewModel.ClearSelection(); - e.Handled = true; - } - else if (ViewModel.IsSearchBarVisible) - { - ViewModel.IsSearchBarVisible = false; - e.Handled = true; - } - break; - } - } - } -} diff --git a/src/PdfEditorApp/Views/PluginsManagerPageView.axaml b/src/PdfEditorApp/Views/PluginsManagerPageView.axaml deleted file mode 100644 index b749574..0000000 --- a/src/PdfEditorApp/Views/PluginsManagerPageView.axaml +++ /dev/null @@ -1,1122 +0,0 @@ - - - - 9999 - 28 - 16 - 12 - 8 - 4 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/PluginsManagerPageView.axaml.cs b/src/PdfEditorApp/Views/PluginsManagerPageView.axaml.cs deleted file mode 100644 index c48e417..0000000 --- a/src/PdfEditorApp/Views/PluginsManagerPageView.axaml.cs +++ /dev/null @@ -1,42 +0,0 @@ -using Avalonia.Controls; -using Avalonia.Input; -using PdfEditorApp.Core.Plugins.Marketplace; -using PdfEditorApp.ViewModels; - -namespace PdfEditorApp.Views; - -public partial class PluginsManagerPageView : UserControl -{ - public PluginsManagerPageView() - { - InitializeComponent(); - AttachedToVisualTree += (s, e) => - { - if (DataContext is PluginsManagerViewModel vm) - { - var topLevel = TopLevel.GetTopLevel(this); - if (topLevel != null) - { - vm.StorageProvider = topLevel.StorageProvider; - vm.Clipboard = topLevel.Clipboard; - } - } - }; - } - - private void OnInstalledCardPointerPressed(object? sender, PointerPressedEventArgs e) - { - if (sender is Border border && border.DataContext is PluginItemViewModel plugin && DataContext is PluginsManagerViewModel vm) - { - vm.SelectedInstalledPlugin = plugin; - } - } - - private void OnMarketplaceCardPointerPressed(object? sender, PointerPressedEventArgs e) - { - if (sender is Border border && border.DataContext is MarketplacePluginItem item && DataContext is PluginsManagerViewModel vm) - { - vm.SelectedMarketplacePlugin = item; - } - } -} diff --git a/src/PdfEditorApp/Views/RibbonView.axaml b/src/PdfEditorApp/Views/RibbonView.axaml deleted file mode 100644 index ec036af..0000000 --- a/src/PdfEditorApp/Views/RibbonView.axaml +++ /dev/null @@ -1,1270 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/RibbonView.axaml.cs b/src/PdfEditorApp/Views/RibbonView.axaml.cs deleted file mode 100644 index 479e1da..0000000 --- a/src/PdfEditorApp/Views/RibbonView.axaml.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Avalonia.Controls; - -namespace PdfEditorApp.Views; - -public partial class RibbonView : UserControl -{ - public RibbonView() - { - InitializeComponent(); - } -} diff --git a/src/PdfEditorApp/Views/SettingsPageView.axaml b/src/PdfEditorApp/Views/SettingsPageView.axaml deleted file mode 100644 index 59aa6ac..0000000 --- a/src/PdfEditorApp/Views/SettingsPageView.axaml +++ /dev/null @@ -1,990 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/SettingsPageView.axaml.cs b/src/PdfEditorApp/Views/SettingsPageView.axaml.cs deleted file mode 100644 index bc5b3ce..0000000 --- a/src/PdfEditorApp/Views/SettingsPageView.axaml.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Avalonia.Controls; - -namespace PdfEditorApp.Views; - -public partial class SettingsPageView : UserControl -{ - public SettingsPageView() - { - InitializeComponent(); - } -} diff --git a/src/PdfEditorApp/Views/Shell/PdfToolWorkspaceView.axaml b/src/PdfEditorApp/Views/Shell/PdfToolWorkspaceView.axaml deleted file mode 100644 index faf4027..0000000 --- a/src/PdfEditorApp/Views/Shell/PdfToolWorkspaceView.axaml +++ /dev/null @@ -1,368 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/Shell/PdfToolWorkspaceView.axaml.cs b/src/PdfEditorApp/Views/Shell/PdfToolWorkspaceView.axaml.cs deleted file mode 100644 index 1cc2aec..0000000 --- a/src/PdfEditorApp/Views/Shell/PdfToolWorkspaceView.axaml.cs +++ /dev/null @@ -1,359 +0,0 @@ -using System; -using Avalonia; -using Avalonia.Controls; -using Avalonia.Input; -using Avalonia.Interactivity; -using PdfEditorApp.Models; -using PdfEditorApp.ViewModels.Tools.Core; - -namespace PdfEditorApp.Views.Shell; - -/// -/// Reader-style shell (toolbar + tabbed left sidebar + live preview canvas) shared by -/// tool screens. Each tool composes it by supplying its own settings content and CTA -/// button through the content-slot properties below; the toolbar, Files/Pages/Info -/// tabs, and preview rendering are shared, backed by . -/// -/// Also mirrors the PDF Reader's () zoom -/// gestures — Ctrl/Cmd/Alt+scroll, trackpad pinch, and space/middle-click pan — over the -/// single preview ScrollViewer here, so every tool gets the same interaction the reader -/// has instead of only the toolbar +/- buttons. Zoom bounds (0.5-3.0) match -/// PdfLivePreviewViewModel's own clamp, since ZoomLevel here is set directly rather than -/// through ZoomInCommand/ZoomOutCommand. -/// -public partial class PdfToolWorkspaceView : UserControl -{ - private const double MinZoom = 0.5; - private const double MaxZoom = 3.0; - - public static readonly StyledProperty OptionsContentProperty = - AvaloniaProperty.Register(nameof(OptionsContent)); - - public static readonly StyledProperty ToolbarActionContentProperty = - AvaloniaProperty.Register(nameof(ToolbarActionContent)); - - public static readonly StyledProperty CanvasOverlayContentProperty = - AvaloniaProperty.Register(nameof(CanvasOverlayContent)); - - public static readonly StyledProperty SideBySideContentProperty = - AvaloniaProperty.Register(nameof(SideBySideContent)); - - public static readonly DirectProperty SideBySideColumnWidthProperty = - AvaloniaProperty.RegisterDirect( - nameof(SideBySideColumnWidth), - o => o.SideBySideColumnWidth, - (o, v) => o.SideBySideColumnWidth = v); - - private GridLength _sideBySideColumnWidth = new GridLength(0, GridUnitType.Pixel); - - public GridLength SideBySideColumnWidth - { - get => _sideBySideColumnWidth; - set => SetAndRaise(SideBySideColumnWidthProperty, ref _sideBySideColumnWidth, value); - } - - public static readonly StyledProperty SelectedTabProperty = - AvaloniaProperty.Register(nameof(SelectedTab), "Options"); - - private readonly ScrollViewer? _previewScrollViewer; - - // Pan state (space-drag or middle-click drag) - private bool _isSpacePressed; - private bool _isPanning; - private Point _panStart; - private Vector _scrollStart; - - // Pinch gesture state - private bool _isPinching; - private double _pinchStartZoom = 1.0; - - /// The tool's own settings/options UI, shown in the sidebar's Options tab (selected by default). - public object? OptionsContent - { - get => GetValue(OptionsContentProperty); - set => SetValue(OptionsContentProperty, value); - } - - /// The tool's primary action button (e.g. "Merge PDFs Now"), shown in the toolbar's right slot. - public object? ToolbarActionContent - { - get => GetValue(ToolbarActionContentProperty); - set => SetValue(ToolbarActionContentProperty, value); - } - - /// Optional interactive layer drawn over the current page (e.g. Redact's mark-drawing canvas). - public object? CanvasOverlayContent - { - get => GetValue(CanvasOverlayContentProperty); - set => SetValue(CanvasOverlayContentProperty, value); - } - - /// Optional side-by-side comparison panel shown next to the preview canvas (e.g. OCR extracted text or side-by-side diff). - public object? SideBySideContent - { - get => GetValue(SideBySideContentProperty); - set => SetValue(SideBySideContentProperty, value); - } - - public string SelectedTab - { - get => GetValue(SelectedTabProperty); - set => SetValue(SelectedTabProperty, value); - } - - /// Typed DataContext accessor so page-card templates (whose own DataContext is the page item) can still reach the tool ViewModel by element name. - public PdfToolViewModelBase? ViewModel => DataContext as PdfToolViewModelBase; - - public PdfToolWorkspaceView() - { - InitializeComponent(); - _previewScrollViewer = this.FindControl("PreviewScrollViewer"); - - GestureRecognizers.Add(new PinchGestureRecognizer()); - - AddHandler(PointerWheelChangedEvent, OnWorkspacePointerWheelChanged, RoutingStrategies.Bubble | RoutingStrategies.Tunnel, handledEventsToo: true); - AddHandler(PointerTouchPadGestureMagnifyEvent, OnWorkspaceTouchPadGestureMagnify, RoutingStrategies.Bubble | RoutingStrategies.Tunnel, handledEventsToo: true); - AddHandler(PinchEvent, OnWorkspacePinch, RoutingStrategies.Bubble | RoutingStrategies.Tunnel, handledEventsToo: true); - AddHandler(PinchEndedEvent, OnWorkspacePinchEnded, RoutingStrategies.Bubble | RoutingStrategies.Tunnel, handledEventsToo: true); - AddHandler(PointerPressedEvent, OnWorkspacePointerPressed, RoutingStrategies.Tunnel); - AddHandler(PointerMovedEvent, OnWorkspacePointerMoved, RoutingStrategies.Tunnel); - AddHandler(PointerReleasedEvent, OnWorkspacePointerReleased, RoutingStrategies.Tunnel); - AddHandler(KeyDownEvent, OnWorkspaceKeyDown, RoutingStrategies.Tunnel); - AddHandler(KeyUpEvent, OnWorkspaceKeyUp, RoutingStrategies.Tunnel); - } - - protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change) - { - base.OnPropertyChanged(change); - if (change.Property == SideBySideContentProperty) - { - SideBySideColumnWidth = change.NewValue != null - ? new GridLength(1, GridUnitType.Star) - : new GridLength(0, GridUnitType.Pixel); - } - } - - private void OnTabButtonClick(object? sender, RoutedEventArgs e) - { - if (sender is Control { Tag: string tabName }) - { - SelectedTab = tabName; - } - } - - private void OnThumbnailPointerPressed(object? sender, PointerPressedEventArgs e) - { - if (sender is Control { DataContext: PdfToolPreviewPage page }) - { - ViewModel?.Preview.SelectPageCommand.Execute(page); - } - } - - private void SetZoomAnchoredAtPointer(double newZoom, double oldZoom, Point pointerInViewer) - { - var preview = ViewModel?.Preview; - if (preview == null) return; - - if (_previewScrollViewer != null && oldZoom > 0) - { - double ratio = newZoom / oldZoom; - double targetOffsetX = (_previewScrollViewer.Offset.X + pointerInViewer.X) * ratio - pointerInViewer.X; - double targetOffsetY = (_previewScrollViewer.Offset.Y + pointerInViewer.Y) * ratio - pointerInViewer.Y; - - preview.ZoomLevel = newZoom; - _previewScrollViewer.Offset = new Vector(Math.Max(0, targetOffsetX), Math.Max(0, targetOffsetY)); - } - else - { - preview.ZoomLevel = newZoom; - } - } - - private void OnWorkspacePointerWheelChanged(object? sender, PointerWheelEventArgs e) - { - var preview = ViewModel?.Preview; - if (preview == null || !preview.HasDocument) return; - - bool isZoomModifier = e.KeyModifiers.HasFlag(KeyModifiers.Control) || - e.KeyModifiers.HasFlag(KeyModifiers.Meta) || - e.KeyModifiers.HasFlag(KeyModifiers.Alt); - if (!isZoomModifier) return; - - double oldZoom = preview.ZoomLevel > 0 ? preview.ZoomLevel : 1.0; - double effectiveDelta = Math.Abs(e.Delta.Y) >= Math.Abs(e.Delta.X) ? e.Delta.Y : e.Delta.X; - - double zoomDeltaFactor; - if (Math.Abs(effectiveDelta) >= 1.0) - { - zoomDeltaFactor = effectiveDelta > 0 ? 1.15 : (1.0 / 1.15); - } - else if (Math.Abs(effectiveDelta) > 0.0001) - { - zoomDeltaFactor = Math.Pow(1.002, effectiveDelta * 100); - } - else - { - zoomDeltaFactor = 1.0; - } - - double newZoom = Math.Clamp(Math.Round(oldZoom * zoomDeltaFactor, 3), MinZoom, MaxZoom); - if (Math.Abs(newZoom - oldZoom) > 0.001 && _previewScrollViewer != null) - { - SetZoomAnchoredAtPointer(newZoom, oldZoom, e.GetPosition(_previewScrollViewer)); - } - - e.Handled = true; - } - - private void OnWorkspaceTouchPadGestureMagnify(object? sender, PointerDeltaEventArgs e) - { - var preview = ViewModel?.Preview; - if (preview == null || !preview.HasDocument || _previewScrollViewer == null) return; - - double oldZoom = preview.ZoomLevel > 0 ? preview.ZoomLevel : 1.0; - double delta = Math.Abs(e.Delta.Y) >= Math.Abs(e.Delta.X) ? e.Delta.Y : e.Delta.X; - if (delta == 0 && (e.Delta.X != 0 || e.Delta.Y != 0)) - { - delta = e.Delta.X != 0 ? e.Delta.X : e.Delta.Y; - } - - double newZoom = Math.Clamp(Math.Round(oldZoom * (1.0 + delta), 3), MinZoom, MaxZoom); - if (Math.Abs(newZoom - oldZoom) > 0.001) - { - SetZoomAnchoredAtPointer(newZoom, oldZoom, e.GetPosition(_previewScrollViewer)); - } - - e.Handled = true; - } - - private void OnWorkspacePinch(object? sender, PinchEventArgs e) - { - var preview = ViewModel?.Preview; - if (preview == null || !preview.HasDocument) return; - - if (!_isPinching) - { - _isPinching = true; - _pinchStartZoom = preview.ZoomLevel > 0 ? preview.ZoomLevel : 1.0; - } - - double targetZoom = Math.Clamp(Math.Round(_pinchStartZoom * e.Scale, 3), MinZoom, MaxZoom); - if (Math.Abs(targetZoom - preview.ZoomLevel) > 0.002) - { - double oldZoom = preview.ZoomLevel; - if (_previewScrollViewer != null && oldZoom > 0) - { - double ratio = targetZoom / oldZoom; - var origin = e.ScaleOrigin; - double newOffsetX = (_previewScrollViewer.Offset.X + origin.X) * ratio - origin.X; - double newOffsetY = (_previewScrollViewer.Offset.Y + origin.Y) * ratio - origin.Y; - - preview.ZoomLevel = targetZoom; - _previewScrollViewer.Offset = new Vector(Math.Max(0, newOffsetX), Math.Max(0, newOffsetY)); - } - else - { - preview.ZoomLevel = targetZoom; - } - } - - e.Handled = true; - } - - private void OnWorkspacePinchEnded(object? sender, PinchEndedEventArgs e) - { - _isPinching = false; - e.Handled = true; - } - - private void OnWorkspacePointerPressed(object? sender, PointerPressedEventArgs e) - { - var pt = e.GetCurrentPoint(this); - if (_isSpacePressed || pt.Properties.IsMiddleButtonPressed) - { - _isPanning = true; - _panStart = e.GetPosition(this); - if (_previewScrollViewer != null) - { - _scrollStart = _previewScrollViewer.Offset; - } - e.Pointer.Capture(this); - Cursor = new Cursor(StandardCursorType.Hand); - e.Handled = true; - } - } - - private void OnWorkspacePointerMoved(object? sender, PointerEventArgs e) - { - if (_isPanning && _previewScrollViewer != null) - { - var curPos = e.GetPosition(this); - var delta = curPos - _panStart; - _previewScrollViewer.Offset = new Vector( - Math.Max(0, _scrollStart.X - delta.X), - Math.Max(0, _scrollStart.Y - delta.Y)); - e.Handled = true; - } - } - - private void OnWorkspacePointerReleased(object? sender, PointerReleasedEventArgs e) - { - if (_isPanning) - { - _isPanning = false; - e.Pointer.Capture(null); - Cursor = _isSpacePressed ? new Cursor(StandardCursorType.Hand) : Cursor.Default; - e.Handled = true; - } - } - - private void OnWorkspaceKeyDown(object? sender, KeyEventArgs e) - { - var preview = ViewModel?.Preview; - if (preview == null) return; - - if (e.Source is TextBox) - { - // Don't hijack typing in the Options tab's own text fields. - return; - } - - if (e.Key == Key.Space && !_isSpacePressed) - { - _isSpacePressed = true; - Cursor = new Cursor(StandardCursorType.Hand); - return; - } - - bool isCtrlOrCmd = e.KeyModifiers.HasFlag(KeyModifiers.Control) || e.KeyModifiers.HasFlag(KeyModifiers.Meta); - if (!isCtrlOrCmd) return; - - switch (e.Key) - { - case Key.OemPlus: - case Key.Add: - preview.ZoomInCommand.Execute(null); - e.Handled = true; - break; - case Key.OemMinus: - case Key.Subtract: - preview.ZoomOutCommand.Execute(null); - e.Handled = true; - break; - case Key.D0: - case Key.NumPad0: - preview.ResetZoomCommand.Execute(null); - e.Handled = true; - break; - } - } - - private void OnWorkspaceKeyUp(object? sender, KeyEventArgs e) - { - if (e.Key == Key.Space) - { - _isSpacePressed = false; - Cursor = Cursor.Default; - } - } -} diff --git a/src/PdfEditorApp/Views/StarredToolsPageView.axaml b/src/PdfEditorApp/Views/StarredToolsPageView.axaml deleted file mode 100644 index ab18ef9..0000000 --- a/src/PdfEditorApp/Views/StarredToolsPageView.axaml +++ /dev/null @@ -1,135 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/StarredToolsPageView.axaml.cs b/src/PdfEditorApp/Views/StarredToolsPageView.axaml.cs deleted file mode 100644 index 54429fe..0000000 --- a/src/PdfEditorApp/Views/StarredToolsPageView.axaml.cs +++ /dev/null @@ -1,13 +0,0 @@ -using PdfEditorApp.Services.Tools.Core; -using PdfEditorApp.ViewModels.Tools.Core; -using Avalonia.Controls; - -namespace PdfEditorApp.Views; - -public partial class StarredToolsPageView : UserControl -{ - public StarredToolsPageView() - { - InitializeComponent(); - } -} diff --git a/src/PdfEditorApp/Views/TesseractManagerPageView.axaml b/src/PdfEditorApp/Views/TesseractManagerPageView.axaml deleted file mode 100644 index f46e3f7..0000000 --- a/src/PdfEditorApp/Views/TesseractManagerPageView.axaml +++ /dev/null @@ -1,409 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/TesseractManagerPageView.axaml.cs b/src/PdfEditorApp/Views/TesseractManagerPageView.axaml.cs deleted file mode 100644 index 0ed91eb..0000000 --- a/src/PdfEditorApp/Views/TesseractManagerPageView.axaml.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Avalonia.Controls; - -namespace PdfEditorApp.Views; - -public partial class TesseractManagerPageView : UserControl -{ - public TesseractManagerPageView() - { - InitializeComponent(); - } -} diff --git a/src/PdfEditorApp/Views/ThumbnailSidebarView.axaml b/src/PdfEditorApp/Views/ThumbnailSidebarView.axaml deleted file mode 100644 index d1bcce2..0000000 --- a/src/PdfEditorApp/Views/ThumbnailSidebarView.axaml +++ /dev/null @@ -1,617 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/ThumbnailSidebarView.axaml.cs b/src/PdfEditorApp/Views/ThumbnailSidebarView.axaml.cs deleted file mode 100644 index 2e54800..0000000 --- a/src/PdfEditorApp/Views/ThumbnailSidebarView.axaml.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Avalonia.Controls; - -namespace PdfEditorApp.Views; - -public partial class ThumbnailSidebarView : UserControl -{ - public ThumbnailSidebarView() - { - InitializeComponent(); - } -} diff --git a/src/PdfEditorApp/Views/Tools/Conversion/ExcelToPdfToolView.axaml b/src/PdfEditorApp/Views/Tools/Conversion/ExcelToPdfToolView.axaml deleted file mode 100644 index 622c451..0000000 --- a/src/PdfEditorApp/Views/Tools/Conversion/ExcelToPdfToolView.axaml +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/Tools/Conversion/ExcelToPdfToolView.axaml.cs b/src/PdfEditorApp/Views/Tools/Conversion/ExcelToPdfToolView.axaml.cs deleted file mode 100644 index a77cfec..0000000 --- a/src/PdfEditorApp/Views/Tools/Conversion/ExcelToPdfToolView.axaml.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Avalonia.Controls; - -namespace PdfEditorApp.Views.Tools.Conversion; - -public partial class ExcelToPdfToolView : UserControl -{ - public ExcelToPdfToolView() - { - InitializeComponent(); - } -} diff --git a/src/PdfEditorApp/Views/Tools/Conversion/HtmlToPdfToolView.axaml b/src/PdfEditorApp/Views/Tools/Conversion/HtmlToPdfToolView.axaml deleted file mode 100644 index b60f9bb..0000000 --- a/src/PdfEditorApp/Views/Tools/Conversion/HtmlToPdfToolView.axaml +++ /dev/null @@ -1,150 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/Tools/Conversion/HtmlToPdfToolView.axaml.cs b/src/PdfEditorApp/Views/Tools/Conversion/HtmlToPdfToolView.axaml.cs deleted file mode 100644 index cf3201c..0000000 --- a/src/PdfEditorApp/Views/Tools/Conversion/HtmlToPdfToolView.axaml.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Avalonia.Controls; - -namespace PdfEditorApp.Views.Tools.Conversion; - -public partial class HtmlToPdfToolView : UserControl -{ - public HtmlToPdfToolView() - { - InitializeComponent(); - } -} diff --git a/src/PdfEditorApp/Views/Tools/Conversion/JpgToPdfToolView.axaml b/src/PdfEditorApp/Views/Tools/Conversion/JpgToPdfToolView.axaml deleted file mode 100644 index 6e10e6a..0000000 --- a/src/PdfEditorApp/Views/Tools/Conversion/JpgToPdfToolView.axaml +++ /dev/null @@ -1,156 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/Tools/Conversion/JpgToPdfToolView.axaml.cs b/src/PdfEditorApp/Views/Tools/Conversion/JpgToPdfToolView.axaml.cs deleted file mode 100644 index 136ebeb..0000000 --- a/src/PdfEditorApp/Views/Tools/Conversion/JpgToPdfToolView.axaml.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Avalonia.Controls; - -namespace PdfEditorApp.Views.Tools.Conversion; - -public partial class JpgToPdfToolView : UserControl -{ - public JpgToPdfToolView() - { - InitializeComponent(); - } -} diff --git a/src/PdfEditorApp/Views/Tools/Conversion/PdfToExcelToolView.axaml b/src/PdfEditorApp/Views/Tools/Conversion/PdfToExcelToolView.axaml deleted file mode 100644 index cdccf54..0000000 --- a/src/PdfEditorApp/Views/Tools/Conversion/PdfToExcelToolView.axaml +++ /dev/null @@ -1,134 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/Tools/Conversion/PdfToExcelToolView.axaml.cs b/src/PdfEditorApp/Views/Tools/Conversion/PdfToExcelToolView.axaml.cs deleted file mode 100644 index 940ebb5..0000000 --- a/src/PdfEditorApp/Views/Tools/Conversion/PdfToExcelToolView.axaml.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Avalonia.Controls; - -namespace PdfEditorApp.Views.Tools.Conversion; - -public partial class PdfToExcelToolView : UserControl -{ - public PdfToExcelToolView() - { - InitializeComponent(); - } -} diff --git a/src/PdfEditorApp/Views/Tools/Conversion/PdfToJpgToolView.axaml b/src/PdfEditorApp/Views/Tools/Conversion/PdfToJpgToolView.axaml deleted file mode 100644 index d9113a1..0000000 --- a/src/PdfEditorApp/Views/Tools/Conversion/PdfToJpgToolView.axaml +++ /dev/null @@ -1,150 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/Tools/Conversion/PdfToJpgToolView.axaml.cs b/src/PdfEditorApp/Views/Tools/Conversion/PdfToJpgToolView.axaml.cs deleted file mode 100644 index c39df7b..0000000 --- a/src/PdfEditorApp/Views/Tools/Conversion/PdfToJpgToolView.axaml.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Avalonia.Controls; - -namespace PdfEditorApp.Views.Tools.Conversion; - -public partial class PdfToJpgToolView : UserControl -{ - public PdfToJpgToolView() - { - InitializeComponent(); - } -} diff --git a/src/PdfEditorApp/Views/Tools/Conversion/PdfToMarkdownToolView.axaml b/src/PdfEditorApp/Views/Tools/Conversion/PdfToMarkdownToolView.axaml deleted file mode 100644 index 1d76d23..0000000 --- a/src/PdfEditorApp/Views/Tools/Conversion/PdfToMarkdownToolView.axaml +++ /dev/null @@ -1,135 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/Tools/Conversion/PdfToMarkdownToolView.axaml.cs b/src/PdfEditorApp/Views/Tools/Conversion/PdfToMarkdownToolView.axaml.cs deleted file mode 100644 index 5479cf0..0000000 --- a/src/PdfEditorApp/Views/Tools/Conversion/PdfToMarkdownToolView.axaml.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Avalonia.Controls; - -namespace PdfEditorApp.Views.Tools.Conversion; - -public partial class PdfToMarkdownToolView : UserControl -{ - public PdfToMarkdownToolView() - { - InitializeComponent(); - } -} diff --git a/src/PdfEditorApp/Views/Tools/Conversion/PdfToPdfAToolView.axaml b/src/PdfEditorApp/Views/Tools/Conversion/PdfToPdfAToolView.axaml deleted file mode 100644 index 2684dfa..0000000 --- a/src/PdfEditorApp/Views/Tools/Conversion/PdfToPdfAToolView.axaml +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/Tools/Conversion/PdfToPdfAToolView.axaml.cs b/src/PdfEditorApp/Views/Tools/Conversion/PdfToPdfAToolView.axaml.cs deleted file mode 100644 index 7fbc2e3..0000000 --- a/src/PdfEditorApp/Views/Tools/Conversion/PdfToPdfAToolView.axaml.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Avalonia.Controls; - -namespace PdfEditorApp.Views.Tools.Conversion; - -public partial class PdfToPdfAToolView : UserControl -{ - public PdfToPdfAToolView() - { - InitializeComponent(); - } -} diff --git a/src/PdfEditorApp/Views/Tools/Conversion/PdfToPowerPointToolView.axaml b/src/PdfEditorApp/Views/Tools/Conversion/PdfToPowerPointToolView.axaml deleted file mode 100644 index 32e6b53..0000000 --- a/src/PdfEditorApp/Views/Tools/Conversion/PdfToPowerPointToolView.axaml +++ /dev/null @@ -1,133 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/Tools/Conversion/PdfToPowerPointToolView.axaml.cs b/src/PdfEditorApp/Views/Tools/Conversion/PdfToPowerPointToolView.axaml.cs deleted file mode 100644 index 92d6aaf..0000000 --- a/src/PdfEditorApp/Views/Tools/Conversion/PdfToPowerPointToolView.axaml.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Avalonia.Controls; - -namespace PdfEditorApp.Views.Tools.Conversion; - -public partial class PdfToPowerPointToolView : UserControl -{ - public PdfToPowerPointToolView() - { - InitializeComponent(); - } -} diff --git a/src/PdfEditorApp/Views/Tools/Conversion/PdfToWordToolView.axaml b/src/PdfEditorApp/Views/Tools/Conversion/PdfToWordToolView.axaml deleted file mode 100644 index 33486be..0000000 --- a/src/PdfEditorApp/Views/Tools/Conversion/PdfToWordToolView.axaml +++ /dev/null @@ -1,135 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/Tools/Conversion/PdfToWordToolView.axaml.cs b/src/PdfEditorApp/Views/Tools/Conversion/PdfToWordToolView.axaml.cs deleted file mode 100644 index 4f1fa14..0000000 --- a/src/PdfEditorApp/Views/Tools/Conversion/PdfToWordToolView.axaml.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Avalonia.Controls; - -namespace PdfEditorApp.Views.Tools.Conversion; - -public partial class PdfToWordToolView : UserControl -{ - public PdfToWordToolView() - { - InitializeComponent(); - } -} diff --git a/src/PdfEditorApp/Views/Tools/Conversion/PowerPointToPdfToolView.axaml b/src/PdfEditorApp/Views/Tools/Conversion/PowerPointToPdfToolView.axaml deleted file mode 100644 index 318c2ff..0000000 --- a/src/PdfEditorApp/Views/Tools/Conversion/PowerPointToPdfToolView.axaml +++ /dev/null @@ -1,138 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/Tools/Conversion/PowerPointToPdfToolView.axaml.cs b/src/PdfEditorApp/Views/Tools/Conversion/PowerPointToPdfToolView.axaml.cs deleted file mode 100644 index 3374db7..0000000 --- a/src/PdfEditorApp/Views/Tools/Conversion/PowerPointToPdfToolView.axaml.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Avalonia.Controls; - -namespace PdfEditorApp.Views.Tools.Conversion; - -public partial class PowerPointToPdfToolView : UserControl -{ - public PowerPointToPdfToolView() - { - InitializeComponent(); - } -} diff --git a/src/PdfEditorApp/Views/Tools/Conversion/ScanToPdfToolView.axaml b/src/PdfEditorApp/Views/Tools/Conversion/ScanToPdfToolView.axaml deleted file mode 100644 index 7390a5d..0000000 --- a/src/PdfEditorApp/Views/Tools/Conversion/ScanToPdfToolView.axaml +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/Tools/Conversion/ScanToPdfToolView.axaml.cs b/src/PdfEditorApp/Views/Tools/Conversion/ScanToPdfToolView.axaml.cs deleted file mode 100644 index 98d73ee..0000000 --- a/src/PdfEditorApp/Views/Tools/Conversion/ScanToPdfToolView.axaml.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Avalonia.Controls; - -namespace PdfEditorApp.Views.Tools.Conversion; - -public partial class ScanToPdfToolView : UserControl -{ - public ScanToPdfToolView() - { - InitializeComponent(); - } -} diff --git a/src/PdfEditorApp/Views/Tools/Conversion/WordToPdfToolView.axaml b/src/PdfEditorApp/Views/Tools/Conversion/WordToPdfToolView.axaml deleted file mode 100644 index e16b380..0000000 --- a/src/PdfEditorApp/Views/Tools/Conversion/WordToPdfToolView.axaml +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/Tools/Conversion/WordToPdfToolView.axaml.cs b/src/PdfEditorApp/Views/Tools/Conversion/WordToPdfToolView.axaml.cs deleted file mode 100644 index f997cde..0000000 --- a/src/PdfEditorApp/Views/Tools/Conversion/WordToPdfToolView.axaml.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Avalonia.Controls; - -namespace PdfEditorApp.Views.Tools.Conversion; - -public partial class WordToPdfToolView : UserControl -{ - public WordToPdfToolView() - { - InitializeComponent(); - } -} diff --git a/src/PdfEditorApp/Views/Tools/Intelligence/AiSummarizerToolView.axaml b/src/PdfEditorApp/Views/Tools/Intelligence/AiSummarizerToolView.axaml deleted file mode 100644 index 65d1dfb..0000000 --- a/src/PdfEditorApp/Views/Tools/Intelligence/AiSummarizerToolView.axaml +++ /dev/null @@ -1,160 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/Tools/Intelligence/AiSummarizerToolView.axaml.cs b/src/PdfEditorApp/Views/Tools/Intelligence/AiSummarizerToolView.axaml.cs deleted file mode 100644 index 39097bb..0000000 --- a/src/PdfEditorApp/Views/Tools/Intelligence/AiSummarizerToolView.axaml.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Avalonia.Controls; - -namespace PdfEditorApp.Views.Tools.Intelligence; - -public partial class AiSummarizerToolView : UserControl -{ - public AiSummarizerToolView() - { - InitializeComponent(); - } -} diff --git a/src/PdfEditorApp/Views/Tools/Intelligence/ComparePdfToolView.axaml b/src/PdfEditorApp/Views/Tools/Intelligence/ComparePdfToolView.axaml deleted file mode 100644 index 6f0d42c..0000000 --- a/src/PdfEditorApp/Views/Tools/Intelligence/ComparePdfToolView.axaml +++ /dev/null @@ -1,150 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/Tools/Intelligence/ComparePdfToolView.axaml.cs b/src/PdfEditorApp/Views/Tools/Intelligence/ComparePdfToolView.axaml.cs deleted file mode 100644 index 5c03fd8..0000000 --- a/src/PdfEditorApp/Views/Tools/Intelligence/ComparePdfToolView.axaml.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Avalonia.Controls; - -namespace PdfEditorApp.Views.Tools.Intelligence; - -public partial class ComparePdfToolView : UserControl -{ - public ComparePdfToolView() - { - InitializeComponent(); - } -} diff --git a/src/PdfEditorApp/Views/Tools/Intelligence/EditPdfToolView.axaml b/src/PdfEditorApp/Views/Tools/Intelligence/EditPdfToolView.axaml deleted file mode 100644 index 649ecd2..0000000 --- a/src/PdfEditorApp/Views/Tools/Intelligence/EditPdfToolView.axaml +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/Tools/Intelligence/EditPdfToolView.axaml.cs b/src/PdfEditorApp/Views/Tools/Intelligence/EditPdfToolView.axaml.cs deleted file mode 100644 index 5ac3eed..0000000 --- a/src/PdfEditorApp/Views/Tools/Intelligence/EditPdfToolView.axaml.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Avalonia.Controls; - -namespace PdfEditorApp.Views.Tools.Intelligence; - -public partial class EditPdfToolView : UserControl -{ - public EditPdfToolView() - { - InitializeComponent(); - } -} diff --git a/src/PdfEditorApp/Views/Tools/Intelligence/OcrPdfToolView.axaml b/src/PdfEditorApp/Views/Tools/Intelligence/OcrPdfToolView.axaml deleted file mode 100644 index 640bc20..0000000 --- a/src/PdfEditorApp/Views/Tools/Intelligence/OcrPdfToolView.axaml +++ /dev/null @@ -1,315 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/Tools/Intelligence/OcrPdfToolView.axaml.cs b/src/PdfEditorApp/Views/Tools/Intelligence/OcrPdfToolView.axaml.cs deleted file mode 100644 index 2c447f8..0000000 --- a/src/PdfEditorApp/Views/Tools/Intelligence/OcrPdfToolView.axaml.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Avalonia.Controls; - -namespace PdfEditorApp.Views.Tools.Intelligence; - -public partial class OcrPdfToolView : UserControl -{ - public OcrPdfToolView() - { - InitializeComponent(); - } -} diff --git a/src/PdfEditorApp/Views/Tools/Intelligence/PdfFormsToolView.axaml b/src/PdfEditorApp/Views/Tools/Intelligence/PdfFormsToolView.axaml deleted file mode 100644 index f9f8aeb..0000000 --- a/src/PdfEditorApp/Views/Tools/Intelligence/PdfFormsToolView.axaml +++ /dev/null @@ -1,136 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/Tools/Intelligence/PdfFormsToolView.axaml.cs b/src/PdfEditorApp/Views/Tools/Intelligence/PdfFormsToolView.axaml.cs deleted file mode 100644 index 3abf030..0000000 --- a/src/PdfEditorApp/Views/Tools/Intelligence/PdfFormsToolView.axaml.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Avalonia.Controls; - -namespace PdfEditorApp.Views.Tools.Intelligence; - -public partial class PdfFormsToolView : UserControl -{ - public PdfFormsToolView() - { - InitializeComponent(); - } -} diff --git a/src/PdfEditorApp/Views/Tools/Intelligence/TranslatePdfToolView.axaml b/src/PdfEditorApp/Views/Tools/Intelligence/TranslatePdfToolView.axaml deleted file mode 100644 index 2adf853..0000000 --- a/src/PdfEditorApp/Views/Tools/Intelligence/TranslatePdfToolView.axaml +++ /dev/null @@ -1,150 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/Tools/Intelligence/TranslatePdfToolView.axaml.cs b/src/PdfEditorApp/Views/Tools/Intelligence/TranslatePdfToolView.axaml.cs deleted file mode 100644 index 005aab7..0000000 --- a/src/PdfEditorApp/Views/Tools/Intelligence/TranslatePdfToolView.axaml.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Avalonia.Controls; - -namespace PdfEditorApp.Views.Tools.Intelligence; - -public partial class TranslatePdfToolView : UserControl -{ - public TranslatePdfToolView() - { - InitializeComponent(); - } -} diff --git a/src/PdfEditorApp/Views/Tools/Organize/CropPdfToolView.axaml b/src/PdfEditorApp/Views/Tools/Organize/CropPdfToolView.axaml deleted file mode 100644 index ee2791b..0000000 --- a/src/PdfEditorApp/Views/Tools/Organize/CropPdfToolView.axaml +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/Tools/Organize/CropPdfToolView.axaml.cs b/src/PdfEditorApp/Views/Tools/Organize/CropPdfToolView.axaml.cs deleted file mode 100644 index 36ab852..0000000 --- a/src/PdfEditorApp/Views/Tools/Organize/CropPdfToolView.axaml.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Avalonia.Controls; - -namespace PdfEditorApp.Views.Tools.Organize; - -public partial class CropPdfToolView : UserControl -{ - public CropPdfToolView() - { - InitializeComponent(); - } -} diff --git a/src/PdfEditorApp/Views/Tools/Organize/MergePdfToolView.axaml b/src/PdfEditorApp/Views/Tools/Organize/MergePdfToolView.axaml deleted file mode 100644 index de196b5..0000000 --- a/src/PdfEditorApp/Views/Tools/Organize/MergePdfToolView.axaml +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/Tools/Organize/MergePdfToolView.axaml.cs b/src/PdfEditorApp/Views/Tools/Organize/MergePdfToolView.axaml.cs deleted file mode 100644 index 0232fa2..0000000 --- a/src/PdfEditorApp/Views/Tools/Organize/MergePdfToolView.axaml.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Avalonia.Controls; - -namespace PdfEditorApp.Views.Tools.Organize; - -public partial class MergePdfToolView : UserControl -{ - public MergePdfToolView() - { - InitializeComponent(); - } -} diff --git a/src/PdfEditorApp/Views/Tools/Organize/OrganizePdfToolView.axaml b/src/PdfEditorApp/Views/Tools/Organize/OrganizePdfToolView.axaml deleted file mode 100644 index 28685c3..0000000 --- a/src/PdfEditorApp/Views/Tools/Organize/OrganizePdfToolView.axaml +++ /dev/null @@ -1,141 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/Tools/Organize/OrganizePdfToolView.axaml.cs b/src/PdfEditorApp/Views/Tools/Organize/OrganizePdfToolView.axaml.cs deleted file mode 100644 index 1fb639a..0000000 --- a/src/PdfEditorApp/Views/Tools/Organize/OrganizePdfToolView.axaml.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Avalonia.Controls; - -namespace PdfEditorApp.Views.Tools.Organize; - -public partial class OrganizePdfToolView : UserControl -{ - public OrganizePdfToolView() - { - InitializeComponent(); - } -} diff --git a/src/PdfEditorApp/Views/Tools/Organize/PageNumbersToolView.axaml b/src/PdfEditorApp/Views/Tools/Organize/PageNumbersToolView.axaml deleted file mode 100644 index d0c0734..0000000 --- a/src/PdfEditorApp/Views/Tools/Organize/PageNumbersToolView.axaml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/Tools/Organize/PageNumbersToolView.axaml.cs b/src/PdfEditorApp/Views/Tools/Organize/PageNumbersToolView.axaml.cs deleted file mode 100644 index 25668e2..0000000 --- a/src/PdfEditorApp/Views/Tools/Organize/PageNumbersToolView.axaml.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Avalonia.Controls; - -namespace PdfEditorApp.Views.Tools.Organize; - -public partial class PageNumbersToolView : UserControl -{ - public PageNumbersToolView() - { - InitializeComponent(); - } -} diff --git a/src/PdfEditorApp/Views/Tools/Organize/RotatePdfToolView.axaml b/src/PdfEditorApp/Views/Tools/Organize/RotatePdfToolView.axaml deleted file mode 100644 index 3ca454b..0000000 --- a/src/PdfEditorApp/Views/Tools/Organize/RotatePdfToolView.axaml +++ /dev/null @@ -1,196 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/Tools/Organize/RotatePdfToolView.axaml.cs b/src/PdfEditorApp/Views/Tools/Organize/RotatePdfToolView.axaml.cs deleted file mode 100644 index 1a11cd3..0000000 --- a/src/PdfEditorApp/Views/Tools/Organize/RotatePdfToolView.axaml.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Avalonia.Controls; - -namespace PdfEditorApp.Views.Tools.Organize; - -public partial class RotatePdfToolView : UserControl -{ - public RotatePdfToolView() - { - InitializeComponent(); - } -} diff --git a/src/PdfEditorApp/Views/Tools/Organize/SplitPdfToolView.axaml b/src/PdfEditorApp/Views/Tools/Organize/SplitPdfToolView.axaml deleted file mode 100644 index ef6df75..0000000 --- a/src/PdfEditorApp/Views/Tools/Organize/SplitPdfToolView.axaml +++ /dev/null @@ -1,252 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/Tools/Organize/SplitPdfToolView.axaml.cs b/src/PdfEditorApp/Views/Tools/Organize/SplitPdfToolView.axaml.cs deleted file mode 100644 index 45dbdb7..0000000 --- a/src/PdfEditorApp/Views/Tools/Organize/SplitPdfToolView.axaml.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Avalonia.Controls; - -namespace PdfEditorApp.Views.Tools.Organize; - -public partial class SplitPdfToolView : UserControl -{ - public SplitPdfToolView() - { - InitializeComponent(); - } -} diff --git a/src/PdfEditorApp/Views/Tools/Security/CompressPdfToolView.axaml b/src/PdfEditorApp/Views/Tools/Security/CompressPdfToolView.axaml deleted file mode 100644 index 31d6d6e..0000000 --- a/src/PdfEditorApp/Views/Tools/Security/CompressPdfToolView.axaml +++ /dev/null @@ -1,328 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/Tools/Security/CompressPdfToolView.axaml.cs b/src/PdfEditorApp/Views/Tools/Security/CompressPdfToolView.axaml.cs deleted file mode 100644 index 069aefa..0000000 --- a/src/PdfEditorApp/Views/Tools/Security/CompressPdfToolView.axaml.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Avalonia.Controls; - -namespace PdfEditorApp.Views.Tools.Security; - -public partial class CompressPdfToolView : UserControl -{ - public CompressPdfToolView() - { - InitializeComponent(); - } -} diff --git a/src/PdfEditorApp/Views/Tools/Security/ProtectPdfToolView.axaml b/src/PdfEditorApp/Views/Tools/Security/ProtectPdfToolView.axaml deleted file mode 100644 index e4b616c..0000000 --- a/src/PdfEditorApp/Views/Tools/Security/ProtectPdfToolView.axaml +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/Tools/Security/ProtectPdfToolView.axaml.cs b/src/PdfEditorApp/Views/Tools/Security/ProtectPdfToolView.axaml.cs deleted file mode 100644 index a552b33..0000000 --- a/src/PdfEditorApp/Views/Tools/Security/ProtectPdfToolView.axaml.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Avalonia.Controls; - -namespace PdfEditorApp.Views.Tools.Security; - -public partial class ProtectPdfToolView : UserControl -{ - public ProtectPdfToolView() - { - InitializeComponent(); - } -} diff --git a/src/PdfEditorApp/Views/Tools/Security/RedactPdfToolView.axaml b/src/PdfEditorApp/Views/Tools/Security/RedactPdfToolView.axaml deleted file mode 100644 index 9583a14..0000000 --- a/src/PdfEditorApp/Views/Tools/Security/RedactPdfToolView.axaml +++ /dev/null @@ -1,235 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/Tools/Security/RedactPdfToolView.axaml.cs b/src/PdfEditorApp/Views/Tools/Security/RedactPdfToolView.axaml.cs deleted file mode 100644 index a0eb330..0000000 --- a/src/PdfEditorApp/Views/Tools/Security/RedactPdfToolView.axaml.cs +++ /dev/null @@ -1,89 +0,0 @@ -using Avalonia; -using Avalonia.Controls; -using Avalonia.Input; -using PdfEditorApp.ViewModels.Tools.Security; - -namespace PdfEditorApp.Views.Tools.Security; - -public partial class RedactPdfToolView : UserControl -{ - private readonly Border? _liveSelectionBox; - private bool _isDragging; - private bool _dragForceDrawBox; - private Point _dragStart; - - public RedactPdfToolView() - { - InitializeComponent(); - _liveSelectionBox = this.FindControl("LiveSelectionBox"); - } - - private void OnPreviewPointerPressed(object? sender, PointerPressedEventArgs e) - { - if (sender is not InputElement element) return; - if (!e.GetCurrentPoint(element).Properties.IsLeftButtonPressed) return; - - _isDragging = true; - // Captured once at drag start: holding Alt (Option on macOS) switches this one - // drag to raw-rectangle "draw a box" mode instead of the default text-selection - // snapping — matching how modifier-driven mode switches work in the PDF Reader. - _dragForceDrawBox = e.KeyModifiers.HasFlag(KeyModifiers.Alt); - _dragStart = e.GetPosition(element); - e.Pointer.Capture(element); - - if (_liveSelectionBox != null) - { - Canvas.SetLeft(_liveSelectionBox, _dragStart.X); - Canvas.SetTop(_liveSelectionBox, _dragStart.Y); - _liveSelectionBox.Width = 0; - _liveSelectionBox.Height = 0; - _liveSelectionBox.IsVisible = true; - } - } - - private void OnPreviewPointerMoved(object? sender, PointerEventArgs e) - { - if (!_isDragging || sender is not InputElement element || _liveSelectionBox == null) return; - - var pos = e.GetPosition(element); - double x = System.Math.Min(pos.X, _dragStart.X); - double y = System.Math.Min(pos.Y, _dragStart.Y); - double w = System.Math.Abs(pos.X - _dragStart.X); - double h = System.Math.Abs(pos.Y - _dragStart.Y); - - Canvas.SetLeft(_liveSelectionBox, x); - Canvas.SetTop(_liveSelectionBox, y); - _liveSelectionBox.Width = w; - _liveSelectionBox.Height = h; - } - - private void OnPreviewPointerReleased(object? sender, PointerReleasedEventArgs e) - { - if (!_isDragging) return; - _isDragging = false; - e.Pointer.Capture(null); - - if (_liveSelectionBox == null) return; - _liveSelectionBox.IsVisible = false; - - if (DataContext is RedactPdfToolViewModel vm && _liveSelectionBox.Width >= 2 && _liveSelectionBox.Height >= 2) - { - var rect = new Rect( - Canvas.GetLeft(_liveSelectionBox), - Canvas.GetTop(_liveSelectionBox), - _liveSelectionBox.Width, - _liveSelectionBox.Height); - vm.AddManualMark(rect, _dragForceDrawBox); - } - } - - private void OnPreviewPointerWheelChanged(object? sender, PointerWheelEventArgs e) - { - bool zoomModifier = e.KeyModifiers.HasFlag(KeyModifiers.Control) || e.KeyModifiers.HasFlag(KeyModifiers.Meta); - if (!zoomModifier || DataContext is not RedactPdfToolViewModel vm) return; - - if (e.Delta.Y > 0) vm.Preview.ZoomInCommand.Execute(null); - else if (e.Delta.Y < 0) vm.Preview.ZoomOutCommand.Execute(null); - e.Handled = true; - } -} diff --git a/src/PdfEditorApp/Views/Tools/Security/RepairPdfToolView.axaml b/src/PdfEditorApp/Views/Tools/Security/RepairPdfToolView.axaml deleted file mode 100644 index b13a44c..0000000 --- a/src/PdfEditorApp/Views/Tools/Security/RepairPdfToolView.axaml +++ /dev/null @@ -1,140 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/Tools/Security/RepairPdfToolView.axaml.cs b/src/PdfEditorApp/Views/Tools/Security/RepairPdfToolView.axaml.cs deleted file mode 100644 index 6c3c1f3..0000000 --- a/src/PdfEditorApp/Views/Tools/Security/RepairPdfToolView.axaml.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Avalonia.Controls; - -namespace PdfEditorApp.Views.Tools.Security; - -public partial class RepairPdfToolView : UserControl -{ - public RepairPdfToolView() - { - InitializeComponent(); - } -} diff --git a/src/PdfEditorApp/Views/Tools/Security/SignPdfToolView.axaml b/src/PdfEditorApp/Views/Tools/Security/SignPdfToolView.axaml deleted file mode 100644 index 78e77cf..0000000 --- a/src/PdfEditorApp/Views/Tools/Security/SignPdfToolView.axaml +++ /dev/null @@ -1,197 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/Tools/Security/SignPdfToolView.axaml.cs b/src/PdfEditorApp/Views/Tools/Security/SignPdfToolView.axaml.cs deleted file mode 100644 index a8af422..0000000 --- a/src/PdfEditorApp/Views/Tools/Security/SignPdfToolView.axaml.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Avalonia.Controls; - -namespace PdfEditorApp.Views.Tools.Security; - -public partial class SignPdfToolView : UserControl -{ - public SignPdfToolView() - { - InitializeComponent(); - } -} diff --git a/src/PdfEditorApp/Views/Tools/Security/UnlockPdfToolView.axaml b/src/PdfEditorApp/Views/Tools/Security/UnlockPdfToolView.axaml deleted file mode 100644 index f694355..0000000 --- a/src/PdfEditorApp/Views/Tools/Security/UnlockPdfToolView.axaml +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/Tools/Security/UnlockPdfToolView.axaml.cs b/src/PdfEditorApp/Views/Tools/Security/UnlockPdfToolView.axaml.cs deleted file mode 100644 index 85bad9b..0000000 --- a/src/PdfEditorApp/Views/Tools/Security/UnlockPdfToolView.axaml.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Avalonia.Controls; - -namespace PdfEditorApp.Views.Tools.Security; - -public partial class UnlockPdfToolView : UserControl -{ - public UnlockPdfToolView() - { - InitializeComponent(); - } -} diff --git a/src/PdfEditorApp/Views/Tools/Security/WatermarkToolView.axaml b/src/PdfEditorApp/Views/Tools/Security/WatermarkToolView.axaml deleted file mode 100644 index 7ab4ec5..0000000 --- a/src/PdfEditorApp/Views/Tools/Security/WatermarkToolView.axaml +++ /dev/null @@ -1,231 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/Tools/Security/WatermarkToolView.axaml.cs b/src/PdfEditorApp/Views/Tools/Security/WatermarkToolView.axaml.cs deleted file mode 100644 index f001468..0000000 --- a/src/PdfEditorApp/Views/Tools/Security/WatermarkToolView.axaml.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Avalonia.Controls; - -namespace PdfEditorApp.Views.Tools.Security; - -public partial class WatermarkToolView : UserControl -{ - public WatermarkToolView() - { - InitializeComponent(); - } -} diff --git a/src/PdfEditorApp/Views/TrashCachePageView.axaml b/src/PdfEditorApp/Views/TrashCachePageView.axaml deleted file mode 100644 index f312e6c..0000000 --- a/src/PdfEditorApp/Views/TrashCachePageView.axaml +++ /dev/null @@ -1,205 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/PdfEditorApp/Views/TrashCachePageView.axaml.cs b/src/PdfEditorApp/Views/TrashCachePageView.axaml.cs deleted file mode 100644 index 61c600c..0000000 --- a/src/PdfEditorApp/Views/TrashCachePageView.axaml.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Avalonia.Controls; - -namespace PdfEditorApp.Views; - -public partial class TrashCachePageView : UserControl -{ - public TrashCachePageView() - { - InitializeComponent(); - } -} diff --git a/src/PdfEditorApp/app.manifest b/src/PdfEditorApp/app.manifest deleted file mode 100644 index 7b162c6..0000000 --- a/src/PdfEditorApp/app.manifest +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - diff --git a/test b/test deleted file mode 100755 index 275d41d..0000000 --- a/test +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash -dotnet clean - -dotnet test tests/PdfEditorApp.Tests "$@" diff --git a/tests/PdfEditorApp.Tests/AiServiceTests.cs b/tests/PdfEditorApp.Tests/AiServiceTests.cs deleted file mode 100644 index 5819eac..0000000 --- a/tests/PdfEditorApp.Tests/AiServiceTests.cs +++ /dev/null @@ -1,1091 +0,0 @@ -using System; -using System.IO; -using System.Linq; -using System.Text.Json; -using System.Threading; -using System.Threading.Tasks; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; -using PdfEditorApp.Models; -using PdfEditorApp.Services; -using PdfEditorApp.Services.AI; -using PdfEditorApp.ViewModels; -using PdfEditorApp.ViewModels.ElementViewModels; -using Xunit; - -namespace PdfEditorApp.Tests; - -public class AiServiceTests : IDisposable -{ - private readonly string _tempDir; - private readonly string _tempSettingsPath; - - public AiServiceTests() - { - _tempDir = Path.Combine(Path.GetTempPath(), "FryPdf_AiServiceTests_" + Guid.NewGuid().ToString("N")); - Directory.CreateDirectory(_tempDir); - _tempSettingsPath = Path.Combine(_tempDir, "ui_settings.json"); - } - - public void Dispose() - { - try - { - if (Directory.Exists(_tempDir)) - { - Directory.Delete(_tempDir, true); - } - } - catch - { - // Best effort cleanup - } - } - - [Fact] - public void AiModelInfo_TierAndBadges_CalculatedCorrectly() - { - // 1. Free Local Model - var localModel = new AiModelInfo - { - Id = "llama3.2:latest", - DisplayName = "Llama 3.2", - Provider = AiProviderType.OllamaLocal, - Tier = AiModelTier.FreeLocal, - SizeBytes = 2_000_000_000L - }; - - Assert.True(localModel.IsFree); - Assert.False(localModel.IsCloud); - Assert.Equal("Free / Local", localModel.TierBadgeText); - Assert.Equal("#DCFCE7", localModel.BadgeBackgroundColor); - Assert.Contains("[Free / Local]", localModel.FullTitleWithBadge); - - // 2. Free Cloud Tier Model (e.g. Ollama Cloud Free, Groq Free) - var freeCloudModel = new AiModelInfo - { - Id = "llama-3.1-8b-instant", - DisplayName = "Llama 3.1 8B (Groq Free Cloud)", - Provider = AiProviderType.CustomOpenAiCompatible, - Tier = AiModelTier.FreeCloud - }; - - Assert.True(freeCloudModel.IsFree); - Assert.True(freeCloudModel.IsCloud); - Assert.Equal("Free / Cloud", freeCloudModel.TierBadgeText); - Assert.Equal("#E0F2FE", freeCloudModel.BadgeBackgroundColor); - Assert.Contains("[Free / Cloud]", freeCloudModel.FullTitleWithBadge); - - // 3. Paid Cloud Model - var cloudModel = new AiModelInfo - { - Id = "gpt-4o-mini", - DisplayName = "GPT-4o Mini", - Provider = AiProviderType.OpenAiCloud, - Tier = AiModelTier.PaidCloud - }; - - Assert.False(cloudModel.IsFree); - Assert.True(cloudModel.IsCloud); - Assert.Equal("Paid / Cloud", cloudModel.TierBadgeText); - Assert.Equal("#EDE9FE", cloudModel.BadgeBackgroundColor); - Assert.Contains("[Paid / Cloud]", cloudModel.FullTitleWithBadge); - } - - [Theory] - [InlineData(0, "")] - [InlineData(-100, "")] - [InlineData(500 * 1024, "500.0 KB")] - [InlineData(100 * 1024 * 1024, "100.0 MB")] - [InlineData(2147483648L, "2.0 GB")] - public void AiModelInfo_FormatBytes_FormatsAsExpected(long bytes, string expected) - { - string actual = AiModelInfo.FormatBytes(bytes); - Assert.Equal(expected, actual); - } - - [Fact] - public void AiSettingsModel_DefaultsAndClone_WorkProperly() - { - var settings = new AiSettingsModel(); - - Assert.Equal(AiProviderType.OllamaLocal, settings.SelectedProvider); - Assert.Equal("http://localhost:11434", settings.OllamaEndpoint); - Assert.False(settings.IsOllamaRemote); - Assert.Equal("llama3.2", settings.SelectedModelId); - Assert.Equal(0.7f, settings.Temperature); - - settings.OllamaApiKey = "ollama-cloud-jwt-token"; - settings.OpenAiApiKey = "sk-test-dummy-key"; - settings.CustomBaseUrl = "https://api.groq.com/openai/v1"; - settings.DiscoveredOllamaModels.Add(new AiModelInfo { Id = "test-model", DisplayName = "Test" }); - - var clone = settings.Clone(); - - Assert.NotNull(clone); - Assert.Equal(settings.SelectedProvider, clone.SelectedProvider); - Assert.Equal(settings.OllamaEndpoint, clone.OllamaEndpoint); - Assert.Equal(settings.OllamaApiKey, clone.OllamaApiKey); - Assert.Equal(settings.OpenAiApiKey, clone.OpenAiApiKey); - Assert.Equal(settings.CustomBaseUrl, clone.CustomBaseUrl); - Assert.Single(clone.DiscoveredOllamaModels); - Assert.Equal("test-model", clone.DiscoveredOllamaModels[0].Id); - - // Remote Ollama detection - clone.OllamaEndpoint = "https://ollama.mycompany.cloud"; - Assert.True(clone.IsOllamaRemote); - - // Verify independent instance - clone.DiscoveredOllamaModels.Clear(); - Assert.Single(settings.DiscoveredOllamaModels); - } - - [Fact] - public void AiSettingsModel_JsonSerialization_RoundtripsAccurately() - { - var original = new AiSettingsModel - { - SelectedProvider = AiProviderType.CustomOpenAiCompatible, - OllamaApiKey = "my-token", - CustomBaseUrl = "http://localhost:8080/v1", - CustomModelName = "mistral-small", - Temperature = 0.5f, - SystemInstructions = "Always use blue accent colors" - }; - - string json = JsonSerializer.Serialize(original); - var deserialized = JsonSerializer.Deserialize(json); - - Assert.NotNull(deserialized); - Assert.Equal(original.SelectedProvider, deserialized.SelectedProvider); - Assert.Equal(original.OllamaApiKey, deserialized.OllamaApiKey); - Assert.Equal(original.CustomBaseUrl, deserialized.CustomBaseUrl); - Assert.Equal(original.CustomModelName, deserialized.CustomModelName); - Assert.Equal(original.Temperature, deserialized.Temperature); - Assert.Equal(original.SystemInstructions, deserialized.SystemInstructions); - } - - [Fact] - public void AiService_GetCloudCatalogModels_ReturnsBothFreeAndPaidTiers() - { - var aiService = new AiService(); - var models = aiService.GetCloudCatalogModels(); - - Assert.NotEmpty(models); - - // Must contain Free Cloud tier models (e.g. Groq free tier, OpenRouter free) - var freeCloud = models.Where(m => m.Tier == AiModelTier.FreeCloud).ToList(); - Assert.NotEmpty(freeCloud); - Assert.All(freeCloud, m => - { - Assert.True(m.IsFree); - Assert.True(m.IsCloud); - Assert.Equal("Free / Cloud", m.TierBadgeText); - }); - - // Must contain Paid Cloud tier models (e.g. OpenAI GPT-4o) - var paidCloud = models.Where(m => m.Tier == AiModelTier.PaidCloud).ToList(); - Assert.NotEmpty(paidCloud); - Assert.All(paidCloud, m => - { - Assert.False(m.IsFree); - Assert.True(m.IsCloud); - Assert.Equal("Paid / Cloud", m.TierBadgeText); - }); - - Assert.Contains(models, m => m.Id == "gpt-4o-mini"); - Assert.Contains(models, m => m.Id == "gpt-4o"); - Assert.Contains(models, m => m.Id == "llama-3.1-8b-instant"); - } - - [Fact] - public void AiService_GetUnifiedModelCatalog_IncludesExpectedModels() - { - var aiService = new AiService(); - var settings = new AiSettingsModel - { - SelectedProvider = AiProviderType.OllamaLocal - }; - settings.DiscoveredOllamaModels.Add(new AiModelInfo - { - Id = "custom-llama:latest", - DisplayName = "Custom Llama", - Provider = AiProviderType.OllamaLocal, - Tier = AiModelTier.FreeLocal - }); - - var catalog = aiService.GetUnifiedModelCatalog(settings); - - Assert.NotEmpty(catalog); - Assert.Contains(catalog, m => m.Id == "custom-llama:latest"); - - // When switching to OpenAI provider, catalog includes cloud models - settings.SelectedProvider = AiProviderType.OpenAiCloud; - var cloudCatalog = aiService.GetUnifiedModelCatalog(settings); - Assert.Contains(cloudCatalog, m => m.Id == "gpt-4o-mini"); - Assert.Contains(cloudCatalog, m => m.Tier == AiModelTier.FreeCloud); - } - - [Fact] - public async Task AiService_DiscoverOllamaModelsAsync_HandlesUnreachableEndpointGracefully() - { - var aiService = new AiService(); - // Use an unassigned port that won't respond - var models = await aiService.DiscoverOllamaModelsAsync("http://127.0.0.1:59999", CancellationToken.None); - - Assert.NotNull(models); - Assert.Empty(models); - } - - [Fact] - public async Task AiService_TestConnectionAsync_ReportsFailureForEmptyCloudApiKey() - { - var aiService = new AiService(); - var settings = new AiSettingsModel - { - SelectedProvider = AiProviderType.OpenAiCloud, - OpenAiApiKey = "" - }; - - var (success, message, _) = await aiService.TestConnectionAsync(settings, CancellationToken.None); - - Assert.False(success); - Assert.Contains("API Key", message, StringComparison.OrdinalIgnoreCase); - } - - [Fact] - public void AiSettingsViewModel_InitializesAndUpdatesCatalog() - { - var uiSettings = new UiSettingsService(_tempSettingsPath); - var aiService = new AiService(); - var vm = new AiSettingsViewModel(uiSettings, aiService); - - Assert.NotNull(vm.AvailableModels); - Assert.NotEmpty(vm.AvailableModels); - Assert.NotNull(vm.SelectedModel); - - // Switch to Cloud provider - vm.SelectedProvider = AiProviderType.OpenAiCloud; - Assert.NotEmpty(vm.AvailableModels); - Assert.Contains(vm.AvailableModels, m => !m.IsFree); - Assert.Contains(vm.AvailableModels, m => m.Id == "gpt-4o-mini"); - Assert.Contains(vm.AvailableModels, m => m.Tier == AiModelTier.FreeCloud); - } - - [Fact] - public void AiAssistantViewModel_InitialStateAndPrompts_AreValid() - { - var uiSettings = new UiSettingsService(_tempSettingsPath); - var aiService = new AiService(); - var agentService = new PdfStudioAgentService(aiService); - var vm = new AiAssistantViewModel(agentService, uiSettings, aiService); - - Assert.False(vm.IsOpen); - Assert.False(vm.IsGenerating); - Assert.NotEmpty(vm.SuggestedPrompts); - Assert.Contains(vm.SuggestedPrompts, p => p.Contains("Invoice", StringComparison.OrdinalIgnoreCase)); - - vm.Open(); - Assert.True(vm.IsOpen); - - vm.Close(); - Assert.False(vm.IsOpen); - } - - [Fact] - public async Task PdfStudioAgentService_ExecutePromptAsync_ValidatesInput() - { - var aiService = new AiService(); - var agentService = new PdfStudioAgentService(aiService); - var settings = new AiSettingsModel(); - - // Empty prompt test - var emptyResult = await agentService.ExecutePromptAsync("", null!, settings); - Assert.False(emptyResult.Success); - Assert.Contains("empty", emptyResult.Message, StringComparison.OrdinalIgnoreCase); - - // Null target page test - var nullPageResult = await agentService.ExecutePromptAsync("Create heading", null!, settings); - Assert.False(nullPageResult.Success); - Assert.Contains("required", nullPageResult.Message, StringComparison.OrdinalIgnoreCase); - } - - [Fact] - public void ParseOllamaLibraryHtml_ExtractsModelsAndCloudBadgesAccurately() - { - string sampleHtml = """ -
  • - -
    -

    - qwen3.8-flash-next -

    -

    This experimental preview of the architecture that will underpin Qwen4.

    -
    -
    -
    - vision - tools - thinking -
    -

    - 69.7K -

    -
    -
    -
  • -
  • - -
    -

    - glm-5.3-flash -

    -

    Z.ai's first natively multimodal model with 18B active parameters.

    -
    -
    -
    - vision - tools - thinking - cloud -
    -
    -
    -
  • - """; - - var models = AiService.ParseOllamaLibraryHtml(sampleHtml); - - Assert.Equal(2, models.Count); - - // Model 1: Local - var qwen = models.First(m => m.Id == "qwen3.8-flash-next"); - Assert.Equal(AiModelTier.FreeLocal, qwen.Tier); - Assert.Contains("Vision", qwen.Capabilities); - Assert.Contains("Tools", qwen.Capabilities); - Assert.Contains("Thinking", qwen.Capabilities); - Assert.Contains("69.7K pulls", qwen.FormattedSize); - - // Model 2: Cloud - var glm = models.First(m => m.Id == "glm-5.3-flash"); - Assert.Equal(AiModelTier.FreeCloud, glm.Tier); - Assert.Equal("Ollama Cloud", glm.FormattedSize); - Assert.Equal("18B", glm.ParameterSize); - } - - [Fact] - public void AiSettingsViewModel_CustomModelTyping_SynthesizesNonEmptyMetadata() - { - var uiSettings = new UiSettingsService(_tempSettingsPath); - var aiService = new AiService(); - var vm = new AiSettingsViewModel(uiSettings, aiService); - - // Type an unlisted custom model - vm.SelectedModelId = "custom-nemotron-70b-preview"; - - var activeInfo = vm.ActiveModelInfo; - Assert.NotNull(activeInfo); - Assert.Equal("custom-nemotron-70b-preview", activeInfo.Id); - Assert.Equal("custom-nemotron-70b-preview", activeInfo.DisplayName); - Assert.Equal(AiModelTier.FreeLocal, activeInfo.Tier); - Assert.False(string.IsNullOrWhiteSpace(activeInfo.TierBadgeText)); - } - - [Theory] - [InlineData("https://api.groq.com/openai/v1/chat/completions", "https://api.groq.com/openai/v1")] - [InlineData("https://api.groq.com/openai/v1/chat/completions/", "https://api.groq.com/openai/v1")] - [InlineData("https://api.groq.com/openai/v1", "https://api.groq.com/openai/v1")] - [InlineData("https://api.groq.com/openai/v1/", "https://api.groq.com/openai/v1")] - [InlineData("https://openrouter.ai/api/v1/chat/completions", "https://openrouter.ai/api/v1")] - [InlineData(null, "https://api.openai.com/v1")] - [InlineData("", "https://api.openai.com/v1")] - [InlineData(" ", "https://api.openai.com/v1")] - public void AiService_NormalizeCustomOpenAiBaseUrl_SanitizesEndpoints(string? input, string expected) - { - string actual = AiService.NormalizeCustomOpenAiBaseUrl(input); - Assert.Equal(expected, actual); - } - - [Fact] - public void AiSettingsViewModel_CustomModelName_SynchronizesWithSelectedModelId() - { - var uiSettings = new UiSettingsService(_tempSettingsPath); - var aiService = new AiService(); - var vm = new AiSettingsViewModel(uiSettings, aiService) - { - SelectedProvider = AiProviderType.CustomOpenAiCompatible - }; - - // User types custom model into CustomModelName field - vm.CustomModelName = "qwen/qwen3.6-27b"; - - Assert.Equal("qwen/qwen3.6-27b", vm.SelectedModelId); - Assert.Equal("qwen/qwen3.6-27b", vm.ActiveModelInfo.Id); - - // Selecting a model from the list updates CustomModelName as well - vm.SelectedModelId = "openai/gpt-oss-120b"; - Assert.Equal("openai/gpt-oss-120b", vm.CustomModelName); - } - - [Theory] - [InlineData("groq", "https://api.groq.com/openai/v1", "openai/gpt-oss-120b")] - [InlineData("openrouter", "https://openrouter.ai/api/v1", "meta-llama/llama-3.2-3b-instruct:free")] - [InlineData("together", "https://api.together.xyz/v1", "meta-llama/Llama-3.3-70B-Instruct-Turbo")] - [InlineData("lmstudio", "http://localhost:1234/v1", "local-model")] - public void AiSettingsViewModel_ApplyPreset_ConfiguresProviderAndModelsCorrectly(string preset, string expectedUrl, string expectedModel) - { - var uiSettings = new UiSettingsService(_tempSettingsPath); - var aiService = new AiService(); - var vm = new AiSettingsViewModel(uiSettings, aiService) - { - SelectedProvider = AiProviderType.CustomOpenAiCompatible - }; - - vm.ApplyPreset(preset); - - Assert.Equal(expectedUrl, vm.CustomBaseUrl); - Assert.Equal(expectedModel, vm.SelectedModelId); - Assert.Equal(expectedModel, vm.CustomModelName); - } - - [Fact] - public void AiSettingsViewModel_CustomCompatibleMode_ExcludesOllamaModelsAndProvidesDynamicHistory() - { - var uiSettings = new UiSettingsService(_tempSettingsPath); - uiSettings.UpdateSettings(s => - { - s.AiSettings.DiscoveredOllamaModels.Clear(); - s.AiSettings.DiscoveredOllamaModels.Add(new AiModelInfo { Id = "ollama-local-exclusive", DisplayName = "Ollama Local Only", Provider = AiProviderType.OllamaLocal }); - }); - - var aiService = new AiService(); - var vm = new AiSettingsViewModel(uiSettings, aiService) - { - SelectedProvider = AiProviderType.CustomOpenAiCompatible, - CustomBaseUrl = "https://api.groq.com/openai/v1" - }; - - // Assert Ollama model is NOT present in AvailableModels - Assert.DoesNotContain(vm.AvailableModels, m => m.Id == "ollama-local-exclusive"); - - // Assert Groq/cloud models are present - Assert.Contains(vm.AvailableModels, m => m.Id == "openai/gpt-oss-120b"); - - // Assert dynamic subtitle and placeholder - Assert.Contains("custom model identifier", vm.ModelSectionSubtitle, StringComparison.OrdinalIgnoreCase); - Assert.Contains("ANY", vm.ModelInputPlaceholder); - } - - [Fact] - public void AiSettingsViewModel_SaveCustomModel_FutureProofWithoutCodeChanges() - { - var uiSettings = new UiSettingsService(_tempSettingsPath); - var aiService = new AiService(); - var vm = new AiSettingsViewModel(uiSettings, aiService) - { - SelectedProvider = AiProviderType.CustomOpenAiCompatible, - CustomBaseUrl = "https://api.groq.com/openai/v1" - }; - - // User enters a brand new future model not known in the codebase - string futureModelId = "meta-llama/llama-4-scintilla-400b"; - vm.SelectedModelId = futureModelId; - vm.SaveCustomModel(futureModelId); - - // Model is immediately remembered in history - Assert.Contains(futureModelId, vm.CustomModelHistory); - - // Model is in AvailableModels catalog - Assert.Contains(vm.AvailableModels, m => m.Id == futureModelId); - - // ActiveModelInfo reflects the future model - Assert.Equal(futureModelId, vm.ActiveModelInfo.Id); - - // Future model is persisted in settings storage - Assert.Contains(futureModelId, uiSettings.Settings.AiSettings.CustomModelHistory); - } - - [Fact] - public async Task ModifyElementAsync_Chart_ModifiesChartTypeAndPalette() - { - var aiService = new AiService(); - var undoRedo = new UndoRedoService(); - var agent = new PdfStudioAgentService(aiService, undoRedo); - - var chartVm = new PdfEditorApp.ViewModels.ElementViewModels.ChartElementViewModel - { - Title = "FY 2026 Quarterly Revenue Trajectory ($ Billions)", - ChartType = ChartType.BarColumn, - Palette = ChartPalette.CorporateBlue - }; - chartVm.Bars.Add(new PdfEditorApp.ViewModels.ElementViewModels.ChartBarItem { Category = "Q1", Value = 0.65, ValueLabel = "$0.65B" }); - chartVm.Bars.Add(new PdfEditorApp.ViewModels.ElementViewModels.ChartBarItem { Category = "Q2", Value = 0.74, ValueLabel = "$0.74B" }); - chartVm.Bars.Add(new PdfEditorApp.ViewModels.ElementViewModels.ChartBarItem { Category = "Q3", Value = 0.82, ValueLabel = "$0.82B" }); - chartVm.Bars.Add(new PdfEditorApp.ViewModels.ElementViewModels.ChartBarItem { Category = "Q4", Value = 0.89, ValueLabel = "$0.89B" }); - - var settings = new AiSettingsModel(); - - // Prompt requesting Line chart, emerald palette, and 2027 projection - var result = await agent.ModifyElementAsync( - chartVm, - "Change to a smooth Line chart with emerald green palette and add 2027 projection", - settings); - - Assert.True(result.Success); - Assert.Equal(ChartType.SmoothLine, chartVm.ChartType); - Assert.Equal(ChartPalette.EmeraldGreen, chartVm.Palette); - Assert.True(chartVm.Bars.Count >= 5); - Assert.Contains(chartVm.Bars, b => b.Category.Contains("2027")); - } - - [Fact] - public async Task ModifyElementAsync_Text_ModifiesTypographyAndContent() - { - var aiService = new AiService(); - var undoRedo = new UndoRedoService(); - var agent = new PdfStudioAgentService(aiService, undoRedo); - - var textVm = new PdfEditorApp.ViewModels.ElementViewModels.TextElementViewModel - { - Text = "Net profit margins expanded by 4.2% year-over-year.", - FontSize = 12, - IsBold = false, - TextColorHex = "#201F1E" - }; - - var settings = new AiSettingsModel(); - - var result = await agent.ModifyElementAsync( - textVm, - "Make bold, 18pt, blue color, center aligned, and executive tone", - settings); - - Assert.True(result.Success); - Assert.True(textVm.IsBold); - Assert.Equal(18, textVm.FontSize); - Assert.Equal("#0F6CBD", textVm.TextColorHex); - Assert.Equal(TextAlignmentMode.Center, textVm.Alignment); - Assert.Contains("Executive Summary:", textVm.Text); - } - - [Fact] - public async Task ModifyElementAsync_Table_AddsSummaryRow() - { - var aiService = new AiService(); - var undoRedo = new UndoRedoService(); - var agent = new PdfStudioAgentService(aiService, undoRedo); - - var tableVm = new PdfEditorApp.ViewModels.ElementViewModels.TableElementViewModel(); - tableVm.Headers.Clear(); - tableVm.Headers.Add(new PdfEditorApp.ViewModels.ElementViewModels.TableHeaderItem("Department")); - tableVm.Headers.Add(new PdfEditorApp.ViewModels.ElementViewModels.TableHeaderItem("Headcount")); - tableVm.Headers.Add(new PdfEditorApp.ViewModels.ElementViewModels.TableHeaderItem("Budget")); - - tableVm.Rows.Clear(); - tableVm.Rows.Add(new PdfEditorApp.ViewModels.ElementViewModels.TableRowItem(new[] { "Engineering", "45", "$450,000" })); - tableVm.Rows.Add(new PdfEditorApp.ViewModels.ElementViewModels.TableRowItem(new[] { "Product", "12", "$120,000" })); - - var settings = new AiSettingsModel(); - - var result = await agent.ModifyElementAsync( - tableVm, - "Add a total row and use emerald green header", - settings); - - Assert.True(result.Success); - Assert.Equal(3, tableVm.Rows.Count); - Assert.Equal("Total", tableVm.Rows[2].Cells[0].Text); - Assert.Equal("#047857", tableVm.HeaderBackgroundHex); - } - - [Fact] - public async Task ModifyElementAsync_UndoRedo_RestoresOriginalState() - { - var aiService = new AiService(); - var undoRedo = new UndoRedoService(); - var agent = new PdfStudioAgentService(aiService, undoRedo); - - var chartVm = new PdfEditorApp.ViewModels.ElementViewModels.ChartElementViewModel - { - Title = "Original Bar Chart", - ChartType = ChartType.BarColumn, - Palette = ChartPalette.CorporateBlue - }; - - var settings = new AiSettingsModel(); - - var result = await agent.ModifyElementAsync( - chartVm, - "Switch to Line chart with sunset orange palette", - settings); - - Assert.True(result.Success); - Assert.Equal(ChartType.Line, chartVm.ChartType); - Assert.Equal(ChartPalette.SunsetOrange, chartVm.Palette); - Assert.True(undoRedo.CanUndo); - - // Perform Undo - undoRedo.Undo(); - - // State is completely restored to original - Assert.Equal("Original Bar Chart", chartVm.Title); - Assert.Equal(ChartType.BarColumn, chartVm.ChartType); - Assert.Equal(ChartPalette.CorporateBlue, chartVm.Palette); - - // Perform Redo - Assert.True(undoRedo.CanRedo); - undoRedo.Redo(); - - Assert.Equal(ChartType.Line, chartVm.ChartType); - Assert.Equal(ChartPalette.SunsetOrange, chartVm.Palette); - } - - [Fact] - public void AiAssistantViewModel_OpenForElement_SwitchesToModifyModeAndPopulatesElementSuggestions() - { - var aiService = new AiService(); - var undoRedo = new UndoRedoService(); - var agent = new PdfStudioAgentService(aiService, undoRedo); - var uiSettings = new UiSettingsService(_tempSettingsPath); - - var vm = new AiAssistantViewModel(agent, uiSettings, aiService); - - var chartVm = new PdfEditorApp.ViewModels.ElementViewModels.ChartElementViewModel - { - Title = "FY 2026 Revenue Trajectory", - ChartType = ChartType.BarColumn - }; - - // Open targeting chart - vm.OpenForElement(chartVm); - - Assert.True(vm.IsOpen); - Assert.True(vm.IsModifyMode); - Assert.True(vm.HasTargetElement); - Assert.Same(chartVm, vm.TargetElement); - Assert.Equal("FY 2026 Revenue Trajectory", vm.TargetElementTitle); - Assert.Equal("Chart", vm.TargetElementKindBadge); - - // Verify contextual suggestions were generated for chart - Assert.NotEmpty(vm.SuggestedPrompts); - Assert.Contains(vm.SuggestedPrompts, p => p.Contains("Line chart", StringComparison.OrdinalIgnoreCase)); - Assert.Contains(vm.SuggestedPrompts, p => p.Contains("Emerald Green", StringComparison.OrdinalIgnoreCase)); - - // Switch to create mode - vm.SwitchToCreateMode(); - Assert.False(vm.IsModifyMode); - Assert.Contains(vm.SuggestedPrompts, p => p.Contains("invoice header", StringComparison.OrdinalIgnoreCase)); - - // Switch back to modify mode - vm.SwitchToModifyMode(); - Assert.True(vm.IsModifyMode); - Assert.Contains(vm.SuggestedPrompts, p => p.Contains("Line chart", StringComparison.OrdinalIgnoreCase)); - } - - [Fact] - public void MainViewModel_AskAiToModify_OpensAiAssistantForSelectedElement() - { - var mainVm = new MainViewModel(); - Assert.NotNull(mainVm.CurrentPage); - - var chartVm = new PdfEditorApp.ViewModels.ElementViewModels.ChartElementViewModel - { - Title = "FY 2026 Quarterly Revenue Trajectory ($ Billions)" - }; - - // Select the chart on the current page - mainVm.CurrentPage.AddElement(chartVm); - mainVm.CurrentPage.SelectElement(chartVm); - - // Execute AskAiToModifyCommand - mainVm.AskAiToModifyCommand.Execute(null); - - // Assert AiAssistant opened in modify mode targeting the chart - Assert.True(mainVm.AiAssistant.IsOpen); - Assert.True(mainVm.AiAssistant.IsModifyMode); - Assert.Same(chartVm, mainVm.AiAssistant.TargetElement); - Assert.Equal("FY 2026 Quarterly Revenue Trajectory ($ Billions)", mainVm.AiAssistant.TargetElementTitle); - } - - [Fact] - public async Task PdfStudioAgentService_ModifyTextElement_WithBulletsOrCheckmarks_TransformsContentCorrectly() - { - var aiService = new AiService(); - var undoRedo = new UndoRedoService(); - var agent = new PdfStudioAgentService(aiService, undoRedo); - - var textVm = new TextElementViewModel - { - Text = "Acquisition of TechNova AI\nEnterprise Customer Expansion\nMultiplatform Engine Upgrade", - FontSize = 14, - IsBold = false, - TextColorHex = "#201F1E" - }; - - var settings = new AiSettingsModel(); - var result = await agent.ModifyElementAsync(textVm, "add checkmarks and make bold in emerald green", settings); - - Assert.True(result.Success); - Assert.Contains("✔", textVm.Text); - Assert.True(textVm.IsBold); - Assert.Equal("#16A34A", textVm.TextColorHex); - Assert.True(undoRedo.CanUndo); - - // Verify Undo restores original text and styling - undoRedo.Undo(); - Assert.False(textVm.IsBold); - Assert.DoesNotContain("✔", textVm.Text); - Assert.Equal("#201F1E", textVm.TextColorHex); - - // Verify Redo reapplies modifications - undoRedo.Redo(); - Assert.Contains("✔", textVm.Text); - Assert.True(textVm.IsBold); - Assert.Equal("#16A34A", textVm.TextColorHex); - } - - [Fact] - public async Task PdfStudioAgentService_ModifyMathFormula_TransformsLatexAndSize() - { - var aiService = new AiService(); - var undoRedo = new UndoRedoService(); - var agent = new PdfStudioAgentService(aiService, undoRedo); - var settings = new AiSettingsModel(); - - var mathVm = new MathElementViewModel - { - Formula = "x + y = z", - FontSize = 16, - TextColorHex = "#333333" - }; - - var result = await agent.ModifyElementAsync(mathVm, "change to pythagorean theorem with font size 24 and navy text", settings); - - Assert.True(result.Success); - Assert.Equal("a^2 + b^2 = c^2", mathVm.Formula); - Assert.Equal(24, mathVm.FontSize); - Assert.Equal("#0F172A", mathVm.TextColorHex); - - // Test Quadratic formula prompt - var result2 = await agent.ModifyElementAsync(mathVm, "change to quadratic formula with emerald text", settings); - Assert.True(result2.Success); - Assert.Contains(@"\frac{-b \pm \sqrt{b^2 - 4ac}}{2a}", mathVm.Formula); - Assert.Equal("#059669", mathVm.TextColorHex); - } - - [Fact] - public async Task PdfStudioAgentService_ModifyImageAndQrCodeElements_UpdatesProperties() - { - var aiService = new AiService(); - var undoRedo = new UndoRedoService(); - var agent = new PdfStudioAgentService(aiService, undoRedo); - var settings = new AiSettingsModel(); - - // 1. Image Element - var imgVm = new ImageElementViewModel - { - Opacity = 1.0, - CornerRadius = 0 - }; - - var imgResult = await agent.ModifyElementAsync(imgVm, "set opacity to 50% and rounded corners", settings); - Assert.True(imgResult.Success); - Assert.Equal(0.5, imgVm.Opacity, 2); - Assert.Equal(8, imgVm.CornerRadius); - - // 2. QR Code Element - var qrVm = new QrCodeElementViewModel - { - Content = "https://example.org/old", - DarkColorHex = "#000000" - }; - - var qrResult = await agent.ModifyElementAsync(qrVm, "change url to https://frypdf.com/verify and dark color navy", settings); - Assert.True(qrResult.Success); - Assert.Equal("https://frypdf.com/verify", qrVm.Content); - Assert.Equal("#1E293B", qrVm.DarkColorHex); - } - - [Fact] - public void AiAssistantViewModel_OpenForDifferentElementTypes_ConfiguresIconTitleAndSuggestions() - { - var aiService = new AiService(); - var undoRedo = new UndoRedoService(); - var agent = new PdfStudioAgentService(aiService, undoRedo); - var uiSettings = new UiSettingsService(_tempSettingsPath); - var vm = new AiAssistantViewModel(agent, uiSettings, aiService); - - // Text element - var textVm = new TextElementViewModel { Text = "Acquisition of TechNova AI" }; - vm.OpenForElement(textVm); - Assert.True(vm.IsOpen); - Assert.Equal("Text", vm.TargetElementKindBadge); - Assert.Equal("Acquisition of TechNova AI", vm.TargetElementTitle); - Assert.Contains(vm.SuggestedPrompts, p => p.Contains("checkmark", StringComparison.OrdinalIgnoreCase) || p.Contains("check", StringComparison.OrdinalIgnoreCase)); - - // Math element - var mathVm = new MathElementViewModel { Formula = "x^2 + y^2 = r^2", PresetName = "Circle Equation" }; - vm.OpenForElement(mathVm); - Assert.Equal("Math", vm.TargetElementKindBadge); - Assert.Contains("Circle", vm.TargetElementTitle); - Assert.Contains(vm.SuggestedPrompts, p => p.Contains("Quadratic", StringComparison.OrdinalIgnoreCase)); - - // QR Code element - var qrVm = new QrCodeElementViewModel { Content = "https://frypdf.com/verify" }; - vm.OpenForElement(qrVm); - Assert.Equal("QrCode", vm.TargetElementKindBadge); - Assert.Contains("https://frypdf.com/verify", vm.TargetElementTitle); - Assert.Contains(vm.SuggestedPrompts, p => p.Contains("URL", StringComparison.OrdinalIgnoreCase)); - - // Form Field element - var formVm = new FormFieldElementViewModel { Label = "Authorized Signatory Name" }; - vm.OpenForElement(formVm); - Assert.Equal("FormField", vm.TargetElementKindBadge); - Assert.Equal("Field: Authorized Signatory Name", vm.TargetElementTitle); - Assert.Contains(vm.SuggestedPrompts, p => p.Contains("required", StringComparison.OrdinalIgnoreCase)); - } - - [Fact] - public void AskAiButton_InstantiatesWithDefaults_AndSupportsVariants() - { - var btn = new PdfEditorApp.Views.Controls.AskAiButton(); - - Assert.Equal(PdfEditorApp.Views.Controls.AskAiButtonVariant.FloatingPill, btn.Variant); - Assert.Equal("Ask AI", btn.ButtonText); - Assert.Equal("Ask AI to Modify (Ctrl+I / ⌘I)", btn.ToolTipText); - Assert.Equal(22, btn.Height); - Assert.Equal(Avalonia.Layout.HorizontalAlignment.Right, btn.HorizontalAlignment); - Assert.Equal(Avalonia.Layout.VerticalAlignment.Top, btn.VerticalAlignment); - - // Switch to subtle variant - btn.Variant = PdfEditorApp.Views.Controls.AskAiButtonVariant.Subtle; - Assert.Equal(PdfEditorApp.Views.Controls.AskAiButtonVariant.Subtle, btn.Variant); - Assert.Equal(24, btn.Height); - Assert.Equal(Avalonia.Layout.HorizontalAlignment.Left, btn.HorizontalAlignment); - } - - [Fact] - public void AiAssistantViewModel_NewChat_CreatesFreshSession() - { - var uiSettings = new UiSettingsService(_tempSettingsPath); - var aiService = new AiService(); - var agentService = new PdfStudioAgentService(aiService); - var vm = new AiAssistantViewModel(agentService, uiSettings, aiService); - - Assert.NotEmpty(vm.Sessions); - Assert.NotNull(vm.CurrentSession); - var initialSession = vm.CurrentSession; - - vm.NewChatCommand.Execute(null); - - Assert.NotSame(initialSession, vm.CurrentSession); - Assert.Equal("New Chat", vm.CurrentSession.Title); - Assert.Empty(vm.CurrentSession.Messages); - Assert.Equal(2, vm.Sessions.Count); - } - - [Fact] - public void AiAssistantViewModel_SwitchSession_ChangesCurrentMessages() - { - var uiSettings = new UiSettingsService(_tempSettingsPath); - var aiService = new AiService(); - var agentService = new PdfStudioAgentService(aiService); - var vm = new AiAssistantViewModel(agentService, uiSettings, aiService); - - var session1 = vm.CurrentSession; - Assert.NotNull(session1); - session1.Messages.Add(new AiChatMessage { Content = "Hello from session 1" }); - - vm.NewChatCommand.Execute(null); - var session2 = vm.CurrentSession; - Assert.NotNull(session2); - session2.Messages.Add(new AiChatMessage { Content = "Hello from session 2" }); - - Assert.NotNull(vm.CurrentSession); - Assert.Single(vm.CurrentSession.Messages); - Assert.Equal("Hello from session 2", vm.CurrentSession.Messages[0].Content); - - // Switch back to session 1 - vm.SwitchSessionCommand.Execute(session1); - Assert.Same(session1, vm.CurrentSession); - Assert.Single(vm.CurrentSession.Messages); - Assert.Equal("Hello from session 1", vm.CurrentSession.Messages[0].Content); - } - - [Fact] - public void AiAssistantViewModel_DeleteSession_RemovesSessionAndMaintainsActive() - { - var uiSettings = new UiSettingsService(_tempSettingsPath); - var aiService = new AiService(); - var agentService = new PdfStudioAgentService(aiService); - var vm = new AiAssistantViewModel(agentService, uiSettings, aiService); - - var session1 = vm.CurrentSession; - Assert.NotNull(session1); - vm.NewChatCommand.Execute(null); - var session2 = vm.CurrentSession; - Assert.NotNull(session2); - - Assert.Equal(2, vm.Sessions.Count); - - // Delete active session2 - vm.DeleteSessionCommand.Execute(session2); - - Assert.Single(vm.Sessions); - Assert.Same(session1, vm.CurrentSession); - } - - [Fact] - public void AiAssistantViewModel_ToggleHistoryDrawer_TogglesDrawerState() - { - var uiSettings = new UiSettingsService(_tempSettingsPath); - var aiService = new AiService(); - var agentService = new PdfStudioAgentService(aiService); - var vm = new AiAssistantViewModel(agentService, uiSettings, aiService); - - Assert.False(vm.IsHistoryDrawerOpen); - vm.ToggleHistoryDrawerCommand.Execute(null); - Assert.True(vm.IsHistoryDrawerOpen); - vm.ToggleHistoryDrawerCommand.Execute(null); - Assert.False(vm.IsHistoryDrawerOpen); - } - - [Fact] - public void AiAssistantViewModel_TargetEntirePage_SetsEntirePageScopeAndSuggestions() - { - var uiSettings = new UiSettingsService(_tempSettingsPath); - var aiService = new AiService(); - var agentService = new PdfStudioAgentService(aiService); - var vm = new AiAssistantViewModel(agentService, uiSettings, aiService); - var page = new PageViewModel { PageNumber = 2, Width = 800, Height = 1131 }; - - vm.TargetEntirePage(page); - - Assert.Equal(AiTargetKind.EntirePage, vm.TargetKind); - Assert.True(vm.IsPageTargetMode); - Assert.False(vm.IsPointTargetMode); - Assert.False(vm.HasTargetPoint); - Assert.False(vm.HasTargetElement); - Assert.Equal(2, vm.TargetPageNumber); - Assert.Contains("Page 2", vm.TargetDescription); - Assert.Contains("800 × 1131", vm.TargetDescription); - Assert.NotEmpty(vm.SuggestedPrompts); - Assert.Contains(vm.SuggestedPrompts, p => p.Contains("invoice", StringComparison.OrdinalIgnoreCase) || p.Contains("page", StringComparison.OrdinalIgnoreCase)); - } - - [Fact] - public void AiAssistantViewModel_TargetPointOnPage_SetsCoordinatesAndSuggestions() - { - var uiSettings = new UiSettingsService(_tempSettingsPath); - var aiService = new AiService(); - var agentService = new PdfStudioAgentService(aiService); - var vm = new AiAssistantViewModel(agentService, uiSettings, aiService); - var page = new PageViewModel { PageNumber = 3, Width = 800, Height = 1131 }; - - vm.TargetPointOnPage(185.5, 340.2, page); - - Assert.Equal(AiTargetKind.PointOnPage, vm.TargetKind); - Assert.True(vm.IsPointTargetMode); - Assert.False(vm.IsPageTargetMode); - Assert.True(vm.HasTargetPoint); - Assert.NotNull(vm.TargetPoint); - Assert.Equal(185.5, vm.TargetPointX); - Assert.Equal(340.2, vm.TargetPointY); - Assert.Contains("186", vm.TargetPointDisplay); - Assert.Contains("340", vm.TargetPointDisplay); - Assert.Contains("Point at", vm.TargetDescription); - Assert.Contains("Page 3", vm.TargetDescription); - Assert.NotEmpty(vm.SuggestedPrompts); - Assert.Contains(vm.SuggestedPrompts, p => p.Contains("here", StringComparison.OrdinalIgnoreCase) || p.Contains("point", StringComparison.OrdinalIgnoreCase)); - } - - [Fact] - public void AiAssistantViewModel_ClearTargetPoint_RevertsToEntirePage() - { - var uiSettings = new UiSettingsService(_tempSettingsPath); - var aiService = new AiService(); - var agentService = new PdfStudioAgentService(aiService); - var vm = new AiAssistantViewModel(agentService, uiSettings, aiService); - var page = new PageViewModel { PageNumber = 1, Width = 800, Height = 1131 }; - - vm.TargetPointOnPage(200, 400, page); - Assert.True(vm.HasTargetPoint); - - vm.ClearTargetPointCommand.Execute(null); - - Assert.False(vm.HasTargetPoint); - Assert.Null(vm.TargetPoint); - Assert.Equal(AiTargetKind.EntirePage, vm.TargetKind); - Assert.True(vm.IsPageTargetMode); - } - - [Fact] - public void AiAssistantViewModel_SwitchModes_UpdatesScopeAndSuggestions() - { - var uiSettings = new UiSettingsService(_tempSettingsPath); - var aiService = new AiService(); - var agentService = new PdfStudioAgentService(aiService); - var vm = new AiAssistantViewModel(agentService, uiSettings, aiService); - var page = new PageViewModel { PageNumber = 1, Width = 800, Height = 1131 }; - vm.GetCurrentPage = () => page; - - // Start in Entire Page mode - vm.SwitchToEntirePageModeCommand.Execute(null); - Assert.Equal(AiTargetKind.EntirePage, vm.TargetKind); - - // Switch to Point Target mode - vm.SwitchToPointTargetModeCommand.Execute(null); - Assert.Equal(AiTargetKind.PointOnPage, vm.TargetKind); - Assert.True(vm.HasTargetPoint); - - // Switch back to Entire Page mode - vm.SwitchToEntirePageModeCommand.Execute(null); - Assert.Equal(AiTargetKind.EntirePage, vm.TargetKind); - Assert.False(vm.HasTargetPoint); - } - - [Fact] - public void AiAssistantViewModel_UpdateTargetElement_OverridesPointAndPage() - { - var uiSettings = new UiSettingsService(_tempSettingsPath); - var aiService = new AiService(); - var agentService = new PdfStudioAgentService(aiService); - var vm = new AiAssistantViewModel(agentService, uiSettings, aiService); - var page = new PageViewModel { PageNumber = 1 }; - vm.GetCurrentPage = () => page; - - vm.TargetPointOnPage(100, 200, page); - Assert.True(vm.HasTargetPoint); - - var textElement = new PdfEditorApp.ViewModels.ElementViewModels.TextElementViewModel { Text = "Sample Heading" }; - vm.UpdateTargetElement(textElement); - - Assert.Equal(AiTargetKind.Element, vm.TargetKind); - Assert.True(vm.HasTargetElement); - Assert.False(vm.HasTargetPoint); - Assert.Contains("Sample Heading", vm.TargetElementTitle); - - // Deselect element - vm.UpdateTargetElement(null); - Assert.False(vm.HasTargetElement); - Assert.Equal(AiTargetKind.EntirePage, vm.TargetKind); - } - - [Fact] - public void AiChatMessage_Undo_TriggersUndoCallback() - { - bool undoCalled = false; - var msg = new AiChatMessage - { - Role = AiChatRole.Assistant, - CanUndo = true, - UndoAction = () => undoCalled = true - }; - - Assert.True(msg.CanUndo); - msg.UndoCommand.Execute(null); - - Assert.True(undoCalled); - Assert.False(msg.CanUndo); - } -} diff --git a/tests/PdfEditorApp.Tests/BatchPdfGeneratorTests.cs b/tests/PdfEditorApp.Tests/BatchPdfGeneratorTests.cs deleted file mode 100644 index 8195069..0000000 --- a/tests/PdfEditorApp.Tests/BatchPdfGeneratorTests.cs +++ /dev/null @@ -1,222 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.IO.Compression; -using System.Threading; -using System.Threading.Tasks; -using PdfEditorApp.Core.Data; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; -using PdfEditorApp.Models; -using PdfEditorApp.Services; -using Xunit; - -namespace PdfEditorApp.Tests; - -public class BatchPdfGeneratorTests -{ - private readonly IDataMergeEngine _mergeEngine = new DataMergeEngine(); - private readonly IPdfExportService _exportService = new PdfExportService(); - - private PdfDocumentModel CreateSampleTemplate() - { - var doc = new PdfDocumentModel - { - Title = "Payslip_{{EmployeeId}}.pdf" - }; - - var page = new PdfPageModel - { - PageNumber = 1, - Width = 600, - Height = 800, - Elements = new List - { - new PdfTextElement - { - X = 50, - Y = 50, - Width = 400, - Height = 30, - Text = "Payslip for {{EmployeeName}}", - FontSize = 14 - }, - new PdfTextElement - { - X = 50, - Y = 90, - Width = 400, - Height = 25, - Text = "Net Salary: {{NetSalary:currency:INR}}", - FontSize = 12 - }, - new PdfQrCodeElement - { - X = 50, - Y = 130, - Width = 80, - Height = 80, - Content = "https://verify.codefrydev.in?emp={{EmployeeId}}" - } - } - }; - - doc.Pages.Add(page); - return doc; - } - - private DataMatrix CreateSampleMatrix() - { - var headers = new List { "EmployeeId", "EmployeeName", "NetSalary" }; - var rows = new List> - { - new() { "EMP-101", "John Doe", "75000" }, - new() { "EMP-102", "Jane Doe", "82000" }, - new() { "EMP-103", "Alex Doe", "68000" } - }; - - return new DataMatrix(headers, rows); - } - - [Fact] - public async Task GenerateBatch_SeparateFilesMode_CreatesIndividualPdfs() - { - var generator = new BatchPdfGeneratorService(_mergeEngine, _exportService); - var template = CreateSampleTemplate(); - var matrix = CreateSampleMatrix(); - - string tempDir = Path.Combine(Path.GetTempPath(), "FryPdf_Test_BatchSeparate_" + Guid.NewGuid().ToString("N")); - - try - { - var config = new BatchGenerationConfig - { - OutputMode = BatchOutputMode.SeparateFiles, - OutputDirectory = tempDir, - FilenamePattern = "Payslip_{{EmployeeId}}_{{EmployeeName}}.pdf" - }; - - var progressReports = new List(); - var progress = new Progress(p => progressReports.Add(p)); - - var result = await generator.GenerateBatchAsync(template, matrix, null, config, progress); - - Assert.True(result.IsSuccess); - Assert.Equal(3, result.SuccessfulCount); - Assert.Equal(3, result.GeneratedFiles.Count); - - foreach (var file in result.GeneratedFiles) - { - Assert.True(File.Exists(file)); - byte[] bytes = File.ReadAllBytes(file); - Assert.True(bytes.Length > 100); - } - } - finally - { - if (Directory.Exists(tempDir)) - { - Directory.Delete(tempDir, true); - } - } - } - - [Fact] - public async Task GenerateBatch_SingleMergedPdfMode_CreatesMultiPagePdf() - { - var generator = new BatchPdfGeneratorService(_mergeEngine, _exportService); - var template = CreateSampleTemplate(); - var matrix = CreateSampleMatrix(); - - string tempFile = Path.Combine(Path.GetTempPath(), "FryPdf_Test_Merged_" + Guid.NewGuid().ToString("N") + ".pdf"); - - try - { - var config = new BatchGenerationConfig - { - OutputMode = BatchOutputMode.SingleMergedPdf, - OutputFilePath = tempFile - }; - - var result = await generator.GenerateBatchAsync(template, matrix, null, config); - - Assert.True(result.IsSuccess); - Assert.Equal(3, result.SuccessfulCount); - Assert.True(File.Exists(tempFile)); - - byte[] bytes = File.ReadAllBytes(tempFile); - Assert.True(bytes.Length > 200); - } - finally - { - if (File.Exists(tempFile)) - { - File.Delete(tempFile); - } - } - } - - [Fact] - public async Task GenerateBatch_ZipArchiveMode_CreatesZipWithAllPdfs() - { - var generator = new BatchPdfGeneratorService(_mergeEngine, _exportService); - var template = CreateSampleTemplate(); - var matrix = CreateSampleMatrix(); - - string tempZip = Path.Combine(Path.GetTempPath(), "FryPdf_Test_Zip_" + Guid.NewGuid().ToString("N") + ".zip"); - - try - { - var config = new BatchGenerationConfig - { - OutputMode = BatchOutputMode.ZipArchive, - OutputFilePath = tempZip, - FilenamePattern = "Payslip_{{EmployeeId}}.pdf" - }; - - var result = await generator.GenerateBatchAsync(template, matrix, null, config); - - Assert.True(result.IsSuccess); - Assert.Equal(3, result.SuccessfulCount); - Assert.True(File.Exists(tempZip)); - - // Verify Zip Entries - using (var zip = ZipFile.OpenRead(tempZip)) - { - Assert.Equal(3, zip.Entries.Count); - Assert.NotNull(zip.GetEntry("Payslip_EMP-101.pdf")); - Assert.NotNull(zip.GetEntry("Payslip_EMP-102.pdf")); - Assert.NotNull(zip.GetEntry("Payslip_EMP-103.pdf")); - } - } - finally - { - if (File.Exists(tempZip)) - { - File.Delete(tempZip); - } - } - } - - [Fact] - public async Task GenerateBatch_Cancellation_StopsExecutionGracefully() - { - var generator = new BatchPdfGeneratorService(_mergeEngine, _exportService); - var template = CreateSampleTemplate(); - var matrix = CreateSampleMatrix(); - - var cts = new CancellationTokenSource(); - cts.Cancel(); // Cancel immediately - - var config = new BatchGenerationConfig - { - OutputMode = BatchOutputMode.SeparateFiles, - OutputDirectory = Path.GetTempPath() - }; - - await Assert.ThrowsAnyAsync(async () => - { - await generator.GenerateBatchAsync(template, matrix, null, config, null, cts.Token); - }); - } -} diff --git a/tests/PdfEditorApp.Tests/BezierShapeAndLineEngineTests.cs b/tests/PdfEditorApp.Tests/BezierShapeAndLineEngineTests.cs deleted file mode 100644 index f768bef..0000000 --- a/tests/PdfEditorApp.Tests/BezierShapeAndLineEngineTests.cs +++ /dev/null @@ -1,410 +0,0 @@ -using System; -using System.IO; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; -using PdfEditorApp.Models; -using PdfEditorApp.Services; -using PdfEditorApp.Templates.Events; -using PdfEditorApp.ViewModels.ElementViewModels; -using Xunit; - -namespace PdfEditorApp.Tests; - -public class BezierShapeAndLineEngineTests -{ - [Theory] - [InlineData(ShapeType.BezierCurve)] - [InlineData(ShapeType.CurvedArrow)] - [InlineData(ShapeType.SCurveConnector)] - [InlineData(ShapeType.WaveLine)] - [InlineData(ShapeType.ArcLine)] - [InlineData(ShapeType.CurlyBrace)] - [InlineData(ShapeType.CurvedCallout)] - [InlineData(ShapeType.Teardrop)] - [InlineData(ShapeType.WaveRibbon)] - [InlineData(ShapeType.OrganicBlob)] - public void GetVectorPath_GeneratesValidSvgPath_ForBezierShapes(ShapeType shapeType) - { - string path = SvgShapeHelper.GetVectorPath(shapeType, 200, 100, 4); - - Assert.False(string.IsNullOrWhiteSpace(path)); - Assert.StartsWith("M ", path); - Assert.True(path.Contains("C ") || path.Contains("Q ") || path.Contains("L ") || path.Contains("A ")); - } - - [Theory] - [InlineData(LineDashStyle.Solid, null)] - [InlineData(LineDashStyle.Dashed, "7.0,4.0")] - [InlineData(LineDashStyle.Dotted, "2.0,4.0")] - [InlineData(LineDashStyle.DashDot, "8.0,4.0,2.0,4.0")] - public void GetDashArray_ReturnsCorrectDashString(LineDashStyle style, string? expectedDash) - { - string? result = SvgShapeHelper.GetDashArray(style, 2.0); - Assert.Equal(expectedDash, result); - } - - [Theory] - [InlineData(DividerStyle.Straight)] - [InlineData(DividerStyle.Wave)] - [InlineData(DividerStyle.SCurve)] - [InlineData(DividerStyle.Arch)] - [InlineData(DividerStyle.DoubleWave)] - [InlineData(DividerStyle.CalligraphicFlourish)] - public void GenerateDividerSvgPath_HorizontalAndVertical_ProducesValidPaths(DividerStyle style) - { - string hPath = SvgShapeHelper.GenerateDividerSvgPath(style, 400, 24, 6.0, 4.0, false); - Assert.False(string.IsNullOrWhiteSpace(hPath)); - Assert.StartsWith("M 0,", hPath); - - string vPath = SvgShapeHelper.GenerateDividerSvgPath(style, 24, 400, 6.0, 4.0, true); - Assert.False(string.IsNullOrWhiteSpace(vPath)); - Assert.StartsWith("M ", vPath); - } - - [Fact] - public void GenerateDividerSvgMarkup_GeneratesFullValidSvgDocument() - { - var divEl = new PdfDividerElement - { - Width = 300, - Height = 20, - Thickness = 2.5, - ColorHex = "#2563EB", - Style = DividerStyle.Wave, - WaveAmplitude = 8.0, - WaveFrequency = 5.0, - DashStyle = LineDashStyle.Dashed - }; - - string svg = SvgShapeHelper.GenerateDividerSvgMarkup(divEl); - - Assert.Contains("", svg); - } - - [Fact] - public void GenerateSmoothInkSvgPath_ConvertsRawPointsToCubicBezierSpline() - { - string points = "10,10 50,40 100,20 180,60 220,30"; - - string smoothPath = SvgShapeHelper.GenerateSmoothInkSvgPath(points, isSmoothSpline: true); - Assert.StartsWith("M 10.0,10.0", smoothPath); - Assert.Contains(" C ", smoothPath); - - string linearPath = SvgShapeHelper.GenerateSmoothInkSvgPath(points, isSmoothSpline: false); - Assert.StartsWith("M 10.0,10.0", linearPath); - Assert.Contains(" L ", linearPath); - Assert.DoesNotContain(" C ", linearPath); - } - - [Fact] - public void GenerateSmoothInkSvgPath_GracefullyHandlesDegeneratePoints() - { - Assert.Equal("M 0,0", SvgShapeHelper.GenerateSmoothInkSvgPath("")); - Assert.StartsWith("M 10.0,20.0", SvgShapeHelper.GenerateSmoothInkSvgPath("10,20")); - Assert.StartsWith("M 10.0,20.0 L 30.0,40.0", SvgShapeHelper.GenerateSmoothInkSvgPath("10,20 30,40")); - } - - [Fact] - public void GenerateInkSvgMarkup_GeneratesValidSvgWithOpacityAndSmoothGeometry() - { - var ink = new PdfInkElement - { - Width = 200, - Height = 60, - StrokeColorHex = "#7C3AED", - StrokeThickness = 3.5, - Opacity = 0.85, - PointsData = "10,10 40,30 80,15 140,50", - IsSmoothSpline = true - }; - - string svg = SvgShapeHelper.GenerateInkSvgMarkup(ink); - - Assert.Contains("", svg); - } - - [Fact] - public void ViewModels_ToModelAndLoadFromModel_PreservesBezierProperties() - { - // 1. ShapeElementViewModel - var shapeVm = new ShapeElementViewModel - { - ShapeType = ShapeType.BezierCurve, - StrokeColorHex = "#D97706", - StrokeThickness = 3.0, - DashStyle = LineDashStyle.DashDot, - StartCap = LineEndCap.Circle, - EndCap = LineEndCap.Arrow, - WaveFrequency = 3.5, - CurvatureDepth = 55.0 - }; - - var shapeModel = (PdfShapeElement)shapeVm.ToModel(); - Assert.Equal(ShapeType.BezierCurve, shapeModel.ShapeType); - Assert.Equal(LineDashStyle.DashDot, shapeModel.DashStyle); - Assert.Equal(LineEndCap.Circle, shapeModel.StartCap); - Assert.Equal(LineEndCap.Arrow, shapeModel.EndCap); - - var restoredShapeVm = new ShapeElementViewModel(); - restoredShapeVm.LoadFromModel(shapeModel); - Assert.Equal(ShapeType.BezierCurve, restoredShapeVm.ShapeType); - Assert.Equal(LineDashStyle.DashDot, restoredShapeVm.DashStyle); - Assert.Equal(LineEndCap.Circle, restoredShapeVm.StartCap); - Assert.Equal(LineEndCap.Arrow, restoredShapeVm.EndCap); - - // 2. DividerElementViewModel - var divVm = new DividerElementViewModel - { - Style = DividerStyle.CalligraphicFlourish, - WaveAmplitude = 9.0, - WaveFrequency = 6.0, - DashStyle = LineDashStyle.Dotted, - Thickness = 2.5 - }; - - var divModel = (PdfDividerElement)divVm.ToModel(); - Assert.Equal(DividerStyle.CalligraphicFlourish, divModel.Style); - Assert.Equal(9.0, divModel.WaveAmplitude); - Assert.Equal(LineDashStyle.Dotted, divModel.DashStyle); - - var restoredDivVm = new DividerElementViewModel(); - restoredDivVm.LoadFromModel(divModel); - Assert.Equal(DividerStyle.CalligraphicFlourish, restoredDivVm.Style); - Assert.Equal(9.0, restoredDivVm.WaveAmplitude); - Assert.Equal(LineDashStyle.Dotted, restoredDivVm.DashStyle); - - // 3. InkElementViewModel - var inkVm = new InkElementViewModel - { - PointsData = "5,5 25,15 60,35", - IsSmoothSpline = true, - StrokeThickness = 4.0 - }; - - var inkModel = (PdfInkElement)inkVm.ToModel(); - Assert.True(inkModel.IsSmoothSpline); - - var restoredInkVm = new InkElementViewModel(); - restoredInkVm.LoadFromModel(inkModel); - Assert.True(restoredInkVm.IsSmoothSpline); - } - - [Fact] - public async Task PdfExportService_RendersDocumentWithBezierShapesDividersAndInk_Successfully() - { - var doc = new PdfDocumentModel - { - Title = "Bézier Vector Features Verification Document", - Author = "Professional PDF Creator Engine" - }; - - var page = new PdfPageModel - { - Width = 595.28, - Height = 841.89, - PageNumber = 1 - }; - - // Add Bézier curve shape - page.Elements.Add(new PdfShapeElement - { - X = 50, - Y = 50, - Width = 300, - Height = 100, - ShapeType = ShapeType.BezierCurve, - FillColorHex = "#00000000", - StrokeColorHex = "#2563EB", - StrokeThickness = 3.0, - DashStyle = LineDashStyle.DashDot - }); - - // Add Curved Arrow - page.Elements.Add(new PdfShapeElement - { - X = 50, - Y = 170, - Width = 250, - Height = 80, - ShapeType = ShapeType.CurvedArrow, - FillColorHex = "#00000000", - StrokeColorHex = "#7C3AED", - StrokeThickness = 2.5 - }); - - // Add Decorative Wave Divider - page.Elements.Add(new PdfDividerElement - { - X = 50, - Y = 270, - Width = 495, - Height = 24, - Style = DividerStyle.Wave, - WaveAmplitude = 8.0, - WaveFrequency = 5.0, - Thickness = 2.0, - ColorHex = "#059669" - }); - - // Add Calligraphic Flourish Divider - page.Elements.Add(new PdfDividerElement - { - X = 50, - Y = 320, - Width = 495, - Height = 24, - Style = DividerStyle.CalligraphicFlourish, - WaveAmplitude = 7.0, - Thickness = 2.0, - ColorHex = "#D97706" - }); - - // Add Freehand Ink Drawing with Catmull-Rom to Cubic Bézier Spline - page.Elements.Add(new PdfInkElement - { - X = 50, - Y = 380, - Width = 350, - Height = 90, - PointsData = "10,20 60,70 120,30 200,80 280,40 340,75", - StrokeColorHex = "#DC2626", - StrokeThickness = 3.0, - Opacity = 0.9, - IsSmoothSpline = true - }); - - // Add Curved Callout and Curly Brace - page.Elements.Add(new PdfShapeElement - { - X = 50, - Y = 500, - Width = 200, - Height = 100, - ShapeType = ShapeType.CurvedCallout, - FillColorHex = "#EFF6FF", - StrokeColorHex = "#3B82F6", - StrokeThickness = 2.0, - Label = "Bézier Callout" - }); - - page.Elements.Add(new PdfShapeElement - { - X = 300, - Y = 500, - Width = 40, - Height = 150, - ShapeType = ShapeType.CurlyBrace, - FillColorHex = "#00000000", - StrokeColorHex = "#475569", - StrokeThickness = 2.0 - }); - - doc.Pages.Add(page); - - var exportService = new PdfExportService(); - string tempPdfPath = Path.Combine(Path.GetTempPath(), $"bezier_shapes_test_{Guid.NewGuid():N}.pdf"); - - try - { - await exportService.ExportToFileAsync(doc, tempPdfPath); - Assert.True(File.Exists(tempPdfPath)); - var fileInfo = new FileInfo(tempPdfPath); - Assert.True(fileInfo.Length > 1000); - - byte[] pdfBytes = await File.ReadAllBytesAsync(tempPdfPath); - // PDF header magic bytes %PDF- - Assert.Equal(0x25, pdfBytes[0]); // % - Assert.Equal(0x50, pdfBytes[1]); // P - Assert.Equal(0x44, pdfBytes[2]); // D - Assert.Equal(0x46, pdfBytes[3]); // F - } - finally - { - if (File.Exists(tempPdfPath)) - { - File.Delete(tempPdfPath); - } - } - } - - [Fact] - public void CreativeTypographyShowcaseTemplate_GeneratesValidDocumentWithAllBezierAndTextFeatures() - { - var template = new CreativeTypographyShowcaseTemplate(); - Assert.Equal("typographyshowcase", template.Id); - Assert.Equal("Design & Creative", template.Category); - - var doc = template.Create(); - Assert.NotNull(doc); - Assert.Single(doc.Pages); - - var page = doc.Pages[0]; - Assert.True(page.Elements.Count >= 20, "Showcase template should have comprehensive elements"); - - // Verify Bézier curve text elements exist - Assert.Contains(page.Elements, e => e is PdfTextElement text && text.ShapeMode == TextShapeMode.BezierCurve && text.BezierPreset == BezierCurvePreset.Wave); - Assert.Contains(page.Elements, e => e is PdfTextElement text && text.ShapeMode == TextShapeMode.BezierCurve && text.BezierPreset == BezierCurvePreset.Bridge); - - // Verify Text Outline, Drop Shadow, and Background badges exist - Assert.Contains(page.Elements, e => e is PdfTextElement text && text.HasShadow && text.ShadowBlurRadius > 0); - Assert.Contains(page.Elements, e => e is PdfTextElement text && text.HasStroke && text.StrokeWidth > 0); - Assert.Contains(page.Elements, e => e is PdfTextElement text && text.BorderColorHex != "#00000000"); - - // Verify Decorative Dividers exist - Assert.Contains(page.Elements, e => e is PdfDividerElement div && div.Style == DividerStyle.CalligraphicFlourish); - Assert.Contains(page.Elements, e => e is PdfDividerElement div && div.Style == DividerStyle.DoubleWave); - Assert.Contains(page.Elements, e => e is PdfDividerElement div && div.Style == DividerStyle.Arch); - - // Verify Bézier Shapes & Connectors exist - Assert.Contains(page.Elements, e => e is PdfShapeElement shape && shape.ShapeType == ShapeType.MedalRibbonBadge); - Assert.Contains(page.Elements, e => e is PdfShapeElement shape && shape.ShapeType == ShapeType.CurvedCallout); - Assert.Contains(page.Elements, e => e is PdfShapeElement shape && shape.ShapeType == ShapeType.CurvedArrow); - Assert.Contains(page.Elements, e => e is PdfShapeElement shape && shape.ShapeType == ShapeType.SCurveConnector); - Assert.Contains(page.Elements, e => e is PdfShapeElement shape && shape.ShapeType == ShapeType.CurlyBrace); - - // Verify Smooth Bézier Ink Signatures exist - Assert.Contains(page.Elements, e => e is PdfInkElement ink && ink.IsSmoothSpline && ink.StrokeThickness > 0); - } - - [Fact] - public async Task CreativeTypographyShowcaseTemplate_ExportsToValidPdfFile() - { - var templateService = new TemplateService(); - var doc = templateService.CreateTypographyShowcaseTemplate(); - Assert.NotNull(doc); - - var exportService = new PdfExportService(); - string tempPdfPath = Path.Combine(Path.GetTempPath(), $"showcase_template_test_{Guid.NewGuid():N}.pdf"); - - try - { - await exportService.ExportToFileAsync(doc, tempPdfPath); - Assert.True(File.Exists(tempPdfPath)); - var fileInfo = new FileInfo(tempPdfPath); - Assert.True(fileInfo.Length > 2000, "Exported PDF with rich vector assets should be substantial in size"); - - byte[] pdfBytes = await File.ReadAllBytesAsync(tempPdfPath); - Assert.Equal(0x25, pdfBytes[0]); // % - Assert.Equal(0x50, pdfBytes[1]); // P - Assert.Equal(0x44, pdfBytes[2]); // D - Assert.Equal(0x46, pdfBytes[3]); // F - } - finally - { - if (File.Exists(tempPdfPath)) - { - File.Delete(tempPdfPath); - } - } - } -} diff --git a/tests/PdfEditorApp.Tests/CanvasEditingEngineTests.cs b/tests/PdfEditorApp.Tests/CanvasEditingEngineTests.cs deleted file mode 100644 index a24311d..0000000 --- a/tests/PdfEditorApp.Tests/CanvasEditingEngineTests.cs +++ /dev/null @@ -1,367 +0,0 @@ -using System; -using System.Linq; -using PdfEditorApp.Core.Models.Elements; -using PdfEditorApp.Models; -using PdfEditorApp.Services; -using PdfEditorApp.ViewModels; -using PdfEditorApp.ViewModels.ElementViewModels; -using Xunit; - -namespace PdfEditorApp.Tests; - -public class CanvasEditingEngineTests -{ - [Fact] - public void PageViewModel_MultiSelection_TogglesAndCalculatesBoundingBoxCorrectly() - { - // Arrange - var page = new PageViewModel { Width = 595.28, Height = 841.89 }; - var el1 = new TextElementViewModel { X = 50, Y = 100, Width = 150, Height = 40, Text = "Title 1" }; - var el2 = new TextElementViewModel { X = 250, Y = 200, Width = 100, Height = 60, Text = "Title 2" }; - page.AddElement(el1); - page.AddElement(el2); - - // Act - Single select - page.SelectElement(el1); - Assert.Single(page.SelectedElements); - Assert.Same(el1, page.SelectedElement); - Assert.False(page.HasMultiSelection); - Assert.Equal(1, page.SelectionCount); - - // Act - Multi select (toggle second) - page.ToggleElementSelection(el2); - Assert.Equal(2, page.SelectedElements.Count); - Assert.True(page.HasMultiSelection); - Assert.Equal(2, page.SelectionCount); - - // Assert - Bounding box spans both elements - // Min X = 50, Min Y = 100, Max X = 250+100=350, Max Y = 200+60=260 - // Width = 350-50 = 300, Height = 260-100 = 160 - var bbox = page.SelectionBoundingBox; - Assert.Equal(50, bbox.X); - Assert.Equal(100, bbox.Y); - Assert.Equal(300, bbox.Width); - Assert.Equal(160, bbox.Height); - - // Act - Select All - page.SelectAll(); - Assert.Equal(2, page.SelectedElements.Count); - - // Act - Clear Selection - page.ClearSelection(); - Assert.Empty(page.SelectedElements); - Assert.Null(page.SelectedElement); - Assert.False(page.HasMultiSelection); - } - - [Fact] - public void InspectorViewModel_MathematicalAlignment_AlignsMultiSelectionCorrectly() - { - // Arrange - var undoRedo = new UndoRedoService(); - var inspector = new InspectorViewModel { UndoRedo = undoRedo }; - var page = new PageViewModel { Width = 600, Height = 800 }; - - var el1 = new TextElementViewModel { X = 100, Y = 100, Width = 100, Height = 50 }; - var el2 = new TextElementViewModel { X = 200, Y = 200, Width = 120, Height = 40 }; - var el3 = new TextElementViewModel { X = 50, Y = 300, Width = 80, Height = 60 }; - - page.AddElement(el1); - page.AddElement(el2); - page.AddElement(el3); - page.SelectElements(new[] { el1, el2, el3 }); - inspector.UpdateSelection(el1, page); - - // Act - Align Left (should all align to min X = 50) - inspector.AlignLeft(); - Assert.Equal(50, el1.X); - Assert.Equal(50, el2.X); - Assert.Equal(50, el3.X); - - // Undo Align Left - undoRedo.Undo(); - Assert.Equal(100, el1.X); - Assert.Equal(200, el2.X); - Assert.Equal(50, el3.X); - - // Act - Align Right (Max right edge is max(100+100, 200+120, 50+80) = 320) - inspector.AlignRight(); - Assert.Equal(320 - 100, el1.X); // 220 - Assert.Equal(320 - 120, el2.X); // 200 - Assert.Equal(320 - 80, el3.X); // 240 - - // Act - Align Top (Min Y = 100) - inspector.AlignTop(); - Assert.Equal(100, el1.Y); - Assert.Equal(100, el2.Y); - Assert.Equal(100, el3.Y); - } - - [Fact] - public void InspectorViewModel_DistributeHorizontallyAndVertically_SpacesElementsEqually() - { - // Arrange - var undoRedo = new UndoRedoService(); - var inspector = new InspectorViewModel { UndoRedo = undoRedo }; - var page = new PageViewModel { Width = 1000, Height = 1000 }; - - // 3 elements of width 50 - // Leftmost X = 100, Rightmost X = 500 (Right edge = 550) - // Middle element initially at X = 200 - // Span = 550 - 100 = 450. Total element widths = 150. Total gaps = 300. - // Gap per space (2 spaces) = 300 / 2 = 150. - // Expected X positions: El1: 100, El2: 100 + 50 + 150 = 300, El3: 500 - var el1 = new TextElementViewModel { X = 100, Y = 50, Width = 50, Height = 30 }; - var el2 = new TextElementViewModel { X = 200, Y = 50, Width = 50, Height = 30 }; - var el3 = new TextElementViewModel { X = 500, Y = 50, Width = 50, Height = 30 }; - - page.AddElement(el1); - page.AddElement(el2); - page.AddElement(el3); - page.SelectElements(new[] { el1, el2, el3 }); - inspector.UpdateSelection(el1, page); - - // Act - Distribute Horizontally - inspector.DistributeHorizontally(); - - Assert.Equal(100, el1.X); - Assert.Equal(300, el2.X); - Assert.Equal(500, el3.X); - - // Act - Undo - undoRedo.Undo(); - Assert.Equal(200, el2.X); - - // Act - Redo - undoRedo.Redo(); - Assert.Equal(300, el2.X); - } - - [Fact] - public void InspectorViewModel_BatchDeleteAndDuplicate_MaintainsAtomicUndoRedo() - { - // Arrange - var undoRedo = new UndoRedoService(); - var inspector = new InspectorViewModel { UndoRedo = undoRedo }; - var page = new PageViewModel { Width = 600, Height = 800 }; - - var el1 = new TextElementViewModel { X = 50, Y = 50, Width = 100, Height = 30, Text = "Elem 1" }; - var el2 = new TextElementViewModel { X = 50, Y = 100, Width = 100, Height = 30, Text = "Elem 2" }; - - page.AddElement(el1); - page.AddElement(el2); - page.SelectElements(new[] { el1, el2 }); - inspector.UpdateSelection(el1, page); - - // Act - Duplicate Selected Elements (Batch) - inspector.DuplicateSelectedElement(); - Assert.Equal(4, page.Elements.Count); - Assert.Equal(2, page.SelectedElements.Count); // Newly duplicated are selected - - // Undo duplication - undoRedo.Undo(); - Assert.Equal(2, page.Elements.Count); - - // Redo duplication - undoRedo.Redo(); - Assert.Equal(4, page.Elements.Count); - - // Act - Delete All 4 elements - page.SelectAll(); - inspector.UpdateSelection(page.SelectedElement, page); - inspector.DeleteSelectedElement(); - Assert.Empty(page.Elements); - - // Undo deletion - undoRedo.Undo(); - Assert.Equal(4, page.Elements.Count); - } - - [Fact] - public void InspectorViewModel_SingleElementAlignment_AlignsRelativeToPage() - { - // Arrange - var undoRedo = new UndoRedoService(); - var inspector = new InspectorViewModel { UndoRedo = undoRedo }; - var page = new PageViewModel { Width = 600, Height = 800 }; - var el = new TextElementViewModel { X = 250, Y = 350, Width = 100, Height = 50 }; - page.AddElement(el); - page.SelectElement(el); - inspector.UpdateSelection(el, page); - - // Align Left (60 margin) - inspector.AlignLeft(); - Assert.Equal(60, el.X); - - // Align Right (600 - 100 - 60 = 440) - inspector.AlignRight(); - Assert.Equal(440, el.X); - - // Align Center ((600 - 100) / 2 = 250) - inspector.AlignCenter(); - Assert.Equal(250, el.X); - - // Align Top (60 margin) - inspector.AlignTop(); - Assert.Equal(60, el.Y); - - // Align Bottom (800 - 50 - 60 = 690) - inspector.AlignBottom(); - Assert.Equal(690, el.Y); - - // Align Middle ((800 - 50) / 2 = 375) - inspector.AlignMiddle(); - Assert.Equal(375, el.Y); - } - - [Fact] - public void InspectorViewModel_BatchLockToggle_LocksAndUnlocksAllSelected() - { - // Arrange - var undoRedo = new UndoRedoService(); - var inspector = new InspectorViewModel { UndoRedo = undoRedo }; - var page = new PageViewModel { Width = 600, Height = 800 }; - var el1 = new TextElementViewModel { X = 10, Y = 10, Width = 50, Height = 20, IsLocked = false }; - var el2 = new TextElementViewModel { X = 20, Y = 20, Width = 50, Height = 20, IsLocked = false }; - page.AddElement(el1); - page.AddElement(el2); - page.SelectElements(new[] { el1, el2 }); - inspector.UpdateSelection(el1, page); - - // Act - Lock All - inspector.ToggleLock(); - Assert.True(el1.IsLocked); - Assert.True(el2.IsLocked); - - // Undo - undoRedo.Undo(); - Assert.False(el1.IsLocked); - Assert.False(el2.IsLocked); - - // Redo - undoRedo.Redo(); - Assert.True(el1.IsLocked); - Assert.True(el2.IsLocked); - } - - [Fact] - public void MainViewModel_DynamicZoomAndFit_CalculatesAccurately() - { - // Arrange - var vm = new MainViewModel(); - - // Standard A4 page width = 595.28 pt, height = 841.89 pt - Assert.NotNull(vm.CurrentPage); - - // Act - Zoom in and out - vm.ZoomLevel = 1.0; - vm.ZoomIn(); - Assert.True(vm.ZoomLevel > 1.0); - - vm.ZoomOut(); - Assert.Equal(1.0, vm.ZoomLevel); - - // Act - Fit to Width with viewport width = 2.0x - double targetWidth = vm.CurrentPage.Width * 2.0 + 64.0; - vm.FitToWidthDynamic(targetWidth); - Assert.Equal(2.0, vm.ZoomLevel); - - // Act - Fit to Page with viewport = 1.0x - double targetPageW = vm.CurrentPage.Width * 1.0 + 64.0; - double targetPageH = vm.CurrentPage.Height * 1.0 + 64.0; - vm.FitToPageDynamic(targetPageW, targetPageH); - Assert.Equal(1.0, vm.ZoomLevel); - - // Act - Reset zoom - vm.ResetZoom(); - Assert.Equal(1.0, vm.ZoomLevel); - } - - [Fact] - public void PdfTextElement_And_ViewModel_DefaultPadding_IsZero() - { - var model = new PdfTextElement(); - Assert.Equal(0.0, model.Padding); - - var vm = new TextElementViewModel(); - Assert.Equal(0.0, vm.Padding); - } - - [Fact] - public void TextElementViewModel_CalculateRequiredHeight_ProvidesAdequateHeight() - { - var vm = new TextElementViewModel - { - Text = "I. INTRODUCTION & EXPERIMENTAL SETUP", - FontSize = 11, - FontFamily = "Segoe UI", - Width = 330, - Height = 15 // Deliberately tight/too small - }; - - double requiredHeight = vm.CalculateRequiredHeight(); - Assert.True(requiredHeight >= 18.0, $"Required height should be >= 18 for 11pt font, was {requiredHeight}"); - - vm.AutoFitHeight(); - Assert.True(vm.Height >= 18.0); - } - - [Fact] - public void InspectorViewModel_AutoFitTextHeight_ExpandsSelectedElementsWithUndoRedo() - { - var undoRedo = new UndoRedoService(); - var inspector = new InspectorViewModel { UndoRedo = undoRedo }; - var page = new PageViewModel { Width = 600, Height = 800 }; - var textEl = new TextElementViewModel - { - Text = "Multi-Line\nAffiliation and Department\nUniversity of Science", - FontSize = 10, - Width = 200, - Height = 15 // Clipped - }; - page.AddElement(textEl); - page.SelectElement(textEl); - inspector.UpdateSelection(textEl, page); - - inspector.AutoFitTextHeight(); - Assert.True(textEl.Height > 30.0, $"Height should expand for 3 lines of text, but was {textEl.Height}"); - - // Test Undo - undoRedo.Undo(); - Assert.Equal(15.0, textEl.Height); - - // Test Redo - undoRedo.Redo(); - Assert.True(textEl.Height > 30.0); - } - - [Fact] - public void AllTemplates_CreateValidDocuments_WithZeroPaddingAndValidTextBounds() - { - var templateService = new TemplateService(); - var templates = templateService.GetAllTemplates(); - - Assert.NotEmpty(templates); - Assert.True(templates.Count() >= 18, $"Expected at least 18 templates, found {templates.Count()}"); - - foreach (var def in templates) - { - var doc = def.Create(); - Assert.NotNull(doc); - Assert.NotEmpty(doc.Pages); - - foreach (var p in doc.Pages) - { - Assert.True(p.Width > 0); - Assert.True(p.Height > 0); - Assert.NotEmpty(p.Elements); - - foreach (var el in p.Elements.OfType()) - { - Assert.True(el.Width > 0, $"Text element '{el.Text}' in template '{def.Name}' has non-positive width"); - Assert.True(el.Height >= 18, $"Text element '{el.Text}' in template '{def.Name}' has height {el.Height} which is too small and might clip"); - } - } - } - } -} diff --git a/tests/PdfEditorApp.Tests/CollapseExpandWorkspaceTests.cs b/tests/PdfEditorApp.Tests/CollapseExpandWorkspaceTests.cs deleted file mode 100644 index de701cc..0000000 --- a/tests/PdfEditorApp.Tests/CollapseExpandWorkspaceTests.cs +++ /dev/null @@ -1,336 +0,0 @@ -using System.Linq; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Models; -using PdfEditorApp.ViewModels; -using Xunit; - -namespace PdfEditorApp.Tests; - -public class CollapseExpandWorkspaceTests -{ - [Fact] - public void MainViewModel_ToggleRibbonCollapse_TogglesStateCorrectly() - { - var vm = new MainViewModel(); - Assert.False(vm.IsRibbonCollapsed); - - vm.ToggleRibbonCollapseCommand.Execute(null); - Assert.True(vm.IsRibbonCollapsed); - - vm.ToggleRibbonCollapseCommand.Execute(null); - Assert.False(vm.IsRibbonCollapsed); - } - - [Fact] - public void MainViewModel_SelectRibbonTab_AutoExpandsWhenCollapsed() - { - var vm = new MainViewModel(); - vm.IsRibbonCollapsed = true; - Assert.True(vm.IsRibbonCollapsed); - - // Selecting a ribbon tab should automatically expand the ribbon - vm.SelectRibbonTabCommand.Execute(RibbonTabKind.Insert); - - Assert.Equal(RibbonTabKind.Insert, vm.ActiveRibbonTab); - Assert.False(vm.IsRibbonCollapsed); - } - - [Fact] - public void MainViewModel_ToggleLeftSidebar_TogglesStateCorrectly() - { - var vm = new MainViewModel(); - Assert.False(vm.IsLeftSidebarCollapsed); - - vm.ToggleLeftSidebarCommand.Execute(null); - Assert.True(vm.IsLeftSidebarCollapsed); - - vm.ToggleLeftSidebarCommand.Execute(null); - Assert.False(vm.IsLeftSidebarCollapsed); - } - - [Fact] - public void MainViewModel_SelectSidebarTab_AutoExpandsWhenCollapsed() - { - var vm = new MainViewModel(); - vm.IsLeftSidebarCollapsed = true; - Assert.True(vm.IsLeftSidebarCollapsed); - - // Selecting a sidebar tab should automatically expand the sidebar - vm.SelectSidebarTabCommand.Execute(SidebarTabKind.Outline); - - Assert.Equal(SidebarTabKind.Outline, vm.ActiveSidebarTab); - Assert.False(vm.IsLeftSidebarCollapsed); - } - - [Fact] - public void MainViewModel_ToggleInspectorCollapse_TogglesStateCorrectly() - { - var vm = new MainViewModel(); - Assert.False(vm.IsInspectorCollapsed); - - vm.ToggleInspectorCollapseCommand.Execute(null); - Assert.True(vm.IsInspectorCollapsed); - - vm.ToggleInspectorCollapseCommand.Execute(null); - Assert.False(vm.IsInspectorCollapsed); - } - - [Fact] - public void MainViewModel_ExpandAllPanels_ExpandsAllThreePanels() - { - var vm = new MainViewModel(); - vm.IsRibbonCollapsed = true; - vm.IsLeftSidebarCollapsed = true; - vm.IsInspectorCollapsed = true; - - vm.ExpandAllPanelsCommand.Execute(null); - - Assert.False(vm.IsRibbonCollapsed); - Assert.False(vm.IsLeftSidebarCollapsed); - Assert.False(vm.IsInspectorCollapsed); - } - - [Fact] - public void MainViewModel_CommandPalette_ContainsCollapseAndExpandEntries() - { - var vm = new MainViewModel(); - var palette = vm.AllPaletteCommands; - - Assert.Contains(palette, c => c.Title.Contains("Toggle Ribbon Toolbar")); - Assert.Contains(palette, c => c.Title.Contains("Toggle Pages Sidebar")); - Assert.Contains(palette, c => c.Title.Contains("Toggle Properties Inspector")); - Assert.Contains(palette, c => c.Title.Contains("Expand All Panels")); - } - - [Fact] - public void InspectorViewModel_AccordionSections_ToggleIndividually() - { - var inspector = new InspectorViewModel(); - - // Default state: all expanded - Assert.True(inspector.IsPresetGeometryExpanded); - Assert.True(inspector.IsLineStrokePatternExpanded); - Assert.True(inspector.IsColorsExpanded); - Assert.True(inspector.IsDimensionsExpanded); - Assert.True(inspector.IsTypographyExpanded); - Assert.True(inspector.IsParagraphExpanded); - Assert.True(inspector.IsTransformExpanded); - Assert.True(inspector.IsShadowExpanded); - - // Toggle Preset Geometry - inspector.TogglePresetGeometryExpandedCommand.Execute(null); - Assert.False(inspector.IsPresetGeometryExpanded); - inspector.TogglePresetGeometryExpandedCommand.Execute(null); - Assert.True(inspector.IsPresetGeometryExpanded); - - // Toggle Line Stroke Pattern - inspector.ToggleLineStrokePatternExpandedCommand.Execute(null); - Assert.False(inspector.IsLineStrokePatternExpanded); - inspector.ToggleLineStrokePatternExpandedCommand.Execute(null); - Assert.True(inspector.IsLineStrokePatternExpanded); - - // Toggle Colors - inspector.ToggleColorsExpandedCommand.Execute(null); - Assert.False(inspector.IsColorsExpanded); - inspector.ToggleColorsExpandedCommand.Execute(null); - Assert.True(inspector.IsColorsExpanded); - - // Toggle Dimensions - inspector.ToggleDimensionsExpandedCommand.Execute(null); - Assert.False(inspector.IsDimensionsExpanded); - inspector.ToggleDimensionsExpandedCommand.Execute(null); - Assert.True(inspector.IsDimensionsExpanded); - - // Toggle Typography - inspector.ToggleTypographyExpandedCommand.Execute(null); - Assert.False(inspector.IsTypographyExpanded); - inspector.ToggleTypographyExpandedCommand.Execute(null); - Assert.True(inspector.IsTypographyExpanded); - - // Toggle Paragraph - inspector.ToggleParagraphExpandedCommand.Execute(null); - Assert.False(inspector.IsParagraphExpanded); - inspector.ToggleParagraphExpandedCommand.Execute(null); - Assert.True(inspector.IsParagraphExpanded); - - // Toggle Transform - inspector.ToggleTransformExpandedCommand.Execute(null); - Assert.False(inspector.IsTransformExpanded); - inspector.ToggleTransformExpandedCommand.Execute(null); - Assert.True(inspector.IsTransformExpanded); - - // Toggle Shadow - inspector.ToggleShadowExpandedCommand.Execute(null); - Assert.False(inspector.IsShadowExpanded); - inspector.ToggleShadowExpandedCommand.Execute(null); - Assert.True(inspector.IsShadowExpanded); - - // Toggle Page Setup - inspector.TogglePageSetupExpandedCommand.Execute(null); - Assert.False(inspector.IsPageSetupExpanded); - inspector.TogglePageSetupExpandedCommand.Execute(null); - Assert.True(inspector.IsPageSetupExpanded); - - // Toggle Image Adjustments - inspector.ToggleImageAdjustmentsExpandedCommand.Execute(null); - Assert.False(inspector.IsImageAdjustmentsExpanded); - inspector.ToggleImageAdjustmentsExpandedCommand.Execute(null); - Assert.True(inspector.IsImageAdjustmentsExpanded); - - // Toggle Table Properties - inspector.ToggleTablePropertiesExpandedCommand.Execute(null); - Assert.False(inspector.IsTablePropertiesExpanded); - inspector.ToggleTablePropertiesExpandedCommand.Execute(null); - Assert.True(inspector.IsTablePropertiesExpanded); - - // Toggle Math Formula - inspector.ToggleMathFormulaExpandedCommand.Execute(null); - Assert.False(inspector.IsMathFormulaExpanded); - inspector.ToggleMathFormulaExpandedCommand.Execute(null); - Assert.True(inspector.IsMathFormulaExpanded); - } - - [Fact] - public void InspectorViewModel_ExpandAndCollapseAllSections_ControlsAllSubSections() - { - var inspector = new InspectorViewModel(); - - inspector.CollapseAllSectionsCommand.Execute(null); - - Assert.False(inspector.IsPageSetupExpanded); - Assert.False(inspector.IsPresetGeometryExpanded); - Assert.False(inspector.IsLineStrokePatternExpanded); - Assert.False(inspector.IsColorsExpanded); - Assert.False(inspector.IsDimensionsExpanded); - Assert.False(inspector.IsTypographyExpanded); - Assert.False(inspector.IsParagraphExpanded); - Assert.False(inspector.IsTransformExpanded); - Assert.False(inspector.IsShadowExpanded); - Assert.False(inspector.IsImageAdjustmentsExpanded); - Assert.False(inspector.IsTablePropertiesExpanded); - Assert.False(inspector.IsMathFormulaExpanded); - - inspector.ExpandAllSectionsCommand.Execute(null); - - Assert.True(inspector.IsPageSetupExpanded); - Assert.True(inspector.IsPresetGeometryExpanded); - Assert.True(inspector.IsLineStrokePatternExpanded); - Assert.True(inspector.IsColorsExpanded); - Assert.True(inspector.IsDimensionsExpanded); - Assert.True(inspector.IsTypographyExpanded); - Assert.True(inspector.IsParagraphExpanded); - Assert.True(inspector.IsTransformExpanded); - Assert.True(inspector.IsShadowExpanded); - Assert.True(inspector.IsImageAdjustmentsExpanded); - Assert.True(inspector.IsTablePropertiesExpanded); - Assert.True(inspector.IsMathFormulaExpanded); - } - - [Fact] - public void MainViewModel_TogglePanels_ShowsToastMessage() - { - var vm = new MainViewModel(); - - vm.ToggleRibbonCollapseCommand.Execute(null); - Assert.True(vm.IsToastVisible); - Assert.Contains("Ribbon", vm.ToastMessage); - - vm.ToggleLeftSidebarCommand.Execute(null); - Assert.True(vm.IsToastVisible); - Assert.Contains("Sidebar", vm.ToastMessage); - - vm.ToggleInspectorCollapseCommand.Execute(null); - Assert.True(vm.IsToastVisible); - Assert.Contains("Inspector", vm.ToastMessage); - - vm.ExpandAllPanelsCommand.Execute(null); - Assert.True(vm.IsToastVisible); - Assert.Contains("All Workspace Panels Expanded", vm.ToastMessage); - } - - [Fact] - public void LeftSidebar_ResizingAndCollapseExpand_MaintainsWidth() - { - var vm = new MainViewModel(); - Assert.False(vm.IsLeftSidebarCollapsed); - Assert.True(vm.IsLeftSidebarResizable); - Assert.Equal(340, vm.LeftSidebarGridLength.Value); - - // Simulate user dragging GridSplitter to 450px - vm.LeftSidebarGridLength = new Avalonia.Controls.GridLength(450, Avalonia.Controls.GridUnitType.Pixel); - Assert.Equal(450, vm.LeftSidebarGridLength.Value); - - // Collapse left sidebar (e.g. ⌘B) - vm.ToggleLeftSidebarCommand.Execute(null); - Assert.True(vm.IsLeftSidebarCollapsed); - Assert.False(vm.IsLeftSidebarResizable); - Assert.Equal(38, vm.LeftSidebarGridLength.Value); - - // Expand left sidebar again (⌘B) -> should restore 450px - vm.ToggleLeftSidebarCommand.Execute(null); - Assert.False(vm.IsLeftSidebarCollapsed); - Assert.True(vm.IsLeftSidebarResizable); - Assert.Equal(450, vm.LeftSidebarGridLength.Value); - } - - [Fact] - public void OpenAiAssistant_ExpandsSidebar_SelectsAiTab_AndEnsuresComfortableWidth() - { - var vm = new MainViewModel(); - vm.IsLeftSidebarCollapsed = true; - Assert.True(vm.IsLeftSidebarCollapsed); - - vm.OpenAiAssistantCommand.Execute(null); - - Assert.False(vm.IsLeftSidebarCollapsed); - Assert.Equal(SidebarTabKind.AiAssistant, vm.ActiveSidebarTab); - Assert.True(vm.LeftSidebarGridLength.Value >= 340); - Assert.True(vm.AiAssistant.IsOpen); - } - - [Fact] - public void CanvasSelectionChanged_WhenAiSidebarActive_LiveUpdatesTargetElement() - { - var vm = new MainViewModel(); - Assert.NotNull(vm.CurrentPage); - - var chartVm = new PdfEditorApp.ViewModels.ElementViewModels.ChartElementViewModel - { - Title = "Live Performance Metrics" - }; - vm.CurrentPage.AddElement(chartVm); - - // Open AI in sidebar - vm.OpenAiAssistantCommand.Execute(null); - Assert.Equal(SidebarTabKind.AiAssistant, vm.ActiveSidebarTab); - - // Click element on canvas - vm.CurrentPage.SelectElement(chartVm); - - // Assert AI Assistant updated live - Assert.True(vm.AiAssistant.IsModifyMode); - Assert.Same(chartVm, vm.AiAssistant.TargetElement); - Assert.Equal("Live Performance Metrics", vm.AiAssistant.TargetElementTitle); - - // Deselect element - vm.CurrentPage.SelectElement(null); - Assert.False(vm.AiAssistant.IsModifyMode); - Assert.Null(vm.AiAssistant.TargetElement); - } - - [Fact] - public void AiAssistant_CloseOrDone_ReturnsToThumbnails() - { - var vm = new MainViewModel(); - vm.OpenAiAssistantCommand.Execute(null); - Assert.Equal(SidebarTabKind.AiAssistant, vm.ActiveSidebarTab); - Assert.True(vm.AiAssistant.IsOpen); - - // User clicks Close or Done - vm.AiAssistant.CloseCommand.Execute(null); - - Assert.False(vm.AiAssistant.IsOpen); - Assert.Equal(SidebarTabKind.Thumbnails, vm.ActiveSidebarTab); - } -} - diff --git a/tests/PdfEditorApp.Tests/ConverterTests.cs b/tests/PdfEditorApp.Tests/ConverterTests.cs deleted file mode 100644 index b7c0122..0000000 --- a/tests/PdfEditorApp.Tests/ConverterTests.cs +++ /dev/null @@ -1,250 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using Avalonia.Media; -using PdfEditorApp.Converters; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Models; -using Xunit; - -namespace PdfEditorApp.Tests; - -public class ConverterTests -{ - [Fact] - public void ByteSizeToStringConverter_FormatsAndParsesByteSizesAccurately() - { - var conv = ByteSizeToStringConverter.Instance; - var culture = CultureInfo.InvariantCulture; - - // Conversion tests - Assert.Equal("0 B", conv.Convert(0L, typeof(string), null, culture)); - Assert.Equal("0 B", conv.Convert(null, typeof(string), null, culture)); - Assert.Equal("512 B", conv.Convert(512L, typeof(string), null, culture)); - Assert.Equal("1.0 KB", conv.Convert(1024L, typeof(string), null, culture)); - Assert.Equal("1.5 KB", conv.Convert(1536L, typeof(string), null, culture)); - Assert.Equal("2.00 MB", conv.Convert(2 * 1024 * 1024L, typeof(string), "2", culture)); - Assert.Equal("1.5 GB", conv.Convert((long)(1.5 * 1024 * 1024 * 1024), typeof(string), null, culture)); - - // ConvertBack tests - Assert.Equal(1024L, conv.ConvertBack("1 KB", typeof(long), null, culture)); - Assert.Equal(2097152L, conv.ConvertBack("2 MB", typeof(long), null, culture)); - Assert.Equal(0L, conv.ConvertBack("invalid", typeof(long), null, culture)); - } - - [Fact] - public void DateTimeFormatConverter_FormatsCustomAndRelativeDates() - { - var conv = DateTimeFormatConverter.Instance; - var culture = CultureInfo.InvariantCulture; - - var dt = new DateTime(2026, 8, 15, 14, 30, 0); - Assert.Equal("2026-08-15", conv.Convert(dt, typeof(string), "yyyy-MM-dd", culture)); - Assert.Equal("Aug 15, 2026", conv.Convert(dt, typeof(string), "MMM dd, yyyy", culture)); - - // Relative formatting for recent time - var recent = DateTime.Now.AddSeconds(-10); - Assert.Equal("Just now", conv.Convert(recent, typeof(string), "Relative", culture)); - - // ConvertBack - var parsed = conv.ConvertBack("2026-08-15", typeof(DateTime), null, culture); - Assert.NotNull(parsed); - Assert.Equal(new DateTime(2026, 8, 15), (DateTime)parsed!); - } - - [Fact] - public void TimeSpanFormatConverter_FormatsDurations() - { - var conv = TimeSpanFormatConverter.Instance; - var culture = CultureInfo.InvariantCulture; - - Assert.Equal("1:30", conv.Convert(TimeSpan.FromSeconds(90), typeof(string), null, culture)); - Assert.Equal("1:30", conv.Convert(90.0, typeof(string), null, culture)); - Assert.Equal("1:15:30", conv.Convert(TimeSpan.FromSeconds(4530), typeof(string), null, culture)); - Assert.Equal("1h 15m", conv.Convert(TimeSpan.FromSeconds(4530), typeof(string), "words", culture)); - Assert.Equal("45s", conv.Convert(TimeSpan.FromSeconds(45), typeof(string), "words", culture)); - } - - [Fact] - public void MathConverters_PerformArithmeticAndRoundtrips() - { - var culture = CultureInfo.InvariantCulture; - - // MathAddConverter - Assert.Equal(15.0, MathAddConverter.Instance.Convert(10.0, typeof(double), "5", culture)); - Assert.Equal(10.0, MathAddConverter.Instance.ConvertBack(15.0, typeof(double), "5", culture)); - - // MathSubtractConverter - Assert.Equal(5.0, MathSubtractConverter.Instance.Convert(10.0, typeof(double), "5", culture)); - Assert.Equal(10.0, MathSubtractConverter.Instance.ConvertBack(5.0, typeof(double), "5", culture)); - - // MathMultiplyConverter - Assert.Equal(50.0, MathMultiplyConverter.Instance.Convert(10.0, typeof(double), "5", culture)); - Assert.Equal(10.0, MathMultiplyConverter.Instance.ConvertBack(50.0, typeof(double), "5", culture)); - - // MathDivideConverter - Assert.Equal(2.0, MathDivideConverter.Instance.Convert(10.0, typeof(double), "5", culture)); - Assert.Equal(10.0, MathDivideConverter.Instance.ConvertBack(2.0, typeof(double), "5", culture)); - } - - [Fact] - public void PercentageConverter_FormatsAndParsesPercentages() - { - var conv = PercentageConverter.Instance; - var culture = CultureInfo.InvariantCulture; - - // 0..1 scale - Assert.Equal("75%", conv.Convert(0.75, typeof(string), null, culture)); - Assert.Equal(0.75, (double)(conv.ConvertBack("75%", typeof(double), null, culture) ?? 0.0), 2); - - // 0..100 scale - Assert.Equal("85%", conv.Convert(85.0, typeof(string), "0-100", culture)); - Assert.Equal(85.0, (double)(conv.ConvertBack("85%", typeof(double), "0-100", culture) ?? 0.0), 2); - } - - [Fact] - public void UnitConverters_PointsToMmInchesAndPixels() - { - var culture = CultureInfo.InvariantCulture; - - // 72 points = 1.0 inch = 25.4 mm - double pt = 72.0; - - // Points to MM - var mm = PointsToMillimetersConverter.Instance.Convert(pt, typeof(double), null, culture); - Assert.Equal(25.4, (double)(mm ?? 0.0), 1); - var ptFromMm = PointsToMillimetersConverter.Instance.ConvertBack(25.4, typeof(double), null, culture); - Assert.Equal(72.0, (double)(ptFromMm ?? 0.0), 1); - - // Formatted MM - Assert.Equal("25.4 mm", PointsToMillimetersConverter.Instance.Convert(pt, typeof(string), "format", culture)); - - // Points to Inches - var inches = PointsToInchesConverter.Instance.Convert(pt, typeof(double), null, culture); - Assert.Equal(1.0, (double)(inches ?? 0.0), 2); - var ptFromIn = PointsToInchesConverter.Instance.ConvertBack(1.0, typeof(double), null, culture); - Assert.Equal(72.0, (double)(ptFromIn ?? 0.0), 1); - - // Points to Pixels (96 DPI default -> 72pt * 96/72 = 96px) - var px = PointsToPixelsConverter.Instance.Convert(pt, typeof(double), null, culture); - Assert.Equal(96.0, (double)(px ?? 0.0), 1); - } - - [Fact] - public void BooleanAndLogicConverters_EvaluateConditionsAccurately() - { - var culture = CultureInfo.InvariantCulture; - - // InverseBooleanConverter - Assert.False((bool)(InverseBooleanConverter.Instance.Convert(true, typeof(bool), null, culture) ?? true)); - Assert.True((bool)(InverseBooleanConverter.Instance.Convert(false, typeof(bool), null, culture) ?? false)); - Assert.False((bool)(InverseBooleanConverter.Instance.ConvertBack(true, typeof(bool), null, culture) ?? true)); - - // CountToBooleanConverter - var list = new List { 1, 2, 3 }; - Assert.True((bool)(CountToBooleanConverter.Instance.Convert(list, typeof(bool), null, culture) ?? false)); - Assert.False((bool)(CountToBooleanConverter.Instance.Convert(new List(), typeof(bool), null, culture) ?? true)); - Assert.False((bool)(CountToBooleanConverter.Instance.Convert(list, typeof(bool), "invert", culture) ?? true)); - Assert.True((bool)(CountToBooleanConverter.Instance.Convert(5, typeof(bool), "2", culture) ?? false)); // 5 > 2 - - // NullOrEmptyToBooleanConverter - Assert.True((bool)(NullOrEmptyToBooleanConverter.Instance.Convert("", typeof(bool), null, culture) ?? false)); - Assert.True((bool)(NullOrEmptyToBooleanConverter.Instance.Convert(null, typeof(bool), null, culture) ?? false)); - Assert.False((bool)(NullOrEmptyToBooleanConverter.Instance.Convert("hello", typeof(bool), null, culture) ?? true)); - Assert.True((bool)(NullOrEmptyToBooleanConverter.Instance.Convert("hello", typeof(bool), "invert", culture) ?? false)); - - // ComparisonToBooleanConverter - Assert.True((bool)(ComparisonToBooleanConverter.Instance.Convert(10, typeof(bool), ">5", culture) ?? false)); - Assert.False((bool)(ComparisonToBooleanConverter.Instance.Convert(3, typeof(bool), ">=5", culture) ?? true)); - Assert.True((bool)(ComparisonToBooleanConverter.Instance.Convert(5, typeof(bool), "<=5", culture) ?? false)); - Assert.True((bool)(ComparisonToBooleanConverter.Instance.Convert(42, typeof(bool), "==42", culture) ?? false)); - Assert.True((bool)(ComparisonToBooleanConverter.Instance.Convert(42, typeof(bool), "!=0", culture) ?? false)); - - // CountToStringConverter - Assert.Equal("1 page", CountToStringConverter.Instance.Convert(1, typeof(string), "page|pages", culture)); - Assert.Equal("5 pages", CountToStringConverter.Instance.Convert(5, typeof(string), "page|pages", culture)); - Assert.Equal("0 pages", CountToStringConverter.Instance.Convert(0, typeof(string), "page|pages", culture)); - } - - [Fact] - public void GraphicsAndTransformConverters_CreateVisualElements() - { - var culture = CultureInfo.InvariantCulture; - - // ColorToBrushConverter - var brush = ColorToBrushConverter.Instance.Convert(Colors.Red, typeof(IBrush), null, culture); - Assert.NotNull(brush); - var scb = Assert.IsType(brush); - Assert.Equal(Colors.Red, scb.Color); - - // ScaleToTransformConverter - var st = ScaleToTransformConverter.Instance.Convert(1.5, typeof(ITransform), null, culture); - Assert.NotNull(st); - var scale = Assert.IsType(st); - Assert.Equal(1.5, scale.ScaleX); - Assert.Equal(1.5, scale.ScaleY); - Assert.Null(ScaleToTransformConverter.Instance.Convert(1.0, typeof(ITransform), null, culture)); // Identity returns null - - // TranslateToTransformConverter - var tt = TranslateToTransformConverter.Instance.Convert("10,20", typeof(ITransform), null, culture); - Assert.NotNull(tt); - var trans = Assert.IsType(tt); - Assert.Equal(10.0, trans.X); - Assert.Equal(20.0, trans.Y); - - // StringToGeometryConverter - Assert.Null(StringToGeometryConverter.Instance.Convert(null, typeof(Geometry), null, culture)); - Assert.Null(StringToGeometryConverter.Instance.Convert("", typeof(Geometry), null, culture)); - // If an already parsed Geometry is passed, it returns it directly - // Test ConvertBack - Assert.Null(StringToGeometryConverter.Instance.ConvertBack(null, typeof(string), null, culture)); - } - - [Fact] - public void StringAndTextConverters_FormatStringsCorrectly() - { - var culture = CultureInfo.InvariantCulture; - - // StringCaseConverter - Assert.Equal("HELLO WORLD", StringCaseConverter.Instance.Convert("hello world", typeof(string), "upper", culture)); - Assert.Equal("hello world", StringCaseConverter.Instance.Convert("HELLO WORLD", typeof(string), "lower", culture)); - Assert.Equal("Hello World", StringCaseConverter.Instance.Convert("hello world", typeof(string), "title", culture)); - Assert.Equal("Hello", StringCaseConverter.Instance.Convert("hello", typeof(string), "capitalize", culture)); - - // StringTruncateConverter - Assert.Equal("This is a...", StringTruncateConverter.Instance.Convert("This is a very long string that should be truncated", typeof(string), "12", culture)); - Assert.Equal("Short", StringTruncateConverter.Instance.Convert("Short", typeof(string), "20", culture)); - - // StringPrefixSuffixConverter - Assert.Equal("Page 5", StringPrefixSuffixConverter.Instance.Convert(5, typeof(string), "Page {0}", culture)); - Assert.Equal("72 pt", StringPrefixSuffixConverter.Instance.Convert(72, typeof(string), "{0} pt", culture)); - - // EnumToDescriptionConverter - Assert.Equal("Left", EnumToDescriptionConverter.Instance.Convert(TextAlignmentMode.Left, typeof(string), null, culture)); - Assert.Equal("Top Arc", EnumToDescriptionConverter.Instance.Convert(CircularTextPlacement.TopArc, typeof(string), null, culture)); - Assert.Equal("A4", EnumToDescriptionConverter.Instance.Convert(PageFormat.A4, typeof(string), null, culture)); - Assert.Equal("Corporate Blue", EnumToDescriptionConverter.Instance.Convert(ChartPalette.CorporateBlue, typeof(string), null, culture)); - } - - [Fact] - public void MultiValueConverters_EvaluateAggregationsCorrectly() - { - var culture = CultureInfo.InvariantCulture; - - // AllTrueMultiConverter - Assert.True((bool)(AllTrueMultiConverter.Instance.Convert(new object?[] { true, true, true }, typeof(bool), null, culture) ?? false)); - Assert.False((bool)(AllTrueMultiConverter.Instance.Convert(new object?[] { true, false, true }, typeof(bool), null, culture) ?? true)); - - // AnyTrueMultiConverter - Assert.True((bool)(AnyTrueMultiConverter.Instance.Convert(new object?[] { false, true, false }, typeof(bool), null, culture) ?? false)); - Assert.False((bool)(AnyTrueMultiConverter.Instance.Convert(new object?[] { false, false, false }, typeof(bool), null, culture) ?? true)); - - // StringConcatMultiConverter - Assert.Equal("Page 1 of 10", StringConcatMultiConverter.Instance.Convert(new object?[] { "Page", " 1 ", "of", " 10" }, typeof(string), null, culture)); - Assert.Equal("A-B-C", StringConcatMultiConverter.Instance.Convert(new object?[] { "A", "B", "C" }, typeof(string), "-", culture)); - - // MathMaxMultiConverter & MathMinMultiConverter - Assert.Equal(42.0, (double)(MathMaxMultiConverter.Instance.Convert(new object?[] { 10.0, 42.0, 5.0 }, typeof(double), null, culture) ?? 0.0)); - Assert.Equal(5.0, (double)(MathMinMultiConverter.Instance.Convert(new object?[] { 10.0, 42.0, 5.0 }, typeof(double), null, culture) ?? 0.0)); - } -} diff --git a/tests/PdfEditorApp.Tests/DataMergeEngineTests.cs b/tests/PdfEditorApp.Tests/DataMergeEngineTests.cs deleted file mode 100644 index 23d04d7..0000000 --- a/tests/PdfEditorApp.Tests/DataMergeEngineTests.cs +++ /dev/null @@ -1,251 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using PdfEditorApp.Core.Data; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; -using PdfEditorApp.Models; -using Xunit; - -namespace PdfEditorApp.Tests; - -public class DataMergeEngineTests -{ - private readonly IDataMergeEngine _engine = new DataMergeEngine(); - - [Fact] - public void EvaluateText_SimplePlaceholder_ReplacesValue() - { - var record = new Dictionary - { - ["EmployeeName"] = "Johnathan Doe", - ["EmployeeId"] = "EMP-0842" - }; - - string template = "Employee: {{EmployeeName}} (ID: {{EmployeeId}})"; - string result = _engine.EvaluateText(template, record); - - Assert.Equal("Employee: Johnathan Doe (ID: EMP-0842)", result); - } - - [Fact] - public void EvaluateText_CaseInsensitiveLookup_MatchesDifferentCasing() - { - var record = new Dictionary - { - ["EMPLOYEE_NAME"] = "Sophia Martinez" - }; - - string template = "Hello, {{EmployeeName}}!"; - string result = _engine.EvaluateText(template, record, new DataMergeOptions { CaseInsensitiveLookup = true }); - - Assert.Equal("Hello, Sophia Martinez!", result); - } - - [Fact] - public void EvaluateText_FallbackValue_UsedWhenKeyIsMissingOrEmpty() - { - var record = new Dictionary - { - ["EmployeeName"] = "David Kim" - }; - - string template = "Dept: {{Department ?? Engineering}}, Level: {{Level ?? L5}}"; - string result = _engine.EvaluateText(template, record); - - Assert.Equal("Dept: Engineering, Level: L5", result); - } - - [Fact] - public void EvaluateText_CurrencyFormatting_FormatsCorrectly() - { - var record = new Dictionary - { - ["BasicSalary"] = "8500", - ["InrSalary"] = "125000", - ["EurSalary"] = "6200", - ["UsdSalary"] = "10500" - }; - - string templateInr = "Salary: {{InrSalary:currency:INR}}"; - string templateEur = "Salary: {{EurSalary:currency:EUR}}"; - string templateUsd = "Salary: {{UsdSalary:currency:USD}}"; - - string resultInr = _engine.EvaluateText(templateInr, record); - string resultEur = _engine.EvaluateText(templateEur, record); - string resultUsd = _engine.EvaluateText(templateUsd, record); - - Assert.Contains("₹1,25,000.00", resultInr); - Assert.Contains("€6,200.00", resultEur); - Assert.Contains("$10,500.00", resultUsd); - } - - [Theory] - [InlineData("en-US")] - [InlineData("en-GB")] - [InlineData("de-DE")] - [InlineData("fr-FR")] - [InlineData("ja-JP")] - public void EvaluateText_CurrencyFormatting_IsCultureInvariantAcrossLocales(string cultureName) - { - var prevCulture = CultureInfo.CurrentCulture; - try - { - CultureInfo.CurrentCulture = new CultureInfo(cultureName); - - var record = new Dictionary - { - ["InrSalary"] = "125000", - ["EurSalary"] = "6200" - }; - - string resultInr = _engine.EvaluateText("Salary: {{InrSalary:currency:INR}}", record); - string resultEur = _engine.EvaluateText("Salary: {{EurSalary:currency:EUR}}", record); - - Assert.Contains("₹1,25,000.00", resultInr); - Assert.Contains("€6,200.00", resultEur); - } - finally - { - CultureInfo.CurrentCulture = prevCulture; - } - } - - [Fact] - public void EvaluateText_NumericAndDateFormatting_FormatsCorrectly() - { - var record = new Dictionary - { - ["GrossAmount"] = "12345.6789", - ["JoiningDate"] = "2022-04-15" - }; - - string templateNum = "Amount: {{GrossAmount:N2}}"; - string templateDate = "Joined: {{JoiningDate:yyyy/MM/dd}}"; - - string resultNum = _engine.EvaluateText(templateNum, record); - string resultDate = _engine.EvaluateText(templateDate, record); - - Assert.Equal("Amount: 12,345.68", resultNum); - Assert.Equal("Joined: 2022/04/15", resultDate); - } - - [Fact] - public void EvaluateText_CaseTransforms_UppercaseLowercaseTitleCase() - { - var record = new Dictionary - { - ["Designation"] = "senior cloud engineer" - }; - - string templateUpper = "{{Designation:upper}}"; - string templateTitle = "{{Designation:title}}"; - - Assert.Equal("SENIOR CLOUD ENGINEER", _engine.EvaluateText(templateUpper, record)); - Assert.Equal("Senior Cloud Engineer", _engine.EvaluateText(templateTitle, record)); - } - - [Fact] - public void DetectPlaceholders_ExtractsAllTagsAcrossDocumentElements() - { - var doc = new PdfDocumentModel - { - Title = "Payslip for {{EmployeeName}}", - Author = "{{Company}}" - }; - - var page = new PdfPageModel - { - HeaderLeft = "Confidential - {{Department}}", - FooterRight = "Generated for {{EmployeeId}}", - Watermark = new PdfWatermarkElement { Text = "{{WatermarkStatus}}" }, - Elements = new List - { - new PdfTextElement { Text = "Gross: {{GrossSalary:C}}" }, - new PdfQrCodeElement { Content = "https://verify.com?id={{EmployeeId}}" }, - new PdfBarcodeElement { CodeValue = "{{BarcodeValue}}" }, - new PdfTableElement - { - Headers = new List { "{{Header1}}", "Amount" }, - Rows = new List> - { - new() { "Basic", "{{BasicSalary}}" } - } - } - } - }; - - doc.Pages.Add(page); - - var detected = _engine.DetectPlaceholders(doc); - - Assert.Contains("EmployeeName", detected); - Assert.Contains("Company", detected); - Assert.Contains("Department", detected); - Assert.Contains("EmployeeId", detected); - Assert.Contains("WatermarkStatus", detected); - Assert.Contains("GrossSalary", detected); - Assert.Contains("BarcodeValue", detected); - Assert.Contains("Header1", detected); - Assert.Contains("BasicSalary", detected); - } - - [Fact] - public void HydrateDocument_PopulatesAllElementsInClonedDocument() - { - var doc = new PdfDocumentModel - { - Title = "Payslip - {{EmployeeName}}" - }; - - var page = new PdfPageModel - { - HeaderLeft = "Dept: {{Department}}", - Elements = new List - { - new PdfTextElement { Text = "Welcome {{EmployeeName}}, Salary: {{Salary:currency:INR}}" }, - new PdfQrCodeElement { Content = "https://verify.corp.com/emp/{{EmployeeId}}" }, - new PdfBarcodeElement { CodeValue = "{{EmployeeId}}" }, - new PdfTableElement - { - Headers = new List { "Item", "Value" }, - Rows = new List> - { - new() { "Base", "{{Salary:currency:INR}}" } - } - } - } - }; - doc.Pages.Add(page); - - var record = new Dictionary - { - ["EmployeeName"] = "Amina Al-Mansoor", - ["Department"] = "Human Resources", - ["EmployeeId"] = "EMP-1315", - ["Salary"] = "92000" - }; - - var hydrated = _engine.HydrateDocument(doc, record); - - // Original template remains untouched - Assert.Equal("Payslip - {{EmployeeName}}", doc.Title); - - // Hydrated clone has values replaced - Assert.Equal("Payslip - Amina Al-Mansoor", hydrated.Title); - Assert.Equal("Dept: Human Resources", hydrated.Pages[0].HeaderLeft); - - var textEl = (PdfTextElement)hydrated.Pages[0].Elements[0]; - Assert.Contains("Welcome Amina Al-Mansoor", textEl.Text); - Assert.Contains("₹92,000.00", textEl.Text); - - var qrEl = (PdfQrCodeElement)hydrated.Pages[0].Elements[1]; - Assert.Equal("https://verify.corp.com/emp/EMP-1315", qrEl.Content); - - var barEl = (PdfBarcodeElement)hydrated.Pages[0].Elements[2]; - Assert.Equal("EMP-1315", barEl.CodeValue); - - var tableEl = (PdfTableElement)hydrated.Pages[0].Elements[3]; - Assert.Equal("₹92,000.00", tableEl.Rows[0][1]); - } -} diff --git a/tests/PdfEditorApp.Tests/DataStudioTests.cs b/tests/PdfEditorApp.Tests/DataStudioTests.cs deleted file mode 100644 index 4d8f90e..0000000 --- a/tests/PdfEditorApp.Tests/DataStudioTests.cs +++ /dev/null @@ -1,308 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using DocumentFormat.OpenXml; -using DocumentFormat.OpenXml.Packaging; -using DocumentFormat.OpenXml.Spreadsheet; -using PdfEditorApp.Core.Data; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; -using PdfEditorApp.Models; -using PdfEditorApp.ViewModels; -using PdfEditorApp.ViewModels.DataStudio; -using PdfEditorApp.ViewModels.ElementViewModels; -using Xunit; - -namespace PdfEditorApp.Tests; - -public class DataStudioTests -{ - [Fact] - public void DataMatrix_BasicOperations_AndTypeInference() - { - var headers = new List { "Product", "Revenue", "Margin", "Launch Date" }; - var rows = new List> - { - new() { "Laptop Pro", "$1,200.50", "25.5%", "2024-01-15" }, - new() { "Desk Monitor", "$450.00", "30.0%", "2024-02-20" }, - new() { "Mechanical Keyboard", "$120.00", "42.1%", "2024-03-05" } - }; - - var matrix = new DataMatrix(headers, rows); - - Assert.Equal(3, matrix.RowCount); - Assert.Equal(4, matrix.ColumnCount); - Assert.Equal("$1,200.50", matrix.GetCell(0, 1)); - Assert.Equal("Mechanical Keyboard", matrix.GetCell(2, 0)); - - // Test Type Inference - Assert.Equal(DataColumnType.Text, matrix.InferColumnType(0)); - Assert.Equal(DataColumnType.Currency, matrix.InferColumnType(1)); - Assert.Equal(DataColumnType.Percentage, matrix.InferColumnType(2)); - Assert.Equal(DataColumnType.Date, matrix.InferColumnType(3)); - - // Row/Column mutations - matrix.AddRow(new[] { "Wireless Mouse", "$60.00", "50.0%", "2024-04-10" }); - Assert.Equal(4, matrix.RowCount); - - matrix.RemoveRow(3); - Assert.Equal(3, matrix.RowCount); - - matrix.AddColumn("Stock Units", "100"); - Assert.Equal(5, matrix.ColumnCount); - Assert.Equal("100", matrix.GetCell(0, 4)); - - matrix.RemoveColumn(4); - Assert.Equal(4, matrix.ColumnCount); - } - - [Fact] - public void DataSourceService_CsvParser_HandlesRFC4180AndDelimiters() - { - var service = new DataSourceService(); - - // 1. Standard CSV with quotes, commas, and embedded newlines - string csvData = "Name,Description,Amount,Status\n" + - "\"Alpha Widget\",\"High quality, durable\",1500,Active\n" + - "\"Beta Device\",\"Multi-line\r\nSpecs Included\",3200,Pending"; - - var matrix = service.ParseCsv(csvData, ',', true); - - Assert.Equal(2, matrix.RowCount); - Assert.Equal(4, matrix.ColumnCount); - Assert.Equal("Name", matrix.Headers[0]); - Assert.Equal("Alpha Widget", matrix.GetCell(0, 0)); - Assert.Equal("High quality, durable", matrix.GetCell(0, 1)); - Assert.Equal("1500", matrix.GetCell(0, 2)); - Assert.Contains("Multi-line", matrix.GetCell(1, 1)); - - // 2. Semicolon-delimited European CSV - string semiCsv = "Category;Q1;Q2;Q3\nEurope;100;120;140\nAsia;200;220;250"; - var semiMatrix = service.ParseCsv(semiCsv, ';', true); - Assert.Equal(2, semiMatrix.RowCount); - Assert.Equal(4, semiMatrix.ColumnCount); - Assert.Equal("Europe", semiMatrix.GetCell(0, 0)); - - // 3. Tab-separated data (TSV) - string tsvData = "Dept\tHeadcount\tBudget\nEngineering\t45\t$500k\nSales\t30\t$400k"; - var tsvMatrix = service.ParseTsv(tsvData, true); - Assert.Equal(2, tsvMatrix.RowCount); - Assert.Equal(3, tsvMatrix.ColumnCount); - Assert.Equal("Engineering", tsvMatrix.GetCell(0, 0)); - } - - [Fact] - public void DataSourceService_JsonParser_SupportsArraysAndObjects() - { - var service = new DataSourceService(); - - // 1. Array of flat objects - string jsonObjects = @"[ - { ""id"": 1, ""product"": ""Cloud Storage"", ""price"": 99.99, ""tier"": ""Standard"" }, - { ""id"": 2, ""product"": ""Dedicated VM"", ""price"": 299.00, ""tier"": ""Enterprise"" } - ]"; - - var matrix = service.ParseJson(jsonObjects); - Assert.Equal(2, matrix.RowCount); - Assert.True(matrix.ColumnCount >= 4); - Assert.Contains("product", matrix.Headers); - Assert.Equal("Cloud Storage", matrix.GetCell(0, matrix.Headers.IndexOf("product"))); - - // 2. Nested JSON with path (e.g. { data: { metrics: [...] } }) - string nestedJson = @"{ - ""status"": ""success"", - ""data"": { - ""metrics"": [ - { ""quarter"": ""Q1"", ""sales"": 500, ""profit"": 80 }, - { ""quarter"": ""Q2"", ""sales"": 650, ""profit"": 110 } - ] - } - }"; - - var nestedMatrix = service.ParseJson(nestedJson, "data.metrics"); - Assert.Equal(2, nestedMatrix.RowCount); - Assert.Equal("Q1", nestedMatrix.GetCell(0, nestedMatrix.Headers.IndexOf("quarter"))); - - // 3. 2D array format - string json2D = @"[ - [""Region"", ""2024"", ""2025""], - [""North"", 100, 130], - [""South"", 80, 95] - ]"; - var matrix2D = service.ParseJson(json2D); - Assert.Equal(2, matrix2D.RowCount); - Assert.Equal(3, matrix2D.ColumnCount); - Assert.Equal("Region", matrix2D.Headers[0]); - Assert.Equal("North", matrix2D.GetCell(0, 0)); - } - - [Fact] - public void DataSourceService_ExcelParser_ReadsOpenXmlSpreadsheet() - { - var service = new DataSourceService(); - - // Generate in-memory .xlsx file using OpenXml - using var ms = new MemoryStream(); - using (var doc = SpreadsheetDocument.Create(ms, SpreadsheetDocumentType.Workbook, true)) - { - var workbookPart = doc.AddWorkbookPart(); - workbookPart.Workbook = new Workbook(); - - var worksheetPart = workbookPart.AddNewPart(); - var sheetData = new SheetData(); - - // Row 1: Headers - var headerRow = new Row { RowIndex = 1 }; - headerRow.Append( - new Cell { CellReference = "A1", DataType = CellValues.String, CellValue = new CellValue("Quarter") }, - new Cell { CellReference = "B1", DataType = CellValues.String, CellValue = new CellValue("Revenue") }, - new Cell { CellReference = "C1", DataType = CellValues.String, CellValue = new CellValue("Expenses") } - ); - sheetData.Append(headerRow); - - // Row 2: Data - var dataRow1 = new Row { RowIndex = 2 }; - dataRow1.Append( - new Cell { CellReference = "A2", DataType = CellValues.String, CellValue = new CellValue("Q1") }, - new Cell { CellReference = "B2", DataType = CellValues.Number, CellValue = new CellValue("150") }, - new Cell { CellReference = "C2", DataType = CellValues.Number, CellValue = new CellValue("90") } - ); - sheetData.Append(dataRow1); - - // Row 3: Data - var dataRow2 = new Row { RowIndex = 3 }; - dataRow2.Append( - new Cell { CellReference = "A3", DataType = CellValues.String, CellValue = new CellValue("Q2") }, - new Cell { CellReference = "B3", DataType = CellValues.Number, CellValue = new CellValue("220") }, - new Cell { CellReference = "C3", DataType = CellValues.Number, CellValue = new CellValue("110") } - ); - sheetData.Append(dataRow2); - - worksheetPart.Worksheet = new Worksheet(sheetData); - - var sheets = doc.WorkbookPart!.Workbook!.AppendChild(new Sheets()); - sheets.Append(new Sheet - { - Id = doc.WorkbookPart.GetIdOfPart(worksheetPart), - SheetId = 1, - Name = "FinancialSummary" - }); - - workbookPart.Workbook.Save(); - } - - ms.Position = 0; - var sheetNames = service.GetExcelSheetNames(ms); - Assert.Single(sheetNames); - Assert.Equal("FinancialSummary", sheetNames[0]); - - ms.Position = 0; - var matrix = service.ParseExcel(ms, "FinancialSummary", true); - Assert.Equal(2, matrix.RowCount); - Assert.Equal(3, matrix.ColumnCount); - Assert.Equal("Quarter", matrix.Headers[0]); - Assert.Equal("Q1", matrix.GetCell(0, 0)); - Assert.Equal("150", matrix.GetCell(0, 1)); - Assert.Equal("Q2", matrix.GetCell(1, 0)); - Assert.Equal("220", matrix.GetCell(1, 1)); - } - - [Fact] - public void DataBindingService_ChartAndTableMapping_AndBidirectionalConversion() - { - var bindingService = new DataBindingService(); - - var headers = new List { "Period", "Gross Sales", "Net Profit" }; - var rows = new List> - { - new() { "2023", "500", "120" }, - new() { "2024", "750", "210" }, - new() { "2025", "1100", "380" } - }; - var matrix = new DataMatrix(headers, rows); - - // 1. Apply to Chart (Multi-Series) - var chart = new PdfChartElement { ChartType = ChartType.BarColumn }; - bindingService.ApplyToChart(matrix, chart, 0, new List { 1, 2 }); - - Assert.Equal(3, chart.Categories.Count); - Assert.Equal("2023", chart.Categories[0]); - Assert.Equal(2, chart.MultiSeries.Count); - Assert.Equal("Gross Sales", chart.MultiSeries[0].Name); - Assert.Equal(500, chart.MultiSeries[0].Values[0]); - Assert.Equal("Net Profit", chart.MultiSeries[1].Name); - Assert.Equal(120, chart.MultiSeries[1].Values[0]); - - // 2. Extract DataMatrix from Chart - var extractedFromChart = bindingService.ExtractFromChart(chart); - Assert.Equal(3, extractedFromChart.RowCount); - Assert.Equal(3, extractedFromChart.ColumnCount); - Assert.Equal("2023", extractedFromChart.GetCell(0, 0)); - Assert.Equal("500", extractedFromChart.GetCell(0, 1)); - Assert.Equal("120", extractedFromChart.GetCell(0, 2)); - - // 3. Apply to Table - var table = new PdfTableElement(); - bindingService.ApplyToTable(matrix, table); - Assert.Equal(3, table.Headers.Count); - Assert.Equal(3, table.Rows.Count); - Assert.Equal("Period", table.Headers[0]); - Assert.Equal("1100", table.Rows[2][1]); - - // 4. Convert Table to Chart - var convertedChart = bindingService.ConvertTableToChart(table, ChartType.SmoothLine); - Assert.NotNull(convertedChart); - Assert.Equal(ChartType.SmoothLine, convertedChart.ChartType); - Assert.Equal(3, convertedChart.Categories.Count); - - // 5. Convert Chart to Table - var convertedTable = bindingService.ConvertChartToTable(convertedChart); - Assert.NotNull(convertedTable); - Assert.Equal(3, convertedTable.Rows.Count); - } - - [Fact] - public void DataStudioViewModel_ManualEditing_AndElementCreation() - { - var dataSourceService = new DataSourceService(); - var dataBindingService = new DataBindingService(); - var vm = new DataStudioViewModel(dataSourceService, dataBindingService); - - // Open for new Chart - var page = new PageViewModel { PageNumber = 1, Width = 595, Height = 842 }; - vm.OpenForNew("NewChart", page); - - Assert.True(vm.IsOpen); - Assert.True(vm.IsChartTarget); - - // Set raw text input and parse - vm.RawTextInput = "Division\tTarget\nAmericas\t500\nEMEA\t400\nAPAC\t650"; - vm.ParseRawTextInput(); - - Assert.Equal(3, vm.CurrentMatrix.RowCount); - Assert.Equal(2, vm.CurrentMatrix.ColumnCount); - Assert.Equal("Division", vm.MatrixHeaders[0]); - Assert.Equal("Target", vm.MatrixHeaders[1]); - - // Add a row - vm.AddRow(); - Assert.Equal(4, vm.CurrentMatrix.RowCount); - - // Apply Data and verify event callback - ElementViewModelBase? createdElement = null; - vm.OnElementCreated += (el, desc) => createdElement = el; - - vm.ApplyData(); - - Assert.False(vm.IsOpen); - Assert.NotNull(createdElement); - Assert.IsType(createdElement); - - var chartVm = (ChartElementViewModel)createdElement; - Assert.Equal(4, chartVm.Bars.Count); - Assert.Equal("Americas", chartVm.Bars[0].Category); - Assert.Equal(500, chartVm.Bars[0].Value); - } -} diff --git a/tests/PdfEditorApp.Tests/DirectEditingTests.cs b/tests/PdfEditorApp.Tests/DirectEditingTests.cs deleted file mode 100644 index 3d9a43a..0000000 --- a/tests/PdfEditorApp.Tests/DirectEditingTests.cs +++ /dev/null @@ -1,371 +0,0 @@ -using System; -using System.Linq; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; -using PdfEditorApp.Models; -using PdfEditorApp.Services; -using PdfEditorApp.ViewModels; -using PdfEditorApp.ViewModels.ElementViewModels; -using Xunit; - -namespace PdfEditorApp.Tests; - -public class DirectEditingTests -{ - [Fact] - public void TextElement_EditMode_TransitionsCorrectly() - { - var textEl = new TextElementViewModel - { - Text = "Original Content", - FontSize = 14, - IsInEditMode = false - }; - - Assert.False(textEl.IsInEditMode); - - // Enter edit mode - textEl.IsInEditMode = true; - Assert.True(textEl.IsInEditMode); - - // Edit text - textEl.Text = "Updated Direct Canvas Text"; - Assert.Equal("Updated Direct Canvas Text", textEl.Text); - - // Exit edit mode - textEl.IsInEditMode = false; - Assert.False(textEl.IsInEditMode); - } - - [Fact] - public void InspectorViewModel_FontSize_IncreaseAndDecreaseCommands() - { - var inspector = new InspectorViewModel(); - var page = new PageViewModel(); - var textEl = new TextElementViewModel - { - Text = "Headline Text", - FontSize = 16 - }; - page.AddElement(textEl); - inspector.UpdateSelection(textEl, page); - - Assert.True(inspector.IsTextElement); - Assert.Equal(16, textEl.FontSize); - - // Increase font size - inspector.IncreaseFontSizeCommand.Execute(null); - Assert.Equal(17, textEl.FontSize); - - // Increase again - inspector.IncreaseFontSizeCommand.Execute(null); - Assert.Equal(18, textEl.FontSize); - - // Decrease font size - inspector.DecreaseFontSizeCommand.Execute(null); - Assert.Equal(17, textEl.FontSize); - - // Test bounds and finish edit mode - textEl.IsInEditMode = false; - Assert.False(textEl.IsInEditMode); - - inspector.StartEditModeCommand.Execute(null); - Assert.True(textEl.IsInEditMode); - - inspector.ToggleEditModeCommand.Execute(null); - Assert.False(textEl.IsInEditMode); - - inspector.ToggleEditModeCommand.Execute(null); - Assert.True(textEl.IsInEditMode); - - inspector.FinishEditModeCommand.Execute(null); - Assert.False(textEl.IsInEditMode); - } - - [Fact] - public void InspectorViewModel_TextFormattingCommands_WorkDirectly() - { - var inspector = new InspectorViewModel(); - var page = new PageViewModel(); - var textEl = new TextElementViewModel - { - Text = "Sample Paragraph", - FontSize = 12, - IsBold = false, - IsItalic = false, - IsUnderline = false, - Alignment = TextAlignmentMode.Left - }; - page.AddElement(textEl); - inspector.UpdateSelection(textEl, page); - - // Toggle Bold - inspector.ToggleBoldCommand.Execute(null); - Assert.True(textEl.IsBold); - - // Toggle Italic - inspector.ToggleItalicCommand.Execute(null); - Assert.True(textEl.IsItalic); - - // Toggle Underline - inspector.ToggleUnderlineCommand.Execute(null); - Assert.True(textEl.IsUnderline); - - // Change Alignment - inspector.SetAlignmentCommand.Execute("Center"); - Assert.Equal(TextAlignmentMode.Center, textEl.Alignment); - - // Change Color - inspector.SetTextColorCommand.Execute("#0F6CBD"); - Assert.Equal("#0F6CBD", textEl.TextColorHex); - - // Auto-Fit Text - inspector.AutoFitTextBothCommand.Execute(null); - Assert.True(textEl.Width > 0); - Assert.True(textEl.Height > 0); - } - - [Fact] - public void ShapeElement_InPlaceLabelEditing_WorksCorrectly() - { - var shape = new ShapeElementViewModel - { - ShapeType = ShapeType.RoundedRectangle, - Label = "CONFIDENTIAL", - LabelFontSize = 14, - IsInEditMode = false - }; - - Assert.False(shape.IsInEditMode); - Assert.Equal("CONFIDENTIAL", shape.Label); - - // Enter label edit mode - shape.IsInEditMode = true; - Assert.True(shape.IsInEditMode); - - // Edit label directly - shape.Label = "APPROVED"; - Assert.Equal("APPROVED", shape.Label); - - // Exit edit mode - shape.IsInEditMode = false; - Assert.False(shape.IsInEditMode); - } - - [Fact] - public void TableElement_DirectCellAndHeaderEditing_RoundTripsModel() - { - var table = new TableElementViewModel(); - Assert.Equal(4, table.Headers.Count); - Assert.Equal(3, table.Rows.Count); - - // Direct edit header - table.Headers[0].Text = "Service Description"; - Assert.Equal("Service Description", table.Headers[0].Text); - - // Direct edit cell - table.Rows[0].Cells[0].Text = "Enterprise Architecture Consulting"; - table.Rows[0].Cells[3].Text = "$12,500.00"; - - Assert.Equal("Enterprise Architecture Consulting", table.Rows[0].Cells[0].Text); - Assert.Equal("$12,500.00", table.Rows[0].Cells[3].Text); - - // Convert to Model and back - var model = (PdfTableElement)table.ToModel(); - Assert.Equal("Service Description", model.Headers[0]); - Assert.Equal("Enterprise Architecture Consulting", model.Rows[0][0]); - Assert.Equal("$12,500.00", model.Rows[0][3]); - - var restoredTable = new TableElementViewModel(); - restoredTable.LoadFromModel(model); - - Assert.Equal("Service Description", restoredTable.Headers[0].Text); - Assert.Equal("Enterprise Architecture Consulting", restoredTable.Rows[0].Cells[0].Text); - Assert.Equal("$12,500.00", restoredTable.Rows[0].Cells[3].Text); - } - - [Fact] - public void StickyNoteElement_DirectTextEditing_WorksCorrectly() - { - var note = new StickyNoteElementViewModel - { - Author = "Reviewer", - NoteText = "Please update section 3" - }; - - note.NoteText = "Section 3 approved with revisions."; - var model = (PdfStickyNoteElement)note.ToModel(); - Assert.Equal("Section 3 approved with revisions.", model.NoteText); - } - - [Fact] - public void PageViewModel_SelectionChange_DeactivatesEditModeOnOtherElements() - { - var page = new PageViewModel(); - var el1 = new TextElementViewModel { Text = "Element 1", IsInEditMode = true }; - var el2 = new TextElementViewModel { Text = "Element 2", IsInEditMode = false }; - page.AddElement(el1); - page.AddElement(el2); - - page.SelectElement(el1); - el1.IsInEditMode = true; - Assert.True(el1.IsSelected); - Assert.True(el1.IsInEditMode); - - // Selecting el2 must automatically deactivate edit mode on el1 - page.SelectElement(el2); - Assert.False(el1.IsSelected); - Assert.False(el1.IsInEditMode); - Assert.True(el2.IsSelected); - - // Clearing selection must deactivate edit mode on all elements - el2.IsInEditMode = true; - Assert.True(el2.IsInEditMode); - page.ClearSelection(); - Assert.False(el2.IsSelected); - Assert.False(el2.IsInEditMode); - } - - [Fact] - public void DeleteSelectedElement_SingleElement_DeletesAndSupportsUndo() - { - var undoRedo = new UndoRedoService(); - var inspector = new InspectorViewModel { UndoRedo = undoRedo }; - var page = new PageViewModel(); - var textEl = new TextElementViewModel { Text = "Heading to delete" }; - page.AddElement(textEl); - page.SelectElement(textEl); - inspector.UpdateSelection(textEl, page); - - Assert.Single(page.Elements); - Assert.Equal(textEl, page.SelectedElement); - - // Execute Delete - inspector.DeleteSelectedElementCommand.Execute(null); - - Assert.Empty(page.Elements); - Assert.Null(page.SelectedElement); - Assert.Empty(page.SelectedElements); - Assert.True(undoRedo.CanUndo); - - // Undo Delete - undoRedo.Undo(); - Assert.Single(page.Elements); - Assert.Equal("Heading to delete", ((TextElementViewModel)page.Elements[0]).Text); - } - - [Fact] - public void DeleteSelectedElement_MultiElement_DeletesAllAndSupportsUndo() - { - var undoRedo = new UndoRedoService(); - var inspector = new InspectorViewModel { UndoRedo = undoRedo }; - var page = new PageViewModel(); - var el1 = new TextElementViewModel { Text = "Heading 1" }; - var el2 = new TextElementViewModel { Text = "Paragraph 1" }; - var el3 = new ShapeElementViewModel { Width = 100, Height = 50 }; - page.AddElement(el1); - page.AddElement(el2); - page.AddElement(el3); - - page.SelectElements(new[] { el1, el2 }); - inspector.UpdateSelection(el2, page); - - Assert.Equal(3, page.Elements.Count); - Assert.Equal(2, page.SelectedElements.Count); - - // Execute Delete - inspector.DeleteSelectedElementCommand.Execute(null); - - Assert.Single(page.Elements); - Assert.Contains(el3, page.Elements); - Assert.Empty(page.SelectedElements); - Assert.True(undoRedo.CanUndo); - - // Undo Delete - undoRedo.Undo(); - Assert.Equal(3, page.Elements.Count); - Assert.Contains(el1, page.Elements); - Assert.Contains(el2, page.Elements); - Assert.Contains(el3, page.Elements); - } - - [Fact] - public void InspectorViewModel_ToggleBold_WithTextSelection_FormatsOnlySelection_AndSupportsUndo() - { - var undoRedo = new UndoRedoService(); - var inspector = new InspectorViewModel { UndoRedo = undoRedo }; - var page = new PageViewModel(); - var textEl = new TextElementViewModel - { - Text = "normative period of rec\nmacro environment,\nd top-line revenue" - }; - page.AddElement(textEl); - inspector.UpdateSelection(textEl, page); - - // Enter edit mode and select "macro environment," - textEl.IsInEditMode = true; - textEl.UpdateTextSelection(24, 18, "macro environment,"); - Assert.True(textEl.HasTextSelection); - - // Execute ToggleBold - inspector.ToggleBoldCommand.Execute(null); - - Assert.Equal("normative period of rec\n**macro environment,**\nd top-line revenue", textEl.Text); - Assert.False(textEl.IsBold); // Element-wide property remains false! - Assert.NotNull(textEl.Spans); // Spans are generated - Assert.True(undoRedo.CanUndo); - - // Undo - undoRedo.Undo(); - Assert.Equal("normative period of rec\nmacro environment,\nd top-line revenue", textEl.Text); - - // Redo - undoRedo.Redo(); - Assert.Equal("normative period of rec\n**macro environment,**\nd top-line revenue", textEl.Text); - } - - [Fact] - public void InspectorViewModel_ToggleBold_WithoutTextSelection_TogglesElementProperty() - { - var undoRedo = new UndoRedoService(); - var inspector = new InspectorViewModel { UndoRedo = undoRedo }; - var page = new PageViewModel(); - var textEl = new TextElementViewModel { Text = "Sample Heading", IsBold = false }; - page.AddElement(textEl); - inspector.UpdateSelection(textEl, page); - - Assert.False(textEl.IsBold); - Assert.False(textEl.HasTextSelection); - - // Execute ToggleBold - inspector.ToggleBoldCommand.Execute(null); - Assert.True(textEl.IsBold); - - // Toggle again - inspector.ToggleBoldCommand.Execute(null); - Assert.False(textEl.IsBold); - } - - [Fact] - public void InspectorViewModel_SetTextColor_WithTextSelection_FormatsOnlySelection() - { - var undoRedo = new UndoRedoService(); - var inspector = new InspectorViewModel { UndoRedo = undoRedo }; - var page = new PageViewModel(); - var textEl = new TextElementViewModel { Text = "Hello World" }; - page.AddElement(textEl); - inspector.UpdateSelection(textEl, page); - - textEl.IsInEditMode = true; - textEl.UpdateTextSelection(6, 5, "World"); - - inspector.SetTextColorCommand.Execute("#0F6CBD"); - - Assert.Equal("Hello World", textEl.Text); - Assert.NotNull(textEl.Spans); - var coloredSpan = textEl.Spans.FirstOrDefault(s => s.TextColorHex == "#0F6CBD"); - Assert.NotNull(coloredSpan); - Assert.Equal("World", coloredSpan.Text); - } -} - diff --git a/tests/PdfEditorApp.Tests/DocumentAuditServiceTests.cs b/tests/PdfEditorApp.Tests/DocumentAuditServiceTests.cs deleted file mode 100644 index 35eb426..0000000 --- a/tests/PdfEditorApp.Tests/DocumentAuditServiceTests.cs +++ /dev/null @@ -1,140 +0,0 @@ -using System; -using System.IO; -using System.Linq; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; -using PdfEditorApp.Models; -using PdfEditorApp.Services; -using Xunit; - -namespace PdfEditorApp.Tests; - -public class DocumentAuditServiceTests -{ - [Fact] - public void Wcag21_RelativeLuminanceAndContrastRatio_CalculatesAccurately() - { - // Black luminance is 0.0 - double blackLum = DocumentAuditService.CalculateRelativeLuminance("#000000"); - Assert.Equal(0.0, blackLum, 3); - - // White luminance is 1.0 - double whiteLum = DocumentAuditService.CalculateRelativeLuminance("#FFFFFF"); - Assert.Equal(1.0, whiteLum, 3); - - // Black on White contrast ratio is 21.0:1 - double maxContrast = DocumentAuditService.CalculateContrastRatio("#000000", "#FFFFFF"); - Assert.Equal(21.0, maxContrast); - - // White on White contrast ratio is 1.0:1 - double minContrast = DocumentAuditService.CalculateContrastRatio("#FFFFFF", "#FFFFFF"); - Assert.Equal(1.0, minContrast); - - // Gray #777777 on White #FFFFFF is ~4.47:1 (fails normal AA 4.5:1, passes large text AA 3.0:1) - double grayContrast = DocumentAuditService.CalculateContrastRatio("#777777", "#FFFFFF"); - Assert.True(grayContrast >= 4.4 && grayContrast <= 4.55); - - // Fluent Brand Blue #0F6CBD on White #FFFFFF passes AA - double brandBlueContrast = DocumentAuditService.CalculateContrastRatio("#0F6CBD", "#FFFFFF"); - Assert.True(brandBlueContrast >= 4.5); - } - - [Fact] - public void DocumentAuditService_DetectsLowContrastAndAutoFixes() - { - // Arrange - var auditService = new DocumentAuditService(); - var doc = new PdfDocumentModel { Title = "Quarterly Compliance Report", Author = "Financial Audit Team" }; - var page = new PdfPageModel { Width = 595, Height = 842, BackgroundColorHex = "#FFFFFF" }; - - // Low contrast text element (white text on white page) - var lowContrastText = new PdfTextElement - { - Id = "txt-low-contrast", - X = 50, - Y = 50, - Width = 200, - Height = 30, - Text = "Hidden Low Contrast Disclaimer", - FontSize = 10, - TextColorHex = "#FFFFFF", - BackgroundColorHex = "Transparent" - }; - page.Elements.Add(lowContrastText); - doc.Pages.Add(page); - - // Act - Initial Audit - var report1 = auditService.RunAudit(doc); - - // Assert - Error detected - var contrastIssue = report1.Issues.FirstOrDefault(i => i.Category == "Accessibility" && i.Severity == "Error"); - Assert.NotNull(contrastIssue); - Assert.Contains("WCAG 2.1 AA Contrast Failure", contrastIssue.Title); - Assert.True(contrastIssue.CanAutoFix); - - // Act - Auto-Fix - int fixedCount = auditService.AutoFixContrastIssues(doc); - Assert.Equal(1, fixedCount); - Assert.Equal("#0F172A", lowContrastText.TextColorHex); // Dark high-contrast replacement - - // Act - Re-Audit - var report2 = auditService.RunAudit(doc); - var remainingErrors = report2.Issues.Where(i => i.Category == "Accessibility" && i.Severity == "Error"); - Assert.Empty(remainingErrors); - Assert.True(report2.HealthScore > report1.HealthScore); - } - - [Fact] - public void DocumentAuditService_ValidatesPdfAMetadataAndAutoFixes() - { - // Arrange - var auditService = new DocumentAuditService(); - var doc = new PdfDocumentModel - { - Title = "", // Missing Title - Author = "" // Missing Author - }; - var page = new PdfPageModel { Width = 595, Height = 842 }; - page.Elements.Add(new PdfTextElement { X = 50, Y = 50, Text = "Valid Content", FontSize = 12, TextColorHex = "#000000" }); - doc.Pages.Add(page); - - // Act - var report1 = auditService.RunAudit(doc); - - // Assert - Missing title issue found - var titleIssue = report1.Issues.FirstOrDefault(i => i.Title == "Missing Document Title"); - Assert.NotNull(titleIssue); - Assert.True(report1.PdfAComplianceScore < 100); - - // Act - Auto Fix Metadata - int fixedCount = auditService.AutoFixMetadataIssues(doc); - Assert.True(fixedCount >= 1); - Assert.False(string.IsNullOrWhiteSpace(doc.Title)); - - // Act - Re-Audit - var report2 = auditService.RunAudit(doc); - Assert.Null(report2.Issues.FirstOrDefault(i => i.Title == "Missing Document Title")); - Assert.True(report2.PdfAComplianceScore > report1.PdfAComplianceScore); - } - - [Fact] - public void DocumentAuditService_AutoFixMissingAltText_PopulatesFigureLabels() - { - // Arrange - var auditService = new DocumentAuditService(); - var doc = new PdfDocumentModel { Title = "Catalog", Author = "Design Dept" }; - var page = new PdfPageModel { Width = 595, Height = 842 }; - - var img1 = new PdfImageElement { X = 50, Y = 100, Width = 200, Height = 150, AltText = "" }; - var img2 = new PdfImageElement { X = 50, Y = 300, Width = 200, Height = 150, AltText = "" }; - page.Elements.Add(img1); - page.Elements.Add(img2); - doc.Pages.Add(page); - - // Act - Auto Fix Alt Text - int fixedCount = auditService.AutoFixMissingAltText(doc); - Assert.Equal(2, fixedCount); - Assert.Equal("Document Figure 1", img1.AltText); - Assert.Equal("Document Figure 2", img2.AltText); - } -} diff --git a/tests/PdfEditorApp.Tests/DocumentCompareServiceTests.cs b/tests/PdfEditorApp.Tests/DocumentCompareServiceTests.cs deleted file mode 100644 index 5060606..0000000 --- a/tests/PdfEditorApp.Tests/DocumentCompareServiceTests.cs +++ /dev/null @@ -1,124 +0,0 @@ -using System; -using System.Linq; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; -using PdfEditorApp.Models; -using PdfEditorApp.Services; -using Xunit; - -namespace PdfEditorApp.Tests; - -public class DocumentCompareServiceTests -{ - [Fact] - public void CompareDocuments_IdenticalDocs_ReportsZeroDifferences() - { - // Arrange - var service = new DocumentCompareService(); - var doc1 = new PdfDocumentModel { Title = "Budget 2026", Author = "Finance Team" }; - var page1 = new PdfPageModel { PageNumber = 1, Width = 600, Height = 800 }; - page1.Elements.Add(new PdfTextElement { Id = "t1", Text = "Revenue $1M", X = 50, Y = 50, Width = 200, Height = 30 }); - doc1.Pages.Add(page1); - - var doc2 = new PdfDocumentModel { Title = "Budget 2026", Author = "Finance Team" }; - var page2 = new PdfPageModel { PageNumber = 1, Width = 600, Height = 800 }; - page2.Elements.Add(new PdfTextElement { Id = "t1", Text = "Revenue $1M", X = 50, Y = 50, Width = 200, Height = 30 }); - doc2.Pages.Add(page2); - - // Act - var report = service.CompareDocuments(doc1, doc2); - - // Assert - Assert.Equal(0, report.TotalDifferencesCount); - Assert.Equal(0, report.AdditionsCount); - Assert.Equal(0, report.DeletionsCount); - Assert.Equal(0, report.ModificationsCount); - } - - [Fact] - public void CompareDocuments_DetectsMetadataAndSecurityChanges() - { - // Arrange - var service = new DocumentCompareService(); - var doc1 = new PdfDocumentModel - { - Title = "Draft V1.pdf", - Author = "Intern", - SecuritySettings = new PdfSecuritySettings { IsPasswordProtected = false } - }; - doc1.Pages.Add(new PdfPageModel { PageNumber = 1 }); - - var doc2 = new PdfDocumentModel - { - Title = "Final V2.pdf", - Author = "Lead Director", - SecuritySettings = new PdfSecuritySettings { IsPasswordProtected = true, OpenPassword = "123" } - }; - doc2.Pages.Add(new PdfPageModel { PageNumber = 1 }); - - // Act - var report = service.CompareDocuments(doc1, doc2); - - // Assert - Assert.Contains(report.Differences, d => d.DiffType == CompareDiffType.MetadataModified && d.Description.Contains("Title")); - Assert.Contains(report.Differences, d => d.DiffType == CompareDiffType.MetadataModified && d.Description.Contains("Author")); - Assert.Contains(report.Differences, d => d.DiffType == CompareDiffType.SecurityModified); - } - - [Fact] - public void CompareDocuments_DetectsTextModificationsAndFormattingChanges() - { - // Arrange - var service = new DocumentCompareService(); - var doc1 = new PdfDocumentModel { Title = "Memo" }; - var page1 = new PdfPageModel { PageNumber = 1 }; - page1.Elements.Add(new PdfTextElement - { - Id = "txt-content", - Text = "Draft policy v1.0", - FontSize = 12, - TextColorHex = "#000000" - }); - doc1.Pages.Add(page1); - - var doc2 = new PdfDocumentModel { Title = "Memo" }; - var page2 = new PdfPageModel { PageNumber = 1 }; - page2.Elements.Add(new PdfTextElement - { - Id = "txt-content", - Text = "Approved policy v2.0", - FontSize = 14, - TextColorHex = "#0F6CBD" - }); - doc2.Pages.Add(page2); - - // Act - var report = service.CompareDocuments(doc1, doc2); - - // Assert - Assert.Contains(report.Differences, d => d.DiffType == CompareDiffType.TextModified && d.OldValue == "Draft policy v1.0" && d.NewValue == "Approved policy v2.0"); - Assert.Contains(report.Differences, d => d.DiffType == CompareDiffType.FormattingModified); - } - - [Fact] - public void CompareDocuments_DetectsPageAdditionsAndDeletions() - { - // Arrange - var service = new DocumentCompareService(); - var doc1 = new PdfDocumentModel { Title = "Report" }; - doc1.Pages.Add(new PdfPageModel { PageNumber = 1 }); - doc1.Pages.Add(new PdfPageModel { PageNumber = 2 }); - - var doc2 = new PdfDocumentModel { Title = "Report" }; - doc2.Pages.Add(new PdfPageModel { PageNumber = 1 }); - doc2.Pages.Add(new PdfPageModel { PageNumber = 2 }); - doc2.Pages.Add(new PdfPageModel { PageNumber = 3 }); // Added 3rd page - - // Act - var report = service.CompareDocuments(doc1, doc2); - - // Assert - Assert.Contains(report.Differences, d => d.DiffType == CompareDiffType.PageCountChanged); - Assert.Contains(report.Differences, d => d.DiffType == CompareDiffType.ElementAdded && d.PageNumber == 3); - } -} diff --git a/tests/PdfEditorApp.Tests/DocumentExportAndPersistenceTests.cs b/tests/PdfEditorApp.Tests/DocumentExportAndPersistenceTests.cs deleted file mode 100644 index 4f32b2a..0000000 --- a/tests/PdfEditorApp.Tests/DocumentExportAndPersistenceTests.cs +++ /dev/null @@ -1,283 +0,0 @@ -using System; -using System.IO; -using System.Text; -using System.Threading.Tasks; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; -using PdfEditorApp.Models; -using PdfEditorApp.Services; -using Xunit; - -namespace PdfEditorApp.Tests; - -public class DocumentExportAndPersistenceTests -{ - [Fact] - public async Task PdfExportService_GeneratesValidPdfBytes_WithElements() - { - // Arrange - var exportService = new PdfExportService(); - var doc = new PdfDocumentModel - { - Title = "Export Test Document", - Author = "FryPDF Test Suite" - }; - - var page = new PdfPageModel - { - Width = 595.28, - Height = 841.89, - PageNumber = 1, - BackgroundColorHex = "#FFFFFF" - }; - - page.Elements.Add(new PdfTextElement - { - X = 50, - Y = 50, - Width = 300, - Height = 40, - Text = "Executive Summary", - FontSize = 22, - IsBold = true, - TextColorHex = "#0F172A" - }); - - page.Elements.Add(new PdfShapeElement - { - X = 50, - Y = 100, - Width = 495, - Height = 2, - ShapeType = ShapeType.Line, - StrokeColorHex = "#0F6CBD", - StrokeThickness = 2 - }); - - page.Elements.Add(new PdfQrCodeElement - { - X = 50, - Y = 120, - Width = 100, - Height = 100, - Content = "https://github.com/PrashantUnity/PDFCreator", - Label = "Scan to Verify" - }); - - page.Elements.Add(new PdfBarcodeElement - { - X = 180, - Y = 120, - Width = 200, - Height = 60, - CodeValue = "FRY-2026-X99", - ShowText = true - }); - - page.Elements.Add(new PdfTableElement - { - X = 50, - Y = 240, - Width = 495, - Height = 120, - Headers = new() { "Item", "Category", "Amount ($)" }, - Rows = new() - { - new() { "Cloud Architecture", "Engineering", "12,500.00" }, - new() { "Security Preflight", "Audit", "4,200.00" } - } - }); - - doc.Pages.Add(page); - - // Act - File export - string tempPdf = Path.Combine(Path.GetTempPath(), $"FryPDF_Export_{Guid.NewGuid():N}.pdf"); - try - { - await exportService.ExportToFileAsync(doc, tempPdf); - - // Assert - Assert.True(File.Exists(tempPdf)); - byte[] pdfBytes = await File.ReadAllBytesAsync(tempPdf); - Assert.True(pdfBytes.Length > 100); - - // PDF files must begin with '%PDF-' - string header = Encoding.ASCII.GetString(pdfBytes.AsSpan(0, 5)); - Assert.Equal("%PDF-", header); - } - finally - { - if (File.Exists(tempPdf)) File.Delete(tempPdf); - } - } - - [Fact] - public async Task ProjectPersistenceService_AtomicSaveAndLoad_RoundTripsSuccessfully() - { - // Arrange - var persistenceService = new ProjectPersistenceService(); - string tempFile = Path.Combine(Path.GetTempPath(), $"FryPDF_Test_{Guid.NewGuid():N}.frypdf"); - - try - { - var doc = new PdfDocumentModel - { - Title = "Roundtrip Test", - Author = "Principal Architect", - Subject = "Architecture Review" - }; - - var page = new PdfPageModel { Width = 612, Height = 792, PageNumber = 1 }; - page.Elements.Add(new PdfTextElement { Text = "Test Note", X = 20, Y = 30, Width = 150, Height = 40 }); - page.Elements.Add(new PdfQrCodeElement { Content = "https://codefrydev.in", X = 100, Y = 100, Width = 80, Height = 80 }); - doc.Pages.Add(page); - - // Act - Save - await persistenceService.SaveProjectAsync(doc, tempFile); - - // Assert file exists and temp file was cleaned up - Assert.True(File.Exists(tempFile)); - Assert.False(File.Exists(tempFile + ".tmp")); - - // Act - Load - var loaded = await persistenceService.LoadProjectAsync(tempFile); - - // Assert loaded model matches - Assert.NotNull(loaded); - Assert.Equal("Roundtrip Test", loaded.Title); - Assert.Equal("Principal Architect", loaded.Author); - Assert.Single(loaded.Pages); - Assert.Equal(2, loaded.Pages[0].Elements.Count); - Assert.IsType(loaded.Pages[0].Elements[0]); - Assert.IsType(loaded.Pages[0].Elements[1]); - } - finally - { - if (File.Exists(tempFile)) File.Delete(tempFile); - if (File.Exists(tempFile + ".tmp")) File.Delete(tempFile + ".tmp"); - } - } - - [Fact] - public void UndoRedoService_CapsHistoryAt100_AndEvictsOldest() - { - // Arrange - var undoRedo = new UndoRedoService(); - int counter = 0; - - // Act - push 120 actions - for (int i = 1; i <= 120; i++) - { - int val = i; - undoRedo.RecordAction($"Action {val}", () => { counter -= val; }, () => { counter += val; }); - } - - // Assert - NextUndoDescription is Action 120 - Assert.True(undoRedo.CanUndo); - Assert.Equal("Action 120", undoRedo.NextUndoDescription); - - // Perform undo operations until stack is exhausted - int undoCount = 0; - while (undoRedo.CanUndo) - { - undoRedo.Undo(); - undoCount++; - } - - // Must have capped at exactly 100 operations - Assert.Equal(100, undoCount); - Assert.False(undoRedo.CanUndo); - Assert.True(undoRedo.CanRedo); - } - - [Fact] - public async Task PdfExportService_PermanentRedaction_SanitizesCoveredText() - { - // Arrange - var exportService = new PdfExportService(); - var doc = new PdfDocumentModel { Title = "Classified Report" }; - var page = new PdfPageModel { Width = 600, Height = 800, PageNumber = 1 }; - - // Confidential text at (100, 100, 200, 30) - var secretText = new PdfTextElement - { - Text = "TOP SECRET SSN 000-11-2222", - X = 100, - Y = 100, - Width = 200, - Height = 30 - }; - - // Redaction box completely covering the secret text: (90, 90, 220, 50) - var redaction = new PdfRedactionElement - { - X = 90, - Y = 90, - Width = 220, - Height = 50, - ExemptionCode = "(b)(6)" - }; - - // Non-redacted text at (100, 300, 200, 30) - var publicText = new PdfTextElement - { - Text = "Public Notice Section", - X = 100, - Y = 300, - Width = 200, - Height = 30 - }; - - page.Elements.Add(secretText); - page.Elements.Add(redaction); - page.Elements.Add(publicText); - doc.Pages.Add(page); - - // Act - byte[] pdfBytes = await exportService.ExportToBytesAsync(doc); - - // Assert - PDF generated successfully - Assert.NotNull(pdfBytes); - Assert.True(pdfBytes.Length > 100); - string header = Encoding.ASCII.GetString(pdfBytes.AsSpan(0, 5)); - Assert.Equal("%PDF-", header); - } - - [Fact] - public async Task ProjectPersistenceService_AutoSaveAndRecovery_SavesAndCleans() - { - // Arrange - var persistenceService = new ProjectPersistenceService(); - string tempProjectFile = Path.Combine(Path.GetTempPath(), $"FryPDF_AutoSave_Test_{Guid.NewGuid():N}.frypdf"); - - try - { - var doc = new PdfDocumentModel { Title = "Unsaved Work in Progress", Author = "UX Specialist" }; - var page = new PdfPageModel { PageNumber = 1 }; - page.Elements.Add(new PdfTextElement { Text = "Crucial Unshelved Notes", X = 10, Y = 20 }); - doc.Pages.Add(page); - - // Act - AutoSave - await persistenceService.SaveAutoSaveAsync(doc, tempProjectFile); - - // Assert - Recoverable - bool hasAutoSave = persistenceService.HasRecoverableAutoSave(tempProjectFile, out string autoSavePath); - Assert.True(hasAutoSave); - Assert.True(File.Exists(autoSavePath)); - - // Load autosave - var recovered = await persistenceService.LoadAutoSaveAsync(autoSavePath); - Assert.NotNull(recovered); - Assert.Equal("Unsaved Work in Progress", recovered.Title); - - // Act - Clean - persistenceService.CleanAutoSave(tempProjectFile); - Assert.False(File.Exists(autoSavePath)); - } - finally - { - persistenceService.CleanAutoSave(tempProjectFile); - if (File.Exists(tempProjectFile)) File.Delete(tempProjectFile); - } - } -} diff --git a/tests/PdfEditorApp.Tests/DocumentFileOperationsTests.cs b/tests/PdfEditorApp.Tests/DocumentFileOperationsTests.cs deleted file mode 100644 index bf99685..0000000 --- a/tests/PdfEditorApp.Tests/DocumentFileOperationsTests.cs +++ /dev/null @@ -1,302 +0,0 @@ -using System; -using System.IO; -using System.Linq; -using PdfEditorApp.Models; -using PdfEditorApp.Services; -using PdfEditorApp.ViewModels; -using Xunit; - -namespace PdfEditorApp.Tests; - -public class DocumentFileOperationsTests : IDisposable -{ - private readonly string _tempTestDir; - - public DocumentFileOperationsTests() - { - _tempTestDir = Path.Combine(Path.GetTempPath(), "FryPdf_Test_" + Guid.NewGuid().ToString("N")); - Directory.CreateDirectory(_tempTestDir); - } - - public void Dispose() - { - try - { - if (Directory.Exists(_tempTestDir)) - { - Directory.Delete(_tempTestDir, recursive: true); - } - } - catch { } - } - - [Theory] - [InlineData("ValidName", true)] - [InlineData("Report_2026", true)] - [InlineData("Document-Final v2", true)] - [InlineData("", false)] - [InlineData(" ", false)] - [InlineData(".", false)] - [InlineData("..", false)] - [InlineData("Bad/Name", false)] - [InlineData("Bad\\Name", false)] - [InlineData("Bad:Name", false)] - [InlineData("Bad*Name", false)] - [InlineData("Bad?Name", false)] - [InlineData("Bad\"Name", false)] - [InlineData("BadName", false)] - [InlineData("Bad|Name", false)] - public void ValidateFileName_EvaluatesCorrectly(string candidate, bool expectedValid) - { - var isValid = FileOperationHelper.ValidateFileName(candidate, out var error); - Assert.Equal(expectedValid, isValid); - if (!expectedValid) - { - Assert.False(string.IsNullOrWhiteSpace(error)); - } - } - - [Fact] - public void RenameFile_RenamesExistingFileSuccessfully() - { - // Arrange - var originalPath = Path.Combine(_tempTestDir, "original_sample.pdf"); - File.WriteAllText(originalPath, "PDF content mock"); - - // Act - var success = FileOperationHelper.RenameFile(originalPath, "renamed_sample", out var newPath, out var error); - - // Assert - Assert.True(success); - Assert.Null(error); - Assert.NotNull(newPath); - Assert.False(File.Exists(originalPath)); - Assert.True(File.Exists(newPath)); - Assert.Equal("renamed_sample.pdf", Path.GetFileName(newPath)); - Assert.Equal("PDF content mock", File.ReadAllText(newPath)); - } - - [Fact] - public void RenameFile_PreservesOrAppendsExtension() - { - // Arrange - var originalPath = Path.Combine(_tempTestDir, "test_ext.frypdf"); - File.WriteAllText(originalPath, "Project mock"); - - // Act - user types "my_new_project.frypdf" explicitly - var success = FileOperationHelper.RenameFile(originalPath, "my_new_project.frypdf", out var newPath, out _); - - // Assert - Assert.True(success); - Assert.NotNull(newPath); - Assert.True(File.Exists(newPath)); - Assert.Equal("my_new_project.frypdf", Path.GetFileName(newPath)); - } - - [Fact] - public void RenameFile_FailsIfTargetAlreadyExists() - { - // Arrange - var fileA = Path.Combine(_tempTestDir, "file_alpha.pdf"); - var fileB = Path.Combine(_tempTestDir, "file_beta.pdf"); - File.WriteAllText(fileA, "Alpha"); - File.WriteAllText(fileB, "Beta"); - - // Act - var success = FileOperationHelper.RenameFile(fileA, "file_beta", out var newPath, out var error); - - // Assert - Assert.False(success); - Assert.NotNull(error); - Assert.Contains("already exists", error, StringComparison.OrdinalIgnoreCase); - Assert.True(File.Exists(fileA)); - Assert.True(File.Exists(fileB)); - } - - [Fact] - public void DuplicateFile_CreatesIndexedCopiesCorrectly() - { - // Arrange - var originalPath = Path.Combine(_tempTestDir, "quarterly_summary.pdf"); - File.WriteAllText(originalPath, "Quarterly data mock"); - - // Act 1: First copy - var success1 = FileOperationHelper.DuplicateFile(originalPath, out var copyPath1, out var error1); - - // Assert 1 - Assert.True(success1); - Assert.Null(error1); - Assert.NotNull(copyPath1); - Assert.True(File.Exists(copyPath1)); - Assert.Equal("quarterly_summary (Copy).pdf", Path.GetFileName(copyPath1)); - - // Act 2: Second copy of original - var success2 = FileOperationHelper.DuplicateFile(originalPath, out var copyPath2, out var error2); - - // Assert 2 - Assert.True(success2); - Assert.Null(error2); - Assert.NotNull(copyPath2); - Assert.True(File.Exists(copyPath2)); - Assert.Equal("quarterly_summary (Copy 2).pdf", Path.GetFileName(copyPath2)); - } - - [Fact] - public void DeleteFile_RemovesFileFromDiskSafely() - { - // Arrange - var filePath = Path.Combine(_tempTestDir, "file_to_delete.pdf"); - File.WriteAllText(filePath, "Mock content"); - Assert.True(File.Exists(filePath)); - - // Act - var success = FileOperationHelper.DeleteFile(filePath, out var error); - - // Assert - Assert.True(success); - Assert.Null(error); - Assert.False(File.Exists(filePath)); - - // Act 2: Deleting already non-existent file succeeds gracefully - var success2 = FileOperationHelper.DeleteFile(filePath, out var error2); - Assert.True(success2); - Assert.Null(error2); - } - - [Fact] - public void HomeViewModel_RenameDialogFlow_WorksEndToEnd() - { - // Arrange - var filePath = Path.Combine(_tempTestDir, "home_rename_sample.pdf"); - File.WriteAllText(filePath, "Home test content"); - - var recentItem = new RecentDocumentItem - { - FilePath = filePath, - Title = "home_rename_sample.pdf", - LastOpened = DateTime.UtcNow - }; - - var mockRecentService = new Mocks.MockRecentDocumentsService(); - mockRecentService.Add(recentItem); - - var vm = new HomeViewModel( - mockRecentService, - new TemplateService(), - new ProjectPersistenceService(), - new PdfEditorApp.Services.Tools.Core.PdfToolRegistry()); - vm.RefreshRecent(); - - string? renamedOld = null; - string? renamedNew = null; - vm.DocumentRenamed += (oldP, newP) => - { - renamedOld = oldP; - renamedNew = newP; - }; - - // Act 1: Prompt Rename - vm.PromptRenameCommand.Execute(filePath); - Assert.True(vm.IsRenameDialogOpen); - Assert.Equal("home_rename_sample", vm.RenameNewName); - Assert.Equal(".pdf", vm.RenameExtension); - Assert.Equal(filePath, vm.RenameTargetFilePath); - - // Act 2: Confirm Rename with new name - vm.RenameNewName = "home_renamed_final"; - vm.ConfirmRenameCommand.Execute(null); - - // Assert - Assert.False(vm.IsRenameDialogOpen); - Assert.NotNull(renamedOld); - Assert.NotNull(renamedNew); - Assert.Equal(filePath, renamedOld); - Assert.EndsWith("home_renamed_final.pdf", renamedNew); - Assert.False(File.Exists(filePath)); - Assert.True(File.Exists(renamedNew)); - - // Check RecentDocuments updated - var updatedItem = vm.RecentDocuments.FirstOrDefault(); - Assert.NotNull(updatedItem); - Assert.Equal(renamedNew, updatedItem.FilePath); - Assert.Equal("home_renamed_final.pdf", updatedItem.Title); - } - - [Fact] - public void HomeViewModel_DeleteDialogFlow_WorksEndToEnd() - { - // Arrange - var filePath = Path.Combine(_tempTestDir, "home_delete_sample.pdf"); - File.WriteAllText(filePath, "Home delete test"); - - var recentItem = new RecentDocumentItem - { - FilePath = filePath, - Title = "home_delete_sample.pdf", - LastOpened = DateTime.UtcNow - }; - - var mockRecentService = new Mocks.MockRecentDocumentsService(); - mockRecentService.Add(recentItem); - - var vm = new HomeViewModel( - mockRecentService, - new TemplateService(), - new ProjectPersistenceService(), - new PdfEditorApp.Services.Tools.Core.PdfToolRegistry()); - vm.RefreshRecent(); - - string? deletedPath = null; - vm.DocumentDeleted += p => deletedPath = p; - - // Act 1: Prompt Delete - vm.PromptDeleteCommand.Execute(filePath); - Assert.True(vm.IsDeleteConfirmDialogOpen); - Assert.Equal(filePath, vm.DeleteTargetFilePath); - Assert.Equal("home_delete_sample.pdf", vm.DeleteTargetFileName); - - // Act 2: Confirm Delete - vm.ConfirmDeleteCommand.Execute(null); - - // Assert - Assert.False(vm.IsDeleteConfirmDialogOpen); - Assert.Equal(filePath, deletedPath); - Assert.False(File.Exists(filePath)); - Assert.Empty(vm.RecentDocuments); - } - - [Fact] - public void HomeViewModel_DuplicateCommand_CreatesDuplicateAndUpdatesRecents() - { - // Arrange - var filePath = Path.Combine(_tempTestDir, "sample_to_dup.pdf"); - File.WriteAllText(filePath, "Duplicate test"); - - var recentItem = new RecentDocumentItem - { - FilePath = filePath, - Title = "sample_to_dup.pdf", - LastOpened = DateTime.UtcNow - }; - - var mockRecentService = new Mocks.MockRecentDocumentsService(); - mockRecentService.Add(recentItem); - - var vm = new HomeViewModel( - mockRecentService, - new TemplateService(), - new ProjectPersistenceService(), - new PdfEditorApp.Services.Tools.Core.PdfToolRegistry()); - vm.RefreshRecent(); - - // Act - vm.DuplicateDocumentCommand.Execute(filePath); - - // Assert - Assert.Equal(2, vm.RecentDocuments.Count); - var copyItem = vm.RecentDocuments.FirstOrDefault(x => x.Title.Contains("(Copy)")); - Assert.NotNull(copyItem); - Assert.True(File.Exists(copyItem.FilePath)); - } -} diff --git a/tests/PdfEditorApp.Tests/DocumentMetadataTests.cs b/tests/PdfEditorApp.Tests/DocumentMetadataTests.cs deleted file mode 100644 index 80e8c48..0000000 --- a/tests/PdfEditorApp.Tests/DocumentMetadataTests.cs +++ /dev/null @@ -1,165 +0,0 @@ -using System; -using System.IO; -using System.Linq; -using System.Threading.Tasks; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; -using PdfEditorApp.Models; -using PdfEditorApp.Services; -using PdfEditorApp.Services.Tools.Core; -using PdfEditorApp.Services.Tools.Organize; -using PdfEditorApp.ViewModels; -using QuestPDF.Fluent; -using UglyToad.PdfPig; -using Xunit; - -namespace PdfEditorApp.Tests; - -public class DocumentMetadataTests -{ - [Fact] - public void PdfDocumentModel_DefaultValues_AreFryPDFAndCodefrydevIn() - { - var model = new PdfDocumentModel(); - - Assert.Equal("FryPDF", model.Creator); - Assert.Equal("codefrydev.in", model.Producer); - - var clone = model.Clone(); - Assert.Equal("FryPDF", clone.Creator); - Assert.Equal("codefrydev.in", clone.Producer); - } - - [Fact] - public async Task PdfExportService_EmbedsFryPDFCreator_AndCodefrydevInProducer() - { - var exportService = new PdfExportService(); - var model = new PdfDocumentModel - { - Title = "Metadata_Verification_Doc.pdf", - Author = "Code Fry Dev Unit Test", - Subject = "PDF Metadata Producer and Creator Verification", - Keywords = "test, metadata, pdf", - Creator = "FryPDF", - Producer = "codefrydev.in" - }; - - var page = new PdfPageModel - { - PageNumber = 1, - Width = 595.28, - Height = 841.89 - }; - page.Elements.Add(new PdfTextElement - { - Text = "Testing Producer: codefrydev.in and Creator: FryPDF", - X = 50, - Y = 50, - Width = 400, - Height = 30 - }); - model.Pages.Add(page); - - byte[] pdfBytes = await exportService.ExportToBytesAsync(model); - Assert.NotNull(pdfBytes); - Assert.True(pdfBytes.Length > 0); - - using var pigDoc = UglyToad.PdfPig.PdfDocument.Open(pdfBytes); - Assert.NotNull(pigDoc.Information); - Assert.Equal("FryPDF", pigDoc.Information.Creator); - Assert.Equal("codefrydev.in", pigDoc.Information.Producer); - Assert.Equal("Metadata_Verification_Doc.pdf", pigDoc.Information.Title); - Assert.Equal("Code Fry Dev Unit Test", pigDoc.Information.Author); - } - - [Fact] - public async Task PdfViewerViewModel_MetadataInspection_ShowsCreatorFryPDFAndProducerCodefrydevIn() - { - var exportService = new PdfExportService(); - var model = new PdfDocumentModel - { - Title = "Annual_Report_2026.pdf", - Author = "ACME CORP.", - Subject = "Fiscal Year 2026 Annual Report" - }; - var page = new PdfPageModel { PageNumber = 1, Width = 800, Height = 1131 }; - page.Elements.Add(new PdfTextElement { Text = "Annual Report Overview", X = 50, Y = 50 }); - model.Pages.Add(page); - - byte[] pdfBytes = await exportService.ExportToBytesAsync(model); - - var viewerVm = new PdfViewerViewModel(); - await viewerVm.LoadDocumentBytesAsync(pdfBytes, "Annual_Report_2026.pdf"); - - var creatorItem = viewerVm.MetadataItems.FirstOrDefault(m => m.Label == "Creator Application"); - var producerItem = viewerVm.MetadataItems.FirstOrDefault(m => m.Label == "PDF Producer"); - - Assert.NotNull(creatorItem); - Assert.Equal("FryPDF", creatorItem.Value); - - Assert.NotNull(producerItem); - Assert.Equal("codefrydev.in", producerItem.Value); - } - - [Fact] - public void FryPdfDocument_GeneratesPdf_WithBrandedMetadata() - { - var doc = FryPdfDocument.Create(container => - { - container.Page(page => - { - page.Size(QuestPDF.Helpers.PageSizes.A4); - page.Content().Text("Branded PDF Document"); - }); - }, title: "Branded Document", author: "Code Fry Dev"); - - byte[] pdfBytes = doc.GeneratePdf(); - Assert.NotNull(pdfBytes); - - using var pigDoc = UglyToad.PdfPig.PdfDocument.Open(pdfBytes); - Assert.Equal("FryPDF", pigDoc.Information.Creator); - Assert.Equal("codefrydev.in", pigDoc.Information.Producer); - } - - [Fact] - public async Task PdfPageService_Merge_SetsFryPDFCreatorAndCodefrydevInProducer() - { - var exportService = new PdfExportService(); - var pageService = new PdfPageService(); - - string temp1 = Path.Combine(Path.GetTempPath(), $"merge1_{Guid.NewGuid():N}.pdf"); - string temp2 = Path.Combine(Path.GetTempPath(), $"merge2_{Guid.NewGuid():N}.pdf"); - string tempMerged = Path.Combine(Path.GetTempPath(), $"merged_{Guid.NewGuid():N}.pdf"); - - try - { - var doc1 = new PdfDocumentModel { Title = "Doc 1" }; - doc1.Pages.Add(new PdfPageModel { PageNumber = 1 }); - var doc2 = new PdfDocumentModel { Title = "Doc 2" }; - doc2.Pages.Add(new PdfPageModel { PageNumber = 1 }); - - await exportService.ExportToFileAsync(doc1, temp1); - await exportService.ExportToFileAsync(doc2, temp2); - - var options = new MergeToolOptions - { - InputFiles = new() { temp1, temp2 }, - OutputFilePath = tempMerged - }; - - var result = await pageService.MergePdfAsync(options); - Assert.True(result.Success); - Assert.True(File.Exists(tempMerged)); - - using var pigDoc = UglyToad.PdfPig.PdfDocument.Open(tempMerged); - Assert.Equal("FryPDF", pigDoc.Information.Creator); - Assert.Equal("codefrydev.in", pigDoc.Information.Producer); - } - finally - { - if (File.Exists(temp1)) File.Delete(temp1); - if (File.Exists(temp2)) File.Delete(temp2); - if (File.Exists(tempMerged)) File.Delete(tempMerged); - } - } -} diff --git a/tests/PdfEditorApp.Tests/DynamicToolRegistryTests.cs b/tests/PdfEditorApp.Tests/DynamicToolRegistryTests.cs deleted file mode 100644 index a5f5249..0000000 --- a/tests/PdfEditorApp.Tests/DynamicToolRegistryTests.cs +++ /dev/null @@ -1,150 +0,0 @@ -using System; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Extensions.DependencyInjection; -using PdfEditorApp.Core.Plugins; -using PdfEditorApp.Core.Plugins.Descriptors; -using PdfEditorApp.Models; -using PdfEditorApp.Services.Tools.Core; -using PdfEditorApp.ViewModels.Tools; -using PdfEditorApp.ViewModels.Tools.Core; -using Xunit; - -namespace PdfEditorApp.Tests; - -public class DynamicToolRegistryTests -{ - private class DummyCustomToolViewModel : PdfToolViewModelBase - { - public DummyCustomToolViewModel(PdfToolDefinition toolDef) : base(null!, toolDef) - { - } - - protected override Task ExecuteCoreAsync(IProgress progress, CancellationToken ct) - { - return Task.FromResult(new ToolExecutionResult { Success = true }); - } - } - - [Fact] - public void PdfToolRegistry_ExposesBuiltInToolsByDefault() - { - var registry = new PdfToolRegistry(); - var allTools = registry.GetAllTools(); - - Assert.NotEmpty(allTools); - Assert.Contains(allTools, t => t.Id == PdfToolId.MergePdf); - Assert.Contains(allTools, t => t.Id == PdfToolId.CompressPdf); - } - - [Fact] - public async Task PdfToolRegistry_MergesPluginToolsDynamically() - { - var context = new FryPluginContext(); - var host = new PluginHost(context); - var registry = new PdfToolRegistry(context); - - var initialCount = registry.GetAllTools().Count; - - // Register a dynamic tool plugin - var dynamicToolPlugin = new DynamicToolTestPlugin(); - host.RegisterPlugin(dynamicToolPlugin); - await host.StartAsync(); - - var toolsAfterMount = registry.GetAllTools(); - Assert.Equal(initialCount + 1, toolsAfterMount.Count); - - var retrievedByStringId = registry.GetTool("vendor.custom.stamp"); - Assert.NotNull(retrievedByStringId); - Assert.Equal("Custom Vector Stamp", retrievedByStringId.Name); - Assert.Equal("RubberStamp", retrievedByStringId.IconKind); - - // Teardown the plugin - await host.StopAsync(); - - var toolsAfterUnmount = registry.GetAllTools(); - Assert.Equal(initialCount, toolsAfterUnmount.Count); - Assert.Null(registry.GetTool("vendor.custom.stamp")); - } - - [Fact] - public async Task PdfToolRegistry_SeamlesslyUpgradesBuiltInToolsWhenPluginsMount() - { - var context = new FryPluginContext(); - var host = new PluginHost(context); - var registry = new PdfToolRegistry(context); - - var initialCount = registry.GetAllTools().Count; - var initialMerge = registry.GetTool(PdfToolId.MergePdf); - Assert.NotNull(initialMerge); - Assert.Equal("MergePdf", initialMerge.StringId); - Assert.Null(initialMerge.ViewModelFactory); - - // Mount the built-in Merge plugin - var mergePlugin = new PdfEditorApp.Plugins.Bundles.MergePdfToolPlugin(); - host.RegisterPlugin(mergePlugin); - await host.StartAsync(); - - // The tool count does NOT increase because it upgrades the built-in tool in place! - var toolsAfterMount = registry.GetAllTools(); - Assert.Equal(initialCount, toolsAfterMount.Count); - - var upgradedMerge = registry.GetTool(PdfToolId.MergePdf); - Assert.NotNull(upgradedMerge); - Assert.Equal("frypdf.tool.merge", upgradedMerge.StringId); - Assert.NotNull(upgradedMerge.ViewModelFactory); - - // Can also retrieve it by its new StringId - var byStringId = registry.GetTool("frypdf.tool.merge"); - Assert.NotNull(byStringId); - Assert.Equal(PdfToolId.MergePdf, byStringId.Id); - - await host.StopAsync(); - } - - [Fact] - public void PdfToolViewModelFactory_ExecutesPluginViewModelFactoryDelegate() - { - var services = new ServiceCollection(); - var sp = services.BuildServiceProvider(); - - var factory = new PdfToolViewModelFactory(null!, new PdfToolRegistry(), sp); - - var toolDef = new PdfToolDefinition - { - Id = PdfToolId.EditPdf, - StringId = "custom.plugin.tool", - Name = "Plugin Tool" - }; - toolDef.ViewModelFactory = _ => new DummyCustomToolViewModel(toolDef); - - var vm = factory.CreateToolViewModel(toolDef); - Assert.IsType(vm); - Assert.Equal("Plugin Tool", vm.Tool.Name); - } - - private class DynamicToolTestPlugin : IFryPlugin - { - public string Id => "plugin.dynamic.tool.test"; - public string Name => "Dynamic Tool Test Plugin"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => Array.Empty(); - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - ctx.RegisterTool(new PdfToolDescriptor - { - Id = "vendor.custom.stamp", - Name = "Custom Vector Stamp", - Description = "Apply custom vector stamps.", - Category = "OrganizeAndPage", - IconKind = "RubberStamp", - IconColorHex = "#9333EA", - CreateViewModel = sp => new DummyCustomToolViewModel(new PdfToolDefinition { StringId = "vendor.custom.stamp", Name = "Custom Vector Stamp" }) - }); - - return Task.CompletedTask; - } - } -} diff --git a/tests/PdfEditorApp.Tests/EducationAndCheatSheetTemplateTests.cs b/tests/PdfEditorApp.Tests/EducationAndCheatSheetTemplateTests.cs deleted file mode 100644 index c259ab1..0000000 --- a/tests/PdfEditorApp.Tests/EducationAndCheatSheetTemplateTests.cs +++ /dev/null @@ -1,239 +0,0 @@ -using System; -using System.Linq; -using System.Text; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; -using PdfEditorApp.Services; -using PdfEditorApp.Services.MathEngine; -using PdfEditorApp.ViewModels.ElementViewModels; -using QuestPDF.Fluent; -using Xunit; - -namespace PdfEditorApp.Tests; - -public class EducationAndCheatSheetTemplateTests -{ - private readonly ITemplateService _templateService = new TemplateService(); - private readonly IPdfExportService _exportService = new PdfExportService(); - - [Fact] - public void MathBODMASWorksheetTemplate_CreatesValidDocumentAndGeneratesPdf() - { - var doc = _templateService.CreateMathBODMASWorksheetTemplate(); - Assert.NotNull(doc); - Assert.Equal("Class_6_BODMAS_Worksheet.pdf", doc.Title); - Assert.Equal(3, doc.Pages.Count); - - var allElements = doc.Pages.SelectMany(p => p.Elements).ToList(); - Assert.True(allElements.Count >= 20); - - // Verify key structural components - Assert.Contains(allElements, e => e is PdfTextElement t && t.Text.Contains("BODMAS")); - Assert.Contains(allElements, e => e is PdfTextElement t && t.Text.Contains("Score")); - Assert.Contains(allElements, e => e is PdfMathElement m && m.Formula.Contains("Brackets")); - Assert.Contains(allElements, e => e is PdfTableElement tbl && tbl.Headers.Contains("Q#")); - - byte[] bytes = _exportService.GeneratePdfBytes(doc); - Assert.NotNull(bytes); - Assert.True(bytes.Length > 1000); - Assert.Equal("%PDF-", Encoding.ASCII.GetString(bytes, 0, 5)); - } - - [Fact] - public void BilingualExamPaperTemplate_CreatesValidDocumentAndGeneratesPdf() - { - var doc = _templateService.CreateBilingualExamPaperTemplate(); - Assert.NotNull(doc); - Assert.Equal("Simple_Interest_Bilingual_Exam_Paper.pdf", doc.Title); - Assert.Equal(2, doc.Pages.Count); - - var allElements = doc.Pages.SelectMany(p => p.Elements).ToList(); - Assert.True(allElements.Count >= 25); - - // Verify bilingual English + Hindi elements - Assert.Contains(allElements, e => e is PdfTextElement t && t.Text.Contains("Simple Interest")); - Assert.Contains(allElements, e => e is PdfTextElement t && t.Text.Contains("साधारण ब्याज")); - Assert.Contains(allElements, e => e is PdfMathElement m && m.Formula.Contains("SI =")); - Assert.Contains(allElements, e => e is PdfTableElement tbl && tbl.Headers.Contains("उत्तर")); - - byte[] bytes = _exportService.GeneratePdfBytes(doc); - Assert.NotNull(bytes); - Assert.True(bytes.Length > 1000); - Assert.Equal("%PDF-", Encoding.ASCII.GetString(bytes, 0, 5)); - } - - [Fact] - public void StatesOfMatterDiagramNotesTemplate_CreatesValidDocumentAndGeneratesPdf() - { - var doc = _templateService.CreateStatesOfMatterDiagramNotesTemplate(); - Assert.NotNull(doc); - Assert.Equal("States_of_Matter_Visual_Notes.pdf", doc.Title); - Assert.Equal(2, doc.Pages.Count); - - var allElements = doc.Pages.SelectMany(p => p.Elements).ToList(); - Assert.True(allElements.Count >= 20); - - // Verify SVG vector diagrams are present - var svgElements = allElements.OfType().ToList(); - Assert.True(svgElements.Count >= 2); - Assert.Contains(svgElements, s => s.PresetName == "Triangular Phase Cycle" && !string.IsNullOrEmpty(s.SvgSource)); - Assert.Contains(svgElements, s => s.PresetName == "Particle Arrangement" && !string.IsNullOrEmpty(s.SvgSource)); - - // Verify that SVG vector elements rasterize to high-DPI PNG bytes cleanly - foreach (var svgModel in svgElements) - { - var pngBytes = PdfEditorApp.Services.Tools.Core.PdfPageRenderer.RenderSvgToPngBytes(svgModel.SvgSource, svgModel.Width, svgModel.Height); - Assert.NotNull(pngBytes); - Assert.True(pngBytes.Length > 100); - // Verify PNG header magic bytes - Assert.Equal(0x89, pngBytes[0]); - Assert.Equal((byte)'P', pngBytes[1]); - Assert.Equal((byte)'N', pngBytes[2]); - Assert.Equal((byte)'G', pngBytes[3]); - - // Verify ViewModel loads properly - var svgVm = new SvgElementViewModel(); - svgVm.LoadFromModel(svgModel); - Assert.Equal(svgModel.Width, svgVm.Width); - Assert.Equal(svgModel.Height, svgVm.Height); - Assert.Equal(svgModel.PresetName, svgVm.PresetName); - Assert.False(string.IsNullOrEmpty(svgVm.SvgSource)); - } - - // Verify comparison table and explanatory notes - Assert.Contains(allElements, e => e is PdfTableElement tbl && tbl.Headers.Contains("Solid (ठोस)")); - Assert.Contains(allElements, e => e is PdfTextElement t && t.Text.Contains("Sublimation")); - - byte[] bytes = _exportService.GeneratePdfBytes(doc); - Assert.NotNull(bytes); - Assert.True(bytes.Length > 1000); - Assert.Equal("%PDF-", Encoding.ASCII.GetString(bytes, 0, 5)); - } - - [Fact] - public void QuadrilateralsGuideTemplate_CreatesValidDocumentAndGeneratesPdf() - { - var doc = _templateService.CreateQuadrilateralsGuideTemplate(); - Assert.NotNull(doc); - Assert.Equal("Types_of_Quadrilaterals_Guide.pdf", doc.Title); - Assert.Equal(2, doc.Pages.Count); - - var allElements = doc.Pages.SelectMany(p => p.Elements).ToList(); - Assert.True(allElements.Count >= 20); - - // Verify SVG quadrilateral diagram - var svg = allElements.OfType().FirstOrDefault(s => s.PresetName == "Quadrilaterals Geometry Diagram"); - Assert.NotNull(svg); - Assert.Contains(" e is PdfMathElement m && m.Formula.Contains("360")); - - // Verify quadrilateral property cards across both pages - Assert.Contains(allElements, e => e is PdfTextElement t && t.Text.Contains("Parallelogram")); - Assert.Contains(allElements, e => e is PdfTextElement t && t.Text.Contains("Trapezoid")); - - byte[] bytes = _exportService.GeneratePdfBytes(doc); - Assert.NotNull(bytes); - Assert.True(bytes.Length > 1000); - Assert.Equal("%PDF-", Encoding.ASCII.GetString(bytes, 0, 5)); - } - - [Fact] - public void FactorizationWorksheetTemplate_CreatesValidDocumentAndGeneratesPdf() - { - var doc = _templateService.CreateFactorizationWorksheetTemplate(); - Assert.NotNull(doc); - Assert.Equal("Factorization_150_Questions_Worksheet.pdf", doc.Title); - Assert.Equal(2, doc.Pages.Count); - - var allElements = doc.Pages.SelectMany(p => p.Elements).ToList(); - Assert.True(allElements.Count >= 20); - - // Verify 3-column algebra columns - var textElements = allElements.OfType().ToList(); - Assert.True(textElements.Count >= 6); - - // Verify algebraic identity formulas and solutions table - Assert.Contains(allElements, e => e is PdfMathElement m && m.Formula.Contains("a^2 - b^2")); - Assert.Contains(allElements, e => e is PdfTableElement tbl && tbl.Headers.Contains("Factorized Result")); - - byte[] bytes = _exportService.GeneratePdfBytes(doc); - Assert.NotNull(bytes); - Assert.True(bytes.Length > 1000); - Assert.Equal("%PDF-", Encoding.ASCII.GetString(bytes, 0, 5)); - } - - [Fact] - public void ArduinoCheatSheetTemplate_CreatesValidPosterDocumentAndGeneratesPdf() - { - var doc = _templateService.CreateArduinoCheatSheetTemplate(); - Assert.NotNull(doc); - Assert.Equal("Arduino_Developer_Reference_CheatSheet.pdf", doc.Title); - Assert.Single(doc.Pages); - - var page = doc.Pages[0]; - Assert.Equal(PageFormat.Poster, page.Format); - Assert.Equal(1600, page.Width); - Assert.Equal(1131, page.Height); - Assert.Equal(PageOrientation.Landscape, page.Orientation); - - // Verify multi-column cards, code snippets, pinout table - Assert.Contains(page.Elements, e => e is PdfTextElement t && t.Text.Contains("ARDUINO")); - Assert.Contains(page.Elements, e => e is PdfTableElement tbl && tbl.Headers.Contains("Port")); - Assert.Contains(page.Elements, e => e is PdfTextElement t && t.Text.Contains("setup()")); - Assert.Contains(page.Elements, e => e is PdfTextElement t && t.Text.Contains("attachInterrupt")); - - byte[] bytes = _exportService.GeneratePdfBytes(doc); - Assert.NotNull(bytes); - Assert.True(bytes.Length > 1000); - Assert.Equal("%PDF-", Encoding.ASCII.GetString(bytes, 0, 5)); - } - - [Fact] - public void MathPresetsLibrary_ContainsSchoolArithmeticAndGeometry() - { - var schoolArithmetic = MathPresetsLibrary.GetByCategory(MathCategory.SchoolArithmetic).ToList(); - Assert.NotEmpty(schoolArithmetic); - Assert.Contains(schoolArithmetic, p => p.Name.Contains("BODMAS")); - Assert.Contains(schoolArithmetic, p => p.Name.Contains("Simple Interest")); - Assert.Contains(schoolArithmetic, p => p.Name.Contains("Compound Interest")); - - var geometry = MathPresetsLibrary.GetByCategory(MathCategory.Geometry).ToList(); - Assert.NotEmpty(geometry); - Assert.Contains(geometry, p => p.Name.Contains("Parallelogram")); - Assert.Contains(geometry, p => p.Name.Contains("Rhombus")); - - var algebra = MathPresetsLibrary.GetByCategory(MathCategory.Algebra).ToList(); - Assert.Contains(algebra, p => p.Name.Contains("Square of Binomial")); - Assert.Contains(algebra, p => p.Name.Contains("Sum and Difference of Cubes")); - Assert.Contains(algebra, p => p.Name.Contains("Square Root of Complex Number")); - } - - [Fact] - public void SvgOrnamentLibrary_GeneratesCleanSvgDiagrams() - { - var phaseCycleSvg = SvgOrnamentLibrary.GetTriangularPhaseCycleSvg(); - Assert.NotEmpty(phaseCycleSvg); - Assert.Contains(" 500); - - // Verify PDF signature (%PDF-) - string header = System.Text.Encoding.ASCII.GetString(bytes.Take(5).ToArray()); - Assert.Equal("%PDF-", header); - } - } - finally - { - if (Directory.Exists(tempDir)) - { - Directory.Delete(tempDir, true); - } - } - } -} diff --git a/tests/PdfEditorApp.Tests/FontManagerTests.cs b/tests/PdfEditorApp.Tests/FontManagerTests.cs deleted file mode 100644 index 6ed44d8..0000000 --- a/tests/PdfEditorApp.Tests/FontManagerTests.cs +++ /dev/null @@ -1,167 +0,0 @@ -using PdfEditorApp.Core.Analysis; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Models; -using PdfEditorApp.Services; -using PdfEditorApp.ViewModels; -using Xunit; - -namespace PdfEditorApp.Tests; - -public class FontManagerTests -{ - private readonly FontPackageService _fontService = new(); - - [Fact] - public void FontCatalog_ContainsAllMajorWorldwideScriptPackages() - { - var packages = _fontService.GetAllPackages(); - - Assert.NotNull(packages); - Assert.True(packages.Count >= 10, "Catalog must contain at least 10 major language and font packs"); - - // Verify CJK - Assert.Contains(packages, p => p.Id == "zh-hans" && p.Category == FontPackageCategory.EastAsia); - Assert.Contains(packages, p => p.Id == "zh-hant" && p.Category == FontPackageCategory.EastAsia); - Assert.Contains(packages, p => p.Id == "ja" && p.Category == FontPackageCategory.EastAsia); - Assert.Contains(packages, p => p.Id == "ko" && p.Category == FontPackageCategory.EastAsia); - - // Verify Indic, Middle East, SEA, Eurasia - Assert.Contains(packages, p => p.Id == "indic" && p.Category == FontPackageCategory.SouthAsia); - Assert.Contains(packages, p => p.Id == "arabic" && p.Category == FontPackageCategory.MiddleEast); - Assert.Contains(packages, p => p.Id == "hebrew" && p.Category == FontPackageCategory.MiddleEast); - Assert.Contains(packages, p => p.Id == "southeast-asia" && p.Category == FontPackageCategory.SoutheastAsia); - Assert.Contains(packages, p => p.Id == "eurasia" && p.Category == FontPackageCategory.EuropeAndEurasia); - Assert.Contains(packages, p => p.Id == "creative-design" && p.Category == FontPackageCategory.DesignAndTypography); - } - - [Fact] - public void FontCatalog_AllFilesUseGitHubCdnUrlPattern() - { - var packages = _fontService.GetAllPackages(); - Assert.NotEmpty(packages); - - foreach (var pkg in packages) - { - Assert.NotEmpty(pkg.Files); - foreach (var file in pkg.Files) - { - Assert.False(string.IsNullOrWhiteSpace(file.FileName)); - Assert.StartsWith(FontPackageService.FontCdnBaseUrl, file.DownloadUrl); - Assert.EndsWith(file.FileName, file.DownloadUrl); - Assert.True(file.FileSizeBytes > 0, $"File size for {file.FileName} must be positive"); - } - } - } - - [Fact] - public async System.Threading.Tasks.Task DownloadPackageAsync_DownloadsAndInstallsFromGitHubSuccessfully() - { - var packages = _fontService.GetAllPackages(); - var hebrewPack = packages.First(p => p.Id == "hebrew"); - - // Clean any existing files first - await _fontService.DeletePackageAsync(hebrewPack); - - var progressReported = false; - var progress = new Progress(p => { if (p > 0) progressReported = true; }); - - var success = await _fontService.DownloadPackageAsync(hebrewPack, progress); - - Assert.True(success, "Hebrew font package should download successfully from GitHub repository"); - Assert.True(progressReported, "Progress should be reported during download"); - Assert.True(_fontService.IsPackageInstalled(hebrewPack), "Package should be marked as installed"); - - // Cleanup after test - await _fontService.DeletePackageAsync(hebrewPack); - } - - [Fact] - public void FontPackageInfo_FormatBytes_ReturnsHumanReadableSize() - { - Assert.Equal("0 KB", FontPackageInfo.FormatBytes(0)); - Assert.Equal("500.0 KB", FontPackageInfo.FormatBytes(500 * 1024)); - Assert.Equal("15.0 MB", FontPackageInfo.FormatBytes((long)(15.0 * 1024 * 1024))); - } - - [Theory] - [InlineData("你好世界,欢迎使用 FryPDF", "zh-hans")] // Simplified Chinese - [InlineData("こんにちは世界、PDFエディタへようこそ", "ja")] // Japanese (Hiragana/Katakana) - [InlineData("안녕하세요 세계, PDF 편집기", "ko")] // Korean Hangul - [InlineData("भारत का सबसे सुरक्षित PDF संपादक", "indic")] // Hindi Devanagari - [InlineData("مرحبا بالعالم محرر بي دي اف", "arabic")] // Arabic RTL - public void DetectMissingPackageForText_IdentifiesCorrectScriptPackage(string sampleText, string expectedPackageId) - { - // When not installed, should identify the matching package - var detected = _fontService.DetectMissingPackageForText(sampleText); - if (detected != null) - { - Assert.Equal(expectedPackageId, detected.Id); - } - } - - [Fact] - public void UnicodeScriptDetector_ClassifiesVariousScriptsAccurately() - { - // Chinese - Assert.Equal("Noto Sans SC", UnicodeScriptDetector.DetectScriptFontFamily("中华人民共和国商务合同")); - - // Japanese - Assert.Equal("Noto Sans JP", UnicodeScriptDetector.DetectScriptFontFamily("ひらがな と カタカナ")); - - // Korean - Assert.Equal("Noto Sans KR", UnicodeScriptDetector.DetectScriptFontFamily("대한민국 서울특별시")); - - // Devanagari (Hindi) - Assert.Equal("Noto Sans Devanagari", UnicodeScriptDetector.DetectScriptFontFamily("नमस्ते भारतवर्ष")); - - // Arabic - Assert.Equal("Noto Sans Arabic", UnicodeScriptDetector.DetectScriptFontFamily("المملكة العربية السعودية")); - - // Hebrew - Assert.Equal("Noto Sans Hebrew", UnicodeScriptDetector.DetectScriptFontFamily("שלום עולם ומסמכי")); - - // Thai - Assert.Equal("Noto Sans Thai", UnicodeScriptDetector.DetectScriptFontFamily("สวัสดีชาวโลกและเอกสาร")); - - // Greek - Assert.Equal("GFS Neohellenic", UnicodeScriptDetector.DetectScriptFontFamily("Ελληνική Δημοκρατία")); - - // English / Latin default - Assert.Equal("Open Sans", UnicodeScriptDetector.DetectScriptFontFamily("Standard English Business Invoice 2026")); - } - - [Fact] - public void FontManagerViewModel_FilterAndCategorySelection_FiltersCorrectly() - { - var vm = new FontManagerViewModel(_fontService); - - Assert.Equal(vm.TotalPackagesCount, vm.FilteredPackages.Count); - - // Filter by East Asia - vm.SelectCategory("EastAsia"); - Assert.All(vm.FilteredPackages, p => Assert.Equal(FontPackageCategory.EastAsia, p.Category)); - Assert.Equal(4, vm.FilteredPackages.Count); // zh-hans, zh-hant, ja, ko - - // Filter by Search Query - vm.SelectCategory("All"); - vm.SearchQuery = "hindi"; - Assert.Single(vm.FilteredPackages); - Assert.Equal("indic", vm.FilteredPackages[0].Id); - - // Clear filter - vm.SearchQuery = ""; - Assert.Equal(vm.TotalPackagesCount, vm.FilteredPackages.Count); - } - - [Fact] - public void HomeViewModel_NavigatesToFontPackagesSection() - { - var home = new HomeViewModel(); - - home.SelectNavSection("FontPackages"); - - Assert.Equal(HomeNavSection.FontPackages, home.SelectedNavSection); - Assert.True(home.IsFontPackagesSection); - Assert.NotNull(home.FontManager); - } -} diff --git a/tests/PdfEditorApp.Tests/FryPdfViewerTests.cs b/tests/PdfEditorApp.Tests/FryPdfViewerTests.cs deleted file mode 100644 index 74ca2a8..0000000 --- a/tests/PdfEditorApp.Tests/FryPdfViewerTests.cs +++ /dev/null @@ -1,546 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Threading.Tasks; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; -using PdfEditorApp.Services; -using PdfEditorApp.Templates; -using PdfEditorApp.ViewModels; -using PdfEditorApp.ViewModels.ElementViewModels; -using PdfEditorApp.ViewModels.FryPdfViewer; -using Xunit; - -namespace PdfEditorApp.Tests; - -public class FryPdfViewerTests -{ - private readonly ITemplateService _templateService = new TemplateService(); - - [Fact] - public void FryPdfViewer_LoadFromModel_InitializesPagesAndMetadata() - { - var doc = _templateService.CreateAnnualReportTemplate(); - var viewer = new FryPdfViewerViewModel(); - - viewer.LoadFromModel(doc, "AnnualReport2026.frypdf"); - - Assert.True(viewer.HasPages); - Assert.Equal(doc.Pages.Count, viewer.TotalPagesCount); - Assert.Equal(1, viewer.CurrentPageNumber); - Assert.Equal(0, viewer.CurrentPageIndex); - Assert.NotNull(viewer.CurrentPage); - Assert.Contains("AnnualReport2026", viewer.DocumentTitle); - } - - [Fact] - public void FryPdfViewer_PageNavigation_NextPreviousFirstLast() - { - var doc = _templateService.CreateAnnualReportTemplate(); - var viewer = new FryPdfViewerViewModel(); - viewer.LoadFromModel(doc); - - Assert.True(viewer.CanGoNextPage); - Assert.False(viewer.CanGoPreviousPage); - - // Next page - viewer.NextPageCommand.Execute(null); - Assert.Equal(2, viewer.CurrentPageNumber); - Assert.True(viewer.CanGoPreviousPage); - - // Last page - viewer.LastPageCommand.Execute(null); - Assert.Equal(viewer.TotalPagesCount, viewer.CurrentPageNumber); - Assert.False(viewer.CanGoNextPage); - - // Previous page - viewer.PreviousPageCommand.Execute(null); - Assert.Equal(viewer.TotalPagesCount - 1, viewer.CurrentPageNumber); - - // First page - viewer.FirstPageCommand.Execute(null); - Assert.Equal(1, viewer.CurrentPageNumber); - - // Direct jump - viewer.GoToPageCommand.Execute(2); - Assert.Equal(2, viewer.CurrentPageNumber); - } - - [Fact] - public void FryPdfViewer_ZoomControls_UpdatesZoomLevelCorrectly() - { - var viewer = new FryPdfViewerViewModel(); - - viewer.ZoomLevel = 1.0; - - viewer.ZoomInCommand.Execute(null); - Assert.True(viewer.ZoomLevel > 1.0); - - viewer.ZoomOutCommand.Execute(null); - viewer.ZoomOutCommand.Execute(null); - Assert.True(viewer.ZoomLevel < 1.0); - - viewer.ResetZoomCommand.Execute(null); - Assert.Equal(1.0, viewer.ZoomLevel); - - viewer.FitToWidthCommand.Execute(null); - Assert.Equal(1.25, viewer.ZoomLevel); - - viewer.FitToPageCommand.Execute(null); - Assert.Equal(0.85, viewer.ZoomLevel); - } - - [Fact] - public void InteractiveTable_Filtering_FiltersRowsAccurately() - { - var tableVm = new TableElementViewModel(); - tableVm.Headers.Clear(); - tableVm.Headers.Add(new TableHeaderItem("Service")); - tableVm.Headers.Add(new TableHeaderItem("Cost")); - - tableVm.Rows.Clear(); - tableVm.Rows.Add(new TableRowItem(new[] { "Cloud Architecture", "$6,000" })); - tableVm.Rows.Add(new TableRowItem(new[] { "Avalonia Desktop UI", "$8,400" })); - tableVm.Rows.Add(new TableRowItem(new[] { "QuestPDF Engine", "$4,000" })); - - var interactiveTable = new InteractiveTableViewModel(tableVm); - Assert.Equal(3, interactiveTable.TotalRowCount); - Assert.Equal(3, interactiveTable.FilteredRowCount); - - // Filter by "Avalonia" - interactiveTable.FilterQuery = "Avalonia"; - Assert.Equal(1, interactiveTable.FilteredRowCount); - Assert.Equal("Avalonia Desktop UI", interactiveTable.DisplayedRows[0].GetCell(0)); - - // Clear filter - interactiveTable.ClearFilterCommand.Execute(null); - Assert.Equal(3, interactiveTable.FilteredRowCount); - } - - [Fact] - public void InteractiveTable_Sorting_SortsAlphabeticallyAndNumerically() - { - var tableVm = new TableElementViewModel(); - tableVm.Headers.Clear(); - tableVm.Headers.Add(new TableHeaderItem("Task")); - tableVm.Headers.Add(new TableHeaderItem("Hours")); - - tableVm.Rows.Clear(); - tableVm.Rows.Add(new TableRowItem(new[] { "Zeppelin Design", "10" })); - tableVm.Rows.Add(new TableRowItem(new[] { "Alpha Review", "40" })); - tableVm.Rows.Add(new TableRowItem(new[] { "Beta Optimization", "20" })); - - var interactiveTable = new InteractiveTableViewModel(tableVm); - - // Sort column 0 ascending (Alpha, Beta, Zeppelin) - interactiveTable.SortByColumnCommand.Execute(0); - Assert.Equal("Alpha Review", interactiveTable.DisplayedRows[0].GetCell(0)); - Assert.Equal("Zeppelin Design", interactiveTable.DisplayedRows[2].GetCell(0)); - - // Sort column 0 descending (Zeppelin, Beta, Alpha) - interactiveTable.SortByColumnCommand.Execute(0); - Assert.Equal("Zeppelin Design", interactiveTable.DisplayedRows[0].GetCell(0)); - Assert.Equal("Alpha Review", interactiveTable.DisplayedRows[2].GetCell(0)); - } - - [Fact] - public void InteractiveTable_GenerateCsv_ExportsValidCsv() - { - var tableVm = new TableElementViewModel(); - tableVm.Headers.Clear(); - tableVm.Headers.Add(new TableHeaderItem("Item")); - tableVm.Headers.Add(new TableHeaderItem("Amount")); - - tableVm.Rows.Clear(); - tableVm.Rows.Add(new TableRowItem(new[] { "Consulting", "$100" })); - tableVm.Rows.Add(new TableRowItem(new[] { "Support", "$50" })); - - var interactiveTable = new InteractiveTableViewModel(tableVm); - string csv = interactiveTable.GenerateCsv(); - - Assert.Contains("Item,Amount", csv); - Assert.Contains("Consulting,$100", csv); - Assert.Contains("Support,$50", csv); - } - - [Fact] - public void InteractiveChart_PopulateAndAnimation_CalculatesValuesAndTooltips() - { - var chartVm = new ChartElementViewModel(); - chartVm.Title = "Sales Q1-Q4"; - chartVm.Bars.Clear(); - chartVm.Bars.Add(new ChartBarItem { Category = "Q1", Value = 10, ValueLabel = "$10M", ColorHex = "#0F6CBD" }); - chartVm.Bars.Add(new ChartBarItem { Category = "Q2", Value = 20, ValueLabel = "$20M", ColorHex = "#107C41" }); - chartVm.Bars.Add(new ChartBarItem { Category = "Q3", Value = 30, ValueLabel = "$30M", ColorHex = "#D83B01" }); - - var interactiveChart = new InteractiveChartViewModel(chartVm); - - Assert.Equal(3, interactiveChart.Items.Count); - Assert.Equal(60, interactiveChart.TotalSum); - Assert.Equal(30, interactiveChart.MaxItemValue); - - // Tooltip checks - var q2Item = interactiveChart.Items[1]; - Assert.Equal("Q2: $20M (33.3%)", q2Item.TooltipText); - - // Toggle data table view - Assert.False(interactiveChart.IsShowingDataTable); - interactiveChart.ToggleDataTableCommand.Execute(null); - Assert.True(interactiveChart.IsShowingDataTable); - } - - [Fact] - public void FryPdfViewer_Search_FindsTextAcrossPages() - { - var doc = new PdfDocumentModel { Title = "Searchable Presentation" }; - var page1 = new PdfPageModel { PageNumber = 1 }; - page1.Elements.Add(new PdfTextElement { Text = "First Chapter Introduction", X = 10, Y = 10, Width = 200, Height = 30 }); - var page2 = new PdfPageModel { PageNumber = 2 }; - page2.Elements.Add(new PdfTextElement { Text = "Second Chapter Financials", X = 10, Y = 10, Width = 200, Height = 30 }); - - doc.Pages.Add(page1); - doc.Pages.Add(page2); - - var viewer = new FryPdfViewerViewModel(); - viewer.LoadFromModel(doc); - - viewer.SearchQuery = "Financials"; - Assert.Single(viewer.SearchResults); - Assert.Equal(2, viewer.SearchResults[0].PageNumber); - } - - [Fact] - public void MainViewModel_OpenCurrentInInteractiveReader_TransitionsSeamlessly() - { - var mainVm = new MainViewModel(); - - // Initially on Home - Assert.True(mainVm.IsHomePageVisible); - Assert.False(mainVm.IsFryPdfViewerVisible); - - // Switch to Interactive Reader - mainVm.OpenCurrentInInteractiveReaderCommand.Execute(null); - - Assert.True(mainVm.IsFryPdfViewerVisible); - Assert.False(mainVm.IsEditorVisible); - Assert.False(mainVm.IsHomePageVisible); - Assert.Contains("Interactive Reader", mainVm.WindowTitle); - - // Return to Home - mainVm.NavigateToHomeCommand.Execute(null); - Assert.False(mainVm.IsFryPdfViewerVisible); - Assert.True(mainVm.IsHomePageVisible); - } - - [Fact] - public void PresentationMode_TogglesState() - { - var viewer = new FryPdfViewerViewModel(); - Assert.False(viewer.IsPresentationMode); - - viewer.TogglePresentationModeCommand.Execute(null); - Assert.True(viewer.IsPresentationMode); - - viewer.TogglePresentationModeCommand.Execute(null); - Assert.False(viewer.IsPresentationMode); - } - - [Fact] - public void FryPdfViewer_LoadsAllElements_IntoUnifiedElementsCollection() - { - var doc = _templateService.CreateAnnualReportTemplate(); - var viewer = new FryPdfViewerViewModel(); - viewer.LoadFromModel(doc); - - Assert.NotEmpty(viewer.Pages); - foreach (var page in viewer.Pages) - { - Assert.NotEmpty(page.Elements); - foreach (var el in page.Elements) - { - Assert.True(el.Width > 0, $"Element {el.DisplayName} should have positive width"); - Assert.True(el.Height > 0, $"Element {el.DisplayName} should have positive height"); - } - } - } - - [Fact] - public void InteractiveTable_InheritsFromElementViewModelBase_AndPreservesProperties() - { - var tableVm = new TableElementViewModel - { - X = 50, - Y = 120, - Width = 500, - Height = 300, - ZIndex = 500 - }; - tableVm.Headers.Add(new TableHeaderItem("Metric")); - tableVm.Rows.Add(new TableRowItem(new[] { "Revenue" })); - - var interactiveTable = new InteractiveTableViewModel(tableVm); - Assert.Equal(ElementKind.Table, interactiveTable.Kind); - Assert.Equal(50, interactiveTable.X); - Assert.Equal(120, interactiveTable.Y); - Assert.Equal(500, interactiveTable.Width); - Assert.Equal(300, interactiveTable.Height); - Assert.Equal(500, interactiveTable.ZIndex); - Assert.NotNull(interactiveTable.CopyToClipboardCommand); - } - - [Fact] - public void InteractiveChart_InheritsFromElementViewModelBase_AndPreservesProperties() - { - var chartVm = new ChartElementViewModel - { - X = 60, - Y = 200, - Width = 450, - Height = 250, - ZIndex = 400, - Title = "Quarterly Growth" - }; - chartVm.Bars.Add(new ChartBarItem { Category = "Q1", Value = 15, ValueLabel = "$15k" }); - - var interactiveChart = new InteractiveChartViewModel(chartVm); - Assert.Equal(ElementKind.Chart, interactiveChart.Kind); - Assert.Equal(60, interactiveChart.X); - Assert.Equal(200, interactiveChart.Y); - Assert.Equal(450, interactiveChart.Width); - Assert.Equal(250, interactiveChart.Height); - Assert.Equal(400, interactiveChart.ZIndex); - } - - [Fact] - public void InteractiveExecutiveBriefTemplate_CreatesLandscapeDocumentWithRichElements() - { - var doc = _templateService.CreateInteractiveExecutiveBriefTemplate(); - - Assert.NotNull(doc); - Assert.Equal(3, doc.Pages.Count); - Assert.Contains("QuantumScale", doc.Title); - - foreach (var page in doc.Pages) - { - Assert.Equal(PageOrientation.Landscape, page.Orientation); - Assert.Equal(1131, page.Width); - Assert.Equal(800, page.Height); - Assert.NotEmpty(page.Elements); - } - - // Page 1: Revenue Bar Chart, Donut Pillar Chart & Sticky Note - var page1 = doc.Pages[0]; - var page1Charts = page1.Elements.OfType().ToList(); - Assert.Equal(2, page1Charts.Count); - Assert.Contains(page1Charts, c => c.ChartType == ChartType.BarColumn); - Assert.Contains(page1Charts, c => c.ChartType == ChartType.DonutPie); - Assert.Contains(page1.Elements, e => e is PdfStickyNoteElement); - - // Page 2: Operational Data Table & Regional Capacity Horizontal Bar Chart - var page2 = doc.Pages[1]; - var table = page2.Elements.OfType().FirstOrDefault(); - Assert.NotNull(table); - Assert.Equal(7, table.Headers.Count); - Assert.Equal(7, table.Rows.Count); - var page2Chart = page2.Elements.OfType().FirstOrDefault(); - Assert.NotNull(page2Chart); - Assert.Equal(ChartType.HorizontalBar, page2Chart.ChartType); - - // Page 3: Compliance Checkboxes, Signatures, Redaction, Barcode, Area Chart, QR Code - var page3 = doc.Pages[2]; - var formFields = page3.Elements.OfType().ToList(); - Assert.True(formFields.Count >= 5); - Assert.Contains(formFields, f => f.FieldType == FormFieldType.Checkbox); - Assert.Contains(formFields, f => f.FieldType == FormFieldType.Signature); - Assert.Contains(page3.Elements, e => e is PdfRedactionElement); - Assert.Contains(page3.Elements, e => e is PdfBarcodeElement); - Assert.Contains(page3.Elements, e => e is PdfQrCodeElement); - var page3Chart = page3.Elements.OfType().FirstOrDefault(); - Assert.NotNull(page3Chart); - Assert.Equal(ChartType.Area, page3Chart.ChartType); - } - - [Fact] - public void FryPdfViewer_LoadsLandscapeInteractiveExecutiveDeck_AndOperatesInteractively() - { - var doc = _templateService.CreateInteractiveExecutiveBriefTemplate(); - var viewer = new FryPdfViewerViewModel(); - viewer.LoadFromModel(doc, "QuantumScale_Executive_Brief.frypdf"); - - Assert.Equal(3, viewer.TotalPagesCount); - Assert.NotNull(viewer.CurrentPage); - Assert.Equal(1131, viewer.CurrentPage.Width); - Assert.Equal(800, viewer.CurrentPage.Height); - - // Navigate to Page 2 (with interactive table) - viewer.GoToPageCommand.Execute(2); - Assert.Equal(2, viewer.CurrentPageNumber); - - var tableVm = viewer.CurrentPage.Elements.OfType().FirstOrDefault(); - Assert.NotNull(tableVm); - Assert.Equal(7, tableVm.TotalRowCount); - Assert.Equal(7, tableVm.FilteredRowCount); - - // Real-time table filter - tableVm.FilterQuery = "Agent"; - Assert.Equal(1, tableVm.FilteredRowCount); - Assert.Contains("Autonomous AI Agent", tableVm.DisplayedRows[0].GetCell(0)); - - // Clear filter - tableVm.ClearFilterCommand.Execute(null); - Assert.Equal(7, tableVm.FilteredRowCount); - - // Sort by FY26 ARR descending - tableVm.SortByColumnCommand.Execute(3); - - // CSV export - string csv = tableVm.GenerateCsv(); - Assert.Contains("Business Unit & Segment", csv); - Assert.Contains("Autonomous AI Agent Mesh", csv); - - // Check interactive horizontal bar chart on page 2 - var chartVm = viewer.CurrentPage.Elements.OfType().FirstOrDefault(); - Assert.NotNull(chartVm); - Assert.True(chartVm.IsHorizontalBar); - Assert.Equal(5, chartVm.Items.Count); - Assert.True(chartVm.TotalSum > 100); - } - - [Fact] - public void FryPdfViewer_SlideDeckNavigation_NextAndPreviousButtonsWorkAcrossAllSlides_AndWrapInPresentationMode() - { - var doc = _templateService.CreateInteractiveExecutiveBriefTemplate(); - var viewer = new FryPdfViewerViewModel(); - - // Before document is loaded, commands should not execute - Assert.False(viewer.CanGoNextPage); - Assert.False(viewer.CanGoPreviousPage); - Assert.False(viewer.NextPageCommand.CanExecute(null)); - Assert.False(viewer.PreviousPageCommand.CanExecute(null)); - - // Load document - viewer.LoadFromModel(doc, "QuantumScale_Executive_Brief.frypdf"); - - // Slide 1 of 3: Next is enabled, Previous is disabled - Assert.Equal(1, viewer.CurrentPageNumber); - Assert.True(viewer.CanGoNextPage); - Assert.False(viewer.CanGoPreviousPage); - Assert.True(viewer.NextPageCommand.CanExecute(null)); - Assert.False(viewer.PreviousPageCommand.CanExecute(null)); - - // Advance to Slide 2 - viewer.NextPageCommand.Execute(null); - Assert.Equal(2, viewer.CurrentPageNumber); - Assert.True(viewer.CanGoNextPage); - Assert.True(viewer.CanGoPreviousPage); - Assert.True(viewer.NextPageCommand.CanExecute(null)); - Assert.True(viewer.PreviousPageCommand.CanExecute(null)); - - // Advance to Slide 3 (Slide 3 of 3 - User's Reported Screen) - viewer.NextPageCommand.Execute(null); - Assert.Equal(3, viewer.CurrentPageNumber); - Assert.False(viewer.CanGoNextPage); - Assert.True(viewer.CanGoPreviousPage); - Assert.False(viewer.NextPageCommand.CanExecute(null)); - Assert.True(viewer.PreviousPageCommand.CanExecute(null)); - - // Left button (<) MUST successfully navigate back to Slide 2 - viewer.PreviousPageCommand.Execute(null); - Assert.Equal(2, viewer.CurrentPageNumber); - - // Left button (<) again back to Slide 1 - viewer.PreviousPageCommand.Execute(null); - Assert.Equal(1, viewer.CurrentPageNumber); - - // Test Presentation Mode: Seamless Wrap-Around - viewer.TogglePresentationModeCommand.Execute(null); - Assert.True(viewer.IsPresentationMode); - - // In presentation mode on Slide 1: Previous (<) loops around to Slide 3 - Assert.True(viewer.CanGoPreviousPage); - Assert.True(viewer.PreviousPageCommand.CanExecute(null)); - viewer.PreviousPageCommand.Execute(null); - Assert.Equal(3, viewer.CurrentPageNumber); - - // In presentation mode on Slide 3: Next (>) loops around to Slide 1 - Assert.True(viewer.CanGoNextPage); - Assert.True(viewer.NextPageCommand.CanExecute(null)); - viewer.NextPageCommand.Execute(null); - Assert.Equal(1, viewer.CurrentPageNumber); - } - - [Fact] - public void FryPdfViewer_PresentationMode_SuppressesDistractions_AndCalculatesFitToViewport() - { - var doc = _templateService.CreateInteractiveExecutiveBriefTemplate(); - var viewer = new FryPdfViewerViewModel(); - viewer.LoadFromModel(doc); - - // Standard reading mode state: sidebar visible, padding 36, borders enabled, headers visible - Assert.False(viewer.IsPresentationMode); - Assert.True(viewer.IsSidebarVisibleInView); - Assert.Equal("Transparent", viewer.ViewportBackgroundBrush); - Assert.Equal(new Avalonia.Thickness(36), viewer.ViewportPadding); - Assert.Equal(1.0, viewer.PageBorderThickness); - Assert.True(viewer.ShowHeaderFooterInView); - - // Enter presentation mode: everything suppressed, black background, zero padding, zero borders - viewer.TogglePresentationModeCommand.Execute(null); - Assert.True(viewer.IsPresentationMode); - Assert.False(viewer.IsSidebarVisibleInView); - Assert.Equal("#000000", viewer.ViewportBackgroundBrush); - Assert.Equal(new Avalonia.Thickness(0), viewer.ViewportPadding); - Assert.Equal(0.0, viewer.PageBorderThickness); - Assert.False(viewer.ShowHeaderFooterInView); - - // Test aspect-fit calculation (1131 x 800 slide in 1920 x 1080 display) - viewer.FitToViewport(1920, 1080); - double expectedFit = Math.Round(Math.Min(1920.0 / 1131.0, 1080.0 / 800.0), 3); - Assert.Equal(expectedFit, viewer.ZoomLevel); - - // Exit presentation mode: normal reading mode restored - viewer.TogglePresentationModeCommand.Execute(null); - Assert.False(viewer.IsPresentationMode); - Assert.True(viewer.IsSidebarVisibleInView); - Assert.Equal("Transparent", viewer.ViewportBackgroundBrush); - Assert.Equal(new Avalonia.Thickness(36), viewer.ViewportPadding); - Assert.Equal(1.0, viewer.PageBorderThickness); - Assert.True(viewer.ShowHeaderFooterInView); - } - - [Fact] - public void InteractiveChart_SupportsMultipleChartTypes_AndCenterSummary() - { - var chartVm = new ChartElementViewModel - { - Title = "ARR by Pillar", - ChartType = ChartType.DonutPie - }; - chartVm.Bars.Clear(); - chartVm.Bars.Add(new ChartBarItem { Category = "Mesh", Value = 50, ValueLabel = "$50M", ColorHex = "#4F46E5" }); - chartVm.Bars.Add(new ChartBarItem { Category = "Enclaves", Value = 50, ValueLabel = "$50M", ColorHex = "#0284C7" }); - - var interactiveDonut = new InteractiveChartViewModel(chartVm); - Assert.True(interactiveDonut.IsDonutPie); - Assert.False(interactiveDonut.IsBarColumn); - Assert.False(interactiveDonut.IsHorizontalBar); - Assert.Equal(100, interactiveDonut.TotalSum); - Assert.Equal("$100.0M", interactiveDonut.CenterSummaryValue); - Assert.Equal("Total ARR", interactiveDonut.CenterSummaryLabel); - - // Hover over second item - interactiveDonut.HoveredItem = interactiveDonut.Items[1]; - Assert.Equal("$50M", interactiveDonut.CenterSummaryValue); - Assert.Equal("Enclaves", interactiveDonut.CenterSummaryLabel); - - // Test Horizontal Bar - chartVm.ChartType = ChartType.HorizontalBar; - var interactiveHorizontal = new InteractiveChartViewModel(chartVm); - Assert.True(interactiveHorizontal.IsHorizontalBar); - Assert.False(interactiveHorizontal.IsDonutPie); - Assert.False(interactiveHorizontal.IsBarColumn); - Assert.True(interactiveHorizontal.Items[0].AnimatedWidthPx > 0); - Assert.Equal("50.0%", interactiveHorizontal.Items[0].ProgressPercentageString); - } -} diff --git a/tests/PdfEditorApp.Tests/GestureAndNavigationTests.cs b/tests/PdfEditorApp.Tests/GestureAndNavigationTests.cs deleted file mode 100644 index af5f961..0000000 --- a/tests/PdfEditorApp.Tests/GestureAndNavigationTests.cs +++ /dev/null @@ -1,274 +0,0 @@ -using System; -using Avalonia.Input; -using PdfEditorApp.Models; -using PdfEditorApp.Services; -using PdfEditorApp.Tests.Mocks; -using PdfEditorApp.ViewModels; -using Xunit; - -namespace PdfEditorApp.Tests; - -public class GestureAndNavigationTests -{ - [Fact] - public void TrackpadMagnifyGesture_ComputesProportionalScale() - { - double oldZoom = 1.0; - - // Positive delta (pinch out / zoom in by 10%) - double deltaPositive = 0.10; - double zoomIn = Math.Clamp(Math.Round(oldZoom * (1.0 + deltaPositive), 3), 0.1, 5.0); - Assert.Equal(1.10, zoomIn); - - // Negative delta (pinch in / zoom out by 10%) - double deltaNegative = -0.10; - double zoomOut = Math.Clamp(Math.Round(oldZoom * (1.0 + deltaNegative), 3), 0.1, 5.0); - Assert.Equal(0.90, zoomOut); - } - [Fact] - public void PinchZoomMath_PreventsExponentialExplosion_AndClampsProperly() - { - // Simulate pinch scaling logic: initial zoom is 1.0 (100%) - double startZoom = 1.0; - - // User pinches out by 25% (scale = 1.25) - double scale1 = 1.25; - double calculatedZoom1 = Math.Clamp(Math.Round(startZoom * scale1, 3), 0.1, 5.0); - Assert.Equal(1.25, calculatedZoom1); - - // Continuous pinch event 2 in the same gesture (scale = 1.50 relative to start) - double scale2 = 1.50; - double calculatedZoom2 = Math.Clamp(Math.Round(startZoom * scale2, 3), 0.1, 5.0); - Assert.Equal(1.50, calculatedZoom2); - - // Extreme pinch out clamped to max zoom (5.0 / 500%) - double scaleExtreme = 10.0; - double calculatedZoomMax = Math.Clamp(Math.Round(startZoom * scaleExtreme, 3), 0.1, 5.0); - Assert.Equal(5.0, calculatedZoomMax); - - // Extreme pinch in clamped to min zoom (0.1 / 10%) - double scaleMin = 0.01; - double calculatedZoomMin = Math.Clamp(Math.Round(startZoom * scaleMin, 3), 0.1, 5.0); - Assert.Equal(0.1, calculatedZoomMin); - } - - [Fact] - public void TrackpadContinuousZoomDelta_ComputesSmoothProportionalScaling() - { - double oldZoom = 1.0; - - // Small trackpad delta (e.g. 0.05) - double deltaY = 0.05; - double zoomDeltaFactor = Math.Pow(1.002, deltaY * 100); - double newZoom = Math.Clamp(Math.Round(oldZoom * zoomDeltaFactor, 3), 0.1, 5.0); - - // Should be approximately 1.01 (1% smooth increase) - Assert.True(newZoom > 1.0 && newZoom < 1.05); - - // Discrete mouse wheel tick (deltaY = 1.0) - double wheelFactor = 1.15; - double wheelZoom = Math.Clamp(Math.Round(oldZoom * wheelFactor, 3), 0.1, 5.0); - Assert.Equal(1.15, wheelZoom); - } - - [Fact] - public void MainViewModel_ZoomCommands_OperateWithinValidRanges() - { - var mainVm = new MainViewModel(); - mainVm.ZoomLevel = 1.0; - - // Zoom In - mainVm.ZoomIn(); - Assert.True(mainVm.ZoomLevel > 1.0); - - // Reset Zoom - mainVm.ResetZoom(); - Assert.Equal(1.0, mainVm.ZoomLevel); - - // Zoom Out - mainVm.ZoomOut(); - Assert.True(mainVm.ZoomLevel < 1.0); - } - - [Fact] - public void PdfViewerViewModel_ZoomAndJumpPageGestures_ValidateCorrectly() - { - var viewerVm = new PdfViewerViewModel(); - viewerVm.ZoomLevel = 1.0; - - // Zoom In - viewerVm.ZoomIn(); - Assert.Equal(1.25, viewerVm.ZoomLevel); - - // Zoom Out - viewerVm.ZoomOut(); - Assert.Equal(1.0, viewerVm.ZoomLevel); - - // Reset Zoom - viewerVm.ResetZoom(); - Assert.Equal(1.0, viewerVm.ZoomLevel); - - // Fit Presets - viewerVm.FitToWidth(); - Assert.Equal(1.35, viewerVm.ZoomLevel); - - viewerVm.FitToPage(); - Assert.Equal(0.95, viewerVm.ZoomLevel); - - // Percentage Presets - viewerVm.SetZoomPreset("200%"); - Assert.Equal(2.0, viewerVm.ZoomLevel); - - viewerVm.SetZoomPreset("50%"); - Assert.Equal(0.5, viewerVm.ZoomLevel); - } - - [Fact] - public void MainViewModel_WindowTitle_ReflectsActiveViewAndContextCorrectly() - { - CommunityToolkit.Mvvm.Messaging.WeakReferenceMessenger.Default.Reset(); - // 1. Initial State: App opens on Home Dashboard - var mainVm = new MainViewModel( - new PdfExportService(), - new TemplateService(), - new ProjectPersistenceService(), - recentService: new MockRecentDocumentsService()); - mainVm.NavigateToHome(); - Assert.True(mainVm.IsHomePageVisible); - Assert.False(mainVm.IsEditorVisible); - Assert.False(mainVm.IsPdfViewerVisible); - Assert.Equal("FryPDF - Privacy-First PDF Studio", mainVm.WindowTitle); - - // 2. Open a tool in Home page (e.g. Merge PDF) - mainVm.OpenTool(PdfToolId.MergePdf); - Assert.True(mainVm.IsHomePageVisible); - Assert.True(mainVm.Home.IsToolPageActive); - Assert.Contains("Merge", mainVm.WindowTitle); - Assert.EndsWith("FryPDF", mainVm.WindowTitle); - - // 3. Navigate to Licensing section - mainVm.Home.BackToTools(); - mainVm.Home.SelectNavSectionCommand.Execute("Licensing"); - Assert.Equal("Licenses & Third-Party Tools - FryPDF", mainVm.WindowTitle); - - // 4. Open an Editor template document - mainVm.OpenEditorWithTemplate("Invoice"); - Assert.False(mainVm.IsHomePageVisible); - Assert.True(mainVm.IsEditorVisible); - Assert.False(mainVm.IsPdfViewerVisible); - Assert.Contains("FryPDF", mainVm.WindowTitle); - - // 5. Navigate back to Home - mainVm.NavigateToHome(); - Assert.True(mainVm.IsHomePageVisible); - Assert.False(mainVm.IsEditorVisible); - Assert.Equal("FryPDF - Privacy-First PDF Studio", mainVm.WindowTitle); - - // 6. Open in PDF Viewer Mode - mainVm.PdfViewer.DocumentTitle = "Quarterly_Financials.pdf"; - mainVm.OpenInViewer("dummy/Quarterly_Financials.pdf"); - Assert.False(mainVm.IsHomePageVisible); - Assert.True(mainVm.IsPdfViewerVisible); - Assert.Equal("Quarterly_Financials.pdf - FryPDF", mainVm.WindowTitle); - } - - [Fact] - public async System.Threading.Tasks.Task HomeViewModel_NavigationBetweenStandardSections_MaintainsNullDynamicPageViewForInstantVisibility() - { - var navReg = new PdfEditorApp.Services.Navigation.NavigationRegistry(); - var context = new PdfEditorApp.Core.Plugins.FryPluginContext(); - context.RegisterService(navReg); - - var host = new PdfEditorApp.Core.Plugins.PluginHost(context); - var bundle = new PdfEditorApp.Plugins.Bundles.WorkspacePagesBundle(); - host.RegisterPlugins(bundle.Plugins); - await host.StartAsync(); - - var home = new HomeViewModel( - new RecentDocumentsService(), - new TemplateService(), - new ProjectPersistenceService(), - new PdfEditorApp.Services.Tools.Core.PdfToolRegistry(), - navigationRegistry: navReg); - - // Rapid navigation through all built-in sections must keep DynamicPageView null - // so that pre-mounted, pre-compiled visual trees in HomeView.axaml are used instantaneously - string[] sectionsToTest = new[] - { - "Home", "PdfReader", "NewDocument", "AllTools", "OrganizeAndPage", - "OptimizeAndSecurity", "ConvertFromPdf", "ConvertToPdf", "EditAndForms", - "AiAndAutomation", "Starred", "FontPackages", "TesseractData", - "Trash", "Help", "Licensing", "Settings", "Plugins" - }; - - foreach (var section in sectionsToTest) - { - home.SelectNavSectionCommand.Execute(section); - Assert.Null(home.DynamicPageView); - Assert.False(home.IsToolPageActive); - } - - await host.StopAsync(); - } - - [Fact] - public void HomeViewModel_NavigationCachesContributedPluginView_AndReusesInstance() - { - var navReg = new PdfEditorApp.Services.Navigation.NavigationRegistry(); - int factoryInvocationCount = 0; - navReg.RegisterNavigationItem(new PdfEditorApp.Core.Plugins.Descriptors.NavigationItemDescriptor - { - Id = "CustomAnalyticsExtension", - Title = "Analytics Extension", - Group = "Extensions", - ViewFactory = sp => - { - factoryInvocationCount++; - return new object(); - } - }); - - var home = new HomeViewModel( - new RecentDocumentsService(), - new TemplateService(), - new ProjectPersistenceService(), - new PdfEditorApp.Services.Tools.Core.PdfToolRegistry(), - navigationRegistry: navReg); - - // First navigation invokes factory and caches view - home.SelectNavSectionCommand.Execute("CustomAnalyticsExtension"); - Assert.Equal(1, factoryInvocationCount); - var firstView = home.DynamicPageView; - Assert.NotNull(firstView); - - // Navigate away to Home (standard section) - home.SelectNavSectionCommand.Execute("Home"); - Assert.Null(home.DynamicPageView); - - // Navigate back to extension: MUST reuse cached instance without re-invoking factory - home.SelectNavSectionCommand.Execute("CustomAnalyticsExtension"); - Assert.Equal(1, factoryInvocationCount); - Assert.Same(firstView, home.DynamicPageView); - } - - [Fact] - public void HomeViewModel_NavigationWhileToolActive_AutomaticallyClosesTool() - { - var home = new HomeViewModel( - new RecentDocumentsService(), - new TemplateService(), - new ProjectPersistenceService(), - new PdfEditorApp.Services.Tools.Core.PdfToolRegistry()); - - home.OpenToolPage(PdfToolId.MergePdf); - Assert.True(home.IsToolPageActive); - Assert.NotNull(home.ActiveToolCard); - - // Navigating to Settings must clean up the tool - home.SelectNavSectionCommand.Execute("Settings"); - Assert.False(home.IsToolPageActive); - Assert.Null(home.ActiveToolCard); - Assert.Null(home.ActiveToolViewModel); - Assert.True(home.IsSettingsSection); - } -} diff --git a/tests/PdfEditorApp.Tests/HeadlessCliRunnerTests.cs b/tests/PdfEditorApp.Tests/HeadlessCliRunnerTests.cs deleted file mode 100644 index 3109356..0000000 --- a/tests/PdfEditorApp.Tests/HeadlessCliRunnerTests.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System.Threading.Tasks; -using PdfEditorApp.Plugins.Cli; -using Xunit; - -namespace PdfEditorApp.Tests; - -public class HeadlessCliRunnerTests -{ - [Theory] - [InlineData("--help", true)] - [InlineData("-h", true)] - [InlineData("--version", true)] - [InlineData("-v", true)] - [InlineData("--tool", true)] - [InlineData("-t", true)] - [InlineData("--list-tools", true)] - [InlineData("--list-plugins", true)] - [InlineData("--profile", true)] - [InlineData("somefile.pdf", false)] - [InlineData("", false)] - public void IsCliInvocation_DetectsFlagsCorrectly(string flag, bool expected) - { - var args = string.IsNullOrEmpty(flag) ? System.Array.Empty() : new[] { flag }; - var actual = HeadlessCliRunner.IsCliInvocation(args); - Assert.Equal(expected, actual); - } - - [Fact] - public async Task RunCliAsync_HelpFlag_ReturnsZero() - { - var exitCode = await HeadlessCliRunner.RunCliAsync(new[] { "--help" }); - Assert.Equal(0, exitCode); - } - - [Fact] - public async Task RunCliAsync_VersionFlag_ReturnsZero() - { - var exitCode = await HeadlessCliRunner.RunCliAsync(new[] { "--version" }); - Assert.Equal(0, exitCode); - } -} diff --git a/tests/PdfEditorApp.Tests/HelpGuideTests.cs b/tests/PdfEditorApp.Tests/HelpGuideTests.cs deleted file mode 100644 index e808bac..0000000 --- a/tests/PdfEditorApp.Tests/HelpGuideTests.cs +++ /dev/null @@ -1,239 +0,0 @@ -using System; -using System.Linq; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Models; -using PdfEditorApp.Services; -using PdfEditorApp.ViewModels; -using Xunit; - -namespace PdfEditorApp.Tests; - -public class HelpGuideTests -{ - [Fact] - public void HelpGuideService_InitializesAllCoreCategoriesAndGuides() - { - // Arrange - var service = new HelpGuideService(); - - // Act - var guides = service.GetAllGuides(); - var categories = service.GetAllCategories(); - - // Assert - Assert.NotEmpty(guides); - Assert.True(guides.Count >= 20, $"Expected at least 20 guides, but found {guides.Count}"); - Assert.Contains("All Guides", categories); - Assert.Contains("Getting Started", categories); - Assert.Contains("32 PDF Tools", categories); - Assert.Contains("Live Editor", categories); - Assert.Contains("Automation", categories); - Assert.Contains("Language & Fonts", categories); - Assert.Contains("Shortcuts", categories); - Assert.Contains("FAQ & Support", categories); - - // Verify each guide has non-empty required fields - foreach (var guide in guides) - { - Assert.False(string.IsNullOrWhiteSpace(guide.Id), "Guide Id must not be empty"); - Assert.False(string.IsNullOrWhiteSpace(guide.Title), $"Title for {guide.Id} must not be empty"); - Assert.False(string.IsNullOrWhiteSpace(guide.Category), $"Category for {guide.Id} must not be empty"); - Assert.False(string.IsNullOrWhiteSpace(guide.Summary), $"Summary for {guide.Id} must not be empty"); - Assert.False(string.IsNullOrWhiteSpace(guide.Description), $"Description for {guide.Id} must not be empty"); - Assert.False(string.IsNullOrWhiteSpace(guide.IconKind), $"IconKind for {guide.Id} must not be empty"); - Assert.False(string.IsNullOrWhiteSpace(guide.IconColorHex), $"IconColorHex for {guide.Id} must not be empty"); - Assert.False(string.IsNullOrWhiteSpace(guide.BackgroundAccentHex), $"BackgroundAccentHex for {guide.Id} must not be empty"); - Assert.False(string.IsNullOrWhiteSpace(guide.Badge), $"Badge for {guide.Id} must not be empty"); - Assert.NotEmpty(guide.Steps); - } - } - - [Theory] - [InlineData("Getting Started")] - [InlineData("32 PDF Tools")] - [InlineData("Live Editor")] - [InlineData("Automation")] - [InlineData("Language & Fonts")] - [InlineData("Shortcuts")] - [InlineData("FAQ & Support")] - public void HelpGuideService_GetGuidesByCategory_ReturnsMatchingGuides(string category) - { - // Arrange - var service = new HelpGuideService(); - - // Act - var filtered = service.GetGuidesByCategory(category); - - // Assert - Assert.NotEmpty(filtered); - Assert.All(filtered, g => Assert.Equal(category, g.Category, ignoreCase: true)); - } - - [Fact] - public void HelpGuideService_GetGuideById_FindsSpecificTopics() - { - // Arrange - var service = new HelpGuideService(); - - // Act & Assert - var mergeGuide = service.GetGuideById("tool-merge"); - Assert.NotNull(mergeGuide); - Assert.Equal("Merge PDF Files", mergeGuide.Title); - Assert.Equal(PdfToolId.MergePdf, mergeGuide.RelatedToolId); - - var ocrGuide = service.GetGuideById("tool-ocr-pdf"); - Assert.NotNull(ocrGuide); - Assert.Equal("OCR Text Recognition", ocrGuide.Title); - Assert.Equal(PdfToolId.OcrPdf, ocrGuide.RelatedToolId); - - var mathGuide = service.GetGuideById("editor-math-latex"); - Assert.NotNull(mathGuide); - Assert.Equal("LaTeX Math Equation Studio", mathGuide.Title); - - var richTextGuide = service.GetGuideById("editor-rich-text"); - Assert.NotNull(richTextGuide); - Assert.Equal("Rich Text & Inline Markdown Formatting", richTextGuide.Title); - Assert.Equal("Live Editor", richTextGuide.Category); - Assert.True(richTextGuide.IsFeatured); - Assert.Contains("markdown", richTextGuide.Keywords, StringComparison.OrdinalIgnoreCase); - } - - [Fact] - public void HelpGuideService_GetGuideByToolId_FindsAssociatedToolGuides() - { - // Arrange - var service = new HelpGuideService(); - - // Act & Assert - var compress = service.GetGuideByToolId(PdfToolId.CompressPdf); - Assert.NotNull(compress); - Assert.Equal("Compress & Optimize PDF", compress.Title); - - var sign = service.GetGuideByToolId(PdfToolId.SignPdf); - Assert.NotNull(sign); - Assert.Equal("Digital Signature Studio", sign.Title); - - var protect = service.GetGuideByToolId(PdfToolId.ProtectPdf); - Assert.NotNull(protect); - Assert.Equal("Protect PDF (AES-256 Encryption)", protect.Title); - } - - [Fact] - public void HelpGuideViewModel_SearchQuery_FiltersGuidesAcrossKeywords() - { - // Arrange - var vm = new HelpGuideViewModel(); - - // Act 1: Search "merge" - vm.SearchQuery = "merge"; - Assert.True(vm.FilteredGuides.Count > 0); - Assert.Contains(vm.FilteredGuides, g => g.Title.Contains("Merge", StringComparison.OrdinalIgnoreCase) || g.Keywords.Contains("merge", StringComparison.OrdinalIgnoreCase)); - - // Act 2: Search "latex" - vm.SearchQuery = "latex"; - Assert.True(vm.FilteredGuides.Count > 0); - Assert.Contains(vm.FilteredGuides, g => g.Id == "editor-math-latex"); - - // Act 3: Search "ocr" - vm.SearchQuery = "ocr"; - Assert.True(vm.FilteredGuides.Count > 0); - Assert.Contains(vm.FilteredGuides, g => g.Id == "tool-ocr-pdf"); - - // Act 4: Non-existent term - vm.SearchQuery = "xyznonexistentquery12345"; - Assert.Empty(vm.FilteredGuides); - Assert.True(vm.HasNoMatchingGuides); - - // Act 5: Clear search - vm.ClearSearchCommand.Execute(null); - Assert.Empty(vm.SearchQuery); - Assert.False(vm.HasNoMatchingGuides); - Assert.Equal(vm.AllGuides.Count, vm.FilteredGuides.Count); - } - - [Fact] - public void HelpGuideViewModel_CategorySelection_UpdatesFilteredList() - { - // Arrange - var vm = new HelpGuideViewModel(); - - // Act - vm.SetCategoryCommand.Execute("Live Editor"); - - // Assert - Assert.Equal("Live Editor", vm.SelectedCategory); - Assert.NotEmpty(vm.FilteredGuides); - Assert.All(vm.FilteredGuides, g => Assert.Equal("Live Editor", g.Category)); - Assert.False(vm.IsDetailViewActive); - Assert.Null(vm.SelectedGuide); - } - - [Fact] - public void HelpGuideViewModel_SelectGuideAndBackToGrid_TogglesDetailView() - { - // Arrange - var vm = new HelpGuideViewModel(); - var targetGuide = vm.AllGuides.First(); - - // Act 1: Select guide - vm.SelectGuideCommand.Execute(targetGuide); - Assert.True(vm.IsDetailViewActive); - Assert.Equal(targetGuide, vm.SelectedGuide); - - // Act 2: Back to grid - vm.BackToGridCommand.Execute(null); - Assert.False(vm.IsDetailViewActive); - Assert.Null(vm.SelectedGuide); - } - - [Fact] - public void HelpGuideViewModel_LaunchTool_FiresToolLaunchRequestedEvent() - { - // Arrange - var vm = new HelpGuideViewModel(); - var mergeGuide = vm.AllGuides.FirstOrDefault(g => g.RelatedToolId == PdfToolId.MergePdf); - Assert.NotNull(mergeGuide); - - PdfToolId? launchedToolId = null; - vm.ToolLaunchRequested += (id) => launchedToolId = id; - - // Act - vm.LaunchToolCommand.Execute(mergeGuide); - - // Assert - Assert.Equal(PdfToolId.MergePdf, launchedToolId); - } - - [Fact] - public void HomeViewModel_HelpSection_NavigationAndIntegration() - { - // Arrange - var home = new HomeViewModel(); - - // Act 1: Select Help section - home.SelectNavSectionCommand.Execute("Help"); - - // Assert 1 - Assert.Equal(HomeNavSection.Help, home.SelectedNavSection); - Assert.True(home.IsHelpSection); - Assert.NotNull(home.HelpGuide); - - // Act 2: Open specific help topic - home.OpenHelpGuideCommand.Execute("tool-compress"); - - // Assert 2 - Assert.Equal(HomeNavSection.Help, home.SelectedNavSection); - Assert.True(home.HelpGuide.IsDetailViewActive); - Assert.NotNull(home.HelpGuide.SelectedGuide); - Assert.Equal("tool-compress", home.HelpGuide.SelectedGuide.Id); - - // Act 3: Open help for specific tool - home.OpenHelpForToolCommand.Execute(PdfToolId.SignPdf); - - // Assert 3 - Assert.Equal(HomeNavSection.Help, home.SelectedNavSection); - Assert.True(home.HelpGuide.IsDetailViewActive); - Assert.NotNull(home.HelpGuide.SelectedGuide); - Assert.Equal(PdfToolId.SignPdf, home.HelpGuide.SelectedGuide.RelatedToolId); - } -} diff --git a/tests/PdfEditorApp.Tests/HomeViewModelTests.cs b/tests/PdfEditorApp.Tests/HomeViewModelTests.cs deleted file mode 100644 index a087813..0000000 --- a/tests/PdfEditorApp.Tests/HomeViewModelTests.cs +++ /dev/null @@ -1,237 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Threading.Tasks; -using PdfEditorApp.Models; -using PdfEditorApp.Services; -using PdfEditorApp.Services.Tools.Core; -using PdfEditorApp.ViewModels; -using Xunit; - -namespace PdfEditorApp.Tests; - -public class HomeViewModelTests -{ - private class MockRecentService : IRecentDocumentsService - { - public List Items { get; } = new(); - - public List Load() => new(Items); - public void Add(RecentDocumentItem item) => Items.Insert(0, item); - public void Remove(string filePath) => Items.RemoveAll(x => x.FilePath == filePath); - public void Rename(string oldFilePath, string newFilePath, string newTitle) - { - var match = Items.Find(x => string.Equals(x.FilePath, oldFilePath, StringComparison.OrdinalIgnoreCase)); - if (match != null) - { - match.FilePath = newFilePath; - match.Title = newTitle; - match.LastOpened = DateTime.UtcNow; - } - } - public void Clear() => Items.Clear(); - } - - [Fact] - public void HomeViewModel_InitializesAllTemplatesWithRealisticPreviews() - { - // Arrange & Act - var vm = new HomeViewModel(); - - // Assert - Assert.NotEmpty(vm.AllTemplates); - Assert.True(vm.AllTemplates.Count >= 18, "Should have at least 18 templates initialized including new resumes and research papers"); - - // Verify each non-blank template has a live PagePreview with real elements - foreach (var template in vm.AllTemplates) - { - Assert.NotNull(template.PagePreview); - Assert.NotEmpty(template.Name); - Assert.NotEmpty(template.Category); - - if (!template.IsBlank) - { - Assert.True(template.PagePreview.Elements.Count > 0, $"Template '{template.Name}' should have real page elements in preview"); - } - } - } - - [Fact] - public void HomeViewModel_ToggleGallery_ExpandsAndCollapsesCorrectly() - { - // Arrange - var vm = new HomeViewModel(); - Assert.False(vm.IsTemplateGalleryExpanded); - - // Act & Assert 1: Toggle expands - vm.ToggleTemplateGalleryCommand.Execute(null); - Assert.True(vm.IsTemplateGalleryExpanded); - - // Act & Assert 2: Toggle collapses - vm.ToggleTemplateGalleryCommand.Execute(null); - Assert.False(vm.IsTemplateGalleryExpanded); - - // Act & Assert 3: Direct collapse command - vm.ToggleTemplateGalleryCommand.Execute(null); // expand first - Assert.True(vm.IsTemplateGalleryExpanded); - - vm.CollapseTemplateGalleryCommand.Execute(null); - Assert.False(vm.IsTemplateGalleryExpanded); - } - - [Fact] - public void HomeViewModel_CategoryFilter_FiltersTemplatesAccurately() - { - // Arrange - var vm = new HomeViewModel(); - - // Act 1: Filter Corporate - vm.SetTemplateCategoryCommand.Execute("Corporate"); - Assert.Equal("Corporate", vm.SelectedTemplateCategory); - Assert.All(vm.FilteredTemplates, t => Assert.Equal("Corporate", t.Category, ignoreCase: true)); - Assert.Contains(vm.FilteredTemplates, t => t.Id == "annualreport"); - - // Act 2: Filter Finance - vm.SetTemplateCategoryCommand.Execute("Finance"); - Assert.Equal("Finance", vm.SelectedTemplateCategory); - Assert.All(vm.FilteredTemplates, t => Assert.Equal("Finance", t.Category, ignoreCase: true)); - Assert.Contains(vm.FilteredTemplates, t => t.Id == "invoice"); - Assert.Contains(vm.FilteredTemplates, t => t.Id == "financeresearch"); - - // Act 3: Filter Career (All 4 Resume Types) - vm.SetTemplateCategoryCommand.Execute("Career"); - Assert.Equal("Career", vm.SelectedTemplateCategory); - Assert.All(vm.FilteredTemplates, t => Assert.Equal("Career", t.Category, ignoreCase: true)); - Assert.Contains(vm.FilteredTemplates, t => t.Id == "resume"); - Assert.Contains(vm.FilteredTemplates, t => t.Id == "resumemodern"); - Assert.Contains(vm.FilteredTemplates, t => t.Id == "resumecreative"); - Assert.Contains(vm.FilteredTemplates, t => t.Id == "resumeacademic"); - - // Act 4: Filter Academic (All 4 Research Papers) - vm.SetTemplateCategoryCommand.Execute("Academic"); - Assert.Equal("Academic", vm.SelectedTemplateCategory); - Assert.All(vm.FilteredTemplates, t => Assert.Equal("Academic", t.Category, ignoreCase: true)); - Assert.Contains(vm.FilteredTemplates, t => t.Id == "academic"); - Assert.Contains(vm.FilteredTemplates, t => t.Id == "mathresearch"); - Assert.Contains(vm.FilteredTemplates, t => t.Id == "physicsresearch"); - Assert.Contains(vm.FilteredTemplates, t => t.Id == "historyresearch"); - - // Act 5: Filter Certificates - vm.SetTemplateCategoryCommand.Execute("Certificates"); - Assert.All(vm.FilteredTemplates, t => Assert.Equal("Certificates", t.Category, ignoreCase: true)); - Assert.Contains(vm.FilteredTemplates, t => t.Id == "certificate"); - Assert.Contains(vm.FilteredTemplates, t => t.Id == "certificatenavygold"); - Assert.Contains(vm.FilteredTemplates, t => t.Id == "diploma"); - - // Act 6: Reset to All - vm.SetTemplateCategoryCommand.Execute("All"); - Assert.Equal(vm.AllTemplates.Count, vm.FilteredTemplates.Count); - } - - [Fact] - public void HomeViewModel_SearchQuery_FiltersByKeywords() - { - // Arrange - var vm = new HomeViewModel(); - - // Act: Search for "quantum" - vm.SearchQuery = "quantum"; - - // Assert - Assert.Contains(vm.FilteredTemplates, t => t.Id == "physicsresearch"); - Assert.DoesNotContain(vm.FilteredTemplates, t => t.Id == "annualreport"); - - // Act 2: Search for "hodge" - vm.SearchQuery = "hodge"; - Assert.Contains(vm.FilteredTemplates, t => t.Id == "mathresearch"); - - // Act 3: Search for "mediterranean" - vm.SearchQuery = "mediterranean"; - Assert.Contains(vm.FilteredTemplates, t => t.Id == "historyresearch"); - - // Clear search - vm.ClearTemplateSearchCommand.Execute(null); - Assert.Equal("", vm.SearchQuery); - Assert.Equal(vm.AllTemplates.Count, vm.FilteredTemplates.Count); - } - - [Fact] - public void HomeViewModel_SearchWithNoMatches_SetsHasNoMatchingTemplates() - { - // Arrange - var vm = new HomeViewModel(); - - // Act - vm.SearchQuery = "NonExistentZebraTemplate12345"; - - // Assert - Assert.Equal(0, vm.MatchingTemplatesCount); - Assert.True(vm.HasNoMatchingTemplates); - } - - [Fact] - public void HomeViewModel_SelectTemplateCommand_FiresOpenTemplateRequestedEvent() - { - // Arrange - var vm = new HomeViewModel(); - string? requestedTemplate = null; - vm.OpenTemplateRequested += t => requestedTemplate = t; - - // Act - vm.SelectTemplateCommand.Execute("resumemodern"); - - // Assert - Assert.Equal("resumemodern", requestedTemplate); - } - - [Fact] - public void HomeViewModel_RecentDocuments_LoadsAndClearsCorrectly() - { - // Arrange - var mockRecent = new MockRecentService(); - mockRecent.Add(new RecentDocumentItem { Title = "Doc1.pdf", FilePath = "/path/Doc1.pdf" }); - mockRecent.Add(new RecentDocumentItem { Title = "Doc2.frypdf", FilePath = "/path/Doc2.frypdf" }); - - var vm = new HomeViewModel(mockRecent, new TemplateService(), new ProjectPersistenceService(), new PdfToolRegistry()); - - // Assert - Assert.True(vm.HasRecentDocuments); - Assert.Equal(2, vm.RecentDocuments.Count); - - // Act: Clear - vm.ClearRecentCommand.Execute(null); - - // Assert - Assert.False(vm.HasRecentDocuments); - Assert.Empty(vm.RecentDocuments); - } - - [Fact] - public void HomeViewModel_OpenToolPage_OpensFullPageWithoutDialog() - { - // Arrange - var toolRegistry = new PdfToolRegistry(); - var operationsService = new PdfDocumentOperationsService(); - var factory = new PdfToolViewModelFactory(operationsService, toolRegistry); - var vm = new HomeViewModel(new MockRecentService(), new TemplateService(), new ProjectPersistenceService(), toolRegistry, null, factory); - - Assert.False(vm.IsToolPageActive); - Assert.Null(vm.ActiveToolViewModel); - - // Act: Open OCR PDF tool - vm.OpenToolPage(PdfToolId.OcrPdf); - - // Assert: Full page is active with initialized Tool ViewModel - Assert.True(vm.IsToolPageActive); - Assert.NotNull(vm.ActiveToolViewModel); - Assert.Equal(PdfToolId.OcrPdf, vm.ActiveToolViewModel.Tool.Id); - - // Act: Go back to tools - vm.BackToToolsCommand.Execute(null); - - // Assert: Full page closed, back to home tools grid - Assert.False(vm.IsToolPageActive); - Assert.Null(vm.ActiveToolViewModel); - } -} diff --git a/tests/PdfEditorApp.Tests/LicensingPageTests.cs b/tests/PdfEditorApp.Tests/LicensingPageTests.cs deleted file mode 100644 index cc99657..0000000 --- a/tests/PdfEditorApp.Tests/LicensingPageTests.cs +++ /dev/null @@ -1,218 +0,0 @@ -using System; -using System.Linq; -using System.Threading.Tasks; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Models; -using PdfEditorApp.ViewModels; -using Xunit; - -namespace PdfEditorApp.Tests; - -public class LicensingPageTests -{ - [Fact] - public void LicensingPage_InitializesAllThirdPartyLibraries() - { - // Arrange & Act - var vm = new HomeViewModel(); - - // Assert - Assert.NotEmpty(vm.AllLicenses); - Assert.Equal(20, vm.AllLicenses.Count); - - var expectedPackages = new[] - { - "Avalonia UI", - "QuestPDF", - "PdfPig & Skia Rendering", - "PdfSharpCore", - "SkiaSharp", - "Tabula Table Extractor", - "DocumentFormat.OpenXml", - "Material.Icons.Avalonia", - "CommunityToolkit.Mvvm", - "QRCoder", - "Microsoft.Extensions.DependencyInjection", - ".NET 10 Runtime & Base Libraries", - "LiveChartsCore & LiveChartsCore.SkiaSharpView", - "Microsoft.Extensions.Logging.Abstractions", - "SIL Open Font License (OFL 1.1) Typeface Collection", - "Roboto & Roboto Mono Font Family", - "Ubuntu Font Family", - "Microsoft.Extensions.AI & OpenAI", - "OllamaSharp", - "Tesseract OCR Engine" - }; - - foreach (var expected in expectedPackages) - { - var item = vm.AllLicenses.FirstOrDefault(l => l.Name == expected); - Assert.NotNull(item); - Assert.False(string.IsNullOrWhiteSpace(item.Version), $"Version for {expected} should not be empty"); - Assert.False(string.IsNullOrWhiteSpace(item.LicenseType), $"LicenseType for {expected} should not be empty"); - Assert.False(string.IsNullOrWhiteSpace(item.Category), $"Category for {expected} should not be empty"); - Assert.False(string.IsNullOrWhiteSpace(item.Purpose), $"Purpose for {expected} should not be empty"); - Assert.False(string.IsNullOrWhiteSpace(item.Maintainer), $"Maintainer for {expected} should not be empty"); - Assert.False(string.IsNullOrWhiteSpace(item.ProjectUrl), $"ProjectUrl for {expected} should not be empty"); - Assert.False(string.IsNullOrWhiteSpace(item.LicenseText), $"LicenseText for {expected} should not be empty"); - Assert.False(string.IsNullOrWhiteSpace(item.IconKind), $"IconKind for {expected} should not be empty"); - } - } - - [Fact] - public void LicensingPage_CategoryFilter_FiltersLibrariesAccurately() - { - // Arrange - var vm = new HomeViewModel(); - - // Act 1: Filter PDF & Document Engines - vm.SetLicenseCategoryCommand.Execute("PDF & Document Engines"); - Assert.Equal("PDF & Document Engines", vm.SelectedLicenseCategory); - Assert.Equal(3, vm.FilteredLicenses.Count); - Assert.Contains(vm.FilteredLicenses, l => l.Name == "QuestPDF"); - Assert.Contains(vm.FilteredLicenses, l => l.Name == "PdfPig & Skia Rendering"); - Assert.Contains(vm.FilteredLicenses, l => l.Name == "PdfSharpCore"); - - // Act 2: Filter UI & Graphics Frameworks - vm.SetLicenseCategoryCommand.Execute("UI & Graphics Frameworks"); - Assert.Equal(4, vm.FilteredLicenses.Count); - Assert.Contains(vm.FilteredLicenses, l => l.Name == "Avalonia UI"); - Assert.Contains(vm.FilteredLicenses, l => l.Name == "SkiaSharp"); - Assert.Contains(vm.FilteredLicenses, l => l.Name == "Material.Icons.Avalonia"); - Assert.Contains(vm.FilteredLicenses, l => l.Name == "LiveChartsCore & LiveChartsCore.SkiaSharpView"); - - // Act 3: Filter Office & Data Formats - vm.SetLicenseCategoryCommand.Execute("Office & Data Formats"); - Assert.Equal(3, vm.FilteredLicenses.Count); - Assert.Contains(vm.FilteredLicenses, l => l.Name == "Tabula Table Extractor"); - Assert.Contains(vm.FilteredLicenses, l => l.Name == "DocumentFormat.OpenXml"); - Assert.Contains(vm.FilteredLicenses, l => l.Name == "QRCoder"); - - // Act 4: Filter Architecture & Runtime - vm.SetLicenseCategoryCommand.Execute("Architecture & Runtime"); - Assert.Equal(4, vm.FilteredLicenses.Count); - Assert.Contains(vm.FilteredLicenses, l => l.Name == "CommunityToolkit.Mvvm"); - Assert.Contains(vm.FilteredLicenses, l => l.Name == "Microsoft.Extensions.DependencyInjection"); - Assert.Contains(vm.FilteredLicenses, l => l.Name == ".NET 10 Runtime & Base Libraries"); - Assert.Contains(vm.FilteredLicenses, l => l.Name == "Microsoft.Extensions.Logging.Abstractions"); - - // Act 5: Filter AI & Document Intelligence - vm.SetLicenseCategoryCommand.Execute("AI & Document Intelligence"); - Assert.Equal("AI & Document Intelligence", vm.SelectedLicenseCategory); - Assert.Equal(3, vm.FilteredLicenses.Count); - Assert.Contains(vm.FilteredLicenses, l => l.Name == "Microsoft.Extensions.AI & OpenAI"); - Assert.Contains(vm.FilteredLicenses, l => l.Name == "OllamaSharp"); - Assert.Contains(vm.FilteredLicenses, l => l.Name == "Tesseract OCR Engine"); - - // Act 6: Filter Typography & Typefaces - vm.SetLicenseCategoryCommand.Execute("Typography & Typefaces"); - Assert.Equal(3, vm.FilteredLicenses.Count); - Assert.Contains(vm.FilteredLicenses, l => l.Name == "SIL Open Font License (OFL 1.1) Typeface Collection"); - Assert.Contains(vm.FilteredLicenses, l => l.Name == "Roboto & Roboto Mono Font Family"); - Assert.Contains(vm.FilteredLicenses, l => l.Name == "Ubuntu Font Family"); - - // Act 7: Reset to All - vm.SetLicenseCategoryCommand.Execute("All"); - Assert.Equal(20, vm.FilteredLicenses.Count); - } - - [Fact] - public void LicensingPage_SearchQuery_FiltersLibrariesByKeywords() - { - // Arrange - var vm = new HomeViewModel(); - - // Act 1: Search by name - vm.SearchQuery = "QuestPDF"; - Assert.Single(vm.FilteredLicenses); - Assert.Equal("QuestPDF", vm.FilteredLicenses[0].Name); - - // Act 2: Search by license type - vm.SearchQuery = "Apache"; - Assert.Equal(3, vm.FilteredLicenses.Count); - Assert.Contains(vm.FilteredLicenses, l => l.Name == "PdfPig & Skia Rendering"); - Assert.Contains(vm.FilteredLicenses, l => l.Name == "Roboto & Roboto Mono Font Family"); - Assert.Contains(vm.FilteredLicenses, l => l.Name == "Tesseract OCR Engine"); - - // Act 3: Search by maintainer - vm.SearchQuery = "Microsoft"; - Assert.True(vm.FilteredLicenses.Count >= 5); - Assert.All(vm.FilteredLicenses, l => Assert.Contains("Microsoft", l.Maintainer + l.Name, StringComparison.OrdinalIgnoreCase)); - - // Act 4: Search font license - vm.SearchQuery = "OFL"; - Assert.Single(vm.FilteredLicenses); - Assert.Equal("SIL Open Font License (OFL 1.1) Typeface Collection", vm.FilteredLicenses[0].Name); - - // Act 5: Clear search - vm.ClearLicenseSearchCommand.Execute(null); - Assert.Equal("", vm.SearchQuery); - Assert.Equal("All", vm.SelectedLicenseCategory); - Assert.Equal(20, vm.FilteredLicenses.Count); - } - - [Fact] - public void LicensingPage_SearchWithNoMatches_SetsHasNoMatchingLicenses() - { - // Arrange - var vm = new HomeViewModel(); - - // Act - vm.SearchQuery = "NonExistentPackageXYZ999"; - - // Assert - Assert.Equal(0, vm.MatchingLicensesCount); - Assert.True(vm.HasNoMatchingLicenses); - } - - [Fact] - public void LicensingPage_ToggleLicenseExpand_TogglesState() - { - // Arrange - var vm = new HomeViewModel(); - var item = vm.AllLicenses.First(); - Assert.False(item.IsExpanded); - - // Act 1: Toggle on - vm.ToggleLicenseExpandCommand.Execute(item); - Assert.True(item.IsExpanded); - - // Act 2: Toggle off - vm.ToggleLicenseExpandCommand.Execute(item); - Assert.False(item.IsExpanded); - } - - [Fact] - public void LicensingPage_Navigation_SelectsLicensingSection() - { - // Arrange - var vm = new HomeViewModel(); - Assert.False(vm.IsLicensingSection); - - // Act - vm.SelectNavSectionCommand.Execute("Licensing"); - - // Assert - Assert.Equal(HomeNavSection.Licensing, vm.SelectedNavSection); - Assert.True(vm.IsLicensingSection); - } - - [Fact] - public void MainViewModel_NavigateToLicensing_SwitchesToHomeLicensingSection() - { - // Arrange - var mainVm = new MainViewModel(); - mainVm.OpenAboutDialogCommand.Execute(null); - Assert.True(mainVm.IsAboutDialogOpen); - - // Act - mainVm.NavigateToLicensingCommand.Execute(null); - - // Assert - Assert.False(mainVm.IsAboutDialogOpen); - Assert.True(mainVm.IsHomePageVisible); - Assert.False(mainVm.IsEditorVisible); - Assert.Equal(HomeNavSection.Licensing, mainVm.Home.SelectedNavSection); - Assert.True(mainVm.Home.IsLicensingSection); - } -} diff --git a/tests/PdfEditorApp.Tests/Material3ExpressiveThemeTests.cs b/tests/PdfEditorApp.Tests/Material3ExpressiveThemeTests.cs deleted file mode 100644 index 86ebbdf..0000000 --- a/tests/PdfEditorApp.Tests/Material3ExpressiveThemeTests.cs +++ /dev/null @@ -1,558 +0,0 @@ -using System; -using System.IO; -using Xunit; - -namespace PdfEditorApp.Tests; - -public class Material3ExpressiveThemeTests -{ - private readonly string _projectRoot; - - public Material3ExpressiveThemeTests() - { - var currentDir = AppContext.BaseDirectory; - string? projectRoot = null; - var dir = new DirectoryInfo(currentDir); - while (dir != null) - { - if (File.Exists(Path.Combine(dir.FullName, "FryPDF.sln")) || Directory.Exists(Path.Combine(dir.FullName, "src", "PdfEditorApp"))) - { - projectRoot = dir.FullName; - break; - } - dir = dir.Parent; - } - - Assert.NotNull(projectRoot); - _projectRoot = projectRoot!; - } - - [Fact] - public void AppAxaml_IncludesMaterial3ExpressiveTokensAndStyles() - { - var appAxamlPath = Path.Combine(_projectRoot, "src", "PdfEditorApp", "App.axaml"); - Assert.True(File.Exists(appAxamlPath), "App.axaml must exist"); - var appAxaml = File.ReadAllText(appAxamlPath); - - Assert.Contains("Material3ExpressiveTokens.axaml", appAxaml); - Assert.Contains("Material3ExpressiveStyles.axaml", appAxaml); - } - - [Fact] - public void Material3Tokens_DefinesCompleteM3ShapeScale() - { - var tokensPath = Path.Combine(_projectRoot, "src", "PdfEditorApp", "Styles", "Material3ExpressiveTokens.axaml"); - Assert.True(File.Exists(tokensPath), "Material3ExpressiveTokens.axaml must exist"); - var tokens = File.ReadAllText(tokensPath); - - // M3 Expressive shape scale tokens - Assert.Contains("CornerRadius x:Key=\"M3ShapeCornerNone\">0", tokens); - Assert.Contains("CornerRadius x:Key=\"M3ShapeCornerExtraSmall\">4", tokens); - Assert.Contains("CornerRadius x:Key=\"M3ShapeCornerSmall\">8", tokens); - Assert.Contains("CornerRadius x:Key=\"M3ShapeCornerMedium\">12", tokens); - Assert.Contains("CornerRadius x:Key=\"M3ShapeCornerLarge\">16", tokens); - Assert.Contains("CornerRadius x:Key=\"M3ShapeCornerExtraLarge\">28", tokens); - Assert.Contains("CornerRadius x:Key=\"M3ShapeCornerFull\">9999", tokens); - } - - [Fact] - public void Material3Tokens_DefinesElevationLevelsAndChubbySliderMetrics() - { - var tokensPath = Path.Combine(_projectRoot, "src", "PdfEditorApp", "Styles", "Material3ExpressiveTokens.axaml"); - var tokens = File.ReadAllText(tokensPath); - - // M3 Elevation shadows - Assert.Contains("BoxShadows x:Key=\"M3ElevationLevel0\"", tokens); - Assert.Contains("BoxShadows x:Key=\"M3ElevationLevel1\"", tokens); - Assert.Contains("BoxShadows x:Key=\"M3ElevationLevel2\"", tokens); - Assert.Contains("BoxShadows x:Key=\"M3ElevationLevel3\"", tokens); - Assert.Contains("BoxShadows x:Key=\"M3ElevationLevel4\"", tokens); - Assert.Contains("BoxShadows x:Key=\"M3ElevationLevel5\"", tokens); - Assert.Contains("BoxShadows x:Key=\"M3ElevationModalDialog\"", tokens); - - // Chubby tactile slider tokens - Assert.Contains("SliderTrackThemeHeight", tokens); - Assert.Contains("SliderHorizontalThumbWidth", tokens); - Assert.Contains("SliderThumbTactileRadius", tokens); - } - - [Fact] - public void Material3Tokens_DefinesLightAndDarkExpressivePalettesWithBackwardCompatibleAliases() - { - var tokensPath = Path.Combine(_projectRoot, "src", "PdfEditorApp", "Styles", "Material3ExpressiveTokens.axaml"); - var tokens = File.ReadAllText(tokensPath); - - // M3 Core Color Roles - Assert.Contains("M3PrimaryBrush", tokens); - Assert.Contains("M3OnPrimaryBrush", tokens); - Assert.Contains("M3PrimaryContainerBrush", tokens); - Assert.Contains("M3OnPrimaryContainerBrush", tokens); - Assert.Contains("M3SecondaryBrush", tokens); - Assert.Contains("M3SecondaryContainerBrush", tokens); - Assert.Contains("M3TertiaryBrush", tokens); - Assert.Contains("M3SurfaceBrush", tokens); - Assert.Contains("M3SurfaceContainerBrush", tokens); - Assert.Contains("M3SurfaceContainerHighBrush", tokens); - Assert.Contains("M3OutlineBrush", tokens); - Assert.Contains("M3OutlineVariantBrush", tokens); - - // Backward compatibility brush aliases for existing FluentOffice views - Assert.Contains("WinBgBrush", tokens); - Assert.Contains("WinPanelBrush", tokens); - Assert.Contains("WinBorderBrush", tokens); - Assert.Contains("WinAccentBrush", tokens); - Assert.Contains("WinTextBrush", tokens); - Assert.Contains("WinMutedBrush", tokens); - Assert.Contains("WinHoverBrush", tokens); - Assert.Contains("WinActiveBrush", tokens); - Assert.Contains("WinInputBgBrush", tokens); - } - - [Fact] - public void Material3Styles_DefinesExpressiveComponentClasses() - { - var stylesPath = Path.Combine(_projectRoot, "src", "PdfEditorApp", "Styles", "Material3ExpressiveStyles.axaml"); - Assert.True(File.Exists(stylesPath), "Material3ExpressiveStyles.axaml must exist"); - var styles = File.ReadAllText(stylesPath); - - // M3 Expressive Buttons - Assert.Contains("Button.m3-filled-btn", styles); - Assert.Contains("Button.m3-tonal-btn", styles); - Assert.Contains("Button.m3-elevated-btn", styles); - Assert.Contains("Button.m3-outlined-btn", styles); - Assert.Contains("Button.m3-text-btn", styles); - Assert.Contains("Button.m3-fab", styles); - Assert.Contains("Button.m3-fab-extended", styles); - Assert.Contains("Button.m3-icon-btn", styles); - - // M3 Segmented Capsules & Chips - Assert.Contains("Border.m3-segmented-container", styles); - Assert.Contains("RadioButton.m3-segment-btn", styles); - Assert.Contains("Button.m3-chip", styles); - Assert.Contains("Button.m3-preset-chip", styles); - Assert.Contains("ToggleButton.m3-filter-chip", styles); - - // M3 Expressive Cards & Containers - Assert.Contains("Border.m3-card-elevated", styles); - Assert.Contains("Border.m3-card-filled", styles); - Assert.Contains("Border.m3-card-outlined", styles); - Assert.Contains("Border.m3-dialog-card", styles); - Assert.Contains("Border.m3-floating-hud", styles); - - // M3 Text Inputs - Assert.Contains("TextBox.m3-outlined", styles); - Assert.Contains("TextBox.m3-search", styles); - } - - [Fact] - public void Material3Styles_DefinesCardActionButtonWrapperStyles_SuppressingPointerOverPresenterBackground() - { - var stylesPath = Path.Combine(_projectRoot, "src", "PdfEditorApp", "Styles", "Material3ExpressiveStyles.axaml"); - var styles = File.ReadAllText(stylesPath); - - // Verify button wrapper selectors exist - Assert.Contains("Button.card-action-wrapper", styles); - Assert.Contains("Button.pdf-tool-btn", styles); - Assert.Contains("Button.template-card-btn", styles); - Assert.Contains("Button.workflow-banner-btn", styles); - Assert.Contains("Button.card-btn", styles); - - // Verify template pointerover and pressed content presenter backgrounds are suppressed - Assert.Contains(":pointerover /template/ ContentPresenter#PART_ContentPresenter", styles); - Assert.Contains(":pressed /template/ ContentPresenter#PART_ContentPresenter", styles); - - // Verify ClipToBounds is disabled to prevent upward hover translation clipping - Assert.Contains("Property=\"ClipToBounds\" Value=\"False\"", styles); - - // Verify vertical headroom padding is provided on button wrappers to absorb translateY(-2px) - Assert.Contains("Property=\"Padding\" Value=\"0,3,0,1\"", styles); - } - - [Fact] - public void Views_FollowMaterial3ExpressiveCardHierarchy_WithoutStiffHexShadows() - { - var toolsStudioPath = Path.Combine(_projectRoot, "src", "PdfEditorApp", "Views", "PdfToolsStudioView.axaml"); - var starredPath = Path.Combine(_projectRoot, "src", "PdfEditorApp", "Views", "StarredToolsPageView.axaml"); - - var toolsStudio = File.ReadAllText(toolsStudioPath); - var starred = File.ReadAllText(starredPath); - - // Assert M3 elevation and corner tokens are used - Assert.Contains("StaticResource M3ElevationLevel1", toolsStudio); - Assert.Contains("StaticResource M3ElevationLevel2", toolsStudio); - Assert.Contains("StaticResource M3ShapeCornerLarge", toolsStudio); - - Assert.Contains("StaticResource M3ElevationLevel1", starred); - Assert.Contains("StaticResource M3ElevationLevel2", starred); - Assert.Contains("StaticResource M3ShapeCornerLarge", starred); - - // Assert old stiff/hardcoded shadows and radii are removed - Assert.DoesNotContain("0 2 6 #08000000", toolsStudio); - Assert.DoesNotContain("0 8 20 #150F6CBD", toolsStudio); - Assert.DoesNotContain("CornerRadius=\"10\"", toolsStudio); - - Assert.DoesNotContain("0 2 6 #08000000", starred); - Assert.DoesNotContain("0 8 20 #150F6CBD", starred); - Assert.DoesNotContain("CornerRadius=\"10\"", starred); - } - - [Fact] - public void InspectorSidebarView_TypographyStudioCard_AdheresToMaterial3Expressive() - { - var inspectorPath = Path.Combine(_projectRoot, "src", "PdfEditorApp", "Views", "InspectorSidebarView.axaml"); - var inspector = File.ReadAllText(inspectorPath); - - // Verify M3 card container properties on Typography Studio - Assert.Contains("Classes=\"m3-preset-chip\"", inspector); - Assert.Contains("M3SurfaceContainerLowestBrush", inspector); - Assert.Contains("M3PrimaryContainerBrush", inspector); - Assert.Contains("M3OutlineVariantBrush", inspector); - - // Verify presets use proper vector MaterialIcons rather than emojis/unicode - Assert.Contains("Kind=\"Waves\"", inspector); - Assert.Contains("Kind=\"VectorCurve\"", inspector); - Assert.Contains("Kind=\"Arch\"", inspector); - Assert.Contains("Kind=\"TrendingDown\"", inspector); - Assert.Contains("Kind=\"TrendingUp\"", inspector); - Assert.Contains("Kind=\"ArrowUpBoldOutline\"", inspector); - Assert.Contains("Kind=\"ArrowDownBoldOutline\"", inspector); - Assert.Contains("Kind=\"DecagramOutline\"", inspector); - Assert.Contains("Kind=\"CircleHalfFull\"", inspector); - Assert.Contains("Kind=\"BorderColor\"", inspector); - Assert.Contains("Kind=\"LayersOutline\"", inspector); - Assert.Contains("Kind=\"Creation\"", inspector); - Assert.Contains("Kind=\"FormatLetterCase\"", inspector); - - // Verify old typography preset buttons with emojis and math unicode symbols are removed - Assert.DoesNotContain("CommandParameter=\"wave\">= 112px (114px) to ensure group titles are never clipped by scrollbars - Assert.Contains("Height=\"114\"", ribbon); - - // 2. Uses sleek ribbon-scroll-viewer class - Assert.Contains("Classes=\"ribbon-scroll-viewer\"", ribbon); - - // 3. FluentOfficeStyles defines sleek M3 horizontal scrollbar for ribbon - var stylesPath = Path.Combine(_projectRoot, "src", "PdfEditorApp", "Styles", "FluentOfficeStyles.axaml"); - var styles = File.ReadAllText(stylesPath); - Assert.Contains("ScrollViewer.ribbon-scroll-viewer /template/ ScrollBar:horizontal", styles); - } - - [Fact] - public void InspectorSidebarView_ExpandableSectionHeaders_UseM3SectionToggleWithoutWidthClipping() - { - // 1. Material3ExpressiveStyles defines m3-section-toggle with stretch alignment and no fixed width - var m3StylesPath = Path.Combine(_projectRoot, "src", "PdfEditorApp", "Styles", "Material3ExpressiveStyles.axaml"); - var m3Styles = File.ReadAllText(m3StylesPath); - Assert.Contains("Style Selector=\"Button.m3-section-toggle\"", m3Styles); - Assert.Contains("Property=\"HorizontalAlignment\" Value=\"Stretch\"", m3Styles); - Assert.Contains("Property=\"HorizontalContentAlignment\" Value=\"Stretch\"", m3Styles); - - // 2. InspectorSidebarView uses m3-section-toggle for expandable headers - var inspectorPath = Path.Combine(_projectRoot, "src", "PdfEditorApp", "Views", "InspectorSidebarView.axaml"); - var inspector = File.ReadAllText(inspectorPath); - Assert.Contains("Button Classes=\"m3-section-toggle\"", inspector); - Assert.DoesNotContain("Button Classes=\"mini-tool-btn\" HorizontalAlignment=\"Stretch\"", inspector); - } - - [Fact] - public void InspectorSidebarView_LayerOrderAndQuickActions_UsesSegmentedCapsuleAndProportionalButtons() - { - var inspectorPath = Path.Combine(_projectRoot, "src", "PdfEditorApp", "Views", "InspectorSidebarView.axaml"); - var inspector = File.ReadAllText(inspectorPath); - - // 1. Layer order is contained within an M3 segmented container capsule with 4 segment buttons - Assert.Contains("Border Grid.Column=\"0\" Classes=\"m3-segmented-container\" HorizontalAlignment=\"Stretch\" Padding=\"2\"", inspector); - Assert.Contains("Command=\"{Binding BringToFrontCommand}\"", inspector); - Assert.Contains("Command=\"{Binding BringForwardCommand}\"", inspector); - Assert.Contains("Command=\"{Binding SendBackwardCommand}\"", inspector); - Assert.Contains("Command=\"{Binding SendToBackCommand}\"", inspector); - - // 2. Quick Actions are proportional 32x32 circular buttons avoiding vertical oval distortion - Assert.Contains("Button Classes=\"m3-tonal-btn\" Width=\"32\" Height=\"32\" Padding=\"0\"", inspector); - Assert.Contains("Button Classes=\"danger-btn\" Width=\"32\" Height=\"32\" Padding=\"0\"", inspector); - Assert.Contains("Command=\"{Binding DuplicateSelectedElementCommand}\"", inspector); - Assert.Contains("Command=\"{Binding DeleteSelectedElementCommand}\"", inspector); - - // 3. The old distorted 6-column unsegmented grid row is completely eliminated - Assert.DoesNotContain("\n ", fluentStyles); - - // 3. MainWindow brand button and document title use m3-header-btn - var mainPath = Path.Combine(_projectRoot, "src", "PdfEditorApp", "Views", "MainWindow.axaml"); - var main = File.ReadAllText(mainPath); - Assert.Contains("Button Classes=\"m3-header-btn\"", main); - Assert.Contains("TextBlock Text=\"FryPDF\"", main); - Assert.Contains("TextBlock Text=\"by CodeFryDev\"", main); - Assert.Contains("TextBlock Text=\"{Binding DocumentTitle}\"", main); - - // 4. PdfViewerView uses m3-header-btn for rename document title - var viewerPath = Path.Combine(_projectRoot, "src", "PdfEditorApp", "Views", "PdfViewerView.axaml"); - var viewer = File.ReadAllText(viewerPath); - Assert.Contains("Button Classes=\"m3-header-btn\"", viewer); - } - - [Fact] - public void PluginsDialog_AdheresToMaterial3Expressive() - { - var pluginsPath = Path.Combine(_projectRoot, "src", "PdfEditorApp", "Views", "Dialogs", "PluginsDialog.axaml"); - var xaml = File.ReadAllText(pluginsPath); - - // 1. Dialog Shell uses M3 Extra Large shape, dedicated M3ElevationModalDialog elevation, and M3 Surface brush - Assert.Contains("CornerRadius=\"{StaticResource M3ShapeCornerExtraLarge}\"", xaml); - Assert.Contains("BoxShadow=\"{StaticResource M3ElevationModalDialog}\"", xaml); - Assert.Contains("Background=\"{DynamicResource M3SurfaceBrush}\"", xaml); - - // 2. Elimination of hardcoded dark navy hex colors and raw hex box shadows - Assert.DoesNotContain("Background=\"#0F172A\"", xaml); - Assert.DoesNotContain("Background=\"#1E1B4B\"", xaml); - Assert.DoesNotContain("BorderBrush=\"#1E293B\"", xaml); - Assert.DoesNotContain("BorderBrush=\"#818CF8\"", xaml); - Assert.DoesNotContain("BoxShadow=\"0 28 80 #50000000\"", xaml); - - // 3. Header uses dynamic M3 tokens, tonal badge, and m3-icon-btn close - Assert.Contains("Background=\"{DynamicResource M3SurfaceContainerLowBrush}\"", xaml); - Assert.Contains("Background=\"{DynamicResource M3PrimaryContainerBrush}\"", xaml); - Assert.Contains("Background=\"{DynamicResource M3SecondaryContainerBrush}\"", xaml); - Assert.Contains("Button Grid.Column=\"2\"\n Classes=\"m3-icon-btn\"", xaml); - - // 4. Search bar uses m3-search and Profile selector uses M3 segmented container - Assert.Contains("Classes=\"m3-search\"", xaml); - Assert.Contains("Classes=\"m3-segmented-container\"", xaml); - Assert.Contains("Button Classes=\"m3-segment-btn\"", xaml); - - // 5. Plugin cards use elevated M3 container, tonal icon container, and m3-tonal-btn - Assert.Contains("Background=\"{DynamicResource M3SurfaceContainerLowestBrush}\"", xaml); - Assert.Contains("BoxShadow=\"{StaticResource M3ElevationLevel1}\"", xaml); - Assert.Contains("CornerRadius=\"{StaticResource M3ShapeCornerLarge}\"", xaml); - Assert.Contains("Classes=\"m3-tonal-btn\"", xaml); - - // 6. Footer bar uses tonal background, m3-tonal-btn, and m3-filled-btn - Assert.Contains("Classes=\"m3-filled-btn\"", xaml); - } - - [Fact] - public void AboutDialog_AdheresToMaterial3Expressive() - { - var aboutPath = Path.Combine(_projectRoot, "src", "PdfEditorApp", "Views", "Dialogs", "AboutDialog.axaml"); - var xaml = File.ReadAllText(aboutPath); - - // 1. Dialog Shell uses M3 Extra Large shape, dedicated M3ElevationModalDialog elevation, and M3 Surface brush - Assert.Contains("CornerRadius=\"{StaticResource M3ShapeCornerExtraLarge}\"", xaml); - Assert.Contains("BoxShadow=\"{StaticResource M3ElevationModalDialog}\"", xaml); - Assert.Contains("Background=\"{DynamicResource M3SurfaceBrush}\"", xaml); - - // 2. Elimination of harsh raw box shadows and hardcoded dark navy header - Assert.DoesNotContain("BoxShadow=\"0 28 80 #50000000\"", xaml); - Assert.DoesNotContain("BoxShadow=\"0 4 16 #250D2B45\"", xaml); - Assert.DoesNotContain("Background=\"#0B1222\"", xaml); - Assert.DoesNotContain("BorderBrush=\"#1E293B\"", xaml); - - // 3. Inner 28px clipping shell preserves outer shadow without clipping - Assert.Contains("", xaml); - - // 4. Content cards use M3 ElevationLevel1 and M3 shape tokens - Assert.Contains("BoxShadow=\"{StaticResource M3ElevationLevel1}\"", xaml); - Assert.Contains("BoxShadow=\"{StaticResource M3ElevationLevel2}\"", xaml); - Assert.Contains("CornerRadius=\"{StaticResource M3ShapeCornerMedium}\"", xaml); - Assert.Contains("CornerRadius=\"{StaticResource M3ShapeCornerLarge}\"", xaml); - - // 5. Interactive controls use M3 button classes and pill geometry - Assert.Contains("Classes=\"m3-icon-btn\"", xaml); - Assert.Contains("Classes=\"m3-tonal-btn\"", xaml); - Assert.Contains("Classes=\"m3-filled-btn\"", xaml); - } - - [Fact] - public void ModalDialogCards_UseM3ElevationModalDialog_AndDoNotClipOuterShadow() - { - var dialogFiles = new[] - { - "AboutDialog.axaml", - "PluginsDialog.axaml", - "CommandPaletteDialog.axaml", - "ShortcutsHelpDialog.axaml", - "WorkflowBuilderDialog.axaml", - "PdfToolRunnerDialog.axaml", - "BatchGenerationDialog.axaml", - "DeleteConfirmationDialog.axaml", - "CompareDocumentsDialog.axaml", - "SignatureStudioDialog.axaml", - "PreflightDiagnosticsDialog.axaml", - "CustomStampDialog.axaml", - "DataStudioDialog.axaml", - "MathEquationStudioDialog.axaml" - }; - - foreach (var file in dialogFiles) - { - var path = Path.Combine(_projectRoot, "src", "PdfEditorApp", "Views", "Dialogs", file); - var xaml = File.ReadAllText(path); - - Assert.Contains("BoxShadow=\"{StaticResource M3ElevationModalDialog}\"", xaml); - Assert.Contains("CornerRadius=\"{StaticResource M3ShapeCornerExtraLarge}\"", xaml); - } - } -} - - diff --git a/tests/PdfEditorApp.Tests/MathEngineTests.cs b/tests/PdfEditorApp.Tests/MathEngineTests.cs deleted file mode 100644 index 63611fb..0000000 --- a/tests/PdfEditorApp.Tests/MathEngineTests.cs +++ /dev/null @@ -1,372 +0,0 @@ -using System; -using System.IO; -using System.Linq; -using System.Text.Json; -using System.Threading.Tasks; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; -using Xunit; -using PdfEditorApp.Models; -using PdfEditorApp.Services; -using PdfEditorApp.Services.MathEngine; -using PdfEditorApp.ViewModels.ElementViewModels; - -namespace PdfEditorApp.Tests; - -public class MathEngineTests -{ - [Fact] - public void Tokenizer_Should_Tokenize_Basic_Formula() - { - string latex = @"x^2 + \frac{1}{2} = 0"; - var tokens = MathLayoutEngine.Tokenize(latex); - - Assert.NotEmpty(tokens); - Assert.Contains(tokens, t => t.Type == MathLayoutEngine.TokenType.Command && t.Value == "frac"); - Assert.Contains(tokens, t => t.Type == MathLayoutEngine.TokenType.Superscript); - Assert.Contains(tokens, t => t.Type == MathLayoutEngine.TokenType.Operator && t.Value == "+"); - } - - [Fact] - public void Tokenizer_Should_Tokenize_Greek_And_Special_Operators() - { - string latex = @"\int_{-\infty}^{\infty} e^{-\alpha x^2} \, dx = \sqrt{\frac{\pi}{\alpha}}"; - var tokens = MathLayoutEngine.Tokenize(latex); - - Assert.Contains(tokens, t => t.Type == MathLayoutEngine.TokenType.Command && t.Value == "int"); - Assert.Contains(tokens, t => t.Type == MathLayoutEngine.TokenType.Command && t.Value == "alpha"); - Assert.Contains(tokens, t => t.Type == MathLayoutEngine.TokenType.Command && t.Value == "sqrt"); - Assert.Contains(tokens, t => t.Type == MathLayoutEngine.TokenType.Command && t.Value == "pi"); - Assert.Contains(tokens, t => t.Type == MathLayoutEngine.TokenType.Command && t.Value == "infty"); - } - - [Fact] - public void Parser_Should_Parse_Fractions_And_Radicals() - { - string latex = @"\frac{-b \pm \sqrt{b^2 - 4ac}}{2a}"; - var tokens = MathLayoutEngine.Tokenize(latex); - var parser = new MathLayoutEngine.MathParser(tokens); - var ast = parser.ParseExpression(); - - Assert.NotNull(ast); - var ctx = new MathLayoutEngine.LayoutContext(16, "#000000", MathDisplayStyle.DisplayBlock); - ast.Measure(ctx); - - Assert.True(ast.Width > 0); - Assert.True(ast.Height > 0); - } - - [Fact] - public void Parser_Should_Parse_Large_Operators_With_Limits() - { - string latex = @"\sum_{i=1}^{n} i^2 = \frac{n(n+1)(2n+1)}{6}"; - var tokens = MathLayoutEngine.Tokenize(latex); - var parser = new MathLayoutEngine.MathParser(tokens); - var ast = parser.ParseExpression(); - - Assert.NotNull(ast); - var ctx = new MathLayoutEngine.LayoutContext(16, "#000000", MathDisplayStyle.DisplayBlock); - ast.Measure(ctx); - - Assert.True(ast.Width > 20); - Assert.True(ast.Height > 20); - } - - [Fact] - public void Parser_Should_Parse_Matrices_And_Cases() - { - string matrixLatex = @"\begin{pmatrix} a & b \\ c & d \end{pmatrix}"; - var tokens = MathLayoutEngine.Tokenize(matrixLatex); - var parser = new MathLayoutEngine.MathParser(tokens); - var ast = parser.ParseExpression(); - - Assert.NotNull(ast); - var ctx = new MathLayoutEngine.LayoutContext(16, "#000000", MathDisplayStyle.DisplayBlock); - ast.Measure(ctx); - - Assert.True(ast.Width > 20); - Assert.True(ast.Height > 20); - } - - [Fact] - public void RenderToSvg_Should_Generate_Valid_Svg() - { - string latex = @"\int_{-\infty}^{\infty} e^{-x^2} \, dx = \sqrt{\pi}"; - var options = new MathRenderOptions - { - FontSize = 16, - TextColorHex = "#0F172A", - ShowEquationNumber = true, - EquationNumber = "(1.1)", - Alignment = TextAlignmentMode.Center - }; - - string svg = MathLayoutEngine.RenderToSvg(latex, options).SvgMarkup; - - Assert.NotNull(svg); - Assert.StartsWith("", svg); - Assert.Contains("viewBox=", svg); - Assert.Contains("(1.1)", svg); - } - - [Fact] - public void PresetsLibrary_All_Presets_Should_Be_Valid_And_Renderable() - { - var presets = MathPresetsLibrary.GetAllPresets(); - Assert.True(presets.Count >= 25, "Expected at least 25 standard mathematical presets"); - - foreach (var preset in presets) - { - Assert.False(string.IsNullOrWhiteSpace(preset.Id), $"Preset ID should not be empty for {preset.Name}"); - Assert.False(string.IsNullOrWhiteSpace(preset.Name), $"Preset Name should not be empty for {preset.Id}"); - Assert.False(string.IsNullOrWhiteSpace(preset.Formula), $"Formula should not be empty for {preset.Id}"); - - // Verify Svg rendering works without throwing - string svg = MathLayoutEngine.RenderToSvg(preset.Formula, new MathRenderOptions { FontSize = 14 }).SvgMarkup; - Assert.NotNull(svg); - Assert.Contains(" Assert.Equal(MathCategory.Calculus, p.Category)); - - var physics = MathPresetsLibrary.GetByCategory(MathCategory.Physics); - Assert.NotEmpty(physics); - - var finance = MathPresetsLibrary.GetByCategory(MathCategory.Finance); - Assert.NotEmpty(finance); - } - - [Fact] - public void PdfMathElement_Polymorphic_Json_Serialization_Should_RoundTrip() - { - var mathEl = new PdfMathElement - { - Id = "math-101", - X = 120, - Y = 240, - Width = 350, - Height = 65, - Formula = @"e^{i\pi} + 1 = 0", - FontSize = 18, - TextColorHex = "#1E293B", - BackgroundColorHex = "#F8FAFC", - BorderColorHex = "#E2E8F0", - BorderThickness = 1.0, - CornerRadius = 6, - ShowBackground = true, - ShowBorder = true, - ShowEquationNumber = true, - EquationNumber = "(Euler)", - Category = MathCategory.Algebra, - PresetName = "Euler's Identity" - }; - - var page = new PdfPageModel - { - PageNumber = 1, - Elements = { mathEl } - }; - - var doc = new PdfDocumentModel - { - Title = "Math Test Doc", - Pages = { page } - }; - - string json = JsonSerializer.Serialize(doc, new JsonSerializerOptions { WriteIndented = true }); - Assert.Contains("\"$type\": \"math\"", json); - Assert.Contains("Euler", json); - - var deserializedDoc = JsonSerializer.Deserialize(json); - Assert.NotNull(deserializedDoc); - Assert.Single(deserializedDoc.Pages[0].Elements); - - var loadedEl = deserializedDoc.Pages[0].Elements[0] as PdfMathElement; - Assert.NotNull(loadedEl); - Assert.Equal(ElementKind.Math, loadedEl.Kind); - Assert.Equal(@"e^{i\pi} + 1 = 0", loadedEl.Formula); - Assert.Equal(18, loadedEl.FontSize); - Assert.Equal("(Euler)", loadedEl.EquationNumber); - Assert.Equal(MathCategory.Algebra, loadedEl.Category); - Assert.Equal("Euler's Identity", loadedEl.PresetName); - } - - [Fact] - public void MathElementViewModel_Should_Sync_With_Model_And_RenderSvg() - { - var vm = new MathElementViewModel(); - vm.Formula = @"\frac{d}{dx}\left[ \int_{a}^{x} f(t) \, dt \right] = f(x)"; - vm.FontSize = 14; - vm.ShowEquationNumber = true; - vm.EquationNumber = "(FTC)"; - vm.RenderSvg(); - - Assert.NotNull(vm.SvgSource); - Assert.Contains(" 1000, $"Exported PDF should have non-trivial size (actual: {fileInfo.Length} bytes)"); - - // Check PDF header - byte[] header = new byte[5]; - using (var fs = File.OpenRead(tempFile)) - { - fs.ReadExactly(header, 0, 5); - } - string headerStr = System.Text.Encoding.ASCII.GetString(header); - Assert.Equal("%PDF-", headerStr); - } - finally - { - if (File.Exists(tempFile)) - { - try { File.Delete(tempFile); } catch { } - } - } - } -} diff --git a/tests/PdfEditorApp.Tests/MicrokernelPillarsTests.cs b/tests/PdfEditorApp.Tests/MicrokernelPillarsTests.cs deleted file mode 100644 index b32ec29..0000000 --- a/tests/PdfEditorApp.Tests/MicrokernelPillarsTests.cs +++ /dev/null @@ -1,287 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Threading.Tasks; -using Microsoft.Extensions.DependencyInjection; -using PdfEditorApp.Core.Plugins; -using PdfEditorApp.Core.Plugins.Descriptors; -using PdfEditorApp.Core.Plugins.Profiles; -using PdfEditorApp.Plugins.Bundles; -using PdfEditorApp.Services; -using PdfEditorApp.Services.AI; -using PdfEditorApp.Services.Canvas; -using PdfEditorApp.Services.Export; -using PdfEditorApp.Services.Import; -using PdfEditorApp.Services.Inspector; -using PdfEditorApp.Services.Ocr; -using PdfEditorApp.Services.Palette; -using PdfEditorApp.Services.StatusBar; -using Xunit; - -namespace PdfEditorApp.Tests; - -public class MicrokernelPillarsTests -{ - private (PluginHost host, FryPluginContext context, ServiceProvider sp) CreateTestEnvironment() - { - var services = new ServiceCollection(); - - // Registries - services.AddSingleton(); - services.AddSingleton(sp => sp.GetRequiredService()); - services.AddSingleton(sp => sp.GetRequiredService()); - - services.AddSingleton(); - services.AddSingleton(sp => sp.GetRequiredService()); - - services.AddSingleton(); - services.AddSingleton(sp => sp.GetRequiredService()); - - services.AddSingleton(); - services.AddSingleton(sp => sp.GetRequiredService()); - - services.AddSingleton(); - services.AddSingleton(sp => sp.GetRequiredService()); - - services.AddSingleton(); - services.AddSingleton(sp => sp.GetRequiredService()); - services.AddSingleton(sp => sp.GetRequiredService()); - - services.AddSingleton(); - services.AddSingleton(sp => sp.GetRequiredService()); - - services.AddSingleton(); - services.AddSingleton(sp => sp.GetRequiredService()); - - services.AddSingleton(); - services.AddSingleton(sp => sp.GetRequiredService()); - - services.AddSingleton(); - - var sp = services.BuildServiceProvider(); - var context = new FryPluginContext(sp); - var host = new PluginHost(context); - - return (host, context, sp); - } - - [Fact] - public async Task CanvasElementsBundle_RegistersAllCanvasElements() - { - var (host, context, sp) = CreateTestEnvironment(); - var bundle = new CanvasElementsBundle(); - - host.RegisterPlugins(bundle.Plugins); - await host.StartAsync(); - - var elements = context.GetRegisteredCanvasElements(); - Assert.NotEmpty(elements); - - var elementIds = elements.Select(e => e.ElementTypeId).ToHashSet(StringComparer.OrdinalIgnoreCase); - Assert.Contains("frypdf.element.text", elementIds); - Assert.Contains("frypdf.element.shape", elementIds); - Assert.Contains("frypdf.element.image", elementIds); - Assert.Contains("frypdf.element.table", elementIds); - Assert.Contains("frypdf.element.chart", elementIds); - Assert.Contains("frypdf.element.math", elementIds); - Assert.Contains("frypdf.element.formfield", elementIds); - Assert.Contains("frypdf.element.watermark", elementIds); - Assert.Contains("frypdf.element.redaction", elementIds); - Assert.Contains("frypdf.element.stickynote", elementIds); - Assert.Contains("frypdf.element.ink", elementIds); - Assert.Contains("frypdf.element.measurement", elementIds); - } - - [Fact] - public async Task DocumentIoBundle_RegistersImportersAndExporters() - { - var (host, context, sp) = CreateTestEnvironment(); - var bundle = new DocumentIoBundle(); - - host.RegisterPlugins(bundle.Plugins); - await host.StartAsync(); - - var importers = context.GetRegisteredImporters(); - Assert.NotEmpty(importers); - - var importerExtensions = importers.SelectMany(i => i.SupportedExtensions).ToHashSet(StringComparer.OrdinalIgnoreCase); - Assert.Contains(".pdf", importerExtensions); - Assert.Contains(".png", importerExtensions); - Assert.Contains(".md", importerExtensions); - - var exporters = context.GetRegisteredExporters(); - Assert.NotEmpty(exporters); - - var exporterIds = exporters.Select(e => e.ExporterId).ToHashSet(StringComparer.OrdinalIgnoreCase); - Assert.Contains("frypdf.exporter.pdf", exporterIds); - Assert.Contains("frypdf.exporter.markdown", exporterIds); - Assert.Contains("frypdf.exporter.html", exporterIds); - Assert.Contains("frypdf.exporter.text", exporterIds); - Assert.Contains("frypdf.exporter.svg", exporterIds); - } - - [Fact] - public async Task AiProvidersBundle_RegistersAllProviders() - { - var (host, context, sp) = CreateTestEnvironment(); - var bundle = new AiProvidersBundle(); - - host.RegisterPlugins(bundle.Plugins); - await host.StartAsync(); - - var aiRegistry = sp.GetRequiredService(); - var providers = aiRegistry.GetAllProviders(); - Assert.NotEmpty(providers); - - var providerIds = providers.Select(p => p.ProviderId).ToHashSet(StringComparer.OrdinalIgnoreCase); - Assert.Contains("ollama", providerIds); - Assert.Contains("groq", providerIds); - Assert.Contains("openai", providerIds); - } - - [Fact] - public async Task OcrEnginesBundle_RegistersAllOcrEngines() - { - var (host, context, sp) = CreateTestEnvironment(); - var bundle = new OcrEnginesBundle(); - - host.RegisterPlugins(bundle.Plugins); - await host.StartAsync(); - - var ocrRegistry = sp.GetRequiredService(); - var engines = ocrRegistry.GetAllEngines(); - Assert.NotEmpty(engines); - - var engineNames = engines.Select(e => e.EngineName).ToHashSet(StringComparer.OrdinalIgnoreCase); - Assert.Contains("Apple Vision OCR (macOS)", engineNames); - Assert.Contains("Windows Media OCR", engineNames); - Assert.Contains("Tesseract OCR", engineNames); - } - - [Fact] - public async Task StandardTemplatesBundle_RegistersAll28Templates() - { - var (host, context, sp) = CreateTestEnvironment(); - var bundle = new StandardTemplatesBundle(); - - host.RegisterPlugins(bundle.Plugins); - await host.StartAsync(); - - var templateService = sp.GetRequiredService(); - var templates = templateService.GetAllTemplates(); - Assert.True(templates.Count >= 28, $"Expected >= 28 templates, got {templates.Count}"); - - var categories = templates.Select(t => t.Category).Distinct(StringComparer.OrdinalIgnoreCase).ToList(); - Assert.Contains("Corporate", categories); - Assert.Contains("Finance", categories); - Assert.Contains("Career", categories); - Assert.Contains("Academic", categories); - Assert.Contains("Certificates", categories); - Assert.Contains("Education", categories); - } - - [Fact] - public async Task StatusBarBundle_RegistersWidgets() - { - var (host, context, sp) = CreateTestEnvironment(); - var bundle = new StatusBarBundle(); - - host.RegisterPlugins(bundle.Plugins); - await host.StartAsync(); - - var widgets = context.GetRegisteredStatusBarWidgets(); - Assert.NotEmpty(widgets); - - var widgetIds = widgets.Select(w => w.WidgetId).ToHashSet(StringComparer.OrdinalIgnoreCase); - Assert.Contains("frypdf.status.pagestats", widgetIds); - Assert.Contains("frypdf.status.ready", widgetIds); - Assert.Contains("frypdf.status.memory", widgetIds); - } - - [Fact] - public async Task InspectorBundle_RegistersInspectorSections() - { - var (host, context, sp) = CreateTestEnvironment(); - var bundle = new InspectorBundle(); - - host.RegisterPlugins(bundle.Plugins); - await host.StartAsync(); - - var sections = context.GetRegisteredInspectorSections(); - Assert.NotEmpty(sections); - - var sectionIds = sections.Select(s => s.SectionId).ToHashSet(StringComparer.OrdinalIgnoreCase); - Assert.Contains("frypdf.inspector.geometry", sectionIds); - Assert.Contains("frypdf.inspector.appearance", sectionIds); - Assert.Contains("frypdf.inspector.typography", sectionIds); - Assert.Contains("frypdf.inspector.table", sectionIds); - Assert.Contains("frypdf.inspector.chart", sectionIds); - } - - [Fact] - public async Task CommandPaletteBundle_RegistersCommands() - { - var (host, context, sp) = CreateTestEnvironment(); - var bundle = new CommandPaletteBundle(); - - host.RegisterPlugins(bundle.Plugins); - await host.StartAsync(); - - var commands = context.GetRegisteredCommands(); - Assert.NotEmpty(commands); - - var categories = commands.Select(c => c.Category).Distinct().ToList(); - Assert.Contains("File", categories); - Assert.Contains("Edit", categories); - Assert.Contains("Insert", categories); - Assert.Contains("View", categories); - Assert.Contains("Security", categories); - } - - [Fact] - public void DesktopProfile_ContainsAll16Bundles() - { - var profilePath = Path.Combine(AppContext.BaseDirectory, "profiles", "desktop.profile.json"); - if (!File.Exists(profilePath)) - { - // Fallback to source tree path if not copied to bin - profilePath = Path.GetFullPath(Path.Combine(AppContext.BaseDirectory, "..", "..", "..", "..", "..", "profiles", "desktop.profile.json")); - } - - Assert.True(File.Exists(profilePath), $"Profile not found at {profilePath}"); - var profile = ProfileLoader.LoadFromFile(profilePath); - - Assert.Equal("desktop", profile.ProfileName); - Assert.Equal(16, profile.Bundles.Count); - Assert.Contains("FryPdf.Bundle.CanvasElements", profile.Bundles); - Assert.Contains("FryPdf.Bundle.DocumentIo", profile.Bundles); - Assert.Contains("FryPdf.Bundle.AiProviders", profile.Bundles); - Assert.Contains("FryPdf.Bundle.OcrEngines", profile.Bundles); - Assert.Contains("FryPdf.Bundle.Templates", profile.Bundles); - Assert.Contains("FryPdf.Bundle.StatusBar", profile.Bundles); - Assert.Contains("FryPdf.Bundle.Inspector", profile.Bundles); - Assert.Contains("FryPdf.Bundle.CommandPalette", profile.Bundles); - Assert.Contains("FryPdf.Bundle.WorkspacePages", profile.Bundles); - Assert.Contains("FryPdf.Bundle.Dialogs", profile.Bundles); - Assert.Contains("FryPdf.Bundle.EditorSidebars", profile.Bundles); - } - - [Fact] - public void HeadlessProfile_LoadsHeadlessBundles() - { - var profilePath = Path.Combine(AppContext.BaseDirectory, "profiles", "headless.profile.json"); - if (!File.Exists(profilePath)) - { - profilePath = Path.GetFullPath(Path.Combine(AppContext.BaseDirectory, "..", "..", "..", "..", "..", "profiles", "headless.profile.json")); - } - - Assert.True(File.Exists(profilePath), $"Profile not found at {profilePath}"); - var profile = ProfileLoader.LoadFromFile(profilePath); - - Assert.Equal("headless", profile.ProfileName); - Assert.Contains("FryPdf.Bundle.Tools.Organize", profile.Bundles); - Assert.Contains("FryPdf.Bundle.DocumentIo", profile.Bundles); - Assert.DoesNotContain("FryPdf.Bundle.StatusBar", profile.Bundles); - } -} diff --git a/tests/PdfEditorApp.Tests/Mocks/MockRecentDocumentsService.cs b/tests/PdfEditorApp.Tests/Mocks/MockRecentDocumentsService.cs deleted file mode 100644 index ad52080..0000000 --- a/tests/PdfEditorApp.Tests/Mocks/MockRecentDocumentsService.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System.Collections.Generic; -using PdfEditorApp.Models; -using PdfEditorApp.Services; - -namespace PdfEditorApp.Tests.Mocks; - -/// -/// In-memory mock implementation of for isolated unit tests. -/// Prevents unit tests from reading or writing to the user's real application data folder. -/// -public class MockRecentDocumentsService : IRecentDocumentsService -{ - public List Items { get; } = new(); - - public List Load() => new(Items); - - public void Add(RecentDocumentItem item) - { - Items.RemoveAll(x => string.Equals(x.FilePath, item.FilePath, System.StringComparison.OrdinalIgnoreCase)); - Items.Insert(0, item); - } - - public void Remove(string filePath) => - Items.RemoveAll(x => string.Equals(x.FilePath, filePath, System.StringComparison.OrdinalIgnoreCase)); - - public void Rename(string oldFilePath, string newFilePath, string newTitle) - { - var match = Items.Find(x => string.Equals(x.FilePath, oldFilePath, System.StringComparison.OrdinalIgnoreCase)); - if (match != null) - { - match.FilePath = newFilePath; - match.Title = newTitle; - match.LastOpened = System.DateTime.UtcNow; - } - } - - public void Clear() => Items.Clear(); -} diff --git a/tests/PdfEditorApp.Tests/OcrEngineTests.cs b/tests/PdfEditorApp.Tests/OcrEngineTests.cs deleted file mode 100644 index cd47728..0000000 --- a/tests/PdfEditorApp.Tests/OcrEngineTests.cs +++ /dev/null @@ -1,315 +0,0 @@ -using PdfEditorApp.Services.Tools.Core; -using PdfEditorApp.Services.Tools.Organize; -using PdfEditorApp.Services.Tools.Security; -using PdfEditorApp.Services.Tools.Conversion; -using PdfEditorApp.Services.Tools.Intelligence; -using PdfEditorApp.ViewModels.Tools.Core; -using PdfEditorApp.ViewModels.Tools.Organize; -using PdfEditorApp.ViewModels.Tools.Security; -using PdfEditorApp.ViewModels.Tools.Conversion; -using PdfEditorApp.ViewModels.Tools.Intelligence; -using System; -using System.IO; -using System.Linq; -using System.Threading.Tasks; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Services.Ocr; -using PdfEditorApp.ViewModels; -using UglyToad.PdfPig; -using Xunit; -using Xunit.Abstractions; - -namespace PdfEditorApp.Tests; - -[Collection("OcrTests")] -public class OcrEngineTests -{ - private readonly ITestOutputHelper _output; - - public OcrEngineTests(ITestOutputHelper output) - { - _output = output; - } - - [Fact] - public void TesseractModelService_ListsCatalog_AndDetectsLocalFiles() - { - var service = new TesseractModelService(); - Assert.NotEmpty(service.AvailableLanguages); - - var eng = service.AvailableLanguages.FirstOrDefault(l => l.Code == "eng"); - Assert.NotNull(eng); - Assert.Equal("English", eng.DisplayName); - Assert.Contains("eng.traineddata", eng.DownloadUrl); - } - - [Fact] - public void CompositeOcrProvider_InitializesAvailableEngines() - { - var provider = new CompositeOcrProvider(); - Assert.NotNull(provider.ActiveEngine); - Assert.NotEmpty(provider.AvailableEngines); - - if (OperatingSystem.IsMacOS()) - { - Assert.Contains(provider.AvailableEngines, e => e.EngineType == OcrEngineType.OsNative); - Assert.Equal("Apple Vision OCR (macOS)", provider.ActiveEngine.EngineName); - } - } - - [Fact] - public async Task AppleVisionOcr_RecognizesText_WhenOnMacOS() - { - if (!OperatingSystem.IsMacOS()) return; - - string? pdfPath = FindTestPdfPath(); - if (pdfPath == null || !File.Exists(pdfPath)) - { - _output.WriteLine("PDF not found, skipping."); - return; - } - - // Render page 1 to PNG bytes using PdfViewerViewModel - var vm = new PdfViewerViewModel(); - await vm.LoadDocumentAsync(pdfPath); - - byte[]? pngBytes = vm.RenderPageBytesAtScale(1, 1.0f); - Assert.NotNull(pngBytes); - Assert.NotEmpty(pngBytes); - - var engine = new AppleVisionOcrEngine(); - Assert.True(engine.IsAvailable); - - var result = await engine.RecognizeTextAsync(pngBytes, "eng"); - Assert.True(result.Success, $"OCR error: {result.ErrorMessage}"); - Assert.NotEmpty(result.Words); - Assert.NotEmpty(result.Lines); - Assert.False(string.IsNullOrWhiteSpace(result.FullText)); - - _output.WriteLine($"Recognized {result.Words.Count} words and {result.Lines.Count} lines in {result.DurationMs} ms."); - _output.WriteLine($"Sample line: {result.Lines[0].Text}"); - _output.WriteLine($"Sample word bounds: {result.Words[0].Text} -> [{result.Words[0].NormalizedBounds.X:F3}, {result.Words[0].NormalizedBounds.Y:F3}]"); - } - - [Fact] - public async Task PdfViewer_ScannedDocument_AutomaticallyPopulatesWordsViaOcr() - { - if (!OperatingSystem.IsMacOS()) return; - - string? pdfPath = FindTestPdfPath(); - if (pdfPath == null || !File.Exists(pdfPath)) return; - - var vm = new PdfViewerViewModel(); - await vm.LoadDocumentAsync(pdfPath); - - Assert.Single(vm.Pages); - var page = vm.Pages[0]; - - _output.WriteLine($"Page dimensions: {page.WidthPoints}x{page.HeightPoints}, CurrentPdfBytes length: {vm.CurrentPdfBytes?.Length}"); - - var (ocrTxt, ocrW, ocrL) = vm.ExtractOcrPageTextGeometry(1, page.WidthPoints, page.HeightPoints); - _output.WriteLine($"Direct ExtractOcrPageTextGeometry: words={ocrW.Count}, textLength={ocrTxt.Length}"); - - // Ensure geometry runs - vm.EnsurePageGeometry(page); - - // Wait up to 3 seconds for async OCR extraction - for (int i = 0; i < 30 && page.Words.Count == 0; i++) - { - await Task.Delay(100); - } - - _output.WriteLine($"After EnsurePageGeometry: page.Words.Count={page.Words.Count}, IsGeometryLoading={page.IsGeometryLoading}"); - Assert.True(page.Words.Count > 100, $"Expected > 100 words extracted via OCR, but got {page.Words.Count}"); - Assert.NotEmpty(page.TextLines); - Assert.False(string.IsNullOrWhiteSpace(page.ExtractedText)); - - // Verify word bounds are valid in page coordinate space - var firstWord = page.Words[0]; - Assert.True(firstWord.Bounds.Width > 0); - Assert.True(firstWord.Bounds.Height > 0); - Assert.True(firstWord.Bounds.Left >= 0 && firstWord.Bounds.Left <= page.WidthPoints); - Assert.True(firstWord.Bounds.Top >= 0 && firstWord.Bounds.Top <= page.HeightPoints); - - // Verify word selection works (just as PdfTextOverlayControl would do) - page.SelectWord(firstWord); - Assert.True(page.HasSelection); - Assert.Equal(firstWord.Text, page.SelectedText); - Assert.Single(page.SelectionRects); - } - - [Fact] - public async Task PdfOcrService_CreatesSearchablePdf_FromScannedDocument() - { - if (!OperatingSystem.IsMacOS()) return; - - string? pdfPath = FindTestPdfPath(); - if (pdfPath == null || !File.Exists(pdfPath)) return; - - string tempOutPdf = Path.Combine(Path.GetTempPath(), $"Searchable_Test_{Guid.NewGuid():N}.pdf"); - - try - { - var ocrService = new PdfOcrService(); - var options = new Models.OcrToolOptions - { - InputFilePath = pdfPath, - OutputFilePath = tempOutPdf, - GenerateSearchablePdf = true - }; - - var result = await ocrService.OcrPdfAsync(options); - Assert.True(result.Success, $"OCR failed: {result.ErrorMessage}"); - Assert.True(File.Exists(tempOutPdf)); - Assert.True(new FileInfo(tempOutPdf).Length > 1000); - - // Open the resulting PDF with PdfPig and verify it now contains actual vector words! - using var pigDoc = UglyToad.PdfPig.PdfDocument.Open(tempOutPdf); - Assert.Single(pigDoc.GetPage(1).Letters.Take(1)); // Has letters - var words = pigDoc.GetPage(1).GetWords().ToList(); - Assert.True(words.Count > 100, $"Expected searchable PDF to have > 100 words, but got {words.Count}"); - } - finally - { - try { if (File.Exists(tempOutPdf)) File.Delete(tempOutPdf); } catch { } - } - } - - [Fact] - public async Task PdfOcrService_CreatesTextFileAndSearchablePdf_WhenBothRequested() - { - if (!OperatingSystem.IsMacOS()) return; - - string? pdfPath = FindTestPdfPath(); - if (pdfPath == null || !File.Exists(pdfPath)) return; - - string tempOutPdf = Path.Combine(Path.GetTempPath(), $"Searchable_Test_{Guid.NewGuid():N}.pdf"); - string expectedTxt = Path.ChangeExtension(tempOutPdf, ".txt"); - - try - { - var ocrService = new PdfOcrService(); - var options = new Models.OcrToolOptions - { - InputFilePath = pdfPath, - OutputFilePath = tempOutPdf, - GenerateSearchablePdf = true, - GenerateTextFile = true - }; - - var result = await ocrService.OcrPdfAsync(options); - Assert.True(result.Success, $"OCR failed: {result.ErrorMessage}"); - Assert.True(File.Exists(tempOutPdf), "Searchable PDF should exist"); - Assert.True(File.Exists(expectedTxt), "Extracted text file (.txt) should exist"); - Assert.Equal(2, result.OutputFiles.Count); - - string textContent = await File.ReadAllTextAsync(expectedTxt); - Assert.True(textContent.Length > 500, "Text content should contain recognized OCR text"); - Assert.Contains("Arduino", textContent, StringComparison.OrdinalIgnoreCase); - } - finally - { - try { if (File.Exists(tempOutPdf)) File.Delete(tempOutPdf); } catch { } - try { if (File.Exists(expectedTxt)) File.Delete(expectedTxt); } catch { } - } - } - - [Fact] - public async Task OcrPdfToolViewModel_SideBySide_ExtractsPageTextAndUpdatesStats() - { - if (!OperatingSystem.IsMacOS()) return; - - string? pdfPath = FindTestPdfPath(); - if (pdfPath == null || !File.Exists(pdfPath)) return; - - var ops = new PdfEditorApp.Services.PdfDocumentOperationsService(); - var toolDef = new PdfToolRegistry().GetTool(Models.PdfToolId.OcrPdf)!; - - var vm = new OcrPdfToolViewModel(ops, toolDef); - Assert.True(vm.IsSideBySideVisible, "Side-by-side panel should be visible by default"); - Assert.True(vm.GenerateTextFile, "GenerateTextFile should be enabled by default"); - - vm.SelectedFiles.Add(pdfPath); - - // Extract Page 1 text - await vm.ExtractTextForPageAsync(1); - for (int i = 0; i < 30 && (string.IsNullOrWhiteSpace(vm.CurrentPageExtractedText) || vm.IsExtractingPageText); i++) - { - await Task.Delay(100); - } - - _output.WriteLine($"CurrentPageExtractedText length={vm.CurrentPageExtractedText?.Length}: '{vm.CurrentPageExtractedText?.Substring(0, Math.Min(60, vm.CurrentPageExtractedText.Length))}'"); - - Assert.False(string.IsNullOrWhiteSpace(vm.CurrentPageExtractedText), $"CurrentPageExtractedText should be populated, got: '{vm.CurrentPageExtractedText}'"); - Assert.Contains("Arduino", vm.CurrentPageExtractedText, StringComparison.OrdinalIgnoreCase); - Assert.NotEqual("0 words", vm.WordCountText); - Assert.NotEqual("0 chars", vm.CharCountText); - - // Test active text update - vm.ActiveDisplayedText = "Test modified text for side-by-side"; - Assert.Equal("Test modified text for side-by-side", vm.CurrentPageExtractedText); - } - - [Fact] - public async Task PdfLivePreviewViewModel_LoadsTextDocument_SetsTextPropertiesAndHasDocument() - { - string tempTxt = Path.Combine(Path.GetTempPath(), $"Preview_Test_{Guid.NewGuid():N}.txt"); - try - { - await File.WriteAllTextAsync(tempTxt, "Line 1: Arduino Programming\nLine 2: Digital I/O Pins\nLine 3: Serial Communication"); - - var preview = new PdfEditorApp.ViewModels.Shell.PdfLivePreviewViewModel(); - Assert.False(preview.HasDocument); - - await preview.LoadDocumentAsync(tempTxt); - - Assert.True(preview.HasDocument, "HasDocument should be true for text files"); - Assert.True(preview.IsTextDocument, "IsTextDocument should be true for text files"); - Assert.Equal(3, preview.TextDocumentLinesCount); - Assert.Equal(13, preview.TextDocumentWordsCount); - Assert.Contains("Digital I/O Pins", preview.TextDocumentContent); - Assert.Equal("3 lines", preview.PageIndicatorText); - } - finally - { - try { if (File.Exists(tempTxt)) File.Delete(tempTxt); } catch { } - } - } - - [Fact] - public async Task OcrPdfToolViewModel_PreviewTextFile_SwitchesPreviewToTextDocument() - { - var ops = new PdfEditorApp.Services.PdfDocumentOperationsService(); - var toolDef = new PdfToolRegistry().GetTool(Models.PdfToolId.OcrPdf)!; - var vm = new OcrPdfToolViewModel(ops, toolDef); - - string tempTxt = Path.Combine(Path.GetTempPath(), $"Ocr_Preview_Test_{Guid.NewGuid():N}.txt"); - try - { - await File.WriteAllTextAsync(tempTxt, "Sample extracted OCR text from scanned card."); - vm.LastGeneratedTextFilePath = tempTxt; - - await vm.PreviewTextFileAsync(); - - Assert.True(vm.Preview.HasDocument); - Assert.True(vm.Preview.IsTextDocument); - Assert.Contains("Sample extracted OCR text", vm.Preview.TextDocumentContent); - } - finally - { - try { if (File.Exists(tempTxt)) File.Delete(tempTxt); } catch { } - } - } - - private static string? FindTestPdfPath() - { - var dir = new DirectoryInfo(AppContext.BaseDirectory); - while (dir != null) - { - string candidate = Path.Combine(dir.FullName, "Arduino Cheat Sheet_Redacted_Redacted.pdf"); - if (File.Exists(candidate)) return candidate; - dir = dir.Parent; - } - return null; - } -} diff --git a/tests/PdfEditorApp.Tests/OverlayExtensibilityTests.cs b/tests/PdfEditorApp.Tests/OverlayExtensibilityTests.cs deleted file mode 100644 index 1fb5f55..0000000 --- a/tests/PdfEditorApp.Tests/OverlayExtensibilityTests.cs +++ /dev/null @@ -1,218 +0,0 @@ -using System; -using System.IO; -using System.Linq; -using System.Threading.Tasks; -using Microsoft.Extensions.DependencyInjection; -using PdfEditorApp.Core.Plugins; -using PdfEditorApp.Core.Plugins.Descriptors; -using PdfEditorApp.Core.Plugins.Marketplace; -using PdfEditorApp.Plugins.Scratchpad; -using PdfEditorApp.Plugins.Snake; -using PdfEditorApp.Plugins.Telemetry; -using PdfEditorApp.Services.Overlays; -using PdfEditorApp.ViewModels; -using Xunit; - -namespace PdfEditorApp.Tests; - -public class OverlayExtensibilityTests -{ - [Fact] - public void OverlayDescriptor_SupportsMultipleChromeModes() - { - var standardDesc = new OverlayDescriptor - { - Id = "test.standard", - Title = "Standard Overlay", - ChromeMode = OverlayChromeMode.StandardCard - }; - Assert.False(standardDesc.HasCustomChrome); - - var customDesc = new OverlayDescriptor - { - Id = "test.custom", - Title = "Custom Overlay", - ChromeMode = OverlayChromeMode.CustomChrome - }; - Assert.True(customDesc.HasCustomChrome); - - var pillDesc = new OverlayDescriptor - { - Id = "test.pill", - Title = "Pill Overlay", - ChromeMode = OverlayChromeMode.FloatingPill - }; - Assert.Equal(OverlayChromeMode.FloatingPill, pillDesc.ChromeMode); - } - - [Fact] - public void BringToFront_SetsHighestZIndex_AcrossMultipleActiveOverlays() - { - var desc1 = new OverlayDescriptor { Id = "overlay.1", Title = "Card 1" }; - var desc2 = new OverlayDescriptor { Id = "overlay.2", Title = "Card 2" }; - var desc3 = new OverlayDescriptor { Id = "overlay.3", Title = "Card 3" }; - - var inst1 = new OverlayInstanceViewModel(desc1) { ZIndex = 1 }; - var inst2 = new OverlayInstanceViewModel(desc2) { ZIndex = 2 }; - var inst3 = new OverlayInstanceViewModel(desc3) { ZIndex = 3 }; - - var all = new[] { inst1, inst2, inst3 }; - - // Bring inst1 to front - inst1.BringToFront(all); - Assert.True(inst1.ZIndex > inst2.ZIndex); - Assert.True(inst1.ZIndex > inst3.ZIndex); - Assert.Equal(4, inst1.ZIndex); - - // Bring inst2 to front - inst2.BringToFront(all); - Assert.Equal(5, inst2.ZIndex); - Assert.True(inst2.ZIndex > inst1.ZIndex); - } - - [Fact] - public void FileInstalledPluginStore_PersistsAndLoadsRecords_Cleanly() - { - var tempFile = Path.Combine(Path.GetTempPath(), $"test_installed_{Guid.NewGuid():N}.json"); - try - { - var store = new FileInstalledPluginStore(tempFile); - Assert.Empty(store.GetAll()); - Assert.False(store.IsInstalled("test.plugin")); - - var record = new InstalledPluginRecord - { - PluginId = "test.plugin", - Name = "Test Plugin", - Version = "2.1.0", - IsEnabled = true, - WasOverlayOpen = true - }; - - store.AddOrUpdate(record); - Assert.True(store.IsInstalled("test.plugin")); - Assert.Single(store.GetAll()); - - // Reload from new instance pointing to same file - var store2 = new FileInstalledPluginStore(tempFile); - Assert.True(store2.IsInstalled("test.plugin")); - var loaded = store2.Get("test.plugin"); - Assert.NotNull(loaded); - Assert.Equal("Test Plugin", loaded.Name); - Assert.Equal("2.1.0", loaded.Version); - Assert.True(loaded.WasOverlayOpen); - - // Remove - store2.Remove("test.plugin"); - Assert.False(store2.IsInstalled("test.plugin")); - - // Verify persistence of removal - var store3 = new FileInstalledPluginStore(tempFile); - Assert.False(store3.IsInstalled("test.plugin")); - } - finally - { - if (File.Exists(tempFile)) - { - File.Delete(tempFile); - } - } - } - - [Fact] - public async Task CompanionOverlays_CanInstallAndOperateSimultaneously() - { - var tempDir = Path.Combine(AppContext.BaseDirectory, $"frypdf_companion_test_{Guid.NewGuid():N}"); - Directory.CreateDirectory(tempDir); - try - { - var services = new ServiceCollection(); - App.ConfigureServices(services); - var tempFile = Path.Combine(tempDir, "installed_plugins.json"); - services.AddSingleton(new FileInstalledPluginStore(tempFile)); - services.AddSingleton(sp => - { - var host = sp.GetRequiredService(); - var overlay = sp.GetService(); - var store = sp.GetRequiredService(); - var pluginsDir = Path.Combine(tempDir, "plugins"); - return new PdfEditorApp.Services.Plugins.PluginMarketplaceService(host, overlay, store, null, null, pluginsDir); - }); - var sp = services.BuildServiceProvider(); - - var host = sp.GetRequiredService(); - var overlayReg = sp.GetRequiredService(); - var marketplace = sp.GetRequiredService(); - - await host.StartAsync(); - - // Install Scratchpad - bool installed1 = await marketplace.InstallPluginAsync("frypdf.overlay.scratchpad"); - Assert.True(installed1); - Assert.True(host.IsPluginActive("frypdf.overlay.scratchpad")); - Assert.True(overlayReg.IsOverlayVisible("frypdf.overlay.scratchpad")); - - // Install Telemetry - bool installed2 = await marketplace.InstallPluginAsync("frypdf.overlay.telemetry"); - Assert.True(installed2); - Assert.True(host.IsPluginActive("frypdf.overlay.telemetry")); - Assert.True(overlayReg.IsOverlayVisible("frypdf.overlay.telemetry")); - - // Both are active simultaneously - Assert.Equal(2, overlayReg.ActiveOverlays.Count); - Assert.Contains(overlayReg.ActiveOverlays, o => o.Id == "frypdf.overlay.scratchpad"); - Assert.Contains(overlayReg.ActiveOverlays, o => o.Id == "frypdf.overlay.telemetry"); - - // Verify StandardCard chrome on both - var scratchInst = overlayReg.ActiveOverlays.First(o => o.Id == "frypdf.overlay.scratchpad"); - var telemInst = overlayReg.ActiveOverlays.First(o => o.Id == "frypdf.overlay.telemetry"); - - Assert.True(scratchInst.HasStandardChrome); - Assert.True(telemInst.HasStandardChrome); - - // Test Pin and Minimize commands - scratchInst.TogglePin(); - Assert.True(scratchInst.IsPinned); - - scratchInst.ToggleMinimize(); - Assert.True(scratchInst.IsMinimized); - - await host.StopAsync(); - } - finally - { - try { Directory.Delete(tempDir, recursive: true); } catch { } - } - } - - [Fact] - public void ScratchpadViewModel_TracksCounts_AndAddsTimestamps() - { - var vm = new ScratchpadViewModel - { - NotesText = "Hello World PDF" - }; - - Assert.Equal(3, vm.WordCount); - Assert.Equal(15, vm.CharacterCount); - - vm.AddTimestamp(); - Assert.Contains("Note (", vm.NotesText); - Assert.True(vm.WordCount > 3); - - vm.ClearNotes(); - Assert.Equal(0, vm.WordCount); - Assert.Equal(0, vm.CharacterCount); - } - - [Fact] - public void DocumentTelemetryViewModel_RefreshesMetrics_AndTrimsHeap() - { - var vm = new DocumentTelemetryViewModel(); - Assert.False(string.IsNullOrWhiteSpace(vm.MemoryAllocatedMb)); - Assert.True(vm.GarbageCollections >= 0); - - vm.RunGCTrim(); - Assert.False(string.IsNullOrWhiteSpace(vm.MemoryAllocatedMb)); - } -} diff --git a/tests/PdfEditorApp.Tests/PageOrganizerServiceTests.cs b/tests/PdfEditorApp.Tests/PageOrganizerServiceTests.cs deleted file mode 100644 index b17a374..0000000 --- a/tests/PdfEditorApp.Tests/PageOrganizerServiceTests.cs +++ /dev/null @@ -1,196 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; -using PdfEditorApp.Models; -using PdfEditorApp.Services; -using PdfEditorApp.ViewModels; -using Xunit; - -namespace PdfEditorApp.Tests; - -public class PageOrganizerServiceTests -{ - private static PdfDocumentModel CreateTestDoc(int pageCount) - { - var doc = new PdfDocumentModel - { - Title = "Master_Contract.pdf", - Author = "Legal Department", - Subject = "Multi-party Agreement" - }; - - for (int i = 1; i <= pageCount; i++) - { - var page = new PdfPageModel - { - PageNumber = i, - Width = 800, - Height = 1131, - RotationAngle = 0 - }; - page.Elements.Add(new PdfTextElement - { - Text = $"Clause {i}.0 Content", - X = 50, - Y = 50, - Width = 200, - Height = 30 - }); - doc.Pages.Add(page); - } - - return doc; - } - - [Fact] - public void PageOrganizerService_SplitEveryNPages_SplitsCorrectly() - { - var service = new PageOrganizerService(); - var doc = CreateTestDoc(7); - - // Act: Split every 3 pages - var parts = service.SplitEveryNPages(doc, 3); - - // Assert: 3 parts (3 + 3 + 1) - Assert.Equal(3, parts.Count); - Assert.Equal(3, parts[0].Pages.Count); - Assert.Equal(3, parts[1].Pages.Count); - Assert.Single(parts[2].Pages); - - // Verify page renumbering in each split - Assert.Equal(1, parts[0].Pages[0].PageNumber); - Assert.Equal(2, parts[0].Pages[1].PageNumber); - Assert.Equal(3, parts[0].Pages[2].PageNumber); - - Assert.Equal(1, parts[1].Pages[0].PageNumber); - Assert.Equal(2, parts[1].Pages[1].PageNumber); - Assert.Equal(3, parts[1].Pages[2].PageNumber); - - Assert.Equal(1, parts[2].Pages[0].PageNumber); - - // Verify content preserved - Assert.Equal("Clause 1.0 Content", ((PdfTextElement)parts[0].Pages[0].Elements[0]).Text); - Assert.Equal("Clause 7.0 Content", ((PdfTextElement)parts[2].Pages[0].Elements[0]).Text); - } - - [Fact] - public void PageOrganizerService_SplitByRanges_PartitionsRanges() - { - var service = new PageOrganizerService(); - var doc = CreateTestDoc(6); - - // Act: Split by "1-2, 3-4, 5-6" - var parts = service.SplitByRanges(doc, "1-2, 3-4, 5-6"); - - // Assert - Assert.Equal(3, parts.Count); - Assert.All(parts, p => Assert.Equal(2, p.Pages.Count)); - Assert.Equal("Clause 3.0 Content", ((PdfTextElement)parts[1].Pages[0].Elements[0]).Text); - Assert.Equal("Clause 4.0 Content", ((PdfTextElement)parts[1].Pages[1].Elements[0]).Text); - } - - [Fact] - public void PageOrganizerService_ExtractPages_ExtractsSubset() - { - var service = new PageOrganizerService(); - var doc = CreateTestDoc(5); - - // Act: Extract page indexes 0, 2, 4 (Pages 1, 3, 5) - var extracted = service.ExtractPages(doc, new[] { 0, 2, 4 }); - - // Assert - Assert.Equal(3, extracted.Pages.Count); - Assert.Equal(1, extracted.Pages[0].PageNumber); - Assert.Equal(2, extracted.Pages[1].PageNumber); - Assert.Equal(3, extracted.Pages[2].PageNumber); - Assert.Equal("Clause 1.0 Content", ((PdfTextElement)extracted.Pages[0].Elements[0]).Text); - Assert.Equal("Clause 3.0 Content", ((PdfTextElement)extracted.Pages[1].Elements[0]).Text); - Assert.Equal("Clause 5.0 Content", ((PdfTextElement)extracted.Pages[2].Elements[0]).Text); - } - - [Fact] - public void PageOrganizerService_MergeDocuments_CombinesPagesAndRenumbers() - { - var service = new PageOrganizerService(); - var doc1 = CreateTestDoc(2); - var doc2 = CreateTestDoc(3); - - // Act - var merged = service.MergeDocuments(new[] { doc1, doc2 }, "Merged_Master.pdf"); - - // Assert - Assert.Equal(5, merged.Pages.Count); - for (int i = 0; i < 5; i++) - { - Assert.Equal(i + 1, merged.Pages[i].PageNumber); - } - Assert.Equal("Clause 1.0 Content", ((PdfTextElement)merged.Pages[0].Elements[0]).Text); - Assert.Equal("Clause 1.0 Content", ((PdfTextElement)merged.Pages[2].Elements[0]).Text); // from doc2 - } - - [Fact] - public void PageOrganizerService_BatchRotatePages_RotatesTargetPages() - { - var service = new PageOrganizerService(); - var doc = CreateTestDoc(4); - - // Act: Rotate even pages by 90 - int count = service.BatchRotatePages(doc, PageFilterTarget.EvenPages, 90); - - // Assert - Assert.Equal(2, count); - Assert.Equal(0, doc.Pages[0].RotationAngle); // Page 1 (odd) - Assert.Equal(90, doc.Pages[1].RotationAngle); // Page 2 (even) - Assert.Equal(0, doc.Pages[2].RotationAngle); // Page 3 (odd) - Assert.Equal(90, doc.Pages[3].RotationAngle); // Page 4 (even) - } - - [Fact] - public void PageOrganizerService_ParsePageRanges_ParsesComplexStrings() - { - var service = new PageOrganizerService(); - - var indexes = service.ParsePageRanges("1-3, 5, 7-8", 10); - Assert.Equal(new[] { 0, 1, 2, 4, 6, 7 }, indexes); - - var clamped = service.ParsePageRanges("1-20", 5); - Assert.Equal(new[] { 0, 1, 2, 3, 4 }, clamped); - } - - [Fact] - public void MainViewModel_ReorderPage_MovesAndMaintainsUndo() - { - // Arrange - var vm = new MainViewModel(); - while (vm.Pages.Count < 3) vm.AddPage(); - - var firstPage = vm.Pages[0]; - var secondPage = vm.Pages[1]; - var thirdPage = vm.Pages[2]; - - // Act - Move Page 1 (index 0) to Page 3 (index 2) - vm.ReorderPage(0, 2); - - // Assert - Order is now [secondPage, thirdPage, firstPage] - Assert.Same(secondPage, vm.Pages[0]); - Assert.Same(thirdPage, vm.Pages[1]); - Assert.Same(firstPage, vm.Pages[2]); - Assert.Equal(1, vm.Pages[0].PageNumber); - Assert.Equal(2, vm.Pages[1].PageNumber); - Assert.Equal(3, vm.Pages[2].PageNumber); - - // Act - Undo reorder - vm.UndoRedo.Undo(); - Assert.Same(firstPage, vm.Pages[0]); - Assert.Same(secondPage, vm.Pages[1]); - Assert.Same(thirdPage, vm.Pages[2]); - - // Act - Redo reorder - vm.UndoRedo.Redo(); - Assert.Same(secondPage, vm.Pages[0]); - Assert.Same(thirdPage, vm.Pages[1]); - Assert.Same(firstPage, vm.Pages[2]); - } -} diff --git a/tests/PdfEditorApp.Tests/PdfDeconstructionEngineTests.cs b/tests/PdfEditorApp.Tests/PdfDeconstructionEngineTests.cs deleted file mode 100644 index bcaf6d1..0000000 --- a/tests/PdfEditorApp.Tests/PdfDeconstructionEngineTests.cs +++ /dev/null @@ -1,213 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using Microsoft.Extensions.Logging.Abstractions; -using SkiaSharp; -using PdfEditorApp.Core.Deconstruction; -using PdfEditorApp.Core.Deconstruction.Extractors; -using PdfEditorApp.Core.Deconstruction.Utils; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; -using PdfEditorApp.Models; -using PdfEditorApp.ViewModels.ElementViewModels; -using Xunit; - -namespace PdfEditorApp.Tests; - -public class PdfDeconstructionEngineTests -{ - [Fact] - public void PdfImageElement_RawImageData_DoesNotAllocateBase64UntilAccessed() - { - byte[] dummyBytes = new byte[] { 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x01, 0x02 }; - var element = new PdfImageElement - { - ImageData = dummyBytes - }; - - // ImageData is set directly - Assert.NotNull(element.ImageData); - Assert.Equal(dummyBytes.Length, element.ImageData.Length); - - // Accessing Base64Data computes lazily - string? base64 = element.Base64Data; - Assert.NotNull(base64); - Assert.Equal(Convert.ToBase64String(dummyBytes), base64); - - // Cloning preserves ImageData - var clone = (PdfImageElement)element.Clone(); - Assert.NotNull(clone.ImageData); - Assert.Equal(dummyBytes, clone.ImageData); - } - - [Fact] - public void ImageElementViewModel_PrioritizesRawImageData_DirectBitmapLoad() - { - // 1. Create a 4x4 PNG in memory - using var bmp = new SKBitmap(4, 4, SKColorType.Rgba8888, SKAlphaType.Opaque); - using var canvas = new SKCanvas(bmp); - canvas.Clear(SKColors.CornflowerBlue); - using var img = SKImage.FromBitmap(bmp); - using var pngData = img.Encode(SKEncodedImageFormat.Png, 100); - byte[] pngBytes = pngData.ToArray(); - - var vm = new ImageElementViewModel(); - vm.ImageData = pngBytes; - - Assert.NotNull(vm.ImageData); - Assert.Equal(pngBytes.Length, vm.ImageData.Length); - - // Model roundtrip preserves raw bytes - var model = (PdfImageElement)vm.ToModel(); - Assert.NotNull(model.ImageData); - Assert.Equal(pngBytes.Length, model.ImageData.Length); - } - - [Fact] - public void ColorContrastHelper_CalculatesRelativeLuminanceAndContrastAccurately() - { - double whiteLum = ColorContrastHelper.GetRelativeLuminance("#FFFFFF"); - double blackLum = ColorContrastHelper.GetRelativeLuminance("#000000"); - - Assert.True(whiteLum > 0.99); - Assert.True(blackLum < 0.01); - - double maxContrast = ColorContrastHelper.GetContrastRatio("#000000", "#FFFFFF"); - Assert.True(maxContrast >= 20.0); // 21:1 ideal - - double lowContrast = ColorContrastHelper.GetContrastRatio("#FEFEFE", "#FFFFFF"); - Assert.True(lowContrast < 1.1); - } - - [Theory] - [InlineData("#FFFFFF", "#FFFFFF", "#0F172A")] // White on white -> flip to dark - [InlineData("#FEFEFE", "#FFFFFF", "#0F172A")] // Near white on white -> flip to dark - [InlineData("#FFFFFF", "#8B0000", "#FFFFFF")] // White on dark red -> keep white (contrast > 4.5) - [InlineData("#FFFFFF", "#0B192C", "#FFFFFF")] // White on dark navy -> keep white - [InlineData("#0F172A", "#0B192C", "#FFFFFF")] // Dark slate on dark navy -> flip to white - [InlineData("#000000", "#FFD700", "#000000")] // Black on gold -> keep black (high contrast) - public void ColorContrastHelper_EnsureLegibleContrast_HandlesArbitraryBackgroundColors( - string textHex, string bgHex, string expectedFinalColor) - { - string result = ColorContrastHelper.EnsureLegibleContrast(textHex, bgHex, minContrastRatio: 3.0); - Assert.Equal(expectedFinalColor, result); - } - - [Fact] - public void CmykColorConverter_ConvertsCmykToCalibratedRgbAccurately() - { - // 1. Pure Cyan (C=255, M=0, Y=0, K=0) -> R=0, G=255, B=255 - CmykColorConverter.ConvertCmykToRgb(255, 0, 0, 0, out byte rC, out byte gC, out byte bC); - Assert.Equal(0, rC); - Assert.Equal(255, gC); - Assert.Equal(255, bC); - - // 2. Pure Magenta (C=0, M=255, Y=0, K=0) -> R=255, G=0, B=255 - CmykColorConverter.ConvertCmykToRgb(0, 255, 0, 0, out byte rM, out byte gM, out byte bM); - Assert.Equal(255, rM); - Assert.Equal(0, gM); - Assert.Equal(255, bM); - - // 3. Pure Yellow (C=0, M=0, Y=255, K=0) -> R=255, G=255, B=0 - CmykColorConverter.ConvertCmykToRgb(0, 0, 255, 0, out byte rY, out byte gY, out byte bY); - Assert.Equal(255, rY); - Assert.Equal(255, gY); - Assert.Equal(0, bY); - - // 4. Pure Black (K=255) -> R=0, G=0, B=0 - CmykColorConverter.ConvertCmykToRgb(0, 0, 0, 255, out byte rK, out byte gK, out byte bK); - Assert.Equal(0, rK); - Assert.Equal(0, gK); - Assert.Equal(0, bK); - } - - [Fact] - public void PdfDeconstructionOptions_CustomThresholds_CanBeCustomizedAndPassed() - { - var options = new PdfDeconstructionOptions - { - PureScannedImageCoverageThreshold = 0.90, - MaxVectorShapesPerPage = 150, - GroupExcessVectorsAsSvg = true, - WatermarkOpacity = 0.20, - HighContrastDarkTextColor = "#1E293B" - }; - - Assert.Equal(0.90, options.PureScannedImageCoverageThreshold); - Assert.Equal(150, options.MaxVectorShapesPerPage); - Assert.True(options.GroupExcessVectorsAsSvg); - Assert.Equal(0.20, options.WatermarkOpacity); - Assert.Equal("#1E293B", options.HighContrastDarkTextColor); - } - - [Fact] - public void PdfTextExtractor_GroupContainersAndText_AssignsSharedGroupIdToContainedText() - { - var shape = new PdfShapeElement - { - X = 50, - Y = 50, - Width = 200, - Height = 100, - FillColorHex = "#F1F5F9" - }; - - var textInside = new PdfTextElement - { - X = 60, - Y = 60, - Width = 100, - Height = 20, - Text = "Inside Card" - }; - - var textOutside = new PdfTextElement - { - X = 350, - Y = 350, - Width = 100, - Height = 20, - Text = "Outside Card" - }; - - var shapes = new List { shape }; - var texts = new List { textInside, textOutside }; - - PdfTextExtractor.GroupContainersAndText(shapes, texts, PdfDeconstructionOptions.Default); - - Assert.NotNull(shape.GroupId); - Assert.Equal(shape.GroupId, textInside.GroupId); - Assert.Null(textOutside.GroupId); - } - - [Theory] - [InlineData(595.28, 841.89, PageFormat.A4)] - [InlineData(612.0, 792.0, PageFormat.Letter)] - [InlineData(612.0, 1008.0, PageFormat.Legal)] - [InlineData(841.89, 1190.55, PageFormat.A3)] - [InlineData(419.53, 595.28, PageFormat.A5)] - public void DeterminePageFormat_AccuratelyIdentifiesStandardPageFormats(double width, double height, PageFormat expected) - { - var result = PdfDeconstructionEngine.DeterminePageFormat(width, height); - Assert.Equal(expected, result); - } - - - [Fact] - public void ColorContrastHelper_TryParseRgb_ParsesHexVariantsCorrectly() - { - Assert.True(ColorContrastHelper.TryParseRgb("#FFF", out byte r1, out byte g1, out byte b1)); - Assert.Equal(255, r1); Assert.Equal(255, g1); Assert.Equal(255, b1); - - Assert.True(ColorContrastHelper.TryParseRgb("#123456", out byte r2, out byte g2, out byte b2)); - Assert.Equal(0x12, r2); Assert.Equal(0x34, g2); Assert.Equal(0x56, b2); - - Assert.True(ColorContrastHelper.TryParseRgb("#FF0F172A", out byte r3, out byte g3, out byte b3)); - Assert.Equal(0x0F, r3); Assert.Equal(0x17, g3); Assert.Equal(0x2A, b3); - - Assert.False(ColorContrastHelper.TryParseRgb("Transparent", out _, out _, out _)); - Assert.False(ColorContrastHelper.TryParseRgb(null, out _, out _, out _)); - } -} diff --git a/tests/PdfEditorApp.Tests/PdfEditorApp.Tests.csproj b/tests/PdfEditorApp.Tests/PdfEditorApp.Tests.csproj deleted file mode 100644 index 083d161..0000000 --- a/tests/PdfEditorApp.Tests/PdfEditorApp.Tests.csproj +++ /dev/null @@ -1,31 +0,0 @@ - - - - net10.0 - enable - enable - true - $(NoWarn);NU1901;NU1902;NU1903;NU1904 - false - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tests/PdfEditorApp.Tests/PdfEngineTests.cs b/tests/PdfEditorApp.Tests/PdfEngineTests.cs deleted file mode 100644 index dfda68b..0000000 --- a/tests/PdfEditorApp.Tests/PdfEngineTests.cs +++ /dev/null @@ -1,2044 +0,0 @@ -using System; -using System.IO; -using System.Text; -using System.Threading.Tasks; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; -using PdfEditorApp.Models; -using PdfEditorApp.Services; -using PdfEditorApp.Templates; -using PdfEditorApp.Templates.Events; -using PdfEditorApp.ViewModels; -using PdfEditorApp.ViewModels.ElementViewModels; -using Xunit; - -namespace PdfEditorApp.Tests; - -public class PdfEngineTests -{ - private readonly IPdfExportService _exportService = new PdfExportService(); - private readonly ITemplateService _templateService = new TemplateService(); - private readonly IProjectPersistenceService _persistenceService = new ProjectPersistenceService(); - - [Fact] - public void PdfPigSkiaRenderer_RendersPdfPagesToPngStreamsSuccessfully() - { - var model = _templateService.CreateInvoiceTemplate(); - byte[] pdfBytes = _exportService.GeneratePdfBytes(model); - using var doc = UglyToad.PdfPig.PdfDocument.Open(pdfBytes); - UglyToad.PdfPig.Rendering.Skia.PdfPigExtensions.AddSkiaPageFactory(doc); - - // 1. Direct SKPicture (Vector representation) - using var picture = UglyToad.PdfPig.Rendering.Skia.PdfPigExtensions.GetPageAsSKPicture(doc, 1); - Assert.NotNull(picture); - Assert.True(picture.CullRect.Width > 0); - Assert.True(picture.CullRect.Height > 0); - - // 2. Direct SKBitmap (Raw in-memory raster) - using var skBitmap = UglyToad.PdfPig.Rendering.Skia.PdfPigExtensions.GetPageAsSKBitmap(doc, 1, 2.5f, SkiaSharp.SKColors.White); - Assert.NotNull(skBitmap); - Assert.True(skBitmap.Width > 0); - Assert.True(skBitmap.Height > 0); - - // 3. Encoded PNG stream verification - using var image = SkiaSharp.SKImage.FromBitmap(skBitmap); - using var data = image.Encode(SkiaSharp.SKEncodedImageFormat.Png, 100); - Assert.NotNull(data); - Assert.True(data.Size > 0); - } - - [Fact] - public void GenerateAnnualReport_ProducesValidPdfBytes() - { - var model = _templateService.CreateAnnualReportTemplate(); - Assert.NotNull(model); - Assert.Equal(3, model.Pages.Count); - - byte[] pdfBytes = _exportService.GeneratePdfBytes(model); - Assert.NotNull(pdfBytes); - Assert.True(pdfBytes.Length > 1000); - - string header = Encoding.ASCII.GetString(pdfBytes, 0, 5); - Assert.Equal("%PDF-", header); - - // Deconstruct the exported Annual Report PDF back into editable model - var importedDoc = PdfEditorApp.Core.Deconstruction.PdfDeconstructionEngine.Deconstruct(pdfBytes, "Annual Report"); - Assert.NotNull(importedDoc); - Assert.Equal(3, importedDoc.Pages.Count); - - for (int pIdx = 0; pIdx < importedDoc.Pages.Count; pIdx++) - { - var origPage = model.Pages[pIdx]; - var impPage = importedDoc.Pages[pIdx]; - Console.WriteLine($"=== PAGE {pIdx + 1} COMPARISON ==="); - Console.WriteLine($"ORIGINAL: {origPage.Elements.Count} elements: {string.Join(", ", origPage.Elements.GroupBy(e => e.GetType().Name).Select(g => $"{g.Key}={g.Count()}"))}"); - Console.WriteLine($"IMPORTED: {impPage.Elements.Count} elements: {string.Join(", ", impPage.Elements.GroupBy(e => e.GetType().Name).Select(g => $"{g.Key}={g.Count()}"))}"); - - // Look for missing high-level constructs or broken items - foreach (var origEl in origPage.Elements) - { - if (origEl is PdfTableElement table) - { - Console.WriteLine($" [ORIGINAL TABLE] X={table.X}, Y={table.Y}, Rows={table.Rows.Count}, Cols={table.Headers.Count}"); - } - else if (origEl is PdfChartElement chart) - { - Console.WriteLine($" [ORIGINAL CHART] X={chart.X}, Y={chart.Y}, Type={chart.ChartType}, Title={chart.Title}"); - } - else if (origEl is PdfQrCodeElement qr) - { - Console.WriteLine($" [ORIGINAL QR] X={qr.X}, Y={qr.Y}, Size={qr.Width}x{qr.Height}"); - } - } - } - } - - [Fact] - public void GenerateInvoice_ProducesValidPdfBytes() - { - var model = _templateService.CreateInvoiceTemplate(); - Assert.NotNull(model); - Assert.Single(model.Pages); - - byte[] pdfBytes = _exportService.GeneratePdfBytes(model); - Assert.NotNull(pdfBytes); - Assert.True(pdfBytes.Length > 500); - - string header = Encoding.ASCII.GetString(pdfBytes, 0, 5); - Assert.Equal("%PDF-", header); - } - - [Fact] - public void GenerateResume_ProducesValidPdfBytes() - { - var model = _templateService.CreateResumeTemplate(); - Assert.NotNull(model); - Assert.Single(model.Pages); - Assert.Equal("John_Doe_Executive_Resume.pdf", model.Title); - - var page = model.Pages[0]; - Assert.NotEmpty(page.Elements); - Assert.True(page.Elements.Count >= 25, "Professional resume should have comprehensive sections and elements"); - - // Verify presence of QR code, avatar badge, dividers, and rich text sections - Assert.Contains(page.Elements, e => e is PdfQrCodeElement); - Assert.Contains(page.Elements, e => e is PdfShapeElement shape && shape.Label == "JD"); - Assert.Contains(page.Elements, e => e is PdfDividerElement); - Assert.Contains(page.Elements, e => e is PdfTextElement text && text.Text.Contains("JOHN DOE")); - Assert.Contains(page.Elements, e => e is PdfTextElement text && text.Text.Contains("EXECUTIVE SUMMARY")); - Assert.Contains(page.Elements, e => e is PdfTextElement text && text.Text.Contains("PROFESSIONAL EXPERIENCE")); - Assert.Contains(page.Elements, e => e is PdfTextElement text && text.Text.Contains("EDUCATION & PROFESSIONAL CREDENTIALS")); - Assert.Contains(page.Elements, e => e is PdfTextElement text && text.Text.Contains("NOTABLE PROJECTS")); - - byte[] pdfBytes = _exportService.GeneratePdfBytes(model); - Assert.NotNull(pdfBytes); - Assert.True(pdfBytes.Length > 2000, "Rich PDF byte stream should be substantial"); - - string header = Encoding.ASCII.GetString(pdfBytes, 0, 5); - Assert.Equal("%PDF-", header); - } - - [Fact] - public void GenerateAcademicPaperAndCertificate_ProducesValidPdfBytes() - { - var paper = _templateService.CreateAcademicPaperTemplate(); - Assert.NotNull(paper); - byte[] paperBytes = _exportService.GeneratePdfBytes(paper); - Assert.NotNull(paperBytes); - Assert.Equal("%PDF-", Encoding.ASCII.GetString(paperBytes, 0, 5)); - - var cert = _templateService.CreateCertificateTemplate(); - Assert.NotNull(cert); - byte[] certBytes = _exportService.GeneratePdfBytes(cert); - Assert.NotNull(certBytes); - Assert.Equal("%PDF-", Encoding.ASCII.GetString(certBytes, 0, 5)); - } - - [Fact] - public void AllRegisteredTemplates_GenerateValidPdfDocumentsAndByteStreams() - { - var templates = _templateService.GetAllTemplates(); - Assert.True(templates.Count >= 18, $"Expected at least 18 templates, found {templates.Count}"); - - foreach (var def in templates) - { - var doc = def.Create(); - Assert.NotNull(doc); - Assert.NotEmpty(doc.Title); - Assert.NotEmpty(doc.Pages); - - var page = doc.Pages[0]; - if (def.Id != "" && def.Id != "blank") // Non-blank template - { - Assert.True(page.Elements.Count >= 3, $"Template '{def.Name}' ({def.Id}) should have at least 3 elements, found {page.Elements.Count}"); - } - - byte[] bytes = _exportService.GeneratePdfBytes(doc); - Assert.NotNull(bytes); - Assert.True(bytes.Length > 500, $"Generated PDF for '{def.Name}' should have non-trivial size"); - Assert.Equal("%PDF-", Encoding.ASCII.GetString(bytes, 0, 5)); - } - } - - [Fact] - public void ResumeTemplates_AllFourTypes_GenerateRichContent() - { - var executive = _templateService.CreateResumeTemplate(); - var modern = _templateService.CreateResumeModernCleanTemplate(); - var creative = _templateService.CreateResumeCreativeMinimalistTemplate(); - var academicCv = _templateService.CreateResumeAcademicCvTemplate(); - - Assert.NotNull(executive); - Assert.NotNull(modern); - Assert.NotNull(creative); - Assert.NotNull(academicCv); - - // Modern Clean tech resume checks - Assert.Contains(modern.Pages[0].Elements, e => e is PdfTextElement t && t.Text.Contains("JOHN DOE")); - Assert.Contains(modern.Pages[0].Elements, e => e is PdfQrCodeElement qr && qr.Content.Contains("github.com/codefrydev")); - - // Creative UI/UX resume checks - Assert.Contains(creative.Pages[0].Elements, e => e is PdfTextElement t && t.Text.Contains("JANE DOE")); - Assert.Contains(creative.Pages[0].Elements, e => e is PdfQrCodeElement qr && qr.Content.Contains("codefrydev.in")); - - // Academic CV checks - Assert.Contains(academicCv.Pages[0].Elements, e => e is PdfTextElement t && t.Text.Contains("JOHN DOE")); - Assert.Contains(academicCv.Pages[0].Elements, e => e is PdfTableElement tbl && tbl.Headers.Contains("Total Amount")); - Assert.Contains(academicCv.Pages[0].Elements, e => e is PdfQrCodeElement qr && qr.Content.Contains("orcid.org")); - } - - [Fact] - public void ResearchPaperTemplates_AllFourTypes_GenerateRichContent() - { - var cs = _templateService.CreateAcademicPaperTemplate(); - var math = _templateService.CreateMathResearchPaperTemplate(); - var physics = _templateService.CreatePhysicsResearchPaperTemplate(); - var history = _templateService.CreateHistoryResearchPaperTemplate(); - var finance = _templateService.CreateFinanceResearchPaperTemplate(); - - Assert.NotNull(cs); - Assert.NotNull(math); - Assert.NotNull(physics); - Assert.NotNull(history); - Assert.NotNull(finance); - - // Mathematics paper checks - Assert.Contains(math.Pages[0].Elements, e => e is PdfTextElement t && t.Text.Contains("Discrete Hodge")); - Assert.Contains(math.Pages[0].Elements, e => e is PdfTableElement tbl && tbl.Headers.Contains("β₁(M)")); - - // Physics paper checks - Assert.Contains(physics.Pages[0].Elements, e => e is PdfTextElement t && t.Text.Contains("Cavity Quantum Electrodynamics")); - Assert.Contains(physics.Pages[0].Elements, e => e is PdfTableElement tbl && tbl.Headers.Contains("T₁ (μs)")); - - // History paper checks - Assert.Contains(history.Pages[0].Elements, e => e is PdfTextElement t && t.Text.Contains("Maritime Trade Networks")); - Assert.Contains(history.Pages[0].Elements, e => e is PdfTableElement tbl && tbl.Headers.Contains("Gold Flow (Ducats)")); - - // Finance paper checks - Assert.Contains(finance.Pages[0].Elements, e => e is PdfTextElement t && t.Text.Contains("Multi-Factor Jump-Diffusion")); - Assert.Contains(finance.Pages[0].Elements, e => e is PdfTableElement tbl && tbl.Headers.Contains("Max DD")); - } - - [Fact] - public async Task ProjectPersistence_RoundTripMatches() - { - var original = _templateService.CreateAnnualReportTemplate(); - string tempPath = Path.Combine(Path.GetTempPath(), $"test_project_{Guid.NewGuid():N}.frypdf"); - - try - { - await _persistenceService.SaveProjectAsync(original, tempPath); - Assert.True(File.Exists(tempPath)); - - var loaded = await _persistenceService.LoadProjectAsync(tempPath); - Assert.NotNull(loaded); - Assert.Equal(original.Title, loaded.Title); - Assert.Equal(original.Pages.Count, loaded.Pages.Count); - Assert.Equal(original.Pages[0].Elements.Count, loaded.Pages[0].Elements.Count); - } - finally - { - if (File.Exists(tempPath)) File.Delete(tempPath); - } - } - - [Fact] - public void UndoRedo_StackOperations_FunctionCorrectly() - { - var undoRedo = new UndoRedoService(); - int val = 0; - - Assert.False(undoRedo.CanUndo); - Assert.False(undoRedo.CanRedo); - - undoRedo.RecordAction("Increment", () => val = 0, () => val = 10); - val = 10; - Assert.True(undoRedo.CanUndo); - Assert.False(undoRedo.CanRedo); - - undoRedo.Undo(); - Assert.Equal(0, val); - Assert.False(undoRedo.CanUndo); - Assert.True(undoRedo.CanRedo); - - undoRedo.Redo(); - Assert.Equal(10, val); - Assert.True(undoRedo.CanUndo); - Assert.False(undoRedo.CanRedo); - } - - [Fact] - public void MainViewModel_FullFeatureSuite_WorksCorrectly() - { - var vm = new MainViewModel(_exportService, _templateService, _persistenceService); - Assert.Equal(3, vm.Pages.Count); - Assert.NotNull(vm.CurrentPage); - - // Add page - vm.AddPageCommand.Execute(null); - Assert.Equal(4, vm.Pages.Count); - - // Test Element Additions - int initialCount = vm.CurrentPage.Elements.Count; - vm.AddTextElementCommand.Execute(null); - vm.AddHeadingElementCommand.Execute(null); - vm.AddShapeElementCommand.Execute("Circle"); - vm.AddTableElementCommand.Execute(null); - vm.AddChartElementCommand.Execute(null); - vm.AddWatermarkElementCommand.Execute(null); - vm.AddStampElementCommand.Execute("Approved"); - vm.AddStickyNoteElementCommand.Execute(null); - - Assert.Equal(initialCount + 8, vm.CurrentPage.Elements.Count); - - // Clipboard Copy & Paste & Duplicate - vm.CopyCommand.Execute(null); - vm.PasteCommand.Execute(null); - Assert.Equal(initialCount + 9, vm.CurrentPage.Elements.Count); - - vm.DuplicateCommand.Execute(null); - Assert.Equal(initialCount + 10, vm.CurrentPage.Elements.Count); - - // Reordering & Rotation - int rotation = vm.CurrentPage.RotationAngle; - vm.RotateCurrentPageCommand.Execute(null); - Assert.Equal((rotation + 90) % 360, vm.CurrentPage.RotationAngle); - - vm.RotateCurrentPageCounterClockwiseCommand.Execute(null); - Assert.Equal(rotation, vm.CurrentPage.RotationAngle); - } - - [Fact] - public void GeneratePdf_WithAllAcroFormsAndVisualElements_Succeeds() - { - var doc = new PdfDocumentModel { Title = "Adobe Acrobat Pro Replacement Test Document" }; - var page = new PdfPageModel { PageNumber = 1, Width = 800, Height = 1100, ShowHeaderFooter = true }; - - page.Elements.Add(new PdfFormFieldElement - { - FieldType = FormFieldType.Text, - Label = "Candidate Name:", - Placeholder = "Jane Doe" - }); - - page.Elements.Add(new PdfFormFieldElement - { - FieldType = FormFieldType.Checkbox, - Label = "NDA Signed", - IsChecked = true - }); - - page.Elements.Add(new PdfFormFieldElement - { - FieldType = FormFieldType.Signature, - Label = "Authorized Signatory", - Value = "John Hancock" - }); - - page.Elements.Add(new PdfQrCodeElement - { - Content = "https://github.com/PrashantUnity/PDFCreator", - Label = "VERIFICATION QR" - }); - - page.Elements.Add(new PdfBarcodeElement - { - CodeValue = "DOC-998822", - ShowText = true - }); - - page.Elements.Add(new PdfRedactionElement - { - ExemptionCode = "[REDACTED - (b)(4)]" - }); - - page.Elements.Add(new PdfInkElement - { - IsHighlighter = true, - StrokeThickness = 8 - }); - - page.Elements.Add(new PdfStickyNoteElement - { - Author = "Lead Counsel", - NoteText = "Approved for filing." - }); - - doc.Pages.Add(page); - - byte[] bytes = _exportService.GeneratePdfBytes(doc); - Assert.NotNull(bytes); - Assert.True(bytes.Length > 800); - Assert.Equal("%PDF-", Encoding.ASCII.GetString(bytes, 0, 5)); - } - - [Fact] - public void BatesNumbering_AppliesSequentialCodesAcrossPages() - { - var vm = new MainViewModel(_exportService, _templateService, _persistenceService); - Assert.True(vm.Pages.Count >= 3); - - vm.ApplyBatesNumberingCommand.Execute(null); - - Assert.Equal("CONF-BATES-000001", vm.Pages[0].FooterLeft); - Assert.Equal("CONF-BATES-000002", vm.Pages[1].FooterLeft); - Assert.Equal("CONF-BATES-000003", vm.Pages[2].FooterLeft); - } - - [Fact] - public void ExpandedCharts_And_Shapes_Generate_ValidPdf() - { - var doc = new PdfDocumentModel { Title = "Multi-Chart & Multi-Shape Showcase" }; - var page = new PdfPageModel { PageNumber = 1, Width = 800, Height = 1100 }; - - // Test Horizontal Bar, Donut Pie, and Column Charts - page.Elements.Add(new PdfChartElement - { - Title = "Departmental Efficiency", - ChartType = ChartType.HorizontalBar, - Categories = new System.Collections.Generic.List { "Dev", "QA", "Sales" }, - Values = new System.Collections.Generic.List { 8.5, 7.2, 9.1 }, - ValueLabels = new System.Collections.Generic.List { "85%", "72%", "91%" } - }); - - page.Elements.Add(new PdfChartElement - { - Title = "Budget Allocation", - ChartType = ChartType.DonutPie, - Categories = new System.Collections.Generic.List { "Engineering", "Marketing", "Legal" }, - Values = new System.Collections.Generic.List { 50, 30, 20 }, - ValueLabels = new System.Collections.Generic.List { "$5M", "$3M", "$2M" } - }); - - // Test Shapes - page.Elements.Add(new PdfShapeElement - { - ShapeType = ShapeType.Star5, - FillColorHex = "#F59E0B" - }); - - page.Elements.Add(new PdfShapeElement - { - ShapeType = ShapeType.Heart, - FillColorHex = "#DC2626" - }); - - doc.Pages.Add(page); - - byte[] pdf = _exportService.GeneratePdfBytes(doc); - Assert.NotNull(pdf); - Assert.Equal("%PDF-", Encoding.ASCII.GetString(pdf, 0, 5)); - } - - [Fact] - public void TablePresets_And_BarcodeFormats_ApplyCorrectly() - { - var tableVm = new PdfEditorApp.ViewModels.ElementViewModels.TableElementViewModel(); - tableVm.ApplyPresetStyleCommand.Execute("EnterpriseBlue"); - Assert.Equal("#0F6CBD", tableVm.HeaderBackgroundHex); - Assert.Equal("#F0F7FD", tableVm.AlternateRowBackgroundHex); - - tableVm.ApplyPresetStyleCommand.Execute("DarkModeSlate"); - Assert.Equal("#1E293B", tableVm.HeaderBackgroundHex); - - var barcodeVm = new PdfEditorApp.ViewModels.ElementViewModels.BarcodeElementViewModel(); - barcodeVm.SetFormatCommand.Execute("Ean13"); - Assert.Equal("Ean13", barcodeVm.BarcodeFormat); - - barcodeVm.SetFormatCommand.Execute("Pdf417"); - Assert.Equal("Pdf417", barcodeVm.BarcodeFormat); - } - - [Fact] - public void QrCodePresets_ApplyAccuratePayloads() - { - var qrVm = new PdfEditorApp.ViewModels.ElementViewModels.QrCodeElementViewModel(); - qrVm.ApplyPresetTypeCommand.Execute("Wifi"); - Assert.Contains("WIFI:S:", qrVm.Content); - Assert.Equal("SCAN TO CONNECT WI-FI", qrVm.Label); - - qrVm.ApplyPresetTypeCommand.Execute("VCard"); - Assert.Contains("BEGIN:VCARD", qrVm.Content); - - qrVm.ApplyPresetTypeCommand.Execute("PhoneCall"); - Assert.StartsWith("tel:", qrVm.Content); - - qrVm.ApplyPresetTypeCommand.Execute("Sms"); - Assert.StartsWith("SMSTO:", qrVm.Content); - - qrVm.ApplyPresetTypeCommand.Execute("CryptoAddress"); - Assert.StartsWith("bitcoin:", qrVm.Content); - - qrVm.ApplyPresetTypeCommand.Execute("EventCalendar"); - Assert.Contains("BEGIN:VEVENT", qrVm.Content); - } - - [Fact] - public void QrCodeHelper_GeneratesValidPngAndAvaloniaBitmapWithCustomColorsAndEcc() - { - // 1. Generate PNG bytes with custom colors - byte[] pngBytes = QrCodeHelper.GeneratePngBytes( - "https://github.com/PrashantUnity/PDFCreator", - darkHex: "#0F6CBD", - lightHex: "#EFF6FF", - ecc: QrCodeEccLevel.H, - pixelsPerModule: 12, - drawQuietZones: true); - - Assert.NotNull(pngBytes); - Assert.True(pngBytes.Length > 100); - // Verify PNG magic signature: 0x89, 'P', 'N', 'G' - Assert.Equal(0x89, pngBytes[0]); - Assert.Equal((byte)'P', pngBytes[1]); - Assert.Equal((byte)'N', pngBytes[2]); - Assert.Equal((byte)'G', pngBytes[3]); - - // 2. Generate PNG bytes with custom wifi and error correction - byte[] wifiBytes = QrCodeHelper.GeneratePngBytes( - "WIFI:S:TestNetwork;T:WPA2;P:Secret123;;", - darkHex: "#990000", - lightHex: "#FFFFFF", - ecc: QrCodeEccLevel.Q); - - Assert.NotNull(wifiBytes); - Assert.True(wifiBytes.Length > 100); - Assert.Equal(0x89, wifiBytes[0]); - } - - [Fact] - public void QrCodeElementViewModel_LiveBitmapUpdates_OnPropertyChanged() - { - var vm = new PdfEditorApp.ViewModels.ElementViewModels.QrCodeElementViewModel(); - Assert.NotNull(vm.QrPngBytes); - Assert.True(vm.QrPngBytes.Length > 0); - - vm.Content = "https://codefrydev.in/docs"; - Assert.NotNull(vm.QrPngBytes); - - vm.DarkColorHex = "#16A34A"; - Assert.NotNull(vm.QrPngBytes); - - vm.EccLevel = QrCodeEccLevel.H; - Assert.NotNull(vm.QrPngBytes); - } - - [Fact] - public void Typography_FontFamilyAndSize_SynchronizesWithInspector() - { - var textEl = new PdfEditorApp.ViewModels.ElementViewModels.TextElementViewModel - { - FontFamily = "Georgia", - FontSize = 24, - IsBold = true, - IsItalic = true, - IsUnderline = true - }; - - var page = new PageViewModel(); - page.AddElement(textEl); - - var inspector = new InspectorViewModel(); - inspector.UpdateSelection(textEl, page); - - Assert.Equal("Georgia", inspector.SelectedFontFamily); - Assert.Equal(24, inspector.SelectedFontSize); - - inspector.SelectedFontFamily = "Roboto"; - Assert.Equal("Roboto", textEl.FontFamily); - - inspector.SelectedFontSize = 32; - Assert.Equal(32, textEl.FontSize); - - inspector.ToggleBoldCommand.Execute(null); - Assert.False(textEl.IsBold); - - inspector.ToggleItalicCommand.Execute(null); - Assert.False(textEl.IsItalic); - - inspector.ToggleUnderlineCommand.Execute(null); - Assert.False(textEl.IsUnderline); - } - - [Fact] - public void All21ShapeTypes_ProduceValidVectorPaths() - { - var shapeVm = new PdfEditorApp.ViewModels.ElementViewModels.ShapeElementViewModel - { - Width = 100, - Height = 100, - CornerRadius = 12 - }; - - foreach (ShapeType shapeType in Enum.GetValues()) - { - shapeVm.ShapeType = shapeType; - string path = shapeVm.PathData; - Assert.False(string.IsNullOrWhiteSpace(path), $"PathData for {shapeType} should not be empty"); - Assert.StartsWith("M", path); - } - } - - [Fact] - public void All13ChartTypes_PropertiesAndPersistence_Work() - { - var chartVm = new PdfEditorApp.ViewModels.ElementViewModels.ChartElementViewModel(); - - foreach (ChartType chartType in Enum.GetValues()) - { - chartVm.SetChartTypeCommand.Execute(chartType.ToString()); - Assert.Equal(chartType, chartVm.ChartType); - - var model = chartVm.ToModel() as PdfChartElement; - Assert.NotNull(model); - Assert.Equal(chartType, model.ChartType); - - var roundtripVm = new PdfEditorApp.ViewModels.ElementViewModels.ChartElementViewModel(); - roundtripVm.LoadFromModel(model); - Assert.Equal(chartType, roundtripVm.ChartType); - } - } - [Fact] - public void LiveCharts2_HeadlessSkiaRendering_AllChartTypes_Work() - { - foreach (ChartType chartType in Enum.GetValues()) - { - var chartEl = new PdfChartElement - { - Title = $"Test {chartType}", - ChartType = chartType, - Categories = new List { "Q1", "Q2", "Q3", "Q4" }, - Values = new List { 12, 19, 3, 25 }, - ValueLabels = new List { "$12M", "$19M", "$3M", "$25M" }, - Palette = ChartPalette.CyberNeon, - LegendPosition = ChartLegendPosition.Top, - ShowDataLabels = true, - ShowGridlines = true - }; - - byte[] pngBytes = PdfEditorApp.Core.Analysis.LiveChartsRenderer.RenderChartToPngBytes(chartEl, width: 400, height: 250); - Assert.NotNull(pngBytes); - Assert.NotEmpty(pngBytes); - Assert.True(pngBytes.Length > 100); - } - } - - [Fact] - public void LiveCharts2_MultiSeries_CartesianRendering_Works() - { - var chartEl = new PdfChartElement - { - Title = "2025 vs 2026 Sales Comparison", - ChartType = ChartType.BarColumn, - Categories = new List { "North", "South", "East", "West" }, - Palette = ChartPalette.CorporateBlue, - LegendPosition = ChartLegendPosition.Top, - MultiSeries = new List - { - new() { Name = "2025 Actual", Values = new List { 120, 150, 180, 200 }, ColorHex = "#82BDF0" }, - new() { Name = "2026 Target", Values = new List { 140, 175, 210, 240 }, ColorHex = "#0F6CBD" } - } - }; - - byte[] pngBytes = PdfEditorApp.Core.Analysis.LiveChartsRenderer.RenderChartToPngBytes(chartEl, width: 500, height: 300); - Assert.NotNull(pngBytes); - Assert.NotEmpty(pngBytes); - Assert.True(pngBytes.Length > 200); - } - - [Fact] - public void LiveCharts2_AllPalettes_RenderSuccessfully() - { - foreach (ChartPalette palette in Enum.GetValues()) - { - var colors = PdfEditorApp.Core.Analysis.LiveChartsRenderer.GetPaletteHexColors(palette); - Assert.NotEmpty(colors); - Assert.True(colors.Count >= 4); - - var chartEl = new PdfChartElement - { - Title = $"Palette {palette}", - ChartType = ChartType.SmoothLine, - Palette = palette, - Categories = new List { "Jan", "Feb", "Mar", "Apr" }, - Values = new List { 50, 65, 80, 95 } - }; - - byte[] pngBytes = PdfEditorApp.Core.Analysis.LiveChartsRenderer.RenderChartToPngBytes(chartEl, 300, 200); - Assert.NotEmpty(pngBytes); - } - } - - [Fact] - public void LiveCharts2_ChartElementViewModel_ReactiveUpdates_Work() - { - var vm = new PdfEditorApp.ViewModels.ElementViewModels.ChartElementViewModel(); - Assert.NotNull(vm.CartesianSeries); - Assert.NotEmpty(vm.CartesianSeries); - - // Change palette - vm.SetPaletteCommand.Execute("EmeraldGreen"); - Assert.Equal(ChartPalette.EmeraldGreen, vm.Palette); - - // Change legend position - vm.SetLegendPositionCommand.Execute("Right"); - Assert.Equal(ChartLegendPosition.Right, vm.LegendPosition); - Assert.Equal(LiveChartsCore.Measure.LegendPosition.Right, vm.LiveLegendPosition); - - // Switch to DonutPie - vm.SetChartTypeCommand.Execute("DonutPie"); - Assert.Equal(ChartType.DonutPie, vm.ChartType); - Assert.True(vm.IsDonutPie); - Assert.True(vm.IsPieChart); - Assert.False(vm.IsCartesianChart); - Assert.NotEmpty(vm.PieSeries); - - // Switch to Radar - vm.SetChartTypeCommand.Execute("Radar"); - Assert.Equal(ChartType.Radar, vm.ChartType); - Assert.True(vm.IsRadar); - Assert.True(vm.IsPolarChart); - Assert.NotEmpty(vm.PolarSeries); - - // Add and Remove Data points - int initialBars = vm.Bars.Count; - vm.AddDataPointCommand.Execute(null); - Assert.Equal(initialBars + 1, vm.Bars.Count); - - vm.RemoveDataPointCommand.Execute(null); - Assert.Equal(initialBars, vm.Bars.Count); - } - - [Fact] - public void LiveCharts2_PdfExport_ContainsRenderedChart() - { - var doc = new PdfDocumentModel - { - Pages = new List - { - new() - { - Width = 595, - Height = 842, - Elements = new List - { - new PdfChartElement - { - X = 50, - Y = 100, - Width = 495, - Height = 250, - Title = "Executive Financial Summary", - ChartType = ChartType.SmoothLine, - Palette = ChartPalette.CorporateBlue, - Categories = new List { "2023", "2024", "2025", "2026" }, - Values = new List { 12.5, 18.2, 24.8, 31.0 } - } - } - } - } - }; - - byte[] pdfBytes = _exportService.GeneratePdfBytes(doc); - Assert.NotNull(pdfBytes); - Assert.NotEmpty(pdfBytes); - Assert.True(pdfBytes.Length > 1000); - } - - [Fact] - public void FullElementDuplicationAndPaste_MaintainsCorrectTypes() - { - var vm = new MainViewModel(_exportService, _templateService, _persistenceService); - Assert.NotNull(vm.CurrentPage); - - // Add StickyNote - vm.AddStickyNoteElementCommand.Execute(null); - var sticky = vm.CurrentPage.SelectedElement; - Assert.IsType(sticky); - - // Copy and Paste - vm.CopyCommand.Execute(null); - vm.PasteCommand.Execute(null); - var pasted = vm.CurrentPage.SelectedElement; - Assert.IsType(pasted); - - // Add FormField - vm.AddFormFieldElementCommand.Execute("Signature"); - var formField = vm.CurrentPage.SelectedElement; - Assert.IsType(formField); - - // Duplicate - vm.DuplicateCommand.Execute(null); - var dupFormField = vm.CurrentPage.SelectedElement; - Assert.IsType(dupFormField); - - // Add Ink - vm.AddInkElementCommand.Execute("True"); - var ink = vm.CurrentPage.SelectedElement as PdfEditorApp.ViewModels.ElementViewModels.InkElementViewModel; - Assert.NotNull(ink); - Assert.True(ink.IsHighlighter); - - // Dialog close - vm.OpenNewDocumentDialogCommand.Execute(null); - Assert.True(vm.IsNewDocumentDialogOpen); - vm.CloseNewDocumentDialogCommand.Execute(null); - Assert.False(vm.IsNewDocumentDialogOpen); - } - - [Fact] - public void CommandPalette_IndexingAndFiltering_WorksAccurately() - { - var vm = new MainViewModel(_exportService, _templateService, _persistenceService); - Assert.NotEmpty(vm.AllPaletteCommands); - Assert.True(vm.AllPaletteCommands.Count >= 25); - - // Open palette - vm.OpenCommandPaletteCommand.Execute(null); - Assert.True(vm.IsCommandPaletteOpen); - Assert.Equal(vm.AllPaletteCommands.Count, vm.FilteredPaletteCommands.Count); - - // Search for "text" - vm.CommandSearchQuery = "text"; - Assert.NotEmpty(vm.FilteredPaletteCommands); - Assert.All(vm.FilteredPaletteCommands, item => - Assert.True(item.Title.Contains("text", StringComparison.OrdinalIgnoreCase) || - item.Subtitle.Contains("text", StringComparison.OrdinalIgnoreCase) || - item.Category.Contains("text", StringComparison.OrdinalIgnoreCase))); - - // Search for "save" - vm.CommandSearchQuery = "save"; - Assert.NotEmpty(vm.FilteredPaletteCommands); - Assert.Contains(vm.FilteredPaletteCommands, item => item.Title.Contains("Save", StringComparison.OrdinalIgnoreCase)); - - // Navigation - vm.SelectNextPaletteCommand(); - Assert.True(vm.SelectedPaletteIndex >= 0); - vm.SelectPreviousPaletteCommand(); - Assert.Equal(0, vm.SelectedPaletteIndex); - - // Close palette - vm.CloseCommandPalette(); - Assert.False(vm.IsCommandPaletteOpen); - } - - [Fact] - public void PageNavigation_NextPreviousFirstLast_NavigatesProperly() - { - var vm = new MainViewModel(_exportService, _templateService, _persistenceService); - Assert.Equal(3, vm.Pages.Count); - Assert.Equal(1, vm.CurrentPageNumber); - - // Next page - vm.NextPageCommand.Execute(null); - Assert.Equal(2, vm.CurrentPageNumber); - - // Next page - vm.NextPageCommand.Execute(null); - Assert.Equal(3, vm.CurrentPageNumber); - - // Next page at boundary (should remain at 3) - vm.NextPageCommand.Execute(null); - Assert.Equal(3, vm.CurrentPageNumber); - - // Previous page - vm.PreviousPageCommand.Execute(null); - Assert.Equal(2, vm.CurrentPageNumber); - - // First page - vm.FirstPageCommand.Execute(null); - Assert.Equal(1, vm.CurrentPageNumber); - - // Last page - vm.LastPageCommand.Execute(null); - Assert.Equal(3, vm.CurrentPageNumber); - } - - [Fact] - public void PageOperations_WithUndoRedo_WorkAccurately() - { - var vm = new MainViewModel(_exportService, _templateService, _persistenceService); - int initialPageCount = vm.Pages.Count; - - // Add page - vm.AddPageCommand.Execute(null); - Assert.Equal(initialPageCount + 1, vm.Pages.Count); - - // Undo add page - vm.UndoCommand.Execute(null); - Assert.Equal(initialPageCount, vm.Pages.Count); - - // Redo add page - vm.RedoCommand.Execute(null); - Assert.Equal(initialPageCount + 1, vm.Pages.Count); - - // Duplicate page - vm.DuplicateCurrentPageCommand.Execute(null); - Assert.Equal(initialPageCount + 2, vm.Pages.Count); - - // Undo duplicate - vm.UndoCommand.Execute(null); - Assert.Equal(initialPageCount + 1, vm.Pages.Count); - - // Rotate page with undo - int currentAngle = vm.CurrentPage!.RotationAngle; - vm.RotateCurrentPageCommand.Execute(null); - Assert.Equal((currentAngle + 90) % 360, vm.CurrentPage.RotationAngle); - - vm.UndoCommand.Execute(null); - Assert.Equal(currentAngle, vm.CurrentPage.RotationAngle); - - // Delete page with undo - int beforeDeleteCount = vm.Pages.Count; - vm.DeleteCurrentPageCommand.Execute(null); - Assert.Equal(beforeDeleteCount - 1, vm.Pages.Count); - - vm.UndoCommand.Execute(null); - Assert.Equal(beforeDeleteCount, vm.Pages.Count); - } - - [Fact] - public void ToastNotification_And_ShortcutsDialog_Work() - { - var vm = new MainViewModel(_exportService, _templateService, _persistenceService); - - // Show Toast - vm.ShowToast("Document saved successfully", "CheckCircleOutline"); - Assert.Equal("Document saved successfully", vm.ToastMessage); - Assert.Equal("CheckCircleOutline", vm.ToastIcon); - Assert.True(vm.IsToastVisible); - - // Shortcuts Dialog - vm.OpenShortcutsHelpCommand.Execute(null); - Assert.True(vm.IsShortcutsHelpDialogOpen); - - vm.CloseShortcutsHelpCommand.Execute(null); - Assert.False(vm.IsShortcutsHelpDialogOpen); - - // Tool Mode - vm.SetToolMode("Draw"); - Assert.Equal(ToolMode.Draw, vm.ActiveToolMode); - - vm.SetToolMode("Select"); - Assert.Equal(ToolMode.Select, vm.ActiveToolMode); - } - - [Fact] - public void UndoRedo_InspectorTypography_RevertsAndRedoes() - { - var vm = new MainViewModel(_exportService, _templateService, _persistenceService); - var page = vm.CurrentPage!; - - var textEl = new TextElementViewModel - { - Text = "Sample Headline", - FontFamily = "Segoe UI", - FontSize = 14, - IsBold = false, - TextColorHex = "#201F1E", - Alignment = TextAlignmentMode.Left - }; - page.AddElement(textEl); - vm.Inspector.UpdateSelection(textEl, page); - - // 1. Text Color change - vm.Inspector.SetTextColorCommand.Execute("#DC2626"); - Assert.Equal("#DC2626", textEl.TextColorHex); - Assert.Equal("Change Text Color", vm.UndoRedo.NextUndoDescription); - - vm.UndoCommand.Execute(null); - Assert.Equal("#201F1E", textEl.TextColorHex); - - vm.RedoCommand.Execute(null); - Assert.Equal("#DC2626", textEl.TextColorHex); - - // 2. Bold toggle - vm.Inspector.ToggleBoldCommand.Execute(null); - Assert.True(textEl.IsBold); - Assert.Equal("Format Bold", vm.UndoRedo.NextUndoDescription); - - vm.UndoCommand.Execute(null); - Assert.False(textEl.IsBold); - - vm.RedoCommand.Execute(null); - Assert.True(textEl.IsBold); - - // 3. Text Alignment - vm.Inspector.SetAlignmentCommand.Execute("Center"); - Assert.Equal(TextAlignmentMode.Center, textEl.Alignment); - - vm.UndoCommand.Execute(null); - Assert.Equal(TextAlignmentMode.Left, textEl.Alignment); - - vm.RedoCommand.Execute(null); - Assert.Equal(TextAlignmentMode.Center, textEl.Alignment); - } - - [Fact] - public void UndoRedo_InspectorShapeFormatting_RevertsAndRedoes() - { - var vm = new MainViewModel(_exportService, _templateService, _persistenceService); - var page = vm.CurrentPage!; - - var shapeEl = new ShapeElementViewModel - { - ShapeType = ShapeType.Rectangle, - FillColorHex = "#F0F7FD", - StrokeColorHex = "#0F6CBD" - }; - page.AddElement(shapeEl); - vm.Inspector.UpdateSelection(shapeEl, page); - - // Fill Color - vm.Inspector.SetShapeFillColorCommand.Execute("#16A34A"); - Assert.Equal("#16A34A", shapeEl.FillColorHex); - - vm.UndoCommand.Execute(null); - Assert.Equal("#F0F7FD", shapeEl.FillColorHex); - - vm.RedoCommand.Execute(null); - Assert.Equal("#16A34A", shapeEl.FillColorHex); - - // Stroke Color - vm.Inspector.SetShapeStrokeColorCommand.Execute("#EA580C"); - Assert.Equal("#EA580C", shapeEl.StrokeColorHex); - - vm.UndoCommand.Execute(null); - Assert.Equal("#0F6CBD", shapeEl.StrokeColorHex); - - vm.RedoCommand.Execute(null); - Assert.Equal("#EA580C", shapeEl.StrokeColorHex); - - // Shape Type - vm.Inspector.SetShapeTypeCommand.Execute("Circle"); - Assert.Equal(ShapeType.Circle, shapeEl.ShapeType); - - vm.UndoCommand.Execute(null); - Assert.Equal(ShapeType.Rectangle, shapeEl.ShapeType); - - vm.RedoCommand.Execute(null); - Assert.Equal(ShapeType.Circle, shapeEl.ShapeType); - } - - [Fact] - public void UndoRedo_InspectorAlignment_And_Layering_RevertsAndRedoes() - { - var vm = new MainViewModel(_exportService, _templateService, _persistenceService); - var page = vm.CurrentPage!; - - page.Elements.Clear(); - var bottomEl = new ShapeElementViewModel { X = 10, Y = 10 }; - var shapeEl = new ShapeElementViewModel - { - X = 200, - Y = 300, - Width = 100, - Height = 100 - }; - var topEl = new ShapeElementViewModel { X = 50, Y = 50 }; - page.AddElement(bottomEl); - page.AddElement(shapeEl); - page.AddElement(topEl); - vm.Inspector.UpdateSelection(shapeEl, page); - - // Align Left - vm.Inspector.AlignLeftCommand.Execute(null); - Assert.Equal(60, shapeEl.X); - - vm.UndoCommand.Execute(null); - Assert.Equal(200, shapeEl.X); - - vm.RedoCommand.Execute(null); - Assert.Equal(60, shapeEl.X); - - // Align Center - vm.Inspector.AlignCenterCommand.Execute(null); - double expectedCenter = (page.Width - shapeEl.Width) / 2; - Assert.Equal(expectedCenter, shapeEl.X); - - vm.UndoCommand.Execute(null); - Assert.Equal(60, shapeEl.X); - - // Layering Z-Order - int oldZ = shapeEl.ZIndex; - vm.Inspector.BringToFrontCommand.Execute(null); - Assert.True(shapeEl.ZIndex > oldZ); - Assert.Equal(page.Elements.Count - 1, page.Elements.IndexOf(shapeEl)); - - vm.UndoCommand.Execute(null); - Assert.Equal(oldZ, shapeEl.ZIndex); - Assert.Equal(1, page.Elements.IndexOf(shapeEl)); - - // Send to Back - vm.Inspector.SendToBackCommand.Execute(null); - Assert.Equal(1, shapeEl.ZIndex); - Assert.Equal(0, page.Elements.IndexOf(shapeEl)); - - vm.UndoCommand.Execute(null); - Assert.Equal(oldZ, shapeEl.ZIndex); - Assert.Equal(1, page.Elements.IndexOf(shapeEl)); - } - - [Fact] - public void UndoRedo_ElementDeleteAndDuplicate_WorksAccurately() - { - var vm = new MainViewModel(_exportService, _templateService, _persistenceService); - var page = vm.CurrentPage!; - int initialCount = page.Elements.Count; - - var textEl = new TextElementViewModel { Text = "Target Element" }; - page.AddElement(textEl); - Assert.Equal(initialCount + 1, page.Elements.Count); - - vm.Inspector.UpdateSelection(textEl, page); - - // Duplicate - vm.Inspector.DuplicateSelectedElementCommand.Execute(null); - Assert.Equal(initialCount + 2, page.Elements.Count); - - vm.UndoCommand.Execute(null); - Assert.Equal(initialCount + 1, page.Elements.Count); - - vm.RedoCommand.Execute(null); - Assert.Equal(initialCount + 2, page.Elements.Count); - - // Delete - vm.Inspector.DeleteSelectedElementCommand.Execute(null); - Assert.Equal(initialCount + 1, page.Elements.Count); - - vm.UndoCommand.Execute(null); - Assert.Equal(initialCount + 2, page.Elements.Count); - } - - [Fact] - public void SignatureService_GeneratesValidSignaturesAndInitials() - { - var sigService = new SignatureService(); - - var sig = sigService.CreateCursiveSignatureElement("Alexander Hamilton", SignatureStyle.CursiveElegance, 100, 200); - Assert.NotNull(sig); - Assert.Equal("Alexander Hamilton", sig.Text); - Assert.Equal("Georgia", sig.FontFamily); - Assert.True(sig.IsItalic); - - var dateStamp = sigService.CreateDateStampElement(100, 200); - Assert.NotNull(dateStamp); - Assert.Contains(DateTime.Now.Year.ToString(), dateStamp.Text); - - var initials = sigService.CreateInitialsElement("AH", 100, 200); - Assert.NotNull(initials); - Assert.Equal("AH", initials.Label); - Assert.Equal(ShapeType.Circle, initials.ShapeType); - - var checkmark = sigService.CreateMarkupBadge("✓", "#16A34A", 100, 200); - Assert.NotNull(checkmark); - Assert.Equal("✓", checkmark.Label); - } - - [Fact] - public void DocumentAuditService_EvaluatesHealthAndChecks() - { - var auditService = new DocumentAuditService(); - var doc = _templateService.CreateAnnualReportTemplate(); - - var report = auditService.RunAudit(doc); - Assert.NotNull(report); - Assert.True(report.HealthScore >= 70); - Assert.NotEmpty(report.Grade); - Assert.Equal(3, report.TotalPages); - Assert.True(report.TotalWordCount > 0); - Assert.NotEmpty(report.Issues); - } - - [Fact] - public void SecuritySettings_PasswordEncryptionAndPermissions_ExportPasses() - { - var doc = _templateService.CreateInvoiceTemplate(); - doc.SecuritySettings.IsPasswordProtected = true; - doc.SecuritySettings.OpenPassword = "SecurePassword123!"; - doc.SecuritySettings.AllowPrinting = true; - doc.SecuritySettings.AllowContentCopying = false; - doc.SecuritySettings.ScrubMetadataOnExport = true; - - byte[] pdfBytes = _exportService.GeneratePdfBytes(doc); - Assert.NotNull(pdfBytes); - Assert.True(pdfBytes.Length > 500); - Assert.Equal("%PDF-", Encoding.ASCII.GetString(pdfBytes, 0, 5)); - } - - [Fact] - public void DocumentSanitization_ClearsMetadataAndComments() - { - var vm = new MainViewModel(_exportService, _templateService, _persistenceService); - var page = vm.CurrentPage!; - page.AddElement(new StickyNoteElementViewModel { NoteText = "Internal confidential review comment" }); - - vm.SanitizeDocument(); - Assert.Equal("Anonymous", vm.DocumentAuthor); - Assert.Equal("", vm.DocumentSubject); - Assert.True(vm.SecuritySettings.ScrubMetadataOnExport); - Assert.True(vm.SecuritySettings.RemoveCommentsOnExport); - Assert.DoesNotContain(page.Elements, e => e is StickyNoteElementViewModel); - } - - [Fact] - public void Typography_StrikethroughAndTextCase_TransformationsWork() - { - var textVm = new TextElementViewModel { Text = "hello world acrobat suite" }; - - textVm.TransformUppercase(); - Assert.Equal("HELLO WORLD ACROBAT SUITE", textVm.Text); - - textVm.TransformTitleCase(); - Assert.Equal("Hello World Acrobat Suite", textVm.Text); - - textVm.TransformLowercase(); - Assert.Equal("hello world acrobat suite", textVm.Text); - - textVm.ToggleBulletList(); - Assert.StartsWith("• ", textVm.Text); - - textVm.ToggleNumberedList(); - Assert.StartsWith("1. ", textVm.Text); - - textVm.IsStrikethrough = true; - var model = (PdfTextElement)textVm.ToModel(); - Assert.True(model.IsStrikethrough); - } - - [Fact] - public void AcroForms_ValidationAndOptions_WorkCorrectly() - { - var formVm = new FormFieldElementViewModel - { - FieldType = FormFieldType.Dropdown, - FieldName = "StateProvince", - ValidationType = FormValidationType.CustomRegex, - CustomValidationRegex = @"^[A-Z]{2}$", - IsReadOnly = false, - IsRequired = true, - DefaultValue = "CA", - Tooltip = "Select 2-letter state code" - }; - formVm.Options.Clear(); - formVm.AddOption("NY"); - formVm.AddOption("TX"); - - Assert.Equal(2, formVm.Options.Count); - - var model = (PdfFormFieldElement)formVm.ToModel(); - Assert.Equal(FormFieldType.Dropdown, model.FieldType); - Assert.Equal("StateProvince", model.FieldName); - Assert.Equal(FormValidationType.CustomRegex, model.ValidationType); - Assert.Equal("CA", model.DefaultValue); - Assert.Equal(2, model.Options.Count); - } - - [Fact] - public void SmartDistribution_DistributesElementsEvenly() - { - var vm = new MainViewModel(_exportService, _templateService, _persistenceService); - var page = vm.CurrentPage!; - page.Elements.Clear(); - - var el1 = new ShapeElementViewModel { X = 0, Y = 100, Width = 50, Height = 50 }; - var el2 = new ShapeElementViewModel { X = 100, Y = 100, Width = 50, Height = 50 }; - var el3 = new ShapeElementViewModel { X = 300, Y = 100, Width = 50, Height = 50 }; - - page.AddElement(el1); - page.AddElement(el2); - page.AddElement(el3); - - vm.Inspector.UpdateSelection(el1, page); - vm.Inspector.DistributeHorizontally(); - - // Total span: 0 to 350 (width 350). Elements total width: 150. Remaining space: 200 / 2 = 100 gap. - // Expected X: el1 = 0, el2 = 150, el3 = 300. - Assert.Equal(0, el1.X); - Assert.Equal(150, el2.X); - Assert.Equal(300, el3.X); - } - - [Fact] - public void Inspector_TypographyAndTextDecorations_ReflectImmediately() - { - var vm = new MainViewModel(_exportService, _templateService, _persistenceService); - var page = vm.CurrentPage!; - var textEl = new TextElementViewModel { Text = "Sample Heading", FontSize = 16 }; - page.AddElement(textEl); - - vm.Inspector.UpdateSelection(textEl, page); - Assert.NotNull(vm.Inspector.TextElement); - - // Toggle Strikethrough and Underline - vm.Inspector.ToggleStrikethroughCommand.Execute(null); - Assert.True(textEl.IsStrikethrough); - Assert.NotNull(textEl.TextDecorations); - - vm.Inspector.ToggleUnderlineCommand.Execute(null); - Assert.True(textEl.IsUnderline); - Assert.NotNull(textEl.TextDecorations); - - // Change text color - vm.Inspector.SetTextColorCommand.Execute("#0F6CBD"); - Assert.Equal("#0F6CBD", textEl.TextColorHex); - - // Set alignment - vm.Inspector.SetAlignmentCommand.Execute("Center"); - Assert.Equal(TextAlignmentMode.Center, textEl.Alignment); - - // Switch Font Family - vm.Inspector.SelectedFontFamily = "Georgia"; - Assert.Equal("Georgia", textEl.FontFamily); - - vm.Inspector.SelectedFontFamily = "Roboto"; - Assert.Equal("Roboto", textEl.FontFamily); - Assert.NotNull(textEl.AvaloniaFontFamily); - - vm.Inspector.SelectedFontFamily = "Playfair Display"; - Assert.Equal("Playfair Display", textEl.FontFamily); - Assert.NotNull(textEl.AvaloniaFontFamily); - - vm.Inspector.SelectedFontFamily = "Dancing Script"; - Assert.Equal("Dancing Script", textEl.FontFamily); - Assert.NotNull(textEl.AvaloniaFontFamily); - - vm.Inspector.SelectedFontFamily = "Courier New"; - Assert.Equal("Courier New", textEl.FontFamily); - - vm.Inspector.SelectedFontFamily = "Impact"; - Assert.Equal("Impact", textEl.FontFamily); - - // Computed line height - textEl.LineHeight = 1.5; - Assert.Equal(16 * 1.5, textEl.ComputedLineHeight); - } - - [Fact] - public void Inspector_ShapeStylesAndLabels_ReflectImmediately() - { - var vm = new MainViewModel(_exportService, _templateService, _persistenceService); - var page = vm.CurrentPage!; - var shapeEl = new ShapeElementViewModel { Width = 120, Height = 60 }; - page.AddElement(shapeEl); - - vm.Inspector.UpdateSelection(shapeEl, page); - Assert.NotNull(vm.Inspector.ShapeElement); - - // Change shape type - vm.Inspector.SetShapeTypeCommand.Execute("Star4Badge"); - Assert.Equal(ShapeType.Star4Badge, shapeEl.ShapeType); - Assert.NotEmpty(shapeEl.PathData); - - // Set colors - vm.Inspector.SetShapeFillColorCommand.Execute("#16A34A"); - Assert.Equal("#16A34A", shapeEl.FillColorHex); - - vm.Inspector.SetShapeStrokeColorCommand.Execute("#DC2626"); - Assert.Equal("#DC2626", shapeEl.StrokeColorHex); - - // Set label - shapeEl.Label = "CERTIFIED"; - vm.Inspector.SetShapeLabelColorCommand.Execute("#FFFFFF"); - Assert.Equal("#FFFFFF", shapeEl.LabelColorHex); - } - - [Fact] - public void Inspector_AllElementColorsAndProperties_ReflectProperly() - { - var vm = new MainViewModel(_exportService, _templateService, _persistenceService); - var page = vm.CurrentPage!; - - // Divider - var divEl = new DividerElementViewModel(); - page.AddElement(divEl); - vm.Inspector.UpdateSelection(divEl, page); - vm.Inspector.SetDividerColorCommand.Execute("#EA580C"); - Assert.Equal("#EA580C", divEl.ColorHex); - - // Ink - var inkEl = new InkElementViewModel(); - page.AddElement(inkEl); - vm.Inspector.UpdateSelection(inkEl, page); - vm.Inspector.SetInkColorCommand.Execute("#7C3AED"); - Assert.Equal("#7C3AED", inkEl.StrokeColorHex); - - // Sticky note - var noteEl = new StickyNoteElementViewModel(); - page.AddElement(noteEl); - vm.Inspector.UpdateSelection(noteEl, page); - vm.Inspector.SetStickyNoteColorCommand.Execute("#DBEAFE"); - Assert.Equal("#DBEAFE", noteEl.ColorHex); - - // Redaction - var redEl = new RedactionElementViewModel(); - page.AddElement(redEl); - vm.Inspector.UpdateSelection(redEl, page); - vm.Inspector.SetRedactionFillColorCommand.Execute("#0F172A"); - Assert.Equal("#0F172A", redEl.FillColorHex); - - // Form field - var formEl = new FormFieldElementViewModel(); - page.AddElement(formEl); - vm.Inspector.UpdateSelection(formEl, page); - vm.Inspector.SetFormFieldTypeCommand.Execute("DatePicker"); - Assert.Equal(FormFieldType.DatePicker, formEl.FieldType); - vm.Inspector.SetFormFieldBorderColorCommand.Execute("#16A34A"); - Assert.Equal("#16A34A", formEl.BorderColorHex); - } - - [Fact] - public void DocumentCompareService_DetectsDifferences_BetweenRevisions() - { - var compareService = new DocumentCompareService(); - - var original = new PdfDocumentModel - { - Title = "Contract v1.0", - Pages = new System.Collections.Generic.List - { - new PdfPageModel - { - PageNumber = 1, - Elements = new System.Collections.Generic.List - { - new PdfTextElement { Id = "el-1", Text = "Initial Clause A", X = 50, Y = 50 }, - new PdfTextElement { Id = "el-2", Text = "Unchanged Clause B", X = 50, Y = 100 } - } - } - } - }; - - var modified = new PdfDocumentModel - { - Title = "Contract v2.0", - Pages = new System.Collections.Generic.List - { - new PdfPageModel - { - PageNumber = 1, - Elements = new System.Collections.Generic.List - { - new PdfTextElement { Id = "el-1", Text = "Amended Clause A (Updated)", X = 50, Y = 50 }, - new PdfTextElement { Id = "el-2", Text = "Unchanged Clause B", X = 50, Y = 100 }, - new PdfTextElement { Id = "el-3", Text = "Newly Added Clause C", X = 50, Y = 150 } - } - } - } - }; - - var report = compareService.CompareDocuments(original, modified); - - Assert.NotNull(report); - Assert.Equal(1, report.AdditionsCount); // el-3 added - Assert.Equal(1, report.ModificationsCount); // el-1 modified - Assert.Equal(0, report.DeletionsCount); - Assert.Contains(report.Differences, d => d.DiffType == CompareDiffType.ElementAdded && d.Description.Contains("Newly Added Clause C")); - Assert.Contains(report.Differences, d => d.DiffType == CompareDiffType.TextModified && d.OldValue == "Initial Clause A"); - } - - [Fact] - public void BatesNumbering_CustomPrefixAndPosition_AppliesAndRemovesCorrectly() - { - var vm = new MainViewModel(_exportService, _templateService, _persistenceService); - Assert.True(vm.Pages.Count >= 3); - - vm.BatesPrefix = "LEGAL-BATES-"; - vm.BatesStartingNumber = 101; - vm.BatesNumberOfDigits = 5; - vm.BatesPosition = BatesPosition.TopRight; - - vm.ApplyBatesNumberingCommand.Execute(null); - - Assert.Equal("LEGAL-BATES-00101", vm.Pages[0].HeaderRight); - Assert.Equal("LEGAL-BATES-00102", vm.Pages[1].HeaderRight); - Assert.Equal("LEGAL-BATES-00103", vm.Pages[2].HeaderRight); - - // Remove Bates numbering - vm.RemoveBatesNumberingCommand.Execute(null); - Assert.True(string.IsNullOrEmpty(vm.Pages[0].HeaderRight)); - Assert.True(string.IsNullOrEmpty(vm.Pages[1].HeaderRight)); - } - - [Fact] - public void OrganizePages_BatchRotate_RotatesPagesCorrectly() - { - var vm = new MainViewModel(_exportService, _templateService, _persistenceService); - int initialPage1Angle = vm.Pages[0].RotationAngle; - int initialPage2Angle = vm.Pages[1].RotationAngle; - - vm.BatchRotatePagesCommand.Execute("all"); - - Assert.Equal((initialPage1Angle + 90) % 360, vm.Pages[0].RotationAngle); - Assert.Equal((initialPage2Angle + 90) % 360, vm.Pages[1].RotationAngle); - } - - [Fact] - public void AcroForms_RecalculateFormFields_CalculatesFormulas() - { - var page = new PageViewModel(); - - var f1 = new FormFieldElementViewModel { FieldName = "Subtotal", Value = "150.00" }; - var f2 = new FormFieldElementViewModel { FieldName = "Tax", Value = "15.00" }; - var f3 = new FormFieldElementViewModel - { - FieldName = "Total", - CalculationFormula = CalculationFormula.Sum, - CalculationSourceFields = "Subtotal, Tax" - }; - var fAvg = new FormFieldElementViewModel - { - FieldName = "AverageItem", - CalculationFormula = CalculationFormula.Average, - CalculationSourceFields = "Subtotal, Tax" - }; - - page.AddElement(f1); - page.AddElement(f2); - page.AddElement(f3); - page.AddElement(fAvg); - - page.RecalculateFormFields(); - - Assert.Equal("165.00", f3.Value); - Assert.Equal("82.50", fAvg.Value); - } - - [Fact] - public void MeasurementElement_CalculatesDistance_AndFormatsUnits() - { - var meas = new PdfMeasurementElement - { - StartX = 0, - StartY = 0, - EndX = 72, - EndY = 0, // 72 pts = 1.00 inch - Unit = RulerUnit.Inches - }; - - Assert.Equal(72.0, meas.CalculateDistance(), 2); - Assert.Equal("1.00 in", meas.GetFormattedDistance()); - - meas.Unit = RulerUnit.Millimeters; - Assert.Equal("25.4 mm", meas.GetFormattedDistance()); - - meas.Unit = RulerUnit.Points; - Assert.Equal("72.0 pt", meas.GetFormattedDistance()); - } - - [Fact] - public void FindAndReplace_FindsAndReplacesText_AcrossElements() - { - var vm = new MainViewModel(_exportService, _templateService, _persistenceService); - var page = vm.CurrentPage!; - - var txt1 = new TextElementViewModel { Text = "Acme Global Corporation Quarterly Financial Summary" }; - var txt2 = new TextElementViewModel { Text = "Prepared exclusively for Acme Global Leadership" }; - page.AddElement(txt1); - page.AddElement(txt2); - - vm.FindQuery = "Acme Global"; - vm.ReplaceQuery = "Apex International"; - vm.FindMatchCase = true; - - vm.FindNextCommand.Execute(null); - Assert.Equal(2, vm.FindMatchesCount); - - vm.ReplaceAllCommand.Execute(null); - - Assert.Contains("Apex International Corporation", txt1.Text); - Assert.Contains("Apex International Leadership", txt2.Text); - } - - [Fact] - public void AboutDialog_OpenClose_AndSupportCommands_Work() - { - var vm = new MainViewModel(_exportService, _templateService, _persistenceService); - - // Verify initial state - Assert.False(vm.IsAboutDialogOpen); - - // Open About Dialog - vm.OpenAboutDialogCommand.Execute(null); - Assert.True(vm.IsAboutDialogOpen); - - // Close About Dialog - vm.CloseAboutDialogCommand.Execute(null); - Assert.False(vm.IsAboutDialogOpen); - - // Direct method call - vm.OpenAboutDialog(); - Assert.True(vm.IsAboutDialogOpen); - vm.CloseAboutDialog(); - Assert.False(vm.IsAboutDialogOpen); - - // Verify Command Palette has About & Support commands - vm.OpenCommandPaletteCommand.Execute(null); - vm.FilterPaletteCommands("About"); - Assert.True(vm.FilteredPaletteCommands.Count > 0); - - vm.FilterPaletteCommands("codefrydev@gmail.com"); - Assert.True(vm.FilteredPaletteCommands.Count > 0); - - vm.FilterPaletteCommands("codefrydev.in"); - Assert.True(vm.FilteredPaletteCommands.Count > 0); - - vm.FilterPaletteCommands("Microsoft Store"); - Assert.True(vm.FilteredPaletteCommands.Count > 0); - - vm.FilterPaletteCommands("GitHub"); - Assert.True(vm.FilteredPaletteCommands.Count > 0); - - Assert.NotNull(vm.OpenMicrosoftStoreCommand); - Assert.NotNull(vm.OpenGitHubCommand); - } - - [Fact] - public void TemplateRegistry_AllDefinitions_ProduceValidDocumentsAndExport() - { - var templateService = new TemplateService(); - var allTemplates = templateService.GetAllTemplates(); - - Assert.NotEmpty(allTemplates); - Assert.True(allTemplates.Count >= 6, "Expected at least 6 default templates registered"); - - foreach (var t in allTemplates) - { - Assert.False(string.IsNullOrWhiteSpace(t.Id)); - Assert.False(string.IsNullOrWhiteSpace(t.Name)); - Assert.False(string.IsNullOrWhiteSpace(t.Description)); - Assert.False(string.IsNullOrWhiteSpace(t.IconKind)); - Assert.False(string.IsNullOrWhiteSpace(t.AccentColorHex)); - - var doc = t.Create(); - Assert.NotNull(doc); - Assert.NotEmpty(doc.Pages); - - byte[] bytes = _exportService.GeneratePdfBytes(doc); - Assert.NotNull(bytes); - Assert.True(bytes.Length > 200); - Assert.Equal("%PDF-", Encoding.ASCII.GetString(bytes, 0, 5)); - } - } - - [Fact] - public void CommunityTemplate_CustomRegistration_Works() - { - var templateService = new TemplateService(); - var customTemplate = new CustomCommunitySampleTemplate(); - - templateService.RegisterTemplate(customTemplate); - - var retrieved = templateService.CreateTemplate("custom-flyer"); - Assert.NotNull(retrieved); - Assert.Equal("Community Event Flyer", retrieved.Title); - Assert.Single(retrieved.Pages); - - var vm = new MainViewModel(_exportService, templateService, _persistenceService); - vm.CreateNewFromTemplate("custom-flyer"); - Assert.Equal("Community Event Flyer", vm.DocumentTitle); - } - - private class CustomCommunitySampleTemplate : PdfEditorApp.Templates.ITemplateDefinition - { - public string Id => "custom-flyer"; - public string Name => "Community Flyer"; - public string Description => "Sample community event flyer template"; - public string Category => "Events"; - public string IconKind => "BullhornOutline"; - public string AccentColorHex => "#E11D48"; - - public PdfDocumentModel Create() - { - var doc = new PdfDocumentModel { Title = "Community Event Flyer" }; - var page = new PdfPageModel { PageNumber = 1, Width = 800, Height = 1131 }; - page.Elements.Add(new PdfTextElement { Text = "Community Open Day 2026", FontSize = 28, IsBold = true }); - doc.Pages.Add(page); - return doc; - } - } - - [Fact] - public void TemplateGallery_FilteringAndSearch_WorksProperly() - { - var vm = new MainViewModel(_exportService, _templateService, _persistenceService); - - // Open Dialog resets query and category - vm.OpenNewDocumentDialog(); - Assert.True(vm.IsNewDocumentDialogOpen); - Assert.Equal("All", vm.SelectedTemplateCategory); - Assert.Equal("", vm.TemplateSearchQuery); - - // All visible initially - Assert.True(vm.IsAnnualReportTemplateVisible); - Assert.True(vm.IsInvoiceTemplateVisible); - Assert.True(vm.IsResumeTemplateVisible); - Assert.True(vm.IsAcademicPaperTemplateVisible); - Assert.True(vm.IsCertificateTemplateVisible); - Assert.True(vm.IsBlankTemplateVisible); - Assert.False(vm.HasNoMatchingTemplates); - - // Category filter: Career - vm.SetTemplateCategory("Career"); - Assert.True(vm.IsResumeTemplateVisible); - Assert.False(vm.IsAnnualReportTemplateVisible); - Assert.False(vm.IsInvoiceTemplateVisible); - - // Category filter: Finance - vm.SetTemplateCategory("Finance"); - Assert.True(vm.IsInvoiceTemplateVisible); - Assert.False(vm.IsResumeTemplateVisible); - - // Search query filter: "report" - vm.SetTemplateCategory("All"); - vm.TemplateSearchQuery = "report"; - Assert.True(vm.IsAnnualReportTemplateVisible); - Assert.False(vm.IsInvoiceTemplateVisible); - Assert.False(vm.IsResumeTemplateVisible); - - // Clear search - vm.ClearTemplateSearch(); - Assert.Equal("", vm.TemplateSearchQuery); - Assert.True(vm.IsResumeTemplateVisible); - - // Non-existent search query shows empty state - vm.TemplateSearchQuery = "xyznonexistenttemplate"; - Assert.True(vm.HasNoMatchingTemplates); - - // Close dialog - vm.CloseNewDocumentDialog(); - Assert.False(vm.IsNewDocumentDialogOpen); - } - - [Fact] - public void CertificateOfAchievement_RedAndGold_HasFullVectorAccentsAndMatchesReferenceImage() - { - var model = _templateService.CreateCertificateTemplate(); - Assert.NotNull(model); - Assert.Single(model.Pages); - Assert.Equal("Certificate_of_Achievement.pdf", model.Title); - - var page = model.Pages[0]; - Assert.Equal(PageOrientation.Landscape, page.Orientation); - Assert.NotEmpty(page.Elements); - - // Verify corner polygonal shapes exist - var shapes = page.Elements.OfType().ToList(); - Assert.True(shapes.Count >= 7, "Must contain all corner polygon wedges, accents, and medal badge"); - - // Verify medal ribbon badge - var medal = shapes.FirstOrDefault(s => s.ShapeType == ShapeType.MedalRibbonBadge); - Assert.NotNull(medal); - Assert.Equal("#F59E0B", medal.FillColorHex); - Assert.Equal("#990000", medal.SecondaryFillColorHex); - - // Verify typography elements - var texts = page.Elements.OfType().ToList(); - Assert.Contains(texts, t => t.Text == "CERTIFICATE" && t.TextColorHex == "#990000"); - Assert.Contains(texts, t => t.Text.Contains("OUTSTANDING ACHIEVEMENT")); - Assert.Contains(texts, t => t.Text.Contains("THIS CERTIFICATE IS PROUDLY PRESENTED TO")); - Assert.Contains(texts, t => t.Text == "John Doe" && t.FontFamily == "Great Vibes"); - Assert.Contains(texts, t => t.Text.Contains("Mathematics & Computational Science Olympiad")); - Assert.Contains(texts, t => t.Text == "Jane Doe" && t.FontFamily == "Great Vibes"); - Assert.Contains(texts, t => t.Text.Contains("Dr. Jane Doe, Ph.D.")); - Assert.Contains(texts, t => t.Text.Contains("President")); - Assert.Contains(texts, t => t.Text.Contains("Date")); - - // Verify PDF byte export - byte[] pdfBytes = _exportService.GeneratePdfBytes(model); - Assert.NotNull(pdfBytes); - Assert.True(pdfBytes.Length > 2000); - Assert.Equal("%PDF-", Encoding.ASCII.GetString(pdfBytes, 0, 5)); - } - - [Fact] - public void CertificateNavyGoldAndDiploma_ProduceValidPdfBytes() - { - var navyCert = _templateService.CreateCertificateNavyGoldTemplate(); - Assert.NotNull(navyCert); - byte[] navyBytes = _exportService.GeneratePdfBytes(navyCert); - Assert.NotNull(navyBytes); - Assert.True(navyBytes.Length > 1500); - Assert.Equal("%PDF-", Encoding.ASCII.GetString(navyBytes, 0, 5)); - - var diploma = _templateService.CreateDiplomaAcademicTemplate(); - Assert.NotNull(diploma); - byte[] diplomaBytes = _exportService.GeneratePdfBytes(diploma); - Assert.NotNull(diplomaBytes); - Assert.True(diplomaBytes.Length > 1500); - Assert.Equal("%PDF-", Encoding.ASCII.GetString(diplomaBytes, 0, 5)); - } - - [Fact] - public void SvgShapeHelper_AllShapeTypes_GenerateValidSvgPaths() - { - foreach (ShapeType type in Enum.GetValues()) - { - string path = SvgShapeHelper.GetVectorPath(type, 200, 150, 8, "M 0,0 L 50,50 Z"); - Assert.False(string.IsNullOrWhiteSpace(path), $"Path for {type} should not be empty"); - Assert.StartsWith("M", path); - - var element = new PdfShapeElement - { - ShapeType = type, - Width = 200, - Height = 150, - FillColorHex = "#990000", - StrokeColorHex = "#F59E0B", - StrokeThickness = 2.0, - CustomPathData = type == ShapeType.CustomSvgPath ? "M 0,0 L 100,0 L 50,100 Z" : null - }; - - string svg = SvgShapeHelper.GenerateSvgMarkup(element); - Assert.Contains("", svg); - } - } - - [Fact] - public async Task ShapeElement_CustomPathDataAndColors_PersistCorrectly() - { - var model = new PdfDocumentModel { Title = "ShapePersistenceTest.pdf" }; - var page = new PdfPageModel { Width = 800, Height = 600 }; - page.Elements.Add(new PdfShapeElement - { - ShapeType = ShapeType.CustomSvgPath, - CustomPathData = "M 0,0 L 220,0 L 160,380 Z", - FillColorHex = "#990000", - StrokeColorHex = "#F59E0B", - StrokeThickness = 2.5, - SecondaryFillColorHex = "#D97706", - SecondaryStrokeColorHex = "#B45309", - X = 50, - Y = 50, - Width = 220, - Height = 380 - }); - model.Pages.Add(page); - - string tempPath = Path.Combine(Path.GetTempPath(), $"shape_test_{Guid.NewGuid():N}.frypdf"); - try - { - await _persistenceService.SaveProjectAsync(model, tempPath); - var loaded = await _persistenceService.LoadProjectAsync(tempPath); - - Assert.NotNull(loaded); - Assert.Single(loaded.Pages); - var loadedShape = Assert.IsType(loaded.Pages[0].Elements[0]); - Assert.Equal(ShapeType.CustomSvgPath, loadedShape.ShapeType); - Assert.Equal("M 0,0 L 220,0 L 160,380 Z", loadedShape.CustomPathData); - Assert.Equal("#990000", loadedShape.FillColorHex); - Assert.Equal("#F59E0B", loadedShape.StrokeColorHex); - Assert.Equal("#D97706", loadedShape.SecondaryFillColorHex); - Assert.Equal("#B45309", loadedShape.SecondaryStrokeColorHex); - } - finally - { - if (File.Exists(tempPath)) File.Delete(tempPath); - } - } - - [Fact] - public void MainViewModel_CertificateQuickInsertionCommands_FunctionProperly() - { - var vm = new MainViewModel(); - - Assert.NotNull(vm.CurrentPage); - int initialCount = vm.CurrentPage.Elements.Count; - - vm.AddMedalBadgeElement(); - Assert.Equal(initialCount + 1, vm.CurrentPage.Elements.Count); - Assert.IsType(vm.CurrentPage.Elements.Last()); - - vm.AddLaurelSealElement(); - Assert.Equal(initialCount + 2, vm.CurrentPage.Elements.Count); - - vm.AddRibbonBannerElement(); - Assert.Equal(initialCount + 3, vm.CurrentPage.Elements.Count); - - vm.AddCornerAccentElement("TopLeft"); - Assert.Equal(initialCount + 4, vm.CurrentPage.Elements.Count); - - vm.AddCornerAccentElement("BottomRight"); - Assert.Equal(initialCount + 5, vm.CurrentPage.Elements.Count); - - vm.AddSignatureBlock(); - Assert.True(vm.CurrentPage.Elements.Count >= initialCount + 9); - - vm.AddDateBlock(); - Assert.True(vm.CurrentPage.Elements.Count >= initialCount + 12); - } - - [Fact] - public void WeddingInvitationTraditionalTemplate_MatchesReferenceAndGeneratesValidPdfBytes() - { - var doc = WeddingInvitationTraditionalTemplate.GenerateDocument(); - Assert.NotNull(doc); - Assert.Single(doc.Pages); - - var page = doc.Pages[0]; - Assert.Equal(600, page.Width); - Assert.Equal(900, page.Height); - - // Assert presence of key ceremonial elements - Assert.Contains(page.Elements, e => e is PdfSvgElement svg && svg.PresetName == "MarigoldToran"); - Assert.Contains(page.Elements, e => e is PdfSvgElement svg && svg.PresetName == "GaneshaCrest"); - Assert.Contains(page.Elements, e => e is PdfSvgElement svg && svg.PresetName == "DottedFloralDivider"); - Assert.Contains(page.Elements, e => e is PdfSvgElement svg && svg.PresetName == "TraditionalDeepam"); - Assert.Contains(page.Elements, e => e is PdfSvgElement svg && svg.PresetName == "PlantainTrees"); - Assert.Contains(page.Elements, e => e is PdfTextElement txt && txt.Text.Contains("Shree Ganeshay Namah")); - Assert.Contains(page.Elements, e => e is PdfTextElement txt && txt.Text == "MUHURTHAM"); - Assert.Contains(page.Elements, e => e is PdfTextElement txt && txt.Text == "RECEPTION"); - - // Export to PDF - byte[] pdfBytes = _exportService.GeneratePdfBytes(doc); - Assert.NotNull(pdfBytes); - Assert.True(pdfBytes.Length > 2000); - - string header = System.Text.Encoding.ASCII.GetString(pdfBytes.Take(5).ToArray()); - Assert.Equal("%PDF-", header); - } - - [Fact] - public void WeddingInvitationRoyalFloralTemplate_GeneratesValidPdfBytes() - { - var doc = WeddingInvitationRoyalFloralTemplate.GenerateDocument(); - Assert.NotNull(doc); - Assert.Single(doc.Pages); - - var page = doc.Pages[0]; - Assert.Contains(page.Elements, e => e is PdfSvgElement svg && svg.PresetName == "BotanicalWreath"); - Assert.Contains(page.Elements, e => e is PdfQrCodeElement qr && qr.Label.Contains("RSVP")); - - byte[] pdfBytes = _exportService.GeneratePdfBytes(doc); - Assert.NotNull(pdfBytes); - Assert.True(pdfBytes.Length > 2000); - Assert.Equal("%PDF-", System.Text.Encoding.ASCII.GetString(pdfBytes.Take(5).ToArray())); - } - - [Fact] - public void GalaInvitationTemplate_GeneratesValidPdfBytes() - { - var doc = GalaInvitationTemplate.GenerateDocument(); - Assert.NotNull(doc); - Assert.Single(doc.Pages); - - var page = doc.Pages[0]; - Assert.Contains(page.Elements, e => e is PdfSvgElement svg && svg.PresetName == "ArtDecoFrame"); - Assert.Contains(page.Elements, e => e is PdfQrCodeElement qr && qr.Label.Contains("VIP")); - - byte[] pdfBytes = _exportService.GeneratePdfBytes(doc); - Assert.NotNull(pdfBytes); - Assert.True(pdfBytes.Length > 2000); - Assert.Equal("%PDF-", System.Text.Encoding.ASCII.GetString(pdfBytes.Take(5).ToArray())); - } - - [Fact] - public void SvgOrnamentLibrary_AllPresets_GenerateValidSvgMarkup() - { - Assert.True(SvgOrnamentLibrary.Presets.Count >= 10); - - foreach (var (name, svg) in SvgOrnamentLibrary.Presets) - { - Assert.False(string.IsNullOrWhiteSpace(svg), $"Preset {name} is empty"); - Assert.StartsWith("", svg.TrimEnd()); - Assert.Contains("viewBox", svg); - - // Test tinting - string tinted = SvgOrnamentLibrary.GetSvg(name, "#FF5500"); - Assert.NotNull(tinted); - } - } - - [Fact] - public async Task SvgElement_PersistenceAndViewModelRoundTrip_Succeeds() - { - var original = new PdfSvgElement - { - X = 50, - Y = 100, - Width = 180, - Height = 180, - PresetName = "GaneshaCrest", - SvgSource = SvgOrnamentLibrary.GetGaneshaCrestSvg(), - TintColorHex = "#B45309", - KeepAspectRatio = true - }; - - var vm = new SvgElementViewModel(); - vm.LoadFromModel(original); - - Assert.Equal(50, vm.X); - Assert.Equal(100, vm.Y); - Assert.Equal(180, vm.Width); - Assert.Equal("GaneshaCrest", vm.PresetName); - Assert.Equal("#B45309", vm.TintColorHex); - Assert.False(string.IsNullOrEmpty(vm.PathGeometryData)); - - var exportedModel = Assert.IsType(vm.ToModel()); - Assert.Equal(original.PresetName, exportedModel.PresetName); - Assert.Equal(original.TintColorHex, exportedModel.TintColorHex); - - var doc = new PdfDocumentModel(); - var page = new PdfPageModel(); - page.Elements.Add(exportedModel); - doc.Pages.Add(page); - - string tempPath = Path.Combine(Path.GetTempPath(), $"svg_test_{Guid.NewGuid():N}.frypdf"); - try - { - await _persistenceService.SaveProjectAsync(doc, tempPath); - var loaded = await _persistenceService.LoadProjectAsync(tempPath); - Assert.NotNull(loaded); - var loadedSvg = Assert.IsType(loaded.Pages[0].Elements[0]); - Assert.Equal("GaneshaCrest", loadedSvg.PresetName); - Assert.Equal("#B45309", loadedSvg.TintColorHex); - } - finally - { - if (File.Exists(tempPath)) File.Delete(tempPath); - } - } - - [Fact] - public void MainViewModel_SvgQuickInsertionCommands_FunctionProperly() - { - var vm = new MainViewModel(); - Assert.NotNull(vm.CurrentPage); - int initialCount = vm.CurrentPage.Elements.Count; - - vm.AddSvgElement("GaneshaCrest"); - Assert.Equal(initialCount + 1, vm.CurrentPage.Elements.Count); - var svgEl = Assert.IsType(vm.CurrentPage.Elements.Last()); - Assert.Equal("GaneshaCrest", svgEl.PresetName); - - vm.AddOrnamentElement("MarigoldToran"); - Assert.Equal(initialCount + 2, vm.CurrentPage.Elements.Count); - - vm.AddOrnamentElement("BotanicalWreath"); - Assert.Equal(initialCount + 3, vm.CurrentPage.Elements.Count); - } -} - - - diff --git a/tests/PdfEditorApp.Tests/PdfImportAndViewerTests.cs b/tests/PdfEditorApp.Tests/PdfImportAndViewerTests.cs deleted file mode 100644 index a1735f0..0000000 --- a/tests/PdfEditorApp.Tests/PdfImportAndViewerTests.cs +++ /dev/null @@ -1,1219 +0,0 @@ -using System; -using System.IO; -using System.Linq; -using System.Threading.Tasks; -using CommunityToolkit.Mvvm.Messaging; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Messages; -using PdfEditorApp.Core.Models.Elements; -using PdfEditorApp.Models; -using PdfEditorApp.Services; -using PdfEditorApp.Templates; -using PdfEditorApp.ViewModels; -using UglyToad.PdfPig.Rendering.Skia; -using Xunit; - -namespace PdfEditorApp.Tests; - -public class PdfImportAndViewerTests -{ - private readonly IPdfExportService _exportService = new PdfExportService(); - private readonly ITemplateService _templateService = new TemplateService(); - private readonly IPdfImportService _importService = new PdfImportService(); - private readonly IProjectPersistenceService _persistenceService = new ProjectPersistenceService(); - - [Fact] - public async Task PdfImportService_ImportsBinaryPdfBytes_AccuratelyExtractsPagesAndElements() - { - // 1. Create a rich 3-page annual report PDF - var sourceModel = _templateService.CreateAnnualReportTemplate(); - byte[] pdfBytes = _exportService.GeneratePdfBytes(sourceModel); - Assert.NotNull(pdfBytes); - Assert.True(pdfBytes.Length > 0); - - // 2. Import into editable PdfDocumentModel - var importedModel = await _importService.ImportPdfBytesAsync(pdfBytes, "Annual_Report.pdf"); - - Assert.NotNull(importedModel); - Assert.False(string.IsNullOrWhiteSpace(importedModel.Title)); - Assert.Equal(3, importedModel.Pages.Count); - - // Verify Page 1 - var page1 = importedModel.Pages[0]; - Assert.True(page1.Width > 0); - Assert.True(page1.Height > 0); - Assert.NotEmpty(page1.Elements); - - // Verify editable text elements were extracted with crisp metrics - var textElements = page1.Elements.OfType().ToList(); - Assert.NotEmpty(textElements); - Assert.Contains(textElements, t => !string.IsNullOrWhiteSpace(t.Text)); - - // Verify no duplicate background canvas image was injected on digital vector PDF - var bgCanvas = page1.Elements.OfType().FirstOrDefault(e => e.AltText.Contains("Background Canvas")); - Assert.Null(bgCanvas); - } - - [Fact] - public async Task ProjectPersistenceService_LoadsRealPdfFile_WithoutJsonDeserializationErrors() - { - // 1. Create temporary PDF file - string tempPdfPath = Path.Combine(Path.GetTempPath(), $"FryPdf_Test_{Guid.NewGuid():N}.pdf"); - try - { - var sourceModel = _templateService.CreateInvoiceTemplate(); - byte[] pdfBytes = _exportService.GeneratePdfBytes(sourceModel); - await File.WriteAllBytesAsync(tempPdfPath, pdfBytes); - - // 2. Load through ProjectPersistenceService (which previously threw '%' is an invalid start of a value error) - var loadedModel = await _persistenceService.LoadProjectAsync(tempPdfPath); - - Assert.NotNull(loadedModel); - Assert.Single(loadedModel.Pages); - Assert.NotEmpty(loadedModel.Pages[0].Elements); - } - finally - { - if (File.Exists(tempPdfPath)) File.Delete(tempPdfPath); - } - } - - [Fact] - public async Task ProjectPersistenceService_SavesAndLoadsJsonProject_RoundtripsAccurately() - { - string tempProjPath = Path.Combine(Path.GetTempPath(), $"FryPdf_Project_{Guid.NewGuid():N}.frypdf"); - try - { - var original = _templateService.CreateResumeTemplate(); - await _persistenceService.SaveProjectAsync(original, tempProjPath); - - var loaded = await _persistenceService.LoadProjectAsync(tempProjPath); - Assert.NotNull(loaded); - Assert.Equal(original.Title, loaded.Title); - Assert.Equal(original.Pages.Count, loaded.Pages.Count); - Assert.Equal(original.Pages[0].Elements.Count, loaded.Pages[0].Elements.Count); - } - finally - { - if (File.Exists(tempProjPath)) File.Delete(tempProjPath); - } - } - - [Fact] - public async Task PdfViewerViewModel_LoadsPdfBytes_RendersPagesAndExtractsMetadata() - { - var sourceModel = _templateService.CreateCertificateTemplate(); - byte[] pdfBytes = _exportService.GeneratePdfBytes(sourceModel); - - var viewer = new PdfViewerViewModel(); - await viewer.LoadDocumentBytesAsync(pdfBytes, "Certificate_Of_Excellence.pdf"); - - Assert.True(viewer.HasDocument); - Assert.Equal("Certificate_Of_Excellence.pdf", viewer.DocumentTitle); - Assert.Equal(1, viewer.TotalPagesCount); - Assert.Equal(1, viewer.CurrentPageNumber); - Assert.NotEmpty(viewer.Pages); - Assert.NotEmpty(viewer.MetadataItems); - - // Verify page details - var firstPage = viewer.Pages[0]; - Assert.Equal(1, firstPage.PageNumber); - Assert.True(firstPage.WidthPoints > 0); - Assert.True(firstPage.HeightPoints > 0); - } - - [Fact] - public async Task PdfViewerViewModel_Search_FindsMatchesAcrossPages() - { - var sourceModel = _templateService.CreateAnnualReportTemplate(); - byte[] pdfBytes = _exportService.GeneratePdfBytes(sourceModel); - - var viewer = new PdfViewerViewModel(); - await viewer.LoadDocumentBytesAsync(pdfBytes, "Annual_Report.pdf"); - - // Execute text search for a common business word in the annual report - viewer.SearchQuery = "Revenue"; - - // If "Revenue" is present in the document text, verify search results are generated - if (viewer.SearchResults.Count > 0) - { - Assert.True(viewer.MatchCount > 0); - Assert.True(viewer.CurrentMatchIndex >= 1); - - // Test Next & Previous Match navigation - int initialIndex = viewer.CurrentMatchIndex; - viewer.NextMatch(); - Assert.True(viewer.CurrentMatchIndex >= 1); - viewer.PreviousMatch(); - Assert.True(viewer.CurrentMatchIndex >= 1); - } - } - - [Fact] - public async Task PdfViewerViewModel_ZoomControls_UpdatesZoomLevelAccurately() - { - var sourceModel = _templateService.CreateInvoiceTemplate(); - byte[] pdfBytes = _exportService.GeneratePdfBytes(sourceModel); - - var viewer = new PdfViewerViewModel(); - await viewer.LoadDocumentBytesAsync(pdfBytes, "Invoice.pdf"); - - // Initial Zoom: 1.0 (100%) - Assert.Equal(1.0, viewer.ZoomLevel); - Assert.Equal("100%", viewer.ZoomPercentageText); - - // Zoom In - viewer.ZoomIn(); - Assert.True(viewer.ZoomLevel > 1.0); - - // Zoom Out - viewer.ZoomOut(); - viewer.ZoomOut(); - Assert.True(viewer.ZoomLevel < 1.0); - - // Reset Zoom - viewer.ResetZoom(); - Assert.Equal(1.0, viewer.ZoomLevel); - Assert.Equal("100%", viewer.ZoomPercentageText); - - // Fit Width & Fit Page - viewer.FitToWidth(); - Assert.Equal(1.35, viewer.ZoomLevel); - - viewer.FitToPage(); - Assert.Equal(0.95, viewer.ZoomLevel); - } - - [Fact] - public async Task PdfViewerViewModel_PageRotation_RotatesClockwiseAndCounterClockwise() - { - var sourceModel = _templateService.CreateInvoiceTemplate(); - byte[] pdfBytes = _exportService.GeneratePdfBytes(sourceModel); - - var viewer = new PdfViewerViewModel(); - await viewer.LoadDocumentBytesAsync(pdfBytes, "Invoice.pdf"); - Assert.NotNull(viewer.SelectedPage); - - int initialRotation = viewer.SelectedPage.RotationAngle; - - // Rotate CW - viewer.RotateClockwise(); - Assert.Equal((initialRotation + 90) % 360, viewer.SelectedPage.RotationAngle); - - // Rotate CCW - viewer.RotateCounterClockwise(); - Assert.Equal(initialRotation, viewer.SelectedPage.RotationAngle); - } - - [Fact] - public async Task PdfViewerViewModel_Annotations_AddsAndDeletesAnnotationsSuccessfully() - { - var sourceModel = _templateService.CreateInvoiceTemplate(); - byte[] pdfBytes = _exportService.GeneratePdfBytes(sourceModel); - - var viewer = new PdfViewerViewModel(); - await viewer.LoadDocumentBytesAsync(pdfBytes, "Invoice.pdf"); - - Assert.Empty(viewer.Annotations); - Assert.False(viewer.HasAnnotations); - - // Add Highlight - viewer.AddHighlightAnnotation(); - Assert.Single(viewer.Annotations); - Assert.True(viewer.HasAnnotations); - Assert.Equal("Highlight", viewer.Annotations[0].Type); - - // Add Stamp - viewer.AddStamp("APPROVED"); - Assert.Equal(2, viewer.Annotations.Count); - Assert.Equal("Stamp", viewer.Annotations[1].Type); - Assert.Contains("APPROVED", viewer.Annotations[1].Content); - - // Add Sticky Note - viewer.NewNoteText = "Needs sign-off from finance."; - viewer.ConfirmAddNote(); - Assert.Equal(3, viewer.Annotations.Count); - Assert.Equal("StickyNote", viewer.Annotations[2].Type); - - // Delete Annotation - var note = viewer.Annotations[2]; - viewer.DeleteAnnotation(note); - Assert.Equal(2, viewer.Annotations.Count); - } - - [Fact] - public async Task PdfViewerViewModel_ExtractsWordsAndLinesGeometry_AccuratelyOnPageLoad() - { - var sourceModel = _templateService.CreateInvoiceTemplate(); - byte[] pdfBytes = _exportService.GeneratePdfBytes(sourceModel); - - var viewer = new PdfViewerViewModel(); - await viewer.LoadDocumentBytesAsync(pdfBytes, "Invoice.pdf"); - - var page1 = viewer.SelectedPage; - Assert.NotNull(page1); - Assert.NotEmpty(page1.Words); - Assert.NotEmpty(page1.TextLines); - - // Verify words geometry - foreach (var word in page1.Words) - { - Assert.False(string.IsNullOrWhiteSpace(word.Text)); - Assert.True(word.Bounds.Width > 0); - Assert.True(word.Bounds.Height > 0); - Assert.True(word.Bounds.Left >= 0); - Assert.True(word.Bounds.Top >= 0); - } - - // Verify lines geometry - foreach (var line in page1.TextLines) - { - Assert.False(string.IsNullOrWhiteSpace(line.Text)); - Assert.NotEmpty(line.Words); - Assert.True(line.Bounds.Width > 0); - Assert.True(line.Bounds.Height > 0); - } - } - - [Fact] - public async Task PdfViewerViewModel_WordAndLineSelection_SetsAccurateSelectionAndBounds() - { - var sourceModel = _templateService.CreateInvoiceTemplate(); - byte[] pdfBytes = _exportService.GeneratePdfBytes(sourceModel); - - var viewer = new PdfViewerViewModel(); - await viewer.LoadDocumentBytesAsync(pdfBytes, "Invoice.pdf"); - - var page1 = viewer.SelectedPage!; - Assert.NotEmpty(page1.Words); - var targetWord = page1.Words[0]; - - // 1. Select Word - page1.SelectWord(targetWord); - Assert.True(page1.HasSelection); - Assert.Equal(targetWord.Text, page1.SelectedText); - Assert.Single(page1.SelectionRects); - Assert.Equal(targetWord.Bounds, page1.SelectionRects[0]); - - // 2. Select Line - var targetLine = page1.TextLines[0]; - page1.SelectLine(targetLine); - Assert.True(page1.HasSelection); - Assert.Equal(targetLine.Text, page1.SelectedText); - Assert.Single(page1.SelectionRects); - - // 3. Clear Selection - page1.ClearSelection(); - Assert.False(page1.HasSelection); - Assert.Empty(page1.SelectedText); - Assert.Empty(page1.SelectionRects); - } - - [Fact] - public async Task PdfViewerViewModel_DragRangeSelection_SelectsMultiLineText() - { - var sourceModel = _templateService.CreateInvoiceTemplate(); - byte[] pdfBytes = _exportService.GeneratePdfBytes(sourceModel); - - var viewer = new PdfViewerViewModel(); - await viewer.LoadDocumentBytesAsync(pdfBytes, "Invoice.pdf"); - - var page1 = viewer.SelectedPage!; - Assert.True(page1.TextLines.Count >= 2); - - var line1 = page1.TextLines[0]; - var line2 = page1.TextLines[1]; - - // Drag from first line middle to second line middle - var startPoint = new Avalonia.Point(line1.Bounds.Left + 5, line1.Bounds.Center.Y); - var endPoint = new Avalonia.Point(line2.Bounds.Right - 5, line2.Bounds.Center.Y); - - page1.SetSelectionRange(startPoint, endPoint); - - Assert.True(page1.HasSelection); - Assert.NotEmpty(page1.SelectedText); - Assert.True(page1.SelectionRects.Count >= 2); - } - - [Fact] - public async Task PdfViewerViewModel_SelectAll_SelectsAllPageText() - { - var sourceModel = _templateService.CreateInvoiceTemplate(); - byte[] pdfBytes = _exportService.GeneratePdfBytes(sourceModel); - - var viewer = new PdfViewerViewModel(); - await viewer.LoadDocumentBytesAsync(pdfBytes, "Invoice.pdf"); - - viewer.SelectAllPageText(); - - Assert.True(viewer.HasTextSelection); - Assert.Equal(viewer.SelectedPage!.ExtractedText, viewer.ActiveSelectedText); - Assert.NotEmpty(viewer.SelectedPage.SelectionRects); - - viewer.ClearSelection(); - Assert.False(viewer.HasTextSelection); - Assert.Empty(viewer.ActiveSelectedText); - } - - [Fact] - public async Task PdfViewerViewModel_HighlightSelectedText_CreatesAnnotationWithExactRectangles() - { - var sourceModel = _templateService.CreateInvoiceTemplate(); - byte[] pdfBytes = _exportService.GeneratePdfBytes(sourceModel); - - var viewer = new PdfViewerViewModel(); - await viewer.LoadDocumentBytesAsync(pdfBytes, "Invoice.pdf"); - - var page1 = viewer.SelectedPage!; - var firstWord = page1.Words[0]; - page1.SelectWord(firstWord); - viewer.ActiveSelectedText = page1.SelectedText; - viewer.ActiveSelectedPageNumber = page1.PageNumber; - viewer.HasTextSelection = true; - - viewer.HighlightSelectedText("#A7F3D0"); - - Assert.True(viewer.HasAnnotations); - var hlAnn = viewer.Annotations.FirstOrDefault(a => a.Type == "Highlight"); - Assert.NotNull(hlAnn); - Assert.Equal("#A7F3D0", hlAnn.ColorHex); - Assert.Equal(firstWord.Text, hlAnn.Content); - Assert.NotEmpty(hlAnn.HighlightRects); - Assert.Equal(firstWord.Bounds, hlAnn.HighlightRects[0]); - - // Selection should be cleared after highlighting - Assert.False(page1.HasSelection); - Assert.False(viewer.HasTextSelection); - } - - [Fact] - public async Task PdfViewerViewModel_SearchSelectedText_SetsQueryAndNavigatesMatches() - { - var sourceModel = _templateService.CreateInvoiceTemplate(); - byte[] pdfBytes = _exportService.GeneratePdfBytes(sourceModel); - - var viewer = new PdfViewerViewModel(); - await viewer.LoadDocumentBytesAsync(pdfBytes, "Invoice.pdf"); - - var page1 = viewer.SelectedPage!; - var firstWord = page1.Words[0]; - page1.SelectWord(firstWord); - viewer.ActiveSelectedText = firstWord.Text; - - viewer.SearchSelectedText(); - - Assert.True(viewer.IsSearchBarVisible); - Assert.Equal(firstWord.Text, viewer.SearchQuery); - Assert.True(viewer.HasSearchResults); - Assert.True(viewer.TotalMatchesCount >= 1); - } - - [Fact] - public async Task PdfViewerViewModel_EditInStudioBridge_TriggersEventWithFilePath() - { - string tempPdfPath = Path.Combine(Path.GetTempPath(), $"FryPdf_Studio_Bridge_{Guid.NewGuid():N}.pdf"); - try - { - var sourceModel = _templateService.CreateInvoiceTemplate(); - byte[] pdfBytes = _exportService.GeneratePdfBytes(sourceModel); - await File.WriteAllBytesAsync(tempPdfPath, pdfBytes); - - var viewer = new PdfViewerViewModel(); - await viewer.LoadDocumentAsync(tempPdfPath); - - string? requestedPath = null; - WeakReferenceMessenger.Default.Register(this, (r, m) => requestedPath = m.FilePath); - try - { - viewer.EditInStudio(); - Assert.NotNull(requestedPath); - Assert.Equal(tempPdfPath, requestedPath); - } - finally - { - WeakReferenceMessenger.Default.Unregister(this); - } - } - finally - { - if (File.Exists(tempPdfPath)) File.Delete(tempPdfPath); - } - } - - [Fact] - public void ImageElementViewModel_Base64Data_LoadsAndRendersBitmapSuccessfully() - { - // 1. Generate a valid 1x1 PNG image as base64 - byte[] validPngBytes = new byte[] - { - 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, - 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, - 0x08, 0x06, 0x00, 0x00, 0x00, 0x1F, 0x15, 0xC4, 0x89, 0x00, 0x00, 0x00, - 0x0D, 0x49, 0x44, 0x41, 0x54, 0x78, 0x9C, 0x63, 0x60, 0x60, 0x60, 0x00, - 0x00, 0x00, 0x04, 0x00, 0x01, 0x5D, 0x36, 0xBD, 0x7E, 0x00, 0x00, 0x00, - 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82 - }; - string base64 = Convert.ToBase64String(validPngBytes); - - var model = new PdfImageElement - { - X = 50, - Y = 50, - Width = 100, - Height = 100, - Base64Data = base64, - AltText = "Test Base64 Image" - }; - - var vm = new PdfEditorApp.ViewModels.ElementViewModels.ImageElementViewModel(); - vm.LoadFromModel(model); - - Assert.Equal(base64, vm.Base64Data); - Assert.Equal("Test Base64 Image", vm.DisplayName); - - var roundTripped = (PdfImageElement)vm.ToModel(); - Assert.Equal(base64, roundTripped.Base64Data); - Assert.Equal("Test Base64 Image", roundTripped.AltText); - } - - [Fact] - public async Task PdfImportService_ImportsPdf_PageBackgroundAndElementsHaveCleanRendering() - { - var sourceModel = _templateService.CreateCertificateTemplate(); - byte[] pdfBytes = _exportService.GeneratePdfBytes(sourceModel); - - var imported = await _importService.ImportPdfBytesAsync(pdfBytes, "Certificate.pdf"); - Assert.NotNull(imported); - Assert.Single(imported.Pages); - - var page = imported.Pages[0]; - Assert.NotEmpty(page.Elements); - - // Verify that digital vector PDF does NOT add duplicate raster background underlay - var bgCanvas = page.Elements.OfType().FirstOrDefault(e => e.AltText.Contains("Background Canvas")); - Assert.Null(bgCanvas); - - // Verify text elements are extracted - var textElements = page.Elements.OfType().ToList(); - Assert.NotEmpty(textElements); - - var pageVm = new PageViewModel(); - pageVm.LoadFromModel(page); - Assert.NotEmpty(pageVm.Elements); - } - - [Fact] - public async Task PdfImportService_MultiColumnInvoice_ExtractsSeparateTextBlocks() - { - var invoiceModel = _templateService.CreateInvoiceTemplate(); - byte[] pdfBytes = _exportService.GeneratePdfBytes(invoiceModel); - - var imported = await _importService.ImportPdfBytesAsync(pdfBytes, "Invoice_MultiColumn.pdf"); - Assert.NotNull(imported); - Assert.Single(imported.Pages); - - var textElements = imported.Pages[0].Elements.OfType().ToList(); - Assert.NotEmpty(textElements); - Assert.True(textElements.Count >= 2); - - // Verify that individual text blocks have non-zero dimensions and non-empty text - foreach (var txt in textElements) - { - Assert.False(string.IsNullOrWhiteSpace(txt.Text)); - Assert.True(txt.Width > 0); - Assert.True(txt.Height > 0); - } - } - - [Fact] - public async Task DeconstructSampleFiles_Investigate() - { - string baseDir = AppContext.BaseDirectory; - string rootDir = Path.GetFullPath(Path.Combine(baseDir, "..", "..", "..", "..", "..")); - string sample1Path = Path.Combine(rootDir, "sample1.pdf"); - string sample2Path = Path.Combine(rootDir, "sample2.pdf"); - string mathChapterPath = Path.Combine(rootDir, "Class_6_Math_Chapter_1_Pattern_In_Mathematics.pdf"); - - if (!File.Exists(sample1Path)) - { - return; - } - - var doc1 = await _importService.ImportPdfAsync(sample1Path); - - // Assertions for Sample 1 (Government ID Card): - Assert.True(doc1.Pages.Count >= 1); - var page1 = doc1.Pages[0]; - Assert.True(page1.Elements.Count > 0); - - // Check vertical rotated text elements extracted cleanly - var rotatedElements = page1.Elements.OfType().Where(t => t.Rotation == 270.0 || t.Rotation == 90.0).ToList(); - Assert.NotEmpty(rotatedElements); - Assert.Contains(rotatedElements, r => r.Text.Length > 5); - - // Assert vertical divider elements extracted (solid border lines along center fold) - var verticalDividers = page1.Elements.OfType().Where(d => d.IsVertical).ToList(); - Assert.NotEmpty(verticalDividers); - Assert.Contains(verticalDividers, d => d.Height > 400); - - // Check horizontal text blocks have valid bounds and content - var horizontalTexts = page1.Elements.OfType().Where(t => t.Rotation == 0).ToList(); - Assert.True(horizontalTexts.Count >= 10, $"Expected multiple horizontal text blocks. Found {horizontalTexts.Count}."); - Assert.All(horizontalTexts, h => - { - Assert.False(string.IsNullOrWhiteSpace(h.Text)); - Assert.True(h.Width > 0); - Assert.True(h.Height > 0); - }); - - // Assert formatted 12-digit ID token is cleanly extracted and positioned above bottom banner (Y < 715) - var bottomIdNumber = horizontalTexts.FirstOrDefault(t => - System.Text.RegularExpressions.Regex.IsMatch(t.Text, @"\b\d{4}\s\d{4}\s\d{4}\b") && t.Y > 680); - Assert.NotNull(bottomIdNumber); - Assert.True(bottomIdNumber.Y < 715.0, $"Expected bottom ID number Y < 715, actual={bottomIdNumber.Y}"); - - // Check that text elements with multi-character content are extracted - Assert.Contains(horizontalTexts, h => h.Text.Length >= 4); - - // Assertions for Sample 2 (Arduino Cheat Sheet): - if (File.Exists(sample2Path)) - { - var doc2 = await _importService.ImportPdfAsync(sample2Path); - Assert.True(doc2.Pages.Count >= 1); - var s2Page1 = doc2.Pages[0]; - - // Verify title and headers extracted - var titleText = s2Page1.Elements.OfType().FirstOrDefault(t => t.Text.Contains("Arduino", StringComparison.OrdinalIgnoreCase) || t.Text.Contains("Cheat Sheet", StringComparison.OrdinalIgnoreCase)); - Assert.NotNull(titleText); - - // Verify shapes / container cards extracted - var shapes2 = s2Page1.Elements.OfType().ToList(); - Assert.True(shapes2.Count >= 4, $"Expected multiple container cards and shapes in Arduino cheat sheet. Found {shapes2.Count}."); - - // Verify section headings (Structure & Flow, Operators, Built-in Functions, Libraries) - var headings = s2Page1.Elements.OfType().Where(t => - t.Text.Contains("Structure & Flow") || - t.Text.Contains("Operators") || - t.Text.Contains("Built-in Functions") || - t.Text.Contains("Libraries")).ToList(); - Assert.NotEmpty(headings); - } - - // Assertions for Textbook Chapter: - if (File.Exists(mathChapterPath)) - { - var doc3 = await _importService.ImportPdfAsync(mathChapterPath); - Assert.True(doc3.Pages.Count >= 1); - var s3Page1 = doc3.Pages[0]; - - // Verify vector shapes and dividers extracted - var shapes3 = s3Page1.Elements.OfType().ToList(); - var dividers3 = s3Page1.Elements.OfType().ToList(); - Assert.True(shapes3.Count > 0 || dividers3.Count > 0); - - // Verify watermark image is locked with low ZIndex - var watermarks = s3Page1.Elements.OfType().Where(img => img.IsLocked).ToList(); - Assert.NotEmpty(watermarks); - Assert.True(watermarks[0].Opacity <= 0.35); - Assert.Equal(0, watermarks[0].ZIndex); - - // Verify header text extracted with Poppins / display font and high contrast - var mathTitle = s3Page1.Elements.OfType().FirstOrDefault(t => t.Text.Contains("MATHEMATICS", StringComparison.OrdinalIgnoreCase)); - Assert.NotNull(mathTitle); - Assert.Equal("Poppins", mathTitle.FontFamily); - - // Verify section heading extracted - var sectionHeading = s3Page1.Elements.OfType().FirstOrDefault(t => t.Text.Contains("1.1 What is Mathematics", StringComparison.OrdinalIgnoreCase)); - Assert.NotNull(sectionHeading); - } - } - - [Fact] - public void BooleanToStretchConverter_ConvertsCorrectly() - { - var converter = PdfEditorApp.Converters.BooleanToStretchConverter.Instance; - var uniform = converter.Convert(true, typeof(Avalonia.Media.Stretch), null, System.Globalization.CultureInfo.InvariantCulture); - var fill = converter.Convert(false, typeof(Avalonia.Media.Stretch), null, System.Globalization.CultureInfo.InvariantCulture); - - Assert.Equal(Avalonia.Media.Stretch.Uniform, uniform); - Assert.Equal(Avalonia.Media.Stretch.Fill, fill); - } - - [Fact] - public void RotationToTransformConverter_ConvertsAnglesToRotateTransformsAccurately() - { - var converter = PdfEditorApp.Converters.RotationToTransformConverter.Instance; - - // 0 degrees / zero values return null (no transform overhead) - Assert.Null(converter.Convert(0.0, typeof(Avalonia.Media.ITransform), null, System.Globalization.CultureInfo.InvariantCulture)); - Assert.Null(converter.Convert(0, typeof(Avalonia.Media.ITransform), null, System.Globalization.CultureInfo.InvariantCulture)); - Assert.Null(converter.Convert(null, typeof(Avalonia.Media.ITransform), null, System.Globalization.CultureInfo.InvariantCulture)); - - // 270 degrees (vertical marginalia text) - var t270 = converter.Convert(270.0, typeof(Avalonia.Media.ITransform), null, System.Globalization.CultureInfo.InvariantCulture); - Assert.NotNull(t270); - var rt270 = Assert.IsType(t270); - Assert.Equal(270.0, rt270.Angle); - - // 90 degrees - var t90 = converter.Convert(90.0, typeof(Avalonia.Media.ITransform), null, System.Globalization.CultureInfo.InvariantCulture); - Assert.NotNull(t90); - var rt90 = Assert.IsType(t90); - Assert.Equal(90.0, rt90.Angle); - - // ConvertBack roundtrips - Assert.Equal(270.0, (double)(converter.ConvertBack(rt270, typeof(double), null, System.Globalization.CultureInfo.InvariantCulture) ?? 0.0)); - } - - [Fact] - public async Task PageViewModel_LoadsDeconstructedDocument_AllowsEditingAndExportRoundtrip() - { - var templateService = new TemplateService(); - var exportService = new PdfExportService(); - - var originalDoc = templateService.CreateAnnualReportTemplate(); - byte[] pdfBytes = await exportService.ExportToBytesAsync(originalDoc); - - var doc = await _importService.ImportPdfBytesAsync(pdfBytes, "Annual_Report.pdf"); - Assert.NotEmpty(doc.Pages); - - var pageVm = new PdfEditorApp.ViewModels.PageViewModel(); - pageVm.LoadFromModel(doc.Pages[0]); - - Assert.NotEmpty(pageVm.Elements); - - // Find title text element - var titleVm = pageVm.Elements.OfType().FirstOrDefault(t => t.Text.Contains("ANNUAL CORPORATE REPORT", StringComparison.OrdinalIgnoreCase)); - Assert.NotNull(titleVm); - - // Edit text - titleVm.Text = "ADVANCED ANNUAL REPORT"; - titleVm.FontSize = 28.0; - titleVm.TextColorHex = "#2563EB"; - - // Verify ToModel preserves modifications - var roundtripModel = pageVm.ToModel(); - var roundtripTitle = roundtripModel.Elements.OfType().FirstOrDefault(t => t.Text == "ADVANCED ANNUAL REPORT"); - Assert.NotNull(roundtripTitle); - Assert.Equal(28.0, roundtripTitle.FontSize); - Assert.Equal("#2563EB", roundtripTitle.TextColorHex); - } - - [Fact] - public async Task AnnualReport_ExportAndImport_PreservesAllElementsLosslessly() - { - var templateService = new TemplateService(); - var exportService = new PdfExportService(); - - var originalDoc = templateService.CreateAnnualReportTemplate(); - Assert.Equal(3, originalDoc.Pages.Count); - - byte[] pdfBytes = await exportService.ExportToBytesAsync(originalDoc); - Assert.NotNull(pdfBytes); - Assert.True(pdfBytes.Length > 0); - - var importedDoc = await _importService.ImportPdfBytesAsync(pdfBytes, "Annual_Report.pdf"); - Assert.NotNull(importedDoc); - Assert.Equal(3, importedDoc.Pages.Count); - - for (int pIdx = 0; pIdx < originalDoc.Pages.Count; pIdx++) - { - var origPage = originalDoc.Pages[pIdx]; - var impPage = importedDoc.Pages[pIdx]; - - Assert.Equal(origPage.Elements.Count, impPage.Elements.Count); - - for (int eIdx = 0; eIdx < origPage.Elements.Count; eIdx++) - { - var origEl = origPage.Elements[eIdx]; - var impEl = impPage.Elements[eIdx]; - - Assert.Equal(origEl.GetType(), impEl.GetType()); - Assert.Equal(origEl.X, impEl.X); - Assert.Equal(origEl.Y, impEl.Y); - Assert.Equal(origEl.Width, impEl.Width); - Assert.Equal(origEl.Height, impEl.Height); - - if (origEl is PdfTableElement origTable && impEl is PdfTableElement impTable) - { - Assert.Equal(origTable.Headers.Count, impTable.Headers.Count); - Assert.Equal(origTable.Rows.Count, impTable.Rows.Count); - } - else if (origEl is PdfChartElement origChart && impEl is PdfChartElement impChart) - { - Assert.Equal(origChart.ChartType, impChart.ChartType); - Assert.Equal(origChart.Title, impChart.Title); - } - else if (origEl is PdfTextElement origText && impEl is PdfTextElement impText) - { - Assert.Equal(origText.Text, impText.Text); - Assert.Equal(origText.FontSize, impText.FontSize); - Assert.Equal(origText.TextColorHex, impText.TextColorHex); - } - } - } - } - - [Fact] - public async Task Invoice_ExportAndImport_PreservesTablesAndFormulasLosslessly() - { - var templateService = new TemplateService(); - var exportService = new PdfExportService(); - - var originalDoc = templateService.CreateInvoiceTemplate(); - byte[] pdfBytes = await exportService.ExportToBytesAsync(originalDoc); - - var importedDoc = await _importService.ImportPdfBytesAsync(pdfBytes, "Invoice.pdf"); - Assert.NotNull(importedDoc); - Assert.Single(importedDoc.Pages); - - var origTable = originalDoc.Pages[0].Elements.OfType().FirstOrDefault(); - var impTable = importedDoc.Pages[0].Elements.OfType().FirstOrDefault(); - - Assert.NotNull(origTable); - Assert.NotNull(impTable); - Assert.Equal(origTable.Headers.Count, impTable.Headers.Count); - Assert.Equal(origTable.Rows.Count, impTable.Rows.Count); - } - - [Fact] - public async Task GenerateVisualComparison_SideBySide_SavesArtifacts() - { - string? envArtifactDir = Environment.GetEnvironmentVariable("FRYPDF_ARTIFACT_DIR"); - string artifactDir = !string.IsNullOrWhiteSpace(envArtifactDir) - ? envArtifactDir - : Path.Combine(AppContext.BaseDirectory, "VisualArtifacts"); - Directory.CreateDirectory(artifactDir); - - string baseDir = AppContext.BaseDirectory; - string rootDir = Path.GetFullPath(Path.Combine(baseDir, "..", "..", "..", "..", "..")); - string sampleDir = Path.Combine(rootDir, "sample"); - if (Directory.Exists(sampleDir)) - { - var pdfFiles = Directory.GetFiles(sampleDir, "*.pdf").OrderBy(f => f).ToList(); - foreach (var pdfFile in pdfFiles) - { - string fileName = Path.GetFileNameWithoutExtension(pdfFile); - string safeName = string.Join("_", fileName.Split(Path.GetInvalidFileNameChars())).Replace(" ", "_").Replace("(", "").Replace(")", ""); - await GenerateComparisonForPdf(pdfFile, Path.Combine(artifactDir, $"{safeName}_side_by_side.png"), fileName, 1); - } - } - } - - [Fact] - public async Task ImportPdfBytesAsync_GcdOfferLetter_CorrectlyExtractsTableAndPreservesLBracketBorders() - { - string baseDir = AppContext.BaseDirectory; - string rootDir = Path.GetFullPath(Path.Combine(baseDir, "..", "..", "..", "..", "..")); - string offerLetterPath = Path.Combine(rootDir, "sample", "GCD Offer Letter - Aayush Bhardwaj (Technology).pdf"); - if (!File.Exists(offerLetterPath)) return; - - byte[] pdfBytes = await File.ReadAllBytesAsync(offerLetterPath); - var docModel = await _importService.ImportPdfBytesAsync(pdfBytes, "GCD Offer Letter"); - - Assert.Equal(2, docModel.Pages.Count); - - var page1 = docModel.Pages[0]; - // 1. Verify compensation table text elements are extracted cleanly - var textElements = page1.Elements.OfType().ToList(); - Assert.Contains(textElements, t => t.Text.Contains("Components", StringComparison.OrdinalIgnoreCase)); - Assert.Contains(textElements, t => t.Text.Contains("Basic", StringComparison.OrdinalIgnoreCase)); - Assert.Contains(textElements, t => t.Text.Contains("Total Gross", StringComparison.OrdinalIgnoreCase)); - - // 2. Verify non-rectangular polygon border is extracted as CustomSvgPath shape, not flattened to a solid rectangle - var shapes = page1.Elements.OfType().ToList(); - var customSvgShapes = shapes.Where(s => s.ShapeType == ShapeType.CustomSvgPath).ToList(); - Assert.NotEmpty(customSvgShapes); - Assert.All(customSvgShapes, s => Assert.False(string.IsNullOrWhiteSpace(s.CustomPathData))); - - // 3. Verify no giant solid rectangle covering the page area (> 50,000 sq pt) - Assert.DoesNotContain(shapes, s => s.ShapeType == ShapeType.Rectangle && s.Width * s.Height > 50000); - } - - private async Task GenerateComparisonForPdf(string pdfPath, string outputPath, string title, int pageIndex = 1) - { - byte[] pdfBytes = await File.ReadAllBytesAsync(pdfPath); - var docModel = await _importService.ImportPdfBytesAsync(pdfBytes, Path.GetFileName(pdfPath)); - if (docModel.Pages.Count < pageIndex) return; - - float scale = 1.5f; - - // 1. Render Original PDF via PdfPig + Skia - using var rawDoc = UglyToad.PdfPig.PdfDocument.Open(pdfBytes); - PdfPigExtensions.AddSkiaPageFactory(rawDoc); - using var origStream = PdfPigExtensions.GetPageAsPng(rawDoc, pageIndex, scale, 100); - using var origSkData = SkiaSharp.SKData.CreateCopy(origStream.ToArray()); - using var origBitmap = SkiaSharp.SKBitmap.Decode(origSkData); - - // 2. Render Deconstructed FryPDF PageModel via Skia - var deconstructedPage = docModel.Pages[pageIndex - 1]; - using var reconBitmap = RenderPageModelToSkiaBitmap(deconstructedPage, scale); - - // 3. Compose Side-by-Side Image - int bannerH = 70; - int pw = origBitmap.Width; - int ph = origBitmap.Height; - int rw = reconBitmap.Width; - int rh = reconBitmap.Height; - int contentW = pw + rw + 20; // 20px gutter - int contentH = Math.Max(ph, rh); - - int totalW = contentW + 40; // 20px padding left/right - int totalH = bannerH + contentH + 40; // 20px padding bottom - - using var comparisonBitmap = new SkiaSharp.SKBitmap(totalW, totalH); - using var canvas = new SkiaSharp.SKCanvas(comparisonBitmap); - - // Dark Background - canvas.Clear(new SkiaSharp.SKColor(15, 23, 42)); // #0F172A - - // Banner Header - using var titlePaint = new SkiaSharp.SKPaint - { - Color = SkiaSharp.SKColors.White, - IsAntialias = true - }; - using var titleTypeface = SkiaSharp.SKTypeface.FromFamilyName("Segoe UI", SkiaSharp.SKFontStyleWeight.Bold, SkiaSharp.SKFontStyleWidth.Normal, SkiaSharp.SKFontStyleSlant.Upright); - using var titleFont = new SkiaSharp.SKFont(titleTypeface, 20); - canvas.DrawText($"Side-by-Side Visual Verification: {title}", 24, 34, titleFont, titlePaint); - - using var subFont = new SkiaSharp.SKFont(titleTypeface, 12); - using var subPaint = new SkiaSharp.SKPaint { Color = new SkiaSharp.SKColor(148, 163, 184), IsAntialias = true }; - canvas.DrawText($"Elements: {deconstructedPage.Elements.Count} ({deconstructedPage.Elements.OfType().Count()} images, {deconstructedPage.Elements.OfType().Count()} text blocks, {deconstructedPage.Elements.OfType().Count()} shapes, {deconstructedPage.Elements.OfType().Count()} svgs, {deconstructedPage.Elements.OfType().Count()} tables) | Canvas Size: {deconstructedPage.Width:F0}x{deconstructedPage.Height:F0} pt", 24, 54, subFont, subPaint); - - // Labels - float leftX = 20; - float rightX = 20 + pw + 20; - float topY = bannerH; - - using var colLabelFont = new SkiaSharp.SKFont(titleTypeface, 13); - using var leftLabelPaint = new SkiaSharp.SKPaint { Color = new SkiaSharp.SKColor(56, 189, 248), IsAntialias = true }; - using var rightLabelPaint = new SkiaSharp.SKPaint { Color = new SkiaSharp.SKColor(74, 222, 128), IsAntialias = true }; - - // Draw Images - canvas.DrawBitmap(origBitmap, leftX, topY); - canvas.DrawBitmap(reconBitmap, rightX, topY); - - // Borders - using var borderPaint = new SkiaSharp.SKPaint - { - Color = new SkiaSharp.SKColor(51, 65, 85), - Style = SkiaSharp.SKPaintStyle.Stroke, - StrokeWidth = 2 - }; - canvas.DrawRect(leftX, topY, pw, ph, borderPaint); - canvas.DrawRect(rightX, topY, rw, rh, borderPaint); - - // Save comparison image - using var outImage = SkiaSharp.SKImage.FromBitmap(comparisonBitmap); - using var outData = outImage.Encode(SkiaSharp.SKEncodedImageFormat.Png, 95); - using var outStream = File.OpenWrite(outputPath); - outData.SaveTo(outStream); - - Console.WriteLine($"[Visual Verification] Saved side-by-side comparison to {outputPath} ({totalW}x{totalH} px)"); - } - - private static SkiaSharp.SKBitmap RenderPageModelToSkiaBitmap(PdfPageModel page, float scale) - { - int w = (int)Math.Max(100, page.Width * scale); - int h = (int)Math.Max(100, page.Height * scale); - var bitmap = new SkiaSharp.SKBitmap(w, h); - using var canvas = new SkiaSharp.SKCanvas(bitmap); - - var bgPaint = new SkiaSharp.SKPaint - { - Color = SkiaSharp.SKColor.TryParse(page.BackgroundColorHex, out var bgC) ? bgC : SkiaSharp.SKColors.White, - Style = SkiaSharp.SKPaintStyle.Fill - }; - canvas.DrawRect(0, 0, w, h, bgPaint); - - var sorted = page.Elements.OrderBy(e => e.ZIndex).ThenBy(e => e.Y).ThenBy(e => e.X).ToList(); - foreach (var el in sorted) - { - canvas.Save(); - - float ex = (float)el.X * scale; - float ey = (float)el.Y * scale; - float ew = (float)el.Width * scale; - float eh = (float)el.Height * scale; - - if (el.Rotation != 0) - { - canvas.RotateDegrees((float)el.Rotation, ex + (ew / 2f), ey + (eh / 2f)); - } - - byte alpha = (byte)Math.Clamp((int)(el.Opacity * 255), 0, 255); - - if (el is PdfImageElement img && !string.IsNullOrEmpty(img.Base64Data)) - { - try - { - byte[] imgBytes = Convert.FromBase64String(img.Base64Data); - using var skData = SkiaSharp.SKData.CreateCopy(imgBytes); - using var skImg = SkiaSharp.SKImage.FromEncodedData(skData); - if (skImg != null) - { - using var imgPaint = new SkiaSharp.SKPaint { Color = new SkiaSharp.SKColor(255, 255, 255, alpha) }; - var destRect = SkiaSharp.SKRect.Create(ex, ey, ew, eh); - canvas.DrawImage(skImg, destRect, imgPaint); - } - } - catch { } - } - else if (el is PdfSvgElement svg && !string.IsNullOrWhiteSpace(svg.SvgSource)) - { - try - { - byte[]? pngBytes = PdfEditorApp.Services.Tools.Core.PdfPageRenderer.RenderSvgToPngBytes(svg.SvgSource, ew, eh); - if (pngBytes != null && pngBytes.Length > 0) - { - using var skData = SkiaSharp.SKData.CreateCopy(pngBytes); - using var skImg = SkiaSharp.SKImage.FromEncodedData(skData); - if (skImg != null) - { - using var imgPaint = new SkiaSharp.SKPaint { Color = new SkiaSharp.SKColor(255, 255, 255, alpha) }; - var destRect = SkiaSharp.SKRect.Create(ex, ey, ew, eh); - canvas.DrawImage(skImg, destRect, imgPaint); - } - } - } - catch { } - } - else if (el is PdfShapeElement shp) - { - if (shp.ShapeType == ShapeType.CustomSvgPath && !string.IsNullOrWhiteSpace(shp.CustomPathData)) - { - using var skPath = SkiaSharp.SKPath.ParseSvgPathData(shp.CustomPathData); - if (skPath != null) - { - canvas.Save(); - canvas.Translate(ex, ey); - if (scale != 1.0f) - { - canvas.Scale(scale, scale); - } - - if (shp.FillColorHex != "Transparent" && SkiaSharp.SKColor.TryParse(shp.FillColorHex, out var fillC)) - { - using var fPaint = new SkiaSharp.SKPaint - { - Color = fillC.WithAlpha(alpha), - Style = SkiaSharp.SKPaintStyle.Fill, - IsAntialias = true - }; - canvas.DrawPath(skPath, fPaint); - } - - if (shp.StrokeColorHex != "Transparent" && shp.StrokeThickness > 0 && SkiaSharp.SKColor.TryParse(shp.StrokeColorHex, out var strokeC)) - { - using var sPaint = new SkiaSharp.SKPaint - { - Color = strokeC.WithAlpha(alpha), - Style = SkiaSharp.SKPaintStyle.Stroke, - StrokeWidth = (float)shp.StrokeThickness, - IsAntialias = true - }; - canvas.DrawPath(skPath, sPaint); - } - - canvas.Restore(); - } - } - else - { - if (shp.FillColorHex != "Transparent" && SkiaSharp.SKColor.TryParse(shp.FillColorHex, out var fillC)) - { - using var fPaint = new SkiaSharp.SKPaint - { - Color = fillC.WithAlpha(alpha), - Style = SkiaSharp.SKPaintStyle.Fill, - IsAntialias = true - }; - if (shp.CornerRadius > 0) - canvas.DrawRoundRect(ex, ey, ew, eh, (float)shp.CornerRadius * scale, (float)shp.CornerRadius * scale, fPaint); - else - canvas.DrawRect(ex, ey, ew, eh, fPaint); - } - - if (shp.StrokeColorHex != "Transparent" && shp.StrokeThickness > 0 && SkiaSharp.SKColor.TryParse(shp.StrokeColorHex, out var strokeC)) - { - using var sPaint = new SkiaSharp.SKPaint - { - Color = strokeC.WithAlpha(alpha), - Style = SkiaSharp.SKPaintStyle.Stroke, - StrokeWidth = (float)shp.StrokeThickness * scale, - IsAntialias = true - }; - if (shp.CornerRadius > 0) - canvas.DrawRoundRect(ex, ey, ew, eh, (float)shp.CornerRadius * scale, (float)shp.CornerRadius * scale, sPaint); - else - canvas.DrawRect(ex, ey, ew, eh, sPaint); - } - } - } - else if (el is PdfDividerElement div) - { - if (SkiaSharp.SKColor.TryParse(div.ColorHex, out var divC)) - { - using var dPaint = new SkiaSharp.SKPaint - { - Color = divC.WithAlpha(alpha), - Style = SkiaSharp.SKPaintStyle.Fill, - IsAntialias = true - }; - if (div.IsVertical) - { - canvas.DrawRect(ex, ey, Math.Max(1f, (float)div.Thickness * scale), eh, dPaint); - } - else - { - canvas.DrawRect(ex, ey, ew, Math.Max(1f, (float)div.Thickness * scale), dPaint); - } - } - } - else if (el is PdfTableElement tbl) - { - using var borderPaint = new SkiaSharp.SKPaint - { - Color = SkiaSharp.SKColor.TryParse(tbl.BorderColorHex, out var bc) ? bc : SkiaSharp.SKColors.Black, - Style = SkiaSharp.SKPaintStyle.Stroke, - StrokeWidth = 1f * scale - }; - canvas.DrawRect(ex, ey, ew, eh, borderPaint); - - float totalRows = 1 + tbl.Rows.Count; - float rowH = eh / Math.Max(1, totalRows); - float colW = ew / Math.Max(1, tbl.Headers.Count); - - // Header background - using var hBgPaint = new SkiaSharp.SKPaint - { - Color = SkiaSharp.SKColor.TryParse(tbl.HeaderBackgroundHex, out var hbc) ? hbc : new SkiaSharp.SKColor(218, 233, 248), - Style = SkiaSharp.SKPaintStyle.Fill - }; - canvas.DrawRect(ex, ey, ew, rowH, hBgPaint); - - var hTextColor = SkiaSharp.SKColor.TryParse(tbl.HeaderTextHex, out var htc) ? htc : SkiaSharp.SKColors.Black; - using var hTextPaint = new SkiaSharp.SKPaint { Color = hTextColor, IsAntialias = true }; - using var cellTextPaint = new SkiaSharp.SKPaint { Color = SkiaSharp.SKColors.Black, IsAntialias = true }; - using var hFont = new SkiaSharp.SKFont(SkiaSharp.SKTypeface.FromFamilyName("Arial", SkiaSharp.SKFontStyleWeight.Bold, SkiaSharp.SKFontStyleWidth.Normal, SkiaSharp.SKFontStyleSlant.Upright), 9.5f * scale); - using var cellFont = new SkiaSharp.SKFont(SkiaSharp.SKTypeface.FromFamilyName("Arial", SkiaSharp.SKFontStyleWeight.Normal, SkiaSharp.SKFontStyleWidth.Normal, SkiaSharp.SKFontStyleSlant.Upright), 9.0f * scale); - - for (int c = 0; c < tbl.Headers.Count; c++) - { - canvas.DrawText(tbl.Headers[c], ex + (c * colW) + 5, ey + rowH - 4, hFont, hTextPaint); - canvas.DrawLine(ex + (c * colW), ey, ex + (c * colW), ey + eh, borderPaint); - } - - for (int r = 0; r < tbl.Rows.Count; r++) - { - float rY = ey + ((r + 1) * rowH); - canvas.DrawLine(ex, rY, ex + ew, rY, borderPaint); - - var row = tbl.Rows[r]; - for (int c = 0; c < Math.Min(tbl.Headers.Count, row.Count); c++) - { - canvas.DrawText(row[c], ex + (c * colW) + 5, rY + rowH - 4, cellFont, cellTextPaint); - } - } - } - else if (el is PdfTextElement txt && !string.IsNullOrEmpty(txt.Text)) - { - var txtColor = SkiaSharp.SKColor.TryParse(txt.TextColorHex, out var tc) ? tc : SkiaSharp.SKColors.Black; - using var tPaint = new SkiaSharp.SKPaint - { - Color = txtColor.WithAlpha(alpha), - IsAntialias = true - }; - - var weight = txt.IsBold ? SkiaSharp.SKFontStyleWeight.Bold : SkiaSharp.SKFontStyleWeight.Normal; - var slant = txt.IsItalic ? SkiaSharp.SKFontStyleSlant.Italic : SkiaSharp.SKFontStyleSlant.Upright; - using var typeface = MatchSkiaTypeface(txt.FontFamily, txt.Text, weight, slant); - using var font = new SkiaSharp.SKFont(typeface, (float)txt.FontSize * scale); - - double multiplier = txt.LineHeight > 0.1 ? txt.LineHeight : 1.35; - float linePitch = (float)(txt.FontSize * multiplier) * scale; - var lines = txt.Text.Split('\n'); - float curY = ey + ((float)txt.FontSize * scale * 0.90f); // baseline approximation - - for (int li = 0; li < lines.Length; li++) - { - string lineText = lines[li]; - if (lineText.Contains('➢')) - { - using var symTypeface = SkiaSharp.SKTypeface.FromFamilyName("Apple Symbols", weight, SkiaSharp.SKFontStyleWidth.Normal, slant) - ?? SkiaSharp.SKTypeface.FromFamilyName("Arial Unicode MS", weight, SkiaSharp.SKFontStyleWidth.Normal, slant) - ?? typeface; - using var symFont = new SkiaSharp.SKFont(symTypeface, (float)txt.FontSize * scale); - canvas.DrawText(lineText, ex, curY, symFont, tPaint); - } - else - { - canvas.DrawText(lineText, ex, curY, font, tPaint); - } - curY += linePitch; - } - } - - canvas.Restore(); - } - - return bitmap; - } - - private static SkiaSharp.SKTypeface MatchSkiaTypeface(string fontFamily, string text, SkiaSharp.SKFontStyleWeight weight, SkiaSharp.SKFontStyleSlant slant) - { - if (PdfEditorApp.Core.Analysis.UnicodeScriptDetector.ContainsDevanagari(text)) - { - string[] devanagariFamilies = { "Noto Sans Devanagari", "Kohinoor Devanagari", "Devanagari Sangam MN", "Nirmala UI", "Mangal", "Arial Unicode MS" }; - foreach (var fam in devanagariFamilies) - { - var dtf = SkiaSharp.SKTypeface.FromFamilyName(fam, weight, SkiaSharp.SKFontStyleWidth.Normal, slant); - if (dtf != null && !dtf.FamilyName.Equals("Arial", StringComparison.OrdinalIgnoreCase) && !dtf.FamilyName.Equals("Helvetica", StringComparison.OrdinalIgnoreCase)) - return dtf; - } - } - else if (PdfEditorApp.Core.Analysis.UnicodeScriptDetector.ContainsCjk(text)) - { - string[] cjkFamilies = { "Noto Sans SC", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "SimSun" }; - foreach (var fam in cjkFamilies) - { - var ctf = SkiaSharp.SKTypeface.FromFamilyName(fam, weight, SkiaSharp.SKFontStyleWidth.Normal, slant); - if (ctf != null && !ctf.FamilyName.Equals("Arial", StringComparison.OrdinalIgnoreCase)) - return ctf; - } - } - - return SkiaSharp.SKTypeface.FromFamilyName(fontFamily, weight, SkiaSharp.SKFontStyleWidth.Normal, slant) - ?? SkiaSharp.SKTypeface.Default; - } - - [Fact] - public void PdfViewerViewModel_RequestPagesVisible_RendersVisiblePagesAndDisposesFarPages() - { - var vm = new PdfViewerViewModel(); - for (int i = 1; i <= 30; i++) - { - vm.Pages.Add(new PdfViewerPageItem - { - PageNumber = i, - WidthPoints = 500, - HeightPoints = 700 - }); - } - - // Simulate user scrolling down to Page 18 - vm.RequestPagesVisible(18, 18); - - var page18 = vm.Pages[17]; - Assert.Equal(18, page18.PageNumber); - - // Changing CurrentPageNumber moves selection cleanly - vm.CurrentPageNumber = 18; - Assert.True(page18.IsSelected); - Assert.False(vm.Pages[0].IsSelected); - Assert.Equal(18, vm.CurrentPageNumber); - Assert.Equal(18, vm.SelectedPage?.PageNumber); - } -} - diff --git a/tests/PdfEditorApp.Tests/PdfLayoutAnalyzerTests.cs b/tests/PdfEditorApp.Tests/PdfLayoutAnalyzerTests.cs deleted file mode 100644 index f59ca5d..0000000 --- a/tests/PdfEditorApp.Tests/PdfLayoutAnalyzerTests.cs +++ /dev/null @@ -1,266 +0,0 @@ -using System; -using System.IO; -using System.Linq; -using System.Threading.Tasks; -using PdfEditorApp.Core.Analysis; -using PdfEditorApp.Core.Deconstruction; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; -using PdfEditorApp.Core.Utils; -using PdfEditorApp.Models; -using PdfEditorApp.Services; -using PdfEditorApp.Templates; -using PdfEditorApp.ViewModels; -using PdfEditorApp.ViewModels.ElementViewModels; -using Xunit; - -namespace PdfEditorApp.Tests; - -public class PdfLayoutAnalyzerTests -{ - private readonly IPdfExportService _exportService = new PdfExportService(); - private readonly ITemplateService _templateService = new TemplateService(); - private readonly IPdfImportService _importService = new PdfImportService(); - - [Fact] - public void NormalizeFontFamily_MapsCommonPdfFontNamesToCleanFamilies() - { - // Latin - Sans-Serif - Assert.Equal("Arial", PdfLayoutAnalyzer.NormalizeFontFamily("ABCDEE+Arial-BoldMT")); - Assert.Equal("Roboto", PdfLayoutAnalyzer.NormalizeFontFamily("Roboto-Medium")); - Assert.Equal("Inter", PdfLayoutAnalyzer.NormalizeFontFamily("Inter-Regular")); - Assert.Equal("Open Sans", PdfLayoutAnalyzer.NormalizeFontFamily("OpenSans-Regular")); - Assert.Equal("Open Sans", PdfLayoutAnalyzer.NormalizeFontFamily("SegoeUI-Semibold")); // Segoe → Open Sans cross-platform - Assert.Equal("Lato", PdfLayoutAnalyzer.NormalizeFontFamily("Lato-Bold")); - Assert.Equal("Poppins", PdfLayoutAnalyzer.NormalizeFontFamily("Poppins-SemiBold")); - Assert.Equal("Ubuntu", PdfLayoutAnalyzer.NormalizeFontFamily("Ubuntu-Regular")); - - // Latin - Serif - Assert.Equal("PT Serif", PdfLayoutAnalyzer.NormalizeFontFamily("TimesNewRomanPS-Italic")); // Times → PT Serif - Assert.Equal("PT Serif", PdfLayoutAnalyzer.NormalizeFontFamily("Georgia-Bold")); - Assert.Equal("Crimson Text", PdfLayoutAnalyzer.NormalizeFontFamily("Garamond-Regular")); - Assert.Equal("Merriweather", PdfLayoutAnalyzer.NormalizeFontFamily("Merriweather-Light")); - Assert.Equal("Playfair Display", PdfLayoutAnalyzer.NormalizeFontFamily("PlayfairDisplay-Bold")); - - // Monospace - Assert.Equal("Fira Code", PdfLayoutAnalyzer.NormalizeFontFamily("CourierNewPSMT")); // Courier → Fira Code - - // Indian Scripts - Assert.Equal("Noto Sans Devanagari", PdfLayoutAnalyzer.NormalizeFontFamily("NirmalaUI-Bold")); - Assert.Equal("Noto Sans Devanagari", PdfLayoutAnalyzer.NormalizeFontFamily("Mangal")); - Assert.Equal("Noto Sans Tamil", PdfLayoutAnalyzer.NormalizeFontFamily("Latha-Regular")); - Assert.Equal("Noto Sans Telugu", PdfLayoutAnalyzer.NormalizeFontFamily("Gautami")); - Assert.Equal("Noto Sans Arabic", PdfLayoutAnalyzer.NormalizeFontFamily("Arabic-Regular")); - Assert.Equal("Noto Sans Bengali", PdfLayoutAnalyzer.NormalizeFontFamily("Vrinda-Bengali")); - - // Null/empty fallback → Open Sans (clean default) - Assert.Equal("Open Sans", PdfLayoutAnalyzer.NormalizeFontFamily(null)); - Assert.Equal("Open Sans", PdfLayoutAnalyzer.NormalizeFontFamily("")); - Assert.Equal("Open Sans", PdfLayoutAnalyzer.NormalizeFontFamily("SomeObscureUnknownFont123")); - } - - [Fact] - public async Task PdfDeconstructionEngine_ImportsAnnualReport_ClustersParagraphsAndRetainsCleanCanvas() - { - // 1. Generate multi-page annual report - var reportDoc = _templateService.CreateAnnualReportTemplate(); - byte[] pdfBytes = _exportService.GeneratePdfBytes(reportDoc); - - // 2. Deconstruct using PdfDeconstructionEngine - var deconstructed = PdfDeconstructionEngine.Deconstruct(pdfBytes, "Annual_Report.pdf"); - - Assert.NotNull(deconstructed); - Assert.Equal(3, deconstructed.Pages.Count); - - var page1 = deconstructed.Pages[0]; - Assert.Equal(PageFormat.A4, page1.Format); - Assert.Equal("#FFFFFF", page1.BackgroundColorHex); - - // Verify no raster ghost background image was created - var bgImage = page1.Elements.OfType().FirstOrDefault(img => img.AltText.Contains("Background Canvas")); - Assert.Null(bgImage); - - // Verify text elements are extracted and have clean bounding boxes - var textElements = page1.Elements.OfType().ToList(); - Assert.NotEmpty(textElements); - - foreach (var txt in textElements) - { - Assert.False(string.IsNullOrWhiteSpace(txt.Text)); - Assert.True(txt.Width > 0); - Assert.True(txt.Height > 0); - Assert.False(string.IsNullOrWhiteSpace(txt.FontFamily)); - Assert.True(txt.FontSize >= 6); - } - } - - [Fact] - public async Task PdfDeconstructionEngine_EditImportedText_SavesAndExportsCleanlyWithoutUnderlyingArtifacts() - { - // 1. Create invoice PDF - var originalInvoice = _templateService.CreateInvoiceTemplate(); - byte[] originalBytes = _exportService.GeneratePdfBytes(originalInvoice); - - // 2. Import into model - var imported = await _importService.ImportPdfBytesAsync(originalBytes, "Invoice_To_Edit.pdf"); - Assert.NotNull(imported); - var page = imported.Pages[0]; - - // 3. Count elements before edit - int elementCountBefore = page.Elements.Count; - Assert.True(elementCountBefore > 0, "Imported page must have elements before editing"); - - // 4. Edit first text element (simulates user editing in Studio) - var textElement = page.Elements.OfType().First(); - textElement.Text = "FryPDF Super Invoice"; - textElement.Width = 300; - textElement.Height = 30; - - // 5. Export modified document — must produce valid PDF bytes - byte[] modifiedBytes = _exportService.GeneratePdfBytes(imported); - Assert.NotNull(modifiedBytes); - Assert.True(modifiedBytes.Length > 1000, "Exported PDF must have substantial content"); - - // 6. Verify re-import succeeds (no crash, correct page count) - var reimported = await _importService.ImportPdfBytesAsync(modifiedBytes, "Modified_Invoice.pdf"); - Assert.NotNull(reimported); - Assert.Single(reimported.Pages); - Assert.NotEmpty(reimported.Pages[0].Elements); - } - - [Fact] - public void PdfDocumentSanitizer_SanitizePdfBytes_EnsuresEofTermination() - { - byte[] rawBytes = System.Text.Encoding.ASCII.GetBytes("%PDF-1.7\n1 0 obj\n<< /Type /Catalog >>\nendobj\n"); - byte[] sanitized = PdfDocumentSanitizer.SanitizePdfBytes(rawBytes); - - string sanitizedText = System.Text.Encoding.ASCII.GetString(sanitized); - Assert.Contains("%%EOF", sanitizedText); - } - - [Fact] - public void UnicodeScriptDetector_DetectsRtlAndDevanagari() - { - string arabic = "مرحبا بكم في عالم الابتكار"; - string hebrew = "שלום עולם"; - string hindi = "नमस्ते भारत"; - string english = "Welcome to FryPDF Studio"; - - Assert.True(UnicodeScriptDetector.IsRtlText(arabic)); - Assert.True(UnicodeScriptDetector.IsRtlText(hebrew)); - Assert.False(UnicodeScriptDetector.IsRtlText(hindi)); - Assert.False(UnicodeScriptDetector.IsRtlText(english)); - - Assert.True(UnicodeScriptDetector.ContainsDevanagari(hindi)); - Assert.False(UnicodeScriptDetector.ContainsDevanagari(english)); - } - - [Fact] - public void PageViewModel_GroupAndUngroup_ManagesGroupIds() - { - var page = new PageViewModel(); - var t1 = new TextElementViewModel { Text = "Header", X = 10, Y = 10, Width = 100, Height = 30 }; - var t2 = new TextElementViewModel { Text = "Body", X = 10, Y = 50, Width = 100, Height = 50 }; - var s1 = new ShapeElementViewModel { X = 5, Y = 5, Width = 120, Height = 100 }; - - page.AddElement(t1); - page.AddElement(t2); - page.AddElement(s1); - - page.SelectElements(new ElementViewModelBase[] { t1, t2, s1 }); - Assert.Equal(3, page.SelectedElements.Count); - - page.GroupSelected(); - Assert.NotNull(t1.GroupId); - Assert.Equal(t1.GroupId, t2.GroupId); - Assert.Equal(t1.GroupId, s1.GroupId); - - page.UngroupSelected(); - Assert.Null(t1.GroupId); - Assert.Null(t2.GroupId); - Assert.Null(s1.GroupId); - } - - [Fact] - public void PageViewModel_SmartAlignmentTools_AlignsElementsAccurately() - { - var page = new PageViewModel(); - var e1 = new TextElementViewModel { X = 10, Y = 20, Width = 100, Height = 30 }; - var e2 = new TextElementViewModel { X = 50, Y = 80, Width = 80, Height = 40 }; - var e3 = new TextElementViewModel { X = 150, Y = 150, Width = 120, Height = 50 }; - - page.AddElement(e1); - page.AddElement(e2); - page.AddElement(e3); - page.SelectElements(new[] { e1, e2, e3 }); - - // Align Left: All X should be minX = 10 - page.AlignSelectedLeft(); - Assert.Equal(10, e1.X); - Assert.Equal(10, e2.X); - Assert.Equal(10, e3.X); - - // Align Top: All Y should be minY = 20 - page.AlignSelectedTop(); - Assert.Equal(20, e1.Y); - Assert.Equal(20, e2.Y); - Assert.Equal(20, e3.Y); - - // Set distinct X positions and test Distribute Horizontally - e1.X = 10; - e2.X = 80; - e3.X = 250; - page.DistributeSelectedHorizontally(); - Assert.Equal(10, e1.X); - Assert.True(e2.X > e1.X + e1.Width); - Assert.True(e3.X > e2.X + e2.Width); - } - - /// - /// Regression test: Verify that Rotate270 marginalia text from vertical margins - /// (sample1.pdf) is extracted with Rotation=270 and that CanvasX/CanvasY are placed - /// so that the rotation pivot falls at the PDF text center (correct geometric placement). - /// - [Fact] - public async Task GovernmentId_Rotate270MarginaliaText_HasCorrectRotationAndPlacement() - { - string baseDir = AppContext.BaseDirectory; - string rootDir = Path.GetFullPath(Path.Combine(baseDir, "..", "..", "..", "..", "..")); - string sample1Path = Path.Combine(rootDir, "sample1.pdf"); - if (!File.Exists(sample1Path)) return; // Skip if not present in CI - - var doc = await _importService.ImportPdfAsync(sample1Path); - Assert.NotNull(doc); - Assert.NotEmpty(doc.Pages); - - var page1 = doc.Pages[0]; - var textElements = page1.Elements.OfType().ToList(); - - // 1. Verify at least some rotated text elements exist (document has left-margin marginalia) - var rotated270 = textElements.Where(t => t.Rotation == 270.0).ToList(); - Assert.NotEmpty(rotated270); - - // 2. Verify at least one element contains marginalia text - var marginaliaEl = rotated270.FirstOrDefault(t => t.Text.Length > 5); - Assert.NotNull(marginaliaEl); - - // 3. Verify the element has positive Width and Height (unrotated dimensions) - Assert.True(marginaliaEl.Width > 0, "Rotated text element must have positive Width"); - Assert.True(marginaliaEl.Height > 0, "Rotated text element must have positive Height"); - - // 4. Verify Width (text run length) >> Height (font thickness): for a long string like - // marginalia text, Width should be significantly larger than Height. - Assert.True(marginaliaEl.Width > marginaliaEl.Height * 2, - $"For rotated marginalia, Width ({marginaliaEl.Width:F1}) should be much larger than Height ({marginaliaEl.Height:F1})"); - - // 5. The canvas X position should be near the left margin of the page. - // After 270° rotation, the visual left edge = CanvasX + Width/2 - Height/2. - // The pivot (center of element) must be near the original PDF text X center (~59-62pt). - double pivotX = marginaliaEl.X + (marginaliaEl.Width / 2.0); - Assert.True(pivotX < 150, $"Left-margin rotated text pivot X ({pivotX:F1}) should be near left margin (<150pt)"); - - // 6. Verify CanvasY is within page bounds - Assert.True(marginaliaEl.Y >= 0, "CanvasY must be non-negative"); - Assert.True(marginaliaEl.Y < page1.Height, $"CanvasY ({marginaliaEl.Y:F1}) must be within page height ({page1.Height:F1}pt)"); - } -} diff --git a/tests/PdfEditorApp.Tests/PdfReaderTests.cs b/tests/PdfEditorApp.Tests/PdfReaderTests.cs deleted file mode 100644 index 3f2d533..0000000 --- a/tests/PdfEditorApp.Tests/PdfReaderTests.cs +++ /dev/null @@ -1,695 +0,0 @@ -using System; -using System.IO; -using System.Linq; -using System.Threading.Tasks; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Models; -using PdfEditorApp.Services; -using PdfEditorApp.Templates; -using PdfEditorApp.ViewModels; -using Xunit; - -namespace PdfEditorApp.Tests; - -public class PdfReaderTests -{ - private readonly IPdfExportService _exportService = new PdfExportService(); - private readonly ITemplateService _templateService = new TemplateService(); - - private byte[] CreateSamplePdfBytes(int pageCount = 3) - { - var model = _templateService.CreateAnnualReportTemplate(); - return _exportService.GeneratePdfBytes(model); - } - - [Fact] - public async Task PdfViewer_LoadsDocument_PopulatesMetadataAndSpreads() - { - var vm = new PdfViewerViewModel(); - byte[] pdfBytes = CreateSamplePdfBytes(); - - await vm.LoadDocumentBytesAsync(pdfBytes, "SampleReport.pdf"); - - Assert.True(vm.HasDocument); - Assert.False(vm.IsLoading); - Assert.Equal("SampleReport.pdf", vm.DocumentTitle); - Assert.Equal(3, vm.TotalPagesCount); - Assert.Equal(1, vm.CurrentPageNumber); - Assert.NotNull(vm.SelectedPage); - Assert.Equal(3, vm.Pages.Count); - Assert.NotEmpty(vm.MetadataItems); - Assert.NotEmpty(vm.PageSpreads); - Assert.Equal("Page 1 (Cover)", vm.PageSpreads[0].SpreadLabel); - } - - [Fact] - public async Task PdfViewer_PageNavigationAndDirectJump_UpdatesStateCorrectly() - { - var vm = new PdfViewerViewModel(); - byte[] pdfBytes = CreateSamplePdfBytes(); - await vm.LoadDocumentBytesAsync(pdfBytes, "SampleReport.pdf"); - - // Next page - vm.NextPageCommand.Execute(null); - Assert.Equal(2, vm.CurrentPageNumber); - Assert.Equal("2", vm.JumpPageText); - Assert.Equal(2, vm.SelectedPage?.PageNumber); - - // Previous page - vm.PreviousPageCommand.Execute(null); - Assert.Equal(1, vm.CurrentPageNumber); - - // Last page - vm.LastPageCommand.Execute(null); - Assert.Equal(3, vm.CurrentPageNumber); - - // First page - vm.FirstPageCommand.Execute(null); - Assert.Equal(1, vm.CurrentPageNumber); - - // Direct Page Jump - vm.JumpPageText = "3"; - vm.CommitJumpPageCommand.Execute(null); - Assert.Equal(3, vm.CurrentPageNumber); - - // Invalid Page Jump resets to current - vm.JumpPageText = "99"; - vm.CommitJumpPageCommand.Execute(null); - Assert.Equal(3, vm.CurrentPageNumber); - Assert.Equal("3", vm.JumpPageText); - } - - [Fact] - public async Task PdfViewer_LayoutModes_TogglesContinuousSingleAndSpread() - { - var vm = new PdfViewerViewModel(); - byte[] pdfBytes = CreateSamplePdfBytes(); - await vm.LoadDocumentBytesAsync(pdfBytes, "SampleReport.pdf"); - - Assert.Equal(PdfViewLayoutMode.ContinuousScroll, vm.SelectedLayoutMode); - Assert.True(vm.IsContinuousScroll); - Assert.False(vm.IsSinglePageMode); - Assert.False(vm.IsTwoPageSpreadMode); - - // Switch to Single Page - vm.SetLayoutModeCommand.Execute("SinglePage"); - Assert.Equal(PdfViewLayoutMode.SinglePage, vm.SelectedLayoutMode); - Assert.False(vm.IsContinuousScroll); - Assert.True(vm.IsSinglePageMode); - Assert.False(vm.IsTwoPageSpreadMode); - - // Switch to Two-Page Spread - vm.SetLayoutModeCommand.Execute("TwoPageSpread"); - Assert.Equal(PdfViewLayoutMode.TwoPageSpread, vm.SelectedLayoutMode); - Assert.False(vm.IsContinuousScroll); - Assert.False(vm.IsSinglePageMode); - Assert.True(vm.IsTwoPageSpreadMode); - Assert.Equal(2, vm.PageSpreads.Count); // Cover (p1) + Spread (p2-p3) - } - - [Fact] - public async Task PdfViewer_ReadingThemes_SwitchesThemesAndUpdatesColors() - { - var vm = new PdfViewerViewModel(); - byte[] pdfBytes = CreateSamplePdfBytes(); - await vm.LoadDocumentBytesAsync(pdfBytes, "SampleReport.pdf"); - - // Default theme - Assert.Equal(PdfReaderTheme.Default, vm.ReadingTheme); - Assert.True(vm.IsThemeDefault); - Assert.Equal("#FFFFFF", vm.ThemePaperBackgroundHex); - - // Sepia - vm.SetReadingThemeCommand.Execute("Sepia"); - Assert.Equal(PdfReaderTheme.Sepia, vm.ReadingTheme); - Assert.True(vm.IsThemeSepia); - Assert.Equal("#FBF0D9", vm.ThemePaperBackgroundHex); - Assert.Equal("#433422", vm.ThemeTextColorHex); - - // Dark Night Mode - vm.SetReadingThemeCommand.Execute("Dark"); - Assert.Equal(PdfReaderTheme.Dark, vm.ReadingTheme); - Assert.True(vm.IsThemeDark); - Assert.Equal("#1E293B", vm.ThemePaperBackgroundHex); - Assert.Equal("#F1F5F9", vm.ThemeTextColorHex); - - // High Contrast - vm.SetReadingThemeCommand.Execute("HighContrast"); - Assert.Equal(PdfReaderTheme.HighContrast, vm.ReadingTheme); - Assert.True(vm.IsThemeHighContrast); - Assert.Equal("#000000", vm.ThemePaperBackgroundHex); - Assert.Equal("#FFFF00", vm.ThemeTextColorHex); - } - - [Fact] - public async Task PdfViewer_ZoomOperations_ClampsWithinSafeBounds() - { - var vm = new PdfViewerViewModel(); - byte[] pdfBytes = CreateSamplePdfBytes(); - await vm.LoadDocumentBytesAsync(pdfBytes, "SampleReport.pdf"); - - Assert.Equal(1.0, vm.ZoomLevel); - Assert.Equal("100%", vm.ZoomPercentageText); - - vm.ZoomInCommand.Execute(null); - Assert.Equal(1.25, vm.ZoomLevel); - Assert.Equal("125%", vm.ZoomPercentageText); - - vm.FitToWidthCommand.Execute(null); - Assert.Equal(1.35, vm.ZoomLevel); - - vm.FitToPageCommand.Execute(null); - Assert.Equal(0.95, vm.ZoomLevel); - - vm.SetZoomPresetCommand.Execute("200%"); - Assert.Equal(2.0, vm.ZoomLevel); - - vm.ResetZoomCommand.Execute(null); - Assert.Equal(1.0, vm.ZoomLevel); - } - - [Fact] - public async Task PdfViewer_ReviewAnnotations_AddsHighlightsStickyNotesAndStamps() - { - var vm = new PdfViewerViewModel(); - byte[] pdfBytes = CreateSamplePdfBytes(); - await vm.LoadDocumentBytesAsync(pdfBytes, "SampleReport.pdf"); - - // 1. Add Highlight - vm.AddHighlightAnnotationCommand.Execute("#A7F3D0"); - Assert.Single(vm.Annotations); - Assert.Equal("Highlight", vm.Annotations[0].Type); - Assert.Equal("#A7F3D0", vm.Annotations[0].ColorHex); - Assert.Single(vm.SelectedPage!.PageAnnotations); - - // 2. Add Sticky Note - vm.NewNoteText = "Check Q3 audit numbers."; - vm.ConfirmAddNoteCommand.Execute(null); - Assert.Equal(2, vm.Annotations.Count); - Assert.Equal("StickyNote", vm.Annotations[1].Type); - Assert.Equal("Check Q3 audit numbers.", vm.Annotations[1].Content); - - // 3. Add Stamp - vm.AddStampCommand.Execute("APPROVED"); - Assert.Equal(3, vm.Annotations.Count); - Assert.Equal("Stamp", vm.Annotations[2].Type); - Assert.Contains("APPROVED", vm.Annotations[2].Content); - - // 4. Delete Annotation - var toDelete = vm.Annotations[0]; - vm.DeleteAnnotationCommand.Execute(toDelete); - Assert.Equal(2, vm.Annotations.Count); - Assert.DoesNotContain(toDelete, vm.Annotations); - } - - [Fact] - public async Task PdfViewer_VisualRotation_RotatesPageAndAllPages() - { - var vm = new PdfViewerViewModel(); - byte[] pdfBytes = CreateSamplePdfBytes(); - await vm.LoadDocumentBytesAsync(pdfBytes, "SampleReport.pdf"); - - Assert.Equal(0, vm.SelectedPage?.RotationAngle); - - vm.RotateClockwiseCommand.Execute(null); - Assert.Equal(90, vm.SelectedPage?.RotationAngle); - - vm.RotateCounterClockwiseCommand.Execute(null); - Assert.Equal(0, vm.SelectedPage?.RotationAngle); - - vm.RotateAllPagesClockwiseCommand.Execute(null); - Assert.All(vm.Pages, p => Assert.Equal(90, p.RotationAngle)); - } - - [Fact] - public void HomeViewModel_NavigatesToPdfReaderSection() - { - var home = new HomeViewModel(); - Assert.True(home.IsHomeSection); - Assert.False(home.IsPdfReaderSection); - - home.SelectNavSectionCommand.Execute("PdfReader"); - Assert.Equal(HomeNavSection.PdfReader, home.SelectedNavSection); - Assert.True(home.IsPdfReaderSection); - Assert.False(home.IsHomeSection); - } - - [Fact] - public async Task PdfViewer_RenderPageAtScale_RendersCustomResolutionBitmap() - { - var vm = new PdfViewerViewModel(); - byte[] pdfBytes = CreateSamplePdfBytes(); - await vm.LoadDocumentBytesAsync(pdfBytes, "SampleReport.pdf"); - - // Render Page 1 bytes at standard scale 2.75 - var bytes1 = vm.RenderPageBytesAtScale(1, 2.75f); - Assert.NotNull(bytes1); - Assert.True(bytes1.Length > 0); - - // Render Page 1 bytes at high-DPI zoom scale 4.0 - var bytesHigh = vm.RenderPageBytesAtScale(1, 4.0f); - Assert.NotNull(bytesHigh); - Assert.True(bytesHigh.Length > bytes1.Length); - } - - [Fact] - public async Task PdfViewer_PageSelectionAndThumbnailClick_TriggersScrollToPageAndUpdatesIsSelected() - { - var vm = new PdfViewerViewModel(); - byte[] pdfBytes = CreateSamplePdfBytes(3); - await vm.LoadDocumentBytesAsync(pdfBytes, "SampleReport.pdf"); - - int requestedPage = 0; - vm.ScrollToPageRequested += (pageNum) => - { - requestedPage = pageNum; - }; - - // Click Page 2 Thumbnail - vm.SelectPage(vm.Pages[1]); - - Assert.Equal(2, vm.CurrentPageNumber); - Assert.Equal(2, vm.SelectedPage?.PageNumber); - Assert.Equal(2, requestedPage); - Assert.False(vm.Pages[0].IsSelected); - Assert.True(vm.Pages[1].IsSelected); - Assert.False(vm.Pages[2].IsSelected); - - // Click Page 3 Thumbnail - vm.SelectPage(vm.Pages[2]); - - Assert.Equal(3, vm.CurrentPageNumber); - Assert.Equal(3, vm.SelectedPage?.PageNumber); - Assert.Equal(3, requestedPage); - Assert.False(vm.Pages[0].IsSelected); - Assert.False(vm.Pages[1].IsSelected); - Assert.True(vm.Pages[2].IsSelected); - - // Click Page 1 Thumbnail - vm.SelectPage(vm.Pages[0]); - - Assert.Equal(1, vm.CurrentPageNumber); - Assert.Equal(1, vm.SelectedPage?.PageNumber); - Assert.Equal(1, requestedPage); - Assert.True(vm.Pages[0].IsSelected); - Assert.False(vm.Pages[1].IsSelected); - Assert.False(vm.Pages[2].IsSelected); - } - - [Fact] - public async Task PdfViewer_JumpToBookmark_ScrollsToTargetPage() - { - var vm = new PdfViewerViewModel(); - byte[] pdfBytes = CreateSamplePdfBytes(3); - await vm.LoadDocumentBytesAsync(pdfBytes, "SampleReport.pdf"); - - int requestedPage = 0; - vm.ScrollToPageRequested += (pageNum) => - { - requestedPage = pageNum; - }; - - var bookmark = new PdfViewerBookmarkItem { Title = "Chapter 2", PageNumber = 2 }; - vm.JumpToBookmarkCommand.Execute(bookmark); - - Assert.Equal(2, vm.CurrentPageNumber); - Assert.Equal(2, vm.SelectedPage?.PageNumber); - Assert.Equal(2, requestedPage); - Assert.True(vm.Pages[1].IsSelected); - } - - [Fact] - public async Task PdfViewer_JumpToAnnotation_ScrollsToTargetPage() - { - var vm = new PdfViewerViewModel(); - byte[] pdfBytes = CreateSamplePdfBytes(3); - await vm.LoadDocumentBytesAsync(pdfBytes, "SampleReport.pdf"); - - int requestedPage = 0; - vm.ScrollToPageRequested += (pageNum) => - { - requestedPage = pageNum; - }; - - var annotation = new PdfViewerAnnotationItem { Type = "StickyNote", PageNumber = 3, Content = "Important remark", ColorHex = "#0284C7" }; - vm.JumpToAnnotationCommand.Execute(annotation); - - Assert.Equal(3, vm.CurrentPageNumber); - Assert.Equal(3, vm.SelectedPage?.PageNumber); - Assert.Equal(3, requestedPage); - Assert.True(vm.Pages[2].IsSelected); - } - - [Fact] - public async Task PdfViewer_JumpToSearchMatch_ScrollsToTargetPage() - { - var vm = new PdfViewerViewModel(); - byte[] pdfBytes = CreateSamplePdfBytes(3); - await vm.LoadDocumentBytesAsync(pdfBytes, "SampleReport.pdf"); - - int requestedPage = 0; - vm.ScrollToPageRequested += (pageNum) => - { - requestedPage = pageNum; - }; - - var match = new PdfViewerSearchMatch { PageNumber = 2, Snippet = "Search match snippet", MatchIndex = 0 }; - vm.JumpToMatchCommand.Execute(match); - - Assert.Equal(2, vm.CurrentPageNumber); - Assert.Equal(2, vm.SelectedPage?.PageNumber); - Assert.Equal(2, requestedPage); - Assert.True(vm.Pages[1].IsSelected); - } - - [Fact] - public async Task PdfViewer_TwoPageSpreadNavigation_NavigatesInTwoPageSteps() - { - var vm = new PdfViewerViewModel(); - byte[] pdfBytes = CreateSamplePdfBytes(3); - await vm.LoadDocumentBytesAsync(pdfBytes, "SampleReport.pdf"); - - vm.SetLayoutModeCommand.Execute("TwoPageSpread"); - Assert.True(vm.IsTwoPageSpreadMode); - Assert.Equal(1, vm.CurrentPageNumber); - - int requestedPage = 0; - vm.ScrollToPageRequested += (pageNum) => - { - requestedPage = pageNum; - }; - - // Next page in 2-page spread - vm.NextPageCommand.Execute(null); - Assert.Equal(3, vm.CurrentPageNumber); - Assert.Equal(3, requestedPage); - - // Previous page in 2-page spread - vm.PreviousPageCommand.Execute(null); - Assert.Equal(1, vm.CurrentPageNumber); - Assert.Equal(1, requestedPage); - } - - [Fact] - public async Task PdfViewer_FitToWidth_WithViewportProvider_DynamicallyScalesToAvailableWidth() - { - var vm = new PdfViewerViewModel(); - byte[] pdfBytes = CreateSamplePdfBytes(1); - await vm.LoadDocumentBytesAsync(pdfBytes, "SampleReport.pdf"); - - Assert.True(vm.HasDocument); - var page = vm.Pages[0]; - Assert.True(page.WidthPoints > 0); - - // Simulate viewport of 1200 width with 64px padding (32 on each side) - vm.ViewportSizeProvider = () => (1200.0, 800.0, 64.0, 64.0); - - vm.FitToWidthCommand.Execute(null); - - // Expected available width = 1200 - 64 - 8 = 1128 - // Expected zoom = 1128 / page.WidthPoints clamped and rounded to 2 decimals - double expectedZoom = Math.Clamp(Math.Round(1128.0 / page.WidthPoints, 2), 0.25, 5.0); - if (expectedZoom * page.WidthPoints > 1128.0) - { - expectedZoom = Math.Max(0.25, Math.Round(expectedZoom - 0.01, 2)); - } - - Assert.Equal(expectedZoom, vm.ZoomLevel); - Assert.True(vm.IsFitToWidthActive); - Assert.False(vm.IsFitToPageActive); - Assert.Equal(PdfViewerZoomMode.FitWidth, vm.ZoomMode); - - // Verify page width at zoom fits comfortably within available width without horizontal overflow - double renderedWidth = page.WidthPoints * vm.ZoomLevel; - Assert.True(renderedWidth <= (1200.0 - 64.0)); - } - - [Fact] - public async Task PdfViewer_FitToPage_WithViewportProvider_DynamicallyScalesToFitBothDimensions() - { - var vm = new PdfViewerViewModel(); - byte[] pdfBytes = CreateSamplePdfBytes(1); - await vm.LoadDocumentBytesAsync(pdfBytes, "SampleReport.pdf"); - - var page = vm.Pages[0]; - - // Simulate viewport of 800x600 with 64px horizontal and vertical padding - vm.ViewportSizeProvider = () => (800.0, 600.0, 64.0, 64.0); - - vm.FitToPageCommand.Execute(null); - - Assert.True(vm.IsFitToPageActive); - Assert.False(vm.IsFitToWidthActive); - Assert.Equal(PdfViewerZoomMode.FitPage, vm.ZoomMode); - - // Verify both dimensions fit within viewport minus padding - double renderedWidth = page.WidthPoints * vm.ZoomLevel; - double renderedHeight = page.HeightPoints * vm.ZoomLevel; - Assert.True(renderedWidth <= (800.0 - 64.0)); - Assert.True(renderedHeight <= (600.0 - 64.0)); - } - - [Fact] - public async Task PdfViewer_TwoPageSpread_FitToWidth_AccountsForSpreadWidth() - { - var vm = new PdfViewerViewModel(); - byte[] pdfBytes = CreateSamplePdfBytes(3); - await vm.LoadDocumentBytesAsync(pdfBytes, "SampleReport.pdf"); - - vm.SetLayoutModeCommand.Execute("TwoPageSpread"); - Assert.True(vm.IsTwoPageSpreadMode); - - // Navigate to spread with two pages (page 2 & 3) - vm.NextPageCommand.Execute(null); - Assert.NotNull(vm.SelectedSpread); - - vm.ViewportSizeProvider = () => (1600.0, 900.0, 64.0, 64.0); - vm.FitToWidthCommand.Execute(null); - - Assert.True(vm.IsFitToWidthActive); - Assert.True(vm.ZoomLevel > 0); - - if (vm.SelectedSpread.LeftPage != null && vm.SelectedSpread.RightPage != null) - { - double combinedPageWidth = (vm.SelectedSpread.LeftPage.WidthPoints + vm.SelectedSpread.RightPage.WidthPoints) * vm.ZoomLevel; - // Combined width + 16px gap must fit inside 1600 - 64 - Assert.True(combinedPageWidth + 16.0 <= (1600.0 - 64.0)); - } - } - - [Fact] - public async Task PdfViewer_ManualZoom_ExitsFitModes() - { - var vm = new PdfViewerViewModel(); - byte[] pdfBytes = CreateSamplePdfBytes(1); - await vm.LoadDocumentBytesAsync(pdfBytes, "SampleReport.pdf"); - - vm.ViewportSizeProvider = () => (1200.0, 800.0, 64.0, 64.0); - vm.FitToWidthCommand.Execute(null); - Assert.True(vm.IsFitToWidthActive); - - // Manual zoom in - vm.ZoomInCommand.Execute(null); - Assert.False(vm.IsFitToWidthActive); - Assert.False(vm.IsFitToPageActive); - Assert.Equal(PdfViewerZoomMode.Custom, vm.ZoomMode); - - // Fit to page - vm.FitToPageCommand.Execute(null); - Assert.True(vm.IsFitToPageActive); - - // Manual reset zoom - vm.ResetZoomCommand.Execute(null); - Assert.False(vm.IsFitToPageActive); - Assert.Equal(PdfViewerZoomMode.Custom, vm.ZoomMode); - } - - [Fact] - public async Task PdfViewer_DedicatedLayoutCommands_SwitchModesAndAutoFit() - { - var vm = new PdfViewerViewModel(); - byte[] pdfBytes = CreateSamplePdfBytes(3); - await vm.LoadDocumentBytesAsync(pdfBytes, "SampleReport.pdf"); - vm.ViewportSizeProvider = () => (1000.0, 700.0, 64.0, 64.0); - - // Initially Continuous Scroll - Assert.True(vm.IsContinuousScroll); - Assert.False(vm.IsSinglePageMode); - Assert.False(vm.IsTwoPageSpreadMode); - - // Switch to Single Page - vm.SetSinglePageLayoutCommand.Execute(null); - Assert.False(vm.IsContinuousScroll); - Assert.True(vm.IsSinglePageMode); - Assert.False(vm.IsTwoPageSpreadMode); - Assert.Equal(PdfViewLayoutMode.SinglePage, vm.SelectedLayoutMode); - Assert.NotNull(vm.SelectedPage); - Assert.True(vm.SelectedPage.WidthPoints > 0); - Assert.True(vm.SelectedPage.HeightPoints > 0); - Assert.True(vm.ZoomLevel > 0); - Assert.True(vm.IsFitToPageActive); - - // Switch to Two Page Spread - vm.SetTwoPageSpreadLayoutCommand.Execute(null); - Assert.False(vm.IsContinuousScroll); - Assert.False(vm.IsSinglePageMode); - Assert.True(vm.IsTwoPageSpreadMode); - Assert.Equal(PdfViewLayoutMode.TwoPageSpread, vm.SelectedLayoutMode); - Assert.NotNull(vm.SelectedSpread); - Assert.True(vm.ZoomLevel > 0); - Assert.True(vm.SelectedSpread.LeftPage != null || vm.SelectedSpread.RightPage != null); - Assert.True(vm.IsFitToPageActive); - - // Switch back to Continuous Scroll - vm.SetContinuousScrollLayoutCommand.Execute(null); - Assert.True(vm.IsContinuousScroll); - Assert.False(vm.IsSinglePageMode); - Assert.False(vm.IsTwoPageSpreadMode); - Assert.Equal(PdfViewLayoutMode.ContinuousScroll, vm.SelectedLayoutMode); - } - - [Fact] - public void PdfViewer_ReadingThemeCommands_SwitchThemesAndColors() - { - var vm = new PdfViewerViewModel(); - - // Default state - Assert.True(vm.IsThemeDefault); - Assert.False(vm.IsThemeSepia); - Assert.False(vm.IsThemeDark); - Assert.False(vm.IsThemeHighContrast); - Assert.Equal("#F1F5F9", vm.ThemeBackgroundHex); - Assert.Equal("#FFFFFF", vm.ThemePaperBackgroundHex); - - // Switch to Sepia - vm.SetSepiaReadingThemeCommand.Execute(null); - Assert.False(vm.IsThemeDefault); - Assert.True(vm.IsThemeSepia); - Assert.False(vm.IsThemeDark); - Assert.False(vm.IsThemeHighContrast); - Assert.Equal(PdfReaderTheme.Sepia, vm.ReadingTheme); - Assert.Equal("#EDE3C9", vm.ThemeBackgroundHex); - Assert.Equal("#FBF0D9", vm.ThemePaperBackgroundHex); - Assert.Equal("#433422", vm.ThemeTextColorHex); - Assert.Equal("#E6D5B8", vm.ThemeBorderColorHex); - - // Switch to Dark Night - vm.SetDarkReadingThemeCommand.Execute(null); - Assert.False(vm.IsThemeDefault); - Assert.False(vm.IsThemeSepia); - Assert.True(vm.IsThemeDark); - Assert.False(vm.IsThemeHighContrast); - Assert.Equal(PdfReaderTheme.Dark, vm.ReadingTheme); - Assert.Equal("#0F172A", vm.ThemeBackgroundHex); - Assert.Equal("#1E293B", vm.ThemePaperBackgroundHex); - Assert.Equal("#F1F5F9", vm.ThemeTextColorHex); - Assert.Equal("#334155", vm.ThemeBorderColorHex); - - // Switch to High Contrast - vm.SetHighContrastReadingThemeCommand.Execute(null); - Assert.False(vm.IsThemeDefault); - Assert.False(vm.IsThemeSepia); - Assert.False(vm.IsThemeDark); - Assert.True(vm.IsThemeHighContrast); - Assert.Equal(PdfReaderTheme.HighContrast, vm.ReadingTheme); - Assert.Equal("#000000", vm.ThemeBackgroundHex); - Assert.Equal("#000000", vm.ThemePaperBackgroundHex); - Assert.Equal("#FFFF00", vm.ThemeTextColorHex); - - // Switch back to Daylight - vm.SetDefaultReadingThemeCommand.Execute(null); - Assert.True(vm.IsThemeDefault); - Assert.False(vm.IsThemeSepia); - Assert.False(vm.IsThemeDark); - Assert.False(vm.IsThemeHighContrast); - Assert.Equal(PdfReaderTheme.Default, vm.ReadingTheme); - Assert.Equal("#F1F5F9", vm.ThemeBackgroundHex); - Assert.Equal("#FFFFFF", vm.ThemePaperBackgroundHex); - } - - [Fact] - public void PdfViewer_ApplyThemeToSkBitmap_TransformsPixels() - { - using var source = new SkiaSharp.SKBitmap(10, 10); - using (var canvas = new SkiaSharp.SKCanvas(source)) - { - canvas.Clear(SkiaSharp.SKColors.White); - } - - // Apply Dark mode - using var darkBmp = PdfViewerViewModel.ApplyThemeToSkBitmap(source, PdfReaderTheme.Dark); - Assert.NotNull(darkBmp); - Assert.Equal(10, darkBmp.Width); - Assert.Equal(10, darkBmp.Height); - - // Pure white should be darkened to dark slate - var pixel = darkBmp.GetPixel(5, 5); - Assert.True(pixel.Red < 100); - Assert.True(pixel.Green < 100); - Assert.True(pixel.Blue < 100); - - // Apply Sepia - using var sepiaBmp = PdfViewerViewModel.ApplyThemeToSkBitmap(source, PdfReaderTheme.Sepia); - Assert.NotNull(sepiaBmp); - var sepiaPixel = sepiaBmp.GetPixel(5, 5); - Assert.True(sepiaPixel.Red > sepiaPixel.Blue); // warm tint has more red than blue - } - - [Fact] - public void PdfViewer_RotateCommands_UpdateRotationAngleAndDynamicFit() - { - var vm = new PdfViewerViewModel(); - var page1 = new PdfViewerPageItem { PageNumber = 1, WidthPoints = 595, HeightPoints = 842, RotationAngle = 0 }; - var page2 = new PdfViewerPageItem { PageNumber = 2, WidthPoints = 595, HeightPoints = 842, RotationAngle = 0 }; - vm.Pages.Add(page1); - vm.Pages.Add(page2); - vm.SelectedPage = page1; - - // Initial state - Assert.Equal(0, page1.RotationAngle); - - // Rotate clockwise: 0 -> 90 -> 180 -> 270 -> 0 - vm.RotateClockwiseCommand.Execute(null); - Assert.Equal(90, page1.RotationAngle); - - vm.RotateClockwiseCommand.Execute(null); - Assert.Equal(180, page1.RotationAngle); - - vm.RotateClockwiseCommand.Execute(null); - Assert.Equal(270, page1.RotationAngle); - - vm.RotateClockwiseCommand.Execute(null); - Assert.Equal(0, page1.RotationAngle); - - // Rotate counter-clockwise: 0 -> 270 -> 180 -> 90 -> 0 - vm.RotateCounterClockwiseCommand.Execute(null); - Assert.Equal(270, page1.RotationAngle); - - vm.RotateCounterClockwiseCommand.Execute(null); - Assert.Equal(180, page1.RotationAngle); - - vm.RotateCounterClockwiseCommand.Execute(null); - Assert.Equal(90, page1.RotationAngle); - - vm.RotateCounterClockwiseCommand.Execute(null); - Assert.Equal(0, page1.RotationAngle); - - // Rotate all pages clockwise - vm.RotateAllPagesClockwiseCommand.Execute(null); - Assert.Equal(90, page1.RotationAngle); - Assert.Equal(90, page2.RotationAngle); - - // Dynamic fit to width with 90 degree rotation should use HeightPoints (842) as target width instead of WidthPoints (595) - vm.FitToWidthDynamic(viewportWidth: 1000, horizontalPadding: 64); - double expectedZoom90 = Math.Clamp(Math.Round((1000 - 64 - 8) / 842.0, 2), 0.25, 5.0); - Assert.Equal(expectedZoom90, vm.ZoomLevel); - - // Rotate back to 0 - page1.RotationAngle = 0; - vm.FitToWidthDynamic(viewportWidth: 1000, horizontalPadding: 64); - double zoomAt0 = vm.ZoomLevel; - Assert.True(zoomAt0 > expectedZoom90); // Portrait fit zoom (1.55) is larger than landscape fit zoom (1.10) - } -} - - diff --git a/tests/PdfEditorApp.Tests/PdfToolViewModelsTests.cs b/tests/PdfEditorApp.Tests/PdfToolViewModelsTests.cs deleted file mode 100644 index a7dbfa8..0000000 --- a/tests/PdfEditorApp.Tests/PdfToolViewModelsTests.cs +++ /dev/null @@ -1,405 +0,0 @@ -using PdfEditorApp.Services.Tools.Core; -using PdfEditorApp.Services.Tools.Organize; -using PdfEditorApp.Services.Tools.Security; -using PdfEditorApp.Services.Tools.Conversion; -using PdfEditorApp.Services.Tools.Intelligence; -using PdfEditorApp.ViewModels.Tools.Core; -using PdfEditorApp.ViewModels.Tools.Organize; -using PdfEditorApp.ViewModels.Tools.Security; -using PdfEditorApp.ViewModels.Tools.Conversion; -using PdfEditorApp.ViewModels.Tools.Intelligence; -using System; -using System.IO; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Models; -using PdfEditorApp.Services; -using PdfEditorApp.Services.Tools; -using PdfEditorApp.ViewModels; -using PdfEditorApp.ViewModels.Tools; -using Xunit; - -namespace PdfEditorApp.Tests; - -public class PdfToolViewModelsTests -{ - private readonly IPdfDocumentOperationsService _operationsService; - private readonly IPdfToolRegistry _toolRegistry; - private readonly IPdfToolViewModelFactory _factory; - - public PdfToolViewModelsTests() - { - _toolRegistry = new PdfToolRegistry(); - var pageService = new PdfPageService(); - var optService = new PdfOptimizationService(); - var secService = new PdfSecurityService(); - var convService = new PdfConversionService(); - var ocrService = new PdfOcrService(); - var formService = new PdfFormService(); - var aiService = new AiDocumentService(); - var transService = new DocumentTranslationService(); - var workflowEngine = new PdfWorkflowEngine(pageService, optService, secService, convService, ocrService); - - _operationsService = new PdfDocumentOperationsService( - _toolRegistry, pageService, optService, secService, convService, ocrService, formService, aiService, transService, workflowEngine); - - _factory = new PdfToolViewModelFactory(_operationsService, _toolRegistry); - } - - [Fact] - public void Factory_CreatesDedicatedViewModelsForAllTools() - { - var allTools = _toolRegistry.GetAllTools(); - Assert.NotEmpty(allTools); - - foreach (var def in allTools) - { - if (def.Id == PdfToolId.WorkflowBuilder) continue; - - var vm = _factory.Create(def.Id); - Assert.NotNull(vm); - Assert.Equal(def.Id, vm.Tool.Id); - Assert.Equal(def.Name, vm.Tool.Name); - Assert.False(vm.IsRunning); - Assert.False(vm.IsComplete); - Assert.False(vm.HasError); - } - } - - [Fact] - public void Factory_InstantiatesExactDerivedTypeForSpecificTools() - { - Assert.IsType(_factory.Create(PdfToolId.MergePdf)); - Assert.IsType(_factory.Create(PdfToolId.SplitPdf)); - Assert.IsType(_factory.Create(PdfToolId.CompressPdf)); - Assert.IsType(_factory.Create(PdfToolId.Watermark)); - Assert.IsType(_factory.Create(PdfToolId.RotatePdf)); - Assert.IsType(_factory.Create(PdfToolId.ProtectPdf)); - Assert.IsType(_factory.Create(PdfToolId.UnlockPdf)); - Assert.IsType(_factory.Create(PdfToolId.ComparePdf)); - Assert.IsType(_factory.Create(PdfToolId.HtmlToPdf)); - Assert.IsType(_factory.Create(PdfToolId.SignPdf)); - Assert.IsType(_factory.Create(PdfToolId.OcrPdf)); - Assert.IsType(_factory.Create(PdfToolId.AiSummarizer)); - Assert.IsType(_factory.Create(PdfToolId.TranslatePdf)); - Assert.IsType(_factory.Create(PdfToolId.PdfToMarkdown)); - Assert.IsType(_factory.Create(PdfToolId.PageNumbers)); - Assert.IsType(_factory.Create(PdfToolId.ScanToPdf)); - Assert.IsType(_factory.Create(PdfToolId.CropPdf)); - Assert.IsType(_factory.Create(PdfToolId.PdfForms)); - Assert.IsType(_factory.Create(PdfToolId.RedactPdf)); - Assert.IsType(_factory.Create(PdfToolId.OrganizePdf)); - Assert.IsType(_factory.Create(PdfToolId.PdfToPdfA)); - Assert.IsType(_factory.Create(PdfToolId.RepairPdf)); - Assert.IsType(_factory.Create(PdfToolId.PdfToJpg)); - Assert.IsType(_factory.Create(PdfToolId.JpgToPdf)); - Assert.IsType(_factory.Create(PdfToolId.PdfToWord)); - Assert.IsType(_factory.Create(PdfToolId.WordToPdf)); - Assert.IsType(_factory.Create(PdfToolId.PdfToExcel)); - Assert.IsType(_factory.Create(PdfToolId.ExcelToPdf)); - Assert.IsType(_factory.Create(PdfToolId.PdfToPowerPoint)); - Assert.IsType(_factory.Create(PdfToolId.PowerPointToPdf)); - Assert.IsType(_factory.Create(PdfToolId.EditPdf)); - } - - [Fact] - public void MergePdfToolViewModel_ReordersFilesCorrectly() - { - var vm = (MergePdfToolViewModel)_factory.Create(PdfToolId.MergePdf); - vm.SelectedFiles.Add("file1.pdf"); - vm.SelectedFiles.Add("file2.pdf"); - vm.SelectedFiles.Add("file3.pdf"); - - Assert.Equal(3, vm.SelectedFiles.Count); - Assert.Equal("file1.pdf", vm.SelectedFiles[0]); - - // Move item down - vm.MoveFileDownCommand.Execute("file1.pdf"); - Assert.Equal("file2.pdf", vm.SelectedFiles[0]); - Assert.Equal("file1.pdf", vm.SelectedFiles[1]); - - // Move item up - vm.MoveFileUpCommand.Execute("file3.pdf"); - Assert.Equal("file3.pdf", vm.SelectedFiles[1]); - Assert.Equal("file1.pdf", vm.SelectedFiles[2]); - - // Remove item - vm.RemoveFileCommand.Execute("file3.pdf"); - Assert.Equal(2, vm.SelectedFiles.Count); - Assert.DoesNotContain("file3.pdf", vm.SelectedFiles); - - // Clear - vm.ClearFilesCommand.Execute(null); - Assert.Empty(vm.SelectedFiles); - } - - [Fact] - public void SplitPdfToolViewModel_ConfiguresSplitModes() - { - var vm = (SplitPdfToolViewModel)_factory.Create(PdfToolId.SplitPdf); - Assert.Equal(SplitExtractMode.SplitEveryNPages, vm.SplitMode); - - vm.SplitPagesInterval = 3; - Assert.Equal(3, vm.SplitPagesInterval); - - vm.SplitOddEven = true; - vm.ExtractOddPages = true; - Assert.True(vm.SplitOddEven); - Assert.True(vm.ExtractOddPages); - } - - [Fact] - public void CompressPdfToolViewModel_UpdatesDpiBasedOnPreset() - { - var vm = (CompressPdfToolViewModel)_factory.Create(PdfToolId.CompressPdf); - Assert.Equal(PdfCompressionLevel.Balanced, vm.CompressionLevel); - Assert.Equal(150, vm.ImageQualityDpi); - - vm.CompressionLevel = PdfCompressionLevel.MaximumCompression; - vm.ImageQualityDpi = 72; - Assert.Equal(PdfCompressionLevel.MaximumCompression, vm.CompressionLevel); - Assert.Equal(72, vm.ImageQualityDpi); - } - - [Fact] - public void WatermarkToolViewModel_MaintainsFormattingAndPosition() - { - var vm = (WatermarkToolViewModel)_factory.Create(PdfToolId.Watermark); - vm.WatermarkText = "CONFIDENTIAL DRAFT"; - vm.Opacity = 0.45; - vm.RotationAngle = 30; - vm.ColorHex = "#DC2626"; - vm.Position = WatermarkPosition.TopLeft; - - Assert.Equal("CONFIDENTIAL DRAFT", vm.WatermarkText); - Assert.Equal(0.45, vm.Opacity); - Assert.Equal(30, vm.RotationAngle); - Assert.Equal("#DC2626", vm.ColorHex); - Assert.Equal(WatermarkPosition.TopLeft, vm.Position); - } - - [Fact] - public void RotatePdfToolViewModel_CyclesRotationDegrees() - { - var vm = (RotatePdfToolViewModel)_factory.Create(PdfToolId.RotatePdf); - Assert.Equal(90, vm.RotationDegrees); - - vm.RotationDegrees = 180; - Assert.Equal(180, vm.RotationDegrees); - - vm.RotationDegrees = 270; - Assert.Equal(270, vm.RotationDegrees); - } - - [Fact] - public void ProtectPdfToolViewModel_ConfiguresPasswordsAndPermissions() - { - var vm = (ProtectPdfToolViewModel)_factory.Create(PdfToolId.ProtectPdf); - vm.UserPassword = "UserPass123"; - vm.OwnerPassword = "OwnerPass456"; - vm.AllowPrinting = false; - vm.AllowCopying = false; - - Assert.Equal("UserPass123", vm.UserPassword); - Assert.Equal("OwnerPass456", vm.OwnerPassword); - Assert.False(vm.AllowPrinting); - Assert.False(vm.AllowCopying); - } - - [Fact] - public void SignPdfToolViewModel_ConfiguresSignerDetails() - { - var vm = (SignPdfToolViewModel)_factory.Create(PdfToolId.SignPdf); - vm.SignerName = "John Doe"; - vm.Reason = "Approved Contract"; - vm.Location = "San Francisco, CA"; - vm.Style = SignatureStyle.CursiveElegance; - - Assert.Equal("John Doe", vm.SignerName); - Assert.Equal("Approved Contract", vm.Reason); - Assert.Equal("San Francisco, CA", vm.Location); - Assert.Equal(SignatureStyle.CursiveElegance, vm.Style); - } - - [Fact] - public void HomeViewModel_OpensToolPageWithDedicatedViewModel() - { - var vm = new HomeViewModel( - new MockRecentService(), - new TemplateService(), - new ProjectPersistenceService(), - _toolRegistry, - null, - _factory); - - Assert.Null(vm.ActiveToolViewModel); - Assert.False(vm.IsToolPageActive); - - // Act: Open Watermark tool - vm.OpenToolPageCommand.Execute(PdfToolId.Watermark); - - // Assert - Assert.True(vm.IsToolPageActive); - Assert.NotNull(vm.ActiveToolViewModel); - Assert.IsType(vm.ActiveToolViewModel); - Assert.Equal(PdfToolId.Watermark, vm.ActiveToolViewModel.Tool.Id); - - // Act: Go back - vm.BackToToolsCommand.Execute(null); - - // Assert - Assert.False(vm.IsToolPageActive); - Assert.Null(vm.ActiveToolViewModel); - } - - [Fact] - public void HomeViewModel_ToolStarringSynchronizesBidirectionally() - { - var vm = new HomeViewModel( - new MockRecentService(), - new TemplateService(), - new ProjectPersistenceService(), - _toolRegistry, - null, - _factory); - - // Open Rotate tool - vm.OpenToolPageCommand.Execute(PdfToolId.RotatePdf); - Assert.NotNull(vm.ActiveToolViewModel); - Assert.False(vm.ActiveToolViewModel.IsToolStarred); - - // Toggle star via ViewModel - vm.ActiveToolViewModel.ToggleStarCommand.Execute(null); - Assert.True(vm.ActiveToolViewModel.IsToolStarred); - Assert.NotNull(vm.ActiveToolCard); - Assert.True(vm.ActiveToolCard.IsStarred); - } - - [Fact] - public void PdfToolViewModelBase_SynchronizesPreviewItemsAndReordering() - { - var vm = (MergePdfToolViewModel)_factory.Create(PdfToolId.MergePdf); - vm.SelectedFiles.Add("doc1.pdf"); - vm.SelectedFiles.Add("doc2.pdf"); - vm.SyncPreviewItems(); - - Assert.Equal(2, vm.SelectedFilePreviewItems.Count); - Assert.Equal("doc1.pdf", vm.SelectedFilePreviewItems[0].FileName); - Assert.Equal("#1", vm.SelectedFilePreviewItems[0].OrderIndexText); - Assert.Equal("doc2.pdf", vm.SelectedFilePreviewItems[1].FileName); - Assert.Equal("#2", vm.SelectedFilePreviewItems[1].OrderIndexText); - - // Reorder - vm.MoveFileDownCommand.Execute("doc1.pdf"); - Assert.Equal("doc2.pdf", vm.SelectedFilePreviewItems[0].FileName); - Assert.Equal("#1", vm.SelectedFilePreviewItems[0].OrderIndexText); - Assert.Equal("doc1.pdf", vm.SelectedFilePreviewItems[1].FileName); - Assert.Equal("#2", vm.SelectedFilePreviewItems[1].OrderIndexText); - } - - [Fact] - public void PdfFileHelper_SanitizesTrailingJunkBytesAfterEof() - { - string rawPdf = "%PDF-1.4\n1 0 obj\n<< /Type /Catalog >>\nendobj\ntrailer\n<< >>\nstartxref\n0\n%%EOF\n\n\0\0\0"; - byte[] bytes = System.Text.Encoding.ASCII.GetBytes(rawPdf); - byte[] sanitized = PdfFileHelper.SanitizePdfBytes(bytes); - - string sanitizedText = System.Text.Encoding.ASCII.GetString(sanitized); - Assert.EndsWith("%%EOF\r\n", sanitizedText); - Assert.DoesNotContain("trailing web server junk", sanitizedText); - } - - [Fact] - public void RedactionMarkItem_RaisesPropertyChangedOnDisplayProperties() - { - var item = new RedactionMarkItem - { - Region = new RedactionRegion { PageIndex = 0, X = 10, Y = 20, Width = 100, Height = 50 }, - Label = "Test" - }; - - var changedProps = new System.Collections.Generic.List(); - item.PropertyChanged += (s, e) => { if (e.PropertyName != null) changedProps.Add(e.PropertyName); }; - - item.DisplayX = 15; - item.DisplayY = 25; - item.DisplayWidth = 150; - item.DisplayHeight = 75; - - Assert.Contains(nameof(RedactionMarkItem.DisplayX), changedProps); - Assert.Contains(nameof(RedactionMarkItem.DisplayY), changedProps); - Assert.Contains(nameof(RedactionMarkItem.DisplayWidth), changedProps); - Assert.Contains(nameof(RedactionMarkItem.DisplayHeight), changedProps); - } - - [Fact] - public void RedactPdfToolViewModel_AddManualMark_CreatesBoxEvenWithoutText() - { - var vm = (RedactPdfToolViewModel)_factory.Create(PdfToolId.RedactPdf); - vm.Preview.Pages.Add(new PdfToolPreviewPage { PageNumber = 1, WidthPoints = 612, HeightPoints = 792 }); - vm.Preview.SelectedPage = vm.Preview.Pages[0]; - vm.Preview.CurrentPageNumber = 1; - vm.Preview.ZoomLevel = 1.0; - - // Drag a box where no text exists (raw rectangle mode) - vm.AddManualMark(new Avalonia.Rect(50, 100, 200, 80), forceDrawBox: true); - - Assert.NotEmpty(vm.Marks); - Assert.Single(vm.Marks); - var mark = vm.Marks[0]; - Assert.Equal(50, mark.Region.X); - Assert.Equal(100, mark.Region.Y); - Assert.Equal(200, mark.Region.Width); - Assert.Equal(80, mark.Region.Height); - Assert.Equal("Manual selection", mark.Label); - - Assert.NotEmpty(vm.CurrentPageMarks); - Assert.Equal(50, vm.CurrentPageMarks[0].DisplayX); - Assert.Equal(100, vm.CurrentPageMarks[0].DisplayY); - Assert.Equal(200, vm.CurrentPageMarks[0].DisplayWidth); - Assert.Equal(80, vm.CurrentPageMarks[0].DisplayHeight); - } - - [Fact] - public void RedactPdfToolViewModel_AddManualMark_DefaultDragFallsBackToBoxWhenNoText() - { - var vm = (RedactPdfToolViewModel)_factory.Create(PdfToolId.RedactPdf); - vm.Preview.Pages.Add(new PdfToolPreviewPage { PageNumber = 1, WidthPoints = 612, HeightPoints = 792 }); - vm.Preview.SelectedPage = vm.Preview.Pages[0]; - vm.Preview.CurrentPageNumber = 1; - vm.Preview.ZoomLevel = 1.0; - - // User drags a box without holding Option/Alt (forceDrawBox: false) over a signature or image - vm.AddManualMark(new Avalonia.Rect(40, 80, 160, 50), forceDrawBox: false); - - Assert.NotEmpty(vm.Marks); - Assert.Single(vm.Marks); - var mark = vm.Marks[0]; - Assert.Equal(40, mark.Region.X); - Assert.Equal(80, mark.Region.Y); - Assert.Equal(160, mark.Region.Width); - Assert.Equal(50, mark.Region.Height); - Assert.Equal("Manual selection", mark.Label); - } - - private class MockRecentService : IRecentDocumentsService - { - public List Items { get; } = new(); - public List Load() => new(Items); - public void Add(RecentDocumentItem item) => Items.Insert(0, item); - public void Remove(string filePath) => Items.RemoveAll(x => x.FilePath == filePath); - public void Rename(string oldFilePath, string newFilePath, string newTitle) - { - var match = Items.Find(x => string.Equals(x.FilePath, oldFilePath, StringComparison.OrdinalIgnoreCase)); - if (match != null) - { - match.FilePath = newFilePath; - match.Title = newTitle; - match.LastOpened = DateTime.UtcNow; - } - } - public void Clear() => Items.Clear(); - } -} diff --git a/tests/PdfEditorApp.Tests/PdfToolsServiceTests.cs b/tests/PdfEditorApp.Tests/PdfToolsServiceTests.cs deleted file mode 100644 index c8e5236..0000000 --- a/tests/PdfEditorApp.Tests/PdfToolsServiceTests.cs +++ /dev/null @@ -1,955 +0,0 @@ -using PdfEditorApp.Services.Tools.Core; -using PdfEditorApp.Services.Tools.Organize; -using PdfEditorApp.Services.Tools.Security; -using PdfEditorApp.Services.Tools.Conversion; -using PdfEditorApp.Services.Tools.Intelligence; -using PdfEditorApp.ViewModels.Tools.Core; -using PdfEditorApp.ViewModels.Tools.Organize; -using PdfEditorApp.ViewModels.Tools.Security; -using PdfEditorApp.ViewModels.Tools.Conversion; -using PdfEditorApp.ViewModels.Tools.Intelligence; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using System.Threading; -using System.Threading.Tasks; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Models; -using PdfEditorApp.Services; -using PdfEditorApp.Services.Tools; -using Xunit; - -namespace PdfEditorApp.Tests; - -/// -/// Comprehensive tests for all PDF Tool services: page operations, optimization, -/// security, conversion, OCR, forms, AI, translation, workflow engine, and tool registry. -/// -public class PdfToolsServiceTests -{ - // ────────────────────────────────────────────────────────────────────────── - // Helper: create a minimal valid PDF binary in memory using PdfSharpCore - // ────────────────────────────────────────────────────────────────────────── - - private static string CreateTempPdf(int pages = 2, string? prefix = null) - { - var path = Path.Combine(Path.GetTempPath(), $"{prefix ?? "test"}_{Guid.NewGuid():N}.pdf"); - using var doc = new PdfSharpCore.Pdf.PdfDocument(); - doc.Info.Title = "Test Document"; - for (int i = 0; i < pages; i++) - { - var page = doc.AddPage(); - page.Width = PdfSharpCore.Drawing.XUnit.FromPoint(595); - page.Height = PdfSharpCore.Drawing.XUnit.FromPoint(842); - using var gfx = PdfSharpCore.Drawing.XGraphics.FromPdfPage(page); - var font = new PdfSharpCore.Drawing.XFont("Arial", 12); - gfx.DrawString($"Test Page {i + 1}", font, PdfSharpCore.Drawing.XBrushes.Black, - new PdfSharpCore.Drawing.XRect(50, 50, 495, 30), PdfSharpCore.Drawing.XStringFormats.TopLeft); - } - doc.Save(path); - return path; - } - - private static string CreateImageHeavyTempPdf(int pages = 2) - { - var path = Path.Combine(Path.GetTempPath(), $"img_heavy_{Guid.NewGuid():N}.pdf"); - using var doc = new PdfSharpCore.Pdf.PdfDocument(); - for (int i = 0; i < pages; i++) - { - var page = doc.AddPage(); - page.Width = PdfSharpCore.Drawing.XUnit.FromPoint(595); - page.Height = PdfSharpCore.Drawing.XUnit.FromPoint(842); - using var gfx = PdfSharpCore.Drawing.XGraphics.FromPdfPage(page); - - using var bmp = new SkiaSharp.SKBitmap(600, 600); - using var canvas = new SkiaSharp.SKCanvas(bmp); - canvas.Clear(SkiaSharp.SKColors.LightBlue); - using var paint = new SkiaSharp.SKPaint { Color = SkiaSharp.SKColors.DarkRed, StrokeWidth = 6 }; - for (int line = 0; line < 50; line++) - { - canvas.DrawLine(0, line * 12, 600, 600 - line * 12, paint); - } - using var img = SkiaSharp.SKImage.FromBitmap(bmp); - using var data = img.Encode(SkiaSharp.SKEncodedImageFormat.Png, 100); - using var ximg = PdfSharpCore.Drawing.XImage.FromStream(() => new MemoryStream(data.ToArray())); - gfx.DrawImage(ximg, 50, 50, 495, 495); - } - doc.Save(path); - return path; - } - - private static void CleanupFiles(params string[] paths) - { - foreach (var p in paths) - if (p != null && File.Exists(p)) try { File.Delete(p); } catch { } - } - - // ────────────────────────────────────────────────────────────────────────── - // PdfPageService Tests - // ────────────────────────────────────────────────────────────────────────── - - [Fact] - public async Task PdfPageService_Merge_CombinesMultipleFiles() - { - var file1 = CreateTempPdf(2, "merge1"); - var file2 = CreateTempPdf(3, "merge2"); - var outPath = Path.Combine(Path.GetTempPath(), $"merged_{Guid.NewGuid():N}.pdf"); - try - { - var svc = new PdfPageService(); - var opts = new MergeToolOptions - { - InputFiles = new List { file1, file2 }, - OutputFilePath = outPath - }; - var result = await svc.MergePdfAsync(opts); - Assert.True(result.Success, result.ErrorMessage); - Assert.True(File.Exists(outPath)); - // 2 + 3 = 5 pages - using var merged = UglyToad.PdfPig.PdfDocument.Open(outPath); - Assert.Equal(5, merged.NumberOfPages); - } - finally { CleanupFiles(file1, file2, outPath); } - } - - [Fact] - public async Task PdfPageService_Merge_FailsOnMissingFile() - { - var svc = new PdfPageService(); - var result = await svc.MergePdfAsync(new MergeToolOptions - { - InputFiles = new List { "/nonexistent/file.pdf" }, - OutputFilePath = "/tmp/out.pdf" - }); - Assert.False(result.Success); - Assert.NotEmpty(result.ErrorMessage ?? ""); - } - - [Fact] - public void PdfFileHelper_IsFileLocked_DetectsLockedFiles() - { - string tempPath = Path.Combine(Path.GetTempPath(), $"lock_test_{Guid.NewGuid():N}.pdf"); - File.WriteAllText(tempPath, "Sample PDF"); - try - { - Assert.False(PdfFileHelper.IsFileLocked(tempPath)); - - // Exclusively open/lock the file - using (var stream = new FileStream(tempPath, FileMode.Open, FileAccess.ReadWrite, FileShare.None)) - { - Assert.True(PdfFileHelper.IsFileLocked(tempPath)); - } - - // Once disposed, lock is released - Assert.False(PdfFileHelper.IsFileLocked(tempPath)); - } - finally - { - if (File.Exists(tempPath)) File.Delete(tempPath); - } - } - - [Fact] - public void PdfFileHelper_ResolveSafeOutputPath_AvoidsLockedFilesAndAvoidPaths() - { - string tempDir = Path.Combine(Path.GetTempPath(), $"safe_path_{Guid.NewGuid():N}"); - Directory.CreateDirectory(tempDir); - string lockedDefault = Path.Combine(tempDir, "Merged_Document.pdf"); - File.WriteAllText(lockedDefault, "existing document"); - - try - { - // When default is locked, it resolves to Merged_Document_1.pdf - using (var stream = new FileStream(lockedDefault, FileMode.Open, FileAccess.ReadWrite, FileShare.None)) - { - string resolved = PdfFileHelper.ResolveSafeOutputPath(null, tempDir, "Merged_Document", ".pdf"); - Assert.Equal(Path.Combine(tempDir, "Merged_Document_1.pdf"), resolved); - } - - // Avoid list (e.g. input file matching candidate) - string resolvedAvoid = PdfFileHelper.ResolveSafeOutputPath(null, tempDir, "Merged_Document", ".pdf", [lockedDefault]); - Assert.Equal(Path.Combine(tempDir, "Merged_Document_1.pdf"), resolvedAvoid); - } - finally - { - if (Directory.Exists(tempDir)) Directory.Delete(tempDir, recursive: true); - } - } - - [Fact] - public async Task PdfPageService_Merge_AutoResolvesWhenDefaultIsLocked() - { - string tempDir = Path.Combine(Path.GetTempPath(), $"merge_lock_{Guid.NewGuid():N}"); - Directory.CreateDirectory(tempDir); - string file1 = Path.Combine(tempDir, "Input1.pdf"); - string file2 = Path.Combine(tempDir, "Input2.pdf"); - File.Copy(CreateTempPdf(1, "src1"), file1, true); - File.Copy(CreateTempPdf(1, "src2"), file2, true); - - // Lock the default output path - string lockedDefault = Path.Combine(tempDir, "Merged_Document.pdf"); - File.WriteAllText(lockedDefault, "Locked existing file"); - - try - { - using (var stream = new FileStream(lockedDefault, FileMode.Open, FileAccess.ReadWrite, FileShare.None)) - { - var svc = new PdfPageService(); - var opts = new MergeToolOptions - { - InputFiles = new List { file1, file2 } - // OutputFilePath left empty to trigger auto-resolution - }; - - var result = await svc.MergePdfAsync(opts); - Assert.True(result.Success, result.ErrorMessage); - Assert.NotNull(result.OutputFilePath); - Assert.True(File.Exists(result.OutputFilePath)); - Assert.NotEqual(lockedDefault, result.OutputFilePath); - Assert.Contains("Merged_Document_1.pdf", result.OutputFilePath); - } - } - finally - { - if (Directory.Exists(tempDir)) Directory.Delete(tempDir, recursive: true); - } - } - - [Fact] - public async Task PdfPageService_Split_ProducesOnePdfPerPage() - { - var inputPath = CreateTempPdf(4, "split"); - var outDir = Path.Combine(Path.GetTempPath(), $"split_{Guid.NewGuid():N}"); - try - { - var svc = new PdfPageService(); - var opts = new SplitToolOptions - { - InputFilePath = inputPath, - OutputDirectory = outDir, - Mode = SplitExtractMode.SplitEveryNPages, - PagesPerSplit = 1 - }; - var result = await svc.SplitPdfAsync(opts); - Assert.True(result.Success, result.ErrorMessage); - Assert.NotNull(result.OutputFiles); - Assert.Equal(4, result.OutputFiles!.Count); - foreach (var f in result.OutputFiles) Assert.True(File.Exists(f)); - } - finally - { - CleanupFiles(inputPath); - if (Directory.Exists(outDir)) Directory.Delete(outDir, true); - } - } - - [Fact] - public async Task PdfPageService_Split_ByRanges_ProducesCorrectCount() - { - var inputPath = CreateTempPdf(6, "splitrange"); - var outDir = Path.Combine(Path.GetTempPath(), $"splitrange_{Guid.NewGuid():N}"); - try - { - var svc = new PdfPageService(); - var opts = new SplitToolOptions - { - InputFilePath = inputPath, - OutputDirectory = outDir, - Mode = SplitExtractMode.SplitByPageRanges, - RangeExpression = "1-2, 3-4, 5-6" - }; - var result = await svc.SplitPdfAsync(opts); - Assert.True(result.Success, result.ErrorMessage); - Assert.Equal(3, result.OutputFiles!.Count); - } - finally - { - CleanupFiles(inputPath); - if (Directory.Exists(outDir)) Directory.Delete(outDir, true); - } - } - - [Fact] - public async Task PdfPageService_Rotate_ProducesOutputFile() - { - var inputPath = CreateTempPdf(2, "rotate"); - var outPath = Path.Combine(Path.GetTempPath(), $"rotated_{Guid.NewGuid():N}.pdf"); - try - { - var svc = new PdfPageService(); - var opts = new RotateToolOptions - { - InputFilePath = inputPath, - OutputFilePath = outPath, - RotationDegrees = 90, - TargetFilter = PageFilterTarget.All - }; - var result = await svc.RotatePdfAsync(opts); - Assert.True(result.Success, result.ErrorMessage); - Assert.True(File.Exists(outPath)); - Assert.True(new FileInfo(outPath).Length > 0); - } - finally { CleanupFiles(inputPath, outPath); } - } - - [Fact] - public async Task PdfPageService_AddPageNumbers_ProducesValidPdf() - { - var inputPath = CreateTempPdf(3, "pagenums"); - var outPath = Path.Combine(Path.GetTempPath(), $"pagenums_{Guid.NewGuid():N}.pdf"); - try - { - var svc = new PdfPageService(); - var opts = new PageNumberToolOptions - { - InputFilePath = inputPath, - OutputFilePath = outPath, - Position = PageNumberPosition.BottomCenter, - Template = "Page {n} of {total}", - FontSize = 10 - }; - var result = await svc.AddPageNumbersAsync(opts); - Assert.True(result.Success, result.ErrorMessage); - Assert.True(File.Exists(outPath)); - } - finally { CleanupFiles(inputPath, outPath); } - } - - // ────────────────────────────────────────────────────────────────────────── - // PdfOptimizationService Tests - // ────────────────────────────────────────────────────────────────────────── - - [Fact] - public async Task PdfOptimizationService_Compress_ProducesOutputFile() - { - var inputPath = CreateTempPdf(3, "compress"); - var outPath = Path.Combine(Path.GetTempPath(), $"compressed_{Guid.NewGuid():N}.pdf"); - try - { - var svc = new PdfOptimizationService(); - var opts = new CompressToolOptions - { - InputFilePath = inputPath, - OutputFilePath = outPath, - Level = PdfCompressionLevel.Balanced - }; - var result = await svc.CompressPdfAsync(opts); - Assert.True(result.Success, result.ErrorMessage); - Assert.True(File.Exists(outPath)); - Assert.True(result.OutputSizeBytes <= result.OriginalSizeBytes); - } - finally { CleanupFiles(inputPath, outPath); } - } - - [Fact] - public async Task PdfOptimizationService_Compress_ImageHeavyPdf_SignificantlyReducesFileSize() - { - var inputPath = CreateImageHeavyTempPdf(2); - var outPath = Path.Combine(Path.GetTempPath(), $"compressed_img_{Guid.NewGuid():N}.pdf"); - try - { - long origSize = new FileInfo(inputPath).Length; - Assert.True(origSize > 10000, "Test image PDF should have substantial size."); - - var svc = new PdfOptimizationService(); - var opts = new CompressToolOptions - { - InputFilePath = inputPath, - OutputFilePath = outPath, - Level = PdfCompressionLevel.MaximumCompression, - ImageQualityDpi = 96, - RemoveMetadata = true - }; - var result = await svc.CompressPdfAsync(opts); - Assert.True(result.Success, result.ErrorMessage); - Assert.True(File.Exists(outPath)); - Assert.True(result.OutputSizeBytes < result.OriginalSizeBytes, $"Expected compressed size ({result.OutputSizeBytes}) to be strictly less than original size ({result.OriginalSizeBytes})."); - } - finally { CleanupFiles(inputPath, outPath); } - } - - [Fact] - public async Task PdfOptimizationService_Compress_NeverIncreasesFileSizeOnAlreadyCompactPdf() - { - var inputPath = CreateTempPdf(2, "compact"); - var outPath = Path.Combine(Path.GetTempPath(), $"compressed_compact_{Guid.NewGuid():N}.pdf"); - try - { - long origSize = new FileInfo(inputPath).Length; - - var svc = new PdfOptimizationService(); - var opts = new CompressToolOptions - { - InputFilePath = inputPath, - OutputFilePath = outPath, - Level = PdfCompressionLevel.Balanced - }; - var result = await svc.CompressPdfAsync(opts); - Assert.True(result.Success, result.ErrorMessage); - Assert.True(File.Exists(outPath)); - Assert.True(result.OutputSizeBytes <= origSize, $"Output size ({result.OutputSizeBytes}) should NEVER exceed original size ({origSize})."); - } - finally { CleanupFiles(inputPath, outPath); } - } - - [Fact] - public async Task PdfOptimizationService_Compress_FailsOnMissingFile() - { - var svc = new PdfOptimizationService(); - var result = await svc.CompressPdfAsync(new CompressToolOptions - { - InputFilePath = "/nonexistent/file.pdf", - OutputFilePath = "/tmp/out.pdf" - }); - Assert.False(result.Success); - } - - [Fact] - public async Task PdfOptimizationService_Repair_ProducesOutputFile() - { - var inputPath = CreateTempPdf(2, "repair"); - var outPath = Path.Combine(Path.GetTempPath(), $"repaired_{Guid.NewGuid():N}.pdf"); - try - { - var svc = new PdfOptimizationService(); - var opts = new RepairToolOptions - { - InputFilePath = inputPath, - OutputFilePath = outPath - }; - var result = await svc.RepairPdfAsync(opts); - Assert.True(result.Success, result.ErrorMessage); - Assert.True(File.Exists(outPath)); - } - finally { CleanupFiles(inputPath, outPath); } - } - - [Fact] - public async Task PdfOptimizationService_ConvertToPdfA_ProducesOutputFile() - { - var inputPath = CreateTempPdf(1, "pdfa"); - var outPath = Path.Combine(Path.GetTempPath(), $"pdfa_{Guid.NewGuid():N}.pdf"); - try - { - var svc = new PdfOptimizationService(); - var opts = new PdfAToolOptions - { - InputFilePath = inputPath, - OutputFilePath = outPath, - Standard = PdfAStandard.PdfA1b - }; - var result = await svc.ConvertToPdfAAsync(opts); - Assert.True(result.Success, result.ErrorMessage); - Assert.True(File.Exists(outPath)); - } - finally { CleanupFiles(inputPath, outPath); } - } - - // ────────────────────────────────────────────────────────────────────────── - // PdfSecurityService Tests - // ────────────────────────────────────────────────────────────────────────── - - [Fact] - public async Task PdfSecurityService_ProtectAndUnlock_RoundTrip() - { - var inputPath = CreateTempPdf(2, "protect"); - var protectedPath = Path.Combine(Path.GetTempPath(), $"protected_{Guid.NewGuid():N}.pdf"); - var unlockedPath = Path.Combine(Path.GetTempPath(), $"unlocked_{Guid.NewGuid():N}.pdf"); - try - { - var svc = new PdfSecurityService(); - - // Protect - var protectResult = await svc.ProtectPdfAsync(new SecurityToolOptions - { - InputFilePath = inputPath, - OutputFilePath = protectedPath, - UserPassword = "user123", - OwnerPassword = "owner456", - AllowPrinting = true, - AllowCopying = false - }); - Assert.True(protectResult.Success, protectResult.ErrorMessage); - Assert.True(File.Exists(protectedPath)); - - // Unlock - var unlockResult = await svc.UnlockPdfAsync(new UnlockToolOptions - { - InputFilePath = protectedPath, - OutputFilePath = unlockedPath, - Password = "owner456" - }); - Assert.True(unlockResult.Success, unlockResult.ErrorMessage); - Assert.True(File.Exists(unlockedPath)); - } - finally { CleanupFiles(inputPath, protectedPath, unlockedPath); } - } - - [Fact] - public async Task PdfSecurityService_Protect_FailsOnMissingFile() - { - var svc = new PdfSecurityService(); - var result = await svc.ProtectPdfAsync(new SecurityToolOptions - { - InputFilePath = "/nonexistent/file.pdf", - OutputFilePath = "/tmp/protected.pdf", - UserPassword = "pass" - }); - Assert.False(result.Success); - } - - [Fact] - public async Task PdfSecurityService_AddWatermark_ProducesOutputFile() - { - var inputPath = CreateTempPdf(2, "watermark"); - var outPath = Path.Combine(Path.GetTempPath(), $"watermarked_{Guid.NewGuid():N}.pdf"); - try - { - var svc = new PdfSecurityService(); - var result = await svc.AddWatermarkAsync(new WatermarkToolOptions - { - InputFilePath = inputPath, - OutputFilePath = outPath, - Text = "CONFIDENTIAL", - Opacity = 0.3, - FontSize = 48, - RotationAngle = -45 - }); - Assert.True(result.Success, result.ErrorMessage); - Assert.True(File.Exists(outPath)); - } - finally { CleanupFiles(inputPath, outPath); } - } - - // ────────────────────────────────────────────────────────────────────────── - // PdfConversionService Tests - // ────────────────────────────────────────────────────────────────────────── - - [Fact] - public async Task PdfConversionService_PdfToWord_ProducesDocxFile() - { - var inputPath = CreateTempPdf(2, "toword"); - var outPath = Path.Combine(Path.GetTempPath(), $"output_{Guid.NewGuid():N}.docx"); - try - { - var svc = new PdfConversionService(); - var result = await svc.ConvertPdfToWordAsync(new WordConversionOptions - { - InputFilePath = inputPath, - OutputFilePath = outPath - }); - Assert.True(result.Success, result.ErrorMessage); - Assert.True(File.Exists(outPath)); - Assert.True(new FileInfo(outPath).Length > 0); - } - finally { CleanupFiles(inputPath, outPath); } - } - - [Fact] - public async Task PdfConversionService_PdfToExcel_ProducesXlsxFile() - { - var inputPath = CreateTempPdf(1, "toexcel"); - var outPath = Path.Combine(Path.GetTempPath(), $"output_{Guid.NewGuid():N}.xlsx"); - try - { - var svc = new PdfConversionService(); - var result = await svc.ConvertPdfToExcelAsync(new ExcelConversionOptions - { - InputFilePath = inputPath, - OutputFilePath = outPath - }); - Assert.True(result.Success, result.ErrorMessage); - Assert.True(File.Exists(outPath)); - } - finally { CleanupFiles(inputPath, outPath); } - } - - [Fact] - public async Task PdfConversionService_PdfToImages_ProducesImageFiles() - { - var inputPath = CreateTempPdf(2, "toimages"); - var outDir = Path.Combine(Path.GetTempPath(), $"images_{Guid.NewGuid():N}"); - try - { - var svc = new PdfConversionService(); - var result = await svc.ConvertPdfToImagesAsync(new ImageConversionOptions - { - InputFilePath = inputPath, - OutputDirectory = outDir, - OutputFormat = "png", - Dpi = 72 - }); - Assert.True(result.Success, result.ErrorMessage); - Assert.NotNull(result.OutputFiles); - Assert.Equal(2, result.OutputFiles!.Count); - foreach (var f in result.OutputFiles) Assert.True(File.Exists(f)); - } - finally - { - CleanupFiles(inputPath); - if (Directory.Exists(outDir)) Directory.Delete(outDir, true); - } - } - - [Fact] - public async Task PdfConversionService_ImagesToPdf_ProducesValidPdf() - { - // Create a temp PNG - string imgPath = Path.Combine(Path.GetTempPath(), $"img_{Guid.NewGuid():N}.png"); - using (var surface = SkiaSharp.SKSurface.Create(new SkiaSharp.SKImageInfo(400, 600))) - { - surface.Canvas.Clear(SkiaSharp.SKColors.LightBlue); - using var img = surface.Snapshot(); - using var data = img.Encode(SkiaSharp.SKEncodedImageFormat.Png, 90); - using var fs = File.OpenWrite(imgPath); - data.SaveTo(fs); - } - var outPath = Path.Combine(Path.GetTempPath(), $"fromimages_{Guid.NewGuid():N}.pdf"); - try - { - var svc = new PdfConversionService(); - var result = await svc.ConvertImagesToPdfAsync(new ImagesToPdfOptions - { - ImageFiles = new List { imgPath }, - OutputFilePath = outPath - }); - Assert.True(result.Success, result.ErrorMessage); - Assert.True(File.Exists(outPath)); - } - finally { CleanupFiles(imgPath, outPath); } - } - - [Fact] - public async Task PdfConversionService_HtmlToPdf_ProducesValidPdf() - { - var outPath = Path.Combine(Path.GetTempPath(), $"fromhtml_{Guid.NewGuid():N}.pdf"); - try - { - var svc = new PdfConversionService(); - var result = await svc.ConvertHtmlToPdfAsync(new HtmlToPdfOptions - { - HtmlContentOrUrl = "

    Test

    Hello PDF world

    ", - IsUrl = false, - OutputFilePath = outPath - }); - Assert.True(result.Success, result.ErrorMessage); - Assert.True(File.Exists(outPath)); - } - finally { CleanupFiles(outPath); } - } - - [Fact] - public async Task PdfConversionService_PdfToMarkdown_ProducesMarkdownFile() - { - var inputPath = CreateTempPdf(2, "tomd"); - var outPath = Path.Combine(Path.GetTempPath(), $"output_{Guid.NewGuid():N}.md"); - try - { - var svc = new PdfConversionService(); - var result = await svc.ConvertPdfToMarkdownAsync(new MarkdownConversionOptions - { - InputFilePath = inputPath, - OutputFilePath = outPath, - IncludeMetadataHeader = true - }); - Assert.True(result.Success, result.ErrorMessage); - Assert.True(File.Exists(outPath)); - var content = await File.ReadAllTextAsync(outPath); - Assert.Contains("---", content); // YAML frontmatter - } - finally { CleanupFiles(inputPath, outPath); } - } - - [Fact] - public async Task PdfConversionService_PdfToWord_SupportsCancellation() - { - var inputPath = CreateTempPdf(2, "cancelword"); - var outPath = Path.Combine(Path.GetTempPath(), $"cancelword_{Guid.NewGuid():N}.docx"); - try - { - var svc = new PdfConversionService(); - using var cts = new CancellationTokenSource(); - cts.Cancel(); // cancel immediately - await Assert.ThrowsAnyAsync(() => - svc.ConvertPdfToWordAsync(new WordConversionOptions - { - InputFilePath = inputPath, - OutputFilePath = outPath - }, ct: cts.Token)); - } - finally { CleanupFiles(inputPath, outPath); } - } - - // ────────────────────────────────────────────────────────────────────────── - // PdfOcrService Tests - // ────────────────────────────────────────────────────────────────────────── - - [Fact] - public async Task PdfOcrService_OcrPdf_ProducesOutputFile() - { - var inputPath = CreateTempPdf(2, "ocr"); - var outPath = Path.Combine(Path.GetTempPath(), $"ocr_{Guid.NewGuid():N}.pdf"); - try - { - var svc = new PdfOcrService(); - var result = await svc.OcrPdfAsync(new OcrToolOptions - { - InputFilePath = inputPath, - OutputFilePath = outPath - }); - Assert.True(result.Success, result.ErrorMessage); - Assert.True(File.Exists(outPath)); - } - finally { CleanupFiles(inputPath, outPath); } - } - - // ────────────────────────────────────────────────────────────────────────── - // PdfFormService Tests - // ────────────────────────────────────────────────────────────────────────── - - [Fact] - public async Task PdfFormService_ExtractFields_ReturnsResult() - { - var inputPath = CreateTempPdf(1, "forms"); - try - { - var svc = new PdfFormService(); - var fields = await svc.ExtractFormFieldsAsync(inputPath); - // A simple text PDF has no AcroForm fields - should succeed with empty dictionary - Assert.NotNull(fields); - } - finally { CleanupFiles(inputPath); } - } - - // ────────────────────────────────────────────────────────────────────────── - // AiDocumentService Tests - // ────────────────────────────────────────────────────────────────────────── - - [Fact] - public async Task AiDocumentService_Summarize_ProducesNonEmptySummary() - { - var inputPath = CreateTempPdf(3, "ai"); - try - { - var svc = new AiDocumentService(); - var result = await svc.SummarizePdfAsync(new AiSummaryOptions - { - InputFilePath = inputPath, - MaxBulletPoints = 3 - }); - Assert.True(result.Success, result.ErrorMessage); - Assert.NotEmpty(result.Message ?? ""); - } - finally { CleanupFiles(inputPath); } - } - - [Fact] - public async Task AiDocumentService_Summarize_FailsOnMissingFile() - { - var svc = new AiDocumentService(); - var result = await svc.SummarizePdfAsync(new AiSummaryOptions - { - InputFilePath = "/nonexistent/ghost.pdf" - }); - Assert.False(result.Success); - } - - // ────────────────────────────────────────────────────────────────────────── - // DocumentTranslationService Tests - // ────────────────────────────────────────────────────────────────────────── - - [Fact] - public async Task DocumentTranslationService_Translate_ProducesOutputFile() - { - var inputPath = CreateTempPdf(2, "translate"); - var outPath = Path.Combine(Path.GetTempPath(), $"translated_{Guid.NewGuid():N}.pdf"); - try - { - var svc = new DocumentTranslationService(); - var result = await svc.TranslatePdfAsync(new TranslationOptions - { - InputFilePath = inputPath, - OutputFilePath = outPath, - TargetLanguage = "Spanish" - }); - Assert.True(result.Success, result.ErrorMessage); - Assert.True(File.Exists(outPath)); - } - finally { CleanupFiles(inputPath, outPath); } - } - - // ────────────────────────────────────────────────────────────────────────── - // PdfWorkflowEngine Tests - // ────────────────────────────────────────────────────────────────────────── - - [Fact] - public async Task PdfWorkflowEngine_ExecuteWorkflow_RunsAllSteps() - { - var inputPath = CreateTempPdf(3, "workflow"); - var outDir = Path.Combine(Path.GetTempPath(), $"workflow_{Guid.NewGuid():N}"); - Directory.CreateDirectory(outDir); - try - { - var engine = new PdfWorkflowEngine(); - - var workflow = new WorkflowDefinition - { - Name = "Test Workflow", - OutputDirectory = outDir, - Steps = new List - { - new() { ToolId = PdfToolId.CompressPdf, IsEnabled = true }, - new() { ToolId = PdfToolId.RotatePdf, IsEnabled = true, ParametersJson = "{\"RotationDegrees\":90}" } - } - }; - - var result = await engine.ExecuteWorkflowAsync(workflow, new List { inputPath }); - Assert.True(result.Success, result.ErrorMessage); - Assert.NotNull(result.OutputFiles); - Assert.True(result.OutputFiles!.Count > 0); - } - finally - { - CleanupFiles(inputPath); - if (Directory.Exists(outDir)) Directory.Delete(outDir, true); - } - } - - [Fact] - public void PdfWorkflowEngine_SaveAndLoad_WorkflowDefinition() - { - var engine = new PdfWorkflowEngine(); - - var workflow = new WorkflowDefinition - { - Name = "Save/Load Test", - Description = "Tests serialization roundtrip", - Steps = new List - { - new() { ToolId = PdfToolId.MergePdf }, - new() { ToolId = PdfToolId.CompressPdf } - } - }; - - string json = engine.SerializeWorkflow(workflow); - Assert.NotEmpty(json); - - var loaded = engine.DeserializeWorkflow(json); - Assert.NotNull(loaded); - Assert.Equal("Save/Load Test", loaded!.Name); - Assert.Equal(2, loaded.Steps.Count); - Assert.Equal(PdfToolId.MergePdf, loaded.Steps[0].ToolId); - } - - // ────────────────────────────────────────────────────────────────────────── - // PdfToolRegistry Tests - // ────────────────────────────────────────────────────────────────────────── - - [Fact] - public void PdfToolRegistry_GetAllTools_Returns32Tools() - { - var registry = new PdfToolRegistry(); - var tools = registry.GetAllTools(); - Assert.NotEmpty(tools); - Assert.True(tools.Count >= 32, $"Expected 32+ tool definitions, got {tools.Count}"); - } - - [Fact] - public void PdfToolRegistry_GetTool_ReturnsCorrectDefinition() - { - var registry = new PdfToolRegistry(); - var merge = registry.GetTool(PdfToolId.MergePdf); - Assert.NotNull(merge); - Assert.Equal(PdfToolId.MergePdf, merge!.Id); - Assert.NotEmpty(merge.Name); - Assert.NotEmpty(merge.Description); - } - - [Fact] - public void PdfToolRegistry_GetByCategory_ReturnsSubset() - { - var registry = new PdfToolRegistry(); - var organizeTools = registry.GetToolsByCategory(PdfToolCategory.OrganizeAndPage); - Assert.NotEmpty(organizeTools); - Assert.All(organizeTools, t => Assert.Equal(PdfToolCategory.OrganizeAndPage, t.Category)); - } - - [Fact] - public void PdfToolRegistry_AllTools_HaveUniqueIds() - { - var registry = new PdfToolRegistry(); - var tools = registry.GetAllTools(); - var ids = tools.Select(t => t.Id).ToList(); - Assert.Equal(ids.Count, ids.Distinct().Count()); - } - - [Fact] - public void PdfToolRegistry_AllTools_HaveValidMetadata() - { - var registry = new PdfToolRegistry(); - foreach (var tool in registry.GetAllTools()) - { - Assert.NotEmpty(tool.Name); - Assert.NotEmpty(tool.Description); - Assert.NotEmpty(tool.IconColorHex); - } - } - - // ────────────────────────────────────────────────────────────────────────── - // PdfDocumentOperationsService Integration Tests - // ────────────────────────────────────────────────────────────────────────── - - [Fact] - public async Task PdfDocumentOperationsService_Merge_ReturnsSuccess() - { - var file1 = CreateTempPdf(2, "opsmerge1"); - var file2 = CreateTempPdf(2, "opsmerge2"); - var outPath = Path.Combine(Path.GetTempPath(), $"opsmerge_{Guid.NewGuid():N}.pdf"); - try - { - var svc = new PdfDocumentOperationsService(); - var result = await svc.ExecuteToolAsync(PdfToolId.MergePdf, - new MergeToolOptions - { - InputFiles = new List { file1, file2 }, - OutputFilePath = outPath - }); - Assert.True(result.Success, result.ErrorMessage); - } - finally { CleanupFiles(file1, file2, outPath); } - } - - [Fact] - public async Task PdfDocumentOperationsService_ProgressReporting_Fires() - { - var inputPath = CreateTempPdf(3, "progress"); - var outDir = Path.Combine(Path.GetTempPath(), $"progressdir_{Guid.NewGuid():N}"); - try - { - var svc = new PdfDocumentOperationsService(); - var progressValues = new List(); - var progress = new Progress(v => progressValues.Add(v)); - - await svc.ExecuteToolAsync(PdfToolId.SplitPdf, - new SplitToolOptions - { - InputFilePath = inputPath, - OutputDirectory = outDir, - Mode = SplitExtractMode.SplitEveryNPages, - PagesPerSplit = 1 - }, - progress: progress); - - // Give progress callbacks a moment to fire - await Task.Delay(50); - Assert.True(progressValues.Count > 0, "Progress should have reported at least once"); - } - finally - { - CleanupFiles(inputPath); - if (Directory.Exists(outDir)) Directory.Delete(outDir, true); - } - } -} diff --git a/tests/PdfEditorApp.Tests/PipelineTests.cs b/tests/PdfEditorApp.Tests/PipelineTests.cs deleted file mode 100644 index 9792c8f..0000000 --- a/tests/PdfEditorApp.Tests/PipelineTests.cs +++ /dev/null @@ -1,163 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using PdfEditorApp.Core.Plugins.Pipelines; -using Xunit; - -namespace PdfEditorApp.Tests; - -public class PipelineTests -{ - private class TestPipelineContext - { - public List Trace { get; } = new(); - public int Value { get; set; } - } - - [Fact] - public async Task Waterfall_ExecutesMiddlewareInWrappingOrderWithTerminal() - { - var manager = new PipelineManager(); - var context = new TestPipelineContext(); - - manager.RegisterWaterfall("test:export", async (ctx, next) => - { - ctx.Trace.Add("M1-Before"); - ctx.Value += 10; - await next(); - ctx.Trace.Add("M1-After"); - }); - - manager.RegisterWaterfall("test:export", async (ctx, next) => - { - ctx.Trace.Add("M2-Before"); - ctx.Value *= 2; - await next(); - ctx.Trace.Add("M2-After"); - }); - - await manager.ExecuteWaterfallAsync("test:export", context, terminal: () => - { - context.Trace.Add("Terminal"); - context.Value += 5; - return Task.CompletedTask; - }); - - // Pipeline execution order: M1-Before -> M2-Before -> Terminal -> M2-After -> M1-After - Assert.Equal(new[] { "M1-Before", "M2-Before", "Terminal", "M2-After", "M1-After" }, context.Trace); - // Value: (0 + 10) * 2 + 5 = 25 - Assert.Equal(25, context.Value); - } - - [Fact] - public async Task Bail_HaltsOnFirstNonNullResult() - { - var manager = new PipelineManager(); - var executionLog = new List(); - - manager.RegisterBail("convert:file", async input => - { - executionLog.Add("Handler1"); - if (input.EndsWith(".docx", StringComparison.OrdinalIgnoreCase)) - return await Task.FromResult("DocxConverted"); - return null; - }); - - manager.RegisterBail("convert:file", async input => - { - executionLog.Add("Handler2"); - if (input.EndsWith(".xlsx", StringComparison.OrdinalIgnoreCase)) - return await Task.FromResult("ExcelConverted"); - return null; - }); - - manager.RegisterBail("convert:file", async input => - { - executionLog.Add("Handler3"); - return await Task.FromResult("FallbackConverted"); - }); - - // Test 1: Handled by Handler2 - var resultXlsx = await manager.ExecuteBailAsync("convert:file", "sheet.xlsx"); - Assert.Equal("ExcelConverted", resultXlsx); - Assert.Equal(new[] { "Handler1", "Handler2" }, executionLog); - - executionLog.Clear(); - - // Test 2: Handled by Handler1 - var resultDocx = await manager.ExecuteBailAsync("convert:file", "doc.docx"); - Assert.Equal("DocxConverted", resultDocx); - Assert.Equal(new[] { "Handler1" }, executionLog); - } - - [Fact] - public async Task Parallel_ExecutesAllHandlersConcurrently() - { - var manager = new PipelineManager(); - var results = new List(); - var lockObj = new object(); - - manager.RegisterParallel("event:notify", async val => - { - await Task.Delay(10); - lock (lockObj) results.Add(val * 1); - }); - - manager.RegisterParallel("event:notify", async val => - { - await Task.Delay(5); - lock (lockObj) results.Add(val * 2); - }); - - await manager.ExecuteParallelAsync("event:notify", 5); - - Assert.Equal(2, results.Count); - Assert.Contains(5, results); - Assert.Contains(10, results); - } - - [Fact] - public async Task Serial_ExecutesHandlersInDeterministicOrder() - { - var manager = new PipelineManager(); - var results = new List(); - - manager.RegisterSerial("validate:doc", async name => - { - await Task.Delay(15); - results.Add($"Step1-{name}"); - }); - - manager.RegisterSerial("validate:doc", async name => - { - await Task.Delay(5); - results.Add($"Step2-{name}"); - }); - - await manager.ExecuteSerialAsync("validate:doc", "Sample"); - - Assert.Equal(new[] { "Step1-Sample", "Step2-Sample" }, results); - } - - [Fact] - public async Task Pipeline_DisposingRegistration_RemovesFromExecution() - { - var manager = new PipelineManager(); - var count = 0; - - var reg = manager.RegisterSerial("counter", _ => - { - count++; - return Task.CompletedTask; - }); - - await manager.ExecuteSerialAsync("counter", 0); - Assert.Equal(1, count); - - // Dispose the registration - reg.Dispose(); - - await manager.ExecuteSerialAsync("counter", 0); - Assert.Equal(1, count); // Not called again - } -} diff --git a/tests/PdfEditorApp.Tests/PluginAssemblyLoaderTests.cs b/tests/PdfEditorApp.Tests/PluginAssemblyLoaderTests.cs deleted file mode 100644 index 5a6ca62..0000000 --- a/tests/PdfEditorApp.Tests/PluginAssemblyLoaderTests.cs +++ /dev/null @@ -1,43 +0,0 @@ -using System; -using System.IO; -using PdfEditorApp.Plugins.Loader; -using Xunit; - -namespace PdfEditorApp.Tests; - -public class PluginAssemblyLoaderTests -{ - [Fact] - public void LoadPluginAssembly_ThrowsWhenFileNotFound() - { - var nonExistentPath = Path.Combine(Path.GetTempPath(), $"missing_{Guid.NewGuid():N}.dll"); - Assert.Throws(() => PluginAssemblyLoader.LoadPluginAssembly(nonExistentPath)); - } - - [Fact] - public void DiscoverAndLoadDirectory_HandlesNonExistentDirectoryGracefully() - { - var nonExistentDir = Path.Combine(Path.GetTempPath(), $"dir_{Guid.NewGuid():N}"); - var results = PluginAssemblyLoader.DiscoverAndLoadDirectory(nonExistentDir); - Assert.Empty(results); - } - - [Fact] - public void DiscoverAndLoadDirectory_HandlesEmptyDirectory() - { - var tempDir = Path.Combine(Path.GetTempPath(), $"plugins_{Guid.NewGuid():N}"); - Directory.CreateDirectory(tempDir); - try - { - var results = PluginAssemblyLoader.DiscoverAndLoadDirectory(tempDir); - Assert.Empty(results); - } - finally - { - if (Directory.Exists(tempDir)) - { - Directory.Delete(tempDir, recursive: true); - } - } - } -} diff --git a/tests/PdfEditorApp.Tests/PluginEcosystemTests.cs b/tests/PdfEditorApp.Tests/PluginEcosystemTests.cs deleted file mode 100644 index 721f8d5..0000000 --- a/tests/PdfEditorApp.Tests/PluginEcosystemTests.cs +++ /dev/null @@ -1,308 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.IO.Compression; -using System.Linq; -using System.Text.Json; -using System.Threading.Tasks; -using Microsoft.Extensions.DependencyInjection; -using PdfEditorApp.Converters; -using PdfEditorApp.Core.Plugins; -using PdfEditorApp.Core.Plugins.Descriptors; -using PdfEditorApp.Core.Plugins.Manifests; -using PdfEditorApp.Core.Plugins.Settings; -using PdfEditorApp.Plugins.Loader; -using PdfEditorApp.Services.Inspector; -using PdfEditorApp.Services.Ribbon; -using PdfEditorApp.Services.Sidebar; -using PdfEditorApp.Services.StatusBar; -using PdfEditorApp.ViewModels; -using Xunit; - -namespace PdfEditorApp.Tests; - -public class PluginEcosystemTests -{ - [Fact] - public void DynamicRibbon_Tabs_Groups_And_Actions_Are_Reactive() - { - var registry = new RibbonRegistry(); - bool changedFired = false; - registry.RegistryChanged += () => changedFired = true; - - // Register tab - using var tabReg = registry.RegisterTab(new RibbonTabDescriptor - { - Id = "CustomAiTab", - Title = "AI Studio", - Order = 10 - }); - - Assert.True(changedFired); - Assert.Single(registry.GetAllTabs()); - Assert.Equal("CustomAiTab", registry.GetAllTabs()[0].Id); - - // Register group - using var groupReg = registry.RegisterGroup(new RibbonGroupDescriptor - { - Id = "AiGenGroup", - TabId = "CustomAiTab", - Title = "Generation", - Order = 1 - }); - - // Register action - bool actionExecuted = false; - registry.RegisterAction(new RibbonActionDescriptor - { - Id = "action.generate.summary", - TabId = "CustomAiTab", - GroupId = "AiGenGroup", - Label = "Summarize", - IconKind = "Brain", - Action = _ => actionExecuted = true - }); - - var groups = registry.GetGroupsForTab("CustomAiTab"); - Assert.Single(groups); - Assert.Equal("Generation", groups[0].Title); - - var actions = registry.GetActionsForGroup("CustomAiTab", "AiGenGroup"); - Assert.Single(actions); - Assert.Equal("Summarize", actions[0].Label); - - // Execute action - actions[0].Action!(null!); - Assert.True(actionExecuted); - - // Unregister action - Assert.True(registry.UnregisterAction("action.generate.summary")); - Assert.Empty(registry.GetActionsForGroup("CustomAiTab", "AiGenGroup")); - } - - [Fact] - public void DynamicSidebar_Registration_And_Selection_Works() - { - var registry = new SidebarRegistry(); - bool changed = false; - registry.RegistryChanged += () => changed = true; - - var sidebarDesc = new SidebarTabDescriptor - { - Id = "sidebar.ai.copilot", - Title = "AI Copilot", - IconKind = "Robot", - Tooltip = "Interactive PDF Assistant", - ViewFactory = sp => "CopilotViewInstance" - }; - - using var unreg = registry.RegisterTab(sidebarDesc); - - Assert.True(changed); - Assert.Single(registry.GetAllTabs()); - Assert.Equal("sidebar.ai.copilot", registry.GetTab("sidebar.ai.copilot")?.Id); - - var view = sidebarDesc.ViewFactory(null!); - Assert.Equal("CopilotViewInstance", view); - } - - [Fact] - public void DynamicInspector_Reacts_To_RegistryChanged() - { - var registry = new InspectorRegistry(); - var inspectorVm = new InspectorViewModel(inspectorRegistry: registry); - - Assert.Empty(inspectorVm.DynamicSections); - - // Register section - var secDesc = new InspectorSectionDescriptor - { - SectionId = "section.crypto.verify", - Title = "Signature Verification", - AppliesTo = target => target is string s && s == "Signature", - Factory = (sp, el) => $"VerifiedPanelFor_{el}" - }; - - using var unreg = registry.RegisterSection(secDesc); - - // Target matching - inspectorVm.RefreshDynamicSections("Signature"); - Assert.Contains(inspectorVm.DynamicSections, s => s is DynamicInspectorSectionViewModel d && (string?)d.Content == "VerifiedPanelFor_Signature"); - - // Target not matching - inspectorVm.RefreshDynamicSections("Text"); - Assert.DoesNotContain(inspectorVm.DynamicSections, s => s is DynamicInspectorSectionViewModel d && (string?)d.Content == "VerifiedPanelFor_Signature"); - - // Target null - inspectorVm.RefreshDynamicSections(null); - Assert.Empty(inspectorVm.DynamicSections); - } - - [Fact] - public void StatusBarRegistry_ZeroBaseline_And_WidgetViewModel_Rendering() - { - var registry = new StatusBarRegistry(seedDefaults: false); - Assert.Empty(registry.GetAllWidgets()); - - var desc = new StatusBarWidgetDescriptor - { - WidgetId = "test.widget.zoom", - Alignment = StatusBarAlignment.Right, - Order = 10, - ToolTip = "Current Zoom Level", - Factory = sp => new StatusBarWidgetViewModel - { - WidgetId = "test.widget.zoom", - Label = "100%", - IconKind = "Magnify", - ToolTip = "Current Zoom Level", - IsActive = true - } - }; - - using var unreg = registry.RegisterWidget(desc); - var widgets = registry.GetWidgets(StatusBarAlignment.Right); - Assert.Single(widgets); - - var vm = widgets[0].Factory(null!) as StatusBarWidgetViewModel; - Assert.NotNull(vm); - Assert.Equal("100%", vm.Label); - Assert.Equal("Magnify", vm.IconKind); - Assert.Equal("Current Zoom Level", vm.ToolTip); - Assert.True(vm.IsActive); - } - - [Fact] - public void PluginSettingsStore_Persists_And_Retrieves_Typed_Values() - { - var tempFile = Path.Combine(Path.GetTempPath(), $"plugin_settings_{Guid.NewGuid():N}.json"); - try - { - var store = new FilePluginSettingsStore(tempFile); - - store.SetSetting("frypdf.ai.groq", "ApiKey", "gsk_test_12345"); - store.SetSetting("frypdf.ai.groq", "MaxTokens", 4096); - store.SetSetting("frypdf.ai.groq", "StreamingEnabled", true); - store.Save(); - - // Reload from file - var store2 = new FilePluginSettingsStore(tempFile); - Assert.Equal("gsk_test_12345", store2.GetSetting("frypdf.ai.groq", "ApiKey", "")); - Assert.Equal(4096, store2.GetSetting("frypdf.ai.groq", "MaxTokens", 0)); - Assert.True(store2.GetSetting("frypdf.ai.groq", "StreamingEnabled", false)); - Assert.Equal("defaultVal", store2.GetSetting("frypdf.ai.groq", "NonExistent", "defaultVal")); - } - finally - { - if (File.Exists(tempFile)) File.Delete(tempFile); - } - } - - [Fact] - public void FryPluginPackageLoader_Creates_And_Unpacks_Package() - { - var tempDir = Path.Combine(Path.GetTempPath(), $"fry_test_pkg_{Guid.NewGuid():N}"); - var outputPkg = Path.Combine(Path.GetTempPath(), $"test_plugin_{Guid.NewGuid():N}.fryplugin"); - var extractDir = Path.Combine(Path.GetTempPath(), $"fry_extract_{Guid.NewGuid():N}"); - - try - { - Directory.CreateDirectory(tempDir); - - var manifest = new PluginManifest - { - Id = "com.sample.ocr", - Name = "Sample OCR Plugin", - Version = "1.2.0", - EntryPoint = "SampleOcr.dll", - Description = "High accuracy OCR package", - SettingsSchema = new Dictionary - { - ["Language"] = new() { Type = "select", Label = "Language", DefaultValue = "eng", Options = new() { "eng", "deu", "fra" } } - } - }; - - var manifestJson = JsonSerializer.Serialize(manifest, new JsonSerializerOptions { WriteIndented = true }); - File.WriteAllText(Path.Combine(tempDir, "plugin.json"), manifestJson); - - // Copy a valid current assembly DLL to act as entry point - var dummyDllPath = typeof(PluginEcosystemTests).Assembly.Location; - File.Copy(dummyDllPath, Path.Combine(tempDir, "SampleOcr.dll")); - - // Pack - FryPluginPackageLoader.CreatePackage(tempDir, outputPkg); - Assert.True(File.Exists(outputPkg)); - - // Unpack and load - var result = FryPluginPackageLoader.UnpackAndLoad(outputPkg, extractDir); - Assert.NotNull(result); - Assert.Equal("com.sample.ocr", result.Manifest.Id); - Assert.Equal("Sample OCR Plugin", result.Manifest.Name); - Assert.True(Directory.Exists(result.InstallDirectory)); - - result.Dispose(); - } - finally - { - if (Directory.Exists(tempDir)) Directory.Delete(tempDir, true); - if (Directory.Exists(extractDir)) Directory.Delete(extractDir, true); - if (File.Exists(outputPkg)) File.Delete(outputPkg); - } - } - - [Fact] - public void ValuesEqualMultiConverter_Evaluates_Correctly() - { - var converter = ValuesEqualMultiConverter.Instance; - - // Equal strings (case-insensitive) - Assert.True((bool)converter.Convert(new object?[] { "CustomTab", "customtab" }, typeof(bool), null, null!)!); - - // Different strings - Assert.False((bool)converter.Convert(new object?[] { "CustomTab", "OtherTab" }, typeof(bool), null, null!)!); - - // Null handling - Assert.True((bool)converter.Convert(new object?[] { null, null }, typeof(bool), null, null!)!); - Assert.False((bool)converter.Convert(new object?[] { "Tab", null }, typeof(bool), null, null!)!); - Assert.False((bool)converter.Convert(new object?[] { null, "Tab" }, typeof(bool), null, null!)!); - - // Less than 2 values - Assert.False((bool)converter.Convert(new object?[] { "Tab" }, typeof(bool), null, null!)!); - } - - [Fact] - public void PluginAssemblyLoader_DiscoverAndLoadDirectory_DiscoversPackagesAndSubdirectories() - { - var tempPluginsDir = Path.Combine(Path.GetTempPath(), $"fry_plugins_discovery_{Guid.NewGuid():N}"); - try - { - Directory.CreateDirectory(tempPluginsDir); - - // 1. Create a subdirectory with a dummy plugin manifest & DLL - var subDir = Path.Combine(tempPluginsDir, "sample_subplugin"); - Directory.CreateDirectory(subDir); - var manifest = new PluginManifest - { - Id = "com.sample.subplugin", - Name = "Sample Subplugin", - Version = "1.0.0", - EntryPoint = "PluginAssembly.dll" - }; - File.WriteAllText(Path.Combine(subDir, "plugin.json"), JsonSerializer.Serialize(manifest)); - File.Copy(typeof(PluginEcosystemTests).Assembly.Location, Path.Combine(subDir, "PluginAssembly.dll")); - - // 2. Discover - var packages = PluginAssemblyLoader.DiscoverAndLoadDirectory(tempPluginsDir); - Assert.NotEmpty(packages); - - foreach (var pkg in packages) - { - pkg.Dispose(); - } - } - finally - { - if (Directory.Exists(tempPluginsDir)) Directory.Delete(tempPluginsDir, true); - } - } -} diff --git a/tests/PdfEditorApp.Tests/PluginKernelTests.cs b/tests/PdfEditorApp.Tests/PluginKernelTests.cs deleted file mode 100644 index 92264de..0000000 --- a/tests/PdfEditorApp.Tests/PluginKernelTests.cs +++ /dev/null @@ -1,361 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using PdfEditorApp.Core.Plugins; -using PdfEditorApp.Core.Plugins.Descriptors; -using Xunit; - -namespace PdfEditorApp.Tests; - -public class PluginKernelTests -{ - private interface ITestServiceA { string GetValue(); } - private interface ITestServiceB { int GetCount(); } - - private class TestServiceA : ITestServiceA - { - public string GetValue() => "A"; - } - - private class TestServiceB : ITestServiceB - { - public int GetCount() => 42; - } - - private class PluginA : IFryPlugin - { - public string Id => "plugin.a"; - public string Name => "Plugin A"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => Array.Empty(); - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - ctx.RegisterService(new TestServiceA()); - ctx.RegisterTool(new PdfToolDescriptor - { - Id = "tool.test.a", - Name = "Tool A", - Description = "Description A", - Category = "Test", - IconKind = "TestIcon" - }); - return Task.CompletedTask; - } - } - - private class PluginB : IFryPlugin - { - public string Id => "plugin.b"; - public string Name => "Plugin B"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => new[] { typeof(ITestServiceA) }; - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - var svc = ctx.GetService(); - ctx.RegisterService(new TestServiceB()); - return Task.CompletedTask; - } - } - - private class CyclicPlugin1 : IFryPlugin - { - public string Id => "cyclic.1"; - public string Name => "Cyclic 1"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => new[] { typeof(ITestServiceB) }; - public IReadOnlyList ProvidedServices => new[] { typeof(ITestServiceA) }; - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - ctx.RegisterService(new TestServiceA()); - return Task.CompletedTask; - } - } - - private class CyclicPlugin2 : IFryPlugin - { - public string Id => "cyclic.2"; - public string Name => "Cyclic 2"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => new[] { typeof(ITestServiceA) }; - public IReadOnlyList ProvidedServices => new[] { typeof(ITestServiceB) }; - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - ctx.RegisterService(new TestServiceB()); - return Task.CompletedTask; - } - } - - [Fact] - public async Task PluginHost_TopologicalSort_ActivatesDependenciesBeforeConsumers() - { - var host = new PluginHost(); - // Register in reverse order: B (consumer) before A (provider) - host.RegisterPlugin(new PluginB()); - host.RegisterPlugin(new PluginA()); - - await host.StartAsync(); - - Assert.Equal(2, host.LoadedPlugins.Count); - Assert.Equal("plugin.a", host.LoadedPlugins[0].Id); - Assert.Equal("plugin.b", host.LoadedPlugins[1].Id); - - Assert.True(host.Context.HasService()); - Assert.True(host.Context.HasService()); - - var tool = host.Context.GetTool("tool.test.a"); - Assert.NotNull(tool); - Assert.Equal("Tool A", tool.Name); - } - - [Fact] - public async Task PluginHost_MissingDependency_ThrowsPluginMissingDependencyException() - { - var host = new PluginHost(); - // Register only PluginB, which requires ITestServiceA (not provided) - host.RegisterPlugin(new PluginB()); - - var ex = await Assert.ThrowsAsync(() => host.StartAsync()); - Assert.Equal("plugin.b", ex.PluginId); - Assert.Equal(typeof(ITestServiceA), ex.MissingServiceType); - } - - [Fact] - public async Task PluginHost_CyclicDependency_ThrowsPluginCircularDependencyException() - { - var host = new PluginHost(); - host.RegisterPlugin(new CyclicPlugin1()); - host.RegisterPlugin(new CyclicPlugin2()); - - await Assert.ThrowsAsync(() => host.StartAsync()); - } - - [Fact] - public async Task PluginHost_StopAsync_UnwindsEffectsAndRemovesServicesAndTools() - { - var host = new PluginHost(); - var disposedOrder = new List(); - - var pluginWithDisposal = new CustomDisposablePlugin(disposedOrder); - host.RegisterPlugin(new PluginA()); - host.RegisterPlugin(pluginWithDisposal); - - await host.StartAsync(); - Assert.True(host.Context.HasService()); - Assert.NotNull(host.Context.GetTool("tool.test.a")); - - await host.StopAsync(); - - Assert.Empty(host.LoadedPlugins); - Assert.False(host.Context.HasService()); - Assert.Null(host.Context.GetTool("tool.test.a")); - - // Verify LIFO effect disposal occurred - Assert.Contains("custom.disposed", disposedOrder); - } - - [Fact] - public async Task PluginHost_DisablePluginAsync_CascadesToDependentConsumers() - { - var host = new PluginHost(); - host.RegisterPlugin(new PluginA()); // provides ITestServiceA - host.RegisterPlugin(new PluginB()); // requires ITestServiceA, provides ITestServiceB - - await host.StartAsync(); - Assert.Equal(PluginState.Active, host.GetPluginState("plugin.a")); - Assert.Equal(PluginState.Active, host.GetPluginState("plugin.b")); - - // Disabling PluginA must cascade and suspend PluginB as well! - await host.DisablePluginAsync("plugin.a"); - - Assert.Equal(PluginState.Suspended, host.GetPluginState("plugin.a")); - Assert.Equal(PluginState.Suspended, host.GetPluginState("plugin.b")); - Assert.False(host.Context.HasService()); - Assert.False(host.Context.HasService()); - Assert.Null(host.Context.GetTool("tool.test.a")); - } - - [Fact] - public async Task PluginHost_EnablePluginAsync_ReactivatesAndAutoMountsSuspendedConsumers() - { - var host = new PluginHost(); - host.RegisterPlugin(new PluginA()); - host.RegisterPlugin(new PluginB()); - - await host.StartAsync(); - await host.DisablePluginAsync("plugin.a"); - - Assert.Equal(PluginState.Suspended, host.GetPluginState("plugin.a")); - Assert.Equal(PluginState.Suspended, host.GetPluginState("plugin.b")); - - // Re-enabling PluginA must automatically auto-mount PluginB because its dependency is now met! - await host.EnablePluginAsync("plugin.a"); - - Assert.Equal(PluginState.Active, host.GetPluginState("plugin.a")); - Assert.Equal(PluginState.Active, host.GetPluginState("plugin.b")); - Assert.True(host.Context.HasService()); - Assert.True(host.Context.HasService()); - Assert.NotNull(host.Context.GetTool("tool.test.a")); - } - - [Fact] - public async Task PluginHost_ReloadPluginAsync_CyclesStateAndRebuildsEffects() - { - var host = new PluginHost(); - var effectsLog = new List(); - - var testPlugin = new ActionPlugin("plugin.reload.test", - apply: ctx => - { - effectsLog.Add("applied"); - ctx.RegisterEffect(() => effectsLog.Add("disposed")); - return Task.CompletedTask; - }); - - host.RegisterPlugin(testPlugin); - await host.StartAsync(); - - Assert.Equal(new[] { "applied" }, effectsLog); - - await host.ReloadPluginAsync("plugin.reload.test"); - - Assert.Equal(new[] { "applied", "disposed", "applied" }, effectsLog); - Assert.Equal(PluginState.Active, host.GetPluginState("plugin.reload.test")); - } - - [Fact] - public void PdfToolRegistry_ZeroBaseline_StartsEmptyAndReactsToPluginContext() - { - var ctx = new FryPluginContext(); - var registry = new PdfEditorApp.Services.Tools.Core.PdfToolRegistry(ctx, seedDefaults: false); - - // Initially empty - Assert.Empty(registry.GetAllTools()); - - bool changedFired = false; - registry.RegistryChanged += () => changedFired = true; - - // Register a tool dynamically in context - using (ctx.RegisterTool(new PdfToolDescriptor - { - Id = "frypdf.tool.custom", - Name = "Custom Tool", - Description = "Custom dynamic tool", - Category = "General", - IconKind = "Wrench", - CreateViewModel = sp => null! - })) - { - Assert.True(changedFired); - Assert.Single(registry.GetAllTools()); - Assert.Equal("Custom Tool", registry.GetAllTools()[0].Name); - } - - // After disposing the registration, the tool is cleanly gone! - Assert.Empty(registry.GetAllTools()); - } - - [Fact] - public void CanvasElementRegistry_ZeroBaseline_StartsEmptyAndPopulatesViaPlugins() - { - var registry = new PdfEditorApp.Services.Canvas.CanvasElementRegistry(null, seedBuiltIns: false); - - Assert.Empty(registry.GetAllDescriptors()); - - var desc = new CanvasElementDescriptor - { - ElementTypeId = "frypdf.element.custom", - DisplayName = "Custom Element", - ModelType = typeof(CustomTestElementModel), - ViewModelType = typeof(PdfEditorApp.ViewModels.ElementViewModels.TextElementViewModel), - IconKind = "Star", - Factory = (sp, m) => new PdfEditorApp.ViewModels.ElementViewModels.TextElementViewModel() - }; - - registry.RegisterElement(desc); - Assert.Single(registry.GetAllDescriptors()); - Assert.NotNull(registry.GetDescriptor("frypdf.element.custom")); - - registry.UnregisterElement("frypdf.element.custom"); - Assert.Empty(registry.GetAllDescriptors()); - } - - [Fact] - public void DynamicElementJsonResolver_SerializesAndDeserializesCustomPluginElement() - { - var descriptors = new List - { - new CanvasElementDescriptor - { - ElementTypeId = "frypdf.element.custom_test", - DisplayName = "Custom Test", - ModelType = typeof(CustomTestElementModel), - ViewModelType = typeof(PdfEditorApp.ViewModels.ElementViewModels.TextElementViewModel), - IconKind = "Star" - } - }; - - var options = PdfEditorApp.Core.Models.Elements.DynamicElementJsonResolver.CreateOptions(() => descriptors); - - PdfEditorApp.Core.Models.Elements.PdfElementBase element = new CustomTestElementModel - { - CustomProperty = "CordisParity" - }; - - string json = System.Text.Json.JsonSerializer.Serialize(element, options); - Assert.Contains("\"$type\":\"frypdf.element.custom_test\"", json); - Assert.Contains("\"CustomProperty\":\"CordisParity\"", json); - - var deserialized = System.Text.Json.JsonSerializer.Deserialize(json, options); - Assert.NotNull(deserialized); - Assert.IsType(deserialized); - Assert.Equal("CordisParity", ((CustomTestElementModel)deserialized).CustomProperty); - } - - private class ActionPlugin : IFryPlugin - { - private readonly Func _apply; - public ActionPlugin(string id, Func apply) - { - Id = id; - _apply = apply; - } - - public string Id { get; } - public string Name => Id; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => Array.Empty(); - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) => _apply(ctx); - } - - private class CustomTestElementModel : PdfEditorApp.Core.Models.Elements.PdfElementBase - { - public override PdfEditorApp.Core.Models.ElementKind Kind => PdfEditorApp.Core.Models.ElementKind.Text; - public string CustomProperty { get; set; } = string.Empty; - } - - private class CustomDisposablePlugin : IFryPlugin - { - private readonly List _disposedLog; - - public CustomDisposablePlugin(List disposedLog) - { - _disposedLog = disposedLog; - } - - public string Id => "plugin.custom.disposable"; - public string Name => "Custom Disposable"; - public Version Version => new(1, 0, 0); - public IReadOnlyList RequiredServices => Array.Empty(); - - public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default) - { - ctx.RegisterEffect(() => _disposedLog.Add("custom.disposed")); - return Task.CompletedTask; - } - } -} diff --git a/tests/PdfEditorApp.Tests/PluginsManagerPageTests.cs b/tests/PdfEditorApp.Tests/PluginsManagerPageTests.cs deleted file mode 100644 index 016f6f1..0000000 --- a/tests/PdfEditorApp.Tests/PluginsManagerPageTests.cs +++ /dev/null @@ -1,245 +0,0 @@ -using System; -using System.IO; -using System.Linq; -using System.Threading.Tasks; -using Microsoft.Extensions.DependencyInjection; -using PdfEditorApp.Core.Plugins; -using PdfEditorApp.Core.Plugins.Descriptors; -using PdfEditorApp.Core.Plugins.Marketplace; -using PdfEditorApp.Core.Plugins.Profiles; -using PdfEditorApp.Plugins.Bundles; -using PdfEditorApp.Services.Plugins; -using PdfEditorApp.Services.Tools.Core; -using PdfEditorApp.ViewModels; -using Xunit; - -namespace PdfEditorApp.Tests; - -public class PluginsManagerPageTests -{ - private ServiceProvider CreateTestServices(string? testDir = null) - { - var services = new ServiceCollection(); - App.ConfigureServices(services); - if (testDir != null) - { - var storePath = Path.Combine(testDir, "installed_plugins.json"); - services.AddSingleton(new FileInstalledPluginStore(storePath)); - services.AddSingleton(sp => - { - var host = sp.GetRequiredService(); - var overlay = sp.GetService(); - var store = sp.GetRequiredService(); - var pluginsDir = Path.Combine(testDir, "plugins"); - return new PluginMarketplaceService(host, overlay, store, null, null, pluginsDir); - }); - } - return services.BuildServiceProvider(); - } - - [Fact] - public async Task PluginsManager_LoadsAllInstalledPluginsAndCategorizesCorrectly() - { - var sp = CreateTestServices(); - var host = sp.GetRequiredService(); - - // Mount domain bundles - var bundles = new IFryPluginBundle[] - { - new ToolsOrganizeBundle(), - new ToolsSecurityBundle(), - new ToolsConversionBundle(), - new ToolsIntelligenceBundle(), - new DataStudioBundle() - }; - - var profile = new PluginProfile - { - ProfileName = "desktop", - Bundles = bundles.Select(b => b.Id).ToList() - }; - ProfileLoader.ApplyProfile(profile, host, bundles); - await host.StartAsync(); - - var toolRegistry = sp.GetRequiredService(); - var marketplace = sp.GetRequiredService(); - - var vm = new PluginsManagerViewModel(host, marketplace, toolRegistry); - await vm.LoadAllDataAsync(); - - Assert.Equal(33, vm.InstalledCount); - Assert.Equal(33, vm.ActiveInstalledCount); - Assert.NotEmpty(vm.FilteredInstalledPlugins); - - // Verify Categories - var categories = vm.FilteredInstalledPlugins.Select(p => p.Category).Distinct().ToList(); - Assert.Contains("Tools & Productivity", categories); - - // Verify specific plugins are present - Assert.Contains(vm.FilteredInstalledPlugins, p => p.Id == "frypdf.tool.merge"); - Assert.Contains(vm.FilteredInstalledPlugins, p => p.Id == "frypdf.tool.compress"); - - await host.StopAsync(); - } - - [Fact] - public async Task PluginsManager_SearchAndFilter_WorksAcrossBothInstalledAndMarketplace() - { - var sp = CreateTestServices(); - var host = sp.GetRequiredService(); - var bundles = new IFryPluginBundle[] { new ToolsOrganizeBundle(), new ToolsSecurityBundle() }; - var profile = new PluginProfile { ProfileName = "desktop", Bundles = bundles.Select(b => b.Id).ToList() }; - ProfileLoader.ApplyProfile(profile, host, bundles); - await host.StartAsync(); - - var marketplace = sp.GetRequiredService(); - var vm = new PluginsManagerViewModel(host, marketplace); - await vm.LoadAllDataAsync(); - - // 1. Search Installed - vm.SearchQuery = "merge"; - Assert.Single(vm.FilteredInstalledPlugins); - Assert.Equal("frypdf.tool.merge", vm.FilteredInstalledPlugins[0].Id); - - // 2. Clear Search - vm.SearchQuery = ""; - Assert.Equal(13, vm.FilteredInstalledPlugins.Count); - - // 3. Switch to Marketplace Tab & Search - vm.SelectedTab = PluginsManagerTab.Marketplace; - Assert.NotEmpty(vm.FilteredMarketplacePlugins); - - vm.SearchQuery = "Snake"; - Assert.Single(vm.FilteredMarketplacePlugins); - Assert.Equal("frypdf.overlay.snake", vm.FilteredMarketplacePlugins[0].Id); - - vm.SearchQuery = "Arcade"; - Assert.Equal(2, vm.FilteredMarketplacePlugins.Count); - Assert.Contains(vm.FilteredMarketplacePlugins, m => m.Id == "frypdf.overlay.snake"); - Assert.Contains(vm.FilteredMarketplacePlugins, m => m.Id == "com.frypdf.plugin.tictactoe"); - - // 4. Filter by Category - vm.SearchQuery = ""; - vm.SelectedCategory = "UI & Extensions"; - Assert.Contains(vm.FilteredMarketplacePlugins, m => m.Id == "frypdf.overlay.snake"); - - await host.StopAsync(); - } - - [Fact] - public async Task PluginsManager_Selection_PopulatesDetailViewModelAndContributions() - { - var sp = CreateTestServices(); - var host = sp.GetRequiredService(); - var bundles = new IFryPluginBundle[] { new ToolsConversionBundle() }; - var profile = new PluginProfile { ProfileName = "desktop", Bundles = bundles.Select(b => b.Id).ToList() }; - ProfileLoader.ApplyProfile(profile, host, bundles); - await host.StartAsync(); - - var marketplace = sp.GetRequiredService(); - var vm = new PluginsManagerViewModel(host, marketplace); - await vm.LoadAllDataAsync(); - - Assert.NotEmpty(vm.FilteredInstalledPlugins); - var target = vm.FilteredInstalledPlugins.First(p => p.Id == "frypdf.tool.pdftoword"); - - vm.SelectedInstalledPlugin = target; - Assert.NotNull(vm.SelectedDetail); - Assert.Equal("frypdf.tool.pdftoword", vm.SelectedDetail.Id); - Assert.Equal(target.Name, vm.SelectedDetail.Name); - Assert.True(vm.SelectedDetail.IsInstalled); - Assert.True(vm.SelectedDetail.IsActive); - Assert.NotEmpty(vm.SelectedDetail.ContributedFeatures); - Assert.NotEmpty(vm.SelectedDetail.Highlights); - Assert.NotEmpty(vm.SelectedDetail.Dependencies); - - // Test Sub-Tab navigation - vm.SelectedDetail.SelectTab("Contributions"); - Assert.Equal(ExtensionDetailTab.Contributions, vm.SelectedDetail.SelectedTab); - - vm.SelectedDetail.SelectTab("Runtime"); - Assert.Equal(ExtensionDetailTab.Runtime, vm.SelectedDetail.SelectedTab); - Assert.Contains("Active", vm.SelectedDetail.RuntimeStatus); - - await host.StopAsync(); - } - - [Fact] - public async Task PluginsManager_Marketplace_InstallsAndMountsRealPluginIntoHost() - { - var tempDir = Path.Combine(AppContext.BaseDirectory, $"frypdf_pm_test_{Guid.NewGuid():N}"); - Directory.CreateDirectory(tempDir); - try - { - var sp = CreateTestServices(tempDir); - var host = sp.GetRequiredService(); - var marketplace = sp.GetRequiredService(); - - var vm = new PluginsManagerViewModel(host, marketplace); - await vm.LoadAllDataAsync(); - - vm.SelectedTab = PluginsManagerTab.Marketplace; - var snakeItem = vm.FilteredMarketplacePlugins.First(m => m.Id == "frypdf.overlay.snake"); - vm.SelectedMarketplacePlugin = snakeItem; - - Assert.NotNull(vm.SelectedDetail); - Assert.Equal("frypdf.overlay.snake", vm.SelectedDetail.Id); - Assert.Equal("FryPDF Team", vm.SelectedDetail.Publisher); - Assert.True(vm.SelectedDetail.IsOfficial); - Assert.True(vm.SelectedDetail.IsVerified); - - // Verify initially not active in host - Assert.False(host.IsPluginActive("frypdf.overlay.snake")); - - // Perform 1-click install: mounts real SnakeGamePlugin into PluginHost and activates it! - await vm.InstallMarketplacePluginCommand.ExecuteAsync("frypdf.overlay.snake"); - - Assert.True(marketplace.IsPluginInstalled("frypdf.overlay.snake")); - Assert.True(host.IsPluginActive("frypdf.overlay.snake")); - - // Clean up: uninstalls and disables from host - await marketplace.UninstallPluginAsync("frypdf.overlay.snake"); - Assert.False(marketplace.IsPluginInstalled("frypdf.overlay.snake")); - Assert.False(host.IsPluginActive("frypdf.overlay.snake")); - } - finally - { - try { Directory.Delete(tempDir, recursive: true); } catch { } - } - } - - [Fact] - public async Task WorkspacePagesBundle_RegistersPluginsPageDescriptorCorrectly() - { - var sp = CreateTestServices(); - var navRegistry = sp.GetRequiredService(); - - var bundle = new WorkspacePagesBundle(); - Assert.Contains(bundle.Plugins, p => p.Id == "frypdf.page.plugins"); - - var ctx = sp.GetRequiredService(); - var plugin = bundle.Plugins.First(p => p.Id == "frypdf.page.plugins"); - await plugin.ApplyAsync(ctx); - - var item = navRegistry.GetItem("Plugins"); - Assert.NotNull(item); - Assert.Equal("Plugins & Extensions", item.Title); - Assert.Equal("Preferences", item.Group); - Assert.Equal("PuzzleOutline", item.IconKind); - Assert.NotNull(item.ViewFactory); - } - - [Fact] - public void HomeViewModel_NavigatesToPluginsSectionCorrectly() - { - var sp = CreateTestServices(); - var home = sp.GetRequiredService(); - - Assert.NotNull(home.PluginsManager); - - home.SelectNavSectionCommand.Execute("Plugins"); - - Assert.True(home.IsPluginsSection); - Assert.Equal(PdfEditorApp.Core.Models.HomeNavSection.Plugins, home.SelectedNavSection); - } -} diff --git a/tests/PdfEditorApp.Tests/PluginsStudioUiTests.cs b/tests/PdfEditorApp.Tests/PluginsStudioUiTests.cs deleted file mode 100644 index 276ea65..0000000 --- a/tests/PdfEditorApp.Tests/PluginsStudioUiTests.cs +++ /dev/null @@ -1,158 +0,0 @@ -using System; -using System.Linq; -using System.Threading.Tasks; -using Microsoft.Extensions.DependencyInjection; -using PdfEditorApp.Core.Plugins; -using PdfEditorApp.Core.Plugins.Profiles; -using PdfEditorApp.Plugins.Bundles; -using PdfEditorApp.Services.Tools.Core; -using PdfEditorApp.ViewModels; -using Xunit; - -namespace PdfEditorApp.Tests; - -public class PluginsStudioUiTests -{ - [Fact] - public async Task PluginsDialog_PopulatesAndFiltersPluginsCorrectly() - { - // 1. Setup DI container with plugin host and bundles - var services = new ServiceCollection(); - App.ConfigureServices(services); - var sp = services.BuildServiceProvider(); - - var host = sp.GetRequiredService(); - - // Mount all 5 domain bundles - var bundles = new IFryPluginBundle[] - { - new ToolsOrganizeBundle(), - new ToolsSecurityBundle(), - new ToolsConversionBundle(), - new ToolsIntelligenceBundle(), - new DataStudioBundle() - }; - - var profile = new PluginProfile - { - ProfileName = "desktop", - Bundles = bundles.Select(b => b.Id).ToList() - }; - ProfileLoader.ApplyProfile(profile, host, bundles); - await host.StartAsync(); - - // 2. Resolve MainViewModel - var mainVm = sp.GetRequiredService(); - mainVm.PluginHost = host; - - // 3. Open Plugins Dialog - mainVm.OpenPluginsDialogCommand.Execute(null); - - Assert.True(mainVm.IsPluginsDialogOpen); - Assert.NotEmpty(mainVm.FilteredPluginsList); - Assert.Equal(33, mainVm.FilteredPluginsList.Count); - - // Verify specific plugins - Assert.Contains(mainVm.FilteredPluginsList, p => p.Id == "frypdf.tool.merge"); - Assert.Contains(mainVm.FilteredPluginsList, p => p.Id == "frypdf.tool.compress"); - Assert.Contains(mainVm.FilteredPluginsList, p => p.Id == "frypdf.tool.aisummarizer"); - - // 4. Test Search Filtering - mainVm.PluginSearchQuery = "merge"; - Assert.Equal(2, mainVm.FilteredPluginsList.Count); // Merge PDF and Batch Mail Merge - Assert.Contains(mainVm.FilteredPluginsList, p => p.Id == "frypdf.tool.merge"); - Assert.Contains(mainVm.FilteredPluginsList, p => p.Id == "frypdf.tool.batchgeneration"); - - mainVm.PluginSearchQuery = "compress"; - Assert.Single(mainVm.FilteredPluginsList); - Assert.Equal("frypdf.tool.compress", mainVm.FilteredPluginsList[0].Id); - - // 5. Clear Search - mainVm.PluginSearchQuery = ""; - Assert.Equal(33, mainVm.FilteredPluginsList.Count); - - // 6. Close Dialog - mainVm.ClosePluginsDialogCommand.Execute(null); - Assert.False(mainVm.IsPluginsDialogOpen); - - await host.StopAsync(); - } - - [Fact] - public async Task PluginsDialog_WithAll16Bundles_DisplaysRichCategorizedPlugins() - { - var services = new ServiceCollection(); - App.ConfigureServices(services); - var sp = services.BuildServiceProvider(); - - var host = sp.GetRequiredService(); - - var bundles = new IFryPluginBundle[] - { - new ToolsOrganizeBundle(), - new ToolsSecurityBundle(), - new ToolsConversionBundle(), - new ToolsIntelligenceBundle(), - new DataStudioBundle(), - new CanvasElementsBundle(), - new DocumentIoBundle(), - new AiProvidersBundle(), - new OcrEnginesBundle(), - new StandardTemplatesBundle(), - new StatusBarBundle(), - new InspectorBundle(), - new CommandPaletteBundle(), - new WorkspacePagesBundle(), - new DialogsBundle(), - new EditorSidebarsBundle() - }; - - var profile = new PluginProfile - { - ProfileName = "desktop", - Bundles = bundles.Select(b => b.Id).ToList() - }; - ProfileLoader.ApplyProfile(profile, host, bundles); - await host.StartAsync(); - - var mainVm = sp.GetRequiredService(); - mainVm.PluginHost = host; - - mainVm.OpenPluginsDialogCommand.Execute(null); - - Assert.True(mainVm.IsPluginsDialogOpen); - Assert.True(mainVm.FilteredPluginsList.Count >= 70, $"Expected >= 70 plugins but found {mainVm.FilteredPluginsList.Count}"); - - // Verify categories exist across diverse subsystems - var categories = mainVm.FilteredPluginsList.Select(p => p.Category).Distinct().ToList(); - Assert.Contains("Workspace Navigation", categories); - Assert.Contains("Modal Studios & Dialogs", categories); - Assert.Contains("Editor Sidebars", categories); - Assert.Contains("Canvas Elements", categories); - Assert.Contains("Document I/O", categories); - Assert.Contains("AI Providers", categories); - Assert.Contains("OCR Engines", categories); - Assert.Contains("Document Templates", categories); - Assert.Contains("Status Bar Widgets", categories); - Assert.Contains("Property Inspector", categories); - Assert.Contains("Command Palette", categories); - - // Test searching for specific subsystems - mainVm.PluginSearchQuery = "ai"; - Assert.NotEmpty(mainVm.FilteredPluginsList); - Assert.Contains(mainVm.FilteredPluginsList, p => p.Id.Contains("ai")); - - mainVm.PluginSearchQuery = "sidebar"; - Assert.NotEmpty(mainVm.FilteredPluginsList); - Assert.Contains(mainVm.FilteredPluginsList, p => p.Category == "Editor Sidebars"); - - mainVm.PluginSearchQuery = "dialog"; - Assert.NotEmpty(mainVm.FilteredPluginsList); - Assert.Contains(mainVm.FilteredPluginsList, p => p.Category == "Modal Studios & Dialogs"); - - mainVm.ClosePluginsDialogCommand.Execute(null); - Assert.False(mainVm.IsPluginsDialogOpen); - - await host.StopAsync(); - } -} diff --git a/tests/PdfEditorApp.Tests/ProfileAndBundleTests.cs b/tests/PdfEditorApp.Tests/ProfileAndBundleTests.cs deleted file mode 100644 index 249ac8e..0000000 --- a/tests/PdfEditorApp.Tests/ProfileAndBundleTests.cs +++ /dev/null @@ -1,196 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using PdfEditorApp.Core.Plugins; -using PdfEditorApp.Core.Plugins.Profiles; -using PdfEditorApp.Models; -using PdfEditorApp.Plugins.Bundles; -using PdfEditorApp.Services; -using PdfEditorApp.Services.Tools.Conversion; -using PdfEditorApp.Services.Tools.Core; -using PdfEditorApp.Services.Tools.Intelligence; -using PdfEditorApp.Services.Tools.Organize; -using PdfEditorApp.Services.Tools.Security; -using Xunit; - -namespace PdfEditorApp.Tests; - -public class ProfileAndBundleTests -{ - private class DummyOperationsService : IPdfDocumentOperationsService - { - public IPdfToolRegistry ToolRegistry => null!; - public IPdfPageService PageService => null!; - public IPdfOptimizationService OptimizationService => null!; - public IPdfSecurityService SecurityService => null!; - public IPdfConversionService ConversionService => null!; - public IPdfOcrService OcrService => null!; - public IPdfFormService FormService => null!; - public IAiDocumentService AiService => null!; - public IDocumentTranslationService TranslationService => null!; - public IPdfWorkflowEngine WorkflowEngine => null!; - - public Task ExecuteToolAsync(PdfToolId toolId, object options, IProgress? progress = null, CancellationToken ct = default) - { - return Task.FromResult(new ToolExecutionResult { Success = true }); - } - } - - [Fact] - public void ProfileLoader_ParseValidJson_Succeeds() - { - var json = """ - { - "name": "Custom Profile", - "description": "Test custom profile configuration", - "version": "1.0.0", - "bundles": [ - "FryPdf.Bundle.Tools.Organize", - "FryPdf.Bundle.Tools.Security" - ], - "enabledPlugins": [ - "frypdf.tool.merge", - "frypdf.tool.split" - ], - "disabledPlugins": [ - "frypdf.tool.compress" - ], - "settings": { - "maxMemoryMb": "1024", - "enableTelemetry": "false" - } - } - """; - - var profile = ProfileLoader.LoadProfileFromJson(json); - - Assert.NotNull(profile); - Assert.Equal("Custom Profile", profile.Name); - Assert.Equal("1.0.0", profile.Version); - Assert.Contains("FryPdf.Bundle.Tools.Organize", profile.Bundles); - Assert.Contains("FryPdf.Bundle.Tools.Security", profile.Bundles); - Assert.Contains("frypdf.tool.merge", profile.EnabledPlugins); - Assert.Contains("frypdf.tool.compress", profile.DisabledPlugins); - Assert.True(profile.IsPluginEnabled("frypdf.tool.merge")); - Assert.False(profile.IsPluginEnabled("frypdf.tool.compress")); - Assert.True(profile.IsBundleEnabled("FryPdf.Bundle.Tools.Organize")); - } - - [Fact] - public void ProfileLoader_LoadFromFile_ReadsCorrectly() - { - var tempFile = Path.Combine(Path.GetTempPath(), $"frypdf_profile_{Guid.NewGuid():N}.json"); - try - { - File.WriteAllText(tempFile, """ - { - "name": "Temp Test Profile", - "version": "2.0.0" - } - """); - - var profile = ProfileLoader.LoadProfileFromFile(tempFile); - Assert.NotNull(profile); - Assert.Equal("Temp Test Profile", profile.Name); - Assert.Equal("2.0.0", profile.Version); - } - finally - { - if (File.Exists(tempFile)) - { - File.Delete(tempFile); - } - } - } - - [Fact] - public async Task Bundles_InstantiateAndRegisterCorrectPlugins() - { - var organizeBundle = new ToolsOrganizeBundle(); - Assert.Equal("FryPdf.Bundle.Tools.Organize", organizeBundle.Id); - Assert.Equal(6, organizeBundle.Plugins.Count); - Assert.Contains(organizeBundle.Plugins, p => p.Id == "frypdf.tool.merge"); - Assert.Contains(organizeBundle.Plugins, p => p.Id == "frypdf.tool.split"); - Assert.Contains(organizeBundle.Plugins, p => p.Id == "frypdf.tool.rotate"); - Assert.Contains(organizeBundle.Plugins, p => p.Id == "frypdf.tool.organize"); - Assert.Contains(organizeBundle.Plugins, p => p.Id == "frypdf.tool.crop"); - Assert.Contains(organizeBundle.Plugins, p => p.Id == "frypdf.tool.pagenumbers"); - - var securityBundle = new ToolsSecurityBundle(); - Assert.Equal("FryPdf.Bundle.Tools.Security", securityBundle.Id); - Assert.Equal(7, securityBundle.Plugins.Count); - Assert.Contains(securityBundle.Plugins, p => p.Id == "frypdf.tool.compress"); - Assert.Contains(securityBundle.Plugins, p => p.Id == "frypdf.tool.protect"); - Assert.Contains(securityBundle.Plugins, p => p.Id == "frypdf.tool.unlock"); - Assert.Contains(securityBundle.Plugins, p => p.Id == "frypdf.tool.sign"); - - var conversionBundle = new ToolsConversionBundle(); - Assert.Equal("FryPdf.Bundle.Tools.Conversion", conversionBundle.Id); - Assert.Equal(12, conversionBundle.Plugins.Count); - Assert.Contains(conversionBundle.Plugins, p => p.Id == "frypdf.tool.pdftoword"); - Assert.Contains(conversionBundle.Plugins, p => p.Id == "frypdf.tool.wordtopdf"); - - var intelligenceBundle = new ToolsIntelligenceBundle(); - Assert.Equal("FryPdf.Bundle.Tools.Intelligence", intelligenceBundle.Id); - Assert.Equal(6, intelligenceBundle.Plugins.Count); - Assert.Contains(intelligenceBundle.Plugins, p => p.Id == "frypdf.tool.aisummarizer"); - Assert.Contains(intelligenceBundle.Plugins, p => p.Id == "frypdf.tool.ocr"); - - var dataStudioBundle = new DataStudioBundle(); - Assert.Equal("FryPdf.Bundle.DataStudio", dataStudioBundle.Id); - Assert.Equal(2, dataStudioBundle.Plugins.Count); - - // Verify mounting into PluginHost with dummy operations service - var ctx = new FryPluginContext(); - ctx.RegisterService(new DummyOperationsService()); - var host = new PluginHost(ctx); - - foreach (var plugin in organizeBundle.Plugins) - { - host.RegisterPlugin(plugin); - } - - await host.StartAsync(); - Assert.Equal(6, host.LoadedPlugins.Count); - - await host.StopAsync(); - Assert.Empty(host.LoadedPlugins); - } - - [Fact] - public async Task ProfileLoader_ApplyToHostAsync_RespectsFilters() - { - var profile = new PluginProfile - { - Name = "Filtered Profile", - EnabledPlugins = new() { "frypdf.tool.merge", "frypdf.tool.compress" }, - DisabledPlugins = new() { "frypdf.tool.split" } - }; - - var allAvailablePlugins = new IFryPlugin[] - { - new ToolsOrganizeBundle().Plugins[0], // merge - new ToolsOrganizeBundle().Plugins[1], // split - new ToolsSecurityBundle().Plugins[0], // compress - new ToolsSecurityBundle().Plugins[1] // repair - }; - - var ctx = new FryPluginContext(); - ctx.RegisterService(new DummyOperationsService()); - var host = new PluginHost(ctx); - - await ProfileLoader.ApplyToHostAsync(host, profile, allAvailablePlugins); - - // Only merge and compress should be active - Assert.Equal(2, host.LoadedPlugins.Count); - Assert.Contains(host.LoadedPlugins, p => p.Id == "frypdf.tool.merge"); - Assert.Contains(host.LoadedPlugins, p => p.Id == "frypdf.tool.compress"); - Assert.DoesNotContain(host.LoadedPlugins, p => p.Id == "frypdf.tool.split"); - Assert.DoesNotContain(host.LoadedPlugins, p => p.Id == "frypdf.tool.repair"); - - await host.StopAsync(); - } -} diff --git a/tests/PdfEditorApp.Tests/RemotePluginMarketplaceTests.cs b/tests/PdfEditorApp.Tests/RemotePluginMarketplaceTests.cs deleted file mode 100644 index 97a56c1..0000000 --- a/tests/PdfEditorApp.Tests/RemotePluginMarketplaceTests.cs +++ /dev/null @@ -1,260 +0,0 @@ -using System; -using System.IO; -using System.Linq; -using System.Net; -using System.Net.Http; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Extensions.DependencyInjection; -using PdfEditorApp.Core.Plugins; -using PdfEditorApp.Core.Plugins.Descriptors; -using PdfEditorApp.Core.Plugins.Marketplace; -using PdfEditorApp.Core.Plugins.Profiles; -using PdfEditorApp.Plugins.Bundles; -using PdfEditorApp.Services; -using PdfEditorApp.Services.Overlays; -using PdfEditorApp.Services.Plugins; -using Xunit; - -namespace PdfEditorApp.Tests; - -public class RemotePluginMarketplaceTests -{ - private static IServiceProvider CreateTestServices(string? testDir = null, HttpClient? httpClient = null, string? registryBaseUrl = null) - { - var services = new ServiceCollection(); - services.AddSingleton(); - services.AddSingleton(sp => sp.GetRequiredService()); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(sp => sp.GetRequiredService()); - services.AddSingleton(sp => - { - var storePath = testDir != null - ? Path.Combine(testDir, "installed_plugins.json") - : Path.Combine(AppContext.BaseDirectory, $"installed_plugins_test_{Guid.NewGuid():N}.json"); - return new FileInstalledPluginStore(storePath); - }); - - services.AddSingleton(sp => - { - var host = sp.GetRequiredService(); - var overlay = sp.GetRequiredService(); - var store = sp.GetRequiredService(); - var pluginsDir = testDir != null ? Path.Combine(testDir, "plugins") : null; - return new PluginMarketplaceService(host, overlay, store, httpClient, registryBaseUrl, pluginsDir); - }); - - return services.BuildServiceProvider(); - } - - [Fact] - public async Task FetchRemoteCatalogAsync_ParsesOfficialGitHubCatalog_WhenOnline() - { - var sp = CreateTestServices(); - var marketplace = sp.GetRequiredService(); - - var remoteItems = await marketplace.FetchRemoteCatalogAsync(); - - // If machine is online, catalog from codefrydev/PDFCreator-resources is fetched - if (remoteItems.Count > 0) - { - var ticTacToe = remoteItems.FirstOrDefault(i => i.Id == "com.frypdf.plugin.tictactoe"); - Assert.NotNull(ticTacToe); - Assert.Equal("Tic-Tac-Toe", ticTacToe.Name); - Assert.Equal("Code Fry Dev", ticTacToe.Publisher); - Assert.Equal("UI & Extensions", ticTacToe.Category); - Assert.StartsWith("https://raw.githubusercontent.com/codefrydev/PDFCreator-resources/", ticTacToe.DownloadUrl); - Assert.Contains("tictactoe", ticTacToe.Tags); - - // Verify merging with curated extensions - var fullCatalog = await marketplace.GetCatalogAsync(); - Assert.Contains(fullCatalog, i => i.Id == "frypdf.overlay.snake"); - Assert.Contains(fullCatalog, i => i.Id == "com.frypdf.plugin.tictactoe"); - } - } - - [Fact] - public async Task FetchRemoteCatalogAsync_HandlesOfflineGracefully_WithoutThrowing() - { - // Simulate completely invalid / offline registry - using var offlineClient = new HttpClient { Timeout = TimeSpan.FromMilliseconds(500) }; - var sp = CreateTestServices(httpClient: offlineClient, registryBaseUrl: "http://invalid-unreachable-domain-987654.xyz"); - var marketplace = sp.GetRequiredService(); - - // Must not throw any unhandled exception - var remote = await marketplace.FetchRemoteCatalogAsync(); - Assert.NotNull(remote); - - // Curated local extensions must remain accessible - var catalog = await marketplace.GetCatalogAsync(); - Assert.NotEmpty(catalog); - Assert.Contains(catalog, i => i.Id == "frypdf.overlay.snake"); - } - - [Fact] - public async Task InstallPluginAsync_SupportsRemotePluginPackage_WithMockHttp() - { - var tempDir = Path.Combine(AppContext.BaseDirectory, $"frypdf_remote_test_{Guid.NewGuid():N}"); - Directory.CreateDirectory(tempDir); - - try - { - // Use pre-packaged TicTacToe.fryplugin from examples - var tictactoePkg = Path.GetFullPath(Path.Combine(AppContext.BaseDirectory, "../../../../../docs/examples/TicTacToePlugin/bin/Release/net10.0/TicTacToe.fryplugin")); - byte[] pkgBytes; - if (File.Exists(tictactoePkg)) - { - pkgBytes = await File.ReadAllBytesAsync(tictactoePkg); - } - else - { - // Fallback: build staging directory - var stagingDir = Path.Combine(tempDir, "staging"); - Directory.CreateDirectory(stagingDir); - File.WriteAllText(Path.Combine(stagingDir, "plugin.json"), @"{""id"":""com.frypdf.plugin.tictactoe"",""name"":""Tic-Tac-Toe"",""version"":""1.0.0"",""entryPoint"":""TicTacToePlugin.dll""}"); - var tttDll = Path.GetFullPath(Path.Combine(AppContext.BaseDirectory, "../../../../../docs/examples/TicTacToePlugin/bin/Release/net10.0/TicTacToePlugin.dll")); - if (File.Exists(tttDll)) - { - File.Copy(tttDll, Path.Combine(stagingDir, "TicTacToePlugin.dll"), true); - } - var mockPkgPath = Path.Combine(tempDir, "TicTacToe.fryplugin"); - System.IO.Compression.ZipFile.CreateFromDirectory(stagingDir, mockPkgPath); - pkgBytes = await File.ReadAllBytesAsync(mockPkgPath); - } - - // Mock HttpMessageHandler returning mock catalog and real package - var mockHandler = new MockHttpMessageHandler(pkgBytes); - using var httpClient = new HttpClient(mockHandler) { Timeout = TimeSpan.FromSeconds(5) }; - - var sp = CreateTestServices(testDir: tempDir, httpClient: httpClient, registryBaseUrl: "https://mock.frypdf.dev/plugins"); - var marketplace = sp.GetRequiredService(); - var host = sp.GetRequiredService(); - - // Fetch catalog - var remoteItems = await marketplace.FetchRemoteCatalogAsync(forceRefresh: true); - Assert.Contains(remoteItems, i => i.Id == "com.frypdf.plugin.tictactoe"); - var tttItem = remoteItems.First(i => i.Id == "com.frypdf.plugin.tictactoe"); - Assert.Equal("com.frypdf.plugin.tictactoe", tttItem.Id); - - // Install TicTacToe plugin - string lastStatus = ""; - bool installed = await marketplace.InstallPluginAsync("com.frypdf.plugin.tictactoe", statusCallback: s => lastStatus = s); - Assert.True(installed, $"Install failed with status: {lastStatus}"); - Assert.True(marketplace.IsPluginInstalled("com.frypdf.plugin.tictactoe")); - - // Uninstall - bool uninstalled = await marketplace.UninstallPluginAsync("com.frypdf.plugin.tictactoe"); - Assert.True(uninstalled); - Assert.False(marketplace.IsPluginInstalled("com.frypdf.plugin.tictactoe")); - } - finally - { - try { Directory.Delete(tempDir, recursive: true); } catch { } - } - } - - [Fact] - public async Task InstallPluginAsync_DownloadsRealPackageFromGitHubCdn_AndMountsSuccessfully() - { - var tempDir = Path.Combine(AppContext.BaseDirectory, $"frypdf_live_cdn_test_{Guid.NewGuid():N}"); - Directory.CreateDirectory(tempDir); - - try - { - var sp = CreateTestServices(testDir: tempDir); - var marketplace = sp.GetRequiredService(); - var host = sp.GetRequiredService(); - var overlayReg = sp.GetRequiredService(); - - // Fetch remote catalog from live GitHub CDN - var catalog = await marketplace.FetchRemoteCatalogAsync(); - var tttItem = catalog.FirstOrDefault(i => i.Id == "com.frypdf.plugin.tictactoe"); - if (tttItem != null) - { - // Install from real CDN - bool installed = await marketplace.InstallPluginAsync("com.frypdf.plugin.tictactoe"); - Assert.True(installed); - Assert.True(marketplace.IsPluginInstalled("com.frypdf.plugin.tictactoe")); - Assert.True(host.IsPluginActive("com.frypdf.plugin.tictactoe")); - - // Verify overlay opened - Assert.True(overlayReg.IsOverlayVisible("com.frypdf.plugin.tictactoe")); - - // Clean uninstall - bool uninstalled = await marketplace.UninstallPluginAsync("com.frypdf.plugin.tictactoe"); - Assert.True(uninstalled); - Assert.False(marketplace.IsPluginInstalled("com.frypdf.plugin.tictactoe")); - Assert.False(host.IsPluginActive("com.frypdf.plugin.tictactoe")); - } - } - finally - { - try { Directory.Delete(tempDir, recursive: true); } catch { } - } - } - - [Fact] - public async Task PluginsManagerViewModel_Search_RanksTicTacToeFirst_WhenSearchingTic() - { - var sp = CreateTestServices(); - var marketplace = sp.GetRequiredService(); - var host = sp.GetRequiredService(); - - var vm = new PdfEditorApp.ViewModels.PluginsManagerViewModel(host, marketplace); - await vm.LoadAllDataAsync(); - - vm.SelectedTab = PdfEditorApp.ViewModels.PluginsManagerTab.Marketplace; - vm.SearchQuery = "tic"; - - Assert.NotEmpty(vm.FilteredMarketplacePlugins); - // Tic-Tac-Toe should be ranked at index 0 because its name starts with "tic" - Assert.Equal("com.frypdf.plugin.tictactoe", vm.FilteredMarketplacePlugins[0].Id); - Assert.Equal("Tic-Tac-Toe", vm.FilteredMarketplacePlugins[0].Name); - } - - private class MockHttpMessageHandler : HttpMessageHandler - { - private readonly byte[] _pkgBytes; - - public MockHttpMessageHandler(byte[] pkgBytes) - { - _pkgBytes = pkgBytes; - } - - protected override Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) - { - var uri = request.RequestUri?.ToString() ?? string.Empty; - - if (uri.EndsWith("catalog.json", StringComparison.OrdinalIgnoreCase)) - { - var catalogJson = @"[ - { - ""id"": ""com.frypdf.plugin.tictactoe"", - ""name"": ""Tic-Tac-Toe"", - ""publisher"": ""Code Fry Dev"", - ""version"": ""1.0.0"", - ""category"": ""UI & Extensions"", - ""description"": ""Interactive floating Tic-Tac-Toe mini-game with local 2-Player mode and intelligent AI opponent."", - ""downloadUrl"": ""https://mock.frypdf.dev/plugins/TicTacToe.fryplugin"", - ""formattedSize"": ""51 KB"" - } -]"; - return Task.FromResult(new HttpResponseMessage(HttpStatusCode.OK) - { - Content = new StringContent(catalogJson, System.Text.Encoding.UTF8, "application/json") - }); - } - - if (uri.EndsWith(".fryplugin", StringComparison.OrdinalIgnoreCase)) - { - return Task.FromResult(new HttpResponseMessage(HttpStatusCode.OK) - { - Content = new ByteArrayContent(_pkgBytes) - }); - } - - return Task.FromResult(new HttpResponseMessage(HttpStatusCode.NotFound)); - } - } -} diff --git a/tests/PdfEditorApp.Tests/RichTextEngineTests.cs b/tests/PdfEditorApp.Tests/RichTextEngineTests.cs deleted file mode 100644 index 4d503b8..0000000 --- a/tests/PdfEditorApp.Tests/RichTextEngineTests.cs +++ /dev/null @@ -1,459 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using Xunit; -using PdfEditorApp.Core.Analysis; -using PdfEditorApp.Core.Data; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; -using PdfEditorApp.Models; -using PdfEditorApp.Services; -using PdfEditorApp.Services.Typography; -using PdfEditorApp.ViewModels.ElementViewModels; - -namespace PdfEditorApp.Tests; - -public class RichTextEngineTests -{ - [Fact] - public void PdfTextSpan_Clone_CreatesDeepCopy() - { - var original = new PdfTextSpan - { - Text = "Sample Run", - FontFamily = "Roboto", - FontSize = 18.5, - IsBold = true, - IsItalic = true, - IsUnderline = true, - IsStrikethrough = false, - TextColorHex = "#0F6CBD", - HighlightColorHex = "#FFEB3B", - Script = TextScriptMode.Superscript, - LinkUrl = "https://example.com" - }; - - var clone = original.Clone(); - - Assert.NotSame(original, clone); - Assert.Equal(original.Text, clone.Text); - Assert.Equal(original.FontFamily, clone.FontFamily); - Assert.Equal(original.FontSize, clone.FontSize); - Assert.Equal(original.IsBold, clone.IsBold); - Assert.Equal(original.IsItalic, clone.IsItalic); - Assert.Equal(original.IsUnderline, clone.IsUnderline); - Assert.Equal(original.IsStrikethrough, clone.IsStrikethrough); - Assert.Equal(original.TextColorHex, clone.TextColorHex); - Assert.Equal(original.HighlightColorHex, clone.HighlightColorHex); - Assert.Equal(original.Script, clone.Script); - Assert.Equal(original.LinkUrl, clone.LinkUrl); - } - - [Fact] - public void PdfTextElement_WithSpans_ClonesDeeplyAndSynchronizes() - { - var element = new PdfTextElement - { - Text = "Fallback Plain", - FontFamily = "Arial", - FontSize = 14, - Spans = new List - { - new() { Text = "Hello ", IsBold = true }, - new() { Text = "World", TextColorHex = "#DC2626", Script = TextScriptMode.Superscript } - } - }; - - element.SynchronizePlainTextFromSpans(); - Assert.Equal("Hello World", element.Text); - - var clone = (PdfTextElement)element.Clone(); - Assert.NotSame(element, clone); - Assert.NotNull(clone.Spans); - Assert.Equal(2, clone.Spans.Count); - Assert.NotSame(element.Spans[0], clone.Spans[0]); - Assert.Equal("Hello ", clone.Spans[0].Text); - Assert.True(clone.Spans[0].IsBold); - Assert.Equal("World", clone.Spans[1].Text); - Assert.Equal("#DC2626", clone.Spans[1].TextColorHex); - Assert.Equal(TextScriptMode.Superscript, clone.Spans[1].Script); - } - - [Fact] - public void PdfTextElement_BackwardCompatibility_NullSpansWorksAsPlainText() - { - var element = new PdfTextElement - { - Text = "Legacy plain text", - FontFamily = "Segoe UI", - FontSize = 12, - Spans = null - }; - - Assert.Equal("Legacy plain text", element.GetEffectivePlainText()); - element.SynchronizePlainTextFromSpans(); - Assert.Equal("Legacy plain text", element.Text); - - var clone = (PdfTextElement)element.Clone(); - Assert.Null(clone.Spans); - Assert.Equal("Legacy plain text", clone.Text); - } - - [Fact] - public void RichTextHelper_ParsesMarkdownTokensAccurately() - { - string input = "Start **Bold Text** then *Italic Text* and ~~Strikethrough~~ plus Underline end."; - var spans = RichTextHelper.ParseMarkdownToSpans(input); - - Assert.NotNull(spans); - Assert.True(spans.Count >= 5); - - Assert.Equal("Start ", spans[0].Text); - Assert.Equal("Bold Text", spans[1].Text); - Assert.True(spans[1].IsBold); - - Assert.Equal(" then ", spans[2].Text); - Assert.Equal("Italic Text", spans[3].Text); - Assert.True(spans[3].IsItalic); - - var strikeSpan = spans.FirstOrDefault(s => s.Text == "Strikethrough"); - Assert.NotNull(strikeSpan); - Assert.True(strikeSpan.IsStrikethrough); - - var underlineSpan = spans.FirstOrDefault(s => s.Text == "Underline"); - Assert.NotNull(underlineSpan); - Assert.True(underlineSpan.IsUnderline); - } - - [Fact] - public void RichTextHelper_ParsesSubscriptAndSuperscript() - { - string input = "Formula: H~2~O and Exponent: x^2^"; - var spans = RichTextHelper.ParseMarkdownToSpans(input); - - Assert.NotNull(spans); - var subSpan = spans.FirstOrDefault(s => s.Text == "2" && s.Script == TextScriptMode.Subscript); - Assert.NotNull(subSpan); - - var superSpan = spans.FirstOrDefault(s => s.Text == "2" && s.Script == TextScriptMode.Superscript); - Assert.NotNull(superSpan); - } - - [Fact] - public void RichTextHelper_ParsesColorTagsAndHyperlinks() - { - string input = "Here is Blue Text and [Click Here](https://example.com)"; - var spans = RichTextHelper.ParseMarkdownToSpans(input); - - Assert.NotNull(spans); - var blueSpan = spans.FirstOrDefault(s => s.Text == "Blue Text"); - Assert.NotNull(blueSpan); - Assert.Equal("#0F6CBD", blueSpan.TextColorHex); - - var linkSpan = spans.FirstOrDefault(s => s.Text == "Click Here"); - Assert.NotNull(linkSpan); - Assert.Equal("https://example.com", linkSpan.LinkUrl); - Assert.True(linkSpan.IsUnderline); - } - - [Fact] - public void RichTextHelper_SpansToMarkdown_ReconstructsMarkupLosslessly() - { - var spans = new List - { - new() { Text = "Normal " }, - new() { Text = "Bold", IsBold = true }, - new() { Text = " and " }, - new() { Text = "Italic", IsItalic = true }, - new() { Text = " and " }, - new() { Text = "Super", Script = TextScriptMode.Superscript } - }; - - string markdown = RichTextHelper.SpansToMarkdown(spans); - Assert.Contains("**Bold**", markdown); - Assert.Contains("*Italic*", markdown); - Assert.Contains("^Super^", markdown); - } - - [Fact] - public void TextElementViewModel_SetMarkdownText_UpdatesSpansAndPlainText() - { - var vm = new TextElementViewModel(); - vm.SetMarkdownText("Total is **$100.00** PAID"); - - Assert.NotNull(vm.Spans); - Assert.True(vm.Spans.Count >= 3); - Assert.Equal("Total is $100.00 PAID", vm.Text); - - var model = (PdfTextElement)vm.ToModel(); - Assert.NotNull(model.Spans); - Assert.Equal(vm.Spans.Count, model.Spans.Count); - - var reloadedVm = new TextElementViewModel(model); - Assert.NotNull(reloadedVm.Spans); - Assert.Equal(vm.Spans.Count, reloadedVm.Spans.Count); - Assert.Equal("Total is $100.00 PAID", reloadedVm.Text); - } - - [Fact] - public void DataMergeEngine_HydratesPlaceholdersWithinSpans() - { - var doc = new PdfDocumentModel(); - var page = new PdfPageModel(); - doc.Pages.Add(page); - - var textElement = new PdfTextElement - { - X = 50, - Y = 50, - Width = 300, - Height = 40, - Spans = new List - { - new() { Text = "Dear " }, - new() { Text = "{{CustomerName}}", IsBold = true, TextColorHex = "#0F6CBD" }, - new() { Text = ", your balance is " }, - new() { Text = "{{Amount}}", IsBold = true } - } - }; - textElement.SynchronizePlainTextFromSpans(); - page.Elements.Add(textElement); - - var engine = new DataMergeEngine(); - var record = new Dictionary - { - { "CustomerName", "Jane Doe" }, - { "Amount", "$450.00" } - }; - - var hydratedDoc = engine.HydrateDocument(doc, record); - var hydratedText = hydratedDoc.Pages[0].Elements.OfType().First(); - - Assert.NotNull(hydratedText.Spans); - Assert.Equal(4, hydratedText.Spans.Count); - Assert.Equal("Jane Doe", hydratedText.Spans[1].Text); - Assert.True(hydratedText.Spans[1].IsBold); - Assert.Equal("#0F6CBD", hydratedText.Spans[1].TextColorHex); - Assert.Equal("$450.00", hydratedText.Spans[3].Text); - Assert.Equal("Dear Jane Doe, your balance is $450.00", hydratedText.Text); - } - - [Fact] - public void PdfExportService_ExportsMultiSpanTextElement_GeneratesValidPdfBytes() - { - var doc = new PdfDocumentModel(); - var page = new PdfPageModel { Width = 595, Height = 842 }; - doc.Pages.Add(page); - - var textElement = new PdfTextElement - { - X = 50, - Y = 50, - Width = 400, - Height = 60, - FontFamily = "Arial", - FontSize = 14, - Spans = new List - { - new() { Text = "Invoice Number: " }, - new() { Text = "INV-2026-001", IsBold = true, TextColorHex = "#0F6CBD" }, - new() { Text = " (Status: " }, - new() { Text = "APPROVED", IsBold = true, TextColorHex = "#16A34A" }, - new() { Text = ", Formula: H" }, - new() { Text = "2", Script = TextScriptMode.Subscript }, - new() { Text = "O)" } - } - }; - textElement.SynchronizePlainTextFromSpans(); - page.Elements.Add(textElement); - - var exporter = new PdfExportService(); - byte[] pdfBytes = exporter.GeneratePdfBytes(doc); - - Assert.NotNull(pdfBytes); - Assert.True(pdfBytes.Length > 500); - - // Verify standard PDF header magic bytes %PDF- - string header = System.Text.Encoding.ASCII.GetString(pdfBytes.Take(5).ToArray()); - Assert.Equal("%PDF-", header); - } - - [Fact] - public void TextLayoutEngine_GenerateSvgMarkup_EmitsTspanElementsForSpans() - { - var element = new PdfTextElement - { - X = 10, - Y = 10, - Width = 250, - Height = 50, - FontFamily = "Segoe UI", - FontSize = 14, - Spans = new List - { - new() { Text = "Prefix ", IsBold = false }, - new() { Text = "BoldRed", IsBold = true, TextColorHex = "#DC2626" }, - new() { Text = "2", Script = TextScriptMode.Superscript } - } - }; - element.SynchronizePlainTextFromSpans(); - - string svg = TextLayoutEngine.GenerateSvgMarkup(element); - Assert.NotNull(svg); - Assert.Contains("().ToList(); - Assert.NotEmpty(textElements); - - // Verify that multi-span elements exist with rich formatting - var multiSpanElements = textElements.Where(t => t.Spans != null && t.Spans.Count > 1).ToList(); - Assert.True(multiSpanElements.Count >= 5); - - // Verify subscripts and superscripts in the specimen - bool hasSubscript = multiSpanElements.Any(t => t.Spans!.Any(s => s.Script == TextScriptMode.Subscript)); - bool hasSuperscript = multiSpanElements.Any(t => t.Spans!.Any(s => s.Script == TextScriptMode.Superscript)); - bool hasColors = multiSpanElements.Any(t => t.Spans!.Any(s => !string.IsNullOrEmpty(s.TextColorHex))); - bool hasLinks = multiSpanElements.Any(t => t.Spans!.Any(s => !string.IsNullOrEmpty(s.LinkUrl))); - - Assert.True(hasSubscript); - Assert.True(hasSuperscript); - Assert.True(hasColors); - Assert.True(hasLinks); - - // Verify QuestPDF export - var exporter = new PdfExportService(); - byte[] pdfBytes = exporter.GeneratePdfBytes(doc); - Assert.NotNull(pdfBytes); - Assert.True(pdfBytes.Length > 1000); - } - - [Fact] - public void TemplateService_CreatesOcrAnalysisReportTemplate_ValidModelAndSpans() - { - var templateService = new TemplateService(); - var doc = templateService.CreateOcrAnalysisReportTemplate(); - - Assert.NotNull(doc); - Assert.Single(doc.Pages); - var page = doc.Pages[0]; - - // Verify table, QR code, and text elements - var tables = page.Elements.OfType().ToList(); - var qrCodes = page.Elements.OfType().ToList(); - var textElements = page.Elements.OfType().ToList(); - - Assert.Single(tables); - Assert.Single(qrCodes); - Assert.NotEmpty(textElements); - - // Verify multi-span OCR annotations - var multiSpanElements = textElements.Where(t => t.Spans != null && t.Spans.Count > 1).ToList(); - Assert.True(multiSpanElements.Count >= 4); - - // Verify QuestPDF export - var exporter = new PdfExportService(); - byte[] pdfBytes = exporter.GeneratePdfBytes(doc); - Assert.NotNull(pdfBytes); - Assert.True(pdfBytes.Length > 1000); - } - - [Fact] - public void ToggleInlineFormatting_Bold_WrapsSelectedText() - { - string fullText = "normative period of rec\nmacro environment,\nd top-line revenue"; - int start = 24; - int length = 18; // "macro environment," - - var result = RichTextHelper.ToggleInlineFormatting(fullText, start, length, InlineFormatType.Bold); - - Assert.Equal("normative period of rec\n**macro environment,**\nd top-line revenue", result.NewText); - Assert.Equal(24, result.NewSelectionStart); - Assert.Equal(22, result.NewSelectionLength); - } - - [Fact] - public void ToggleInlineFormatting_Bold_TogglesOffWhenAlreadyWrapped() - { - string fullText = "normative period of rec\n**macro environment,**\nd top-line revenue"; - int start = 24; - int length = 22; // "**macro environment,**" - - var result = RichTextHelper.ToggleInlineFormatting(fullText, start, length, InlineFormatType.Bold); - - Assert.Equal("normative period of rec\nmacro environment,\nd top-line revenue", result.NewText); - Assert.Equal(24, result.NewSelectionStart); - Assert.Equal(18, result.NewSelectionLength); - } - - [Fact] - public void ToggleInlineFormatting_ItalicAndUnderline_WrapsAndUnwraps() - { - string text = "Hello World"; - // Italic on "World" - var italicResult = RichTextHelper.ToggleInlineFormatting(text, 6, 5, InlineFormatType.Italic); - Assert.Equal("Hello *World*", italicResult.NewText); - - // Unwrap Italic - var unitalicResult = RichTextHelper.ToggleInlineFormatting(italicResult.NewText, italicResult.NewSelectionStart, italicResult.NewSelectionLength, InlineFormatType.Italic); - Assert.Equal("Hello World", unitalicResult.NewText); - - // Underline on "World" - var underlineResult = RichTextHelper.ToggleInlineFormatting(text, 6, 5, InlineFormatType.Underline); - Assert.Equal("Hello World", underlineResult.NewText); - - // Unwrap Underline - var unwrapUnderline = RichTextHelper.ToggleInlineFormatting(underlineResult.NewText, underlineResult.NewSelectionStart, underlineResult.NewSelectionLength, InlineFormatType.Underline); - Assert.Equal("Hello World", unwrapUnderline.NewText); - } - - [Fact] - public void ToggleInlineFormatting_Color_WrapsAndUpdatesHex() - { - string text = "Hello World"; - var colorResult = RichTextHelper.ToggleInlineFormatting(text, 6, 5, InlineFormatType.Color, "#0F6CBD"); - Assert.Equal("Hello World", colorResult.NewText); - - // Change color to #DC2626 - var changeColor = RichTextHelper.ToggleInlineFormatting(colorResult.NewText, colorResult.NewSelectionStart, colorResult.NewSelectionLength, InlineFormatType.Color, "#DC2626"); - Assert.Equal("Hello World", changeColor.NewText); - } - - [Fact] - public void ToggleInlineFormatting_HandlesLeadingAndTrailingWhitespace() - { - string text = "Hello World Today"; - // Selected " World " with whitespace around it - var result = RichTextHelper.ToggleInlineFormatting(text, 5, 7, InlineFormatType.Bold); - Assert.Equal("Hello **World** Today", result.NewText); - } - - [Fact] - public void RichTextHelper_ParsesAndSerializesSizeAndFontTags() - { - string input = "Start Big Text and Modern Font end."; - var spans = RichTextHelper.ParseMarkdownToSpans(input); - - Assert.NotNull(spans); - var sizeSpan = spans.FirstOrDefault(s => s.Text == "Big Text"); - Assert.NotNull(sizeSpan); - Assert.Equal(18, sizeSpan.FontSize); - - var fontSpan = spans.FirstOrDefault(s => s.Text == "Modern Font"); - Assert.NotNull(fontSpan); - Assert.Equal("Poppins", fontSpan.FontFamily); - } -} diff --git a/tests/PdfEditorApp.Tests/SignatureAndFormsServiceTests.cs b/tests/PdfEditorApp.Tests/SignatureAndFormsServiceTests.cs deleted file mode 100644 index 7225457..0000000 --- a/tests/PdfEditorApp.Tests/SignatureAndFormsServiceTests.cs +++ /dev/null @@ -1,112 +0,0 @@ -using System; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; -using PdfEditorApp.Models; -using PdfEditorApp.Services; -using Xunit; - -namespace PdfEditorApp.Tests; - -public class SignatureAndFormsServiceTests -{ - [Fact] - public void SignatureService_ComputeDocumentSha256_ProducesDeterministicHash() - { - // Arrange - var service = new SignatureService(); - var doc1 = new PdfDocumentModel - { - Title = "Contract_Final.pdf", - Author = "Enterprise Signer", - Subject = "Service Agreement" - }; - var page1 = new PdfPageModel { PageNumber = 1 }; - page1.Elements.Add(new PdfTextElement { Text = "Terms & Conditions", X = 50, Y = 50 }); - doc1.Pages.Add(page1); - - var doc2 = new PdfDocumentModel - { - Title = "Contract_Final.pdf", - Author = "Enterprise Signer", - Subject = "Service Agreement" - }; - var page2 = new PdfPageModel { PageNumber = 1 }; - page2.Elements.Add(new PdfTextElement { Text = "Terms & Conditions", X = 50, Y = 50 }); - doc2.Pages.Add(page2); - - // Act - string hash1 = service.ComputeDocumentSha256(doc1); - string hash2 = service.ComputeDocumentSha256(doc2); - - // Assert - Assert.Equal(64, hash1.Length); - Assert.Equal(hash1, hash2); - - // Modify doc2 - doc2.Title = "Contract_Tampered.pdf"; - string hash3 = service.ComputeDocumentSha256(doc2); - Assert.NotEqual(hash1, hash3); - } - - [Fact] - public void SignatureService_CreateCryptographicSignatureSeal_PopulatesMetadataAndDigest() - { - // Arrange - var service = new SignatureService(); - string dummyDigest = "E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855"; - - // Act - var seal = service.CreateCryptographicSignatureSeal("Dr. Evelyn Reed", "Global Medical Corp", "Clinical Approval", dummyDigest, 120, 250); - - // Assert - Assert.NotNull(seal); - Assert.Equal(120, seal.X); - Assert.Equal(250, seal.Y); - Assert.Equal(320, seal.Width); - Assert.Equal(100, seal.Height); - Assert.Contains("Dr. Evelyn Reed", seal.Label); - Assert.Contains("Global Medical Corp", seal.Label); - Assert.Contains("Clinical Approval", seal.Label); - Assert.Contains("SHA256:", seal.Label); - Assert.Equal("#16A34A", seal.StrokeColorHex); // Emerald verification border - } - - [Fact] - public void SignatureService_CreateCursiveSignatureElement_AppliesFontAndStyleCorrectly() - { - // Arrange - var service = new SignatureService(); - - // Act - var sigExecutive = service.CreateCursiveSignatureElement("Alexander Hamilton", SignatureStyle.CursiveElegance, 50, 100); - var sigScript = service.CreateCursiveSignatureElement("Alexander Hamilton", SignatureStyle.ClassicScript, 50, 100); - - // Assert - Assert.Equal("Georgia", sigExecutive.FontFamily); - Assert.True(sigExecutive.IsItalic); - Assert.Equal("Alexander Hamilton", sigExecutive.Text); - - Assert.Equal("Times New Roman", sigScript.FontFamily); - Assert.Equal("#0F6CBD", sigScript.TextColorHex); - } - - [Fact] - public void SignatureService_CreateFormFieldElement_GeneratesProperFieldTypes() - { - // Arrange - var service = new SignatureService(); - - // Act - var txtField = service.CreateFormFieldElement(FormFieldType.Text, "txt_customer_name", 50, 100, 200, 30); - var chkField = service.CreateFormFieldElement(FormFieldType.Checkbox, "chk_terms_agreed", 50, 150, 24, 24); - - // Assert - Assert.Equal(FormFieldType.Text, txtField.FieldType); - Assert.Equal("txt_customer_name", txtField.FieldName); - Assert.Equal(200, txtField.Width); - - Assert.Equal(FormFieldType.Checkbox, chkField.FieldType); - Assert.Equal("chk_terms_agreed", chkField.FieldName); - Assert.Equal("false", chkField.DefaultValue); - } -} diff --git a/tests/PdfEditorApp.Tests/SmartPlacementTests.cs b/tests/PdfEditorApp.Tests/SmartPlacementTests.cs deleted file mode 100644 index f25c5c7..0000000 --- a/tests/PdfEditorApp.Tests/SmartPlacementTests.cs +++ /dev/null @@ -1,148 +0,0 @@ -using System; -using System.Linq; -using PdfEditorApp.Services; -using PdfEditorApp.ViewModels; -using PdfEditorApp.ViewModels.ElementViewModels; -using Xunit; - -namespace PdfEditorApp.Tests; - -public class SmartPlacementTests -{ - [Fact] - public void ViewportCenter_Placement_CalculatesAccurateCoordinates() - { - var service = new SmartPlacementService(); - var page = new PageViewModel { Width = 800, Height = 1131 }; - - // User is scrolled down looking at center (400, 700) - service.UpdateViewport(400, 700, 800, 600); - - // Add 400x80 text box - var (x, y) = service.GetPlacementPosition(page, 400, 80); - - // Expected centered at (400 - 200 = 200, 700 - 40 = 660) - Assert.Equal(200.0, x); - Assert.Equal(660.0, y); - } - - [Fact] - public void ViewportCenter_Clamping_SafelyKeepsElementsInsidePageMargins() - { - var service = new SmartPlacementService(); - var page = new PageViewModel { Width = 800, Height = 1131 }; - - // Viewport is scrolled way past the bottom right (1000, 1500) - service.UpdateViewport(1000, 1500, 800, 600); - - var (x, y) = service.GetPlacementPosition(page, 300, 100); - - // Max X = 800 - 300 - 28 = 472 - // Max Y = 1131 - 100 - 28 = 1003 - Assert.Equal(472.0, x); - Assert.Equal(1003.0, y); - } - - [Fact] - public void ContextMenu_Placement_PositionsNearClickPointer() - { - var service = new SmartPlacementService(); - var page = new PageViewModel { Width = 800, Height = 1131 }; - - service.UpdateViewport(400, 300, 800, 600); - service.SetContextMenuPointer(350, 480); - - // Context menu placed 200x150 sticky note - var (x, y) = service.GetPlacementPosition(page, 200, 150); - - Assert.Equal(320.0, x); // 350 - 30 - Assert.Equal(470.0, y); // 480 - 10 - - // After placement, context pointer is consumed and returns to viewport center - var (nextX, nextY) = service.GetPlacementPosition(page, 200, 150); - Assert.Equal(300.0, nextX); // Viewport center X (400 - 100) - Assert.Equal(225.0, nextY); // Viewport center Y (300 - 75) - } - - [Fact] - public void ConsecutiveInsertions_ApplyCascadingOffset() - { - var service = new SmartPlacementService(); - var page = new PageViewModel { Width = 800, Height = 1131 }; - - service.UpdateViewport(400, 500, 800, 600); - - var (x1, y1) = service.GetPlacementPosition(page, 100, 100); - var (x2, y2) = service.GetPlacementPosition(page, 100, 100); - var (x3, y3) = service.GetPlacementPosition(page, 100, 100); - - Assert.Equal(350.0, x1); - Assert.Equal(450.0, y1); - - // Second should be offset by 22pt - Assert.Equal(372.0, x2); - Assert.Equal(472.0, y2); - - // Third should be offset by 44pt - Assert.Equal(394.0, x3); - Assert.Equal(494.0, y3); - - // Reset cascade - service.ResetCascade(); - var (x4, y4) = service.GetPlacementPosition(page, 100, 100); - Assert.Equal(350.0, x4); - Assert.Equal(450.0, y4); - } - - [Fact] - public void MainViewModel_AddTextElement_UsesViewportPosition() - { - var mainVm = new MainViewModel(); - Assert.NotNull(mainVm.CurrentPage); - mainVm.CurrentPage.Width = 800; - mainVm.CurrentPage.Height = 1131; - - // Update viewport center to lower half of page - mainVm.SmartPlacement.UpdateViewport(400, 800, 800, 600); - - int initialCount = mainVm.CurrentPage.Elements.Count; - mainVm.AddTextElement(); - - Assert.Equal(initialCount + 1, mainVm.CurrentPage.Elements.Count); - var addedText = mainVm.CurrentPage.Elements.Last() as TextElementViewModel; - Assert.NotNull(addedText); - - // 400x80 text box centered at (400, 800) -> X=200, Y=760 - Assert.Equal(200.0, addedText.X); - Assert.Equal(760.0, addedText.Y); - Assert.Same(addedText, mainVm.CurrentPage.SelectedElement); - } - - [Fact] - public void MainViewModel_PasteAndDuplicate_UsesSmartPlacement() - { - var mainVm = new MainViewModel(); - Assert.NotNull(mainVm.CurrentPage); - - var firstEl = mainVm.CurrentPage.Elements.First(); - mainVm.CurrentPage.SelectElement(firstEl); - - // Duplicate - mainVm.SmartPlacement.UpdateViewport(400, 600, 800, 600); - mainVm.Duplicate(); - - var duplicated = mainVm.CurrentPage.SelectedElement; - Assert.NotNull(duplicated); - Assert.NotSame(firstEl, duplicated); - - // Copy and paste - mainVm.Copy(); - mainVm.SmartPlacement.UpdateViewport(400, 900, 800, 600); - mainVm.Paste(); - - var pasted = mainVm.CurrentPage.SelectedElement; - Assert.NotNull(pasted); - Assert.NotSame(duplicated, pasted); - Assert.True(pasted.Y > 700); // Placed in the scrolled-down viewport - } -} diff --git a/tests/PdfEditorApp.Tests/SnakeMarketplaceIntegrationTests.cs b/tests/PdfEditorApp.Tests/SnakeMarketplaceIntegrationTests.cs deleted file mode 100644 index 87a3564..0000000 --- a/tests/PdfEditorApp.Tests/SnakeMarketplaceIntegrationTests.cs +++ /dev/null @@ -1,147 +0,0 @@ -using System; -using System.Linq; -using System.Threading.Tasks; -using Microsoft.Extensions.DependencyInjection; -using PdfEditorApp.Core.Plugins; -using PdfEditorApp.Core.Plugins.Descriptors; -using PdfEditorApp.Core.Plugins.Marketplace; -using PdfEditorApp.Core.Plugins.Profiles; -using PdfEditorApp.Plugins.Bundles; -using PdfEditorApp.Plugins.Snake; -using PdfEditorApp.Services.Overlays; -using PdfEditorApp.Services.Palette; -using PdfEditorApp.Services.Plugins; -using PdfEditorApp.Services.Ribbon; -using PdfEditorApp.Services.StatusBar; -using Xunit; - -namespace PdfEditorApp.Tests; - -public class SnakeMarketplaceIntegrationTests -{ - private ServiceProvider CreateTestServices(string? testDir = null) - { - var services = new ServiceCollection(); - App.ConfigureServices(services); - if (testDir != null) - { - var tempFile = Path.Combine(testDir, "installed_plugins.json"); - services.AddSingleton(new FileInstalledPluginStore(tempFile)); - services.AddSingleton(sp => - { - var host = sp.GetRequiredService(); - var overlay = sp.GetRequiredService(); - var store = sp.GetRequiredService(); - var pluginsDir = Path.Combine(testDir, "plugins"); - return new PluginMarketplaceService(host, overlay, store, null, null, pluginsDir); - }); - } - return services.BuildServiceProvider(); - } - - [Fact] - public async Task SnakePlugin_IsNotInstalledByDefault_AndInstallsAndUninstallsViaMarketplace() - { - var tempDir = Path.Combine(AppContext.BaseDirectory, $"frypdf_snake_test_{Guid.NewGuid():N}"); - Directory.CreateDirectory(tempDir); - try - { - var sp = CreateTestServices(tempDir); - var host = sp.GetRequiredService(); - var overlayReg = sp.GetRequiredService(); - var commandReg = sp.GetRequiredService(); - var statusReg = sp.GetRequiredService(); - var ribbonReg = sp.GetRequiredService(); - var marketplace = sp.GetRequiredService(); - - // 1. Mount standard profile bundles (does NOT include ShellOverlaysBundle) - var bundles = new IFryPluginBundle[] - { - new ToolsOrganizeBundle(), - new StatusBarBundle(), - new CommandPaletteBundle() - }; - - var profile = new PluginProfile - { - ProfileName = "desktop", - Bundles = bundles.Select(b => b.Id).ToList() - }; - ProfileLoader.ApplyProfile(profile, host, bundles); - await host.StartAsync(); - - // 2. Verify Snake Game is NOT installed or active by default - Assert.False(host.IsPluginActive("frypdf.overlay.snake")); - Assert.False(marketplace.IsPluginInstalled("frypdf.overlay.snake")); - Assert.Null(overlayReg.GetOverlay("frypdf.overlay.snake")); - Assert.False(overlayReg.IsOverlayVisible("frypdf.overlay.snake")); - - // 3. Verify Snake Game and companion overlays are available in the Marketplace catalog - await marketplace.FetchRemoteCatalogAsync(); - var catalog = await marketplace.GetCatalogAsync(); - Assert.True(catalog.Count >= 3); - var snakeItem = catalog.First(c => c.Id == "frypdf.overlay.snake"); - Assert.Equal(MarketplacePluginStatus.Available, snakeItem.Status); - Assert.StartsWith("Retro Arcade Snake Game", snakeItem.Name); - - Assert.Contains(catalog, c => c.Id == "frypdf.overlay.scratchpad"); - Assert.Contains(catalog, c => c.Id == "frypdf.overlay.telemetry"); - - // 4. Install plugin via Marketplace - string lastStatus = ""; - bool installed = await marketplace.InstallPluginAsync("frypdf.overlay.snake", statusCallback: s => lastStatus = s); - Assert.True(installed, $"Install failed: {lastStatus}"); - - // 5. Verify plugin is now active in host and overlay is registered and visible - Assert.True(host.IsPluginActive("frypdf.overlay.snake")); - Assert.True(marketplace.IsPluginInstalled("frypdf.overlay.snake")); - Assert.NotNull(overlayReg.GetOverlay("frypdf.overlay.snake")); - Assert.True(overlayReg.IsOverlayVisible("frypdf.overlay.snake")); - Assert.Single(overlayReg.ActiveOverlays); - - // Verify status in catalog updated to Installed - catalog = await marketplace.GetCatalogAsync(); - Assert.Equal(MarketplacePluginStatus.Installed, catalog.First(c => c.Id == "frypdf.overlay.snake").Status); - - // Verify capabilities registered - Assert.Contains(commandReg.GetAllCommands(), c => c.Id == "cmd.overlay.snake"); - Assert.Contains(statusReg.GetWidgets(StatusBarAlignment.Right), w => w.WidgetId == "frypdf.status.snake"); - Assert.Contains(ribbonReg.GetActionsForTab("view"), a => a.Id == "frypdf.ribbon.action.snake"); - - // 6. Test Persistence & Auto-Restore on simulated App Restart - var store = sp.GetRequiredService(); - Assert.True(store.IsInstalled("frypdf.overlay.snake")); - - var newHost = new PluginHost(new FryPluginContext(sp)); - var newMarketplace = new PluginMarketplaceService(newHost, overlayReg, store, null, null, Path.Combine(tempDir, "plugins")); - Assert.True(newMarketplace.IsPluginInstalled("frypdf.overlay.snake")); - Assert.True(newHost.IsPluginActive("frypdf.overlay.snake")); - - // 7. Uninstall plugin via Marketplace - bool uninstalled = await marketplace.UninstallPluginAsync("frypdf.overlay.snake"); - Assert.True(uninstalled); - Assert.False(store.IsInstalled("frypdf.overlay.snake")); - - // 8. Verify plugin deactivated and cleanly unmounted - Assert.False(host.IsPluginActive("frypdf.overlay.snake")); - Assert.False(marketplace.IsPluginInstalled("frypdf.overlay.snake")); - Assert.False(overlayReg.IsOverlayVisible("frypdf.overlay.snake")); - Assert.Empty(overlayReg.ActiveOverlays); - - // Verify status in catalog returned to Available - catalog = await marketplace.GetCatalogAsync(); - Assert.Equal(MarketplacePluginStatus.Available, catalog.First(c => c.Id == "frypdf.overlay.snake").Status); - - // Verify effects rolled back - Assert.DoesNotContain(commandReg.GetAllCommands(), c => c.Id == "cmd.overlay.snake"); - Assert.DoesNotContain(statusReg.GetWidgets(StatusBarAlignment.Right), w => w.WidgetId == "frypdf.status.snake"); - Assert.DoesNotContain(ribbonReg.GetActionsForTab("view"), a => a.Id == "frypdf.ribbon.action.snake"); - - await host.StopAsync(); - } - finally - { - try { Directory.Delete(tempDir, recursive: true); } catch { } - } - } -} diff --git a/tests/PdfEditorApp.Tests/SnakeOverlayPluginTests.cs b/tests/PdfEditorApp.Tests/SnakeOverlayPluginTests.cs deleted file mode 100644 index b03700f..0000000 --- a/tests/PdfEditorApp.Tests/SnakeOverlayPluginTests.cs +++ /dev/null @@ -1,357 +0,0 @@ -using System; -using System.IO; -using System.Linq; -using System.Reflection; -using System.Threading.Tasks; -using Microsoft.Extensions.DependencyInjection; -using PdfEditorApp.Core.Plugins; -using PdfEditorApp.Core.Plugins.Descriptors; -using PdfEditorApp.Core.Plugins.Profiles; -using PdfEditorApp.Plugins.Bundles; -using PdfEditorApp.Plugins.Snake; -using PdfEditorApp.Services.Overlays; -using PdfEditorApp.Services.Palette; -using PdfEditorApp.Services.Ribbon; -using PdfEditorApp.Services.StatusBar; -using PdfEditorApp.ViewModels; -using Xunit; - -namespace PdfEditorApp.Tests; - -public class SnakeOverlayPluginTests -{ - [Fact] - public void OverlayRegistry_Registers_Shows_Toggles_And_Hides_Overlay() - { - var services = new ServiceCollection().BuildServiceProvider(); - var registry = new OverlayRegistry(services); - - bool registryChangedFired = false; - registry.RegistryChanged += () => registryChangedFired = true; - - var desc = new OverlayDescriptor - { - Id = "test.overlay.custom", - Title = "Custom Overlay", - Slot = "shell.overlay", - DefaultWidth = 300, - DefaultHeight = 400, - ViewFactory = _ => "MockView" - }; - - using var unreg = registry.RegisterOverlay(desc); - Assert.True(registryChangedFired); - Assert.NotNull(registry.GetOverlay("test.overlay.custom")); - Assert.Single(registry.GetAllOverlays()); - - // Initially not visible - Assert.False(registry.IsOverlayVisible("test.overlay.custom")); - - // Show - registry.ShowOverlay("test.overlay.custom"); - Assert.True(registry.IsOverlayVisible("test.overlay.custom")); - Assert.Single(registry.ActiveOverlays); - Assert.Equal("Custom Overlay", registry.ActiveOverlays[0].Title); - - // Toggle (hides) - registry.ToggleOverlay("test.overlay.custom"); - Assert.False(registry.IsOverlayVisible("test.overlay.custom")); - Assert.Empty(registry.ActiveOverlays); - - // Toggle (shows again) - registry.ToggleOverlay("test.overlay.custom"); - Assert.True(registry.IsOverlayVisible("test.overlay.custom")); - Assert.Single(registry.ActiveOverlays); - - // Hide - registry.HideOverlay("test.overlay.custom"); - Assert.False(registry.IsOverlayVisible("test.overlay.custom")); - Assert.Empty(registry.ActiveOverlays); - } - - [Fact] - public void SnakeGameViewModel_Initializes_With_Three_Segments() - { - using var vm = new SnakeGameViewModel(); - - Assert.Equal(3, vm.SnakeBody.Count); - Assert.Equal(SnakeGameState.Ready, vm.State); - Assert.Equal(0, vm.Score); - Assert.True(vm.SnakeBody.First!.Value.X > 0); - Assert.True(vm.SnakeBody.First!.Value.Y > 0); - } - - [Fact] - public void SnakeGameViewModel_Tick_MovesSnake_In_Current_Direction() - { - using var vm = new SnakeGameViewModel(); - vm.StartGame(); - - var initialHead = vm.SnakeBody.First!.Value; - - // Trigger private tick via reflection to test deterministic step - var tickMethod = typeof(SnakeGameViewModel).GetMethod("OnGameTick", BindingFlags.NonPublic | BindingFlags.Instance); - Assert.NotNull(tickMethod); - - tickMethod.Invoke(vm, new object?[] { null, EventArgs.Empty }); - - var newHead = vm.SnakeBody.First!.Value; - // Default direction is Right (+1 on X) - Assert.Equal(initialHead.X + 1, newHead.X); - Assert.Equal(initialHead.Y, newHead.Y); - Assert.Equal(3, vm.SnakeBody.Count); - } - - [Fact] - public void SnakeGameViewModel_ChangeDirection_Prevents_180Degree_Turn() - { - using var vm = new SnakeGameViewModel(); - vm.StartGame(); - - // Currently Right. Attempting Left should be ignored. - vm.ChangeDirection(SnakeDirection.Left); - - var tickMethod = typeof(SnakeGameViewModel).GetMethod("OnGameTick", BindingFlags.NonPublic | BindingFlags.Instance); - Assert.NotNull(tickMethod); - tickMethod.Invoke(vm, new object?[] { null, EventArgs.Empty }); - - // Snake still went right - var head = vm.SnakeBody.First!.Value; - Assert.Equal(SnakeGameViewModel.GridWidth / 2 + 1, head.X); - } - - [Fact] - public void SnakeGameViewModel_Eating_Food_Increments_Score_And_Length() - { - using var vm = new SnakeGameViewModel(); - vm.StartGame(); - - var head = vm.SnakeBody.First!.Value; - - // Place food directly in front of snake (head.X + 1, head.Y) - var foodProp = typeof(SnakeGameViewModel).GetProperty("Food"); - Assert.NotNull(foodProp); - var targetFood = new GridPoint(head.X + 1, head.Y); - foodProp.SetValue(vm, targetFood); - - var tickMethod = typeof(SnakeGameViewModel).GetMethod("OnGameTick", BindingFlags.NonPublic | BindingFlags.Instance); - Assert.NotNull(tickMethod); - tickMethod.Invoke(vm, new object?[] { null, EventArgs.Empty }); - - Assert.Equal(10, vm.Score); - Assert.Equal(4, vm.SnakeBody.Count); // Length increased from 3 to 4 - Assert.Equal(targetFood, vm.SnakeBody.First!.Value); - } - - [Fact] - public void SnakeGameViewModel_WallCollision_TriggersGameOver_When_Enabled() - { - using var vm = new SnakeGameViewModel - { - WallCollision = true - }; - vm.StartGame(); - - // Place head at right edge - vm.SnakeBody.Clear(); - vm.SnakeBody.AddFirst(new GridPoint(SnakeGameViewModel.GridWidth - 1, 5)); - vm.SnakeBody.AddLast(new GridPoint(SnakeGameViewModel.GridWidth - 2, 5)); - - var tickMethod = typeof(SnakeGameViewModel).GetMethod("OnGameTick", BindingFlags.NonPublic | BindingFlags.Instance); - Assert.NotNull(tickMethod); - - // Moving right from edge hits wall - tickMethod.Invoke(vm, new object?[] { null, EventArgs.Empty }); - - Assert.Equal(SnakeGameState.GameOver, vm.State); - Assert.Contains("wall", vm.StatusText, StringComparison.OrdinalIgnoreCase); - } - - [Fact] - public void SnakeGameViewModel_WallWrap_WrapsAround_When_Collision_Disabled() - { - using var vm = new SnakeGameViewModel - { - WallCollision = false - }; - vm.StartGame(); - - // Place head at right edge - vm.SnakeBody.Clear(); - vm.SnakeBody.AddFirst(new GridPoint(SnakeGameViewModel.GridWidth - 1, 5)); - vm.SnakeBody.AddLast(new GridPoint(SnakeGameViewModel.GridWidth - 2, 5)); - - var tickMethod = typeof(SnakeGameViewModel).GetMethod("OnGameTick", BindingFlags.NonPublic | BindingFlags.Instance); - Assert.NotNull(tickMethod); - - // Moving right wraps to 0 - tickMethod.Invoke(vm, new object?[] { null, EventArgs.Empty }); - - Assert.Equal(SnakeGameState.Playing, vm.State); - Assert.Equal(0, vm.SnakeBody.First!.Value.X); - } - - [Fact] - public async Task SnakeGamePlugin_Registers_All_Capabilities_And_Rolls_Back_Cleanly() - { - var services = new ServiceCollection(); - var overlayReg = new OverlayRegistry(services.BuildServiceProvider()); - var commandReg = new CommandPaletteRegistry(); - var statusReg = new StatusBarRegistry(seedDefaults: false); - var ribbonReg = new RibbonRegistry(); - - var rootContext = new FryPluginContext(); - rootContext.RegisterService(overlayReg); - rootContext.RegisterService(commandReg); - rootContext.RegisterService(statusReg); - rootContext.RegisterService(ribbonReg); - - var plugin = new SnakeGamePlugin(); - Assert.Equal("frypdf.overlay.snake", plugin.Id); - Assert.NotNull(plugin.SettingsSchema); - Assert.True(plugin.SettingsSchema.ContainsKey("InitialSpeed")); - Assert.True(plugin.SettingsSchema.ContainsKey("WallCollision")); - - using var scope = new PluginScope(); - var scopedContext = rootContext.CreateScopedContext(scope); - - await plugin.ApplyAsync(scopedContext); - - // 1. Verify Overlay registered - Assert.NotNull(overlayReg.GetOverlay("frypdf.overlay.snake")); - - // 2. Verify Command Palette registered - Assert.Contains(commandReg.GetAllCommands(), c => c.Id == "cmd.overlay.snake"); - - // 3. Verify Status Bar Widget registered - var rightWidgets = statusReg.GetWidgets(StatusBarAlignment.Right); - Assert.Contains(rightWidgets, w => w.WidgetId == "frypdf.status.snake"); - - // 4. Verify Ribbon Action registered - var ribbonActions = ribbonReg.GetActionsForTab("view"); - Assert.Contains(ribbonActions, a => a.Id == "frypdf.ribbon.action.snake"); - - // 5. Test LIFO Rollback when scope is disposed - scope.Dispose(); - - Assert.Null(overlayReg.GetOverlay("frypdf.overlay.snake")); - Assert.DoesNotContain(commandReg.GetAllCommands(), c => c.Id == "cmd.overlay.snake"); - Assert.DoesNotContain(statusReg.GetWidgets(StatusBarAlignment.Right), w => w.WidgetId == "frypdf.status.snake"); - Assert.DoesNotContain(ribbonReg.GetActionsForTab("view"), a => a.Id == "frypdf.ribbon.action.snake"); - } - - [Fact] - public void SnakeGamePlugin_IsStandaloneOverlayPlugin() - { - var plugin = new SnakeGamePlugin(); - Assert.Equal("frypdf.overlay.snake", plugin.Id); - Assert.Equal("Playable Snake Game", plugin.Name); - Assert.Equal(new Version(1, 0, 0), plugin.Version); - } - - [Fact] - public void ShellOverlayHost_ClampsAndPositionsOverlays_WithinViewportBounds() - { - var services = new ServiceCollection(); - App.ConfigureServices(services); - var sp = services.BuildServiceProvider(); - - var mainVm = sp.GetRequiredService(); - var host = new PdfEditorApp.Views.Overlays.ShellOverlayHost - { - DataContext = mainVm - }; - - var overlayReg = sp.GetRequiredService(); - var desc = new OverlayDescriptor - { - Id = "test.overlay.positioning", - Title = "Positioning Test", - Slot = "shell.overlay", - DefaultWidth = 320, - DefaultHeight = 420, - InitialX = null, - InitialY = 100, - ViewFactory = _ => new Avalonia.Controls.Border() - }; - - overlayReg.RegisterOverlay(desc); - overlayReg.ShowOverlay(desc.Id); - - Assert.Single(mainVm.ActiveOverlays); - var instance = mainVm.ActiveOverlays[0]; - - // Measure and Arrange host with 1200x800 - host.Measure(new Avalonia.Size(1200, 800)); - host.Arrange(new Avalonia.Rect(0, 0, 1200, 800)); - - // Clamping docks within 1200x800 - Assert.True(instance.X > 0); - Assert.True(instance.X + instance.Width <= 1200); - Assert.True(instance.Y >= 60); - Assert.True(instance.Y + instance.Height <= 800); - } - - [Fact] - public void OverlayInstanceViewModel_SupportsResizing_AndRespectsConstraints() - { - var desc = new OverlayDescriptor - { - Id = "test.overlay.resizing", - Title = "Resizing Test", - DefaultWidth = 360, - DefaultHeight = 480, - MinWidth = 300, - MinHeight = 400, - MaxWidth = 800, - MaxHeight = 900, - IsResizable = true - }; - - var vm = new OverlayInstanceViewModel(desc); - - Assert.True(vm.IsResizable); - Assert.True(vm.CanResize); - Assert.Equal(360, vm.Width); - Assert.Equal(480, vm.Height); - Assert.Equal(480, vm.EffectiveHeight); - Assert.Equal(400, vm.EffectiveMinHeight); - - // Test normal resize - vm.Resize(500, 600); - Assert.Equal(500, vm.Width); - Assert.Equal(600, vm.Height); - Assert.Equal(600, vm.EffectiveHeight); - - // Test below MinWidth / MinHeight - vm.Resize(200, 250); - Assert.Equal(300, vm.Width); - Assert.Equal(400, vm.Height); - - // Test above MaxWidth / MaxHeight - vm.Resize(1200, 1500); - Assert.Equal(800, vm.Width); - Assert.Equal(900, vm.Height); - - // Test canvas boundary clamping - vm.X = 100; - vm.Y = 50; - vm.Resize(750, 850, maxCanvasWidth: 500, maxCanvasHeight: 600); - Assert.Equal(500, vm.Width); - Assert.Equal(600, vm.Height); - - // Test Minimize behavior - vm.ToggleMinimize(); - Assert.True(vm.IsMinimized); - Assert.False(vm.CanResize); - Assert.True(double.IsNaN(vm.EffectiveHeight)); - Assert.Equal(42, vm.EffectiveMinHeight); - - // Restore behavior - vm.ToggleMinimize(); - Assert.False(vm.IsMinimized); - Assert.True(vm.CanResize); - Assert.Equal(600, vm.EffectiveHeight); - Assert.Equal(400, vm.EffectiveMinHeight); - } -} diff --git a/tests/PdfEditorApp.Tests/TesseractManagerTests.cs b/tests/PdfEditorApp.Tests/TesseractManagerTests.cs deleted file mode 100644 index 37d7ec8..0000000 --- a/tests/PdfEditorApp.Tests/TesseractManagerTests.cs +++ /dev/null @@ -1,177 +0,0 @@ -using System; -using System.IO; -using System.Linq; -using System.Threading.Tasks; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Models; -using PdfEditorApp.Services.Ocr; -using PdfEditorApp.ViewModels; -using Xunit; - -namespace PdfEditorApp.Tests; - -public class TesseractManagerTests -{ - private readonly TesseractModelService _modelService = new(); - - [Fact] - public void TesseractCatalog_ContainsAllMajorWorldwideLanguagePacks() - { - var languages = _modelService.AvailableLanguages; - - Assert.NotNull(languages); - Assert.True(languages.Count >= 30, "Catalog must contain at least 30 major language and script models"); - - // European / Latin - Assert.Contains(languages, l => l.Code == "eng" && l.Category == "Latin & European"); - Assert.Contains(languages, l => l.Code == "spa" && l.Category == "Latin & European"); - Assert.Contains(languages, l => l.Code == "fra" && l.Category == "Latin & European"); - Assert.Contains(languages, l => l.Code == "deu" && l.Category == "Latin & European"); - Assert.Contains(languages, l => l.Code == "rus" && l.Category == "Latin & European"); - - // East Asia (CJK) - Assert.Contains(languages, l => l.Code == "chi_sim" && l.Category == "East Asia (CJK)"); - Assert.Contains(languages, l => l.Code == "chi_tra" && l.Category == "East Asia (CJK)"); - Assert.Contains(languages, l => l.Code == "jpn" && l.Category == "East Asia (CJK)"); - Assert.Contains(languages, l => l.Code == "kor" && l.Category == "East Asia (CJK)"); - - // South Asia (Indic) - Assert.Contains(languages, l => l.Code == "hin" && l.Category == "South Asia (Indic)"); - Assert.Contains(languages, l => l.Code == "ben" && l.Category == "South Asia (Indic)"); - Assert.Contains(languages, l => l.Code == "tam" && l.Category == "South Asia (Indic)"); - Assert.Contains(languages, l => l.Code == "tel" && l.Category == "South Asia (Indic)"); - Assert.Contains(languages, l => l.Code == "san" && l.Category == "South Asia (Indic)"); - - // Middle East & RTL - Assert.Contains(languages, l => l.Code == "ara" && l.Category == "Middle East & RTL"); - Assert.Contains(languages, l => l.Code == "heb" && l.Category == "Middle East & RTL"); - Assert.Contains(languages, l => l.Code == "fas" && l.Category == "Middle East & RTL"); - - // Southeast Asia - Assert.Contains(languages, l => l.Code == "vie" && l.Category == "Southeast Asia"); - Assert.Contains(languages, l => l.Code == "tha" && l.Category == "Southeast Asia"); - Assert.Contains(languages, l => l.Code == "ind" && l.Category == "Southeast Asia"); - - // Specialized - Assert.Contains(languages, l => l.Code == "osd" && l.Category == "Specialized & Other"); - Assert.Contains(languages, l => l.Code == "equ" && l.Category == "Specialized & Other"); - } - - [Fact] - public void TesseractCatalog_AllFilesUseTessdataFastGitHubUrlPattern() - { - var languages = _modelService.AvailableLanguages; - Assert.NotEmpty(languages); - - foreach (var lang in languages) - { - Assert.False(string.IsNullOrWhiteSpace(lang.Code)); - Assert.False(string.IsNullOrWhiteSpace(lang.DisplayName)); - Assert.False(string.IsNullOrWhiteSpace(lang.NativeName)); - Assert.False(string.IsNullOrWhiteSpace(lang.FlagEmoji)); - Assert.False(string.IsNullOrWhiteSpace(lang.Description)); - Assert.False(string.IsNullOrWhiteSpace(lang.SampleText)); - Assert.StartsWith("https://raw.githubusercontent.com/tesseract-ocr/tessdata_fast/main/", lang.DownloadUrl); - Assert.EndsWith($"{lang.Code}.traineddata", lang.DownloadUrl); - Assert.True(lang.EstimatedSizeBytes > 0, $"Estimated size for {lang.Code} must be positive"); - Assert.Equal($"{lang.Code}.traineddata", lang.FileName); - } - } - - [Fact] - public void TesseractLanguagePackageInfo_FormatBytes_ReturnsHumanReadableSize() - { - Assert.Equal("0 KB", TesseractLanguagePackageInfo.FormatBytes(0)); - Assert.Equal("500.0 KB", TesseractLanguagePackageInfo.FormatBytes(500 * 1024)); - Assert.Equal("15.0 MB", TesseractLanguagePackageInfo.FormatBytes((long)(15.0 * 1024 * 1024))); - } - - [Fact] - public void TesseractManagerViewModel_FilterAndCategorySelection_FiltersCorrectly() - { - var vm = new TesseractManagerViewModel(_modelService); - - Assert.Equal(vm.TotalLanguagesCount, vm.FilteredLanguages.Count); - - // Filter by East Asia - vm.SelectCategory("EastAsia"); - Assert.All(vm.FilteredLanguages, l => Assert.Contains("East Asia", l.Category)); - Assert.Equal(4, vm.FilteredLanguages.Count); // chi_sim, chi_tra, jpn, kor - - // Filter by South Asia (Indic) - vm.SelectCategory("SouthAsia"); - Assert.All(vm.FilteredLanguages, l => Assert.Contains("South Asia", l.Category)); - Assert.True(vm.FilteredLanguages.Count >= 6); - - // Filter by Search Query - vm.SelectCategory("All"); - vm.SearchQuery = "hindi"; - Assert.Single(vm.FilteredLanguages); - Assert.Equal("hin", vm.FilteredLanguages[0].Code); - - // Search by code - vm.SearchQuery = "jpn"; - Assert.Single(vm.FilteredLanguages); - Assert.Equal("jpn", vm.FilteredLanguages[0].Code); - - // Clear filter - vm.SearchQuery = ""; - Assert.Equal(vm.TotalLanguagesCount, vm.FilteredLanguages.Count); - } - - [Fact] - public void HomeViewModel_NavigatesToTesseractDataSection() - { - var home = new HomeViewModel(); - - home.SelectNavSection("TesseractData"); - - Assert.Equal(HomeNavSection.TesseractData, home.SelectedNavSection); - Assert.True(home.IsTesseractDataSection); - Assert.NotNull(home.TesseractManager); - Assert.True(home.TesseractManager.TotalLanguagesCount >= 30); - } - - [Fact] - public async Task TesseractModelService_MockDirectoryLifecycle_HandlesInstallDeleteAndClear() - { - string tempDir = Path.Combine(Path.GetTempPath(), "frypdf_test_tessdata_" + Guid.NewGuid().ToString("N")); - Directory.CreateDirectory(tempDir); - - try - { - var service = new TesseractModelService(tempDir); - Assert.False(service.IsLanguageInstalled("eng")); - - // Create a fake traineddata file - string engPath = Path.Combine(tempDir, "eng.traineddata"); - await File.WriteAllBytesAsync(engPath, new byte[2048]); - - Assert.True(service.IsLanguageInstalled("eng")); - Assert.Equal(engPath, service.GetInstalledLanguagePath("eng")); - - long totalBytes = await service.GetTotalCacheSizeBytesAsync(); - Assert.Equal(2048, totalBytes); - - // Delete language - bool deleted = await service.DeleteLanguageAsync("eng"); - Assert.True(deleted); - Assert.False(service.IsLanguageInstalled("eng")); - Assert.False(File.Exists(engPath)); - - // Create two fake files and clear all - await File.WriteAllBytesAsync(Path.Combine(tempDir, "fra.traineddata"), new byte[1500]); - await File.WriteAllBytesAsync(Path.Combine(tempDir, "deu.traineddata"), new byte[1500]); - Assert.True(service.IsLanguageInstalled("fra")); - Assert.True(service.IsLanguageInstalled("deu")); - - await service.ClearAllCacheAsync(); - Assert.False(service.IsLanguageInstalled("fra")); - Assert.False(service.IsLanguageInstalled("deu")); - } - finally - { - try { Directory.Delete(tempDir, recursive: true); } catch { } - } - } -} diff --git a/tests/PdfEditorApp.Tests/TextSelectionAndOcrTests.cs b/tests/PdfEditorApp.Tests/TextSelectionAndOcrTests.cs deleted file mode 100644 index e2ad516..0000000 --- a/tests/PdfEditorApp.Tests/TextSelectionAndOcrTests.cs +++ /dev/null @@ -1,230 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Threading.Tasks; -using Avalonia; -using Avalonia.Input; -using PdfEditorApp.Services; -using PdfEditorApp.Templates; -using PdfEditorApp.ViewModels; -using PdfEditorApp.Views.Controls; -using Xunit; - -namespace PdfEditorApp.Tests; - -public class TextSelectionAndOcrTests -{ - private readonly IPdfExportService _exportService = new PdfExportService(); - private readonly ITemplateService _templateService = new TemplateService(); - - private byte[] CreateSamplePdfBytes() - { - var model = _templateService.CreateAnnualReportTemplate(); - return _exportService.GeneratePdfBytes(model); - } - - [Fact] - public void SelectionMode_DefaultIsText_CanToggleToAreaMode() - { - var vm = new PdfViewerViewModel(); - - Assert.Equal(PdfViewerSelectionMode.Text, vm.SelectionMode); - Assert.True(vm.IsTextSelectionMode); - Assert.False(vm.IsAreaSelectionMode); - - vm.SetAreaSelectionModeCommand.Execute(null); - Assert.Equal(PdfViewerSelectionMode.Area, vm.SelectionMode); - Assert.False(vm.IsTextSelectionMode); - Assert.True(vm.IsAreaSelectionMode); - - vm.SetTextSelectionModeCommand.Execute(null); - Assert.Equal(PdfViewerSelectionMode.Text, vm.SelectionMode); - Assert.True(vm.IsTextSelectionMode); - Assert.False(vm.IsAreaSelectionMode); - - vm.ToggleSelectionModeCommand.Execute(null); - Assert.Equal(PdfViewerSelectionMode.Area, vm.SelectionMode); - Assert.True(vm.IsAreaSelectionMode); - } - - [Fact] - public void ScannedDocumentDetection_BannerState_TransitionsProperly() - { - var vm = new PdfViewerViewModel(); - - // Initially no document - Assert.False(vm.ShowScannedDocumentBanner); - - // When document is loaded and page has 0 words - vm.IsScannedDocument = true; - vm.IsCurrentPageScanned = true; - vm.HasDocument = true; - - Assert.True(vm.ShowScannedDocumentBanner); - - // User dismisses banner - vm.DismissScannedBannerCommand.Execute(null); - Assert.False(vm.ShowScannedDocumentBanner); - Assert.True(vm.IsScannedBannerDismissed); - - // Re-enabling or OCR running suppresses banner - vm.IsScannedBannerDismissed = false; - vm.IsOcrRunning = true; - Assert.False(vm.ShowScannedDocumentBanner); - } - - [Fact] - public async Task AreaSelection_ExtractsWordsWithinRegion() - { - var vm = new PdfViewerViewModel(); - byte[] pdfBytes = CreateSamplePdfBytes(); - await vm.LoadDocumentBytesAsync(pdfBytes, "Test.pdf"); - - Assert.NotNull(vm.SelectedPage); - var page = vm.SelectedPage!; - - // Clear any auto-extracted template words and set specific test words - page.Words.Clear(); - page.Words.Add(new PdfViewerWordItem - { - Text = "Hello", - Bounds = new Rect(10, 10, 40, 15), - WordIndex = 0 - }); - page.Words.Add(new PdfViewerWordItem - { - Text = "World", - Bounds = new Rect(60, 10, 45, 15), - WordIndex = 1 - }); - page.Words.Add(new PdfViewerWordItem - { - Text = "FarAway", - Bounds = new Rect(300, 300, 60, 15), - WordIndex = 2 - }); - - // Region enclosing only "Hello World" - var region = new Rect(5, 5, 120, 30); - string extracted = await vm.ExtractOcrTextFromRegionAsync(page, region); - - Assert.Contains("Hello", extracted); - Assert.Contains("World", extracted); - Assert.DoesNotContain("FarAway", extracted); - } - - [Fact] - public void MarqueeSelection_IntersectsWords_CalculatesBoundingBoxCorrectly() - { - var word1 = new PdfViewerWordItem { Text = "Revenue", Bounds = new Rect(50, 100, 60, 16) }; - var word2 = new PdfViewerWordItem { Text = "Growth", Bounds = new Rect(115, 100, 50, 16) }; - var word3 = new PdfViewerWordItem { Text = "Footer", Bounds = new Rect(50, 700, 40, 12) }; - - var words = new List { word1, word2, word3 }; - var marqueeBox = new Rect(40, 90, 150, 30); - - var selected = words.Where(w => w.Bounds.Intersects(marqueeBox)).ToList(); - - Assert.Equal(2, selected.Count); - Assert.Equal("Revenue", selected[0].Text); - Assert.Equal("Growth", selected[1].Text); - } - - [Fact] - public async Task ScannedPdf_LoadsAndInitializesOcrCapabilities() - { - string? samplePdf = FindTestPdf(); - if (samplePdf == null || !File.Exists(samplePdf)) return; - - var vm = new PdfViewerViewModel(); - await vm.LoadDocumentAsync(samplePdf); - - Assert.True(vm.HasDocument); - Assert.NotEmpty(vm.Pages); - - var firstPage = vm.Pages[0]; - Assert.True(firstPage.WidthPoints > 0); - Assert.True(firstPage.HeightPoints > 0); - - // Ensure page geometry can be populated via OCR if needed - if (OperatingSystem.IsMacOS() && firstPage.Words.Count == 0) - { - await vm.RecognizeActivePageOcrAsync(); - Assert.NotEmpty(firstPage.Words); - Assert.False(string.IsNullOrWhiteSpace(firstPage.ExtractedText)); - Assert.False(vm.IsCurrentPageScanned); - } - } - - [Fact] - public void ShiftClick_ExtendsSelectionRange_OnPageItem() - { - var page = new PdfViewerPageItem - { - PageNumber = 1, - WidthPoints = 612, - HeightPoints = 792 - }; - - var w1 = new PdfViewerWordItem { Text = "First", Bounds = new Rect(50, 50, 30, 12), LineIndex = 0, WordIndex = 0 }; - var w2 = new PdfViewerWordItem { Text = "Second", Bounds = new Rect(85, 50, 40, 12), LineIndex = 0, WordIndex = 1 }; - var w3 = new PdfViewerWordItem { Text = "Third", Bounds = new Rect(130, 50, 30, 12), LineIndex = 0, WordIndex = 2 }; - - var line = new PdfViewerTextLineItem { LineIndex = 0, Bounds = new Rect(50, 50, 110, 12) }; - line.Words.AddRange(new[] { w1, w2, w3 }); - - page.Words.AddRange(new[] { w1, w2, w3 }); - page.TextLines.Add(line); - - // Select from start of First to end of Third - page.SetSelectionRange(new Point(50, 55), new Point(160, 55)); - - Assert.True(page.HasSelection); - Assert.Contains("First", page.SelectedText); - Assert.Contains("Third", page.SelectedText); - Assert.NotEmpty(page.SelectionRects); - } - - [Fact] - public void GarbledText_Detection_IdentifiesCorruptedFontsCorrectly() - { - // Unmapped / corrupt font encodings from custom PDF fonts - Assert.True(PdfViewerViewModel.IsGarbledText("? FT * FtJlTiur")); - Assert.True(PdfViewerViewModel.IsGarbledText("s | l | r | i | a | a | t | a | e | h | d | D | a | A")); - Assert.True(PdfViewerViewModel.IsGarbledText("??? ?? * ??")); - - // Clean normal texts (Latin, Indic Unicode, CJK) - Assert.False(PdfViewerViewModel.IsGarbledText("Hello World, this is a clean financial report.")); - Assert.False(PdfViewerViewModel.IsGarbledText("इस आधार पत्र को यूआईडीएआई द्वारा नियुक्त प्रमाणीकरण")); - Assert.False(PdfViewerViewModel.IsGarbledText("Annual Revenue Growth 2026")); - Assert.False(PdfViewerViewModel.IsGarbledText("")); - Assert.False(PdfViewerViewModel.IsGarbledText(null)); - } - - [Fact] - public void IsSelectionTextGarbled_UpdatesAutomatically_WhenSelectionChanges() - { - var vm = new PdfViewerViewModel(); - - Assert.False(vm.IsSelectionTextGarbled); - - vm.ActiveSelectedText = "? FT * FtJlTiur"; - Assert.True(vm.IsSelectionTextGarbled); - - vm.ActiveSelectedText = "Standard Heading Text"; - Assert.False(vm.IsSelectionTextGarbled); - } - - private static string? FindTestPdf() - { - var dir = new DirectoryInfo(AppContext.BaseDirectory); - while (dir != null) - { - string candidate = Path.Combine(dir.FullName, "Arduino Cheat Sheet_Redacted_Redacted.pdf"); - if (File.Exists(candidate)) return candidate; - dir = dir.Parent; - } - return null; - } -} diff --git a/tests/PdfEditorApp.Tests/ThemeServiceTests.cs b/tests/PdfEditorApp.Tests/ThemeServiceTests.cs deleted file mode 100644 index 3e99668..0000000 --- a/tests/PdfEditorApp.Tests/ThemeServiceTests.cs +++ /dev/null @@ -1,337 +0,0 @@ -using System; -using System.IO; -using System.Text.Json; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Models; -using PdfEditorApp.Services; -using PdfEditorApp.Services.Tools.Core; -using PdfEditorApp.Tests.Mocks; -using PdfEditorApp.ViewModels; -using Xunit; - -namespace PdfEditorApp.Tests; - -[Collection("ThemeServiceCollection")] -public class ThemeServiceTests : IDisposable -{ - private readonly string _settingsFilePath; - private readonly string? _originalBackup; - - public ThemeServiceTests() - { - _settingsFilePath = ThemeService.GetSettingsFilePath(); - if (File.Exists(_settingsFilePath)) - { - _originalBackup = File.ReadAllText(_settingsFilePath); - } - } - - public void Dispose() - { - try - { - if (_originalBackup != null) - { - File.WriteAllText(_settingsFilePath, _originalBackup); - } - else if (File.Exists(_settingsFilePath)) - { - File.Delete(_settingsFilePath); - } - } - catch - { - // Clean up best effort - } - } - - [Fact] - public void ThemeService_InitialState_LoadsFromDiskOrDefaultsToLight() - { - // Arrange: remove file if present - if (File.Exists(_settingsFilePath)) File.Delete(_settingsFilePath); - - // Act - var service = new ThemeService(); - - // Assert - Assert.Equal(AppThemeMode.Light, service.CurrentTheme); - Assert.Equal(PdfReaderTheme.Default, service.ReadingTheme); - Assert.False(service.IsDarkMode); - } - - [Fact] - public void ThemeService_SetTheme_ChangesThemeAndRaisesEvent() - { - // Arrange - var service = new ThemeService(); - var targetTheme = service.CurrentTheme == AppThemeMode.Dark ? AppThemeMode.Light : AppThemeMode.Dark; - AppThemeMode? receivedTheme = null; - service.ThemeChanged += (t) => receivedTheme = t; - - // Act - service.SetTheme(targetTheme); - - // Assert - Assert.Equal(targetTheme, service.CurrentTheme); - Assert.Equal(targetTheme == AppThemeMode.Dark, service.IsDarkMode); - Assert.Equal(targetTheme, receivedTheme); - } - - [Fact] - public void ThemeService_ToggleTheme_CyclesBetweenLightAndDark() - { - // Arrange - var service = new ThemeService(); - service.SetTheme(AppThemeMode.Light); - Assert.Equal(AppThemeMode.Light, service.CurrentTheme); - - // Act 1: Toggle to Dark - service.ToggleTheme(); - Assert.Equal(AppThemeMode.Dark, service.CurrentTheme); - Assert.True(service.IsDarkMode); - - // Act 2: Toggle back to Light - service.ToggleTheme(); - Assert.Equal(AppThemeMode.Light, service.CurrentTheme); - Assert.False(service.IsDarkMode); - } - - [Fact] - public void ThemeService_PersistsTheme_ToDisk_AndRestoresUponReopening() - { - // Arrange: instantiate service and save Dark mode - var service1 = new ThemeService(); - service1.SetTheme(AppThemeMode.Dark); - - // Verify file was written - Assert.True(File.Exists(_settingsFilePath)); - string savedJson = File.ReadAllText(_settingsFilePath); - Assert.Contains("Dark", savedJson); - - // Act: create brand new ThemeService instance (simulating app restart) - var service2 = new ThemeService(); - - // Assert: should restore Dark theme immediately from disk - Assert.Equal(AppThemeMode.Dark, service2.CurrentTheme); - Assert.True(service2.IsDarkMode); - } - - [Fact] - public void ThemeService_PersistsReadingTheme_ToDisk_AndRestoresUponReopening() - { - // Arrange: instantiate service and set reading theme to Sepia - var service1 = new ThemeService(); - service1.SetReadingTheme(PdfReaderTheme.Sepia); - - // Verify file was written - Assert.True(File.Exists(_settingsFilePath)); - string savedJson = File.ReadAllText(_settingsFilePath); - Assert.Contains("Sepia", savedJson); - - // Act: create brand new ThemeService instance (simulating app restart) - var service2 = new ThemeService(); - - // Assert: should restore Sepia reading theme immediately from disk - Assert.Equal(PdfReaderTheme.Sepia, service2.ReadingTheme); - } - - [Fact] - public void ThemeService_HandlesCaseInsensitiveAndLegacyJson_Gracefully() - { - // Arrange: manually write lowercase / legacy json - var legacyJson = "{\n \"theme\": \"dark\",\n \"readingTheme\": \"highcontrast\",\n \"isDarkMode\": true\n}"; - var dir = ThemeService.GetSettingsDirectory(); - Directory.CreateDirectory(dir); - File.WriteAllText(_settingsFilePath, legacyJson); - - // Act: instantiate new ThemeService - var service = new ThemeService(); - - // Assert - Assert.Equal(AppThemeMode.Dark, service.CurrentTheme); - Assert.Equal(PdfReaderTheme.HighContrast, service.ReadingTheme); - Assert.True(service.IsDarkMode); - } - - [Fact] - public void ThemeService_HandlesNumericEnumJson_Gracefully() - { - // Arrange: numeric enum values (0 = System, 1 = Light, 2 = Dark) - var numericJson = "{\n \"Theme\": 2,\n \"ReadingTheme\": 1\n}"; - var dir = ThemeService.GetSettingsDirectory(); - Directory.CreateDirectory(dir); - File.WriteAllText(_settingsFilePath, numericJson); - - // Act: instantiate new ThemeService - var service = new ThemeService(); - - // Assert - Assert.Equal(AppThemeMode.Dark, service.CurrentTheme); - Assert.Equal(PdfReaderTheme.Sepia, service.ReadingTheme); - } - - [Fact] - public void ThemeService_HandlesCorruptedJson_FallsBackToDefaults() - { - // Arrange: corrupt json - var corruptJson = "{ INVALID JSON !! @@ }}"; - var dir = ThemeService.GetSettingsDirectory(); - Directory.CreateDirectory(dir); - File.WriteAllText(_settingsFilePath, corruptJson); - - // Act: instantiate new ThemeService - var service = new ThemeService(); - - // Assert - Assert.Equal(AppThemeMode.Light, service.CurrentTheme); - Assert.Equal(PdfReaderTheme.Default, service.ReadingTheme); - } - - [Fact] - public void HomeViewModel_ToggleThemeCommand_SynchronizesWithThemeService() - { - // Arrange - var themeService = new ThemeService(); - themeService.SetTheme(AppThemeMode.Light); - - var homeVm = new HomeViewModel( - new MockRecentDocumentsService(), - new TemplateService(), - new ProjectPersistenceService(), - new PdfToolRegistry(), - themeService: themeService); - - Assert.False(homeVm.IsDarkMode); - - // Act 1: Toggle via HomeViewModel - homeVm.ToggleThemeCommand.Execute(null); - - // Assert - Assert.True(homeVm.IsDarkMode); - Assert.True(themeService.IsDarkMode); - - // Act 2: Toggle back - homeVm.ToggleThemeCommand.Execute(null); - - // Assert - Assert.False(homeVm.IsDarkMode); - Assert.False(themeService.IsDarkMode); - } - - [Fact] - public void MainViewModel_ThemeCommands_SwitchThemesAndSyncHomeVm() - { - // Arrange - var themeService = new ThemeService(); - themeService.SetTheme(AppThemeMode.Light); - - var mainVm = new MainViewModel( - new PdfExportService(), - new TemplateService(), - new ProjectPersistenceService(), - themeService: themeService); - - Assert.False(mainVm.IsDarkMode); - Assert.False(mainVm.Home.IsDarkMode); - - // Act 1: Set Dark Theme - mainVm.SetDarkThemeCommand.Execute(null); - Assert.True(mainVm.IsDarkMode); - Assert.True(mainVm.Home.IsDarkMode); - Assert.Equal(AppThemeMode.Dark, themeService.CurrentTheme); - - // Act 2: Set Light Theme - mainVm.SetLightThemeCommand.Execute(null); - Assert.False(mainVm.IsDarkMode); - Assert.False(mainVm.Home.IsDarkMode); - Assert.Equal(AppThemeMode.Light, themeService.CurrentTheme); - - // Act 3: Toggle Theme - mainVm.ToggleThemeCommand.Execute(null); - Assert.True(mainVm.IsDarkMode); - Assert.True(mainVm.Home.IsDarkMode); - } - - [Fact] - public void MainViewModel_PdfViewer_SyncsAndPersistsReadingTheme() - { - // Arrange - var themeService = new ThemeService(); - var mainVm = new MainViewModel( - new PdfExportService(), - new TemplateService(), - new ProjectPersistenceService(), - themeService: themeService); - - // Act: User selects Dark reading mode in PDF viewer - mainVm.PdfViewer.SetReadingThemeCommand.Execute("Dark"); - - // Assert: MainViewModel, ThemeService and PdfViewer are all synced - Assert.Equal(PdfReaderTheme.Dark, mainVm.PdfViewer.ReadingTheme); - Assert.Equal(PdfReaderTheme.Dark, themeService.ReadingTheme); - - // Simulating reopen - var reopenedService = new ThemeService(); - Assert.Equal(PdfReaderTheme.Dark, reopenedService.ReadingTheme); - } - - [Fact] - public void CommandPalette_ContainsThemeCommands() - { - // Arrange - var mainVm = new MainViewModel( - new PdfExportService(), - new TemplateService(), - new ProjectPersistenceService()); - - // Act - mainVm.FilterPaletteCommands("Theme"); - - // Assert - Assert.NotEmpty(mainVm.FilteredPaletteCommands); - Assert.Contains(mainVm.FilteredPaletteCommands, c => c.Title.Contains("Toggle Dark / Light Theme")); - Assert.Contains(mainVm.FilteredPaletteCommands, c => c.Title.Contains("Switch to Dark Theme")); - Assert.Contains(mainVm.FilteredPaletteCommands, c => c.Title.Contains("Switch to Light Theme")); - } - - [Fact] - public void AppAxaml_And_Styles_DefineChubbySliderResourcesAndRules() - { - // Find project root - var currentDir = AppContext.BaseDirectory; - string? projectRoot = null; - var dir = new DirectoryInfo(currentDir); - while (dir != null) - { - if (File.Exists(Path.Combine(dir.FullName, "FryPDF.sln")) || Directory.Exists(Path.Combine(dir.FullName, "src", "PdfEditorApp"))) - { - projectRoot = dir.FullName; - break; - } - dir = dir.Parent; - } - - Assert.NotNull(projectRoot); - - var appAxamlPath = Path.Combine(projectRoot, "src", "PdfEditorApp", "App.axaml"); - Assert.True(File.Exists(appAxamlPath), "App.axaml must exist"); - var appAxaml = File.ReadAllText(appAxamlPath); - - // Verify modern chubby slider resources are configured - Assert.Contains("SliderTrackThemeHeight", appAxaml); - Assert.Contains("8", appAxaml); - Assert.Contains("0", appAxaml); - Assert.Contains("0", appAxaml); - Assert.Contains("20", appAxaml); - - // Verify styles file has chubby slider selectors - var stylesPath = Path.Combine(projectRoot, "src", "PdfEditorApp", "Styles", "FluentOfficeStyles.axaml"); - Assert.True(File.Exists(stylesPath), "FluentOfficeStyles.axaml must exist"); - var stylesText = File.ReadAllText(stylesPath); - - Assert.Contains("Modern Chubby Tactile Slider Styling", stylesText); - Assert.Contains("RepeatButton#PART_DecreaseButton", stylesText); - Assert.Contains("RepeatButton#PART_IncreaseButton", stylesText); - } -} diff --git a/tests/PdfEditorApp.Tests/Tools/Conversion/ExcelToPdfToolTests.cs b/tests/PdfEditorApp.Tests/Tools/Conversion/ExcelToPdfToolTests.cs deleted file mode 100644 index 24600e3..0000000 --- a/tests/PdfEditorApp.Tests/Tools/Conversion/ExcelToPdfToolTests.cs +++ /dev/null @@ -1,60 +0,0 @@ -using PdfEditorApp.Services.Tools.Core; -using PdfEditorApp.Services.Tools.Organize; -using PdfEditorApp.Services.Tools.Security; -using PdfEditorApp.Services.Tools.Conversion; -using PdfEditorApp.Services.Tools.Intelligence; -using PdfEditorApp.ViewModels.Tools.Core; -using PdfEditorApp.ViewModels.Tools.Organize; -using PdfEditorApp.ViewModels.Tools.Security; -using PdfEditorApp.ViewModels.Tools.Conversion; -using PdfEditorApp.ViewModels.Tools.Intelligence; -using PdfEditorApp.Tests.Tools.Core; -using System.IO; -using System.Threading.Tasks; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Models; -using PdfEditorApp.ViewModels.Tools; -using Xunit; - -namespace PdfEditorApp.Tests.Tools.Conversion; - -public class ExcelToPdfToolTests : IClassFixture -{ - private readonly ToolTestFixture _fixture; - - public ExcelToPdfToolTests(ToolTestFixture fixture) - { - _fixture = fixture; - } - - [Fact] - public void ExcelToPdfTool_InstantiatesWithCorrectDefaults() - { - var vm = (ExcelToPdfToolViewModel)_fixture.Factory.Create(PdfToolId.ExcelToPdf); - Assert.NotNull(vm); - Assert.Equal(PdfToolId.ExcelToPdf, vm.Tool.Id); - Assert.Equal(PageOrientation.Landscape, vm.Orientation); - } - - [Fact] - public async Task ExcelToPdfTool_ConvertsDocumentSuccessfully() - { - string sampleXlsx = ToolTestFixture.CreateSampleXlsx("TestExcel"); - try - { - var vm = (ExcelToPdfToolViewModel)_fixture.Factory.Create(PdfToolId.ExcelToPdf); - vm.SelectedFiles.Add(sampleXlsx); - vm.SyncPreviewItems(); - - await vm.ExecuteToolCommand.ExecuteAsync(null); - - Assert.True(vm.IsComplete); - Assert.False(vm.HasError); - Assert.True(File.Exists(vm.LastOutputFilePath)); - } - finally - { - if (File.Exists(sampleXlsx)) File.Delete(sampleXlsx); - } - } -} diff --git a/tests/PdfEditorApp.Tests/Tools/Conversion/HtmlToPdfToolTests.cs b/tests/PdfEditorApp.Tests/Tools/Conversion/HtmlToPdfToolTests.cs deleted file mode 100644 index 131561e..0000000 --- a/tests/PdfEditorApp.Tests/Tools/Conversion/HtmlToPdfToolTests.cs +++ /dev/null @@ -1,62 +0,0 @@ -using PdfEditorApp.Services.Tools.Core; -using PdfEditorApp.Services.Tools.Organize; -using PdfEditorApp.Services.Tools.Security; -using PdfEditorApp.Services.Tools.Conversion; -using PdfEditorApp.Services.Tools.Intelligence; -using PdfEditorApp.ViewModels.Tools.Core; -using PdfEditorApp.ViewModels.Tools.Organize; -using PdfEditorApp.ViewModels.Tools.Security; -using PdfEditorApp.ViewModels.Tools.Conversion; -using PdfEditorApp.ViewModels.Tools.Intelligence; -using PdfEditorApp.Tests.Tools.Core; -using System.IO; -using System.Threading.Tasks; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Models; -using PdfEditorApp.ViewModels.Tools; -using Xunit; - -namespace PdfEditorApp.Tests.Tools.Conversion; - -public class HtmlToPdfToolTests : IClassFixture -{ - private readonly ToolTestFixture _fixture; - - public HtmlToPdfToolTests(ToolTestFixture fixture) - { - _fixture = fixture; - } - - [Fact] - public void HtmlToPdfTool_InstantiatesWithCorrectDefaults() - { - var vm = (HtmlToPdfToolViewModel)_fixture.Factory.Create(PdfToolId.HtmlToPdf); - Assert.NotNull(vm); - Assert.Equal(PdfToolId.HtmlToPdf, vm.Tool.Id); - Assert.Equal(PageFormat.A4, vm.Format); - Assert.Equal(PageOrientation.Portrait, vm.Orientation); - } - - [Fact] - public async Task HtmlToPdfTool_ConvertsHtmlContentSuccessfully() - { - var vm = (HtmlToPdfToolViewModel)_fixture.Factory.Create(PdfToolId.HtmlToPdf); - vm.HtmlContentOrUrl = "

    Sample Document

    Test HTML body content.

    "; - - try - { - await vm.ExecuteToolCommand.ExecuteAsync(null); - - Assert.True(vm.IsComplete, $"Error: {vm.ErrorMessage}"); - Assert.False(vm.HasError); - Assert.True(File.Exists(vm.LastOutputFilePath)); - } - finally - { - if (!string.IsNullOrEmpty(vm.LastOutputFilePath) && File.Exists(vm.LastOutputFilePath)) - { - try { File.Delete(vm.LastOutputFilePath); } catch { } - } - } - } -} diff --git a/tests/PdfEditorApp.Tests/Tools/Conversion/JpgToPdfToolTests.cs b/tests/PdfEditorApp.Tests/Tools/Conversion/JpgToPdfToolTests.cs deleted file mode 100644 index 1d0ff61..0000000 --- a/tests/PdfEditorApp.Tests/Tools/Conversion/JpgToPdfToolTests.cs +++ /dev/null @@ -1,61 +0,0 @@ -using PdfEditorApp.Services.Tools.Core; -using PdfEditorApp.Services.Tools.Organize; -using PdfEditorApp.Services.Tools.Security; -using PdfEditorApp.Services.Tools.Conversion; -using PdfEditorApp.Services.Tools.Intelligence; -using PdfEditorApp.ViewModels.Tools.Core; -using PdfEditorApp.ViewModels.Tools.Organize; -using PdfEditorApp.ViewModels.Tools.Security; -using PdfEditorApp.ViewModels.Tools.Conversion; -using PdfEditorApp.ViewModels.Tools.Intelligence; -using PdfEditorApp.Tests.Tools.Core; -using System.IO; -using System.Threading.Tasks; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Models; -using PdfEditorApp.ViewModels.Tools; -using Xunit; - -namespace PdfEditorApp.Tests.Tools.Conversion; - -public class JpgToPdfToolTests : IClassFixture -{ - private readonly ToolTestFixture _fixture; - - public JpgToPdfToolTests(ToolTestFixture fixture) - { - _fixture = fixture; - } - - [Fact] - public void JpgToPdfTool_InstantiatesWithCorrectDefaults() - { - var vm = (JpgToPdfToolViewModel)_fixture.Factory.Create(PdfToolId.JpgToPdf); - Assert.NotNull(vm); - Assert.Equal(PdfToolId.JpgToPdf, vm.Tool.Id); - Assert.Equal(PageFormat.A4, vm.PageFormat); - Assert.True(vm.AutoOrientation); - } - - [Fact] - public async Task JpgToPdfTool_CombinesImagesToPdfSuccessfully() - { - string imgPath = ToolTestFixture.CreateSampleImage("TestJpg"); - try - { - var vm = (JpgToPdfToolViewModel)_fixture.Factory.Create(PdfToolId.JpgToPdf); - vm.SelectedFiles.Add(imgPath); - vm.SyncPreviewItems(); - - await vm.ExecuteToolCommand.ExecuteAsync(null); - - Assert.True(vm.IsComplete); - Assert.False(vm.HasError); - Assert.True(File.Exists(vm.LastOutputFilePath)); - } - finally - { - if (File.Exists(imgPath)) File.Delete(imgPath); - } - } -} diff --git a/tests/PdfEditorApp.Tests/Tools/Conversion/PdfToExcelToolTests.cs b/tests/PdfEditorApp.Tests/Tools/Conversion/PdfToExcelToolTests.cs deleted file mode 100644 index 5fd228d..0000000 --- a/tests/PdfEditorApp.Tests/Tools/Conversion/PdfToExcelToolTests.cs +++ /dev/null @@ -1,59 +0,0 @@ -using PdfEditorApp.Services.Tools.Core; -using PdfEditorApp.Services.Tools.Organize; -using PdfEditorApp.Services.Tools.Security; -using PdfEditorApp.Services.Tools.Conversion; -using PdfEditorApp.Services.Tools.Intelligence; -using PdfEditorApp.ViewModels.Tools.Core; -using PdfEditorApp.ViewModels.Tools.Organize; -using PdfEditorApp.ViewModels.Tools.Security; -using PdfEditorApp.ViewModels.Tools.Conversion; -using PdfEditorApp.ViewModels.Tools.Intelligence; -using PdfEditorApp.Tests.Tools.Core; -using System.IO; -using System.Threading.Tasks; -using PdfEditorApp.Models; -using PdfEditorApp.ViewModels.Tools; -using Xunit; - -namespace PdfEditorApp.Tests.Tools.Conversion; - -public class PdfToExcelToolTests : IClassFixture -{ - private readonly ToolTestFixture _fixture; - - public PdfToExcelToolTests(ToolTestFixture fixture) - { - _fixture = fixture; - } - - [Fact] - public void PdfToExcelTool_InstantiatesWithCorrectDefaults() - { - var vm = (PdfToExcelToolViewModel)_fixture.Factory.Create(PdfToolId.PdfToExcel); - Assert.NotNull(vm); - Assert.Equal(PdfToolId.PdfToExcel, vm.Tool.Id); - Assert.True(vm.DetectAllTables); - } - - [Fact] - public async Task PdfToExcelTool_ConvertsPdfToExcelSuccessfully() - { - string sample = ToolTestFixture.CreateSamplePdf("ExcelSample", 2); - try - { - var vm = (PdfToExcelToolViewModel)_fixture.Factory.Create(PdfToolId.PdfToExcel); - vm.SelectedFiles.Add(sample); - vm.SyncPreviewItems(); - - await vm.ExecuteToolCommand.ExecuteAsync(null); - - Assert.True(vm.IsComplete); - Assert.False(vm.HasError); - Assert.True(File.Exists(vm.LastOutputFilePath)); - } - finally - { - if (File.Exists(sample)) File.Delete(sample); - } - } -} diff --git a/tests/PdfEditorApp.Tests/Tools/Conversion/PdfToJpgToolTests.cs b/tests/PdfEditorApp.Tests/Tools/Conversion/PdfToJpgToolTests.cs deleted file mode 100644 index 7c50955..0000000 --- a/tests/PdfEditorApp.Tests/Tools/Conversion/PdfToJpgToolTests.cs +++ /dev/null @@ -1,106 +0,0 @@ -using PdfEditorApp.Services.Tools.Core; -using PdfEditorApp.Services.Tools.Organize; -using PdfEditorApp.Services.Tools.Security; -using PdfEditorApp.Services.Tools.Conversion; -using PdfEditorApp.Services.Tools.Intelligence; -using PdfEditorApp.ViewModels.Tools.Core; -using PdfEditorApp.ViewModels.Tools.Organize; -using PdfEditorApp.ViewModels.Tools.Security; -using PdfEditorApp.ViewModels.Tools.Conversion; -using PdfEditorApp.ViewModels.Tools.Intelligence; -using PdfEditorApp.Tests.Tools.Core; -using System.IO; -using System.Threading.Tasks; -using PdfEditorApp.Models; -using PdfEditorApp.ViewModels.Tools; -using Xunit; - -namespace PdfEditorApp.Tests.Tools.Conversion; - -public class PdfToJpgToolTests : IClassFixture -{ - private readonly ToolTestFixture _fixture; - - public PdfToJpgToolTests(ToolTestFixture fixture) - { - _fixture = fixture; - } - - [Fact] - public void PdfToJpgTool_InstantiatesWithCorrectDefaults() - { - var vm = (PdfToJpgToolViewModel)_fixture.Factory.Create(PdfToolId.PdfToJpg); - Assert.NotNull(vm); - Assert.Equal(PdfToolId.PdfToJpg, vm.Tool.Id); - Assert.Equal("jpg", vm.OutputFormat); - Assert.Equal(300, vm.Dpi); - } - - [Fact] - public async Task PdfToJpgTool_ExportsPdfToImagesSuccessfully() - { - string sample = ToolTestFixture.CreateSamplePdf("PdfToJpgSample", 2); - try - { - var vm = (PdfToJpgToolViewModel)_fixture.Factory.Create(PdfToolId.PdfToJpg); - vm.SelectedFiles.Add(sample); - vm.SyncPreviewItems(); - - await vm.ExecuteToolCommand.ExecuteAsync(null); - - Assert.True(vm.IsComplete); - Assert.False(vm.HasError); - } - finally - { - if (File.Exists(sample)) File.Delete(sample); - } - } - - [Fact] - public async Task PdfToJpgTool_ExportedImage_ContainsRealPageContent_NotBlankCanvas() - { - string sample = ToolTestFixture.CreateSamplePdf("PdfToJpgContentSample", 1); - string? imagesDir = null; - try - { - var vm = (PdfToJpgToolViewModel)_fixture.Factory.Create(PdfToolId.PdfToJpg); - vm.SelectedFiles.Add(sample); - vm.SyncPreviewItems(); - vm.OutputFormat = "png"; - - await vm.ExecuteToolCommand.ExecuteAsync(null); - - Assert.True(vm.IsComplete); - Assert.False(vm.HasError); - Assert.True(File.Exists(vm.LastOutputFilePath)); - imagesDir = Path.GetDirectoryName(vm.LastOutputFilePath); - - using var bitmap = SkiaSharp.SKBitmap.Decode(vm.LastOutputFilePath); - Assert.NotNull(bitmap); - - // Regression guard: before the fix, every exported page was a blank white - // canvas (the draw call was missing entirely). The sample PDF has a solid - // SteelBlue header bar across its top, so some pixels must be non-white. - bool foundNonWhitePixel = false; - for (int y = 0; y < bitmap!.Height && !foundNonWhitePixel; y += 4) - { - for (int x = 0; x < bitmap.Width; x += 4) - { - var pixel = bitmap.GetPixel(x, y); - if (pixel.Red != 255 || pixel.Green != 255 || pixel.Blue != 255) - { - foundNonWhitePixel = true; - break; - } - } - } - Assert.True(foundNonWhitePixel, "Exported page image was entirely blank white — PDF content was not rendered."); - } - finally - { - if (File.Exists(sample)) File.Delete(sample); - if (imagesDir != null && Directory.Exists(imagesDir)) Directory.Delete(imagesDir, recursive: true); - } - } -} diff --git a/tests/PdfEditorApp.Tests/Tools/Conversion/PdfToMarkdownToolTests.cs b/tests/PdfEditorApp.Tests/Tools/Conversion/PdfToMarkdownToolTests.cs deleted file mode 100644 index a275590..0000000 --- a/tests/PdfEditorApp.Tests/Tools/Conversion/PdfToMarkdownToolTests.cs +++ /dev/null @@ -1,60 +0,0 @@ -using PdfEditorApp.Services.Tools.Core; -using PdfEditorApp.Services.Tools.Organize; -using PdfEditorApp.Services.Tools.Security; -using PdfEditorApp.Services.Tools.Conversion; -using PdfEditorApp.Services.Tools.Intelligence; -using PdfEditorApp.ViewModels.Tools.Core; -using PdfEditorApp.ViewModels.Tools.Organize; -using PdfEditorApp.ViewModels.Tools.Security; -using PdfEditorApp.ViewModels.Tools.Conversion; -using PdfEditorApp.ViewModels.Tools.Intelligence; -using PdfEditorApp.Tests.Tools.Core; -using System.IO; -using System.Threading.Tasks; -using PdfEditorApp.Models; -using PdfEditorApp.ViewModels.Tools; -using Xunit; - -namespace PdfEditorApp.Tests.Tools.Conversion; - -public class PdfToMarkdownToolTests : IClassFixture -{ - private readonly ToolTestFixture _fixture; - - public PdfToMarkdownToolTests(ToolTestFixture fixture) - { - _fixture = fixture; - } - - [Fact] - public void PdfToMarkdownTool_InstantiatesWithCorrectDefaults() - { - var vm = (PdfToMarkdownToolViewModel)_fixture.Factory.Create(PdfToolId.PdfToMarkdown); - Assert.NotNull(vm); - Assert.Equal(PdfToolId.PdfToMarkdown, vm.Tool.Id); - Assert.True(vm.IncludeTables); - Assert.True(vm.IncludeMetadataHeader); - } - - [Fact] - public async Task PdfToMarkdownTool_ConvertsPdfToMarkdownSuccessfully() - { - string sample = ToolTestFixture.CreateSamplePdf("MarkdownSample", 2); - try - { - var vm = (PdfToMarkdownToolViewModel)_fixture.Factory.Create(PdfToolId.PdfToMarkdown); - vm.SelectedFiles.Add(sample); - vm.SyncPreviewItems(); - - await vm.ExecuteToolCommand.ExecuteAsync(null); - - Assert.True(vm.IsComplete); - Assert.False(vm.HasError); - Assert.True(File.Exists(vm.LastOutputFilePath)); - } - finally - { - if (File.Exists(sample)) File.Delete(sample); - } - } -} diff --git a/tests/PdfEditorApp.Tests/Tools/Conversion/PdfToPdfAToolTests.cs b/tests/PdfEditorApp.Tests/Tools/Conversion/PdfToPdfAToolTests.cs deleted file mode 100644 index e29e8d0..0000000 --- a/tests/PdfEditorApp.Tests/Tools/Conversion/PdfToPdfAToolTests.cs +++ /dev/null @@ -1,59 +0,0 @@ -using PdfEditorApp.Services.Tools.Core; -using PdfEditorApp.Services.Tools.Organize; -using PdfEditorApp.Services.Tools.Security; -using PdfEditorApp.Services.Tools.Conversion; -using PdfEditorApp.Services.Tools.Intelligence; -using PdfEditorApp.ViewModels.Tools.Core; -using PdfEditorApp.ViewModels.Tools.Organize; -using PdfEditorApp.ViewModels.Tools.Security; -using PdfEditorApp.ViewModels.Tools.Conversion; -using PdfEditorApp.ViewModels.Tools.Intelligence; -using PdfEditorApp.Tests.Tools.Core; -using System.IO; -using System.Threading.Tasks; -using PdfEditorApp.Models; -using PdfEditorApp.ViewModels.Tools; -using Xunit; - -namespace PdfEditorApp.Tests.Tools.Conversion; - -public class PdfToPdfAToolTests : IClassFixture -{ - private readonly ToolTestFixture _fixture; - - public PdfToPdfAToolTests(ToolTestFixture fixture) - { - _fixture = fixture; - } - - [Fact] - public void PdfToPdfATool_InstantiatesWithCorrectDefaults() - { - var vm = (PdfToPdfAToolViewModel)_fixture.Factory.Create(PdfToolId.PdfToPdfA); - Assert.NotNull(vm); - Assert.Equal(PdfToolId.PdfToPdfA, vm.Tool.Id); - Assert.Equal(PdfAStandard.PdfA2b, vm.Standard); - } - - [Fact] - public async Task PdfToPdfATool_ConvertsToPdfASuccessfully() - { - string sample = ToolTestFixture.CreateSamplePdf("PdfASample", 1); - try - { - var vm = (PdfToPdfAToolViewModel)_fixture.Factory.Create(PdfToolId.PdfToPdfA); - vm.SelectedFiles.Add(sample); - vm.SyncPreviewItems(); - - await vm.ExecuteToolCommand.ExecuteAsync(null); - - Assert.True(vm.IsComplete); - Assert.False(vm.HasError); - Assert.True(File.Exists(vm.LastOutputFilePath)); - } - finally - { - if (File.Exists(sample)) File.Delete(sample); - } - } -} diff --git a/tests/PdfEditorApp.Tests/Tools/Conversion/PdfToPowerPointToolTests.cs b/tests/PdfEditorApp.Tests/Tools/Conversion/PdfToPowerPointToolTests.cs deleted file mode 100644 index 1605d18..0000000 --- a/tests/PdfEditorApp.Tests/Tools/Conversion/PdfToPowerPointToolTests.cs +++ /dev/null @@ -1,59 +0,0 @@ -using PdfEditorApp.Services.Tools.Core; -using PdfEditorApp.Services.Tools.Organize; -using PdfEditorApp.Services.Tools.Security; -using PdfEditorApp.Services.Tools.Conversion; -using PdfEditorApp.Services.Tools.Intelligence; -using PdfEditorApp.ViewModels.Tools.Core; -using PdfEditorApp.ViewModels.Tools.Organize; -using PdfEditorApp.ViewModels.Tools.Security; -using PdfEditorApp.ViewModels.Tools.Conversion; -using PdfEditorApp.ViewModels.Tools.Intelligence; -using PdfEditorApp.Tests.Tools.Core; -using System.IO; -using System.Threading.Tasks; -using PdfEditorApp.Models; -using PdfEditorApp.ViewModels.Tools; -using Xunit; - -namespace PdfEditorApp.Tests.Tools.Conversion; - -public class PdfToPowerPointToolTests : IClassFixture -{ - private readonly ToolTestFixture _fixture; - - public PdfToPowerPointToolTests(ToolTestFixture fixture) - { - _fixture = fixture; - } - - [Fact] - public void PdfToPowerPointTool_InstantiatesWithCorrectDefaults() - { - var vm = (PdfToPowerPointToolViewModel)_fixture.Factory.Create(PdfToolId.PdfToPowerPoint); - Assert.NotNull(vm); - Assert.Equal(PdfToolId.PdfToPowerPoint, vm.Tool.Id); - Assert.True(vm.EditableText); - } - - [Fact] - public async Task PdfToPowerPointTool_ConvertsPdfToPptxSuccessfully() - { - string sample = ToolTestFixture.CreateSamplePdf("PptSample", 2); - try - { - var vm = (PdfToPowerPointToolViewModel)_fixture.Factory.Create(PdfToolId.PdfToPowerPoint); - vm.SelectedFiles.Add(sample); - vm.SyncPreviewItems(); - - await vm.ExecuteToolCommand.ExecuteAsync(null); - - Assert.True(vm.IsComplete); - Assert.False(vm.HasError); - Assert.True(File.Exists(vm.LastOutputFilePath)); - } - finally - { - if (File.Exists(sample)) File.Delete(sample); - } - } -} diff --git a/tests/PdfEditorApp.Tests/Tools/Conversion/PdfToWordToolTests.cs b/tests/PdfEditorApp.Tests/Tools/Conversion/PdfToWordToolTests.cs deleted file mode 100644 index 53fb381..0000000 --- a/tests/PdfEditorApp.Tests/Tools/Conversion/PdfToWordToolTests.cs +++ /dev/null @@ -1,86 +0,0 @@ -using PdfEditorApp.Services.Tools.Core; -using PdfEditorApp.Services.Tools.Organize; -using PdfEditorApp.Services.Tools.Security; -using PdfEditorApp.Services.Tools.Conversion; -using PdfEditorApp.Services.Tools.Intelligence; -using PdfEditorApp.ViewModels.Tools.Core; -using PdfEditorApp.ViewModels.Tools.Organize; -using PdfEditorApp.ViewModels.Tools.Security; -using PdfEditorApp.ViewModels.Tools.Conversion; -using PdfEditorApp.ViewModels.Tools.Intelligence; -using PdfEditorApp.Tests.Tools.Core; -using System.IO; -using System.Threading.Tasks; -using PdfEditorApp.Models; -using PdfEditorApp.ViewModels.Tools; -using Xunit; - -namespace PdfEditorApp.Tests.Tools.Conversion; - -public class PdfToWordToolTests : IClassFixture -{ - private readonly ToolTestFixture _fixture; - - public PdfToWordToolTests(ToolTestFixture fixture) - { - _fixture = fixture; - } - - [Fact] - public void PdfToWordTool_InstantiatesWithCorrectDefaults() - { - var vm = (PdfToWordToolViewModel)_fixture.Factory.Create(PdfToolId.PdfToWord); - Assert.NotNull(vm); - Assert.Equal(PdfToolId.PdfToWord, vm.Tool.Id); - Assert.True(vm.ExtractTables); - } - - [Fact] - public async Task PdfToWordTool_ConvertsPdfToWordSuccessfully() - { - string sample = ToolTestFixture.CreateSamplePdf("WordSample", 2); - try - { - var vm = (PdfToWordToolViewModel)_fixture.Factory.Create(PdfToolId.PdfToWord); - vm.SelectedFiles.Add(sample); - vm.SyncPreviewItems(); - - await vm.ExecuteToolCommand.ExecuteAsync(null); - - Assert.True(vm.IsComplete); - Assert.False(vm.HasError); - Assert.True(File.Exists(vm.LastOutputFilePath)); - } - finally - { - if (File.Exists(sample)) File.Delete(sample); - } - } - - [Fact] - public async Task PdfToWordTool_MultiFileBatch_ProcessesEveryFile_NotJustTheFirst() - { - string sample1 = ToolTestFixture.CreateSamplePdf("WordBatch1", 1); - string sample2 = ToolTestFixture.CreateSamplePdf("WordBatch2", 1); - try - { - var vm = (PdfToWordToolViewModel)_fixture.Factory.Create(PdfToolId.PdfToWord); - vm.SelectedFiles.Add(sample1); - vm.SelectedFiles.Add(sample2); - vm.SyncPreviewItems(); - - await vm.ExecuteToolCommand.ExecuteAsync(null); - - Assert.True(vm.IsComplete); - Assert.False(vm.HasError); - // Regression guard: before the fix, only the first selected file was ever - // converted and the second was silently dropped with no error. - Assert.Contains("2 of 2", vm.ResultSummaryMessage); - } - finally - { - if (File.Exists(sample1)) File.Delete(sample1); - if (File.Exists(sample2)) File.Delete(sample2); - } - } -} diff --git a/tests/PdfEditorApp.Tests/Tools/Conversion/PowerPointToPdfToolTests.cs b/tests/PdfEditorApp.Tests/Tools/Conversion/PowerPointToPdfToolTests.cs deleted file mode 100644 index 43b9794..0000000 --- a/tests/PdfEditorApp.Tests/Tools/Conversion/PowerPointToPdfToolTests.cs +++ /dev/null @@ -1,60 +0,0 @@ -using PdfEditorApp.Services.Tools.Core; -using PdfEditorApp.Services.Tools.Organize; -using PdfEditorApp.Services.Tools.Security; -using PdfEditorApp.Services.Tools.Conversion; -using PdfEditorApp.Services.Tools.Intelligence; -using PdfEditorApp.ViewModels.Tools.Core; -using PdfEditorApp.ViewModels.Tools.Organize; -using PdfEditorApp.ViewModels.Tools.Security; -using PdfEditorApp.ViewModels.Tools.Conversion; -using PdfEditorApp.ViewModels.Tools.Intelligence; -using PdfEditorApp.Tests.Tools.Core; -using System.IO; -using System.Threading.Tasks; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Models; -using PdfEditorApp.ViewModels.Tools; -using Xunit; - -namespace PdfEditorApp.Tests.Tools.Conversion; - -public class PowerPointToPdfToolTests : IClassFixture -{ - private readonly ToolTestFixture _fixture; - - public PowerPointToPdfToolTests(ToolTestFixture fixture) - { - _fixture = fixture; - } - - [Fact] - public void PowerPointToPdfTool_InstantiatesWithCorrectDefaults() - { - var vm = (PowerPointToPdfToolViewModel)_fixture.Factory.Create(PdfToolId.PowerPointToPdf); - Assert.NotNull(vm); - Assert.Equal(PdfToolId.PowerPointToPdf, vm.Tool.Id); - Assert.Equal(PageOrientation.Landscape, vm.Orientation); - } - - [Fact] - public async Task PowerPointToPdfTool_ConvertsDocumentSuccessfully() - { - string samplePptx = ToolTestFixture.CreateSamplePptx("TestPpt"); - try - { - var vm = (PowerPointToPdfToolViewModel)_fixture.Factory.Create(PdfToolId.PowerPointToPdf); - vm.SelectedFiles.Add(samplePptx); - vm.SyncPreviewItems(); - - await vm.ExecuteToolCommand.ExecuteAsync(null); - - Assert.True(vm.IsComplete); - Assert.False(vm.HasError); - Assert.True(File.Exists(vm.LastOutputFilePath)); - } - finally - { - if (File.Exists(samplePptx)) File.Delete(samplePptx); - } - } -} diff --git a/tests/PdfEditorApp.Tests/Tools/Conversion/ScanToPdfToolTests.cs b/tests/PdfEditorApp.Tests/Tools/Conversion/ScanToPdfToolTests.cs deleted file mode 100644 index 0356843..0000000 --- a/tests/PdfEditorApp.Tests/Tools/Conversion/ScanToPdfToolTests.cs +++ /dev/null @@ -1,60 +0,0 @@ -using PdfEditorApp.Services.Tools.Core; -using PdfEditorApp.Services.Tools.Organize; -using PdfEditorApp.Services.Tools.Security; -using PdfEditorApp.Services.Tools.Conversion; -using PdfEditorApp.Services.Tools.Intelligence; -using PdfEditorApp.ViewModels.Tools.Core; -using PdfEditorApp.ViewModels.Tools.Organize; -using PdfEditorApp.ViewModels.Tools.Security; -using PdfEditorApp.ViewModels.Tools.Conversion; -using PdfEditorApp.ViewModels.Tools.Intelligence; -using PdfEditorApp.Tests.Tools.Core; -using System.IO; -using System.Threading.Tasks; -using PdfEditorApp.Models; -using PdfEditorApp.ViewModels.Tools; -using Xunit; - -namespace PdfEditorApp.Tests.Tools.Conversion; - -public class ScanToPdfToolTests : IClassFixture -{ - private readonly ToolTestFixture _fixture; - - public ScanToPdfToolTests(ToolTestFixture fixture) - { - _fixture = fixture; - } - - [Fact] - public void ScanToPdfTool_InstantiatesWithCorrectDefaults() - { - var vm = (ScanToPdfToolViewModel)_fixture.Factory.Create(PdfToolId.ScanToPdf); - Assert.NotNull(vm); - Assert.Equal(PdfToolId.ScanToPdf, vm.Tool.Id); - Assert.True(vm.AutoDeskew); - Assert.True(vm.EnhanceContrast); - } - - [Fact] - public async Task ScanToPdfTool_ProcessesScanFilesSuccessfully() - { - string sample = ToolTestFixture.CreateSampleImage("ScanSample"); - try - { - var vm = (ScanToPdfToolViewModel)_fixture.Factory.Create(PdfToolId.ScanToPdf); - vm.SelectedFiles.Add(sample); - vm.SyncPreviewItems(); - - await vm.ExecuteToolCommand.ExecuteAsync(null); - - Assert.True(vm.IsComplete); - Assert.False(vm.HasError); - Assert.True(File.Exists(vm.LastOutputFilePath)); - } - finally - { - if (File.Exists(sample)) File.Delete(sample); - } - } -} diff --git a/tests/PdfEditorApp.Tests/Tools/Conversion/WordToPdfToolTests.cs b/tests/PdfEditorApp.Tests/Tools/Conversion/WordToPdfToolTests.cs deleted file mode 100644 index ad2698e..0000000 --- a/tests/PdfEditorApp.Tests/Tools/Conversion/WordToPdfToolTests.cs +++ /dev/null @@ -1,60 +0,0 @@ -using PdfEditorApp.Services.Tools.Core; -using PdfEditorApp.Services.Tools.Organize; -using PdfEditorApp.Services.Tools.Security; -using PdfEditorApp.Services.Tools.Conversion; -using PdfEditorApp.Services.Tools.Intelligence; -using PdfEditorApp.ViewModels.Tools.Core; -using PdfEditorApp.ViewModels.Tools.Organize; -using PdfEditorApp.ViewModels.Tools.Security; -using PdfEditorApp.ViewModels.Tools.Conversion; -using PdfEditorApp.ViewModels.Tools.Intelligence; -using PdfEditorApp.Tests.Tools.Core; -using System.IO; -using System.Threading.Tasks; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Models; -using PdfEditorApp.ViewModels.Tools; -using Xunit; - -namespace PdfEditorApp.Tests.Tools.Conversion; - -public class WordToPdfToolTests : IClassFixture -{ - private readonly ToolTestFixture _fixture; - - public WordToPdfToolTests(ToolTestFixture fixture) - { - _fixture = fixture; - } - - [Fact] - public void WordToPdfTool_InstantiatesWithCorrectDefaults() - { - var vm = (WordToPdfToolViewModel)_fixture.Factory.Create(PdfToolId.WordToPdf); - Assert.NotNull(vm); - Assert.Equal(PdfToolId.WordToPdf, vm.Tool.Id); - Assert.Equal(PageOrientation.Portrait, vm.Orientation); - } - - [Fact] - public async Task WordToPdfTool_ConvertsDocumentSuccessfully() - { - string sampleDoc = ToolTestFixture.CreateSampleDocx("TestWord"); - try - { - var vm = (WordToPdfToolViewModel)_fixture.Factory.Create(PdfToolId.WordToPdf); - vm.SelectedFiles.Add(sampleDoc); - vm.SyncPreviewItems(); - - await vm.ExecuteToolCommand.ExecuteAsync(null); - - Assert.True(vm.IsComplete); - Assert.False(vm.HasError); - Assert.True(File.Exists(vm.LastOutputFilePath)); - } - finally - { - if (File.Exists(sampleDoc)) File.Delete(sampleDoc); - } - } -} diff --git a/tests/PdfEditorApp.Tests/Tools/Core/ToolTestFixture.cs b/tests/PdfEditorApp.Tests/Tools/Core/ToolTestFixture.cs deleted file mode 100644 index 96b84bc..0000000 --- a/tests/PdfEditorApp.Tests/Tools/Core/ToolTestFixture.cs +++ /dev/null @@ -1,208 +0,0 @@ -using PdfEditorApp.Services.Tools.Core; -using PdfEditorApp.Services.Tools.Organize; -using PdfEditorApp.Services.Tools.Security; -using PdfEditorApp.Services.Tools.Conversion; -using PdfEditorApp.Services.Tools.Intelligence; -using PdfEditorApp.ViewModels.Tools.Core; -using PdfEditorApp.ViewModels.Tools.Organize; -using PdfEditorApp.ViewModels.Tools.Security; -using PdfEditorApp.ViewModels.Tools.Conversion; -using PdfEditorApp.ViewModels.Tools.Intelligence; -using System; -using System.IO; -using System.Text; -using DocumentFormat.OpenXml; -using DocumentFormat.OpenXml.Packaging; -using DocumentFormat.OpenXml.Spreadsheet; -using DocumentFormat.OpenXml.Wordprocessing; -using DocumentFormat.OpenXml.Presentation; -using PdfEditorApp.Models; -using PdfEditorApp.Services; -using PdfEditorApp.Services.Tools; -using PdfSharpCore.Pdf; -using PdfSharpCore.Drawing; -using SkiaSharp; -using UglyToad.PdfPig.Writer; - -namespace PdfEditorApp.Tests.Tools.Core; - -public class ToolTestFixture -{ - public IPdfToolRegistry ToolRegistry { get; } - public IPdfDocumentOperationsService OperationsService { get; } - public IPdfToolViewModelFactory Factory { get; } - - public ToolTestFixture() - { - ToolRegistry = new PdfToolRegistry(); - var pageService = new PdfPageService(); - var optService = new PdfOptimizationService(); - var secService = new PdfSecurityService(); - var convService = new PdfConversionService(); - var ocrService = new PdfOcrService(); - var formService = new PdfFormService(); - var aiService = new AiDocumentService(); - var transService = new DocumentTranslationService(); - var workflowEngine = new PdfWorkflowEngine(pageService, optService, secService, convService, ocrService); - - OperationsService = new PdfDocumentOperationsService( - ToolRegistry, pageService, optService, secService, convService, ocrService, formService, aiService, transService, workflowEngine); - - Factory = new PdfToolViewModelFactory(OperationsService, ToolRegistry); - } - - public static string CreateIsolatedDirectory(string prefix = "PdfTest") - { - string dir = Path.Combine(Path.GetTempPath(), $"{prefix}_{Guid.NewGuid():N}"); - Directory.CreateDirectory(dir); - return dir; - } - - /// - /// Generates a realistic, self-contained multi-page PDF with headers, formatted paragraphs, and shapes. - /// - public static string CreateSamplePdf(string name = "Sample", int pageCount = 2, string? directory = null) - { - string dir = directory ?? Path.GetTempPath(); - string path = Path.Combine(dir, $"{name}_{Guid.NewGuid():N}.pdf"); - using var doc = new PdfDocument(); - for (int i = 0; i < pageCount; i++) - { - var page = doc.AddPage(); - page.Width = XUnit.FromPoint(595); - page.Height = XUnit.FromPoint(842); - - using var gfx = XGraphics.FromPdfPage(page); - var titleFont = new XFont("Helvetica", 18, XFontStyle.Bold); - var bodyFont = new XFont("Helvetica", 11, XFontStyle.Regular); - var headerFont = new XFont("Helvetica", 9, XFontStyle.Italic); - - // Header bar - gfx.DrawRectangle(XBrushes.SteelBlue, 0, 0, page.Width.Point, 30); - gfx.DrawString($"FryPDF Generated Test Suite • Document: {name}", headerFont, XBrushes.White, new XPoint(20, 20)); - - // Document Title - gfx.DrawString($"Test Document: {name} (Page {i + 1} of {pageCount})", titleFont, XBrushes.DarkSlateGray, new XPoint(40, 70)); - - // Paragraph content - string p1 = "This is a real, self-contained PDF document generated dynamically for unit testing."; - string p2 = "It contains multi-page content, paragraphs, metadata, and geometry to test PDF manipulations."; - string p3 = "CONFIDENTIAL: Internal operations verification test suite for FryPDF."; - - gfx.DrawString(p1, bodyFont, XBrushes.Black, new XPoint(40, 110)); - gfx.DrawString(p2, bodyFont, XBrushes.Black, new XPoint(40, 130)); - gfx.DrawString(p3, bodyFont, XBrushes.DarkRed, new XPoint(40, 150)); - - // Simple table - double tableY = 180; - gfx.DrawRectangle(XPens.DarkGray, XBrushes.LightGray, 40, tableY, 500, 20); - gfx.DrawString("Column A", bodyFont, XBrushes.Black, new XPoint(50, tableY + 14)); - gfx.DrawString("Column B", bodyFont, XBrushes.Black, new XPoint(200, tableY + 14)); - gfx.DrawString("Column C", bodyFont, XBrushes.Black, new XPoint(350, tableY + 14)); - - for (int r = 1; r <= 3; r++) - { - double rowY = tableY + (r * 22); - gfx.DrawRectangle(XPens.LightGray, 40, rowY, 500, 22); - gfx.DrawString($"Data {r}-A", bodyFont, XBrushes.Black, new XPoint(50, rowY + 15)); - gfx.DrawString($"Data {r}-B", bodyFont, XBrushes.Black, new XPoint(200, rowY + 15)); - gfx.DrawString($"Data {r}-C", bodyFont, XBrushes.Black, new XPoint(350, rowY + 15)); - } - - // Footer - gfx.DrawLine(XPens.LightGray, 40, page.Height.Point - 40, page.Width.Point - 40, page.Height.Point - 40); - gfx.DrawString($"Page {i + 1} of {pageCount}", headerFont, XBrushes.Gray, new XPoint(page.Width.Point / 2 - 20, page.Height.Point - 25)); - } - - doc.Save(path); - return path; - } - - /// - /// Generates a PDF with web-appended whitespace or trailing comments to test resilience. - /// - public static string CreatePaddedWebPdf(string name = "WebPaddedSample", int pageCount = 3, string? directory = null) - { - string basePdf = CreateSamplePdf(name, pageCount, directory); - byte[] bytes = File.ReadAllBytes(basePdf); - using var ms = new MemoryStream(); - ms.Write(bytes, 0, bytes.Length); - byte[] extra = Encoding.ASCII.GetBytes("\r\n% Trailing web analytics comment\r\n\r\n \r\n"); - ms.Write(extra, 0, extra.Length); - - string dir = directory ?? Path.GetTempPath(); - string paddedPath = Path.Combine(dir, $"{name}_padded_{Guid.NewGuid():N}.pdf"); - File.WriteAllBytes(paddedPath, ms.ToArray()); - - if (File.Exists(basePdf)) File.Delete(basePdf); - return paddedPath; - } - - public static string CreateSampleDocx(string name = "SampleDocx") - { - string path = Path.Combine(Path.GetTempPath(), $"{name}_{Guid.NewGuid():N}.docx"); - using var wordDoc = WordprocessingDocument.Create(path, WordprocessingDocumentType.Document); - var mainPart = wordDoc.AddMainDocumentPart(); - mainPart.Document = new DocumentFormat.OpenXml.Wordprocessing.Document(); - var body = mainPart.Document.AppendChild(new Body()); - var para = body.AppendChild(new DocumentFormat.OpenXml.Wordprocessing.Paragraph()); - var run = para.AppendChild(new DocumentFormat.OpenXml.Wordprocessing.Run()); - run.AppendChild(new DocumentFormat.OpenXml.Wordprocessing.Text("Sample Word Document Paragraph for Testing")); - mainPart.Document.Save(); - return path; - } - - public static string CreateSampleXlsx(string name = "SampleXlsx") - { - string path = Path.Combine(Path.GetTempPath(), $"{name}_{Guid.NewGuid():N}.xlsx"); - using var spreadsheetDoc = SpreadsheetDocument.Create(path, SpreadsheetDocumentType.Workbook); - var wbPart = spreadsheetDoc.AddWorkbookPart(); - wbPart.Workbook = new Workbook(); - var wsPart = wbPart.AddNewPart(); - var sheetData = new SheetData(); - var row = new Row(); - var cell = new Cell { DataType = CellValues.String, CellValue = new CellValue("Header 1") }; - row.Append(cell); - sheetData.Append(row); - wsPart.Worksheet = new Worksheet(sheetData); - wsPart.Worksheet.Save(); - var sheets = wbPart.Workbook.AppendChild(new Sheets()); - sheets.Append(new Sheet { Id = wbPart.GetIdOfPart(wsPart), SheetId = 1, Name = "Sheet1" }); - wbPart.Workbook.Save(); - spreadsheetDoc.Save(); - return path; - } - - public static string CreateSamplePptx(string name = "SamplePptx") - { - string path = Path.Combine(Path.GetTempPath(), $"{name}_{Guid.NewGuid():N}.pptx"); - using var presentationDoc = PresentationDocument.Create(path, PresentationDocumentType.Presentation); - var pPart = presentationDoc.AddPresentationPart(); - pPart.Presentation = new Presentation(); - var slideIdList = pPart.Presentation.AppendChild(new SlideIdList()); - var slidePart = pPart.AddNewPart(); - var slide = new Slide(new CommonSlideData(new ShapeTree())); - slidePart.Slide = slide; - slidePart.Slide.Save(); - slideIdList.Append(new SlideId { Id = 256, RelationshipId = pPart.GetIdOfPart(slidePart) }); - pPart.Presentation.Save(); - return path; - } - - public static string CreateSampleImage(string name = "SampleImage") - { - string path = Path.Combine(Path.GetTempPath(), $"{name}_{Guid.NewGuid():N}.png"); - using var bitmap = new SKBitmap(300, 300); - using (var canvas = new SKCanvas(bitmap)) - { - canvas.Clear(SKColors.AliceBlue); - using var paint = new SKPaint { Color = SKColors.Navy, IsAntialias = true }; - canvas.DrawRect(30, 30, 240, 240, paint); - } - using var image = SKImage.FromBitmap(bitmap); - using var data = image.Encode(SKEncodedImageFormat.Png, 90); - using var stream = File.OpenWrite(path); - data.SaveTo(stream); - return path; - } -} diff --git a/tests/PdfEditorApp.Tests/Tools/Intelligence/AiSummarizerToolTests.cs b/tests/PdfEditorApp.Tests/Tools/Intelligence/AiSummarizerToolTests.cs deleted file mode 100644 index 26e9c75..0000000 --- a/tests/PdfEditorApp.Tests/Tools/Intelligence/AiSummarizerToolTests.cs +++ /dev/null @@ -1,59 +0,0 @@ -using PdfEditorApp.Services.Tools.Core; -using PdfEditorApp.Services.Tools.Organize; -using PdfEditorApp.Services.Tools.Security; -using PdfEditorApp.Services.Tools.Conversion; -using PdfEditorApp.Services.Tools.Intelligence; -using PdfEditorApp.ViewModels.Tools.Core; -using PdfEditorApp.ViewModels.Tools.Organize; -using PdfEditorApp.ViewModels.Tools.Security; -using PdfEditorApp.ViewModels.Tools.Conversion; -using PdfEditorApp.ViewModels.Tools.Intelligence; -using PdfEditorApp.Tests.Tools.Core; -using System.IO; -using System.Threading.Tasks; -using PdfEditorApp.Models; -using PdfEditorApp.ViewModels.Tools; -using Xunit; - -namespace PdfEditorApp.Tests.Tools.Intelligence; - -public class AiSummarizerToolTests : IClassFixture -{ - private readonly ToolTestFixture _fixture; - - public AiSummarizerToolTests(ToolTestFixture fixture) - { - _fixture = fixture; - } - - [Fact] - public void AiSummarizerTool_InstantiatesWithCorrectDefaults() - { - var vm = (AiSummarizerToolViewModel)_fixture.Factory.Create(PdfToolId.AiSummarizer); - Assert.NotNull(vm); - Assert.Equal(PdfToolId.AiSummarizer, vm.Tool.Id); - Assert.True(vm.IncludeActionItems); - Assert.Equal(7, vm.MaxBulletPoints); - } - - [Fact] - public async Task AiSummarizerTool_SummarizesDocumentSuccessfully() - { - string sample = ToolTestFixture.CreateSamplePdf("AiSample", 2); - try - { - var vm = (AiSummarizerToolViewModel)_fixture.Factory.Create(PdfToolId.AiSummarizer); - vm.SelectedFiles.Add(sample); - vm.SyncPreviewItems(); - - await vm.ExecuteToolCommand.ExecuteAsync(null); - - Assert.True(vm.IsComplete); - Assert.False(vm.HasError); - } - finally - { - if (File.Exists(sample)) File.Delete(sample); - } - } -} diff --git a/tests/PdfEditorApp.Tests/Tools/Intelligence/ComparePdfToolTests.cs b/tests/PdfEditorApp.Tests/Tools/Intelligence/ComparePdfToolTests.cs deleted file mode 100644 index 2884551..0000000 --- a/tests/PdfEditorApp.Tests/Tools/Intelligence/ComparePdfToolTests.cs +++ /dev/null @@ -1,96 +0,0 @@ -using PdfEditorApp.Services.Tools.Core; -using PdfEditorApp.Services.Tools.Organize; -using PdfEditorApp.Services.Tools.Security; -using PdfEditorApp.Services.Tools.Conversion; -using PdfEditorApp.Services.Tools.Intelligence; -using PdfEditorApp.ViewModels.Tools.Core; -using PdfEditorApp.ViewModels.Tools.Organize; -using PdfEditorApp.ViewModels.Tools.Security; -using PdfEditorApp.ViewModels.Tools.Conversion; -using PdfEditorApp.ViewModels.Tools.Intelligence; -using PdfEditorApp.Tests.Tools.Core; -using System.IO; -using System.Threading.Tasks; -using PdfEditorApp.Models; -using PdfEditorApp.ViewModels.Tools; -using Xunit; - -namespace PdfEditorApp.Tests.Tools.Intelligence; - -public class ComparePdfToolTests : IClassFixture -{ - private readonly ToolTestFixture _fixture; - - public ComparePdfToolTests(ToolTestFixture fixture) - { - _fixture = fixture; - } - - [Fact] - public void ComparePdfTool_InstantiatesWithCorrectDefaults() - { - var vm = (ComparePdfToolViewModel)_fixture.Factory.Create(PdfToolId.ComparePdf); - Assert.NotNull(vm); - Assert.Equal(PdfToolId.ComparePdf, vm.Tool.Id); - Assert.True(vm.DetectTextDiff); - Assert.True(vm.DetectVisualDiff); - } - - [Fact] - public async Task ComparePdfTool_ExecutesComparisonSuccessfully() - { - string docA = ToolTestFixture.CreateSamplePdf("CompareA", 2); - string docB = ToolTestFixture.CreateSamplePdf("CompareB", 2); - try - { - var vm = (ComparePdfToolViewModel)_fixture.Factory.Create(PdfToolId.ComparePdf); - vm.DocumentAPath = docA; - vm.DocumentBPath = docB; - - await vm.ExecuteToolCommand.ExecuteAsync(null); - - Assert.True(vm.IsComplete); - Assert.False(vm.HasError); - Assert.NotEmpty(vm.ResultSummaryMessage); - } - finally - { - if (File.Exists(docA)) File.Delete(docA); - if (File.Exists(docB)) File.Delete(docB); - } - } - - [Fact] - public async Task ComparePdfTool_DetectsRealPageCountDifference_AndWritesReportFile() - { - // Regression guard: before the fix, the dispatcher was a stub that only compared - // file byte-sizes and never wrote an output file — a 2-page and a 5-page document - // would "succeed" identically with no indication anything differed. - string docA = ToolTestFixture.CreateSamplePdf("CompareRealA", 2); - string docB = ToolTestFixture.CreateSamplePdf("CompareRealB", 5); - string? reportPath = null; - try - { - var vm = (ComparePdfToolViewModel)_fixture.Factory.Create(PdfToolId.ComparePdf); - vm.DocumentAPath = docA; - vm.DocumentBPath = docB; - - await vm.ExecuteToolCommand.ExecuteAsync(null); - - Assert.True(vm.IsComplete); - Assert.False(vm.HasError); - reportPath = vm.LastOutputFilePath; - Assert.True(File.Exists(reportPath), "ComparePdf must produce a real report file, not a silent no-op."); - - string reportContent = await File.ReadAllTextAsync(reportPath); - Assert.Contains("2 pages", reportContent); - Assert.Contains("5 pages", reportContent); - } - finally - { - if (File.Exists(docA)) File.Delete(docA); - if (File.Exists(docB)) File.Delete(docB); - if (reportPath != null && File.Exists(reportPath)) File.Delete(reportPath); - } - } -} diff --git a/tests/PdfEditorApp.Tests/Tools/Intelligence/EditPdfToolTests.cs b/tests/PdfEditorApp.Tests/Tools/Intelligence/EditPdfToolTests.cs deleted file mode 100644 index ba2f0ce..0000000 --- a/tests/PdfEditorApp.Tests/Tools/Intelligence/EditPdfToolTests.cs +++ /dev/null @@ -1,76 +0,0 @@ -using PdfEditorApp.Services.Tools.Core; -using PdfEditorApp.Services.Tools.Organize; -using PdfEditorApp.Services.Tools.Security; -using PdfEditorApp.Services.Tools.Conversion; -using PdfEditorApp.Services.Tools.Intelligence; -using PdfEditorApp.ViewModels.Tools.Core; -using PdfEditorApp.ViewModels.Tools.Organize; -using PdfEditorApp.ViewModels.Tools.Security; -using PdfEditorApp.ViewModels.Tools.Conversion; -using PdfEditorApp.ViewModels.Tools.Intelligence; -using System.IO; -using System.Threading.Tasks; -using PdfEditorApp.Tests.Tools.Core; -using CommunityToolkit.Mvvm.Messaging; -using PdfEditorApp.Messages; -using PdfEditorApp.Models; -using PdfEditorApp.ViewModels.Tools; -using Xunit; - -namespace PdfEditorApp.Tests.Tools.Intelligence; - -public class EditPdfToolTests : IClassFixture -{ - private readonly ToolTestFixture _fixture; - - public EditPdfToolTests(ToolTestFixture fixture) - { - _fixture = fixture; - } - - [Fact] - public void EditPdfTool_InstantiatesWithCorrectDefaults() - { - var vm = (EditPdfToolViewModel)_fixture.Factory.Create(PdfToolId.EditPdf); - Assert.NotNull(vm); - Assert.Equal(PdfToolId.EditPdf, vm.Tool.Id); - } - - [Fact] - public async Task EditPdfTool_OpensEditorSessionSuccessfully() - { - string sample = ToolTestFixture.CreateSamplePdf("EditSample", 1); - try - { - var vm = (EditPdfToolViewModel)_fixture.Factory.Create(PdfToolId.EditPdf); - vm.SelectedFiles.Add(sample); - vm.SyncPreviewItems(); - - bool openInEditorTriggered = false; - string targetPath = ""; - WeakReferenceMessenger.Default.Register(this, (r, m) => - { - openInEditorTriggered = true; - targetPath = m.FilePath; - }); - - try - { - await vm.ExecuteToolCommand.ExecuteAsync(null); - - Assert.True(vm.IsComplete); - Assert.False(vm.HasError); - Assert.True(openInEditorTriggered); - Assert.Equal(sample, targetPath); - } - finally - { - WeakReferenceMessenger.Default.Unregister(this); - } - } - finally - { - if (File.Exists(sample)) File.Delete(sample); - } - } -} diff --git a/tests/PdfEditorApp.Tests/Tools/Intelligence/OcrPdfToolTests.cs b/tests/PdfEditorApp.Tests/Tools/Intelligence/OcrPdfToolTests.cs deleted file mode 100644 index 51a3fad..0000000 --- a/tests/PdfEditorApp.Tests/Tools/Intelligence/OcrPdfToolTests.cs +++ /dev/null @@ -1,131 +0,0 @@ -using PdfEditorApp.Services.Tools.Core; -using PdfEditorApp.Services.Tools.Organize; -using PdfEditorApp.Services.Tools.Security; -using PdfEditorApp.Services.Tools.Conversion; -using PdfEditorApp.Services.Tools.Intelligence; -using PdfEditorApp.ViewModels.Tools.Core; -using PdfEditorApp.ViewModels.Tools.Organize; -using PdfEditorApp.ViewModels.Tools.Security; -using PdfEditorApp.ViewModels.Tools.Conversion; -using PdfEditorApp.ViewModels.Tools.Intelligence; -using System.IO; -using System.Threading.Tasks; -using PdfEditorApp.Services; -using PdfEditorApp.Tests.Tools.Core; -using PdfEditorApp.Models; -using PdfEditorApp.ViewModels.Tools; -using PdfSharpCore.Drawing; -using PdfSharpCore.Pdf; -using Xunit; - -namespace PdfEditorApp.Tests.Tools.Intelligence; - -[Collection("OcrTests")] -public class OcrPdfToolTests : IClassFixture -{ - private readonly ToolTestFixture _fixture; - - public OcrPdfToolTests(ToolTestFixture fixture) - { - _fixture = fixture; - } - - /// Creates a PDF page containing only an image and no drawn text, simulating a scan. - private static string CreateImageOnlyPdf(string name) - { - string path = Path.Combine(Path.GetTempPath(), $"{name}_{System.Guid.NewGuid():N}.pdf"); - string image = ToolTestFixture.CreateSampleImage(name + "_img"); - try - { - using var doc = new PdfDocument(); - var page = doc.AddPage(); - using var gfx = XGraphics.FromPdfPage(page); - using var xImage = XImage.FromFile(image); - gfx.DrawImage(xImage, 0, 0, page.Width.Point, page.Height.Point); - doc.Save(path); - } - finally - { - if (File.Exists(image)) File.Delete(image); - } - return path; - } - - [Fact] - public void OcrPdfTool_InstantiatesWithCorrectDefaults() - { - var vm = (OcrPdfToolViewModel)_fixture.Factory.Create(PdfToolId.OcrPdf); - Assert.NotNull(vm); - Assert.Equal(PdfToolId.OcrPdf, vm.Tool.Id); - Assert.Equal("eng", vm.Language); - Assert.True(vm.GenerateSearchablePdf); - } - - [Fact] - public async Task OcrPdfTool_ExecutesOcrSuccessfully() - { - string sample = ToolTestFixture.CreateSamplePdf("OcrSample", 1); - try - { - var vm = (OcrPdfToolViewModel)_fixture.Factory.Create(PdfToolId.OcrPdf); - vm.SelectedFiles.Add(sample); - vm.SyncPreviewItems(); - - await vm.ExecuteToolCommand.ExecuteAsync(null); - - Assert.True(vm.IsComplete); - Assert.False(vm.HasError); - Assert.True(File.Exists(vm.LastOutputFilePath)); - } - finally - { - if (File.Exists(sample)) File.Delete(sample); - } - } - - [Fact] - public async Task OcrPdfTool_ScannedImageOnlyPdf_ReportsHonestFailure_NotFalseSuccess() - { - // Regression guard: before the fix, a page with zero recognized words still - // produced a "Completed... Output is fully searchable" success message — this - // tool has no real image-to-text engine, so that claim was always false for - // genuinely scanned input. It must now say so clearly instead of claiming success. - string sample = CreateImageOnlyPdf("OcrScanned"); - try - { - var customOcr = new PdfEditorApp.Services.Ocr.CompositeOcrProvider - { - PreferredEngine = PdfEditorApp.Core.Models.OcrEngineType.Tesseract - }; - var ops = (PdfDocumentOperationsService)_fixture.OperationsService; - var customOps = new PdfDocumentOperationsService( - ops.ToolRegistry, - ops.PageService, - ops.OptimizationService, - ops.SecurityService, - ops.ConversionService, - new PdfOcrService(customOcr), - ops.FormService, - ops.AiService, - ops.TranslationService, - ops.WorkflowEngine); - var toolDef = _fixture.ToolRegistry.GetTool(PdfToolId.OcrPdf)!; - var vm = new OcrPdfToolViewModel(customOps, toolDef, customOcr) - { - SelectedEngine = PdfEditorApp.Core.Models.OcrEngineType.Tesseract - }; - vm.SelectedFiles.Add(sample); - vm.SyncPreviewItems(); - - await vm.ExecuteToolCommand.ExecuteAsync(null); - - Assert.True(vm.HasError); - Assert.False(vm.IsComplete); - Assert.Contains("does not yet perform true image-to-text OCR", vm.ErrorMessage); - } - finally - { - if (File.Exists(sample)) File.Delete(sample); - } - } -} diff --git a/tests/PdfEditorApp.Tests/Tools/Intelligence/PdfFormsToolTests.cs b/tests/PdfEditorApp.Tests/Tools/Intelligence/PdfFormsToolTests.cs deleted file mode 100644 index d3a76b7..0000000 --- a/tests/PdfEditorApp.Tests/Tools/Intelligence/PdfFormsToolTests.cs +++ /dev/null @@ -1,60 +0,0 @@ -using PdfEditorApp.Services.Tools.Core; -using PdfEditorApp.Services.Tools.Organize; -using PdfEditorApp.Services.Tools.Security; -using PdfEditorApp.Services.Tools.Conversion; -using PdfEditorApp.Services.Tools.Intelligence; -using PdfEditorApp.ViewModels.Tools.Core; -using PdfEditorApp.ViewModels.Tools.Organize; -using PdfEditorApp.ViewModels.Tools.Security; -using PdfEditorApp.ViewModels.Tools.Conversion; -using PdfEditorApp.ViewModels.Tools.Intelligence; -using PdfEditorApp.Tests.Tools.Core; -using System.IO; -using System.Threading.Tasks; -using PdfEditorApp.Models; -using PdfEditorApp.ViewModels.Tools; -using Xunit; - -namespace PdfEditorApp.Tests.Tools.Intelligence; - -public class PdfFormsToolTests : IClassFixture -{ - private readonly ToolTestFixture _fixture; - - public PdfFormsToolTests(ToolTestFixture fixture) - { - _fixture = fixture; - } - - [Fact] - public void PdfFormsTool_InstantiatesWithCorrectDefaults() - { - var vm = (PdfFormsToolViewModel)_fixture.Factory.Create(PdfToolId.PdfForms); - Assert.NotNull(vm); - Assert.Equal(PdfToolId.PdfForms, vm.Tool.Id); - Assert.False(vm.FlattenFields); - } - - [Fact] - public async Task PdfFormsTool_FlattensFormsSuccessfully() - { - string sample = ToolTestFixture.CreateSamplePdf("FormSample", 1); - try - { - var vm = (PdfFormsToolViewModel)_fixture.Factory.Create(PdfToolId.PdfForms); - vm.SelectedFiles.Add(sample); - vm.SyncPreviewItems(); - vm.FlattenFields = true; - - await vm.ExecuteToolCommand.ExecuteAsync(null); - - Assert.True(vm.IsComplete); - Assert.False(vm.HasError); - Assert.True(File.Exists(vm.LastOutputFilePath)); - } - finally - { - if (File.Exists(sample)) File.Delete(sample); - } - } -} diff --git a/tests/PdfEditorApp.Tests/Tools/Intelligence/TranslatePdfToolTests.cs b/tests/PdfEditorApp.Tests/Tools/Intelligence/TranslatePdfToolTests.cs deleted file mode 100644 index 0b3fb48..0000000 --- a/tests/PdfEditorApp.Tests/Tools/Intelligence/TranslatePdfToolTests.cs +++ /dev/null @@ -1,87 +0,0 @@ -using PdfEditorApp.Services.Tools.Core; -using PdfEditorApp.Services.Tools.Organize; -using PdfEditorApp.Services.Tools.Security; -using PdfEditorApp.Services.Tools.Conversion; -using PdfEditorApp.Services.Tools.Intelligence; -using PdfEditorApp.ViewModels.Tools.Core; -using PdfEditorApp.ViewModels.Tools.Organize; -using PdfEditorApp.ViewModels.Tools.Security; -using PdfEditorApp.ViewModels.Tools.Conversion; -using PdfEditorApp.ViewModels.Tools.Intelligence; -using PdfEditorApp.Tests.Tools.Core; -using System.IO; -using System.Threading.Tasks; -using PdfEditorApp.Models; -using PdfEditorApp.ViewModels.Tools; -using Xunit; - -namespace PdfEditorApp.Tests.Tools.Intelligence; - -public class TranslatePdfToolTests : IClassFixture -{ - private readonly ToolTestFixture _fixture; - - public TranslatePdfToolTests(ToolTestFixture fixture) - { - _fixture = fixture; - } - - [Fact] - public void TranslatePdfTool_InstantiatesWithCorrectDefaults() - { - var vm = (TranslatePdfToolViewModel)_fixture.Factory.Create(PdfToolId.TranslatePdf); - Assert.NotNull(vm); - Assert.Equal(PdfToolId.TranslatePdf, vm.Tool.Id); - Assert.Equal("Auto", vm.SourceLanguage); - Assert.Equal("Spanish", vm.TargetLanguage); - Assert.True(vm.PreserveLayout); - } - - [Fact] - public async Task TranslatePdfTool_TranslatesDocumentSuccessfully() - { - string sample = ToolTestFixture.CreateSamplePdf("TranslateSample", 1); - try - { - var vm = (TranslatePdfToolViewModel)_fixture.Factory.Create(PdfToolId.TranslatePdf); - vm.SelectedFiles.Add(sample); - vm.SyncPreviewItems(); - - await vm.ExecuteToolCommand.ExecuteAsync(null); - - Assert.True(vm.IsComplete); - Assert.False(vm.HasError); - Assert.True(File.Exists(vm.LastOutputFilePath)); - } - finally - { - if (File.Exists(sample)) File.Delete(sample); - } - } - - [Fact] - public async Task TranslatePdfTool_UnsupportedLanguage_ReportsHonestFailure_NotSilentNoOp() - { - // Regression guard: only Spanish/French/German have a glossary. Before the fix, - // any other language (e.g. Japanese, suggested by the tool's own UI placeholder) - // silently passed every line through unchanged while still reporting success. - string sample = ToolTestFixture.CreateSamplePdf("TranslateUnsupported", 1); - try - { - var vm = (TranslatePdfToolViewModel)_fixture.Factory.Create(PdfToolId.TranslatePdf); - vm.SelectedFiles.Add(sample); - vm.SyncPreviewItems(); - vm.TargetLanguage = "Japanese"; - - await vm.ExecuteToolCommand.ExecuteAsync(null); - - Assert.True(vm.HasError); - Assert.False(vm.IsComplete); - Assert.Contains("not supported yet", vm.ErrorMessage); - } - finally - { - if (File.Exists(sample)) File.Delete(sample); - } - } -} diff --git a/tests/PdfEditorApp.Tests/Tools/Organize/CropPdfToolTests.cs b/tests/PdfEditorApp.Tests/Tools/Organize/CropPdfToolTests.cs deleted file mode 100644 index db1a83e..0000000 --- a/tests/PdfEditorApp.Tests/Tools/Organize/CropPdfToolTests.cs +++ /dev/null @@ -1,64 +0,0 @@ -using PdfEditorApp.Services.Tools.Core; -using PdfEditorApp.Services.Tools.Organize; -using PdfEditorApp.Services.Tools.Security; -using PdfEditorApp.Services.Tools.Conversion; -using PdfEditorApp.Services.Tools.Intelligence; -using PdfEditorApp.ViewModels.Tools.Core; -using PdfEditorApp.ViewModels.Tools.Organize; -using PdfEditorApp.ViewModels.Tools.Security; -using PdfEditorApp.ViewModels.Tools.Conversion; -using PdfEditorApp.ViewModels.Tools.Intelligence; -using PdfEditorApp.Tests.Tools.Core; -using System.IO; -using System.Threading.Tasks; -using PdfEditorApp.Models; -using PdfEditorApp.ViewModels.Tools; -using Xunit; - -namespace PdfEditorApp.Tests.Tools.Organize; - -public class CropPdfToolTests : IClassFixture -{ - private readonly ToolTestFixture _fixture; - - public CropPdfToolTests(ToolTestFixture fixture) - { - _fixture = fixture; - } - - [Fact] - public void CropPdfTool_InstantiatesWithCorrectDefaults() - { - var vm = (CropPdfToolViewModel)_fixture.Factory.Create(PdfToolId.CropPdf); - Assert.NotNull(vm); - Assert.Equal(PdfToolId.CropPdf, vm.Tool.Id); - Assert.Equal(36, vm.CropMarginTop); - Assert.Equal(36, vm.CropMarginBottom); - } - - [Fact] - public async Task CropPdfTool_CropsPdfPagesSuccessfully() - { - string sample = ToolTestFixture.CreateSamplePdf("CropSample", 2); - try - { - var vm = (CropPdfToolViewModel)_fixture.Factory.Create(PdfToolId.CropPdf); - vm.SelectedFiles.Add(sample); - vm.SyncPreviewItems(); - vm.CropMarginTop = 15; - vm.CropMarginBottom = 15; - vm.CropMarginLeft = 10; - vm.CropMarginRight = 10; - - await vm.ExecuteToolCommand.ExecuteAsync(null); - - Assert.True(vm.IsComplete); - Assert.False(vm.HasError); - Assert.True(File.Exists(vm.LastOutputFilePath)); - } - finally - { - if (File.Exists(sample)) File.Delete(sample); - } - } -} diff --git a/tests/PdfEditorApp.Tests/Tools/Organize/MergePdfToolTests.cs b/tests/PdfEditorApp.Tests/Tools/Organize/MergePdfToolTests.cs deleted file mode 100644 index 036fd8e..0000000 --- a/tests/PdfEditorApp.Tests/Tools/Organize/MergePdfToolTests.cs +++ /dev/null @@ -1,212 +0,0 @@ -using PdfEditorApp.Services.Tools.Core; -using PdfEditorApp.Services.Tools.Organize; -using PdfEditorApp.Services.Tools.Security; -using PdfEditorApp.Services.Tools.Conversion; -using PdfEditorApp.Services.Tools.Intelligence; -using PdfEditorApp.ViewModels.Tools.Core; -using PdfEditorApp.ViewModels.Tools.Organize; -using PdfEditorApp.ViewModels.Tools.Security; -using PdfEditorApp.ViewModels.Tools.Conversion; -using PdfEditorApp.ViewModels.Tools.Intelligence; -using PdfEditorApp.Tests.Tools.Core; -using System; -using System.Collections.Generic; -using System.IO; -using System.Threading.Tasks; -using PdfEditorApp.Models; -using PdfEditorApp.ViewModels.Tools; -using Xunit; - -namespace PdfEditorApp.Tests.Tools.Organize; - -public class MergePdfToolTests : IClassFixture -{ - private readonly ToolTestFixture _fixture; - - public MergePdfToolTests(ToolTestFixture fixture) - { - _fixture = fixture; - } - - [Fact] - public void MergePdfTool_InstantiatesWithCorrectDefaults() - { - var vm = (MergePdfToolViewModel)_fixture.Factory.Create(PdfToolId.MergePdf); - Assert.NotNull(vm); - Assert.Equal(PdfToolId.MergePdf, vm.Tool.Id); - Assert.True(vm.PreserveBookmarks); - Assert.False(vm.NormalizePageSizes); - Assert.Empty(vm.SelectedFiles); - } - - [Fact] - public void MergePdfTool_ReordersAndSyncsPreviewItems() - { - var vm = (MergePdfToolViewModel)_fixture.Factory.Create(PdfToolId.MergePdf); - vm.SelectedFiles.Add("fileA.pdf"); - vm.SelectedFiles.Add("fileB.pdf"); - vm.SelectedFiles.Add("fileC.pdf"); - vm.SyncPreviewItems(); - - Assert.Equal(3, vm.SelectedFilePreviewItems.Count); - Assert.Equal("fileA.pdf", vm.SelectedFilePreviewItems[0].FileName); - Assert.Equal("#1", vm.SelectedFilePreviewItems[0].OrderIndexText); - - vm.MoveFileDownCommand.Execute("fileA.pdf"); - Assert.Equal("fileB.pdf", vm.SelectedFilePreviewItems[0].FileName); - Assert.Equal("fileA.pdf", vm.SelectedFilePreviewItems[1].FileName); - - vm.MoveFileUpCommand.Execute("fileC.pdf"); - Assert.Equal("fileC.pdf", vm.SelectedFilePreviewItems[1].FileName); - Assert.Equal("fileA.pdf", vm.SelectedFilePreviewItems[2].FileName); - - vm.RemoveFileCommand.Execute("fileC.pdf"); - Assert.Equal(2, vm.SelectedFilePreviewItems.Count); - - vm.ClearFilesCommand.Execute(null); - Assert.Empty(vm.SelectedFilePreviewItems); - Assert.Empty(vm.SelectedFiles); - } - - [Fact] - public async Task MergePdfTool_ExecutesMergeSuccessfully() - { - string tempDir = ToolTestFixture.CreateIsolatedDirectory("MergeExec"); - try - { - string file1 = ToolTestFixture.CreateSamplePdf("Doc1", 2, tempDir); - string file2 = ToolTestFixture.CreateSamplePdf("Doc2", 3, tempDir); - - var vm = (MergePdfToolViewModel)_fixture.Factory.Create(PdfToolId.MergePdf); - vm.SelectedFiles.Add(file1); - vm.SelectedFiles.Add(file2); - vm.SyncPreviewItems(); - - await vm.ExecuteToolCommand.ExecuteAsync(null); - - Assert.True(vm.IsComplete); - Assert.False(vm.HasError); - Assert.True(File.Exists(vm.LastOutputFilePath)); - - // Verify in-app output preview generation - Assert.NotNull(vm.OutputFilePreview); - Assert.Equal(5, vm.OutputFilePreview.PageCount); - Assert.Equal(5, vm.OutputPageThumbnails.Count); - Assert.Equal("Page 1 of 5", vm.OutputPageThumbnails[0].PageLabel); - Assert.Equal(1, vm.OutputPageThumbnails[0].PageNumber); - } - finally - { - if (Directory.Exists(tempDir)) Directory.Delete(tempDir, recursive: true); - } - } - - [Fact] - public async Task MergePdfTool_MergesPaddedAndWebPdfsSuccessfully() - { - string tempDir = ToolTestFixture.CreateIsolatedDirectory("MergePadded"); - try - { - string file1 = ToolTestFixture.CreatePaddedWebPdf("WebDoc1", 2, tempDir); - string file2 = ToolTestFixture.CreatePaddedWebPdf("WebDoc2", 3, tempDir); - - var vm = (MergePdfToolViewModel)_fixture.Factory.Create(PdfToolId.MergePdf); - vm.SelectedFiles.Add(file1); - vm.SelectedFiles.Add(file2); - vm.SyncPreviewItems(); - - Assert.Equal(2, vm.SelectedFilePreviewItems.Count); - Assert.Equal(5, vm.TotalSelectedPages); - - await vm.ExecuteToolCommand.ExecuteAsync(null); - - Assert.True(vm.IsComplete); - Assert.False(vm.HasError); - Assert.True(File.Exists(vm.LastOutputFilePath)); - Assert.Equal(5, vm.OutputPageThumbnails.Count); - } - finally - { - if (Directory.Exists(tempDir)) Directory.Delete(tempDir, recursive: true); - } - } - - [Fact] - public void MergePdfTool_StartOver_ResetsStateAndPreviews() - { - var vm = (MergePdfToolViewModel)_fixture.Factory.Create(PdfToolId.MergePdf); - vm.SelectedFiles.Add("sample.pdf"); - vm.SyncPreviewItems(); - Assert.True(vm.HasSelectedFiles); - - vm.StartOverCommand.Execute(null); - Assert.False(vm.HasSelectedFiles); - Assert.Empty(vm.SelectedFilePreviewItems); - Assert.Empty(vm.OutputPageThumbnails); - Assert.Null(vm.OutputFilePreview); - Assert.False(vm.IsComplete); - } - - [Fact] - public async Task MergePdfTool_SaveOutputFileAs_DoesNotThrowWhenSavingToSamePath() - { - string tempDir = ToolTestFixture.CreateIsolatedDirectory("MergeSamePath"); - try - { - string file1 = ToolTestFixture.CreateSamplePdf("Doc1", 1, tempDir); - string file2 = ToolTestFixture.CreateSamplePdf("Doc2", 1, tempDir); - - var vm = (MergePdfToolViewModel)_fixture.Factory.Create(PdfToolId.MergePdf); - vm.SelectedFiles.Add(file1); - vm.SelectedFiles.Add(file2); - await vm.ExecuteToolCommand.ExecuteAsync(null); - - Assert.True(vm.IsComplete); - Assert.True(File.Exists(vm.LastOutputFilePath)); - - // Saving to the exact same path must NOT throw IOException (self-copy) - vm.SaveOutputFileToPath(vm.LastOutputFilePath); - - Assert.True(vm.HasSavedNotification); - Assert.False(vm.HasError); - Assert.Contains("Saved successfully", vm.SavedNotificationMessage); - } - finally - { - if (Directory.Exists(tempDir)) Directory.Delete(tempDir, recursive: true); - } - } - - [Fact] - public async Task MergePdfTool_SaveOutputFileAs_HandlesLockedTargetGracefully() - { - string tempDir = ToolTestFixture.CreateIsolatedDirectory("MergeLocked"); - string file1 = ToolTestFixture.CreateSamplePdf("Doc1", 1, tempDir); - string file2 = ToolTestFixture.CreateSamplePdf("Doc2", 1, tempDir); - string lockedTarget = Path.Combine(tempDir, $"locked_target_{Guid.NewGuid():N}.pdf"); - File.WriteAllText(lockedTarget, "locked content"); - - try - { - using var lockStream = new FileStream(lockedTarget, FileMode.Open, FileAccess.ReadWrite, FileShare.None); - - var vm = (MergePdfToolViewModel)_fixture.Factory.Create(PdfToolId.MergePdf); - vm.SelectedFiles.Add(file1); - vm.SelectedFiles.Add(file2); - await vm.ExecuteToolCommand.ExecuteAsync(null); - - Assert.True(vm.IsComplete); - - // Saving to an externally locked file must NOT crash with an unhandled exception - vm.SaveOutputFileToPath(lockedTarget); - - Assert.False(vm.HasSavedNotification); - Assert.True(vm.HasError); - Assert.Contains("currently open or in use", vm.ErrorMessage); - } - finally - { - if (Directory.Exists(tempDir)) Directory.Delete(tempDir, recursive: true); - } - } -} diff --git a/tests/PdfEditorApp.Tests/Tools/Organize/OrganizePdfToolTests.cs b/tests/PdfEditorApp.Tests/Tools/Organize/OrganizePdfToolTests.cs deleted file mode 100644 index a72fcc5..0000000 --- a/tests/PdfEditorApp.Tests/Tools/Organize/OrganizePdfToolTests.cs +++ /dev/null @@ -1,88 +0,0 @@ -using PdfEditorApp.Services.Tools.Core; -using PdfEditorApp.Services.Tools.Organize; -using PdfEditorApp.Services.Tools.Security; -using PdfEditorApp.Services.Tools.Conversion; -using PdfEditorApp.Services.Tools.Intelligence; -using PdfEditorApp.ViewModels.Tools.Core; -using PdfEditorApp.ViewModels.Tools.Organize; -using PdfEditorApp.ViewModels.Tools.Security; -using PdfEditorApp.ViewModels.Tools.Conversion; -using PdfEditorApp.ViewModels.Tools.Intelligence; -using PdfEditorApp.Tests.Tools.Core; -using System.IO; -using System.Threading.Tasks; -using PdfEditorApp.Models; -using PdfEditorApp.ViewModels.Tools; -using Xunit; - -namespace PdfEditorApp.Tests.Tools.Organize; - -public class OrganizePdfToolTests : IClassFixture -{ - private readonly ToolTestFixture _fixture; - - public OrganizePdfToolTests(ToolTestFixture fixture) - { - _fixture = fixture; - } - - [Fact] - public void OrganizePdfTool_InstantiatesWithCorrectDefaults() - { - var vm = (OrganizePdfToolViewModel)_fixture.Factory.Create(PdfToolId.OrganizePdf); - Assert.NotNull(vm); - Assert.Equal(PdfToolId.OrganizePdf, vm.Tool.Id); - } - - [Fact] - public async Task OrganizePdfTool_ReordersPagesSuccessfully() - { - string sample = ToolTestFixture.CreateSamplePdf("OrganizeSample", 3); - try - { - var vm = (OrganizePdfToolViewModel)_fixture.Factory.Create(PdfToolId.OrganizePdf); - vm.SelectedFiles.Add(sample); - vm.SyncPreviewItems(); - // This standalone view has no reorder UI yet — set a real order directly to - // exercise the underlying reorder logic (see the honesty-fix test below for - // what happens without one). - vm.PageOrder = new System.Collections.Generic.List { 2, 1, 0 }; - - await vm.ExecuteToolCommand.ExecuteAsync(null); - - Assert.True(vm.IsComplete); - Assert.False(vm.HasError); - Assert.True(File.Exists(vm.LastOutputFilePath)); - } - finally - { - if (File.Exists(sample)) File.Delete(sample); - } - } - - [Fact] - public async Task OrganizePdfTool_NoOrderOrDeletionSet_ReportsHonestFailure_NotFakeSuccess() - { - // Regression guard: this standalone view has no reorder/delete/rotate controls, so - // PageOrder/PagesToDelete are always empty here. Before the fix, running the tool - // still claimed "Organized PDF to N pages" success while silently saving an - // unchanged copy of the input. - string sample = ToolTestFixture.CreateSamplePdf("OrganizeNoOpSample", 3); - try - { - var vm = (OrganizePdfToolViewModel)_fixture.Factory.Create(PdfToolId.OrganizePdf); - vm.SelectedFiles.Add(sample); - vm.SyncPreviewItems(); - - await vm.ExecuteToolCommand.ExecuteAsync(null); - - Assert.True(vm.HasError); - Assert.False(vm.IsComplete); - Assert.Contains("Pages Sidebar", vm.ErrorMessage); - } - finally - { - if (File.Exists(sample)) File.Delete(sample); - } - } -} diff --git a/tests/PdfEditorApp.Tests/Tools/Organize/PageNumbersToolTests.cs b/tests/PdfEditorApp.Tests/Tools/Organize/PageNumbersToolTests.cs deleted file mode 100644 index e1284da..0000000 --- a/tests/PdfEditorApp.Tests/Tools/Organize/PageNumbersToolTests.cs +++ /dev/null @@ -1,60 +0,0 @@ -using PdfEditorApp.Services.Tools.Core; -using PdfEditorApp.Services.Tools.Organize; -using PdfEditorApp.Services.Tools.Security; -using PdfEditorApp.Services.Tools.Conversion; -using PdfEditorApp.Services.Tools.Intelligence; -using PdfEditorApp.ViewModels.Tools.Core; -using PdfEditorApp.ViewModels.Tools.Organize; -using PdfEditorApp.ViewModels.Tools.Security; -using PdfEditorApp.ViewModels.Tools.Conversion; -using PdfEditorApp.ViewModels.Tools.Intelligence; -using PdfEditorApp.Tests.Tools.Core; -using System.IO; -using System.Threading.Tasks; -using PdfEditorApp.Models; -using PdfEditorApp.ViewModels.Tools; -using Xunit; - -namespace PdfEditorApp.Tests.Tools.Organize; - -public class PageNumbersToolTests : IClassFixture -{ - private readonly ToolTestFixture _fixture; - - public PageNumbersToolTests(ToolTestFixture fixture) - { - _fixture = fixture; - } - - [Fact] - public void PageNumbersTool_InstantiatesWithCorrectDefaults() - { - var vm = (PageNumbersToolViewModel)_fixture.Factory.Create(PdfToolId.PageNumbers); - Assert.NotNull(vm); - Assert.Equal(PdfToolId.PageNumbers, vm.Tool.Id); - Assert.Equal(PageNumberPosition.BottomCenter, vm.Position); - Assert.Equal("Page {n} of {total}", vm.Template); - } - - [Fact] - public async Task PageNumbersTool_StampsPageNumbersSuccessfully() - { - string sample = ToolTestFixture.CreateSamplePdf("PageNumSample", 3); - try - { - var vm = (PageNumbersToolViewModel)_fixture.Factory.Create(PdfToolId.PageNumbers); - vm.SelectedFiles.Add(sample); - vm.SyncPreviewItems(); - - await vm.ExecuteToolCommand.ExecuteAsync(null); - - Assert.True(vm.IsComplete); - Assert.False(vm.HasError); - Assert.True(File.Exists(vm.LastOutputFilePath)); - } - finally - { - if (File.Exists(sample)) File.Delete(sample); - } - } -} diff --git a/tests/PdfEditorApp.Tests/Tools/Organize/RotatePdfToolTests.cs b/tests/PdfEditorApp.Tests/Tools/Organize/RotatePdfToolTests.cs deleted file mode 100644 index c7f0b58..0000000 --- a/tests/PdfEditorApp.Tests/Tools/Organize/RotatePdfToolTests.cs +++ /dev/null @@ -1,90 +0,0 @@ -using PdfEditorApp.Services.Tools.Core; -using PdfEditorApp.Services.Tools.Organize; -using PdfEditorApp.Services.Tools.Security; -using PdfEditorApp.Services.Tools.Conversion; -using PdfEditorApp.Services.Tools.Intelligence; -using PdfEditorApp.ViewModels.Tools.Core; -using PdfEditorApp.ViewModels.Tools.Organize; -using PdfEditorApp.ViewModels.Tools.Security; -using PdfEditorApp.ViewModels.Tools.Conversion; -using PdfEditorApp.ViewModels.Tools.Intelligence; -using PdfEditorApp.Tests.Tools.Core; -using System.IO; -using System.Threading.Tasks; -using PdfEditorApp.Models; -using PdfEditorApp.Services; -using PdfEditorApp.ViewModels.Tools; -using Xunit; - -namespace PdfEditorApp.Tests.Tools.Organize; - -public class RotatePdfToolTests : IClassFixture -{ - private readonly ToolTestFixture _fixture; - - public RotatePdfToolTests(ToolTestFixture fixture) - { - _fixture = fixture; - } - - [Fact] - public void RotatePdfTool_InstantiatesWithCorrectDefaults() - { - var vm = (RotatePdfToolViewModel)_fixture.Factory.Create(PdfToolId.RotatePdf); - Assert.NotNull(vm); - Assert.Equal(PdfToolId.RotatePdf, vm.Tool.Id); - Assert.Equal(90, vm.RotationDegrees); - Assert.Equal(PageFilterTarget.All, vm.TargetFilter); - } - - [Fact] - public async Task RotatePdfTool_ExecutesRotationSuccessfully() - { - string sample = ToolTestFixture.CreateSamplePdf("RotateSample", 2); - try - { - var vm = (RotatePdfToolViewModel)_fixture.Factory.Create(PdfToolId.RotatePdf); - vm.SelectedFiles.Add(sample); - vm.SyncPreviewItems(); - vm.RotationDegrees = 180; - - await vm.ExecuteToolCommand.ExecuteAsync(null); - - Assert.True(vm.IsComplete); - Assert.False(vm.HasError); - Assert.True(File.Exists(vm.LastOutputFilePath)); - } - finally - { - if (File.Exists(sample)) File.Delete(sample); - } - } - - [Fact] - public async Task RotatePdfTool_MultiFileBatch_ProcessesEveryFile_NotJustTheFirst() - { - string sample1 = ToolTestFixture.CreateSamplePdf("RotateBatch1", 1); - string sample2 = ToolTestFixture.CreateSamplePdf("RotateBatch2", 1); - try - { - var vm = (RotatePdfToolViewModel)_fixture.Factory.Create(PdfToolId.RotatePdf); - vm.SelectedFiles.Add(sample1); - vm.SelectedFiles.Add(sample2); - vm.SyncPreviewItems(); - vm.RotationDegrees = 90; - - await vm.ExecuteToolCommand.ExecuteAsync(null); - - Assert.True(vm.IsComplete); - Assert.False(vm.HasError); - // Regression guard: before the fix, only the first selected file was ever - // processed and the batch outcome was indistinguishable from a single-file run. - Assert.Contains("2 of 2", vm.ResultSummaryMessage); - } - finally - { - if (File.Exists(sample1)) File.Delete(sample1); - if (File.Exists(sample2)) File.Delete(sample2); - } - } -} diff --git a/tests/PdfEditorApp.Tests/Tools/Organize/SplitPdfToolTests.cs b/tests/PdfEditorApp.Tests/Tools/Organize/SplitPdfToolTests.cs deleted file mode 100644 index 883ba13..0000000 --- a/tests/PdfEditorApp.Tests/Tools/Organize/SplitPdfToolTests.cs +++ /dev/null @@ -1,88 +0,0 @@ -using PdfEditorApp.Services.Tools.Core; -using PdfEditorApp.Services.Tools.Organize; -using PdfEditorApp.Services.Tools.Security; -using PdfEditorApp.Services.Tools.Conversion; -using PdfEditorApp.Services.Tools.Intelligence; -using PdfEditorApp.ViewModels.Tools.Core; -using PdfEditorApp.ViewModels.Tools.Organize; -using PdfEditorApp.ViewModels.Tools.Security; -using PdfEditorApp.ViewModels.Tools.Conversion; -using PdfEditorApp.ViewModels.Tools.Intelligence; -using PdfEditorApp.Tests.Tools.Core; -using System.IO; -using System.Threading.Tasks; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Models; -using PdfEditorApp.ViewModels.Tools; -using Xunit; - -namespace PdfEditorApp.Tests.Tools.Organize; - -public class SplitPdfToolTests : IClassFixture -{ - private readonly ToolTestFixture _fixture; - - public SplitPdfToolTests(ToolTestFixture fixture) - { - _fixture = fixture; - } - - [Fact] - public void SplitPdfTool_InstantiatesWithCorrectDefaults() - { - var vm = (SplitPdfToolViewModel)_fixture.Factory.Create(PdfToolId.SplitPdf); - Assert.NotNull(vm); - Assert.Equal(PdfToolId.SplitPdf, vm.Tool.Id); - Assert.Equal(SplitExtractMode.SplitEveryNPages, vm.SplitMode); - Assert.Equal(1, vm.SplitPagesInterval); - } - - [Fact] - public async Task SplitPdfTool_SplitsEveryPageSuccessfully() - { - string sample = ToolTestFixture.CreateSamplePdf("SplitSample", 4); - try - { - var vm = (SplitPdfToolViewModel)_fixture.Factory.Create(PdfToolId.SplitPdf); - vm.SelectedFiles.Add(sample); - vm.SyncPreviewItems(); - vm.SplitPagesInterval = 2; - - await vm.ExecuteToolCommand.ExecuteAsync(null); - - Assert.True(vm.IsComplete); - Assert.False(vm.HasError); - } - finally - { - if (File.Exists(sample)) File.Delete(sample); - } - } - - [Fact] - public async Task SplitPdfTool_SplitByPageRangesMode_HonorsRangeExpression() - { - // Regression guard: SplitMode had no UI control to set it, so the tool always - // fell back to "every N pages" regardless of the (also-visible) range textbox. - string sample = ToolTestFixture.CreateSamplePdf("SplitRangeSample", 10); - try - { - var vm = (SplitPdfToolViewModel)_fixture.Factory.Create(PdfToolId.SplitPdf); - vm.SelectedFiles.Add(sample); - vm.SyncPreviewItems(); - vm.SplitMode = SplitExtractMode.SplitByPageRanges; - vm.SplitRangeExpression = "1-3, 5, 7-10"; - - await vm.ExecuteToolCommand.ExecuteAsync(null); - - Assert.True(vm.IsComplete); - Assert.False(vm.HasError); - // Three distinct range groups (1-3 / 5 / 7-10) => 3 output files, not 10. - Assert.Contains("into 3 files", vm.ResultSummaryMessage); - } - finally - { - if (File.Exists(sample)) File.Delete(sample); - } - } -} diff --git a/tests/PdfEditorApp.Tests/Tools/Security/CompressPdfToolTests.cs b/tests/PdfEditorApp.Tests/Tools/Security/CompressPdfToolTests.cs deleted file mode 100644 index 0ff57ca..0000000 --- a/tests/PdfEditorApp.Tests/Tools/Security/CompressPdfToolTests.cs +++ /dev/null @@ -1,125 +0,0 @@ -using PdfEditorApp.Services.Tools.Core; -using PdfEditorApp.Services.Tools.Organize; -using PdfEditorApp.Services.Tools.Security; -using PdfEditorApp.Services.Tools.Conversion; -using PdfEditorApp.Services.Tools.Intelligence; -using PdfEditorApp.ViewModels.Tools.Core; -using PdfEditorApp.ViewModels.Tools.Organize; -using PdfEditorApp.ViewModels.Tools.Security; -using PdfEditorApp.ViewModels.Tools.Conversion; -using PdfEditorApp.ViewModels.Tools.Intelligence; -using PdfEditorApp.Tests.Tools.Core; -using System.IO; -using System.Threading.Tasks; -using PdfEditorApp.Models; -using PdfEditorApp.ViewModels.Tools; -using Xunit; - -namespace PdfEditorApp.Tests.Tools.Security; - -public class CompressPdfToolTests : IClassFixture -{ - private readonly ToolTestFixture _fixture; - - public CompressPdfToolTests(ToolTestFixture fixture) - { - _fixture = fixture; - } - - [Fact] - public void CompressPdfTool_InstantiatesWithCorrectDefaults() - { - var vm = (CompressPdfToolViewModel)_fixture.Factory.Create(PdfToolId.CompressPdf); - Assert.NotNull(vm); - Assert.Equal(PdfToolId.CompressPdf, vm.Tool.Id); - Assert.Equal(PdfCompressionLevel.Balanced, vm.CompressionLevel); - Assert.Equal(150, vm.ImageQualityDpi); - } - - [Fact] - public async Task CompressPdfTool_ExecutesCompressionSuccessfully() - { - string sample = ToolTestFixture.CreateSamplePdf("CompressSample", 3); - try - { - var vm = (CompressPdfToolViewModel)_fixture.Factory.Create(PdfToolId.CompressPdf); - vm.SelectedFiles.Add(sample); - vm.SyncPreviewItems(); - vm.CompressionLevel = PdfCompressionLevel.MaximumCompression; - - await vm.ExecuteToolCommand.ExecuteAsync(null); - - Assert.True(vm.IsComplete); - Assert.False(vm.HasError); - Assert.True(File.Exists(vm.LastOutputFilePath)); - } - finally - { - if (File.Exists(sample)) File.Delete(sample); - } - } - - [Fact] - public void CompressPdfTool_CustomMode_ClampsValuesAndProvidesHelpfulFeedback() - { - var vm = (CompressPdfToolViewModel)_fixture.Factory.Create(PdfToolId.CompressPdf); - - // Test Preset Selection - vm.SelectPreset("extreme"); - Assert.True(vm.IsExtremeCompression); - Assert.Equal(96, vm.ImageQualityDpi); - Assert.Equal(52, vm.JpegQuality); - - vm.SelectPreset("recommended"); - Assert.True(vm.IsRecommendedCompression); - Assert.Equal(125, vm.ImageQualityDpi); - Assert.Equal(66, vm.JpegQuality); - - // Test Custom Mode & Dynamic Warning on low DPI - vm.SelectPreset("custom"); - Assert.True(vm.IsCustomMode); - - vm.ImageQualityDpi = 40; // Should be clamped to 50 - Assert.Equal(50, vm.ImageQualityDpi); - Assert.Equal("Warning", vm.QualityFeedbackSeverity); - Assert.Contains("Low DPI", vm.QualityFeedbackMessage); - - // Test Low JPEG Quality Warning - vm.ImageQualityDpi = 150; - vm.JpegQuality = 30; - Assert.Equal("Warning", vm.QualityFeedbackSeverity); - Assert.Contains("Low JPEG Quality", vm.QualityFeedbackMessage); - - // Test Grayscale feedback - vm.JpegQuality = 75; - vm.ConvertToGrayscale = true; - Assert.Equal("Success", vm.QualityFeedbackSeverity); - Assert.Contains("Grayscale", vm.QualityFeedbackMessage); - } - - [Fact] - public async Task CompressPdfTool_ExecutesCustomCompressionWithGrayscaleSuccessfully() - { - string sample = ToolTestFixture.CreateSamplePdf("CompressCustomSample", 2); - try - { - var vm = (CompressPdfToolViewModel)_fixture.Factory.Create(PdfToolId.CompressPdf); - vm.SelectedFiles.Add(sample); - vm.SyncPreviewItems(); - vm.SelectPreset("custom"); - vm.ImageQualityDpi = 100; - vm.JpegQuality = 55; - vm.ConvertToGrayscale = true; - - await vm.ExecuteToolCommand.ExecuteAsync(null); - - Assert.True(vm.IsComplete); - Assert.False(vm.HasError); - Assert.True(File.Exists(vm.LastOutputFilePath)); - } - finally - { - if (File.Exists(sample)) File.Delete(sample); - } - } -} diff --git a/tests/PdfEditorApp.Tests/Tools/Security/ProtectPdfToolTests.cs b/tests/PdfEditorApp.Tests/Tools/Security/ProtectPdfToolTests.cs deleted file mode 100644 index 8d6d42e..0000000 --- a/tests/PdfEditorApp.Tests/Tools/Security/ProtectPdfToolTests.cs +++ /dev/null @@ -1,106 +0,0 @@ -using PdfEditorApp.Services.Tools.Core; -using PdfEditorApp.Services.Tools.Organize; -using PdfEditorApp.Services.Tools.Security; -using PdfEditorApp.Services.Tools.Conversion; -using PdfEditorApp.Services.Tools.Intelligence; -using PdfEditorApp.ViewModels.Tools.Core; -using PdfEditorApp.ViewModels.Tools.Organize; -using PdfEditorApp.ViewModels.Tools.Security; -using PdfEditorApp.ViewModels.Tools.Conversion; -using PdfEditorApp.ViewModels.Tools.Intelligence; -using PdfEditorApp.Tests.Tools.Core; -using System.IO; -using System.Linq; -using System.Threading.Tasks; -using PdfEditorApp.Models; -using PdfEditorApp.ViewModels.Tools; -using PdfSharpCore.Pdf.IO; -using Xunit; - -namespace PdfEditorApp.Tests.Tools.Security; - -public class ProtectPdfToolTests : IClassFixture -{ - private readonly ToolTestFixture _fixture; - - public ProtectPdfToolTests(ToolTestFixture fixture) - { - _fixture = fixture; - } - - [Fact] - public void ProtectPdfTool_InstantiatesWithCorrectDefaults() - { - var vm = (ProtectPdfToolViewModel)_fixture.Factory.Create(PdfToolId.ProtectPdf); - Assert.NotNull(vm); - Assert.Equal(PdfToolId.ProtectPdf, vm.Tool.Id); - Assert.True(vm.AllowPrinting); - Assert.False(vm.AllowCopying); - } - - [Fact] - public async Task ProtectPdfTool_ProtectsWithPasswordSuccessfully() - { - string sample = ToolTestFixture.CreateSamplePdf("ProtectSample", 2); - try - { - var vm = (ProtectPdfToolViewModel)_fixture.Factory.Create(PdfToolId.ProtectPdf); - vm.SelectedFiles.Add(sample); - vm.SyncPreviewItems(); - vm.UserPassword = "Password123"; - - await vm.ExecuteToolCommand.ExecuteAsync(null); - - Assert.True(vm.IsComplete); - Assert.False(vm.HasError); - Assert.True(File.Exists(vm.LastOutputFilePath)); - } - finally - { - if (File.Exists(sample)) File.Delete(sample); - } - } - - [Fact] - public async Task ProtectPdfTool_OwnerPasswordIsNotDerivedFromUserPassword() - { - // Regression guard: the owner password used to be `{userPassword}_admin` — a fixed, - // guessable pattern. Anyone who had the "open" (user) password could compute full - // owner rights and strip every permission restriction. It must now be unguessable. - string sample = ToolTestFixture.CreateSamplePdf("ProtectSecuritySample", 1); - string? outputPath = null; - try - { - var vm = (ProtectPdfToolViewModel)_fixture.Factory.Create(PdfToolId.ProtectPdf); - vm.SelectedFiles.Add(sample); - vm.SyncPreviewItems(); - vm.UserPassword = "OpenMe123"; - vm.AllowModifying = false; - vm.AllowCopying = false; - - await vm.ExecuteToolCommand.ExecuteAsync(null); - - Assert.True(vm.IsComplete); - Assert.False(vm.HasError); - outputPath = vm.LastOutputFilePath; - Assert.True(File.Exists(outputPath)); - - // The old vulnerable derivation must no longer grant owner access. - string guessedOwnerPassword = "OpenMe123_admin"; - Assert.Throws(() => - PdfReader.Open(outputPath, guessedOwnerPassword, PdfDocumentOpenMode.Modify)); - - // The genuinely-generated owner password (surfaced in the result message) must work. - string realOwnerPassword = vm.ResultSummaryMessage.Split(':').Last().Trim(); - Assert.NotEmpty(realOwnerPassword); - Assert.NotEqual(guessedOwnerPassword, realOwnerPassword); - using var doc = PdfReader.Open(outputPath, realOwnerPassword, PdfDocumentOpenMode.Modify); - Assert.True(doc.SecuritySettings.HasOwnerPermissions); - } - finally - { - if (File.Exists(sample)) File.Delete(sample); - if (outputPath != null && File.Exists(outputPath)) File.Delete(outputPath); - } - } -} diff --git a/tests/PdfEditorApp.Tests/Tools/Security/QuestPdfOperationsTests.cs b/tests/PdfEditorApp.Tests/Tools/Security/QuestPdfOperationsTests.cs deleted file mode 100644 index b961457..0000000 --- a/tests/PdfEditorApp.Tests/Tools/Security/QuestPdfOperationsTests.cs +++ /dev/null @@ -1,264 +0,0 @@ -using PdfEditorApp.Services.Tools.Core; -using PdfEditorApp.Services.Tools.Organize; -using PdfEditorApp.Services.Tools.Security; -using PdfEditorApp.Services.Tools.Conversion; -using PdfEditorApp.Services.Tools.Intelligence; -using PdfEditorApp.ViewModels.Tools.Core; -using PdfEditorApp.ViewModels.Tools.Organize; -using PdfEditorApp.ViewModels.Tools.Security; -using PdfEditorApp.ViewModels.Tools.Conversion; -using PdfEditorApp.ViewModels.Tools.Intelligence; -using PdfEditorApp.Tests.Tools.Core; -using System; -using System.Collections.Generic; -using System.IO; -using System.Threading.Tasks; -using PdfEditorApp.Models; -using PdfEditorApp.Services.Tools; -using UglyToad.PdfPig; -using Xunit; - -namespace PdfEditorApp.Tests.Tools.Security; - -public class QuestPdfOperationsTests -{ - private readonly IQuestPdfOperationsEngine _questEngine = new QuestPdfOperationsEngine(); - - [Fact] - public async Task MergeAsync_CombinesMultiplePdfs_Successfully() - { - string tempDir = ToolTestFixture.CreateIsolatedDirectory("QuestMerge"); - try - { - string file1 = ToolTestFixture.CreateSamplePdf("QuestMerge1", 2, tempDir); - string file2 = ToolTestFixture.CreateSamplePdf("QuestMerge2", 3, tempDir); - - var options = new MergeToolOptions - { - InputFiles = new List { file1, file2 }, - Engine = PdfProcessingEngine.QuestPdfNative - }; - - var result = await _questEngine.MergeAsync(options); - - Assert.True(result.Success); - Assert.NotNull(result.OutputFilePath); - string outFile = result.OutputFilePath; - Assert.True(File.Exists(outFile)); - - using var doc = PdfDocument.Open(outFile); - Assert.Equal(5, doc.NumberOfPages); - } - finally - { - if (Directory.Exists(tempDir)) Directory.Delete(tempDir, recursive: true); - } - } - - [Fact] - public async Task MergeAsync_WithPerFilePageRanges_ExtractsAndMergesCorrectPages() - { - string tempDir = ToolTestFixture.CreateIsolatedDirectory("QuestRange"); - try - { - string file1 = ToolTestFixture.CreateSamplePdf("QuestRange1", 3, tempDir); - string file2 = ToolTestFixture.CreateSamplePdf("QuestRange2", 2, tempDir); - - var options = new MergeToolOptions - { - InputFiles = new List { file1, file2 }, - Engine = PdfProcessingEngine.QuestPdfNative, - FilePageRanges = new Dictionary - { - [file1] = "1,3", // Take pages 1 and 3 from doc 1 - [file2] = "2" // Take page 2 from doc 2 - } - }; - - var result = await _questEngine.MergeAsync(options); - - Assert.True(result.Success); - Assert.NotNull(result.OutputFilePath); - string outFile = result.OutputFilePath; - Assert.True(File.Exists(outFile)); - - using var doc = PdfDocument.Open(outFile); - Assert.Equal(3, doc.NumberOfPages); - } - finally - { - if (Directory.Exists(tempDir)) Directory.Delete(tempDir, recursive: true); - } - } - - [Fact] - public async Task EncryptAndDecrypt_Aes256Bit_ProtectsAndUnlocksDocument() - { - string sample = ToolTestFixture.CreateSamplePdf("QuestCrypto", 2); - string? protectedFile = null; - string? unlockedFile = null; - const string password = "TestSecurePassword2026!"; - - try - { - var encryptOptions = new SecurityToolOptions - { - InputFilePath = sample, - UserPassword = password, - EncryptionLevel = PdfEncryptionLevel.Aes256Bit, - Engine = PdfProcessingEngine.QuestPdfNative, - AllowPrinting = true, - AllowModifying = false - }; - - var encryptResult = await _questEngine.EncryptAsync(encryptOptions); - Assert.True(encryptResult.Success); - protectedFile = encryptResult.OutputFilePath; - Assert.True(File.Exists(protectedFile)); - - // Verify document requires password to open - Assert.ThrowsAny(() => - { - using var _ = PdfDocument.Open(protectedFile); - }); - - // Decrypt and remove restrictions using QuestPDF - var unlockOptions = new UnlockToolOptions - { - InputFilePath = protectedFile, - Password = password, - Engine = PdfProcessingEngine.QuestPdfNative - }; - - var unlockResult = await _questEngine.DecryptAsync(unlockOptions); - Assert.True(unlockResult.Success); - unlockedFile = unlockResult.OutputFilePath; - Assert.True(File.Exists(unlockedFile)); - - // Verify unlocked file opens cleanly without password - using var unlockedDoc = PdfDocument.Open(unlockedFile); - Assert.Equal(2, unlockedDoc.NumberOfPages); - } - finally - { - if (File.Exists(sample)) File.Delete(sample); - if (protectedFile != null && File.Exists(protectedFile)) File.Delete(protectedFile); - if (unlockedFile != null && File.Exists(unlockedFile)) File.Delete(unlockedFile); - } - } - - [Fact] - public async Task LinearizeAsync_OptimizesDocumentForFastWebView() - { - string sample = ToolTestFixture.CreateSamplePdf("QuestLinearize", 2); - string? linFile = null; - - try - { - linFile = Path.Combine(Path.GetTempPath(), $"Linearized_{Guid.NewGuid():N}.pdf"); - var result = await _questEngine.LinearizeAsync(sample, linFile); - - Assert.True(result.Success); - Assert.True(File.Exists(linFile)); - Assert.True(new FileInfo(linFile).Length > 0); - - // Document must remain fully valid and openable - using var doc = PdfDocument.Open(linFile); - Assert.Equal(2, doc.NumberOfPages); - } - finally - { - if (File.Exists(sample)) File.Delete(sample); - if (linFile != null && File.Exists(linFile)) File.Delete(linFile); - } - } - - [Fact] - public async Task ApplyLayerAsync_LayersOverlayPdf_Successfully() - { - string basePdf = ToolTestFixture.CreateSamplePdf("QuestBase", 2); - string overlayPdf = ToolTestFixture.CreateSamplePdf("QuestOverlay", 1); - string? layeredFile = null; - - try - { - var result = await _questEngine.ApplyLayerAsync( - inputPath: basePdf, - layerPdfPath: overlayPdf, - isOverlay: true, - targetPages: "1-z"); - - Assert.True(result.Success); - layeredFile = result.OutputFilePath; - Assert.NotNull(layeredFile); - Assert.True(File.Exists(layeredFile)); - - using var doc = PdfDocument.Open(layeredFile); - Assert.Equal(2, doc.NumberOfPages); - } - finally - { - if (File.Exists(basePdf)) File.Delete(basePdf); - if (File.Exists(overlayPdf)) File.Delete(overlayPdf); - if (layeredFile != null && File.Exists(layeredFile)) File.Delete(layeredFile); - } - } - - [Fact] - public async Task AddAttachmentAsync_EmbedsFileAttachment_Successfully() - { - string basePdf = ToolTestFixture.CreateSamplePdf("QuestAttachmentDoc", 1); - string tempAttachment = Path.Combine(Path.GetTempPath(), $"invoice_{Guid.NewGuid():N}.xml"); - File.WriteAllText(tempAttachment, "1234599.99"); - string? attachedFile = null; - - try - { - var result = await _questEngine.AddAttachmentAsync( - inputPath: basePdf, - attachmentFilePath: tempAttachment, - description: "ZUGFeRD Electronic Invoice XML", - mimeType: "text/xml"); - - Assert.True(result.Success); - attachedFile = result.OutputFilePath; - Assert.NotNull(attachedFile); - Assert.True(File.Exists(attachedFile)); - - using var doc = PdfDocument.Open(attachedFile); - Assert.Equal(1, doc.NumberOfPages); - } - finally - { - if (File.Exists(basePdf)) File.Delete(basePdf); - if (File.Exists(tempAttachment)) File.Delete(tempAttachment); - if (attachedFile != null && File.Exists(attachedFile)) File.Delete(attachedFile); - } - } - - [Fact] - public async Task ExtendMetadataAsync_ExtendsXmpMetadata_Successfully() - { - string basePdf = ToolTestFixture.CreateSamplePdf("QuestMetadataDoc", 1); - string customXmp = ""; - string? metaFile = null; - - try - { - var result = await _questEngine.ExtendMetadataAsync(basePdf, customXmp); - - Assert.True(result.Success); - metaFile = result.OutputFilePath; - Assert.NotNull(metaFile); - Assert.True(File.Exists(metaFile)); - - using var doc = PdfDocument.Open(metaFile); - Assert.Equal(1, doc.NumberOfPages); - } - finally - { - if (File.Exists(basePdf)) File.Delete(basePdf); - if (metaFile != null && File.Exists(metaFile)) File.Delete(metaFile); - } - } -} diff --git a/tests/PdfEditorApp.Tests/Tools/Security/RedactPdfToolTests.cs b/tests/PdfEditorApp.Tests/Tools/Security/RedactPdfToolTests.cs deleted file mode 100644 index 5799bd5..0000000 --- a/tests/PdfEditorApp.Tests/Tools/Security/RedactPdfToolTests.cs +++ /dev/null @@ -1,423 +0,0 @@ -using PdfEditorApp.Services.Tools.Core; -using PdfEditorApp.Services.Tools.Organize; -using PdfEditorApp.Services.Tools.Security; -using PdfEditorApp.Services.Tools.Conversion; -using PdfEditorApp.Services.Tools.Intelligence; -using PdfEditorApp.ViewModels.Tools.Core; -using PdfEditorApp.ViewModels.Tools.Organize; -using PdfEditorApp.ViewModels.Tools.Security; -using PdfEditorApp.ViewModels.Tools.Conversion; -using PdfEditorApp.ViewModels.Tools.Intelligence; -using PdfEditorApp.Tests.Tools.Core; -using System; -using System.IO; -using System.Threading.Tasks; -using Avalonia; -using PdfEditorApp.Models; -using PdfEditorApp.ViewModels.Tools; -using Xunit; - -namespace PdfEditorApp.Tests.Tools.Security; - -public class RedactPdfToolTests : IClassFixture -{ - private readonly ToolTestFixture _fixture; - - public RedactPdfToolTests(ToolTestFixture fixture) - { - _fixture = fixture; - } - - [Fact] - public void RedactPdfTool_InstantiatesWithCorrectDefaults() - { - var vm = (RedactPdfToolViewModel)_fixture.Factory.Create(PdfToolId.RedactPdf); - Assert.NotNull(vm); - Assert.Equal(PdfToolId.RedactPdf, vm.Tool.Id); - Assert.True(vm.PermanentScrubText); - Assert.Equal("CONFIDENTIAL", vm.SearchPattern); - Assert.Empty(vm.Marks); - Assert.False(vm.HasMarks); - Assert.Equal(1.0, vm.Preview.ZoomLevel); - } - - [Fact] - public void RedactPdfTool_ZoomIn_And_ZoomOut_Clamp() - { - var vm = (RedactPdfToolViewModel)_fixture.Factory.Create(PdfToolId.RedactPdf); - - vm.Preview.ZoomInCommand.Execute(null); - Assert.True(vm.Preview.ZoomLevel > 1.0); - - // Clamp at the top. - for (int i = 0; i < 20; i++) vm.Preview.ZoomInCommand.Execute(null); - Assert.Equal(3.0, vm.Preview.ZoomLevel); - Assert.False(vm.Preview.CanZoomIn); - - for (int i = 0; i < 20; i++) vm.Preview.ZoomOutCommand.Execute(null); - Assert.Equal(0.5, vm.Preview.ZoomLevel); - Assert.False(vm.Preview.CanZoomOut); - } - - [Fact] - public async Task RedactPdfTool_ZoomChange_RepositionsExistingMarkHighlights() - { - string sample = ToolTestFixture.CreateSamplePdf("RedactZoomRepositionSample", 1); - try - { - var vm = (RedactPdfToolViewModel)_fixture.Factory.Create(PdfToolId.RedactPdf); - vm.SelectedFiles.Add(sample); - vm.SyncPreviewItems(); - await WaitForPreviewAsync(vm); - - vm.SearchPattern = "CONFIDENTIAL"; - await vm.FindAndMarkCommand.ExecuteAsync(null); - Assert.True(vm.CurrentPageMarks.Count > 0); - double originalDisplayX = vm.CurrentPageMarks[0].DisplayX; - - vm.Preview.ZoomInCommand.Execute(null); - - // Recomputed synchronously as soon as ZoomLevel changes, ahead of the - // debounced re-render — the highlight must track the new scale immediately. - Assert.True(vm.CurrentPageMarks.Count > 0); - Assert.NotEqual(originalDisplayX, vm.CurrentPageMarks[0].DisplayX); - } - finally - { - if (File.Exists(sample)) File.Delete(sample); - } - } - - [Fact] - public async Task RedactPdfTool_FindAndMark_PopulatesMarksList() - { - string sample = ToolTestFixture.CreateSamplePdf("RedactFindMarkSample", 1); - try - { - var vm = (RedactPdfToolViewModel)_fixture.Factory.Create(PdfToolId.RedactPdf); - vm.SelectedFiles.Add(sample); - vm.SyncPreviewItems(); - vm.SearchPattern = "CONFIDENTIAL"; - - await vm.FindAndMarkCommand.ExecuteAsync(null); - - Assert.True(vm.HasMarks); - Assert.NotEmpty(vm.Marks); - Assert.Contains("Marked", vm.SearchStatusMessage); - } - finally - { - if (File.Exists(sample)) File.Delete(sample); - } - } - - [Fact] - public async Task RedactPdfTool_FindAndMark_DoesNotDuplicateOnRepeatedSearch() - { - string sample = ToolTestFixture.CreateSamplePdf("RedactNoDupSample", 1); - try - { - var vm = (RedactPdfToolViewModel)_fixture.Factory.Create(PdfToolId.RedactPdf); - vm.SelectedFiles.Add(sample); - vm.SyncPreviewItems(); - vm.SearchPattern = "CONFIDENTIAL"; - - await vm.FindAndMarkCommand.ExecuteAsync(null); - int firstCount = vm.Marks.Count; - Assert.True(firstCount > 0); - - await vm.FindAndMarkCommand.ExecuteAsync(null); - - Assert.Equal(firstCount, vm.Marks.Count); - Assert.Contains("already marked", vm.SearchStatusMessage); - } - finally - { - if (File.Exists(sample)) File.Delete(sample); - } - } - - [Fact] - public async Task RedactPdfTool_RemoveMark_And_ClearMarks_Work() - { - string sample = ToolTestFixture.CreateSamplePdf("RedactRemoveClearSample", 1); - try - { - var vm = (RedactPdfToolViewModel)_fixture.Factory.Create(PdfToolId.RedactPdf); - vm.SelectedFiles.Add(sample); - vm.SyncPreviewItems(); - vm.SearchPattern = "CONFIDENTIAL"; - await vm.FindAndMarkCommand.ExecuteAsync(null); - Assert.True(vm.Marks.Count > 0); - - var firstMark = vm.Marks[0]; - vm.RemoveMarkCommand.Execute(firstMark); - Assert.DoesNotContain(firstMark, vm.Marks); - - vm.ClearMarksCommand.Execute(null); - Assert.Empty(vm.Marks); - Assert.False(vm.HasMarks); - } - finally - { - if (File.Exists(sample)) File.Delete(sample); - } - } - - [Fact] - public async Task RedactPdfTool_NoMarks_BlocksExecution_ViaValidation() - { - // Regression guard for the new interactive flow: searching alone no longer - // commits anything — the user must review matches (now in Marks) before - // Execute is allowed to run at all. - string sample = ToolTestFixture.CreateSamplePdf("RedactNoMarksSample", 1); - try - { - var vm = (RedactPdfToolViewModel)_fixture.Factory.Create(PdfToolId.RedactPdf); - vm.SelectedFiles.Add(sample); - vm.SyncPreviewItems(); - - await vm.ExecuteToolCommand.ExecuteAsync(null); - - Assert.True(vm.HasError); - Assert.False(vm.IsComplete); - Assert.Contains("Search for text to redact", vm.ErrorMessage); - } - finally - { - if (File.Exists(sample)) File.Delete(sample); - } - } - - [Fact] - public async Task RedactPdfTool_SearchWithNoMatches_SetsStatusMessage_DoesNotMark() - { - string sample = ToolTestFixture.CreateSamplePdf("RedactSearchNoMatchSample", 1); - try - { - var vm = (RedactPdfToolViewModel)_fixture.Factory.Create(PdfToolId.RedactPdf); - vm.SelectedFiles.Add(sample); - vm.SyncPreviewItems(); - vm.SearchPattern = "ThisTextDoesNotExistAnywhereInTheDocument"; - - await vm.FindAndMarkCommand.ExecuteAsync(null); - - Assert.Empty(vm.Marks); - Assert.False(vm.HasMarks); - Assert.Contains("No matches", vm.SearchStatusMessage); - } - finally - { - if (File.Exists(sample)) File.Delete(sample); - } - } - - [Fact] - public async Task RedactPdfTool_FullFlow_MarkThenExecute_ActuallyRemovesMatchedText() - { - // End-to-end regression guard: search finds matches → user reviews them in - // Marks → Execute commits exactly those marks. Proves the matched text is - // genuinely gone from the output, not just visually covered. - string sample = ToolTestFixture.CreateSamplePdf("RedactFullFlowSample", 1); - string? outputPath = null; - try - { - var vm = (RedactPdfToolViewModel)_fixture.Factory.Create(PdfToolId.RedactPdf); - vm.SelectedFiles.Add(sample); - vm.SyncPreviewItems(); - vm.SearchPattern = "CONFIDENTIAL"; - vm.PermanentScrubText = true; - - await vm.FindAndMarkCommand.ExecuteAsync(null); - Assert.True(vm.HasMarks); - - await vm.ExecuteToolCommand.ExecuteAsync(null); - - Assert.True(vm.IsComplete); - Assert.False(vm.HasError); - outputPath = vm.LastOutputFilePath; - Assert.True(File.Exists(outputPath)); - - using var outputDoc = UglyToad.PdfPig.PdfDocument.Open(outputPath); - string extractedText = outputDoc.GetPage(1).Text; - Assert.DoesNotContain("CONFIDENTIAL", extractedText, StringComparison.OrdinalIgnoreCase); - } - finally - { - if (File.Exists(sample)) File.Delete(sample); - if (outputPath != null && File.Exists(outputPath)) File.Delete(outputPath); - } - } - - [Fact] - public async Task RedactPdfTool_LoadingDocument_ResolvesPageCountAndDimensions() - { - // Note: actual Bitmap decoding needs Avalonia's platform rendering services, - // which this headless xUnit host doesn't bootstrap — so the Bitmap itself isn't - // asserted here. Page count/dimensions come from PdfPig directly and are - // deliberately captured independent of bitmap decode success (see - // PdfPageRenderer.RenderPageAtScale), so they're verifiable in this environment - // and are exactly what the highlight-overlay math depends on. - string sample = ToolTestFixture.CreateSamplePdf("RedactPreviewSample", 3); - try - { - var vm = (RedactPdfToolViewModel)_fixture.Factory.Create(PdfToolId.RedactPdf); - vm.SelectedFiles.Add(sample); - vm.SyncPreviewItems(); - - // Loading is fire-and-forget off the SelectedFiles collection change; give it - // a moment to finish (waits on SelectedPage.WidthPoints, set last in the load - // chain — polling TotalPages instead would race ahead of the render actually - // finishing). - await WaitForPreviewAsync(vm); - - Assert.Equal(3, vm.Preview.TotalPages); - Assert.NotNull(vm.Preview.SelectedPage); - Assert.True(vm.Preview.SelectedPage!.WidthPoints > 0); - Assert.True(vm.Preview.SelectedPage!.HeightPoints > 0); - } - finally - { - if (File.Exists(sample)) File.Delete(sample); - } - } - - private static async Task WaitForPreviewAsync(RedactPdfToolViewModel vm) - { - // Word geometry (needed for text-snap marking) refreshes independently of, and - // not necessarily before, Preview's own page render completing — wait for both - // so callers can rely on AddManualMark's word-snapping actually having data. - for (int i = 0; i < 50 && (vm.Preview.SelectedPage == null || vm.Preview.SelectedPage.WidthPoints == 0 || vm.WordsRefreshedCount == 0); i++) - { - await Task.Delay(50); - } - } - - [Fact] - public async Task RedactPdfTool_ForceDrawBox_AddsRawRectangleAsManualMark() - { - string sample = ToolTestFixture.CreateSamplePdf("RedactDrawBoxSample", 1); - try - { - var vm = (RedactPdfToolViewModel)_fixture.Factory.Create(PdfToolId.RedactPdf); - vm.SelectedFiles.Add(sample); - vm.SyncPreviewItems(); - await WaitForPreviewAsync(vm); - Assert.NotNull(vm.Preview.SelectedPage); - Assert.True(vm.Preview.SelectedPage!.WidthPoints > 0); - - vm.AddManualMark(new Rect(50, 60, 120, 30), forceDrawBox: true); - - Assert.Single(vm.Marks); - var mark = vm.Marks[0]; - Assert.Equal("Manual selection", mark.Label); - Assert.Equal(0, mark.Region.PageIndex); - Assert.True(mark.Region.Width > 0 && mark.Region.Height > 0); - } - finally - { - if (File.Exists(sample)) File.Delete(sample); - } - } - - [Fact] - public async Task RedactPdfTool_DefaultDrag_SnapsToTouchedWordsLikeThePdfReader() - { - string sample = ToolTestFixture.CreateSamplePdf("RedactSelectTextSample", 1); - try - { - var vm = (RedactPdfToolViewModel)_fixture.Factory.Create(PdfToolId.RedactPdf); - vm.SelectedFiles.Add(sample); - vm.SyncPreviewItems(); - await WaitForPreviewAsync(vm); - Assert.NotNull(vm.Preview.SelectedPage); - Assert.True(vm.Preview.SelectedPage!.WidthPoints > 0); - - // A drag covering the whole page must touch every word on it (default mode - // snaps to text — no mode switch needed, matching the PDF Reader's behavior). - double displayWidth = vm.Preview.SelectedPage!.WidthPoints * vm.Preview.ZoomLevel; - double displayHeight = vm.Preview.SelectedPage!.HeightPoints * vm.Preview.ZoomLevel; - vm.AddManualMark(new Rect(0, 0, displayWidth, displayHeight)); - - Assert.Single(vm.Marks); - var mark = vm.Marks[0]; - Assert.NotEqual("Manual selection", mark.Label); - Assert.Contains("CONFIDENTIAL", mark.Label, StringComparison.OrdinalIgnoreCase); - } - finally - { - if (File.Exists(sample)) File.Delete(sample); - } - } - - [Fact] - public async Task RedactPdfTool_DefaultDrag_EmptyAreaAddsNothing() - { - // A drag that touches no words shouldn't create a mark by default — unlike - // forceDrawBox: true, which always uses the raw rectangle. - string sample = ToolTestFixture.CreateSamplePdf("RedactSelectTextEmptySample", 1); - try - { - var vm = (RedactPdfToolViewModel)_fixture.Factory.Create(PdfToolId.RedactPdf); - vm.SelectedFiles.Add(sample); - vm.SyncPreviewItems(); - await WaitForPreviewAsync(vm); - Assert.NotNull(vm.Preview.SelectedPage); - - // Bottom-right corner is blank in the fixture's generated layout. - double displayWidth = vm.Preview.SelectedPage!.WidthPoints * vm.Preview.ZoomLevel; - double displayHeight = vm.Preview.SelectedPage!.HeightPoints * vm.Preview.ZoomLevel; - vm.AddManualMark(new Rect(displayWidth - 5, displayHeight - 5, 3, 3)); - - Assert.Empty(vm.Marks); - } - finally - { - if (File.Exists(sample)) File.Delete(sample); - } - } - - [Fact] - public async Task FindRedactionMatchesAsync_FindsMatchesWithoutWritingAnyFile() - { - // The preview-support backend method: read-only, used by the interactive UI to - // show matches before the user commits to redacting. Must not create/modify any file. - string sample = ToolTestFixture.CreateSamplePdf("RedactFindOnlySample", 2); - try - { - var matches = await _fixture.OperationsService.SecurityService.FindRedactionMatchesAsync(sample, "CONFIDENTIAL", caseSensitive: false); - - Assert.NotEmpty(matches); - Assert.All(matches, m => - { - Assert.True(m.PageIndex >= 0); - Assert.True(m.Width > 0); - Assert.True(m.Height > 0); - }); - - // No sibling output file should exist — this call must be side-effect free. - string dir = Path.GetDirectoryName(sample)!; - string baseName = Path.GetFileNameWithoutExtension(sample); - Assert.False(File.Exists(Path.Combine(dir, $"{baseName}_Redacted.pdf"))); - } - finally - { - if (File.Exists(sample)) File.Delete(sample); - } - } - - [Fact] - public async Task FindRedactionMatchesAsync_NoMatches_ReturnsEmptyList_NotAnError() - { - string sample = ToolTestFixture.CreateSamplePdf("RedactFindNoneSample", 1); - try - { - var matches = await _fixture.OperationsService.SecurityService.FindRedactionMatchesAsync(sample, "NothingLikeThisExistsHere", caseSensitive: false); - Assert.Empty(matches); - } - finally - { - if (File.Exists(sample)) File.Delete(sample); - } - } -} diff --git a/tests/PdfEditorApp.Tests/Tools/Security/RepairPdfToolTests.cs b/tests/PdfEditorApp.Tests/Tools/Security/RepairPdfToolTests.cs deleted file mode 100644 index c493d09..0000000 --- a/tests/PdfEditorApp.Tests/Tools/Security/RepairPdfToolTests.cs +++ /dev/null @@ -1,58 +0,0 @@ -using PdfEditorApp.Services.Tools.Core; -using PdfEditorApp.Services.Tools.Organize; -using PdfEditorApp.Services.Tools.Security; -using PdfEditorApp.Services.Tools.Conversion; -using PdfEditorApp.Services.Tools.Intelligence; -using PdfEditorApp.ViewModels.Tools.Core; -using PdfEditorApp.ViewModels.Tools.Organize; -using PdfEditorApp.ViewModels.Tools.Security; -using PdfEditorApp.ViewModels.Tools.Conversion; -using PdfEditorApp.ViewModels.Tools.Intelligence; -using PdfEditorApp.Tests.Tools.Core; -using System.IO; -using System.Threading.Tasks; -using PdfEditorApp.Models; -using PdfEditorApp.ViewModels.Tools; -using Xunit; - -namespace PdfEditorApp.Tests.Tools.Security; - -public class RepairPdfToolTests : IClassFixture -{ - private readonly ToolTestFixture _fixture; - - public RepairPdfToolTests(ToolTestFixture fixture) - { - _fixture = fixture; - } - - [Fact] - public void RepairPdfTool_InstantiatesWithCorrectDefaults() - { - var vm = (RepairPdfToolViewModel)_fixture.Factory.Create(PdfToolId.RepairPdf); - Assert.NotNull(vm); - Assert.Equal(PdfToolId.RepairPdf, vm.Tool.Id); - } - - [Fact] - public async Task RepairPdfTool_RepairsDocumentSuccessfully() - { - string sample = ToolTestFixture.CreateSamplePdf("RepairSample", 2); - try - { - var vm = (RepairPdfToolViewModel)_fixture.Factory.Create(PdfToolId.RepairPdf); - vm.SelectedFiles.Add(sample); - vm.SyncPreviewItems(); - - await vm.ExecuteToolCommand.ExecuteAsync(null); - - Assert.True(vm.IsComplete); - Assert.False(vm.HasError); - Assert.True(File.Exists(vm.LastOutputFilePath)); - } - finally - { - if (File.Exists(sample)) File.Delete(sample); - } - } -} diff --git a/tests/PdfEditorApp.Tests/Tools/Security/SignPdfToolTests.cs b/tests/PdfEditorApp.Tests/Tools/Security/SignPdfToolTests.cs deleted file mode 100644 index 352a162..0000000 --- a/tests/PdfEditorApp.Tests/Tools/Security/SignPdfToolTests.cs +++ /dev/null @@ -1,62 +0,0 @@ -using PdfEditorApp.Services.Tools.Core; -using PdfEditorApp.Services.Tools.Organize; -using PdfEditorApp.Services.Tools.Security; -using PdfEditorApp.Services.Tools.Conversion; -using PdfEditorApp.Services.Tools.Intelligence; -using PdfEditorApp.ViewModels.Tools.Core; -using PdfEditorApp.ViewModels.Tools.Organize; -using PdfEditorApp.ViewModels.Tools.Security; -using PdfEditorApp.ViewModels.Tools.Conversion; -using PdfEditorApp.ViewModels.Tools.Intelligence; -using PdfEditorApp.Tests.Tools.Core; -using System.IO; -using System.Threading.Tasks; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Models; -using PdfEditorApp.ViewModels.Tools; -using Xunit; - -namespace PdfEditorApp.Tests.Tools.Security; - -public class SignPdfToolTests : IClassFixture -{ - private readonly ToolTestFixture _fixture; - - public SignPdfToolTests(ToolTestFixture fixture) - { - _fixture = fixture; - } - - [Fact] - public void SignPdfTool_InstantiatesWithCorrectDefaults() - { - var vm = (SignPdfToolViewModel)_fixture.Factory.Create(PdfToolId.SignPdf); - Assert.NotNull(vm); - Assert.Equal(PdfToolId.SignPdf, vm.Tool.Id); - Assert.Equal("Jane Doe", vm.SignerName); - Assert.Equal(SignatureStyle.CursiveElegance, vm.Style); - } - - [Fact] - public async Task SignPdfTool_SignsDocumentSuccessfully() - { - string sample = ToolTestFixture.CreateSamplePdf("SignSample", 1); - try - { - var vm = (SignPdfToolViewModel)_fixture.Factory.Create(PdfToolId.SignPdf); - vm.SelectedFiles.Add(sample); - vm.SyncPreviewItems(); - vm.SignerName = "Alex Morgan"; - - await vm.ExecuteToolCommand.ExecuteAsync(null); - - Assert.True(vm.IsComplete); - Assert.False(vm.HasError); - Assert.True(File.Exists(vm.LastOutputFilePath)); - } - finally - { - if (File.Exists(sample)) File.Delete(sample); - } - } -} diff --git a/tests/PdfEditorApp.Tests/Tools/Security/UnlockPdfToolTests.cs b/tests/PdfEditorApp.Tests/Tools/Security/UnlockPdfToolTests.cs deleted file mode 100644 index d4a5a28..0000000 --- a/tests/PdfEditorApp.Tests/Tools/Security/UnlockPdfToolTests.cs +++ /dev/null @@ -1,59 +0,0 @@ -using PdfEditorApp.Services.Tools.Core; -using PdfEditorApp.Services.Tools.Organize; -using PdfEditorApp.Services.Tools.Security; -using PdfEditorApp.Services.Tools.Conversion; -using PdfEditorApp.Services.Tools.Intelligence; -using PdfEditorApp.ViewModels.Tools.Core; -using PdfEditorApp.ViewModels.Tools.Organize; -using PdfEditorApp.ViewModels.Tools.Security; -using PdfEditorApp.ViewModels.Tools.Conversion; -using PdfEditorApp.ViewModels.Tools.Intelligence; -using PdfEditorApp.Tests.Tools.Core; -using System.IO; -using System.Threading.Tasks; -using PdfEditorApp.Models; -using PdfEditorApp.ViewModels.Tools; -using Xunit; - -namespace PdfEditorApp.Tests.Tools.Security; - -public class UnlockPdfToolTests : IClassFixture -{ - private readonly ToolTestFixture _fixture; - - public UnlockPdfToolTests(ToolTestFixture fixture) - { - _fixture = fixture; - } - - [Fact] - public void UnlockPdfTool_InstantiatesWithCorrectDefaults() - { - var vm = (UnlockPdfToolViewModel)_fixture.Factory.Create(PdfToolId.UnlockPdf); - Assert.NotNull(vm); - Assert.Equal(PdfToolId.UnlockPdf, vm.Tool.Id); - Assert.Empty(vm.Password); - } - - [Fact] - public async Task UnlockPdfTool_UnlocksDocumentSuccessfully() - { - string sample = ToolTestFixture.CreateSamplePdf("UnlockSample", 2); - try - { - var vm = (UnlockPdfToolViewModel)_fixture.Factory.Create(PdfToolId.UnlockPdf); - vm.SelectedFiles.Add(sample); - vm.SyncPreviewItems(); - - await vm.ExecuteToolCommand.ExecuteAsync(null); - - Assert.True(vm.IsComplete); - Assert.False(vm.HasError); - Assert.True(File.Exists(vm.LastOutputFilePath)); - } - finally - { - if (File.Exists(sample)) File.Delete(sample); - } - } -} diff --git a/tests/PdfEditorApp.Tests/Tools/Security/WatermarkToolTests.cs b/tests/PdfEditorApp.Tests/Tools/Security/WatermarkToolTests.cs deleted file mode 100644 index f562b00..0000000 --- a/tests/PdfEditorApp.Tests/Tools/Security/WatermarkToolTests.cs +++ /dev/null @@ -1,63 +0,0 @@ -using PdfEditorApp.Services.Tools.Core; -using PdfEditorApp.Services.Tools.Organize; -using PdfEditorApp.Services.Tools.Security; -using PdfEditorApp.Services.Tools.Conversion; -using PdfEditorApp.Services.Tools.Intelligence; -using PdfEditorApp.ViewModels.Tools.Core; -using PdfEditorApp.ViewModels.Tools.Organize; -using PdfEditorApp.ViewModels.Tools.Security; -using PdfEditorApp.ViewModels.Tools.Conversion; -using PdfEditorApp.ViewModels.Tools.Intelligence; -using PdfEditorApp.Tests.Tools.Core; -using System.IO; -using System.Threading.Tasks; -using PdfEditorApp.Models; -using PdfEditorApp.ViewModels.Tools; -using Xunit; - -namespace PdfEditorApp.Tests.Tools.Security; - -public class WatermarkToolTests : IClassFixture -{ - private readonly ToolTestFixture _fixture; - - public WatermarkToolTests(ToolTestFixture fixture) - { - _fixture = fixture; - } - - [Fact] - public void WatermarkTool_InstantiatesWithCorrectDefaults() - { - var vm = (WatermarkToolViewModel)_fixture.Factory.Create(PdfToolId.Watermark); - Assert.NotNull(vm); - Assert.Equal(PdfToolId.Watermark, vm.Tool.Id); - Assert.Equal("CONFIDENTIAL", vm.WatermarkText); - Assert.Equal(0.35, vm.Opacity); - Assert.Equal(-45, vm.RotationAngle); - } - - [Fact] - public async Task WatermarkTool_ExecutesWatermarkingSuccessfully() - { - string sample = ToolTestFixture.CreateSamplePdf("WatermarkSample", 2); - try - { - var vm = (WatermarkToolViewModel)_fixture.Factory.Create(PdfToolId.Watermark); - vm.SelectedFiles.Add(sample); - vm.SyncPreviewItems(); - vm.WatermarkText = "INTERNAL ONLY"; - vm.Opacity = 0.5; - - await vm.ExecuteToolCommand.ExecuteAsync(null); - - Assert.True(vm.IsComplete); - Assert.False(vm.HasError); - Assert.True(File.Exists(vm.LastOutputFilePath)); - } - finally - { - if (File.Exists(sample)) File.Delete(sample); - } - } -} diff --git a/tests/PdfEditorApp.Tests/TotalMicrokernelTests.cs b/tests/PdfEditorApp.Tests/TotalMicrokernelTests.cs deleted file mode 100644 index 176bf40..0000000 --- a/tests/PdfEditorApp.Tests/TotalMicrokernelTests.cs +++ /dev/null @@ -1,369 +0,0 @@ -using System; -using System.IO; -using System.Linq; -using System.Threading.Tasks; -using Microsoft.Extensions.DependencyInjection; -using PdfEditorApp.Core.Plugins; -using PdfEditorApp.Core.Plugins.Descriptors; -using PdfEditorApp.Core.Plugins.Profiles; -using PdfEditorApp.Plugins.Bundles; -using PdfEditorApp.Services.Dialogs; -using PdfEditorApp.Services.Navigation; -using PdfEditorApp.Services.Ribbon; -using PdfEditorApp.Services.Sidebar; -using PdfEditorApp.Services.Tools.Core; -using PdfEditorApp.Services.Tools.Conversion; -using PdfEditorApp.Services.Tools.Intelligence; -using PdfEditorApp.Services.Tools.Organize; -using PdfEditorApp.Services.Tools.Security; -using PdfEditorApp.ViewModels; -using Xunit; - -namespace PdfEditorApp.Tests; - -public class TotalMicrokernelTests -{ - [Fact] - public void NavigationRegistry_Registers_And_Queries_By_Group() - { - var reg = new NavigationRegistry(); - bool eventFired = false; - reg.RegistryChanged += () => eventFired = true; - - var desc1 = new NavigationItemDescriptor - { - Id = "test.page.a", - Title = "Page A", - Group = "TestGroup", - Order = 20, - ViewFactory = sp => "View A" - }; - var desc2 = new NavigationItemDescriptor - { - Id = "test.page.b", - Title = "Page B", - Group = "TestGroup", - Order = 10, - ViewFactory = sp => "View B" - }; - var desc3 = new NavigationItemDescriptor - { - Id = "test.page.c", - Title = "Page C", - Group = "OtherGroup", - Order = 5 - }; - - using var unreg1 = reg.RegisterNavigationItem(desc1); - using var unreg2 = reg.RegisterNavigationItem(desc2); - using var unreg3 = reg.RegisterNavigationItem(desc3); - - Assert.True(eventFired); - Assert.Equal(3, reg.GetAllItems().Count); - - var testGroupItems = reg.GetItemsByGroup("TestGroup"); - Assert.Equal(2, testGroupItems.Count); - Assert.Equal("test.page.b", testGroupItems[0].Id); // Order 10 before 20 - Assert.Equal("test.page.a", testGroupItems[1].Id); - - var singleItem = reg.GetItem("test.page.a"); - Assert.NotNull(singleItem); - Assert.Equal("View A", singleItem.ViewFactory!(null!)); - } - - [Fact] - public void DialogRegistry_Registers_And_Resolves_Dialogs() - { - var reg = new DialogRegistry(); - bool changed = false; - reg.RegistryChanged += () => changed = true; - - var desc = new DialogDescriptor - { - Id = "custom.dialog.test", - Title = "Test Dialog", - ViewFactory = sp => "Dialog Content" - }; - - var unreg = reg.RegisterDialog(desc); - Assert.True(changed); - - var retrieved = reg.GetDialog("custom.dialog.test"); - Assert.NotNull(retrieved); - Assert.Equal("Test Dialog", retrieved.Title); - Assert.Equal("Dialog Content", retrieved.ViewFactory!(null!)); - - unreg.Dispose(); - Assert.Null(reg.GetDialog("custom.dialog.test")); - } - - [Fact] - public void SidebarRegistry_Registers_And_Orders_Tabs() - { - var reg = new SidebarRegistry(); - bool changed = false; - reg.RegistryChanged += () => changed = true; - - var tab1 = new SidebarTabDescriptor - { - Id = "sidebar.layers", - Title = "Layers", - IconKind = "LayersOutline", - Order = 50 - }; - var tab2 = new SidebarTabDescriptor - { - Id = "sidebar.thumbnails", - Title = "Pages", - IconKind = "FileDocumentOutline", - Order = 10 - }; - - using var u1 = reg.RegisterTab(tab1); - using var u2 = reg.RegisterTab(tab2); - - Assert.True(changed); - var tabs = reg.GetAllTabs(); - Assert.Equal(2, tabs.Count); - Assert.Equal("sidebar.thumbnails", tabs[0].Id); - Assert.Equal("sidebar.layers", tabs[1].Id); - } - - [Fact] - public void Enhanced_RibbonRegistry_Supports_Dynamic_Tabs_And_Groups() - { - var reg = new RibbonRegistry(); - - var tab = new RibbonTabDescriptor - { - Id = "CadEngineering", - Title = "CAD & 3D", - Order = 150 - }; - - var group = new RibbonGroupDescriptor - { - Id = "CadTools", - TabId = "CadEngineering", - Title = "Drawing Tools", - Order = 10 - }; - - var action = new RibbonActionDescriptor - { - Id = "cad.measure.caliper", - TabId = "CadEngineering", - GroupId = "CadTools", - Label = "Caliper", - IconKind = "RulerSquare", - Order = 5 - }; - - using var uTab = reg.RegisterTab(tab); - using var uGroup = reg.RegisterGroup(group); - reg.RegisterAction(action); - - var allTabs = reg.GetAllTabs(); - Assert.Contains(allTabs, t => t.Id == "CadEngineering"); - - var groups = reg.GetGroupsForTab("CadEngineering"); - Assert.Single(groups); - Assert.Equal("CadTools", groups[0].Id); - - var actions = reg.GetActionsForGroup("CadEngineering", "CadTools"); - Assert.Single(actions); - Assert.Equal("cad.measure.caliper", actions[0].Id); - - reg.UnregisterAction("cad.measure.caliper"); - Assert.Empty(reg.GetActionsForGroup("CadEngineering", "CadTools")); - } - - [Fact] - public async Task WorkspacePagesBundle_Mounts_All_12_Workspace_Pages() - { - var navReg = new NavigationRegistry(); - var context = new FryPluginContext(); - context.RegisterService(navReg); - - var host = new PluginHost(context); - var bundle = new WorkspacePagesBundle(); - host.RegisterPlugins(bundle.Plugins); - - await host.StartAsync(); - - var pages = navReg.GetAllItems(); - Assert.True(pages.Count >= 12, $"Expected at least 12 pages registered, found {pages.Count}"); - - Assert.Contains(pages, p => p.Id == "Home"); - Assert.Contains(pages, p => p.Id == "PdfReader"); - Assert.Contains(pages, p => p.Id == "NewDocument"); - Assert.Contains(pages, p => p.Id == "AllTools"); - Assert.Contains(pages, p => p.Id == "Starred"); - Assert.Contains(pages, p => p.Id == "FontPackages"); - Assert.Contains(pages, p => p.Id == "TesseractData"); - Assert.Contains(pages, p => p.Id == "Trash"); - Assert.Contains(pages, p => p.Id == "Help"); - Assert.Contains(pages, p => p.Id == "Licensing"); - Assert.Contains(pages, p => p.Id == "Settings"); - - await host.StopAsync(); - } - - [Fact] - public async Task DialogsBundle_Mounts_Core_And_Studio_Dialogs() - { - var dialogReg = new DialogRegistry(); - var context = new FryPluginContext(); - context.RegisterService(dialogReg); - - var host = new PluginHost(context); - var bundle = new DialogsBundle(); - host.RegisterPlugins(bundle.Plugins); - - await host.StartAsync(); - - var dialogs = dialogReg.GetAllDialogs(); - Assert.True(dialogs.Count >= 15, $"Expected at least 15 dialogs registered, found {dialogs.Count}"); - - Assert.Contains(dialogs, d => d.Id == "frypdf.dialog.about"); - Assert.Contains(dialogs, d => d.Id == "frypdf.dialog.shortcuts"); - Assert.Contains(dialogs, d => d.Id == "frypdf.dialog.plugins"); - Assert.Contains(dialogs, d => d.Id == "frypdf.dialog.signature"); - Assert.Contains(dialogs, d => d.Id == "frypdf.dialog.math"); - Assert.Contains(dialogs, d => d.Id == "frypdf.dialog.datastudio"); - Assert.Contains(dialogs, d => d.Id == "frypdf.dialog.aiassistant"); - - await host.StopAsync(); - } - - [Fact] - public async Task EditorSidebarsBundle_Mounts_Sidebar_Tabs() - { - var sidebarReg = new SidebarRegistry(); - var context = new FryPluginContext(); - context.RegisterService(sidebarReg); - - var host = new PluginHost(context); - var bundle = new EditorSidebarsBundle(); - host.RegisterPlugins(bundle.Plugins); - - await host.StartAsync(); - - var tabs = sidebarReg.GetAllTabs(); - Assert.Equal(3, tabs.Count); - Assert.Equal("Thumbnails", tabs[0].Id); - Assert.Equal("Outline", tabs[1].Id); - Assert.Equal("Comments", tabs[2].Id); - - await host.StopAsync(); - } - - [Fact] - public void HomeViewModel_DynamicNavigation_Activates_Page_View() - { - var navReg = new NavigationRegistry(); - navReg.RegisterNavigationItem(new NavigationItemDescriptor - { - Id = "CustomStudio", - Title = "Custom Studio", - Group = "Extensions", - ViewFactory = sp => "Custom Studio View Instance" - }); - - var vm = new HomeViewModel( - navigationRegistry: navReg, - recentService: new Services.RecentDocumentsService(), - templateService: new Services.TemplateService(), - persistenceService: new Services.ProjectPersistenceService(), - toolRegistry: new Services.Tools.Core.PdfToolRegistry()); - - Assert.Single(vm.ContributedNavigationItems); - Assert.Equal("CustomStudio", vm.ContributedNavigationItems[0].Id); - - vm.SelectNavSection("CustomStudio"); - Assert.True(vm.ContributedNavigationItems[0].IsActive); - Assert.Equal("Custom Studio View Instance", vm.DynamicPageView); - } - - [Fact] - public void Desktop_Profile_Includes_All_16_Bundles() - { - var profilePath = Path.Combine(AppContext.BaseDirectory, "profiles", "desktop.profile.json"); - if (!File.Exists(profilePath)) - { - profilePath = "profiles/desktop.profile.json"; - } - - Assert.True(File.Exists(profilePath), $"desktop.profile.json not found at {profilePath}"); - var profile = ProfileLoader.LoadFromFile(profilePath); - - Assert.Contains("FryPdf.Bundle.WorkspacePages", profile.Bundles); - Assert.Contains("FryPdf.Bundle.Dialogs", profile.Bundles); - Assert.Contains("FryPdf.Bundle.EditorSidebars", profile.Bundles); - Assert.Contains("FryPdf.Bundle.CanvasElements", profile.Bundles); - Assert.Contains("FryPdf.Bundle.CommandPalette", profile.Bundles); - } - - [Fact] - public async Task PdfDocumentOperationsService_ExecutesThroughWaterfallPipeline_InterceptsTool() - { - var context = new FryPluginContext(); - bool pipelineIntercepted = false; - - context.RegisterWaterfall( - "tool:execute", - async (ctx, next) => - { - pipelineIntercepted = true; - ctx.Properties["audit:user"] = "SystemTester"; - await next(); - }); - - var ops = new Services.PdfDocumentOperationsService( - new PdfToolRegistry(), - new PdfPageService(), - new PdfOptimizationService(), - new PdfSecurityService(), - new PdfConversionService(), - new PdfOcrService(), - new PdfFormService(), - new AiDocumentService(), - new DocumentTranslationService(), - new PdfWorkflowEngine(), - context); - - var result = await ops.ExecuteToolAsync(Models.PdfToolId.MergePdf, new Models.MergeToolOptions()); - - Assert.True(pipelineIntercepted); - } - - [Fact] - public async Task PluginItemViewModel_ToggleIsActive_TriggersToggleHandler() - { - bool toggleTriggered = false; - bool toggleTargetValue = false; - - var vm = new PluginItemViewModel - { - Id = "test.plugin.toggle", - Name = "Toggle Test", - IsActive = true, - ToggleHandler = (id, active) => - { - toggleTriggered = true; - toggleTargetValue = active; - return Task.CompletedTask; - } - }; - - // Switch to false - vm.IsActive = false; - - // Give async Task a moment to run - await Task.Delay(20); - - Assert.True(toggleTriggered); - Assert.False(toggleTargetValue); - Assert.False(vm.IsActive); - } -} diff --git a/tests/PdfEditorApp.Tests/TypographyAndTextEngineTests.cs b/tests/PdfEditorApp.Tests/TypographyAndTextEngineTests.cs deleted file mode 100644 index 0e4ed6b..0000000 --- a/tests/PdfEditorApp.Tests/TypographyAndTextEngineTests.cs +++ /dev/null @@ -1,709 +0,0 @@ -using System; -using System.IO; -using System.Text.Json; -using System.Threading.Tasks; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Core.Models.Elements; -using Xunit; -using PdfEditorApp.Models; -using PdfEditorApp.Services; -using PdfEditorApp.Services.Typography; -using PdfEditorApp.ViewModels; -using PdfEditorApp.ViewModels.ElementViewModels; - -namespace PdfEditorApp.Tests; - -public class TypographyAndTextEngineTests -{ - [Fact] - public void PdfTextElement_DefaultValues_AreSensible() - { - var textEl = new PdfTextElement(); - - Assert.Equal("Enter text here", textEl.Text); - Assert.Equal(14.0, textEl.FontSize); - Assert.Equal("#201F1E", textEl.TextColorHex); - Assert.Equal(1.0, textEl.TextOpacity); - Assert.Equal(TextAlignmentMode.Left, textEl.Alignment); - Assert.Equal(TextVerticalAlignment.Top, textEl.VerticalAlignment); - Assert.Equal(TextShapeMode.Normal, textEl.ShapeMode); - Assert.False(textEl.HasStroke); - Assert.False(textEl.HasShadow); - Assert.False(textEl.IsDoubleUnderline); - Assert.Equal(1.0, textEl.ScaleX); - Assert.Equal(1.0, textEl.ScaleY); - Assert.False(textEl.FlipX); - Assert.False(textEl.FlipY); - } - - [Fact] - public void PdfTextElement_JsonSerialization_RoundTripPreservesAllAdvancedProperties() - { - var original = new PdfTextElement - { - Id = Guid.NewGuid().ToString(), - X = 50, - Y = 100, - Width = 300, - Height = 150, - Text = "Curved Badge Typography", - FontFamily = "Inter", - FontSize = 24, - IsBold = true, - IsItalic = true, - IsUnderline = true, - IsDoubleUnderline = true, - IsStrikethrough = false, - TextColorHex = "#0F6CBD", - TextOpacity = 0.9, - Alignment = TextAlignmentMode.Center, - VerticalAlignment = TextVerticalAlignment.Center, - LineHeight = 1.4, - CharacterSpacing = 2.5, - WordSpacing = 5.0, - ParagraphSpacing = 8.0, - TextWrap = true, - HasStroke = true, - StrokeColorHex = "#1E293B", - StrokeWidth = 2.0, - HasShadow = true, - ShadowColorHex = "#80000000", - ShadowOffsetX = 3.0, - ShadowOffsetY = 4.0, - ShadowBlurRadius = 6.0, - ShadowOpacity = 0.75, - BackgroundColorHex = "#FEF08A", - CornerRadius = 8.0, - BorderColorHex = "#CA8A04", - BorderThickness = 1.5, - Padding = 12.0, - ShapeMode = TextShapeMode.Curved, - CurveRadius = 150.0, - CurveArcAngle = 180.0, - CurveStartAngle = -90.0, - CurveClockwise = true, - CurveInvert = false, - CircularPlacement = CircularTextPlacement.TopArc, - BaselineShift = 5.0, - CharacterRotation = 10.0, - ScaleX = 1.2, - ScaleY = 0.9, - FlipX = false, - FlipY = false - }; - - var options = new JsonSerializerOptions { WriteIndented = true }; - string json = JsonSerializer.Serialize(original, options); - var deserialized = JsonSerializer.Deserialize(json, options); - - Assert.NotNull(deserialized); - Assert.Equal(original.Id, deserialized.Id); - Assert.Equal(original.Text, deserialized.Text); - Assert.Equal(original.FontSize, deserialized.FontSize); - Assert.True(deserialized.IsBold); - Assert.True(deserialized.IsDoubleUnderline); - Assert.Equal(TextShapeMode.Curved, deserialized.ShapeMode); - Assert.Equal(150.0, deserialized.CurveRadius); - Assert.Equal(180.0, deserialized.CurveArcAngle); - Assert.True(deserialized.HasStroke); - Assert.Equal("#1E293B", deserialized.StrokeColorHex); - Assert.True(deserialized.HasShadow); - Assert.Equal(3.0, deserialized.ShadowOffsetX); - Assert.Equal(1.2, deserialized.ScaleX); - } - - [Fact] - public void PdfTextElement_BackwardCompatibility_LoadsLegacyJsonWithoutError() - { - // Legacy JSON schema with only basic fields - string legacyJson = """ - { - "Id": "legacy-text-1", - "X": 10, - "Y": 20, - "Width": 200, - "Height": 50, - "Text": "Legacy Text", - "FontFamily": "Arial", - "FontSize": 14, - "TextColorHex": "#000000", - "Alignment": 0, - "IsBold": false, - "IsItalic": false - } - """; - - var el = JsonSerializer.Deserialize(legacyJson); - Assert.NotNull(el); - Assert.Equal("legacy-text-1", el.Id); - Assert.Equal("Legacy Text", el.Text); - Assert.Equal(TextShapeMode.Normal, el.ShapeMode); - Assert.False(el.HasStroke); - Assert.False(el.HasShadow); - Assert.Equal(1.0, el.ScaleX); - } - - [Fact] - public void PdfTextElement_Clone_CreatesDeepCopy() - { - var original = new PdfTextElement - { - Text = "Master Copy", - ShapeMode = TextShapeMode.Circular, - CurveRadius = 120, - HasStroke = true, - StrokeWidth = 3.0 - }; - - var clone = (PdfTextElement)original.Clone(); - Assert.NotEqual(original.Id, clone.Id); - Assert.Equal(original.Text, clone.Text); - Assert.Equal(original.ShapeMode, clone.ShapeMode); - Assert.Equal(original.CurveRadius, clone.CurveRadius); - Assert.Equal(original.HasStroke, clone.HasStroke); - Assert.Equal(original.StrokeWidth, clone.StrokeWidth); - - clone.Text = "Modified Copy"; - Assert.Equal("Master Copy", original.Text); - } - - [Fact] - public void TextLayoutEngine_MeasureGlyphWidth_ReturnsExpectedProportions() - { - double widthW = TextLayoutEngine.MeasureGlyphWidth('W', "Arial", 20, isBold: false, isItalic: false); - double widthI = TextLayoutEngine.MeasureGlyphWidth('I', "Arial", 20, isBold: false, isItalic: false); - - Assert.True(widthW > widthI, "W should be significantly wider than I in proportional fonts"); - Assert.True(widthW > 0); - Assert.True(widthI > 0); - - double widthBold = TextLayoutEngine.MeasureGlyphWidth('W', "Arial", 20, isBold: true, isItalic: false); - Assert.True(widthBold >= widthW, "Bold glyphs should be slightly wider or equal to regular glyphs"); - } - - [Fact] - public void TextLayoutEngine_CalculateNormalLayout_WordWrapsCorrectly() - { - string text = "First line here\nSecond line is quite long and should wrap when width is small enough"; - var result = TextLayoutEngine.CalculateNormalLayout( - text, - "Arial", - 16, - isBold: false, - isItalic: false, - availableWidth: 120, - lineHeightMultiplier: 1.2, - charSpacing: 0, - wordSpacing: 0, - paragraphSpacing: 0, - alignment: TextAlignmentMode.Left, - vAlign: TextVerticalAlignment.Top, - boxHeight: 200, - wrap: true, - padding: 4 - ); - - Assert.True(result.Lines.Count >= 2, "Expected multiple lines from newline and word wrapping"); - - foreach (var line in result.Lines) - { - Assert.False(string.IsNullOrEmpty(line.Text)); - Assert.True(line.Width > 0); - Assert.True(line.Height > 0); - } - } - - [Fact] - public void TextLayoutEngine_CalculateCurvedGlyphs_CalculatesValidGlyphTransforms() - { - string text = "CURVED HEADING"; - var layoutResult = TextLayoutEngine.CalculateCurvedGlyphs( - text, - "Arial", - 20, - isBold: true, - isItalic: false, - boxWidth: 300, - boxHeight: 150, - radius: 100, - arcAngleDeg: 120, - startAngleDeg: -60, - clockwise: true, - invert: false, - charSpacing: 0, - circularPlacement: CircularTextPlacement.TopArc, - shapeMode: TextShapeMode.Curved, - baselineShift: 0 - ); - - Assert.Equal(text.Length, layoutResult.Glyphs.Count); - - for (int i = 0; i < layoutResult.Glyphs.Count; i++) - { - var g = layoutResult.Glyphs[i]; - Assert.Equal(text[i].ToString(), g.Text); - Assert.True(!double.IsNaN(g.X) && !double.IsInfinity(g.X)); - Assert.True(!double.IsNaN(g.Y) && !double.IsInfinity(g.Y)); - Assert.True(!double.IsNaN(g.TangentAngleDeg) && !double.IsInfinity(g.TangentAngleDeg)); - } - } - - [Fact] - public void TextLayoutEngine_CalculateCircularGlyphs_PositionsGlyphsAroundCircle() - { - string text = "CIRCULAR BADGE EMBLEM"; - double width = 200; - double height = 200; - double radius = 80; - - var layoutResult = TextLayoutEngine.CalculateCurvedGlyphs( - text, - "Arial", - 14, - isBold: true, - isItalic: false, - boxWidth: width, - boxHeight: height, - radius: radius, - arcAngleDeg: 360, - startAngleDeg: -90, - clockwise: true, - invert: false, - charSpacing: 0, - circularPlacement: CircularTextPlacement.FullCircle, - shapeMode: TextShapeMode.Circular, - baselineShift: 0 - ); - - Assert.Equal(text.Length, layoutResult.Glyphs.Count); - - double centerX = width / 2.0; - double centerY = height / 2.0; - - foreach (var g in layoutResult.Glyphs) - { - if (string.IsNullOrWhiteSpace(g.Text)) continue; - double dx = g.X - centerX; - double dy = g.Y - centerY; - double dist = Math.Sqrt(dx * dx + dy * dy); - // Distance should be close to radius - Assert.InRange(dist, 40, 120); - } - } - - [Fact] - public void TextLayoutEngine_GenerateSvgMarkup_ProducesValidVectorMarkup() - { - var textEl = new PdfTextElement - { - Text = "VECTOR SVG EXPORT", - Width = 250, - Height = 100, - FontSize = 18, - TextColorHex = "#2563EB", - HasStroke = true, - StrokeColorHex = "#1E293B", - StrokeWidth = 1.5, - HasShadow = true, - ShadowColorHex = "#40000000", - ShapeMode = TextShapeMode.Curved, - CurveRadius = 120, - CurveArcAngle = 90 - }; - - string svg = TextLayoutEngine.GenerateSvgMarkup(textEl); - Assert.NotNull(svg); - Assert.StartsWith("", svg); - Assert.Contains("xmlns=\"http://www.w3.org/2000/svg\"", svg); - Assert.Contains("", svg); - Assert.Contains(" 500, "Exported PDF file should be non-empty and well-formed"); - } - finally - { - if (File.Exists(tempPdfPath)) - { - File.Delete(tempPdfPath); - } - } - } - - [Fact] - public void InspectorViewModel_TypographyCommands_SupportUndoRedo() - { - var undoRedo = new UndoRedoService(); - var inspector = new InspectorViewModel - { - UndoRedo = undoRedo - }; - - var textEl = new PdfTextElement - { - Text = "Undoable Text", - ShapeMode = TextShapeMode.Normal, - HasStroke = false, - HasShadow = false, - IsDoubleUnderline = false - }; - var vm = new TextElementViewModel(textEl); - inspector.SelectedElement = vm; - - // 1. Toggle Double Underline - Assert.False(vm.IsDoubleUnderline); - inspector.ToggleDoubleUnderlineCommand.Execute(null); - Assert.True(vm.IsDoubleUnderline); - Assert.True(undoRedo.CanUndo); - - undoRedo.Undo(); - Assert.False(vm.IsDoubleUnderline); - - undoRedo.Redo(); - Assert.True(vm.IsDoubleUnderline); - - // 2. Change Shape Mode - inspector.SetTextShapeModeCommand.Execute("Curved"); - Assert.Equal(TextShapeMode.Curved, vm.ShapeMode); - - undoRedo.Undo(); - Assert.Equal(TextShapeMode.Normal, vm.ShapeMode); - - // 3. Toggle Stroke - inspector.ToggleTextStrokeCommand.Execute(null); - Assert.True(vm.HasStroke); - - undoRedo.Undo(); - Assert.False(vm.HasStroke); - - // 4. Toggle Shadow - inspector.ToggleTextShadowCommand.Execute(null); - Assert.True(vm.HasShadow); - - undoRedo.Undo(); - Assert.False(vm.HasShadow); - - // 5. Apply Preset - inspector.ApplyTypographyPresetCommand.Execute("circlebadge"); - Assert.Equal(TextShapeMode.Circular, vm.ShapeMode); - - undoRedo.Undo(); - Assert.Equal(TextShapeMode.Normal, vm.ShapeMode); - } - - [Fact] - public void TextLayoutEngine_CalculateNormalLayout_AlignmentsAndPadding() - { - string text = "Centered Heading Text"; - var resultLeft = TextLayoutEngine.CalculateNormalLayout( - text, "Arial", 16, false, false, 300, 1.2, 0, 0, 0, TextAlignmentMode.Left, TextVerticalAlignment.Top, 100, false, 10); - var resultCenter = TextLayoutEngine.CalculateNormalLayout( - text, "Arial", 16, false, false, 300, 1.2, 0, 0, 0, TextAlignmentMode.Center, TextVerticalAlignment.Top, 100, false, 10); - var resultRight = TextLayoutEngine.CalculateNormalLayout( - text, "Arial", 16, false, false, 300, 1.2, 0, 0, 0, TextAlignmentMode.Right, TextVerticalAlignment.Top, 100, false, 10); - - Assert.Single(resultLeft.Lines); - Assert.Single(resultCenter.Lines); - Assert.Single(resultRight.Lines); - - Assert.Equal(10.0, resultLeft.Lines[0].X); // starts at padding - Assert.True(resultCenter.Lines[0].X > resultLeft.Lines[0].X, "Center alignment X should be greater than Left alignment X"); - Assert.True(resultRight.Lines[0].X > resultCenter.Lines[0].X, "Right alignment X should be greater than Center alignment X"); - } - - [Fact] - public void TextLayoutEngine_CalculateBezierGlyphs_PositionsGlyphsAlongCubicBezier() - { - string text = "BEZIER WAVE CURVE"; - var pts = TextLayoutEngine.GetPresetBezierControlPoints(BezierCurvePreset.Wave); - - var result = TextLayoutEngine.CalculateBezierGlyphs( - text, "Arial", 16, false, false, 400, 150, - pts.P0, pts.P1, pts.P2, pts.P3, - invert: false, charSpacing: 0, baselineShift: 0); - - Assert.Equal(text.Length, result.Glyphs.Count); - Assert.True(result.BoundingBox.Width > 100); - Assert.True(result.BoundingBox.Height > 20); - - // Check that glyphs progress along X from left to right - for (int i = 1; i < result.Glyphs.Count; i++) - { - Assert.True(result.Glyphs[i].X >= result.Glyphs[i - 1].X, "Glyphs should advance along X"); - } - } - - [Fact] - public void TextLayoutEngine_BezierPresets_ProvideDistinctControlPoints() - { - var wave = TextLayoutEngine.GetPresetBezierControlPoints(BezierCurvePreset.Wave); - var scurve = TextLayoutEngine.GetPresetBezierControlPoints(BezierCurvePreset.SCurve); - var bridge = TextLayoutEngine.GetPresetBezierControlPoints(BezierCurvePreset.Bridge); - var valley = TextLayoutEngine.GetPresetBezierControlPoints(BezierCurvePreset.Valley); - var rise = TextLayoutEngine.GetPresetBezierControlPoints(BezierCurvePreset.Rise); - - Assert.NotEqual(wave.P1.Y, bridge.P1.Y); - Assert.NotEqual(bridge.P1.Y, valley.P1.Y); - Assert.NotEqual(scurve.P0.Y, rise.P0.Y); - } - - [Fact] - public void TextLayoutEngine_GenerateSvgMarkup_SupportsBezierCurve() - { - var textEl = new PdfTextElement - { - Text = "SMOOTH BEZIER TEXT", - FontSize = 18, - ShapeMode = TextShapeMode.BezierCurve, - BezierPreset = BezierCurvePreset.SCurve, - Width = 350, - Height = 120, - TextColorHex = "#4F46E5", - IsBold = true - }; - - string svg = TextLayoutEngine.GenerateSvgMarkup(textEl); - - Assert.NotNull(svg); - Assert.StartsWith("", svg); - Assert.Contains("fill=\"#4F46E5\"", svg); - Assert.Contains("font-size=\"18.0\"", svg); - Assert.Contains("transform=\"rotate(", svg); - } - - [Fact] - public void TextElementViewModel_BezierPresets_ApplyCorrectly() - { - var vm = new TextElementViewModel(); - - vm.ApplyTypographyPreset("wave"); - Assert.Equal(TextShapeMode.BezierCurve, vm.ShapeMode); - Assert.Equal(BezierCurvePreset.Wave, vm.BezierPreset); - - vm.ApplyTypographyPreset("scurve"); - Assert.Equal(TextShapeMode.BezierCurve, vm.ShapeMode); - Assert.Equal(BezierCurvePreset.SCurve, vm.BezierPreset); - - vm.ApplyTypographyPreset("bridge"); - Assert.Equal(TextShapeMode.BezierCurve, vm.ShapeMode); - Assert.Equal(BezierCurvePreset.Bridge, vm.BezierPreset); - } - - [Fact] - public void InspectorViewModel_SetBezierPresetCommand_SupportsUndoRedo() - { - var undoRedo = new UndoRedoService(); - var inspector = new InspectorViewModel { UndoRedo = undoRedo }; - var vm = new TextElementViewModel(new PdfTextElement { ShapeMode = TextShapeMode.BezierCurve }); - inspector.SelectedElement = vm; - - inspector.SetBezierPresetCommand.Execute("SCurve"); - Assert.Equal(BezierCurvePreset.SCurve, vm.BezierPreset); - Assert.True(undoRedo.CanUndo); - - undoRedo.Undo(); - Assert.Equal(BezierCurvePreset.Wave, vm.BezierPreset); - - undoRedo.Redo(); - Assert.Equal(BezierCurvePreset.SCurve, vm.BezierPreset); - } - - [Fact] - public async Task PdfExportService_ExportsBezierTypographyToPdf_Successfully() - { - var exportService = new PdfExportService(); - var doc = new PdfDocumentModel { Title = "Bezier Export Test" }; - var page = new PdfPageModel { PageNumber = 1, Width = 595, Height = 842 }; - - page.Elements.Add(new PdfTextElement - { - X = 50, - Y = 100, - Width = 400, - Height = 150, - Text = "ELEGANT BEZIER WAVE TYPOGRAPHY", - FontSize = 18, - ShapeMode = TextShapeMode.BezierCurve, - BezierPreset = BezierCurvePreset.Wave, - TextColorHex = "#2563EB", - IsBold = true - }); - - doc.Pages.Add(page); - - string tempPdfPath = Path.Combine(Path.GetTempPath(), $"bezier_test_{Guid.NewGuid():N}.pdf"); - try - { - await exportService.ExportToFileAsync(doc, tempPdfPath); - Assert.True(File.Exists(tempPdfPath)); - var fileInfo = new FileInfo(tempPdfPath); - Assert.True(fileInfo.Length > 500); - } - finally - { - if (File.Exists(tempPdfPath)) - { - File.Delete(tempPdfPath); - } - } - } -} - - diff --git a/tests/PdfEditorApp.Tests/UiSettingsTests.cs b/tests/PdfEditorApp.Tests/UiSettingsTests.cs deleted file mode 100644 index f668609..0000000 --- a/tests/PdfEditorApp.Tests/UiSettingsTests.cs +++ /dev/null @@ -1,425 +0,0 @@ -using System; -using System.IO; -using Avalonia.Layout; -using CommunityToolkit.Mvvm.Messaging; -using PdfEditorApp.Core.Models; -using PdfEditorApp.Messages; -using PdfEditorApp.Models; -using PdfEditorApp.Services; -using PdfEditorApp.ViewModels; -using Xunit; - -namespace PdfEditorApp.Tests; - -[Collection("ThemeServiceCollection")] -public class UiSettingsTests : IDisposable -{ - private readonly string _tempSettingsDir; - private readonly string _tempSettingsFile; - - public UiSettingsTests() - { - _tempSettingsDir = Path.Combine(Path.GetTempPath(), "FryPdf_UiSettingsTests_" + Guid.NewGuid().ToString("N")); - Directory.CreateDirectory(_tempSettingsDir); - _tempSettingsFile = Path.Combine(_tempSettingsDir, "test_ui_settings.json"); - } - - public void Dispose() - { - try - { - if (Directory.Exists(_tempSettingsDir)) - { - Directory.Delete(_tempSettingsDir, true); - } - } - catch - { - // Best effort cleanup - } - } - - [Fact] - public void UiSettingsService_InitializesWithDefaults_WhenFileDoesNotExist() - { - var service = new UiSettingsService(_tempSettingsFile); - - Assert.Equal(ToastPosition.BottomCenter, service.Settings.ToastPosition); - Assert.Equal(ToastStyleVariant.Solid, service.Settings.ToastStyleVariant); - Assert.Equal(3500, service.Settings.ToastDurationMs); - Assert.True(service.Settings.ToastShowCloseButton); - Assert.False(service.Settings.ToastSoundEnabled); - Assert.Equal(AppThemeMode.Light, service.Settings.ThemeMode); - Assert.Equal(PdfReaderTheme.Default, service.Settings.ReadingTheme); - Assert.False(service.Settings.ShowGridByDefault); - Assert.False(service.Settings.SnapToGridByDefault); - } - - [Fact] - public void UiSettingsService_UpdateSettings_PersistsToDiskAndFiresEvent() - { - var service = new UiSettingsService(_tempSettingsFile); - UiSettingsModel? received = null; - service.SettingsChanged += (s) => received = s; - - service.UpdateSettings(s => - { - s.ToastPosition = ToastPosition.TopRight; - s.ToastStyleVariant = ToastStyleVariant.Subtle; - s.ToastDurationMs = 6000; - s.ToastShowCloseButton = false; - }); - - Assert.True(File.Exists(_tempSettingsFile)); - Assert.NotNull(received); - Assert.Equal(ToastPosition.TopRight, received.ToastPosition); - Assert.Equal(ToastStyleVariant.Subtle, received.ToastStyleVariant); - Assert.Equal(6000, received.ToastDurationMs); - Assert.False(received.ToastShowCloseButton); - - // Verify persistence by loading in new instance - var reloadedService = new UiSettingsService(_tempSettingsFile); - Assert.Equal(ToastPosition.TopRight, reloadedService.Settings.ToastPosition); - Assert.Equal(ToastStyleVariant.Subtle, reloadedService.Settings.ToastStyleVariant); - Assert.Equal(6000, reloadedService.Settings.ToastDurationMs); - Assert.False(reloadedService.Settings.ToastShowCloseButton); - } - - [Fact] - public void UiSettingsService_ResetToDefaults_RestoresDefaultsAndSaves() - { - var service = new UiSettingsService(_tempSettingsFile); - service.UpdateSettings(s => - { - s.ToastPosition = ToastPosition.TopLeft; - s.ToastDurationMs = 2000; - }); - - Assert.Equal(ToastPosition.TopLeft, service.Settings.ToastPosition); - - service.ResetToDefaults(); - - Assert.Equal(ToastPosition.BottomCenter, service.Settings.ToastPosition); - Assert.Equal(3500, service.Settings.ToastDurationMs); - - var reloaded = new UiSettingsService(_tempSettingsFile); - Assert.Equal(ToastPosition.BottomCenter, reloaded.Settings.ToastPosition); - } - - [Fact] - public void UiSettingsService_CorruptJson_GracefullyFallsBackToDefaults() - { - File.WriteAllText(_tempSettingsFile, "{ broken-json: invalid-content"); - - var service = new UiSettingsService(_tempSettingsFile); - - Assert.NotNull(service.Settings); - Assert.Equal(ToastPosition.BottomCenter, service.Settings.ToastPosition); - } - - [Theory] - [InlineData("Could not open file: unrecognized format", null, ToastNotificationType.Danger)] - [InlineData("Failed to export document", null, ToastNotificationType.Danger)] - [InlineData("Corrupt or invalid PDF file", null, ToastNotificationType.Danger)] - [InlineData("Something broke", "AlertCircleOutline", ToastNotificationType.Danger)] - [InlineData("Warning: document contains unsaved edits", null, ToastNotificationType.Warning)] - [InlineData("Nothing to undo", null, ToastNotificationType.Warning)] - [InlineData("Saved successfully to /path/test.pdf", null, ToastNotificationType.Success)] - [InlineData("Copied 3 Elements", null, ToastNotificationType.Success)] - [InlineData("Pasted 1 Element", null, ToastNotificationType.Success)] - [InlineData("Created new document from Blank template", null, ToastNotificationType.Success)] - [InlineData("Switched to Dark Studio Theme", null, ToastNotificationType.Primary)] - [InlineData("Active Tool: Text", null, ToastNotificationType.Primary)] - [InlineData("Zoom: 125%", null, ToastNotificationType.Primary)] - [InlineData("Fit to Width", null, ToastNotificationType.Primary)] - [InlineData("General studio notice", null, ToastNotificationType.General)] - public void MainViewModel_InferToastType_ClassifiesCorrectly(string message, string? icon, ToastNotificationType expected) - { - var result = MainViewModel.InferToastType(message, icon); - Assert.Equal(expected, result); - } - - [Theory] - [InlineData(ToastPosition.TopLeft, HorizontalAlignment.Left, VerticalAlignment.Top, 32, 54, 0, 0)] - [InlineData(ToastPosition.TopCenter, HorizontalAlignment.Center, VerticalAlignment.Top, 0, 54, 0, 0)] - [InlineData(ToastPosition.TopRight, HorizontalAlignment.Right, VerticalAlignment.Top, 0, 54, 32, 0)] - [InlineData(ToastPosition.BottomLeft, HorizontalAlignment.Left, VerticalAlignment.Bottom, 32, 0, 0, 48)] - [InlineData(ToastPosition.BottomCenter, HorizontalAlignment.Center, VerticalAlignment.Bottom, 0, 0, 0, 48)] - [InlineData(ToastPosition.BottomRight, HorizontalAlignment.Right, VerticalAlignment.Bottom, 0, 0, 32, 48)] - public void MainViewModel_ToastPlacement_CalculatesCoordinatesProperly( - ToastPosition position, - HorizontalAlignment expectedHoriz, - VerticalAlignment expectedVert, - double left, double top, double right, double bottom) - { - var vm = new MainViewModel(); - vm.ToastPosition = position; - - Assert.Equal(expectedHoriz, vm.ToastHorizontalAlignment); - Assert.Equal(expectedVert, vm.ToastVerticalAlignment); - Assert.Equal(left, vm.ToastMargin.Left); - Assert.Equal(top, vm.ToastMargin.Top); - Assert.Equal(right, vm.ToastMargin.Right); - Assert.Equal(bottom, vm.ToastMargin.Bottom); - } - - [Fact] - public void MainViewModel_DismissToast_HidesNotification() - { - var vm = new MainViewModel(); - vm.ShowToast("Test message", ToastNotificationType.Success); - Assert.True(vm.IsToastVisible); - - vm.DismissToastCommand.Execute(null); - - Assert.False(vm.IsToastVisible); - } - - [Fact] - public void SettingsViewModel_TestPlaygroundCommands_TriggerCorrectNotifications() - { - var service = new UiSettingsService(_tempSettingsFile); - var vm = new SettingsViewModel(service); - - string? receivedMsg = null; - ToastNotificationType? receivedType = null; - string? receivedIcon = null; - - WeakReferenceMessenger.Default.Register(this, (r, m) => - { - receivedMsg = m.Message; - receivedType = m.Type; - receivedIcon = m.ActionLabel; - }); - - try - { - // Test Primary - vm.TestPrimaryNotificationCommand.Execute(null); - Assert.Equal("Primary message comes here", receivedMsg); - Assert.Equal(ToastNotificationType.Primary, receivedType); - Assert.Equal("InformationOutline", receivedIcon); - - // Test Success - vm.TestSuccessNotificationCommand.Execute(null); - Assert.Equal("Success message comes here", receivedMsg); - Assert.Equal(ToastNotificationType.Success, receivedType); - Assert.Equal("CheckCircleOutline", receivedIcon); - - // Test Danger - vm.TestDangerNotificationCommand.Execute(null); - Assert.Equal("Danger message comes here", receivedMsg); - Assert.Equal(ToastNotificationType.Danger, receivedType); - Assert.Equal("AlertOctagonOutline", receivedIcon); - - // Test Warning - vm.TestWarningNotificationCommand.Execute(null); - Assert.Equal("Warning message comes here", receivedMsg); - Assert.Equal(ToastNotificationType.Warning, receivedType); - Assert.Equal("AlertOutline", receivedIcon); - - // Test General - vm.TestGeneralNotificationCommand.Execute(null); - Assert.Equal("General message comes here", receivedMsg); - Assert.Equal(ToastNotificationType.General, receivedType); - Assert.Equal("InformationOutline", receivedIcon); - } - finally - { - WeakReferenceMessenger.Default.Unregister(this); - } - } - - [Fact] - public void SettingsViewModel_PositionAndStyleCommands_MutateStateAndService() - { - var service = new UiSettingsService(_tempSettingsFile); - var vm = new SettingsViewModel(service); - - vm.SetToastPositionCommand.Execute(ToastPosition.TopCenter); - Assert.Equal(ToastPosition.TopCenter, vm.ToastPosition); - Assert.Equal(ToastPosition.TopCenter, service.Settings.ToastPosition); - - vm.SetToastStyleVariantCommand.Execute(ToastStyleVariant.Subtle); - Assert.Equal(ToastStyleVariant.Subtle, vm.ToastStyleVariant); - Assert.Equal(ToastStyleVariant.Subtle, service.Settings.ToastStyleVariant); - - vm.SetToastDurationCommand.Execute(6000); - Assert.Equal(6000, vm.ToastDurationMs); - Assert.Equal(6000, service.Settings.ToastDurationMs); - - vm.ToggleToastCloseButtonCommand.Execute(null); - Assert.False(vm.ToastShowCloseButton); - Assert.False(service.Settings.ToastShowCloseButton); - } - - [Fact] - public void SettingsViewModel_Commands_AcceptStringParametersFromXaml() - { - var service = new UiSettingsService(_tempSettingsFile); - var vm = new SettingsViewModel(service); - - // Position via string (from XAML CommandParameter="TopLeft") - Assert.True(vm.SetToastPositionCommand.CanExecute("TopLeft")); - vm.SetToastPositionCommand.Execute("TopLeft"); - Assert.Equal(ToastPosition.TopLeft, vm.ToastPosition); - Assert.Equal(ToastPosition.TopLeft, service.Settings.ToastPosition); - - Assert.True(vm.SetToastPositionCommand.CanExecute("BottomRight")); - vm.SetToastPositionCommand.Execute("BottomRight"); - Assert.Equal(ToastPosition.BottomRight, vm.ToastPosition); - - // Style variant via string (from XAML CommandParameter="Subtle") - Assert.True(vm.SetToastStyleVariantCommand.CanExecute("Subtle")); - vm.SetToastStyleVariantCommand.Execute("Subtle"); - Assert.Equal(ToastStyleVariant.Subtle, vm.ToastStyleVariant); - Assert.False(vm.PreviewIsSolid); - - // Duration via string (from XAML CommandParameter="2000") - Assert.True(vm.SetToastDurationCommand.CanExecute("2000")); - vm.SetToastDurationCommand.Execute("2000"); - Assert.Equal(2000, vm.ToastDurationMs); - - // Theme mode via string - Assert.True(vm.SetThemeModeCommand.CanExecute("Dark")); - vm.SetThemeModeCommand.Execute("Dark"); - Assert.Equal(AppThemeMode.Dark, vm.ThemeMode); - - // Reading theme via string - Assert.True(vm.SetReadingThemeCommand.CanExecute("Sepia")); - vm.SetReadingThemeCommand.Execute("Sepia"); - Assert.Equal(PdfReaderTheme.Sepia, vm.ReadingTheme); - - // Zoom mode via string - Assert.True(vm.SetDefaultZoomModeCommand.CanExecute("FitWidth")); - vm.SetDefaultZoomModeCommand.Execute("FitWidth"); - Assert.Equal(PdfViewerZoomMode.FitWidth, vm.DefaultZoomMode); - } - - [Fact] - public void SettingsViewModel_LivePreviewBrushes_UpdateCorrectly() - { - var service = new UiSettingsService(_tempSettingsFile); - var vm = new SettingsViewModel(service); - - // Solid Primary - vm.SetToastStyleVariantCommand.Execute(ToastStyleVariant.Solid); - vm.TestPrimaryNotificationCommand.Execute(null); - Assert.True(vm.PreviewIsSolid); - Assert.NotNull(vm.PreviewBackgroundBrush); - Assert.NotNull(vm.PreviewForegroundBrush); - - // Subtle Danger - vm.SetToastStyleVariantCommand.Execute(ToastStyleVariant.Subtle); - vm.TestDangerNotificationCommand.Execute(null); - Assert.False(vm.PreviewIsSolid); - Assert.Equal(ToastNotificationType.Danger, vm.PreviewToastType); - Assert.NotNull(vm.PreviewBackgroundBrush); - Assert.NotNull(vm.PreviewBorderBrush); - } - - [Fact] - public void MainViewModel_FullPipeline_PlaygroundButtonTriggersMainToast() - { - var mainVm = new MainViewModel(); - - // Trigger Success test from settings playground - mainVm.Home.Settings.TestSuccessNotificationCommand.Execute(null); - - Assert.True(mainVm.IsToastVisible); - Assert.Equal(ToastNotificationType.Success, mainVm.ToastType); - Assert.Equal("Success message comes here", mainVm.ToastMessage); - Assert.Equal("CheckCircleOutline", mainVm.ToastIcon); - } - - [Fact] - public void HomeViewModel_SettingsNavigation_WorksCleanly() - { - var home = new HomeViewModel(); - Assert.False(home.IsSettingsSection); - - home.SelectNavSectionCommand.Execute("Settings"); - - Assert.Equal(HomeNavSection.Settings, home.SelectedNavSection); - Assert.True(home.IsSettingsSection); - Assert.False(home.IsHomeSection); - Assert.NotNull(home.Settings); - } - - [Fact] - public void HomeViewModel_SelectNavSection_PassesSelfAsServiceProviderToViewFactory() - { - var navReg = new PdfEditorApp.Services.Navigation.NavigationRegistry(); - IServiceProvider? capturedSp = null; - object expectedView = new object(); - - navReg.RegisterNavigationItem(new PdfEditorApp.Core.Plugins.Descriptors.NavigationItemDescriptor - { - Id = "Settings", - Title = "Settings", - Group = "Preferences", - ViewFactory = sp => - { - capturedSp = sp; - return expectedView; - } - }); - - var home = new HomeViewModel( - new RecentDocumentsService(), - new TemplateService(), - new ProjectPersistenceService(), - new PdfEditorApp.Services.Tools.Core.PdfToolRegistry(), - null, - null, - new ThemeService(), - new UiSettingsService(), - navReg); - - // Act: Navigate to Settings - home.SelectNavSectionCommand.Execute("Settings"); - - // Assert - Assert.Equal(HomeNavSection.Settings, home.SelectedNavSection); - Assert.True(home.IsSettingsSection); - Assert.Same(expectedView, home.DynamicPageView); - Assert.NotNull(capturedSp); - Assert.Same(home, capturedSp.GetService(typeof(HomeViewModel))); - Assert.Same(home.Settings, capturedSp.GetService(typeof(SettingsViewModel))); - Assert.Same(home.FontManager, capturedSp.GetService(typeof(FontManagerViewModel))); - Assert.Same(home.TesseractManager, capturedSp.GetService(typeof(TesseractManagerViewModel))); - Assert.Same(home.HelpGuide, capturedSp.GetService(typeof(HelpGuideViewModel))); - } - - [Fact] - public void HomeViewModel_SelectNavSection_WhenViewFactoryThrows_GracefullyFallsBackWithoutCrashing() - { - var navReg = new PdfEditorApp.Services.Navigation.NavigationRegistry(); - - navReg.RegisterNavigationItem(new PdfEditorApp.Core.Plugins.Descriptors.NavigationItemDescriptor - { - Id = "Settings", - Title = "Settings", - Group = "Preferences", - ViewFactory = sp => throw new InvalidOperationException("Simulated plugin view failure") - }); - - var home = new HomeViewModel( - new RecentDocumentsService(), - new TemplateService(), - new ProjectPersistenceService(), - new PdfEditorApp.Services.Tools.Core.PdfToolRegistry(), - null, - null, - new ThemeService(), - new UiSettingsService(), - navReg); - - // Must not throw an unhandled exception! - var ex = Record.Exception(() => home.SelectNavSectionCommand.Execute("Settings")); - Assert.Null(ex); - Assert.Null(home.DynamicPageView); - Assert.Equal(HomeNavSection.Settings, home.SelectedNavSection); - Assert.True(home.IsSettingsSection); - } -} diff --git a/watch b/watch deleted file mode 100755 index 8b904dc..0000000 --- a/watch +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash -dotnet clean -dotnet build - -dotnet watch --project src/PdfEditorApp "$@"

    w^%Ozq;~V&zY_>?|upvBB|5l>)QNO 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�{` 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

    4nsByL5ZVvg9rT^Wa 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 z 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 diff --git a/src/PdfEditorApp/Assets/Fonts/Lora.ttf b/src/PdfEditorApp/Assets/Fonts/Lora.ttf deleted file mode 100644 index ee1914c3746140523de2940d267ec2215bd85d5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 212196 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 t3=+)GE@JF#YWy6c1d(YvWSS7 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