From 9a3d6b6984c72e2063d4403df070c6b936c9add3 Mon Sep 17 00:00:00 2001 From: TheIrvin Date: Sat, 3 Oct 2026 14:18:11 -0500 Subject: [PATCH 1/3] feat: add local document library --- .github/workflows/ci.yml | 3 +- README.md | 101 +++-- .../local-document-library-mobile.png | Bin 0 -> 52199 bytes docs/screenshots/local-document-library.png | Bin 0 -> 76494 bytes src/Application/DTOs/LibraryAnswerDto.cs | 8 + src/Application/DTOs/LibrarySearchHit.cs | 10 + .../Interfaces/IAnswerGenerator.cs | 8 + .../Interfaces/IConversionRepository.cs | 4 + .../Interfaces/IFileStorageService.cs | 1 + src/Application/Services/ConversionService.cs | 37 +- src/Application/Services/LibraryService.cs | 57 +++ .../LocalExtractiveAnswerGenerator.cs | 27 ++ src/Application/Services/MarkdownChunker.cs | 100 +++++ src/Domain/Entities/Conversion.cs | 1 + src/Domain/Entities/DocumentChunk.cs | 11 + .../Persistence/AppDbContext.cs | 13 + .../Persistence/ConversionRepository.cs | 63 +++ .../Persistence/LocalLibrarySchema.cs | 23 + .../Services/FileStorageService.cs | 6 + src/Web/Controllers/ConversionController.cs | 19 +- src/Web/Program.cs | 6 +- src/Web/Views/Conversion/Index.cshtml | 123 ++++-- src/Web/wwwroot/css/site.css | 393 +++++++++++++++--- src/Web/wwwroot/js/conversion.js | 341 ++++++++++----- .../ConversionServiceTests.cs | 92 ++++ .../LocalLibrarySchemaTests.cs | 62 +++ 26 files changed, 1254 insertions(+), 255 deletions(-) create mode 100644 docs/screenshots/local-document-library-mobile.png create mode 100644 docs/screenshots/local-document-library.png create mode 100644 src/Application/DTOs/LibraryAnswerDto.cs create mode 100644 src/Application/DTOs/LibrarySearchHit.cs create mode 100644 src/Application/Interfaces/IAnswerGenerator.cs create mode 100644 src/Application/Services/LibraryService.cs create mode 100644 src/Application/Services/LocalExtractiveAnswerGenerator.cs create mode 100644 src/Application/Services/MarkdownChunker.cs create mode 100644 src/Domain/Entities/DocumentChunk.cs create mode 100644 src/Infrastructure/Persistence/LocalLibrarySchema.cs create mode 100644 tests/MarkItDownWeb.Tests/LocalLibrarySchemaTests.cs diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4b53fa3..3e49ae8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,4 +16,5 @@ jobs: - uses: actions/setup-dotnet@v6 with: dotnet-version: 10.0.x - - run: dotnet test MarkItDownWeb.slnx --configuration Release + - run: dotnet build MarkItDownWeb.slnx --configuration Release --warnaserror + - run: dotnet test MarkItDownWeb.slnx --configuration Release --no-build diff --git a/README.md b/README.md index ec2a8c7..6838c7a 100644 --- a/README.md +++ b/README.md @@ -1,94 +1,91 @@ # FileToMarkdown -Aplicación web local para convertir documentos a Markdown. Selecciona un archivo, revisa el resultado en el navegador y descarga un `.md` con el nombre del documento original. +Biblioteca local para convertir documentos a Markdown, buscar su contenido y consultar fragmentos con referencias a su archivo y sección de origen. -## Captura +**Escritorio** -![Conversión de un documento y su vista previa Markdown con historial local](docs/screenshots/local-conversion-flow.png) +![Biblioteca local en escritorio](docs/screenshots/local-document-library.png) + +**Móvil** + +![Biblioteca local en móvil](docs/screenshots/local-document-library-mobile.png) ## Funciones -- Interfaz web responsive con vista previa, copia y descarga del Markdown. -- Historial local de conversiones con búsqueda y reapertura de resultados. -- Conversión de PDF, DOCX, PPTX, XLSX, HTML y CSV mediante [Microsoft MarkItDown](https://github.com/microsoft/markitdown). -- Base de datos SQLite y archivos de resultado guardados en el equipo. -- Validación de extensión, tamaño máximo de 100 MiB y firma de archivos PDF/Office. +- Importa hasta 10 archivos por lote; cada archivo puede ocupar hasta 100 MiB. El estado de conversión se muestra por archivo y un error no detiene los demás. +- Convierte PDF, DOCX, PPTX, XLSX, HTML y CSV con [Microsoft MarkItDown](https://github.com/microsoft/markitdown). +- Previsualiza, copia y descarga Markdown. El historial local permite reabrir o borrar conversiones. +- Indexa el Markdown en fragmentos de hasta 1.200 caracteres y busca nombres de archivo y contenido en SQLite. +- Consulta la biblioteca con respuestas extractivas: muestra el fragmento coincidente y cita el archivo y la sección. Si no encuentra evidencia, lo indica explícitamente. -La aplicación se ejecuta en tu equipo. Los archivos se envían al proceso web local y a MarkItDown; esta configuración no proporciona autenticación, así que mantenla accesible solo desde tu propio equipo y no la expongas a una red pública. +La búsqueda y las consultas son locales y no necesitan claves ni conexión a un proveedor de IA. `IAnswerGenerator` permite añadir otro generador, pero esta versión solo registra el generador extractivo local y no envía documentos fuera del equipo. ## Requisitos - [.NET SDK 10](https://dotnet.microsoft.com/download/dotnet/10.0) -- Python y `pip` +- Python y `pip` para Microsoft MarkItDown -## Ejecutar en local +## Instalación y ejecución -Desde la raíz del repositorio: +Desde la raíz del repositorio, crea un entorno e instala MarkItDown con sus dependencias opcionales: -```bash +```powershell python -m venv .venv -``` - -Activa el entorno virtual y luego instala MarkItDown: - -```bash -# Windows PowerShell .venv\Scripts\Activate.ps1 python -m pip install --upgrade pip python -m pip install 'markitdown[all]' ``` -```bash -# Linux / macOS -source .venv/bin/activate -python -m pip install --upgrade pip -python -m pip install 'markitdown[all]' -``` - -Inicia la interfaz: +Inicia la aplicación: -```bash +```powershell dotnet run --project src/Web/MarkItDownWeb.Web.csproj --launch-profile http ``` -Abre [http://localhost:5241](http://localhost:5241). La ruta del ejecutable de Python se puede configurar con `MarkItDown__PythonPath`; por defecto se usa `python` del entorno activo. Por ejemplo, en PowerShell: +Abre [http://localhost:5241](http://localhost:5241). Si Python no está en `PATH`, establece `MarkItDown__PythonPath` con la ruta completa al ejecutable antes de iniciar la app: ```powershell $env:MarkItDown__PythonPath = (Get-Command python).Source dotnet run --project src/Web/MarkItDownWeb.Web.csproj --launch-profile http ``` -## Comprobar cambios - -```bash -dotnet test MarkItDownWeb.slnx --configuration Release -``` - -GitHub Actions ejecuta la misma comprobación al abrir o actualizar un pull request y al hacer push a `master`. - ## Uso -1. Elige un PDF, DOCX, PPTX, XLSX, HTML o CSV de hasta 100 MiB. -2. Pulsa **Convertir a Markdown** y revisa el contenido generado. -3. Cópialo o descárgalo como `.md`. -4. Abre una conversión anterior desde el historial. Los datos permanecen en el equipo. +1. Pulsa **Importar documentos** y selecciona archivos permitidos. Se procesan de uno en uno; el estado o error aparece junto al nombre del archivo. +2. Busca por nombre o contenido desde la barra superior. La lista central muestra tipo, fecha y estado. +3. Selecciona un documento para abrir su Markdown en el panel de detalle. Desde ahí puedes copiar, descargar o borrar. +4. Usa **Pregunta a la biblioteca** para consultar fragmentos relacionados con sus citas. Sin coincidencias, la app informa que no encontró respaldo. En móvil, el detalle queda debajo de la lista. -## Datos locales +## Almacenamiento y privacidad -La base de datos SQLite se crea automáticamente. Los archivos temporales se eliminan al terminar la conversión; el historial conserva los resultados Markdown y los metadatos. Las carpetas se pueden cambiar desde `src/Web/appsettings.json` (`Storage:UploadsFolder`, `Storage:MarkdownFolder` y `ConnectionStrings:DefaultConnection`). No se conserva el documento original después de convertirlo. +SQLite conserva los metadatos y los fragmentos indexados. Los resultados Markdown se guardan localmente en `Storage/Markdown`; el documento original solo existe en un archivo temporal durante la conversión y se elimina al terminar. Al borrar una conversión también se borran sus fragmentos por clave foránea y su archivo Markdown. Al iniciar, la app indexa conversiones existentes que todavía no tengan fragmentos. -## Estructura +Las rutas se configuran en `src/Web/appsettings.json` (`ConnectionStrings:DefaultConnection`, `Storage:UploadsFolder` y `Storage:MarkdownFolder`). La aplicación no incluye autenticación; mantenla accesible solo desde tu equipo y no la expongas a una red pública. + +## Arquitectura ```text src/ - Domain/ Entidades y tipos de conversión - Application/ Flujo de conversión e interfaces - Infrastructure/ MarkItDown, almacenamiento y SQLite - Web/ Interfaz ASP.NET Core MVC + Domain/ Conversiones y fragmentos indexados + Application/ Conversión, división Markdown, búsqueda y respuesta extractiva + Infrastructure/ MarkItDown, almacenamiento local y persistencia SQLite + Web/ Interfaz y endpoints ASP.NET Core MVC +tests/ Pruebas de conversión, búsqueda, citas, validación y borrado ``` -## Limitaciones conocidas +La tabla `DocumentChunks` se crea al iniciar. Esto conserva las bases SQLite existentes sin modificar su tabla de historial; los fragmentos se eliminan en cascada al borrar una conversión. + +## Formatos y límites verificados + +La aplicación acepta `.pdf`, `.docx`, `.pptx`, `.xlsx`, `.html` y `.csv`, limita cada archivo a 100 MiB y rechaza extensiones no permitidas. También comprueba las firmas PDF/ZIP de PDF y documentos Office; HTML y CSV no tienen una comprobación de firma. MarkItDown y sus dependencias instaladas determinan qué contenido puede extraerse de cada archivo. + +Las pruebas del repositorio verifican validación, indexación, búsqueda, citas, abstención y eliminación con un conversor simulado. CI no incluye documentos de muestra para comprobar cada formato de extremo a extremo. La extracción depende de MarkItDown; los PDF no reciben número de página de forma uniforme. La app cita los marcadores de página que existan en el Markdown y, en su ausencia, cita encabezados/secciones o `Contenido`. La búsqueda es léxica; no interpreta sinónimos ni genera resúmenes. No incluye OCR ni cuentas multiusuario. + +## Verificación + +```powershell +dotnet build MarkItDownWeb.slnx --configuration Release --warnaserror +dotnet test MarkItDownWeb.slnx --configuration Release +``` -- La calidad del Markdown depende del formato y del contenido del documento original. -- MarkItDown puede necesitar dependencias adicionales para ciertos formatos; consulta su documentación si la instalación completa no está disponible en tu plataforma. -- Esta versión está pensada para uso local individual; no incluye cuentas, aislamiento entre usuarios ni almacenamiento en la nube. +GitHub Actions ejecuta build con warnings como errores y las pruebas al abrir o actualizar un pull request y al hacer push a `master`. diff --git a/docs/screenshots/local-document-library-mobile.png b/docs/screenshots/local-document-library-mobile.png new file mode 100644 index 0000000000000000000000000000000000000000..83977ad0733dacae6647ceb7c57b4e8f01511855 GIT binary patch literal 52199 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 S{?85i*C+n}8i8*=5B(cw+3o58 literal 0 HcmV?d00001 diff --git a/src/Application/DTOs/LibraryAnswerDto.cs b/src/Application/DTOs/LibraryAnswerDto.cs new file mode 100644 index 0000000..dd255af --- /dev/null +++ b/src/Application/DTOs/LibraryAnswerDto.cs @@ -0,0 +1,8 @@ +namespace MarkItDownWeb.Application.DTOs; + +public sealed class LibraryAnswerDto +{ + public string Answer { get; init; } = string.Empty; + public bool HasEvidence { get; init; } + public IReadOnlyList Citations { get; init; } = []; +} diff --git a/src/Application/DTOs/LibrarySearchHit.cs b/src/Application/DTOs/LibrarySearchHit.cs new file mode 100644 index 0000000..8388da4 --- /dev/null +++ b/src/Application/DTOs/LibrarySearchHit.cs @@ -0,0 +1,10 @@ +namespace MarkItDownWeb.Application.DTOs; + +public sealed class LibrarySearchHit +{ + public Guid ConversionId { get; init; } + public string FileName { get; init; } = string.Empty; + public string Section { get; init; } = string.Empty; + public string Content { get; init; } = string.Empty; + public int MatchCount { get; init; } +} diff --git a/src/Application/Interfaces/IAnswerGenerator.cs b/src/Application/Interfaces/IAnswerGenerator.cs new file mode 100644 index 0000000..c2ba1ce --- /dev/null +++ b/src/Application/Interfaces/IAnswerGenerator.cs @@ -0,0 +1,8 @@ +using MarkItDownWeb.Application.DTOs; + +namespace MarkItDownWeb.Application.Interfaces; + +public interface IAnswerGenerator +{ + LibraryAnswerDto CreateAnswer(IReadOnlyList evidence); +} diff --git a/src/Application/Interfaces/IConversionRepository.cs b/src/Application/Interfaces/IConversionRepository.cs index 077faf8..29345b7 100644 --- a/src/Application/Interfaces/IConversionRepository.cs +++ b/src/Application/Interfaces/IConversionRepository.cs @@ -1,3 +1,4 @@ +using MarkItDownWeb.Application.DTOs; using MarkItDownWeb.Domain.Entities; namespace MarkItDownWeb.Application.Interfaces; @@ -7,6 +8,9 @@ public interface IConversionRepository Task AddAsync(Conversion conversion, CancellationToken ct = default); Task GetByIdAsync(Guid id, CancellationToken ct = default); Task> GetHistoryAsync(string? search, DateTime? date, CancellationToken ct = default); + Task> GetCompletedWithoutIndexAsync(CancellationToken ct = default); + Task AddChunksAsync(IReadOnlyCollection chunks, CancellationToken ct = default); Task DeleteAsync(Guid id, CancellationToken ct = default); + Task> SearchContentAsync(IReadOnlyCollection terms, int limit, CancellationToken ct = default); Task SaveChangesAsync(CancellationToken ct = default); } diff --git a/src/Application/Interfaces/IFileStorageService.cs b/src/Application/Interfaces/IFileStorageService.cs index ed35e39..d98b5e3 100644 --- a/src/Application/Interfaces/IFileStorageService.cs +++ b/src/Application/Interfaces/IFileStorageService.cs @@ -6,4 +6,5 @@ public interface IFileStorageService Task SaveMarkdownAsync(Guid conversionId, string markdown, CancellationToken ct = default); Task ReadMarkdownAsync(string markdownFilePath, CancellationToken ct = default); void DeleteTemporary(string filePath); + void DeleteMarkdown(string filePath); } diff --git a/src/Application/Services/ConversionService.cs b/src/Application/Services/ConversionService.cs index 12a38ee..ee615df 100644 --- a/src/Application/Services/ConversionService.cs +++ b/src/Application/Services/ConversionService.cs @@ -50,6 +50,7 @@ public async Task ConvertAsync(Stream fileStream, string fi var markdownPath = await _fileStorageService.SaveMarkdownAsync(conversion.Id, markdown, ct); conversion.MarkAsCompleted(markdownPath, stopwatch.Elapsed.TotalSeconds); + conversion.Chunks.AddRange(MarkdownChunker.Create(conversion.Id, markdown)); await _repository.AddAsync(conversion, ct); await _repository.SaveChangesAsync(ct); @@ -112,7 +113,41 @@ public Task> GetHistoryAsync(string? search, DateTim Status = c.Status.ToString() }).ToList(), ct); - public Task DeleteAsync(Guid id, CancellationToken ct = default) => _repository.DeleteAsync(id, ct); + public async Task IndexExistingAsync(CancellationToken ct = default) + { + var conversions = await _repository.GetCompletedWithoutIndexAsync(ct); + foreach (var conversion in conversions) + { + if (string.IsNullOrWhiteSpace(conversion.MarkdownFilePath)) + continue; + + try + { + var markdown = await _fileStorageService.ReadMarkdownAsync(conversion.MarkdownFilePath, ct); + var chunks = MarkdownChunker.Create(conversion.Id, markdown); + await _repository.AddChunksAsync(chunks, ct); + } + catch (FileNotFoundException) + { + // A missing Markdown file must not stop the local app from starting. + } + } + + await _repository.SaveChangesAsync(ct); + } + + public async Task DeleteAsync(Guid id, CancellationToken ct = default) + { + var conversion = await _repository.GetByIdAsync(id, ct); + if (conversion is null) + return; + + await _repository.DeleteAsync(id, ct); + await _repository.SaveChangesAsync(ct); + + if (!string.IsNullOrWhiteSpace(conversion.MarkdownFilePath)) + _fileStorageService.DeleteMarkdown(conversion.MarkdownFilePath); + } private static void ValidateFile(string fileName, long fileSize) { diff --git a/src/Application/Services/LibraryService.cs b/src/Application/Services/LibraryService.cs new file mode 100644 index 0000000..5f3e338 --- /dev/null +++ b/src/Application/Services/LibraryService.cs @@ -0,0 +1,57 @@ +using System.Text.RegularExpressions; +using MarkItDownWeb.Application.DTOs; +using MarkItDownWeb.Application.Interfaces; + +namespace MarkItDownWeb.Application.Services; + +public sealed partial class LibraryService +{ + private const int MaxQueryLength = 300; + private static readonly HashSet StopWords = new(StringComparer.OrdinalIgnoreCase) + { + "a", "an", "and", "are", "as", "at", "be", "by", "do", "does", "for", "from", "how", "in", "is", "it", "of", "on", "or", "the", "to", "was", "were", "what", "when", "where", "which", "who", "why", + "con", "cuál", "cuáles", "cómo", "de", "del", "el", "ella", "en", "es", "esta", "este", "la", "las", "lo", "los", "más", "para", "por", "qué", "se", "sobre", "son", "un", "una", "y" + }; + private readonly IConversionRepository _repository; + private readonly IAnswerGenerator _answerGenerator; + + public LibraryService(IConversionRepository repository, IAnswerGenerator answerGenerator) + { + _repository = repository; + _answerGenerator = answerGenerator; + } + + [GeneratedRegex(@"[\p{L}\p{N}]{2,}", RegexOptions.CultureInvariant)] + private static partial Regex TermRegex(); + + public async Task> SearchAsync(string? query, CancellationToken ct = default) + { + var terms = GetTerms(query); + return terms.Length == 0 + ? [] + : await _repository.SearchContentAsync(terms, 20, ct); + } + + public async Task AskAsync(string? question, CancellationToken ct = default) + { + var terms = GetTerms(question); + if (terms.Length == 0) + return _answerGenerator.CreateAnswer([]); + + var evidence = await _repository.SearchContentAsync(terms, 8, ct); + return _answerGenerator.CreateAnswer(evidence); + } + + private static string[] GetTerms(string? query) + { + if (string.IsNullOrWhiteSpace(query)) + return []; + + return TermRegex().Matches(query[..Math.Min(query.Length, MaxQueryLength)]) + .Select(match => match.Value) + .Where(term => !StopWords.Contains(term)) + .Distinct(StringComparer.OrdinalIgnoreCase) + .Take(8) + .ToArray(); + } +} diff --git a/src/Application/Services/LocalExtractiveAnswerGenerator.cs b/src/Application/Services/LocalExtractiveAnswerGenerator.cs new file mode 100644 index 0000000..0d93caa --- /dev/null +++ b/src/Application/Services/LocalExtractiveAnswerGenerator.cs @@ -0,0 +1,27 @@ +using MarkItDownWeb.Application.DTOs; +using MarkItDownWeb.Application.Interfaces; + +namespace MarkItDownWeb.Application.Services; + +public sealed class LocalExtractiveAnswerGenerator : IAnswerGenerator +{ + public LibraryAnswerDto CreateAnswer(IReadOnlyList evidence) + { + if (evidence.Count == 0) + { + return new LibraryAnswerDto + { + Answer = "No encontré contenido que respalde una respuesta en los documentos de la biblioteca.", + HasEvidence = false + }; + } + + var citations = evidence.Take(4).ToArray(); + return new LibraryAnswerDto + { + Answer = $"El fragmento más relevante dice: «{citations[0].Content}»", + HasEvidence = true, + Citations = citations + }; + } +} diff --git a/src/Application/Services/MarkdownChunker.cs b/src/Application/Services/MarkdownChunker.cs new file mode 100644 index 0000000..0801013 --- /dev/null +++ b/src/Application/Services/MarkdownChunker.cs @@ -0,0 +1,100 @@ +using System.Text.RegularExpressions; +using MarkItDownWeb.Domain.Entities; + +namespace MarkItDownWeb.Application.Services; + +internal static partial class MarkdownChunker +{ + private const int MaxChunkLength = 1200; + + [GeneratedRegex(@"^(#{1,6})\s+(.+?)\s*#*\s*$", RegexOptions.Multiline | RegexOptions.CultureInvariant)] + private static partial Regex HeadingRegex(); + + [GeneratedRegex(@"(?:|^\s*#{1,6}\s+(?:Page|Página)\s+(\d+)\s*$)", RegexOptions.Multiline | RegexOptions.IgnoreCase | RegexOptions.CultureInvariant)] + private static partial Regex PageRegex(); + + public static IReadOnlyList Create(Guid conversionId, string markdown) + { + var chunks = new List(); + var headings = new List<(int Level, string Text)>(); + var lines = markdown.Replace("\r\n", "\n", StringComparison.Ordinal).Split('\n'); + var buffer = new List(); + var section = "Contenido"; + string? page = null; + var ordinal = 0; + + void Flush() + { + var text = string.Join('\n', buffer).Trim(); + buffer.Clear(); + if (text.Length == 0) + return; + + foreach (var part in SplitText(text, MaxChunkLength)) + { + chunks.Add(new DocumentChunk + { + ConversionId = conversionId, + Ordinal = ordinal++, + Section = section.Length <= 500 ? section : section[..500], + Content = part + }); + } + } + + foreach (var line in lines) + { + var pageMatch = PageRegex().Match(line); + if (pageMatch.Success) + { + Flush(); + var pageNumber = pageMatch.Groups[1].Success ? pageMatch.Groups[1].Value : pageMatch.Groups[2].Value; + page = $"Página {pageNumber}"; + headings.Clear(); + section = page; + continue; + } + + var headingMatch = HeadingRegex().Match(line); + if (headingMatch.Success) + { + Flush(); + var level = headingMatch.Groups[1].Length; + var title = headingMatch.Groups[2].Value.Trim(); + while (headings.Count > 0 && headings[^1].Level >= level) + headings.RemoveAt(headings.Count - 1); + headings.Add((level, title)); + var headingPath = string.Join(" › ", headings.Select(item => item.Text)); + section = page is null ? headingPath : $"{page} › {headingPath}"; + continue; + } + + if (string.IsNullOrWhiteSpace(line) && buffer.Count > 0) + { + Flush(); + continue; + } + + buffer.Add(line); + } + + Flush(); + return chunks; + } + + private static IEnumerable SplitText(string text, int maxLength) + { + while (text.Length > maxLength) + { + var splitAt = text.LastIndexOf(' ', maxLength); + if (splitAt < maxLength / 2) + splitAt = maxLength; + + yield return text[..splitAt].Trim(); + text = text[splitAt..].Trim(); + } + + if (text.Length > 0) + yield return text; + } +} diff --git a/src/Domain/Entities/Conversion.cs b/src/Domain/Entities/Conversion.cs index 2ada337..1dc443b 100644 --- a/src/Domain/Entities/Conversion.cs +++ b/src/Domain/Entities/Conversion.cs @@ -12,6 +12,7 @@ public class Conversion public double? ConversionTimeSeconds { get; set; } public ConversionStatus Status { get; set; } = ConversionStatus.Pending; public string? ErrorMessage { get; set; } + public List Chunks { get; set; } = []; public void MarkAsCompleted(string markdownFilePath, double elapsedSeconds) { diff --git a/src/Domain/Entities/DocumentChunk.cs b/src/Domain/Entities/DocumentChunk.cs new file mode 100644 index 0000000..0950e0e --- /dev/null +++ b/src/Domain/Entities/DocumentChunk.cs @@ -0,0 +1,11 @@ +namespace MarkItDownWeb.Domain.Entities; + +public class DocumentChunk +{ + public Guid Id { get; set; } = Guid.NewGuid(); + public Guid ConversionId { get; set; } + public int Ordinal { get; set; } + public string Section { get; set; } = "Contenido"; + public string Content { get; set; } = string.Empty; + public Conversion Conversion { get; set; } = null!; +} diff --git a/src/Infrastructure/Persistence/AppDbContext.cs b/src/Infrastructure/Persistence/AppDbContext.cs index 370e228..322ed7e 100644 --- a/src/Infrastructure/Persistence/AppDbContext.cs +++ b/src/Infrastructure/Persistence/AppDbContext.cs @@ -8,6 +8,7 @@ public class AppDbContext : DbContext public AppDbContext(DbContextOptions options) : base(options) { } public DbSet Conversions => Set(); + public DbSet DocumentChunks => Set(); protected override void OnModelCreating(ModelBuilder modelBuilder) { @@ -20,6 +21,18 @@ protected override void OnModelCreating(ModelBuilder modelBuilder) entity.Property(c => c.Status).HasConversion().HasMaxLength(20); entity.Property(c => c.FileType).HasConversion().HasMaxLength(20); entity.HasIndex(c => c.CreatedAt); + entity.HasMany(c => c.Chunks) + .WithOne(chunk => chunk.Conversion) + .HasForeignKey(chunk => chunk.ConversionId) + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(chunk => chunk.Id); + entity.Property(chunk => chunk.Section).IsRequired().HasMaxLength(500); + entity.Property(chunk => chunk.Content).IsRequired().HasMaxLength(1200); + entity.HasIndex(chunk => new { chunk.ConversionId, chunk.Ordinal }).IsUnique(); }); } } diff --git a/src/Infrastructure/Persistence/ConversionRepository.cs b/src/Infrastructure/Persistence/ConversionRepository.cs index 9e3ec91..31d745c 100644 --- a/src/Infrastructure/Persistence/ConversionRepository.cs +++ b/src/Infrastructure/Persistence/ConversionRepository.cs @@ -1,6 +1,8 @@ +using MarkItDownWeb.Application.DTOs; using MarkItDownWeb.Application.Interfaces; using MarkItDownWeb.Domain.Entities; using Microsoft.EntityFrameworkCore; +using System.Text.RegularExpressions; namespace MarkItDownWeb.Infrastructure.Persistence; @@ -29,6 +31,67 @@ public async Task> GetHistoryAsync(string? search, DateTime? da return await query.OrderByDescending(c => c.CreatedAt).ToListAsync(ct); } + public Task> GetCompletedWithoutIndexAsync(CancellationToken ct = default) + => _context.Conversions + .Include(conversion => conversion.Chunks) + .Where(conversion => conversion.Status == ConversionStatus.Completed && !conversion.Chunks.Any()) + .ToListAsync(ct); + + public Task AddChunksAsync(IReadOnlyCollection chunks, CancellationToken ct = default) + => _context.DocumentChunks.AddRangeAsync(chunks, ct); + + public async Task> SearchContentAsync( + IReadOnlyCollection terms, + int limit, + CancellationToken ct = default) + { + var candidates = new Dictionary<(Guid ConversionId, string Section, string Content), LibrarySearchHit>(); + foreach (var term in terms) + { + var pattern = $"%{term}%"; + var matches = await _context.DocumentChunks + .AsNoTracking() + .Where(chunk => chunk.Conversion.Status == ConversionStatus.Completed + && (EF.Functions.Like(chunk.Content, pattern) + || EF.Functions.Like(chunk.Conversion.FileName, pattern))) + .OrderByDescending(chunk => chunk.Conversion.CreatedAt) + .ThenBy(chunk => chunk.Ordinal) + .Select(chunk => new LibrarySearchHit + { + ConversionId = chunk.ConversionId, + FileName = chunk.Conversion.FileName, + Section = chunk.Section, + Content = chunk.Content + }) + .Take(limit * 4) + .ToListAsync(ct); + + foreach (var hit in matches) + { + candidates.TryAdd((hit.ConversionId, hit.Section, hit.Content), hit); + } + } + + return candidates.Values + .Select(hit => new LibrarySearchHit + { + ConversionId = hit.ConversionId, + FileName = hit.FileName, + Section = hit.Section, + Content = hit.Content, + MatchCount = terms.Count(term => HasWholeTerm(hit.Content, term) + || HasWholeTerm(hit.FileName, term)) + }) + .Where(hit => hit.MatchCount > 0) + .OrderByDescending(hit => hit.MatchCount) + .ThenBy(hit => hit.FileName, StringComparer.OrdinalIgnoreCase) + .Take(limit) + .ToList(); + } + + private static bool HasWholeTerm(string text, string term) + => Regex.IsMatch(text, $@"(? _conversionService = conversionService; + public ConversionController(ConversionService conversionService, LibraryService libraryService) + { + _conversionService = conversionService; + _libraryService = libraryService; + } [HttpGet] public IActionResult Index() => View(new ConversionViewModel()); @@ -55,6 +60,14 @@ public async Task Item(Guid id, CancellationToken ct) } } + [HttpGet] + public async Task Search(string? query, CancellationToken ct) + => Json(await _libraryService.SearchAsync(query, ct)); + + [HttpPost] + public async Task Ask([FromBody] LibraryQuestionRequest request, CancellationToken ct) + => Json(await _libraryService.AskAsync(request.Question, ct)); + [HttpPost] public async Task Delete(Guid id, CancellationToken ct) { @@ -62,3 +75,5 @@ public async Task Delete(Guid id, CancellationToken ct) return Ok(); } } + +public sealed record LibraryQuestionRequest(string? Question); diff --git a/src/Web/Program.cs b/src/Web/Program.cs index 41b9afd..9c451e0 100644 --- a/src/Web/Program.cs +++ b/src/Web/Program.cs @@ -15,13 +15,17 @@ builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); +builder.Services.AddScoped(); +builder.Services.AddScoped(); var app = builder.Build(); using (var scope = app.Services.CreateScope()) { var db = scope.ServiceProvider.GetRequiredService(); - db.Database.EnsureCreated(); + LocalLibrarySchema.EnsureCreated(db); + var conversionService = scope.ServiceProvider.GetRequiredService(); + await conversionService.IndexExistingAsync(); } app.UseStaticFiles(); diff --git a/src/Web/Views/Conversion/Index.cshtml b/src/Web/Views/Conversion/Index.cshtml index a2ba4c6..19d2bec 100644 --- a/src/Web/Views/Conversion/Index.cshtml +++ b/src/Web/Views/Conversion/Index.cshtml @@ -1,59 +1,108 @@ @model MarkItDownWeb.Web.Models.ConversionViewModel @{ - ViewData["Title"] = "Convertir archivos a Markdown"; + ViewData["Title"] = "Biblioteca local - MarkItDown"; } -
-
-

