From 6cc11d5c4c7871833836358479b4c38572a01561 Mon Sep 17 00:00:00 2001 From: Joseph Milazzo Date: Mon, 25 Jan 2021 18:18:07 -0600 Subject: [PATCH 01/16] Tried SharpCompress but had 20x speed decrement. Not using. --- API.Tests/ParserTest.cs | 1 + API/Extensions/DirectoryInfoExtensions.cs | 1 - API/Services/CacheService.cs | 94 +++++++++++++++++++---- API/Services/ScannerService.cs | 1 - API/appsettings.Development.json | 6 +- 5 files changed, 85 insertions(+), 18 deletions(-) diff --git a/API.Tests/ParserTest.cs b/API.Tests/ParserTest.cs index 6cf1a64d1..55257853c 100644 --- a/API.Tests/ParserTest.cs +++ b/API.Tests/ParserTest.cs @@ -74,6 +74,7 @@ namespace API.Tests [InlineData("Ichinensei_ni_Nacchattara_v01_ch01_[Taruby]_v1.1.zip", "Ichinensei ni Nacchattara")] [InlineData("Chrno_Crusade_Dragon_Age_All_Stars[AS].zip", "")] [InlineData("Ichiban_Ushiro_no_Daimaou_v04_ch34_[VISCANS].zip", "Ichiban Ushiro no Daimaou")] + [InlineData("Rent a Girlfriend v01.cbr", "Rent a Girlfriend")] //[InlineData("[Tempus Edax Rerum] Epigraph of the Closed Curve - Chapter 6.zip", "Epigraph of the Closed Curve")] public void ParseSeriesTest(string filename, string expected) { diff --git a/API/Extensions/DirectoryInfoExtensions.cs b/API/Extensions/DirectoryInfoExtensions.cs index 60997b2ca..98480d6bc 100644 --- a/API/Extensions/DirectoryInfoExtensions.cs +++ b/API/Extensions/DirectoryInfoExtensions.cs @@ -52,7 +52,6 @@ namespace API.Extensions var newName = $"{file.Directory.Name}_{file.Name}"; var newPath = Path.Join(root.FullName, newName); file.MoveTo(newPath); - } } diff --git a/API/Services/CacheService.cs b/API/Services/CacheService.cs index 85774e128..8b8696bf9 100644 --- a/API/Services/CacheService.cs +++ b/API/Services/CacheService.cs @@ -1,4 +1,5 @@ using System; +using System.Diagnostics; using System.IO; using System.IO.Compression; using System.Linq; @@ -41,10 +42,10 @@ namespace API.Services return null; } Volume volume = await _unitOfWork.SeriesRepository.GetVolumeAsync(volumeId); + foreach (var file in volume.Files) { var extractPath = GetVolumeCachePath(volumeId, file); - ExtractArchive(file.FilePath, extractPath); } @@ -91,6 +92,74 @@ namespace API.Services _logger.LogInformation("Cache directory purged"); } + + // private void ExtractArchive(string archivePath, string extractPath, int expectedPages) + // { + // if (!File.Exists(archivePath) || !Parser.Parser.IsArchive(archivePath)) + // { + // _logger.LogError($"Archive {archivePath} could not be found."); + // } + // + // var extractDirectoryInfo = new DirectoryInfo(extractPath); + // + // // If the extraction and flattening aren't perfect, adding extra cases adds a serious amount of extra time. + // if (Directory.Exists(extractPath)) // && extractDirectoryInfo.EnumerateFiles().Count() >= expectedPages + // { + // _logger.LogDebug($"Archive {archivePath} has already been extracted. Returning existing folder."); + // return; + // } + // + // Stopwatch sw = Stopwatch.StartNew(); + // var needsFlattening = false; + // var options = new ExtractionOptions + // { + // ExtractFullPath = true, + // Overwrite = true + // }; + // + // using Stream stream = File.OpenRead(archivePath); + // using var reader = ReaderFactory.Open(stream); + // while (reader.MoveToNextEntry()) + // { + // if (!reader.Entry.IsDirectory) + // { + // try + // { + // reader.WriteEntryToDirectory(extractPath, options); + // } + // catch (Exception e) + // { + // _logger.LogError(e, "There was an issue with extracting image."); + // } + // } + // + // if (!needsFlattening) + // { + // needsFlattening = reader.Entry.IsDirectory; + // } + // } + // + // + // _logger.LogDebug($"Extracted archive to {extractPath} in {sw.ElapsedMilliseconds} milliseconds."); + // + // + // if (needsFlattening) + // { + // sw = Stopwatch.StartNew(); + // _logger.LogInformation("Extracted archive is nested in root folder, flattening..."); + // try + // { + // extractDirectoryInfo.Flatten(); + // } + // catch (Exception ex) + // { + // _logger.LogError(ex, "There was an issue extracting archive."); + // return; + // } + // _logger.LogInformation($"Flattened in {sw.ElapsedMilliseconds} milliseconds"); + // } + // } + /// /// Extracts an archive to a temp cache directory. Returns path to new directory. If temp cache directory already exists, /// will return that without performing an extraction. Returns empty string if there are any invalidations which would @@ -99,35 +168,34 @@ namespace API.Services /// A valid file to an archive file. /// Path to extract to /// - private string ExtractArchive(string archivePath, string extractPath) + private void ExtractArchive(string archivePath, string extractPath) { - // NOTE: This is used by Cache Service if (!File.Exists(archivePath) || !Parser.Parser.IsArchive(archivePath)) { _logger.LogError($"Archive {archivePath} could not be found."); - return ""; } if (Directory.Exists(extractPath)) { _logger.LogDebug($"Archive {archivePath} has already been extracted. Returning existing folder."); - return extractPath; } + Stopwatch sw = Stopwatch.StartNew(); using ZipArchive archive = ZipFile.OpenRead(archivePath); // TODO: Throw error if we couldn't extract var needsFlattening = archive.Entries.Count > 0 && !Path.HasExtension(archive.Entries.ElementAt(0).FullName); - if (!archive.HasFiles() && !needsFlattening) return ""; + if (!archive.HasFiles() && !needsFlattening) return; archive.ExtractToDirectory(extractPath); - _logger.LogDebug($"Extracting archive to {extractPath}"); + _logger.LogDebug($"[OLD] Extracted archive to {extractPath} in {sw.ElapsedMilliseconds} milliseconds."); - if (!needsFlattening) return extractPath; - - _logger.LogInformation("Extracted archive is nested in root folder, flattening..."); - new DirectoryInfo(extractPath).Flatten(); - - return extractPath; + if (needsFlattening) + { + sw = Stopwatch.StartNew(); + _logger.LogInformation("Extracted archive is nested in root folder, flattening..."); + new DirectoryInfo(extractPath).Flatten(); + _logger.LogInformation($"[OLD] Flattened in {sw.ElapsedMilliseconds} milliseconds"); + } } diff --git a/API/Services/ScannerService.cs b/API/Services/ScannerService.cs index 5d1366603..646640fcf 100644 --- a/API/Services/ScannerService.cs +++ b/API/Services/ScannerService.cs @@ -6,7 +6,6 @@ using System.Diagnostics; using System.IO; using System.IO.Compression; using System.Linq; -using System.Threading; using System.Threading.Tasks; using API.Entities; using API.Extensions; diff --git a/API/appsettings.Development.json b/API/appsettings.Development.json index 5c67bda6f..d2bf464c4 100644 --- a/API/appsettings.Development.json +++ b/API/appsettings.Development.json @@ -1,13 +1,13 @@ { "ConnectionStrings": { - "DefaultConnection": "Data source=kavita.db", + "DefaultConnection": "Data source=kavita.db" }, "TokenKey": "super secret unguessable key", "Logging": { "LogLevel": { "Default": "Debug", - "Microsoft": "Information", - "Microsoft.Hosting.Lifetime": "Information", + "Microsoft": "Error", + "Microsoft.Hosting.Lifetime": "Error", "Hangfire": "Information" }, "File": { From 165757d338cc22440fbd39e3104a7382878d02d7 Mon Sep 17 00:00:00 2001 From: Joseph Milazzo Date: Mon, 25 Jan 2021 18:18:24 -0600 Subject: [PATCH 02/16] Removed sharpcompress code. --- API/Services/CacheService.cs | 70 +----------------------------------- 1 file changed, 1 insertion(+), 69 deletions(-) diff --git a/API/Services/CacheService.cs b/API/Services/CacheService.cs index 8b8696bf9..0567329ef 100644 --- a/API/Services/CacheService.cs +++ b/API/Services/CacheService.cs @@ -91,75 +91,7 @@ namespace API.Services } _logger.LogInformation("Cache directory purged"); } - - - // private void ExtractArchive(string archivePath, string extractPath, int expectedPages) - // { - // if (!File.Exists(archivePath) || !Parser.Parser.IsArchive(archivePath)) - // { - // _logger.LogError($"Archive {archivePath} could not be found."); - // } - // - // var extractDirectoryInfo = new DirectoryInfo(extractPath); - // - // // If the extraction and flattening aren't perfect, adding extra cases adds a serious amount of extra time. - // if (Directory.Exists(extractPath)) // && extractDirectoryInfo.EnumerateFiles().Count() >= expectedPages - // { - // _logger.LogDebug($"Archive {archivePath} has already been extracted. Returning existing folder."); - // return; - // } - // - // Stopwatch sw = Stopwatch.StartNew(); - // var needsFlattening = false; - // var options = new ExtractionOptions - // { - // ExtractFullPath = true, - // Overwrite = true - // }; - // - // using Stream stream = File.OpenRead(archivePath); - // using var reader = ReaderFactory.Open(stream); - // while (reader.MoveToNextEntry()) - // { - // if (!reader.Entry.IsDirectory) - // { - // try - // { - // reader.WriteEntryToDirectory(extractPath, options); - // } - // catch (Exception e) - // { - // _logger.LogError(e, "There was an issue with extracting image."); - // } - // } - // - // if (!needsFlattening) - // { - // needsFlattening = reader.Entry.IsDirectory; - // } - // } - // - // - // _logger.LogDebug($"Extracted archive to {extractPath} in {sw.ElapsedMilliseconds} milliseconds."); - // - // - // if (needsFlattening) - // { - // sw = Stopwatch.StartNew(); - // _logger.LogInformation("Extracted archive is nested in root folder, flattening..."); - // try - // { - // extractDirectoryInfo.Flatten(); - // } - // catch (Exception ex) - // { - // _logger.LogError(ex, "There was an issue extracting archive."); - // return; - // } - // _logger.LogInformation($"Flattened in {sw.ElapsedMilliseconds} milliseconds"); - // } - // } - + /// /// Extracts an archive to a temp cache directory. Returns path to new directory. If temp cache directory already exists, /// will return that without performing an extraction. Returns empty string if there are any invalidations which would From c57b77f09298b0292d36e2feacc83f897a473a95 Mon Sep 17 00:00:00 2001 From: Joseph Milazzo Date: Mon, 25 Jan 2021 18:22:27 -0600 Subject: [PATCH 03/16] Cleanup and moved a test to proper place --- API.Tests/Services/ImageProviderTest.cs | 13 ++-------- API.Tests/Services/ScannerServiceTests.cs | 15 +++++++++-- API/Controllers/FallbackController.cs | 1 - API/Controllers/SettingsController.cs | 3 --- API/Data/Seed.cs | 31 ++++++++++++----------- 5 files changed, 31 insertions(+), 32 deletions(-) diff --git a/API.Tests/Services/ImageProviderTest.cs b/API.Tests/Services/ImageProviderTest.cs index 5636d39a4..485dc0a5e 100644 --- a/API.Tests/Services/ImageProviderTest.cs +++ b/API.Tests/Services/ImageProviderTest.cs @@ -3,18 +3,9 @@ using Xunit; namespace API.Tests.Services { + public class ImageProviderTest { - // [Theory] - // [InlineData("v10.cbz", "v10.expected.jpg")] - // [InlineData("v10 - with folder.cbz", "v10 - with folder.expected.jpg")] - // [InlineData("v10 - nested folder.cbz", "v10 - nested folder.expected.jpg")] - // public void GetCoverImageTest(string inputFile, string expectedOutputFile) - // { - // var testDirectory = Path.Join(Directory.GetCurrentDirectory(), "../../../Services/Test Data/ImageProvider"); - // var expectedBytes = File.ReadAllBytes(Path.Join(testDirectory, expectedOutputFile)); - // // TODO: Implement this with ScannerService - // //Assert.Equal(expectedBytes, ImageProvider.GetCoverImage(Path.Join(testDirectory, inputFile))); - // } + } } \ No newline at end of file diff --git a/API.Tests/Services/ScannerServiceTests.cs b/API.Tests/Services/ScannerServiceTests.cs index 79b487a36..78591b212 100644 --- a/API.Tests/Services/ScannerServiceTests.cs +++ b/API.Tests/Services/ScannerServiceTests.cs @@ -1,7 +1,9 @@ -using API.Interfaces; +using System.IO; +using API.Interfaces; using API.Services; using Microsoft.Extensions.Logging; using NSubstitute; +using Xunit; namespace API.Tests.Services { @@ -15,6 +17,15 @@ namespace API.Tests.Services _scannerService = new ScannerService(_unitOfWork, _logger); } - // TODO: Start adding tests for how scanner works so we can ensure fallbacks, etc work + [Theory] + [InlineData("v10.cbz", "v10.expected.jpg")] + [InlineData("v10 - with folder.cbz", "v10 - with folder.expected.jpg")] + [InlineData("v10 - nested folder.cbz", "v10 - nested folder.expected.jpg")] + public void GetCoverImageTest(string inputFile, string expectedOutputFile) + { + var testDirectory = Path.Join(Directory.GetCurrentDirectory(), "../../../Services/Test Data/ImageProvider"); + var expectedBytes = File.ReadAllBytes(Path.Join(testDirectory, expectedOutputFile)); + Assert.Equal(expectedBytes, _scannerService.GetCoverImage(Path.Join(testDirectory, inputFile))); + } } } \ No newline at end of file diff --git a/API/Controllers/FallbackController.cs b/API/Controllers/FallbackController.cs index 74ff82999..36b173745 100644 --- a/API/Controllers/FallbackController.cs +++ b/API/Controllers/FallbackController.cs @@ -1,5 +1,4 @@ using System.IO; -using API.Services; using Microsoft.AspNetCore.Mvc; namespace API.Controllers diff --git a/API/Controllers/SettingsController.cs b/API/Controllers/SettingsController.cs index 910b10f89..1b4cdd3af 100644 --- a/API/Controllers/SettingsController.cs +++ b/API/Controllers/SettingsController.cs @@ -3,12 +3,9 @@ using System.Linq; using System.Threading.Tasks; using API.Data; using API.DTOs; -using API.Entities; using API.Extensions; using API.Interfaces; -using API.Services; using AutoMapper; -using AutoMapper.QueryableExtensions; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; diff --git a/API/Data/Seed.cs b/API/Data/Seed.cs index 9ad42b61c..5071b9fa5 100644 --- a/API/Data/Seed.cs +++ b/API/Data/Seed.cs @@ -1,11 +1,11 @@ using System.Collections.Generic; -using System.IO; using System.Linq; using System.Threading.Tasks; using API.Constants; using API.Entities; using API.Services; using Microsoft.AspNetCore.Identity; +using Microsoft.EntityFrameworkCore; namespace API.Data { @@ -31,20 +31,21 @@ namespace API.Data public static async Task SeedSettings(DataContext context) { - // NOTE: This needs to check if settings already exists before inserting. - // IList defaultSettings = new List() - // { - // new ServerSetting() {Key = "CacheDirectory", Value = CacheService.CacheDirectory} - // }; - // - // await context.ServerSetting.AddRangeAsync(defaultSettings); - // await context.SaveChangesAsync(); - // await context.ServerSetting.AddAsync(new ServerSetting - // { - // CacheDirectory = CacheService.CacheDirectory - // }); - // - // await context.SaveChangesAsync(); + IList defaultSettings = new List() + { + new() {Key = "CacheDirectory", Value = CacheService.CacheDirectory} + }; + var settings = await context.ServerSetting.Select(s => s).ToListAsync(); + foreach (var defaultSetting in defaultSettings) + { + var existing = settings.SingleOrDefault(s => s.Key == defaultSetting.Key); + if (existing == null) + { + settings.Add(defaultSetting); + } + } + + await context.SaveChangesAsync(); } } } \ No newline at end of file From 07fd959b227c381365c947bf5be542c2d149c4b7 Mon Sep 17 00:00:00 2001 From: Joseph Milazzo Date: Tue, 26 Jan 2021 07:55:40 -0600 Subject: [PATCH 04/16] Fixed some errors being thrown when not needed on Cache.Ensure(). Added ability to send actual mangafile information on the volume() api so we can display to the user. --- API.Tests/ParserTest.cs | 6 ++++++ API.Tests/Services/ImageProviderTest.cs | 11 ----------- API/Comparators/StringLogicalComparer.cs | 8 ++++---- API/Controllers/SeriesController.cs | 7 +++++++ API/DTOs/MangaFileDto.cs | 13 +++++++++++++ API/DTOs/VolumeDto.cs | 3 +++ API/Helpers/AutoMapperProfiles.cs | 2 ++ API/Interfaces/ISeriesRepository.cs | 1 + API/Services/CacheService.cs | 7 ++++--- API/Services/ScannerService.cs | 14 ++++++++++++-- 10 files changed, 52 insertions(+), 20 deletions(-) delete mode 100644 API.Tests/Services/ImageProviderTest.cs create mode 100644 API/DTOs/MangaFileDto.cs diff --git a/API.Tests/ParserTest.cs b/API.Tests/ParserTest.cs index 55257853c..38d512077 100644 --- a/API.Tests/ParserTest.cs +++ b/API.Tests/ParserTest.cs @@ -33,6 +33,9 @@ namespace API.Tests [InlineData("Dorohedoro v01 (2010) (Digital) (LostNerevarine-Empire).cbz", "1")] [InlineData("Dorohedoro v11 (2013) (Digital) (LostNerevarine-Empire).cbz", "11")] [InlineData("Dorohedoro v12 (2013) (Digital) (LostNerevarine-Empire).cbz", "12")] + [InlineData("Yumekui_Merry_v01_c01[Bakayarou-Kuu].rar", "1")] + [InlineData("Yumekui-Merry_DKThias_Chapter11v2.zip", "0")] + public void ParseVolumeTest(string filename, string expected) { Assert.Equal(expected, ParseVolume(filename)); @@ -75,6 +78,7 @@ namespace API.Tests [InlineData("Chrno_Crusade_Dragon_Age_All_Stars[AS].zip", "")] [InlineData("Ichiban_Ushiro_no_Daimaou_v04_ch34_[VISCANS].zip", "Ichiban Ushiro no Daimaou")] [InlineData("Rent a Girlfriend v01.cbr", "Rent a Girlfriend")] + [InlineData("Yumekui_Merry_v01_c01[Bakayarou-Kuu].rar", "Yumekui Merry")] //[InlineData("[Tempus Edax Rerum] Epigraph of the Closed Curve - Chapter 6.zip", "Epigraph of the Closed Curve")] public void ParseSeriesTest(string filename, string expected) { @@ -103,6 +107,8 @@ namespace API.Tests [InlineData("Mujaki no Rakuen Vol12 ch76", "76")] [InlineData("Beelzebub_01_[Noodles].zip", "1")] [InlineData("Yumekui-Merry_DKThias_Chapter21.zip", "21")] + [InlineData("Yumekui_Merry_v01_c01[Bakayarou-Kuu].rar", "1")] + [InlineData("Yumekui-Merry_DKThias_Chapter11v2.zip", "11")] //[InlineData("[Tempus Edax Rerum] Epigraph of the Closed Curve - Chapter 6.zip", "6")] public void ParseChaptersTest(string filename, string expected) { diff --git a/API.Tests/Services/ImageProviderTest.cs b/API.Tests/Services/ImageProviderTest.cs deleted file mode 100644 index 485dc0a5e..000000000 --- a/API.Tests/Services/ImageProviderTest.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System.IO; -using Xunit; - -namespace API.Tests.Services -{ - - public class ImageProviderTest - { - - } -} \ No newline at end of file diff --git a/API/Comparators/StringLogicalComparer.cs b/API/Comparators/StringLogicalComparer.cs index f6a8c1249..fe930c45c 100644 --- a/API/Comparators/StringLogicalComparer.cs +++ b/API/Comparators/StringLogicalComparer.cs @@ -20,16 +20,16 @@ namespace API.Comparators if (string.IsNullOrEmpty(s2)) return -1; //WE style, special case - bool sp1 = Char.IsLetterOrDigit(s1, 0); - bool sp2 = Char.IsLetterOrDigit(s2, 0); + var sp1 = Char.IsLetterOrDigit(s1, 0); + var sp2 = Char.IsLetterOrDigit(s2, 0); if(sp1 && !sp2) return 1; if(!sp1 && sp2) return -1; int i1 = 0, i2 = 0; //current index while(true) { - bool c1 = Char.IsDigit(s1, i1); - bool c2 = Char.IsDigit(s2, i2); + var c1 = Char.IsDigit(s1, i1); + var c2 = Char.IsDigit(s2, i2); int r; // temp result if(!c1 && !c2) { diff --git a/API/Controllers/SeriesController.cs b/API/Controllers/SeriesController.cs index fcd945c7c..4649a2ece 100644 --- a/API/Controllers/SeriesController.cs +++ b/API/Controllers/SeriesController.cs @@ -61,6 +61,13 @@ namespace API.Controllers return Ok(await _unitOfWork.SeriesRepository.GetVolumeDtoAsync(volumeId, user.Id)); } + // [HttpGet("volume-files")] + // public async Task>> GetMangaFiles(int volumeId) + // { + // var user = await _unitOfWork.UserRepository.GetUserByUsernameAsync(User.GetUsername()); + // return Ok(await _unitOfWork.SeriesRepository.GetVolumeMangaFileDtos(volumeId)); + // } + [Authorize(Policy = "RequireAdminRole")] [HttpPost("scan")] public ActionResult Scan(int libraryId, int seriesId) diff --git a/API/DTOs/MangaFileDto.cs b/API/DTOs/MangaFileDto.cs new file mode 100644 index 000000000..8d6535aa6 --- /dev/null +++ b/API/DTOs/MangaFileDto.cs @@ -0,0 +1,13 @@ +using API.Entities; + +namespace API.DTOs +{ + public class MangaFileDto + { + public string FilePath { get; set; } + public int Chapter { get; set; } + public int NumberOfPages { get; set; } + public MangaFormat Format { get; set; } + + } +} \ No newline at end of file diff --git a/API/DTOs/VolumeDto.cs b/API/DTOs/VolumeDto.cs index a57465857..22266e710 100644 --- a/API/DTOs/VolumeDto.cs +++ b/API/DTOs/VolumeDto.cs @@ -1,4 +1,6 @@  +using System.Collections.Generic; + namespace API.DTOs { public class VolumeDto @@ -9,5 +11,6 @@ namespace API.DTOs public byte[] CoverImage { get; set; } public int Pages { get; set; } public int PagesRead { get; set; } + public ICollection Files { get; set; } } } \ No newline at end of file diff --git a/API/Helpers/AutoMapperProfiles.cs b/API/Helpers/AutoMapperProfiles.cs index b874d9949..8db743695 100644 --- a/API/Helpers/AutoMapperProfiles.cs +++ b/API/Helpers/AutoMapperProfiles.cs @@ -15,6 +15,8 @@ namespace API.Helpers CreateMap(); + CreateMap(); + CreateMap(); CreateMap() diff --git a/API/Interfaces/ISeriesRepository.cs b/API/Interfaces/ISeriesRepository.cs index db758b2e5..fedf5c10e 100644 --- a/API/Interfaces/ISeriesRepository.cs +++ b/API/Interfaces/ISeriesRepository.cs @@ -25,5 +25,6 @@ namespace API.Interfaces Task GetVolumeByIdAsync(int volumeId); Task GetSeriesByIdAsync(int seriesId); + //Task GetVolumeMangaFileDtos(int volumeId); } } \ No newline at end of file diff --git a/API/Services/CacheService.cs b/API/Services/CacheService.cs index 0567329ef..778310124 100644 --- a/API/Services/CacheService.cs +++ b/API/Services/CacheService.cs @@ -105,28 +105,29 @@ namespace API.Services if (!File.Exists(archivePath) || !Parser.Parser.IsArchive(archivePath)) { _logger.LogError($"Archive {archivePath} could not be found."); + return; } if (Directory.Exists(extractPath)) { _logger.LogDebug($"Archive {archivePath} has already been extracted. Returning existing folder."); + return; } Stopwatch sw = Stopwatch.StartNew(); using ZipArchive archive = ZipFile.OpenRead(archivePath); - // TODO: Throw error if we couldn't extract var needsFlattening = archive.Entries.Count > 0 && !Path.HasExtension(archive.Entries.ElementAt(0).FullName); if (!archive.HasFiles() && !needsFlattening) return; archive.ExtractToDirectory(extractPath); - _logger.LogDebug($"[OLD] Extracted archive to {extractPath} in {sw.ElapsedMilliseconds} milliseconds."); + _logger.LogDebug($"Extracted archive to {extractPath} in {sw.ElapsedMilliseconds} milliseconds."); if (needsFlattening) { sw = Stopwatch.StartNew(); _logger.LogInformation("Extracted archive is nested in root folder, flattening..."); new DirectoryInfo(extractPath).Flatten(); - _logger.LogInformation($"[OLD] Flattened in {sw.ElapsedMilliseconds} milliseconds"); + _logger.LogInformation($"Flattened in {sw.ElapsedMilliseconds} milliseconds"); } } diff --git a/API/Services/ScannerService.cs b/API/Services/ScannerService.cs index 646640fcf..b697d5880 100644 --- a/API/Services/ScannerService.cs +++ b/API/Services/ScannerService.cs @@ -324,9 +324,19 @@ namespace API.Services } _logger.LogDebug($"Getting Page numbers from {archivePath}"); + + try + { + using ZipArchive archive = ZipFile.OpenRead(archivePath); // ZIPFILE + return archive.Entries.Count(e => Parser.Parser.IsImage(e.FullName)); + } + catch (Exception ex) + { + _logger.LogError(ex, "There was an exception when reading archive stream."); + return 0; + } + - using ZipArchive archive = ZipFile.OpenRead(archivePath); // ZIPFILE - return archive.Entries.Count(e => Parser.Parser.IsImage(e.FullName)); } /// From 6b76c8b2114006628563da9dcf2c453c1265545f Mon Sep 17 00:00:00 2001 From: Joseph Milazzo Date: Tue, 26 Jan 2021 09:55:15 -0600 Subject: [PATCH 05/16] Refactored archive code into a service so that I can write tests for it. --- API.Tests/API.Tests.csproj | 2 +- API.Tests/ParserTest.cs | 1 + API.Tests/Services/ArchiveServiceTests.cs | 37 +++++++++ API.Tests/Services/ScannerServiceTests.cs | 6 +- .../Test Data/ArchiveService/LICENSE.md | 2 + .../file in folder in folder.zip | Bin 0 -> 123679 bytes .../ArchiveService/file in folder.zip | Bin 0 -> 123539 bytes .../ArchiveService/file in folder_alt.zip | Bin 0 -> 123535 bytes .../Test Data/ArchiveService/flat file.zip | Bin 0 -> 123403 bytes .../thumbnail.expected.jpg | Bin .../thumbnail.jpg | Bin .../v10 - nested folder.cbz | Bin .../v10 - nested folder.expected.jpg | Bin .../v10 - with folder.cbz | Bin .../v10 - with folder.expected.jpg | Bin .../{ImageProvider => ScannerService}/v10.cbz | Bin .../v10.expected.jpg | Bin API/Data/SeriesRepository.cs | 4 +- API/Interfaces/IArchiveService.cs | 10 +++ API/Parser/Parser.cs | 2 +- API/Services/ArchiveService.cs | 74 ++++++++++++++++++ API/Services/CacheService.cs | 57 ++++---------- 22 files changed, 146 insertions(+), 49 deletions(-) create mode 100644 API.Tests/Services/ArchiveServiceTests.cs create mode 100644 API.Tests/Services/Test Data/ArchiveService/LICENSE.md create mode 100644 API.Tests/Services/Test Data/ArchiveService/file in folder in folder.zip create mode 100644 API.Tests/Services/Test Data/ArchiveService/file in folder.zip create mode 100644 API.Tests/Services/Test Data/ArchiveService/file in folder_alt.zip create mode 100644 API.Tests/Services/Test Data/ArchiveService/flat file.zip rename API.Tests/Services/Test Data/{ImageProvider => ScannerService}/thumbnail.expected.jpg (100%) rename API.Tests/Services/Test Data/{ImageProvider => ScannerService}/thumbnail.jpg (100%) rename API.Tests/Services/Test Data/{ImageProvider => ScannerService}/v10 - nested folder.cbz (100%) rename API.Tests/Services/Test Data/{ImageProvider => ScannerService}/v10 - nested folder.expected.jpg (100%) rename API.Tests/Services/Test Data/{ImageProvider => ScannerService}/v10 - with folder.cbz (100%) rename API.Tests/Services/Test Data/{ImageProvider => ScannerService}/v10 - with folder.expected.jpg (100%) rename API.Tests/Services/Test Data/{ImageProvider => ScannerService}/v10.cbz (100%) rename API.Tests/Services/Test Data/{ImageProvider => ScannerService}/v10.expected.jpg (100%) create mode 100644 API/Interfaces/IArchiveService.cs create mode 100644 API/Services/ArchiveService.cs diff --git a/API.Tests/API.Tests.csproj b/API.Tests/API.Tests.csproj index b70443941..95af52570 100644 --- a/API.Tests/API.Tests.csproj +++ b/API.Tests/API.Tests.csproj @@ -25,7 +25,7 @@ - + diff --git a/API.Tests/ParserTest.cs b/API.Tests/ParserTest.cs index 38d512077..de1f77936 100644 --- a/API.Tests/ParserTest.cs +++ b/API.Tests/ParserTest.cs @@ -109,6 +109,7 @@ namespace API.Tests [InlineData("Yumekui-Merry_DKThias_Chapter21.zip", "21")] [InlineData("Yumekui_Merry_v01_c01[Bakayarou-Kuu].rar", "1")] [InlineData("Yumekui-Merry_DKThias_Chapter11v2.zip", "11")] + [InlineData("Beelzebub_53[KSH].zip", "53")] //[InlineData("[Tempus Edax Rerum] Epigraph of the Closed Curve - Chapter 6.zip", "6")] public void ParseChaptersTest(string filename, string expected) { diff --git a/API.Tests/Services/ArchiveServiceTests.cs b/API.Tests/Services/ArchiveServiceTests.cs new file mode 100644 index 000000000..25980fe1a --- /dev/null +++ b/API.Tests/Services/ArchiveServiceTests.cs @@ -0,0 +1,37 @@ +using System.IO; +using System.IO.Compression; +using API.Extensions; +using API.Interfaces; +using API.Services; +using Microsoft.Extensions.Logging; +using NSubstitute; +using Xunit; + +namespace API.Tests.Services +{ + public class ArchiveServiceTests + { + private readonly IArchiveService _archiveService; + private readonly ILogger _logger = Substitute.For>(); + + private readonly string _testDirectory = + Path.Join(Directory.GetCurrentDirectory(), "../../../Services/Test Data/ArchiveService"); + + public ArchiveServiceTests() + { + _archiveService = new ArchiveService(_logger); + } + + [Theory] + [InlineData("flat file.zip", false)] + [InlineData("file in folder in folder.zip", true)] + [InlineData("file in folder.zip", true)] + [InlineData("file in folder_alt.zip", true)] + public void ArchiveNeedsFlatteningTest(string archivePath, bool expected) + { + var file = Path.Join(_testDirectory, archivePath); + using ZipArchive archive = ZipFile.OpenRead(file); + Assert.Equal(expected, _archiveService.ArchiveNeedsFlattening(archive)); + } + } +} \ No newline at end of file diff --git a/API.Tests/Services/ScannerServiceTests.cs b/API.Tests/Services/ScannerServiceTests.cs index 78591b212..609caf94d 100644 --- a/API.Tests/Services/ScannerServiceTests.cs +++ b/API.Tests/Services/ScannerServiceTests.cs @@ -12,6 +12,7 @@ namespace API.Tests.Services private readonly ScannerService _scannerService; private readonly ILogger _logger = Substitute.For>(); private readonly IUnitOfWork _unitOfWork = Substitute.For(); + private readonly string _testDirectory = Path.Join(Directory.GetCurrentDirectory(), "../../../Services/Test Data/ScannerService"); public ScannerServiceTests() { _scannerService = new ScannerService(_unitOfWork, _logger); @@ -23,9 +24,8 @@ namespace API.Tests.Services [InlineData("v10 - nested folder.cbz", "v10 - nested folder.expected.jpg")] public void GetCoverImageTest(string inputFile, string expectedOutputFile) { - var testDirectory = Path.Join(Directory.GetCurrentDirectory(), "../../../Services/Test Data/ImageProvider"); - var expectedBytes = File.ReadAllBytes(Path.Join(testDirectory, expectedOutputFile)); - Assert.Equal(expectedBytes, _scannerService.GetCoverImage(Path.Join(testDirectory, inputFile))); + var expectedBytes = File.ReadAllBytes(Path.Join(_testDirectory, expectedOutputFile)); + Assert.Equal(expectedBytes, _scannerService.GetCoverImage(Path.Join(_testDirectory, inputFile))); } } } \ No newline at end of file diff --git a/API.Tests/Services/Test Data/ArchiveService/LICENSE.md b/API.Tests/Services/Test Data/ArchiveService/LICENSE.md new file mode 100644 index 000000000..580f5f351 --- /dev/null +++ b/API.Tests/Services/Test Data/ArchiveService/LICENSE.md @@ -0,0 +1,2 @@ +Files in this test are all royalty free and can be found here: +https://www.pexels.com/photo/snow-wood-light-art-6551949/ \ No newline at end of file diff --git a/API.Tests/Services/Test Data/ArchiveService/file in folder in folder.zip b/API.Tests/Services/Test Data/ArchiveService/file in folder in folder.zip new file mode 100644 index 0000000000000000000000000000000000000000..7598e0fa348a8a3dcbffaa335ec9f2f5e482b430 GIT binary patch literal 123679 zcmZ^pLzFNKte(fVZQHhO+qP}nwr$(?d}G_T``@;kE}BJ>lk?IQiea3>x_?pfTY z8{E-N-e2fo!`j{nB9}0Z?GE3^1z6wg|6S`O*|hZ<-(8gxnN7;WQ(>@tyCqyJ!7N>Hp&$Th)Zo z6eEzfm-Q#Uan3*WXZ3afb$E5rgA5YG9-e|G6VUx-A+Z%{(}`1_XQ z3kPt2isQ+5>OYS;2oNwv01)8u>p#Ef3kaYG1_S_0JXR-X_h*%b@_{LGA;ekZa9cb3oZj|LDJKyG0npU*q$ z@r!c=iuMQ&kB*Iv9v>8d@F6@X^%@29F+Fvk6^QnMcy@4njHr%+im1w>pv-*l@F*dV zFaF^VbzhDg5d3R`=!%XS3U&_x4vGqXBF`QGWZ6Pa0U!5$2aFoaLgQhq-FI|ID% zSJ^SB36yEVAT%a>NZ>ND=hwwC;s3p9IpCW^emfDSMfwMDDyrwL)RTh6QRydQXu#!b z(px*bT1pfUHI6@d*Y&1Ib5F^Y^V3BaJV-LPL)v$W58~YU2b2QOAz8N9SHC?aGTU!~ zb02JS%|c6U@OFyt(Hf2+9d}X1sSY@pCRLiX&C8Ly4wyt#s=>{WA;8!_-7okH4L@Ye zS8>-bp4m!D)NrQlH5__y*1Zs3~T5BU_`e&-eHSH@nzQ^B-F$6I;G#oi1y@F*aEl#eQzqG{W2)4}=Mmvf&v$(4T+2mexJRxw~3s zI^duE*|6A@ou{@JBR^3b2seb>6M7wsHbpMRYdJfVA ztafn_ktWQda0Dp{Mv=RjG%52Q$6E?}5L5UP#`$Xe`R^;*D}Kcw55H;Cy_{IYD>HCg zg$SHawj5M38Jxa;?@#0NlH-`4zjk|;mZ`(?prtk|Jg6>ZKxODb+)6o!IYooz0}6wn+>Zu$B{DO z*^4<6ffRB8nRGX@PMU|h@fLNdvMw2Ox1vEw24mmwzdxp|OZ6|4zVt40>LB&jsPI?E z+F8OnBAa6@BxrMYm~6pT{b+VM)>a;JcXNQ=kye)<+&er)a9hn{PsBW!PV@QrM@1TH zoZr2UNDYc8|vic6n_I@h*^RMzreDn zph*>$Ei|>|WJT2Q@oe(jyaZCQT5?JyQ5vTwG79Qzfu} zcY4$9yza#00G>n>=wH3b~+Vnf4-#=*SWMR2ThY8O~5Bf3% zsdfwrw|D*Scix)_O%g9-#CvrMz4k8`kAdo<5zRAJc$MY*i4Zi>r_cZp=3$Gq8uMl% z@84Jpd~-DR8QK|^$JACq-^l2Hq14lW-9yp4Z@4&p?%3Um8#slc-Sr`^P3|-uN(Q!O zE(b?z_pM3r``UmCK&^+M=k$<0SJbQR*Fx*_aV^PIbVS)4bi5Ini4TRtFn_nSFeXd%4Ve9yxhrVAyIB3LYliRI#9f5aZb!cFZqW{w zzuP9kO=qb~+&@`kxua}s_(BPaf};{@Qr zqm(+fx})~En0c`YKTWUg_naDQaX9^tr;kW^lv{4R+)FWrjC>!n<*sT>!Mnm1W^fO@ zaEi;=cBcC}i7R?h?J(Hu2vGzkCTWerr;uRn{skwWhLr-&CnV!;%hjzL+*N+~Ly4UJ zh17jqd8?H7n4;lQ+RAmyA|6RZ-T*YRgnI|I#vl{2zfC${N8jm6(`N;FrP&A4Y?3+} z8&0qyW1M{-{=^_*A#fzAj(9b^Cm4uy+biw-w$XLSuUv^axxB8 zvL9g>bLxLofpB1gN$C*L?Q<>fbe)4m(3P>Cy#K89SH{J!K1z;|6K-kJ6CcodQ*#;a zfuYvcpC*=)rxRb-gH0Qk!;Uj)3aRnm!d43>&3-bAY;T!gWsVNl2UV4y9+YIYoM<(2 zt_SC5H^hFnWt92am|ylSC;LF!yvr&A;)brbx$F$lBoMw(8B;omdSXJ2wz-*JqG&dJlfwzC_2fmu@o@ zE$3FyYk8U8V4t#@&5-wkk?RUY7hc-u!N#;UeQ5U%G3nMGs_0rXu;qIk+ehyVx8A3J z_cyU7Kr|i^U(M0fquIZN(N57-p85O%x>HuNiH5Y;o3ej{G~P5dSv9Sk>x3-s3$m(+ zOrRO&n|CaqRS&fsVgo5Bum6!*)Gg_Vg*Pu%ZjMHj>scuDj6uE)+9nXT0MjWn4fwo? zY>iHNOb;m$OH+A`lAk}r7kqPZ{~7hA_sKVFosjROvFxUvX~7upUScOaK$%(`Kg%N7j&-d2SDib^Qk2&KXnv9d4=Zs-N|Qe(HzPUsSL10! zQJxadRTzOpp8D#;wK&ybe9uMQhQu#0BckFyitmahWqQl1J+y8TY#>seEqD)nzqZ=h zF2+b|_dhBc4UN0V^NXsH9co_N+?@k_eZ24dA;ua=+PI|AJ}q<7E?GN;^4QgXQ2(?b zSHiY?t&FnQ|jc%LS&zYn>8(7wVZE$nZFT-$y+|| zUd$Mj#!nb?O0#}&%FC}|y^?IUnKagN~m|*jU{{jd>>8C?=E_( zzXCR|aryFLr=m||xwxP1BGZ-3ifH5#-_IH=+`PJgzOsuqJ0!ck*Q`nZuwBh3(-Y~a z?>;WWFp`YkD%+V|FD~0MK(kQuz>LoTB@c9VP0E$rieuj;Of%a1+7)syhA@mb25xNN z18mjTaYwQm+5FE-k<4n7*?@e#Ag=!xJsSP>voqW}@i(qE5|{Y=Qiu*|Ek z`-Ogp<*5~==0kJi>{5Ek5C*~a`xSA@_;eRqFfdwEElagS}r|Dwk4kbtA}dx|Xsj z)s5^%7GvXXiLsN#$GG*H*q1}c)y&+@<6Oem~PR3ka zT}utt*-oOyQoY3laFjp4rq~ji|+Q%yG8Jp-eW3 zY3G-L+uJRcw3BMfZE0(tH-btWl)Ay2Qm6F8yFiqXvNYGvy9q?nW~yXWwI~i};|t$C zb&+iV=y<65;FV++Z+RJjV$h)D3JiR3M=9OI3m6{<^$?0sbGZw3H|1Cdyp~6rydv>f@2|P=^c9nISGXGzoKOuB)PUt z3sp(>+Q&GytBf&`A$cvW!Na=`ARUgOVssHl50U z-9GujMz7L~T0)A(vRt!t<@J(XB#j2U5<8(z;V$47v{;zEx|Yp2q~h#R^wRehcgkf> zG7ZIP@v(P7Jmd3g_Y zUQHLh`2%FvX5p~OEwb44;Wia_Z#@AGW~vN8WSE4_P`y$;bmNRffliJ~l`0hr@5qa= z_Oz0nWuvF1T+$)^qJ_JKgU(E%{{0CqYUGha{0DSnMqovOmS!(am=SpWj4>MlBl}~1K zcgGZ=)dvLsWhJv?_F_isCDPc^8ZP3E#CpemwWG+x?y7Pr*pwJ5RY^zw3vR^0eE=(0 zcv%HZM-{JQy7bT4b(%8?$NDov9DS{xI?k4*Qvd#;TXP@~#L3U3hdw{5*TsoHCWVZ4 z(ZSSd?mU$K>gL1Lmgb4(?)m#uk=M=V&_^<{W?kiaB|luyhkM3A`cmt25kpFPJGt5D zF|9zl`5{C%c~EV@g2(@`@#~3Y=i{j7tt&;6S!s8(8Wdro103fa(Z_Xy>K@8J55^v^ zZBPx$44>KMrr^1TrgvBB_5Bjv%PT_B{h(8MuTQCSYr?jEREbhLWtBChTIUuaG}fkC z&fLD8d@;(;0&W(Yeb7wXjGxVg_C3yWKTgBC&u!aOEY04+@|#yhDx9W=8AGLN%WO{Z zoSquTjfI_636sqWyUA0(@5;O@%sck&A^c=WLwzcd&VO6xPObv3*_3ZA)vX| zMVDLIJxe#rNc*rn-Xb+qy%b@N8rj;>84_Bw&Ec=o|a6~#x(MbhnX zta3$a*{H@W3I~-7?v-4`KC70_YUo8lgUu)1I{Hem!wvH&P|RjJ2C`FcN3{(~2OFqF zHeSnWue22RlkpoRDGO2OBJA3K#eIdJ=6LNNFUoy%n;Jj-{_7Hoj+q0gEXrtPQS1A! z>G3yiwOQd%gQU?}h$&7_JvZq~rxWhSMfA{8BQ#-<(KUy=sizUe2mZj*`I++uN}5W` zZ3i4k?rr+>dLogd)wMDCi`Jn@g5tlb+qb~14Bb$ z{a684H(5z4$&;1JX4}QnW))H@GaYO&!C(xj|}{Qb$b7R&jUEZsCcQjn}~nWwePdjmA5jo(42Jr(QwF4oF8$!U(3KkR;N?r zDX|d=;R(`adRWgIL4vPJH1)-Ot4`}o(n4-q*em7E$yNEPC$|ngJ`T{Q2qy>+j*haG z6&2U_VCu4{_%K%JD@ky%yh7un7V)pt>7fEa2muuVrR-nCAK$FrDINIkEgh51_gxrQ zAX+RlBz2I|;2sdvN`HeXPF&h2;h4{Fejm~DSPJM_opLV3NpLm?J~!@lW(G`z}$ zoEeY5W|d0`S8g`{zL4luhGt(mefRIrJa7b^z9u z_@aREbDqx7m1RH=BHvIp>NnjIg6>?F8I*bzOZK()K4(8dXaLEMS=+Dpje(&$R;-n+ z)og16zJ>8{WcSnNP2W-bV((gSsCo}%uQZ?bV&X~kyu$3&Tm1{uL>V~a9L{@zQ}_0S zTR{uFj?2zKAn|3amQK{cD7&n+m_tY7f{wyKIuosF#VU=>D+ z7DCXRX-r9kuKdl=SbW=z8I&+VCNS>rq|TCAO)}X-ESTD5JR2IF$@0%RK-j`feq!LJ zu|k=!IhY9UsZN`;u2C36$Ey??p$R`J2BU&ka?J8duA6sG*`w>9)^55hS5Qlw{YFj< z`6F!r+d{^>H`UiiuP%dWlfK}_3d6Dp<&Vb}?_l1;bGo@p2NstgMszy;YEIBxU0B5#rIeqo=iW3pdj z)j&w~8_IQ)s1+AeNLR0`R(V{6S+Q z3MjAy(mYtE!(|M(n)V3`PDwHizI!c+mNm>@EAtl*Zpx0HUzVeQyr{GGZ z0~?Xnb=t^h){v@NWBOm1r-&3e^{#$fYjG@i27%Q}Yti!g9az1#Un`!tDKIyreu9Zo zO81d+1AQ#CY>z6(AAJt5VGTWFC1-_-uFXMbLEcZhtf4Qaoj`Av%Z03Y0S=wQ6-p!B z^ui%)xzTD#c~|xn!W%;=ufXkCp?cJk>TNhx+CEDjpxN0&fVAG<^fvkW1@bFwguO5+6i>Mv=&)8S zW^TQiR0V29jQUmeuXP0#kxAj2{!G}e1E!e^QctL!MzOUk5gfd4XYHT_ftXg^jZR)M zV8&Q9^g9w?DO>yjm2A6%TVcmg<~#ABM`6Nkw?be@rJa61AZ+1tl)b_qQ~w>$1_Bj` zN20Xw-GpTN^^=Q)Ec3yfTP5Ygqgtq<;xf+B#crsn0Dl$HM~k8wAQswW$aimLIyuSB zg-%4arAKF-4Y%-ZiIVwxfxUOJ=D~(vJSMyoC`Z3_P5YGnt-86{jbJnHT=0E!{4L6R zLv~dZ#dsQ)EvWXl5-yVu*veU0@=k6MRsH&OXwKsgOGM*R@?Ye3e&k*nP?oA847cS= zz`ZKql>NA_Y@?KG5hHG{Fq;zdtnrNyD>>I-SUeVha#vPt>Fr&zj)&WDQ6z!2`oxqu zptuU4T9g29^_HGa;6XqSTA|z>3#;`RdLZZA_(Zi$X-a%cT0zo`&onw{%)k-aQ7c!_ zdRHU5FQfRI)p;-WE4PW|Pd(k}Jc{1_`CZC*pGridq2_dX`b@Fth9QR{6GF!9Q$&^t z)>i^gIr_KMQC~PSuJyc2(nhJbx1CQEpZS^8(wtKx@ha{UxBwnLD43M zG4lCt%u+nXK_{x015bxWC|}Qbua3Dto!M%|ju8BWYQK!~4;pt87;@}aLkST{V&X!AXvh?dp;QXR34dUj%Cbw=OqiFYM*S?rAn(VF?SA^XE{TX;^Qa!6U2DD&8?Bl+k8g8 z-qS6oEN-yhDCSY1ORrp_yoNm(u%9e)MX1-ExC zQcD%{j6CzWOMv*FMNhbwN&D!Gp-rB`Jok=~R4S7)mkKj=bdV|*=ae?(*Ksk;SHQ@N zo>RHoQH$<&l-0k*b(wbTywR`}fSVAGFQzCk#pcPvfNTA`xTaYzm>UCeQZKHmDBg6e z%<^zdr;;CZ+>3{K7$COSLpx)PmKy|$E>cO!JR-Fa8jLOR4el{i4;9g;N5PcW*L6?u z#mVH0HJR6`)X2MV_=>ynVYP`JNB;O_JPXFQZqDyFooNvxE;luY`7ucrnPEb`?b4mi zn0!@S3N6aC=owun?3omS6iG+=JB*%5I;v@ihP4!9DnwbSYzTYO>z*_7%?3mHjqKl1 zT?18ELhjYejUzE z8ogW`tHyTxwra^6@%={eE^!j~Y^d+FgVutT`WtiNuDYrrCG>EqO5=iuP30SsNsj~# zT86E+PEyQAe%{2zGRclY&8kyPtqd)`GDo2M${YI_j&s>g?NzTItWq{_`54kJIHua|J4yKwpPEG5Rhs^b%+@9? z8@6Kc>l4A+Tzdg^**_bz;cX)4X#fs(JB%odxdA$Gf9Ex5cz5QJIm(fZC(Fx;p~6oT zL3EpWW(WsKaTo2IBQNpx z7(lAQdk!sBp*9!gvGstR-Y&EE7C5{MTLa94pEw=Ax?}0EL8i4OV_S@g6J?niEngfL zS+$Y3{?l>4QN4^st1>C$oumvZw*2FkOKS&+4+5trnSOO%ns@K=D+{sH4UV7Z-1td> zB{B8e@buV4&iL(<`YB4dT=&%zpTmeRicmiF51lQ3hM_qV;;0?n2Kc(_{4%V%)N%}0 zTYd%yW#5O8zU7R9SKhX<3C#{XJa_BfVtLk$^9lBGuAylr^$rZ5c+G2gRi!@BuLgx+ zQqDqA)54|&R$*D~!t{q6BSgw`PP3iJsgK%h1WUIeulSVS3niEbmeQ5}QvpQ`%rfK+IQuE+fhJ zLYfcI?lcn1Di%PxMRHj0PU9d<3Jj3BzI;^mcDH_;I)9dgN%SRG>R?LF%S-mo3HQ3# zg>hE#0d}{IG~Qc(%-as@7&Dhjp-ho)ZzSd+XG=z) zwU79u96LR&9Bjx}TuyyiB#JS{n|&IwOUk@6c!xDFb7Zx}o7BrjEcG~@PCrqOAMw4WWhDiY zJXT4c2Wy%B4mFpw=|Lxp?>v(RA2G3O`-+Ugj>{|OF{9~6L|&|3`D~a5Bd~wjDGjl%vg$D-lt9vo2lfrnb4^>Lq;*xObrBsRu~%( z3(^CH_F#@w?IxXWn~LY4Pf!?EpD_0q|M%+}%4WJ%CHWW7kR{g?cBgM$xzEk61bBlMsU9&5fV1Vyl%-WlZtWVE zwj2UQDA5$!_-4(g{%Hbil%yYhx=EDa-WHSS^xOHVCBs~6UG6pR^#X!eaG`G#V9vEG zL;PJU>#NtbdeqCaiUQfw%Y6Qx~|45u4N80#S#Gs~e`2gu}sQSX#0?0`xW- zuyUf77WBNU`DL^QHZ>~SVL(<9$Uu2d{jiHWyp|F((H7|*@9=0f8nGgG>#c!nA9H>G z<%Cvu#-j}6(Aqqq+Fybt;_IZ7Kh} zrS%scJ=={FXYG~}#IYfZ=eO*Iw$P$wk!XAdi9Ui@fG2qXprFx^sw}pRDYr&sB4+1| z3K&<@(9c=h7PPC87K4@*3lOC1BF^@|Y18V8=1vR`^ACnk~^)+dw0<<08JGyqux;FU1e@?Q#0HKU-rnG}_8CX`wB75}Q* zUN)CiK0mtGkp3hYyy7*FS-%!`h{i-=I#* zJdx@x&w6_?utbc#A~c&DXMjn=soiQ)opvR!`&pGdhL1U^YubX^-KAZ2wwrkCl7QY^yPc&g zHNdRryoAYes_ z_$-=j^Ug><8Fy}%to3*!Q;tbr z3;$CN*3Ka?Cu?Q8lq=8-5Sfd@%4eN6O2C80ui;L&k2xMVQP(c*Usjm238wz5Z}Q=j zwdb;dLA_3RCz@PYGT+gsGpbO%(U>IV7pKeH+rCGp@-R}( zcmg9>Goq|GFS0RKuzh_RVfozMJ=nZ?PJg!Xag!6A5=&F76M5Cr@7>A6^!t8RN#)aZ z&mgOec8MWOb?~SD$H~%&Q9a9~!{+qUR=T#ecX*s|ZpmAOpZ}-p`z7*msFc0qj{M8H z1ITz6%8 za&%RTU)?BXrek_Y2$DNZ_Z=!f9hSW{S~~|*9U2eSPT#T4Du}{{dMl4V^Sj6>0E9_C zc6K;Ac-BQp<}9C)yeWlgv8B}ea7xY%0`-AV{O^O~4oGu|5h0Q7;{Ya6t(dHP1)IYv z>_=7+D7gLi1Kl5B0AKF=DesPY9B@tO*6K)Y%h^>4r3>|T-cnF7$6{TfR;LA`ve&&7 z@u8j+#FmmFU_hc8xU7rmX4A`m#ixMN)~-4&z(Ns%ENA3pn^VQ0FM4w%xY)7;@=1$9Eji+V*8;KL@cLiLGku2uEb!32Ub$+eRiq|+_ zwp5<-ln&;I_s9#k`&)OjnT!zm<)NCfjq$&kO@w%F@E=`9?;pP8DX-Qh)8pAUw~fu& z#UN0iqUO7Pv7F4sFJUJbvR&CJLv1wni)(l>wu{|o&fn*XeO|~ldqL-nR_?=8RG%?M zwuPn{pg3s?24JipeOPTt2a2#^EffAnU_5NHX4idHF)p(?n@Dc4d2t0aZ__cZorrcb zxweg2!*r~ixhp+Y)Omxyj8?A=*hMIn0@8)PLN)x77Z_dr0P8N*r3=Qi7W(x~*U{$L z$fF+sVbl!f4C8aXi(>vSlt6yh=ACup8aE4exNQxFIHC_2M*Nqh2t~wQDB`tj4XUcZ zW@>;Eh;PS8|E=uk9o_2hGnKFpC%yTxEXw98`a2EN7|%(Eb(ytevhZ>fCeT9T>E@T1 z=V0ilj*?6Q#9p|}FRMN`)VS%rh<1<#^h1aQcWsD`jMmYkSdM9AgV0iv$}yh<;m;@o zrHn6pgrkibS zhl8PCt6HO{IWLyPa=N(VO109$n3c)^#l!A^i&kB*8BK(f;zAbBY4d6=<-I3%T=uJ% zpo8^t2lAKPv`~clX5-j773E&|WaCCnK;UtluK{@_L?)AwbD!_9YH-RXM)+c~Vgv3w zNZT`Ch4Y`bVT$4)BZ@Y6L)u6|AYqm?_|!5E0}A~+aw+-n$f0&^=WSk9*M8`56&l-) zwbctU(Dew25K;38Kac0LZ#pG4hZFuQ#OZj@*>@ic`F}Jia-6ic`56Mbxu)JxI*=DZL#856Fkj?7x*`pT;;h@v0U?6s+>A(6={TI}1qs z{cSe6w(eDWkQ~fzM2gNi?(@wLt&2VxyQOw@Ru&B_IvoJ*g==K2#;wJgtpI{6ObACT zDB!R{FCwmW3<9 zu}g3&!2Aj+(C6b;GN3UXRG`80FfC%X-)^OJA?spGfc5!yV=)!wv6qFM>nz60Ud?L#e#x2&{Fn~xhR4f(KI%i+TGK?jeXww_-m8C357F;D z8I{-Bccde=&nPF6X(a}+X*mh=z?NncxSC3jm4%HFn|h@LR`fAZZSIlJqJy07RKr59 zE9XHtw*zG>aLibVolFGbTA@1+RhRPlLRn79BJYf4Ox5`F{Zn${o%PNn2?*TsMzZ@~ zxNm+s2cWUMWNKOJn;ix4_RHN8op4k@9^a_3=;ayy@jnX%tdWI{ubs{YCtm|jf{~-1ZSLJ$65cs?H@7w) z^NmTYr#AD=HJ+${gOc@)6fd%xF!;s2fkz?|B{ziy>LD1iC!>BIHUG+$%xHbF^bxY> z)2ZNC$_GnH{epnW6`q!=BxxLz-PPt~H+UnM#8h^SNK94pp`;$g z?5rJYt-zTLdezuTWv@ZpfPnFla<(jR@*5@lDRA??(ecc0G-i+qx++RIV7Ho5d88^Z zr~<~O8&t*;yZhoACHEU46yG8lP-{H;ThUo9t}m#=bBl7D+k`gKoa%pJ2UaiR^U1P{ zMFSMX&%?o$-92Hr)gKaVko?0XoDvl3gvTr29*zjLXJ&wq8tgglWg($uyf_M@p$|jD z(R@deX?p6AebqER{H$377tUqyGpnsOM72*JMSp>ehqxQlD@J73W|EcPfz8{s^h4yB36b|m(j6jR9V4KLbXS(_lzvT$+mZTcKC8U4vHvxa6D$$^Ce8R}p2^b|I zBylt-1few2sPb0n2^Em<)x_c;@71(wn4)=l5-(!1uR=BDU(3n?r@$sl?KhVR&9?Lq zrsOW-vJvJ>RSLHhBogNNu(R!~nE?UHk-;mYWz}d{s*%7xMre^NOZbjmvLH@_C)hJ* z;f_c%E@3cL3gY!w!jP{k(t%Z~*Y#D99~-=~hItO4QcJPb!|U%{+VjzrTIN%1p1PbY z978c63i?QlO(K1;tzcNinkg6>Na_*G%f3vdFz7!>3^j>h5g~-xgCH0Ji8}D$Df-FH zTF(CGTlP~jFv;-1_EO#Vhvi9f>xzx~H=vWE{7{jhu}o(_JbI-$2ml;+HXo^>FV5HF zVZu^oveb9TWRSHApD7bBsiD=j9Kg5~yKE}t^bo%X9*`sA7?Wa@p#lNZkGM_~XaheR zZl7xm#i>Hw@9&@pe1$%xpg;s_99+GF!_gy%AAR2%M0q0 z{nBf0K%t+Sm6OI0Bse)>4FEKatju7@Ht7*~1!H*n764qBWUrMjLb@c0FS;L<<|x*x zDeL?EBppN27C|12Cp>9*+iJa{he6q@;rxZ}{)%L*)}?wW?}E-aX}ff`BI4L(ivWQk z&W$o8dMPtI!4C5=Nq$5VK9QlaVg@W_VzBAC8ino81kN)y5;5s&(F%o!WZ`lgO{Q6o zrMdC?4UB-9Eg-TfDr;JYa>KHUt0?8nt$#z@=-$bX6b&>h^O@Wp_z`npc&?Q&2_yNR z#J>~(A~#JO4ufE`U3pR*-9-6v%?n5(v zo`Ty6ZA@#XM0YT+{kY5YX&XNfUwiWu4b$$YUO&oYO!nMiwQ+hi@6zsVVtA6;27emLAO7M6ayHU?C%5? z_#ehe?NPWx8=@Hp278JgHPUdW(nbx}6VqR)Jj$Y3XvElIqk;V?Ts2}A!cVTQ`bFIp zCUz;Pd#tc(D{_V=EHAdMP!g^AJ>!MR5`zVFqO6xDWm!S3K;BpWwHe9ZY_h;DJWi zYA{w`hpfh-p)Jo!9rMxi7Qica(GR@A0P|&O7@%5WdZM&g)8>1hUoLWaYUM$E{+0HW zDaXOOnS}0OcP~D?-7JbbCl8Lde9z~<s}T+`P)=;Q*ysF-v=#GzS6>((KN24KNCj>*X! zCm|s{fTuVG6k85avOd;bjv*uBW%g1!z&k+tl3b-I70V?8_8T*Z>hj2bk@@ZKk{~uu zh|7Gc#W5DUcCRmTQDy`SwfADA#wYYhqmf>LF~T2L>fF4tfA_Vd)~Ck^p10(eA7^3wsw*$dTXygtD@a&{ZQ(h&UH*hAnz6~H2xFlaS+6N5@DR=ukdHo z|ENCCcIOa&`}G5aNMhyW%In^=JZjINr!K~q7o^Ep>%m#&{;ZY|;}QmL8M437lx8`r zwc5T0Gsf?CQKA1vpkoYn4r9|%>aVDxR~qgDM2t zt8#MM%LC#8_YW&&4!V!?s-C%qFZ-q%Vv2UTyXs{p6VBjIHtR#7OO~=}-$Z0(&;Dw#ZEf>}Gsmzq6FMqb!YGrSgUSyoS z;%L{o0oE&M5GjRnhZKVakP0+yO^e;_3T#)dlboxHWLIN{XlOc9(yCDc++m|1CK0iu zx1P%K(!8_1n=Pxek_e4Mm=t|n?OvR1!9dgj92px9XJ76>w_281?g|aUdpml$o}%dC z)uPw0_)7K{xc66rN}HI}`cU{2k$PB)cB#zObuTDbx{etW^8%W#ODyU-lZGvwK9Gm> z_=cOAS-XN}U&(lN8*?cXkn5Jz9OTef&Vjf_Sy}()Xzw!ip3#jY>7Ua2y-=BriCO2Og!CdI+nLNVUw0IxDtTny2O^dPjD*E!W)i^B zjYBgU7gF)t~--K^ITXbHvwiu|W-BCay& zhGtB#8GD8e$?L%XBjR7v|KnpEZY$l8*8UlA(oFKqt)G3`Ay@Pmq*({42*E4qtb=(+bs^;D8-k4g62>+>E&`nuV8GqGk_lmCn~(n^IA;E@1r z2S{(zfGDxN#Dew1ZxKIxr-%fMR$50VZcOe=u`^Z=5^r&6IMii@vyCszz!upTtnnp!+?8L==ga%<;sSS@+ZyPB7>j(S_a%&ITpZ^(|y zXC_MYDu@e}Qy-&?X4i&iOR>DCyEkF|ky7$q*nBZ%C3U=Oe~r7l_fgl+ZB2uinXZ!l0UQTA2`2KFkH@Fi@AO8u& zs{a;${9{t)`*N85pNfE7yt#4*T;c5Q(DC=XjItpcMHBdrk8@N2=wGBsg)GI}F}%*m z*+c-D8l!WT#8o*EVN42S^{eC;yIZj6mQFpZX5-_e>&EetcKwxTqR?Q8|F)d(+`o#m z+eEY0-s2r1VD+7==Wnd)CwcowbHQBw_ijB8%r!!V;}<@YjYzl3Ow>dRYf1 ztdfW0y|$nbJ=@EqTD?oek2#!6b}Y4oRY2S-T~32VgV?}HEks8e^Y$BIi5D{ zYaldO!y8GMQXO|w7D&zbql9Xyq(KHt2|sBVM9P?-UjB zq&L_{P-2aw(V@RX6sy*YcXW5|e|1i%7@y_bh#-yxB~F`@y0Tc!q@LUJfMxQ5T{vq= zNjLTm^*}4}*8R{5-a_7D)h+(@;_s&yyj%Zl=u|O>)ht)}` zvHMoSu*Y-q1a(1?enzZuR7pk~n1>tU(%wDRHA}h9OE;_;4p8`Kzm(=s`RlGQE+E3} z`g(NNs0Aq!-pNjBg9r;HXpMw>a!xDQ$)05`(H16ToOLL=fXL>gz9VgOEstq^xXHT4 z=g;z2#k;A=72&flv)RNOVHkPC;WT2;@OP~?lQNqVE|C3Z9WtgX@Pwkk8z6`jG#t(< zSUQ#~&3Z3BLS%lcXEBEDTD8)-C7-m^MhoUQOl&_XnlF)#GOWj1s1l($?anVjbC{eN z$@J^t$A5TuGq{krInU58`7NdeB3<>DT=H4a64@37Qp%~}+#h-@7 z^IB3BYMb`1GvuEa#y={@l#`S58Q`}5$VqMl8+W;?1+Yz3yt;_llHf zl}fi($&L((h)$FI0w5N}MC|V@_Toa<6X*zHx z=|x-20o=~-=&jm}Qi~X@5}@Z74Tjo3a08s{xr*l}dk%bw>UUf#7OEMZur2Dc+1Ok^ z^gPfAvBRh*^nJT6Tf6#0X<8m4Dl|aIhQB7Xh#?zW9n+Z<->55xr1QK+?F%tyq`!o+ zAhiH$VoIcxXnh}#0ljEO`F(GCFO+lxYhm(wIYfJ@s~@dFpOEmiq$^APHzq6`m;P~o z?}=i!vUO7K?J3M+l@dUBJ#d07kTKUp8Rf%s%uSxm;*eTzhP!=Jw+w4D=9)w@u4;)z#|@D)y19X}5xgOAh{x7x~+ipT^FblV2xUaMwCiIXXF8P68gk5q;gyuQ;up zoycg@G)0{M=q*pbNp4fN-;M6{_Ni+&X`|@*OJLU@?!KIKipkzu&iR)TwOI@+fpgQSo@eW=CZS-G&9<+ zwK5|%#Xj_iN>P)WNjHXz4ziFi43exW``(A&ov`r~okKF9H2KwJ?9O}jRcbX`dHdIP z@tIfg;pZn4KZxbLjm|QUzN}2QSxkhMnEqTfHrX00)ukc+iHI+BzxLODrxY20wk{`Q z=yQceCzRIgrf@7K*a^u_T;Caw5O>5^>FFWz2sN(MWKyjhh}8F&qU~v|oHoGY0HS>- z8}nW+wN~HgQa~w=j|_=Se$YEmu?UdK5#voku??J&7A_ViEzfIak%t)Wr`yR8%osN_ zvp_fg@Fo*v<^a$4R0{p<@#CWoMgUtFEpMVwZdG zqbNDPia@c*@=iQhfDRUCW->%*ZW0F(pc{9O&+AX+{P^*W1g3IAx>#_7*&B<@F2@D4 zUy1^k`XV8DWc3r#<2MiQf1h`@TB{6oclQrI{NHOJ@Et6J(d}k6gQ*3~FNZ*+valic zVN3A^kYz3i7wl#j|ohof|n4nZ=M}SooiR#gw9dX zyA;V%qm~ABT2;&&MnBiK%*V?$Y0-ZUupMUj?)NjenIve%b7|!gnq<)RgA`8UhnC`* z7|g;Qds2*otm@~oC297|f8Xb&xrP zF21FIX%6HL0oOf634c^6`n6EM&Ev_2ilV?~>xlQ}Z40Ox#h8Dq_M+v+i^q=8;R$(} zoKG3zn!5z!5xG`8gDF)9Nd}C;Ov%jLOv%k89^?X}%g9uQfD{>B`g764>pjrQS;i?G zyKSu*4KlBCI+{(c6e!}R>S4wUH$uW8GE<#`tP_1beSL^*nQ|peT8p9@xv`sbx*Q~^ zncPmCnOrV|Xi06!|IV{BELjeqpT1Fpk0sY4R&A*je#R z8St@VpsK32NVc*`oS7K}oEImz51Uj0GngQaF3A?(?B=F~EtaKF|LP+LYdNUFHJbmV z-Fsozvyt9vn#5dj>BiPJgVjwswVd3?$ER%Zn!sA^<3m3&Qw{!f14vN-sQ>l-H~;|3 zBh<%F(Effq&coL`{qKRr?h~EuR1C+>m$6H;+5VsN;7Zzghb2Y9V&${~`1SvsekpXd ze7CuzfE|{wo5DN#jOSnHp9bvyrc!*brhv`-IfK(an=RMM=3iC6?x>#clxR5*$Gzvz z{#0k0?qcck?QacQbk>CrRra`*3lvvIrG!j0)N{9C`Qtyg3A@i+{Q(q?OOzQiGpp`Y zY01L!3)TNsNhPrF^9L|)$$UUemrzppmfU5Py|iTZpGr!*dy%FRMaXx$JXbl?*m#+S z`PqLO#KH@h9#?8T&1R-hA$?PV!98DR`p-S&SDyEobBkw^=rU?*z}#eZHS_j*3I2a7 zw|Ym;8Y6TRo?&2=*ht~;@RHdru>6C_SG{^xr!9H>`B_{^O3!9;u@JY#>wo$|-sHJl zQCz{K)C8G0O&L@Rm{dhc3T7c5CG8idu>9k~<`%r246ysEg zJ?Xg2Fcrp9T=m9%KuaB`qA~xWj_cbG!4;Xh)@#~yD-(D5Pn%PddYjx{d-)I3(mm=q zv+3of4s(%uGue00j5?B9(CffGR*;0O#FT#uYmDC`7>kzlcp+C(VjGgaYpdUcs@-;O zi0shgr?C^8*QN*j8=;fmc8j5>R$(^Gz!}K{BrvC_pxp@GTsiMxE*o0GQ`H4?n7XcZ z_yjwx?IrSFK&Q&Fz-_eJPP?~h=;VN_e1qrkgw+rAkclzKN5CWE4N6A;_+24>(1M_3 zfl7&O?Wbl-)h>7Gy-7m=9=)=K{?o!WuNhww+sqgF&!%{kI;RMDX)qKO(!Kx~@ppqK ze%-w!nl9ZP(XF7w5XPp2236c$t>9U9uIeZP~+k8+%GA@&Cw}A z(+*W);!;wSITfmWIWhmx#7=Rd>cZ1+^92~XV+z5kc1~dgO-bh+v`fF*Y)cE%Y-$S% zFbZac=}?>GS!_ndV#_v|$A(|ZuJl~`P?Me7o=xhu<4RXF(znr%Dcq7wYB;dgVgU?H_D zD*03W4ckVBD+#VIg>odFF>1=n^VK^nxar%CU*y(uD#>=+?I*X}qwJzwMcZdPz*>aY% zM9#Co`)BI63(lp_64m5LwxHS5DPKz1MH4|06Y{)WY@J72?UkECZPvMIe#)I6nhQ8j zzeh#VJayrF279MbFp~s^%zQdGU_aQuc9@AvW1!$S#(MTaezI;MCNK1@t=CQxrs}=> zp0L5(4nN<;hHd;4HDCy8?1XKdtcvPrErGT6Ua)1N2*-s#2vNSjZ5Gw)5&9` z&T#R^T&)=Qo!@9EQaCS-Be}l%SE2f@GFiiH4~rVwE1U>n{Acg(KEu^y)5l~PGsyjzQ-Sh13yUs(aDVH zseos~BE|FegCsk0DJ&_ozk_ENh%q1Y7sMIvbl2U>?%q`c~4Q`gIX?4&Yh@=;v&8Ohx)zd9K~ zw#;v1y#8pG=bJJonMEOcx8+!nRQKHr_Pw#?;jaqi1J(%wP?}j5EHNa5`^9Usx~^AHYujx5Bc@YB znJ0)16MmDm^;=usDzMMRk%4&xsu(HVF@b$Rgd)!7BtAcQ%LCy z2G-Hz=9N5Ut9Z4qD7)bdT@yUHf-rzwLg#ysg=$<|VOnW)vV2iW@J^Mrmg@INz9+`aSSopu0Hv-W zhJ|z6&C|0z@hy6OVluU7lU0wI-`B#h)d`{!)e5u^a$Syw)^^9khNa}I*tz3a*=mYZ zU`_TqrB&nchLS*({NYvsOYyB26E-h--553B8{+gUUl)E#i$6OyU)w;&33LlF|t4D*8wsJWtxfGkT*S~x- z_hDit{V1Zif4^^-tbqq=xtGXRK_smxDWA<4?r0Gaq-jx8)Si*Wld7D)I>l+k!Cl5= zT2}vwE{-llNyS=RAA_IgaD+BX54reL<3SlzkmAPpDaDmhPAPe*oKaxmEF8YEEi_K*A`v8iZUa+~%>jm%q=rASVCjFONorOJZJaDMLmOl6)~FefgA?jzuJ3Qua7t2*)N__=e1*7jUk zZK6W(ONP(lacI<_@{cdfU+R2_dhPr8N+B|JkdH!z*yxccE*dpfaoEQ~f$8t7gJl=N z;E8;;+Th)y4}azLzYf6vH+hZvZ+VS6H?!;KF63#PbVuY?3#JQwIQdleTv)-|afHH) zw^RiTqWgQ{()OhfrLU)XRLhZiKbTJX?}hUxNZuGQZzTV<;=7{)GKq;BebC?4U59?g z6mRrN&-Anrh#0wCnTLy)uU5X?!g;&=d@mctVKA9)39FAt;G^IE5?8|BYn8kT^UVxq zMjCWP+7Fj+`}uGCGiRn}>YXnagJH2An%w0N9occd{sVZPF*wrRJOzfOklUFyPa|D?8~q|bg1M-?Ug>6=d}TdNx8^*#ddFqdvPMt`kt?rqL^TY|%4Rx3PP zwDq(BC_o0+4(n|Xvp1K=d+iCZVJAv8b8Q`Y3jk`?8<&-itnpvwdTQ);luBF?N&|# zL&Tis=$NY8%YQ@_q)(f^uT0**EfnGP=TKeIfpYc#wD| zmkuFIaeE#6WSp6qp05b++?DSePhU#EwhzkYO!4q%X1S`8%{%Io@gS9L#~UhvHz(I` zT=(c}%plZ1AG0-UJ$Eme8l#I>J36_GPT$x%_iR27iU)JX_YLXx&Ck&_Tb7nvg{th{ z{sGjVUKtN#1?{md{MnrYjn)Mzahy?>f>3Jbm^3+Ne!n2=U`@u&PPy z>T+wHrP4gb%G36h!E~Sd4qjiH0_Oy&;0Yj%G<@1Q-&%XeT|+v{ea-hM+SBt+-|r60 zoZe3($Saoz3y+I%FGV)KAb#V|dParoeCqAf=C!G84ifb!fa&(p4NY2mH)^OaSW#JT z_yw#xZuQP=98G}Y`Qq@tvk%qe!=#hFcU*1jt-5bS7|*C^9M|?wU3Xw|{V8Fmr?wbn zwW-zxm*uiDIle0)*Hjt3l=cS6V`a!F#1S@C$F$UL~Buq9~mX_LvHcZv{g`BPw{l49bpXi!NOEpJ!zdHhq zlV6+P+%Sn~9v>GGLn_WmAAg~f>(=|czW`BqeB#qdN7@Zx^wS9(J00Nb%E+xudjl#l z5Ny~a;9D4o*|q#|!3eGVnZNAS$hZ$w(62%`$rPO4|8zL)iSp8(SKTM8K)?7^-=mC; zb^}EYGv`DzbI{8)wxOB@cD=Ky_u7v|6p`(AoctDCPWN&SgFyR2hT|lfpBI-O$*^n6 z$X<60-AAuqWhyENd35Iuo4vo9OOh-vDA!w%81G~eQTo*(cKp?RXs@?26AVf3e|EY) zpl!9Mp5F+uD-Xl>{R7CjxYtO%67oD-Bgq>!k^W_!J_9UhEVX#Cv({50Da@#m~ z*z03XV-BS8xm}cXw$|CPWsch&m(bW2q*B?ua@{(&t^me@L1BW=!kn5px!$>j*8on9bx+r zK_Oq>^mpKtz$eIu`hR`8A z(w?UqX7!gM7w~kyQH0;;Zu#u>&dli6J_m!buf{CtB2=`OE6O10M$2vbnJ;JVMb6qq z(0uNfQ#VqIVJRV@S_~%54GXTe5C&kHyX~1@>4`z!iO&HtUZGpKlfx$Br-N*WIBVHb z^}u*MzUJnc+%p5%9o5LOKILI;CVer|eBWvyG`kC`k74mZcV8<1)2y81-yBr-HmBY7 zVA!kEL^{IxFOMN$()P;gU-w5;86MYdd}}akFbHRh3F8a%BM6S~{Zag-;4(?q!geoT znhKax0Y$nF#R`W;Zpl~Cyyr%@m1J%I2x_Jci>Lnf9_4+`Gn}*z`}y0W>8;cAu7#;V z&?GDl>lHv-`Vk$&kz&iQ_Pnc`lN%wQrcFHtXFBq?C^oMWv0vzU`S?re%dTGwX9^zM z%0bfbVgUJ{u`!~>H(Calf1cdj={gS2!(gF~04=K+kayZK-AHlTVD#8bmY<@3ZWbFm zB)yZN_IVB%cek41ymf(n+L!#W$?071`s5C4b`2vQL_NS&V-2>_Dce(jy+hjFBqdCC zb|th7b?V83#UxL-CP2F}`#IxHEI(Cb9;q)1W(phV6k=&n+9*3;8 zP@$bC+~aI@Yb$-zc=!5t@uZ%?L~J6rAih!|Ufx>JWCYWkI6jk2UhiTjzn9(dn%r~4 z76yy)g%WQ;oj0uUY>#}o6NlQ!wx*kh+kGx})~^uWzt>nxVd;JPX%oI?2e284BX>J) zq|?EO+lQSk!M5sNlH|5E(nc^JM1OHF({8avA8%q%AcJp9_k2d#TqnaFetGiy#z4f4 zdu)*15}cmbI0YVTu-Et1SJAhd)3R=_op|2r(sbtJ4nN*FU6J&ZEHMW?wez*dDu;6~ zL_-P=bokAMfbH%X&S!i2ev}mM?U}l@u6Ab57?=Hd)9#Mt{bdCl%yV0CFRekX*1}3b z%B`!4u!7<6 zGRo&_JrPCAKoV^4FDYmswzbuvaLd=<#$XcU7z#j_V5V8pUYYETuZ;Ja$sK|==7Pj4 z-vAzAU=Bh`)RdI!4UD>-2lLoAXeg*w)SMob|HH`!P{E*Qds&1EmFTSU;|JAj~+cjc>+L1 z`5*m?^Y{riE*=^_!7EO}x9<)A^+oC^k5K*q;3o#WJYofYD=PBjPh&572(O)Y6<>~! zcN@Kmlh}aP3@{lJ!-4nFe*lbwP`Gi?tLt2f3}3y=CnQwLzVfTTm!F2My^8gNnvy(6 zUWdF4oZ(!(#jh>9n_64mI@gkDn!)WW+Pj4k3V%lzab}wI9xj6Ef0Z6x+ge!|;ji56 z!|N%~+y~CdDlI(gGy=v*2VH{(nX;kARQKjFH@YNL8d8(XZy*)7g^GC{rM1z+sL!CE z#W^rd3AH3Jjfs(YY~>znS!%(2z@7G_DiQhe)Dtk`xHzDnrC$SS`tZ0V#K!{ zX9kgl9k*D<;H~vO*G7(AM4_(N1tPb|U+wMfF@gc~47;^DNlOAB_}lpY#hQy2!x!+n*teJ3hGnVQ{RqjPjk z#YA_lA@t5kVx`CD%DF+{h-Sn9zw<839cK#E45S+|NMa^BKnxez%TAD?-^!qYO6WFu z95VYa^f_Vm^<7(ax0jdre()4fD)m)Y_yaiqW(35R4%&d$Qk&u<$5*I!D1W_^Qfj%l z%3Hqhhz#M1TmD#HcPjEhPA1Bgs7c z=4EU!7e**t7O5&z_BG!0xynAj&K~RZIKGnvMde*5-lxb((xCsn6JP0Jbfw;(9jmcb z)i4m6y8SF>5`O^J%yYdUCkl!FbBGjyV{}pY>*k4$=n0%KWGsktVCGWCJC5!y+^CYzl}Uj`)d1jwxLQuRyLjn5~Fs{#HXj$JvMH9ObQ*A=pUEU0##GC4N1GE)Vubjy*wYGUU~cS#*h{qk_D9aoNl_-#br9 zyl0`GpAjX2sbe1e`g%Q5L2}32!>nzSJG3Cx?6TU^;OqqbI%Zu%DxUhB%nY}*wKnPc zwByc!Sk44jy0sdH8T8LM6{EW6D%FDXjnDEQr}WE7-qOw~=gr&+e)d-;8IER$?m1?m(3u+NKL8Hz<)MAV zkL$#Be$un+{ITw00hXMZ$45j7AArPtbfPD46Az(cN#H5#I5XM8$cS6s~_8GB3HB=2&skB&-Zt$i8_Ii)9tJxacAJ2N1mAs?e@G zM{uL1Wj3+7n580End7lCd1cY5?`Hy9!DuNxWx)H3#bzc(ErDrFbsqcjQ6x^xrOP3! zSsicK-rSauI~o_Y|93yKLe*U=hC5Y#wRi%^T&vV1TqVcZK#AoITy1zw$vXHZ9EtVp zG15g@5DTw_^qh9<4l6o>agJ!bzbvc33+RacUzD1ZA44HgY2e(-Au(CN)o8Z24J!*w?ybH^yy1ZK0mS!141U0<)F zOzqzc=T*xRGQIH~!Q+cgJ?U|J>g40w6nGt8(;nSBd4V8+^CiV+0#{5=qWF*rk%lNq zDWMO^M!k22eFg#x^A&scY|*{_k?S2W)hzNgGd}eZ6TUkc$$G^lxB>GNc|=|6x)q#j65 z9*F26u908MB<+o6zHE(Bn!bwzsp7xW zY~$>PJ^PhWLLo1~tHzbCQtU9rqIj1CLevlT$L7aV7(%t8Q>{u^d9-rt`4}BeC@A=^ zp*dLm``OT+8I?N>56tinn;~htcjFI$S-*}eCt<2yVH`S;quPJ6Kx0Quz#kG`)WaVx z@82i^+l%ch@}yKXV&%ee*bH!aH{Y&u$PyLWZ}1)(^zlFv40WqSq{uOV9#n;-=)m9U zErpn5NGyyCfxnW=t*J|FWI)B&CX=B-JQdE~tnwlkBogUyrx19Q%jC46mIHa(*>~qC zA2<7$mJoBvuW$TvC22!^Gu62}eFsh%Q2!Nbf1!KtD9}whQ=R!(EDN2C%5KBTE*a1Z z_eiScqr%+ig5t3w4@Ayk6666frk+5-xu)cJcOM(UAPkjsjz%y=zkN3OWiF74mxs*! zg_}WM3MCllaVWCeV$@=PUD?1uUaKIdW+s=*R!>ivh}K4|e@{}2zI2&4R5Fn9zLdm1 z=1OT0ID+N5=tFLh^m`hQ(XH+`R0gtnNq|wEWuG>@GKyzn)rWA_|S9W z%$*};UeWl~-_wi&%bTo}7a7Z79@Qd^Rt83qoIe0HXfEse#)gx#VsEhX<|+*>5$Ufr zrMPm6)wmY#-0XaV_mHQg-YC$u*F9GO&mxTWqs14Dv*s8P`Rm8PiPGoSX5O8{+qFBZ97XGJ zL%w{EwHcwS02E}tLrMZ@P{Mn-$jfWSRiVPx`reijp+ay|!G+zkUWDIafmXRy68A@g zlKZ1GW83u#H!Fh4cFJ73&0hE5wY50;+;+O7=fatT9J~Bxv@6LRaJ;HJdPjsL=o$9E zn4|Zu@C-tv%496$t2v^_5N$CcuUNiLUMMap=nVP;khojfhVN|jBOG;CQylemXpTql zMCfU!fsmLZebU3k4BXmXp1wC@v)SqH3u~uncsP+r=Gc+^OUU;NiycY}@(c^QUh5_$ z$rxKRB<@_2UTrePDrp$Bbn9K#=PTEkg^Kh}HDxhZXpnSGg4S7k28P^6W?bQV6WupC z!=JcUa!Ddj4}*WDpKoHK;gS5yPyUhDd2FAH${HhUJsIU^!ux5nQ%8m}%jHyw#M1rDG2j+swX`tGzEMVU^R zlkZc(IN9iMk%wG%@cATXZ zCev>;_h|GEzS+X)iI!VAmtS*cJ9D^!xDqqjfe=kI66`Z`QW9{*%k(3ZUt=v&fF%QraH*F4+5-A16gP5!CvxN(x$i=>A`|qn<&U9k#x% zwgwj{3mM^{blG4ny}H-Xj>EG`6N_Z+Nwu?+xSLa?H*W>+MKEkPe9!_dAlTRk;I$rI z@$?sPEGbuY7nw?=kvSEOK+8mk$~RCn@PC+r>fDbZgRem4XBjNtq>r7DZZAnE47Yi1Cl06}Iz0OI(3*Nw$o(J%$|u0+ z@_{d_fHtZc`yI_4$-m*-r5e^R8Ww~tiPv+q{i%xE4v2U6#+{@~N~ho~o*c1}KN#;Y zz|(40lwy*2ELJ^H z!JAo;1G)Omq71smg(CRfT;A78I8vo5T#bR9ikD_y?hrPs#1|e{EY-xaUrCBxblmv_ zjIs=s#$|k`l%U;Lo=oO1PFrhn0=xe%RUaJaVRe^!A+%UbCaXC>^Vm|3Eu^ty5EuoL zWNd2`Z=l@}XH$^4(<$uBD=*a2HZR!yNy+CU$Y(^!=!xm+%lZ2tv)zj)!r)n4s{L@MoR-31y zTb6wE@laX-H!8CD$md;8g{S_Ty^K|lZbQx($Y0g+cU>~2W4(3`LC=pmfkf8o2SS4) zC|JF0=gW)Ji&VLzjwdJUE^iukT5Q+7#u+%^ki^IZ*|Ag&&hmw5t6;aOp7zPw;>gP~ zxTAs5IA?nO*0aEFW4Z^g8Th*n7*gfH$ZJSQ^hgX>Es>BV??BH7?{;fMYXujpTqK9* zrKT=lwjJ3m9l0&7B;~;Cjtj;aDK+~9i-)=wKX~TQHt-I+xymT)!NG)n>QZZX8}(Z# zAK~xl9>PlHFLzGLPpjUM#%o*slAdXpjJw@)YD>%S@HaJTb`&ksGD~D^JDOYQTfW$% zudZvfIInLM3rpl66bvTcy`wAG(J-s}dGMyrC1ug=r?R8RZJFy&EU91wGK)Ws`$vmr zL;dICE}{KVl^a?(CMJWH&{Q+JXhrQXp4sjl8mU$Gaq6FgBu00488h_{k=YtSuu_5}riPKjoep&LYfN;ZRv52|=)1YY_Plsp}xB zsDdR`7B2|0PLwE|drZRmI_RgOs(7nkxK9yNNw5A`rZZbbL(tEXn&`6&lMX$vb_j7} z7Af;EpIU%2_e+}nVS#TIPrK`HgqUm5_0#f{K_D zH)uBaJc?X9P&d4>&3kl@QdYli&`J3$B0YR!rDG`R^4ebYqIfV%)1N#_&Aa3xeRdjD z_;^cz9=cV+Z`J3%{Hn(@WR0X>%$)q&hgagrNQ3<|RqS*J6Zw*0YPzAg)aB4ZeQqGb zd8NOr7MXLBvzqa*&7$Htt`nbn4HzHp#4+1+DMA8E$7usGC`$>1Z(KMAx8P*ZAGMG? zUK=i&rtdd{qCE+F8%DG}0808Rv6Uqhi!%HAMU%Ln0Gn-d4am6N+4)#>cYenbj$!q# zny9ep^UCvC!vnpd()58#FO)>(-wu6nVG5|{Y#*vEBw5ZTUZH=#NFK6cD z<>I|*$ot|R548rG*n@gS!NkmBD#jtL&53*ho?n~Z^Yp*<$t*=w`F_phaP7ptnNrDg z{I~_fN@ZwS!8NSV^ME^zwij8%Gnb& z5fD#swo)ZlURb~WtCDX1E5lkNZ^_BpnHfr9xylzMWdWq0GRL*|sqhaNhGPO+<>Ei} zu0zdu2aJvbJB{cbHpu>Z=R*_6`#S_QI&@Zr+Q)C^kNJqhJ$hMA!Y?^+Wa$|scu!2) zm?4=1i~aI13et?+?0tM-2QMi+Ea{5hwN+B2eY=rsa0#YgfiRLI7N)^*9O#|KKwRm- z|M5+hC9=uiGe!NZtTyM06C0N+{Xg}mrq*8j;txy0qBLvOAxhHc+4cNs;a6nxN|8X7 zIZPCu4OZMhm%!9HsG*rTnq9{mL^ z=---#hqKq(cjF}a`!vG%c~;m zwmdNt50`wC@19lg=WB~S0xqox+O@j^b;<}Skhm`{0Cr>yeiPUn^;Mj2*E6PKRZDl-d5RF+@pG6qU>{- zOkxKFRbR_B1{S5cKG6=23F9f8?&q;>1Ka*CWYRbo;B5CcSI}DY2zY#=BNvj@Me=bi zrSE~J+5XZr)%mzSus(9FCYE7ucqgH)jcdd}-Y!G#N@B5Y+tcdqLu+_Wze%kO86-`7 zfXgOKKJ2$XPh_sttAJ#-ojARjFyMN>efMiIu?O7HfBe$)VRK++rqe>}uE-WEzfN`k zj4LBAF4fv4VUo9~zs)C7Pc(IEE#0HK=^VoGygOmT!{vnFr?p)oFfOIgA=?zEFH`U& zoNJOR{1MA$N%zo=1Xq255%ffuM||v>TxV6x zI~vBbe=+_Nha?N$f?xld<<0wG%VkAwj7IzANGX!u%7&Occy+7&Ay0Bq;fyvZ{{FoB zXzFnXo_<9m$1*Tnc~CG;LCjnk+@iEbZcY`(hn59pz$2jx%^FKEMOsqiFsF27UcT_4 zoVcj(_CskO9grZZbgekuA1?w1ji692V?`scweDt@XHtf2-m&l$;hi@ znwE-HUfWpqi8}tN1hrQ#Xv<0E2~RRg4O!EP9d}|`ZgUrfm^un1+NYYiDNXSSVG+) z|FXV}B;QG7>aR2%QF$8^-q;hNo!|1w5o z-Yx7C=L+UDTjXohisd*_TA*s6OSIE-XIqVY>H`ozw0NWX>?q`BF_bX*RT?_ zno7@Ql2B9bqoqUK%HIuvPAB}fSqWsh5(+$zfUX2j*etksWwROUc4e9{?a>{KLKWZK zLbAGW*UBEAE_6t0#ncQS^H3&pD$emdw3N2Lfkm}gy;~zVHrGbEdwU_;^7U)q=Mdv8 zElb{mx|I;52U+X)-<;Q{q)F;pVnXu9#6xovoT^T!Gb9v*e>l-6ieNhlau8GEqGJbL zgP;YX;lzIc9W~PDXSH@8sGBSY6|kP7CQp0J>xfBDnC;hORt;h1h|?%)9Sidu)SB@X zEKc~1IR)&_JK>wWSjLFoI9|c^cy~K#z+TJd;Tj$&u7!c43JL1 zspI9~)fxWAvljyLP4cDg+y^Jdy&kK2c?)ZKt8$_;@(lK-zZKy`5IyOBYl=zu&dm$@ z-N;mhWVQ`Lr71zhmSVYp7>!U+;}%LFas?i=3jNFEe*oEgtorpVE+EHNZOuEK?#s3t z+v$r|fiy?xT&n0B#Q{>J({7U+W`IG=Tt7;gQBcfMA zxU9P+7w;7Uh(3^Ko9>K*^cKH=o-_ObxU^Eg9JUorH}ve#DBKLN8m#q9;4x^3)w71!h7?n zYL*~+Xltx+*)&r&rb_usc&f3yWo2xowfDRW{yt{?vdb z#m=&d)_Dubf3`}EA9k4^*sA;m5Wic=zOzlwequh%(PL+(ZR1x;D!o@RE-n{bd+K=? zuRg(ZIG;6vLvAvtfj-iQ#n)xJ4d)>Bii2%z3YKg$&j}0JOzG!*VDIODp8`EZyx7SS zx+P{MRz@X(Kh4m-w+~dRthwun`dFTYaIwq}jx!%h>)LJ+D1uZNG-1vd&qK5$7gjH6W^B%BS3& zw5X-IO{N1C4cXHeRu@ge`Kd!O*2Oxgec(lJ0r(#d9 zClxt){h>A5J~3)xr9Xt?t9U~q1gSM#D_?*T@!LvTx$&BCW63RtP3g^lb=OfttxTa? zFw9@W89ypU$HJW=J23s|z8Stk>Z`GT$&L z)A_F`q%Gf76crxXzTaP#t9vI)FjUQycjs95E^qA7uR!}VW8z+}3L)S0{$lZz=_jy` zspvtR5?F(q+(v`z^XCWYn4Pu!#F4p5Z{)<$|HCmZCg{dhxgyk*%{vzgA>IrpVyfjT z#n_u5Z##(7Od`^6!D4L2saa}Fi7XlwV7z`;w$Y@NKL8DRiqK){;fkt^(Fx8L#V+x3 zV_>T|F7>~W?@ubbzZa;;PrYfq?May zJ_u@zJ?Pz^#2RCw(_J4Qy_@4BcdK8G@oF+Jq17+2&MVg@-n#2fxzAdAx}L59cz^WU z8R|SpG7;AjuK#MF*b*xL&o;N{-M_6SRX)g4lAp8J_1Y4oyNsxfChx72lS2%`bAL)t zbcYt|tTbE{`Io_b=&ZFB@R%$;4O*m)^*#mePf>>AaT-uhgJAA54wAGB zeX8IP$?XG7Mw_DDtVSDeFiDKr+-|TjXG$M3k$9TI{_@(2yr3+ajh(Jfg>F-7t4Gbr z$*n(CS*vcA?@t+EIR`(kd2Y0#igl+|$STM`0EoR3BF5EfVN7bIePI6l5IDaZr&nEz z6Wf7#!2~~MGl@eckbfc18;^-b^s7h_Mf|Ri)a)to$Q2=6^H!0;$NkkMEs7l&6Uir} zd(D*`IPoi3Dv)DBG$~}YgSCtJHk%?l@=o%ELWq75PnL!05W?v>Z z>MS)C_uEgOS``v9A6JN=ZTw<}3lPQ|#oKrp168(}@yoBZB`%#X-Z)^iB%fVz&QO!``Z@LkECS~$&MIu8dJ)@r%SYqGvEXf#13^j@9JV9FU zuhGUV;I(g$$07(dc1rq^YlL)jm92Sn<+Y0ws6AC~g4APn2=--(h0q22!#T^8&J-*yGbdn=bloV~-zZ1fUiZk7VZ1&SV^hupk> zm$uWE_Bhdgpa{pArKjz0OVa%?;p|lY91XjPoaa>A;Xpx25QOOOcJe=aUNvl{?`L}> zjniKg$tuJ0_4|Pga0&Tg3F(!<3t9WK>H2bOgPcR3?lr?%i3ls z14#n?$xbroXVc;2`A^;_M5&?2FU)b-3U!>l?;iRCVDDhqmFabyx(`sRsUaOxj?1&9{{Gd!8UJbgx?;Gb~cF9Z#E11X{kE6dHAIqj3PMgnn zj#bW9pUJqtSxK;&zf(EgU&-w0c271}VZPWY!8P?TNnIf^e%M}`h6eq!JEOAFK3lpV z?;%xGJe~S$IcH@%Fjka&bf`2Ub>3-0@p5Ii_nNVTodLPD*=hhuK(@aU2woLP01Vw^>0H)9gfV+QV+HR4QqWFpkplK3a$w}C=*R+g1|^o69c zS5o+Ns z_h*=&cdioaes6+t9;1uiJ?x7A^?ZAKGh0E^>C0U0vAyeqy3s=T@y6%i)*Bjm=`cKb zKC{b)3vYWr-dYcX?q$ee--eqm)=}Us{aO;FAC#dPwK#zz|2v1w(ohpYhs=X#xzzt8 zmA2MGTTVcnu{`!RV6M@&`PK;+4 z`oc;c%gW2f)H8AJc%Y&24iKLt2-6BF&Hp}kdq9o9Vy?vTR$OuFwhgcUX%~Tu-8#(6 z<&}R;&qWUk*+BPiSXdsa7V4mKoI9=6h3;MHCPuLQnxaUprJgCXuKR^>wrd4RZmhma zd`N%;NM}Zx{r=4^ZVx@~R6`2@x!;!`n(=`_GN>W9Y-T7UP0n9fD9Q_a#oaZom& zz-d}(Ei8fAxLk!0ue`u~TJ7n&q5aE(<1~4mM*11sg<;qJGYJjCYf2+L_D#NeWB#7K z#bH|Na1c8OWwG2EXXq#Nf4ci1#K+&q<~(7@%YJ@tFPWO)wdcCpmMX*z8kd&UmPX=Q zOIt3SM&9tr?ox{9nKG?AHl^D*hVv^p9ruAUB2A8`Q?eXPm^ydrK)Ox96!CxdqQ$69 z@!$Uev_wQ}X(#TW;)*2-Ganfg1jbg6R0OT5ympz68^=8^e_>Hfny*suZXei7`?;CC zO+#;TYwyOcrED3c>#h_~?)X$Qf@8Ag+%e%RxXsR zuQV`FR5U;ys`Y#2wA$RrO2wY6=gJGxvC2jI^ps)bTjsuQ;QtQ~UjfzD7H!LIO9cuP z_fi~!yF-gRg%C7Aad-C%#kELqDH;;2SRrVOLvVt-OL2ETz3;t$1~$mZK5H+TbFRJj zNtj8+gs+*7b{H3r&f6zCB;M{;H&6Ln#*=lGAn`^+UaRwa_d>dq78Tp6sqv}5mto`6 zYr>Otc@N19h9vaaAs1l_ht;GaxZ#qv%zTssu4`eqP^%=GC@dFUoM5tHn{ z)_sflp~e zT=Egk;31Z7LP<+QBX+sXY?Kw)j3nD9B)YPA{sd?mgz+6*i31GJ9NaXb=VZYO|I3_zjVia5O*}29FA_eV zs(9k>DZRfeZYa>UR&IM~kxtKn#p^u9r1)n>lf*X5RERC6{YTdIRaxifJDyiDj?aVN z(EX3*e&Vc0G%3Bwx;4H368^6ME)S%%?Y?YVeMGb1iU=?YlQHkDK4gK!$T5#QK(ai$ z{j-rnCM@lm#^jyGA9_CjU&E0XfBzKz$rg>ty27V{y4$7}FK;A7j(TpmVoaUP;C?=1 zWva9g@3LO~H4>Iu+_ZLe>GZdfTqFuy@8sKL|4Q}$)XLANO3`X@OMRMF;EzYNQKJHW zuJo7H$6N8qw*O?liLK#X>&f6|4JYaLFq@Qmp5H7G>a*(gnhQo}RPbcTQzFLS{?YrN zxwNe~cF(j#%mo&34SmWL7kBv7K*sPk3fbH()8i*In^{0AbzJt$YX}hh=I^_oQs+NG zFgBhsByib$lF)C# ziNyidaDqOSSd-%(t}IuQ5RTE9Y9wo3e8(f2sqf<5;nP4hzKf4&(f7HrZNldxAspnR ze|CN7Mse6htCxyY!EFNk*Fr*sX{(~3#c#k>RUL(x&h#GYFQ1?KJFfpKiz@uSzHQw1 zxW-qYCG)<%OD-qsz@Rj+y7S$KJjqz*V&PmxKuvYi^AJeC}~vIIEB z_k>eX^&GP*J?q-p9vH{1lyj)Ko){d4)c@O&Sy!mHS|NX@u?iK$77BTSw$bGO7CY}G z&Ik|B?616Aw-^OZysjb0TjZwyBiiEq)KY7JY6qjGf9Hvi5S-h%2>)x)v}v5?yEF@1Y_9Zwn8+rzZd%K3>HZG7q*F8y^Dvssbt@d&4*$Al_)ZT@X3j2^75cufFOv=KJ^SKhNH^$^J*wrc{^f9`Tu?slDK+ zEpgBF6IYgu>$K`t?FCi2{;aEO0f_z}+x(T1h}2rePvQ9mcAVnldy(j318mjs__3w& zs#~np?HHEFmvs^s%TBdD6^@5ud9OH{ua3;jZ9d z$?qY*4d!yMZKQ29@rbrT+L~{$CGf*@&*W%uynX#CS(L3`8|wU@3c8%^Q5VBHGYYQA zK64)(9zWdayYUdu$SqnLr&^sj%erTMNHtRK8UGV>k^8m>PH}T1lui=w_;h)u9t7;4 zO3>YE&$S-hE}cl6XrJ@k6hD*(YCWQ*Xis>a8(quzD?SuFqS5s&JviJ3w))l2Xj@#L z_V@MawrXcG!Q&khPi_TT{@}rmW%*)%cXEFF7W%(O@vj1B81 z<`*Icf?pE_Hh4d*Y+hb!>k>0u1MVlPIoV&bSGnZ|^_-pEvp;0y7CxeNwRM~B)SVqJ z2fn^3S+Q7IWSy2Z6YMvAwl6SP&h+ogOHK>0wL+twICa$%p5;ldp7B8uU zJ)-rs^||=V8GR0LzBEepFWn2cJP6p@^d@(d_ojfIA7huBmF?c&<5GC-9-jpU`@dQ) z*lD;C^QWYeenbnE8~L*x6DVDoZ@FD&Brhi=rvE4Pb7N75mzY8GBbq1pW-nK0%lpKY z+hvIxVdQgdd zi{D}E?NV=m%7ymqgVD(&TDpJFMrEBpbe*H|Zph*C)V5)8?&*bek+)fgjb)E$?0mK} zbxBLsHDsO6z4E~?{-THZ|7;vPI-0KOh)+1B>RyG8b3maxxyO7@HqcVZJ)(sTj|Q$J zoq_MEB$O(l&^!aZKdG2|sia@V+cFQtS5C!m4_iiSy9G24G?gCp(w5iL-3YK9#tV0BA8VZRSxX7$E#8wuD5 zclDSq&-<_BHGlhe8Av?s$s>h1(Bn4qi`-`&M`aG4`v)g}rHR)P-r%j_+efsvioT2Z zp9bX@9Mu(F7oh3ZzKgaL|IEE5hwF*q3YX1R+YL1qMh+a?%vAi#KtIG`>LrIn|LI*D zW7F|Z`f`}-pGpI}3(x(-y6F9fsr`VSJ?)o1fBx_|AB*#@en`MP|DVWFUEcN#_*FLf z4Y&C1>^WBZS8lWcZprqI?60+F1C$ueZXJ>0$P>arzolOP!$tAm9`3__OD%pqeb-y! z%7=_YC(Uv93%<8|x};DMt;ze#%1~!*ba(ZUCz2W-t2uMKCzX&640&>RX=gJ6aBqcl{6Q7LOR^1oA{rB&cRdu?>LR4oRv9uf(D zJ%ixeywi9t9h{g4LwbXTQaiavIwi@3H_x=4AR@;~cu89CFf5Fz2+(P2f z=xxLeARy)u?VXX5w%ir$4>a=6rERT$muKL*+U~1!bWg}afa$43Qr|Rt$3d&h;#9m3 zl4EM6I;Wc_?n{>KyU4#aXz{;?b?X<@*lX_E1m^vQIglrJ@r-RX#g{d6b4xRr7;6DS z?wI-U#n2s{8!4($;F;Y$ql9A5_#;~URf^}d`1mPi^WEh&*5#ij|G9(G=BMmosqzor zydNIcy|3TfR+2A7(SK1 zIiOSHfoqsMLO0?8ak&MlqvK~G{)`ez6+!M)Pxn-7tC+atXsS5B|CG9mbMor^z3T0$ zTH{^K*8SYj{!+CMaM#h^nkYk3?&o%vEq-#HN;E}hrRmb_IA`qx_*zT1(uU$^N_woZ z&LVMy2`$aGAMdSJdFyCRCvcD< zmc38@gg29Ft`lnYKkr*wCI*|^Xe%`tw>Kg&*|)DwOib}FE|NHNct#fuWrfc}Ux>=m zNdI>iZleFe3e9G&slJ1Fx%WBHno7KjDCR50&*SvBesOi&!UZ;$^(w`&wzKwa_L)+| zv5EoyDK1efapc$cqV+v4E5=^yrwimOV+qk@-iuGydtDPN76;55bl1-;!=_%{h@9r=2Hq>uR-8|D} zy+Atam3h$$C6e;=x6-X~mPx;syeC2aw}AF{wUU3SM&M8R)nwt~oqRaRksWnYV-uC~ zX?LYP*_Xa(O#>eArnAbAio9n#$xdkks#s`mV4Bu!OD0bKJF2*4UP#lFgR+~+wKq~+ zk-s7px64_J_CMMAzwQ@UsU56}gx0t!yUp7C9M%nrvn1<2W+m*-q9X1*9uf#OIdfh! z9PHG*f$7YqRj~X%UhC1Ae0d_8D-3nmuX`i$buSllUkf8NMt9L-b5UQHoAu#Ow^Ue_ z>~qpsYWf?lDK|-DE_HHCy+0SNTccbzB_2 zH7Uan`!V3-$APaN>h!R*|1j#Di@664xmtQPcjw{P=4lYU*G7L?nRY$=!>@7h@DItu zn>AK!Zfr4sZtC~bi=ZwqLwvj^mS8ny{cl~v^Z`j04xpfJi5n*n^jgDTyK@e5Dy;;A zy5p#3#c9{pR_;@0mx#RD92)*S?+|tGsbF0`Z?>}Rzitb-{*#+jdzZQQh{kd)(Ys_0 zene}~4UkE2ewZ6)cxA+h-1j_@f`elO;ts#n-1_=O3vXBq=9s^2x8%~sJ1&!c_mqG( zfBnq$#0XwXb`3^f8YJTGO#TpqZuZ~RBkOC4KJnit4+jVqTHa!p=FBPvh@M6R5?iRTF8cY}ecPOW>56}T`>N$imSb#q ztfvsuVDRRhLbu_3wYqe=A@lO;ufo52`)~K2^7k#_V!}7Bcdk?# zjZ2*mV#mkM$IdK4VwP*RunL5GW%=)sjX&H@&gZ$&2IlVS6YINP^Xw8z^T&eo*i%6X zB*#K4={eMZ;)i zB7n$;^v3hf`<{(Tv9hRi$Na4Q#`|7`^3{q2c7s|th0^Mmu5TT`)dWxOeoWfUhkBnr z2?uZQN$;U+%;ZznM>JvNsY#BEVh+c21QJR)l-aZ!ayzxQ5c$ zW3yHN%DJ4rsYq2D1j+Xv@2mUp_t@p90}Os%cfhaAor0UMVom=pO>iUs9`Jb^Ky{|* z(ki!bzqQzEGE{A%hSPOX7v=Sc_LK^xf2h>296Q({Zc8y>`kt#6F)X#%KRuN}(el?eR)&dJ zt^#n>Mjy(S?hFo1p88T{`&gSO+(b`>R+01l)C%S;)AnmefA*z z`nzlMx1IehG4W6`Q^7$cF3kVOrs6!9gUZ&c*tUjS)~83__Qj?kl%TV!gf8L#uf9E^ zMFzNUT(6zD=t}8NTE=bBiqHmEso9ui(hlKsbqbb}hrfvaPt*|neUcdGsi~dXz8f#* zh1BViaf+LtvQ&E6)_E<_bw_#S03)1Z%o64Q!|4ARJYuxi7J2X152!1PS<9|jub}?Q zXlF8*@#AMTNlech=K;Dz1&LCo|HX`_=B&Ql_G~JQ>-xzjhKRynw+ibU%XRT}w3u92 zqmh<=`0*r~%(yi7q%tY$GXGihzMIR-0!FJmmcuU|AUfJkdx|J5%F~+LqsSYoedM}q#LjnuI@w8P|{Mb)4bV|s-#yrLS z&Xg*}=FUDwiXuOD*?*GXd5G;|9Fwa@*1X$0_3c`j#j@o6e-9kx#RM2VFvp*@5!J6` zLgXqbJ?9&}9Alcyqlp=uu+{}Pfx$mmZ4~H?{%@L856m$EB;7mpH@2FLod&tjg_kQ> z_9sO)nwiVuF$NlB@p0**|1JYO`S3qBI#xD4nsb|}kyo;F1qL_mZSwsV;UOP7O2^%uzTdEzqQ7V zWcqLMwf+&!J(;^(cr@Q{dLWwg{Ea%}>jPDaQ*6P3PEuvdcikUDI3|*HWr)_ zyUiST#CnxofBY4Z!itx#+9Mk7BN~+vM55m05pAI+4B4Esx~)Q^`K9e`fmQyvOL=GF z1m;!LMwYI6WVB>)_KZ#H5$gJ0`?mIBA^H)`V~AXUtJF{ksD)R|p+r+cTs<=treM#j zK%!D~DW@uuZK8zv?I~UJc5p5LzU~_NsE4IRE-8U3_-Q{Up@CALIPzpYWi(tOqPUsG z`gy5!d7JWF=jWugM>G@2&$%P@+d!{DPGM(8nCm8rwZX}+Iva{}ijkeobXz1oODqMh zx7EtwxL~fduU{^>csN?=bF2j~Cw6{WezM=X;}ie`Shr#IsIo0Aw}O1t-q6}=Js42c zUxvRiZq{o)Sy1qz^-1>hA~@3p-Wd`+&}6*@6le)o*_O98pZXp@810#`<%eqq7Rl`& zblpd`JJqyQ4pae)6An^;pCH=`2C~p8Mqtis8LCfn1lemItGS2Y`c^-pO{cK-_LL4F zPDL54;@(m~tvd|qK0^~lE;o$;THNkH-pWN*f!d!p9CHiYgA=P@4W);U5mc5VQ`?_D-(sfvvS=U_(>!<)nUlS$NxJSVcWLoZBHMn+9`ySCS z!^f2JIh|ax3vdP&eisM)+-a!=-Iy(FHs;0z1p69Ez|{5+WKppt$bTIYzZ6aQzvWYV zy$-8p%3g7hUu>HumW2)h`kkx|SsnZ^B*K5ic?0i2cx%vfL6(!~tEkR&Gk`O-D_jht zEuuIOs)nFs8D`?Ea50{{a%HCl!W3IvHrG=u96vYexS@XQo6xAStaYGVd-_EU)zQsao{8x{l=a^O?{$9T{VN?5sg^ukY=N2-_CC{ z_Z}|c=pqF8+F3PUjZZM|*5oHgp}0P*-gT1r#)Nh$OWyqph!P`(Rt=nA8R?@tzv68! zc$U`MZp7R2dN!MRDV?xNI5PrpF)82?>aiIGzVRr(SRaxMrNn^Ac_`ZN3IU3-HdZye z0V`~Bl9ck2(zmCP81NTALsuir*)(t7ND~}l|*MQi{-XH|qZi zn8R(cGobY$x&NNSPDOBOJ0I;cfN07mN9k9GC*!K+808Hh1{U%3-rSx>tcc9|%RGO0 zA4(*pV>^(+eDYImPMuP{tr{qNkneo_iXJx%c3aC4ao=eBt)-4C!8ft1CwZlMZ6Q%X z`eQf^DUJxv5?JodA~1Omo;I5F@zVMP*$N#1?IkaIIc|DRqyj1s4tC#K%EiO|)z%Hy zE7*r9DkQBY;yyT(60%fJ(pkA?ULKN~w&;4Qcx8{D204swr24C+*X-Sj6Jm+&mMa<| zL}bkSJ+p))p|~o2-Oxughg=td&zVfYx(lr(-t@f%1}i+^L~VSNy*!K;QkRw9+fI}x z$l$h@942?eXH#MN4gH$a9i3jF$%Y?CdyXcnqIt=;dgim8CdOAQWA}X~$>kNF^(v`d z`?8giglZi<@M#$o`xnm+#ju~Z>N0t3vP~`b|Ec^<)44V#VKz7VW&D_+lBOd;)J>Lw z>S1=@Xn)W{{HH!-K!HygJ2js$_DitR8%;(NU-=B#=-bvABlgRYWs$vH?@dX`YGiA{ zK;E8%rJ{D;B9OTLKqsPk`Y<(bN&OM6PR``oXdhK!j#oz0jc{t1`kvB^j7oj&wtkIO zauuCG%;cdLYyL?|**Y?{&$s$@o=|^}a^}}9@$i3^SfT%v+|H)TD8>N5Ud>IjqMbkK zvCV0HN_I>-02ip9fA8zq9??{DUF4H{3x1r_ImtqaB{$@7RX&dk=P}as_r!hXmtmi#HZA)_Jhumi zXt*q;{%pP7D&km%125uEEc*6qx{Oz(fO8`SF<>b`O3@{f*=-xxv?_>90pZ}K#lD=! z^gu^Nxuoz4_GJm*LZg_?Md}3l()iYdA=h*!j(-MVw`$Y?jV8y7T)jg=(|-e_L`c#h>6#>!z

L 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 VVgA9uApcDoa4@jFfBwM0{s$*jkmUdX literal 0 HcmV?d00001 diff --git a/API.Tests/Services/Test Data/ArchiveService/file in folder.zip b/API.Tests/Services/Test Data/ArchiveService/file in folder.zip new file mode 100644 index 0000000000000000000000000000000000000000..b13a312b8ec2538aa8a6e486d715d623d6a8715e GIT binary patch literal 123539 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 z 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%0DPvtNhh-h98|!$~ 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 T|3F|6|K`{~+wxBf4D5dZA`f}L literal 0 HcmV?d00001 diff --git a/API.Tests/Services/Test Data/ArchiveService/file in folder_alt.zip b/API.Tests/Services/Test Data/ArchiveService/file in folder_alt.zip new file mode 100644 index 0000000000000000000000000000000000000000..6607659b8ae122e194539e9a03a9b2405de7eb56 GIT binary patch literal 123535 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�?JfFB^fHJW@I$?w(f`$jeWMrDd_OAlew>BPJ2}(NGr(L(MhL%l_BRiuP3DmA zFRkN-Z(*8B{hBP}PG346_&07SeaAUs_*eA&dIU#h1}iZ?D~i=?WOP+s_ z^{xx<>ilcYn-+`zQzh46D9(HAm{ssEnfQ-Wg^{mh%Y?p&aTky}$21^!{Qb~Y0$n1E zhQ0ES-Cw+*Ec)5@F0>S8^J+lcdxJ120w%Z}iXmliUtpc+B1d+43?O_&D_MX8=#5aN z;gRu$Mdz(SUtb6IqF;XKnSDO@@R{v1$9%081LR+3m+xZfg?t%IyFn^CB|0zvb=?T3 z@_I1|e6JK~J_(DktabHjjnT2dDB+gl55xXiT$4NzUl6Fm6*>BdhDM#EJb55MS;LSu zS-Kuhyh$o$+h##gQY86&T6?69uZo?0qWP?|EV*2cIO8gY2Pf@!_gHFJRRpc7vvf=1 zD>A?lcvB=YF1D|B8eqHq&!|*u)Yg+hA~8PmK1&)Jt7Wn}{T8PL^Li)4D9Nr*mxPPo zmlYV{jOQ}W?X*)GPfaX3<}yW{%tmDMt}2@kXjpr zq5g>0S24=;uk9%rTvlHOIc?2@*Ur0j@HVKFR(B?4pG4Ye@MFw;odX81YVg;WMxUM} z=#yALroIF>w2{2fI((a7#$8eo;6M)w(%@xhp6F?aZKlOEmdVfj5VOB+F@OvIW%{{x zcHe(e@9OxyuFD!$hwJAoSB^2-uM^GsSuHkP@v@CeMeEhIIi{ai-`RX8ptN~m`;mtb zw{|$=@Snu??c;$evi)~oF2~bt3@ly)3Hq`6vs}^PtFJim)cMGTLa?iN%)YuvpHfhB z`ah50H1B~%+OKwdm>}O@Fc*I8@jS^0Rlti7jhG@qHbGYDa9;R)TKPC( zl$K1%xyE&n{?ApsQdR=Gl8LVIj{kGPGs?};8|N6)i8D&J=N_9HUx9Q*j&D~xy1vib zOlF7`M4O;*%m)z>XCpte)WTVQ+cqsjp(vS3 z?p0+DXCiB6jiCz9Dz-Ud{;Tj`?Lbe9f}iwKvt(d`if7AF%^fx=5JIAGK0+Ilgil}D z-+nlgxYc6Sc`~k&$LbfHr2W&oQJYoBMXuW!rWm5*$1>Le@*RWzDFxUUtnCG7{j*^B zfeG*A+TmGz`o~7)kJ$^l%&CDF=brqu1hIL%)F?u};1{b*Rqv@J4I{d_c5j@CdIq#M z(puJ<;TvMhGsTS*rDAF2Xg|Na>6Beg2{7g)72p%V{hA=2_H060Jqyf9{_os@rmj&0 z-+LIf<2%BvdC8ZXT*<#*yyG;+d6;C?X~8yl_W_t5eBk^2*H!AOzCuXPYmywAXRaBs z4gz0gUVkLlYzxDuH$AW=DLzN>5*hqfzVFD7#OAfXqEGPsSA->wBR*2!X6*N-sHgii z=C+(aZRIB`sS!B?fYl(BLz_RwU#)=gVKg&)`8M=7=PB_HrvGwTe=#_RhKzS<T7` zIP&M{+bT%6VtO|Ma+G(th@n>#g#T4pTA%Rwn~hoSdBhM+Fh)m#vfgX@hUDHak7x&a z^Z86-FQ^~Urn{nvn0^nvUMPXGUqLn~KE5%$jg+dBBf1!<(Nd8MUkS?@{p#D(fc6j1 z!7)c&V+p}Dae~ou26yqEuDO6wnjaC z2`?}#wjM7XX{6GX<=Vd46_ZL2rP|4O#qRS~s8`Wp<$EFCSvxl$6c<+wt0j>HF{S zM>MQQwAg4OHtuUp`OJTDd771NW$Eu~J%fuZuH!29*}g1{B^Y6~tSm#1DF_d*<2u3q z)0aH7^oB#U6#TQkACG<#=Zss{qKS0P3(xhs?!VkTTzc_{R`xuMgON)PhXfYU(2|@w z;>sBwOet03x-G5RTDI{A5wAVrvbNRsPKzf!i;%}UDim!GdHgboI4#ydFs1xGN$K~z z_V0{%#e2m%?vH4$&!bULhCcU%08K!$zwB;FvWVA{zU`sfIU`y$$?d$CoXEymiy)Ct zD)sNgY0#5TC#hcto^zRW5ovbGW8?{SkkdbNu>rh`pe=* ziFRW5c?B7{>mt<2(V8PXG1oT>ot&`?cX*;P4u zkI0VnIQYv6o{~TG2_a>t|8S%+VT*RZN?~DN?H@Wv>&@VLWMuDtI0yEdN{RQ-hfM>uxbhxze%KH#Q$N6u&})*;m_I=y=qUuNHIQ6EU7lOAG4A!5G7yT}lK?8tjW8|sQ;&o;S;1DSU| zr!KZ(d!BI0Ui85~?u!mc|AUsz_UQm=tV~u9)0~`XGmql;DM!vN79J+8!K;W$(DlE{ zWR(r0&$aHl)sOC_uQj#_+SAvuAC5*67rH~>O>Z!bh51n)0eeUGDpJFY+UE6vxWBsX|mh~eJMwsTtUHi|m z^-HhdP!00K7hxNhMCm3@O|dkr+#rP$~ zvtqqXGCAwo+oDA$HTkg75*~N-62tiL4SGfUKF^C^SzpC_wZ6kS$s^b!YdTeU=U{V(@Y&B|At77jJvA0@9Yl}^5#As{O-aCjLw1m>4HA_^g zT2vKPw7-6T|G@jX?|GklpXWLEyyrast_oyI*ShbH04!&jawh0J;%k0Hz_J&ZxtA;B@yp_H-LySj@V(U^6*nphZQ z!S|O}vJnMT2BCuq*+})!V}fIoODF8oEv{Y`)NyhWvMu>CwP}FlOo=QHANRmuL zuSc9^jM!bX6@BHTc1?-lh3eAoG(I&>e=ZNFDHY~h;KVshn4-d+joEPa5zIK z+2SFRduw5ZG>9f-`Q%}ILQ$JqZNzfAj|?#Ps^PU=Q@Dk~6wjiP@B!$@;3+_?;fE}v z&4BXT$44M>qG%IYN*}}Ja!qe5ja4yPcSlhIc#p+Yq@I)~1Ro4}EQ`5&;3{UOgwE`x z#*u;{uCvAD|A;9IUSen-CgMdos-(Q*mWRfpUaLhS5!3J#pOAij99G->$BIqqJPu)4J>Kg`}?O{U}lP zI<_^%FZWSm?2ib|>>*EV$t=RLfY&zk&ro3B1IpfCuD_y%XSXP~qB4DPnmyvvdZIQ| z1EaG^WS}^q^R;{3sj-XUw~qbmV!^JCyw#1hTyyTuroPL@K2jx zf%n6l1@1L_auQL!+af9Lw9YCMDho_UG^-k=t=K|-^}AW}PTv?W)?ltQ#6@jSq=mgA z7z(X;vF&falxn%G(oMFZ6vp~>O&^=#&0l>&a#lqq1fy3u7pv$N6Ef4i5VLl(URX^Z zNhN1t?}~qMpkaS}E#dxC0{Ra?p25;bmVmXEW`al&yY}2Uk_4FggNsK6%ja(uQRq|Y zs5*PttrghLaJa^vEGc3mlnKHJD_vyl%ei9NXPci(!93&J&>sek-$#%UzG0MK|1!82 z08%v)FKtR99z#_!NmMFn#=6$~w4}6&%{cZy7|q`MgV1#iI!qP}aiii$5NEP@M{4j; z-b?w-G6A~(^Wl(p405dBaU4@_lub!Gk{fj>+DTRAoob*W))4Ql`0)jj_3de@NVg3Q zEsvXPNJCMh{5@${U$=$|w&vBrP-WbdBkf=@$6&eN5@#eYRwV{v+#R$9^dUe4LXc|D zatWNASuc0aQxGz{6%aSd;K#pgJ9N37-9~GH@su`}KL%2K1X5NX;x2< zHSKJnSR7Ydc9b1(BEDR&QtCSH6Rs*&m4Ea7jV|NdQ5okOezWm9Z&rpU#V% zBxw+HDO0FNo~fF<#JjeC2x*`CCszHit|z2nEFO;IMm+a4jsGdF4Ar4sD+=(m%pTyK zeY{pCmxPKL@OrdUTrXDlba{dg1jWt@u+xBF#fG38U3nS09ZC@H{pYzp?q`a$mQ4-5 zmA0nK+%*dFZ2glOO~wh8LYgrH2r1mLPQugB*YzT|WYRPs|2E8DfXtKxO#k^0LPO-6 zDB|T>x*zdoiUGgiWl5sZ^s%GgZ1_E&|H#XTl1ARwtehM~nC(gQVvN{{Z)%79#qA0_ zyFMIKvK}2dYU^$vgFL6?#p`5AC(@2sdX9e=TQnQxCA|9!@F}ts&wuHM9i6k}ZbRLX z6w&0kpbR)F9@_6#ceB%VSE_NkeZ=629bpR2lsBp`M>Jila{mnax|k0B3yAk|bgsjA zI&6`G5-d-RUscxHdbfVk=rJoTC8m=646k3gE8k!bZG&j_UeDTjkA{6jX6pQbB?SCg z5@H1(TdU%_ursK|CZ-j^7Wxz^O!BifL)h4o~%SQD=9c4KGZ{2sG?C!!<@ z?Q0yI?H-Nk5%_4#(1~6iYPxat1woOmj}uP{>kQTUqVN6BY`_>caplCPs8GG>cmqa0V$UyCfUQUkWsV|1tTc9@iu!r>v=3A-luWK zop6zs8ejP4w|h;yAEClOr%LMElgS4=bk&sFAsz+OHOOZstFzaP;GYlG>kQeCCAj9c zYsnlZEhLM&z}fHYk7>LFpMSrN{gGEXb;lTLR)q#6Dmf9DvO?1~rhdHw#0Fu4h~--w@ul+wH^8T{|{-6xsN zpeRQV>vvDP-Bl#|p5IG&plK&vjB^n4G5VBY&-^Tb^ZKBA2Lz!}B=Kp_jl^KN2Y#Fo zA+2w&G&*Z)&XH_`;ZolPYaWA$5gxtPD9)bv5mYAnHeTtucumgi47)?L#vy_D=$IUN z5D`1ROGVzv5#MWR7Hjlzi<&__x}p2^<->M3PqlNLh9I*=`R6~>Sr7m15-H+SNrS$A z{X5CFI5}HBd@0oulP%JH_lAjef(@B!zl3?!;M6pS=Xx?bL7P7_^Q%|TRerVn!8{d> z^$v4cn3uO@9eosayLXe2B-;2{P2#z*>x+`@M60HZ=Gv>V#@m(7%AuNi1H%w(7v(1G7pp4RrV&i$h?GAcLg;UQ<(Qy{_M|VR}?Tb{#$D z^T0$(lv)J@V*YF=KCrsSZ~*eTpWpx>UWadab=%_K+_DUuTm_{R7Say>N^kx0K#6{% zPy3&xWKdWU5pc&QX~!zne~ljfH4C^+_6S}j-OFby5QV6Y)h>tHIR8M4$7E(8GcZr% z88O_|abmvZ!XA%G1(!ba+*m&ZPeIR;B9%6pH5&4*JCNg2vqjpEcK2;!lGcK@xHy|t zWmcV~Ne}516(pj%IPZCoDV*TQ>@z1)w(#vSN4F^T$&vd!>Qd~k@=2)_s;au;yJk&d zX^eYwv<*4$<_+3w(j#dohd)ASb5SBxUs}^?AJBjyh}krUpR)Ht+$UFbf{@|utd-Z3 z259AUGO~GJwQaEkPx!men9Gv(MEgB?z^g2}S7PQ?o1WXgt>j_JouEaxwE%+E=MJ`x zZGrQI&JP6@e*yMI9nX0Zpf8Uc98@tV5A6D&JRX= zQ7L*7Y-vM=I$H1CLfk4^E_2C+nlFn+G;%nSwCF6WM^BhMNNYK3-mK8>vV=c>TxNbwe$5=U zcPg5p-~TIvRrb}CpjJ@Q<6m{ueSS33SH;W;@%yhG22H<`xGtbHIDCOeq9+3O>a9>8mgRr&A3*G|=pm z|1rmVK02!tN?&?6#2_1)N{rS^@$EKrM!L*N+@5I_g&GkKJEDeRs<21=Mcqb)Gkr!1BH%27W(kVUT)G zSE25tfOEvhq?|)=oMg@ZYasz#CJIsl;CXffl9_0|K)BMS(U-b&UF^d=vZ9G?>Bf<1 zZXeiry+=Dzdij`VZJyNd*>UhkPta&a*NM&r&lB`33)obV1o$=<~SRNp}KWSAbc`%uDOhk440u zCGlj#pd}VYkE#s7cPV;LgEsspS_TUxJEh(CbSM~tOP#I=0=POG<$s%k}}%L20A-4+D8d)cKv-xwd`$_wJ3`w5OLW{lr~ePBIOBZ}%j+=Zf9V!TN&({2IJ2qDwUbGcW}GW~pkwlq>%#LSQR&ZX z+wz$s!vaLGxH=-VJ*YQKIeRP-AiP+lJ1`k9)NB0(kc33%d$xW5$eA2%FiMd6_fUZsXqDV9Oo4=Lv89Dl_Y=&-nj^Zc5ELEw*uc z%gEHd24cisheOa#!jfD|&Jn>P&0Ds8ws5WBi_Zi*jmWxgvs=T&bO7@PoP$tCygM#Q zREi><#Zj%w%Ynd8B|cmOgE~eQSek72)>#j( z@j^5y#it-Kk=thy9#gZ+4EEw_Z06&ZW7iuD-Y)V9*6o^m*=+4!VfQu|hXozSE)zsu zH`GQeoYi*DxnjnBrEho3CAo4}JRem*^?0CbLss`{ij&aeKIwtI<)HHwSzQn}jf5E=cG~mY|Ra_pcHXz00LJcDcYxx{r_E z0q?sT+WVOvM;ol_(KC6D)LYyvRXB58l`yZ5hjA@;tnICoqg(kBI--+D$12lv`CsYs zYb?ZGCf2k?b=ToYD&aZ4auqbqryK=aZVZ-#0unRw$D;X&&Ip9~&?$??uwa-?xMN-- zTTIT*v?j&lg#GE-6cNQ%_ceQ!51`giUY|e(biJ;a-x*ZBZC1oWq4IimM$~Xd-C)WEOQQ-sn8?k|p0FZZG^;Y_BjtZE#G|Q4Qbxtm5)Btd28Y zO6JKkIdX1%vu)Eq+8JZ*FW3M>o08o&bl%DHQ{5*BlFnukEPGb&LM5NM-Ucgh%@UVt z8g9C)7P$LSXmQ^+TFi<<9h`*J{PhG6o29+{P=um)0a9pkHTrM#+>1R-Q45_>Wpe_`6tLpIgvk$D> z*k&bzgv&6nOBtS*J8j8&I)53pJ^xvZUF|p+leLwz>;VgD`c~Kzwqt!1YAn~$f zeXo_8(eW#Zv?8N=lZV+w2`eM0$%`~alm9Fz$Xio-l+7@3!4y8r2 z(D+vqH}-a@Zd3*;4X{DhWaiyx@0mn0FvVxT6PVfa+|}FR7?N?)3%l2fa8AM4Kts-D z4rn+kXCt zT1lcILORdgAqOS%(>p91>aUs68e7`IIu1pW`zV1Y;>B4wxdI49Zuq5;t^Z1OO-`~j zkDDW3H8zl2dS0mZ23hDSB|JV$N>U&d>mqZU-JkOog;cOYTGgZD3Vtph)RkA=^W69umcaq&;Cw-!P zR&=bvcHge`$&!hIv9ae3DaBd%LxrFJ1@4Y|EmvRZv#~>Iox>MVNK0^ODmiG0jVgO@ zOJNAVSGfzSDwf8&4qQE|HY@tBCu)i@Z1+K}$m8nY<_4!2jknz*sp^cjcp@8N)pwaH zs#}*VSpEWAd#4)Y92~nO9_s(v-he_|S5m8>9-TSo&~Ih(5z=KkILmJndg+T#-GJlS zh4|6mkV|ht$!h*^R%QFF*IO^3)I%GA6upj_j8eEZ0#$~C`?iO%6hNV~(Y42{o%Mh< zZSZ$yzu^HDDOptqpe;+|K=M5{Vny3P#xg^UHZz3w2Q>o3Y<8Lct(sbVGw|bqTfAIU z#yj0VyMW5J?M!b6HGU(pv<{+MweN=oPlkd;{B&;8K_I!HHl9fjlc4Txw4vi{KrB)B)Ui=VA z_3X$Bh8NM|>4iQ7gKd~>PWnq#)d_nJ71*Z4fZk;xPlo4K#H((Y`jdp zM8!CwN{4Grg!vcO`em_mH(+smo~i#{^C;+aI^`gJ}$o zmg2!j`q#`n^P(0&tB^AL-$+(hdX#>EOTF{M@Z`BTTsF4z6bJMTVL!#{`A7_JQp|P9 z3n%Z$75_9H2=`Kcv!JgHp04J}wW-wDJY`H+Vn8gs$du1|Hw7``hjUzy%S_I6tDutBMJM}>XBB1{eo`nk!@oxO!eaRHTy+W=qMg97!=*?IH zeZbbj!e2notYZb^20dk<6N$atIw}9>se9#?!-!WIq$;N%9}Tkz8bg5mqRk+s%=^J=?|;wYM5KdDy+3xFxk@X;Lr0tb0&GJUO^k#z?S)3$ z7)z(BDBpr1XKfanlBMF^v$UNH8A;07s`OAYl%tKQQa!Ei?7=*A7gwoUxgcDtom%8n(wkL0$5b4f?SaJ2q=KjII?9|r@z z*?ua@a5KoE$t9N@FZwn>%A@>p{JH!p(^x8UlyS|zaORAZ`5;+ zo{xZ*Sfsc-UslZtKQ*mntH9I#JXXl9|EE-@)NFtH?@`tYr1&9Qa=kgmJ@z*tKP00w zRd=y&rqq{d5ur{eOn0za8KWl0corIw;D+DNK1+Z+s)weD^>sa3L&mQ)s$m7Mx}OUb zHZU0}@#3vX0!0$&;;JN3@vHuZgf@O=k_XED`2pFF8LvU9;CLH)mg{L5R+T^nu1=$0 zEcKH{lKQV_1P)*ee6If$@7djlsS7JI`~_H!qds!Y0wWO|vv$Laq>9GC>NyRy1lctw zt<8^#q8rd-HVffyON>}kiaFH?_N8nNyOtv-DOty35o$pFFwVWp65OlEuylQ$ZVHJ(gUl(rQq<>q)mqjgJ-Q?~r`7d>dMHFW>1#ScZ)zHky( zrL{s#w=!$!-LJ(F57;bDuMd-Amna~OduP0`D=#Bnxb&KaV)Fo5sR}~d&5JG!-!`7n0qd4j3i}ztT>IfXm^3|HOqd? z25VDciO(sJ<3h(UJrZbA(f&2~%Ug!8KQcppGiBMHIk)LIH0XeYO;4C}D_=z6kvIH^ zAku-PYS3Fd5iN76v+ z({I>{&nQ^rG(jpeXI?;AIejD4xW{Hr+saQw8@R_xUh}A+HgXcELsflZf&yn%|Lou2? zO@JidjvFkU_9c?KE6m%SkR!PKK;k{dQ>NLS=I(=lCMDTsf-QH+o9M!;8Cc2XOLnTp z_`EeG%7)UXxtc$l!~5sMUc3bVi>ZF~zFfnHEyOd0>8QrHB6W|UX%DbrMJ_Ub0m)V$ z)00pkaYGdxbcpU{!}*~KT6wz+*}|z;0}@iex5I*z5lk#=cJ5yx;zSPi2w+N#V2Eg> z=>fG%RINC{lWdBnHAe`FSfXZeeP;&nk3;c?(w)^8{yqkU9lk)bCVmyfGqYszUU0rX zlOb_?B^A&FXfkQnTpgH;DB{GirC=M-P1+&P;muN-xey<;i?`mkq%TFqcrNDfSf-he zxQinohwI(F3(od-zAL>f%%5$WTga^r3Fdb>KfWwxs*E;*Nw|;1iYCwz%&qsk{YB)+ z-ea30KBDDG74g<{w0eUaLOewT%ts{oh5pACEFrb~$s`;kw& zj?=(vog3o`9L(&+U=n3xr(~DUd`b=5>pbPvPJl(WlMLH%M zBeGceD>J}KCm%=ugfiP_!z`P7Zz#X%g#KaSj-=XGMofxYO{>DJ&m1oEF`8oigepQ6 z+QR!VgNDQ=8gc0)e@q}YWLik5?+$Y)@yQ;rJz=jgQ^pI4Nye@d*tCrt12(`{2`^cFVR>(Egpi^^QHDSQQWI;| zp=S-*Ckd_l{%6nm0mu9?_ayyk3(tuNt5$6DOlrfmZgiH~mvHI!m@bQ~%fy0$KH963 zwwSwU%Q2$(t?f76pzX3}7S&68Ul+6B%lp5jfL|GV(w)-NY^V)4eEF^VjVv2rZ8ASV z+lqDFaBEj9DZ3~AIR!1oHqq_{9ZW#WS;t8yrD913jLsI1+V;CoafXW$VUb+#(+7%Q z9TU}=VEbvY95^4@aNnRck~l#`|b$jBC59Rc#YU5i)TYqOSK9+%0yp1sj=$ zvi&MpnQ93N>ehx^e+|MkL;CPF-jptonK@o;dpDV!CEy!#@F}JE8zw0gqiMcF$plNC z+JNw<1pLCxNAFF8=K@@o=5oWN(m!xrg{L|l5#MHM3UYQt0Ow2hJZ*}VQ}<)qVR*9$ zrEn?3Vy+25pG}*;@sgL`uVSixFJTub?G~YVl(~loT7hn`+qhVPvdNd0^e2W7#@mIY zacMqaxM26&@CCXRM7JlfB%N!IP4p*t1RneaghlVNh%;VeT^|uDaJt=*9BI9>bRx}$ z^zrD0sD1;z{{GwTHgCPFpB$HGX&b{ye!G3yxeKBKKYFdDO!5fKUa5)Q$1x{Oqib{&phuZJl8D zmON#NYr0%97(W3Unuk=ppb+Vm`xyl`QD(^^f!KhM{$8*Fv=1T+L?`7C3H#s#h zE63eQ8cBcA&z1XGN+3qBgOYc~gFZ^5KapOeF_rEPTa9}2kDs2ay zrG0{dYxgu5YZAgBrLtY5*^=>uar)Zrr%ho1T!LE$Zk{Vl+koH>zBue=mj& z5C$DB-|F~EZBa~p`3rze#=28vufKZI+R5exm&txw=mlawiK$PZ`8>ivBcDAg(dIs{ zswrbuN4DpuY#x=_)RlL_bI{od6$b<2&HNlv-}4dh@7(v|UTk!?tW#3c0>>_x{iJ)W zjKb@fSF^^oTv?pITMvihSyU%&#YqM8Xe~F`oCP%4iamQ6iCfJT9fApRW>#2kE4;U% zvXmq=j1fC8lq07jBg-^_?aXnC5b$o<_<({WK;+8YPPW9JxV^`6q>NyV9{%E|O_gG~ zcg8Ii&+6jtXx@dMHw+!eZ2sAelu3-h0#||{1 ztw6Fpq|O{}=vC4N$gQv*=T6)z!Ibr`SxY^;uQ3b0_@4p@Z~c+Xi5dN%d}G+nb_}qZ zAqJ3wC0F!Bg8G3hkwaL9UU8>BbdeKYC}q+kM?8#z;$~Es?RQr95_`??=bTf)Ss0b8 z5+AeoRU$)rk)4FHfM~78WqSAVq@|(BWbInmmi_xr_3kaoNWEvON=0tyT9v&+CO!+3 zzFeG1Lbo(~QG&JWK#C;%q4G4O>qv7g0;j7>(_Banj2?*+X_tL)dI%IDnwaXpOz`Nb z$?Pmxh)Tbcv6rrEZluewj%z&F6(>bS8F?Ryfo+#;O9Gq`TZC;;>m%1vsV*^|DQu%6jNRkWnU?`S(si-#Rvh)ZT zva#nFakHyS_KoMVs9Q1lnCN@?udGo%zhm%V#INT2jEX?5G1>dkh7uWQF@hAQuM0hs z<--FJEyz#h!LJ=z57ofG?`gUC>$*v2$~pj@~FvS93nM&WviN2Y zZ^6O(7r;P*aNNC(iZ3tyOw%%E*%P&V0$Le+VDqBH_w;i&RaGYg)S2Dr{u}IDF7Jy3 z{|dMjRlJ+`%|%vw|3uVzSy7+=ZQ{m*GnVHYI^6h2sQ2mK?xjg^4UMI6Re7p!Tm(CX z=2;spuOl@fF0~4si^8Iq&fb>$;a(ODn2r9uVrhnLCCLQy4uV(jlqf!Q?A(y1^tv+G zXvvi(KGC<(p(sd1_y;lO&7()3XsqI6XC_ZrVv;3Q+^;9S0j4YmB*pG?&H#WhGQfq}HY}EZ8)X^qBHNG()_)04zcLbvUZo z4ZqttXAFRvnHN7!w^leYpJCJL*4;6r8Yo?Lo=7R{-_RP}PCE38 zqguI8{H4+#RTC$h!mz&pV~z+pFWyy7$8P%>%2%sf;zEmSHOaMO^H7y|Lh5dFhc}f4 zp0s~}Y|ydW>IIh8aO&(Sjytc93#u^hlrT{8iU{7m(kdcwQVmt?V&I6*s%RuA8Z+6T zsy;_aNd@9f@EvSyLF>!{6X`Qh&L92HDeM9~TPbX*0xKx&29RRAkm||&R>mAbcsEcl z0IpPod?CzfYvUwACv`+-q3Cu58BOGn9us$ATv0~^6|6eP=%PJW2am~0EG`qsEsYCa zU7&=fA`2P}`OlbW-bxI2{FlpXtE!;P996?ZENj?*A@NnoU^&`oq-uu|<5P^Q%8H<# zlgWTu&G?r?uKgw3(~sRuaOtv~s|Oa>6N>ZO$MHt^s@^LGYTsPOqOdkdx>i<;)3qk$ z5r-$=bTSW(Q1TR`DFTR0V&;pMMW3aQOwHZwEhv#74itaP}^OeS^T<_H7Zih?3b zntBkX!*SW>vEr7aq{>TDrhb2$CsO2+o_Cl72^y@bIuC1cKfJmhc@bIigg_dn-lOd? zKo=I?F?0(D)x0=XoNBS41W|gK@vMt&%Ck|1pYbcvt_6vXH=TAj>?M>usn-nKWiv*_ zP7~qq4>1(6 zy$?{nDAtlU{0r!JKcbCgdj_rIII<3_qfv_VJJls?OT| zV*J)m!R_q(e?JIyOYPa|ZaY^K<4z!m#!F=P`@2A@ zZ`vm#6SLdrokiM>!J2ZYtXl}9@H3AL#=Dit1~n)ae!F?Fe)PhHD$sGOTw{MKaBqDZ zY`ml6vjt7C7f-vcZs)V2*^Aw|*|^ z>5X>Jqj0h&S|NgCWxx+39rw>2+~uPO-Y3#2))t49y7M|mkwxsUHAhP9RXW0Wq*=Jh zGqXjg>p};VC&V?Eic*ypG-`zm`6}ph|_oj&*{%1 z-g<2eJ3cd?R{MPOC(gP@LcVT@Dtjj4SNuesoQ4HzE6PbI zz^~%v6iFSJr4Jt@@M=7)aG-uX;jzwQ`K*i_oA+H-E&~F%7cywbNotH!|W25gM>2z(@{uT3I=z z3)30bwTcp?m4GJX5saFx(oaW9{3B`|7wLV9C=-6AkZ9)+Wq&Z@f4RtXMMRE5Y^?ifuVZ&X6fOieGoMs|xj01sR+Ov9)0 zvnfhTL?g?Cj%h~yM`E2Gxs4aTJl%>q33eG`G^s*nZ1IMOM3o7;`;tv}*N2-yJ|y_n z`1o`7 zI3lH@o+Uf?F5`$z+2NXOXk)3W$=EO(m+{@U>YV9wCD{^quON6wHX4eWx-$|k3uE_=5Ey>%~S8D} zOHK_uz3`ih`y;67)oyo~4sCueV)mEW7*09kLlS9ZT=o2i$6hikVKOAcQh{0Q&c`l0s6UiDt?0R&yNVL42OS_BhC0C#$#O^h;_}NAMtc29Z-vz$A zp-b1};7WtH$s+5?seqyY9-?Lx%I>a26_~&WE)Zp8)!xf?GAGOdPpI z0-5F;cz}bQkUzO1hP1%uf{jX+g-Owj$3(A3EvqpYIGK`xW==@0rBcSN@oBtfgi#e$ zxm9L*$kCwrHIxbVHQ6!o$4Pivw1r(ZS<3lFSGGjdAeLhS=q!@qJN!_HW4rARKZFey z+~qp$e66yXH$gQ^ww94sY78j9!+Ve7H|w|cxBs0FZIF$27tm79udMc-?DIsAH>mYK zjLA+HXv*>;u^?k*fGFWuT;#NKdztJX*l8e>YhQ1Xu@7bh7|$|pU4bIBm+6T?1_5Al`B44{wqQ(i4?uU*6N>6J4>(xPQrPd1$+f9iw;`+NjgMvxg7M3- zr1deR_by}ncTMd-jZp1k64;6}RpcRuEA84&HW%7*F4W4GCJryy6&f??e{MKudiyhz z1-2nfg0V2cA`*%h-$ka3BdhAU!)&$y?qHblOW?HZm+0JeF_yKx@x8Lxzd9U?haQKuxu zzY474k}0n{+W|Zu&_#!FyAP}HqO2JnaLrM@hO|D-g+35-@wyvY*A>7yyqM%#uVXBdn%+`*!Vq3i}apRS{ zE1;L<;xf}caQAf?L___%jh>(RD1oUeOXlF~!+4fK$axalot7Rxu@lKXu3v7OoW9uw}~ZAi8Vt69dWtUlYt?bM0aWl0fgr__Q} zpn~iJ2;&hwCiPtgR%COuO6ZoQe)@;6K61%|3n9v;A#(#bIQT5izq9H2+iws&aMS5DAV2)*cRTDA3Db9Y=|mQlBcbwjl+Tq!c^m z=il~WIC2?nsBd+LtpEgpbu(P;{k~0juSYvN&i*)pR$*lr3BX`fXjDIoEi zQo1$aFJL{VhsaCC8T-=O?}B~o^IBj*i#`7OJlpK>*r~G7_g8xO7JV*i^R1^juTn;L zcDe`8F@cGY0(6SbXc-WU_ZbkH*{7W}KmgSK0ya%Diz^490Gd13SQsMcPS(IM|0}mu z7P?Q28xt?_B%LmluFXfVNAebrOJe7s0_QjUZH}{J5h=0`)xR>JuCyt%^2oQ4x^IH= zzJ(}ewa*WBq}T4^4A=apU*JfujWz(N5@1Q}%%?NeI|lmI27L>0lv!|I2cC?X_0U4f zwZ3}EBu>?*c13p(E)dCdc@dcwx1kx~9QUJB3A!p_EBiFy=iq(P6NSaWq9z{6Y|1AH zcPp+mX>Xv7_ifcs97T=jshNbtit{^AX4BO%1aor^5QS)vbV z1feF{k)^3Q(2i^p-bY0Me3O$WOh+|1)i0dRSZA(Sh3_dcak(xdc4-7ADE%Psg}!2H zs9JsE7eXFiiBSIqpleN{alDN6F|T^!_Ubvp$@82h_&#GAH=R}i5|ZH`ah_rnC@Z#R zY~0&8cR?iW2X6eJrG@riK*yd5Nr~q!r&!zFbQ2Hg zPB|7~)|IeV8m};(e)h9eVxhBtXgVc$#vd~l^^s!&a*nml!icI-NfS@DiG6PjNiYJj zHCCwZfN5!lF&Hy=H2PUC!wI?s-NRFBId)Isr#nN|a{11e^+oVsK+0Fw{x{x?*M<&4 zV?|wZMyhy$G|Z^$?v|@(O}cL=ok%7UO;iVC)o}FmcCKN^OqowpKZcfp(ZHlN2SqJ& z@Kt8=uX1SQYhn?iHT7>}_x}PYKh?2X>9m{J8@KsbQNFcNKLK_mx80<|#-*0`&D90ClYxq#njPsp6(h{7+q+l*fb3p=jD0N(Z6g6P>x0zN8{ye z*la`$NNzLC`Y|S?T=T-*e1|?D?b1yNqgVHX-L5i%#ioc2{2`$e$3+gTjE4vnTp+1l_#qF^+{oxC`8$BN8-{(n3Z09g* z!CB}3N(E<9#JMWcg=u-xBk6IYEyL&I;Pbm^XpQZdB35WT$>lb(@NDY#QO<3`^ha#J z1O1gPR!ZycWe$%UGG`? zRD3yM`bWryIbIq{!XujGa6QJCrHPZ8Nb}%Xaf3@M%D5~^F1vInK&*To$La_*V>paL=jEXQoYY`s&)@7)3I&C7Phn;{b0 z91S^#j-fN4-o}2O?+$5LwGBVajWYUBpbJbP%`d7WQoNci#~JLbMnFLS0?adg+pyGh zdK~XqEDu{3=Fd++Yt4N9yk~6xFmAwd4Rsrul{vNO6fyl;Za8O4u-)Py5EUaSGTz8GQ{n&na%)^KRzW|wOqi#qcnG5an7LQ^7jQ0M+ zE-1{1i#OemO@MyHD< zYk3*jOk5ToyTQozFM%UVeiB)`_n)7neie#mnOG0SCP_u{=~%K!6^%W=PwZs>Iqr|^ zXlMXMK)S!Fv!DS{>XJvPz4?#+lsm1Xf3`arQjvbxR*@8wfB-zY4Jy*>%)2yU6Z-A4 z04;?vW-X5p3cfx6SxD+k?fsTmq!{H%k+0A!w?xIUoxod;)xUte;q^x9^Q7=;7RK)P zOLH&!OWM#@lDUk%sYpw5OigO|8QmuXsC|6X=7>)`Wf0?W6{(_aeBV}pnC1hbtq&`t zminv*yyNuUy+VSRH?J~v3oI_gyk%h;(?$fv?fC4er6Uk1ja+l~?L)d;y{ygh&(em_ ztjE}r&{6SPPrj(gqH5~q%1tGKCwcu2ZH%qzf?{P6%bHShmJZTWLg!kXiJQYQ1mTv} zg=M2dT67G^x)bZZ0TS28JNwptDg4wbFeQ-Ou6X}pcC%aslLJ@UNuU_jB!2WH4py(VusuQz>#oYY{c zFjJ=!q_Jka`IY6i&J$}`k$Sv_P8NJl`8(Zk&Nmykp4mRo#w51sTzg!^T~c<4qF&N! z(UvKf`IgOEu5AJ@cvXcNUBzs~gl#FpW4`$+!yT=#1F|%<*Ek&*Co1VlZd8U{F37%R`cOI{2Y&a1y8=g+uK7f1Ak7R( z{#8O`M_8>>*9}y{VHF9^f9NR9JW&%WOYK(WS?l}-$d-A*`>@l-Jgf9DmQ#EB#ob;3r()hx_a<%GFIogYT&tJ^3W>`Xf| zcNnj@3)Q{QX~8-CLh>N8x5QY>9q4$$?;#{h6g__d1?X&Qn9GntJZ9t&)L&HG@wgmE z6eWPQEB(TFBsILFwg`<4ftn9S3zr_s5Nx5!37u5L-ll3Czi&5mDVE=eOfUR?p6rt# zfhYn~c?5Mo+NW*opdL6+cg)-{!%;6b5FC41Oh)I(R4LEIG-;{vj^8XLnKP@ALkt0j zj~l|bJw-Q9SSpm$o8;Dxc0(B3Kgy(b*sub4&iYXikr|Cq?!A%okA$FNRcFCG&=HS9nqUk-(eyfVgBAA0!gWV$_{7hQrsdDyST1egMW$9$*F_Z*>IwTOc z&%HUISL<=AuFjltB1c6e*b!ZzZO7VTY8oDrndDLt?9i-RFQC=heH$IIFy>n#yKgY< zH6@Bl)PwX$9|F}DtNE)0Zz1Q+Fb)D{l#iJ9Jl_6PLTI*YjnoHuSBi4W&~FDlOWe-2 zB?WIn3`4=*O_?G-k%*-aN`V2PEjdH4UfG|B3hc@lNI^<8>G;mbrHV(i;Na<+-v{Qa zC5DdJI9yHW4x;cutWjkYI9Xqlbs02(zttZec?d{lW=V3KX#1`sH`w{1P;0mFfUl_y zqU(5B0`Yqzdn=d))?umXYp?um8t^7?5oz{rE+U0Ik_8vQKJ)GFmLSz&==F5g&hq#{ zLQxJ5f|6YQ6`x>2HFM(MPuwOC?GVrWyk@(_vn3ER%GW@f-!=lj5CPbnr%ZgqJBhuV z>~)>G3#%dSBb&fV=?>opO?UeoKL+s!VssjGt91vja#&W+7@wS6S5Q{-=Q1u`9IaSj z;0u9oZ$;wB0n^I3Zf4&crG%iezGSO79olW(Zv-*nt=Qx-;@lv}72|}l-rZZo$E0HO z(MaZf*HfZInx|;;M?%EeHI=m?rx23VUAi^ibbT&MG0a%pp0p7ZEzoK5*>VIcP+&hS zNHOX8SlRMeH6q#RaH#|0dR0TaC8#D;@$D!ii788Bh2p`(^^W6rI5_V~k49tRI^&6Q zAnR##k{jE7Nc&Vq4Pq6@B66PL-RhQ_b&*i89JU6oyM1?KS+nym09DXkzADp1pmfuJ z^iDMLm<4_1=Kc%07?Ap0NbzP)@-vjyA<;35Vlt_^^mj3-Wrg=S!67pWpibv`8e<-H z%<~~s&`e?W17zrZ2Pf4~CVWkZOlFVmmhFZ^%vbEV``4QW&5C^4Fh?DqgwS8e(dp>m ztH~FeEW}@5L@AZgvaJ@NY=n$(D0b!MDSlfDD!BZwjAZ5X;t84NwS;=i#-Cs#T9x8e z>vtL0y4B%Dl5i@S_uZ|O$sINsMMcd-s+#@^P6zy~ZFdcfGI{&G6_tWbM&_lMcPC4sx&H8fGDylH0 z^@6m*bsANVsYy7GhdtS35UQDUi>pwwALS)7AEgEPN`A(v7YYa_9fy+c9F1@0;Lpb{tZOr5d-zHh)AOT2sAhv z2?N^9IDg#j?gY4Q7_-sBgLU{dRaV?tc6hUmA6Z2RXFosTcWZHZeviN*^v?#MPmtDH zSEI{_sD*-jgZnY#3Ng9ft>p5*Q>1GHReFDADjh>OFnV%F@vX~o)x@s`RdwWuJ{OsR z9<;(EwzfOxEG}3o-O$M$ZjT5OQk7#?sP$ThNZRWeBv9&7DvA{jPbl{KgUv{uy`QQ0zx*RUZ|li%gb@bcM4J zYtHh?2}lX8`|@))#&pfS+a`9>>J$D>wzFqt^Jx*aTzhn35v%8!LZu&$cvxy^XN6hw zO>`0H9n8j43|c9hTR;2Ibk!1$$YUi{LU%SCi`la*-gIW%n(_;p6;Yaa!$M?Lae^K+ zub!m^_j{6<-miz{2+Oc=IQ7dj6~<14F}TS3Ib3EO$~bAYMkSOC;aPLAXpohSZ5#p9 z8@%y>j4YrA$B9`%3vOh8o(749F5e9vUpColNQs!{5hTmblx|5J^xb2Ia zFj@WHBTbYddX<`(>C?B~t=VD^X=$EZ%@Lz|!$eG!^%t;2%Va%Q64V`hfzBvuO<_sb zV8jJXFv>oNWo-0iUqq;P$yh`(*w`f@cSh0}TANwE=>qRKMwY!M5|iB6J%+gNxP$ix zDeNH)wwQ61CqIOrycMDdPBMRI+p!SN{&Fkq3lDO-dif{xOMsyOpI58ZODS5AlcQ5r z7F|@vCf9*arcr12_!oMa2ESs@ZL>!;A}$a9~4Fu+~IIXnt^Gu zsA|EN<$e@(WCndhf{nM{dax^Iu@MqU7U=4FE}XpLw@)O#5PkOVbb#jSzqf#!H`hzf zBE_By+LidV;e-fox5Kdz-Oa69-4X9|p|uscP4SG40r?1N)|lB_zyX>l$`nc0tVfnh zI(4a%$+0nv8HIjMTdo?yozG*rt7pGkwN0puy3c=-jb?hWBvW+%LME$d{`axSOCQu^ zpmO3c8;(pX7yU^Ia*Ux5w|?Q?ZgE9p)m zvm6I)Wa2A_ibIQz4p=gKyYS)zxT#`KOn$XqbjGRF;hQr6%+))CW$L~nj7oeYU2FDQ zp{T8=;bZh@p|c{MXa24%$)iH`{48MvMj`RUJMH*w(%Yb(-8orpReM5G*`0{ z(SJo!m6x|+u2nZA58nVR^9wvV?<{3Pr+mr_2OIFc6AAz;T zxFW#CnU0_DUdo`q|G-&N1;&jo54(^0Npa;qp|T?Qv)9!sOT4U>ONA+&9p)rDhQFH$ zoLe1v`Oi!9ey6PKqAObGBXhhcVt%7YK|m~Z)Ob#{2ImMc3r3<_^Db*ur@_8dI?T&= zVz6JNCZJhgPDI5APs8A`Gm2M5>?>_0DN!yyPkPE9hrC_*^TsFKcTk0EgNQg_RUA{N zJ4v`W!2&E#sR)fuUdVBAc;>(7+eB-T`~|=`gQhA--lRWd@_GKHo+xbfJ$Jrqy>7IZ zbep$hPyH6H#F7y;7oF^|+Fq}550*1erR{+IUUKuKReR72nS{&v z(}7ZN6lyGXlIP^5Q|&cg)CtHSQ+z5<8F*>!T%eV6L2BOf@XLn!Hy`psoegLiE_gO0 zq5?$`#E?2DlW}~@d*j`2>pb1DWT(RE6iMz zyQAZ1XlBSEU?C|7vgR(u_DrifBY^SSn^(8Ysj0sEy7V{=?S`HKL88LiyN@AN@%E;1 zd-qlotztC8?H0C?8s1eEYCW?=20~W(CU(^)peplsR1T|UiJGv?Wd9MyWz$+>Mj?`4|oZ**8K$=1tQqH(rjrMTcL zju*isaa9$O8pYyuk>Jz?ay6XjgsJoS<0b9@-PtW#IeMBXq5cMxMY@_+i-+Lpl-bh3oA|QD zHipV@7#B0Lv0~O~9!i!Yj7#&^=%(c|DldB<#msr5&(l>Ng143Vc~Jm4riU}8MEwCy zUJ5$(kZnLqaa07`aK`0R7E@1sjGZo_%JUtAJgi1_D*K!sO~>=2C&ev6S^jqprs{@@ zDbI}xIMaj3D5$pi#ayUJlN6SALDkh>gwcj0pZMnWvNmId8Pm=7S?K6G7QgJ#-Ppsy z|Iza&)9NgSC~WXXhor$c{vt8gH+y+eo%!W^rC+Wq7R*;h)vo3?1d24d1M&ugQ8ba- z)SchQ$~lcIt2g?3S?|yZJ885>&ia=pB&?yY)3*FNPvk>H1g67Z^qWK$7nFZS(XM)V zL))>P9#?_PW!jHrs%Nvc%`EPEVI(beqmu?w%> zI^;~X@s{{%9XXC=Hn=Xz`uCN`85Or3F{T}nyS~R+%q@q=QijReH|g^(k7xT?t*BMz zC}zRzV)+ADOAO1XhgCJ%+`rT(;~V>4$dbgKf83x+&8r6O_Vi4}RZGU+;8N$!7I&eC zoP2oZ=gJBD2+A&!9E4amOWFt%{$WZvD|I;S3SwGwVG2 zDVEK8idH!G6s=g?!KRH~y_Iv+DKIzI(3wbbmSH z@jWdklr^0vpnkymVuz@GeuMBGxL>~Q& zF<&O-scN%5Kzh(2xu}$SbOblA;Kpx(_~!oVx@o%_qnjqz9D3=_08< zxV>R8)|it&l~2hFp$rc86fbCD&qZZ2rV2FLzFjPz_O9;kLl#lE?YJ5?yAxBd|0)=o zq#0FVA)Y zvb7~$X}SJvR@f-2{h*Oe$Gv(7O0gk*tkmjz=eA`&q4qu36CBWSEc7gPw%|u`XMlX^ zPo6Zp+4t2vxxd&^v>R*hFvQ1FHF~;(SdJ+h=^7wMIoK){iqq7!bkN>%9&kK$T#4MixY3QTCKnV!Lm8 zX!PsQygb!Fu%-1(!Z4JY)9H;I=2yB^6he^xgrbqYdyIPRbWL@NvxuXB*8R5Z?d+Le zo31rHS(hS?9Mwv}d>@pljQ(c;tV8n9g&zQy#nsro^P~{&E=$)MYd%ze&wHqmcS!*a zuIdZs4U*V~^D18G@J4rYliFWvaN@9NBI;A*1PR>sE{hf^y{x~QWHVOJTwK^xWOR{M zs1`Yg2P9Y5zL&p~v>#qRaK8pT{dW58k8Bj%DNTh{u}##o1(oR~vR9OBg@4>p0QY3* zgZI&{!P4xmHa#DsvW1Kch1cdiw?lmU;~7ghX0FHEC8(*_KXy|kDW1wvb*aO*#cC$a z4k-)1@otzawDToIMPsat+!bgpQa`9~+mIUZ9!ZxQKYP!du@;8o51)|fv{3yKW0+6W z%yO{>^R+eaPo@r1!OPCn9My{CbZvqBPl$l~OV*RpH1~{9m&O90p`*`zcMgNqJ&EF~ z$E{HX1sXk8(uFJhgyRw2r;?jHrbfIC5x@hnX>hp-NZ-tz6=NdPB4lYkENFvtpw?+g za>&f^L;ScIEAU)o*m>M>uUk8O&rV2lsBNi1I*v%Pm(hcG%2P=}*Tk?bG%!Rmz}Ml^ zivWp#d|igyPNZNEq*)0)6U~D2eqTDJU@JahPXx&i*53K(ufg|flazaBAVZGQCfkAK zkpL@tu=g+)YD9exo*5rTO!aOu@A&=%Ddn2C_9dPQS9!>01B&VQPM?x9vIX0kdjHDw zMTwo3*p^3axd}9zJFM}$zmNWuNyd80sD@>jaH`D45A7zx8zyQj_wPL;6jbnCl6Y_={$Gcs?HH9vau8v|`Uz4aG>G4lSU_sPH1>dhTNQGz|T zgg4qCL`A0hl=vf3Fl&wKPUAlv=Xu=n&t?36j$$uzwDHkesdzWW0-Jx2b;k}(E@JXB zdTXB+gEHHLJpNGBnluOgSbboHxAC)KeA0Xcmt)O?`DWD3>9GwW*9Ksy!f6akZNIX* zn=5OdQk5EU_s6UQ`z1rCD5M$HG|AfD(|F(kUo`cbGnJje6KRiXAhtG3G(!$=ZPw5l zXl{tURUM+h@NKh8S~AxkqU2LFMEH<=M|_0996~NfeX2+VD=My1umq&UtD%f3$!1lGg zWtj4{)vZeIVz2FPVhQ;eW*345%FYHCEi85vlr{iAM>)Kjcu|sUsD2WnrF+Ohke3&J zr@crqUFTvE@gLNNs6E11M3gt|Pu7G4QZTK8m!ggF!r!k{=y}}qHqU?zfWH7^6NXk# zV1e48X4Nk~{Vvk**q-0%Ac@c`e!d=i{=F{<#y8w}&fgMp7Z{n!ik{;qTGB*dvgx>& zqRstwAA8*eVXmJ1Fphyw{hmin8E?;%%0xa!u{tRgCl#u8HkZRELnLH|_QV64a0Ao@ zy5bYG$W_RsJdDeeaiPww-s}(K8rrfL>XRhNmE$JPjyjel2CARj^qf%`*spKu)Z%Wi zMSf&dOJWo&9&lvF4+!{b-ZcPx%7K2eU474q125&U$jS%+G8rF9a%VGGm=Q;1ZW<@0qf27%ntjPG)_e^XDTY?0cdeRHVbNmxrQD6siGz*eJV1DH{KFiw7^sZ_%Oqg9?N1j z+G5*fbGC2+83p3qQb;oT*%-L9vUt351)jb}8k_)H+Y(620;gm(OWsLxpcR_e)f{n2 z4;PJ=d*hp#LeW`w;OYo_cx}XtnGD}e_b2B?t1mQCWGUY7Zlc3_TOaM&_nls*^4Lg4JQ=q5*HdhcGa z_OSM9dA3IsPVG2xX=c`Q4T8knSBcnR$3&4Lr9~lRZ!3xyn#m5R*DLbF*z=-FxN|Rp z<^BS~rKR=SQ3)X#Q#I?0Z?H@xv!MrnJZ&g4RSHA+(H*P~5>7;sFT5A0Ox-xj(4^8j}i0lKD~DdEtcMgqGq7AZR?=JJ`1 zqw86VjhwBM_$4FU9g>ol2zQlZ1zcr985AXDD2+uhfGKfG`drWuqe z*e&znS5dZ7YCeIp<1w~tLrAU7*!YuOhoy?bRW+zy5Vd0RiC(Qr{z| zEILwwk=o-F+mJFn6lm(vJ_#qLSFWT+5rHiaX3eu*f8-x}DI-4v4_M;;xBlF-Gz=k! zhyhXYqgiB8nJ@wCx(FG?`i>5fFD!KN)UU3zIzEJQP zorX7q0yU`WsVqq^5>hTu6o(|379(ZNoCZ?CKSJ-oQ|f8ei~Fnxigwu{O-no*pZ`=; zIrdWDI~MiXgqgOwY3B#0rTDiIBKsGOTofC0MM9iiRNJFkXxX+rEWDm?;svX_((PWd zCf9uQ5PVRLlO(I$OGnuiMg$wEeRb+N5w+x&esoF|T*$R~avTE9N9SP6LPQrJkxtdt zWtoly;24fZvq4A8(uXBVOby!|Vxr;fsJ&*!^G=E`0lOv2le$waXp4k3rt+}G$$~Y( z*$-?jVzDR03NWf#vR$I_$7W*9ugHC+9d$jBpyME>e=HK6%*UfGIi4Ytc?5G#teoc% z(i0@8T_l&olRj0B2X&$ZKgV-Y`f8hSySTx zQdjcqvh-4?eL5~3hFw;Bi_YOms)z$jC_h|+zbkS2FMHro4b2WgHXlk-DODitXrM$E zp2z8k!U!Z)(XVufzp+#&kHdjp$2ORIZIUa^J& zJz_VKcxXvR1a|92G`l^RNrc(NVzH!|kYf3mxs_vsm-ZVKWsGT+$R#qFloG7NzJb=- zgo$NWu%iSL4KD|*&FM4`#cHPv8GXcG2@xqbtNIsG`7}w*T$}tkNqvO%$21X_B2)Or zwemT8xU{H*UqXI9BNDHei}UQr)qndtDs?SZ)AXQ{4!lF=Ug{~0oRz>k@&Nni&QARd!0Ll0+n$R?UivX3D-z za&EW|zum3pSY4ASBe^?4)C#-F z=gtbji#wkzg&C))cy+!D!lbd7M7ht}>sQ6AC* z$oKmOJw9?L`INE{Qp7(r*6S|Ux#Y0*C=k@pDCm1m0DV5`A1QZVOZh$%nZ&wa6F1tX zshP~W#OFFYoEdV55i+WSB{y?lXP=Z|K}*>AGc-(V;hWv!xOGLbID)w&ERb65z*TLe zURRvCb3a9iC4813@}uyoFmMHS_$TjUn8C052h}~l%i?yplH`B%e#U^MiUMb)vqo?+fxgw|JrVCud5Hr>*j9%RH0#LX1&91>;k01@RtIYpchh zY0NZq71Mx8jwDiJ*`%jw-OKJ*ntGe~o{;9I0bGQ1nJYJx1y1rgfv`4CM-dUs@Qz^*I{gE1ToRTl0&^6IR-5AnGtp7{$SF0OURg= z;JBH?_j%3yDGKuH!Ei~gF7^(YEE`z3Gj(rvWFhew|A^l#@Z98W=Bul@KLTaY7ySy9 zAI|ITo5v=+18Wt_5n0x#6vx;1H^KIWiiMh>+w9&-KLr>oeiHs9PyLfZU}pa0AC^|f z9EMj#Ko?XyIi3&NmyQUbxn4c zcR{iTeD5_9N#TEZdZD?MxwR#pcB$9C4tzQx>HhZ&$3no9{pk{sFmkg-tg-4wMUf#* zAnXRm?O5B&QfEd}EHj5oET3eRWuO-ctgvH#wzp=(Thb44q3O-ET^x3*RWYt`J>{jj z(P|_BkK}JhyOR4nVXTC1kv!QQt~PbgdPuP}0yY>U&1&iXut7Dn8s3K+Gnwc1H7mf9 z&wrf87#yfCb^%+{-4_OCZ?vhY3RyjOui~AHf94!{|1Rd5vHK+SG-?HggtJ!IU9z=l}m11?!t2s9kB;7!z zC9R<{RsGDC(Zjxmk zhKy|Oc=c)Dr#hLYOX>-(1_;POjr^IEQI*d1I2uHRw>bCWju0}|3 z5Rze2maNxbWOh2zO!Z~8N-Lc( zPxkKj#3SoS)|}*Aib0z9fiUKSr04YLcwySn&%0Y{1u#)5%$TuR^rM!n9&AT`hWuL3GCT$57`UQQD z609kv6P@iEIRjuc=Gl>rUw<;# z8Z3~+NqI%Jv%?P=y2TuK-i>JJQP$lTon6v{{v2{f6~bO_KWj*|kl4I7^%w;D3d}D{ zeJGkKn$b(1HzYP|#b^N);5e8_L(}XU73}gD$ZiC!VmsklXqgWa&mhWkSPwR7RjYI` z9$VD`xfiETO>j2YvN9jrO?S`K5WmxnHG)-p$&*?yMm6JLbEEijt1-*gyPMc;_re=Z zywLe&ra6ZFfpvu?Bzd_Q?5bKUWrnqTND!`COPYodhVBKW{HJHrM@Q#pEMi zFP_wYxeXcG+Rood>yl2;$25UL#1XlrS>?|dyS%zJJv$g`Xo|dkCwH}JJvnL7aRIjO zG>AOe8&4?M;2KZih@^cxq(vC*Fd>8ij#RV*+zP7DhUKu;4MM4*icic!oy~*NkDy@Mu{WXGl+X}L@M+6`m6XM zeL+c-yt;RqOFHUsjnAqnTZ-=#X74%%Y0ENpxYkg>eUrj>RGeqQ)4ORFW!-sPcexpL z_hT!jq@LH9L}%Zjurq8pah$9v;qS4dqQ=SR2Cx77rUsPiQ4#|!dzG^k9(_qsw3tIj zUp{=EwfC=75%b<$P~ec}{yN#(0A5<}do9`9h{rUrMM&x%>0wFl-d)M@dQ$Subfqna z{iW8?=?APqtU`Zk%vlUG#Me|&9P(A^4$iLKgBcLUnPk!^9ad_u6~}4f&3?Hveo3g_BIn_gITZt2_85QQUJ)QQ3t>KHgJP{!o(*Efj(%4;d$L;J zd-63jJ8#Bv3Lr2n|v$ps|A$OWX*f*3FyvkZn_`6r%98o7vN|m_A^8%d_ zyL1=vY{ijYC?h!-y#*4dE*W`$~~k^P1!Iw#vEeVtV%8<;$MIK0ovnwbR-7M zmsgCL>W}s{Ll&DN?o~>=n`!u3-3w>Ij(T!|e0dVY)Hoi{{>J?SQrmaFSX~A@h+-N7 z+F3^~sMC333>9hQWXh!~95OSLO*D9ZOk2rvZn>Uty7HH6AX){=>fK-W(t{*6Jhv8! z2GRp-_zY4u1v|}NUujY(rrXr7DI(f@5SdgeUf8PUX^7Dhd;01EH6N2O^YaNjN!hP- zXNsXqp>rruP%SS&sG$v2;--BO7BbBtXrS~_^MiOEJrsC>voEba0t6)IJSxqx6}M#B zT1!zNW@+M4QejLe1oRef&f+*!h%?3j%=ijWGs-|o(!8%znPKR{>k_127&6B_AA7`? z6xNM8_mpOMcPRFF5q0(2LyNcz`3--^!t?%$a7*^Xx}bhZoA|obkPotshU^6J^N&kC zJf9HHzf;_ff?lLNMQw5B-XaN>)K8@0dHGQ8FMy`{zgh`SME|^o|;l_>S>AmMY`|Qle3fYx!}z=z5lkh}gKSF~io^O4-Y} zbB;ZHq1li5=NU zYMT1F82p}rq{X)aqS5_xY&hb@I~i?z-R?2(>{vrGca%mkE4{a+ik2u6AvV^~p!6F~ z`o8*6>lX6A%fjI&=c5}+ZH%uxikk2iHyVKYy#nIVokpzQ*Y3(vJg2SuUO%@`zmEMr zq!_?GK*D4Ye^Vj0LgvdVMd2gMLHP%TXwY$;xTS&w(wV$J<=Ja5bH>s~(ec+ABs?I7 z%!wY82G#!rN|o!B__PXs~@Tz9S|vVGVt zmeQ_(e*@!P+0-S5t1Y5CmH}pCwD~7+C?hjwL%Y@&P&5L{w3A8nZE$c<2;id z97bTT0gjIY%c-I+OB(jF)FeAk)|BptjARtV%3Ywpll@Shkc8t#0l|IpY4SX;>?k?c zNS4KV$e5DBci7CUm-dz(#ZN(VE6-rbl`5n!x3-Ji30?g47$Z=nFCL_Y((Xc zK&4Y99Sz)xx2qy_t!9uRB1JcPlV$a-QVKdI4y}uKSQHoKjklEWLG@-C;%|Hp$-=R~ zR@(N=C7W3@L4otTC}BjAgL{@(b&v`C(#`PE-gIpA-z*1TWs2< zc}DbK-~Kqh?hW%mc}o&!csv`cC#zyfBH!&O1FZ$JKIP&UXi(Tapzpz@7rf#X{=l+v z&T;M_tm7}BAD(CnwX_ta?(JH~)zGU|h!WZULVXPmfv8ndqDAtOs+eVQcSuQF6Qgn# z#|0F*eM7kJEHy-J)jY@P{Sm-`aM>+Ym+`eZf!BrsiWUQ#Q`^V1%1L6uoMA^cSi=G2 zyGXbPZBZp;v|~6-dP`@%KRrY7eTONrlP=S985FZb~# zJ$IJKr9+86#y-FnpUsRNsM{_(iG+ngS39JNf}hlqCx7otE%d+fJU<`0^B(fN#_%l2 zVf4O(U=`ba*G7)#qk-P0RaN68u;6i2=7s^*=#2)QP$1w~LK+{#2Y;u^zZihyo8so% zA>E=%Wyo*`f96Sfd;35V4)HJCUKQy%k#uGztmVjY2phG5MC(j++2!yaomYPZnt4OF z(Ppfl9%T(6Fq$+lU`7h9f?b=pjRa#Xl#xGm`$t4nS`<>X($qHq zcUM9iNjP(Nn*PBUHc1))fnCrCbl+1nA*liL0A?{zW72ve_JMKWmYXrQKyhIlxAT(ZO->@6Rkq0)#jP)I8A4Ae#J^Bw z8D&8xs04|H5t=V^mgn}0B&q#67#N#W^|;F0t*nPVan_53YIAhw7R6fn%++~GN#ggr z#xt3uf!(Xf3X?Z2UE?4c;7yHKxBB6thDkdw!5=dKU0P7#3KL zS=MouLA*1NH?))1Di^6)y3L`KdFhYT_+3+z>MMRa50?Mt)!WnspFLFL)zEu;LzHL~ z2)vWlEn5g=?t85=XP9i+DG#o4xhLPw>a6~Ou>q2%okc0?20$KCkbyK81Zp0*anz5A z-3pTYz@M}GJSlvRVI}o1Kv>YycR<`35h%UI=UGP>LpXz-&(j3RA2+75pHSe<~&KX#9{Q zUWc|m&=-96g{gYsLU}%p^Ed3ji8L-QRI^zhAJtK?Jgq8*mKtW7S3xw=#i51%wU*!_ zXcwN8(oD!9u_777HL<_~=sW}Un-4&9jnMf}##@0DKOvgdO(}lOE*pd>&Q09t_97Pv z7#!HBB!-NSfAYyLP+7q26EBjlvFZ6ASMzahiw49~8#YklX4T_puR;jrTc#t$9!uFc z8amloY`=Hi1qgop9KF2=2_Pq3W z$N%O4GF~OZD>UYT|K3U}rw#2XskLagdNIL7~O9LP;@D zmRzJ&`B;D-3&4=jK~&Z)cJAzy=B~6s8n&hI=SPa>{h8On~azOEE20tbC@9~+XHBUD!XVqFt*=XQ} zpPxX8g9X`C{M(`erlaHG*4JaCJK`lswF|2H!qMa3xzYq%vhGK2l1AnqpRlaGVNCK# z_X8p{c#hl!ZUkRY7PYS18JsQ>A8IqCprra97R~0vkEzm!N}@lEQEoz-9j)&p6QH); z2f^sxk5M%4h%g5EpW00>I?*{&UH_q@;j2J(up3b^GMq9nbDSrAfBc>}1u4y~JRNZ- zA~MGjZ86IR^J*GP35R@B1>YYrd2lAUSy*DztHBqx3d_CUyT!P~q4&5<$ z#q#GoS(?T6qQIYsHg?K<{a3Nfcgvw=BCWpwW1OOoLt(_ zLUS93SSas~QRUscm2Y12-*PCp#Vp&ttBKiY8LH8^julHe+P<`f8fCfj)0GswPU73G zfE+N&m$({RL3cyr@%hx`Vu!~f&7QPxKi&R$Sy<@PJPn;-%6Kocpwz^(D71DLE9va0 zW0c9T;{A13F7ED`Xj;ehG!WmLD|xD18Ua-0_6WHO_6oHC%+UdFL%RPwTU| zy1QC%-tRW{3CYh8LU$Xf?} z>6Ubh83b>9Namyb`!^gsy>Rw0?;&xGVSF;fzcB7I*8Dr%E$j85g@1rJI8PI+w3cIk zn|AU;#u|JO>>bQ}1&Vfe6i>`Km^8LjshK>QNsvir7ejV4;Ib>tXThdX@u3N|z-7mU z_mI@q0Jm^>`V8~t#%xFvDo53%A=A@8+J4y8bRp0k!g4~iI*8)A5En)0niq<3Cdq=B z6sRdH>G-ELd0N}&A9aKOOU+Xf{aeqIN+M#?`e$OKl;$-$U(AOn#qMsqPdVC7NuVKV z#cR+! zX#UfmD;wY}CsCJ>0D^6)aXz)RR5I7%RzMnLox!WX7PGC2hk~1@j{*v0&1;};b|%(v zD%}cgSkgttQe-3x0Mkm)Wf#RVSsTxh36(jUZ z*?#BVWG1VGZHI2LC@C5)#qiL)b8^1Ec*|*9R&=$&$Fn~t2+K9*?RI~UbLdSaw$oXu zK-v#GC?M)mV$GV#O{`%}$~bpTCPodOWsWZ<`}RAVGUh2+xIc_MJZ`qPm!kyeRcZ0C zXGTAm=kZ$MzMH*8+fw%|C`Xp@^8KUA#jGNhnY{nmdRqkj;NO*nfZMCYyD*0V91k^ke z%wiTZA)6(*ElM+2$uVGb1ej+(lh{f5vrA-&)~cuC6$M=hmW*O`^wvn<;pUF1b(WII z?}NkDIHv#H{;yUAG+WH8NyaT*x!)hhDq%asMn+@Xftbvca?!hGTA-83Dzhu{278jy zU$|dcEX5ZlQOx)%gXoziJmT^$)sy8C*N+Tlm3_3RBuX>asF7E9Mp z&_Kp#3?t)@)fN%|O@=_m)GwmJ=Z!SD=*L^~#d_$(wq<=k^+rb2t zWwf`K?#8I!0D&8VM8SOog_6?Pn0f_Ogt@{v0{aJtmQX* z%WE!KwabP{HPTy(sX{VEH8fhMW=$eMeXkZtEsB%OnpTsX zN!(JBUt_FibtnR!TNx!PNOBpo;4Q?8+w0X|nVIK!LWBY(vpr=g95@@1)P?7Xy2*TF z#m^U(SizU^UdsK5zzT_s`1i7qJUMP0_1ZzX6&-o#Y$TZ z3?psL8w$ccnE5Q{9ti9X;$^4@?NHuJJau_T`s&89$Fne+wAq(!@Gip*cgFRscG;*y zv5}Yovr)>$RmT{%-tHWtnYOCw7>&A9RD`(-4E>q-iFZ0WN?K^`)Qow46h*6>z31;I zGoOHIf7XTpQ_EM_DnG1jKLt?fhd+q;F}Xz03Y{(4CW9W*qsjJI)?~VLJ4>vdwQ&3e zypr&#o0I9b|I}jH#wp%+tD(O`MhI^USe8$Df})FtigPlKg4uP?_uvaP(@4}U4Zzfg zDMHg`4m1Bt>P$&7D=&3E;QI~IdNB=<1L3eD8TZ1lupj2C&H{uhr_;M=EhF5U3>gGV6`6)@7`PX+f%0)$x&zc>x@WuY-0rPYcdA4g#5uy8uTZph;T2bbyEmX6(la zU{#nKK)x{=cyR$Lxu4Dh2Nf|6)Zki+XddiVaU1LBJThiH_zDm>4icNS|BHH%N#EcQPv(V$;2TTLN3W&9?&}AU;E+-EUDLK2|9qo3EZ8608CN4d z6u&ef@w3GgtJqP+l(D-qEW%_4Vtuyh_m>Th#S~}JkZtTIFKR#ndz|Q1hFFvqRiCiawGre`r0~q$U~7_fc3zWNcupr)M2jCINeb`oV47zv$Xr_Nka<@OH{y zvC2W3m8j1@!r`?Lxr1zuHDwY?#9W0#~z{+Tt$5F!o zB}qJywb{A!y4}oM(fAA&+}6j8Zwv~efzohUn`RGYwF~Wi-jnq+k`--Q@F49CLAWe6 z_=ZBVss6!Sk_O`F^kii{Ou~vOJ~ATE)nBG$4tCVXjN`@~i!N5g=5<7tU$}0%v(wZu z1K$^}bBp^6U!=e)5!7c{i>x|T<}SqNS_nVxnn_Ldk&6tAzxrag3KTa$TZw;v;N2oj z<||gi_K~2kezEHRR;6PDA3BJVijz5<6Ovyr$EUhjOS0jT7MOC9xCYjhKh4}+A{G8@ z!CdA0Wj_E7_B;Loljeh>A!wSL8DpAD#UU!3o^NjixhH{&WI4m&!+0;fcLia`27=xI zj+*c$JU0F>X*O#?&Nmv~>T%;c>UBR_UQzn(wM*qNo^Ws^eCt~)EhDffjO!JtlR(@o#kz~DGhb~6zukZ6r=T9 z?UZsux}jgmttVRhyqDSqDibNJfHSkm73K=j9o<6HijFDs&H_Qu?45>+i#r-RV`Zm? zU*^_gFA)0L8M}fG*sUxXcZH$U-|@B|BD`OdU@&~8nR3t@F3!YaXt_9`ZeNx3T#sUX zzpZ3obT+GB$d#l$7cZMyaTDEZK!(<~okE{e+83Z?_Qr@7^_5#@GEqN9n}=OU@&wuq zxbCyMDSdpUa{ds9w6%}&qZgrGt%7}#S(1ZRz7&;Sk0-0IOx5ndp2beubJ6Y~P6tmGVF(9;=p$owogI}zy+@8fec zhiw)kWuB+%6sZNT83BUc!Io}|`q=33u*t8fT1p$D@yKuJcD>64RLrcKL}&Q)r~%Sn zRC&qlBY}p6b$cH>4gPo&o$9Uw1z&`R5DlQK zH8%!12WMMFn8ZD&oarPEF^kbgBa92y&|jdQ$5(7ZrD`)|!cJsYk==#O4Qw9o5ZLHX z)S<}aI7A@CSFGFiIJw&(-lI|--gCVgY9}rEy>m?)(L=^Z)!*U3XoH_>v22Q2a)oaX z8*eKal&#f-pRe!H_4Q&OBoq|tWkNz4v40upK(z?#xZ41!p9!=t2*-^C%w+3gSG1ya67vZLpNPR_U?B3 z*R$tJ+{*HhhRRVlZvdqm6?^QU;uTEUY5V8GLJVItNQo{pWtAe*nIbGbsX&l~0>X*l zi7*`JPm&UWkT87bh+$@yilnJhCvxFMe5uJz=ECWKMeH^VLvxRk51t(cRZ6xJ1(%Kr z-7H~H>F7LQNq4!<#2f8zBqP!52@i`HZssO;NxkHw=0PW06euk(9`u%h$Q}JRlFX|O zDA6GC0jmq!AvU8*r@M3gT)*!J2mh3MI>i(HUy^jZOoUxSjrpE!TX(W2Sat8?9N9;S zEY~!f%ma#H(FI-AoCJXEDj{C4MdyPe@b|}EagObb?icagT@y>XR2Y|DO|Im`qsZ@-jSFo&G4*iupY@?59MstO( ze}UlI&3?{z0H+E5DL*^BpztIU);Z~gM#693^ffqBC*{eI3yP{o_C7U(ZxnxHmbNUG zo-<8C-x$Udgoeo|v9ZDqJ*X{;%5y`Ozsa_H!j3~Nc6C%lujm{RKYobQlp*3rdSLSZ zrG0B;pOJNI!yh zKe*qgUBB(AuH^3B3&l)zvd=Dd2@U21uoq@5Jw|$nxp%;|oAJC(_=sh(iCpkW@C2X< zm~YXqb!}PHW;wom%pvv3l(mFXtF{)ZUCNtM;fI#{n!4poZcYNy>@=O%fo?R~n9vrC z`;I6yF7Lq6En=6ZLnrTyPNJ|+IDb1ceJ3hdgWVZ^LtzD+Alw`vOL)y_zi6i>;bdtP z72`5Ey)RJ^w=}H1;vU2v*bk}4h$0kmL7#%l*;LDEO(Ovfg9;yITT$Ma(Bdc$Fk?tyOe){05OFW*hPZ?HSknrBpoxFh47N6d9fxx6CTV zGbvs>9lgoDu*Lq~nzd?MV0~Mv`Hholh=NEPpOr~phYjLc#I?J<1zeE`En&zGIMiFD zYo+Q=HgD#)5pG(up@o7naf3GYLg8A4P+WQ;v93E=JT~=N!E+;eot>!S4c(3$8q>;M^h@r}rEPVw-{BxQeT(x`9gN_PcBj4wzj3QMhg8H|ee@T%wDMghZi{dUAL!Z_bcT`psw z)~&voF8Ac7Q>6M|ebb}u)e_2T+|LMhl#Re$N7?rXNaF~D!-Cc|9(5gH)WAtxH(Ac~ z!zb{+;KSIhs#L)(LU0#}J}Xe#V~bzWAh61MW=D7=9Wt|FDIw9j9Nj!-A~=CMOVwTyc!t()WYkLn5))>!`Rn=xVYknM`N+2tF?E30s@XPy zRhfT|+}Xw~D?q8`@d(*KShihfrC7bd(nvWF+I46rH7ix@RV#JW{mMD|qRos(m~Bs! zGS}6rJ@Fi-bH8RW1s4XY(a-jtqPb_o;+TYUJwpgk$co?^79Q{kF)(*o9n|L3 zE)HxAoaAc?T4{dWv-L#WIp93>v-y~q!#0Gl5C~GiJ-}^f6H5lZs7ImQLx^98wWFpg z`;rN)_KYa)ZXs7{*<8oo)Pk5mvQOB}5%*s-mNVGro^vAa+4+HQR5>Uk$P}21*o9A7 zV9Zd&^koZ?sM&a?Cq{(5k+;>9;aE=V>mrx_=bQ?zaKioQ`)(C4^42JH8Vp4bRs{lU zzRBK8BShh0%PUAr7(sfl8|>0^BC5fOMhi!an>w^Z_{U%P#!d~T6cSt}s&r=2av~AV z8*A*u2XSNQzc>VUh&ROeiO?`M{yW?ShsT!1eZ~d;ma!)c3?;HpYRFe?eNm_-%5^yX zD>W(f3{M!OM3{k_Vx|*pm!TR88y7IuEV7dR?cThO^v>{%vnbq66iX?HPE`^H%EY)I zQ&nxAF6gl&bI;@=x?m#aZb{i0>^^c;fBo04G*Fad+g3=8BYbnDHsx*b+I z1hPAbU5`Z8H#f5zv-Cv~^@YiKbjzhY-soD_NczO;V7!CvC3nWV zJh#UP{pa$XXK94E9ZUY5g+^RN#UVo?W zyrdQoMuUVZB|0JY- z)gii(iwn{QW;XOoipAvx7iKiw;35X$Dygtm`mb_;anf7|RUV=PsLS`*l`1~PP%TXf zb^p%NnR9VB@#r-Q=-goRpCoT2-6&Nmq)yk>0w^Y6sh4#(4oGW5>gSRy{`wt}oH&mB zwDr*H5Uk9N{c^bDD36kB9rGoZs)2sE79|v)>)d*902BtTHg2K{Co4O(WKAh_l!TYA z)YH8}tFBzz9t7SiU`cJE-ov=iG9x7MAzJst^2P2lZdgX)bj#eASBQrdS`yYwJD=qK zzmMpI&^k&7Fw~6nwL3LF&`?w z5gOyb76THW;;XQV_k_rT;?%p;L;cDeMAfe&jQc0$6V&@a{N{RHKeW19Yv7oCPzf51 zjW8V|D$604z%Z+RV&rLNg2+#-G$kN+C+jMcTyBlxi!P{XQ;1s=nK9U0KiZErp~Q$D zJ7S=-caeZl78i@MGgVie=OJy>%6ac!hSTN=K=6*^8~xO>LX#pYA^)p*kTuae zAYm^JIlqjy5(h3@s>2YS1|D95jPo*@O*~2QE?bfu!G(Ai(_YC14q3dT5Q=}uorS-F zCxtNOszMb%wZxmZETGh3!+Q|d-QS3c7c)6FZ}5;YxPr~4rKOH$P+wVM@dluC#_ z!IKiU2$o`zkt({EIEW}(#sMu%y~`6t$(Jw-La)}qb&Nzz+T^j+QEu;pHE~#|GRJO1 ztb8KMSw5FH`4Jn!?Jni>p}O!+I?`=OKRvC=e1P=|;}a!<8=_(8prE_~^*#CgJ5XP7B}3oZS-ZfvD>L+*xgCY za)|h81(h%@sCnXCDc#=ztFYd(%9d0xuD37~>;%x0nQroVSe`O^L50GHaP(Iit(*(; z{BNy|vooNnR=-$;1}I+)F9}baeAI?Q#MC86LnT!lGkI8G0AEl1 z(g^d<5{4GO55N(m9qnj}PoK5iO8-IXgl_<8{W**YydM>~%!^RB)+IBG#nGmCdkigS zhOA>*%=f?{Qu&*>|0v%|wU7ZFn^dPSXO^KOT7c@!ed7sRTd*_8Ck2n-rC@OQX~TAi z9T0ihuP7&ckh9b)e`p!zsrv?5Gw5#8WgMvTO20R=7ax9#y-$Pi$>0WWA_B;(QEW|U z1^jy?6i{dBP=6uNb(ICJ6c3#V__#^$BQl1yq9$4%qHcS_6#`1)f80ldrCjC2(<$<8 zdW4I9$=&P`L2t<&oYU3&b>P#QUyCt7asibEjJy&cbCetjHmcPl@vi95UB+fMD8>gP zB4b)PT|2Cfl2C+g2@}JZlU+XUaK~=c{^q-tqAynPebC15ERcIxuIf0P2F+(Bl~(hHoMU2!o_Q-uldyC<(q{BW_tgl& z1?Yn16~gLMJjrMMw1si&{tEvM0Km7ZkYgPSy(%9&N6t@ge#3K(XU_0c`iQ{C7ow5s zqssxjZr2O3E5Bkb>}tUDGaviOfKbB^o9VEE#8F6UHgP%rJ4>aly{oKcQYE2W3}7mL#xG_S#ABnqz^lUFJe zQ$L@1l*b6dcVERp60`ElmgJ;Xs~Uf5510NubiE#iLWYnGmDV z!gAKj><{np!Jn(dhre)Y9whGB{i*B43XS&=)G4^HX;p*I3TUm&AT`NNg^azkCs`{@ zC{hRxRVi)GkW3r`?GPtJh%|P1VOI_O#jB#B!|8uO-L#9PLI7a)vqe=|uQBA%p$)?p`RtaP7x{JNjqm&ZWI!15@ zQNDmohpI#HGhU=3Ev#ie+YIbMZ53Xy=|!E~bqQ%b7gg&YKn*9j2-`$`zP`Eu0E`bgBKq3= z^I%Seuaexw#u+EYodYh~x(1~h};YcyRNqx>B?1}%SK zcZzJ^3gZrR7kvRmM*QRj>Q~sZ&y|_KG?Tj(?>=_0{NW8$()I|6cigq){ezXLn<*=r z|B8KNNqLzsH10bAY)WoL)o9DEzA7^zMho?B;bXTLSuH5p3h9bHg@XS;$06R>mqx2d zL-CuBQ*D@eeZe*^n4N0dBqvASUrGkBnli| z6C~bO@mSj|i-vQKLzJ1#tWMQTRu{Z^TBEywVR-H8{fF3!5x~%Tx14V&_2jhmS8Rag zUKSzCccBS-@v`m(UPUnmVsY3q4|wG3V0)ueEFprTT71WDjgmvNQGN)pEOvMZPfB6P zGgjOW$%3D`cZix~2+cK(T^Dt$X^j%w8-$WFLr=YAzt(Uoq0jy0FuE7`3n}*;Rpgrdl<@Ee9FGxW@TeQ|GMdz}Z#04?atb6JsN~rVfnbvj zR-*7)KV|<>+1a*S5&oz`FAxnVZ**CsB#W@gZFgqEI;MM$+47tL2Gds{ia3sh(n*bj z1J{>>B;@y;!bUeg#kd^ucvt=vMy|+4V_RC=pKbw>6&5FVD=NAN>w5hRsKZlWI|~wsoR)@B$w$D zxw;&T8V=j75rl>s*@$c>f=gwF?y+CdC%+a&0iQX}gW-{7-T|h!aQ5mW+z)w8=jBu_4;yNnegrix<${-=C*7 zRep}%4B<_C4DVnj@{(lVK05=VJMl^053EslSX~YoDjCF=K|=VU)a6uOe~C-%MQtWF ze{TscBwtQ8OqxQ(13#DZZ;@Sr0%$e$n9}se#c0%BvzSKx%!q5}k;#>eoePrTK@6Li zQaHM@vkK{O4Q1#oEvcBhx}tHxf99NDff?@rVqw)vfRgz1!6dIzXAnEXc9-I@$H7f! z5T!BU{HqT~F&1(@5j0L;?qIf2md@7XOPsco0|Y`|SRSZJ=MIZ}ZV@0k-Ao^E2Srdc zB=%m@eh9URO{>`-=hPd;Qkgg*^hE{2gQO_4ts{OMX5}E1WLjX|N!_z5|G{=k1#0~}h`L8WY>4}@0n`O!LRm!>`?1j}rf>@&j z2<(kg0O`)Pj<4wLp6`aPc;fUNaJh1se9dYDO{&l4 z99Ykk(ctO?6%8txg}3IA$GEV5Aw@3TDGLmJ*=V)>Mj61PnaHL2*BokMaSRh`j)`4^ zp55|WO(u%K{uf;QDSG8!xG;p$Vay`RB6Q|Q4j@`eWv}`#Oc!s=?*Nu}0MtutK>eS0 ziZFDMkLg6i$UI)CS8FV+3tYJ&JZJ$icso(S_$5;{8q;IlO&kDK-}r|_`)W~|FQ06` zn=I{T=9(u$iC8soKigT@7}<~%rSV9wZy891T#-t3W`_t(BSjZG&Z^KhhzlJ5KC%JP z66?oRX?$O-e9H5$`8hiKPlFyjsgzb}lzpm?vyhHPRy@M~2Pc%%J~k_31V9`b(yf5l zNp-UNrQVho7}kYKH{()t0wN@FeUXi_2zF1kh_qnQ3-cWQY_pt|A6?pJ!D{D+`z zj$XF9J{^aKPNg}rDAH=keVyYvW7i52wZRIcFVo?@LJW7ukYu*ZKJ6E$mHWKAGtdx; zf3`2i&nAT$*IEA;gE57jf;vIvAFrKecyU$xS%?QPh+|Zd$mFeL72>SA+h~|JnxWDwAmxj*@A4{xDno66dsm9bKa)`wQQG zOhvlIY&Brs5&yAW-})eP;=tixc%M~KqPds{b@EV+fh!1~4W+ox<7vWl&BpzQk^8q4 ztUe4SZFP4hA!)-kIE*5rjgLj|cNAE=;2$D5JJ46o=G(nl#JKfeEABIFQ;j_`Y*e2^!)6cP zju(WYcR(^2&fJBH`B}eY1$aRgdHvE4&-VfcLbaaKEWe^P?uNsupU2koQQbA@p4`1q z*Uec(?Zb-Fj3WtCvn_NinJa}J5nJYhmn?}Eg90VFMa3SNbq)UO>HQDJ|GU*KeFvb- zf7exrW~Rd$VRdgI+zB6KxsMa?^NU0;96`%ka@eNC({6BdU&F~1*7Coe>N)yCWtL7i!7QuTBw>PzxlHy z*Msigd@$wJ>G2MDsMe}7{;%hq<^Q0(0|fu=S2Pajgw+R>-Y{re7B_&**V9sV)$J?W3fQ_~64 zDCE$od4#rmq$-m7hcYuA{u=6v({E01p{llX{Rmmw*80eju@*wN=M1>9$y!6RK%Cjm z29&cH8aH!`2lfikF0SPu;g}n{NXdX|w+=dyGRg=!l8ocYbiT|D({L<1N7jG+U<9V` z0A8;ulj?T>zCx6A`k&s+Bg>!e=2|neV;K>2h}KBNnGP1!C3+BtxD6yx^Duw&t@BW3 z`Fa|yvLTOM%*FbgUlRd3E1)i>1ac}$jbfImQ6p~aT!Mr8oJu=ae!h{ziq^`hIsV*% zS%pNS8^@nN`6+BR(Jd)5*^N5gty5lZ``-SMPVYY>bwodT9HhgcHbAJ*S~sNskU{k` z$wmy<3umJEFDi%?*~s*SJOH%LYo~?IK8t2@Vtb*wFMSH%V1c^%0#T$;?NIm%QJB9p zA1oXlGCvq<=P84eIzK&>cxJC1yhnZ0Z*EHXtF@$A~ z4JEXD3(B5@XTrw^-xm=LxD@vZ92f8yP6%vi< z6h!#4<@I9KDF|YqQDIGb0-XicU%Vlu2IA&fI>~^^LGOUj^|TV6cfhtEW51v)@>nW$ z6=uy*mtk7zhE;iK->-uN;JB|Ljnc?CW(nowYSXa20*>kV^-ScW4N;R|x6;2gUrM2Z zf)b2`l=pse?u2~8-cW1bPt-S-Px8ge$dJCx0y003ve8)Vq|qwOlC=jdP3IAAnrgB0 z=#c4$vt&PX^rWXAY9HrG9qCfWw~4*%X>J=XS>lwF(NgwnAhZ~P&A{yEE-d)dG6_kH7{NHr*RsF96l*W~VEmA;j|Rpxo7xTh_mN0FzV zjFw$C7#qxIHj5d70Hl;`wrkSB{~qr9@mp+=VB0z3ou@9t!k!A%csVu zAo%*g`u!(&oNXq?wF!+4hSkYv+g0;?O;f>`;u__Sv3~rOictp=Q@`BaiF2%ywS$l)Pb0qLmd7fid#HSPQ(g-?pa4z@pkm}Jzeq_DPv zM-+E|wXLOi>y11_(O*(>_VY&I&L7=HtU~;IXePk{7$s|B#N%=uyltKJG=~jjo`ht% zgX1@r6ti8WpymaoO31B&0{mwj&otR&d3kx1x~bi~g;93>(YQGDf{c}$USOimgaY&| zo}mm!3_ZS0$jadJctus7WtQ6q`%yagTM@RVW3--FSG!W}@>}`giuv_P8m0i1-Sf5G zUiW^%QM~MkRHF9LQfhne9&P92=JPoe2IFs@X=V7%3=x&B=LZzrzsYcOI`%kA6>BJx zx)$h+VoQ?)6q50hN}B@==z-&{)I^JN=V!d^%!i^VlSW=steLj0?BmC2sfJC|AR(0q z4%c~?h{`7JRrw!;j3a^-2!GL~0)ymlEawS7)wI3>&j>c{8R(s)fM+L@xZo-sd3P1h zt5J3V8FQ=F_R%@}PYU72MQI@Ex>W<^_Q=R$UMu7B=sex&K!iz7470_jCWt8u8`pP6 zAN2+HTgxRv#I$c#=%YBI;@f#k5F2ukbDX~^T3vlwR9THuSw%(pdRKdsL#>8t&ckR* zCj23h%;kxJsnvuX_?HzlWr2<7wO~=78iy1s+z)@mM0#6PKa!D5I-IQ+V!WU#SHz4n zzqG0pM9R+Lz3V^lZ9kLjnlWBbhRyvJgywpfdQ6d6E$L+(FV}vmQk_$y?3mTWLDPZ6 z3FS_#vUffU#C_B`Mp+H8bSIIQiPWu0A)Ztd&bgY&GWQu>gt8|pDmF8fl`0l{)1~X( zOuDWZNNU6?-Q6WcdRW7aPmb0b4E|fE?b7&s@~Ej7l2F%f+`c)7O_xlaqEuGi8B2Vi zn<&VE){O!z+YF>QsY1SA!E%bGZziX+T4g3B<&fo9W)5Z$zP@u?MLPH*e$$=c_vQO=8V0@vd ztwmiFYX{Z_Rb$0|;p0ldrq8$htRYM|3Bm^1LyVJpmFZICwbAXrJ5+gD>tr;gQdBBr zPxun12g0Q^LPqK!20;Xw%yITW2_G=}n{?ExO_Lx+F@o__# zqF4LvjIhG>>@~&T=FW4t)W;pr4}Q2DeZP2165XLgtPTf z2Wob)UpUIITKv&AkUBQ-zeb7?{(dz|z31*mCQXfQIZp`gT08n)yl_6Tc78u)!g*aY zl9x)Rj@>%jMICr?>~n2g@W?XU$MoXAPc#oo#riH9`^xWg+1ucmnP4J+`9TU=%$N+7 zTtDh%s^<9AwkdSl8fln1PdsR%c2z+)vYV2PjplmNW?(9`<`b0aoE++(cS)gj^(RGK zhRcP9;MZ#4#dhpboAVwvTc?F^X`ubM?^p-05@Hx&%KL^|r<3t>BP~NInwS`Fl0xve zZ+NklJ62cyZC7hon|Ad-Tk=w?8o^AutSr!X)Apj*mcuk{kBzW;%)McBfJ7e3-!DYegknCq5p+ZVcUPfD~rmlM)d z+z0$JxPYAg z*8wA$jEnEr^K>#W5?VMaSw3!VZmtHntbU%*ov&`%&!iQePypTT*P_ZxE2eeG0(WSD zbdck?U@>h9kRei1tzi#edMP6Tf@@98Sjvs3&e^BtaA5v{wQ&Br7R-Zk+ zO>!KcSDc+$`*(bH#2r0;d}8u{67YXouBaTw`xo4Oasq$vi*|xUtLM0uMJkE2l&7UBWovrb z`ZV_Xi~g@E@8971z;6?Q4aa_YSy$}LyTP=(qp>eFF&*!K>5fUHgX5DDZSB+jN7MD! zUz@LgGXB0@JO2aw`-LU;Wiqa#CjR9Q?7(Bk=isk(7|-3m79YQ^b-JcKIwrqTHe5Uj zj<`t0b1BgCyA2;LQ%T|&SUz_Ds+l3X-hT(U-UXZ9yq$Q@Xh-kfyp$mzz~|n+oZ*bc zr2UjBR8UF~n+o(Duu##*>x9E<9T6#V_Il|N!;hTNilP@77_O}Pz}6{Cnpix{^we5( zB;Y@y!qh22lq#e7L0=w79F0woHQLI4FL!^dpp43;9%m-}2}hY(q^GBhH~GgnhYeq< z1wCDX+~lpFyN$>dYjj8KzoSB8&&y9Qs32$}*J-6}RW?4`uOHZx%a?I88h(kX7V*=SOt|>plKurdpxdU&w82~d15tNTylZv zseT40s@S-pC)QivezU^q1`>^v86WtPWu)7}-I4r{!#9Mr^Yh912kMOW!?vW!#1YwX zvQIQ|=QRK3{#I9?`S|#F|NGm6y$mKEkzxbyN4S`}_B#Y(l`NlhW#{gz2`cLrjB&P{ zJ`4Vx7G`70D~9(T5xdq^SW=5vs|+Y@-`m}rjv}SYq4LbR=(zy;JeO@gQB-e;P#Sp9X<}g+)R@L<0OL zMgG$u*s#=aSTwXC33YRKcpNJ6FSvA^Y8uIST#^Uwp>Pvlr$XkGN~ZJeiZ=jDI6>d=(DNK{?r*Ek#7P z)YaIY_Qm6hEP<=P9-_US1fJAhyX0oU*Rw%r)~<~3eaTEgNDoG0yHRJ=?RR$U5!VhG zcC~f;2T9kaRI|5)jU^Ao4Z}QNDNkp?uUvCh^UdFqELj!u$_9dy?4D9rFW&(%%rDAX zHSJ&&Lb_S2*?;rf@}$xm=xPTW>nz?nf2YedpXB<7OxrNm7ncb=b>cac+CF*l5T+bT zb+!~a<>GlhBDLx*UYXvgkPDkFYZb=v*!v?dEzQoF$jdAw?C9r>tW@lCtnd00+}bo< z^V-edOt_sKso;xneM_=99}PWt6Ysj^+N%Aj6R%e>+rs&wi zL#Rx>lAj_dDKLCkIr-au7NT~#S#T`h-Y9jP1Zc+~GC zIYA!ZQrz^^=u{NA>=OjzzGb&_=r|l7Ii3(Un-sgGkLNJW24N_R_R6Cqpv9WSMvIh9 z%6&_!$jW8qJ!Ff0$*!&_QWmM2NGH6NywlkotMcMe{G>^$cY2YaNXi%XibasK0{H@CsZ{<51qrV;_X6beHeX@`?G z*9z1dnL;CmyE6lEM!Jhj>azt4rc#4PY zU)s7kSPq;nF1Dij18hz7=l@#t|92x~P@Eb;R zvdfwvYm`%2#*b$uR}DA2Hzt#<61DFcrAtrAibunzKXtE_aby&s&5{plE%q4%K9}Eg zSe+v|Y?XqTmV3j^o}%wv*iYh<6oN1euARZrD_lcg4%~fBBL^?(3}Kj!YTV_wxjV3< zt-9cCSc%t0yDKsIMJF~?Uz@JV$Plxue}h{jqkF9g{NYO-+dtBc$t3A5*XxKE z)9#})flG3x`hc28g0ubaM@Lbox|%Wt#T`30ymn2&9Aap`W1kVP^_ikC!5U*#)8pfE zu^Ick3B?PD^@+RTP1T00m8CB|it@IzCO;%x8R-Ijt%qURP1!}!NRc^qEHCDl=b??2 zk!$C5CB_YL#cn|I9+_ktG24@ut_PL@!3MMmXeO&5UDi0w{=L>nbahFw$e+S@z=w+H zM`fIuqMB>Rf#8rgk?s%jD@OTU@IMHAY7$q#Ko9A=?CpT>nLSBWCw9d%g|A;5Qrvgj z75lIA&Qd01Q}Iw;fbFh8*2xX^jA((mXWb`#%qtNMk@cm-E`>w80o&Q7r$>PY9m+w= zaZ&^{ey6pGN5jR0#muvcS60VY9KxMNrwj$7cw*KklJ15>=ICoQMo|p>-A?m2;84_N z`CG|(mB)5m@I%SwF>Tjk(7fi69S3VvzVXVXDGMfj*O2{$i7rQeX6Wk5eNEqj!rLV6 zznu(dqht2ZVOpP^y`6Z|Fbxgl+%GUi(tpZ>SgV(MGuRGdMl+B@KAwxXDF*KkK6 z_=Yhg*+Jf@x#iFAq&Jbj-y&i#J_Qe!=&DLPo_$Y$2Q)q7*%hx!27xL0mv>d?)CIhH zwo@5a#9vESoywc48Iv#+VKk5p-vO4J%NmQfc-APll%G=n+Ml&~l-~RM_uVYBhuw*mRsBi-(E>H} zv3AXwu^S1*K3@rjnnFD8X*hw_Rcz^BHP+d#k@hdPe_HnT%~cJ({R=aYJcPx$ihA!L zWuk4vLmb5wfzKEuzesXS%Hu^af(!dFmG3i3D(h1EG!z4eKQ_-hvY=?>z5^!oMWt$5 z7Zldc?rCB8M9)CbCNay`$8;g;{wn#A`D`P-s%o1VSJvXlN8HmzXDBOgqHwZELE1Z6Zq3EcsN~jLCW1hztN>nTFk5?2f3*+;oda+*Fa6(+fV*A zU1k%587YmtWQB=?lRxQi4zKaS!^ttfNE9;*z>26t=QKm9^0z!+C(rUHGbT7$Oj{RR zBT#~_=Z#`|^3I*+N}D_tY6u@w^Xk&P{Znx2%Y^Jz**GMg@k!$m(kFY%CIfr_FvMn3 zxgwUgmqM3RT+Z$$=sj=-6~ow6bQvnHpC1Zz>|&bOT<$i?OFJ<;mO<6_6GsX6Q;Qj7 z2?(2>-SVqoh)l~H?Rjr`=nugY(}S8}!!jR-*mNmvLHo0DCpQ>S@!48S%EQv zcxiYd@o5$9^`VEr)mOafIafSaN=HR`;&|T~%FE3qC@AKWsH!kqzFCs*nvDR_=YgEXPmxU5Uj9 z(-k!W9Ack$*WB#q`(bt!2qo}Y4$b;&ImQ5{RN{dzG z1_*|*R6(={8ew9$*9*msuIi3xDMiQb(S=4^Dq+fWsO_TJeNN!3K$CmZT86dVgTbd6 zbH9t2zwqo57-)<;{u?AG60QoyF zB{P1y&Lj?h3Vm;acmL7GO1RTMzx;*;+RpJz*5ne(rch#1{Q+vVvB+vlws%cZu9@Mg z!3Z^Bu}IbH%DhOl;gh0nS&*i;^|d|&GYl=rkMw=lZN&l{l;$GZIzk z>&+nWZ#!B@0yIou&@|bx=PX(m#g)IRAuMVOueO$}CfCZwRfDxB%W=;`1pU?KL8ftQ z1*$~d)luiwPSvHja{MykX0o!NTDCOxuC|Ve&dHvVR9w>KU(F)^ifSj0tXp&Ls;3+= zS3!s} zNqV=5fhZ)0J3aV1t2`=O?a6{XJYw3I0Zv{F{bVRqL-|C(%Ta2%@e0Ln}oL{e<%=xF^iH z=2G}gjb<+hjI<0_8p^xB74+rS`Cb4((^AIqxqE{MS2D%LaU^Srq=gS!u1z%)jdN3Y zp$#i2gx-cVKon!k4~>qypY!$7B@;ftJN@iFNW)0|X;*Bi0(m&e^p}c}dU)ux(K#P_ z;oQ;vCJX;T+~IR}H)Y7Yl-^4TS7bBrv0QPqm@}ohepn3OpBS0jl61PwL|mvtaONUW zQ;_#rVI5%pIvg@@AA7gV43A0u3XadZ&GD)m)x}{nK53Knwxy8)$E@+0#C>P&9r(7j z((#y)`m3~wr)QRSx#RJHa<%DC3!T-(OKW?5<3zfPGyaGBga(1a&ra1_No9WSEPt}y!iBdwjwjT{Es-X!6= zYY$|5-btiHk{^M3S}=+)?^5-9TJ4CoyjL;ERjzWPz^hRYC9r~<-jpIg`d*-NqA~lR}s&V|Gqp#wA>xN z>?If9Xsq?RMh$!=$Z?2FRzA)sauwEn!%&RFW;!}o&dANKF)I1omPIG&*edoD(nv}` z#Va{n{j!+x0Dkn{(jW;iAPsyO5kmKa8Snm!cUF9Ja^fAn`TRi~{#GyWI#QCxY#o|k zD_cku@GFRu{-LxKExG`@aX!}VXgQ{n)~0e-3R5E5g4jCP2vf8laauoWUPanXZ-Nac z&bbgyu?Fd1`XCK+9Ylm2QfnA<49gKo!~H{gQLa;2kPWqJs#A|dQbv#D_Pmf7shf9# z2F3k#PF6CG8qR23x&)UE1#t@pU(r}F9LWw7x;m0+f~FK;9MjxIY#be(7lXWnNi}s- z#mc!1P&MVf3w=vlLu<^^7C$de6~)$_!Go6|5MEA3?+Av>=*h*-q~A^KRpbAVvsi|+ zIC&sz9!+ z`EySe2YS>-C@z%m~)j^VonKvT+td3lv?Tx%@d3`Fv#?fhJF4D_dSYgg&Ls)HFyV)@!H&9wnk zAO%Q?d4xv_2X&e%=0|rNBjzAEFm-l6KST5$OPgf+767E+PiDh~-FTNMD=IH#WMC@r%$fHC@gnm|)LBMe+Rhd;) z52vH3utNRLHZyKEu{oQUiPQeUr-iOV^D{kSru{1FOha{cFxxDKx$^3{B)Jp|l3Hb< zapIgFGP%^e#nd=8EQ$7_tzn4z7q+8G+P~(X*pha~!?f%CG)t(?C3vV>)pMpjkcOk0~Xn2#)5-;LL|t>YktgFd)&81cSy4{yF;c=rWM zJ+;2?&tT~H1k&#<&EHlavPND{LcxYMN|DGebWH2E7|bD9ehkFoA}UmzR8^nx&@){7 zN!bnyU!`EI6hbWWE!GT@xD;=b>&eqFc)h5GAbyY^#9)XKh=a4>6hUwQRW^1m%W?EF_9ZXBEQKnZThoQvXp{TWR=!5 zl0XS&@7q4Rg`7M7R>ZhvdQC1>T*VsQYrlBUOjgLPZo?v?c5KXk`;#f~l=- zkUYO?{9IaD=#dgO!O&UIX=t4Jd-kpaz5{<`7IZ3wv`K(BtNNMNfa6k}iHwTo&0^q> zDO72`9KrSj@>}z0%nOZxX!-sLHcN0$pRk!qFkx2L)+EdncbkIeJTH=Wkp+SX)FU?{(Y?hQg9o#_+cwc;5QUms-YJ zDsW|y0%njV)jS$)M|~yUYqAECkskj}Y3B&{1;Ho8t7vn2Rm_&y@yhHe-Ct{gD|k;c zL&@SzH@ojBPvQ?tzQy%68XYYO!=X;mvv9&QNh{ z;L^~Qqd$J3WLI*Kan;04O%*AWUz)04i!HJO&8-yrulFRfGTtl}eaMOO21HBt=#I0F zXf$d`O9x+D6hjbUgw`Zvd~b{0xlr@@j`tWlYZ2P>4Xt9m+}(#&PGiR$M;32FZH2L# z&V-MR{gVTD?$i`ZeDg6qi#zo5$sBVy8VMfWq>GO0B9^r-M|$YDaqiwZpdM>GR*Och z6-u2Di!Te``NGI{61VH4%E}G5AKwI%Y;>%$lmtI5J{KH%|F))03kf9-h?|b;|E`j* zM?zo74@my$_-0OqyOU3IP-Jhn2dxA21VdfSah_rS$+Api((J6j@+hDs!$Z>t2G!6W z^EL%8<45_u+eSLU3nUKjOG&MC$;HfvsT_#i^!554YZ0>7CKUKwWjDrX9=88Y4*)6m zk&PNd#DHxIUkGKfS{SCA5lFn3+n~j}z`evQZXfu)ZvY&}_gVM?|HNbDIE1?Y`KYl-Y3FH=u4@ewbSpa#MDHWWl zR)r-~N%2VGR`H37n+LzNBSv{)N?DZ)?4&3i2)oQFoDy}DO2K$21wf0mZ zpM~d{oSSF9p}aRJr@IlM?D=4IJ`W8)=dQ~#ed%>`a85>SPhKMT1+Jp@o{4Y-xg(d_ zjGHtmqd&^paiX@#>b&0ScPn9a2?9w9uj+4Q*D8a1`k`rNqv9z2KhjZABE7Z?^5`E= ziNWr|TQD?P!g ziK-b-t{Bq%gUktarlcFQ=|`bXqm)_TmO=>6FM09ZA+Y0R+$COM$uy;_O}dAyQ7yUG+i~I|V{-rwrewYOiCb$SY`ruTzda#eETmXCMZK5bV4;z4=l3WMmfu+%fkP_LCX zKGG6phr4O{O?z3o=cm^k(yM;qx#`C8>JXwCwVVgug7}UHFBDzbc8cOt3(q3{8PjVB zo?W88TIW?2bivfQ%v}@Qann%>1#LlnYCb3$gZ-2vt4m}kuDq+b2;MX>YOLL^S`YmA z*vCUa< z+oo{<_pWS7Ibv-V;Qbe`gxkA}*%w#FL{2jSi4_BOX0P?%63UkyO&*cP`JveK_T_j^ zlGsrnOJPjLgEzsf_n>^f>k@!YcdB6{h|!v8nV3^xbUsGUL5R1(nyX$A|tM6g- zSUl*`>#P&PJhh-^=dO#?q9Ah5oI@17?XMT}AlK)#o88hZl98@B#JaE1*P@3JJ}lst zBN*KbA{%<>I{CaIVR4xb(+IkJFhr{TW-H87s#E z6+>p*(XyKelbnVF8Ny71m%71uYs^kB{ny zpRq2?Q;Z#q%L%R-4|H1;{*=bjo7zSyt{GhWWOI`xq_3^niT`t|y;ct>k5)NQhTRS8 zWOzfav#DwY`al5gxv=b5&=eO5u~zH!&`y*P`h8mPb_AH?MKF=>x-S^EKn#};U6Jri z1dqpSh3XOEnvowvcg?4!cb6!O>5N>*`Juq9lf$i>R|g`3*Cr7jR%?YNOOM}QFBJ*g z0zvjMpJxp?+@QA`-f{IPGR}WR8K5QS5n+SI_UR7_7Z0ieQN@7qH#r_ z@w}P^EUw1mq^7hPyYXDFlFwe&Y8wb0ds20g+96QvIBCQkqpl_H#MdE;De{*W0twm> z;Nr8bJp{%%Q*LfI59lj=Psn$@bDoQJf|T~HJ`)?UVOya%3wqZds)g&= zgpaOT-rKnA24i(+Qq2nvpJrMb9~dTY$uPCW9Ug9f=h|$}jBll5J|uT?4D!1w)XU-< zTz)m*UT4np+RG?I^1KwsyTwNG@jM{65cu^D;P5o3Q4dJ=Zn`uvGyw>B#JhQ zbp(+wFEOH=Y*(%AECHfAe&>=urcCpx8E;vWLzglRN7;#NlOd5MCOvA)I^wDq2d}`^ zyJ88kAy&@=EwL=x?@mRfyMCx#+0V55oZ!?|?8>($UGPNPw90b1Qv4O{;gy)%^xk-ay*H^PX|Mi%FB&*%^>dZ?wD6|T{w*na7kp26IQ_}!r8FkJ`|A|VEFAbQ z4R&{h8MRH>jj$nO6?ta(oBeHZMLhjaoww?KTjl5&$fU+LA`g7A5b;s9p|apA2-nc% zBZ3X&z+gu`sBHcrJShlEKM8Row1YE+WpbS@9Khg%FRm-7W65;tZ=We6r@V*Fcz@?@ zE#35l>NloT#h6&v^pN5D@&Z}UjbBzqdw2qRA%O^gz0Jez-hHJD!*QA~;m1C-%T#stVvuHY;>{)+2vuZ^>3toVWBnaUS756t{0SVuLoI1F zk1`V=>Vf5clqd`tTrflz&AQ&ma+r@liXb1(aH{S%pU zEt{O?#`1YxM{{OKX(Vi2{ExRI!pXzR`4Txl>+L^Z>IC8CY%%XBGzmyo3a1dUFo`WS zRg-_DeiJr+)vl0)`&MdY%^F~&#v$<&-fi~Lw;a14$CB;pw;H>2&GyBDxzEv4w*loe z9~apfpTR3pZB=iW;h0Z|=9o)4$Xk}fUE5J#h$PppYuyikLj49jnDALxc6L7(Hr^rD zP|z;f_7ddz`sp4IR&kKe2D~X6$c%?opFkoCC2W`SkmZ0?Btaj zDE??E;K$`ONhW?#JAIy`1-J0;znX3$BCKQaWeYNsS(U96%R1II1jZy%L^8Wvl-e?| zk}CmP$Y~0U@rt@Y+JYZNPQI|()6b?dUulAWFO^l@>e)lub)9QT8jzI3BQMcW3h_;q zcMN4?_vTQ)DPc1?#$B%8Mw?ELpm>NcYZ;Pyu0yeUHj<>K@~$^*I7AeW-uw$=+INqg z4Uc=FTGh{QYGx&;7?5=U^;5D}yRU+r9&H~3@v!{$YDo70Cyz<8M~`-sSc_$XK`02xPWJX z6!SXSvAv$a9T!Ek)3!7_(mV3jiZ6R~Bj;`s;l0|^SS<;?JJ>$~%e`Im<3S9Khxri09O# zNL9Vy8-nagCS=eUyq8%UxYz@pgd>FGyc`*0)AB}sPU z;wyJ)5!2gA7Kq3Xr950fcQ|#dsP;?n2q&p+RX2wZ!MT=FuZ<#uy{6n^66x3!E~)qt z$z`We)gjJ6yHdZ&Jk=pFZ^2{eyixwaul=SQ&5vAfZL`bnRMrP}_D9%I-*Q}w0oN>C z4><|wfi#|_{g0Q55!!P%BT~px>B{9xjjPRRsq0@s>!5))4OW6WYu{Mzs7c1 z_N!499gYcDPpivDHHm1*HsmR}7~j%JR-bb9MyYQBb(+&6-t&?B+lYbBit6z}$241C zn`BN5$XCk%ePqnl%vq{cJ`2i#>MPQN`-;-qA6%=gq& zCc}D0LRCb5+tE^P$|52i!mN@5S8m_t$gN8^LX;@MZSrtwZFTuiw}T4d!@I@3M;NOwSEJ^Hn>|XOYp;HgY74GKieIFiBZW0IFWnl5?3D5CT{YIj=RDLP`KBu})bz z!VPftPtc|tQ=)=J+mugu)(wm;+UuXNu58V5$x_#E+U{G6Xx6WnX(khWnUbxEciQ{W zb@Yr`sA&$4YUBU@j_oXCQ;S4iHqHx-!2&={>+OD%(lr$N-tw?fy#SVH6&)>Uet}1OCjH)Dhf)(k2cr0Mu!C)D_A52o zo&1$n9P`9(C^uo@#O|wj9kk-bk>B-OTMQW4uhwJDh$og2~?|j`JEs zy4_(8-_};>2VN+z+Sfkvaa4>F>a!2Z#gx{^F!0w9?v@9d)`d%K72Cy2%xe22L0a>< zjRWd|kG}(+-#W*sj0@-czV+B1`h2c6QttvRmhiZc7ZGS5-7f3e=#;kOO_&drY^fV& z$Lqwu>t-LjY)OWLr8rO~ejEy8PPSV(X#o~(JI)7q;m!DBa zt#I8KP2@2uh4K}pi%fGZPJ5^4JB0ATG<0S>OV? zM>0=_m0mBH@Fmm1iw_mB^Skan?gY5He`3wf>_3U~3WOt{y>p*2 zQ9v1%x`ARnHodC;B2keChadq%0Q=A2QQ}kkukpVdG#KUoTHpQ`Jsj;=nGwK9|4YHa zaKX4K8FpUpmcjoo7T~3(|A+q{S8r@RR9p1fvF9-Pld0b2*uSOmd>WuJ$#6S9NIa?C^7{GW2(-)sIUfBk!nsT#Dhi?7+0$YSYiHwW-m^lVSED$I8 zM9E$6z}ms@ z`9r}<_KFPo%gXSYffo4@=i%h!5myuy5mhu$Q#0^z@<>k~NBMsW@TU`igZ^X@br%(d z2Ji?61r-P7Pd9)9X|yLO503or0~LVs=skp&e0-0nmLdH$vAauyz ze!4iwfBf2Mzy7y5m z@F_Z+{kkrL!6eSzCBEh#1arCn0+bIpNv7YvuiVN+&A(_I@PlORG%YJ&_vRmXwTBo> zj_Im7R{_D6N~N0IJvg1%0g@u6SUWJ7Krz3|zd`;B55i+UsPDf=nYAS%u;*KT!jWp` zMsxb^kr1Q(wEe-hHf?x?9~Px8shaf+U=;<<8Ns_-+HCQi-&3Ha@Lvd^|H7l2Y}Yw8 z&^Q~R|JCvbV0D|n3G<7$?|OxPrZ=N9VYA$z{z7n(+-5*^SEB+)6eob|)k;alE|5%M zKw07N@E-^m|9=fS-q2@ly?tcm%K!7uUE|40)WjM4OKkMC+=J%!WMk2})Hb;?HlKN} zT{VE@8z!bG;GLSw5YG2J2xKx-VdpOb|9_8KTJR|7cUGB~0qSW|<-7sVW5aKmQkzLC z_rPm8+U%~2liB3Qy7~J;g|F7%9HCmdgm=o26eD~LQOL4#LdN(%y<#-^Pt2l|KLGGA z{j|MI_tU7Yg%ui4dHo6d9&v`98@t@RnX#`LFUZp|q5He8Rv$&7+L+nI_r>(YfdCY? z*|gRzKEe3B2b}*lHbi+t*m%vmQtwpc@#u}trU*^$wAIzC?j=U&$uk{NH`!O?gWtLl z!-d*K;)H=l3C0|g$xsRXOyB1-hnne|kYRCPlTlqUd8mv$z(Eb*?# zv{y=|x=d$wqQOZpV||DJ|1z5DSNmkXm%3*wf>*VQhxT!;%^|KLY~&ge3uku>n?bc- zi#JX+wLB+xX8^s#wRHU*?;cSHZCRsv5uOaWXU~uFQ7kJQ{@=KXSX7&otP^+sfmh!C z2L`c%7nKGgKr*SE{p*9fHnIk6E0fcde_%rh%^>l9fu@Rr$y7Ak7FN@fQ5A>Bn%TTZ}sW&fmcO{v&?E9si)wP2rNtH3jhdbhS9B9&t^pU{2I_c&Ma@3TbOC&D{6xL z6Bqx5E6V}9!i(Pb9UQ)Q8@o~29HB+KuY`57cPzM4U~Oh};p5lvwUQ6uTLDl4wc-Wn zFA2QsE7rH{LfFraw38|>BAbTh@N3gECi4Cd!)d)ZnThmLti2K$zRq&EP298{v-5mA zXMf>qAl8&?HxZsG0uDg-x85Pp(aa<+dLbt>oe3WHGB?&)R^OY~K_`(?~;y^-p6x0A86!OsCw+56Y+5!NzG#Tte2h#%{t#p+*0-xSrj$sSs4 z9VrdQyqMTD+qIr+a=SZ~AE%b(Yt7*QPY(u}#L41r4f#FWY0ucue`b9kk}2qWxqme~ z*GxH4y6tvWF`H7fc1o3%MgcE(KzxQmxdR5a z93syCtJ4{{LOD*zI;f+?^5AP0lRDO_z`#cv%Mo{fQPUf4W#C+q)n1CX3>(-G ziXdcUma#+T2?n=+pym2usX%k(B*%8stF_rXs(v5BkvV^%E516O)+z8AMTbgTQ?AoQ zc#?#)I+2{6J#}*(zsL{~tIfBX>{6sn`Gy$ISN|%34hBJzmk5iu z&b0V0xxu0fsf~F()M{VV$4Be=q~jBi?kty)@fSUnoiOkN3fI{4$kLO`k@nbwWwFzS zDcwr))8mrxaHNj<=I`d zUR!0h&G-vlKjW9I{E=2a0$&X<$3@S_Mow(3&>DPn!=_{2xln zCB`%+whqqQuVy!LHDL0&*%9v8%o3cv;r({|MaP@c?wC<&&ea#KJu>$V^P00}6W@aq zuAxQH^|#Lk##-8ZE#Kl9F4ys@F145&PrPxr#qVL;_{;v_+8W3NSn?6}XBJnBH~T{t z<`-1-K7Rnal+~Le!df@7oBo1W_gPsrS!#2xLTK=ynyMmX3oy^K-D&hy;#zQxfho!C z)Fx=I(p*M|v(l;B#fYa~Xi&Vy3HQNmkRh}KE>N<-eD_4##macg!crqkDtg5y==2Yu z{5m=Qw@G``FAhP<<&jLV=I-@f%~JR$U{E&p>3`X>X!QaOoBC-RfC5_7++9$1Pg<|EFiVg!lieP0f=a;_Ns z&Wi4YkI*v_6&>@;d%*nmwQgK$8=9WMOG%_ zS?p}@=m7iq_}%{zjbKS^be1ji(>X2DYjTA=Zm;<({j?LRk6u|-S6L(1B8Im&8#H4( zw^xjNEq;aG2BNDeT%1h^o92gRveE0b=-T^d_alZ+Y4YCb%wVOD$YVK6HTgMDPuCju zB;@V(7%fB3xJA^3x14B*pGiZf5M!(`_&d zG%Gv|$IJqgz`44~PNeQf8}E?IF>iftp*zupFvqch+1Vce+pn%Wi8Wzw1F`0lLigR9 z_R=rYqhCz~Z}rXbSRz>x1F1!U76r0vMjI0p0wB#V?8GMh$WIJ3&sW%fh51IFR-%=k3p*U%DSA$y zkzVs4e&mKAR?SAURZ-Aa(JX4|&&OyWmQ8%u7hccRovH1xQ`>A`%E~pKv6FWvUt`0Pypv^Ov6#8`Exgeiy?* zwIyeceCfKa*J=P1OvebY1V?r0T(;HRV|rMdQ*~im%5zYI&+g2bqPe2-RJ@E+`adRu zrP5O9E}JK>vTxxQ{ou>`<<)>C^oI$XqF+u~IN%9SL{U?eSi4l_&0v zcW+jMnUst5zxJTR*@g%%L@U9mz;f^;LsEkM=lrv9Qqas;i`hm?AzeT70Aw-)$uVOe z!Yj;)2G=&8%FThQvnRA$<)~zTn9duzV=sg+I943=9AT}>#ok>UNr6M3R{~ zzVF&R1~W|*>Y|X-qStb1%uQ{WYUjOEr7PRJ5KK9Br8ZKo#NLUc8y(w5Hztlx&pXW9 zp+gK2qvM}=itzOHGt5b)O)q7=%N5p`62?6hzFG9i>W)5ZjCJUo99!2G-@nn%&7K); zRwaFtzD#M$!fg$p4Wvafn{Sd9?uGOB5SfD@CwWE5jO**{O2Mve$rX(%_l$rzr}X%i zW;sMIN+<#7_iL=rb&s|zEo{>KcGug)R*yK&IkZj`$+AXUpQZ!1+6hQt%HzW8{LoAw(-WcS5_e-%F!M-(X)jc|)Irqo6f;M9TfknsW8Ln~?rt zJ5u{v8aaD-CNNKx;b3708WWmcHyix+94r@m~pdH^h`pw(Ucb&R>T5bj;tqL@>Qb zy(a0B#e;Ptauv!Q&>f((XlC|xrp$1a9N#FtFTJC=PMOIv!j4)#H-sC`MLUs%PWXB0 zc_;32xdbTT^>XbRoi6>w&LX8vVP8Pj^VPjxiao-5d&0Tv%cA#x0Gq9v95znTG;Y2f zvZK4(^8&${RKN(BWQNQt_A2qa9K?zR$;V2iQlmrNPee7mwI=7A7nYRlFQQ5dtBH$~ zOcM%u-Q`j-9zC(y=U~`kjBXi~6{*~=Wy#c#8g{3m^i(YO`U42NViS%y%@UE?eWMZU zExb^)GC5Xf{zC4xIUcWYIprUpASmRoF(hEJ!F)Zg8Vapy4!1`&x^X z%-3%Mjthg(;9Aa2aN)mG6k!cJwesRUIkG%VW;sZ^jfHdGTj0EU5$sffKaXW&Np=LC^iIlNAqoU(#fa73@Fn+Q9L(wRO&&pk%daBE+_s6VmLeD4Njrzssk=6k6dNa)N^&qIg%V} z`j|%-*RLy%Z8WK0@bSA@z<~sEeq_8apNhS7azBieCN0r$Wpd8wg)i&v`DJY^^DOW5 z{Q6Nnc6{P|Ns+ABRP5EChe3Qh%wS9ETKdr#N=w|6vtsg=pi8sygk6)tR={XHf8w$G z^EBQ0KA%?h*5Xpxl`Z1Qn}m6ZLh^rDNB^rHI%Dd?hu8IY^zRZZ?`AWihgJg%^NqtW?N=I zHgqlcj%nbISZls^++{|VZ)j=!Jyc4EEW9%qRI1x%&Qa(uD;#z-H#JfjHhLSfd0)Qk zXS#-ajrZ|~<-%B3%9*#qNdElHXpQ8*+bVhl>~^q#v#oqsmt1#9^mZ-aGNUiHz=bh> zc{kHy_U^@?&C-aTLwx$u(wrntkg!T@m#1U~<9@ZvkEz$@TJvGxYTkB{A8k^Tf-CUC zeexr8via7;~Cq!?W ztuAW9^-x$ge3xsB>p{478RLOQY|D%ZxnA8>whCMu0;ElkT58{=r5*Y){1lR!5nSnp z?0?mF)jurc*VH`}@Qb!qKM&yc(iB`~a3xI?#fhS|`2J<&{2i-ip~A39V&{Zq9K5eP zCH1*-9r@{t!qTw|A%bG;ICo`vVkr3^!1L(mbJ-M@RJ7{r5&T2tBO^MnZDGN+JH}a` zUU=5>Z!BVM{@d2o{CT&w*TWe%;)bK&HXUn=RmyNMu%WNUpgOxItem;pMj3O9rMjnM zLIh;GRsE5|uM94TB)Tj3r6V7YfGFkNdN9XEkglilPt^m6NaQxihYORwX@gx!vQBe#CEz|fkxaAp z>F~8&wak*xowkPdDc$Akr`CBpTrVFS0{TQb1UwvEQ)+4|I{d+v(?v(a8in>GgQHJS zvGQ6Y{z~TJP#}aLDj+FM|A_xS&0gj%2j1>3GHm?shB|>3jWY==f>OcX0t(f?uw@*M zmij5z7Q(z0g6&3azn?b?`RdT8uV-+f8VGRUW#LN?RLD+dJbziLbfh|+n?K+}MeCSZ zzNas{{{8a)`N*2HIgHN!vdvwkvM}4Qx?DDE^Vqp)vJ4yQ2&E-NPT}+dpZ_gQ3hGWw;=~ob8q3g`K0I5c~eChbsRjb^98tX^VKx6ctT*B*VfV>et!kZQR zF47QP&YETlSE@9d>|5YDzYv9hB;97V{zvU#VOJWBYHe!GwXh#(W5bEN^V;pcTya~NaK3ma|<%`cy&FlBC^)kq&2QkhZ_@HvT+{kvIv=3Z#-N1n(>Wx}lis8jK zO>0JQxUtY&P{5ZmEoG?IEOhsRmQaSEBvOou4yQ?>KHMdY;{2wm&T1MEg3e`(q=;Ql?ZU>7w#;S< zLm-(09sbE&(q^oaCh?61R_c#77A|Dd{pbLO(Cwd*f!bqGrbA~2L>=Z_wo6@NhA_DH zN){nxKP4D3P|W=!_xQX->bf71ZdYkwd|4=977+;uFv`6tW}w20Ah>K?okR*Nv&7)Tx(Ec{mc_h zFm{{VmCB zF()M2cG|qlba$$lXnX;bY%&3dXn+! z=WjTF@Brq@PI&32ASBhIs~$n}M-!mE+Zt5)54t}b1%07)QJn{^i)2YOL* z?TX^$5<#e*z(RWWvqqT7w*4IoQA8fC+#FdbQMkkE3H zOt5|5w2^77GyB!g>G5_`ae4b`#rC=Va{Zg>{9$L}xr7o8q=D*4ff2k@TiBwPt7d9! zpLuHo{PNSD1{Ic?IXhzEs%{iJr4j~5sDvjBTMRJ-u!R4Xkg3BlvA!q~=6;#{CR+O9 zCFsOzxwqG8YOp>gq+{82iLh-iX^V8ybJ!Y>KT_rgQl-GziEFM~6X$CQRa(Yh`x)jD zD4ef#e%sfMG#+4qtJ2qtPoKCNy>0u|c^#At?InIekxEkViB7=2G%YsrROI=-aQ23< zyvC&Gp;2|Sg6D#J^WHUu^<}vN_i59iHJ*TQxkIQ@#Jev;gx8&mR+66UU#$sQ+MQ)$ zHe6zA$xJJ0X3L~E7pwEbfpzM|`4imQnAXr!Gt6=g+VI-&AM-=m!j$#{w;F|BD@j+j z9I9J<(s%`%o5BGtd;BkKpI@L))ixo$43sGIoj4Z_YBXkcy_qVYR-!Rqs;~C0ps0zG zhgp9z8+E{Cnb1n}6?tNft<{J)J@@Cg1t5VLYP+#=dW;5R8Z0l}Nc)uAKY*z=-oe|3 zrgL$>Zh1`?&Ye*FYCht4UzL;1>IMc=@IP$R^OS|4^oOut`~qC#n(26MGZ zPlt-MDvFMn=od!qD=Gp0Q5VIcim(XKwoE79?o7EkCuc(CMBGco&2wSfA8jI&KD`5b z-Wtya!}WN`dypx`{9R?fQ-5l^J2zqtneTKTeVl)2r@e&UR8dAeu+wNN;M_t*?dut` zk)CTGViBo1*9v;{ zcX6SsUogB0&UQXUTV*VyeWbMnmSg8wxGZJ|5VsYn)fTENl{BTwde zb}o3L_tbvsOnc@?ixw4}x_NxcG+l-hg%cqOjNmAVra`Z%1IlrKw5}`Zb1~Pv_(?5_ zSGTt4$fM_dW}`Aw`CPp$bx&dGxGi*BT;S^mw+ad^lZG)qec8<@^NtIVSEmEZg@{w^ z%zM_xck}0MSoJpzvZPn7GklS0lJyV6(FR6Hw3ogaacUZo6bpr?-o1IH%RpNbdzdwH%1+wm3we}VYk)J!4<0r<7#AUMa#Z?m&VQ`<7q3f5`SG=j?XPL&B&U>Dd zLKR!(+pd*MRnjxL!>5{a2_+vNk$)hJc=yiNB+qR6iT3a=)0ENKH|KlB>J;{d z@nARQ(K?7V4c5?S%~*t*y?*F3yl>?S8L9MP7fjPn@lHiVmak{hJYDUjzHidqi3qMO z9yTA`c{kb&VTAA@2cuM~OC5-8L=tGA`K(XC+3SP1y3s32qddg)Ja2Ujw?R+(C zjmH!D{xRo+8*8(lzh%s{MkA+XXAJ#hlSIri74EuS&6vsdQPPE?nP|Ml*de^hLYa?a&?uN91aM z4M2Ywg)vo;V#IR|TNS!K)X<>xA&g5}R_rIQyXs9vdosgqbfA3k9YdUf3j~J}2n1IyA{Q6e~4c zt1D9rN7c?CUG_bV@`oJiyKj05=Z~CnW+e~ev861jfm5WcKj)|(-p4k1k@Y$==8ZA`GOnZ`3 z1xC~TcAYJ50UrboUP+hh=%t?UbpA~U-Ma@Lo^!GKC>lu0{;>1%x+gLGe3kk|A=9q= zypNnQA4L$S%G4J&kIXQ$nF!;z7i8@MzP`b~*D6^3Jfb%$4s3A0yX#!`4)QCVngv=r_V!vBpt$X<4w z2z`@9;jLCSQSlRNYANmh!dzTQWvz-I)A^+JR#a2JbsjO(KK&{cZ?!dcYLIqvUFmRQ zM@2gd_8jdh?ToqhJ1v}>8mn{aY^fPkZPzf78O_@tz)j&plPtKTsh#TgvQmN)b?J-C<~S992E$cXrcG|9b*c6)=ng=dJg=2IGK^p&$f(Pb9PkLoru#2D}9L>;yJXKfopt6$xb&fElv%D`;MHirim0| z824|MBXpF{a|gIaXNJV!}m1lw%&&HJ+D@t|XaDzvYV z+4OKJ$;ekS@#eurv^Glh*^Mj5E?mDNoPHzlS!t;#5>FbWzIZjJU)?J@OJ(7?G=0x9 zSUw{ob+^?_VBK`~Ipi^A`G}s4UZ>55STWA-*^~HYGhb&}w;le2UVvB8*G{dG>~WPW zA?ZLY_EVXhV8c`W{4gTjrKev`b(a>MwW}&7U2vy}EpddoY-zD$J}1Fj|H-JTwyVC|kjtO0C*1UA9zt!9u%{ z745^2q>D2+=hfCU>>yt9NNN7$c4KiiJ&3cH4CQ5#WuJ${V?TuBUwM-be?qS|wg13;=U!%*ttMl%1{DI$KT{p8Q^i)tL^Yzc4 z-$}wF7Z?((H=T74d2C5Pp@$HEmw@H8*QCs|YqKi^18X0NX#iXl^FX_L)p-zI?lkxE zl&Hh0o-8SzL~I3+P?P1-fvYFCu`nlC>oM9XQHti34!Goe`1$au&~x65N~|mvDgRvRrsy?ypj+oM z0IV}q+PY?^-76Vg}T3QRwb!X~}SQ{%9HsXMq zq6EOFysyJ_cMn=pGa}n1-#x>{s}>_sJGJg$b-pvNzv{?ZyO{D!3CYciSiYcO=($N! z$kpIT->N>fPy>j+L9S-a!mrIlpOH6doqWfNqQFKxuG4Edci}qkDH7Fe%KhS$UddPW z2>a<9&#TKdV;ODtYbBFzX}dLOA#rC%>g<&cYVM^!&uMG>9xpcSayhNrQV8T>G03h4X`)4sm?U2iMu2%IfB`{b!c|QhY-KxGiIEw(%v1(Cvcmo6w%ZGJVp=d-YBT}~ zb6-XlPmz5zz3-eYft-7a;(J#-kB(=_hc!WZ>ZF&w)WboTXa9;P?+0a_9O?QccTNJ zs7f`mx;GY$#RQ9fQ~tP#t8p54TRP&Jxw@tA7`wc+s)4nyt=DTgW@VvQqlR&nzKJGm zi!s&7^ez{f&C>QTNT6?&axv!4if5wa+tRO=*!K$Nrg;*tY3IGY7#c)ldWc!GvCIP{ zhbwlhm2%!m?7uZqc*Ep5E3Ef@&(}EebWve9`t{np!`zVo`<)(H(sQOM#17no(L>GF*1XiB!IF5pd#PQ_O0kiWDx+Kw97F~q1q$YYG4i>h;2 zZM*;jO@J?QXn3>KuKY6&gp5aSkHAd>-yF}bc4xe2?X9*Ks>~^DhMlwehO*VaN}+RU z11)-dCD`W0yKLp;!c3oI((jh)xwm9{T_gqV>~`muQm~FW1Iq@u;&WD>1&2Jdw0MsS zXOST89))IaP2F4lym{$*a>O-q=nP!d$O-br+N#**KC_wSr?6>vN2LWtaz1u|8jVG8 zk?rQIfa;0*gl)YfyYd=)oR*UU*$*stDSK*?91t3cM10X^+&#=m^JBT(q}RNA6Dh{1 z3C6_f#Zz{3Zp$JWvLMKc0X9sUNAb3@cqgIk;+XC}2W>Q10pfJDxU z8lN@GVvrsSAFMla7E3>EB<_#(;G(r4XYE@G%v z?O4erIX-*#DjsHj=rp>R1Tj~HXGboc-`wyMDtKa5nDYi8*J3HC=%Q?6P;K_}#5DTe z-r?Hq^q2H(e0EMj%0`w}u0-})U%lO)8GiiqRFytmcbF!ri*$@3m2iJ6)HyV<7^}@P zTsCt3wx!qG-{Rzu=xIHoAD{nSefvcD;!>O4cN6|O-3v4%j~QaGKIluR&K?aW*Xp}d zbvKiW@UTnUM;K&j{8F`6a}h=kVH>2MP~S#!o0JUo4@i4)enF&vsDCr@@kds|&(=YB z^O5_>5%=(3*Ju7EJ&(mh{-L{aGIjK|^28BCTwEAFHuOW?W_BAq1VvF8qa0 z%Z8iV#jVZ^tA&pWw=cNZH9-_M74AL0aKmr*j#^>V2!RNXuCUZ}iliErdXxmb~ z@#ZHx1Pb{Oqty90?*duEF%Xe9`QZ$aR--1n)f+f!hW$-Z0)w~y`4@ixz#mTh^PcZ3 z#{t(u?rP&!+jDhN6uK4e&uKwHoM_lktz5JSsl9il5%I4j1Z^oWfWSzr1E#t%?b>>O z)qJ2iZEmZUfM`(&E}xBbKjFbUc}eN_tmv--Mq<`myLy{BTu$u;`u1vT#9uc=rrkxW zjPF`#*F3b~{1Q0|{?!LYF(!=gwZyz;EyZl|+vnC-E z_3^7QwlTUg?Xn>r_Ye8HV)*%eCzSSUWXs2!?e4L&o1+8@1x07xevLUZqxFX67)`pH zl)|F6EceTdb-594%$;qqn!_$NIi1zKsw}R>I$5`#qZXLF;VH`#A7-B!_r4XVcx)evPHn3Gy17=nMND=qs5=Kb07r47u_{^yd z@#VdrjWkndRA1e&%NX>M;;xyk#!U}S$Ycvb$Cqd78R!NV6>&*2KqGn`GxgSd?JFIZ zy%BB+pfAD^An&#ju`z3l#Ts#zCcz6zNmGpaz=!k{z@;(uJ|V@iSekQ!wp;3P5WZ5J zLzv4!5(D>wL`Es$bC3+?5Kd7(fYL^5Xx47*u@>f{Ipd}IK2CPT^1LJ1q(!UuMS}oT#UI zA123QvH}N=Ire~_q#|U=iO%}?4OR|QWMUsiO-8_X-4fi)`=QVJZH7@t1jJEn@4{OW zf&_+XEFUXOaKKQ%-AWep ze5LNe2Y{aqnZNE%H_I64WO}PX5kabcs9$eo*XMwd{{FLM>}$PJ@kzm(u@Z}%Pb%B;@APSxoBLho0%(EdCKt%(qY+8$rw$*pU;<5N@7Y z-=d|&#J=n|@<;kU=aKHrN4BxCIa;hK2BrPm#+n^SINl)UKr{9UK)!r-q`+9qf}mJD z@ykSJ;J%(vj9d@X&#pkJXNb?~2O7CQ_4!7`8m@Z_8%|D8d}@x}5PtowyX+fyQG}Hzq_7>`=R& z65?Mb`Thkc)yI00i%NtLFR_iiWy-1YC$ z9)B3``qtBr$XEUhI~}dy!1_-+eRkZ_IEs~{j>*meH$ZA1r=&Vm_x>98YeHvZsupowdf?I zUOvTRMe64tyJ3|j?!bpmlA=Q;G5-_hvV z?&h=v-I{j66M4UYtwX0j0MoM`=n+Htsk;75!-=3d_k`KTce_Y8ilqDd@*DMM*ke84 zx(9}G-=pB8jRhJLhF?deztW(OP{-J+!WiRvAAw(%L-}=Cg$wG0zfS#}m-rDAml5{Z zkT|VE&)$@^s7anKrSj-b3x~QZ$4coGnJW8k-DuBkzuvEs8yS|RGN#L;vQTK^3 z6|8u_wHGyL?CC3qouZwywnEvKak6m+_!!ffRxVuwYO zAWQ4}@uENvOa}r7QO*p(-Ki4M`>wd5&$Aq?TkZCnF6`GMLf_3?P~q=(Vg;fa4YDU& z%(}jj{7xZm(n_%WNK5|k+5!HGsTK?Ee1<1iATdb@NgP-xK?+!wDxTIaAy5xEfQ_NJ!+$_B}$Z`#u#X4_s6%1-Hyn-I^XRH55YNRZDy8=G!x zGXVgn69=h_O;#*4s}ctJ#4QqOq(0I@lFppReGh7;_lmjhI* z*k4o=^00cE!#v>%m8Bb3hp+E+x1SbLw9k}m^SW|qafKKNpuQwyWQlwmY78|-vnVjI zB(D*tru$_|7%%xGVObeP#!f(S5yBDfw8D8DCWwC8kX33dIXz{xQ2HubB%{~CED z?sXd#|G-?7Q}L*nSko?V!^P`a!2kn}=g)~)Uq?Q?cw{uDWYWIkGGLn451CAlNmyF8 z(||G3jnid9a`BJf2Y{SJag3B=m{bT1zY*9hfou=Whi{!@3OQ6OzkhI11M3&cP*5TT zV}q;R95}o|AB*s{f-UJ6>{VheRjqj6(OtG4ce;K)LKTJMFbHFMAy+QJ(}ZzLrW&Z0 zL_QN#t@HaAP5`OauRzNKtDg>j+;Am-rR*-lGo$VgE{PX63YEEY6CDkMJ$_kaVTl5bj`b4Me0n=$Ttl6$tUA1hsc;z z)n)@qWMJBP)`}Z{G6y`y#E8jtXtfF+5@>YfizZpG8d=%)`~wgfn?OX`MNMU{6zw$D z9Z^biJ74W1v3I#Y5{m-OO!||zf%%N#Vdz?r$qY%X6L+Nm2!om2_dqT2cXUfk=#Ie0 z*pb0SqqXCnz91LcTKlI|->;zb+YN#@&kHM~&iPr7&nP=`7RFl4q+P+Dx8%BI^V}bS zl9&j@vFSC97K6EEOdN!{MIz4JLn0%S4VH`2^92|h=ZcQSH2i8N0%KExzjLtC+sYxP z%Ex%*s@Pk>9d*d%eecJ{jr?WT45T0*eEhB)_9-ADK25UfF;fo=dH6-*Oh|%YX8Qxq za@qJWiFgSKCMHqr4^U(GS3i!G6R-g!okhk9i2_8#g$)WCsaJz2Z8w>xa{8Z%r+UVx zw{Pr93uh)8EWfCYeEZ(hhsf2WCO1S35t?*J_2m*5V@JiQq}58|xS1)u;W8zJKEbII zM>9{S;F`-JD%Sn-I6p&a1TcGqwh?AH7&nw&D-y%G zQrWCJ^D_U1PZZH+g^0%Dv0!iJ4yzHG5dEE9SLv?n85^Yqca1|;wG)_G4LuuOLXs_K z@GMvcD5H`-A(#n?$9x~rI*$$2enI?JZVaD>LE%`2)`J?pxJ_8%VQoCst~2BG+W_`E zqWuqGz%%Nlh5=TQmyt_GvfB8*ew`Dim8s#6pX*!7WjNv3W=LJZyS*O|Zp{>TIXoPD zPrUlnlZ*QCu}9tGvCtmkXA-f>N_1V%WYqHVt@1yq3JuQc%l{N)h^`nv9-#1ZdzC$| zSa9I=I?L=l7bif26&Wu5BZZn`*lUClU35z{_Zql{?YZua#~ie@0tt?))A zW92Ur#ff@>j6?bBS3ApgnKBBe@`TXG54(ZyAbH|rW(h{rRfg+H`emeA3y%zQUcOrs z{@_|lPUO)+c~YTt=d=}J>aI0gT|OC7wSO&~roNFo{Hip5*l=xQv{IKE9~t7HaQo3- zg~MHY68S;mIu(gv>L@$l_a7dbGSZG-r*uylquE`nuMc%y{+u} zs*886eiW{9=v-w)3GdM9Sa9LLI3SOCA{gbL)jyc8{Z;hMyPP5Xe!l>ONgAA;PhIV_ z@>|RomC=u?z`Uo=NQ_qJ^ISE;7_0J~5qCq~?lze~ z-nvWOPFnF$9){;m)1t1vRLrKA)B3b+TASOY>6qpA99yn-0k2S4B2tArgrf$4B|x&< z%SP|sK-{U=BU}tyUr8sPV>(cvCtakh z;hZn2&IEOeYHR+STi!9f=PtyM-@@oPog48fB3?A|ExH&viG&2mATQxCROP*~sFEoP z26t+P&t}b&1{5al(4>54jL5;pqf%|AU*;`-^(tn@ zMr)lEguN0IZe-0f?6{(pQh1s0ff1yD#D#|trIqG>9`OxCCKGtyG{?Pbb& zKT0qu^q4_yzkL>E4{pjWa^Q&?JR>SsR6iezN>+9W`yz@yWw~nlL#=a*#eBouj4U<} zcx3NJAq8p6ck9=GHPW?JUE^G=T0xBgMA8slBdTP(3o(#v#`Fz@p12?XB0tw(|2{Fp zwx!uiTm8UtS(163ug&w_CsBN6bqWvla-C-<;HN4WnL@gw8g(^4rAj&%SB|_6%5N_B z6Mv8rr(ZBAxRQPZ^bmt0zycy7_|tvX>RW|&$4A?iOJmjfh5llOTeW5;qVJ2)yzqM! zc~VNZjFWlazI(wE`|a8HWNS3nPx^^sT9pbwJV*t%0GGB{2&8H18V!CQv`6RoD2V}! zQrH(Gv6H%!Z444;U`eDXLjru|TeBnvPnD?UjpnMC1CBR+G+qt34^ME8JhEYQB*F!fq;j%!)48j4bw3k%^E}p+ zpgL^lz;Z0}`onAe-0bnMPE6Ay@bBGygSiS{AM*rizwRH$`N>TD>ccnGR6tITXH&Qi zq0QdH{(o>!$)CjFbth_DTCU zc7sLRT(31*vGU1v+2qn&uj@sTLcyee+)jPY)Trm~k!H2Mi)L0-*!59^_ zWtdQ`!BA=DHcKr&RLS_+21Av^SZRJV3euB?u1Z!neW?sLk2ySox(X%wh}Sr(NsC}- zhhZHp@A9s*N_Edmu-9S0D1V#vrJO2%UDYwr5e(jac)P4tf>9ywP0CvYLqd>R#D{q~ z%TR7j=bF+jp^%v8xKVTjO`MhZ65Kk|##;GyO?8i-%|EJ-c2-WJA2-uBY>#3XVtWo8 zu^Y@ky4JHLGiM>tCjOe@F_%z0g%l595JaG`;>}QLai>zvd(rX;nfzCpF^1l1wJvs( z<+QDfL7%Y5-1AXq(j~<(*o|maA{KJq&(aGxWanZ`zg{1Y`FMLUbR>3gt*0|%Bj2SX zf`|8<@pYoiH|#YulYW7cfDb8945ezOD8whVeTAw3GeFG0*A{3A2ZEj6EKT{ef@2fp z^y+kvwics;Bn%1Y$>!cA#ScUGC7~GS`Nf}x#q(NH6>6LIt~2DH7sfv-$CQ(k^BLf_ z{>Vvg1RHm`ss*r7Y@);=dJR_VGiHJ^<`~n~r#YF7yEcW6; z*AwV+`MX=vyv2=#ZW87X^92~h$!^OCwmTjiRyP;D;BC5p0F+Ivf0>NKlD7%2(iPcC-i;0EnB<#LupzbA}TaM z$cDcrw1^=aTOHGx6yK;ThotkoM(qnRXQaP`vLLkpYGO*HlxTe)j{&`CM)`ejdM}i8 z18ZUOdO1XUsjDBYL7$NDwWKRc{Wm5o9GCuafA5K6x3YCo?(HeeVwDm=cs+1}ERZqR zL>cA7bIeVi%;Jz*Z-%>lQ@0FjGv=B^GUJ6!32&<*w$;_^3o7=Jt7*4_hD#3qjTiab zl%K}Vnv-8AS#Z}nR5?01TTTKVzY%@i&#ySGot?;N(=%1J0OVhS!qGKk{Pq z9Y5S%Zm_Ik*<4*UUfWVB!dUy5Gv>0hq%lh)PkDn@Kl@iw?4oFbtBc zD*N7t-<`1W6rDpdpfvf_WbDp+^;K#$TY3A}cJY~4@!{tu6F-RMyp7H>kG`x-w^>Yt zmYDurH8$BAE7heT{)vb$biel3ey0=}fVM6tW9V~*Mkkck?51!mCfEtdPF&v^j}Ujn zSLx{?@(4Aq)MQev9EjBSm!j=yt(-Q%;{c+4CmZu#F11$Q=u$u_j*kq9On%TiP_YP* z$r0mCL9q>-krpl%CoRuwW|4;&?x)+y5X=}iGqXT9{_rLfWaa?R_f!h~?BuBPa?MZd zP%u+pT}$-R@>;`t%4S#ht7T`KV5_dK4Puvj@1rO=zKTGx$ns7+Sbz=|XJ#@)Xl@b* z5uh7)kI(B*<^1^ZjRdB0Lb_ORgV`I4%r3_TvtNn=m--?hd1Uny(c?D{?|+|nwpyzU zb$9mXwjS*sV-#@MmrdVZu!6Uw~t^XIzR)>sh$DhgEr#kpSAC?MiY zc2e1f@N)^xT>1qH6ygUI;`z;>Xq>fCm}8>Y8=9)=+&gSo?FQ`Q7t6efYoXf1W@q;! zCG*oAR!(noVG&{R8CjC~4p7cOWpjwgaz9hETt)NHEGd* z4zL|&`0n>JxS1qq#dB%p5}IVt^@9{n;)j;vnHbE%9eYxYf~@N2vL$g5LF9)KBHtW* zLo$Ele&BL7E6QL6_oy2Q_*^I`*z&YCgT1*ZQ_U>u9l&^*bv8zReAX%B0Ooqf>Vd2A^ii z988sIx`Y}7TW%PZN#!R&hk(Hnv>42gt96h$gf70Ne`yZn4guFaMG1dYDf+cgzs=*x zhKi!VX6uOe=4}h88pW7@tM;Ph#*4>}(BTPrnVe4<;+nez;}N-5JcB7!2T2Bu!A!}_ z+)T;MBp&1fqsz!thJX|qUHWs;!|OfJ%2~!K9J_6;84WV8aypt#t`sQZrs`qF3pYZ- zAu>~)f~*sLJ$-$MY?*Q;Oj?Vg8o9BXbGjTPsF~bOoS9raU7QJw(LF94vaAdNi=tGj za<7Tz6@kU8s?$oleKvF!8Mo5;&{;_u?;0znR>taWDmayU`{4bE;X>sqaVAlALOI0B z7iI=C6BrC+?goJ&y=NhqJwcFe z{lSfaUU6HYRllxbc6@Y1d`5;$zTsnsK$09-+}$G=1R@?J2cz48@yqqYxU>WWisivv z`U*Q4lcJ;v-!N1^>B~DFP7w&%fwz>rac)&Wixx?Qce&+rOQVe@H5A%fnx0xDursSi zUqyj++RQMHQPp@lBq&{+3u1@CB$X{EgVB@UqE?_kPT2yJph&F zc4K%eP89hm=lpJ>bbev1$uN$>3Tg5yE!bJ{Od0U8W1y<4wn(@04gc568Xd&;C?rn(kuh^6hU8T6ETh4^{TKl?xPC zMx}&IG}LpqVfo`fw+Xw?T>SwQj!TpoGc&91RB6e=@(b1fRY@hV@AC&RZpnN=OqWnn z_?FydmA$lN_Mb{hyL*wQ5=F>&x;$4o)Yy2LhWXil8pOg2m>ySZJh@EwKE9 z$XC63R;Mj_{P|g2NlMRVaAguq03N-vh5pmR zHLn?865Grd`Ol_!lscyfcxf;c71F){81Z+5Cw|?%B$_VW9nr0}l?zfa_K_pc2`wQ| z&maY$1i!G-DKQY){he8FpzgI1VPz^{8+ja%43l$5^>UpBC}Mt{+tH8;*!A!$Us2aF z4dMosq#64t6g;BPJcC|TlmnhbKjV;@+u!OuZ+&Uyx-)1~V-u#Z@IjXz9bxuyN@Zv2 zV{UR(`jmCS_n%(vFRN@PGQY0Rab~D|(0vi_ImDA9P|nXBP8&fJo4+*WsUID(&wkCh zKwic`pkhNsz)b&A^tqbqo{qS)F-u*V+jP26J4b2$*=mKB%EJ}rS;q8F`leLAXsfPa zOSGt#lm<*53&||l`5q58#sdi3b1Wifj9kffo+H6Y;(`;%B3NQ+0h3Qb6IY`Qbc{{2y^V&Y^V!7q?V1!%wONou~=@Q8{ zK(=6s%j|tkDtTFA%W-?!X4@Ut_S$x@K=FH(0^rp?{g@~-fhuztoiS?4%JbDb zEV$|0jbG%}aw^Go+wCW}+oSBFTt(lPPoO!(EU6?Elk#jTYYmjPaShWDSpM`i81|Z< zk>a`Sc|1^(4PAxQWNguTamlEFS?Z@Rd)ac9vqa9b!24(Fw+qgt&l1(-NVcHa(5 zzjm03OJktmH^zGQL4LAsAto>Mt*zHi5~k|C`<}4D+zvnA#fEMC6E$E6YV3q^!^8&*^jSQh-rnI83)&sqOsiG1ozuOt?3qM9hHkLWFzoTsYHfqs8)_ z>NZJthT4wvBW5~fSJ1Q9p^z$J#XUd!`CVV~ss8f1T37ihA6mDw`e!O6Og1rAZVAN& z?e^O~R0id)&ce1Vai5E;qdzC^ag9shE7Qqiq|R{h$6T!#_nqHpC{j2tjU&0f`d6X) zt}C|r}dCzr3O3+kW8Aidw|5SJdwtJCw zBFHKu3o5Rz4b6ek;uRV$JbR1Ji7%3Raa*ZTeRe{AnXB?*;)4{P?PuZz)!79r6}0(h zikoef;L$U}+r2F9d`@KSIKIapg#$lH0MW^e=&68b!Xm}<_Jbrlaw#k+v%iC97l<(* z^B2S!?sV7P%kJJ%sWiD9vz^^Y*>5<>9Xi z3rz=u!xuSb7`D|3DDt63D9mv>^pkX| z+?!ixl*UKpO+c?PFlxap*~i&uSmHFMV)?K0ii`4lHho1h^!EJZi&Tter2kcDbo zTVYyhbh3O=O7KpVwU+AlNWLe=%vdUUkpQKxA%=x>+s)InJ@GAiequ7UXOmTrncvsK zu+<5o64eT{4{}|OhSqk+!-l2gtJt~YSlMcdRA5c^I;Bl>FgV0ZZ|%7ZWxw zdEb`5J`#_h9|(;gpuyk4tpRP98JB+b@!IYSWl1ws9Za{v-gUN`gb%&SaQ>Q{J(RmM zsK;C%Fx9%os|p{BNUKMKk+yOzBM?ho|^^DkMMKSOhQ%MaR`2zVBp)uHmttAk_P$Jay&AKDXgnJIWsx(A3S z01$K+%$P5h$&|c`wyrsxJIz{KNEdqTmeS1-6BDZnC`h%b_x!ClQ&}0``#K^&(}7pc zq6gKIF77eiF8mXav&7SL!Md_IVk0w>**qa~lG-*Gh1T|5S#6?1@Joiz;&Euypz@C|%wOt!ht-45Isc;nMb{52dfCc~r}hdOw&> z`tODFCrI8HFmELPwc@*@0y2q-8-38<)m?{v#uRV#Nze4O5r`PMT$zW9m#zXX>3V7lUE3 z9-7?c4;|TYzWxJvo-sJm-aG|{rI6d1HcumQP!7C>?Yx}Z^<1ZmVd>o!%%szG4{G{O zXc^N!M3JHSZ~=LB;s}#V1M=#pe(gsuUuW87>bXrd$eD>(D5bfUFd@+=I?N+TPtQ-5 zueFCA<20BFN+rGk0Eyc>hgZK_8#ib4rsDY!SZv9vrO4CWQ|H!8ryHjiCr1?}{pp)e zDO;-==Jh@T@GzHdI7WZ1ZtiW)cw2(QVpc0WTeS7G0VqHQ*ADA#53@Iy$9wGwuwf@k zHFIqpc?$q))*F|Vj;!%t=HxA&+}oul!)Au3vh+(O$;i8UpLy9M-82iVb#g73A)r>a zX(sI%+B~V+s1100+NHBHdFsoNQQ^bydF@tC0z<@{=IEHJ+sl7M6{Js_zOPK)zbzEu z_2*D%)`lSl88hfpBgz(+GmyX;_2s_)jMGu^%+``E zqeRRpH6!(_HwL_XCvL0lI}k7(wN0%)8@6QYz`9jD1hnq(G5*ndpByRFIZ7oZ}#e$PL>SMgXdKt}PhEFla{Vb`r>C|UWwoi+1()TrGC960A=gwHy_EI_$zx^6 zD8vyqRpXY0(deD+lxyZpMYsJD5jzD&^VSaT#xOYJQh~}ibVFe}?P*h=OUC^oPX7RM zuLPa9E&nQjOnU<=F%WFnB;Z>Zh}pILaKQ+z{F%S()yTLH zRM4+NILQ>8-v4ws?1}Qyo>$!`t3bc_Ro|nGjdlY?4m0OOGjq_(G`69d1$Mo&srTBC zMHG?kcAWecTu%3L4ue4ZLWbicnx7Y!AIY$5%E(@K4BbbsUu7yP2zhkp4V%5cnoE)_ zFDTbrkQnb|5mEZpA$I)Ld}yz?G7}6*?|*i>KA>&2r=H&ku`3V5_x%INxVYCyy%O>~ zTO-LEHj(~iojwCBXe_mO?wTWBa?@^5dUD%1c-ZS>PGb(F@wr`;b+*>ov1N|i9hcD9 z7NkZ6loDUhK9jtq=w^Z5_OiQ z>ZD5^-A8Qs8f2||`r1o+c5Z>hqtoSzSa$a`RHa#h?w*G1{Jtd$$+_m+qDLUYsCc>? zXgbrD&mp)v79H7FD+Zfal>TOy!=_rW*q1PtST-HpBk!p=YL}gWvp)c$L!TqOp)<0r zl;ZS0sX?7wAYqQR_HtR=3+sxj(~gSUksV?C5J4ed-t>3il)x)%t3I=`$Riy*klMk{ z$@%(S<=P*B{Ew@aQ?F(hI9($cBRD4(k;_Tlx_l!;xakulBsFo0A(M zpQcSc24_0*wC3KP3ug)*+sZ-G@L~Y@pRqBb#Wz|8mw%qz-0327@tWLo!xjdM@r4p^L7g|O@obNLxf6%l$hM}N zhueKFcGj;D-oMvaOJV7K`e_rsW(Tkth$DA9Zlu$}h}(yqEy1?xUXtXtHPS{fA4Gp~ zFVk+ZMIUcsP#}YEOZR+6*<2^X9e#Q8`^G@TjeBg6-4dLh*Ej_pY_Qk&)mPECo71vx zubp__>e6)PW`hJuY?(Lbn zwXSw%&KQ^ddDHHW<^5#^9L#fDa4)Svt=7UyLCUPxUMu#Lo^~+A=Nr>uPg^LWHZZP{ zeMY}MDOcBZBv}Oino_uNY#~~((Pmgn`LKfF@G{EhYCRD}%Rmxr?=LB6AhxyDp>WIB z-^O4P*EmYjkEo>d^wEJnbOu-QG+}!}clOR^&mbUg} z%61`pJ;B>r_flB;1}##*GGGHx0goO%LU{r}Mfo57iu3phHZC3-KEW$a!nf}Y|Mf-c zD34J70N^JEygXtBek&^S3@|TUE5k&7~!wn?8ECR(A)>k$to>8>ofw!NC#bm2AQ&< z##Hy_F*mv-R2ou~%WohRw}py%9i_F=!>G@opT#*aO$oImFpY_kd2Hn#YguZ+e88nY zOSS9GOZH2rL4Nad^7|A_2AXGd`dSi6N@B#f9cKoSg&nt8#^9~>KG#N$T|}X-*99WC z$Y1U4?JHY$-`}$Q=>FcA522+{ZS1cKU2X9l$QiD_laKN9 zIKqL(NnC>>*lL1-(Ovi6%a@J%llPFiiIuzC0_SSv9kjcRQu;~4cXLwjZ_KY95ey*6 z1HLJ8I(zTj8x=Bc%!D?Nf!sQZ_lGLr{ZiK5zN}I`a$fR^yjvU(m6~+dX(~!p8yA!YY?kELo!PhWc&~oqui5|8@I= zGo_DC{K}ZEPfH9rLydj>ZaZT&_ABc>sZP|-?`t7`NlsB(=DNlPstFF^6<1s{dda&4 z*M^)a%OG(MHd7b|$-{k>wS6ZlL7AG}UZZn#O~piats(TzNn)kP=gPT3;D~0#0KfAt z%N=J5)C{B>F-T%2IzS8;*~?Clq2J1&flBB$c^oqPFZ4NK_4Qp_b+?z7_50|Bga>$b|`r{N`nBFc(HBTo$P+Q}#99^tsADzs?@( z^fF zfn#)0`0M70j_3)TFk~!9g3m*DHB!>pZ8t3d3xK^qBLF*V^xe{o#zSFp-%zQU75BOk)9PD`OL z=urCuP>F$@KO6L=8$0J525KxDn|bb*w)Q-j5n&Sd&}vWu5b8hUHzC+a%UxcRz$Jb? zgf0*EMvgr}YBJ>2j#+exq@#kodvV#!H{Ux?NxWyFpPvyWfvIC2{Q7!5QbBUZ+rzAF zlRLB^)$Fp`)8Om`{W@k{Ln@y7oXiZjw6!+r`n2QDfmqH2SGu(th8gtFI2EJ1=PK2L z^Nr8)AE)%oN#4@VDd)}H34ZohCK--qkiCYQ6aQ>K0LLbOY?--@3qVgZ(%na4*&2_JyO zeRQHHa1#*W-!Kz%Np)bE&ha&gpC+e_gcN`mW(j=@5TFAb65sPINx47sb`Ueoa;HuEBJ4bM%rDZm;xtOIQSefIoGI?dusqbe3 zTES>3J!QcAi^XOpMlFG9Om!an@=+vC%%#gAt63dy*xuZhkUJU|wf}cNvO?8eDuz2% zeYJQ3$Xu(`BwQuO*+7Zq4P0$_P02d=CLD?N>@m_$YLZl_kvt3aA0uZT4C?Ihm|SC7 zaE2zW)D(yJK|N;!CzA1KivIutd(|{twQ3wNZ=-}2*zbmQf3JnNNO#`ngEDBst`osf zqs$9La<6al&R<|^Pg4?ErksZXi+=ks5>KfhwWxBjxX@%F8D@nH;K($F>OAS7`%^Nz zm39qJkl7FUUs~ZOs~#m)W{1{Mz6vKDg^N^54URO7)v~?#hgDaSs3?E?3k?mUeg}kJ9&X1fb%8AX98DDPonsc36X{d8lsyr)1=d{{mIp}(OKMw90Vr>aJDyD)^8MU7*xI}a!djx@$fHj z7kqeEDw)200LDOQ{_)3${MgEp$~N^OUl>>zrEa8A(Jm1yqw#(;X+1dTevL#@W>9NG z5~GpicX&AcdgFV^*FCk(U@FCEqDecb8D{HjF3YO$ZfkDTzd;Efa;eCUGxJQJw<#+v zb}7Y={$$2-dbZqgav!K=oVu2SqU#iDqZ z1VYpg_Q&SOQy4-iWRPADk&uc0|u{QKF^pBa@q3=hok51S!ryLaOc zfLXteD<@&9USS+MkfYjvvOr@;O~4-#Uev=MF7Mwc0o#l1EApgNHDcw$a@Y)Tc{ks# za>x=D+Hde48ual%5)5^#M5M?ufF4wZr0Brk=`DqrWJoNG3xU6q%dM$PY-B*i*Cvyp zK|B@C-mLN>7bFttai<)gyf=z`+0BM(H*VG`s4F{YkC z!MUd7cy}Kg!5|EkbdE+aMZbME`DHGUikFAX{DqrAUJ4}`=W!^q+hWvWe_h$YKwhgL zr)DOX%T`ZMnTXa#tbb2Zi@tQ3H&il^@xGMAKITek5IBP6x#&Y~kmPvW1WbDsU+g?{RWnR(v)!);M0?V7MlouJxU>?;X zjaCLmk(@sOHE1sD`o@NnvtniJ#Q{Y$N~afqUnEA5XkcHj~sO z=%d9KjI-t#5&7%Kz=_i5*Jj?G!`rnxs~kn^a6`U)kF^=0s{j;azC%g^Xi&m?xX8for-6`|BYo1t#0=cpU7o%-W3$=m z?h9+DXm~i0Naom){7cC93yU2}3-SyLx?bxhCCM0DGbHX@l3r~x#VTnSv~=rT*5@nN zn1zb;PBmpQS7?xQO@h{0dj^KwM`m2%dK29@Im4g0S8_=rPY;8CrJrwNqT!MJ%TNB1 z*LiH8i^>`!Ydsm|XTtkw%WN0br_{PA_@I7^6>=i>Y0+`4X9nAiu38``PvfFNX!qBz zCyvLGSQ@V`H8&lJI0X)$`Hq=SRQm3;8bz5-n3L~Q!8qCIaFNn4!32cN0><~-=dLV! zOV3OiY^iYJ;nFL8No}TiO)qH%tju2w6?UAZ6(-YfH1}xq4!+sK=!ut&Jibki6c;b< z*)43+B683glg~H>rm&{*(4x%trf?ENP2wJM!Cx_gl%sfB?CYaTs;n-I0UU!WaVlTW z&wnpOXce5it7Gl)sF9QqJ+0hRq&IW-XHTJFW;kvcGVhWqGf_Jk{?NV{#p}uAQc~I; z`7YS|nI9)bI1$wPuSyD9edzvQwWFRvnjN;juC@jjC<__kpmf<_Exo$e(2m2iN)wA@ z?Mbz>len8xq&IH`??o_dH+;|nEg;y~2jI0HUGel6a4acTbr+dRq>(uljX=vph{`um zH1L0zf$H3kA%m|#LywR~Y|{EPJt)!3Lss574BUES?;(kv|ykFu>DlR+M6t0?|?dFO<5#d@wT7=GGLd zMkMp**5)|4=K@<@2UTfNMvRU_*HS`X#XcWo>N7!7x*yfq`B}~DJ-VnEgyz2d`_O#F zPFA*>I3Z~oCm#6HPfh$k05=n#)Mn=(t>Kh`pShHn5ik0+Jg%JRg>Pep#4m;@vZbU? zdcD9TdkD3)DCd-5V_j#G$8j8E|JVQ-x-3>bQNf#8kpsE<&7ust#)TsI-CW++N;p!b zDqM|$or;%cUhWV!tHc)`S1i@UvR_GxU3A>}1dOr_mBwX!r<9=GSDsAfFHT!)aRR&l zE>#~K=wWr2dLgt}OeU*2K=asAjxD6IV-Oexl4NXa6mOv25NA`6xYH@@%PTL`(l#&H z{YlB^Bgkh&$>@pc>C5^1AmjCSrSVCMB``_orb&V0u*(&4k^3*QB>cM$X=CJ1O_=PG z@%0h(l9f>77LN0_pZooJIlIMnm=@=SzqYH-r{7{au)Z4O^ZqDlP0tmU`sB#uILG5! z?BT_LDyHph4X-&g-XYdr^39Gna%eQq{sX-}TZcXy5&ndm+q~pgw4R+xV(==Qt9o21 z8n5S9z9duP3z78&SJl(%RHtef4E)nd7gn36qFa`H^zl$y05>YK_{is7Plc!co4t%x zk8VTG7|37M@^@V_rDMHz4nfb4I)Oyi>IXuDA}CnBZ0F01(~DHOqmCyh>n?8^c3N!L zy~Y_h;E=?~1=+Dw4bJj~Xsckish;-9+TzH|GPt9G(Ku&%{noRy8V?87VdU z1dE5d7e9FB&^GW6ySd6J?7_i=e(F+dcpLRwC?DbP=pMpK}j;t*s zQWBm-&Ohaz8qOljS>aGwBnd&VTWb*c52@=Qs;Gh`RTeJ@vQCsJoO?{d`a0;RqN;eS zU${>ZQ%SG>Sf(>uMMKcflA7qV3zH5#uXYG=V-_j%FrQk0GWScG{b7N9xXbT_BSA=a zltHjDANt(K&cDlEwp!+g_4$o=$(4|Cr-F)@5;tfz_&kbSJ5V>gvCVsQk5X2@ZqP~j zEFwL8Vx?m!>GIlM^`dw%OVgh`O3l0EB7JrmRQPyHfF8P4!f(~*zWl1kGh~gVU(B5R z+lN=;$Vh|zGga(#2NU^{U~0OdxYXs)LVa!^!+E8@s}`AalCzreug#+3Ij$3*dJPyK z?!+yvsJYE|vnx^kJgQ7hNdmBcyJpfAjE3uU& z6pJ$Z`bCqtp8%U}a}CJ2-P!qAba#Ho5{_Z@u9~Q@>GR6-S;GUpqSEw%OD~i}<=+l{ zaA69l=WHLUEhJgaCSIX`zepakg;c}X(t#Xoxy&(0N%99^8(O%wV6q-M$Q;SPkgxyy zgspt=m1DtWtycBuqWn+SgXWZa<9@Ezf#nH5qL8)em5TJ#bJ+PgPog~e)tc~ktr^mz zIYwMQ{99u_&0FvTJmi1Y27dtU^W@XiKshyoaOL8?X~_HH9uKt!n%IMSMZv_(Vk*WV zt<8yi0-j%+-t+Xo^~o$nRQZ0*;BX7yc z+L;+jVY$i|C1nAmpEAd__o?s?7=~j4TIJ$D^{zwBcn6G*13QiA9yZASdgntE$NM`3 zG&*!vh1$n&=8yS^!##RgPQouaaAfHjBzR9u+L$4k1B?CgFACC(-0XdPU53k`{EBv!lE>5)gemK=h^lAY2jC7@=B3FmE*m=<~Ose^Hf=S1GpszP}f<0ey{LD zGMrvgKl+m}viN7AoqvhKOc^P~sV<5aq|X!cxVGeRyEhE$H8xhKIA)+IQn5`TI1&_;~3(I;&E` zaFF)ZN~n1dv{RFaC>+#ZLxm+-s?;U0G@*8xezrU@6Azbslkc8Y@aJobJpwMR2->y8 zC>-{fp8%1!WOZDsnR5F3k>He{Y)qyh_@AuDD)F9$5_%|#ry|g zk-RFE@aX;7~pL8HdoME^ayx-q9YfQ)kX4gEv4^)rrG||G}ZaIKCnJ=ttOUXZ+Iu6 zt&MBMK;AAx?n+{@Zrju9?n7&MPQOX53>hR%e1OX)Og`+lK2Kz>)T@AGww*Y=nK0mb zzkT;>F|h~S(0}~W^kH*gW~S3Z>#oQaE5A;4|BNdmFD}*EC1H}csK3o8QcpB>YAxNP zy6GIk@w_`>!^7o-;HR}+A}}tc&>`Ctr!Q0RB%VLt+?7AhaZ{ge#^W=Z$ZjRaSHff4jXm`8lDgOSv`e^EL2cCXKBgZl@TzOD1PC?9E8Qh|@ zMs7|O#)p;#Wxyk$3(Xo!FhyEY%?m?PB~fNSQrP=WjUoH z4kO|_Ni5;7ZvPccy!_#Jd`#WArUKt%Tvm7K&6P&6}s52xKgnu~ECyHP@333oq;-X^*U4x(nqT$4U039{b=V!HcAE=uw2NkfM zq9#v!%8L=Zjcert+J_|DA>`rXJ>g=Dr3LZvA|#g<~ZfEbNXP~#R# zAaVsBvbAf1d(9M7-F^61pX3C00fyfj`aAzPArls;s%|iTYTc zg>tk64OMVfTDh`O;hIjcBN3Kov4>@G;*k>DE=kJbdtBVWNnx9vRXSaqmHfWGh1F2=5_`kETt35BrJ&PD zzO%`z*<0%w+Ckj_W+~;yg;sqaEc_RoI>r!)`!?`@lcd?irOVj<96hf+V{N~NqO#6e zjuGcDw=y;E0#wE%9>RP+T{liVz%?MMV9KZ5owp{#$1N#p7Kb~XdVJ6t5zB`t&k)P4 z|FIK7^FOY!`UfC>*LbwQ6Q^QNuO}5bdHta^+CDLAVWmHW;;VQ=A_S>5 zTq|FI67kzgTDkF>aAV0WhfV3te|6VUL#<4qTQJOD!x=v+M#sXPB0Dhs=)M`gLh7rr zf60@%YM$*2*8}-UweT7|)dgG9%d*;DxZ1MBD!M4HDA6w5G9k72?tO9@b0#oRIicHP z{EnoaTPT*1y|&mRw_X_*e$wy+|Oa>6o3h{KS#D zN^j)E(f`9SE+**4RkEVj1jL`|s7R4^{a${htI4k2R`@SX06_*aaTv(K(DR}JT)gvucW0cR% zScz%hb-cSVQdW$gPe(!s=V=w0BG^jj9dvPhM$sP$#xae6ZxACma2|(>p1}Xb8TFRo zMTxOo1HnZaYJGjBKJP>mN#TM{)u}3x%^stvd3152zhH%Hez@n;tsJU1PPxxod%B*k0eFA(+ZpOSNHP)E60ZMhpx6>B|IaqJ=-t1q zCRIMjQj(vu*Y(;Gq`Qo$jVAA{laoUX!gGI0PjrVC>Z~+e6#19IeCVvT74VoWJq=o< zjrBeS?oUxjuQ*gg;U;YQCb^HgjbDlWJ1me38<=I`OY&ynr}$-O^WiVPlaw%YO6=h$;quhRavWUmhVp)U^xdru6b^>qKb8= zRmdvHKLCim5+cUcYGF)jqd%Yixb;{dBFrfW;2OHCXjz2&l``4M)a#l z5k>s2kksrc@yHb+T=Q0u!N>j8B`t~_7!%1Sqb_%@p& zJMvEQghGgZ5l@^jWx@-R0!4ce2I?k%A7)=BH|i`k75CdupIQ|XG9Oonpl$qOe6cAh z7$-BC<1Y?|SQb*Io>o)#$8j+E;dD%8`&D)x&&Bw@HQ~=uSnOpB5mW5snWn{n8`Fsr zZ6kvJM#VwH&h$z3(3S17Po9?KJ|osJgmVOp4Lv1Zu}+f+>uEaqnpEhzI|1HhaqkI4}W77t?BC zmR_r$O0&e1UdJ!2HBhX6$z6XB<)QX#xpTX{uoXVn-lKm#)uV(;LeI4W`Rs@ddHkSE z9$pQ)zwaC8VRp$(2rHP#8jqvD9v{o598R0hcaBxgR-ehZzgbDJnZHvx-CxP<>2^;x zS7E-`DZw@MFiBk@F@D%ynuZ4bvpb`*(mq?dAnzenR6L#fYdL3SJ1|z1d~~QZB6Z$r zLh*8CxA&T{gPj4nwApGB2w0(8NwV>{VuF z^nv)TwFZ>&^W1w(iZfpGka%aS&HNHY|Jpk@o`hQJ8gfS3$}FFh^JN;_ z(w4g~>uwoWaT7scl9ONFa&t3*9OU!yHJ(^`aQA1JpLebj>wa&7aUP?K-aYJ!|Mh%( zdox=>)9K4x?XkVW);MN-&dFe1bc|Nnth6`_dKi*mogYIR>VBdzDF4j@t zE&W;&q#u-_8MQcpBmX;x%+gR3L5IwPXSvk>B$c+-LR{&pBW?3t5@iMjb!8 z>N=1P?r3u0g}vEOV_RXzv;O*o^%H^D<4%lc7y80V9?Qzh#?&)$?s%Y~@eUB5BnZrcY8pMzhbV$@m5@M>b4E9|7jP2i`_cR%jK1SP0vLS3fVySZ&+9!sut>?a-2J@ z)rIa|=_W?7{F*=Srg7d6iitv2y( zzOb5#zOQS!Vjx{4WwY7BUBPT4O)NqgP6`mu~W^`K5)*|=PV5U;$zd|K`4x}p8c zg5xxKo<{l^+l67*{xb;;!fQ$+JoZh#dSm{cy~SZ#>TnP{2W7F`8fWMy^nbehAjHSt z$L2g?$jg3yZZDad;I-$v+LkKB4H}o0)s{x$T1#6loJQX8$?j5$=b19CJ2s`;IEM2p zI34$aG9pcmr&F>VOqe=%>Oi_pz!dR+_M*k8P4VCV0klL!YiTF$pyG-p3Ns%W6a>ar zk5mM$sl0ZXjvL24E`MQBOq#D!@NOU2OZ&N*yiG%Ia%=C#uBB`+=Gr@vZ9}lo#pHNq zn&sey*_#ddv>HWSGlEcYT*aVkCFHvE!H=i&M=Eoo|47-Yf7KXN6RaXn_U#x~ zG)~^a7&+k*55(r?wZpD_rc!P##)U-j+Ey-LqkIvgCIwaoiRyR-i zTgH=hl_2p(Ltd-%d-p=Rlol1+sj2a)zn5X-(`&+$b$JiTOk^30f@x})CP&RQs;;g} zBHURRtF40zW}F0bOppehw*bw*&0jw9f0DSa+?uZ0DzLaswyv;P#a6-EYqGB3Nd(=t zN#LJMR>ks8He5Rtt@>sVhs^ZpOnK-gI1!WVzt(+=`Jr3=S$c(V_ou($$5f5{Z^atR zR!@OZ*pTd~Ef`PfT(&l)t~~Jjpmm{QZ@Nu0AhXk#S_1Df$7#woA;rm%c(&G@OXL{- z1jGM^|F_X^PKwEz_jdzyvYA%zxSWe@GNi6R>0I&=&EO%HZbC^*LnC&%&1{qv*o-9G zCnUPEc>V-v8ies3T!{k=&*cANp6*{~9X*krA+K$B-A2Z7acV4mVXd{7q5HkjpW;}u zaTVT;VR$B|I!$+?SY1~8Ek$y57JAS{B#{YI6@bgDyNU$${}1B*-AgEJ1Ks?2^2sjL zu(eT1Pf2eo^dTp`{L?N{Ie>RujE0o4xBDVasr#C(xisqPFh`Xl8pHakD556rC~d&z z&Hpm{fBLTO?kO8?{$5W5wz!vDO+D$@yeFUU4Y+J>!wpMO?X^~FPfyL`Q z#iaOWMw7%g%T$Ohru|3O^;KEt=R2NPF^R=M>HwD$+|VY{}TSM04@)t zwC%oZTYW^c;ED(^3X?JKtv+Od#Kc`N$-2U)fx6qK7B6okM2>oHxMED5%;0`LV`Zwe5bv^H{WTJnTHLgDb?NlCl3XMT zT<_%DWdBO_|J2IQr%KUkaZ7!gR^X3Ev{9o1ey;SF)yG@$$+rJwzKN~jUF*r(pBhA;km@ugrr$6;vq%n%fqXBU)3Rlu+c>iZ|OyGr4cIG|b4R9&yxRIQXWogY? z>iEyBs$zWySZ0otJqIt!oMcQVhJl_g;{VU{5$&J0@qoqsOsVoJkz&*IY(Lke350f7 z!$KIgUQMN7(p;JAx3%S5t86P)up?5B43Eb-_)^!L(w=H<)jpF}D9#T2HBW=J^nIx#s(KuhI9xu{$?A zW3*B?oFOfoHU0eRc*sFjbn4}|tt4>Se3H;_!HLBI)^LJ8l~|MG9Mx(4`a7=wDvK)ozP@eT_qfJape6IZzUAE z8W)$>L~8amM#Np2wBo{m0NQl#CBWXVBQ>|3(VnuRpXxnKzp6+g7~B6>4L#lU2-H5TtNL>y^ z($u$k-(}I0fvBH;(B|M4@kGYSm}mXTOsc*`4rgZjPpY;f>IZU$8O>7}S)##yX$=jl zJhNSDF=kBWS(c8^I)A)l2)*Hs{+}t|BS-^$*JT4+GAtxdE%qfiG8=jZhkLt*;x;aj zKi54;n&gnp%`r>-ie*b|uGJ?wdM(n+-ASuvJK9QOlI>T5PA>Y(oj!NzC4IRZ01=G6 zQpjnSFR7qs)Q<|bA$!9(9w6RmyIl}D+X)oB z_OHI`HRk*G>p#!lwaNZR)TUII>mKo$qN%;$s4a2N^%GZ?jO(=OR_z5`@oPIx`Bc$Ubu)9Ued2>AUd|&&VxW8mC&FILo?c zeMmJ@?iv3RbdmeE2TpNwBa}`O@A!0irXB?BpGwf(YR|PE+%BC+oM@l(+!Q~Q25LQ` zrD#uho*P}u_$xjXJfhL{Ej>8g2DbXu&uCj*pZ53l>9%TTGQr~=6HjghTK?d{j%E2` ze|K_z`xg4YNAa%$XXB%n=KiXL@$qrJTdnHioa%SaV4y+cL`;?i!&s?c`Gn<+vXP{27+G`1vYp;tZZIhYU>g+Tm$YW zsyW$TvRAp~2KAhs-LpSrBi%wKb@JGDGb8<|eMSs1i1Xx)v{~ggv75we`99%NczRaK1E3^)KBExI75h z+Vm!Ol=r59ogZVDo0aX}-{Vqv?H->62K&ESF4$?f5%Z^{l72)Bl^gl99TO;BnQysW zW+X2sC8qx;^>brUhnJW^^COxk_+~FxXv_P=mD^>B8)4*gZRC5p(L`_NB`^2~FNrJ& z^UR#+?{3E+Mo+fXapT?1RzCBU-wD&qigP zKXjd=@ovcB^3=9raPH}abdk4NhmB>AXzYBpGj&Nz)-`0E&b{)%FaDy3`TuMjJ35-K z>4;A_rRrXVj&nevJGsYvPd3m}$vvWl4UYz{B%OipsU(ytq0l@7y+5g#d#R*f#@jLv z#8*zmZx35f{wBD8^j>LA-`ud-E#nOP+zDhx&g%MF$T8c0YJ(%~`VlQqbZUkjDPVO= zJYytq@F)4CsVjZco8P|HcIu_w%x3k*aT^KP2zT|EF3Fwu-)s_@4&l7aY|UT^FF~*1n6j6#vYz_&ky9>|#!@B7GhpGL5 zo;~fCK7ao3I3J7iu6{_sJpZ4_QC;5l4ER+x`3<-D?d&;L`&VwX0dC3mjqIZ)iLBFM5|HDP`-yZJ6eoHNWJ$=_(;>w4NLnqB~_Y1zad%C1h5v|Gl%gRt^ zZFG0_ktdQG9;-QXyC;>94h(s6c;!=Bc2SLA3s3b-)ej)}di~-X$`0vIxHiG5{exhI z_M<={Z&!ugx zf0t+Ay4vomb97J0LV)S1L{i^0d&fbm%i>hL50YbQr8=jZC+6pTLhhLP@x{;`of|2tQQ(=~J)?wT&-f!+ z{8ftQwD|ZbX7kyCjYsE(&ne^VX5*D-n<_k*1fOa+g6ea}4)MV#6#27x6zd4{&^Nub1Nd4?x6+2Z$pk&Dl#AB3pfM#|lcn+dpQfuiOyZ2A&Y(n$Yz7jB~e!3xc0uBpC*c)9mE(3(oT zizwzR#n0pPw|;ST+`JE`m+Tn*+_o39o!hv)po;Zr z=c}C^OBGICxspw%Vd*LB*6;2w^ET9POWi!vWxYT;>y>%Y3MG>A^taNjah6HHmb@oH z{&b6}QV-i}pX+`M>TLSg9SXiiFm< zD!a|v{2bN|inAo^K4vBC&Y~jjJRTAVH92!$GaT&Hyn*S=rd6=~K3?n5n0$F6nkx)- z*spsd@pUg3b6*Q1G)8yPVslYnmz(wBPq$Q9mF#oUSZewkuH^q(w5I@kzvCb~yJ{uv zI`-r1zB0vMYsSRv+1+GBiZxsJcUSpI;B{OazBMVs5Bo9TiIQXP1b)+8i4GJns;7 z@2Oy2K5w?N?7wacxc-xyRC|}X_lU-FEz!GV4t_*y&<&7DaDJE@XLx1Ah}`!)k%EI` z1mX_A)!h2}MGJ3O4Ca`>ZMWpo#yc*Pe)p7sHh=xh^~4BXOLh%LUm7Ih?o9p=gKw6q zZr}QucU1_?nf7=EQ2Oc&Cm5KO{YiP6m;cwjCF^UOeIx5@i9Ye)Cl3b*7Fyn7m*&hW z28faW7T zdi!tpp7QrF^?0l*1c!0x+P&ZJi4`8vdIMCOdu93W zk&QpxPR{4K(FW%3>J#g`Ui0h{O7q8p^Vm~C2_(ltE9p7ZfaGclU`)fVJe}nKbr^RN z``1*xM*IjQ);26Q?65+vtm>_*R5_&2KL)#<+&k*kiL*|H`?XzNtu68wAPs9`CFB@b}o| zrvnUrUU$H+%$ZDKT&_%y9?|mGHdcm-SFQqZ)J7l5mhKD=O`iHvW&2p0DBMI( zg;tUC{nQHPEz|aEM}j}pp(n(I&MD7HY3Tl2`TDzS^S7P-Eiv&>GE>1pB`(bW$EM;u zn1jmJtJt=NTh^yX-uA_&Ae5l9s)R1#|F6D1qD2O{Z(OgPxadmhPg=%p(TdOpSE<>U zWzr7eb9D-ql83*D{!i2p{C$!b=c%ck+P)hv=7rShl5vWgpR!bX+17b2(RD|8N5XX^uC+R z%K}ELJeI>R9w0i}PUGvHIV^am9(MieZRgQ9`H=sVD}lNc)dPnVRoLgds=AdH+A+qe z=BW-ZmU=IjQ$qp^!SS?JR{YpcG;~VHzs5Yp{mzss#pcdFMv5XocG-WD-+74bVjPpJ zN7lUCJN4~anZ>f?{eKS}<;4UTJut_gwGq{?WJ2UBDLv;Ky&Pkj%%h1JoUqmfH-W)F zSZx&OjQ($$R1eHC0VLf!^*6SfjGYF#&xMyOSoSAHHkz5s;xPsqWbtw7qW>-fJo)fH zHab=|J(_cysgYN*a|H%B?QQb?7U3ZuI!edjBAxnYg|p=E)?)YHNgDnaP*YMV^1Skg z=+ES zuWA1OKJors;-81X1r0zF!iBTYX~vFt!u&Kwg1gNecf@*?U4Q%)k;00Xui7IT?jstN z5k#WiJjStUi-H8 zVIlev&0~mMfUDF{2&jcu%%Mb6LR>vF6{cX%t3aYsbSbAQl5L`d`RyrP^LB790KV=T z`KX7bMJ_3UD)?zXC!v8-pE&YlJ!LdpBBHpN#rk=vb$OfeT<7PcwMR4)$j`YW_1i$N zK~7<3Mwsg+inYPXuR0rwbBd9j&2(ENK1(bGuD8|7;kaO~w69+-xOg~P>2s_FFDG_> zS$?wLy5kf816a3V^{BEfEVqJu)!xwBYCRZG)nA6cF>cmtK3P!kqV-Ak^ddOZ1>PAF zJkVsl1r%rrSJ{@gHJ|z(KN#(qu;qtq1{TTfA9USEwma3dR1Q=DixUn~f1e=R3I?*! zDMnz;B-}+WRqD`l;_V$zxAWlUYtm58MK&?9r={`dfMJ_ju09xGc zK;FtlR)N}|Hym>d+=COVU=5{*juBLrO*1n7N|{%XX!F@oKi4+-?}A(ms$*<9A+bLJ zG>smaB^kg=i8t*+KdyIW7$t24z`iF0X=zdLj41t;lf7--q-ZTr;2Rkrssc}9^bWzX zdb9;oegF1cOJsE;9I?+J(xujgbJdxd)=_YA$yRM;ZzDyHkJ^=%EmA=WC(i=|{rV_N zd0Jp*Z8shyh@`#TtBunv2_A%@j4IqFLi?Our!pM#;8sR^2VKbqcrWbV=jIT{XCNPx~IxFvG``@;RMcvI}qq7Je58{M>1&1>Kk} zYc}S_1O)pUNx;K z>bRkP>zmN1v8~dDDxz;Z@HEvt_zlu4@EMjQCpXP6qN&JMHz|3)+tyYQ(P8OzqF>vF zA93I$8vVweKuvw3MqM?7;1P{j>yT!nXW!0mGxr`Y;pid+_}W=DUyV;N@7CleN1?br ztlo8!_{M~GDNEk{3y2aUg;oumUm5A6JHO&>E_jyK+HS<#@_II#c`2Q+N;oqDa4{+1 z5$drS1-|hpzgQoV45h??$$2Q+?+O8mu{KsUy8$a~a*~wtlG3-Qkr?n7KSNg|%-J+= z-bfQ1d|_@q0I}ug*v-%U*wXe;WdUCA*$%qm7N+l!9@H(*Gafs@yQsNCJ5Aak44!ZTa3A(ue-$jS1f>7$JBsdy#o& zxSq%Ir?D8Okqo1E7?Gkwp?N?4jL%!a6gGh%Cb#J{$uk*2BL~ zgsHW$$Kkg?IWk6WvS)sWuIn6bpHhm@b2sY$3Yf!fu`{6cA-Vsa!%jtTX*(b7Gk|Ey zCr9a5hbQBzmypD#16gt0#G-dTk+5LHc7j4JnQY&JtMe%_1;)51uxf^zqXA z1lbB50PQ6&dO2=-PNV`V5Ds?VTFS-4{ngeD*DKhEC@LhaCgMIgloGO3PtsYrW?mkW znzrbAs(59Op9VRMZlwCFrPu7;iW6dq?UpMVAw*=%`#rOSB%!z}ecjMUG>2RlfzO#t z!MY2rCEoPC1qLfT;6!bFlf68Q7gCp%-rG);C&=KommDT{!)H@r`VIY>(;b~&pvi_G zM|+MYtDppvE|LDWr_f$Cv)-)Mi(L;R;cWI%yW89OzfF!oEZ z(i=@i6JPlZ+34HW86)<~k!6v+T<=Xu$!cV4!9d=ggQcQ&-Xf5={y-<9dHOIlZ%O?T ztxnG5+GrnDVUAZu(~WRynEIa5jEqWs?Y4f6RdN-bK+NQ!7i<1WN!dCwwa>Tub)Hav zk89NgeeM)vrIsg}_o`3J_*dEbTb6w<< zdkcP?(>cjPi6uAWa8*8!3+FM?^!LPl=9gq=JV3bcFRuuyFZ5Gk#lvMM)DjkMC@(a9 zUtvb4?J=riY+)HN2Z+0Y_Nk_Y-ir zd~l^Z5l9PB0z{{-_ z$-&l;)p6lLYQoZn+R>uOz=Bn2Q#LL8MLf3$hG@7frT%Qa-74Z(h669+PAvNNYr2eA zq=0iH1uC>R%<>>(T7SK$$k^h zv#H~ei63!SZBH+Z6Nox=TW=!fy?kC=JE~N?SF}JJoC<)8sRnCCmK9o?(*g?NcF5)g zHkvFxeasokk#ot`mSqa-M2Q$Uy6kB3EmI^2FrDlq4LyW*_KoZGvCZ zuHWE*o~V^tRiM+9N?l^5B^!2b>3bQzgQJf37w*!V*<55e>Y80Gm?g23thqey{gmc$ zF4Vt2-}kM8v@+td<6t*~gj$(;g`n7Q<#Gui&MOOBrH>Hx#=Ve@-R@mzZ$*~5hQJ>c z-FPB~*PYek-l6NB0U`S!Vot3-X>tDfq?T2sA{QlwDr?&W17CWPa~HhDVhBN>3-&oS z^xpzy`q}!q3ZNPxYfq{6(ffjQKnnlI%P)St=j?)HE@_uhIrT)eMb`Z?wD5Ft4RDG9 zYpryZ!uz!v=6IS${%AMEJgQVXS~mQ7acXgyjy}=lRa#osb*32LrZG^RRe$GIAWI=` zq++b10cT^%)Td?zv;8X@ci96h!x#HF^mpQ^izw|_`HrGiXHw7P>nsAdukICE98XA- zmh`*rB-P}4Zol$VI=pjJqj`+ctHO-YB+OwTiMb!7-#~C_C8`L zV<$P7LXg4M*B!x$@YThYv|zZ^!up`nG+cIko4E}bP!TDZa4VZhbRLD+TsC#!j^ubz zs6+!j;GbJp508Lq4+JbY+eA6Rb0oVuZBjAQWe5S@rP!%0eP@7$Q$Rj+GO^(i%@w=6 z?`D2*igw{=Xu=~J%d{nj3{NoNJ8J6s-suoh$C5oAO>)-ZDX>=RCr7laCjtRRigSZN znh?O3h*ODkv9tpls$)KHvw8sdG7f|O)Nd5x=CBA&FO&>|k zE9)s#gAH#mXJUH}vZ7O}(y$D2=}mDMOUs~Z#`qF5o6x)Gdh4Gq1$Cd+)NbNjh?0o7 zaBp%UBotKgC?M7^)#>u`o$!gv-rh7GS8})FA0^?2Oz-CD=$A)E&lWbu-j#+l$88pD z3FdgyhwWzTe>OHTUInzau8#rLYJkFbE^9J|gO1iJ7+8BYhvU3eJBg5Z%)~vTdAu-i z@f+rOl~y18UKNNH*RJNdStf+Bd;sGpS37@`kEpMAF2RMUNTI;z=X8DeUZD+L)s&4sNS~sN&J&X=W2Qyg=WTsk0-`p-!8-_>y4|+?fxzXU;rrf=XHgufq2U ziNd;MtdWd0g%zKArlnas%?9EN{YW>cYG@-JTt$$cOBd!Y>{o7+CtQA{R2Yoex z`ve{w2QOJGG+Dwjaqxkjco9GTxErA=Qc`{_w})%~$!o|fUeZX_y3_jt^_gne z35K2FiF*fW%ZotQWv8^`z=8wzJwXI3*F-e6KtrrE&9>=|4&T}xO!13^!%Ft9`(L#r z2|`ZaBG>u3*F4G0@`|QYK8?60kMZRh(iDL%RcYNz8t%e{eS@R)jy8SuR--`!ogiOP zRX~0>1G+8bz<5foZc$^d3J3!lM&2X?WmKVWtXGxB`Zvkl5Cn2uw<_ZvB^1~Ac>wH3 zG)t=L0J&inb`Dd$V+vduQfFGc@&xZsJ?KcvRf+Mtmgw6so}h!Os(k3@diy^~5oV>) zx&&3`zT{=)HK7WmET6~-%Eb66$n)K?1W;~$jz2q+W=*^Jbn;e*Q457IQy}xUu8w8E>y*)-O*c+ zC1vJCGZl@8oa7>p%CFFsHD?y0sayLF>s+kN7LBrq%-)}1f=#rj zN9@2H+e=Dcy_#XjC@K0mwZcX1Jza?Q*jEp$67T{vmx+zudx^F*$lLLzS zTGySE*qy-(a1E;3)RLKZY;$~AG34mjUTkw@+I4m)Oehn|&mlBZZVdqG zlsdJ8`!^)@p)D$6iq4dTd_H9wN6f`dnq_H+go;HZ`t{DZ;!gzr8Itv}q@ySs89DY= zWsnzOjbze^fK4m|rILYvQaywHIU2q#SKKWP;IAwmIkuh@}!r@29rru|dpZr_SZsTok2aL7dtb|?Y= zTyr!&Udx{nzQB;;@HbfiP>i5<6GhFx9Xd9<8>Ynr4jBpa%iamW&GFfwl-;{2W)O1c zhC)!OgI(CKza=C9FE#3}=1?6w7deeES#ntEBW9=OJ>VvjhbPNlQ$&Pi_m`9^$Wdhy za9q%)7rvqCSdW5!D*SkWz>7rz5vweHtYJ6r@gc29lj1#KlW;q;Dq_bJKQI(B+S2u= zT-T7c$+b6MWDX^xSy+kAoy>O4#SAy0Ae`WCt!mN(@kHUL0Z>IO1wO{x{<@zv^Be^e z;kIqO0tO*RKLZCqhA))cQL*s4)R&j41R%ajocY)paP^vunq`Id!zV)El*jcD4L~(A z&|@L`Hu$0su_q%51|-D$Z0i`)UWozmp+zSz6ruopas0{spuZxlIA2x)m z=*B1B(BimE7{0tP?`PMl1JrD*sFrLBmoCP>+kv;?tpFCvAisGjk;MD`=6-wuUoTDJfzkChYQ23grPm?k?{oVjXKe$7#0F$&iZimN{g4TIr_2|`8w@!zCx_~M!{H_mtBB`W z4UCR2Z?lYVdZ&*yq;qje_}x}#EGEwT}i9KuHY^4B?e0F z?T||HLEWkl#oO|@OkSlAQUqy^*@gP8g`kJ~HweRn)A5q9g>V%`M+PdI>>Ye~M;a{? z}OX@HP4H_wg!yN?Z{8TB^E|%1;%iF7)El-jxW1*7j~eulrm+ zKrJ+uw+>K|vWiC&o9=~Q1zeYK1S49F!0wG28|n+!6RDKqCi=ps07o^PFb!ETY=-xt z6D>#$!{?~aiozGRszVrXxPFq4v4l$U$^m$vJ4ZJ&JjoN=L?Pe$ zb3be%8U>sC)%xra4Sy4Pk}Fs_%(#~=POk_HjJ^*?$mM`-2ih;R^=LBn=6(*hNb?;i znRQFjrxF}v*in~d5ZG8JA<7s0`Q3*$#nx!U?G+%!0CkK*-bFayH2c7jHZz+qq~H@#PCVVV5u+4ZZa; z_yTxT_Mo02$~so)oX%T{Xft)VbBYlrS5thMRd1C3i1uscx2BEQ47*|)g|(S=$wT*+ z2%f`fUsdl$w38cxdO$aJg5iM->hVD%(I?*@%RxIlvIEL1w6XR=9|iS3jGrAH_vmZL7&cl zf41YujZS1%4X`mQ_1Lps@9&@KaxN8#!jugKMUqV|{-4!uF3&DFS|t@CqPi0->83 zG?}9mTxm?_;B}J_A4NGtr&+q_*Heb3#hQ5MZN%%}*uH%AqHqf7qe!I-!i zRiBKl+tFMn+|;`&@&;rnq!|?z8B{GZ_}X_#g;c?=@r($}e9jt9>##n(D}V6aZM2yl zm>@i7ci}D`?AlRU1$rl2s-IM-vsA?IREVI^F-k7Li)wVpFJmiijh#jqcqJe`&k6ZZ zo^IDPJ!AquitDYaf@D+|Wlq-Qu*BCb!pPMUB>ivqRs1|8=CbaJ#wplvza> zj&j7xAWutiiK6(_8G8e%mGZ%q(%{_nyQa_qj%e99I=3c>C6l*%HL^kv zZ@FOR5iL2ftLb5#P?#v?0|IBeT&$SdEPT(C+fhYPuZ0e)9Q#02p}@b1NbASJ7<+g? zh$inD1?@ct?dJJ4m0;ySL&^qtx9DO0X7q&v>~9wy1llVhU>c4k^Mw@PmMl7t9J3V7 z%w(1=CPj-RB~!n#mn-Q)Wo=xI(73mZdG~gqbDNnL-x)I{`4*=S5$r~6SNsKzI~3N-Q1wvdzo$nU3Mk@0HUpN0)q&z2!mt% zK9p;erU#Fz1~yplCIC+<10xoxb+0_^53qI}dix;Ko6&@fB`bNjo5JZD2qlA1;a|Hx zS-SjAdA7v#k$6t{+w=oaPYsgYo6$mozCQZmd;q+X8x993kN^5??XPH$ZPv)-k)sz2 za!Hqqv#m$zS4*)9#+(uJMAOMi43dYkz0PE~UWWb}HwlB*m#Bp1@DtsGtZgA(2rVJa%V4RsQ&u@vEbs zK;1T8%zc~i*aiW*1R64aWX>MgD%`(J_NqsBH9P^}6ePA^wvo(UN_ z*=KipI(k*&P5h27NqrSV^R9rB47}6apeAr&6f0Q04YWegxEo@`&Z`JT)|f0gdh;cD z&pX?paFGI}I=0_Jm^YP^B}=VcK8Ilc&j2eh0eXM#E>R@1#GmYul3#&8Q4pYIbH`#Z?raGS|AX z>jW!BJ9G6BF~{TSDs#|S7Yw*9uX-g<#jHr%LbiH+A=laKk7#jV`PlTOB%wLgCm580 zUD8Ug7cf+m2{Fj(^Ysy0iJL5tnLDO@)gxP?zagd%*ra69S_&GevdH%{)FN}D$ChhZ z83({NdMkEZWdNCxE=l=8)#<*o(e$M3P)w3yGsg$n?y%_u%{dkd78aWJ2y%ST6>VH6 zaev1~Qs$doW`XR44p&5nZ4z;Hg(yzes`tk4ig>B8d?j=3AO6${lEbk?GWR_$3q>@0 z^NZ_zW}l2ST$8;vI)nsXaC^e(mTi5 zNdj}#@om$d3ei|e zc9UeqM!V>$O^e5?XLDl1SRkBIjVPH^5u_ai4qfVSP!8H_B0qx{wcNIifCx9_9DEOQB@Bb0c@Z%HN3Nwca>T!y8Q^ zD$UWR_AuUY*$|UH(`C(+6myAzYU%$n!+?8+t3=1WGL7ib0(qrDX5r}?#icf7Hxxxz zz3IRRvLZ1xQZiJ@V)jAko})3`0N~9X*?45my8!CdR)hqYQeR=XXz(M=(aT4?t&EhD zv!u6x6Nzg~#jh9#OHCHwZk#z{`Wa>oQT4F+c4y`d#V3vnE6Htl)Vzy(0uPZ!U!qG! z>Y-3BhSNc_T~k)3{%cMCEoN`-H5<(Jb^YcDcxQ@&Zi+%I`M5#lNV$4>Soe+|MyQ)o zDwL*@D__?)ihw&gC-$UaQ7chsnUx905|A7xG=!GG{_> z?c*%=tJf07x!!frV_5;QWbR%UTL+hK`@aH7-LyS}=hRC@_BGMFP*}c@=|M$X(k#~R zf?DX~$TY1!(N`~=)2Y8GTeoXDNpY&}QmMW!=J=LF={ll>SG1N==Vp};HxPx}zk5X6 zDYV2pCGV(iCKw0l9v6iACa%&cu_J~wdfBoE$2yx2=rzu#zgbGCu!i!#N>ike+>=T2|g2i~xG#I=9G^X^|h1Ou9`-!QtP7UqeebmNj-h z169i^N)-3EMJmjl);@hq3bjOa!_(l!hr1xC228rpDdB}bI@gf&Ot(IR!dvG|nIv*K z+NgExHp#Vw-h@+8HC|atIbZD@VB2K-#y>%T=l}y{y zaHuedD|~C8Ej>dhk^-OwC2s*b7DhZ04t3x~WcsOG-GwypI-<)@jOWFjj!@P6>|74q zDMdGx^7XJ4hRamwuS&d#ihb8$U~6zRhKyJ;Tm{zuid#`=NPm#MKn+>5lHAT5zRnM9 z)Mxsx%Lrl$H-Q!dU2H4|VRs!md~-<*&{SWe4FOF#UJi@$XStGV7vhC*zbEDN?2;a7 z)#C)8QRG%eLkPM&=h>R(JTdXVy^TYYaMhDor!Zj|{Ui8O9D#v7@E|j^x zfR&C-e(+#O*%YApn~s~R1YTY@uq~{szW~?h6a1PwohrJbi8(H&_yu4!B#6|#c2X0}6TM9u1O%mf*Mib^_Qi&8kg7bQq=d*Kcvk2)@UM<}KLf-16a z9;%)#-K;={s&du1rfJ{x^yV&MOXSSA9C2ZyE-QZ3>|79~x`uO#b7iyKglvJG6-8DC z@s@l*s8#3tQmzVWe?xjWUQDK?6U2lm$7quQ)YqB%N8};}%zOLqn>++%2Rkb(LP1Rk z=DfjNX%%g_u3~|^EkI|^x!2X%sm=m%6`Lrac3^ZLBK?Vlo?`1~qW4THyRS+{+Hu0z zO6&$wWJxHG`?^j$ud@pg($*I}ZDPr%J=s}!uLDU5O>k3w{nOyd3IwZ^u*f_4aXjcQ zQg~ivTPg9~sX=Jsaex0ptlvum3`h4N;WujABDSucN_E2tJsjzwoeQ~A?g9342-dc{ zIQs!>Vx$qxW=(cMoy6PnBxM8uNUhcreW0lK#nYBPt(0W`cP09C!N%t zBGK28`palbiz&E*HPt3uMnLOcp-oG(ZVUr%uJ?&Yn4T>TUSX9zMQ1FB0rxXykPT^C zAN_s^=^8Nz+r%a0s=mQ5)|goKMKP_%iHNr$UPESfk}X{|w%kKE`&&XiqbbywdOU6m zd|QZ)yR`G#oqe*$Oco8%PY#J2KLimY)7EnI5|Z1vGYtBjt}#gg*6NCk%2PT78$!GT zOgE{gKmL@{4^*U#Gb^5poKebgHQG5WgMfZxN}X|1QxgBUiDJI~1Bqmcw#@}+^GMif)rZbo;X?^GF=M2lLk|wK--D?;QP|I8}Dok1E9<2sPtAT4)v#t#Wpl`yd9Xijp_#Tm2fABO#MJ z?~-!LasLZA#2mF)^mzi(Yxy?k)xRh9*WZjJZ8Ye$)t2KPJdo>8j_u?yik zS9_QPH?VxLvlL;w{jeVpLdA5caTaUm=A^Shy>-__0*ns_KbiqlM-4GyCjpZs+fMbu zk7x+@)dXekEf3MF(e`SD%i?;gB4#q6!6wuEwcU>~d_&rz;yMA?q++yuwQ0SvWR+9} zpxWXkhHtE+YBk6}e`u@I0q-hG2j#XcpkaTC0w4651oN>ar|vaMuNR3Zo0E$5H-EVz zCixy(a+!Y#czEB)d|RuW7Eg9L;yXnY!flYEHP!_fQI%IuP7#R;6l$v09?jDAJh+Q) zQ=6`%O2M=;LODeFg$fO<0ZliOkU!6+Qh~q+e%9=aA9N3~-xK zRm>%PNnX^2GZ7UF#VFofriwB&(~_=c5k^0-F-)h=Vixy)FnS$PBGHF4k|3GjD{w@iQ-%CiOK@yR zs?=REzjGfuub1q-;n2ft!$e>%8Y!GvD?#MR7hon(HT9nUq{RkZgPae1d)ZqO#U2&gMr zq;r-Sph{{QN=!}7j_Z|9-JB@*F_XXJhaNTEj!dEG=By0RfJZkis=fvRpN&RX!Ne03o4}|BPsA~ zAzhG`UrldZsG!EZComVlDWHZTh25}AOxIjHGNfGdj|GC9+oKZ>Yt0%E3{~dfPG8C6 zK)FK19bQvMw)QCR&qxk+Asa|)Ifz6>yH~j21?=IzpDfqZ7e8LdyZL8YabX2tQ66U1tjlLjs(CcQ#z=-yQk@7l=K$jFPA?Xex4(}l&2z|k z7L)a{x^3jQnlVf&QTIh;mW$l4R!`U?S_}n&capw0qkf-RlNQ1HgnSm`BU)BOXX!9U z_6<(_oq@!UIyOe)k_93Ys7S$AkrcKAcGuY|8bX0Z*JUrA^>E?LQWc*FeMBQ!^qJ|z z!d2YQ`tNW!r2$qCht#v;{Nff21Fc+sFSFK+*$emn%Rxr>WXs=1>45kFgADJCd*at! zuLv12seV=tRGs$AFDhj`wOiYfGWT+OCo)5Ho-)zImv29bMMssTjcUHjuKVDSw%vIs zdL}?-ahl$z(hav#fZF1Cwp(CI_Gx5zSD4z!3>fx%56^J8_GMkW6T~Lu;+@jOYoLhD z{0UDMCR7b}PXwtRT&U_whnc%N1D81{NxL4=ZuBd_QgkAq6@zOJ=Hp-H2hK2G(^Fvmh$p(+vhG0^BO18H%ZRJO|@26O>wiehsMS z?6-!$D`0z926i_dSNl|Nrk11X5(m5>Oty6B{5(9zCPFlbOWz6h_S?PdQ-4Iuz>U_< zuDb#ax8?G7;T2BV0TJ@UK!P4N0d&*aKeckC zafcaAy&*ohy|61{GB%g{5Q!hWgT556mjk@@ckKLD<7vO*_XdnriWcD2k8;ez0M_@a z0@v#8aU2@VK-A|{$!lloZgu)mXoEc@3~WsSWhzb+OqIf!ooEuN8EB))o@+Y6uXse$ za(vlYCFr>z@lpw12vZDzn`_qNh2jBKG?eGH5RFi9g1wxY4K77=gd*lWAe(mEAvJtV zr{37t#{N=9qugEEbh6pykmbav;nM1yq4Gu!W8+>GGfH1tw8GQ-n9MgUHCv>#l6y

U2^5YFBW3y;g{Lk|j_fs6l61H1po69F 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 vol.Files) .ProjectTo(_mapper.ConfigurationProvider) .SingleAsync(vol => vol.Id == volumeId); - + var volumeList = new List() {volume}; await AddVolumeModifiers(userId, volumeList); + volumeList[0].Files = volumeList[0].Files.OrderBy(f => f.Chapter).ToList(); + return volumeList[0]; } diff --git a/API/Interfaces/IArchiveService.cs b/API/Interfaces/IArchiveService.cs new file mode 100644 index 000000000..5420c3a74 --- /dev/null +++ b/API/Interfaces/IArchiveService.cs @@ -0,0 +1,10 @@ +using System.IO.Compression; + +namespace API.Interfaces +{ + public interface IArchiveService + { + bool ArchiveNeedsFlattening(ZipArchive archive); + public void ExtractArchive(string archivePath, string extractPath); + } +} \ No newline at end of file diff --git a/API/Parser/Parser.cs b/API/Parser/Parser.cs index 111ae0fbd..431d56330 100644 --- a/API/Parser/Parser.cs +++ b/API/Parser/Parser.cs @@ -125,7 +125,7 @@ namespace API.Parser RegexOptions.IgnoreCase | RegexOptions.Compiled), // Beelzebub_01_[Noodles].zip new Regex( - @"^((?!v|vo|vol|Volume).)*( |_)(?\.?\d+)( |_)", + @"^((?!v|vo|vol|Volume).)*( |_)(?\.?\d+)( |_|\[|\()", RegexOptions.IgnoreCase | RegexOptions.Compiled), // Yumekui-Merry_DKThias_Chapter21.zip new Regex( diff --git a/API/Services/ArchiveService.cs b/API/Services/ArchiveService.cs new file mode 100644 index 000000000..22d470e29 --- /dev/null +++ b/API/Services/ArchiveService.cs @@ -0,0 +1,74 @@ +using System.Diagnostics; +using System.IO; +using System.IO.Compression; +using System.Linq; +using API.Extensions; +using API.Interfaces; +using Microsoft.Extensions.Logging; + +namespace API.Services +{ + ///

+ /// Responsible for manipulating Archive files. Used by almost exclusively. + /// + public class ArchiveService : IArchiveService + { + private readonly ILogger _logger; + + public ArchiveService(ILogger logger) + { + _logger = logger; + } + + public bool ArchiveNeedsFlattening(ZipArchive archive) + { + // Sometimes ZipArchive will list the directory and others it will just keep it in the FullName + return archive.Entries.Count > 0 && + !Path.HasExtension(archive.Entries.ElementAt(0).FullName) || + archive.Entries.Any(e => e.FullName.Contains(Path.AltDirectorySeparatorChar)); + + // return archive.Entries.Count > 0 && + // archive.Entries.Any(e => e.FullName.Contains(Path.AltDirectorySeparatorChar)); + //return archive.Entries.Count > 0 && !Path.HasExtension(archive.Entries.ElementAt(0).FullName); + } + + /// + /// Extracts an archive to a temp cache directory. Returns path to new directory. If temp cache directory already exists, + /// will return that without performing an extraction. Returns empty string if there are any invalidations which would + /// prevent operations to perform correctly (missing archivePath file, empty archive, etc). + /// + /// A valid file to an archive file. + /// Path to extract to + /// + public void ExtractArchive(string archivePath, string extractPath) + { + if (!File.Exists(archivePath) || !Parser.Parser.IsArchive(archivePath)) + { + _logger.LogError($"Archive {archivePath} could not be found."); + return; + } + + if (Directory.Exists(extractPath)) + { + _logger.LogDebug($"Archive {archivePath} has already been extracted. Returning existing folder."); + return; + } + + Stopwatch sw = Stopwatch.StartNew(); + using ZipArchive archive = ZipFile.OpenRead(archivePath); + var needsFlattening = ArchiveNeedsFlattening(archive); + if (!archive.HasFiles() && !needsFlattening) return; + + archive.ExtractToDirectory(extractPath); + _logger.LogDebug($"Extracted archive to {extractPath} in {sw.ElapsedMilliseconds} milliseconds."); + + if (needsFlattening) + { + sw = Stopwatch.StartNew(); + _logger.LogInformation("Extracted archive is nested in root folder, flattening..."); + new DirectoryInfo(extractPath).Flatten(); + _logger.LogInformation($"Flattened in {sw.ElapsedMilliseconds} milliseconds"); + } + } + } +} \ No newline at end of file diff --git a/API/Services/CacheService.cs b/API/Services/CacheService.cs index 778310124..66e8c9e2c 100644 --- a/API/Services/CacheService.cs +++ b/API/Services/CacheService.cs @@ -1,7 +1,6 @@ using System; -using System.Diagnostics; +using System.Collections.Generic; using System.IO; -using System.IO.Compression; using System.Linq; using System.Threading.Tasks; using API.Comparators; @@ -17,14 +16,16 @@ namespace API.Services private readonly IDirectoryService _directoryService; private readonly ILogger _logger; private readonly IUnitOfWork _unitOfWork; + private readonly IArchiveService _archiveService; private readonly NumericComparer _numericComparer; public static readonly string CacheDirectory = Path.GetFullPath(Path.Join(Directory.GetCurrentDirectory(), "../cache/")); - public CacheService(IDirectoryService directoryService, ILogger logger, IUnitOfWork unitOfWork) + public CacheService(IDirectoryService directoryService, ILogger logger, IUnitOfWork unitOfWork, IArchiveService archiveService) { _directoryService = directoryService; _logger = logger; _unitOfWork = unitOfWork; + _archiveService = archiveService; _numericComparer = new NumericComparer(); } @@ -46,7 +47,7 @@ namespace API.Services foreach (var file in volume.Files) { var extractPath = GetVolumeCachePath(volumeId, file); - ExtractArchive(file.FilePath, extractPath); + _archiveService.ExtractArchive(file.FilePath, extractPath); } return volume; @@ -92,44 +93,7 @@ namespace API.Services _logger.LogInformation("Cache directory purged"); } - /// - /// Extracts an archive to a temp cache directory. Returns path to new directory. If temp cache directory already exists, - /// will return that without performing an extraction. Returns empty string if there are any invalidations which would - /// prevent operations to perform correctly (missing archivePath file, empty archive, etc). - /// - /// A valid file to an archive file. - /// Path to extract to - /// - private void ExtractArchive(string archivePath, string extractPath) - { - if (!File.Exists(archivePath) || !Parser.Parser.IsArchive(archivePath)) - { - _logger.LogError($"Archive {archivePath} could not be found."); - return; - } - - if (Directory.Exists(extractPath)) - { - _logger.LogDebug($"Archive {archivePath} has already been extracted. Returning existing folder."); - return; - } - - Stopwatch sw = Stopwatch.StartNew(); - using ZipArchive archive = ZipFile.OpenRead(archivePath); - var needsFlattening = archive.Entries.Count > 0 && !Path.HasExtension(archive.Entries.ElementAt(0).FullName); - if (!archive.HasFiles() && !needsFlattening) return; - - archive.ExtractToDirectory(extractPath); - _logger.LogDebug($"Extracted archive to {extractPath} in {sw.ElapsedMilliseconds} milliseconds."); - - if (needsFlattening) - { - sw = Stopwatch.StartNew(); - _logger.LogInformation("Extracted archive is nested in root folder, flattening..."); - new DirectoryInfo(extractPath).Flatten(); - _logger.LogInformation($"Flattened in {sw.ElapsedMilliseconds} milliseconds"); - } - } + private string GetVolumeCachePath(int volumeId, MangaFile file) @@ -142,11 +106,18 @@ namespace API.Services return extractPath; } + private IEnumerable GetOrderedChapters(ICollection files) + { + return files.OrderBy(f => f.Chapter).Where(f => f.Chapter != 0); + } + public string GetCachedPagePath(Volume volume, int page) { // Calculate what chapter the page belongs to var pagesSoFar = 0; - foreach (var mangaFile in volume.Files.OrderBy(f => f.Chapter)) + // Do not allow chapters with 0, as those are specials and break ordering for reading. + var orderedChapters = GetOrderedChapters(volume.Files); + foreach (var mangaFile in orderedChapters) { if (page + 1 < (mangaFile.NumberOfPages + pagesSoFar)) { From 6621730afbae84e6b6075655adc29a516cd4715a Mon Sep 17 00:00:00 2001 From: Joseph Milazzo Date: Tue, 26 Jan 2021 10:03:06 -0600 Subject: [PATCH 06/16] Refactored more archive code into the service and updated documentation now that methods are public. --- API.Tests/Services/ArchiveServiceTests.cs | 18 ++- API.Tests/Services/ScannerServiceTests.cs | 26 ++--- .../thumbnail.expected.jpg | Bin .../thumbnail.jpg | Bin .../v10 - nested folder.cbz | Bin .../v10 - nested folder.expected.jpg | Bin .../v10 - with folder.cbz | Bin .../v10 - with folder.expected.jpg | Bin .../v10.cbz | Bin .../v10.expected.jpg | Bin API/Interfaces/IArchiveService.cs | 4 +- API/Services/ArchiveService.cs | 106 ++++++++++++++++- API/Services/ScannerService.cs | 108 ++---------------- 13 files changed, 137 insertions(+), 125 deletions(-) rename API.Tests/Services/Test Data/{ScannerService => CoverImageTests}/thumbnail.expected.jpg (100%) rename API.Tests/Services/Test Data/{ScannerService => CoverImageTests}/thumbnail.jpg (100%) rename API.Tests/Services/Test Data/{ScannerService => CoverImageTests}/v10 - nested folder.cbz (100%) rename API.Tests/Services/Test Data/{ScannerService => CoverImageTests}/v10 - nested folder.expected.jpg (100%) rename API.Tests/Services/Test Data/{ScannerService => CoverImageTests}/v10 - with folder.cbz (100%) rename API.Tests/Services/Test Data/{ScannerService => CoverImageTests}/v10 - with folder.expected.jpg (100%) rename API.Tests/Services/Test Data/{ScannerService => CoverImageTests}/v10.cbz (100%) rename API.Tests/Services/Test Data/{ScannerService => CoverImageTests}/v10.expected.jpg (100%) diff --git a/API.Tests/Services/ArchiveServiceTests.cs b/API.Tests/Services/ArchiveServiceTests.cs index 25980fe1a..44453a7f5 100644 --- a/API.Tests/Services/ArchiveServiceTests.cs +++ b/API.Tests/Services/ArchiveServiceTests.cs @@ -1,6 +1,5 @@ using System.IO; using System.IO.Compression; -using API.Extensions; using API.Interfaces; using API.Services; using Microsoft.Extensions.Logging; @@ -14,9 +13,6 @@ namespace API.Tests.Services private readonly IArchiveService _archiveService; private readonly ILogger _logger = Substitute.For>(); - private readonly string _testDirectory = - Path.Join(Directory.GetCurrentDirectory(), "../../../Services/Test Data/ArchiveService"); - public ArchiveServiceTests() { _archiveService = new ArchiveService(_logger); @@ -29,9 +25,21 @@ namespace API.Tests.Services [InlineData("file in folder_alt.zip", true)] public void ArchiveNeedsFlatteningTest(string archivePath, bool expected) { - var file = Path.Join(_testDirectory, archivePath); + var testDirectory = Path.Join(Directory.GetCurrentDirectory(), "../../../Services/Test Data/ArchiveService"); + var file = Path.Join(testDirectory, archivePath); using ZipArchive archive = ZipFile.OpenRead(file); Assert.Equal(expected, _archiveService.ArchiveNeedsFlattening(archive)); } + + [Theory] + [InlineData("v10.cbz", "v10.expected.jpg")] + [InlineData("v10 - with folder.cbz", "v10 - with folder.expected.jpg")] + [InlineData("v10 - nested folder.cbz", "v10 - nested folder.expected.jpg")] + public void GetCoverImageTest(string inputFile, string expectedOutputFile) + { + var testDirectory = Path.Join(Directory.GetCurrentDirectory(), "../../../Services/Test Data/CoverImageTests"); + var expectedBytes = File.ReadAllBytes(Path.Join(testDirectory, expectedOutputFile)); + Assert.Equal(expectedBytes, _archiveService.GetCoverImage(Path.Join(testDirectory, inputFile))); + } } } \ No newline at end of file diff --git a/API.Tests/Services/ScannerServiceTests.cs b/API.Tests/Services/ScannerServiceTests.cs index 609caf94d..efde36e52 100644 --- a/API.Tests/Services/ScannerServiceTests.cs +++ b/API.Tests/Services/ScannerServiceTests.cs @@ -9,23 +9,15 @@ namespace API.Tests.Services { public class ScannerServiceTests { - private readonly ScannerService _scannerService; - private readonly ILogger _logger = Substitute.For>(); - private readonly IUnitOfWork _unitOfWork = Substitute.For(); - private readonly string _testDirectory = Path.Join(Directory.GetCurrentDirectory(), "../../../Services/Test Data/ScannerService"); - public ScannerServiceTests() - { - _scannerService = new ScannerService(_unitOfWork, _logger); - } + // private readonly ScannerService _scannerService; + // private readonly ILogger _logger = Substitute.For>(); + // private readonly IUnitOfWork _unitOfWork = Substitute.For(); + // private readonly string _testDirectory = Path.Join(Directory.GetCurrentDirectory(), "../../../Services/Test Data/ScannerService"); + // public ScannerServiceTests() + // { + // _scannerService = new ScannerService(_unitOfWork, _logger); + // } - [Theory] - [InlineData("v10.cbz", "v10.expected.jpg")] - [InlineData("v10 - with folder.cbz", "v10 - with folder.expected.jpg")] - [InlineData("v10 - nested folder.cbz", "v10 - nested folder.expected.jpg")] - public void GetCoverImageTest(string inputFile, string expectedOutputFile) - { - var expectedBytes = File.ReadAllBytes(Path.Join(_testDirectory, expectedOutputFile)); - Assert.Equal(expectedBytes, _scannerService.GetCoverImage(Path.Join(_testDirectory, inputFile))); - } + } } \ No newline at end of file diff --git a/API.Tests/Services/Test Data/ScannerService/thumbnail.expected.jpg b/API.Tests/Services/Test Data/CoverImageTests/thumbnail.expected.jpg similarity index 100% rename from API.Tests/Services/Test Data/ScannerService/thumbnail.expected.jpg rename to API.Tests/Services/Test Data/CoverImageTests/thumbnail.expected.jpg diff --git a/API.Tests/Services/Test Data/ScannerService/thumbnail.jpg b/API.Tests/Services/Test Data/CoverImageTests/thumbnail.jpg similarity index 100% rename from API.Tests/Services/Test Data/ScannerService/thumbnail.jpg rename to API.Tests/Services/Test Data/CoverImageTests/thumbnail.jpg diff --git a/API.Tests/Services/Test Data/ScannerService/v10 - nested folder.cbz b/API.Tests/Services/Test Data/CoverImageTests/v10 - nested folder.cbz similarity index 100% rename from API.Tests/Services/Test Data/ScannerService/v10 - nested folder.cbz rename to API.Tests/Services/Test Data/CoverImageTests/v10 - nested folder.cbz diff --git a/API.Tests/Services/Test Data/ScannerService/v10 - nested folder.expected.jpg b/API.Tests/Services/Test Data/CoverImageTests/v10 - nested folder.expected.jpg similarity index 100% rename from API.Tests/Services/Test Data/ScannerService/v10 - nested folder.expected.jpg rename to API.Tests/Services/Test Data/CoverImageTests/v10 - nested folder.expected.jpg diff --git a/API.Tests/Services/Test Data/ScannerService/v10 - with folder.cbz b/API.Tests/Services/Test Data/CoverImageTests/v10 - with folder.cbz similarity index 100% rename from API.Tests/Services/Test Data/ScannerService/v10 - with folder.cbz rename to API.Tests/Services/Test Data/CoverImageTests/v10 - with folder.cbz diff --git a/API.Tests/Services/Test Data/ScannerService/v10 - with folder.expected.jpg b/API.Tests/Services/Test Data/CoverImageTests/v10 - with folder.expected.jpg similarity index 100% rename from API.Tests/Services/Test Data/ScannerService/v10 - with folder.expected.jpg rename to API.Tests/Services/Test Data/CoverImageTests/v10 - with folder.expected.jpg diff --git a/API.Tests/Services/Test Data/ScannerService/v10.cbz b/API.Tests/Services/Test Data/CoverImageTests/v10.cbz similarity index 100% rename from API.Tests/Services/Test Data/ScannerService/v10.cbz rename to API.Tests/Services/Test Data/CoverImageTests/v10.cbz diff --git a/API.Tests/Services/Test Data/ScannerService/v10.expected.jpg b/API.Tests/Services/Test Data/CoverImageTests/v10.expected.jpg similarity index 100% rename from API.Tests/Services/Test Data/ScannerService/v10.expected.jpg rename to API.Tests/Services/Test Data/CoverImageTests/v10.expected.jpg diff --git a/API/Interfaces/IArchiveService.cs b/API/Interfaces/IArchiveService.cs index 5420c3a74..07d6b6206 100644 --- a/API/Interfaces/IArchiveService.cs +++ b/API/Interfaces/IArchiveService.cs @@ -5,6 +5,8 @@ namespace API.Interfaces public interface IArchiveService { bool ArchiveNeedsFlattening(ZipArchive archive); - public void ExtractArchive(string archivePath, string extractPath); + void ExtractArchive(string archivePath, string extractPath); + int GetNumberOfPagesFromArchive(string archivePath); + byte[] GetCoverImage(string filepath, bool createThumbnail = false); } } \ No newline at end of file diff --git a/API/Services/ArchiveService.cs b/API/Services/ArchiveService.cs index 22d470e29..6ff593f59 100644 --- a/API/Services/ArchiveService.cs +++ b/API/Services/ArchiveService.cs @@ -1,10 +1,12 @@ -using System.Diagnostics; +using System; +using System.Diagnostics; using System.IO; using System.IO.Compression; using System.Linq; using API.Extensions; using API.Interfaces; using Microsoft.Extensions.Logging; +using NetVips; namespace API.Services { @@ -19,17 +21,111 @@ namespace API.Services { _logger = logger; } + + public int GetNumberOfPagesFromArchive(string archivePath) + { + if (!File.Exists(archivePath) || !Parser.Parser.IsArchive(archivePath)) + { + _logger.LogError($"Archive {archivePath} could not be found."); + return 0; + } + + _logger.LogDebug($"Getting Page numbers from {archivePath}"); + try + { + using ZipArchive archive = ZipFile.OpenRead(archivePath); // ZIPFILE + return archive.Entries.Count(e => Parser.Parser.IsImage(e.FullName)); + } + catch (Exception ex) + { + _logger.LogError(ex, "There was an exception when reading archive stream."); + return 0; + } + + + } + + /// + /// Generates byte array of cover image. + /// Given a path to a compressed file (zip, rar, cbz, cbr, etc), will ensure the first image is returned unless + /// a folder.extension exists in the root directory of the compressed file. + /// + /// + /// Create a smaller variant of file extracted from archive. Archive images are usually 1MB each. + /// + public byte[] GetCoverImage(string filepath, bool createThumbnail = false) + { + try + { + if (string.IsNullOrEmpty(filepath) || !File.Exists(filepath) || !Parser.Parser.IsArchive(filepath)) return Array.Empty(); + + _logger.LogDebug($"Extracting Cover image from {filepath}"); + using ZipArchive archive = ZipFile.OpenRead(filepath); + if (!archive.HasFiles()) return Array.Empty(); + + var folder = archive.Entries.SingleOrDefault(x => Path.GetFileNameWithoutExtension(x.Name).ToLower() == "folder"); + var entries = archive.Entries.Where(x => Path.HasExtension(x.FullName) && Parser.Parser.IsImage(x.FullName)).OrderBy(x => x.FullName).ToList(); + ZipArchiveEntry entry; + + if (folder != null) + { + entry = folder; + } else if (!entries.Any()) + { + return Array.Empty(); + } + else + { + entry = entries[0]; + } + + + if (createThumbnail) + { + try + { + using var stream = entry.Open(); + var thumbnail = Image.ThumbnailStream(stream, 320); + return thumbnail.WriteToBuffer(".jpg"); + } + catch (Exception ex) + { + _logger.LogError(ex, "There was a critical error and prevented thumbnail generation."); + } + } + + return ExtractEntryToImage(entry); + } + catch (Exception ex) + { + _logger.LogError(ex, "There was an exception when reading archive stream."); + return Array.Empty(); + } + } + + private static byte[] ExtractEntryToImage(ZipArchiveEntry entry) + { + using var stream = entry.Open(); + using var ms = new MemoryStream(); + stream.CopyTo(ms); + var data = ms.ToArray(); + + return data; + } + + /// + /// Given an archive stream, will assess whether directory needs to be flattened so that the extracted archive files are directly + /// under extract path and not nested in subfolders. See Flatten method. + /// + /// An opened archive stream + /// public bool ArchiveNeedsFlattening(ZipArchive archive) { // Sometimes ZipArchive will list the directory and others it will just keep it in the FullName return archive.Entries.Count > 0 && !Path.HasExtension(archive.Entries.ElementAt(0).FullName) || archive.Entries.Any(e => e.FullName.Contains(Path.AltDirectorySeparatorChar)); - - // return archive.Entries.Count > 0 && - // archive.Entries.Any(e => e.FullName.Contains(Path.AltDirectorySeparatorChar)); - //return archive.Entries.Count > 0 && !Path.HasExtension(archive.Entries.ElementAt(0).FullName); } /// diff --git a/API/Services/ScannerService.cs b/API/Services/ScannerService.cs index b697d5880..1b4516c94 100644 --- a/API/Services/ScannerService.cs +++ b/API/Services/ScannerService.cs @@ -20,12 +20,14 @@ namespace API.Services { private readonly IUnitOfWork _unitOfWork; private readonly ILogger _logger; + private readonly IArchiveService _archiveService; private ConcurrentDictionary> _scannedSeries; - public ScannerService(IUnitOfWork unitOfWork, ILogger logger) + public ScannerService(IUnitOfWork unitOfWork, ILogger logger, IArchiveService archiveService) { _unitOfWork = unitOfWork; _logger = logger; + _archiveService = archiveService; } public void ScanLibraries() @@ -218,7 +220,7 @@ namespace API.Services FilePath = info.FullFilePath, Chapter = chapter, Format = info.Format, - NumberOfPages = info.Format == MangaFormat.Archive ? GetNumberOfPagesFromArchive(info.FullFilePath): 1 + NumberOfPages = info.Format == MangaFormat.Archive ? _archiveService.GetNumberOfPagesFromArchive(info.FullFilePath): 1 }; } @@ -250,7 +252,7 @@ namespace API.Services { existingFile.Chapter = MinimumNumberFromRange(info.Chapters); existingFile.Format = info.Format; - existingFile.NumberOfPages = GetNumberOfPagesFromArchive(info.FullFilePath); + existingFile.NumberOfPages = _archiveService.GetNumberOfPagesFromArchive(info.FullFilePath); } else { @@ -298,7 +300,7 @@ namespace API.Services if (forceUpdate || volume.CoverImage == null || !volume.Files.Any()) { var firstFile = volume.Files.OrderBy(x => x.Chapter).FirstOrDefault(); - if (firstFile != null) volume.CoverImage = GetCoverImage(firstFile.FilePath, true); // ZIPFILE + if (firstFile != null) volume.CoverImage = _archiveService.GetCoverImage(firstFile.FilePath, true); } volume.Pages = volume.Files.Sum(x => x.NumberOfPages); @@ -307,105 +309,17 @@ namespace API.Services return volumes; } - + public void ScanSeries(int libraryId, int seriesId) - { - throw new NotImplementedException(); - } - - private int GetNumberOfPagesFromArchive(string archivePath) - { - if (!File.Exists(archivePath) || !Parser.Parser.IsArchive(archivePath)) - { - _logger.LogError($"Archive {archivePath} could not be found."); - return 0; - } - - _logger.LogDebug($"Getting Page numbers from {archivePath}"); - - try - { - using ZipArchive archive = ZipFile.OpenRead(archivePath); // ZIPFILE - return archive.Entries.Count(e => Parser.Parser.IsImage(e.FullName)); - } - catch (Exception ex) - { - _logger.LogError(ex, "There was an exception when reading archive stream."); - return 0; - } - - - } - - /// - /// Generates byte array of cover image. - /// Given a path to a compressed file (zip, rar, cbz, cbr, etc), will ensure the first image is returned unless - /// a folder.extension exists in the root directory of the compressed file. - /// - /// - /// Create a smaller variant of file extracted from archive. Archive images are usually 1MB each. - /// - public byte[] GetCoverImage(string filepath, bool createThumbnail = false) - { - try - { - if (string.IsNullOrEmpty(filepath) || !File.Exists(filepath) || !Parser.Parser.IsArchive(filepath)) return Array.Empty(); - - _logger.LogDebug($"Extracting Cover image from {filepath}"); - using ZipArchive archive = ZipFile.OpenRead(filepath); - if (!archive.HasFiles()) return Array.Empty(); - - var folder = archive.Entries.SingleOrDefault(x => Path.GetFileNameWithoutExtension(x.Name).ToLower() == "folder"); - var entries = archive.Entries.Where(x => Path.HasExtension(x.FullName) && Parser.Parser.IsImage(x.FullName)).OrderBy(x => x.FullName).ToList(); - ZipArchiveEntry entry; - - if (folder != null) - { - entry = folder; - } else if (!entries.Any()) - { - return Array.Empty(); - } - else - { - entry = entries[0]; - } + { + throw new NotImplementedException(); + } - if (createThumbnail) - { - try - { - using var stream = entry.Open(); - var thumbnail = Image.ThumbnailStream(stream, 320); - return thumbnail.WriteToBuffer(".jpg"); - } - catch (Exception ex) - { - _logger.LogError(ex, "There was a critical error and prevented thumbnail generation."); - } - } - - return ExtractEntryToImage(entry); - } - catch (Exception ex) - { - _logger.LogError(ex, "There was an exception when reading archive stream."); - return Array.Empty(); - } - } - - private static byte[] ExtractEntryToImage(ZipArchiveEntry entry) - { - using var stream = entry.Open(); - using var ms = new MemoryStream(); - stream.CopyTo(ms); - var data = ms.ToArray(); - return data; - } + } } \ No newline at end of file From ec64bf90c05945ac9a08c9db43ff85c07ab1e3f2 Mon Sep 17 00:00:00 2001 From: Joseph Milazzo Date: Tue, 26 Jan 2021 10:32:07 -0600 Subject: [PATCH 07/16] Moved the test data around so more tests can use it properly. Added a IsValidArchive that is re-usable for all archive methods. --- API.Tests/Services/ArchiveServiceTests.cs | 18 ++++++- .../ArchiveService/{ => Archives}/LICENSE.md | 0 .../ArchiveService/Archives/empty.zip | Bin 0 -> 22 bytes .../file in folder in folder.zip | Bin .../{ => Archives}/file in folder.zip | Bin .../{ => Archives}/file in folder_alt.zip | Bin .../{ => Archives}/flat file.zip | Bin .../CoverImages}/thumbnail.expected.jpg | Bin .../CoverImages}/thumbnail.jpg | Bin .../CoverImages}/v10 - nested folder.cbz | Bin .../v10 - nested folder.expected.jpg | Bin .../CoverImages}/v10 - with folder.cbz | Bin .../v10 - with folder.expected.jpg | Bin .../CoverImages}/v10.cbz | Bin .../CoverImages}/v10.expected.jpg | Bin API/Interfaces/IArchiveService.cs | 1 + API/Services/ArchiveService.cs | 46 ++++++++++++------ 17 files changed, 48 insertions(+), 17 deletions(-) rename API.Tests/Services/Test Data/ArchiveService/{ => Archives}/LICENSE.md (100%) create mode 100644 API.Tests/Services/Test Data/ArchiveService/Archives/empty.zip rename API.Tests/Services/Test Data/ArchiveService/{ => Archives}/file in folder in folder.zip (100%) rename API.Tests/Services/Test Data/ArchiveService/{ => Archives}/file in folder.zip (100%) rename API.Tests/Services/Test Data/ArchiveService/{ => Archives}/file in folder_alt.zip (100%) rename API.Tests/Services/Test Data/ArchiveService/{ => Archives}/flat file.zip (100%) rename API.Tests/Services/Test Data/{CoverImageTests => ArchiveService/CoverImages}/thumbnail.expected.jpg (100%) rename API.Tests/Services/Test Data/{CoverImageTests => ArchiveService/CoverImages}/thumbnail.jpg (100%) rename API.Tests/Services/Test Data/{CoverImageTests => ArchiveService/CoverImages}/v10 - nested folder.cbz (100%) rename API.Tests/Services/Test Data/{CoverImageTests => ArchiveService/CoverImages}/v10 - nested folder.expected.jpg (100%) rename API.Tests/Services/Test Data/{CoverImageTests => ArchiveService/CoverImages}/v10 - with folder.cbz (100%) rename API.Tests/Services/Test Data/{CoverImageTests => ArchiveService/CoverImages}/v10 - with folder.expected.jpg (100%) rename API.Tests/Services/Test Data/{CoverImageTests => ArchiveService/CoverImages}/v10.cbz (100%) rename API.Tests/Services/Test Data/{CoverImageTests => ArchiveService/CoverImages}/v10.expected.jpg (100%) diff --git a/API.Tests/Services/ArchiveServiceTests.cs b/API.Tests/Services/ArchiveServiceTests.cs index 44453a7f5..b3c4ac877 100644 --- a/API.Tests/Services/ArchiveServiceTests.cs +++ b/API.Tests/Services/ArchiveServiceTests.cs @@ -25,11 +25,25 @@ namespace API.Tests.Services [InlineData("file in folder_alt.zip", true)] public void ArchiveNeedsFlatteningTest(string archivePath, bool expected) { - var testDirectory = Path.Join(Directory.GetCurrentDirectory(), "../../../Services/Test Data/ArchiveService"); + var testDirectory = Path.Join(Directory.GetCurrentDirectory(), "../../../Services/Test Data/ArchiveService/Archives"); var file = Path.Join(testDirectory, archivePath); using ZipArchive archive = ZipFile.OpenRead(file); Assert.Equal(expected, _archiveService.ArchiveNeedsFlattening(archive)); } + + [Theory] + [InlineData("non existant file.zip", false)] + [InlineData("wrong extension.rar", false)] + [InlineData("empty.zip", false)] + [InlineData("flat file.zip", true)] + [InlineData("file in folder in folder.zip", true)] + [InlineData("file in folder.zip", true)] + [InlineData("file in folder_alt.zip", true)] + public void IsValidArchiveTest(string archivePath, bool expected) + { + var testDirectory = Path.Join(Directory.GetCurrentDirectory(), "../../../Services/Test Data/ArchiveService/Archives"); + Assert.Equal(expected, _archiveService.IsValidArchive(Path.Join(testDirectory, archivePath))); + } [Theory] [InlineData("v10.cbz", "v10.expected.jpg")] @@ -37,7 +51,7 @@ namespace API.Tests.Services [InlineData("v10 - nested folder.cbz", "v10 - nested folder.expected.jpg")] public void GetCoverImageTest(string inputFile, string expectedOutputFile) { - var testDirectory = Path.Join(Directory.GetCurrentDirectory(), "../../../Services/Test Data/CoverImageTests"); + var testDirectory = Path.Join(Directory.GetCurrentDirectory(), "../../../Services/Test Data/ArchiveService/CoverImages"); var expectedBytes = File.ReadAllBytes(Path.Join(testDirectory, expectedOutputFile)); Assert.Equal(expectedBytes, _archiveService.GetCoverImage(Path.Join(testDirectory, inputFile))); } diff --git a/API.Tests/Services/Test Data/ArchiveService/LICENSE.md b/API.Tests/Services/Test Data/ArchiveService/Archives/LICENSE.md similarity index 100% rename from API.Tests/Services/Test Data/ArchiveService/LICENSE.md rename to API.Tests/Services/Test Data/ArchiveService/Archives/LICENSE.md diff --git a/API.Tests/Services/Test Data/ArchiveService/Archives/empty.zip b/API.Tests/Services/Test Data/ArchiveService/Archives/empty.zip new file mode 100644 index 0000000000000000000000000000000000000000..15cb0ecb3e219d1701294bfdf0fe3f5cb5d208e7 GIT binary patch literal 22 NcmWIWW@Tf*000g10H*)| literal 0 HcmV?d00001 diff --git a/API.Tests/Services/Test Data/ArchiveService/file in folder in folder.zip b/API.Tests/Services/Test Data/ArchiveService/Archives/file in folder in folder.zip similarity index 100% rename from API.Tests/Services/Test Data/ArchiveService/file in folder in folder.zip rename to API.Tests/Services/Test Data/ArchiveService/Archives/file in folder in folder.zip diff --git a/API.Tests/Services/Test Data/ArchiveService/file in folder.zip b/API.Tests/Services/Test Data/ArchiveService/Archives/file in folder.zip similarity index 100% rename from API.Tests/Services/Test Data/ArchiveService/file in folder.zip rename to API.Tests/Services/Test Data/ArchiveService/Archives/file in folder.zip diff --git a/API.Tests/Services/Test Data/ArchiveService/file in folder_alt.zip b/API.Tests/Services/Test Data/ArchiveService/Archives/file in folder_alt.zip similarity index 100% rename from API.Tests/Services/Test Data/ArchiveService/file in folder_alt.zip rename to API.Tests/Services/Test Data/ArchiveService/Archives/file in folder_alt.zip diff --git a/API.Tests/Services/Test Data/ArchiveService/flat file.zip b/API.Tests/Services/Test Data/ArchiveService/Archives/flat file.zip similarity index 100% rename from API.Tests/Services/Test Data/ArchiveService/flat file.zip rename to API.Tests/Services/Test Data/ArchiveService/Archives/flat file.zip diff --git a/API.Tests/Services/Test Data/CoverImageTests/thumbnail.expected.jpg b/API.Tests/Services/Test Data/ArchiveService/CoverImages/thumbnail.expected.jpg similarity index 100% rename from API.Tests/Services/Test Data/CoverImageTests/thumbnail.expected.jpg rename to API.Tests/Services/Test Data/ArchiveService/CoverImages/thumbnail.expected.jpg diff --git a/API.Tests/Services/Test Data/CoverImageTests/thumbnail.jpg b/API.Tests/Services/Test Data/ArchiveService/CoverImages/thumbnail.jpg similarity index 100% rename from API.Tests/Services/Test Data/CoverImageTests/thumbnail.jpg rename to API.Tests/Services/Test Data/ArchiveService/CoverImages/thumbnail.jpg diff --git a/API.Tests/Services/Test Data/CoverImageTests/v10 - nested folder.cbz b/API.Tests/Services/Test Data/ArchiveService/CoverImages/v10 - nested folder.cbz similarity index 100% rename from API.Tests/Services/Test Data/CoverImageTests/v10 - nested folder.cbz rename to API.Tests/Services/Test Data/ArchiveService/CoverImages/v10 - nested folder.cbz diff --git a/API.Tests/Services/Test Data/CoverImageTests/v10 - nested folder.expected.jpg b/API.Tests/Services/Test Data/ArchiveService/CoverImages/v10 - nested folder.expected.jpg similarity index 100% rename from API.Tests/Services/Test Data/CoverImageTests/v10 - nested folder.expected.jpg rename to API.Tests/Services/Test Data/ArchiveService/CoverImages/v10 - nested folder.expected.jpg diff --git a/API.Tests/Services/Test Data/CoverImageTests/v10 - with folder.cbz b/API.Tests/Services/Test Data/ArchiveService/CoverImages/v10 - with folder.cbz similarity index 100% rename from API.Tests/Services/Test Data/CoverImageTests/v10 - with folder.cbz rename to API.Tests/Services/Test Data/ArchiveService/CoverImages/v10 - with folder.cbz diff --git a/API.Tests/Services/Test Data/CoverImageTests/v10 - with folder.expected.jpg b/API.Tests/Services/Test Data/ArchiveService/CoverImages/v10 - with folder.expected.jpg similarity index 100% rename from API.Tests/Services/Test Data/CoverImageTests/v10 - with folder.expected.jpg rename to API.Tests/Services/Test Data/ArchiveService/CoverImages/v10 - with folder.expected.jpg diff --git a/API.Tests/Services/Test Data/CoverImageTests/v10.cbz b/API.Tests/Services/Test Data/ArchiveService/CoverImages/v10.cbz similarity index 100% rename from API.Tests/Services/Test Data/CoverImageTests/v10.cbz rename to API.Tests/Services/Test Data/ArchiveService/CoverImages/v10.cbz diff --git a/API.Tests/Services/Test Data/CoverImageTests/v10.expected.jpg b/API.Tests/Services/Test Data/ArchiveService/CoverImages/v10.expected.jpg similarity index 100% rename from API.Tests/Services/Test Data/CoverImageTests/v10.expected.jpg rename to API.Tests/Services/Test Data/ArchiveService/CoverImages/v10.expected.jpg diff --git a/API/Interfaces/IArchiveService.cs b/API/Interfaces/IArchiveService.cs index 07d6b6206..3b3ab14cd 100644 --- a/API/Interfaces/IArchiveService.cs +++ b/API/Interfaces/IArchiveService.cs @@ -8,5 +8,6 @@ namespace API.Interfaces void ExtractArchive(string archivePath, string extractPath); int GetNumberOfPagesFromArchive(string archivePath); byte[] GetCoverImage(string filepath, bool createThumbnail = false); + bool IsValidArchive(string archivePath); } } \ No newline at end of file diff --git a/API/Services/ArchiveService.cs b/API/Services/ArchiveService.cs index 6ff593f59..b1615c705 100644 --- a/API/Services/ArchiveService.cs +++ b/API/Services/ArchiveService.cs @@ -24,17 +24,13 @@ namespace API.Services public int GetNumberOfPagesFromArchive(string archivePath) { - if (!File.Exists(archivePath) || !Parser.Parser.IsArchive(archivePath)) - { - _logger.LogError($"Archive {archivePath} could not be found."); - return 0; - } - + if (!IsValidArchive(archivePath)) return 0; + _logger.LogDebug($"Getting Page numbers from {archivePath}"); try { - using ZipArchive archive = ZipFile.OpenRead(archivePath); // ZIPFILE + using ZipArchive archive = ZipFile.OpenRead(archivePath); return archive.Entries.Count(e => Parser.Parser.IsImage(e.FullName)); } catch (Exception ex) @@ -42,8 +38,6 @@ namespace API.Services _logger.LogError(ex, "There was an exception when reading archive stream."); return 0; } - - } /// @@ -58,7 +52,8 @@ namespace API.Services { try { - if (string.IsNullOrEmpty(filepath) || !File.Exists(filepath) || !Parser.Parser.IsArchive(filepath)) return Array.Empty(); + if (!IsValidArchive(filepath)) return Array.Empty(); + //if (string.IsNullOrEmpty(filepath) || !File.Exists(filepath) || !Parser.Parser.IsArchive(filepath)) return Array.Empty(); _logger.LogDebug($"Extracting Cover image from {filepath}"); using ZipArchive archive = ZipFile.OpenRead(filepath); @@ -128,6 +123,31 @@ namespace API.Services archive.Entries.Any(e => e.FullName.Contains(Path.AltDirectorySeparatorChar)); } + /// + /// Test if the archive path exists and there are images inside it. This will log as an error. + /// + /// + /// + public bool IsValidArchive(string archivePath) + { + if (!File.Exists(archivePath)) + { + _logger.LogError($"Archive {archivePath} could not be found."); + return false; + } + if (!Parser.Parser.IsArchive(archivePath)) + { + _logger.LogError($"Archive {archivePath} is not a valid archive."); + return false; + } + + using var archive = ZipFile.OpenRead(archivePath); + if (archive.Entries.Any(e => Parser.Parser.IsImage(e.FullName))) return true; + _logger.LogError($"Archive {archivePath} contains no images."); + return false; + + } + /// /// Extracts an archive to a temp cache directory. Returns path to new directory. If temp cache directory already exists, /// will return that without performing an extraction. Returns empty string if there are any invalidations which would @@ -138,11 +158,7 @@ namespace API.Services /// public void ExtractArchive(string archivePath, string extractPath) { - if (!File.Exists(archivePath) || !Parser.Parser.IsArchive(archivePath)) - { - _logger.LogError($"Archive {archivePath} could not be found."); - return; - } + if (!IsValidArchive(archivePath)) return; if (Directory.Exists(extractPath)) { From 1d61d1057ea17f144f2ec9601cd7c77e748f93fc Mon Sep 17 00:00:00 2001 From: Joseph Milazzo Date: Tue, 26 Jan 2021 10:45:44 -0600 Subject: [PATCH 08/16] Refactored and cleaned up GetCoverImage code. --- API.Tests/Services/ArchiveServiceTests.cs | 16 +++++- API/Services/ArchiveService.cs | 62 ++++++++++------------- 2 files changed, 41 insertions(+), 37 deletions(-) diff --git a/API.Tests/Services/ArchiveServiceTests.cs b/API.Tests/Services/ArchiveServiceTests.cs index b3c4ac877..86f186b95 100644 --- a/API.Tests/Services/ArchiveServiceTests.cs +++ b/API.Tests/Services/ArchiveServiceTests.cs @@ -32,7 +32,7 @@ namespace API.Tests.Services } [Theory] - [InlineData("non existant file.zip", false)] + [InlineData("non existent file.zip", false)] [InlineData("wrong extension.rar", false)] [InlineData("empty.zip", false)] [InlineData("flat file.zip", true)] @@ -45,6 +45,20 @@ namespace API.Tests.Services Assert.Equal(expected, _archiveService.IsValidArchive(Path.Join(testDirectory, archivePath))); } + [Theory] + [InlineData("non existent file.zip", 0)] + [InlineData("wrong extension.rar", 0)] + [InlineData("empty.zip", 0)] + [InlineData("flat file.zip", 1)] + [InlineData("file in folder in folder.zip", 1)] + [InlineData("file in folder.zip", 1)] + [InlineData("file in folder_alt.zip", 1)] + public void GetNumberOfPagesFromArchiveTest(string archivePath, int expected) + { + var testDirectory = Path.Join(Directory.GetCurrentDirectory(), "../../../Services/Test Data/ArchiveService/Archives"); + Assert.Equal(expected, _archiveService.GetNumberOfPagesFromArchive(Path.Join(testDirectory, archivePath))); + } + [Theory] [InlineData("v10.cbz", "v10.expected.jpg")] [InlineData("v10 - with folder.cbz", "v10 - with folder.expected.jpg")] diff --git a/API/Services/ArchiveService.cs b/API/Services/ArchiveService.cs index b1615c705..41d20a8e7 100644 --- a/API/Services/ArchiveService.cs +++ b/API/Services/ArchiveService.cs @@ -11,11 +11,12 @@ using NetVips; namespace API.Services { /// - /// Responsible for manipulating Archive files. Used by almost exclusively. + /// Responsible for manipulating Archive files. Used by and /// public class ArchiveService : IArchiveService { private readonly ILogger _logger; + private const int ThumbnailWidth = 320; public ArchiveService(ILogger logger) { @@ -25,7 +26,6 @@ namespace API.Services public int GetNumberOfPagesFromArchive(string archivePath) { if (!IsValidArchive(archivePath)) return 0; - _logger.LogDebug($"Getting Page numbers from {archivePath}"); try @@ -53,53 +53,43 @@ namespace API.Services try { if (!IsValidArchive(filepath)) return Array.Empty(); - //if (string.IsNullOrEmpty(filepath) || !File.Exists(filepath) || !Parser.Parser.IsArchive(filepath)) return Array.Empty(); - _logger.LogDebug($"Extracting Cover image from {filepath}"); + using ZipArchive archive = ZipFile.OpenRead(filepath); if (!archive.HasFiles()) return Array.Empty(); var folder = archive.Entries.SingleOrDefault(x => Path.GetFileNameWithoutExtension(x.Name).ToLower() == "folder"); var entries = archive.Entries.Where(x => Path.HasExtension(x.FullName) && Parser.Parser.IsImage(x.FullName)).OrderBy(x => x.FullName).ToList(); - ZipArchiveEntry entry; - - if (folder != null) - { - entry = folder; - } else if (!entries.Any()) - { - return Array.Empty(); - } - else - { - entry = entries[0]; - } + var entry = folder ?? entries[0]; - - if (createThumbnail) - { - try - { - using var stream = entry.Open(); - var thumbnail = Image.ThumbnailStream(stream, 320); - return thumbnail.WriteToBuffer(".jpg"); - } - catch (Exception ex) - { - _logger.LogError(ex, "There was a critical error and prevented thumbnail generation."); - } - } - - return ExtractEntryToImage(entry); + return createThumbnail ? CreateThumbnail(entry) : ConvertEntryToByteArray(entry); } catch (Exception ex) { _logger.LogError(ex, "There was an exception when reading archive stream."); - return Array.Empty(); } + + return Array.Empty(); } - - private static byte[] ExtractEntryToImage(ZipArchiveEntry entry) + + private byte[] CreateThumbnail(ZipArchiveEntry entry) + { + var coverImage = Array.Empty(); + try + { + using var stream = entry.Open(); + using var thumbnail = Image.ThumbnailStream(stream, ThumbnailWidth); + coverImage = thumbnail.WriteToBuffer(".jpg"); + } + catch (Exception ex) + { + _logger.LogError(ex, "There was a critical error and prevented thumbnail generation. Defaulting to no cover image."); + } + + return coverImage; + } + + private static byte[] ConvertEntryToByteArray(ZipArchiveEntry entry) { using var stream = entry.Open(); using var ms = new MemoryStream(); From f430595d1130b6cbd31826ab052e13562536288b Mon Sep 17 00:00:00 2001 From: Joseph Milazzo Date: Tue, 26 Jan 2021 14:35:50 -0600 Subject: [PATCH 09/16] Attempted to Test CacheService, but can't figure it out. --- API.Tests/ParserTest.cs | 10 +++ API.Tests/Services/CacheServiceTests.cs | 62 +++++++++++++++++++ .../ApplicationServiceExtensions.cs | 1 + API/Interfaces/ICacheService.cs | 2 + API/Interfaces/IDirectoryService.cs | 1 + API/Parser/Parser.cs | 7 +++ API/Services/CacheService.cs | 16 ++--- API/Services/DirectoryService.cs | 6 +- API/Services/ScannerService.cs | 13 +--- 9 files changed, 96 insertions(+), 22 deletions(-) create mode 100644 API.Tests/Services/CacheServiceTests.cs diff --git a/API.Tests/ParserTest.cs b/API.Tests/ParserTest.cs index de1f77936..34b7798a3 100644 --- a/API.Tests/ParserTest.cs +++ b/API.Tests/ParserTest.cs @@ -166,6 +166,16 @@ namespace API.Tests { Assert.Equal(expected, ParseEdition(input)); } + + [Theory] + [InlineData("12-14", 12)] + [InlineData("24", 24)] + [InlineData("18-04", 4)] + public void MinimumNumberFromRangeTest(string input, int expected) + { + Assert.Equal(expected, MinimumNumberFromRange(input)); + } + [Fact] public void ParseInfoTest() diff --git a/API.Tests/Services/CacheServiceTests.cs b/API.Tests/Services/CacheServiceTests.cs new file mode 100644 index 000000000..e5581c98b --- /dev/null +++ b/API.Tests/Services/CacheServiceTests.cs @@ -0,0 +1,62 @@ +using API.Interfaces; +using API.Services; +using Microsoft.Extensions.Logging; +using NSubstitute; +using Xunit; + +namespace API.Tests.Services +{ + public class CacheServiceTests + { + private readonly ICacheService _cacheService; + private readonly ILogger _logger = Substitute.For>(); + private readonly IUnitOfWork _unitOfWork = Substitute.For(); + private readonly IArchiveService _archiveService = Substitute.For(); + private readonly IDirectoryService _directoryService = Substitute.For(); + + public CacheServiceTests() + { + _cacheService = new CacheService(_logger, _unitOfWork, _archiveService, _directoryService); + } + + //string GetCachedPagePath(Volume volume, int page) + [Fact] + //[InlineData("", 0, "")] + public void GetCachedPagePathTest_Should() + { + // TODO: Figure out how to test this + // string archivePath = "flat file.zip"; + // int pageNum = 0; + // string expected = "cache/1/pexels-photo-6551949.jpg"; + // + // var testDirectory = Path.Join(Directory.GetCurrentDirectory(), "../../../Services/Test Data/ArchiveService/Archives"); + // var file = Path.Join(testDirectory, archivePath); + // var volume = new Volume + // { + // Id = 1, + // Files = new List() + // { + // new() + // { + // Id = 1, + // Chapter = 0, + // FilePath = archivePath, + // Format = MangaFormat.Archive, + // NumberOfPages = 1, + // } + // }, + // Name = "1", + // Number = 1 + // }; + // + // var cacheService = Substitute.ForPartsOf(); + // cacheService.Configure().CacheDirectoryIsAccessible().Returns(true); + // cacheService.Configure().GetVolumeCachePath(1, volume.Files.ElementAt(0)).Returns("cache/1/"); + // _directoryService.Configure().GetFiles("cache/1/").Returns(new string[] {"pexels-photo-6551949.jpg"}); + // Assert.Equal(expected, _cacheService.GetCachedPagePath(volume, pageNum)); + Assert.True(true); + } + + + } +} \ No newline at end of file diff --git a/API/Extensions/ApplicationServiceExtensions.cs b/API/Extensions/ApplicationServiceExtensions.cs index 318c87340..8cda03754 100644 --- a/API/Extensions/ApplicationServiceExtensions.cs +++ b/API/Extensions/ApplicationServiceExtensions.cs @@ -23,6 +23,7 @@ namespace API.Extensions services.AddScoped(); services.AddScoped(); services.AddScoped(); + services.AddScoped(); diff --git a/API/Interfaces/ICacheService.cs b/API/Interfaces/ICacheService.cs index 81a4ef5fa..4bef9bf06 100644 --- a/API/Interfaces/ICacheService.cs +++ b/API/Interfaces/ICacheService.cs @@ -32,5 +32,7 @@ namespace API.Interfaces /// Page number to look for /// string GetCachedPagePath(Volume volume, int page); + + bool CacheDirectoryIsAccessible(); } } \ No newline at end of file diff --git a/API/Interfaces/IDirectoryService.cs b/API/Interfaces/IDirectoryService.cs index 5f9958f03..a004ac6e2 100644 --- a/API/Interfaces/IDirectoryService.cs +++ b/API/Interfaces/IDirectoryService.cs @@ -14,5 +14,6 @@ namespace API.Interfaces IEnumerable ListDirectory(string rootPath); Task ReadImageAsync(string imagePath); + string[] GetFiles(string path); // TODO: Refactor. This is currently for CacheServiceTest mocking } } \ No newline at end of file diff --git a/API/Parser/Parser.cs b/API/Parser/Parser.cs index 431d56330..694956202 100644 --- a/API/Parser/Parser.cs +++ b/API/Parser/Parser.cs @@ -1,5 +1,6 @@ using System; using System.IO; +using System.Linq; using System.Text.RegularExpressions; using API.Entities; @@ -395,5 +396,11 @@ namespace API.Parser var fileInfo = new FileInfo(filePath); return ImageFileExtensions.Contains(fileInfo.Extension); } + + public static int MinimumNumberFromRange(string range) + { + var tokens = range.Split("-"); + return tokens.Min(Int32.Parse); + } } } \ No newline at end of file diff --git a/API/Services/CacheService.cs b/API/Services/CacheService.cs index 66e8c9e2c..2308261ce 100644 --- a/API/Services/CacheService.cs +++ b/API/Services/CacheService.cs @@ -13,23 +13,23 @@ namespace API.Services { public class CacheService : ICacheService { - private readonly IDirectoryService _directoryService; private readonly ILogger _logger; private readonly IUnitOfWork _unitOfWork; private readonly IArchiveService _archiveService; + private readonly IDirectoryService _directoryService; private readonly NumericComparer _numericComparer; public static readonly string CacheDirectory = Path.GetFullPath(Path.Join(Directory.GetCurrentDirectory(), "../cache/")); - public CacheService(IDirectoryService directoryService, ILogger logger, IUnitOfWork unitOfWork, IArchiveService archiveService) + public CacheService(ILogger logger, IUnitOfWork unitOfWork, IArchiveService archiveService, IDirectoryService directoryService) { - _directoryService = directoryService; _logger = logger; _unitOfWork = unitOfWork; _archiveService = archiveService; + _directoryService = directoryService; _numericComparer = new NumericComparer(); } - private bool CacheDirectoryIsAccessible() + public bool CacheDirectoryIsAccessible() { _logger.LogDebug($"Checking if valid Cache directory: {CacheDirectory}"); var di = new DirectoryInfo(CacheDirectory); @@ -96,7 +96,7 @@ namespace API.Services - private string GetVolumeCachePath(int volumeId, MangaFile file) + public string GetVolumeCachePath(int volumeId, MangaFile file) { var extractPath = Path.GetFullPath(Path.Join(Directory.GetCurrentDirectory(), $"../cache/{volumeId}/")); if (file.Chapter > 0) @@ -106,9 +106,9 @@ namespace API.Services return extractPath; } - private IEnumerable GetOrderedChapters(ICollection files) + public IEnumerable GetOrderedChapters(ICollection files) { - return files.OrderBy(f => f.Chapter).Where(f => f.Chapter != 0); + return files.OrderBy(f => f.Chapter).Where(f => f.Chapter > 0 || f.Volume.Number != 0); } public string GetCachedPagePath(Volume volume, int page) @@ -122,7 +122,7 @@ namespace API.Services if (page + 1 < (mangaFile.NumberOfPages + pagesSoFar)) { var path = GetVolumeCachePath(volume.Id, mangaFile); - var files = DirectoryService.GetFiles(path); + var files = _directoryService.GetFiles(path); Array.Sort(files, _numericComparer); return files.ElementAt(page - pagesSoFar); diff --git a/API/Services/DirectoryService.cs b/API/Services/DirectoryService.cs index d910c5c1b..73676d1d9 100644 --- a/API/Services/DirectoryService.cs +++ b/API/Services/DirectoryService.cs @@ -33,10 +33,9 @@ namespace API.Services reSearchPattern.IsMatch(Path.GetExtension(file))); } - public static string[] GetFiles(string path) + public string[] GetFiles(string path) { - if (!Directory.Exists(path)) return Array.Empty(); - return Directory.GetFiles(path); + return !Directory.Exists(path) ? Array.Empty() : Directory.GetFiles(path); } public IEnumerable ListDirectory(string rootPath) @@ -48,7 +47,6 @@ namespace API.Services .Where(dir => !(dir.Attributes.HasFlag(FileAttributes.Hidden) || dir.Attributes.HasFlag(FileAttributes.System))) .Select(d => d.Name).ToImmutableList(); - return dirs; } diff --git a/API/Services/ScannerService.cs b/API/Services/ScannerService.cs index 1b4516c94..eaf2fff5c 100644 --- a/API/Services/ScannerService.cs +++ b/API/Services/ScannerService.cs @@ -224,11 +224,7 @@ namespace API.Services }; } - private int MinimumNumberFromRange(string range) - { - var tokens = range.Split("-"); - return Int32.Parse(tokens.Length >= 1 ? tokens[0] : range); - } + /// /// Creates or Updates volumes for a given series @@ -250,7 +246,7 @@ namespace API.Services var existingFile = existingVolume.Files.SingleOrDefault(f => f.FilePath == info.FullFilePath); if (existingFile != null) { - existingFile.Chapter = MinimumNumberFromRange(info.Chapters); + existingFile.Chapter = Parser.Parser.MinimumNumberFromRange(info.Chapters); existingFile.Format = info.Format; existingFile.NumberOfPages = _archiveService.GetNumberOfPagesFromArchive(info.FullFilePath); } @@ -282,7 +278,7 @@ namespace API.Services var vol = new Volume() { Name = info.Volumes, - Number = MinimumNumberFromRange(info.Volumes), + Number = Parser.Parser.MinimumNumberFromRange(info.Volumes), Files = new List() { CreateMangaFile(info) @@ -316,9 +312,6 @@ namespace API.Services { throw new NotImplementedException(); } - - - } From a42e54a07846bac8250063d46269d848dc703893 Mon Sep 17 00:00:00 2001 From: Joseph Milazzo Date: Wed, 27 Jan 2021 14:14:16 -0600 Subject: [PATCH 10/16] Lots of work for chapters. This code will be refactored in a chapter rewrite. --- API.Tests/ChapterSortComparerTest.cs | 19 +++++++++ API.Tests/Services/CacheServiceTests.cs | 42 ++++++++++++++++++- .../Services/StringLogicalComparerTest.cs | 1 - API/Comparators/ChapterSortComparer.cs | 18 ++++++++ API/Controllers/ReaderController.cs | 12 +++++- API/DTOs/ImageDto.cs | 2 + API/Entities/Series.cs | 2 +- API/Interfaces/ICacheService.cs | 2 +- API/Parser/Parser.cs | 2 +- API/Services/CacheService.cs | 10 +++-- API/Services/DirectoryService.cs | 2 +- 11 files changed, 99 insertions(+), 13 deletions(-) create mode 100644 API.Tests/ChapterSortComparerTest.cs create mode 100644 API/Comparators/ChapterSortComparer.cs diff --git a/API.Tests/ChapterSortComparerTest.cs b/API.Tests/ChapterSortComparerTest.cs new file mode 100644 index 000000000..7ab909ec5 --- /dev/null +++ b/API.Tests/ChapterSortComparerTest.cs @@ -0,0 +1,19 @@ +using System.Linq; +using API.Comparators; +using Xunit; + +namespace API.Tests +{ + public class ChapterSortComparerTest + { + [Theory] + [InlineData(new[] {1, 2, 0}, new[] {1, 2, 0})] + [InlineData(new[] {3, 1, 2}, new[] {1, 2, 3})] + [InlineData(new[] {1, 0, 0}, new[] {1, 0, 0})] + public void ChapterSortTest(int[] input, int[] expected) + { + Assert.Equal(expected, input.OrderBy(f => f, new ChapterSortComparer()).ToArray()); + } + + } +} \ No newline at end of file diff --git a/API.Tests/Services/CacheServiceTests.cs b/API.Tests/Services/CacheServiceTests.cs index e5581c98b..345ff93fb 100644 --- a/API.Tests/Services/CacheServiceTests.cs +++ b/API.Tests/Services/CacheServiceTests.cs @@ -1,4 +1,6 @@ -using API.Interfaces; +using System.Collections.Generic; +using API.Entities; +using API.Interfaces; using API.Services; using Microsoft.Extensions.Logging; using NSubstitute; @@ -8,7 +10,7 @@ namespace API.Tests.Services { public class CacheServiceTests { - private readonly ICacheService _cacheService; + private readonly CacheService _cacheService; private readonly ILogger _logger = Substitute.For>(); private readonly IUnitOfWork _unitOfWork = Substitute.For(); private readonly IArchiveService _archiveService = Substitute.For(); @@ -56,6 +58,42 @@ namespace API.Tests.Services // Assert.Equal(expected, _cacheService.GetCachedPagePath(volume, pageNum)); Assert.True(true); } + + [Fact] + public void GetOrderedChaptersTest() + { + var files = new List() + { + new() + { + Chapter = 1 + }, + new() + { + Chapter = 2 + }, + new() + { + Chapter = 0 + }, + }; + var expected = new List() + { + new() + { + Chapter = 1 + }, + new() + { + Chapter = 2 + }, + new() + { + Chapter = 0 + }, + }; + Assert.NotStrictEqual(expected, _cacheService.GetOrderedChapters(files)); + } } diff --git a/API.Tests/Services/StringLogicalComparerTest.cs b/API.Tests/Services/StringLogicalComparerTest.cs index 25c5d3b2f..3ffa0f8a6 100644 --- a/API.Tests/Services/StringLogicalComparerTest.cs +++ b/API.Tests/Services/StringLogicalComparerTest.cs @@ -11,7 +11,6 @@ namespace API.Tests.Services new[] {"x1.jpg", "x10.jpg", "x3.jpg", "x4.jpg", "x11.jpg"}, new[] {"x1.jpg", "x3.jpg", "x4.jpg", "x10.jpg", "x11.jpg"} )] - public void TestLogicalComparer(string[] input, string[] expected) { NumericComparer nc = new NumericComparer(); diff --git a/API/Comparators/ChapterSortComparer.cs b/API/Comparators/ChapterSortComparer.cs new file mode 100644 index 000000000..725622bec --- /dev/null +++ b/API/Comparators/ChapterSortComparer.cs @@ -0,0 +1,18 @@ +using System.Collections.Generic; + +namespace API.Comparators +{ + public class ChapterSortComparer : IComparer + { + public int Compare(int x, int y) + { + if (x == 0 && y == 0) return 0; + // if x is 0, it comes second + if (x == 0) return 1; + // if y is 0, it comes second + if (y == 0) return -1; + + return x.CompareTo(y); + } + } +} \ No newline at end of file diff --git a/API/Controllers/ReaderController.cs b/API/Controllers/ReaderController.cs index d2fed05f7..7aaba8c94 100644 --- a/API/Controllers/ReaderController.cs +++ b/API/Controllers/ReaderController.cs @@ -6,6 +6,7 @@ using API.DTOs; using API.Entities; using API.Extensions; using API.Interfaces; +using AutoMapper; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; @@ -17,14 +18,16 @@ namespace API.Controllers private readonly ICacheService _cacheService; private readonly ILogger _logger; private readonly IUnitOfWork _unitOfWork; + private readonly IMapper _mapper; public ReaderController(IDirectoryService directoryService, ICacheService cacheService, - ILogger logger, IUnitOfWork unitOfWork) + ILogger logger, IUnitOfWork unitOfWork, IMapper mapper) { _directoryService = directoryService; _cacheService = cacheService; _logger = logger; _unitOfWork = unitOfWork; + _mapper = mapper; } [HttpGet("image")] @@ -33,9 +36,12 @@ namespace API.Controllers // Temp let's iterate the directory each call to get next image var volume = await _cacheService.Ensure(volumeId); - var path = _cacheService.GetCachedPagePath(volume, page); + var (path, mangaFile) = _cacheService.GetCachedPagePath(volume, page); + if (string.IsNullOrEmpty(path)) return BadRequest($"No such image for page {page}"); var file = await _directoryService.ReadImageAsync(path); file.Page = page; + file.Chapter = mangaFile.Chapter; + file.MangaFileName = mangaFile.FilePath; return Ok(file); } @@ -57,6 +63,8 @@ namespace API.Controllers { var user = await _unitOfWork.UserRepository.GetUserByUsernameAsync(User.GetUsername()); _logger.LogInformation($"Saving {user.UserName} progress for {bookmarkDto.VolumeId} to page {bookmarkDto.PageNum}"); + + // TODO: Don't let user bookmark past total pages. user.Progresses ??= new List(); var userProgress = user.Progresses.SingleOrDefault(x => x.VolumeId == bookmarkDto.VolumeId && x.AppUserId == user.Id); diff --git a/API/DTOs/ImageDto.cs b/API/DTOs/ImageDto.cs index 473f2c110..18ffe7178 100644 --- a/API/DTOs/ImageDto.cs +++ b/API/DTOs/ImageDto.cs @@ -9,5 +9,7 @@ public int Height { get; init; } public string Format { get; init; } public byte[] Content { get; init; } + public int Chapter { get; set; } + public string MangaFileName { get; set; } } } \ No newline at end of file diff --git a/API/Entities/Series.cs b/API/Entities/Series.cs index 8fe8e6628..a4b225736 100644 --- a/API/Entities/Series.cs +++ b/API/Entities/Series.cs @@ -27,7 +27,7 @@ namespace API.Entities public DateTime LastModified { get; set; } public byte[] CoverImage { get; set; } /// - /// Sum of all Volume pages + /// Sum of all Volume page counts /// public int Pages { get; set; } diff --git a/API/Interfaces/ICacheService.cs b/API/Interfaces/ICacheService.cs index 4bef9bf06..9bf9eaa71 100644 --- a/API/Interfaces/ICacheService.cs +++ b/API/Interfaces/ICacheService.cs @@ -31,7 +31,7 @@ namespace API.Interfaces /// /// Page number to look for /// - string GetCachedPagePath(Volume volume, int page); + (string path, MangaFile file) GetCachedPagePath(Volume volume, int page); bool CacheDirectoryIsAccessible(); } diff --git a/API/Parser/Parser.cs b/API/Parser/Parser.cs index 694956202..33bf67978 100644 --- a/API/Parser/Parser.cs +++ b/API/Parser/Parser.cs @@ -169,7 +169,7 @@ namespace API.Parser /// /// Root folder /// or null if Series was empty - public static ParserInfo? Parse(string filePath, string rootPath) + public static ParserInfo Parse(string filePath, string rootPath) { var fileName = Path.GetFileName(filePath); var directoryName = (new FileInfo(filePath)).Directory?.Name; diff --git a/API/Services/CacheService.cs b/API/Services/CacheService.cs index 2308261ce..f9d9242f1 100644 --- a/API/Services/CacheService.cs +++ b/API/Services/CacheService.cs @@ -108,10 +108,12 @@ namespace API.Services public IEnumerable GetOrderedChapters(ICollection files) { - return files.OrderBy(f => f.Chapter).Where(f => f.Chapter > 0 || f.Volume.Number != 0); + // BUG: This causes a problem because total pages on a volume assumes "specials" to be there + //return files.OrderBy(f => f.Chapter).Where(f => f.Chapter > 0 || f.Volume.Number != 0); + return files.OrderBy(f => f.Chapter, new ChapterSortComparer()); } - public string GetCachedPagePath(Volume volume, int page) + public (string path, MangaFile file) GetCachedPagePath(Volume volume, int page) { // Calculate what chapter the page belongs to var pagesSoFar = 0; @@ -125,12 +127,12 @@ namespace API.Services var files = _directoryService.GetFiles(path); Array.Sort(files, _numericComparer); - return files.ElementAt(page - pagesSoFar); + return (files.ElementAt(page - pagesSoFar), mangaFile); } pagesSoFar += mangaFile.NumberOfPages; } - return ""; + return ("", null); } } } \ No newline at end of file diff --git a/API/Services/DirectoryService.cs b/API/Services/DirectoryService.cs index 73676d1d9..a4e7c5ce8 100644 --- a/API/Services/DirectoryService.cs +++ b/API/Services/DirectoryService.cs @@ -61,7 +61,7 @@ namespace API.Services FullPath = Path.GetFullPath(imagePath), Width = image.Width, Height = image.Height, - Format = image.Format + Format = image.Format, }; } From 53e85317f9977e54f5c59190ee55de63820b0ad3 Mon Sep 17 00:00:00 2001 From: Joseph Milazzo Date: Mon, 1 Feb 2021 09:29:11 -0600 Subject: [PATCH 11/16] Refactored DB to be Series->Volumes->Chapters instead. All functionality that previously worked still works. Cleanup still needed. --- .gitignore | 1 + API.Tests/Services/CacheServiceTests.cs | 62 +- API/Controllers/ReaderController.cs | 24 +- API/Controllers/SeriesController.cs | 18 +- API/DTOs/ChapterDto.cs | 31 + API/DTOs/MangaFileDto.cs | 1 - API/DTOs/VolumeDto.cs | 2 +- API/Data/BookmarkDto.cs | 1 + API/Data/DataContext.cs | 3 + ...3348_SeriesVolumeChapterChange.Designer.cs | 688 ++++++++++++++++++ ...0210128143348_SeriesVolumeChapterChange.cs | 111 +++ ...2_MangaFileChapterRelationship.Designer.cs | 676 +++++++++++++++++ ...0128201832_MangaFileChapterRelationship.cs | 98 +++ .../Migrations/DataContextModelSnapshot.cs | 74 +- API/Data/SeriesRepository.cs | 17 +- API/Data/UnitOfWork.cs | 2 + API/Data/VolumeRepository.cs | 61 ++ API/Entities/AppUserProgress.cs | 4 +- API/Entities/Chapter.cs | 35 + API/Entities/FolderPath.cs | 8 + API/Entities/MangaFile.cs | 8 +- API/Entities/Series.cs | 10 +- API/Entities/Volume.cs | 7 +- API/Extensions/DirectoryInfoExtensions.cs | 3 +- API/Helpers/AutoMapperProfiles.cs | 2 + API/Interfaces/ICacheService.cs | 14 +- API/Interfaces/IUnitOfWork.cs | 1 + API/Interfaces/IVolumeRepository.cs | 15 + API/Services/ArchiveService.cs | 2 +- API/Services/CacheService.cs | 68 +- API/Services/DirectoryService.cs | 12 + API/Services/ScannerService.cs | 160 +++- API/Startup.cs | 7 +- 33 files changed, 2084 insertions(+), 142 deletions(-) create mode 100644 API/DTOs/ChapterDto.cs create mode 100644 API/Data/Migrations/20210128143348_SeriesVolumeChapterChange.Designer.cs create mode 100644 API/Data/Migrations/20210128143348_SeriesVolumeChapterChange.cs create mode 100644 API/Data/Migrations/20210128201832_MangaFileChapterRelationship.Designer.cs create mode 100644 API/Data/Migrations/20210128201832_MangaFileChapterRelationship.cs create mode 100644 API/Data/VolumeRepository.cs create mode 100644 API/Entities/Chapter.cs create mode 100644 API/Interfaces/IVolumeRepository.cs diff --git a/.gitignore b/.gitignore index a87e29ab0..9999bab3e 100644 --- a/.gitignore +++ b/.gitignore @@ -450,3 +450,4 @@ appsettings.json /API/Hangfire-log.db cache/ /API/wwwroot/ +/API/cache/ \ No newline at end of file diff --git a/API.Tests/Services/CacheServiceTests.cs b/API.Tests/Services/CacheServiceTests.cs index 345ff93fb..5459133af 100644 --- a/API.Tests/Services/CacheServiceTests.cs +++ b/API.Tests/Services/CacheServiceTests.cs @@ -62,37 +62,37 @@ namespace API.Tests.Services [Fact] public void GetOrderedChaptersTest() { - var files = new List() - { - new() - { - Chapter = 1 - }, - new() - { - Chapter = 2 - }, - new() - { - Chapter = 0 - }, - }; - var expected = new List() - { - new() - { - Chapter = 1 - }, - new() - { - Chapter = 2 - }, - new() - { - Chapter = 0 - }, - }; - Assert.NotStrictEqual(expected, _cacheService.GetOrderedChapters(files)); + // var files = new List() + // { + // new() + // { + // Number = "1" + // }, + // new() + // { + // Chapter = 2 + // }, + // new() + // { + // Chapter = 0 + // }, + // }; + // var expected = new List() + // { + // new() + // { + // Chapter = 1 + // }, + // new() + // { + // Chapter = 2 + // }, + // new() + // { + // Chapter = 0 + // }, + // }; + // Assert.NotStrictEqual(expected, _cacheService.GetOrderedChapters(files)); } diff --git a/API/Controllers/ReaderController.cs b/API/Controllers/ReaderController.cs index 7aaba8c94..cb10f46e5 100644 --- a/API/Controllers/ReaderController.cs +++ b/API/Controllers/ReaderController.cs @@ -31,27 +31,29 @@ namespace API.Controllers } [HttpGet("image")] - public async Task> GetImage(int volumeId, int page) + public async Task> GetImage(int chapterId, int page) { // Temp let's iterate the directory each call to get next image - var volume = await _cacheService.Ensure(volumeId); + var chapter = await _cacheService.Ensure(chapterId); - var (path, mangaFile) = _cacheService.GetCachedPagePath(volume, page); + if (chapter == null) return BadRequest("There was an issue finding image file for reading."); + + var (path, mangaFile) = await _cacheService.GetCachedPagePath(chapter, page); if (string.IsNullOrEmpty(path)) return BadRequest($"No such image for page {page}"); var file = await _directoryService.ReadImageAsync(path); file.Page = page; - file.Chapter = mangaFile.Chapter; + //file.Chapter = chapter.Number; file.MangaFileName = mangaFile.FilePath; return Ok(file); } [HttpGet("get-bookmark")] - public async Task> GetBookmark(int volumeId) + public async Task> GetBookmark(int chapterId) { var user = await _unitOfWork.UserRepository.GetUserByUsernameAsync(User.GetUsername()); if (user.Progresses == null) return Ok(0); - var progress = user.Progresses.SingleOrDefault(x => x.AppUserId == user.Id && x.VolumeId == volumeId); + var progress = user.Progresses.SingleOrDefault(x => x.AppUserId == user.Id && x.ChapterId == chapterId); if (progress != null) return Ok(progress.PagesRead); @@ -62,12 +64,12 @@ namespace API.Controllers public async Task Bookmark(BookmarkDto bookmarkDto) { var user = await _unitOfWork.UserRepository.GetUserByUsernameAsync(User.GetUsername()); - _logger.LogInformation($"Saving {user.UserName} progress for {bookmarkDto.VolumeId} to page {bookmarkDto.PageNum}"); + _logger.LogInformation($"Saving {user.UserName} progress for Chapter {bookmarkDto.ChapterId} to page {bookmarkDto.PageNum}"); // TODO: Don't let user bookmark past total pages. user.Progresses ??= new List(); - var userProgress = user.Progresses.SingleOrDefault(x => x.VolumeId == bookmarkDto.VolumeId && x.AppUserId == user.Id); + var userProgress = user.Progresses.SingleOrDefault(x => x.ChapterId == bookmarkDto.ChapterId && x.AppUserId == user.Id); if (userProgress == null) { @@ -77,13 +79,14 @@ namespace API.Controllers PagesRead = bookmarkDto.PageNum, VolumeId = bookmarkDto.VolumeId, SeriesId = bookmarkDto.SeriesId, + ChapterId = bookmarkDto.ChapterId }); } else { userProgress.PagesRead = bookmarkDto.PageNum; userProgress.SeriesId = bookmarkDto.SeriesId; - + userProgress.VolumeId = bookmarkDto.VolumeId; } _unitOfWork.UserRepository.Update(user); @@ -92,8 +95,7 @@ namespace API.Controllers { return Ok(); } - - + return BadRequest("Could not save progress"); } } diff --git a/API/Controllers/SeriesController.cs b/API/Controllers/SeriesController.cs index 4649a2ece..561b4ec20 100644 --- a/API/Controllers/SeriesController.cs +++ b/API/Controllers/SeriesController.cs @@ -47,6 +47,11 @@ namespace API.Controllers return Ok(result); } + /// + /// Returns All volumes for a series with progress information and Chapters + /// + /// + /// [HttpGet("volumes")] public async Task>> GetVolumes(int seriesId) { @@ -61,13 +66,12 @@ namespace API.Controllers return Ok(await _unitOfWork.SeriesRepository.GetVolumeDtoAsync(volumeId, user.Id)); } - // [HttpGet("volume-files")] - // public async Task>> GetMangaFiles(int volumeId) - // { - // var user = await _unitOfWork.UserRepository.GetUserByUsernameAsync(User.GetUsername()); - // return Ok(await _unitOfWork.SeriesRepository.GetVolumeMangaFileDtos(volumeId)); - // } - + [HttpGet("chapter")] + public async Task> GetChapter(int chapterId) + { + return Ok(await _unitOfWork.VolumeRepository.GetChapterDtoAsync(chapterId)); + } + [Authorize(Policy = "RequireAdminRole")] [HttpPost("scan")] public ActionResult Scan(int libraryId, int seriesId) diff --git a/API/DTOs/ChapterDto.cs b/API/DTOs/ChapterDto.cs new file mode 100644 index 000000000..ee58e6c18 --- /dev/null +++ b/API/DTOs/ChapterDto.cs @@ -0,0 +1,31 @@ +using System.Collections.Generic; + +namespace API.DTOs +{ + public class ChapterDto + { + public int Id { get; set; } + /// + /// Range of chapters. Chapter 2-4 -> "2-4". Chapter 2 -> "2". + /// + public string Range { get; set; } + /// + /// Smallest number of the Range. + /// + public string Number { get; set; } + public byte[] CoverImage { get; set; } + /// + /// Total number of pages in all MangaFiles + /// + public int Pages { get; set; } + /// + /// The files that represent this Chapter + /// + public ICollection Files { get; set; } + /// + /// Calculated at API time. Number of pages read for this Chapter for logged in user. + /// + public int PagesRead { get; set; } + public int VolumeId { get; set; } + } +} \ No newline at end of file diff --git a/API/DTOs/MangaFileDto.cs b/API/DTOs/MangaFileDto.cs index 8d6535aa6..8cf706ea8 100644 --- a/API/DTOs/MangaFileDto.cs +++ b/API/DTOs/MangaFileDto.cs @@ -5,7 +5,6 @@ namespace API.DTOs public class MangaFileDto { public string FilePath { get; set; } - public int Chapter { get; set; } public int NumberOfPages { get; set; } public MangaFormat Format { get; set; } diff --git a/API/DTOs/VolumeDto.cs b/API/DTOs/VolumeDto.cs index 22266e710..39872c05a 100644 --- a/API/DTOs/VolumeDto.cs +++ b/API/DTOs/VolumeDto.cs @@ -11,6 +11,6 @@ namespace API.DTOs public byte[] CoverImage { get; set; } public int Pages { get; set; } public int PagesRead { get; set; } - public ICollection Files { get; set; } + public ICollection Chapters { get; set; } } } \ No newline at end of file diff --git a/API/Data/BookmarkDto.cs b/API/Data/BookmarkDto.cs index ea6654165..de7f1b6a7 100644 --- a/API/Data/BookmarkDto.cs +++ b/API/Data/BookmarkDto.cs @@ -3,6 +3,7 @@ public class BookmarkDto { public int VolumeId { get; init; } + public int ChapterId { get; init; } public int PageNum { get; init; } public int SeriesId { get; init; } } diff --git a/API/Data/DataContext.cs b/API/Data/DataContext.cs index f89340f82..b5dd4710d 100644 --- a/API/Data/DataContext.cs +++ b/API/Data/DataContext.cs @@ -20,8 +20,11 @@ namespace API.Data } public DbSet Library { get; set; } public DbSet Series { get; set; } + + public DbSet Chapter { get; set; } public DbSet Volume { get; set; } public DbSet AppUser { get; set; } + public DbSet MangaFile { get; set; } public DbSet AppUserProgresses { get; set; } public DbSet AppUserRating { get; set; } public DbSet ServerSetting { get; set; } diff --git a/API/Data/Migrations/20210128143348_SeriesVolumeChapterChange.Designer.cs b/API/Data/Migrations/20210128143348_SeriesVolumeChapterChange.Designer.cs new file mode 100644 index 000000000..17cb4b81d --- /dev/null +++ b/API/Data/Migrations/20210128143348_SeriesVolumeChapterChange.Designer.cs @@ -0,0 +1,688 @@ +// +using System; +using API.Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +namespace API.Data.Migrations +{ + [DbContext(typeof(DataContext))] + [Migration("20210128143348_SeriesVolumeChapterChange")] + partial class SeriesVolumeChapterChange + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "5.0.1"); + + modelBuilder.Entity("API.Entities.AppRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("TEXT"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex"); + + b.ToTable("AspNetRoles"); + }); + + modelBuilder.Entity("API.Entities.AppUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("AccessFailedCount") + .HasColumnType("INTEGER"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("TEXT"); + + b.Property("Created") + .HasColumnType("TEXT"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("EmailConfirmed") + .HasColumnType("INTEGER"); + + b.Property("LastActive") + .HasColumnType("TEXT"); + + b.Property("LockoutEnabled") + .HasColumnType("INTEGER"); + + b.Property("LockoutEnd") + .HasColumnType("TEXT"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("PasswordHash") + .HasColumnType("TEXT"); + + b.Property("PhoneNumber") + .HasColumnType("TEXT"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("INTEGER"); + + b.Property("RowVersion") + .IsConcurrencyToken() + .HasColumnType("INTEGER"); + + b.Property("SecurityStamp") + .HasColumnType("TEXT"); + + b.Property("TwoFactorEnabled") + .HasColumnType("INTEGER"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex"); + + b.ToTable("AspNetUsers"); + }); + + modelBuilder.Entity("API.Entities.AppUserProgress", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("AppUserId") + .HasColumnType("INTEGER"); + + b.Property("ChapterId") + .HasColumnType("INTEGER"); + + b.Property("PagesRead") + .HasColumnType("INTEGER"); + + b.Property("SeriesId") + .HasColumnType("INTEGER"); + + b.Property("VolumeId") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("AppUserId"); + + b.ToTable("AppUserProgresses"); + }); + + modelBuilder.Entity("API.Entities.AppUserRating", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("AppUserId") + .HasColumnType("INTEGER"); + + b.Property("Rating") + .HasColumnType("INTEGER"); + + b.Property("Review") + .HasColumnType("TEXT"); + + b.Property("SeriesId") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("AppUserId"); + + b.ToTable("AppUserRating"); + }); + + modelBuilder.Entity("API.Entities.AppUserRole", b => + { + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.Property("RoleId") + .HasColumnType("INTEGER"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetUserRoles"); + }); + + modelBuilder.Entity("API.Entities.Chapter", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CoverImage") + .HasColumnType("BLOB"); + + b.Property("Created") + .HasColumnType("TEXT"); + + b.Property("LastModified") + .HasColumnType("TEXT"); + + b.Property("Number") + .HasColumnType("TEXT"); + + b.Property("Pages") + .HasColumnType("INTEGER"); + + b.Property("Range") + .HasColumnType("TEXT"); + + b.Property("VolumeId") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("VolumeId"); + + b.ToTable("Chapter"); + }); + + modelBuilder.Entity("API.Entities.FolderPath", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("LastScanned") + .HasColumnType("TEXT"); + + b.Property("LibraryId") + .HasColumnType("INTEGER"); + + b.Property("Path") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("LibraryId"); + + b.ToTable("FolderPath"); + }); + + modelBuilder.Entity("API.Entities.Library", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CoverImage") + .HasColumnType("TEXT"); + + b.Property("Created") + .HasColumnType("TEXT"); + + b.Property("LastModified") + .HasColumnType("TEXT"); + + b.Property("Name") + .HasColumnType("TEXT"); + + b.Property("Type") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.ToTable("Library"); + }); + + modelBuilder.Entity("API.Entities.MangaFile", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Chapter") + .HasColumnType("INTEGER"); + + b.Property("ChapterId") + .HasColumnType("INTEGER"); + + b.Property("FilePath") + .HasColumnType("TEXT"); + + b.Property("Format") + .HasColumnType("INTEGER"); + + b.Property("NumberOfPages") + .HasColumnType("INTEGER"); + + b.Property("VolumeId") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("ChapterId"); + + b.HasIndex("VolumeId"); + + b.ToTable("MangaFile"); + }); + + modelBuilder.Entity("API.Entities.Series", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CoverImage") + .HasColumnType("BLOB"); + + b.Property("Created") + .HasColumnType("TEXT"); + + b.Property("LastModified") + .HasColumnType("TEXT"); + + b.Property("LibraryId") + .HasColumnType("INTEGER"); + + b.Property("Name") + .HasColumnType("TEXT"); + + b.Property("OriginalName") + .HasColumnType("TEXT"); + + b.Property("Pages") + .HasColumnType("INTEGER"); + + b.Property("SortName") + .HasColumnType("TEXT"); + + b.Property("Summary") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("LibraryId"); + + b.ToTable("Series"); + }); + + modelBuilder.Entity("API.Entities.ServerSetting", b => + { + b.Property("Key") + .HasColumnType("TEXT"); + + b.Property("RowVersion") + .IsConcurrencyToken() + .HasColumnType("INTEGER"); + + b.Property("Value") + .HasColumnType("TEXT"); + + b.HasKey("Key"); + + b.ToTable("ServerSetting"); + }); + + modelBuilder.Entity("API.Entities.Volume", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CoverImage") + .HasColumnType("BLOB"); + + b.Property("Created") + .HasColumnType("TEXT"); + + b.Property("IsSpecial") + .HasColumnType("INTEGER"); + + b.Property("LastModified") + .HasColumnType("TEXT"); + + b.Property("Name") + .HasColumnType("TEXT"); + + b.Property("Number") + .HasColumnType("INTEGER"); + + b.Property("Pages") + .HasColumnType("INTEGER"); + + b.Property("SeriesId") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("SeriesId"); + + b.ToTable("Volume"); + }); + + modelBuilder.Entity("AppUserLibrary", b => + { + b.Property("AppUsersId") + .HasColumnType("INTEGER"); + + b.Property("LibrariesId") + .HasColumnType("INTEGER"); + + b.HasKey("AppUsersId", "LibrariesId"); + + b.HasIndex("LibrariesId"); + + b.ToTable("AppUserLibrary"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ClaimType") + .HasColumnType("TEXT"); + + b.Property("ClaimValue") + .HasColumnType("TEXT"); + + b.Property("RoleId") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ClaimType") + .HasColumnType("TEXT"); + + b.Property("ClaimValue") + .HasColumnType("TEXT"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider") + .HasColumnType("TEXT"); + + b.Property("ProviderKey") + .HasColumnType("TEXT"); + + b.Property("ProviderDisplayName") + .HasColumnType("TEXT"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.Property("LoginProvider") + .HasColumnType("TEXT"); + + b.Property("Name") + .HasColumnType("TEXT"); + + b.Property("Value") + .HasColumnType("TEXT"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens"); + }); + + modelBuilder.Entity("API.Entities.AppUserProgress", b => + { + b.HasOne("API.Entities.AppUser", "AppUser") + .WithMany("Progresses") + .HasForeignKey("AppUserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("AppUser"); + }); + + modelBuilder.Entity("API.Entities.AppUserRating", b => + { + b.HasOne("API.Entities.AppUser", "AppUser") + .WithMany("Ratings") + .HasForeignKey("AppUserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("AppUser"); + }); + + modelBuilder.Entity("API.Entities.AppUserRole", b => + { + b.HasOne("API.Entities.AppRole", "Role") + .WithMany("UserRoles") + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("API.Entities.AppUser", "User") + .WithMany("UserRoles") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Role"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("API.Entities.Chapter", b => + { + b.HasOne("API.Entities.Volume", "Volume") + .WithMany("Chapters") + .HasForeignKey("VolumeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Volume"); + }); + + modelBuilder.Entity("API.Entities.FolderPath", b => + { + b.HasOne("API.Entities.Library", "Library") + .WithMany("Folders") + .HasForeignKey("LibraryId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Library"); + }); + + modelBuilder.Entity("API.Entities.MangaFile", b => + { + b.HasOne("API.Entities.Chapter", null) + .WithMany("Files") + .HasForeignKey("ChapterId"); + + b.HasOne("API.Entities.Volume", "Volume") + .WithMany() + .HasForeignKey("VolumeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Volume"); + }); + + modelBuilder.Entity("API.Entities.Series", b => + { + b.HasOne("API.Entities.Library", "Library") + .WithMany("Series") + .HasForeignKey("LibraryId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Library"); + }); + + modelBuilder.Entity("API.Entities.Volume", b => + { + b.HasOne("API.Entities.Series", "Series") + .WithMany("Volumes") + .HasForeignKey("SeriesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Series"); + }); + + modelBuilder.Entity("AppUserLibrary", b => + { + b.HasOne("API.Entities.AppUser", null) + .WithMany() + .HasForeignKey("AppUsersId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("API.Entities.Library", null) + .WithMany() + .HasForeignKey("LibrariesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("API.Entities.AppRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("API.Entities.AppUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("API.Entities.AppUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("API.Entities.AppUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("API.Entities.AppRole", b => + { + b.Navigation("UserRoles"); + }); + + modelBuilder.Entity("API.Entities.AppUser", b => + { + b.Navigation("Progresses"); + + b.Navigation("Ratings"); + + b.Navigation("UserRoles"); + }); + + modelBuilder.Entity("API.Entities.Chapter", b => + { + b.Navigation("Files"); + }); + + modelBuilder.Entity("API.Entities.Library", b => + { + b.Navigation("Folders"); + + b.Navigation("Series"); + }); + + modelBuilder.Entity("API.Entities.Series", b => + { + b.Navigation("Volumes"); + }); + + modelBuilder.Entity("API.Entities.Volume", b => + { + b.Navigation("Chapters"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/API/Data/Migrations/20210128143348_SeriesVolumeChapterChange.cs b/API/Data/Migrations/20210128143348_SeriesVolumeChapterChange.cs new file mode 100644 index 000000000..ae6e6b6d1 --- /dev/null +++ b/API/Data/Migrations/20210128143348_SeriesVolumeChapterChange.cs @@ -0,0 +1,111 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace API.Data.Migrations +{ + public partial class SeriesVolumeChapterChange : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "IsSpecial", + table: "Volume", + type: "INTEGER", + nullable: false, + defaultValue: false); + + migrationBuilder.AddColumn( + name: "ChapterId", + table: "MangaFile", + type: "INTEGER", + nullable: true); + + migrationBuilder.AddColumn( + name: "LastScanned", + table: "FolderPath", + type: "TEXT", + nullable: false, + defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified)); + + migrationBuilder.AddColumn( + name: "ChapterId", + table: "AppUserProgresses", + type: "INTEGER", + nullable: false, + defaultValue: 0); + + migrationBuilder.CreateTable( + name: "Chapter", + columns: table => new + { + Id = table.Column(type: "INTEGER", nullable: false) + .Annotation("Sqlite:Autoincrement", true), + Range = table.Column(type: "TEXT", nullable: true), + Number = table.Column(type: "TEXT", nullable: true), + Created = table.Column(type: "TEXT", nullable: false), + LastModified = table.Column(type: "TEXT", nullable: false), + CoverImage = table.Column(type: "BLOB", nullable: true), + Pages = table.Column(type: "INTEGER", nullable: false), + VolumeId = table.Column(type: "INTEGER", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Chapter", x => x.Id); + table.ForeignKey( + name: "FK_Chapter_Volume_VolumeId", + column: x => x.VolumeId, + principalTable: "Volume", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "IX_MangaFile_ChapterId", + table: "MangaFile", + column: "ChapterId"); + + migrationBuilder.CreateIndex( + name: "IX_Chapter_VolumeId", + table: "Chapter", + column: "VolumeId"); + + migrationBuilder.AddForeignKey( + name: "FK_MangaFile_Chapter_ChapterId", + table: "MangaFile", + column: "ChapterId", + principalTable: "Chapter", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_MangaFile_Chapter_ChapterId", + table: "MangaFile"); + + migrationBuilder.DropTable( + name: "Chapter"); + + migrationBuilder.DropIndex( + name: "IX_MangaFile_ChapterId", + table: "MangaFile"); + + migrationBuilder.DropColumn( + name: "IsSpecial", + table: "Volume"); + + migrationBuilder.DropColumn( + name: "ChapterId", + table: "MangaFile"); + + migrationBuilder.DropColumn( + name: "LastScanned", + table: "FolderPath"); + + migrationBuilder.DropColumn( + name: "ChapterId", + table: "AppUserProgresses"); + } + } +} diff --git a/API/Data/Migrations/20210128201832_MangaFileChapterRelationship.Designer.cs b/API/Data/Migrations/20210128201832_MangaFileChapterRelationship.Designer.cs new file mode 100644 index 000000000..5d0cfa7b5 --- /dev/null +++ b/API/Data/Migrations/20210128201832_MangaFileChapterRelationship.Designer.cs @@ -0,0 +1,676 @@ +// +using System; +using API.Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +namespace API.Data.Migrations +{ + [DbContext(typeof(DataContext))] + [Migration("20210128201832_MangaFileChapterRelationship")] + partial class MangaFileChapterRelationship + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "5.0.1"); + + modelBuilder.Entity("API.Entities.AppRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("TEXT"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex"); + + b.ToTable("AspNetRoles"); + }); + + modelBuilder.Entity("API.Entities.AppUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("AccessFailedCount") + .HasColumnType("INTEGER"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("TEXT"); + + b.Property("Created") + .HasColumnType("TEXT"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("EmailConfirmed") + .HasColumnType("INTEGER"); + + b.Property("LastActive") + .HasColumnType("TEXT"); + + b.Property("LockoutEnabled") + .HasColumnType("INTEGER"); + + b.Property("LockoutEnd") + .HasColumnType("TEXT"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("PasswordHash") + .HasColumnType("TEXT"); + + b.Property("PhoneNumber") + .HasColumnType("TEXT"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("INTEGER"); + + b.Property("RowVersion") + .IsConcurrencyToken() + .HasColumnType("INTEGER"); + + b.Property("SecurityStamp") + .HasColumnType("TEXT"); + + b.Property("TwoFactorEnabled") + .HasColumnType("INTEGER"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex"); + + b.ToTable("AspNetUsers"); + }); + + modelBuilder.Entity("API.Entities.AppUserProgress", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("AppUserId") + .HasColumnType("INTEGER"); + + b.Property("ChapterId") + .HasColumnType("INTEGER"); + + b.Property("PagesRead") + .HasColumnType("INTEGER"); + + b.Property("SeriesId") + .HasColumnType("INTEGER"); + + b.Property("VolumeId") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("AppUserId"); + + b.ToTable("AppUserProgresses"); + }); + + modelBuilder.Entity("API.Entities.AppUserRating", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("AppUserId") + .HasColumnType("INTEGER"); + + b.Property("Rating") + .HasColumnType("INTEGER"); + + b.Property("Review") + .HasColumnType("TEXT"); + + b.Property("SeriesId") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("AppUserId"); + + b.ToTable("AppUserRating"); + }); + + modelBuilder.Entity("API.Entities.AppUserRole", b => + { + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.Property("RoleId") + .HasColumnType("INTEGER"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetUserRoles"); + }); + + modelBuilder.Entity("API.Entities.Chapter", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CoverImage") + .HasColumnType("BLOB"); + + b.Property("Created") + .HasColumnType("TEXT"); + + b.Property("LastModified") + .HasColumnType("TEXT"); + + b.Property("Number") + .HasColumnType("TEXT"); + + b.Property("Pages") + .HasColumnType("INTEGER"); + + b.Property("Range") + .HasColumnType("TEXT"); + + b.Property("VolumeId") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("VolumeId"); + + b.ToTable("Chapter"); + }); + + modelBuilder.Entity("API.Entities.FolderPath", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("LastScanned") + .HasColumnType("TEXT"); + + b.Property("LibraryId") + .HasColumnType("INTEGER"); + + b.Property("Path") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("LibraryId"); + + b.ToTable("FolderPath"); + }); + + modelBuilder.Entity("API.Entities.Library", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CoverImage") + .HasColumnType("TEXT"); + + b.Property("Created") + .HasColumnType("TEXT"); + + b.Property("LastModified") + .HasColumnType("TEXT"); + + b.Property("Name") + .HasColumnType("TEXT"); + + b.Property("Type") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.ToTable("Library"); + }); + + modelBuilder.Entity("API.Entities.MangaFile", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ChapterId") + .HasColumnType("INTEGER"); + + b.Property("FilePath") + .HasColumnType("TEXT"); + + b.Property("Format") + .HasColumnType("INTEGER"); + + b.Property("NumberOfPages") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("ChapterId"); + + b.ToTable("MangaFile"); + }); + + modelBuilder.Entity("API.Entities.Series", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CoverImage") + .HasColumnType("BLOB"); + + b.Property("Created") + .HasColumnType("TEXT"); + + b.Property("LastModified") + .HasColumnType("TEXT"); + + b.Property("LibraryId") + .HasColumnType("INTEGER"); + + b.Property("Name") + .HasColumnType("TEXT"); + + b.Property("OriginalName") + .HasColumnType("TEXT"); + + b.Property("Pages") + .HasColumnType("INTEGER"); + + b.Property("SortName") + .HasColumnType("TEXT"); + + b.Property("Summary") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("LibraryId"); + + b.ToTable("Series"); + }); + + modelBuilder.Entity("API.Entities.ServerSetting", b => + { + b.Property("Key") + .HasColumnType("TEXT"); + + b.Property("RowVersion") + .IsConcurrencyToken() + .HasColumnType("INTEGER"); + + b.Property("Value") + .HasColumnType("TEXT"); + + b.HasKey("Key"); + + b.ToTable("ServerSetting"); + }); + + modelBuilder.Entity("API.Entities.Volume", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CoverImage") + .HasColumnType("BLOB"); + + b.Property("Created") + .HasColumnType("TEXT"); + + b.Property("IsSpecial") + .HasColumnType("INTEGER"); + + b.Property("LastModified") + .HasColumnType("TEXT"); + + b.Property("Name") + .HasColumnType("TEXT"); + + b.Property("Number") + .HasColumnType("INTEGER"); + + b.Property("Pages") + .HasColumnType("INTEGER"); + + b.Property("SeriesId") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("SeriesId"); + + b.ToTable("Volume"); + }); + + modelBuilder.Entity("AppUserLibrary", b => + { + b.Property("AppUsersId") + .HasColumnType("INTEGER"); + + b.Property("LibrariesId") + .HasColumnType("INTEGER"); + + b.HasKey("AppUsersId", "LibrariesId"); + + b.HasIndex("LibrariesId"); + + b.ToTable("AppUserLibrary"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ClaimType") + .HasColumnType("TEXT"); + + b.Property("ClaimValue") + .HasColumnType("TEXT"); + + b.Property("RoleId") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ClaimType") + .HasColumnType("TEXT"); + + b.Property("ClaimValue") + .HasColumnType("TEXT"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider") + .HasColumnType("TEXT"); + + b.Property("ProviderKey") + .HasColumnType("TEXT"); + + b.Property("ProviderDisplayName") + .HasColumnType("TEXT"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.Property("LoginProvider") + .HasColumnType("TEXT"); + + b.Property("Name") + .HasColumnType("TEXT"); + + b.Property("Value") + .HasColumnType("TEXT"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens"); + }); + + modelBuilder.Entity("API.Entities.AppUserProgress", b => + { + b.HasOne("API.Entities.AppUser", "AppUser") + .WithMany("Progresses") + .HasForeignKey("AppUserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("AppUser"); + }); + + modelBuilder.Entity("API.Entities.AppUserRating", b => + { + b.HasOne("API.Entities.AppUser", "AppUser") + .WithMany("Ratings") + .HasForeignKey("AppUserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("AppUser"); + }); + + modelBuilder.Entity("API.Entities.AppUserRole", b => + { + b.HasOne("API.Entities.AppRole", "Role") + .WithMany("UserRoles") + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("API.Entities.AppUser", "User") + .WithMany("UserRoles") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Role"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("API.Entities.Chapter", b => + { + b.HasOne("API.Entities.Volume", "Volume") + .WithMany("Chapters") + .HasForeignKey("VolumeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Volume"); + }); + + modelBuilder.Entity("API.Entities.FolderPath", b => + { + b.HasOne("API.Entities.Library", "Library") + .WithMany("Folders") + .HasForeignKey("LibraryId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Library"); + }); + + modelBuilder.Entity("API.Entities.MangaFile", b => + { + b.HasOne("API.Entities.Chapter", "Chapter") + .WithMany("Files") + .HasForeignKey("ChapterId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Chapter"); + }); + + modelBuilder.Entity("API.Entities.Series", b => + { + b.HasOne("API.Entities.Library", "Library") + .WithMany("Series") + .HasForeignKey("LibraryId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Library"); + }); + + modelBuilder.Entity("API.Entities.Volume", b => + { + b.HasOne("API.Entities.Series", "Series") + .WithMany("Volumes") + .HasForeignKey("SeriesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Series"); + }); + + modelBuilder.Entity("AppUserLibrary", b => + { + b.HasOne("API.Entities.AppUser", null) + .WithMany() + .HasForeignKey("AppUsersId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("API.Entities.Library", null) + .WithMany() + .HasForeignKey("LibrariesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("API.Entities.AppRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("API.Entities.AppUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("API.Entities.AppUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("API.Entities.AppUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("API.Entities.AppRole", b => + { + b.Navigation("UserRoles"); + }); + + modelBuilder.Entity("API.Entities.AppUser", b => + { + b.Navigation("Progresses"); + + b.Navigation("Ratings"); + + b.Navigation("UserRoles"); + }); + + modelBuilder.Entity("API.Entities.Chapter", b => + { + b.Navigation("Files"); + }); + + modelBuilder.Entity("API.Entities.Library", b => + { + b.Navigation("Folders"); + + b.Navigation("Series"); + }); + + modelBuilder.Entity("API.Entities.Series", b => + { + b.Navigation("Volumes"); + }); + + modelBuilder.Entity("API.Entities.Volume", b => + { + b.Navigation("Chapters"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/API/Data/Migrations/20210128201832_MangaFileChapterRelationship.cs b/API/Data/Migrations/20210128201832_MangaFileChapterRelationship.cs new file mode 100644 index 000000000..a04e77dd2 --- /dev/null +++ b/API/Data/Migrations/20210128201832_MangaFileChapterRelationship.cs @@ -0,0 +1,98 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +namespace API.Data.Migrations +{ + public partial class MangaFileChapterRelationship : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_MangaFile_Chapter_ChapterId", + table: "MangaFile"); + + migrationBuilder.DropForeignKey( + name: "FK_MangaFile_Volume_VolumeId", + table: "MangaFile"); + + migrationBuilder.DropIndex( + name: "IX_MangaFile_VolumeId", + table: "MangaFile"); + + migrationBuilder.DropColumn( + name: "Chapter", + table: "MangaFile"); + + migrationBuilder.DropColumn( + name: "VolumeId", + table: "MangaFile"); + + migrationBuilder.AlterColumn( + name: "ChapterId", + table: "MangaFile", + type: "INTEGER", + nullable: false, + defaultValue: 0, + oldClrType: typeof(int), + oldType: "INTEGER", + oldNullable: true); + + migrationBuilder.AddForeignKey( + name: "FK_MangaFile_Chapter_ChapterId", + table: "MangaFile", + column: "ChapterId", + principalTable: "Chapter", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_MangaFile_Chapter_ChapterId", + table: "MangaFile"); + + migrationBuilder.AlterColumn( + name: "ChapterId", + table: "MangaFile", + type: "INTEGER", + nullable: true, + oldClrType: typeof(int), + oldType: "INTEGER"); + + migrationBuilder.AddColumn( + name: "Chapter", + table: "MangaFile", + type: "INTEGER", + nullable: false, + defaultValue: 0); + + migrationBuilder.AddColumn( + name: "VolumeId", + table: "MangaFile", + type: "INTEGER", + nullable: false, + defaultValue: 0); + + migrationBuilder.CreateIndex( + name: "IX_MangaFile_VolumeId", + table: "MangaFile", + column: "VolumeId"); + + migrationBuilder.AddForeignKey( + name: "FK_MangaFile_Chapter_ChapterId", + table: "MangaFile", + column: "ChapterId", + principalTable: "Chapter", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + + migrationBuilder.AddForeignKey( + name: "FK_MangaFile_Volume_VolumeId", + table: "MangaFile", + column: "VolumeId", + principalTable: "Volume", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + } + } +} diff --git a/API/Data/Migrations/DataContextModelSnapshot.cs b/API/Data/Migrations/DataContextModelSnapshot.cs index 918500434..2ba32129a 100644 --- a/API/Data/Migrations/DataContextModelSnapshot.cs +++ b/API/Data/Migrations/DataContextModelSnapshot.cs @@ -127,6 +127,9 @@ namespace API.Data.Migrations b.Property("AppUserId") .HasColumnType("INTEGER"); + b.Property("ChapterId") + .HasColumnType("INTEGER"); + b.Property("PagesRead") .HasColumnType("INTEGER"); @@ -183,12 +186,49 @@ namespace API.Data.Migrations b.ToTable("AspNetUserRoles"); }); + modelBuilder.Entity("API.Entities.Chapter", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CoverImage") + .HasColumnType("BLOB"); + + b.Property("Created") + .HasColumnType("TEXT"); + + b.Property("LastModified") + .HasColumnType("TEXT"); + + b.Property("Number") + .HasColumnType("TEXT"); + + b.Property("Pages") + .HasColumnType("INTEGER"); + + b.Property("Range") + .HasColumnType("TEXT"); + + b.Property("VolumeId") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("VolumeId"); + + b.ToTable("Chapter"); + }); + modelBuilder.Entity("API.Entities.FolderPath", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("INTEGER"); + b.Property("LastScanned") + .HasColumnType("TEXT"); + b.Property("LibraryId") .HasColumnType("INTEGER"); @@ -234,7 +274,7 @@ namespace API.Data.Migrations .ValueGeneratedOnAdd() .HasColumnType("INTEGER"); - b.Property("Chapter") + b.Property("ChapterId") .HasColumnType("INTEGER"); b.Property("FilePath") @@ -246,12 +286,9 @@ namespace API.Data.Migrations b.Property("NumberOfPages") .HasColumnType("INTEGER"); - b.Property("VolumeId") - .HasColumnType("INTEGER"); - b.HasKey("Id"); - b.HasIndex("VolumeId"); + b.HasIndex("ChapterId"); b.ToTable("MangaFile"); }); @@ -325,6 +362,9 @@ namespace API.Data.Migrations b.Property("Created") .HasColumnType("TEXT"); + b.Property("IsSpecial") + .HasColumnType("INTEGER"); + b.Property("LastModified") .HasColumnType("TEXT"); @@ -487,6 +527,17 @@ namespace API.Data.Migrations b.Navigation("User"); }); + modelBuilder.Entity("API.Entities.Chapter", b => + { + b.HasOne("API.Entities.Volume", "Volume") + .WithMany("Chapters") + .HasForeignKey("VolumeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Volume"); + }); + modelBuilder.Entity("API.Entities.FolderPath", b => { b.HasOne("API.Entities.Library", "Library") @@ -500,13 +551,13 @@ namespace API.Data.Migrations modelBuilder.Entity("API.Entities.MangaFile", b => { - b.HasOne("API.Entities.Volume", "Volume") + b.HasOne("API.Entities.Chapter", "Chapter") .WithMany("Files") - .HasForeignKey("VolumeId") + .HasForeignKey("ChapterId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.Navigation("Volume"); + b.Navigation("Chapter"); }); modelBuilder.Entity("API.Entities.Series", b => @@ -596,6 +647,11 @@ namespace API.Data.Migrations b.Navigation("UserRoles"); }); + modelBuilder.Entity("API.Entities.Chapter", b => + { + b.Navigation("Files"); + }); + modelBuilder.Entity("API.Entities.Library", b => { b.Navigation("Folders"); @@ -610,7 +666,7 @@ namespace API.Data.Migrations modelBuilder.Entity("API.Entities.Volume", b => { - b.Navigation("Files"); + b.Navigation("Chapters"); }); #pragma warning restore 612, 618 } diff --git a/API/Data/SeriesRepository.cs b/API/Data/SeriesRepository.cs index 27dc38e43..14d2c0349 100644 --- a/API/Data/SeriesRepository.cs +++ b/API/Data/SeriesRepository.cs @@ -82,6 +82,7 @@ namespace API.Data { var volumes = await _context.Volume .Where(vol => vol.SeriesId == seriesId) + .Include(vol => vol.Chapters) .OrderBy(volume => volume.Number) .ProjectTo(_mapper.ConfigurationProvider) .AsNoTracking() @@ -98,7 +99,8 @@ namespace API.Data { return _context.Volume .Where(vol => vol.SeriesId == seriesId) - .Include(vol => vol.Files) + .Include(vol => vol.Chapters) + .ThenInclude(c => c.Files) .OrderBy(vol => vol.Number) .ToList(); } @@ -118,7 +120,8 @@ namespace API.Data public async Task GetVolumeAsync(int volumeId) { return await _context.Volume - .Include(vol => vol.Files) + .Include(vol => vol.Chapters) + .ThenInclude(c => c.Files) .SingleOrDefaultAsync(vol => vol.Id == volumeId); } @@ -126,14 +129,15 @@ namespace API.Data { var volume = await _context.Volume .Where(vol => vol.Id == volumeId) - .Include(vol => vol.Files) + .Include(vol => vol.Chapters) + .ThenInclude(c => c.Files) .ProjectTo(_mapper.ConfigurationProvider) .SingleAsync(vol => vol.Id == volumeId); var volumeList = new List() {volume}; await AddVolumeModifiers(userId, volumeList); - volumeList[0].Files = volumeList[0].Files.OrderBy(f => f.Chapter).ToList(); + //TODO: volumeList[0].Files = volumeList[0].Files.OrderBy(f => f.Chapter).ToList(); return volumeList[0]; } @@ -199,6 +203,11 @@ namespace API.Data foreach (var v in volumes) { + foreach (var c in v.Chapters) + { + c.PagesRead = userProgress.Where(p => p.ChapterId == c.Id).Sum(p => p.PagesRead); + } + v.PagesRead = userProgress.Where(p => p.VolumeId == v.Id).Sum(p => p.PagesRead); } } diff --git a/API/Data/UnitOfWork.cs b/API/Data/UnitOfWork.cs index 25d0002c7..f183e247a 100644 --- a/API/Data/UnitOfWork.cs +++ b/API/Data/UnitOfWork.cs @@ -22,6 +22,8 @@ namespace API.Data public ISeriesRepository SeriesRepository => new SeriesRepository(_context, _mapper); public IUserRepository UserRepository => new UserRepository(_context, _userManager); public ILibraryRepository LibraryRepository => new LibraryRepository(_context, _mapper); + + public IVolumeRepository VolumeRepository => new VolumeRepository(_context, _mapper); public async Task Complete() { diff --git a/API/Data/VolumeRepository.cs b/API/Data/VolumeRepository.cs new file mode 100644 index 000000000..ce8dd0eea --- /dev/null +++ b/API/Data/VolumeRepository.cs @@ -0,0 +1,61 @@ +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using API.DTOs; +using API.Entities; +using API.Interfaces; +using AutoMapper; +using AutoMapper.QueryableExtensions; +using Microsoft.EntityFrameworkCore; + +namespace API.Data +{ + public class VolumeRepository : IVolumeRepository + { + private readonly DataContext _context; + private readonly IMapper _mapper; + + public VolumeRepository(DataContext context, IMapper mapper) + { + _context = context; + _mapper = mapper; + } + + public void Update(Volume volume) + { + _context.Entry(volume).State = EntityState.Modified; + } + + /// + /// Returns a Chapter for an Id. Includes linked s. + /// + /// + /// + public async Task GetChapterAsync(int chapterId) + { + return await _context.Chapter + .Include(c => c.Files) + .AsNoTracking() + .SingleOrDefaultAsync(c => c.Id == chapterId); + } + + public async Task GetChapterDtoAsync(int chapterId) + { + var chapter = await _context.Chapter + .Include(c => c.Files) + .ProjectTo(_mapper.ConfigurationProvider) + .AsNoTracking() + .SingleOrDefaultAsync(c => c.Id == chapterId); + + return chapter; + } + + public async Task> GetFilesForChapter(int chapterId) + { + return await _context.MangaFile + .Where(c => chapterId == c.Id) + .AsNoTracking() + .ToListAsync(); + } + } +} \ No newline at end of file diff --git a/API/Entities/AppUserProgress.cs b/API/Entities/AppUserProgress.cs index 0f05f4dee..be3953246 100644 --- a/API/Entities/AppUserProgress.cs +++ b/API/Entities/AppUserProgress.cs @@ -2,7 +2,7 @@ namespace API.Entities { /// - /// Represents the progress a single user has on a given Volume. + /// Represents the progress a single user has on a given Volume. Progress is realistically tracked against the Volume's chapters. /// public class AppUserProgress { @@ -11,6 +11,8 @@ namespace API.Entities public int VolumeId { get; set; } public int SeriesId { get; set; } + public int ChapterId { get; set; } + // Relationships public AppUser AppUser { get; set; } public int AppUserId { get; set; } diff --git a/API/Entities/Chapter.cs b/API/Entities/Chapter.cs new file mode 100644 index 000000000..b4d957fe8 --- /dev/null +++ b/API/Entities/Chapter.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using API.Entities.Interfaces; + +namespace API.Entities +{ + public class Chapter : IEntityDate + { + public int Id { get; set; } + /// + /// Range of numbers. Chapter 2-4 -> "2-4". Chapter 2 -> "2". + /// + public string Range { get; set; } + /// + /// Smallest number of the Range. Can be a partial like Chapter 4.5 + /// + public string Number { get; set; } + /// + /// The files that represent this Chapter + /// + public ICollection Files { get; set; } + public DateTime Created { get; set; } + public DateTime LastModified { get; set; } + public byte[] CoverImage { get; set; } + /// + /// Total number of pages in all MangaFiles + /// + public int Pages { get; set; } + + // Relationships + public Volume Volume { get; set; } + public int VolumeId { get; set; } + + } +} \ No newline at end of file diff --git a/API/Entities/FolderPath.cs b/API/Entities/FolderPath.cs index 84d3ea798..dab3d86cd 100644 --- a/API/Entities/FolderPath.cs +++ b/API/Entities/FolderPath.cs @@ -1,10 +1,18 @@  +using System; + namespace API.Entities { public class FolderPath { public int Id { get; set; } public string Path { get; set; } + /// + /// Used when scanning to see if we can skip if nothing has changed. + /// + public DateTime LastScanned { get; set; } + + // Relationship public Library Library { get; set; } public int LibraryId { get; set; } } diff --git a/API/Entities/MangaFile.cs b/API/Entities/MangaFile.cs index 4c0c675de..a1e4ff81d 100644 --- a/API/Entities/MangaFile.cs +++ b/API/Entities/MangaFile.cs @@ -9,18 +9,14 @@ namespace API.Entities /// public string FilePath { get; set; } /// - /// Used to track if multiple MangaFiles (archives) represent a single Volume. If only one volume file, this will be 0. - /// - public int Chapter { get; set; } - /// /// Number of pages for the given file /// public int NumberOfPages { get; set; } public MangaFormat Format { get; set; } // Relationship Mapping - public Volume Volume { get; set; } - public int VolumeId { get; set; } + public Chapter Chapter { get; set; } + public int ChapterId { get; set; } } } \ No newline at end of file diff --git a/API/Entities/Series.cs b/API/Entities/Series.cs index a4b225736..f7e5f366e 100644 --- a/API/Entities/Series.cs +++ b/API/Entities/Series.cs @@ -12,14 +12,14 @@ namespace API.Entities /// public string Name { get; set; } /// - /// Original Japanese Name - /// - public string OriginalName { get; set; } - /// /// The name used to sort the Series. By default, will be the same as Name. /// public string SortName { get; set; } /// + /// Original Name on disk. Not exposed to UI. + /// + public string OriginalName { get; set; } + /// /// Summary information related to the Series /// public string Summary { get; set; } @@ -30,7 +30,7 @@ namespace API.Entities /// Sum of all Volume page counts /// public int Pages { get; set; } - + // Relationships public ICollection Volumes { get; set; } public Library Library { get; set; } diff --git a/API/Entities/Volume.cs b/API/Entities/Volume.cs index 304c2bfae..0b8077aae 100644 --- a/API/Entities/Volume.cs +++ b/API/Entities/Volume.cs @@ -9,11 +9,16 @@ namespace API.Entities public int Id { get; set; } public string Name { get; set; } public int Number { get; set; } - public ICollection Files { get; set; } + public ICollection Chapters { get; set; } public DateTime Created { get; set; } public DateTime LastModified { get; set; } public byte[] CoverImage { get; set; } public int Pages { get; set; } + + /// + /// Represents a Side story that is linked to the original Series. Omake, One Shot, etc. + /// + public bool IsSpecial { get; set; } = false; diff --git a/API/Extensions/DirectoryInfoExtensions.cs b/API/Extensions/DirectoryInfoExtensions.cs index 98480d6bc..2e37057da 100644 --- a/API/Extensions/DirectoryInfoExtensions.cs +++ b/API/Extensions/DirectoryInfoExtensions.cs @@ -51,7 +51,8 @@ namespace API.Extensions if (file.Directory == null) continue; var newName = $"{file.Directory.Name}_{file.Name}"; var newPath = Path.Join(root.FullName, newName); - file.MoveTo(newPath); + if (!File.Exists(newPath)) file.MoveTo(newPath); + } } diff --git a/API/Helpers/AutoMapperProfiles.cs b/API/Helpers/AutoMapperProfiles.cs index 8db743695..744fc08bb 100644 --- a/API/Helpers/AutoMapperProfiles.cs +++ b/API/Helpers/AutoMapperProfiles.cs @@ -16,6 +16,8 @@ namespace API.Helpers CreateMap(); CreateMap(); + + CreateMap(); CreateMap(); diff --git a/API/Interfaces/ICacheService.cs b/API/Interfaces/ICacheService.cs index 9bf9eaa71..9d9721b4a 100644 --- a/API/Interfaces/ICacheService.cs +++ b/API/Interfaces/ICacheService.cs @@ -6,12 +6,12 @@ namespace API.Interfaces public interface ICacheService { /// - /// Ensures the cache is created for the given volume and if not, will create it. Should be called before any other + /// Ensures the cache is created for the given chapter and if not, will create it. Should be called before any other /// cache operations (except cleanup). /// - /// - /// Volume for the passed volumeId. Side-effect from ensuring cache. - Task Ensure(int volumeId); + /// + /// Chapter for the passed chapterId. Side-effect from ensuring cache. + Task Ensure(int chapterId); /// /// Clears cache directory of all folders and files. @@ -28,11 +28,11 @@ namespace API.Interfaces /// /// Returns the absolute path of a cached page. /// - /// + /// Chapter entity with Files populated. /// Page number to look for /// - (string path, MangaFile file) GetCachedPagePath(Volume volume, int page); + Task<(string path, MangaFile file)> GetCachedPagePath(Chapter chapter, int page); - bool CacheDirectoryIsAccessible(); + void EnsureCacheDirectory(); } } \ No newline at end of file diff --git a/API/Interfaces/IUnitOfWork.cs b/API/Interfaces/IUnitOfWork.cs index 3b1cf4347..d4268bf64 100644 --- a/API/Interfaces/IUnitOfWork.cs +++ b/API/Interfaces/IUnitOfWork.cs @@ -7,6 +7,7 @@ namespace API.Interfaces ISeriesRepository SeriesRepository { get; } IUserRepository UserRepository { get; } ILibraryRepository LibraryRepository { get; } + IVolumeRepository VolumeRepository { get; } Task Complete(); bool HasChanges(); } diff --git a/API/Interfaces/IVolumeRepository.cs b/API/Interfaces/IVolumeRepository.cs new file mode 100644 index 000000000..0bc28253b --- /dev/null +++ b/API/Interfaces/IVolumeRepository.cs @@ -0,0 +1,15 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using API.DTOs; +using API.Entities; + +namespace API.Interfaces +{ + public interface IVolumeRepository + { + void Update(Volume volume); + Task GetChapterAsync(int chapterId); + Task GetChapterDtoAsync(int chapterId); + Task> GetFilesForChapter(int chapterId); + } +} \ No newline at end of file diff --git a/API/Services/ArchiveService.cs b/API/Services/ArchiveService.cs index 41d20a8e7..4113c56f6 100644 --- a/API/Services/ArchiveService.cs +++ b/API/Services/ArchiveService.cs @@ -161,7 +161,7 @@ namespace API.Services var needsFlattening = ArchiveNeedsFlattening(archive); if (!archive.HasFiles() && !needsFlattening) return; - archive.ExtractToDirectory(extractPath); + archive.ExtractToDirectory(extractPath, true); _logger.LogDebug($"Extracted archive to {extractPath} in {sw.ElapsedMilliseconds} milliseconds."); if (needsFlattening) diff --git a/API/Services/CacheService.cs b/API/Services/CacheService.cs index f9d9242f1..d59a7f2db 100644 --- a/API/Services/CacheService.cs +++ b/API/Services/CacheService.cs @@ -18,7 +18,7 @@ namespace API.Services private readonly IArchiveService _archiveService; private readonly IDirectoryService _directoryService; private readonly NumericComparer _numericComparer; - public static readonly string CacheDirectory = Path.GetFullPath(Path.Join(Directory.GetCurrentDirectory(), "../cache/")); + public static readonly string CacheDirectory = Path.GetFullPath(Path.Join(Directory.GetCurrentDirectory(), "cache/")); public CacheService(ILogger logger, IUnitOfWork unitOfWork, IArchiveService archiveService, IDirectoryService directoryService) { @@ -29,40 +29,36 @@ namespace API.Services _numericComparer = new NumericComparer(); } - public bool CacheDirectoryIsAccessible() + public void EnsureCacheDirectory() { _logger.LogDebug($"Checking if valid Cache directory: {CacheDirectory}"); var di = new DirectoryInfo(CacheDirectory); - return di.Exists; + if (!di.Exists) + { + _logger.LogError($"Cache directory {CacheDirectory} is not accessible or does not exist. Creating..."); + Directory.CreateDirectory(CacheDirectory); + } } - public async Task Ensure(int volumeId) + public async Task Ensure(int chapterId) { - if (!CacheDirectoryIsAccessible()) - { - return null; - } - Volume volume = await _unitOfWork.SeriesRepository.GetVolumeAsync(volumeId); + EnsureCacheDirectory(); + Chapter chapter = await _unitOfWork.VolumeRepository.GetChapterAsync(chapterId); - foreach (var file in volume.Files) + foreach (var file in chapter.Files) { - var extractPath = GetVolumeCachePath(volumeId, file); + var extractPath = GetCachePath(chapterId, file); _archiveService.ExtractArchive(file.FilePath, extractPath); } - return volume; + return chapter; } public void Cleanup() { _logger.LogInformation("Performing cleanup of Cache directory"); - - if (!CacheDirectoryIsAccessible()) - { - _logger.LogError($"Cache directory {CacheDirectory} is not accessible or does not exist."); - return; - } - + EnsureCacheDirectory(); + DirectoryInfo di = new DirectoryInfo(CacheDirectory); try @@ -79,6 +75,7 @@ namespace API.Services public void CleanupVolumes(int[] volumeIds) { + // TODO: Fix this code to work with chapters _logger.LogInformation($"Running Cache cleanup on Volumes"); foreach (var volume in volumeIds) @@ -96,13 +93,19 @@ namespace API.Services - public string GetVolumeCachePath(int volumeId, MangaFile file) + /// + /// Returns the cache path for a given Chapter. Should be cacheDirectory/{chapterId}/ + /// + /// + /// + /// + public string GetCachePath(int chapterId, MangaFile file) { - var extractPath = Path.GetFullPath(Path.Join(Directory.GetCurrentDirectory(), $"../cache/{volumeId}/")); - if (file.Chapter > 0) - { - extractPath = Path.Join(extractPath, file.Chapter + ""); - } + var extractPath = Path.GetFullPath(Path.Join(CacheDirectory, $"{chapterId}/")); + // if (file.Chapter != null) + // { + // extractPath = Path.Join(extractPath, chapterId + ""); + // } return extractPath; } @@ -110,28 +113,29 @@ namespace API.Services { // BUG: This causes a problem because total pages on a volume assumes "specials" to be there //return files.OrderBy(f => f.Chapter).Where(f => f.Chapter > 0 || f.Volume.Number != 0); - return files.OrderBy(f => f.Chapter, new ChapterSortComparer()); + return files; + //return files.OrderBy(f => f.Chapter, new ChapterSortComparer()); } - public (string path, MangaFile file) GetCachedPagePath(Volume volume, int page) + public async Task<(string path, MangaFile file)> GetCachedPagePath(Chapter chapter, int page) { // Calculate what chapter the page belongs to var pagesSoFar = 0; - // Do not allow chapters with 0, as those are specials and break ordering for reading. - var orderedChapters = GetOrderedChapters(volume.Files); - foreach (var mangaFile in orderedChapters) + var chapterFiles = chapter.Files ?? await _unitOfWork.VolumeRepository.GetFilesForChapter(chapter.Id); + foreach (var mangaFile in chapterFiles) { if (page + 1 < (mangaFile.NumberOfPages + pagesSoFar)) { - var path = GetVolumeCachePath(volume.Id, mangaFile); + var path = GetCachePath(chapter.Id, mangaFile); var files = _directoryService.GetFiles(path); Array.Sort(files, _numericComparer); return (files.ElementAt(page - pagesSoFar), mangaFile); } - + pagesSoFar += mangaFile.NumberOfPages; } + return ("", null); } } diff --git a/API/Services/DirectoryService.cs b/API/Services/DirectoryService.cs index a4e7c5ce8..c93485821 100644 --- a/API/Services/DirectoryService.cs +++ b/API/Services/DirectoryService.cs @@ -8,12 +8,19 @@ using System.Threading; using System.Threading.Tasks; using API.DTOs; using API.Interfaces; +using Microsoft.Extensions.Logging; using NetVips; namespace API.Services { public class DirectoryService : IDirectoryService { + private readonly ILogger _logger; + + public DirectoryService(ILogger logger) + { + _logger = logger; + } /// /// Given a set of regex search criteria, get files in the given path. @@ -52,6 +59,11 @@ namespace API.Services public async Task ReadImageAsync(string imagePath) { + if (!File.Exists(imagePath)) + { + _logger.LogError("Image does not exist on disk."); + return null; + } using var image = Image.NewFromFile(imagePath); return new ImageDto diff --git a/API/Services/ScannerService.cs b/API/Services/ScannerService.cs index eaf2fff5c..b3cd09e9b 100644 --- a/API/Services/ScannerService.cs +++ b/API/Services/ScannerService.cs @@ -61,6 +61,12 @@ namespace API.Services var totalFiles = 0; foreach (var folderPath in library.Folders) { + // if (!forceUpdate && Directory.GetLastWriteTime(folderPath.Path) <= folderPath.LastScanned) + // { + // _logger.LogDebug($"{folderPath.Path} hasn't been updated since last scan. Skipping."); + // continue; + // } + try { totalFiles += DirectoryService.TraverseTreeParallelForEach(folderPath.Path, (f) => { @@ -88,10 +94,12 @@ namespace API.Services // Remove series that are no longer on disk RemoveSeriesNotOnDisk(allSeries, series, library); + foreach (var folder in library.Folders) folder.LastScanned = DateTime.Now; _unitOfWork.LibraryRepository.Update(library); if (Task.Run(() => _unitOfWork.Complete()).Result) { + _logger.LogInformation($"Scan completed on {library.Name}. Parsed {series.Keys.Count()} series."); } else @@ -188,10 +196,10 @@ namespace API.Services private Series UpdateSeries(Series series, ParserInfo[] infos, bool forceUpdate) { - var volumes = UpdateVolumes(series, infos, forceUpdate); + var volumes = UpdateVolumesWithChapters(series, infos, forceUpdate); series.Volumes = volumes; series.Pages = volumes.Sum(v => v.Pages); - if (series.CoverImage == null || forceUpdate) + if (ShouldFindCoverImage(forceUpdate, series.CoverImage)) { var firstCover = volumes.OrderBy(x => x.Number).FirstOrDefault(x => x.Number != 0); if (firstCover == null && volumes.Any()) @@ -213,16 +221,20 @@ namespace API.Services { _logger.LogDebug($"Creating File Entry for {info.FullFilePath}"); - int.TryParse(info.Chapters, out var chapter); - _logger.LogDebug($"Found Chapter: {chapter}"); return new MangaFile() { FilePath = info.FullFilePath, - Chapter = chapter, Format = info.Format, NumberOfPages = info.Format == MangaFormat.Archive ? _archiveService.GetNumberOfPagesFromArchive(info.FullFilePath): 1 }; } + + private bool ShouldFindCoverImage(bool forceUpdate, byte[] coverImage) + { + return forceUpdate || coverImage == null || !coverImage.Any(); + } + + @@ -237,16 +249,20 @@ namespace API.Services { ICollection volumes = new List(); IList existingVolumes = _unitOfWork.SeriesRepository.GetVolumes(series.Id).ToList(); - + + //var justVolumes = infos.Select(pi => pi.Chapters == "0"); + + foreach (var info in infos) { var existingVolume = existingVolumes.SingleOrDefault(v => v.Name == info.Volumes); if (existingVolume != null) { - var existingFile = existingVolume.Files.SingleOrDefault(f => f.FilePath == info.FullFilePath); + //var existingFile = existingVolume.Files.SingleOrDefault(f => f.FilePath == info.FullFilePath); + var existingFile = new MangaFile(); if (existingFile != null) { - existingFile.Chapter = Parser.Parser.MinimumNumberFromRange(info.Chapters); + //existingFile.Chapter = Parser.Parser.MinimumNumberFromRange(info.Chapters); existingFile.Format = info.Format; existingFile.NumberOfPages = _archiveService.GetNumberOfPagesFromArchive(info.FullFilePath); } @@ -254,7 +270,7 @@ namespace API.Services { if (info.Format == MangaFormat.Archive) { - existingVolume.Files.Add(CreateMangaFile(info)); + // existingVolume.Files.Add(CreateMangaFile(info)); } else { @@ -271,7 +287,7 @@ namespace API.Services existingVolume = volumes.SingleOrDefault(v => v.Name == info.Volumes); if (existingVolume != null) { - existingVolume.Files.Add(CreateMangaFile(info)); + //existingVolume.Files.Add(CreateMangaFile(info)); } else { @@ -279,10 +295,10 @@ namespace API.Services { Name = info.Volumes, Number = Parser.Parser.MinimumNumberFromRange(info.Volumes), - Files = new List() - { - CreateMangaFile(info) - } + // Files = new List() + // { + // CreateMangaFile(info) + // } }; volumes.Add(vol); } @@ -290,23 +306,121 @@ namespace API.Services _logger.LogInformation($"Adding volume {volumes.Last().Number} with File: {info.Filename}"); } - + foreach (var volume in volumes) { - if (forceUpdate || volume.CoverImage == null || !volume.Files.Any()) - { - var firstFile = volume.Files.OrderBy(x => x.Chapter).FirstOrDefault(); - if (firstFile != null) volume.CoverImage = _archiveService.GetCoverImage(firstFile.FilePath, true); - } - - volume.Pages = volume.Files.Sum(x => x.NumberOfPages); + // if (forceUpdate || volume.CoverImage == null || !volume.Files.Any()) + // { + // var firstFile = volume.Files.OrderBy(x => x.Chapter).FirstOrDefault(); + // if (firstFile != null) volume.CoverImage = _archiveService.GetCoverImage(firstFile.FilePath, true); + // } + + //volume.Pages = volume.Files.Sum(x => x.NumberOfPages); } - + return volumes; } + /// + /// + /// + /// + /// + /// + /// + private ICollection UpdateChapters(Volume volume, IEnumerable infos, bool forceUpdate) + { + var chapters = new List(); + foreach (var info in infos) + { + volume.Chapters ??= new List(); + var chapter = volume.Chapters.SingleOrDefault(c => c.Range == info.Chapters) ?? + chapters.SingleOrDefault(v => v.Range == info.Chapters) ?? + new Chapter() + { + Number = Parser.Parser.MinimumNumberFromRange(info.Chapters) + "", + Range = info.Chapters, + }; + + chapter.Files ??= new List(); + var existingFile = chapter?.Files.SingleOrDefault(f => f.FilePath == info.FullFilePath); + if (existingFile != null) + { + existingFile.Format = info.Format; + existingFile.NumberOfPages = _archiveService.GetNumberOfPagesFromArchive(info.FullFilePath); + } + else + { + if (info.Format == MangaFormat.Archive) + { + chapter.Files.Add(CreateMangaFile(info)); + } + else + { + _logger.LogDebug($"Ignoring {info.Filename} as it is not an archive."); + } + + } + + chapter.Number = Parser.Parser.MinimumNumberFromRange(info.Chapters) + ""; + chapter.Range = info.Chapters; + + chapters.Add(chapter); + } + + foreach (var chapter in chapters) + { + chapter.Pages = chapter.Files.Sum(f => f.NumberOfPages); + + if (ShouldFindCoverImage(forceUpdate, chapter.CoverImage)) + { + var firstFile = chapter?.Files.OrderBy(x => x.Chapter).FirstOrDefault(); + if (firstFile != null) chapter.CoverImage = _archiveService.GetCoverImage(firstFile.FilePath, true); + } + } + + return chapters; + } + + + private ICollection UpdateVolumesWithChapters(Series series, ParserInfo[] infos, bool forceUpdate) + { + ICollection volumes = new List(); + IList existingVolumes = _unitOfWork.SeriesRepository.GetVolumes(series.Id).ToList(); + + foreach (var info in infos) + { + var volume = (existingVolumes.SingleOrDefault(v => v.Name == info.Volumes) ?? + volumes.SingleOrDefault(v => v.Name == info.Volumes)) ?? new Volume + { + Name = info.Volumes, + Number = Parser.Parser.MinimumNumberFromRange(info.Volumes), + }; + + + var chapters = UpdateChapters(volume, infos.Where(pi => pi.Volumes == volume.Name).ToArray(), forceUpdate); + volume.Chapters = chapters; + volume.Pages = chapters.Sum(c => c.Pages); + volumes.Add(volume); + } + + foreach (var volume in volumes) + { + if (ShouldFindCoverImage(forceUpdate, volume.CoverImage)) + { + // TODO: Create a custom sorter for Chapters so it's consistent across the application + var firstChapter = volume.Chapters.OrderBy(x => Double.Parse(x.Number)).FirstOrDefault(); + var firstFile = firstChapter?.Files.OrderBy(x => x.Chapter).FirstOrDefault(); + if (firstFile != null) volume.CoverImage = _archiveService.GetCoverImage(firstFile.FilePath, true); + } + } + + return volumes; + } + + public void ScanSeries(int libraryId, int seriesId) { diff --git a/API/Startup.cs b/API/Startup.cs index 766b1d01d..7e2864c0e 100644 --- a/API/Startup.cs +++ b/API/Startup.cs @@ -3,6 +3,7 @@ using API.Middleware; using Hangfire; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.StaticFiles; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; @@ -57,7 +58,11 @@ namespace API app.UseAuthorization(); app.UseDefaultFiles(); - app.UseStaticFiles(); + + app.UseStaticFiles(new StaticFileOptions + { + ContentTypeProvider = new FileExtensionContentTypeProvider() // this is not set by default + }); app.UseEndpoints(endpoints => { From 0f82b45b9dbadc9454f5975d139c338a861ba24a Mon Sep 17 00:00:00 2001 From: Joseph Milazzo Date: Tue, 2 Feb 2021 09:38:10 -0600 Subject: [PATCH 12/16] Refactored Cache Cleanup code. --- API/Controllers/SeriesController.cs | 5 +++-- API/Data/SeriesRepository.cs | 26 +++++++++++++++++++++++ API/Interfaces/ICacheService.cs | 4 ++-- API/Interfaces/ISeriesRepository.cs | 1 + API/Interfaces/ITaskScheduler.cs | 2 +- API/Services/CacheService.cs | 33 ++++++++--------------------- API/Services/TaskScheduler.cs | 4 ++-- 7 files changed, 44 insertions(+), 31 deletions(-) diff --git a/API/Controllers/SeriesController.cs b/API/Controllers/SeriesController.cs index 561b4ec20..7a59a4ae8 100644 --- a/API/Controllers/SeriesController.cs +++ b/API/Controllers/SeriesController.cs @@ -36,13 +36,14 @@ namespace API.Controllers public async Task> DeleteSeries(int seriesId) { var username = User.GetUsername(); - var volumes = (await _unitOfWork.SeriesRepository.GetVolumesForSeriesAsync(new []{seriesId})).Select(x => x.Id).ToArray(); + //var volumes = (await _unitOfWork.SeriesRepository.GetVolumesForSeriesAsync(new []{seriesId})).Select(x => x.Id).ToArray(); + var chapterIds = (await _unitOfWork.SeriesRepository.GetChapterIdsForSeriesAsync(new []{seriesId})); _logger.LogInformation($"Series {seriesId} is being deleted by {username}."); var result = await _unitOfWork.SeriesRepository.DeleteSeriesAsync(seriesId); if (result) { - _taskScheduler.CleanupVolumes(volumes); + _taskScheduler.CleanupChapters(chapterIds); } return Ok(result); } diff --git a/API/Data/SeriesRepository.cs b/API/Data/SeriesRepository.cs index 14d2c0349..b188f232c 100644 --- a/API/Data/SeriesRepository.cs +++ b/API/Data/SeriesRepository.cs @@ -175,6 +175,32 @@ namespace API.Data .SingleOrDefaultAsync(); } + public async Task GetChapterIdsForSeriesAsync(int[] seriesIds) + { + var series = await _context.Series + .Where(s => seriesIds.Contains(s.Id)) + .Include(s => s.Volumes) + .ThenInclude(v => v.Chapters) + .ToListAsync(); + + // TODO: refactor this + IList chapterIds = new List(); + foreach (var s in series) + { + foreach (var v in s.Volumes) + { + foreach (var c in v.Chapters) + { + chapterIds.Add(c.Id); + } + } + } + + return chapterIds.ToArray(); + + //return series.Select(s => s.Volumes).Select(v => v.Select(v => v.Chapters)).Select(c => c.Id); + } + private async Task AddSeriesModifiers(int userId, List series) { var userProgress = await _context.AppUserProgresses diff --git a/API/Interfaces/ICacheService.cs b/API/Interfaces/ICacheService.cs index 9d9721b4a..470099859 100644 --- a/API/Interfaces/ICacheService.cs +++ b/API/Interfaces/ICacheService.cs @@ -21,8 +21,8 @@ namespace API.Interfaces /// /// Clears cache directory of all volumes. This can be invoked from deleting a library or a series. /// - /// Volumes that belong to that library. Assume the library might have been deleted before this invocation. - void CleanupVolumes(int[] volumeIds); + /// Volumes that belong to that library. Assume the library might have been deleted before this invocation. + void CleanupChapters(int[] chapterIds); /// diff --git a/API/Interfaces/ISeriesRepository.cs b/API/Interfaces/ISeriesRepository.cs index fedf5c10e..86f3c3387 100644 --- a/API/Interfaces/ISeriesRepository.cs +++ b/API/Interfaces/ISeriesRepository.cs @@ -26,5 +26,6 @@ namespace API.Interfaces Task GetSeriesByIdAsync(int seriesId); //Task GetVolumeMangaFileDtos(int volumeId); + Task GetChapterIdsForSeriesAsync(int[] seriesIds); } } \ No newline at end of file diff --git a/API/Interfaces/ITaskScheduler.cs b/API/Interfaces/ITaskScheduler.cs index b19dc9291..f7e13d7a6 100644 --- a/API/Interfaces/ITaskScheduler.cs +++ b/API/Interfaces/ITaskScheduler.cs @@ -3,7 +3,7 @@ public interface ITaskScheduler { void ScanLibrary(int libraryId, bool forceUpdate = false); - void CleanupVolumes(int[] volumeIds); + void CleanupChapters(int[] chapterIds); void ScanSeries(int libraryId, int seriesId); } } \ No newline at end of file diff --git a/API/Services/CacheService.cs b/API/Services/CacheService.cs index d59a7f2db..b1e04a83d 100644 --- a/API/Services/CacheService.cs +++ b/API/Services/CacheService.cs @@ -47,7 +47,7 @@ namespace API.Services foreach (var file in chapter.Files) { - var extractPath = GetCachePath(chapterId, file); + var extractPath = GetCachePath(chapterId); _archiveService.ExtractArchive(file.FilePath, extractPath); } @@ -73,14 +73,14 @@ namespace API.Services _logger.LogInformation("Cache directory purged."); } - public void CleanupVolumes(int[] volumeIds) + public void CleanupChapters(int[] chapterIds) { // TODO: Fix this code to work with chapters _logger.LogInformation($"Running Cache cleanup on Volumes"); - foreach (var volume in volumeIds) + foreach (var chapter in chapterIds) { - var di = new DirectoryInfo(Path.Join(CacheDirectory, volume + "")); + var di = new DirectoryInfo(GetCachePath(chapter)); if (di.Exists) { di.Delete(true); @@ -90,31 +90,15 @@ namespace API.Services _logger.LogInformation("Cache directory purged"); } - - /// /// Returns the cache path for a given Chapter. Should be cacheDirectory/{chapterId}/ /// /// - /// /// - public string GetCachePath(int chapterId, MangaFile file) + private string GetCachePath(int chapterId) { - var extractPath = Path.GetFullPath(Path.Join(CacheDirectory, $"{chapterId}/")); - // if (file.Chapter != null) - // { - // extractPath = Path.Join(extractPath, chapterId + ""); - // } - return extractPath; - } - - public IEnumerable GetOrderedChapters(ICollection files) - { - // BUG: This causes a problem because total pages on a volume assumes "specials" to be there - //return files.OrderBy(f => f.Chapter).Where(f => f.Chapter > 0 || f.Volume.Number != 0); - return files; - //return files.OrderBy(f => f.Chapter, new ChapterSortComparer()); + return Path.GetFullPath(Path.Join(CacheDirectory, $"{chapterId}/")); } public async Task<(string path, MangaFile file)> GetCachedPagePath(Chapter chapter, int page) @@ -124,9 +108,10 @@ namespace API.Services var chapterFiles = chapter.Files ?? await _unitOfWork.VolumeRepository.GetFilesForChapter(chapter.Id); foreach (var mangaFile in chapterFiles) { - if (page + 1 < (mangaFile.NumberOfPages + pagesSoFar)) + if (page < (mangaFile.NumberOfPages + pagesSoFar)) { - var path = GetCachePath(chapter.Id, mangaFile); + var path = GetCachePath(chapter.Id); + // TODO: GetFiles should only get image files. var files = _directoryService.GetFiles(path); Array.Sort(files, _numericComparer); diff --git a/API/Services/TaskScheduler.cs b/API/Services/TaskScheduler.cs index 2ed039b8d..f888087ea 100644 --- a/API/Services/TaskScheduler.cs +++ b/API/Services/TaskScheduler.cs @@ -34,9 +34,9 @@ namespace API.Services BackgroundJob.Enqueue(() => _scannerService.ScanLibrary(libraryId, forceUpdate)); } - public void CleanupVolumes(int[] volumeIds) + public void CleanupChapters(int[] chapterIds) { - BackgroundJob.Enqueue(() => _cacheService.CleanupVolumes(volumeIds)); + BackgroundJob.Enqueue(() => _cacheService.CleanupChapters(chapterIds)); } From e60f7954107c9790a25d9541ce9191806d95f8ba Mon Sep 17 00:00:00 2001 From: Joseph Milazzo Date: Tue, 2 Feb 2021 09:40:26 -0600 Subject: [PATCH 13/16] Refactored Cache Cleanup code. --- API/Controllers/LibraryController.cs | 8 ++++---- API/Controllers/SeriesController.cs | 1 - 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/API/Controllers/LibraryController.cs b/API/Controllers/LibraryController.cs index ed193a4d0..19d7465b1 100644 --- a/API/Controllers/LibraryController.cs +++ b/API/Controllers/LibraryController.cs @@ -177,13 +177,13 @@ namespace API.Controllers var username = User.GetUsername(); _logger.LogInformation($"Library {libraryId} is being deleted by {username}."); var series = await _unitOfWork.SeriesRepository.GetSeriesForLibraryIdAsync(libraryId); - var volumes = (await _unitOfWork.SeriesRepository.GetVolumesForSeriesAsync(series.Select(x => x.Id).ToArray())) - .Select(x => x.Id).ToArray(); + var chapterIds = + await _unitOfWork.SeriesRepository.GetChapterIdsForSeriesAsync(series.Select(x => x.Id).ToArray()); var result = await _unitOfWork.LibraryRepository.DeleteLibrary(libraryId); - if (result && volumes.Any()) + if (result && chapterIds.Any()) { - _taskScheduler.CleanupVolumes(volumes); + _taskScheduler.CleanupChapters(chapterIds); } return Ok(result); diff --git a/API/Controllers/SeriesController.cs b/API/Controllers/SeriesController.cs index 7a59a4ae8..0e52fbc61 100644 --- a/API/Controllers/SeriesController.cs +++ b/API/Controllers/SeriesController.cs @@ -36,7 +36,6 @@ namespace API.Controllers public async Task> DeleteSeries(int seriesId) { var username = User.GetUsername(); - //var volumes = (await _unitOfWork.SeriesRepository.GetVolumesForSeriesAsync(new []{seriesId})).Select(x => x.Id).ToArray(); var chapterIds = (await _unitOfWork.SeriesRepository.GetChapterIdsForSeriesAsync(new []{seriesId})); _logger.LogInformation($"Series {seriesId} is being deleted by {username}."); var result = await _unitOfWork.SeriesRepository.DeleteSeriesAsync(seriesId); From 1050fa4e544069ec1e0efd4c7e11b6f4dd583a6a Mon Sep 17 00:00:00 2001 From: Joseph Milazzo Date: Thu, 4 Feb 2021 16:49:48 -0600 Subject: [PATCH 14/16] Ability to update settings. Take effect on next reboot. --- API.Tests/Converters/CronConverterTests.cs | 28 + API/Controllers/AdminController.cs | 4 - API/Controllers/SettingsController.cs | 64 +- API/DTOs/ServerSettingDTO.cs | 5 +- ...210203164258_ServerSettingsKey.Designer.cs | 676 ++++++++++++++++++ .../20210203164258_ServerSettingsKey.cs | 29 + .../Migrations/DataContextModelSnapshot.cs | 4 +- API/Data/Seed.cs | 13 +- API/Data/SettingsRepository.cs | 47 ++ API/Data/UnitOfWork.cs | 2 + API/Entities/ServerSetting.cs | 2 +- API/Entities/ServerSettingKey.cs | 10 + API/Helpers/Converters/CronConverter.cs | 41 ++ .../Converters/ServerSettingConverter.cs | 14 +- API/Interfaces/ISettingsRepository.cs | 16 + API/Interfaces/IUnitOfWork.cs | 1 + API/Services/ArchiveService.cs | 5 +- API/Services/CacheService.cs | 3 +- API/Services/ScannerService.cs | 108 +-- API/Services/TaskScheduler.cs | 25 +- API/Startup.cs | 2 - 21 files changed, 953 insertions(+), 146 deletions(-) create mode 100644 API.Tests/Converters/CronConverterTests.cs create mode 100644 API/Data/Migrations/20210203164258_ServerSettingsKey.Designer.cs create mode 100644 API/Data/Migrations/20210203164258_ServerSettingsKey.cs create mode 100644 API/Data/SettingsRepository.cs create mode 100644 API/Entities/ServerSettingKey.cs create mode 100644 API/Helpers/Converters/CronConverter.cs create mode 100644 API/Interfaces/ISettingsRepository.cs diff --git a/API.Tests/Converters/CronConverterTests.cs b/API.Tests/Converters/CronConverterTests.cs new file mode 100644 index 000000000..6f5cd9419 --- /dev/null +++ b/API.Tests/Converters/CronConverterTests.cs @@ -0,0 +1,28 @@ +using System; +using API.Helpers.Converters; +using AutoMapper; +using Hangfire; +using Xunit; +using Xunit.Abstractions; + +namespace API.Tests.Converters +{ + public class CronConverterTests + { + private readonly ITestOutputHelper _testOutputHelper; + + public CronConverterTests(ITestOutputHelper testOutputHelper) + { + _testOutputHelper = testOutputHelper; + } + + [Theory] + [InlineData("daily", "0 0 * * *")] + [InlineData("disabled", "0 0 31 2 *")] + [InlineData("weekly", "0 0 * * 1")] + public void ConvertTest(string input, string expected) + { + Assert.Equal(expected, CronConverter.ConvertToCronNotation(input)); + } + } +} \ No newline at end of file diff --git a/API/Controllers/AdminController.cs b/API/Controllers/AdminController.cs index 4aba6b7bd..3002947a2 100644 --- a/API/Controllers/AdminController.cs +++ b/API/Controllers/AdminController.cs @@ -20,9 +20,5 @@ namespace API.Controllers var users = await _userManager.GetUsersInRoleAsync("Admin"); return users.Count > 0; } - - - - } } \ No newline at end of file diff --git a/API/Controllers/SettingsController.cs b/API/Controllers/SettingsController.cs index 1b4cdd3af..2e0f8f57f 100644 --- a/API/Controllers/SettingsController.cs +++ b/API/Controllers/SettingsController.cs @@ -1,14 +1,14 @@ -using System.IO; -using System.Linq; +using System.Collections.Generic; +using System.IO; using System.Threading.Tasks; using API.Data; using API.DTOs; +using API.Entities; using API.Extensions; +using API.Helpers.Converters; using API.Interfaces; -using AutoMapper; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; namespace API.Controllers @@ -18,30 +18,30 @@ namespace API.Controllers { private readonly DataContext _dataContext; private readonly ILogger _logger; - private readonly IMapper _mapper; + private readonly IUnitOfWork _unitOfWork; private readonly ITaskScheduler _taskScheduler; - public SettingsController(DataContext dataContext, ILogger logger, IMapper mapper, ITaskScheduler taskScheduler) + public SettingsController(DataContext dataContext, ILogger logger, IUnitOfWork unitOfWork, + ITaskScheduler taskScheduler) { _dataContext = dataContext; _logger = logger; - _mapper = mapper; + _unitOfWork = unitOfWork; _taskScheduler = taskScheduler; } [HttpGet("")] public async Task> GetSettings() { - var settings = await _dataContext.ServerSetting.Select(x => x).ToListAsync(); - return _mapper.Map(settings); + return Ok(await _unitOfWork.SettingsRepository.GetSettingsDtoAsync()); } - + [Authorize(Policy = "RequireAdminRole")] [HttpPost("")] - public async Task UpdateSettings(ServerSettingDto updateSettingsDto) + public async Task> UpdateSettings(ServerSettingDto updateSettingsDto) { _logger.LogInformation($"{User.GetUsername()} is updating Server Settings"); - + if (updateSettingsDto.CacheDirectory.Equals(string.Empty)) { return BadRequest("Cache Directory cannot be empty"); @@ -51,13 +51,39 @@ namespace API.Controllers { return BadRequest("Directory does not exist or is not accessible."); } - // TODO: Figure out how to handle a change. This means that on clean, we need to clean up old cache - // directory and new one, but what if someone is reading? - // I can just clean both always, /cache/ is an owned folder, so users shouldn't use it. - - - //_dataContext.ServerSetting.Update - return BadRequest("Not Implemented"); + + // We do not allow CacheDirectory changes, so we will ignore. + var currentSettings = await _unitOfWork.SettingsRepository.GetSettingsAsync(); + + foreach (var setting in currentSettings) + { + if (setting.Key == ServerSettingKey.TaskBackup && updateSettingsDto.TaskBackup != setting.Value) + { + setting.Value = updateSettingsDto.TaskBackup; + _unitOfWork.SettingsRepository.Update(setting); + } + + if (setting.Key == ServerSettingKey.TaskScan && updateSettingsDto.TaskScan != setting.Value) + { + setting.Value = updateSettingsDto.TaskScan; + _unitOfWork.SettingsRepository.Update(setting); + } + } + + if (_unitOfWork.HasChanges() && await _unitOfWork.Complete()) + { + _logger.LogInformation("Server Settings updated."); + return Ok(updateSettingsDto); + } + + return BadRequest("There was a critical issue. Please try again."); + } + + [Authorize(Policy = "RequireAdminRole")] + [HttpGet("task-frequencies")] + public ActionResult> GetTaskFrequencies() + { + return Ok(CronConverter.Options); } } } \ No newline at end of file diff --git a/API/DTOs/ServerSettingDTO.cs b/API/DTOs/ServerSettingDTO.cs index 455859305..e16d16506 100644 --- a/API/DTOs/ServerSettingDTO.cs +++ b/API/DTOs/ServerSettingDTO.cs @@ -3,7 +3,8 @@ public class ServerSettingDto { public string CacheDirectory { get; set; } - // public string Kind { get; init; } - // public string Value { get; init; } + public string TaskScan { get; set; } + public string LoggingLevel { get; set; } + public string TaskBackup { get; set; } } } \ No newline at end of file diff --git a/API/Data/Migrations/20210203164258_ServerSettingsKey.Designer.cs b/API/Data/Migrations/20210203164258_ServerSettingsKey.Designer.cs new file mode 100644 index 000000000..75d0a2244 --- /dev/null +++ b/API/Data/Migrations/20210203164258_ServerSettingsKey.Designer.cs @@ -0,0 +1,676 @@ +// +using System; +using API.Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +namespace API.Data.Migrations +{ + [DbContext(typeof(DataContext))] + [Migration("20210203164258_ServerSettingsKey")] + partial class ServerSettingsKey + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "5.0.1"); + + modelBuilder.Entity("API.Entities.AppRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("TEXT"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex"); + + b.ToTable("AspNetRoles"); + }); + + modelBuilder.Entity("API.Entities.AppUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("AccessFailedCount") + .HasColumnType("INTEGER"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("TEXT"); + + b.Property("Created") + .HasColumnType("TEXT"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("EmailConfirmed") + .HasColumnType("INTEGER"); + + b.Property("LastActive") + .HasColumnType("TEXT"); + + b.Property("LockoutEnabled") + .HasColumnType("INTEGER"); + + b.Property("LockoutEnd") + .HasColumnType("TEXT"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("PasswordHash") + .HasColumnType("TEXT"); + + b.Property("PhoneNumber") + .HasColumnType("TEXT"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("INTEGER"); + + b.Property("RowVersion") + .IsConcurrencyToken() + .HasColumnType("INTEGER"); + + b.Property("SecurityStamp") + .HasColumnType("TEXT"); + + b.Property("TwoFactorEnabled") + .HasColumnType("INTEGER"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex"); + + b.ToTable("AspNetUsers"); + }); + + modelBuilder.Entity("API.Entities.AppUserProgress", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("AppUserId") + .HasColumnType("INTEGER"); + + b.Property("ChapterId") + .HasColumnType("INTEGER"); + + b.Property("PagesRead") + .HasColumnType("INTEGER"); + + b.Property("SeriesId") + .HasColumnType("INTEGER"); + + b.Property("VolumeId") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("AppUserId"); + + b.ToTable("AppUserProgresses"); + }); + + modelBuilder.Entity("API.Entities.AppUserRating", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("AppUserId") + .HasColumnType("INTEGER"); + + b.Property("Rating") + .HasColumnType("INTEGER"); + + b.Property("Review") + .HasColumnType("TEXT"); + + b.Property("SeriesId") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("AppUserId"); + + b.ToTable("AppUserRating"); + }); + + modelBuilder.Entity("API.Entities.AppUserRole", b => + { + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.Property("RoleId") + .HasColumnType("INTEGER"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetUserRoles"); + }); + + modelBuilder.Entity("API.Entities.Chapter", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CoverImage") + .HasColumnType("BLOB"); + + b.Property("Created") + .HasColumnType("TEXT"); + + b.Property("LastModified") + .HasColumnType("TEXT"); + + b.Property("Number") + .HasColumnType("TEXT"); + + b.Property("Pages") + .HasColumnType("INTEGER"); + + b.Property("Range") + .HasColumnType("TEXT"); + + b.Property("VolumeId") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("VolumeId"); + + b.ToTable("Chapter"); + }); + + modelBuilder.Entity("API.Entities.FolderPath", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("LastScanned") + .HasColumnType("TEXT"); + + b.Property("LibraryId") + .HasColumnType("INTEGER"); + + b.Property("Path") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("LibraryId"); + + b.ToTable("FolderPath"); + }); + + modelBuilder.Entity("API.Entities.Library", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CoverImage") + .HasColumnType("TEXT"); + + b.Property("Created") + .HasColumnType("TEXT"); + + b.Property("LastModified") + .HasColumnType("TEXT"); + + b.Property("Name") + .HasColumnType("TEXT"); + + b.Property("Type") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.ToTable("Library"); + }); + + modelBuilder.Entity("API.Entities.MangaFile", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ChapterId") + .HasColumnType("INTEGER"); + + b.Property("FilePath") + .HasColumnType("TEXT"); + + b.Property("Format") + .HasColumnType("INTEGER"); + + b.Property("NumberOfPages") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("ChapterId"); + + b.ToTable("MangaFile"); + }); + + modelBuilder.Entity("API.Entities.Series", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CoverImage") + .HasColumnType("BLOB"); + + b.Property("Created") + .HasColumnType("TEXT"); + + b.Property("LastModified") + .HasColumnType("TEXT"); + + b.Property("LibraryId") + .HasColumnType("INTEGER"); + + b.Property("Name") + .HasColumnType("TEXT"); + + b.Property("OriginalName") + .HasColumnType("TEXT"); + + b.Property("Pages") + .HasColumnType("INTEGER"); + + b.Property("SortName") + .HasColumnType("TEXT"); + + b.Property("Summary") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("LibraryId"); + + b.ToTable("Series"); + }); + + modelBuilder.Entity("API.Entities.ServerSetting", b => + { + b.Property("Key") + .HasColumnType("INTEGER"); + + b.Property("RowVersion") + .IsConcurrencyToken() + .HasColumnType("INTEGER"); + + b.Property("Value") + .HasColumnType("TEXT"); + + b.HasKey("Key"); + + b.ToTable("ServerSetting"); + }); + + modelBuilder.Entity("API.Entities.Volume", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CoverImage") + .HasColumnType("BLOB"); + + b.Property("Created") + .HasColumnType("TEXT"); + + b.Property("IsSpecial") + .HasColumnType("INTEGER"); + + b.Property("LastModified") + .HasColumnType("TEXT"); + + b.Property("Name") + .HasColumnType("TEXT"); + + b.Property("Number") + .HasColumnType("INTEGER"); + + b.Property("Pages") + .HasColumnType("INTEGER"); + + b.Property("SeriesId") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("SeriesId"); + + b.ToTable("Volume"); + }); + + modelBuilder.Entity("AppUserLibrary", b => + { + b.Property("AppUsersId") + .HasColumnType("INTEGER"); + + b.Property("LibrariesId") + .HasColumnType("INTEGER"); + + b.HasKey("AppUsersId", "LibrariesId"); + + b.HasIndex("LibrariesId"); + + b.ToTable("AppUserLibrary"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ClaimType") + .HasColumnType("TEXT"); + + b.Property("ClaimValue") + .HasColumnType("TEXT"); + + b.Property("RoleId") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ClaimType") + .HasColumnType("TEXT"); + + b.Property("ClaimValue") + .HasColumnType("TEXT"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider") + .HasColumnType("TEXT"); + + b.Property("ProviderKey") + .HasColumnType("TEXT"); + + b.Property("ProviderDisplayName") + .HasColumnType("TEXT"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.Property("LoginProvider") + .HasColumnType("TEXT"); + + b.Property("Name") + .HasColumnType("TEXT"); + + b.Property("Value") + .HasColumnType("TEXT"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens"); + }); + + modelBuilder.Entity("API.Entities.AppUserProgress", b => + { + b.HasOne("API.Entities.AppUser", "AppUser") + .WithMany("Progresses") + .HasForeignKey("AppUserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("AppUser"); + }); + + modelBuilder.Entity("API.Entities.AppUserRating", b => + { + b.HasOne("API.Entities.AppUser", "AppUser") + .WithMany("Ratings") + .HasForeignKey("AppUserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("AppUser"); + }); + + modelBuilder.Entity("API.Entities.AppUserRole", b => + { + b.HasOne("API.Entities.AppRole", "Role") + .WithMany("UserRoles") + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("API.Entities.AppUser", "User") + .WithMany("UserRoles") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Role"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("API.Entities.Chapter", b => + { + b.HasOne("API.Entities.Volume", "Volume") + .WithMany("Chapters") + .HasForeignKey("VolumeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Volume"); + }); + + modelBuilder.Entity("API.Entities.FolderPath", b => + { + b.HasOne("API.Entities.Library", "Library") + .WithMany("Folders") + .HasForeignKey("LibraryId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Library"); + }); + + modelBuilder.Entity("API.Entities.MangaFile", b => + { + b.HasOne("API.Entities.Chapter", "Chapter") + .WithMany("Files") + .HasForeignKey("ChapterId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Chapter"); + }); + + modelBuilder.Entity("API.Entities.Series", b => + { + b.HasOne("API.Entities.Library", "Library") + .WithMany("Series") + .HasForeignKey("LibraryId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Library"); + }); + + modelBuilder.Entity("API.Entities.Volume", b => + { + b.HasOne("API.Entities.Series", "Series") + .WithMany("Volumes") + .HasForeignKey("SeriesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Series"); + }); + + modelBuilder.Entity("AppUserLibrary", b => + { + b.HasOne("API.Entities.AppUser", null) + .WithMany() + .HasForeignKey("AppUsersId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("API.Entities.Library", null) + .WithMany() + .HasForeignKey("LibrariesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("API.Entities.AppRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("API.Entities.AppUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("API.Entities.AppUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("API.Entities.AppUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("API.Entities.AppRole", b => + { + b.Navigation("UserRoles"); + }); + + modelBuilder.Entity("API.Entities.AppUser", b => + { + b.Navigation("Progresses"); + + b.Navigation("Ratings"); + + b.Navigation("UserRoles"); + }); + + modelBuilder.Entity("API.Entities.Chapter", b => + { + b.Navigation("Files"); + }); + + modelBuilder.Entity("API.Entities.Library", b => + { + b.Navigation("Folders"); + + b.Navigation("Series"); + }); + + modelBuilder.Entity("API.Entities.Series", b => + { + b.Navigation("Volumes"); + }); + + modelBuilder.Entity("API.Entities.Volume", b => + { + b.Navigation("Chapters"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/API/Data/Migrations/20210203164258_ServerSettingsKey.cs b/API/Data/Migrations/20210203164258_ServerSettingsKey.cs new file mode 100644 index 000000000..0a2a64920 --- /dev/null +++ b/API/Data/Migrations/20210203164258_ServerSettingsKey.cs @@ -0,0 +1,29 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +namespace API.Data.Migrations +{ + public partial class ServerSettingsKey : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterColumn( + name: "Key", + table: "ServerSetting", + type: "INTEGER", + nullable: false, + oldClrType: typeof(string), + oldType: "TEXT"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterColumn( + name: "Key", + table: "ServerSetting", + type: "TEXT", + nullable: false, + oldClrType: typeof(int), + oldType: "INTEGER"); + } + } +} diff --git a/API/Data/Migrations/DataContextModelSnapshot.cs b/API/Data/Migrations/DataContextModelSnapshot.cs index 2ba32129a..fcbfaa084 100644 --- a/API/Data/Migrations/DataContextModelSnapshot.cs +++ b/API/Data/Migrations/DataContextModelSnapshot.cs @@ -335,8 +335,8 @@ namespace API.Data.Migrations modelBuilder.Entity("API.Entities.ServerSetting", b => { - b.Property("Key") - .HasColumnType("TEXT"); + b.Property("Key") + .HasColumnType("INTEGER"); b.Property("RowVersion") .IsConcurrencyToken() diff --git a/API/Data/Seed.cs b/API/Data/Seed.cs index 5071b9fa5..9b4a49e6b 100644 --- a/API/Data/Seed.cs +++ b/API/Data/Seed.cs @@ -31,20 +31,23 @@ namespace API.Data public static async Task SeedSettings(DataContext context) { + context.Database.EnsureCreated(); + IList defaultSettings = new List() { - new() {Key = "CacheDirectory", Value = CacheService.CacheDirectory} + new() {Key = ServerSettingKey.CacheDirectory, Value = CacheService.CacheDirectory}, + new () {Key = ServerSettingKey.TaskScan, Value = "daily"} }; - var settings = await context.ServerSetting.Select(s => s).ToListAsync(); + foreach (var defaultSetting in defaultSettings) { - var existing = settings.SingleOrDefault(s => s.Key == defaultSetting.Key); + var existing = context.ServerSetting.FirstOrDefault(s => s.Key == defaultSetting.Key); if (existing == null) { - settings.Add(defaultSetting); + context.ServerSetting.Add(defaultSetting); } } - + await context.SaveChangesAsync(); } } diff --git a/API/Data/SettingsRepository.cs b/API/Data/SettingsRepository.cs new file mode 100644 index 000000000..21e33deb2 --- /dev/null +++ b/API/Data/SettingsRepository.cs @@ -0,0 +1,47 @@ +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using API.DTOs; +using API.Entities; +using API.Interfaces; +using AutoMapper; +using Microsoft.EntityFrameworkCore; + +namespace API.Data +{ + public class SettingsRepository : ISettingsRepository + { + private readonly DataContext _context; + private readonly IMapper _mapper; + + public SettingsRepository(DataContext context, IMapper mapper) + { + _context = context; + _mapper = mapper; + } + + public void Update(ServerSetting settings) + { + _context.Entry(settings).State = EntityState.Modified; + } + + public async Task GetSettingsDtoAsync() + { + var settings = await _context.ServerSetting + .Select(x => x) + .AsNoTracking() + .ToListAsync(); + return _mapper.Map(settings); + } + + public Task GetSettingAsync(ServerSettingKey key) + { + return _context.ServerSetting.SingleOrDefaultAsync(x => x.Key == key); + } + + public async Task> GetSettingsAsync() + { + return await _context.ServerSetting.ToListAsync(); + } + } +} \ No newline at end of file diff --git a/API/Data/UnitOfWork.cs b/API/Data/UnitOfWork.cs index f183e247a..6cffc1392 100644 --- a/API/Data/UnitOfWork.cs +++ b/API/Data/UnitOfWork.cs @@ -24,6 +24,8 @@ namespace API.Data public ILibraryRepository LibraryRepository => new LibraryRepository(_context, _mapper); public IVolumeRepository VolumeRepository => new VolumeRepository(_context, _mapper); + + public ISettingsRepository SettingsRepository => new SettingsRepository(_context, _mapper); public async Task Complete() { diff --git a/API/Entities/ServerSetting.cs b/API/Entities/ServerSetting.cs index 8bbb3dcf4..a851f834b 100644 --- a/API/Entities/ServerSetting.cs +++ b/API/Entities/ServerSetting.cs @@ -7,7 +7,7 @@ namespace API.Entities public class ServerSetting : IHasConcurrencyToken { [Key] - public string Key { get; set; } + public ServerSettingKey Key { get; set; } public string Value { get; set; } [ConcurrencyCheck] diff --git a/API/Entities/ServerSettingKey.cs b/API/Entities/ServerSettingKey.cs new file mode 100644 index 000000000..19b2f9f9c --- /dev/null +++ b/API/Entities/ServerSettingKey.cs @@ -0,0 +1,10 @@ +namespace API.Entities +{ + public enum ServerSettingKey + { + TaskScan = 0, + CacheDirectory = 1, + TaskBackup = 2, + LoggingLevel = 3 + } +} \ No newline at end of file diff --git a/API/Helpers/Converters/CronConverter.cs b/API/Helpers/Converters/CronConverter.cs new file mode 100644 index 000000000..6fece1bdb --- /dev/null +++ b/API/Helpers/Converters/CronConverter.cs @@ -0,0 +1,41 @@ +using System.Collections.Generic; +using Hangfire; + +namespace API.Helpers.Converters +{ + public static class CronConverter + { + public static readonly IEnumerable Options = new [] + { + "disabled", + "daily", + "weekly", + }; + public static string ConvertToCronNotation(string source) + { + string destination = ""; + destination = source.ToLower() switch + { + "daily" => Cron.Daily(), + "weekly" => Cron.Weekly(), + "disabled" => Cron.Never(), + "" => Cron.Never(), + _ => destination + }; + + return destination; + } + + public static string ConvertFromCronNotation(string cronNotation) + { + string destination = ""; + destination = cronNotation.ToLower() switch + { + "0 0 31 2 *" => "disabled", + _ => destination + }; + + return destination; + } + } +} \ No newline at end of file diff --git a/API/Helpers/Converters/ServerSettingConverter.cs b/API/Helpers/Converters/ServerSettingConverter.cs index 78e395ec3..1795a9ba0 100644 --- a/API/Helpers/Converters/ServerSettingConverter.cs +++ b/API/Helpers/Converters/ServerSettingConverter.cs @@ -9,16 +9,24 @@ namespace API.Helpers.Converters { public ServerSettingDto Convert(IEnumerable source, ServerSettingDto destination, ResolutionContext context) { - destination = new ServerSettingDto(); + destination ??= new ServerSettingDto(); foreach (var row in source) { switch (row.Key) { - case "CacheDirectory": + case ServerSettingKey.CacheDirectory: destination.CacheDirectory = row.Value; break; - default: + case ServerSettingKey.TaskScan: + destination.TaskScan = row.Value; break; + case ServerSettingKey.LoggingLevel: + destination.LoggingLevel = row.Value; + break; + case ServerSettingKey.TaskBackup: + destination.TaskBackup = row.Value; + break; + } } diff --git a/API/Interfaces/ISettingsRepository.cs b/API/Interfaces/ISettingsRepository.cs new file mode 100644 index 000000000..fd9657678 --- /dev/null +++ b/API/Interfaces/ISettingsRepository.cs @@ -0,0 +1,16 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using API.DTOs; +using API.Entities; + +namespace API.Interfaces +{ + public interface ISettingsRepository + { + void Update(ServerSetting settings); + Task GetSettingsDtoAsync(); + Task GetSettingAsync(ServerSettingKey key); + Task> GetSettingsAsync(); + + } +} \ No newline at end of file diff --git a/API/Interfaces/IUnitOfWork.cs b/API/Interfaces/IUnitOfWork.cs index d4268bf64..24a074e29 100644 --- a/API/Interfaces/IUnitOfWork.cs +++ b/API/Interfaces/IUnitOfWork.cs @@ -8,6 +8,7 @@ namespace API.Interfaces IUserRepository UserRepository { get; } ILibraryRepository LibraryRepository { get; } IVolumeRepository VolumeRepository { get; } + ISettingsRepository SettingsRepository { get; } Task Complete(); bool HasChanges(); } diff --git a/API/Services/ArchiveService.cs b/API/Services/ArchiveService.cs index 4113c56f6..500605883 100644 --- a/API/Services/ArchiveService.cs +++ b/API/Services/ArchiveService.cs @@ -74,19 +74,18 @@ namespace API.Services private byte[] CreateThumbnail(ZipArchiveEntry entry) { - var coverImage = Array.Empty(); try { using var stream = entry.Open(); using var thumbnail = Image.ThumbnailStream(stream, ThumbnailWidth); - coverImage = thumbnail.WriteToBuffer(".jpg"); + return thumbnail.WriteToBuffer(".jpg"); } catch (Exception ex) { _logger.LogError(ex, "There was a critical error and prevented thumbnail generation. Defaulting to no cover image."); } - return coverImage; + return Array.Empty(); } private static byte[] ConvertEntryToByteArray(ZipArchiveEntry entry) diff --git a/API/Services/CacheService.cs b/API/Services/CacheService.cs index b1e04a83d..692be4266 100644 --- a/API/Services/CacheService.cs +++ b/API/Services/CacheService.cs @@ -75,7 +75,6 @@ namespace API.Services public void CleanupChapters(int[] chapterIds) { - // TODO: Fix this code to work with chapters _logger.LogInformation($"Running Cache cleanup on Volumes"); foreach (var chapter in chapterIds) @@ -112,7 +111,7 @@ namespace API.Services { var path = GetCachePath(chapter.Id); // TODO: GetFiles should only get image files. - var files = _directoryService.GetFiles(path); + var files = _directoryService.GetFiles(path); Array.Sort(files, _numericComparer); return (files.ElementAt(page - pagesSoFar), mangaFile); diff --git a/API/Services/ScannerService.cs b/API/Services/ScannerService.cs index b3cd09e9b..5f84b6e3f 100644 --- a/API/Services/ScannerService.cs +++ b/API/Services/ScannerService.cs @@ -4,15 +4,12 @@ using System.Collections.Generic; using System.Collections.Immutable; using System.Diagnostics; using System.IO; -using System.IO.Compression; using System.Linq; using System.Threading.Tasks; using API.Entities; -using API.Extensions; using API.Interfaces; using API.Parser; using Microsoft.Extensions.Logging; -using NetVips; namespace API.Services { @@ -61,11 +58,11 @@ namespace API.Services var totalFiles = 0; foreach (var folderPath in library.Folders) { - // if (!forceUpdate && Directory.GetLastWriteTime(folderPath.Path) <= folderPath.LastScanned) - // { - // _logger.LogDebug($"{folderPath.Path} hasn't been updated since last scan. Skipping."); - // continue; - // } + if (!forceUpdate && Directory.GetLastWriteTime(folderPath.Path) <= folderPath.LastScanned) + { + _logger.LogDebug($"{folderPath.Path} hasn't been updated since last scan. Skipping."); + continue; + } try { totalFiles += DirectoryService.TraverseTreeParallelForEach(folderPath.Path, (f) => @@ -163,7 +160,7 @@ namespace API.Services { if (info.Series == string.Empty) return; - _scannedSeries.AddOrUpdate(info.Series, new List() {info}, (key, oldValue) => + _scannedSeries.AddOrUpdate(info.Series, new List() {info}, (_, oldValue) => { oldValue ??= new List(); if (!oldValue.Contains(info)) @@ -234,94 +231,6 @@ namespace API.Services return forceUpdate || coverImage == null || !coverImage.Any(); } - - - - - /// - /// Creates or Updates volumes for a given series - /// - /// Series wanting to be updated - /// Parser info - /// Forces metadata update (cover image) even if it's already been set. - /// Updated Volumes for given series - private ICollection UpdateVolumes(Series series, ParserInfo[] infos, bool forceUpdate) - { - ICollection volumes = new List(); - IList existingVolumes = _unitOfWork.SeriesRepository.GetVolumes(series.Id).ToList(); - - //var justVolumes = infos.Select(pi => pi.Chapters == "0"); - - - foreach (var info in infos) - { - var existingVolume = existingVolumes.SingleOrDefault(v => v.Name == info.Volumes); - if (existingVolume != null) - { - //var existingFile = existingVolume.Files.SingleOrDefault(f => f.FilePath == info.FullFilePath); - var existingFile = new MangaFile(); - if (existingFile != null) - { - //existingFile.Chapter = Parser.Parser.MinimumNumberFromRange(info.Chapters); - existingFile.Format = info.Format; - existingFile.NumberOfPages = _archiveService.GetNumberOfPagesFromArchive(info.FullFilePath); - } - else - { - if (info.Format == MangaFormat.Archive) - { - // existingVolume.Files.Add(CreateMangaFile(info)); - } - else - { - _logger.LogDebug($"Ignoring {info.Filename} as it is not an archive."); - } - - } - - volumes.Add(existingVolume); - } - else - { - // Create New Volume - existingVolume = volumes.SingleOrDefault(v => v.Name == info.Volumes); - if (existingVolume != null) - { - //existingVolume.Files.Add(CreateMangaFile(info)); - } - else - { - var vol = new Volume() - { - Name = info.Volumes, - Number = Parser.Parser.MinimumNumberFromRange(info.Volumes), - // Files = new List() - // { - // CreateMangaFile(info) - // } - }; - volumes.Add(vol); - } - } - - _logger.LogInformation($"Adding volume {volumes.Last().Number} with File: {info.Filename}"); - } - - foreach (var volume in volumes) - { - // if (forceUpdate || volume.CoverImage == null || !volume.Files.Any()) - // { - // var firstFile = volume.Files.OrderBy(x => x.Chapter).FirstOrDefault(); - // if (firstFile != null) volume.CoverImage = _archiveService.GetCoverImage(firstFile.FilePath, true); - // } - - //volume.Pages = volume.Files.Sum(x => x.NumberOfPages); - } - - return volumes; - } - - /// /// /// @@ -345,7 +254,7 @@ namespace API.Services }; chapter.Files ??= new List(); - var existingFile = chapter?.Files.SingleOrDefault(f => f.FilePath == info.FullFilePath); + var existingFile = chapter.Files.SingleOrDefault(f => f.FilePath == info.FullFilePath); if (existingFile != null) { existingFile.Format = info.Format; @@ -376,7 +285,8 @@ namespace API.Services if (ShouldFindCoverImage(forceUpdate, chapter.CoverImage)) { - var firstFile = chapter?.Files.OrderBy(x => x.Chapter).FirstOrDefault(); + chapter.Files ??= new List(); + var firstFile = chapter.Files.OrderBy(x => x.Chapter).FirstOrDefault(); if (firstFile != null) chapter.CoverImage = _archiveService.GetCoverImage(firstFile.FilePath, true); } } diff --git a/API/Services/TaskScheduler.cs b/API/Services/TaskScheduler.cs index f888087ea..12b1f2f60 100644 --- a/API/Services/TaskScheduler.cs +++ b/API/Services/TaskScheduler.cs @@ -1,4 +1,8 @@ -using API.Interfaces; +using System; +using System.Threading.Tasks; +using API.Entities; +using API.Helpers.Converters; +using API.Interfaces; using Hangfire; using Microsoft.Extensions.Logging; @@ -9,17 +13,30 @@ namespace API.Services private readonly ICacheService _cacheService; private readonly ILogger _logger; private readonly IScannerService _scannerService; + private readonly IUnitOfWork _unitOfWork; public BackgroundJobServer Client => new BackgroundJobServer(); - public TaskScheduler(ICacheService cacheService, ILogger logger, IScannerService scannerService) + public TaskScheduler(ICacheService cacheService, ILogger logger, IScannerService scannerService, IUnitOfWork unitOfWork) { _cacheService = cacheService; _logger = logger; _scannerService = scannerService; + _unitOfWork = unitOfWork; _logger.LogInformation("Scheduling/Updating cache cleanup on a daily basis."); - RecurringJob.AddOrUpdate(() => _cacheService.Cleanup(), Cron.Daily); - RecurringJob.AddOrUpdate(() => _scannerService.ScanLibraries(), Cron.Daily); + var setting = Task.Run(() => _unitOfWork.SettingsRepository.GetSettingAsync(ServerSettingKey.TaskScan)).Result; + if (setting != null) + { + RecurringJob.AddOrUpdate(() => _scannerService.ScanLibraries(), () => CronConverter.ConvertToCronNotation(setting.Value)); + } + else + { + RecurringJob.AddOrUpdate(() => _cacheService.Cleanup(), Cron.Daily); + RecurringJob.AddOrUpdate(() => _scannerService.ScanLibraries(), Cron.Daily); + } + + //JobStorage.Current.GetMonitoringApi(). + } public void ScanSeries(int libraryId, int seriesId) diff --git a/API/Startup.cs b/API/Startup.cs index 7e2864c0e..426616e51 100644 --- a/API/Startup.cs +++ b/API/Startup.cs @@ -46,8 +46,6 @@ namespace API app.UseHangfireDashboard(); } - //app.UseHttpsRedirection(); - app.UseRouting(); // Ordering is important. Cors, authentication, authorization From 10c8ea34fe7882700abacd677c8ab161d3c5f1d4 Mon Sep 17 00:00:00 2001 From: Joseph Milazzo Date: Thu, 4 Feb 2021 17:01:37 -0600 Subject: [PATCH 15/16] Cleanup after feature implementation. --- API.Tests/Converters/CronConverterTests.cs | 5 +---- API.Tests/Services/CacheServiceTests.cs | 4 +--- API.Tests/Services/ScannerServiceTests.cs | 23 ---------------------- API/Controllers/LibraryController.cs | 2 +- API/Controllers/ReaderController.cs | 6 +----- API/Controllers/SeriesController.cs | 1 - API/Controllers/SettingsController.cs | 8 +------- API/Data/DataContext.cs | 4 ---- API/Data/Seed.cs | 1 - API/Data/SeriesRepository.cs | 4 ---- API/Entities/ServerSetting.cs | 1 - API/Extensions/DirectoryInfoExtensions.cs | 4 +--- API/Interfaces/IDirectoryService.cs | 8 +++++++- API/Interfaces/IScannerService.cs | 5 +---- API/Interfaces/ISeriesRepository.cs | 4 ---- API/Program.cs | 5 ----- API/Services/CacheService.cs | 4 +--- API/Services/DirectoryService.cs | 7 ++++++- API/Services/TaskScheduler.cs | 7 ++----- 19 files changed, 23 insertions(+), 80 deletions(-) delete mode 100644 API.Tests/Services/ScannerServiceTests.cs diff --git a/API.Tests/Converters/CronConverterTests.cs b/API.Tests/Converters/CronConverterTests.cs index 6f5cd9419..df1ca6294 100644 --- a/API.Tests/Converters/CronConverterTests.cs +++ b/API.Tests/Converters/CronConverterTests.cs @@ -1,7 +1,4 @@ -using System; -using API.Helpers.Converters; -using AutoMapper; -using Hangfire; +using API.Helpers.Converters; using Xunit; using Xunit.Abstractions; diff --git a/API.Tests/Services/CacheServiceTests.cs b/API.Tests/Services/CacheServiceTests.cs index 5459133af..4e10cf836 100644 --- a/API.Tests/Services/CacheServiceTests.cs +++ b/API.Tests/Services/CacheServiceTests.cs @@ -1,6 +1,4 @@ -using System.Collections.Generic; -using API.Entities; -using API.Interfaces; +using API.Interfaces; using API.Services; using Microsoft.Extensions.Logging; using NSubstitute; diff --git a/API.Tests/Services/ScannerServiceTests.cs b/API.Tests/Services/ScannerServiceTests.cs deleted file mode 100644 index efde36e52..000000000 --- a/API.Tests/Services/ScannerServiceTests.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System.IO; -using API.Interfaces; -using API.Services; -using Microsoft.Extensions.Logging; -using NSubstitute; -using Xunit; - -namespace API.Tests.Services -{ - public class ScannerServiceTests - { - // private readonly ScannerService _scannerService; - // private readonly ILogger _logger = Substitute.For>(); - // private readonly IUnitOfWork _unitOfWork = Substitute.For(); - // private readonly string _testDirectory = Path.Join(Directory.GetCurrentDirectory(), "../../../Services/Test Data/ScannerService"); - // public ScannerServiceTests() - // { - // _scannerService = new ScannerService(_unitOfWork, _logger); - // } - - - } -} \ No newline at end of file diff --git a/API/Controllers/LibraryController.cs b/API/Controllers/LibraryController.cs index 19d7465b1..3ecd6bf8a 100644 --- a/API/Controllers/LibraryController.cs +++ b/API/Controllers/LibraryController.cs @@ -145,7 +145,7 @@ namespace API.Controllers [HttpPost("scan")] public ActionResult Scan(int libraryId) { - _taskScheduler.ScanLibrary(libraryId, false); + _taskScheduler.ScanLibrary(libraryId); return Ok(); } diff --git a/API/Controllers/ReaderController.cs b/API/Controllers/ReaderController.cs index cb10f46e5..7c535aa57 100644 --- a/API/Controllers/ReaderController.cs +++ b/API/Controllers/ReaderController.cs @@ -6,7 +6,6 @@ using API.DTOs; using API.Entities; using API.Extensions; using API.Interfaces; -using AutoMapper; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; @@ -18,16 +17,14 @@ namespace API.Controllers private readonly ICacheService _cacheService; private readonly ILogger _logger; private readonly IUnitOfWork _unitOfWork; - private readonly IMapper _mapper; public ReaderController(IDirectoryService directoryService, ICacheService cacheService, - ILogger logger, IUnitOfWork unitOfWork, IMapper mapper) + ILogger logger, IUnitOfWork unitOfWork) { _directoryService = directoryService; _cacheService = cacheService; _logger = logger; _unitOfWork = unitOfWork; - _mapper = mapper; } [HttpGet("image")] @@ -42,7 +39,6 @@ namespace API.Controllers if (string.IsNullOrEmpty(path)) return BadRequest($"No such image for page {page}"); var file = await _directoryService.ReadImageAsync(path); file.Page = page; - //file.Chapter = chapter.Number; file.MangaFileName = mangaFile.FilePath; return Ok(file); diff --git a/API/Controllers/SeriesController.cs b/API/Controllers/SeriesController.cs index 0e52fbc61..78a16f015 100644 --- a/API/Controllers/SeriesController.cs +++ b/API/Controllers/SeriesController.cs @@ -1,5 +1,4 @@ using System.Collections.Generic; -using System.Linq; using System.Threading.Tasks; using API.DTOs; using API.Entities; diff --git a/API/Controllers/SettingsController.cs b/API/Controllers/SettingsController.cs index 2e0f8f57f..eecece06c 100644 --- a/API/Controllers/SettingsController.cs +++ b/API/Controllers/SettingsController.cs @@ -1,7 +1,6 @@ using System.Collections.Generic; using System.IO; using System.Threading.Tasks; -using API.Data; using API.DTOs; using API.Entities; using API.Extensions; @@ -16,18 +15,13 @@ namespace API.Controllers [Authorize] public class SettingsController : BaseApiController { - private readonly DataContext _dataContext; private readonly ILogger _logger; private readonly IUnitOfWork _unitOfWork; - private readonly ITaskScheduler _taskScheduler; - public SettingsController(DataContext dataContext, ILogger logger, IUnitOfWork unitOfWork, - ITaskScheduler taskScheduler) + public SettingsController(ILogger logger, IUnitOfWork unitOfWork) { - _dataContext = dataContext; _logger = logger; _unitOfWork = unitOfWork; - _taskScheduler = taskScheduler; } [HttpGet("")] diff --git a/API/Data/DataContext.cs b/API/Data/DataContext.cs index b5dd4710d..6aea9a959 100644 --- a/API/Data/DataContext.cs +++ b/API/Data/DataContext.cs @@ -33,10 +33,6 @@ namespace API.Data { base.OnModelCreating(builder); - // builder.Entity() - // .HasAlternateKey(s => s.Key) - // .HasName("AlternateKey_Key"); - builder.Entity() .HasMany(ur => ur.UserRoles) .WithOne(u => u.User) diff --git a/API/Data/Seed.cs b/API/Data/Seed.cs index 9b4a49e6b..c7a216215 100644 --- a/API/Data/Seed.cs +++ b/API/Data/Seed.cs @@ -5,7 +5,6 @@ using API.Constants; using API.Entities; using API.Services; using Microsoft.AspNetCore.Identity; -using Microsoft.EntityFrameworkCore; namespace API.Data { diff --git a/API/Data/SeriesRepository.cs b/API/Data/SeriesRepository.cs index b188f232c..e682648a6 100644 --- a/API/Data/SeriesRepository.cs +++ b/API/Data/SeriesRepository.cs @@ -137,8 +137,6 @@ namespace API.Data var volumeList = new List() {volume}; await AddVolumeModifiers(userId, volumeList); - //TODO: volumeList[0].Files = volumeList[0].Files.OrderBy(f => f.Chapter).ToList(); - return volumeList[0]; } @@ -197,8 +195,6 @@ namespace API.Data } return chapterIds.ToArray(); - - //return series.Select(s => s.Volumes).Select(v => v.Select(v => v.Chapters)).Select(c => c.Id); } private async Task AddSeriesModifiers(int userId, List series) diff --git a/API/Entities/ServerSetting.cs b/API/Entities/ServerSetting.cs index a851f834b..148286cdf 100644 --- a/API/Entities/ServerSetting.cs +++ b/API/Entities/ServerSetting.cs @@ -1,6 +1,5 @@ using System.ComponentModel.DataAnnotations; using API.Entities.Interfaces; -using Microsoft.EntityFrameworkCore; namespace API.Entities { diff --git a/API/Extensions/DirectoryInfoExtensions.cs b/API/Extensions/DirectoryInfoExtensions.cs index 2e37057da..e7f65dc51 100644 --- a/API/Extensions/DirectoryInfoExtensions.cs +++ b/API/Extensions/DirectoryInfoExtensions.cs @@ -1,6 +1,4 @@ -using System; -using System.Diagnostics; -using System.IO; +using System.IO; namespace API.Extensions { diff --git a/API/Interfaces/IDirectoryService.cs b/API/Interfaces/IDirectoryService.cs index a004ac6e2..539a4c0f6 100644 --- a/API/Interfaces/IDirectoryService.cs +++ b/API/Interfaces/IDirectoryService.cs @@ -14,6 +14,12 @@ namespace API.Interfaces IEnumerable ListDirectory(string rootPath); Task ReadImageAsync(string imagePath); - string[] GetFiles(string path); // TODO: Refactor. This is currently for CacheServiceTest mocking + /// + /// Gets files in a directory. If searchPatternExpression is passed, will match the regex against for filtering. + /// + /// + /// + /// + string[] GetFiles(string path, string searchPatternExpression = ""); } } \ No newline at end of file diff --git a/API/Interfaces/IScannerService.cs b/API/Interfaces/IScannerService.cs index 8d4399eb7..87274e88b 100644 --- a/API/Interfaces/IScannerService.cs +++ b/API/Interfaces/IScannerService.cs @@ -1,7 +1,4 @@ -using System.Threading.Tasks; -using API.DTOs; - -namespace API.Interfaces +namespace API.Interfaces { public interface IScannerService { diff --git a/API/Interfaces/ISeriesRepository.cs b/API/Interfaces/ISeriesRepository.cs index 86f3c3387..6b11ecb8f 100644 --- a/API/Interfaces/ISeriesRepository.cs +++ b/API/Interfaces/ISeriesRepository.cs @@ -16,16 +16,12 @@ namespace API.Interfaces Task> GetVolumesDtoAsync(int seriesId, int userId); IEnumerable GetVolumes(int seriesId); Task GetSeriesDtoByIdAsync(int seriesId, int userId); - Task GetVolumeAsync(int volumeId); Task GetVolumeDtoAsync(int volumeId, int userId); - Task> GetVolumesForSeriesAsync(int[] seriesIds); Task DeleteSeriesAsync(int seriesId); Task GetVolumeByIdAsync(int volumeId); Task GetSeriesByIdAsync(int seriesId); - - //Task GetVolumeMangaFileDtos(int volumeId); Task GetChapterIdsForSeriesAsync(int[] seriesIds); } } \ No newline at end of file diff --git a/API/Program.cs b/API/Program.cs index 21d37e064..129fbcdc2 100644 --- a/API/Program.cs +++ b/API/Program.cs @@ -44,11 +44,6 @@ namespace API private static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) - // .ConfigureLogging(logging => - // { - // logging.ClearProviders(); - // logging.AddConsole(); - // }) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup(); diff --git a/API/Services/CacheService.cs b/API/Services/CacheService.cs index 692be4266..1092c57c1 100644 --- a/API/Services/CacheService.cs +++ b/API/Services/CacheService.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading.Tasks; @@ -110,8 +109,7 @@ namespace API.Services if (page < (mangaFile.NumberOfPages + pagesSoFar)) { var path = GetCachePath(chapter.Id); - // TODO: GetFiles should only get image files. - var files = _directoryService.GetFiles(path); + var files = _directoryService.GetFiles(path, Parser.Parser.ImageFileExtensions); Array.Sort(files, _numericComparer); return (files.ElementAt(page - pagesSoFar), mangaFile); diff --git a/API/Services/DirectoryService.cs b/API/Services/DirectoryService.cs index c93485821..96853914f 100644 --- a/API/Services/DirectoryService.cs +++ b/API/Services/DirectoryService.cs @@ -40,8 +40,13 @@ namespace API.Services reSearchPattern.IsMatch(Path.GetExtension(file))); } - public string[] GetFiles(string path) + public string[] GetFiles(string path, string searchPatternExpression = "") { + if (searchPatternExpression != string.Empty) + { + return GetFilesWithCertainExtensions(path, searchPatternExpression).ToArray(); + } + return !Directory.Exists(path) ? Array.Empty() : Directory.GetFiles(path); } diff --git a/API/Services/TaskScheduler.cs b/API/Services/TaskScheduler.cs index 12b1f2f60..0c2a143df 100644 --- a/API/Services/TaskScheduler.cs +++ b/API/Services/TaskScheduler.cs @@ -1,5 +1,4 @@ -using System; -using System.Threading.Tasks; +using System.Threading.Tasks; using API.Entities; using API.Helpers.Converters; using API.Interfaces; @@ -13,7 +12,6 @@ namespace API.Services private readonly ICacheService _cacheService; private readonly ILogger _logger; private readonly IScannerService _scannerService; - private readonly IUnitOfWork _unitOfWork; public BackgroundJobServer Client => new BackgroundJobServer(); public TaskScheduler(ICacheService cacheService, ILogger logger, IScannerService scannerService, IUnitOfWork unitOfWork) @@ -21,10 +19,9 @@ namespace API.Services _cacheService = cacheService; _logger = logger; _scannerService = scannerService; - _unitOfWork = unitOfWork; _logger.LogInformation("Scheduling/Updating cache cleanup on a daily basis."); - var setting = Task.Run(() => _unitOfWork.SettingsRepository.GetSettingAsync(ServerSettingKey.TaskScan)).Result; + var setting = Task.Run(() => unitOfWork.SettingsRepository.GetSettingAsync(ServerSettingKey.TaskScan)).Result; if (setting != null) { RecurringJob.AddOrUpdate(() => _scannerService.ScanLibraries(), () => CronConverter.ConvertToCronNotation(setting.Value)); From e9dfc1bda050d2b1f29938327b481c0e6a9a62c3 Mon Sep 17 00:00:00 2001 From: Joseph Milazzo Date: Thu, 4 Feb 2021 17:39:24 -0600 Subject: [PATCH 16/16] Fixed a bug in IsImage and IsArchive where I was using a contains instead of matching the regex. --- API.Tests/Services/CacheServiceTests.cs | 12 ++++++------ API/Parser/Parser.cs | 7 +++++-- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/API.Tests/Services/CacheServiceTests.cs b/API.Tests/Services/CacheServiceTests.cs index 4e10cf836..80ee0438e 100644 --- a/API.Tests/Services/CacheServiceTests.cs +++ b/API.Tests/Services/CacheServiceTests.cs @@ -8,15 +8,15 @@ namespace API.Tests.Services { public class CacheServiceTests { - private readonly CacheService _cacheService; - private readonly ILogger _logger = Substitute.For>(); - private readonly IUnitOfWork _unitOfWork = Substitute.For(); - private readonly IArchiveService _archiveService = Substitute.For(); - private readonly IDirectoryService _directoryService = Substitute.For(); + // private readonly CacheService _cacheService; + // private readonly ILogger _logger = Substitute.For>(); + // private readonly IUnitOfWork _unitOfWork = Substitute.For(); + // private readonly IArchiveService _archiveService = Substitute.For(); + // private readonly IDirectoryService _directoryService = Substitute.For(); public CacheServiceTests() { - _cacheService = new CacheService(_logger, _unitOfWork, _archiveService, _directoryService); + //_cacheService = new CacheService(_logger, _unitOfWork, _archiveService, _directoryService); } //string GetCachedPagePath(Volume volume, int page) diff --git a/API/Parser/Parser.cs b/API/Parser/Parser.cs index 33bf67978..dc59d3b5c 100644 --- a/API/Parser/Parser.cs +++ b/API/Parser/Parser.cs @@ -1,6 +1,7 @@ using System; using System.IO; using System.Linq; +using System.Reflection; using System.Text.RegularExpressions; using API.Entities; @@ -10,6 +11,8 @@ namespace API.Parser { public static readonly string MangaFileExtensions = @"\.cbz|\.zip"; // |\.rar|\.cbr public static readonly string ImageFileExtensions = @"\.png|\.jpeg|\.jpg|\.gif"; + private static readonly Regex ImageRegex = new Regex(ImageFileExtensions, RegexOptions.IgnoreCase | RegexOptions.Compiled); + private static readonly Regex MangaFileRegex = new Regex(MangaFileExtensions, RegexOptions.IgnoreCase | RegexOptions.Compiled); //?: is a non-capturing group in C#, else anything in () will be a group private static readonly Regex[] MangaVolumeRegex = new[] @@ -388,13 +391,13 @@ namespace API.Parser public static bool IsArchive(string filePath) { var fileInfo = new FileInfo(filePath); - return MangaFileExtensions.Contains(fileInfo.Extension); + return MangaFileRegex.IsMatch(fileInfo.Extension); } public static bool IsImage(string filePath) { var fileInfo = new FileInfo(filePath); - return ImageFileExtensions.Contains(fileInfo.Extension); + return ImageRegex.IsMatch(fileInfo.Extension); } public static int MinimumNumberFromRange(string range)