CONVERSIÓN LOCAL

-

Convierte tus documentos a Markdown

-

Sube un archivo, revisa el resultado y descarga tu .md.

+
+
+
+

FILETOMARKDOWN · BIBLIOTECA LOCAL

+

Consulta tus documentos

+

Busca contenido y vuelve a tus archivos desde un espacio privado en este equipo.

+
+ Solo en este equipo
-
-
-
- - -
PDF, Word, PowerPoint, Excel, HTML o CSV · máximo 100 MB
-
- +
+ + + +
+

PDF, Word, PowerPoint, Excel, HTML o CSV · hasta 10 archivos de 100 MiB cada uno

+ +
+
+
+
+
+

TUS ARCHIVOS

+

Biblioteca 0

+
+ + + +
+ + + + + +
NombreTipoAñadidoEstadoAcciones
+
+
+ +

Tu biblioteca está vacía

+

Importa un documento para convertirlo, buscar su contenido y consultarlo aquí.

+ +
+ +
+
-
-
-
-

RESULTADO

-

Markdown generado

+
-
-
+ @section Scripts { diff --git a/src/Web/wwwroot/css/site.css b/src/Web/wwwroot/css/site.css index 436c966..c7cc8ec 100644 --- a/src/Web/wwwroot/css/site.css +++ b/src/Web/wwwroot/css/site.css @@ -1,118 +1,381 @@ html { font-size: 14px; + min-height: 100%; } @media (min-width: 768px) { - html { - font-size: 16px; - } + html { font-size: 16px; } } -.btn:focus, .btn:active:focus, .btn-link.nav-link:focus, .form-control:focus, .form-check-input:focus { - box-shadow: 0 0 0 0.1rem white, 0 0 0 0.25rem #258cfb; +body { + min-height: 100vh; + margin: 0; + background: #f5f7fb; + color: #172638; } -html { - position: relative; - min-height: 100%; +.navbar { + min-height: 58px; + border-bottom: 1px solid #e8edf3; + background: #fff; } -body { - margin-bottom: 60px; - background: #f5f7fa; - color: #17212f; +.navbar-brand { + color: #183454; + font-weight: 700; + letter-spacing: -.02em; } -.navbar { - background: #fff; +.library-shell { + width: min(1440px, calc(100% - 3rem)); + margin: 2.5rem auto 4rem; } -.conversion-shell { - max-width: 1440px; - margin: 2.25rem auto; +.library-heading { + display: flex; + align-items: flex-end; + justify-content: space-between; + gap: 2rem; + margin-bottom: 1.75rem; } -.page-heading h1 { - max-width: 760px; - font-size: clamp(1.8rem, 3vw, 2.5rem); +.library-heading h1 { + margin-bottom: .45rem; + font-size: clamp(1.8rem, 3vw, 2.4rem); font-weight: 700; - letter-spacing: -0.035em; + letter-spacing: -.04em; } .eyebrow { - color: #64748b; - font-size: .7rem; - font-weight: 700; - letter-spacing: .12em; + color: #718096; + font-size: .68rem; + font-weight: 750; + letter-spacing: .13em; +} + +.local-badge { + flex: 0 0 auto; + display: inline-flex; + align-items: center; + gap: .45rem; + padding: .48rem .75rem; + border: 1px solid #d5e9db; + border-radius: 999px; + background: #f1faf4; + color: #287346; + font-size: .76rem; + font-weight: 650; + white-space: nowrap; +} + +.library-toolbar { + display: flex; + align-items: center; + gap: 1rem; + padding: 1rem; + border: 1px solid #e4eaf1; + border-radius: 14px; + background: #fff; + box-shadow: 0 8px 28px rgb(15 23 42 / 3%); +} + +.global-search { + position: relative; + flex: 1; +} + +.global-search .form-control { + min-height: 44px; + padding-left: 2.7rem; + border-color: #e0e7ef; + background: #f9fbfd; +} + +.search-glyph { + position: absolute; + z-index: 1; + top: 50%; + left: .9rem; + color: #728198; + font-size: 1.45rem; + line-height: 1; + transform: translateY(-57%); +} + +.import-hint { + margin: .5rem 0 1.25rem 1rem; + color: #718096; +} + +.library-layout { + align-items: flex-start; } .app-card { - border: 1px solid #e4e9f0; + overflow: hidden; + border: 1px solid #e4eaf1; border-radius: 14px; - box-shadow: 0 8px 28px rgb(15 23 42 / 4%); + background: #fff; + box-shadow: 0 8px 28px rgb(15 23 42 / 3%); +} + +.library-card, .detail-card, .ask-card { + padding: 1.2rem 1.25rem; +} + +.card-heading { + display: flex; + align-items: center; + justify-content: space-between; + gap: 1rem; + margin-bottom: 1rem; +} + +.count-pill { + display: inline-block; + margin-left: .35rem; + padding: .15rem .5rem; + border-radius: 99px; + background: #edf3fa; + color: #395774; + font-size: .75rem; + vertical-align: middle; } .status-text { - font-size: .9rem; + min-height: 1.3rem; + font-size: .78rem; + text-align: right; } -.markdown-output { - min-height: 360px; - max-height: 65vh; - overflow: auto; - margin: 0; - padding: 1rem; - border: 1px solid #e2e8f0; - border-radius: 9px; - background: #f8fafc; - color: #243247; - font: .875rem/1.6 ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; - white-space: pre-wrap; - overflow-wrap: anywhere; +.document-table { + min-width: 660px; + border-top: 1px solid #edf1f5; + color: #304156; +} + +.document-table thead th { + padding: .75rem .55rem; + border-bottom-color: #e9eef4; + color: #78879a; + font-size: .67rem; + font-weight: 700; + letter-spacing: .06em; + text-transform: uppercase; + white-space: nowrap; } -.history-list { - max-height: 65vh; - overflow-y: auto; +.document-table tbody td { + padding: .8rem .55rem; + border-bottom-color: #f0f3f7; + vertical-align: middle; } -.history-entry { - display: grid; - width: 100%; - gap: .25rem; - padding: .4rem 0; +.document-table tbody tr:last-child td { border-bottom: 0; } + +.document-name-button { + max-width: 260px; + padding: 0; + overflow: hidden; border: 0; background: transparent; - color: inherit; + color: #183f68; + font-weight: 650; text-align: left; + text-overflow: ellipsis; + white-space: nowrap; } -.history-entry:not(:disabled):hover .history-file-name { +.document-name-button:not(:disabled):hover, +.evidence-open:hover { color: #0d6efd; + text-decoration: underline; } -.history-entry:disabled { - color: #94a3b8; - cursor: not-allowed; +.document-name-button:disabled { color: #8794a5; } + +.file-type { + display: inline-block; + padding: .22rem .42rem; + border: 1px solid #e4eaf1; + border-radius: 5px; + background: #f8fafc; + color: #68788d; + font-size: .65rem; + font-weight: 700; } -.history-file-name { - overflow: hidden; - font-weight: 600; - text-overflow: ellipsis; +.document-date { + color: #718096 !important; + font-size: .78rem; white-space: nowrap; } -.history-date { - color: #64748b; +.document-state { + display: inline-flex; + align-items: center; + padding: .24rem .5rem; + border-radius: 99px; + font-size: .7rem; + font-weight: 650; + white-space: nowrap; +} + +.document-state.is-complete { background: #edf8f0; color: #287346; } +.document-state.is-failed { background: #fff1f0; color: #b44740; } + +.document-actions { text-align: right; } + +.icon-action { + padding: .25rem .35rem; + border: 0; + background: transparent; + color: #8390a0; font-size: .75rem; } -.form-floating > .form-control-plaintext::placeholder, .form-floating > .form-control::placeholder { - color: var(--bs-secondary-color); - text-align: end; +.icon-action:hover { color: #aa3037; text-decoration: underline; } + +.empty-state { + padding: 2.5rem 1rem 2.75rem; + color: #68788d; + text-align: center; +} + +.empty-icon { + display: grid; + width: 44px; + height: 44px; + margin: 0 auto .75rem; + place-items: center; + border-radius: 12px; + background: #f1f5f9; + color: #6b7d91; + font-size: 1.4rem; +} + +.empty-state h3 { color: #26394f; font-size: 1rem; font-weight: 650; } +.empty-state p { max-width: 390px; margin: 0 auto 1rem; font-size: .85rem; line-height: 1.55; } + +.import-progress { + margin: 0 0 1rem; + padding: .75rem; + border: 1px solid #edf1f5; + border-radius: 9px; + background: #fafbfd; +} + +.import-results { list-style: none; padding: 0; } + +.import-result { + padding: .45rem .65rem; + border-left: 3px solid #9aabbd; + color: #596a7f; + font-size: .8rem; + overflow-wrap: anywhere; +} + +.import-result + .import-result { margin-top: .3rem; } +.import-result.is-success { border-color: #198754; color: #267347; } +.import-result.is-error { border-color: #dc3545; color: #a52d38; } + +.search-results-panel { + margin-top: 1rem; + padding-top: 1rem; + border-top: 1px solid #edf1f5; +} + +.library-results, .answer-panel { + max-height: 38vh; + overflow: auto; +} + +.evidence-item { padding: .8rem 0; border-color: #eef2f6; } +.evidence-open { + padding: 0; + border: 0; + background: transparent; + color: #1c4b78; + font-size: .82rem; + font-weight: 650; + text-align: left; +} + +.evidence-excerpt { + display: -webkit-box; + overflow: hidden; + color: #5a6a7e; + font-size: .8rem; + line-height: 1.5; + overflow-wrap: anywhere; + -webkit-box-orient: vertical; + -webkit-line-clamp: 4; +} + +.detail-column { display: grid; gap: 1rem; } + +.detail-card { min-width: 0; } +.detail-actions { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: .35rem; } +.detail-actions .btn { white-space: nowrap; } +.detail-empty { display: grid; min-height: 240px; place-items: center; padding: 1rem; border: 1px dashed #dce4ed; border-radius: 9px; color: #8290a0; font-size: .85rem; text-align: center; } + +.markdown-output { + min-height: 240px; + max-height: 62vh; + overflow: auto; + margin: 0; + padding: 1rem; + border: 1px solid #e2e8f0; + border-radius: 9px; + background: #f8fafc; + color: #34445a; + font: .82rem/1.6 ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; + white-space: pre-wrap; + overflow-wrap: anywhere; +} + +.ask-card h2 { color: #24374d; } +.ask-form { display: flex; gap: .55rem; } +.ask-form .form-control { min-width: 0; } +.answer-panel { padding: .8rem; border-radius: 9px; background: #f8fafc; } +.answer-text { color: #24374d; font-size: .85rem; font-weight: 650; line-height: 1.5; } + +.btn:focus-visible, +.form-control:focus-visible, +.document-name-button:focus-visible, +.evidence-open:focus-visible, +.icon-action:focus-visible { + outline: 3px solid rgb(13 110 253 / 35%); + outline-offset: 2px; + box-shadow: none; +} + +@media (max-width: 991.98px) { + .library-shell { width: min(calc(100% - 2rem), 760px); margin-top: 1.5rem; } + .detail-column { margin-top: 0; } + .detail-empty { min-height: 170px; } } -.form-floating > .form-control-plaintext:focus::placeholder, .form-floating > .form-control:focus::placeholder { - text-align: start; +@media (max-width: 575.98px) { + .library-shell { width: calc(100% - 1rem); margin: 1.15rem auto 2rem; } + .library-heading { align-items: flex-start; flex-direction: column; gap: .85rem; margin-bottom: 1rem; } + .library-heading h1 { font-size: 1.75rem; } + .library-toolbar { align-items: stretch; flex-direction: column; padding: .75rem; gap: .6rem; } + .library-toolbar .btn { width: 100%; } + .import-hint { margin: .4rem .4rem 1rem; } + .library-card, .detail-card, .ask-card { padding: .95rem; } + .card-heading { align-items: flex-start; } + .status-text { max-width: 45%; } + .document-table { min-width: 100%; table-layout: fixed; } + .document-table th:nth-child(2), .document-table td:nth-child(2), + .document-table th:nth-child(3), .document-table td:nth-child(3) { display: none; } + .document-table th:nth-child(1), .document-table td:nth-child(1) { width: 58%; } + .document-table th:nth-child(4), .document-table td:nth-child(4) { width: 22%; } + .document-table th:nth-child(5), .document-table td:nth-child(5) { width: 20%; } + .document-name-button { max-width: 100%; } + .detail-actions { gap: .25rem; } + .detail-actions .btn { padding: .3rem .45rem; font-size: .7rem; } + .ask-form { flex-direction: column; } + .ask-form .btn { width: 100%; } + .markdown-output { min-height: 190px; max-height: 52vh; font-size: .75rem; } } diff --git a/src/Web/wwwroot/js/conversion.js b/src/Web/wwwroot/js/conversion.js index f51bb3f..9406ef6 100644 --- a/src/Web/wwwroot/js/conversion.js +++ b/src/Web/wwwroot/js/conversion.js @@ -1,70 +1,241 @@ const fileInput = document.getElementById('fileInput'); -const btnConvert = document.getElementById('btnConvert'); -const btnCopy = document.getElementById('btnCopy'); -const btnDownload = document.getElementById('btnDownload'); -const btnClear = document.getElementById('btnClear'); +const btnImport = document.getElementById('btnImport'); +const btnEmptyImport = document.getElementById('btnEmptyImport'); const statusText = document.getElementById('statusText'); +const importProgress = document.getElementById('importProgress'); +const importResults = document.getElementById('importResults'); const markdownOutput = document.getElementById('markdownOutput'); const resultHeading = document.getElementById('resultHeading'); +const detailEmpty = document.getElementById('detailEmpty'); const historyList = document.getElementById('historyList'); const historyEmpty = document.getElementById('historyEmpty'); -const searchHistory = document.getElementById('searchHistory'); +const historyEmptyTitle = document.getElementById('historyEmptyTitle'); +const historyEmptyText = document.getElementById('historyEmptyText'); +const documentCount = document.getElementById('documentCount'); +const documentTableHead = document.getElementById('documentTableHead'); +const librarySearch = document.getElementById('librarySearch'); +const libraryResultsPanel = document.getElementById('libraryResultsPanel'); +const libraryResults = document.getElementById('libraryResults'); +const librarySearchEmpty = document.getElementById('librarySearchEmpty'); +const btnCopy = document.getElementById('btnCopy'); +const btnDownload = document.getElementById('btnDownload'); +const btnDeleteCurrent = document.getElementById('btnDeleteCurrent'); +const askForm = document.getElementById('askForm'); +const questionInput = document.getElementById('questionInput'); +const btnAsk = document.getElementById('btnAsk'); +const answerPanel = document.getElementById('answerPanel'); let currentFileName = ''; +let currentConversionId = null; -function setMarkdown(markdown, fileName = '') { - markdownOutput.textContent = markdown || ''; +function setMarkdown(markdown, fileName = '', conversionId = null) { currentFileName = fileName; - resultHeading.textContent = fileName ? `${fileName} → Markdown` : 'Markdown generado'; + currentConversionId = conversionId; + markdownOutput.textContent = markdown || ''; const hasMarkdown = markdownOutput.textContent.length > 0; + resultHeading.textContent = fileName || 'Selecciona un documento'; + markdownOutput.hidden = !hasMarkdown; + detailEmpty.hidden = hasMarkdown; + detailEmpty.textContent = fileName && !hasMarkdown + ? 'Esta conversión no tiene Markdown disponible.' + : 'El Markdown del documento seleccionado aparecerá aquí.'; btnCopy.disabled = !hasMarkdown; btnDownload.disabled = !hasMarkdown; + btnDeleteCurrent.disabled = !conversionId; } async function readResponse(response) { const body = await response.json().catch(() => ({})); - if (!response.ok) { - throw new Error(body.error || 'No se pudo completar la solicitud.'); - } + if (!response.ok) throw new Error(body.error || 'No se pudo completar la solicitud.'); return body; } -btnConvert.addEventListener('click', async () => { - const file = fileInput.files[0]; - if (!file) { - statusText.textContent = 'Selecciona un archivo primero.'; - fileInput.focus(); - return; - } +function extensionOf(fileName) { + return (fileName.split('.').pop() || '').toUpperCase(); +} - const formData = new FormData(); - formData.append('file', file); - statusText.textContent = 'Convirtiendo...'; - btnConvert.disabled = true; +function formatDate(value) { + return new Date(value).toLocaleDateString(undefined, { year: 'numeric', month: 'short', day: 'numeric' }); +} +function createHistoryRow(item) { + const row = document.createElement('tr'); + const fileCell = document.createElement('td'); + const open = document.createElement('button'); + open.type = 'button'; + open.className = 'document-name-button'; + open.textContent = item.fileName; + open.disabled = item.status !== 'Completed'; + open.setAttribute('aria-label', `Abrir vista previa de ${item.fileName}`); + open.addEventListener('click', () => openHistoryItem(item.id)); + fileCell.appendChild(open); + + const typeCell = document.createElement('td'); + const typeBadge = document.createElement('span'); + typeBadge.className = 'file-type'; + typeBadge.textContent = extensionOf(item.fileName) || 'FILE'; + typeCell.appendChild(typeBadge); + + const dateCell = document.createElement('td'); + dateCell.className = 'document-date'; + dateCell.textContent = formatDate(item.createdAt); + + const stateCell = document.createElement('td'); + const state = document.createElement('span'); + state.className = `document-state ${item.status === 'Completed' ? 'is-complete' : 'is-failed'}`; + state.textContent = item.status === 'Completed' ? 'Listo' : 'Error'; + stateCell.appendChild(state); + + const actionCell = document.createElement('td'); + actionCell.className = 'document-actions'; + const remove = document.createElement('button'); + remove.type = 'button'; + remove.className = 'icon-action'; + remove.textContent = 'Borrar'; + remove.setAttribute('aria-label', `Borrar ${item.fileName}`); + remove.addEventListener('click', () => deleteHistoryItem(item.id, item.fileName)); + actionCell.appendChild(remove); + row.append(fileCell, typeCell, dateCell, stateCell, actionCell); + return row; +} + +async function loadHistory(search = '') { try { - const response = await fetch('/Conversion/Convert', { method: 'POST', body: formData }); + const response = await fetch(`/Conversion/History?search=${encodeURIComponent(search)}`); + const items = await readResponse(response); + historyList.replaceChildren(...items.map(createHistoryRow)); + documentCount.textContent = items.length; + documentTableHead.hidden = items.length === 0; + historyEmpty.hidden = items.length > 0; + historyEmptyTitle.textContent = search ? 'No hay coincidencias' : 'Tu biblioteca está vacía'; + historyEmptyText.textContent = search + ? 'No hay archivos con ese nombre. Prueba otra palabra o borra la búsqueda; las coincidencias de contenido aparecen abajo.' + : 'Importa un documento para convertirlo, buscar su contenido y consultarlo aquí.'; + btnEmptyImport.hidden = Boolean(search); + } catch { + historyEmpty.hidden = false; + historyEmptyTitle.textContent = 'No se pudo cargar la biblioteca'; + historyEmptyText.textContent = 'Comprueba que la aplicación siga abierta e inténtalo de nuevo.'; + btnEmptyImport.hidden = true; + } +} + +async function openHistoryItem(id) { + statusText.textContent = 'Abriendo documento...'; + try { + const response = await fetch(`/Conversion/Item?id=${encodeURIComponent(id)}`); const result = await readResponse(response); - if (!result.success) { - throw new Error(result.errorMessage || 'No se pudo convertir el archivo.'); - } + setMarkdown(result.markdown, result.fileName, result.conversionId); + statusText.textContent = 'Vista previa actualizada.'; + } catch (error) { + statusText.textContent = error.message; + } +} - setMarkdown(result.markdown, result.fileName || file.name); - statusText.textContent = `Listo en ${Number(result.conversionTimeSeconds).toFixed(2)} s.`; - await loadHistory(searchHistory.value); +async function deleteHistoryItem(id, fileName) { + if (!window.confirm(`¿Borrar ${fileName} y su Markdown de este equipo?`)) return; + try { + const response = await fetch(`/Conversion/Delete?id=${encodeURIComponent(id)}`, { method: 'POST' }); + await readResponse(response); + if (currentConversionId === id) setMarkdown(''); + statusText.textContent = `${fileName} y su índice se borraron del equipo.`; + await Promise.all([loadHistory(librarySearch.value), loadLibraryResults(librarySearch.value)]); } catch (error) { - statusText.textContent = error.message || 'Error de conexión. Comprueba que la aplicación siga abierta.'; - } finally { - btnConvert.disabled = false; + statusText.textContent = error.message || `No se pudo borrar ${fileName}.`; } -}); +} + +function renderEvidence(target, hit) { + const item = document.createElement('li'); + item.className = 'list-group-item evidence-item'; + const open = document.createElement('button'); + open.type = 'button'; + open.className = 'evidence-open'; + open.textContent = `${hit.fileName} · ${hit.section}`; + open.addEventListener('click', () => openHistoryItem(hit.conversionId)); + const excerpt = document.createElement('p'); + excerpt.className = 'evidence-excerpt mb-0 mt-1'; + excerpt.textContent = hit.content; + item.append(open, excerpt); + target.appendChild(item); +} + +async function loadLibraryResults(query = '') { + if (!query.trim()) { + libraryResultsPanel.hidden = true; + libraryResults.replaceChildren(); + return; + } + libraryResultsPanel.hidden = false; + try { + const response = await fetch(`/Conversion/Search?query=${encodeURIComponent(query)}`); + const items = await readResponse(response); + libraryResults.replaceChildren(); + items.forEach(hit => renderEvidence(libraryResults, hit)); + librarySearchEmpty.hidden = items.length > 0; + librarySearchEmpty.textContent = 'No encontré fragmentos para esta búsqueda.'; + } catch { + librarySearchEmpty.hidden = false; + librarySearchEmpty.textContent = 'No se pudo buscar en la biblioteca.'; + } +} + +async function importFiles(files) { + if (files.length === 0) return; + if (files.length > 10) { + statusText.textContent = 'Selecciona hasta 10 archivos por lote.'; + return; + } + + importProgress.hidden = false; + importResults.replaceChildren(); + btnImport.disabled = true; + btnEmptyImport.disabled = true; + let lastResult = null; + + for (const file of files) { + const entry = document.createElement('li'); + entry.className = 'import-result'; + entry.textContent = `${file.name} · En espera`; + importResults.appendChild(entry); + entry.textContent = `${file.name} · Convirtiendo...`; + try { + const formData = new FormData(); + formData.append('file', file); + const response = await fetch('/Conversion/Convert', { method: 'POST', body: formData }); + const result = await readResponse(response); + if (!result.success) throw new Error(result.errorMessage || 'No se pudo convertir.'); + lastResult = result; + entry.classList.add('is-success'); + entry.textContent = `${file.name} · Importado`; + } catch (error) { + entry.classList.add('is-error'); + entry.textContent = `${file.name} · ${error.message || 'No se pudo convertir.'}`; + } + } + + if (lastResult) { + setMarkdown(lastResult.markdown, lastResult.fileName, lastResult.conversionId); + statusText.textContent = 'Importación completada.'; + } else { + statusText.textContent = 'No se pudo importar ningún archivo.'; + } + await Promise.all([loadHistory(librarySearch.value), loadLibraryResults(librarySearch.value)]); + fileInput.value = ''; + btnImport.disabled = false; + btnEmptyImport.disabled = false; +} + +btnImport.addEventListener('click', () => fileInput.click()); +btnEmptyImport.addEventListener('click', () => fileInput.click()); +fileInput.addEventListener('change', () => importFiles([...fileInput.files])); btnCopy.addEventListener('click', async () => { try { await navigator.clipboard.writeText(markdownOutput.textContent); - statusText.textContent = 'Markdown copiado al portapapeles.'; + statusText.textContent = 'Markdown copiado.'; } catch { - statusText.textContent = 'No se pudo acceder al portapapeles en este navegador.'; + statusText.textContent = 'El navegador no permitió copiar al portapapeles.'; } }); @@ -83,75 +254,53 @@ btnDownload.addEventListener('click', () => { statusText.textContent = `Descarga iniciada: ${safeName}.md`; }); -btnClear.addEventListener('click', () => { - setMarkdown(''); - fileInput.value = ''; - statusText.textContent = ''; - fileInput.focus(); +btnDeleteCurrent.addEventListener('click', () => { + if (currentConversionId) deleteHistoryItem(currentConversionId, currentFileName); }); -async function loadHistory(search = '') { +askForm.addEventListener('submit', async event => { + event.preventDefault(); + btnAsk.disabled = true; + btnAsk.textContent = 'Buscando...'; + answerPanel.hidden = false; + answerPanel.replaceChildren(); + const loading = document.createElement('p'); + loading.className = 'text-muted small mb-0'; + loading.textContent = 'Buscando evidencia local...'; + answerPanel.appendChild(loading); try { - const response = await fetch(`/Conversion/History?search=${encodeURIComponent(search)}`); - const items = await readResponse(response); - historyList.replaceChildren(); - - items.forEach(item => { - const entry = document.createElement('li'); - entry.className = 'list-group-item px-0'; - - const button = document.createElement('button'); - button.type = 'button'; - button.className = 'history-entry'; - button.disabled = item.status !== 'Completed'; - button.setAttribute('aria-label', `Abrir ${item.fileName}`); - - const name = document.createElement('span'); - name.className = 'history-file-name'; - name.textContent = item.fileName; - - const detail = document.createElement('span'); - detail.className = 'history-date'; - detail.textContent = item.status === 'Completed' - ? new Date(item.createdAt).toLocaleString() - : 'No se pudo convertir'; - - button.append(name, detail); - button.addEventListener('click', () => openHistoryItem(item.id)); - entry.appendChild(button); - historyList.appendChild(entry); + const response = await fetch('/Conversion/Ask', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ question: questionInput.value }) }); - - historyEmpty.hidden = items.length > 0; - historyEmpty.textContent = search ? 'No hay resultados para esa búsqueda.' : 'Aún no hay conversiones guardadas.'; - } catch { - historyEmpty.hidden = false; - historyEmpty.textContent = 'No se pudo cargar el historial.'; - } -} - -async function openHistoryItem(id) { - statusText.textContent = 'Abriendo conversión...'; - try { - const response = await fetch(`/Conversion/Item?id=${encodeURIComponent(id)}`); const result = await readResponse(response); - setMarkdown(result.markdown, result.fileName); - statusText.textContent = result.markdown ? 'Conversión cargada desde el historial.' : 'Esta conversión no tiene Markdown disponible.'; - } catch (error) { - statusText.textContent = error.message; + answerPanel.replaceChildren(); + const answer = document.createElement('p'); + answer.className = result.hasEvidence ? 'answer-text' : 'answer-text text-muted'; + answer.textContent = result.answer; + answerPanel.appendChild(answer); + if (result.citations?.length) { + const citations = document.createElement('ul'); + citations.className = 'list-group list-group-flush'; + result.citations.forEach(hit => renderEvidence(citations, hit)); + answerPanel.appendChild(citations); + } + } catch { + answerPanel.textContent = 'No se pudo consultar la biblioteca local.'; + } finally { + btnAsk.disabled = false; + btnAsk.textContent = 'Consultar'; } -} - -let historySearchTimer; -searchHistory.addEventListener('input', event => { - clearTimeout(historySearchTimer); - historySearchTimer = setTimeout(() => loadHistory(event.target.value), 200); }); -fileInput.addEventListener('change', () => { - if (fileInput.files[0]) { - statusText.textContent = `${fileInput.files[0].name} seleccionado.`; - } +let searchTimer; +librarySearch.addEventListener('input', event => { + clearTimeout(searchTimer); + searchTimer = setTimeout(() => { + loadHistory(event.target.value); + loadLibraryResults(event.target.value); + }, 220); }); loadHistory(); diff --git a/tests/MarkItDownWeb.Tests/ConversionServiceTests.cs b/tests/MarkItDownWeb.Tests/ConversionServiceTests.cs index bfaa3d6..aa9dcef 100644 --- a/tests/MarkItDownWeb.Tests/ConversionServiceTests.cs +++ b/tests/MarkItDownWeb.Tests/ConversionServiceTests.cs @@ -78,6 +78,93 @@ public async Task ConvertAsync_records_failed_conversion_and_removes_temporary_f Assert.Equal("Failed", historyItem.Status); } + [Fact] + public async Task Search_returns_matching_excerpt_with_its_section_and_delete_removes_the_index() + { + await using var database = await TestDatabase.CreateAsync(); + var storage = new FakeFileStorageService(); + var converter = new FakeMarkItDownService(_ => Task.FromResult( + "# Budget\n\nThe annual maintenance cost is 420 dollars.\n\n## Schedule\n\nRenew the plan in October.")); + var conversions = new ConversionService(converter, storage, database.Repository); + + await using var input = new MemoryStream([0x61, 0x2C, 0x62]); + var conversion = await conversions.ConvertAsync(input, "budget.csv", input.Length); + var library = new LibraryService(database.Repository, new LocalExtractiveAnswerGenerator()); + + var answer = await library.AskAsync("What is the annual maintenance cost?"); + + Assert.True(answer.HasEvidence); + var citation = Assert.Single(answer.Citations); + Assert.Equal("budget.csv", citation.FileName); + Assert.Equal("Budget", citation.Section); + Assert.Contains("420 dollars", citation.Content); + + await conversions.DeleteAsync(conversion.ConversionId); + + Assert.Empty(await library.SearchAsync("maintenance")); + Assert.Empty(storage.MarkdownFiles); + } + + [Fact] + public async Task Ask_returns_clear_abstention_when_no_document_matches() + { + await using var database = await TestDatabase.CreateAsync(); + var library = new LibraryService(database.Repository, new LocalExtractiveAnswerGenerator()); + + var answer = await library.AskAsync("What is the launch date?"); + + Assert.False(answer.HasEvidence); + Assert.Empty(answer.Citations); + Assert.Contains("No encontré", answer.Answer); + } + + [Fact] + public async Task Search_uses_page_number_when_markdown_preserves_page_markers() + { + await using var database = await TestDatabase.CreateAsync(); + var storage = new FakeFileStorageService(); + var converter = new FakeMarkItDownService(_ => Task.FromResult( + "\nThe risk review is scheduled for next week.")); + var conversions = new ConversionService(converter, storage, database.Repository); + await using var input = new MemoryStream([0x61, 0x2C, 0x62]); + await conversions.ConvertAsync(input, "review.csv", input.Length); + + var library = new LibraryService(database.Repository, new LocalExtractiveAnswerGenerator()); + var hits = await library.SearchAsync("risk"); + + Assert.Equal("Página 4", Assert.Single(hits).Section); + } + + [Fact] + public async Task Startup_indexing_adds_searchable_chunks_to_existing_history() + { + await using var database = await TestDatabase.CreateAsync(); + var storage = new FakeFileStorageService(); + storage.SeedMarkdown("Markdown/legacy.md", "# Legacy report\n\nRetain this historical content."); + var conversion = new Conversion + { + FileName = "legacy.csv", + FileType = FileType.Csv, + MarkdownFilePath = "Markdown/legacy.md", + FileSizeBytes = 42, + Status = ConversionStatus.Completed + }; + await database.Repository.AddAsync(conversion); + await database.Repository.SaveChangesAsync(); + + var service = new ConversionService( + new FakeMarkItDownService(_ => Task.FromResult("unused")), storage, database.Repository); + database.ClearTracking(); + await service.IndexExistingAsync(); + var library = new LibraryService(database.Repository, new LocalExtractiveAnswerGenerator()); + + var hit = Assert.Single(await library.SearchAsync("historical")); + + Assert.Equal(conversion.Id, hit.ConversionId); + Assert.Equal("Legacy report", hit.Section); + Assert.Contains("Retain this historical content", hit.Content); + } + private sealed class FakeMarkItDownService(Func> convert) : IMarkItDownService { public int CallCount { get; private set; } @@ -94,6 +181,9 @@ private sealed class FakeFileStorageService : IFileStorageService private readonly Dictionary _markdownFiles = new(); public HashSet TemporaryFiles { get; } = new(); + public Dictionary MarkdownFiles => _markdownFiles; + + public void SeedMarkdown(string path, string content) => _markdownFiles[path] = content; public async Task SaveTemporaryAsync( Stream fileStream, @@ -117,6 +207,7 @@ public Task ReadMarkdownAsync(string markdownFilePath, CancellationToken => Task.FromResult(_markdownFiles[markdownFilePath]); public void DeleteTemporary(string filePath) => TemporaryFiles.Remove(filePath); + public void DeleteMarkdown(string filePath) => _markdownFiles.Remove(filePath); } private sealed class TestDatabase : IAsyncDisposable @@ -132,6 +223,7 @@ private TestDatabase(SqliteConnection connection, AppDbContext context) } public IConversionRepository Repository { get; } + public void ClearTracking() => _context.ChangeTracker.Clear(); public static async Task CreateAsync() { diff --git a/tests/MarkItDownWeb.Tests/LocalLibrarySchemaTests.cs b/tests/MarkItDownWeb.Tests/LocalLibrarySchemaTests.cs new file mode 100644 index 0000000..ed070b0 --- /dev/null +++ b/tests/MarkItDownWeb.Tests/LocalLibrarySchemaTests.cs @@ -0,0 +1,62 @@ +using MarkItDownWeb.Application.Interfaces; +using MarkItDownWeb.Domain.Entities; +using MarkItDownWeb.Infrastructure.Persistence; +using Microsoft.Data.Sqlite; +using Microsoft.EntityFrameworkCore; +using Xunit; + +namespace MarkItDownWeb.Tests; + +public class LocalLibrarySchemaTests +{ + [Fact] + public async Task EnsureCreated_adds_the_index_to_an_existing_database_and_preserves_history() + { + await using var connection = new SqliteConnection("Data Source=:memory:"); + await connection.OpenAsync(); + var options = new DbContextOptionsBuilder().UseSqlite(connection).Options; + var id = Guid.NewGuid(); + + await using (var legacy = new AppDbContext(options)) + { + await legacy.Database.ExecuteSqlRawAsync(""" + CREATE TABLE "Conversions" ( + "Id" TEXT NOT NULL PRIMARY KEY, + "FileName" TEXT NOT NULL, + "FileType" TEXT NOT NULL, + "OriginalFilePath" TEXT NOT NULL, + "MarkdownFilePath" TEXT NULL, + "FileSizeBytes" INTEGER NOT NULL, + "CreatedAt" TEXT NOT NULL, + "ConversionTimeSeconds" REAL NULL, + "Status" TEXT NOT NULL, + "ErrorMessage" TEXT NULL + ); + """); + await legacy.Database.ExecuteSqlInterpolatedAsync($""" + INSERT INTO "Conversions" VALUES + ({id}, 'legacy.csv', 'Csv', '', 'legacy.md', 42, '2026-10-03 00:00:00', 0.1, 'Completed', NULL); + """); + + LocalLibrarySchema.EnsureCreated(legacy); + + var preserved = await legacy.Conversions.SingleAsync(); + Assert.Equal(id, preserved.Id); + Assert.Equal("legacy.csv", preserved.FileName); + var chunkId = Guid.NewGuid(); + await legacy.Database.ExecuteSqlInterpolatedAsync($""" + INSERT INTO "DocumentChunks" VALUES + ({chunkId}, {id}, 0, 'Old document', 'Preserved searchable text'); + """); + + IConversionRepository repository = new ConversionRepository(legacy); + var hits = await repository.SearchContentAsync(["searchable"], 5); + Assert.Equal(id, Assert.Single(hits).ConversionId); + + await repository.DeleteAsync(id); + await repository.SaveChangesAsync(); + Assert.Equal(0, await legacy.DocumentChunks.CountAsync()); + Assert.Equal(0, await legacy.Conversions.CountAsync()); + } + } +} From cd3e36320c2e692d5a3e68457c98eca40e8c5402 Mon Sep 17 00:00:00 2001 From: TheIrvin Date: Sat, 3 Oct 2026 14:49:20 -0500 Subject: [PATCH 2/3] docs: document local MarkItDown setup and verification --- README.md | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 6838c7a..7624196 100644 --- a/README.md +++ b/README.md @@ -23,31 +23,26 @@ La búsqueda y las consultas son locales y no necesitan claves ni conexión a un ## Requisitos - [.NET SDK 10](https://dotnet.microsoft.com/download/dotnet/10.0) -- Python y `pip` para Microsoft MarkItDown +- Python 3.12 o posterior y `pip` para Microsoft MarkItDown ## Instalación y ejecución Desde la raíz del repositorio, crea un entorno e instala MarkItDown con sus dependencias opcionales: ```powershell -python -m venv .venv -.venv\Scripts\Activate.ps1 -python -m pip install --upgrade pip -python -m pip install 'markitdown[all]' +py -3.12 -m venv .venv +.\.venv\Scripts\python.exe -m pip install --upgrade pip +.\.venv\Scripts\python.exe -m pip install 'markitdown[pdf,docx,pptx,xlsx]' ``` -Inicia la aplicación: +Antes de iniciar la aplicación, configura el ejecutable de Python del entorno virtual. Así MarkItDown y sus dependencias quedan aislados del Python global: ```powershell +$env:MarkItDown__PythonPath = (Resolve-Path .venv\Scripts\python.exe).Path dotnet run --project src/Web/MarkItDownWeb.Web.csproj --launch-profile http ``` -Abre [http://localhost:5241](http://localhost:5241). Si Python no está en `PATH`, establece `MarkItDown__PythonPath` con la ruta completa al ejecutable antes de iniciar la app: - -```powershell -$env:MarkItDown__PythonPath = (Get-Command python).Source -dotnet run --project src/Web/MarkItDownWeb.Web.csproj --launch-profile http -``` +Abre [http://localhost:5241](http://localhost:5241). Si prefieres usar una instalación global, establece `MarkItDown__PythonPath` con la ruta completa a ese ejecutable antes de iniciar la app. ## Uso @@ -79,7 +74,7 @@ La tabla `DocumentChunks` se crea al iniciar. Esto conserva las bases SQLite exi La aplicación acepta `.pdf`, `.docx`, `.pptx`, `.xlsx`, `.html` y `.csv`, limita cada archivo a 100 MiB y rechaza extensiones no permitidas. También comprueba las firmas PDF/ZIP de PDF y documentos Office; HTML y CSV no tienen una comprobación de firma. MarkItDown y sus dependencias instaladas determinan qué contenido puede extraerse de cada archivo. -Las pruebas del repositorio verifican validación, indexación, búsqueda, citas, abstención y eliminación con un conversor simulado. CI no incluye documentos de muestra para comprobar cada formato de extremo a extremo. La extracción depende de MarkItDown; los PDF no reciben número de página de forma uniforme. La app cita los marcadores de página que existan en el Markdown y, en su ausencia, cita encabezados/secciones o `Contenido`. La búsqueda es léxica; no interpreta sinónimos ni genera resúmenes. No incluye OCR ni cuentas multiusuario. +Las pruebas del repositorio verifican validación, indexación, búsqueda, citas, abstención y eliminación con un conversor simulado. También se comprobó manualmente la conversión e indexación de archivos PDF, DOCX, PPTX, XLSX, HTML y CSV. La extracción depende de MarkItDown; los PDF no reciben número de página de forma uniforme. La app cita los marcadores de página que existan en el Markdown y, en su ausencia, cita encabezados/secciones o `Contenido`. La búsqueda es léxica; no interpreta sinónimos ni genera resúmenes. No incluye OCR ni cuentas multiusuario. ## Verificación From af6024a53584740e5857e9b1b335180b268ee6ba Mon Sep 17 00:00:00 2001 From: TheIrvin Date: Sat, 3 Oct 2026 15:08:25 -0500 Subject: [PATCH 3/3] feat(ui): streamline local document library --- README.md | 8 +- .../local-document-library-mobile.png | Bin 52199 -> 28772 bytes docs/screenshots/local-document-library.png | Bin 76494 -> 44944 bytes .../Interfaces/IConversionRepository.cs | 1 + src/Application/Services/ConversionService.cs | 5 +- src/Application/Services/LibraryService.cs | 5 +- src/Application/Services/MarkdownChunker.cs | 5 +- .../Services/SearchTextNormalizer.cs | 41 ++++++ src/Domain/Entities/DocumentChunk.cs | 1 + .../Persistence/AppDbContext.cs | 1 + .../Persistence/ConversionRepository.cs | 88 ++++++------ .../Persistence/LocalLibrarySchema.cs | 31 +++++ src/Web/Views/Conversion/Index.cshtml | 36 +++-- src/Web/wwwroot/css/site.css | 46 +++++++ src/Web/wwwroot/js/conversion.js | 101 ++++++++++++-- .../ConversionServiceTests.cs | 128 ++++++++++++++++++ .../LocalLibrarySchemaTests.cs | 24 +++- 17 files changed, 437 insertions(+), 84 deletions(-) create mode 100644 src/Application/Services/SearchTextNormalizer.cs diff --git a/README.md b/README.md index 7624196..623632c 100644 --- a/README.md +++ b/README.md @@ -2,11 +2,11 @@ Biblioteca local para convertir documentos a Markdown, buscar su contenido y consultar fragmentos con referencias a su archivo y sección de origen. -**Escritorio** +**Primer uso en escritorio** ![Biblioteca local en escritorio](docs/screenshots/local-document-library.png) -**Móvil** +**Primer uso en móvil** ![Biblioteca local en móvil](docs/screenshots/local-document-library-mobile.png) @@ -15,7 +15,7 @@ Biblioteca local para convertir documentos a Markdown, buscar su contenido y con - Importa hasta 10 archivos por lote; cada archivo puede ocupar hasta 100 MiB. El estado de conversión se muestra por archivo y un error no detiene los demás. - Convierte PDF, DOCX, PPTX, XLSX, HTML y CSV con [Microsoft MarkItDown](https://github.com/microsoft/markitdown). - Previsualiza, copia y descarga Markdown. El historial local permite reabrir o borrar conversiones. -- Indexa el Markdown en fragmentos de hasta 1.200 caracteres y busca nombres de archivo y contenido en SQLite. +- Indexa el Markdown en fragmentos de hasta 1.200 caracteres y busca nombres de archivo y contenido en SQLite, sin distinguir mayúsculas ni acentos. - Consulta la biblioteca con respuestas extractivas: muestra el fragmento coincidente y cita el archivo y la sección. Si no encuentra evidencia, lo indica explícitamente. La búsqueda y las consultas son locales y no necesitan claves ni conexión a un proveedor de IA. `IAnswerGenerator` permite añadir otro generador, pero esta versión solo registra el generador extractivo local y no envía documentos fuera del equipo. @@ -46,7 +46,7 @@ Abre [http://localhost:5241](http://localhost:5241). Si prefieres usar una insta ## Uso -1. Pulsa **Importar documentos** y selecciona archivos permitidos. Se procesan de uno en uno; el estado o error aparece junto al nombre del archivo. +1. Arrastra archivos a la zona de carga o pulsa **Elegir documentos**. Se procesan de uno en uno; el estado o error aparece junto al nombre de cada archivo. 2. Busca por nombre o contenido desde la barra superior. La lista central muestra tipo, fecha y estado. 3. Selecciona un documento para abrir su Markdown en el panel de detalle. Desde ahí puedes copiar, descargar o borrar. 4. Usa **Pregunta a la biblioteca** para consultar fragmentos relacionados con sus citas. Sin coincidencias, la app informa que no encontró respaldo. En móvil, el detalle queda debajo de la lista. diff --git a/docs/screenshots/local-document-library-mobile.png b/docs/screenshots/local-document-library-mobile.png index 83977ad0733dacae6647ceb7c57b4e8f01511855..d835ffa00fdaa9f6457fd47572a33d0b1ea4da33 100644 GIT binary patch literal 28772 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 PH2!%t{;*6|`8oPuxsMz< literal 52199 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%0DGrN4SF$fpru7Ui0>*D)wH+V9h@1 z-LvuY_q9w6?+WJ>z-q(k9Gy{p#hzDg#g=)N^8qy@C2483W+6}-BVc!TcT?u@Vq@VM z2lm@4NeR6!Lzp-aTnW8-Y9Mu6!;RNEh1b=kh3aIKJqj64It`Jn*K#F?RSM}8mVS$y z+sMw+l>O+A018N&5|_y3u)T-Y%?hT1EY0PpPQy7Hc2P9)N435;t z2x{l`q}W&o43`wP+uaG}RRc-FIwuavSre6(9l`ms9acV9gGBkjE|az=7IV;8Sw=-C zKBArj2M~uJ^~f$P%Q-sRFbO(~Px6M~ccV6RMh|X@mPi$iu~h0iR_~fL7_pG=W7^8z zo=)aezab%Eox6M~S^;Si<2|wbL3!w~jn)hYZ08hU$U9D>y&nC%M$%#nesgv`NALS@ ztLWV6?5l&~jf*D?)x_)Q24H$-*%(XltYveYlC{y&ZHS#tAPfdEiv-J!N-j+-f%Ex9 zrEQ*K_eo$iFu0od8 z5J&UoKsT4^5Qg6e-f8CF4rT!?Lcah@r~?)diHJ$Z&5C`27w4w_2=hPs^Gfv>_@Jn7 z?52r{x}l!h9{uA1cnc>l53u$~1FSvbuHWMVfAvetzy1HyobUXWvhM_G^Mw&`u7#or z<;IR=3*1WGm*J|Rrb|0&wy|qHD_5=NWiLu8e$}<=;6wCb%|)>X|Ygm9eTtoauR@OJfH!IXzn4=%~&hT-7Xq6G@KIk?K>!ne)_2s= z%CXl*WHoO!a(rKn%E-2bBosnVBRH1NDJT;R4MBVw`Yr|KOnGdhO*(HIdaE^QGERT3ftS?w$zE0)B>Lhu$uR#oeIIBebslaBRc?W>Ci`pNHL!! zxi)&Ro!t&U1su(%=4=IT%ywkBT_c`~tBdvYu{4D4cd93%fO!s!nBp=p{&_US#0?~# zz@4-hQY6-~ZI|{~uK)OdYv*#O(~wu48Vb3_+CWK$R0k{{>F z*gBU;f8t^kVE`&>N+3Z9K$MQ{7{F5TVp2$0>`tDkj+{~ik`aK zS(LSbXBJo?$!nEu=}@or1gLNwZxRss?9|9ToqIq^ItjhaMTDI=eNV47Dl;mdB|OFFFV!x?Y!Pr zLC_-cUZb?VU|x>qnvbtX#jU=gjvTA(I+ut5X=y)SulkE0*k&opOMw4vSwj8-%9Gmv z0fcrhaBwikoi8pb*D6a&kF&5eHEc)=GA6|PW8;umgHLZOync7v0$v|@GYkT_y?hL! zqB_S9)z3X@bGnuwBhDed>b3r`TWJL zDJO9)OGbU@aJ&)?Or`~Y*gaZ3z3|2D5OqXbQ>blXVSQ0Q_hM=ZSvHI8q?G8pyu3Ox z|Ibv)tvDb;@vPF@xb$d2byBL8)WsqgAy^2{DBn5v6!U_h9AD(#5AHX+weh0Acrdyj z>0>f5#yifogLSeY5C;8&8M1gvrbPdWYxCQ5OFmvrefi{5b8D?l49V~wuZJ(kCP4Y- z8osP1QkCs|7n1Vrtw&a&;rwjXWmQSaWr-q;DX(ncntu5Ag_8aTP*Ay}G`M1w$_wPJ zZ*($TGs+yC*;x1M?W^L6$)71PC&c6%^VjQHhgZa#>s>R0x{GB(QdgO~Yu!N15}Sc4 z{tZ53N@-xzk!y{H`OIFl2Pt%k=2j1y@XuS`=M}T2+VsRnx|WvDI!U?ol^7B_FmyJ3 z&xBUld931YN)WGXN+7E}d_E>EXnEKU`sk(yxZRAYX$h7RaK86(%H`*X?L4x}6Wh7x zcIx1>E2*}h=4_k21j3fiMXdmV_rBY=oYkd;Iqf<`jR)*Ic`bJ*RV?{z<&dFAHdlk8CxFim&bil1T=k8d0P|2O+t&cByg zNel3pipES;O0e{R(VoYlmy^)jmq;QRx4}$Qq+%!p#5DRCt|;u zqSkyo56D#gI4}DjoriI82}WT`EX55!*mIVPks$J0jH_dpl!al{7L<5;YJdhO)afAB zr+{6qs6lHWwaePwz0Y=KpBt2elk_W+_P^i7u5{)_WQ#P-bDivM{3mB2XtMyed!OUe zz?9uS5+^pOssiiC_ zGLhr-di4eSY5d6?BA0MCqv&71>i@j7Tz;P>^kjAF} z#F6ul^d0(Sj`l?e4;6mOy zCVUxnLK6Hw7h&paqN_8hA7F+F41y3ZCE+)j-96ohT1dB3!^DMp5~AO2tF2pR_2d~y zRS!C9DTsvItVDjfj|>JPd=Gi;N=BBw8!^eRN?j@J6TcS6E6{=WhXpeW^dvCjv^C?J ztM3G_V&-?6cM5ygJi72hG=_#^i85g$%y3J--Wc6ny^~huS*5KQH0Cy~H9ux*X4)YW zkwNkCz@8_o?Q(=qyT4+mU2Y1Ja+V5-+HMR~%3a{-gql~#hk{Fw=2X~Yh?15BR_9|-$>Ijg!de7?xwG?ZjiTqtQNi{W>hLc<_?Zpz7 zr9g{a9d#acfB`>x+M9K5mi4-ARR95c@@7KF}?L^5) zWEyuV+Zf|J>h~&BqLR6gTFs*VCDBUzP z7dQta>p{v_mWT*&G~SyXG8Qip|D< zBNadQ?wCe4e9hd(v?anhC=yI5Zy=&PPsLno-aR;XcVTsc9Ge7Je#eqtC7xu|dNuO* zBtNf$4GwB+yJ{IK-`|O&Bkap&sI9;;u}4WFEx7DT$RR0>n$6V1?^b22 z$guNwHtpmbSp-^B&Gj9?@aS!3L74ClTmlQ}P+)ru)edBjoB)!~KM2nE1!9P~RqQm~ zM842K6tBbhYh0TNl=g&P8$y@ua;MR(7%_BEu_8x;xJ)Ub}D5 zhrgNJ{Uj12Y(Yluw?B4 z%HAO()4&!_^Hdwyd63Yi33hC3Wai$Wg0JL&!t#}E>-fyr;~@o;{vCql&(qLT_T=iu zcD-QLD;e@({$uo4$jn0P6*!G>N2LZf#bo9VW-cpLQaRqtX%Wd9%3j$%b?|L)p;}c1 ziCTt!F*BhxF%|wjD9fX#ccu{R8LI5D)-W;QH?9vF=`}TJ%Fj7NFphK|zis?rN7|yT ztt&k>QWo%2ho0BHLn^EYKDVlFfV_l8zzE&%N=qFm7>t<_iJ}Ohj71f@s7L{^}&u=ge3m1KSX5tZ3k;1R;j|}+F07u#> zY>H}Kh8D=G{J)+;SQxg$gye<466WmPi=p*SQZQ;8$%@|EcQt+BR8OBMm zi=TCgUZ_1ykiLcg5?-y|EE%3z9;VMLdsZ!JeB7G9Z2sA!3&MwU!_6j$EkWmLWwCKB zGj|!!%F*#LG{Re}(eT<)0K~ z=8t*2f4*_N)BCmw>ztGKH|R}SDz8lyW~`$MRdDwf>scBPp+##Y@&uGq`Xa0Ggw~#= z8D+}ef2~Xb>^=l?IIA8>X85};c;yw)0>8)Q%XxfEfwJU%{LRB!On^tw^%9Aie1AE2 zo^lv0IB?_7hZXlbKRayafGAg{9x)=2l=17{qFjVDk!dCN%ChO%gtQB5dkD+i)Iu<)Aea^XB~X3qAQ z`lT^BTj1n-JhNu^`Rh-Qk92zT3vJh&nXpJTCFNzEVUSatCwoxw$5!Nkt=dr)kSMTK zt4w_$aqu+0cE(=ZRYY1?<}{F*8BK+A#D3u7QaZ>>bGSTR+Xmw83r0|Z6SK&HVW+3u zZjtBDfMtMy#Uah&;*e)Y#MmZ_yNqvCu4cuSc!b)8;V_Sb)~s>q%gI1Eiu2vgOip+T zL318AKc8OJLR0m5m}rqaswuA>{b}!KMT? zO0{yaV#sR`NEk!~G2_UVW`&)e%r4+y%_2Y_q^D`QJY~mmlzx3{O2m21tBKTnzk7V9`(y$<4fBE0n7iSNBW%s6}UX!AyU=HP zBUytfqUX*q`eyAM($#Bc+C}AT<;K`k7DvhrdD+YR_yh4_pB~wpMlMhW6AB+6T=MmCxypSl_jM z*i?&d?yvCmaw>XB%uRfTp1(bHwt3SFi1`lp4!U0^d3ih_EqrG~NUq*?@Tq8Yf<%+J z5cw@O!2Uu9_PkB@c-En0%`hCf!={_Qh&*hb0`( zX~#37(9VI+L=3A#TXA4Y%nsWZ-TubdIFX7A$`Tbr)zBoO0xCK>>kM!sXFW5D5+3T^ zYI-~OW@lm2DOBAo)vk5Oqoi&t{k7btBWIAT>J=R^JE<6Wd}qE-5z^-#f5SgnUe$Y4XlX$){{apyOHp zD79{j%i?z_tZ{2q>L=RxT@N(n1gg+7nNfyhqI`0z>j9%q$A)E}_X8Wzlt;zG7J#iv zJ^c~`CmCGP#9UouFEb-sZTrPb+y>T`J!ZRR!;q-vJ7Z_tTg*!a$#uhujP&Lb4!rKZ z4EEfi0+Rgo@|yn4l!OQ2)4jX6>6x<5wLWc5d1nP==H*r>kx4M428N z$f^XXkkuPDQ6ZH%gs4NrfMX4%+>2CtZ%KPG-9X8r=v4jo#I;ac>yE(wL!yWMRxzEa zjykfsy2DjhZnoRvzL}oClW7z*N2@l*9=9`v94PWk1z*Hkl`y|U4{&s2d&Wg#+G1z0WFb20T(AT23}|WrRa~q#F<)JC zmY{#W3K4sFePvM7Je5vjHH^_4@Qn8K`Z#Md9~aOk+u9a8Qq(_Fo0N0dAWFC5L)Xwp z%XMB$Pbgp(atUphhmRNxkiS-9(p(-idpTJaxulf_a)|YBZP;M4O`t>`&dq>Xx2Eq_ zZL$*L!}lx%anD38j58u7yX^Lihnn@J6zue56Lk%a#clC~+ly8wc8x)KTXE1juxDWR zBH7X_X7>_8^lcl#YW#$}Wn)1vrZ1bv#Cw8dH}eD6-Uy2G9qWEd-HOSe_UoM|yddtm zp)G32rjx0x=kNkv5eY-edx+OAEnNxNbGk@38K#WT zRq%%?=dR9t>vMDLCXdPMXe!dUf-wxFOOKLcGC#TKne5DJH!Wz047(UJYnvcs+(a;I zG2d&j${3v!(kiZT1Kr696BLzn=xRt2!^g|V&{a0K!`ttdrv(mx$LDJs9d+!ptO8{` zF>ysPvCn++PEA8p$K+_rV}S9sN0dZ`Y=4DRb6?p)p|xv%tJM5vbK3b1%jaIERkd(` zBRd=?$UXdkiC*w)>@mUS6dhqwMiKI8Rtngnw%w(gDwl>gPrFOH#3)atHVm^wX)cee zMq;mjCxad6-%9S$%&{tdRGih~YovG!rxouJkvz!>;c))pFguIXw$gZ_eR;e=Zf6ds zN^|H4lE6q}&a&!O;84Hd>ZyAnw_iB*x;x)>IzGQ(*CmjPJtxWtHB>=mkaKz;$a-|o z+McBjFXo`~s18FG+0S;Wu8c|ZX?iGAtN0G=(G#x6$P{Zm-&xT>ds2fZTFmVVOKc4N zcZoUE!15I$w9Hp%6R$PjE&N3Ob)k_Ov8d{tpLe|rv}b98s^Ykue8VsBgwfFCguA*v zN~T_~$|QHt3^K(sfY1P=J4XSLyia#F3+mq1eHdR>PD2N(z11jeYv17HCud}RPP*xS zC68@Saz#ut+^LYdkteaia#k%Jfljua>3n9=C$XQ;TRayqbFIm#OpM2ma?;~6qa9Bu z6=GG-(ZJm)o1^}IQBPRti|d&02KtJmnA|)Ss;c55V$Jab>EAy(lT#lIgt)s@Phd<_ zyF9`gv1pAIk-|Ya?=8y0?N!{~LVzhmGGKzYFK2>8Wy6`lFY9{zub?Z;dB>GyHW7Kg zJhpd=;v5282Py|CKw4_v9F>~T(FG4^rhKJ04W0kNl^UZp=L)}VX^FfQFNL2u(tN40 z3&>r_f{k}opV~UjI|1q6_}U!hWZOblkvj*{up;=Snpc1qOG7L1D^9N}$Li<6;OTzT zoE^&1>VYv7Qx~%44U|J1zbiOh$Q`uew4)SggxfY>MCFs`Sl9JujjBJKOJOIcP- zyO2E8bh{q*0Pm!lp@g+2@2DhZy9|2$QQ~9EGRSzU6Z#B3?F+l#HEyoqK5fKf+Pq{U z+gNPw@#gcNV6V|syNKI_3vWI23&?Pa@tSjt>0#M6pVV80{*LRtwD}+VDVqZAfP3EY zxeDOujkQeWwEu+f*Xy5XF_Gw3FRcff0(AX+4ctDP^6fD{L9ryyw82pmd2-CJ*P@)E zk9CTIZa>vsYAm+>e&R}w)pX;khx}+WZ`v1sfK#}Yi~w4e#1i+IA9?sa{D+2ryCZ&& z`IjBNV57~yVgMTc0pssGer))Aj6ZiY|4~jQMEFO!xm|zW=kk%S|MtqX$RBZt0?Og4 zM%Gt0_2sk!L;%204nJ0HZ*qXq@Jv?i9~Bo`JQWK4<3~*(oFM>cKHIO}x+L~1qbd?D z1zozK%7i87Q10IWfP#pBKjHk`Gi_oM@&7Ek?wihu!i{iSKwhUvA`DR-2zC<+2ch*TvQ{VupH@SBlD0>6QEjz7@<}EK7&lWu;dH*xGxHz|iU7pL zU~50$0meBV*`Ql6-$Ir9LxRyA7>s|uqj~7_9m2ArA!zo7`hi0V;$|2Jl-NLK!BzV! zt`-S}c?cXBS%f9`&AJV85=7@OP*5Q01WS6ONeZ2S7z>jO0oe)D36#7FauC^)a`$e5 z9HG;;HW291w{Mq0gAhdkY70~?(7{jv+3VXt-T}H8U+E%Y!fJ9Y?9hOH57Q`I?UYzD!Y9b(Em7Hg&}+IH6*OTZU)N& z6SKo7sE@G7M!{s|_k(P*fdt0;cc56>Hb(%;uLm22A_>w*y&5nAr3qg ze&_uy(}N*+?_MVw@t~uA5S$nRs=gyD! zKRy6{Gchza1ROgC0316y06%7ry*Jj=bGl`v1KCCvc>9kNs0S05GKRpUC`IFf0$q*-J{^4|F-OLaD$93- z^LhLem;H%5{}b2#iH8RH2OY`W`H5rTR(eOc>k%&N@$Ycwe}}vHV}8mf9m#0>cnANq z^%H*9_`I7h0(Nvgd-M?j1Olu8Mu1yC+kf=^2>gfu!1Y}K;KY-Eqd8{-0Iy;JfJ4X#Q!el?%(Q89-WW7y8{4QB>(`o4FJIV4glb?`1y!vo+Aa06Tg7z2C(E&#5?FyfPj#w)D;P{DS zKYQZ;fMdr`9M$*C*&{CUH^8wICyt#wb@ud`Q%7w$aSHG^m*?VX-rtq^ZbGe6&xphB z2Bf{1;a5?`Jgkto1$WLE7(6Q=h^SQ82nR09WBHDA|{Ar9$%+LQ{Rx3nJV6+SZf zPxv23|JHkChpaPV*>hHw zSFB5u2}EQ^8*@fw0dC>my{)u<<@<{7v&}z$09f~M6(a83LptRz#uecjws10o4MPqA zDOR@Ob`tzBf*ZNi%W9oFlQ#b~SZZogrx`mREgvi&L`5FDBE=V!M_M0#dL~t`pL5K# z8j0O)gJ<;C4}g1iQ`dZjo+TDo`dZvb%|RGcF?X|f`vNJTb<6T>hkkfn?z8jvWeVmE z>Fo=SFkP$dZ!4^XvX6Z_cMl$2`E~3yaNM8@ae+h$>FmGF#0{;}S$%1>IOd_ZVuqtg zn4)Ue_}BxvansY&#r=$*LIhYSp_5W2_jXB09>$~mdT`Ri zI8NF*yziMw3fgn>NJ5pha2=@V%ELoWsumaDU!&a7=FAfwGn0NnAoaa)nd-ijsK#q#FLU|+W zJ1C^}?y5Jt+jEwjy;(~u4J5P;?qC+6{NXZp*8tNlbNBB=r6SgKTHVod9MYdAw)aXm zZ1Z<)oShj_Z#A%ozF~*3deqC{?Qm=JLM$;;*wzjid#Mv5?Sdx{!_77Qvn{HYKdfk) z!T5FVYgyyOE{(Egs@A@(%cLq4o8!q9?a<0Gjj!)10%wZg-4sr@G=4Cl|7>DsoPQ)m zBmFB?5HBQJm`RMi_h+?{{_@!8kNoR6A#y^=C1%L?GegbyL*$mo+56YS*I(Dq*Bj3l zI}~iCgw{{Y7X)Y4{Y7NNFZs=-3JrS=sI7dU_N!(GZ2459Zb((E6}8OVBSe^#P8(ZQ znRW;ir0e|v7-hhjE|+IoDJkPOC5*A+60u?CjO*g=`=gfG`$q4z+P9Xf1oQICo?}YZyffcih%u(s6v!|6PW?+bS5j@woEInIa?~63Byzlo7jDwaX z8lh6AUO>szFr$JSU z`>sqNVTnP*MGYI0fisD{uxN zL@8UJ*493~2VC&^$A9lT1OQl~%v+9xCJ1*&Zfq(@)m>fkliEq%6z-0eXfP01{wuE` zYf!80ZyKK+@j}R!)9sHuf7778@sRPKVupXy4E|O0UvBzWm-yG6^Z&CbQ3>QJ?BY^h z5iRT|8KHF6x}rDy`J7i7MtQG2X;({fv(?#{q}fhhn4RzZwe$G3wWdIuJQ~%2J#F@c zY91|Vtb)e5W>eXDROY6ITvrdw#?<6XHVk%NDSOPtJH?PPQlZ)#_F`dGA}ww6ezXt2 zxqa|E<%}La5D+MV5CFF*=7aLD8$d!Q^UF!q-jnBYBsiWQvfxw$c(Oi@Kb~gch!JIFX!c`=kQX6eI23P zH)9}4JkaS)UG8pi)ws&4U$lq5Td)MVk~&e?i&}sb=g!k#3CUU^GAjvc30>X%gA6rD zxcKG=%KNamff0j%D27^kx1Z@y$q=976vLn3y2`quJ;OWJfVDKRv#jP9lq)3zecsa0 zW#+Mc_GR}HRH3|mgN^Yud+8T05tbg4RF$JPcOnxus+WOjgouON90XLuGQ0F!xguBX ztSgmP_`=1>0dY!Iq{hfxT$w+TSLR8bihiw+w$gJ->B^^8QBC!{K9|WCuvHgRe{v!o z-oYJDBKw5q1eX>1eN?3cfBKgEi}bgw?6N#yh9 zBwVBn?O;h6L*uP4O9s`fBX*eHD&{>|5!2v9)?D)x%>$P?VrO0vwAE=U&KhJ(dGnP{ z)Z(Uq1=q3<5%Z6AdtGa8MpQTJX!n>}Ez`gkL4u}IXdMK(=0h#=)2>jGa=#8q)qZ>U zKyZ*Rtkf~f66;reDDlAHbItzigqI`Wbt7eHFPsTfgx=ZDo9zwswllE1X{l9|Uu^CA z_}2G)L2ykVjB2}9eu1T%aBK9kcL`cL+e)BV>}ku&s;V-7bYl33*S*1*RlicQ?LE+n zRH*^nI$PC#r&ITA?FYB#D-IVFpVh9|J}|E7OFF3PJoDGf0i;nx0cMC@JAi^Wz9pPd zku3;`+Iwx{hI)LyT=%vFcP}r*ZqnGFn0(nijh2^s>u@3^h-z3d$+G|CDEB6QBk1Cw zE=_X`HCW-lk^@5Eob0L|Ek4H9ykl#5gv6*1!9PmYeY8$WK=ip+D;5`DFFEyzpAUiY z?ii{BM%1Pe;ZZ84=W^6m7Z(suEv#GalDaD5q?Pifik9p@?nKs-e}7nZa?Z@0qdTa?6_Y@-E}ogPNWCN&}EsE-Nc`R1$8SK2uP()8*|8LQ& z3e?sOMVXsbNEzrW%hLvgbe1Q5*UYwIy$kHgq6YZL01K{%;PbSURNKhu_3~e42_=>Q zYv&%pa;lNzv0DqOa&o9(J(J{wEl|N*8a%{ikqm(fB_x&Ty2d9_9e3I-wZYd4>06!h zrn$Nr5`-FiCBAFpKuJn9%u>xV&PKxPneZ4DSuX;GMteMA=%I9*hi$LMksNpDGsNSK;gnRs3fG=q`QjH`S|w6I6}oE z)gEPOL7|Xj3@2ne9H$L?ti3DX-zGJ`xd63Gkj-XGx4S*h42O`4G2JIHolx z6GLj0E=o=~6f3cP|Lg%Vm9GmoT;zil zOKR3nNqC?s_Fd2+3Iamh7jp{zKcDiYo4i}IQ(?B zu~vT}cS}1b{CM<6uVv6!#Qrjor;95*%J>J2GP6EdoG zEulDrav%)Em(=eF#M+iR(;4oQ#LX?w7#Le$(*!PX?D57}m8_N8cK4 z{@2X!%_A)Jd~RZice1^BKi`vAQ;|^8Y@~23Gi@4OT8ns_^dd$o-`EyAZz%3&|CCvN zp;eWa2UDS}dS~KH^2>13(Q^l^L&1oI^}@#wv=*?p?SxelNcMXS2s!wvk0T;PdNs(c z3Ht+J!6~WN6Z$fbqlL;#ObnyRy8&~<4mNcKw(8^Ke_5;szMw;OD_3n!iGpepCsCE1uK@)yF`!Ef5Mq3}OOaZi)uOeY8Enff@n$!Jganjgd^64M!(0g&ET2q?Bs29vXevfr6AhE-;&*KoL<( z%DibxHv2hD!5@I%z)t&RS8}+QU#@yyn`y6%zMH40;2KENH~E}; zj}w|igYW+87AZG)J9k*$Ou9ij>@$4%fk$Igg+Z0T*HbOayRU~?rtwaE0jD;mA|9JWLuSazh4PHlQyO#J1$XG)pU+=kPM8|GM&L8Jt`ta*y7~-vaX{K zWQ9Qt@HtE8hN0o%O?YhAa$(4In$V7cQ}g*Yv!!#YJPghsy3mDHKT=4bJH-bs=qX#B zc5f~%FSX;)R=^AbJqRi}8EUKa276F*LoxjLRtmbp_(6`3Qt&Sb>*Y|4#VA?qQ1;uV zKIRiMPqW&LWp$19Ihxg-;_Z9nqBTetHi2}B#Ln|DvxOv-_QrSe3PNorp1M4jZmOTeVoB~F?*uUwxxVz#-cL}-BH`;wHpQ*QNg-J&pGqj{AyE`M6XV5sA z<-%j1u-eT3c8l?9dS*8>d1l9NP*l7ipniITzE56TGOg-Kt(t%3bK`Z+wbj>uEMF>( z5~l8b<`5MFiy9kVMkRhVSVyFw_l~n*Ri7_;IVaD?@3`A80z1B;y;4Q8TekJsKLBp! zpIv_d_V*tQwichiQNlMnF4h;edA|(&dU6jCE?TgaTB)T0=h(IH5rCOAQNDXC`R!{M zWq#YHiObbae$`HB_lfuAYAmow02e3Opc8DU!^6yPQ|3_>Wpv%;WZuq|8s7Z9rkt?KT!So&t zBkwh=(f4$&Iz%Z8qsSBfVrbO7gzn?U*xlo5%DO!&AeA2U<+?C171UE@q6X7k571hd*NOD7OtSP@!8zc>Y1%TK~d`K@G=AVw>!unN967w zTVLf~)vGcXDzLRfwq{-Y`$|oP@i~l!Y;XQ}-0QWsz86*KL=4>D#aU(_=Tfi-P-V)rrk! z2PBPq%&{;6En?-vs8B+G91m2BCo*8B;aPYCMTaLQc(g6p1}-r z49rU8=gtNl`AP^+vOU^fTpD@5`u|(;v?k{nr2>KfncsUKYwMc zpi+w|b9uiL7#&}V&1YQ;H`!Xuv8hbAQOFGU6sQmyUC4BeAWEbLF?g;o{n8#CrP=o} z9hX2GEtiP&46J{15K)hBa+tU%E!LGI{E22!gur}S)90lMX-9m8EH&V4I{!lXGzH9S zxHymdl#pMc5b&Em$wgHlOF(YzZ+XuegFoFo!0%n550dqKlz=ZQJ9?+Ca&?dsvti1`eJA# zc#k5aFM<| z`+X}baFqLb&4AXQYY6s!VPIO=)UZCj2PfM#wj{2kYrWL<06tSz?D0|VP+22aKRW;G zSF53$24WpngE~&;r$kcqcj1UYyLx^5l2acZk3}5??K*1C4*>oL;4tHhC4Mrk@lLqx z`-q%JR&{nkRyW~^?SC5ciwbE~oh3w@K2mQWgu7E1-Z-(hP;2*^DG8&S`pfg%P9%gK zsiyz@ZlFF#vVD2;&!okrewN?vOee%3B0~FB>aU;Yyng^vU_SswSGQt+0NS`w-@VQ( zwqAMSv-D-aefp5LRp2x=(VZ@nq4fPK`t`Q;4RzsW{=$JyRIYTU-|4jQsofudvAY)RUrFT>DpMfNSqK#DhESTN@5_ccNqo1GDjN0MFpz38vZsiu1>w!I zOu&O+1V8LDQ>!BCf~MTl=0udY_a{G7p6f4Hz4MwBi&;kVF$45h*qoi+&tLP*;pyhw zpxmU`J`63Bf{3r_6YO)8V|DF|4LW#dj63l6|9Q8@j`TaylrLD(Jm5BKF4hPV^vMEE zX}2g(qZZQFkSzGHk9q3un018&QoYV3oM!?d^i4Vp7-*n(B~!GZbc{-hTTx)_ag61x zGww9MDic8$tLSufRBpax5N!nrP72Ap*fDhG2bBeGZfWgOUTXSCIhH%9ut9KnM z=!@!RsSFjGp$-kMzuqF(YI+c0?)yx`L6Flb*mUL0_kOKYcgJs+`@J6OQ5n?aOVsak z2YdA^Mm?F`N9g-yVdpK39W0(5R-{OX!Nj*BRw+P*a%wW;5{U?RX1rx3EeOVNzA3Yh zy2m|JH=k$BjL!&MZ%nN?xg<*rO|cz@_oG4KA;6G)3Tx#Ba+F?s9I{XnI6 z-yL30st-J9_V`|48UF*|QH|=Z6ocBhPeqG!WCx#x)ZA}Wb+Ih3Vtf1aXL3!}zSsQf zP}!_@DIv`sjnt16cZNXxS3`JHs?NO~`QEQVQV(^jKKOXjj9{V}5uT<&CTg8iI{%{M znuUmvx$lLc+No3>W z66{RCRy35BUmnsuJJmSO@GWyI-yWlo!nZq5%#AxND0TO-$2`(LR)Wi#jD_jF#|>G= z%8w9ukz|a_uVt*g%dabAiA#sGwGM+27y1t3VLu%1T?rzTCXAKF*RJ)Kt>nu-%_Zw5 z2U@#JtJdC69@9#**}K1h350eVnM)oZ!dK8V-7|C3QeVL`cqLiH4NGJnHSmfJ3WU%| znT^MxX#wrstmfYiAJf$rr{pz+y(VxzZfZ|J6}f11@qL*&hs4*D+G#$!dNlPVUF$Ip zn(R@3s}WmTx>$dX9bejj*C|op_UirA(>Xe18j)%rxYWq`))=lpUqjI1R_+ptURvHT z%FOpzZKab72sQm28Z_|jvbXOb!u$1}Pc34+(3;{=(?pQt&Ea2uTdNZReZTu*d&)+; z2(kYMeK1JNY#6C&nfa6;CJt{ds+LMEF1>!z1VZEeHT1oY1Bl%;f( zfbwGP@4_;5N;G;LTlMCr@2v+5-$22~A~MU~)qXsbR8fXq$B2h8U}fF&1x$0Nbgo2v z@up|KwG>`d5?D|AGnMyTGb|Y58qi2Vdx{a3nO2~ zC-mstPIx=9YN4(Am&YrLGW0Kjrs)SprCYrV7iU7Z!YhMPO)4~3jR(D0`M#UBb!vyK zK>M2A-^aEP^P1fuqng4U1HB0C-2uPs^C}XTg++HUHOzXE@VVq`&Re7NO_f=9t1*$< z7G-HYrUT@0Ud)ols(gGdi)RcUZP9O)`#}1;qoDg9I>qq6ON*uf~jc=ZBLVBD~k8$)FsvOmQwz zIy^+I;4AP4pdMTPt;2H1&|jUiX}19DiglaKoE(_e3z$+TXp|*SR@7jYe!-j1mMh*q z3bgl;Lw6PUGs!vjj7>}R@BCPEMI#E7%rY?eP-9_V^9dTWDt381D{YR_d_BZtap2z% z7FCCo8&e8bzB^p`Uidh<7BS%~hLR|2w4zEy8}wavEpZG$2O_9WwqU51rOUsQeH33N zB%A-bLN#nBUDPSGpll25mENtLbx_A#@jJ@Bk&0lhKy6xdjK!39p`{7^+FIAIXm9;q zi5vGR%plfl6>qkvR34Q?l^S_JC-W6)RYAAncv{%?$D2bH2u zz#LJBh%NJ%pL^_oEsbs(;S1*Jn6#LzQwQqs5{N*>=-PQ~U_zsag`#d#Ulo7h)7I9Z z$ys&BnfdA*_Z&+)68F5Up^G(zxJC7H!E8+y@A5#eN4wKdZ#EvdoAw$gj*g5G@vAp& zj3w9_O5EONjQ8suuuau)jjf6*q(e?|wU7E+BLrAANQIoAFH>i@6nC^qP$Iv8iAHtn zz8~9T(+Z?T3C;^_84&ncl0_ z6yN2wRTNl~UryXo67;z2HVXyTDSbLO-W@L1+4DKw&Z4!`lTxAk;wl-{E(yEgC^Bqd zBtBOTN`H2EG=G^|fBl{B2jIY07k@~5@JTfP2OvA^P}W?nPt;^d)60kl8!+uOHWt!z z>b2K{s&=Wty>54E)g88!#2`w;0w0n~3~W&*b-vvH_(b#x-6xZUx-b}x`b z0=4X5gb2K4#lG~b-r(|zbT4>snK{nWh<8&pST{MYxRYE7j_2G?+nACm{%utFyH_&KFCq(&cN z)gGt;8eN5PlD_wiU(dNw6YUl;`Rc*v!U)ePm)aCcJ}qoj*JGih)t^FrwZ3~wgjzkh z@+UdfW@*PJNaO5+{yeGVTn|KVxMVN&!RH4d)lvs8p#_nz&HEZ$9F_BT9}DQzD=a3tipJJ zM8k_aDE6&xSCjWbyRJRrOIR8dl_KVuKeYU8bk&uHaRjRORi05vj{BvsB#H_*Nx+k{ zE!afhLZp9Q4aY&7=6!)}mm1RV!f~zf9IS+alO07W6pM9uS^I=`)l0;XUXQu{KxH0f zaE7D(cH_{v$BnLI@BBKwzU?WbcW$?<@=)Syv^Lt+=f%6gg z+l0@ZetvR#MAhvLSvG`b*s+8`0m=Tmz}+k5NuJIms>tLU07UbD&2sUl)iYvCRRZUz zxB3Gs##UvVegLe9X%Nxbd4v{#`y3*F^qxz$=PT&DiivUa6V3*oq1@Op6Ew$Th&|K_ zv-o}i>n<_&5v_DeHKxzit)ioPt-61VV?`WyWaNS>s;&~?IF!V}M2{{h3 zvVg9a5KaWEf z^XSBBA$#Ai^U7D}fUDyWW}p?44KH4Ys;~LRzDQ2qJ5$35B=lthI|A;`fUm(J)s1f7^o`?qc*p#BIh!XvYeFclQ`xHUF2k_2Xk!mCBXMZ&OPbA=egbRj_&3 zfMs=*2Xz-mdH!THGZo zmz1WMqx@$*yvTsv=|#;GN-_p|N~CrT&u3$RbJ$N>0IrTBs8lbo9@h7=eX4KKCV%YA zMW3|M?p0)^&ojC)a>>hP+CZq$VVq=_d(aol9M=mfvh~X22fL}zkihsH3I6D013hoS z(pAjN=&HPWx6jMb^?~uCIVq6m)6^SdZ|{c7K-F_j<@cpa5r_Pq8>e1`7ZtnOz4Z{H z6Fn|FMw5fy&`XYey9uF_7!0nQ;zKBL2jYcVVCMBGQj zF8P&=|8LI4C2^UjZ~&0S`?!(wMi$6;b6@ z(wN|8zX;@#K!ICGMDYj4uDY-pi@B4EmMp*xg3{9&Ko4!+gh*PibveI6X}ygPp2dw; zmLeA>qa?!T6bmw*z~bqu(FDA5L5}+o8G|aBqsEp- zChZ7swM}((4G_K+$^#(?ie`>}&9i0Mmm$e@_zw5{WQbVJ;er9I^3=ymb8*){cq?~w zw6K>A!KFCEtrnTP?dG`AN2M#jRAs`SX}-!ktzfg>mplLQSmfZV-+BH9&15OZE^n5P z9vP$_(GS(i0!h-LI?N^pa(?4Dh+9gHFK8_$?dh<5B9{&g6AOBxR z>0>GDBBigP*IgL;y^_5$VTrp?hgAzbSfkLF7yj;}wXmPq^Wl$%O|tgq(iY4ucD!c) z`X^V>6c5%KD93XDq{Y6eRfPX7_BT!N`27D|(JAq0SLDG+s=v!u4RM)a$4hHgZDpoc z0o4Df!H~WtTRW$B4nZ$WCU5s8GtN(;9jTDMXe0f7YO|N99>d2rOw`M*-Hntjg~+3N zIS0}Wse_b9AILi`yZ&>l%NrMaBN}d15}Qx{X3XoKP-3Nnh>S>oTGvYLYds*1pZSMr zdirH?I&IKe zx4;6g-Pd*wi~C*ixK63LQ7=u?h<}9n6g07ihT#a?r5ejq@|&$7yYq4;tYLO-GRoOV z3%lt&qmnROQgHMDlgbY5HLW+El)O_hSZv)Mg>x^FaYpxlFlX1Vu+L=G7WEBTo;PbS zhbaVYT2-Q-I{yGvkvYTjM?H^R8XupSe|@Q|*}*P=Ziy)j?l5UH^=3TjQ41)n(8;}4 zC&Z?pWJ#GzvJGv$9(_<(gWka0p^?8jt>6xKNiTOOWmQFN!D^(WGUMgzVCoey;rvVR zR(w}21c@fB8g>j(70eyryZDdA&Y-(*Z3t$y*@g`Jn!{i?v*f(LoifarH^8sp5{Ufa zIWeC`{aP1xsq*$W;0jtA;h$^CZ{t5^0&+mVE^I#9&M0zIFo^V=6kkmh+N*s@!=wFM z_9;tB?q(xiv3>nJ>niqcZuan}zhs%^U z7FtNr4@5EeTK%XcHC8I*Wb^r75r*|9#Yee5&0*UH*X8q@)j4i)kmT_rTev9xrWIye_7qZ4hb<nMj%R90uViq^C%Epk?QVasmpjpXS{F(hhOd60PHt_umCD{9GE!Jh6V zd^Q!nCsyWny0@8fAUp0|1lh=Djl{Q<$4)eEP7jiz-VH%X% zFBtgDGFS+(8cUXW8a4Q?W7rFEC5s^yf>7;r%zr>`bW2*So#f<*Pc^h7p!^DIEZ%y3 zWo6gMmy|f78|rMh&x_Y=+l|nmSUdS3_WPw|LGiniK`Fk7FvaUK=ZXHD#e4lyy9y)L ztHc`JhwK&n)<_UMP}1;|p|9vJf_d&dqZguxHxPmKtc|Pq^k$I(EjR`& z#_CYPX6yYvJKG4iA@R##OwX+c3`30`nRN{t*5*PM9IiAJ3t`8KN*e$U0WX1)+sIBu#yfBp2z12;v1i9 z=d%WTb%)jl+nr$M*=}e_bDTekH%pF`*d89@LeVx0enog+eYA0H%Y0-)uuYgtIIvrk zaEdEdj-461z4VN{-5>b=ME4ZPYsD{~fyZYEbjq8T5Y9?u3O3ruQ?n7YNCX1P6UCk@ zmvQn0Sz)K*)BDd4b-lm4yeXO1xY}vT(?w+xl?44QyqW==zm|HU8jU>b^(*_i-4vq1 z+E$28uCAn17p9KHw%}?xtMfbtMko2_?^MTsgQj-$XM4}GS2(^X zxz2n)U4g*)k1Ex9yITY5X2b2mZjox`r)v>Bfjv2>Hwj)V#2VPUZfRhN%RG*N>hlU9 z1tv*@e_s$ba8e&dw2HEA!;ccerr-wWBjzJ?;RdY)s{SH5KJO`fwbLN1eo}6ory2ep z=%v6=LKXVJry0WEM}cCRRxUWMr7<5g+=qj)0nhuPxPJJBtM4YEX@}yjh80fHS+(svUNASTLA;9h4%j%o)ZI{SDyy zeb)tQ*9fLdE57fwMKl~J?{*I8I2Tkl|l!5~-^3l#qM7t$W@>&rH;p!#Uj&eq6 zVfWuM#b-1#41-TL4p0mn%xyWDgWXim1#78ogjypHKP*Mpv;De=3CiA&|MO+>I%7R< zDNCc|v(C7#by+M$yph}x*epbCaVbwAW+f(V8ykqioYNv3=-zoQ=rUz>oiMZu*9KQS z&0wir@Dk6n;KN4ap8RQ}sxzktblh|fDo0S(oaNDz!OFc7mqvw2_AD>Dge_@tLGYK} zaKf%qEpk2Bq3K*kMi3O*uCeTl8}tgC%H?0jxNy&66T6j@AtK>RUPD53#?Dc&5Bg+G zL!$}azVI6suC1@>!Da8m@NFiohxNZ8MH*E}(zqZW6+L_$@l zkq5ymqDzAjE~+k7u{;zbqs6*Gp6m~FIhjL}xG|o9;sEC$3%%UwOP{&0^#boEfuh!o zZ3DCyG1^p!c%v3v4nT*WP$sbS8JK2j>Geua28w;?t=8DBWyv8)%uY|0JhCrPd<+Lt-lx z5{U9SuYMp)7L^j&b`Un}MqfTRpLPa}QoPNwPVR%n>5>(%lO$9yk^cVj{QTYxlT=1< z8nQC`_e{AW7ol%Df(j1YUMMaW++OAew5MUBoL{3pR+O40P>D-2qzZc?L_TXEU8f;} zmXi8tnbm-`+k1a*BC^i4f%z(@+{yGI-AmdWYnOb!y!-W12qOq7R~&e^=Fpq)t_S8( z1oMMTsHs;|B@A^!xiN0g(guh>{6j9L!L%)D>Wi3FGx*T=iIgkq%)4&hOi$27 zd}-$=_4_Rb8pIUqu>mlo+Zi3ur%3}#A@BO-fPS7L7LJzg& zqV#selQ52L&!j!O$04Y{n$^v>Z4R>IEsDIf$9QU~6HiVy(z?9xs1qq<$LJHw;x>42 zJ4mqfUK%0+he+tfA^3Te@x!%_BB;3Q;t~*A$jC%?X;X;Z$OP!>t2_NRHqsk})ADII zxaw?kM}BF0+bQvW1dJJxhDIBuj7747`NnUL**@~nV{}5f?xB}ck!Iz5bGvrUVgBl( zQhhTF@XobKse*!-v|nI>=Y8+LDvNJ$9Ff+Zl1utz1`K#>)05wiBA-d1JJ3Qq??88^ z;tt;qTEb3xqk8M{&gN%#0-=IJSuxxCW}>|W3Mo%fja4P3pMfy7NH2g=B!a+QH2oP$ zU&{=SO74^T@YNS%fZzV36~zC08kgRl`EIf4)7cN$_Qk0ykDo$uj(EiWZ$$u z4jw%|o5~0vA)vgV*p`6ByYC%}QoQ8P*BY4}xS{Ga+Lq8QB`zQl|_}h|#7+^$*zbjPv5_|WP{)ag64WB+20lJxmrNqK9 z-=JMJ{s99AnCnqGAvGqZ=+B(2GYjOS2Vz&i{95p~b-K4&xhYt9gD*q<%c=~4SY*A6 z>(0>cu`j>RgTRp1brh!BZ-&~BsJ{plYMaNBt)Xj}I7x zGH;)pUombH2Txn}$$2Idatu%UfUS+{J?B8A$49BCG)<$fH5bK5ynO>N)m-1q=JAE= zPiuR=ebo*UgG!dh5NYT5?bhGMg}aot#j_@t&hA?8Xdnf-Mzqc~-&ytUV3~&2QJZKF zGtxD&z%Ojb=hEfr;U+JCQY(GJz1zmcO+R3;s|$TmKZ=`#7vKJ(#lsn7*_ZR_t1p)! zIYNtUtD$9*kLtaFgNd4i*N7TK=UhMAOyhN4QwJ?=Z#%2Lf7pkfK7a{Ox13tB;>OOQ$*t@JM?!-Y*vHM30% zh6SioE_QFrdy@JY0vf#RLc;e(C35ShRvT$>C{ITu>`7y##ge01D(!Y6^h(Pim)j-L z2KrSxZ!KgAQwtbzB{8mCV{3|v|B5swH`fIBiX5}ZIlGq5HaD;Ju^s&A`mTI#(ODiS z9(_bPP&a2)&wU7 zj-yoMOQ$Ift*?z!rur|Oo}B8r8DblXy0v6%u@I%w37SmQC%xQw=9sMcU=X6}Qu^-bn@9g9FQcO;91d;Jro3iYXWI@AUm8$M03hDg!l8yUa&t zXomg(csA)fK!#c`FLmk`Jh-=~IE|@>S7yo>IntAhupV$`wgoUjoVdS|uZy{!>1|Ff zo;2rYXSq*DxJACFbf@Z!?TdGLj7?SK(=rTaxvx#lsD1 zL}U2Eo74w>N`WZjVBXG-fXK*7@5Xf{IirzTmYd!EN)O3% zLVSjokmJ>jU|5c=spBHJyZ7Mtvsy99cP&F%>3f6TAK9+UMdERBW>O+qc`m5Q&V zOYw-HPmUrZ*Z@ty1qYwFX&b1>wgJf9MZZM!jA-EZTw@;K-7#hoBEM39%VH z{5l}~C*PtdzXTLyaE}auluOOm%m=>_%3O^GSD%VY2D{iVL>}3l_^hM>=|iBDs0jE1 z^(1TDj=zP7zgzM=VY6kamRzON)4m)}i7S9YRb#iaVuC-vnRe$O4b=@HN4p~;SZpHu zF{Bz4=>1GzN+tSAk}soPd)EUQ?4cc)yOb~lz{rJ!jF=rfuFiIiHnU5Z)Gp6qSeRcE)E>}<@=@l1hPTV36=-puo z^d5)MExlHTtoE_PEy0`L0=v(L3X5__!_XeCYa~P8&-7iDKbABggA2H$cK{=@uFs7H zy}1;j1~MK%N-OB%rq*G-LrE^8Pa)NZxz%?Ntq4oL9_Tqy5sW!Zp4_3RGR$6R@wX63 zr)0lBwJLyW;0Fk(dh(2659cTL!FCb!rK`fkR79LV7#+omnrAw)lrgTHHB# zb%Z60Cv4?D7soWPjYL79NG_g+CK3+@%wL`n6U|}hogYxiW{xf-ha-k``l6Cr7|ewb zMAY!=+(^1kU#|fsQ;uu{@<`w>%lu_NPTyd0(hT!+CuZ*90Kn5~Tuu%s5D^w+^0M+7 zvdC$mN)yJ_Xq%OyDk_>8gWE|i{!5SK5_O06N-?t$YM+ZrM(}12oDzZ~>wr>}<>7S? z)6~H}EO|aM>)EOK{KA>`NOP}{emjNjPO!X+1ku3TJS|+(RkmSJy_T6Y)7q;))0)aY zDN=Wi|I{f{j~Ga%A(4>?)=w+E*Dw(O8L0XLP;%O|h?uZg2hyu=t)@yjWHQ7pANqElZ6av8;Mv@KMd-a-xjkC1|2J-bc{-8ICM!4rK zehwdUpW<{pqmPuQkzKB9zPVtQqvM?x2Q-4!N?^^m#YP=R?Zmh5ZwfjVF&6^y%=yAd zu&0}Xo2C^ynQFVj+S1vGB;<Ut>+(!@hK(XFB@nkbrKm z4zp&qK{XjP_Gis|pAjKCi5$C;Ww^rZ{yVgp{$E0yj|c|@KE=BtYI^#y)gSbC`x_2C zWCo%EmBRAlpL_HE1+nCXYgtiB$f#RXzqv_mWR{|%4!O8XcK#@#eZAZMpt@aEGAcoJ zR8$|A@X;*14=4Hp6%zpGDDcNki#{;Dy%z@_nVb6*M0em=+@G?Qs z;`%9JSZs=+1ihd#p`91h$*_3G^JD>Gt-#VagY4#`mfp{sZP!k%cDRAEvz_k#pW^p2Yc@U)nwM~4>M!$gMdg^ni84<0YV*x(2Ic-N&uyk z(3^BdMvxi|5R|HfnuLIq(7_R;3lT`@h)D0fi~i&5`_9ar`+jTP@2+pH@2>kFSg@Yw ztn-|+&p!LKefIus-6kp;>q-BZZbtYukEyr9Y+jro3AWkpC@9qyD@xX!3_}IdkyQ&F zYw{FxrQstoiCh?M-$&+#fMtLe!w;~%qG`z>o>);&hHllDH~pB8%=Pkncizj%yoB`pt;5DM3Tk-@c>WUXdnOo8yu~8OCM$yyI#CICLYnu?3hzsv!vB|Ac=4=h-KESh$ zJAHi*9*n))Q30yAK$fAt?j#(QyU71}_E4>!HyhL?=N+4rTdtGqDXAW*%)!$K3|g zdACjE(^%Wi8!71RUcKGdekn~j#w6^H^nguZ-YQ&k=IntOH=9Ec+Fjw+*B0vWU{ z?`A(U$oQNXbD{>Hn##eCyPN{+(Q2QvErfOFeh|R!Ba8gj7u!3_oJVgr2jj^(%@<%O z{mX9b##n)PDlLY4hhlWC$<}?!N3w!pxf_N8(}+ z6?;Qa?XF9@ohuy)ShP+lr{;#;w2R1HtA<_Ccj@HDv|d@WJlFJU``SgA0d?d?UiKrW zhz0pP^nuhz+#H%l#9c)1A)> zUooHiiRtXie@DE4;12?VOgH}i`>*lf+Ak*_8F?Q6<=?O}?9BC_Jz$N(uz=X8V*_ca zFCujNt|P^}sd zocf-|bnG8FpMFnc`kqDYdm7W{9h*}>J?yG^;);+#5NpD;O?i+%S+E*Tb4&+;UviSOs!bAO+ zRA+r(f13Q_F!i&l$lU8{<@X`V@jGh&&t>r?ZCQsShq8U{WQ$+;BD$Xp zP&(=;ZK&B;gys1f2{KohrRHnId-(*zfuttUaAYwgio&ia-i_hHStD|r#iyb1A4)9a~NO!zf4`@$S;x}$nX6LrM!LzZWV`+)o4j+$8&(Key_ zvcct&YcLuiQv?T|?3c4rJUa93*0ktU_XLq#)`t*WB`0qs?-Q*v0Amncqo~}63^Sc~ zP{fVYIQ2#%Kas~jA*{>Jr@2xz!~P(JMV#y%BU^dQr-`z8MR1Fi<@U*Ve?7YISguo<%z^;!n*^ZqPTKs z7S{{vhJLDpxo74y-Y~lU(9DNnM8+NyE1MRC!(G7k+%}8G;sN{J8u>s2ik#tdi%Or` zpBC#aTFB@;q75G>4J3fBoJ-5-ElTQ*8X`q_z1zAN_spDpBq0aru>57F;^s$U(3$gS zPQ`!%y1pswA-kQ@s7iytOY^o`f!&iWLVB<|g>OwaO9 zbvs`wsMRdJM@NeG17e&vx@w7mJkr>n35Ji7VuU{)|K)4}CCjW$Ecq~d<>8ry$(o8N zIow6K0`JpT^Ij}np7WCgW4PZG!}_Tr!9jG^uHosW3>tZ5-ZUT;<996+L+AkuKGS~S zqG%rOTE)d#(ne^8byRD5=?TlBobswHD)K|!t28=HCQUdDp?hg8$=swwojkv731gbQ z{j0@bv&d?CATX1)K*uLpCc~^)Yg;%MCBf!F<$z8uO7WiTJBzHyWBA1+5BERl>tKKp1hQ4S8+??Uy>J#Pf+!4hIRrMW$92mXu%HWCnG-isNRnmvq zDb4DQZPMMcer?ezGg_7wuGTgcV}nKU2yRgr-t`vpqn#Hab;GM5<_;3o@K{-Sd@6Ql z@v%|cpwj{~<-F#DqNpz@V!kB~UaPDXtu=JHc7FI2yWJQN2GnnK$_W&8@P2i>8-~8F z2TV04-K0IFv`RH|Nw^kNAx6<$rWXP~jY*N$H7};zYD<=Zq89X3P1z7uDkhh=U+z!l z;YLKozcS4$ysfLSQ;!4i)jAg(i5OOQV_Mc-3yZumh0W$1h#`Ztc8{u-1$KMfQ@V<5 z<5a#)Sp-o4iy#acBG@_>B>aaKO4xyyyvrJKXADYP5=pRm-W(bk+*kyf1f&Pst2H(0 zb##@N_rF`n_*{W|p$o9Jfz8eBIceH(`&C}GEH^f`4@s+H*!+1%a=gaz+}pJf3efs+ zb1xyoM&ovStT6jc@=To<+Ius-HBk2yK0^>#jY zAjI%E3C2rBSi&dWee9IGHQvS;9gW!NWGJwu^iH+-Nw(kBXNs7-QOkUHu57B)#%h)1fR_G zN?MXL%tQc&e4`I4h|y6CB1^UXrT!WB<`^i3=}6-AawBn%N4RCg$Cs+>S_6mGH0WQ> zp&O)7mNpx*S{cPZ zCI-9^b+x9tnqm5uUd5kpH9^(JxIajTuT)JQSF*HfJ;25^eu!v3dH3tuz4w!NvRndrxwELjo}wkWbZW=M#`?d#kUL zq9?#Gn>s`Pt=W`K$fwMS|3D$)=QNDUogVtr5lr5* zX5=dqym5rlxsgf#1B8SYEFi}aPv(G-*v~N5O4jFf$&@6l{OLq3` zT`VrxOgq!W@|}m7hq+6Du!5>70yXS~OirL17g!y47-?OQDL*x;-e%G-ie-avMn*Li zpRzcmA16xztAnXQtx0R1y<4Hr*rmJF_e+MBrN?R>Y6R)ec^8us{fH?xw;5=n>z}-+ z#2$S`S4A(k17S=;0%pvZ8_gzQ6Qpl&0gPoarrh8IA>=zaOZr;%%L74nxn(_2b5W-( zZ%nWvpU_>c(RO~_IG4U>HadASnL(<|8O{iGww67zQaaT~OiracYR@kx zw{{%8%*=oXXiXhm2KYx2|`;*&|Bf1stka9+*YW;|U38%nbn~8{9i6nhwHC3cY!J z0M_ezVdHBQmgSVDDc)#i`l2d|yG39yMbn9K?*f==EVk4N5-X^40pm-lVBI@+bQSSl zBB|{nyG{o;3ZM5MS-SOmF3=NA0)lAWVv52KS7Kq~G@Cgr3o}ba?aXJX;r-u~ciu~# ztuL=06S51kv=-(qiBSY0_0DY&56*M;+;#x<$AB7@7qbsih~y6{A&Iv( zoxH6itdA8lKq;0jUVL$t+|FuKIOO|6ANtBP^NC^D&Nu3Hl!+uldoQ3I%z>c~8a|fQoXTvvU*jA0Z z|9uNCk`xCkMtUFt+i{bM%j=7q_Li{vzHKqHYfWY+VFO|ToC8tt@d)7 zaCV$tM)KRXYTHsE?L`SgYR9%kx4{N2MKCrt&nPMb?1fPKt#pBJh5Ssf7 zbbyJR2TJ1caFE04l$i!$c`@HqZ-P#s#d&Qby7OFzuUtS(7tiC(#OO`A%GlM)w{9Hc zZjqe#OvRyV+UKuyT+PC!Rkn2a0*mZn-b8*6Jz|kE%9|zZ0q9RH(nw0yg;G3W+Rj8Rb!(iDXPEaZD3v>(`_76xb_wE~yD8_1yS@$V<(4TVaCUd)kP*_IkoB z2)B#ey1!G-tY)Tbcf6k6UrpyrWI_2s7HY*K)^TEH!@wduB(ma2XzNMOReT-h?*iHLzzb=MyKGF=qJ<)PGKl%)BlDzyZo^Zal<>AODxo?b%?tjVfFWsACl_{@sO&Y!1@80e42ILTB zb`D%IE>m{Td~V+E*)rdGahn&dN-&nF%HJv1iL=6!M=Hu*8abl*IORM?1+2FFu1>9# zFD}YX+Su5ba+&o5nHd;%%*+Z;{~;J$-)aRT|B&-*e?R|Y2K&E*58t=R|BwU@2KZ4k zm9--uqVc9}tmh(+SD(%HgAZ)t3X47N-thy@=Q<9+FH>aY8xd zWR&&li?PVv9O4h4v?n!A7}JPP`a<96?k?}V4l$hL`G#3_@28qg zHBg7ELYwdb7^R%-0-Z}LLiFLaUT49O#Il-dy|qQj6OFkE?L~P$7$+{lA>-)XsV|Ryr|`}V#!7qX#TPBpy-?lfWNm-tvSA`=diY~Gow8g` z6|OMS1!ObJOJ3n8`LBb1vUK&{x|9_*ZO+Eh1EDQtbj7vR^_azAlpWrGW%@Uib8m%S z-m{NC?zlD?jq!8wZtYQURr12PcXiGf5Hhyj<$3qkWHO*IF4x1zo|{kuEz;vPIe~_; z$+?l*+`s@)*ej=k09S?yMeO8Ep1ixtufG%iXV#8>HlG-*n7NiE(7bgeQ8&V}hD_+?zLrLxUq| zSU23ZB*zm*Q;q_>i}S`nKS;_=s+tD+KN%IZJb2bnltm>@C^GO2J6lyk`4pr1*Hse# zZP5eYMB>ZTjWr(09o^ZudJA*6xeL_;LKksvn%d*Fjhp(Qmh<}62w8llZ$B+(Ye{PY zE96^{nx0DUW_S*~xs((7`v_6}T_^;D5EDJ2#TSFttUfAOEkEm;tVU>pf!sb6v7D6Q z+()I=SGOmcySmx@Zm2W~!DeO=8XY>dan4(@Es?ei+`{>AL^rtcT2c1Y&_PvnPg$i1a zUp(2WGwnVTRKBXkaO3e zViDMz+NZVt;|BIe)&$nmMnseFW2lR_$_68mvR!;RqX>>`O5HqS^vJ^RudhKiudgj$-9y5s}7nHYKR4qm-tRP+5C@i5+*mR98zjS>RRvxtE+3r>prUKQsS z;w<1O_+)8jz6Q|M4!t#->|S?%vy+=y!F0;j11L3H-xirkzjxz%YrSMl zs5WCDb~WNBjEAG;u&b4dEvw#(JxTO@`EJD@v>A-JaA75jWb9qp%K&CV&tKofy~s%+ zZzggWh;~V(E8D*DdRc(xIpHHl#vWFP3Zb#xE#7(T(US%Cvj3zJ?v(ZG!v-97l{?nH zk{{){p-u&Ev#?@2FeW+Zo+7xS4x{o^$wJnDasId8N^$?JxbPV#8+p#jT#w@4G8r%y zRJQGviPSj~bsg7bH_Z9)Ho8%vhsu98QYcv-OA?E<2DP;;cnZV(`2%PT zCz6U7BID@hb6Q)#G+8k4VFAsvOoYJf$3IyXw#WWQh0f>CiCFwg0yNsWa)Mj}VM{G} z_;pu*JB9G1f6{o>anVT>vZx6=ard_SGA;5*bg*j5`Tp5CH=l2^S#efd(1UbYlM=n_ zWDSA8F(R8NKW)mE)#F-;INvZ|Yf;vQ}FV+Z0tcd>e@<~c}j zeF+7|89l8Ih9UU_VSaz2SklYJCUaN7gw|1wI2|>dca}J;qs65RgZ^}PTHQH8D-Jaq z{Q%0^^_@FvCt$%mf*$QKgyC_|U`=fSGt3U4m_;ex)}uz7yI+Hb0CgkzZ=ebo-TrMD z{4``8bVl0NCJVl(&F~e6PlBiqq9`;B3Pial3Rm6$Xg%*4KWu3DInU+$2Ul;B=1ALH zoHYR%SLxNb;=WAN#x+^@6aN$j^Amyz^7JTy;pV{d67GW3XB>^bMa)4b{>9iUf9m`{ z_r>4I-$&yAR-R~Z!>2BZ9)BR+potzMqj^{^yANeT~C-! zzqxic?Ct$ad}^97_k;<9*nB$yR}8LClx_<~r!E0&+|#krB(fjJd;q_RTd3B`fuwGM z<|-)Il@H?)Z+S_d^>%Zy4;KfyW7kPt-@p>pPzI|=3q&iJJBo0@2o?=mX7L@H7AD>L zmMg`E>f^y74aFc=^Yn)S>RQ*6i|4A0Y%}fRAU+a)*%r9=g-;0}>|yoQql<7w-Ll;F zF7|$NFW!Cov9bX2`{G7atCGVjGEfQHL%MFCT-_b8-i@5@DCRSZH4fU&0ejKbSl$S! zOPN{I>q=Kq9L-(?wkr%hnbol@T?=t&l)1i~rd=$yZ%Wk+jD=yqU-qr zv(t+omVxVUdMlj~Bp%LcGeVp~VkM7LQ>Od4Jt1?bTs*jatu#Wsd)bt86=DOXePxmZ z`4$Rii2Szg{=Qf3JVZ_RxQF_(M@b1Dh?#6=A@~(XnUU-+Aln&GyD}Tu-U3rmMV@l; z=ZT)58U(9m=c%-DyW=Gd8Q4+{(0WP1PIf7|6Jjhv|7}x7#^>RwQIVdcr5u-@-Wt1r z!bq~0MMR|mi@bVw5#?h*O@Jd|4AA%%)v@f>YBs^Lp>FtF`MuUF^)zSuO3|@gW+2F) zc+gVei#u?dc3NShW@lHC1Bg`kQ-ydn86ew2Gs>M#sM{+xT6@qo9aVnG;Awz)Y!0h0n&oye~Wgwk=H~69E2^gm@sc|Fl0xPHGLgvKy!P z36q(@f~OQhH5It4*#==qz*^&8W<>xc_g=*_mi{u4-#U_B@#{n#*Gk9} z++?BZ*_<0``XwbQsx3B8Xo{zAp3GY5#HDSp5Fo5}xujDVvhWtcI9N3TSrq)X*JUN> zl%4Y8aNH^p{+_HWh{Y~MwJqJCqlDR&q+Ss7iCWK}=4iF#XpJe{ZsIP%G?|^VIH9cc z>W-Q&>*b>y=O{Azs30m_>{C>lR&=EQNQO&$Ob{WWzNhrVjF@|l9=u-8#S7a(NS8n) z;Pd=9TAC>eD!oCxVm9?c>2hiX+li#|@mvQPFRqiQiRL zZ<~#s@q`rN%w+a=sUG|k-~)CBB+BH?7>s&UT#SM5fMASUt`@StjgoYLoLNw}_+%rJ zM2)^$OsPDl&&no|$(ho#f_@pzW~~=Zw>O}Ztv)-+N4}cwXXBPB=Uw)LUVlpdgEbb8&A!y{5m1sdSxYi-gC zC`i^2EGi^;-bQpowGn`*p=KpLwn9?K0Oe+W82c8lsEjB-z)bHaXQW%k3l*x+P)|=&T zUzyK-bTa~|%&(5Pzl3kU}CI|8(`mgC+CdF7E8{PoG19^vtps7#r1Y&8W zZEgle6J97qiI2O*u%{6~W{&cIxdE>TV?=3p@eyMaM@D@27%B7Qrn}{fr@(NENwr~dfAy*ZXt6t>JD6KM$4)4LaE+Knh|n-LHwgq`gVpEA-+kaT*mcTN2?i^xi(PEJ~~<<%JjU4>+@ORpzXwNDDnYwx-oCLa>AR- zZSz-z#W1c<6m{&(Tf>SS*d`W%_GKduCjEgv+%a62WzmmFxrBB?(#Om!7IXh$J+INJ zE#m7u85*6+nAF9fi^r_JO?$R2k`UQFkj}A>nN4YS2?4l!sc`e)s!q~b?v4td) zN+XNaQNr$|^kO64Qbiwb9}EeD$)FhMiFHL4FyP-8TJ(%emrF~!lE*Z5suxAE?|~4@ zy3sn&L36Val(J)4iVlxR&dVLn^JG9eFaw=DE0yH!Jm^iYK0=KuqIrsDiQfs{Q(4FJZbynrEh(2We0%B5kVP8KY-Hl|mmiL;D3c2yY$ zY2OCfUDDQ6(^ZexQ7{qdStPWxI(F#}SIyWIP|O!la@#U8WrneCg5gEJ%ES~gJ)}7> zk;*W_d5PII?Hzcid+#Zj<@wlou!h|VBU}RtHj^GzXAG4>BUN=eWiVuW!9allPS>1n zX0rMuJ;|ySJD+CAVgz-D;B~4KFBmF^|9SHES<5JI#5K8R6c|7*V}Zhe$MNgR?T zQ{EP3k?qA%Fv)UPfkk0G&T`b9`oQmHv=G)hig6=PUg*c8 z9*Qw=NbmTwy->1rHC_vL=DzVV#6Qnz8C)Ez;EYKsD{ z6Oswrx9TrzKr3Xt{ZRm68+|}VaGhV8yBT?FU7wYe6{{&_4VSt?;myFP8z>E=q+&3c z(L8h>C7E>x1%B(>(j$-APbdWkgTXE*lx^t?{WY`PB3iNb$@3Y^Eb??x7p=~N`iP=t zXz{MsjLG`_$cpNtwb}-Uq()4=g&71}LWw0^PN=;|s8352x0< zHTqqbsJK@{5#<5vQ5*|ux1(w{qT%>>^Ts2^hdxHiA=0RYD zgE7#>1O=?+#YxG{*J?1LSzCD_uUgiK$JY8$&a?l>#BKgU#DY0KOc+On0O(&cH# z#!k3rofbVCN^CI>TJeh(Ux0wiGCgyKZ8be6bf#!4Dx+mznFwbg(06IdZ2YRMi#7=s zR}BlFt0On3h=CDrSS$xBgawAjE_ec^;wIiGBUzplvAH6!N@SEDygU$Cqp(N=$f z15C1PwfPdv;71Sjt{gB}Y4jPY;)96Qaf&g7YAh)4b=}#ZcVLa7&?6+lH!aV#l1|n- zWDQMg!69!dOiifBiCghN9+IN>xBMT~F`vQS@Bk{-G2 z%}lGoD{#UM7~rp5ERc>BC9l}o==JRc;cL%p{SSTmiMq?@j8FtelDYKrGAZGbwoy^I zj9X?DeRe0q6m1*hm|-YLwgW)K27Q^C+dczk2VMGx$y@Yu%D@X^#zbNvwz0n&=D)5^ zH4UiYG;5AS&EL?D?NUvv+f^bXV)>eXzSz=#I+be)7twK2cyy=W15Lk z)K~RI6BfQc=P!|c1Tr)d>(@$BbA5ABlSUwB77pZ%#TzVrYTAZpOCE&Xq{og?%--sY z&*mz!(5y2D?m&*a8>;Dw-9FM9XF>KKG8>;ZZRQ5OD++ur>q|6SR94zPJD|geriyyN zm)nt=NUNfL@_xlhvw;+%fCUVI+|!W;=es@c-nwOQ@^ry(Z{)B3`0bG?_B_j@Uj&XF z|9JoO|B}RC49@&`>n}>%@2AjfXO91Le9HFGQ-*V+t?ik%b`FjoJ*6}>eol|YV*hs} zGM)P|XNqBRaom=Pg8^IRim;pe>>mT2m z=?y6H7Vx41m%RY834j0%TEpmIa;E%nO%6g@G*iiM=XzynCAjvzLVjKkoq{-BzODeY zo{T{bfMDz@H-YxW>7BlhreC}*5ZPtP6JxmdGkvLmrDoV%Zx$DRrE-(e{~1Osa( z!6$(F$A5wvx62;nMsImma+-}Q*KIB`N7(1OEIgWl@4Mr~%CUW#`d-CRcDNfhxL1tx z>Jo*G4d(S&FHfO!bQPE!T`R*zU>yT!n@SVrr#vUfFjPro5psj7Qo7J#xto0o^9)67 z_~kY7dbBtcX#U(>(9qs|CfJvVpY67!J}3zoHeHrG7Yn@IRAYBZH`kYqZ3Wz0_>fn{ zvocx!COtE-bC!XNbV9`4_%H>U zoI&gdNmVrhi1^7=hp?$J!DfACS*Fu3|I*+8z1JV2NlSgh5yotYp^%#j6D=rjdPL|_X zjhoKhw5l@`F^eHujFi`krc0WwEpe79o=FXO?_SZc3e1d7FyYg`azK>l6Hbn1G zM{-rHap=5Ybmx3m)Cgg)2<65(X3B8WNw01_=Gm}oe#hk{8Ec(-iZ09fOd&zX$JP~z z(oi1KlK{;M!2M?n`vdO#9c1Jc*=5dqL;&m}&i3~i+Z9>3^!HbHw#Ks|ZMbXR)jE_@ zWOY&<=Uzs8Ylws4s#9jtZzdJpLf1=(Vn-o3bJNw9SYB=MDf=q=(NJx~o_4 zpL_d8X=cg%f9dbcByh6$Lp1gekg{l0IwC!&G1Cer1BZcz5A9 zr!C@(K_NzbA?l0*%y8-QS0)>+r7ll`_H~)t3K!YrSA`VyniR=c=~2V-WI_j_Ig zGu#gvXEdeVMdQr#iaD9z6Iyi`zIl>q-{_(2d(p=)ymw-dva$dAI|II0$$g{Qp)<2+ z&-GW`Tqwi8sp}sMr0U)qjsQW5Z3dSw+4RLAGTFI70LhCzPV&P1L(%`yikK0j>N4!y z^&FkccmL`T9xfREBP%i4hVls4fsT z7u~;$Q%DS37jY}fsfM&7T!~>t$$BK=Fm)`Zal(D-V;w}-Gie6l+*~nXVT!O~*G|9- zzl{<#n+h+8*$I-Oeut?iXcu88u&?rWsJq5&KF{Be4k_^V{*r02J4J}sm>jzDyG{G z5q*0`@GcfM4lg^5>1Y%KFzN(qx(0Upabv!qtV(!X-$;HYk?22XB^VooakVT4gXs|r zC9EI64fn+Y&R*O_!9$>?@`+yT22}9jnFDnqMvwBr?d00@Ouo{yhNa~TD<}^1!x{n~ zIkH(@(*xYQl+XI{$^FwQVd*2dOu%rPD2L1z$24VP%SwKupjSe1a%?aR4^MIjB4+^Fy-bj&tEjs6kyXfuv+`6cW-YoVmwK^6} zXH)7Dhl1TM1_f+*%~jl`-#v6r!q#xiAw;B^3-&#qL$TibL)3!BzEMXM1AUILD3V*4 z*Z2BS0;LyBkQ&nmcY3Cmx|~jld)%b4=o~SVL{Q9e(rDNKWJ5hKT7nsxnlcD zvwDHoGH@5(7o>Qx-;7DJJh{d!Q>-f70Z|#ZP;Xzz&Lw65WyFiu@F;ycu!7gNsK`GZSE<3gCzs{Mq)jWa8l@goq=3d)^s1kmi{_5)}{-YP? zDSpJ+c$SKjLT`Zxx^fY*E=`;k5Lh z89RkiOEh!0vwJO4%(_7(Ml41ES1_&a*QtKrXW#{*udbML3w=jT4)Dl19Q%8fF!~$K9W!s{kv_;NG+1 z1b~>mvJgg+yuA>&pD(iMH`XU@Z{A%1>j=WD`M6$dO`!lp{|_jS>DFNeemqcgcy5fL zU;j|mdxp2cGtYC&LhNH5bLcK>@(Sle$uEd6ilMu=M~DCv3e^t|f2AghN1HX%s#@8Q zlf|#vJ-;$dhfXpyqV5IHzA|yetS-qnR$=qWB|cN1M>F$638OgH_jiu7U8db8N0FXe(>|Pi-dIeBwQ%7W zR}-$l@EpSg1vpwJ;tQ#o>Tvv zsgUI^dIqv?707a?HHv!RNx=3y_=slbkGHJE3yODp#Df?&W9j$McX;@&h-Ie*80*A* zIdcEX6gj>nGnl8Hz&bA(x8YOh0?!X4rfym7Eia6``7}5-)JK(n1~#cw7FyGl|CK4he=U%6DXiaF zEW~iZLXBdOn&B#~;D0~vU2j@H!vT7Ll+j+;?U(=HfW5=6sC4_4+=xpl&ykD1Xm+%+ z)|i2%HV&%(8M^P&=TI?@-nrXe3LFtPw9U(&n-}U0d~94zV1cliwAev9G2`%n&g@Pe zM%c#LkoCIOOwQ$v8D8RqDas1KrK!o2Qdpb&$Sz^_wI^w^`?B(fTN%0}5RzBAJ$clk z!mV8hpO#8> z6-kEsZ!&zh9YmI)t%d75igHP)OF}))#=iD(B;)f*D^&`Uydv4yZhDbSNA)1AkpjC# z=#PHfT2m z*qKWXuVA2GCvf7T9rO-{${u?`JaUnwZHRk{m1&7-iQHM`f(^&yIe6a4{V+!Wk!{&E z{cS(Rn>g)RP=|GQADDtWCg)q2AL0o`fb2euFC+E-~{`{1BD1L+Eq zGfQW(h$YH~r=PiP|vII)o>?Y$&^C1hxFGlKPbiZ7Y%gwg$I=IcUe^%q}c~ z(ctwL6^QN5H0^rRrTB&rj#Y;mfAwM?pP@9#GL{c>E|R2cx{E zTc4QO?@Een={mn^FRNG}b#?D^c7oNo(zwbi7scW&&ue@OcF1a3bR&$sfkrqDn~!1! zb$H15Vp6b$vT>1kZo=_^X`2AWRQ?UdeslcHToD&n(5nIGhWASu_zwrQE&}s_!gmE@ zCGW7X4y@J}9gOF?6*gV9lbycvLSeLDybQU?<7Tc~o~FK>K_HO^7oNK@cRy`)#gu|B zt3$z>t5ra*X3u&P;EtNhqC_pkw5;~dgM@a!unfQupN@;JP!z%-ClDe(?SKE{a<0ng zvPxTDb%j;-fn&Efks0=C3ljs16~Bagudz#4ce1Le3cKS;_*>#$ih7-|#qtzJHN zwuub|B?*6^xbFg{yP>Y0Q5bEUv58muekc8gJ#u#LkfYcbkX=sk7&J;)ap-1>+H}NlZWl@XAd-{)xzKh7)eSAkt1cHZy_)R-_K=gswe|0d}Jn zDcr0zb1OKR?Q@7al;F)S2If7?2k=SdD%emFb1N_ch@4ViRM68X^m@}R?DC$8+v4Z{ zIIsM--j4laUuFM~O;-4$LIzF;?xz=~4Ybc)n|D;of(iR+QwhhWRjjU8sU$Ru;;U%R z!*8p&%1|P$Qni(oLOMfF6|0RJ2T&_qQ5pm%&dc`RcDjY+&lMIysb)gS>{6g&E1eLG20qVr?8Xa%G3g0!x5lIrB-qNo zZh!dgGz)T?jcWXUX{;l;YucuRVS*yDkdS;9WEUbGk)uOuDqJwy*Du28>RYVZp~!)% zJ}FO)5Dnx6RmnqOf}marcP8ac7VH&5v7*;s#|5gb>(+OrLdI9B^E8PP<-aynMo1!uat}3660e9c=%SBS zBoncegptan@bXy8z;=r_>>vZA$D-bbDSCJ;X87o3;m{&0ml~?R8yBE}7O~5FcGVM5 ze`}@~uKEQbsxdGu+s*T;Y*<7B$F{RKF9C0%SFm9;CVVsn`p!mm#;dkIj>Cpp&ab`R zD62rvkMqh@&@Cr2e0hUOLqeEY<%w$%XGFc;=XPI)da+!-aU5!3dCFkDa`%)ATX34q zj=jrELZy?=kb=30b$GX4Hgh+awnAH22aT9I4hQF3JSifSY3dq-{ah?8WPJ1zvm0aH zz&Z-zkv0mRHZEmoUs1GgM45y0Etd;LjKGa^I{ikSh7z}?U;z)hEDPC*e$@jXRR3?03svnD0b}J!QlCz9C(?N7>%8r zTu2#NmFQ7371!mReSNwhKCaF*Js(KrMXt|C@*4U^y9uSi4E7!nhIO|C(Nno$@Cy0Y zTFvhbSgnWUu{HCqPRwD2G1 z^<8;a^I7&`+JlPSqZdBGP%aLLscqI~9@)p+17!BX^j*x^S^j|ablzU7d)TrQzN&|m zoLY3nkhA($4KkAO;*H_sW!^W-`XBO9Sv5&PXC2 z6so!Hp1z;DB^y^dltCUYDC{@WjVnDgqIe**O$HNiE3Q1`=LkifxTV?FCzr*49ft1< z433DB$GquKrwTK1V01c<15o(Gj70Y7~Q_Sloo8E zGTc;_rd9^KqP=)MXiG|k2u04@1?7gMAjznG3%UELDc&jSrD?01j5ux+dwzgi#Pf#kdb@=X`zX=c~ScjG-(KP+BX_^VU?&{5LRd_~y2E|*=QI?+xBI=4!U-sPX}q+Xrg zo9tW`;{D(fG$JAt^3Hg8f^i$aKs0%FdM0p~zL}%^aET)wQ);j+DQ zR0cPZ++wd#FYEJeG1fg^QmF#~eP$!3Oi<(D@}m`o9Eac=mIv{5BUx(GIzvbObrxwgx;&pFatt>AiaZxmO_Gn0YViJ zkkAAYkSs_1G%lkYpK9d2dRc)O| zHfB3`HK;w?%TRL@ufc5Do(or6f3OXR7&tlSSGgp^31%4!O5NMHnW|`Mg?WsdWJUIv zhzKWX<0)&nY5n=3?90>ArhsPO{cG~}@yI0ZgvI>wrIiHy_V*Cy@i-tRvK2T)UeZ6vOa??(g1d8p0itZGKE8yz>KREp zw7%@^sO!nr`}~2vDPL(Lm1(4kgir{tf*M;q!VPiPcfs_WJvTyNzr{tS>Z8?|QLjI> z=GBB#87?PyKz;*>70q1;+0lUl<=Nw;Gqf1m?k{@p#!b8v*zh=!X4KIk169&svz8gO z6^4?Y*u0+Llj=I*l_s}fUs@DA8;U7@0Cfc@0|vsewRHN()WR}7a768*UOyVQ$TEEa zQFVd~a!t5L{S)&w@4@q3&P)O+ zb=aYncmUh9+eXI!2VAF9{(DLp8vukOPHI zfKah1!ka#DzC4GQtxC2meF2*D&F$)oB#x&#i<1{it?lRMv%^Pf3$)d`gzWj_TU0)& zH8_p@z{U99da!nIXJ+-_;Mo^@%^o$KfzzJ`(%5oe_+)LrH%rYUj-zG8ZLgW!rF27X znzMBB+$-Fr>&Q$_o3*mc`2OGpF72XMcHvJDIiUv^Tx#y2IyUn2)i%Brx$oVfU!eoN zN1JcYTQimDs^!rLxjW85evM*8kMj4Ib~PF-r>27-g)&YJpeThi(~X!616X&OwuBtH+PF za1%tgxJ%8H^v-VRxI`|-Uv{NE<%jG>@1|e~J)f()w13Kj(Qq?jT(tGr&`0y`0;3~) zHF@!#>GF05{cT&&H(^-QcV$%GcGI1o4*f9t@OjD?fG20Vau54l5>TE6oz(#A6L~Dg znZjAyM1fH)-(3v6vch2+2@w1$&U?(?Lsx-(0@%oQ|9coMpQ48ad_8HpG5ZN7yV?Ks zsi2Xaa7sP=MSU)A2`Dh{n5HI~9ajR+P+9>_xS$Qky9r75W5uZKk(cuzmcAe#9SV9I zHz3;otANUex(5uS&x$SOxUBVO)oL5zo_bnLL29xZnI8Kily%Lve^*vBG`#U1Opx;O zPk@Ex*5_uzXcc@1FQ+E2BTK$=&y1)9T^Pqdj1JmMvVFu~u*Tr}ta@EJ$1}2Cmv{w! z#Af4k<#XJ;nFW!-_VAdZff4)ifr4O-FcMe~kMrpf=s)D5#O+$-xaT=NKT`4Pqx~Wh z*6$BsE_EgOqu<10(u|uaWq}X>C6(_LCzy-48LG&ALJWGjG(5DjM;)g4A=(z7WnL}B zw?v?Nf8<-lRseMgvx+OGRe$-sgsJv@g2QaymphI|TI`NiLuyJgayd&MGZCfv+Fk;^ zTnu6I`I z{>y~$rfbWDJR*;11|YyG?A#cM1ESTRtU@LM<_+usmos@3G8{(M;ON4_OuO7aSfk=l0G?|Hhdg!P%C zDeB9m8a>H*mZ1=qSvD3a8RD)wt0Fu^7PBhC*P9J>Ul|6h>h$@C<@(nx52v!|kJWaX z2C?Pqx&~?pjT=lp|ht>JWo{5_UxHGuddD{p>{8szhZkn+Lh;l~rN zVl&4QH>Q+uE$>Dzd`S4|&~4p+`Dkue=E(7v6)7Q7!oLz_((;`Lw zHQyk}@1G($`R%&tWEdOsk*L9;yUTs+KEZP+ZGz9b%o*R*|D2P`Z=#87EgXuMk#u5_jgX^ew#!8tottElWfP?PM(UY&*o2okCVSm#q!m^eTfySbDBQYn~L1r$(Vid_^1&4QEtomYdnpb3m<%hzd6a6U6O5& z(XF_k_JGge&@EtaNYCb5He!3f!=sBgzD=+f@cpd%7G>lK;AS-uMr<&VRP<{e8T%KnJG}g_-TJeFyZV<5jE^P3Wx%=T9tMfqywx zI$budks-Xlmkua!-9V(U&cXg^uDTx=-?<5ksf6A5Z_Sc#tOeptH9wt|G;h+6!cH6- zooT2%{$(l#U@>v%`8Y<~H<+7c%0%L2>XX0Epx^cRBmLJm&`)~4^ZCUdzK7q(EOcu%-G_bmZwvn25GPGN_mgk=1wA|UXBq~XKbOOC z?4?^c>vMwU$>09f*&R#ERYF+&+Y)G1nz{0uU&a&K&0mTk%lvoK_WM2xR<8Fepfg$PH18y!Y{A4V-sZHE&cs>IoP^1z z%=z4^Ml_>C1L;8&^bpO@JMrbKe!46{&obeOC6p}F=zXUkI_*D+^9y)UF@4xx?e2)KV zsO$aHxOe7=HH&u*aP5~J)y2qPx|(j`V}EWVJ)CCGf@BQVR|U&|Pt+gr`?;Kw*>jqn z7#Mu*G^=k(^8Kavy$bxciu2!1!TjAHNs<*t-sBQldhw2>+I3j?x#w1?rRk4?;Llxy z0>aO|vb&eYhZqm<0P6#4t6CCIADPn}!|ysUwWFt^O-k>AE2H`Ly->?jXP11s0Muo3M8+ zIZmr>s7u+$nfQIp(U0IsV2eO_c8#bo!zU_l9~w#oIDtRH7JY! zPIbRP_;mz%Tq}7ysER@^q_j8-FO{-7>^GZgk+z8fJ=WU~Ubz3LKg=2Pxoo(hp ze7|bEe4PK}d&mZ4rhIq3-2c68xPdOo!?3v|VN$Z0a9whdu;;?9el7`*tP< zH3Ft%H;Mv;6a6bCg+MO|jhsHM{-vrr2zJX&l>8E)mUpJAU^i*iLsYHaC=RQxi)r1%s79>z>?{;4NT0jQRkc%%k7gvy3p6k zj=l*q91#Bmfg3$&wvrx!yRWC0(03FF2I|Jk9VVvtYWs|_*iyel2O+DcaIJj&<%)dj zZbZx#wsDh^@t(v~>9_|2(7~Ix{fYx%B1+qa@u5;S1w(8t)(}jtFM@~5ONIiiJ$Ml* zX=p0}I8YyYnLD?WYU(R`Eii(#@dYgpsb}d8B$pczc2br#rd`4b#^q)P>@o`JAzVsrZ`!fj(Q>@%_b#94ILiEQRQKdSyi&j(u?q&?Q>Y6Z~>D&|9ku7zH`wj#d&IP`0q! z8;fq{;YKpYY!zW!!}XTMiAX=oS~aLCUD+%VvaYnNVOtvjd~Cf;R{j*AuuDrzv%y#j zE(h|hDOzm0yP_AmfN#A*l((Y-o7W+08Fd~*UgF91*@Vc`F;?{2-ORP4>7mMMK zfLl1rsM?sSCN!??MHnBt`)??0{ZF2HoH)*`qQm)#&peK9(`#y8cXOY)yjbk1hsCad zj4QNDZuifGr&_(^vL*Sa)uN&Gz>DPkbfS&|mHmgwNf{UyT98m0n)u}Ki(cW5oz@;~ z6~w~*g|hgJ!VpM5)%869^(uZi4dJM|_uvG&CWQZ~xq-VLe0pVhecKCLh$ren%Clf2 z<+@lGNyd)|9}sPcd9@OKFQB$~Ha5X-;DXP#i*w!0XO$)pZb>)Gfqi_hZ*cq`0MO^QFJI!z9V2x(Z=XW^xl;aF1`lLntyS41<(<>cI za1VS5`;MBSoA{O1-EZyOCI-}aDhIT@u03n`2H9-nl0{KDgV-;X@~@gG)3@&g2)fd+ zn{AGd%7@KF1D9p}5FSAZPbkWvKN8Y0(X~Nl!dW1gr5j?2529V%Ca`w0L%vDutWo>4 zX7)Il_a-E$v~JoXfHO1{5qQu<4^Z7rXj_tKg@_lR3FL&C?sMoRk7&fF zBq~qbMKzvGXWnkPMtJP5xt-g1c4g&KjnI9Zvig|TF|rN*YIY$5K)Ikt<(p^eHt3l0 zvFF1_Tt_}?S6h0}dEttL`fwY5svhMU>p%!)zsRIf*@AsmZjVNyOs4m6gz%NUc}!Oz zuA$jBVf%DgZj&HVUsCCL@(ReB4b1@g&h1sj=AXGfJDE(EEpb+1H zirNl1c!4uCAt8G^#PjL;884s73gGC`5*s}OR`nZU1o{$4{g9Knob0E1)F5M#s{A8D>auLAjcAc~7g zuV%rHNF7`!V9#a8H)brNcpVqUZY?Qfn}U1R68bvX2_c#bAOvq}UK}+2fSNG6wLF*p zJmuxG zO^-G0BI;*{kazBTS>Bqbb_ub0e@wz_TZkg~mF^(?0V>27sb~$SE*L>_%3c&=ddb#Zb>w7}U6-Aa8WMjx%?s!^`nCf+$q` zst=}Uzx>vidO3#p;r^KBMce6`oX8>FMd~ie5s$4gG9!&Afmwv17+)V#{<4yB*BNOM z1<&H_EXrA%%pxS!?h4;Wd`EX40GCA*6YK@Edwh@-%C8}$C4?H771!w%}UbUiU9Znhh>{Zovj82-w01%_O0F#i1bw*)0%mq>LIt&|8TV z_#k!s@J)e5fEnF72h~!H8OptxVB8!U(SfnJx?Zu@j38IAfn+s1&EdquP>X5*{j0N+%=rhs?Z-lUna^~R z%fV7(zK-gdxroU!4pX<3D4^7~-i@kPw>g_~7K$-JfzN`wm)9QA-3Alp9?9%SHBDJGc$))OWGs)(}sDupP4~&<|O)wk-v2<&W zdqCzDjZ2xU`Q+pZm&rx?&`rn(lR}1Yqq;f+L!V`JouA`WR{7iQPbHS+p!^@$Gh;R%U_lOic z;&^62A*5FnhelLnJb=zG*8FuV$g=ptE|q6u(vbG>JPnN#!zi( zGX^Ix*_Y=c5H&=^dWnr4eXIFIXL6H$44TxYwn85v;QP3^5!wFxADs+iLV4?XSDE?o zn1tOeVu+T73VxPH@$pzGl%2EjDS&R1G?o^QroXb7_E1;(e2}#DsxPpA5Cw zB@I3XzV{8-g7z9Qj+Ssh8SaHY*3 zzQXT~F2ll4c{EqpeD(dM<6@)+b3r z`%8ET-nba$`ty+eU%kO}JR#tr4!L%CW6z(;FF>*yj8+@#RQ-Z@Ai70s7%~IX|9d2rjT2N|_36f*|{ zK3V6j#PB{{DpiM$CU&TnU9sUiBNA=sy6@y%l#p!RD(M8Z{F<s;`ZLnD=5pP2E}_9`R!f=->B5ew^IrR56N>R)TTD=ud}x z5+F5}qJoT{2|aKo370-BK3 z9KANd!p;PzaH1$L$%bJJ0D89&GC{YsqI)2EKDB+CXHkM>IFOF7+BN@V%KE)9Ue>%` z^!pzA4lqjXK`8u z2wCPCa%Y=V+AuU&qND^ng{^n9Q#x~`*ivgqjT{%eF0q%yWg$2VKiSy#C8rj4v-%=< z1ULxQXMWJKA;i3=g5i2O-QeJhjuM$x6BcW`GJCru&F1PNXz!MhTf1T1hey$Jn1K%btzU z_p4HYT=j%1$tI*Rp3(a=esohJ-D??3o9jDMVyDnKTB4)QFUsU6$yM|# zE!9fI2j(LuyvWtGMT1+bInE`K=T?R9xmv0iQpOovw+MtykiBGk?L~9M>zCper{C*w zj+T&2_hLE{oZ*|sD>UR=bZoabv0d7#{u!0HTOM_Ns5z=CYQS%N3M)O%E_y^IU2x#c!w21->_;ZrRHp zd<^8Nw)O;@oHLffdoI=xbTDbJ-YLCoMolz=T)d98ee79->KOJ8Tz4?z!soy9D2rAr zs{?m%#81n=%Oat2+WSGUx4Do+(%CC!6PEAJQ2>QDvDg{CSl&m1b0>3s2{@`LA0(Dm zZS7#@U)#SdHrZujj;0u0eAz9WMD7&Yfk+TnHoJ}-OCEN(EkeCwyiXBdEb%J}yMBWx zs77cGk_z%$focwgeruSK-7#OGvOv^mO1snjm9GF>b9O(5S|l?B>7*m`a$3l(_-SyC_<17;2jA zOc6HavmrEwl*tTjPr70W9!iwdUR;oP9*fMjU9&o0pAbBr16xS1wE!7OS}U>3WP`r< zSJ$IXl+`=Xbu7y=^O}o_K<;%GUH)m$DzyoQC$GhdSW*S{D_<^F2v|dxSZUk5STehP z(+68e*{B_Xz<_a&q%KmH8GEzAr{mJj0ijR^F!dFk)#X?ijx>Elh_b;YU(C8s@waI# zc-XlI#B!u=>5jt6c^G|u49K^eZAfF6M0P3YUTTI>+@BeWAO5pNqPpR_2Wcgu!bcJE{^`HMhkR0^W_2@ zCghUNo3dy_fE%Xum_*(8g3*K#T-^5IA$OoYGH#=ubX$OEc_g|9ZNQv!r$!jr@(zOG z;`6jw^-(^BXcXfBGiC%`|Ds9p)@7>8e8j!KTc0LBkc{1)F9Uq?AZOb>!Q>}x*EA=@ zqjj5N=waaQ65n|!j27THV$wDMmlkCRLzk;Yg)ENI>DFx5Sj35&Z!wDiE|t(y=1n6_ zbJ)mGt7hFGM>UWf$Rccq(YD@r3YgYMQWBdXRpXR|dO_DbVMm)6Q$AP~|8zA6d^U%yCaSG=_Q zilsr<4dw&VtF#Lw6|EIvj$K;%aqSt_am)!l9j1e!xxYtP(|djA1gri$>rS7p6PZRP zLx!i^?qbsc;>l{<25@21o*Y4~LHRWpECI}^`BiP0ky7HDylSy5Qc4-IP_eCzyEv>~ zw1NdfY|~;GJ4wNW&70=6GV~0iaNC5107;eQxJ&r#oEP?n)0%#%^ENCJ1~1g5=Bn&8 zfjVTLq%}T_UGl|Fj-+!r7FVNPlXv;q?!_AmaNxLo6&5RcJwQF>_~J0cQk%fNo=Q1S zbT>;#(fv>x4&$_zv~RQ`#1Ke3bu#iJxOy44aT}U*m(U27m_VDe1YKwjsRpC`Q?_daCcqNHwBx9}*zrjZd4eb2x%2C!x3a88spHV-i!R zhpY5!pOUxi@?~^qyQ2_l!B{`wnk5g~kOYHnNvarBn(g`F}-oI8SnNmN|b)Aswm+RB1=A)<=SZg$-5_DQ`*Q;h&5gzcqZgakI zK;@=uT`Om^SgR0X^_F?JkU+zU029LwCNJ-2U(}*TJJu%lc3XI*-pT~JQc|3J}h~$Y#cH$ktE3N?FUFwM=jS|Bx z`%@3bqw>`g=3RSb(oAg9_%J4_#-gfX0xxu&1~d(_$iaRWV8H&!(=VA~G?aJPEF1Sx15sF@Iq|y zdXA@eVT^RgXr9KD3^)Xp(@<$(nW)=$YmuS5B%`qSpyH=P7EUc+bddlqjSPDUY}$~r zgw=bU^$WUGPOCM+*)XotaUZhIdk$D=C%^7HxK|paj(zwc(ax|S+GkBi{nouIK`*&O zpugQ*`!7{=X}2~x=cJUnCpCID_K^x8%M8i=-LD^T`A%u{DY0ZxxA1o?R5OgeCg{@o zZSSAo9%da>7e8jHcO3p3*yK0=3~CbkYns3P6@U7oy2dFXPSK`Zk7=UMXd}2(M+S5K zHVDgoT1sAOJ$v=LEh1x@Xm=`4c`j?t=YSwQRe2u0wuwfDdTnU} z_W+$0sKEnYQk!Tv9Xi+Q)5S3XmXc%UWAaa@Gqkf|`9zQ=GC@!9oxkh|$dk<`*EbJg zQ-$ywfY6V`O7Cs928XBO5^EtfEl;)pLQNd$w+l=fp{<05;&71Q<;+EY7K`*s0$f2$%?}LE z2M5a@v8>;+g&)>dy_lY_k?W5aLUKBYW(~$I7D3KI2ON-&d^&ftu+G<3Z!WboDl(aQ z#|m_IF^MhKtaIAEUDOn_GtZ$Z*QX2os(I4Rz2tu1at!(l;GjOWETNGr=V@cGGMzAw@NQ!n9+`KkTt7UySe8JKJ5my9 zkamfs(5h3fv}vkE{roXD78CM@l`*#U7t}oJzsTFV_lSO9Q5s<%ZPE(ki`NNc0-r6|{2UW_8Q71)kvFph^kEC2bq_IIFh1iIxFc3X1_aKG; zv6Sz{fE@*iyuVYL$(Rt<*92E^fj|bX~kAV7(J;VmD*(S3*#?# z;?_-2Fu6s5<5@EY&bb$BhhOjPX-FDKDYPDgIY}$g*GtpI?I*PokQ6E$h(O2Gy}{@D zbXRH*3>)!7f+%MLZof^jg;5=`!zH$n+jllOP;xJ^LI}+SWNv~vU?YPm38YG!lhyIe~tja%L+_b0&hvO6|+?L1rtH` z1@@wzlI44f5X(_x9O`vXVy)+z8dCy@ymmxnS7;BKAgw5jH-?5eXjeYIU675 zz5me&I6k)Zmp# zt+``OM5bo1HsWg9Zrsg*;&(aqONpdhzuAGTImzV}aY>J`iHG{IW+=4d2%?ut<|FwK{o>F0WM#Vg2eq>^l&qX!@ z^H77o*Rp^5r$ZhUX1g8LPpWE}JTlRHQ1?&!8H3 zx#B#z0*Y$~Okk%W$Z8Vv zo;Ad@?dDl^n}Z{wHM^F(Swak&(FU$O9IdX{A2+y(j7lS+_I;Ac&QLM-l*cwOn$@nCAM( zv_UJU;`HcHHw(^mKH7*{01M%mCKuadQLDBBbbdDJsW8$9@t9J;G7Zch_XvC1(cO5| z?4qDFH+yaeOXDuxLF37{xb@f>0f<6%X%}0nJwmKvNMkx%a-kGfs!vY6U{eD9!Q?hq zD6S6baz!KY{Bf7bWuZES@AsaO$e~WpRwXU;#5idxYW7BNLh2`uuAbYY@5ax-Ch-JE zs3n$KZUwW;-E6A?tuKuuzZ^qMbUGol#`+XS6&dVz%7VDz2mE{6**GCK1i&mY3JP0%#FO6v<0nVO>UYxhLL%;G zS}t6!)(TkCgx@Nw;5*%osuNKf+&y75Nbau##tA7g zS5)I|KXhHuY*1bkGb)K+Z3{NF7mzjLUmO!@+S{6R&AZjnzQU_vsa$citwGh)?XCL| zwAI>_hBm)gaw-^ zz`~nptw%*qMNl4cB7-Ckhg`CbE_Tjh&ayzoUY=-n&bsSJbk6Of)*o!oPR?AOWwiOW z9N!H!wyK17{kV0H^6>5ZiVuS$OT;_5%Rb}%q` zh%e{2o$%kg|4Wy(f1licFMi`Z5Za>W;6%)q$TI<(@!7sC^3P^XFTGhrO;~_It4|^@ z%zW*KVEL7)wRE4mO&Iv_F8@lwtjO1--7hCX%RU%9EMEBmj-A!|+HLirE2tqsWN}m~ zNn6+W{fl)lm2N?(^v0*!@o}*%YG-K|JbA~WXE`Oin`aJu7B1E@CVA!Z#(Ur9zxXGX zEo(5Yw;6pAgPs}m&j0C!!xZh{!4FN4&%!N3zZD@1Y76^Di-0Pj`TRMneS`QTKL5UX;cNwMRnhn_z_Bq#Tu`EZNE z#XWGr`s$%yF+PsCz-zvNn>T>we;haBScYgDuyB0-(&@$@sTu$7Fu$TfU=`UTdxZI? za_0-_2H;~wNrRiF(rZ_vjyM)8lK2X~V@iE_cLaL+d&-dYr|BcbU7x0p;}1WnnK4Lw z-+1EZ+qoNnGakE{KOG8t?*FGd{eNHof1NG2KsP|h7HTu>o?s%?aZTFzH8gpXf@e1k{Dn)p5L9qY(kzKOI?~} zIlzwsHCj!-y96ot*`dq-`rR@0L)NAbes)|Aa%|*S{>Dk|!_SWYjrO0BCH7sx>`@yH ztkRGwjrQr|)WVsbo3jZ{%J)-MA!(d(tuB~M zZ*@QW4dN`z#P0uK=iyV&g-@EZY%j?23GNZD)w}MMu_zjXlW%+zSyPoB&A;wptTYH< zjw;1;E>#0SF2{3gjlz|D7=3m|{8Dkz#?0*apvtkfZHw(m@!1j#!KOZ#S=aJP zn)k+VQN8V|wdC?D9?5&r8H9Fjx}4uAd*0Bc7#~@6e84~x(zeD-7AwlGn{9=BSD4BZ z0Jn`0x$U+>WM0jCZP_Kz;NNNrWeF*&7M0!yv z#FOn4B_(u9d~ME@Wqd384C}v0b1#X|ktQV7XPs_h+c2ej0ZmUET6+J@@cNG)5B~{S zY?S&7*~mA9AJcxu7aN?^|N97sPaV=d{{PP3&8y!WgC=vFTs32HvTPOpN-%ywG35TU z30p6!nVA;osQ>mYMzomWQyMYP#sW4XWHt6v`!84K96E5)aqS&X^jCh z%kVK63bi09C7MXaF!*9qy^b<|Tx@yNaM%X{W`lTd)m$zkHctR9rV}o^uE!q5k3)bIAOrk$KwQIYW;#yh)BDdmz6$CtSh+r#kOBJ-92b-WK2%q_mzSR_4b! zka*ryT90U(3-Il-Uj4>}f5ry6z}7mqaW*v5G>cXsDAwI01{72mm$#E_pJE3`S5~H{s0#Y zXKjV@38pLf0++>N(Jee0TasBjFymVO^@B83qU3;oFV^4M zU*<<&l{m#7z-O6rwiJ^xU^sLRn z*ny_ps~2O!ep{&~fcgFiYc2Wh3Yiq>@QAw(U8zY1pOLN(hj9koA}$JaTH zY|`&yuV#Uf%a82ryvwL-j9ZU_X4Er1Icm$E(>nVXn|P8tGw)$PlHNA5M{~UY3f_Q0 zYZD?dn3`Z~SU^IGvIGpTsI;XgD4UyGCwmy_zM6^o5W6GBsq-cL$}Ob|xQ(PpRanAE z;WN6qpj0xI6HJBbEOcdKuSifPHX2~HIYBpNhG)dZU6-P+q0wcxD721FPQQ{yE@@B2 ze9c6aXY8ZvSN4O_XM?DgEc3mJg}z-f>2$2=i0IyRhf^I|Zppg5G5G_RD)!)r_FXA2 z_aw?1g7Oj_H;%UY7_gn6=n{Bu*bO)CLGWi(l_x2rgYxT(&Kh@i3Bhb$ylJu@=1S_J zblMe<=SbgwpXIuoe#$K;1R4Mh9Vg%xK!~!V(7B%R5_&(%k1bI=Yx>}+COmcJKvlwH z7p8*h<6u~jSI#JMGGI2gX($${B94Veon6;_{|AH?w?DEGwdsh1ttr^7@+RP{0`PH8eshV|P&{(**Ov_GqLa267?#I?lCmP!f zgU$)Po?K1}7J7=$@PW;(uyI9y3U4yV8X*r{*P9qnthR;iP7ke%6cui0KT21vZJ4rM z_ki`wW&2&822jbzNHR$dy?|ud_I>d&dcewM{DOpl`4f+gB~+=C z@%e{?L&X*^*U!YaoW{}TTGf^k1y@F-tX%xfrrB*ab;W1o_cIvE*muBWIwf_#exf+1 zQ?Y2U8k*@lYlnI9)1mj{exu0B1-2aNSIv}`vfaFQve!)$E`Rnbc>Ynk%gw8N8ype) zK9njc&Gn*I&j$m-7_hXC`nscFb5ZN7TE~ZM%Njz0Ba_dh!KlJdzosK$y1nJo6~|fX z_bjrBIn{m*qsz(>54Y+*WmbkfTrewJmmXd=$*0<>XncKSCj5zH6Tn206{9+R22T5s z!t8(%0zGuleR6mZuC^li!jPVBHh88uko^&#;H+ZQ{uPb%(pmQ(Xr?rV9Z_Z%YFUCW z%dh;@T{OzGfO+Vk)b*57KWl4rC5eEvsgH46c@pM=Rzr*!#L4_@S1)_(^ahM3 z99*u14}F$o><=661z@Xe#pVPmcN9E zUSYc6aM93ws?`WE2(0#6x6A=47THnZ8kpkj8b~Oihus#*&VE!psQopDnWYUTbcCt} zs9?N_-ObA0bmNVI)?8IGHn1o_FQf|eGWC<> zVzP_@vX&8g{WU$Vi^a8l&%zYLC)AmOcvLb$cbU=zWLgSwvT-&U{K%pJ-DX*#D&4W! zT)n-kFUd>M9hJ2aOjo0@``kJ7uMS85R}Vtx1%}o-F1=z{uSh!K9M=Op%A*ARzuR&fFR3yQPPzC4(u%{4-@g2#Ani5OlFt<)nkj$QVRO^G( zTu$A}rn4Lfy7!^Z(j*gG?I0UuV~xB54oXTk9phu5U^rYhn2l3ykC40K@m+O$B`i$l zJ zOWtqRunVdIcXsw37?tmFX1LjUH{CSyv%Uhkea<;MNPoAjyNJ(jv;(FP+s=0(^w`kI zepDpm7^eF+syIBctSIVfClkg=8!2T6#Kaan--dlPmQI5cOUCopAJk6D$f8QpqpN*! zF_}Y|UJRCvWy#bxxUlCkUbdl7m}fApKvuQeR`tNIOA{i+izheFnO25l0) zh~;$s07<`Kb%vx8K9B6|_Z#2hDiGbLeQL6!p_js{p_X@%6R7gZs=_e)Nm+sL%DzyB zX=)CeV_-*5)!uC&zmLi3ZmKGBVR{5)@G^{3 z{k)i-7a5C$yw^JI!aBw*R%gc(w>m0Q18K-*MIfRdO%fgX2!5gau$~xFuw2nc^%1Ps(G&wB5=DPPzC_?<|B9bg_Fr@Wm$+5NT9n zd*Xf|4u7du9wI|>C_>iq<1<{c_sC|&k*jYTsx7}ADY8j0)z1_@BFSd`ug`0biGAYM zUik{5{bKj!JNm7c|G+rfzb@xL`1Y7Si||hJmxXHfm0zaL!r#4}EKSRSIYlLFRT^;K zYKmFVrGmNR%j^}J#atJrST>9F85YnkJ2(hzoT#gvCxj@fOofK=6%g`t;2OxlLMcx9 z8cTC2K!R^E3lsYe6v!2HDQ)z}xjsb}^~RZbO3qD~r#r`BRUQqaM}J!gX4CxAU%+C+ z&_l{uuH{Io-!ciLx)B_CEk-sV;Ur_Bw4e~sLTjBVUmZCp>%P~};3yPs3H7x9cr_B{ z9D`s%W{^cJsvVfz5+t^BkbJQ@ig1$d)sJdu<&E`>$@TX^v;AO^}1Q=|tJwwLT zdwn9zz}A+-M}+U`K%+jlnbjCF&4%HNiem4hCm=$4I&9+NH}}rmyf~HP4Zr?>+B@&4 zCbM<_JI8SbQE(6=f`B6+U?M0bNLL3!FD4{}60lGcI!TZsdUS>s+E4-#A!;BH5(p9q zmYpT+s&DC&$`~Zch z&&}6Ii;m~^Q&Hm8Cy{26f5NE*w9LB8Sm>Ez*TxDeB-PU9?MGzbz`fo>CP~uFugAv2 zuvdpUZ&(JCx$qpu;>j{!II#m*On!r5cUFYv*PqU-N~u=o3HaPVZG&H@D+n0>z{E$s z>90tR!)A&Vm|1{Qu4|e0O~;_7S9ZJBXTS&|u|~*m5+}nRR|}44PkmwUF#!g2bs(^V z%~IRJuMYEtEINxtDW&o_!Z2603b#RcERL-}@@kQF2BSo$2qS|FD}^6lhs7bKN-^_g z8R`|%cMT`bEF4!{!27rmOe zt8mO(*wK%EZ58wNev{rrHTL#?%%akfRG6q*xvi~88>0#>@0BElH=Q;&L_yO&Xpeq{Qjqhf_ARikAKCIMB`~2+T@9 zQh9%ij7#Re$slM5d1w1rk)y5YMlA!LHNt?EBM&6_JQncZ&Lk-Zy~cU61W*>)I0kbq z5r~9x4UC@Tomz~f1Iqx2E<}@}BtQ7MOQWwRyT_J)pV9`(Q?GF71fs24Q^W(TkJ@|_ zw=g|LOQc7UKlS{o06yEmFLkjWo6>hw{vKAIBx$a-C_~V3 zgh90b92~MLfppnO7Zb#^cjmVPl3-h710ftVq_XY*oIF;+A}dRBP4RWY_u z2N10;Yve+Cdf~9=a^EE+!X9ebtt0qbLST1~52!CSMURM-U7Mc?f5O*zVf?NS0c5AS6~SOJ-WJWzDbqNF)Y%HGx7-Sl#Kx z#dWB42?3GYjQs2^}ERb`<*hGkBJ&ShIm);?L^$>QTcU^ZT@_uxdTK#zh-E z4BX2xDvj|3`%X5`xZBVGMh4Q<@OWJ9#yfjcc$M3B2rhXeGW@!c%SOg-4{VyObnAtZ zGH;;Uj2ggZ0Zod9-xGm&v&u29rMo=!96jAhg6RZmyBpwnoycc-mUA{UC;+ zN)2K4TrZd|UZ@Z-UT79fF#@XxD#!cph4y(aGvj9bo?~vP%DByevr6pfE7BqrIt8rL z?QC!1Q%WI>C^{E-Ud*sz10w|YyijKGZnB;^=cUU+9widS7vv$1?uf=NP!LR_*sbW% zLIa=Ug?c=GnmF|%*g()5VUG>o`W55LD9ygvR4IQPkQt;nW;2L!pie;!r;PJYKm9n8 zXo%)#)YWB2p8yS+iZ9z!k({@1EP_5t$2yeCW`@2ssAF+SERPgXxp=8>R}6yS^*b@lQ?0Il3jf4rHgj3=E&B?rzvIOIdxQqBKS4me8JIAZOGO;f+2 z8I?iD*Tdl>?)&PdH~dUHpmex^FbA69CkrAqT#6FlkfqjcgB}+?cXTn9bZ^XZNEOm0 z7v08DoV%dqEm`SwI$`Qn;OjApa670uNTJ!n8?FLC?_y*vAA~vdBnw&B17W zE+gihLFkUwoL%~5*b7CwN>|-76px9}?^4bkd%C~SFSeaNyzfrXH9JSdV+6!m(WIAc zt3%ys`}#Qtd3VMlJ=H6#7R*3`@qT!#rSLWZL%021(P?UB?-3{M&NWf5F*-QACRl7s z1X`FZNx1Gq-m0>>g*;@5Vailud4TYy*fpo8$9>4ru{n)TZ*!eP?2f|t2K3m@jEvSM zuMrQf@>}{;bWB5Zz(_|lY`NPM38CiC7}QVST~f+979CBoNkl#|SCMR+s-aBB{` zvAYrse@Y(GOv%>#BMEVi**7;89rV(92arZ@%5uU=%g=o^`xkUZ*uM6Jw*W0~$yyIuRNBgV2d;4OVESsL&f_Pz}+M z7PoSOuXrixi|@F`Tn=W!=1n5!#9oA|yG#dAuP0Pzmjmhaxigs8?6ixX@!iz1Jp~&u z@HgU4XT^@>wi=a+v!nsgNZ*X!T|0Tq(&CbO36bBXR(>3Tc;$KxnuhU__O1|BSap)C z&PGPf4vOARIoIny9xJlhtY>Gz4YJ|*I9NP}MyN=265F4t_#x!(G7Z(Ee1>D|9fnQ> z`Dl%q4QxB|vFasRKGwzhQyxr9$h#~TP%~7wQQbZ7cp6bZAGjDu&5zdtop(xEnIgWs z$8?y<$kzx1BUI-ly_0zLIr9sRCPogc=byfc+~s_T7#wgL`}-KhW9x_LT`gY02-)Va z^ntup_h$>34zEXwgg4jE-vyCqsSLAdqiw0G5PIT>-ZUk|bYrcHLYXOj1bq#$d0mOf z@<{DQ=;Eh`=BG&U-SIda*4VmI!RUSomWKxd>#u;3KCZeA-1O61#w42)d$r|`p{a?Q zeuVSZDTfWj&O`K;NNpJ-paz35s}%1Yl_MN{GhEixWzO#n3O@2G7$geA;Ckj3AmavF z=2%_YmB8&l8-6dN_lmXWi#pX)TPURtGc1H zyL!tVnQP-JdiIg2!opHRU_iEC#jqreUmY?qhp@OLdj-aVuZ$7>8_zg`%5ikyqU$>+ z{|{S0_eW1(RuL;WZBO&Kl$ROO~_3?wf8JH*+8!k?@ zM8E)E(;;40p{ro^Oms2lub3R=EH8s)H>U3}0H%0ZR%zqoj--0md!$OQnJg1r*%60z zR0uKz;c$r4?TbT3qCdcPQO7zCk4&s+jEt3D4eEG)`&M$ZR^Xrm7 zi~V?!|1Lba@EgMJ|B9yY=Xd7Ih=7x}Cofk0J1gPVKbd^Tb7HiU;>9MbPNSk7`GX;! z_cUBssecDM{UnvAH+Jc_(&GEQ%F|~pd-31=R!Tcs^$%YqMUR>CLlrAXHfU;|Cc>!r zO%OtieeNtZUW-!6%CYQFiMw)~r#J|X%z(V1H3sgxArq?}M?3#p>D8Hz;fQJ51qknA zSD|-Tkt}d3!_`8Cx$J8RiNiK8BzPa_)@wV^e(-&AqpX?W_-~~ah_CrTl|^f1U*k9K>cJ56u+DMW+`(`r{rP{OiHEFXHMd^tpxwEtbcc zS)7+>8E?Fo;b_xvtTDPx`PD=DFPrVV$7d8WU$FA-PLU_8y&;|7};qyV?jctcnf6Lk@V~*%0c0y?W>9$~l!YeLpaiV^s6+o}Hu<@NeGR zG%|LSJv-~)H#XjW9=0pSp(;zX@%5v1f(tUAX4xpL6FUYqI20PU$4@(xvJ z-P7FGuHAc~S6FeaCDn)cMGRbOo%^vjSl>8QYA!sI@@Ut&y?cwb!vZd)F-fuLJf)>4 zoaN_0zt}-SX}rxX^o5JJ1D)R~VOG(;nI*@q;SL9Y$dTLYU zKeIHfMVZV$#%X+c_xRK6e<=}r`~yDz1D0{WsW$@OYKutN+U`ANQS5Q0-^iQ(1V>t< z5gK2jRMc&eSvcWqJGza5dS;ATc%`DflK*=9n4tT;SIiqOi$NaUER4^}^FVJ!0d79# z30RG5KfGnrTZqgQo#C|3vg^K^`BD#RPyx8@1CCAf8|uVtjK5iD5elIT(<-cGjSlY* z96?&OsSW{x#$W?Lby=r%ub(U@lM7`t(TpB`y(w-xc4&T4-Wt(JDE+i+HnUiCSS?mJ zEjZm8B!fy8xR!a#N^;E1J7J@=i7SBTZh1-}ZYM*6iD60I@3Qzd17g!G$z)C|lJPAf zB=>-=mP#Lg!yTz>!3|BSk`8H=%Z@%;-v=E*Zy#N>i?z{Zjx`_m2}M>(-0M))WZsZ1 zoG=-OF>XXw47+Q~DRBMjfx7At*u3Y#xRO|#Im*HV7G`ZkDz(xs zt+&&@IWVQy5pyh?v>IB%by!TED#5b?>I}yGE3$koyL^30d=TXcsHupShC|{8)6VzSH22|a zot1MTyxy>?AvCOs8zY|F5Gq z&pKa#%}Crc7WOLn}{L+1;;q zrt=cZvsg{?CuweTiFJ=KCuDh*UC>35Ujx)7)8m&nF>&l3>Y!v0^)CX8y-Xf2Oyf!8 z`DbDu$I4Pmw~Z;K1cY_CFoV6jPwAAIl-}w2^69d&03ktLRbjkIqVPMR=c)3bD{gh2 z07h(ak#T>GCsF()=9R_-$i&kUo(T`%FI9Gx4^nwF+*N@`U=ch4oRxRpZrfTxRe_eG z9KK>2P1${XeKn^v2`#{i)*OJ?;c;RlBmLl>|%)D{%yXJ;b zh+ALMhAHM!nv)EZJC;#e5ujxn4 z7nd$~77_1K66sdDcKSEL0Q>T8h(C0-7wm+I7P-QQmW3Pr_TeSmHh{4JZtJo51g6pT zsK2ce=_CuIgFI5ii6=Sp*)59I=BM2TUv4o_ZDKd47)sf-@=KU{&xhH^}uuK{g65%_t1JCU-wFF z@OO3kx7jj=xg{(Q8a=x-W5~i8mS(eE?NXh|Pfkt|yU9wVWL{1wUs-$RF_-NFT>d3` z2naeI9Orz)FT`bWVM!xVY1U%jBfIu;j%01u0UhIo!PVN$R>6kbepR?+l zj}8K$2!!lnst>MS{PZ+K2sd+p_gM}dKcZ93GV2+coB*i`}tHXwPD+hE73$)nY)Vl$TedRq6u2 z1`WW_Pi7k%4r!TzPKb0?1gWYcz4_m4#)md}_SRj#;LQahgLqXsV0_?i!Bm?wG5}go zyH-ctluFd6#X&QP3M4UKUIs~`_}zq;&RzcM%OCcAYX5bPRbb9Pi}_@o_epir?xHIm&8UxGN<-74ejyHJ}MvSgPr9dqXdp3hD+oBZR| z5a?)KVgVb+q)|VrsLE+}_}PrkSuvgL=o4*{`0Fhb{wr*xeF)&p2L5MVvdw9C=X|r* zH-YJv*4N4lwGk%KWRJRSd=*Zc$r*%mh9e4r6vN9BrQENVRF>L?Y~=06O4_1NR!|rZ zgYo*ERhWRdwDt^m6ka>L!QTgM!dBg6#)~_m7i%A)@z-^Nt7=h$@|7ItH0R*>v(jeh%K90Wc~NhW z5=nEV>2h|^O%P*hoz}px?|oBqgG|~v zPN2MBylW?Ka^pTuQ}!iNmc#P^*ITQbs4JnwR?h@)lx$M@LFm{D6w!tNJg+9|RIB)Q z7qo9x%Zh#L#X$RG>SvSC`UMN>8Xv672vZAg=dL%%JX<|Wd5d7}2Ug(fqv!qXYy2J* zzX-{I;DXA*=6-Ou$FwIlzp9fBJDxWggF>IbcDJ{-%ocJhYvASunZ$12Cm2F`v6^5QNMUXGcv$-y)u3kk1fwjGU zTI^i+?k|;2DB0oux(@Lg{Jba3ZKkHWV8PAYwe(m|-S(Au=i9=cK7RF4EJq!(Tis!c znUT)DqWME_w?B0vZ+BPiD#Tn6Jo`m&MEdidZ$9rKWpu>b{EqCCB{sPHW4OyHu zUM}fIzjNgubLT#9NkT)`gv`lj94LESF>e!AvxgPi7A7DTW#O2AN&-saQRBNl3t?n!sdm& z^B)494ec;Ks1NtPp8Rz3!K>Rpjkv#8Jn>R*=K=NN2VTG7wUq}hYv!4)aUUO${^OW! zzdEuXR5yRHxKOYQKlJ|=?!L+|wruCD%6K#V5XAFFp%mQtVEMMxUxyNd$-UMWvsX*8 zdF~~aVrT8-LNlA>l=UUEW2R;%GiDlPSJRcVDaK@S>e})lNK4h-)rx=WK!3}}D*uq* z_=lEkfByI4%ZL)NBgF3|>GG2W0GUjbkr8n79-Ll!apIf1;gf{&x6rnRRlpI?n+l3? zUem>yG2^Q6x?lBm8%5D+RsY)fbH^aVOcb3C8=35z8D0e_#`Ua2>7F-*WcY1TkJgfR z|KW8JajRVO?wtcCC2S7=^z(nC1NrjA{<-zP?EhW@cHp~x;Z_GG)4sawxpxoz@6xP& zkI(J9Bo=D@-@E|}ciR6qK(pH9o>O0a|L6Aae~u>6{Jq5A)V{jx_UFI${QULRtG`1$ S{?85i*C+n}8i8*=5B(cw+3o58 diff --git a/src/Application/Interfaces/IConversionRepository.cs b/src/Application/Interfaces/IConversionRepository.cs index 29345b7..f121c5f 100644 --- a/src/Application/Interfaces/IConversionRepository.cs +++ b/src/Application/Interfaces/IConversionRepository.cs @@ -10,6 +10,7 @@ public interface IConversionRepository Task> GetHistoryAsync(string? search, DateTime? date, CancellationToken ct = default); Task> GetCompletedWithoutIndexAsync(CancellationToken ct = default); Task AddChunksAsync(IReadOnlyCollection chunks, CancellationToken ct = default); + Task BackfillSearchIndexesAsync(CancellationToken ct = default); Task DeleteAsync(Guid id, CancellationToken ct = default); Task> SearchContentAsync(IReadOnlyCollection terms, int limit, CancellationToken ct = default); Task SaveChangesAsync(CancellationToken ct = default); diff --git a/src/Application/Services/ConversionService.cs b/src/Application/Services/ConversionService.cs index ee615df..caffb23 100644 --- a/src/Application/Services/ConversionService.cs +++ b/src/Application/Services/ConversionService.cs @@ -50,7 +50,7 @@ public async Task ConvertAsync(Stream fileStream, string fi var markdownPath = await _fileStorageService.SaveMarkdownAsync(conversion.Id, markdown, ct); conversion.MarkAsCompleted(markdownPath, stopwatch.Elapsed.TotalSeconds); - conversion.Chunks.AddRange(MarkdownChunker.Create(conversion.Id, markdown)); + conversion.Chunks.AddRange(MarkdownChunker.Create(conversion.Id, markdown, conversion.FileName)); await _repository.AddAsync(conversion, ct); await _repository.SaveChangesAsync(ct); @@ -124,7 +124,7 @@ public async Task IndexExistingAsync(CancellationToken ct = default) try { var markdown = await _fileStorageService.ReadMarkdownAsync(conversion.MarkdownFilePath, ct); - var chunks = MarkdownChunker.Create(conversion.Id, markdown); + var chunks = MarkdownChunker.Create(conversion.Id, markdown, conversion.FileName); await _repository.AddChunksAsync(chunks, ct); } catch (FileNotFoundException) @@ -133,6 +133,7 @@ public async Task IndexExistingAsync(CancellationToken ct = default) } } + await _repository.BackfillSearchIndexesAsync(ct); await _repository.SaveChangesAsync(ct); } diff --git a/src/Application/Services/LibraryService.cs b/src/Application/Services/LibraryService.cs index 5f3e338..ef0447e 100644 --- a/src/Application/Services/LibraryService.cs +++ b/src/Application/Services/LibraryService.cs @@ -10,7 +10,7 @@ public sealed partial class LibraryService private static readonly HashSet StopWords = new(StringComparer.OrdinalIgnoreCase) { "a", "an", "and", "are", "as", "at", "be", "by", "do", "does", "for", "from", "how", "in", "is", "it", "of", "on", "or", "the", "to", "was", "were", "what", "when", "where", "which", "who", "why", - "con", "cuál", "cuáles", "cómo", "de", "del", "el", "ella", "en", "es", "esta", "este", "la", "las", "lo", "los", "más", "para", "por", "qué", "se", "sobre", "son", "un", "una", "y" + "con", "cuál", "cuáles", "cual", "cuales", "cómo", "como", "de", "del", "el", "ella", "en", "es", "esta", "este", "la", "las", "lo", "los", "más", "mas", "para", "por", "qué", "que", "se", "sobre", "son", "un", "una", "y" }; private readonly IConversionRepository _repository; private readonly IAnswerGenerator _answerGenerator; @@ -47,7 +47,8 @@ private static string[] GetTerms(string? query) if (string.IsNullOrWhiteSpace(query)) return []; - return TermRegex().Matches(query[..Math.Min(query.Length, MaxQueryLength)]) + var normalizedQuery = SearchTextNormalizer.NormalizeTerm(query[..Math.Min(query.Length, MaxQueryLength)]); + return TermRegex().Matches(normalizedQuery) .Select(match => match.Value) .Where(term => !StopWords.Contains(term)) .Distinct(StringComparer.OrdinalIgnoreCase) diff --git a/src/Application/Services/MarkdownChunker.cs b/src/Application/Services/MarkdownChunker.cs index 0801013..5aa2f18 100644 --- a/src/Application/Services/MarkdownChunker.cs +++ b/src/Application/Services/MarkdownChunker.cs @@ -13,7 +13,7 @@ internal static partial class MarkdownChunker [GeneratedRegex(@"(?:|^\s*#{1,6}\s+(?:Page|Página)\s+(\d+)\s*$)", RegexOptions.Multiline | RegexOptions.IgnoreCase | RegexOptions.CultureInvariant)] private static partial Regex PageRegex(); - public static IReadOnlyList Create(Guid conversionId, string markdown) + public static IReadOnlyList Create(Guid conversionId, string markdown, string fileName) { var chunks = new List(); var headings = new List<(int Level, string Text)>(); @@ -37,7 +37,8 @@ void Flush() ConversionId = conversionId, Ordinal = ordinal++, Section = section.Length <= 500 ? section : section[..500], - Content = part + Content = part, + SearchIndex = SearchTextNormalizer.CreateIndex(fileName, part) }); } } diff --git a/src/Application/Services/SearchTextNormalizer.cs b/src/Application/Services/SearchTextNormalizer.cs new file mode 100644 index 0000000..87595f5 --- /dev/null +++ b/src/Application/Services/SearchTextNormalizer.cs @@ -0,0 +1,41 @@ +using System.Globalization; +using System.Text; +using System.Text.RegularExpressions; + +namespace MarkItDownWeb.Application.Services; + +public static partial class SearchTextNormalizer +{ + [GeneratedRegex(@"[\p{L}\p{N}]{2,}", RegexOptions.CultureInvariant)] + private static partial Regex WordRegex(); + + public static string NormalizeTerm(string value) => Normalize(value); + + public static string CreateIndex(params string?[] values) + { + var tokens = values + .Where(value => !string.IsNullOrWhiteSpace(value)) + .SelectMany(value => WordRegex().Matches(Normalize(value!)).Select(match => match.Value)); + + return $" {string.Join(' ', tokens)} "; + } + + private static string Normalize(string value) + { + var builder = new StringBuilder(value.Length); + foreach (var rune in value.Normalize(NormalizationForm.FormD).EnumerateRunes()) + { + var category = Rune.GetUnicodeCategory(rune); + if (category is UnicodeCategory.NonSpacingMark + or UnicodeCategory.SpacingCombiningMark + or UnicodeCategory.EnclosingMark) + { + continue; + } + + builder.Append(Rune.ToLowerInvariant(rune).ToString()); + } + + return builder.ToString().Normalize(NormalizationForm.FormC); + } +} diff --git a/src/Domain/Entities/DocumentChunk.cs b/src/Domain/Entities/DocumentChunk.cs index 0950e0e..6587627 100644 --- a/src/Domain/Entities/DocumentChunk.cs +++ b/src/Domain/Entities/DocumentChunk.cs @@ -7,5 +7,6 @@ public class DocumentChunk public int Ordinal { get; set; } public string Section { get; set; } = "Contenido"; public string Content { get; set; } = string.Empty; + public string SearchIndex { get; set; } = " "; public Conversion Conversion { get; set; } = null!; } diff --git a/src/Infrastructure/Persistence/AppDbContext.cs b/src/Infrastructure/Persistence/AppDbContext.cs index 322ed7e..677ca37 100644 --- a/src/Infrastructure/Persistence/AppDbContext.cs +++ b/src/Infrastructure/Persistence/AppDbContext.cs @@ -32,6 +32,7 @@ protected override void OnModelCreating(ModelBuilder modelBuilder) entity.HasKey(chunk => chunk.Id); entity.Property(chunk => chunk.Section).IsRequired().HasMaxLength(500); entity.Property(chunk => chunk.Content).IsRequired().HasMaxLength(1200); + entity.Property(chunk => chunk.SearchIndex).IsRequired().HasMaxLength(1500); entity.HasIndex(chunk => new { chunk.ConversionId, chunk.Ordinal }).IsUnique(); }); } diff --git a/src/Infrastructure/Persistence/ConversionRepository.cs b/src/Infrastructure/Persistence/ConversionRepository.cs index 31d745c..46cfdc6 100644 --- a/src/Infrastructure/Persistence/ConversionRepository.cs +++ b/src/Infrastructure/Persistence/ConversionRepository.cs @@ -2,7 +2,8 @@ using MarkItDownWeb.Application.Interfaces; using MarkItDownWeb.Domain.Entities; using Microsoft.EntityFrameworkCore; -using System.Text.RegularExpressions; +using MarkItDownWeb.Application.Services; +using Microsoft.Data.Sqlite; namespace MarkItDownWeb.Infrastructure.Persistence; @@ -40,58 +41,53 @@ public Task> GetCompletedWithoutIndexAsync(CancellationToken ct public Task AddChunksAsync(IReadOnlyCollection chunks, CancellationToken ct = default) => _context.DocumentChunks.AddRangeAsync(chunks, ct); + public async Task BackfillSearchIndexesAsync(CancellationToken ct = default) + { + var chunks = await _context.DocumentChunks + .Include(chunk => chunk.Conversion) + .Where(chunk => chunk.SearchIndex == " ") + .ToListAsync(ct); + + foreach (var chunk in chunks) + chunk.SearchIndex = SearchTextNormalizer.CreateIndex(chunk.Conversion.FileName, chunk.Content); + } + public async Task> SearchContentAsync( IReadOnlyCollection terms, int limit, CancellationToken ct = default) { - var candidates = new Dictionary<(Guid ConversionId, string Section, string Content), LibrarySearchHit>(); - foreach (var term in terms) - { - var pattern = $"%{term}%"; - var matches = await _context.DocumentChunks - .AsNoTracking() - .Where(chunk => chunk.Conversion.Status == ConversionStatus.Completed - && (EF.Functions.Like(chunk.Content, pattern) - || EF.Functions.Like(chunk.Conversion.FileName, pattern))) - .OrderByDescending(chunk => chunk.Conversion.CreatedAt) - .ThenBy(chunk => chunk.Ordinal) - .Select(chunk => new LibrarySearchHit - { - ConversionId = chunk.ConversionId, - FileName = chunk.Conversion.FileName, - Section = chunk.Section, - Content = chunk.Content - }) - .Take(limit * 4) - .ToListAsync(ct); - - foreach (var hit in matches) - { - candidates.TryAdd((hit.ConversionId, hit.Section, hit.Content), hit); - } - } - - return candidates.Values - .Select(hit => new LibrarySearchHit - { - ConversionId = hit.ConversionId, - FileName = hit.FileName, - Section = hit.Section, - Content = hit.Content, - MatchCount = terms.Count(term => HasWholeTerm(hit.Content, term) - || HasWholeTerm(hit.FileName, term)) - }) - .Where(hit => hit.MatchCount > 0) - .OrderByDescending(hit => hit.MatchCount) - .ThenBy(hit => hit.FileName, StringComparer.OrdinalIgnoreCase) - .Take(limit) - .ToList(); + if (terms.Count == 0 || limit <= 0) + return []; + + var matchTerms = terms + .Select((_, index) => $"instr(chunk.\"SearchIndex\", $term{index}) > 0") + .ToArray(); + var score = string.Join(" + ", matchTerms.Select(condition => $"CASE WHEN {condition} THEN 1 ELSE 0 END")); + var where = string.Join(" OR ", matchTerms); + var sql = $""" + SELECT + chunk."ConversionId" AS "ConversionId", + conversion."FileName" AS "FileName", + chunk."Section" AS "Section", + chunk."Content" AS "Content", + ({score}) AS "MatchCount" + FROM "DocumentChunks" AS chunk + INNER JOIN "Conversions" AS conversion ON conversion."Id" = chunk."ConversionId" + WHERE conversion."Status" = 'Completed' AND ({where}) + ORDER BY "MatchCount" DESC, conversion."FileName" COLLATE NOCASE ASC, conversion."CreatedAt" DESC, chunk."Ordinal" ASC + LIMIT $limit; + """; + var parameters = terms + .Select((term, index) => (object)new SqliteParameter($"$term{index}", $" {term} ")) + .Append(new SqliteParameter("$limit", limit)) + .ToArray(); + + return await _context.Database + .SqlQueryRaw(sql, parameters) + .ToListAsync(ct); } - private static bool HasWholeTerm(string text, string term) - => Regex.IsMatch(text, $@"(?

FILETOMARKDOWN · BIBLIOTECA LOCAL

-

Consulta tus documentos

-

Busca contenido y vuelve a tus archivos desde un espacio privado en este equipo.

+

Convierte documentos a Markdown

+

Convierte tus archivos y guarda los resultados localmente en este equipo.

Solo en este equipo -
+ -

PDF, Word, PowerPoint, Excel, HTML o CSV · hasta 10 archivos de 100 MiB cada uno

+ -
+
+ +

Empieza con un documento

+

Suelta aquí hasta 10 archivos para convertirlos a Markdown y consultarlos desde este equipo.

+ + +

PDF, Word, PowerPoint, Excel, HTML o CSV · hasta 100 MiB por archivo

+
+ + + +