From 555afefd3250cf129ee3310bfd5f3e1c8e7482bc Mon Sep 17 00:00:00 2001 From: Alina Batylkina Date: Mon, 19 Jun 2023 08:12:18 +0300 Subject: [PATCH] report is completed --- .../BusinessLogics/ManagerLogic.cs | 20 +++- .../BusinessLogics/ReportLogic.cs | 103 +++++++++++++----- .../CanteenBusinessLogic.csproj | 3 +- .../MailWorker/AbstractMailWorker.cs | 58 ++++++++++ .../MailWorker/MailKitWorker.cs | 42 +++++++ .../OfficePackage/AbstractSaveToExcel.cs | 2 +- .../OfficePackage/AbstractSaveToPdf.cs | 44 +++++++- .../OfficePackage/AbstractSaveToWord.cs | 69 +++++++++++- .../OfficePackage/HelperModels/ExcelInfo.cs | 2 +- .../OfficePackage/HelperModels/PdfInfo.cs | 4 +- .../OfficePackage/HelperModels/WordInfo.cs | 2 +- .../BindingModels/MailConfigBindingModel.cs | 12 ++ .../BindingModels/MailSendInfoBindingModel.cs | 11 ++ .../BindingModels/ReportBindingModel.cs | 6 +- .../BusinessLogicsContracts/ILunchLogic.cs | 1 + .../BusinessLogicsContracts/IManagerLogic.cs | 1 + .../BusinessLogicsContracts/IReportLogic.cs | 3 +- .../ViewModels/ReportCooksPCView.cs | 16 +++ .../CanteenDatabase.cs | 2 +- .../Implements/CookStorage.cs | 2 +- .../Implements/LunchStorage.cs | 2 +- .../Controllers/HomeController.cs | 20 +++- .../Views/Home/Report.cshtml | 45 +++++--- .../Controllers/MainController.cs | 52 ++++++--- .../Controllers/ManagerController.cs | 27 ++++- Canteen/CanteenRestApi/Cook.docx | Bin 1454 -> 0 bytes Canteen/CanteenRestApi/Cook.docx.xlsx.xls | Bin 3056 -> 0 bytes Canteen/CanteenRestApi/Cook.xlsx | Bin 3139 -> 0 bytes Canteen/CanteenRestApi/Order.xlsx | Bin 3329 -> 0 bytes Canteen/CanteenRestApi/Program.cs | 14 +++ Canteen/CanteenRestApi/Report.docx | Bin 1284 -> 0 bytes Canteen/CanteenRestApi/Report.xlsx | Bin 2926 -> 3034 bytes Canteen/CanteenRestApi/appsettings.json | 8 +- Canteen/CanteenRestApi/eport | Bin 2874 -> 0 bytes Canteen/CanteenRestApi/pdfReport.pdf | Bin 52100 -> 0 bytes Canteen/CanteenRestApi/report | Bin 1284 -> 0 bytes .../Controllers/HomeController.cs | 32 +++++- .../Views/Home/LunchComplete.cshtml | 25 +++++ .../Views/Home/Lunches.cshtml | 1 + .../Views/Home/UpdateLunch.cshtml | 2 +- 40 files changed, 541 insertions(+), 90 deletions(-) create mode 100644 Canteen/CanteenBusinessLogic/MailWorker/AbstractMailWorker.cs create mode 100644 Canteen/CanteenBusinessLogic/MailWorker/MailKitWorker.cs create mode 100644 Canteen/CanteenContracts/BindingModels/MailConfigBindingModel.cs create mode 100644 Canteen/CanteenContracts/BindingModels/MailSendInfoBindingModel.cs create mode 100644 Canteen/CanteenContracts/ViewModels/ReportCooksPCView.cs delete mode 100644 Canteen/CanteenRestApi/Cook.docx delete mode 100644 Canteen/CanteenRestApi/Cook.docx.xlsx.xls delete mode 100644 Canteen/CanteenRestApi/Cook.xlsx delete mode 100644 Canteen/CanteenRestApi/Order.xlsx delete mode 100644 Canteen/CanteenRestApi/Report.docx delete mode 100644 Canteen/CanteenRestApi/eport delete mode 100644 Canteen/CanteenRestApi/pdfReport.pdf delete mode 100644 Canteen/CanteenRestApi/report create mode 100644 Canteen/CanteenVisitorApp/Views/Home/LunchComplete.cshtml diff --git a/Canteen/CanteenBusinessLogic/BusinessLogics/ManagerLogic.cs b/Canteen/CanteenBusinessLogic/BusinessLogics/ManagerLogic.cs index 7d484ee..79b601a 100644 --- a/Canteen/CanteenBusinessLogic/BusinessLogics/ManagerLogic.cs +++ b/Canteen/CanteenBusinessLogic/BusinessLogics/ManagerLogic.cs @@ -1,4 +1,5 @@ -using CanteenContracts.BindingModels; +using CanteenBusinessLogic.MailWorker; +using CanteenContracts.BindingModels; using CanteenContracts.BusinessLogicsContracts; using CanteenContracts.SearchModel; using CanteenContracts.StoragesContracts; @@ -16,11 +17,13 @@ namespace CanteenBusinessLogic.BusinessLogics { private readonly ILogger _logger; private readonly IManagerStorage _managerStorage; + private readonly AbstractMailWorker _mailWorker; - public ManagerLogic(ILogger logger, IManagerStorage managerStorage) + public ManagerLogic(ILogger logger, IManagerStorage managerStorage, AbstractMailWorker mailWorker) { _logger = logger; _managerStorage = managerStorage; + _mailWorker = mailWorker; } public bool Create(ManagerBindingModel model) @@ -85,6 +88,18 @@ namespace CanteenBusinessLogic.BusinessLogics return list; } + public bool SendMail(MailSendInfoBindingModel emailInfo) + { + _mailWorker.MailSendAsync(new() + { + MailAddress = emailInfo.MailAddress, + Subject = emailInfo.Subject, + Path = emailInfo.Path, + }); + + return true; + } + public bool Update(ManagerBindingModel model) { CheckModel(model); @@ -137,5 +152,6 @@ namespace CanteenBusinessLogic.BusinessLogics throw new InvalidOperationException("Такой менеджер уже есть"); } } + } } diff --git a/Canteen/CanteenBusinessLogic/BusinessLogics/ReportLogic.cs b/Canteen/CanteenBusinessLogic/BusinessLogics/ReportLogic.cs index 9120ded..0cf8bfe 100644 --- a/Canteen/CanteenBusinessLogic/BusinessLogics/ReportLogic.cs +++ b/Canteen/CanteenBusinessLogic/BusinessLogics/ReportLogic.cs @@ -7,6 +7,9 @@ using CanteenContracts.StoragesContracts; using CanteenContracts.View; using CanteenContracts.ViewModels; using DocumentFormat.OpenXml.Bibliography; +using DocumentFormat.OpenXml.Drawing.Charts; +using DocumentFormat.OpenXml.Presentation; +using DocumentFormat.OpenXml.Wordprocessing; using System.Linq; namespace CanteenBusinessLogic.BusinessLogics @@ -79,29 +82,57 @@ namespace CanteenBusinessLogic.BusinessLogics return list; } - - - public void saveLunchesToPdfFile(ReportBindingModel model) + public List GetCooksPCView(ReportBindingModel model) { - saveToPdf.CreateDoc(new PdfInfo + var list = new List(); + + var cooks = cookStorage.GetFilteredList(new CookSearchModel { - FileName = model.FileName, - Title = "Список заказов", - DateAfter = model.DateAfter.Value, - DateBefore = model.DateBefore.Value, - Lunches = GetLunchesPCView(model) + ManagerId = model.UserId }); + + var lunches = lunchStorage.GetFilteredList(new LunchSearchModel + { + DateFrom = model.DateBefore, + DateTo = model.DateAfter, + }); + + foreach (var cook in cooks) + { + var record = new ReportCooksPCView + { + CookId = cook.Id, + FIO = cook.FIO, + Lunches = new List() + }; + + foreach (var lunch in lunches) + { + foreach(var order in lunch.LunchOrders) + { + var findOrder = orderStorage.GetElement(new OrderSearchModel { Id = order.Key }); + if (findOrder.OrderCooks.ContainsKey(cook.Id)) + { + record.Lunches.Add(lunch); + break; + } + } + } + + list.Add(record); + } + + return list; } - public List GetCooksByLanches(ReportBindingModel model) + public List GetCooksByLunches(ReportBindingModel model) { var list = new List(); var lunches = lunchStorage.GetFilteredList(new LunchSearchModel { - DateFrom = (DateTime)model.DateAfter, - DateTo = model.DateBefore, VisitorId = model.UserId - }); + }).Where(x => model.LunchId.Contains(x.Id)).ToList(); + foreach (var lunch in lunches) { @@ -130,7 +161,6 @@ namespace CanteenBusinessLogic.BusinessLogics } return list; } - private List GetOrdersByProducts(ReportBindingModel model) { var list = new List(); @@ -138,7 +168,7 @@ namespace CanteenBusinessLogic.BusinessLogics var products = productStorage.GetFilteredList(new ProductSearchModel { ManagerId = model.UserId - }); + }).Where(x => model.ProductId.Contains(x.Id)); foreach (var product in products) { @@ -160,38 +190,55 @@ namespace CanteenBusinessLogic.BusinessLogics } return list; } + public void saveLunchesToPdfFile(ReportBindingModel model) + { + saveToPdf.CreateLunchDoc(new PdfInfo + { + Title = "Список обедов", + DateAfter = model.DateAfter.Value, + DateBefore = model.DateBefore.Value, + Lunches = GetLunchesPCView(model) + }); + } + public void saveCooksToPdfFile(ReportBindingModel model) + { + saveToPdf.CreateCookDoc(new PdfInfo + { + Title = "Список поваров", + DateAfter = model.DateAfter.Value, + DateBefore = model.DateBefore.Value, + FileName = (model.FileName != null) ? model.FileName : $"C:\\PdfReports\\{DateTime.Now.ToString("HH.mm.ss_dd.MM.yyyy")}.pdf", + Cooks = GetCooksPCView(model) + }); + } public void saveCooksToExcel(ReportBindingModel model) { saveToExcel.CreateCooksReport(new ExcelInfo() { - FileName = model.FileName, Title = "Список поваров:", - Cooks = GetCooksByLanches(model) - }); - } - public void saveCooksToWord(ReportBindingModel model) - { - saveToWord.CreateCooksDoc(new WordInfo() - { - FileName = model.FileName, - Title = "Список поваров", - Cooks = GetCooksByLanches(model) + Cooks = GetCooksByLunches(model) }); } public void saveOrdersToExcel(ReportBindingModel model) { saveToExcel.CreateOrdersReport(new ExcelInfo() { - FileName = model.FileName, Title = "Список заказов:", Orders = GetOrdersByProducts(model) }); } + public void saveCooksToWord(ReportBindingModel model) + { + saveToWord.CreateCooksDoc(new WordInfo() + { + Title = "Список поваров", + Cooks = GetCooksByLunches(model) + }); + } public void saveOrdersToWord(ReportBindingModel model) { saveToWord.CreateOrdersDoc(new WordInfo() { - FileName = model.FileName, Title = "Список заказов", Orders = GetOrdersByProducts(model) }); diff --git a/Canteen/CanteenBusinessLogic/CanteenBusinessLogic.csproj b/Canteen/CanteenBusinessLogic/CanteenBusinessLogic.csproj index c48e2ea..a7884b7 100644 --- a/Canteen/CanteenBusinessLogic/CanteenBusinessLogic.csproj +++ b/Canteen/CanteenBusinessLogic/CanteenBusinessLogic.csproj @@ -1,4 +1,4 @@ - + net6.0 @@ -9,6 +9,7 @@ + diff --git a/Canteen/CanteenBusinessLogic/MailWorker/AbstractMailWorker.cs b/Canteen/CanteenBusinessLogic/MailWorker/AbstractMailWorker.cs new file mode 100644 index 0000000..4eeb391 --- /dev/null +++ b/Canteen/CanteenBusinessLogic/MailWorker/AbstractMailWorker.cs @@ -0,0 +1,58 @@ +using CanteenContracts.BindingModels; +using CanteenContracts.BusinessLogicsContracts; +using Microsoft.Extensions.Logging; + +namespace CanteenBusinessLogic.MailWorker +{ + public abstract class AbstractMailWorker + { + protected string _mailLogin = string.Empty; + protected string _mailPassword = string.Empty; + protected string _smtpClientHost = string.Empty; + protected int _smtpClientPort; + protected string _popHost = string.Empty; + protected int _popPort; + + private readonly ILogger _logger; + + public AbstractMailWorker(ILogger logger) + { + _logger = logger; + } + + public void MailConfig(MailConfigBindingModel config) + { + _mailLogin = config.MailLogin; + _mailPassword = config.MailPassword; + _smtpClientHost = config.SmtpClientHost; + _smtpClientPort = config.SmtpClientPort; + _popHost = config.PopHost; + _popPort = config.PopPort; + + _logger.LogDebug("Config: {login}, {password}, {clientHost},{ clientPOrt}, { popHost}, { popPort}", _mailLogin, _mailPassword, _smtpClientHost, _smtpClientPort, _popHost, _popPort); + } + + public async void MailSendAsync(MailSendInfoBindingModel info) + { + if (string.IsNullOrEmpty(_mailLogin) || string.IsNullOrEmpty(_mailPassword)) + { + return; + } + + if (string.IsNullOrEmpty(_smtpClientHost) || _smtpClientPort == 0) + { + return; + } + + if (string.IsNullOrEmpty(info.MailAddress) || string.IsNullOrEmpty(info.Subject) || string.IsNullOrEmpty(info.Path)) + { + return; + } + + _logger.LogDebug("Send Mail: {To}, {Subject}", info.MailAddress, info.Subject); + + await SendMailAsync(info); + } + protected abstract Task SendMailAsync(MailSendInfoBindingModel info); + } +} diff --git a/Canteen/CanteenBusinessLogic/MailWorker/MailKitWorker.cs b/Canteen/CanteenBusinessLogic/MailWorker/MailKitWorker.cs new file mode 100644 index 0000000..7ce7d52 --- /dev/null +++ b/Canteen/CanteenBusinessLogic/MailWorker/MailKitWorker.cs @@ -0,0 +1,42 @@ +using CanteenContracts.BindingModels; +using CanteenContracts.BusinessLogicsContracts; +using MailKit.Net.Pop3; +using MailKit.Security; +using Microsoft.Extensions.Logging; +using System.Net.Mail; +using System.Net; +using System.Text; + +namespace CanteenBusinessLogic.MailWorker +{ + public class MailKitWorker : AbstractMailWorker + { + public MailKitWorker(ILogger logger) : base(logger) { } + + protected override async Task SendMailAsync(MailSendInfoBindingModel info) + { + using var objMailMessage = new MailMessage(); + using var objSmtpClient = new SmtpClient(_smtpClientHost, _smtpClientPort); + + try + { + objMailMessage.From = new MailAddress(_mailLogin); + objMailMessage.To.Add(new MailAddress(info.MailAddress)); + objMailMessage.Subject = info.Subject; + objMailMessage.Attachments.Add(new Attachment(info.Path)); + objMailMessage.SubjectEncoding = Encoding.UTF8; + objMailMessage.BodyEncoding = Encoding.UTF8; + objSmtpClient.UseDefaultCredentials = false; + objSmtpClient.EnableSsl = true; + objSmtpClient.DeliveryMethod = SmtpDeliveryMethod.Network; + objSmtpClient.Credentials = new NetworkCredential(_mailLogin, _mailPassword); + + await Task.Run(() => objSmtpClient.Send(objMailMessage)); + } + catch (Exception) + { + throw; + } + } + } +} diff --git a/Canteen/CanteenBusinessLogic/OfficePackage/AbstractSaveToExcel.cs b/Canteen/CanteenBusinessLogic/OfficePackage/AbstractSaveToExcel.cs index d6d6ad4..de7adda 100644 --- a/Canteen/CanteenBusinessLogic/OfficePackage/AbstractSaveToExcel.cs +++ b/Canteen/CanteenBusinessLogic/OfficePackage/AbstractSaveToExcel.cs @@ -100,7 +100,7 @@ namespace CanteenBusinessLogic.OfficePackage { ColumnName = "A", RowIndex = rowIndex, - Text = $"Продукт: {orderView.Product.ProductName}, {orderView.Product.Price}", + Text = $"Продукт: Id: {orderView.Product.Id}. {orderView.Product.ProductName}, {orderView.Product.Price}", StyleInfo = ExcelStyleInfoType.TextWithBroder }); MergeCells(new ExcelMergeParameters diff --git a/Canteen/CanteenBusinessLogic/OfficePackage/AbstractSaveToPdf.cs b/Canteen/CanteenBusinessLogic/OfficePackage/AbstractSaveToPdf.cs index 8b74997..40dff6c 100644 --- a/Canteen/CanteenBusinessLogic/OfficePackage/AbstractSaveToPdf.cs +++ b/Canteen/CanteenBusinessLogic/OfficePackage/AbstractSaveToPdf.cs @@ -5,12 +5,13 @@ using System.Text; using System.Threading.Tasks; using CanteenBusinessLogic.OfficePackage.HelperEnums; using CanteenBusinessLogic.OfficePackage.HelperModels; +using CanteenContracts.ViewModels; namespace CanteenBusinessLogic.OfficePackage { public abstract class AbstractSaveToPdf { - public void CreateDoc(PdfInfo info) + public void CreateLunchDoc(PdfInfo info) { CreatePdf(info); CreateParagraph(new PdfParagraph @@ -62,6 +63,47 @@ namespace CanteenBusinessLogic.OfficePackage } SavePdf(info); } + public void CreateCookDoc(PdfInfo info) + { + CreatePdf(info); + CreateParagraph(new PdfParagraph + { + Text = info.Title, + Style = "NormalTitle" + }); + CreateParagraph(new PdfParagraph + { + Text = $"с {info.DateAfter.ToShortDateString()} по {info.DateBefore.ToShortDateString()}", + Style = "Normal" + }); + CreateTable(new List { "2cm", "3cm", "2cm", "2cm", "2cm" }); + CreateRow(new PdfRowParameters + { + Texts = new List { "Id повара", "ФИО повара", "Id обеда", "Дата начала обеда", "Дата окончания обеда" }, + Style = "NormalTitle", + ParagraphAlignment = PdfParagraphAlignmentType.Center + }); + foreach (var cook in info.Cooks) + { + CreateRow(new PdfRowParameters + { + Texts = new List { cook.CookId.ToString(), cook.FIO.ToString(), "", "", "" }, + Style = "Normal", + ParagraphAlignment = PdfParagraphAlignmentType.Left + }); + + foreach (var lunch in cook.Lunches) + { + CreateRow(new PdfRowParameters + { + Texts = new List { "", "", lunch.Id.ToString(), lunch.DateCreate.ToShortDateString(), lunch.DateImplement?.ToShortDateString() }, + Style = "Normal", + ParagraphAlignment = PdfParagraphAlignmentType.Left + }); + } + } + SavePdf(info); + } protected abstract void CreatePdf(PdfInfo info); protected abstract void CreateParagraph(PdfParagraph paragraph); protected abstract void CreateTable(List columns); diff --git a/Canteen/CanteenBusinessLogic/OfficePackage/AbstractSaveToWord.cs b/Canteen/CanteenBusinessLogic/OfficePackage/AbstractSaveToWord.cs index dcdd8fc..9089ee6 100644 --- a/Canteen/CanteenBusinessLogic/OfficePackage/AbstractSaveToWord.cs +++ b/Canteen/CanteenBusinessLogic/OfficePackage/AbstractSaveToWord.cs @@ -5,6 +5,7 @@ using System.Text; using System.Threading.Tasks; using CanteenBusinessLogic.OfficePackage.HelperEnums; using CanteenBusinessLogic.OfficePackage.HelperModels; +using DocumentFormat.OpenXml.EMMA; namespace CanteenBusinessLogic.OfficePackage { @@ -73,14 +74,72 @@ namespace CanteenBusinessLogic.OfficePackage SaveWord(info); } + public void CreateOrdersDoc(WordInfo info) + { + CreateWord(info); + CreateParagraph(new WordParagraph + { + Texts = new List<(string, WordTextProperties)> { (info.Title, new WordTextProperties { Bold = true, Size = "24" }) }, + TextProperties = new WordTextProperties + { + Size = "24", + JustificationType = WordJustificationType.Center + } + }); + foreach (var reportOrderView in info.Orders) + { + CreateParagraph(new WordParagraph + { + Texts = new List<(string, WordTextProperties)> + { + ("Продукт: ", new WordTextProperties { Bold = true, Size = "24" }), + (reportOrderView.Product.Id.ToString(), new WordTextProperties { Bold = false, Size = "24" }), + ("Название: ", new WordTextProperties { Bold = true, Size = "24" }), + (reportOrderView.Product.ProductName.ToString(), new WordTextProperties { Bold = false, Size = "24" }) + }, + TextProperties = new WordTextProperties + { + Size = "24", + JustificationType = WordJustificationType.Both + } + }); + + CreateParagraph(new WordParagraph + { + Texts = new List<(string, WordTextProperties)> + { + ("Заказы: ", new WordTextProperties { Bold = true, Size = "24" }) + }, + TextProperties = new WordTextProperties + { + Size = "24", + JustificationType = WordJustificationType.Both + } + }); + + foreach (var order in reportOrderView.Orders) + { + CreateParagraph(new WordParagraph + { + Texts = new List<(string, WordTextProperties)> + { + ("Заказ: ", new WordTextProperties { Bold = false, Size = "24" }), + (order.Id.ToString(), new WordTextProperties { Bold = false, Size = "24" }) + }, + TextProperties = new WordTextProperties + { + Size = "24", + JustificationType = WordJustificationType.Both + } + }); + } + } + + SaveWord(info); + } protected abstract void CreateWord(WordInfo info); protected abstract void CreateParagraph(WordParagraph paragraph); protected abstract void SaveWord(WordInfo info); - - internal void CreateOrdersDoc(WordInfo wordInfo) - { - throw new NotImplementedException(); - } } } diff --git a/Canteen/CanteenBusinessLogic/OfficePackage/HelperModels/ExcelInfo.cs b/Canteen/CanteenBusinessLogic/OfficePackage/HelperModels/ExcelInfo.cs index 0d43e45..e8985bf 100644 --- a/Canteen/CanteenBusinessLogic/OfficePackage/HelperModels/ExcelInfo.cs +++ b/Canteen/CanteenBusinessLogic/OfficePackage/HelperModels/ExcelInfo.cs @@ -10,7 +10,7 @@ namespace CanteenBusinessLogic.OfficePackage.HelperModels { public class ExcelInfo { - public string FileName { get; set; } + public string FileName = $"C:\\XlsxReports\\{DateTime.Now.ToString("HH.mm.ss_dd.MM.yyyy")}.xlsx"; public string Title { get; set; } public List Cooks { get; set; } public List Orders { get; set; } diff --git a/Canteen/CanteenBusinessLogic/OfficePackage/HelperModels/PdfInfo.cs b/Canteen/CanteenBusinessLogic/OfficePackage/HelperModels/PdfInfo.cs index c224714..08c84ad 100644 --- a/Canteen/CanteenBusinessLogic/OfficePackage/HelperModels/PdfInfo.cs +++ b/Canteen/CanteenBusinessLogic/OfficePackage/HelperModels/PdfInfo.cs @@ -9,11 +9,11 @@ namespace CanteenBusinessLogic.OfficePackage.HelperModels { public class PdfInfo { - public string FileName { get; set; } - public string FilePath = "C:\\Reports"; + public string FileName = $"C:\\PdfReports\\{DateTime.Now.ToString("HH.mm.ss_dd.MM.yyyy")}.pdf"; public string Title { get; set; } public DateTime DateAfter { get; set; } public DateTime DateBefore { get; set; } public List Lunches { get; set; } + public List Cooks { get; set; } } } diff --git a/Canteen/CanteenBusinessLogic/OfficePackage/HelperModels/WordInfo.cs b/Canteen/CanteenBusinessLogic/OfficePackage/HelperModels/WordInfo.cs index 67a6189..2d8e8d7 100644 --- a/Canteen/CanteenBusinessLogic/OfficePackage/HelperModels/WordInfo.cs +++ b/Canteen/CanteenBusinessLogic/OfficePackage/HelperModels/WordInfo.cs @@ -10,7 +10,7 @@ namespace CanteenBusinessLogic.OfficePackage.HelperModels { public class WordInfo { - public string FileName { get; set; } + public string FileName = $"C:\\WordReports\\{DateTime.Now.ToString("HH.mm.ss_dd.MM.yyyy")}.docx"; public string Title { get; set; } public List Cooks { get; set; } public List Orders { get; set; } diff --git a/Canteen/CanteenContracts/BindingModels/MailConfigBindingModel.cs b/Canteen/CanteenContracts/BindingModels/MailConfigBindingModel.cs new file mode 100644 index 0000000..9344b97 --- /dev/null +++ b/Canteen/CanteenContracts/BindingModels/MailConfigBindingModel.cs @@ -0,0 +1,12 @@ +namespace CanteenContracts.BindingModels +{ + public class MailConfigBindingModel + { + public string MailLogin { get; set; } = string.Empty; + public string MailPassword { get; set; } = string.Empty; + public string SmtpClientHost { get; set; } = string.Empty; + public int SmtpClientPort { get; set; } + public string PopHost { get; set; } = string.Empty; + public int PopPort { get; set; } + } +} diff --git a/Canteen/CanteenContracts/BindingModels/MailSendInfoBindingModel.cs b/Canteen/CanteenContracts/BindingModels/MailSendInfoBindingModel.cs new file mode 100644 index 0000000..f635711 --- /dev/null +++ b/Canteen/CanteenContracts/BindingModels/MailSendInfoBindingModel.cs @@ -0,0 +1,11 @@ +namespace CanteenContracts.BindingModels +{ + public class MailSendInfoBindingModel + { + public string MailAddress { get; set; } = string.Empty; + public string Subject { get; set; } = string.Empty; + public string Text { get; set; } = string.Empty; + public string Path { get; set; } = string.Empty; + public ReportBindingModel report { get; set; } + } +} diff --git a/Canteen/CanteenContracts/BindingModels/ReportBindingModel.cs b/Canteen/CanteenContracts/BindingModels/ReportBindingModel.cs index 6470568..68b6f5d 100644 --- a/Canteen/CanteenContracts/BindingModels/ReportBindingModel.cs +++ b/Canteen/CanteenContracts/BindingModels/ReportBindingModel.cs @@ -9,11 +9,11 @@ namespace CanteenContracts.BindingModels { public class ReportBindingModel { - public string FileName { get; set; } + public string? FileName { get; set; } public DateTime? DateAfter { get; set; } public DateTime? DateBefore { get; set; } - public List? lunches { get; set; } - public List? orders { get; set; } public int UserId { get; set; } + public List? LunchId { get; set; } + public List? ProductId { get; set; } } } diff --git a/Canteen/CanteenContracts/BusinessLogicsContracts/ILunchLogic.cs b/Canteen/CanteenContracts/BusinessLogicsContracts/ILunchLogic.cs index a02f158..bb88487 100644 --- a/Canteen/CanteenContracts/BusinessLogicsContracts/ILunchLogic.cs +++ b/Canteen/CanteenContracts/BusinessLogicsContracts/ILunchLogic.cs @@ -20,5 +20,6 @@ namespace CanteenContracts.BusinessLogicsContracts bool Finish(LunchBindingModel model); bool UpdateOrders(LunchBindingModel lunch, OrderBindingModel order); bool UpdateProducts(LunchBindingModel lunch, ProductBindingModel product, int count); + } } diff --git a/Canteen/CanteenContracts/BusinessLogicsContracts/IManagerLogic.cs b/Canteen/CanteenContracts/BusinessLogicsContracts/IManagerLogic.cs index fa64bcc..8d00adf 100644 --- a/Canteen/CanteenContracts/BusinessLogicsContracts/IManagerLogic.cs +++ b/Canteen/CanteenContracts/BusinessLogicsContracts/IManagerLogic.cs @@ -15,5 +15,6 @@ namespace CanteenContracts.BusinessLogicsContracts ManagerViewModel? ReadElement(ManagerSearchModel model); bool Create(ManagerBindingModel model); bool Update(ManagerBindingModel model); + bool SendMail(MailSendInfoBindingModel emailInfo); } } diff --git a/Canteen/CanteenContracts/BusinessLogicsContracts/IReportLogic.cs b/Canteen/CanteenContracts/BusinessLogicsContracts/IReportLogic.cs index a596289..e1cbac4 100644 --- a/Canteen/CanteenContracts/BusinessLogicsContracts/IReportLogic.cs +++ b/Canteen/CanteenContracts/BusinessLogicsContracts/IReportLogic.cs @@ -11,9 +11,10 @@ namespace CanteenContracts.BusinessLogicsContracts { public interface IReportLogic { - public List GetCooksByLanches(ReportBindingModel model); + public List GetCooksByLunches(ReportBindingModel model); List GetLunchesPCView(ReportBindingModel model); void saveLunchesToPdfFile(ReportBindingModel model); + void saveCooksToPdfFile(ReportBindingModel model); void saveCooksToWord(ReportBindingModel model); void saveCooksToExcel(ReportBindingModel model); public void saveOrdersToExcel(ReportBindingModel model); diff --git a/Canteen/CanteenContracts/ViewModels/ReportCooksPCView.cs b/Canteen/CanteenContracts/ViewModels/ReportCooksPCView.cs new file mode 100644 index 0000000..02b284f --- /dev/null +++ b/Canteen/CanteenContracts/ViewModels/ReportCooksPCView.cs @@ -0,0 +1,16 @@ +using CanteenContracts.View; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CanteenContracts.ViewModels +{ + public class ReportCooksPCView + { + public int CookId{ get; set; } + public string FIO { get; set; } + public List Lunches { get; set; } + } +} diff --git a/Canteen/CanteenDatabaseImplement/CanteenDatabase.cs b/Canteen/CanteenDatabaseImplement/CanteenDatabase.cs index fc050a6..7ef45cc 100644 --- a/Canteen/CanteenDatabaseImplement/CanteenDatabase.cs +++ b/Canteen/CanteenDatabaseImplement/CanteenDatabase.cs @@ -11,7 +11,7 @@ namespace CanteenDatabaseImplement { if (optionsBuilder.IsConfigured == false) { - optionsBuilder.UseSqlServer(@"Data Source=DESKTOP-23CS6SP\SQLEXPRESS;Initial Catalog=CanteenDataBase;Integrated Security=True;MultipleActiveResultSets=True;;TrustServerCertificate=True"); + optionsBuilder.UseSqlServer(@"Data Source=MOVAVI-DESKTOP\SQLEXPRESS;Initial Catalog=CanteenDataBase;Integrated Security=True;MultipleActiveResultSets=True;;TrustServerCertificate=True"); } base.OnConfiguring(optionsBuilder); } diff --git a/Canteen/CanteenDatabaseImplement/Implements/CookStorage.cs b/Canteen/CanteenDatabaseImplement/Implements/CookStorage.cs index 089c094..dadd23d 100644 --- a/Canteen/CanteenDatabaseImplement/Implements/CookStorage.cs +++ b/Canteen/CanteenDatabaseImplement/Implements/CookStorage.cs @@ -34,7 +34,7 @@ namespace CanteenDatabaseImplement.Implements public List GetFilteredList(CookSearchModel model) { - if (!model.Id.HasValue && !model.OrderId.HasValue) + if (!model.Id.HasValue && !model.OrderId.HasValue && !model.ManagerId.HasValue) { return new(); } diff --git a/Canteen/CanteenDatabaseImplement/Implements/LunchStorage.cs b/Canteen/CanteenDatabaseImplement/Implements/LunchStorage.cs index a244d82..0957548 100644 --- a/Canteen/CanteenDatabaseImplement/Implements/LunchStorage.cs +++ b/Canteen/CanteenDatabaseImplement/Implements/LunchStorage.cs @@ -46,7 +46,7 @@ namespace CanteenDatabaseImplement.Implements } public List GetFilteredList(LunchSearchModel model) { - if (!model.VisitorId.HasValue) + if (!model.VisitorId.HasValue & !model.DateFrom.HasValue & !model.DateTo.HasValue) { return new(); } diff --git a/Canteen/CanteenManagerApp/Controllers/HomeController.cs b/Canteen/CanteenManagerApp/Controllers/HomeController.cs index b8826fe..4dead79 100644 --- a/Canteen/CanteenManagerApp/Controllers/HomeController.cs +++ b/Canteen/CanteenManagerApp/Controllers/HomeController.cs @@ -477,13 +477,14 @@ namespace CanteenManagerApp.Controllers [HttpGet] public IActionResult Report() { + ViewBag.ProductList = APIClient.GetRequest>($"api/main/getproductlist?managerId={APIClient.Manager.Id}"); return View(new ReportBindingModel()); } [HttpPost] public void ReportPdf(ReportBindingModel model) { model.UserId = APIClient.Manager.Id; - APIClient.PostRequest("api/main/SaveLunchesToPDF", model); + APIClient.PostRequest("api/main/SaveOrdersToPDF", model); Response.Redirect("Index"); } @@ -491,7 +492,7 @@ namespace CanteenManagerApp.Controllers public void ReportXsl(ReportBindingModel model) { model.UserId = APIClient.Manager.Id; - APIClient.PostRequest("api/main/SaveOrdersToXSL", model); + APIClient.PostRequest("api/main/SavevToXSL", model); Response.Redirect("Index"); } @@ -506,8 +507,19 @@ namespace CanteenManagerApp.Controllers [HttpPost] public void ReportEmail(ReportBindingModel model) { - APIClient.PostRequest("api/main/SaveEMAIL", model); - Response.Redirect("Index"); + if (APIClient.Manager == null) + { + throw new Exception("Доступ возможен только авторизованным пользователям"); + } + model.UserId = APIClient.Manager.Id; + APIClient.PostRequest($"api/manager/SendEmail", new MailSendInfoBindingModel + { + MailAddress = APIClient.Manager.Login, + Subject = "Отчет", + report = model + }); + + Response.Redirect("Report"); } } } \ No newline at end of file diff --git a/Canteen/CanteenManagerApp/Views/Home/Report.cshtml b/Canteen/CanteenManagerApp/Views/Home/Report.cshtml index f34fc8b..0cc91a2 100644 --- a/Canteen/CanteenManagerApp/Views/Home/Report.cshtml +++ b/Canteen/CanteenManagerApp/Views/Home/Report.cshtml @@ -5,27 +5,38 @@ ViewBag.Title = "Report"; } -

Generate Report

+

Отчеты

@using (Html.BeginForm("Report", "Home", FormMethod.Post)) { -
- @Html.LabelFor(m => m.FileName) - @Html.TextBoxFor(m => m.FileName) +
+

Pdf

+
+
+ @Html.LabelFor(m => m.DateBefore, "От") + @Html.TextBoxFor(m => m.DateBefore, new { type = "date", @class = "form-control" }) +
+
+ +
+
+ @Html.LabelFor(m => m.DateAfter, "До") + @Html.TextBoxFor(m => m.DateAfter, new { type = "date", @class = "form-control" }) +
+
+
+
+ +
-
- @Html.LabelFor(m => m.DateAfter) - @Html.TextBoxFor(m => m.DateAfter, new { type = "date" }) +
+

Word, Excel

+
+ @Html.LabelFor(m => m.ProductId, "Выбранные продукты") + @Html.DropDownListFor(m => m.ProductId, new SelectList(ViewBag.ProductList, "Id", "ProductName"), new { @class = "form-control", multiple = "multiple" }) +
+ +
- -
- @Html.LabelFor(m => m.DateBefore) - @Html.TextBoxFor(m => m.DateBefore, new { type = "date" }) -
- - - - - } \ No newline at end of file diff --git a/Canteen/CanteenRestApi/Controllers/MainController.cs b/Canteen/CanteenRestApi/Controllers/MainController.cs index 0b520ba..4b6ee1a 100644 --- a/Canteen/CanteenRestApi/Controllers/MainController.cs +++ b/Canteen/CanteenRestApi/Controllers/MainController.cs @@ -45,9 +45,25 @@ namespace CanteenRestApi.Controllers { DateAfter = model.DateAfter, DateBefore = model.DateBefore, - FileName = model.FileName, - UserId = model.UserId, - lunches = _lunch.ReadList(new LunchSearchModel { VisitorId = model.UserId}), + UserId = model.UserId + }); + } + catch (Exception ex) + { + _logger.LogError(ex, "Error during loading list of bouquets"); + throw; + } + } + [HttpPost] + public void SaveOrdersToPDF(ReportBindingModel model) + { + try + { + _reportLogic.saveCooksToPdfFile(new ReportBindingModel() + { + DateAfter = model.DateAfter, + DateBefore = model.DateBefore, + UserId = model.UserId }); } catch (Exception ex) @@ -62,16 +78,12 @@ namespace CanteenRestApi.Controllers { try { - var excelFileName = $"{model.FileName}.xlsx"; - var excelFilePath = excelFileName; - _reportLogic.saveCooksToExcel(new ReportBindingModel() { DateAfter = model.DateAfter, DateBefore = model.DateBefore, - FileName = excelFilePath, UserId = model.UserId, - lunches = _lunch.ReadList(new LunchSearchModel { VisitorId = model.UserId }), + LunchId = model.LunchId }); } catch (Exception ex) @@ -90,9 +102,8 @@ namespace CanteenRestApi.Controllers { DateAfter = model.DateAfter, DateBefore = model.DateBefore, - FileName = model.FileName, UserId = model.UserId, - lunches = _lunch.ReadList(new LunchSearchModel { VisitorId = model.UserId }), + LunchId = model.LunchId }); } catch (Exception ex) @@ -109,9 +120,8 @@ namespace CanteenRestApi.Controllers { _reportLogic.saveOrdersToExcel(new ReportBindingModel() { - FileName = $"{model.FileName}.xlsx", UserId = model.UserId, - orders = _order.ReadList(new OrderSearchModel { VisitorId = model.UserId }), + ProductId = model.ProductId }); } @@ -123,15 +133,14 @@ namespace CanteenRestApi.Controllers } [HttpPost] - public void SaveOrderToWORD(ReportBindingModel model) + public void SaveOrdersToWORD(ReportBindingModel model) { try { _reportLogic.saveOrdersToWord(new ReportBindingModel() { - FileName = $"{model.FileName}.docx", UserId = model.UserId, - lunches = _lunch.ReadList(new LunchSearchModel { VisitorId = model.UserId }), + ProductId = model.ProductId }); } catch (Exception ex) @@ -583,6 +592,19 @@ namespace CanteenRestApi.Controllers throw; } } + [HttpPost] + public void LunchComplete(LunchBindingModel model) + { + try + { + _lunch.Finish(model); + } + catch (Exception ex) + { + _logger.LogError(ex, "Error during loading list of bouquets"); + throw; + } + } [HttpGet] public List? GetLunchList(int visitorId) { diff --git a/Canteen/CanteenRestApi/Controllers/ManagerController.cs b/Canteen/CanteenRestApi/Controllers/ManagerController.cs index fb8e238..e38866d 100644 --- a/Canteen/CanteenRestApi/Controllers/ManagerController.cs +++ b/Canteen/CanteenRestApi/Controllers/ManagerController.cs @@ -3,6 +3,7 @@ using CanteenContracts.BusinessLogicsContracts; using CanteenContracts.SearchModel; using CanteenContracts.View; using Microsoft.AspNetCore.Mvc; +using System.IO.Pipes; namespace CanteenRestApi.Controllers { @@ -12,11 +13,13 @@ namespace CanteenRestApi.Controllers { private readonly ILogger _logger; private readonly IManagerLogic _logic; + private readonly IReportLogic _report; - public ManagerController(IManagerLogic logic, ILogger logger) + public ManagerController(IManagerLogic logic, IReportLogic report, ILogger logger) { _logger = logger; _logic = logic; + _report = report; } [HttpGet] @@ -64,5 +67,27 @@ namespace CanteenRestApi.Controllers throw; } } + [HttpPost] + public void SendEmail(MailSendInfoBindingModel emailInfo) + { + try + { + string path = $"C:\\PdfReports\\{DateTime.Now.ToString("HH.mm.ss_dd.MM.yyyy")}111111.pdf"; + _report.saveCooksToPdfFile(new ReportBindingModel + { + FileName = path, + UserId = emailInfo.report.UserId, + DateBefore = emailInfo.report.DateBefore, + DateAfter = emailInfo.report.DateAfter + }); + emailInfo.Path = path; + _logic.SendMail(emailInfo); + } + catch (Exception ex) + { + _logger.LogError(ex, "Error during updating"); + throw; + } + } } } diff --git a/Canteen/CanteenRestApi/Cook.docx b/Canteen/CanteenRestApi/Cook.docx deleted file mode 100644 index 09b976c87887946765415f324c0388d0062c1d67..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1454 zcmWIWW@Zs#VBp|jNbcDhX0e-p{4CVPnDf%h-$)&lec_n%kxjApc z?)u#}5UCSA{XN?&sxD>XC$7uiSQHI&1Crdg-QEy;@Yq=s6^BP$iWlxFD69%KIHfJK z|6-qT7h8_@J7r*Ei7TF)Wv!Yz>z1@Ugv#sa7y&lWDIwO4ffde}q&05X4T=oasc7sjU z25s6+uO##qY`N{X>+G_&6^H-Le7VbHujKPeuIC0V-fnUiW;NN#eiJxWcDwGU_=V?k zGY<$Zdn7z%iP!n^9W6q629dw@eGVO;7n$?JcfYIHw211NTcbZu{k{43CO!GsyK91G zpL@x$F0tilfY2I89pT@i;_F^5wOm-y!u$GFZTo@FzcHos$==Q;C^aXs1gN4oBeS4b z0jMRf*j6c{q@=(~U%xmxBQ-a%STDaIH4iA0mS2>cSOVl0rRx_YCTAz6r|KIS7?|k; zZA6%%gleWjNM%7PF(&4xrDZ0kx)r65!D z#8l&C6O$D4L`#ztqckN2eLEX{6d&862I+lirtm0WaDuQfFi4}F^Yco8*(o06i{e;N zt|C5Y!FtFH(qxFex+NfcfkEn$nwD6aQ=;Hn0dx)|MuBcoQh>S-63B@K1v#0?;Hc0q z%S%CvH(f~h!Al5Gs1+3DC#Mz{1CvBz>% diff --git a/Canteen/CanteenRestApi/Cook.docx.xlsx.xls b/Canteen/CanteenRestApi/Cook.docx.xlsx.xls deleted file mode 100644 index dd56d272b3a9aeae17d9970a9c3b06d7fcef33e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3056 zcma);2UHX37RQ4~2vwSZNC}|`QW82W1f+v3B}fet5;g}UBGML>CZUKR z2vVa+SY#pVA}R<{Hy}ks7Z8-<8}#h5@Z57==FH5=$#?&g?>G0}|8;TT+$#nGK_H;^ zmO76Q9>eurAP`8I0|eR!+@nL_QDjQ+2{JiYGdeURCC!}j7{PB{HPOo$K%C{tQ4ATN zbqo9m6Ww?3`aOPDCZH&leC4+d3^x`!uD zDI~c2rglhN+{g@oKWlw+;!ghM2$f=Xi6uS8g7foz9kIOBKz`#c%Ok^-1W8{w>8M6= z-^=!mQH4nfo+=rS@K23-RrEQ7MBC4=l$C@Es(JJqbMZv9-i7MMMA$dip*_n6MLRn` zuH1O~W;MI^a;nIJV3IgBb8SrVPbBjw23OD8XuWg3@pMG|OG2fI5UttLE;fiexK?u| z%2nT6vVKw!HE{DiSWC~7YF^-Gc~4--2I^H8dr%1{ZC!iCqUWa+FRHRn6+2FuYWA^J zP_ep)p%ed<7kRtzL!2gZ`9j)+>-)_9Ka1JA?8p>{rHlw+O$#roxJX0%0DD6>CX!ohc+9-mZ z5^?{m%k{Ndc1rC5^c0HOd;wd!))$ur5&NJRxFB+FGQQ+ExKE6f1ZjK`5nqwO%T;30 zJcy4&yL_^@E|+R%c(;}v9m)~^RY1L0tcISQe~TgBT5*Hp=S$MGEQ3(hp9G{=74i;f zupVcPw~g9Vv_ac^Y=p0kr1Guj6KTe3*E!4LOEAZhy35{R9uZTT%qxGGxGU=vOL;Q& zyBs0neO%M%)MiS&UzcJFOI9@L)q+lGfqAa`a5f`A{nb*W5?`UvnHdM@xXp%)G*^|^ zVYhbV)j6CiQtbT30rzOJ`%Qv+}mg8wlZB`}QiwHU6aItH~Pgf3RW?w?c` zvUd=!uYITW;~nNDJN-;_OOJCF(p*HP@vN$bs-~i+4SXq6DI+U3y$x5X ze<}v~W*jbQdqlS?wa?ifB;IGM)7nV?Louk~<)wW0z!9ddLCHk&jJ>9RIX6K`jN#ag zE&&se_@;8}+?nGLg*WO;8^+3g7QIxr@p60YzC)|`9SkjO$3PmiXhD_HXl7pfi_2@j zn)sXDnD^6PKLD1rPi6sITLN^ zO_E&R+d<6;(%jYFQiDd@$j#AtGShcZadamqul4s5TmU0UPT>5;X{$$40|*2f6+i~u zw6+?@sb@oB7obAmF;Dr|Q798Vt6^OqxeE=^c3k|w`^r7!ln_v69t>YylozaDu?(A5 zO7^Xr4Ug|ehy*=<>duncjO^+DXgHRIq(K%xsdQ~utQgjS!F0r2nNcV_Ix)1C&U--X(?P<%fsEq9a{|AA@OP`>Xv#@Gtbc@_j$(nQEwqCMKz&}iX5z~NMU03j4d)g*@# z!hm0hWJ)NG27INE;NduYFpflkYaK=GL#TT z`;IVt=L#6q4M!mnXh;}*m#@O0_WnqiE8YNSq^(Uf)b-cV)zvn@!=P|e6Znq(n*Ig! zn_s^`v)(KNAdds?CG{;AzcKx%Yk%cimu~I^RIYW^3D(U4@B>FwU)TW6C-!U^(y37S zq<`~m}-96qAEc?DeWrdodQk>^w zV(TC(L3K3I(by{UR)d%MwP)|2#5@;RmgF+6M%sUhOn2O(bg@b#=JE-; zx{!r^lS&8&k0#dW+Arl_*f|+XA?k)Ap4i+%h-!& z0Q0Cv;Th}+QhU9y!t!LL*MsFbc@FW{Qq{tosHS7QED)wBnP-pZ=j>MHk*Ug~gKw9_ zpGUe6tB7)%=clL27FI44^cNLP;3obM&73S8$orgHYBQaYrU5TP#ZujdSXZz)oN9|VF-LJP56uJJMaQ~-! zZ>xO2b#1Hofp;{r?ZEGs=yqT=_t(e&OTq5e*`2-HI>V6f=CX?e7x2$OAa3AzyyaKG IbPEFg7iD1ZY5)KL diff --git a/Canteen/CanteenRestApi/Cook.xlsx b/Canteen/CanteenRestApi/Cook.xlsx deleted file mode 100644 index 1f8d8d7e83bae20013be1a1d4195d03f01b760a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3139 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 builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); +builder.Services.AddSingleton(); builder.Services.AddControllers(); // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle @@ -49,6 +52,17 @@ builder.Services.AddSwaggerGen(c => var app = builder.Build(); +var mailSender = app.Services.GetService(); +mailSender?.MailConfig(new MailConfigBindingModel +{ + MailLogin = builder.Configuration?.GetSection("MailLogin")?.Value?.ToString() ?? string.Empty, + MailPassword = builder.Configuration?.GetSection("MailPassword")?.Value?.ToString() ?? string.Empty, + SmtpClientHost = builder.Configuration?.GetSection("SmtpClientHost")?.Value?.ToString() ?? string.Empty, + SmtpClientPort = Convert.ToInt32(builder.Configuration?.GetSection("SmtpClientPort")?.Value?.ToString()), + PopHost = builder.Configuration?.GetSection("PopHost")?.Value?.ToString() ?? string.Empty, + PopPort = Convert.ToInt32(builder.Configuration?.GetSection("PopPort")?.Value?.ToString()) +}); + // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { diff --git a/Canteen/CanteenRestApi/Report.docx b/Canteen/CanteenRestApi/Report.docx deleted file mode 100644 index 080143c6d24c2b46d99677a9359bfa92ab57e30f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1284 zcmWIWW@Zs#VBp|jFxA}>CTO~!RfCa%;VBaXgCGL~LwSBtihfFda%paAUWr~sZqC_B zzJ7-d1X|Z8Rr=oz<5;*NbA7`DmUYItJwmsotT{I{O;*Tjh)@)J%Jr^SLY;)Uv-8&8qfuNakqyxes5W=Z8+c0-$i%pL(ZMsj+S<V0(AnyI1ZL^~Oa)Glo-4-#z3nrc>XFJwaTO_pkn>|h>FK9PFkpl8QxyDg?1*)8zz zieLWkiq)s9ZvWNxxS?2aKhNOGhPqqMP zurh#yb%l>bf)+4XL6{pDtno#uImP;VAoBh0{WkW%fK@0&A$G}nU$=QkNsrp6+24?y|8xdwGp_-`>Qdy8njEVVaX_?8XF3?ng z#bA9@6-o*riACwDCALcX80kq#!865HDJab%**qoH$T-C`#nQwwElEj1-_AxK#m9E2 zL3&@BDLe`ooFFU=4AN-l{JauiB8><6qBs_mR*4Td1ae|QK~82eI4bnZ@>0;^O&1b=@O%dfwSuDjw^uq259Z&o&tB4!}m38YO~Ks*3Kg}vwi diff --git a/Canteen/CanteenRestApi/Report.xlsx b/Canteen/CanteenRestApi/Report.xlsx index 8c0fa1aa3754a8172c13d5723241173248775001..4b0b0c01e0c118d3a5746bcf6e1e95ebb3572668 100644 GIT binary patch delta 1423 zcmaDSc1yfIz?+#xgn@yBgJGk}53fv^8BLgr2PDBy^7qN z-hSJ>!v;KV>y--pmmG1MEwycP%FA2QC(J~-H@Y}a5nlh+v}&T9^3K4kf3{?AKi<#s zabJ=3Zbuoz4XW`6vsOAR$X~g+F8-j%*(B!MyXJHYw>sB5mk7MPS8N!5;kboZP|@wh zm-j3Yti2`4<#*hqZSNDq1@Csa_vB5;UOI2dW_GdelS|ldCfAN zr>%2>;Fe7>8mD_VIl0|hcXWnhT!%)R3x}@yn#Yx~YKucIK3{pIRQ3_$`wCO;J&CR# zn%vjq#J;I|WLL~}J^t19^!#UG1!mf7&P)=%^YE_MfwRwkZ5Qai=5v4{`|nTd6Pq%MK5`fAdCy!f^R@J)Yavp5B%JKR`=>p+`L1Szb}6$?(4YlxhD`#8Vxl*IYJoc;WU;eEAdG z#Huu#)8~9npS)0!aO>|R$NFOjZi*Kc)CT?9@#lo*N8YDXTH1bX`Jc0S)=|yATB*j{ z4{Dk}w>-DDu|L+$8>e7#|6%<(|1*&Z=lF`J9oL*Xdx{s!`o51@&EXt%ZrX?Dyw7l* z@wsUk%jb0uqjmf)pPKFAmbo`%tqYq%(p|)?>mW zGi{Fl|7(78!@`LHoNan6_VaCi&nnF*keZreVPctPW@&1cYLb*-wg&c;;hUXKVSH-A$SOjOhl?Hc@GT2_}}&;E<=PcS+-S9ST@A1H6CCXo#xm9cp z7q;2CefP-BsGgH@VvX};q1?YJ$yUGmtZvGswwt7{SyFedzCm@e%sRgR&Re4Rb?t6` zGg;VK-;mjHU66S~^B37;QZG{fyi4t5O8T)kA1K&#Tz2dL?7rOU&Z=L_`Im5~iGv_5}?MzghofazMQ}goT z(Y_ozM8aYLh1li{4l71*xPVKX$*Va{^cFh?fdK%8JU|lw delta 1291 zcmca5{!Xkuz?+#xgn@yBgCR?2OIVu4%?~FT7#P$T85sD1bVZJSd45rLQht86UPW$B zZ@+KfAp;(_^+J{QOM*jJth%)+(KtF!AgJBVq)@bdVe}3*@rM!x%7@PLM3ZAy2m*DYiFC2`!#>zb|A zQDdo#%jYh95aN@3!$XdFRbTay7i=@rZ^l@q+TQtZ8}v{8;nc%yddpA$tlA;xXme@4 zo@OJ*RNoCjt~14d#=O2WBWbNy#m*N0m=hAK3q7lzUpT(p=YZqUE3>PujW}*z`=mSV z!}{WCW|+5G!T#RN%E-)I4+?-y=D!v!0eYMP7y!Uv0R=#DMq*KFN^nV0W?p(RI23w( zxegf!w5}K0v^_JnqvhWm)h(IQ8IvYSF7>wUtY9uw)q5p+NqVNnF5x?S%#GhyPY$0f zcOuRz;F^eucaYbTmAQ+3!Y{~fTdlkHRLvs>52maJf7Z8xsqW__uI#i zuECmh$p%)MQZJUe*lsADl{Z7|)P?KXqN3jQ-}vjJ`|7@x3mv-||2Ngr<+)|I%N6s# zZ|B%WeB=K4UXFJ|4HL|Rka+F#{a0`m=$)gClNDIy>T@UF?K-R=&>HXhY@cc2LLH&t zvdiKVOFlU-W-GmIQ|GSf&2-OV-prrpEN;Y@Z{DE(%fNc|0=w`77rwo-yB&BiUdHc! zLGEndeRJwtI1P=Mawg1f(mWPgB=?K6moI($qNTSU?728`iF{>*?W^izXAZfB#_qVd zxiw|RW^>t6p?iDlXDt7?^V0Iy{=7OG0tXf~P569%TUG_v%Qv4r@9>FR&v7_(GNt`G z`=84{qhEs?Vo#rAo>yFV&(uvnTxdKk*wc z%*zbmr0ns2yPgIx7D1RB==J!b)SO~{JrKFMfQ^OGJSD~4!XU-a*vv55!Xz=tSV=+O z&PG2dH7BtoGe565BeS5`4rU}Y6t@a~`8s(uyL$aWzrzMR4)v;^<}UMHeQ9Co?t+I_ z--@7xrBcX`_0QOiktgehX-^AVjD@Ltl_v{awr)Kn#-+=$4Q4qs6_xpi4jq{JckD3;7U|tCK zZmH9|vaZx>N(U->CHyIKvaJd_e{uQLf8SVT8n-6c1-%QF&Ef(kfrm^C48jOqKvwkRb=+!f(>Otb0E`(7{{R30 diff --git a/Canteen/CanteenRestApi/appsettings.json b/Canteen/CanteenRestApi/appsettings.json index 10f68b8..d4cf540 100644 --- a/Canteen/CanteenRestApi/appsettings.json +++ b/Canteen/CanteenRestApi/appsettings.json @@ -5,5 +5,11 @@ "Microsoft.AspNetCore": "Warning" } }, - "AllowedHosts": "*" + "AllowedHosts": "*", + "SmtpClientHost": "smtp.gmail.com", + "SmtpClientPort": "587", + "PopHost": "pop.gmail.com", + "PopPort": "995", + "MailLogin": "test.email.movavi@gmail.com", + "MailPassword": "rmss tjbo ykkz swac" } diff --git a/Canteen/CanteenRestApi/eport b/Canteen/CanteenRestApi/eport deleted file mode 100644 index 478bc42cf649eb23dcb6bed2ac0c55d91ed0ad1b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2874 zcma)82{@E%8y-Ybc7}w;SVLwIQAw129s4?Fj4>w5Ff)?WF%%uK)Y4_j|wh`rhY$zx#Qg=YC#$E3RE)AP_GvC{nq> zMV?6fTr4|pKaWW&tD=oc88IAgN-?b`ED@n^0RBO^;wNC{7|12citp&WDu6L$@-Ox zC*cNMY(wo@1Yc>gVtIo{4%BAyCZ5%al!3?V_#}sUJjZ{%#0ax!Y4mWd=ofwTXmKg; z*FToC>aQn?Obf(=Nf~QH3bO`GOCs`9m>G5-j?z`}fP+HIB zqal}SR9BLm^^0@{H09DbC%jh&P8~`?U6s1<40%vWF*WQbo-<9$4{SU+1R=IbOZuH> z>V^v)T-kcy4==$+jSZ8#-hRqG6p5koXQny^x=M!V$1pXiLP_o2!CjY{>m#t{ivHr0 z_UUW&Y-;^}kM{^>ODw8FiK?{A9ty7OFt&c z!+yoW$!@aG-av&T0lwZ9^tgbAJ{tE-#R+-0f<0oly=F#9o7x|@^<#YERW_4r^ z-+yOXc^`7$(^NR^ZQ|Z9bbs=3wREluN-5GYzN_L7WV=80o>BF&kz2C17l@DF|8@`? zHWPL4-TMtH#pj7aD@#^1{>`*@d4W-m^I#SuK>f{pxZ>VIq38)K$gt_Uj5K$Ro2pZ% zLCOcTgMnDg`hMs0cBAN55*HtpcYE<%`{AGE}^4Yv*K&0RCRm2nVUSqT+* z-$RsDC{y7FPY}h6pNtV3Rlx{p?+tP=U6Id0?}6?8sqwD$C+%m)wTqya)ra`&P~z$% z?(>@52>V=9h`E2LY&Wh9Z(j^SvQo#KJ&Ik7ax517M7vk37MgP|OtoyZimd6lBi=7( zp5NHJJqz3r=It~f`m2EkXu@XplLF90te+#9h!4SiO9q()8-XjE67ZZ1Gm&_BBpQcD zMJqKZ=JnLREIQ9M`t)wQ+PYcJ{TKUJh4KoVM(Lr6sAJL`k8LLHGt9;k7G^JF>m51; zH)f++=AIr*8F>n$gfxA;=aBt4XCla)CAghMUia#!TfpB-02(IwoyDexkpi$-G6^6A zbefxK?QGX25Ch-0mae*l7=qheyP~uxFCH6b>PaKF|4}oAmXc6D=WA9m@S@7sY~+DE zw@F6Kseu;s?X)XN2MK}!H&&|z%n13yZM-~PuPRWBl*(c@#k5GDbf6!8KxY3GSBb@} zX?dKVcBT5<7Y!;>o!MT@Xy{EzKECVf9RB&EMfYeFw<2#%bQfYY6+}0n`DD*2Ze-YGRIH z;Ce^&eYKzv*vS*HZG2Du<Ve%=Mmr1xu~Id@5HGQ%y+7`0z+OR=Mlkmx=3ROTA4Ci&|9n z{?pRA!O;@?cs-`NQ7t^rD%#R&2dkF!Zqj_1l$jK^@PPy4je=kjh2?{VfdfXP&nD(#b=NscHNDLeP6?=zv!v*mpIcn~ zz{zGW+GRh8zZQ4oRFjvi`Oj|ydlppbk(P2b^G&_2I=$M?PfQLMSKU>iwwAoTzPGGT zzOP8bObYie`)z_T{c7 zmYa^#a&>afGu_m68wK<_l(c~IH1Tn1h@1^e$~%TCjs>b_;V z!S!RU--)nOS+@|FyZ$~a{*TUXq5N38wouBsw<+0{;g554%W#F~+w%XCu{&{gM(-Am aGVc##+1`p9SO5gt4cr|-*!%9;9Q_HlAeDmv diff --git a/Canteen/CanteenRestApi/pdfReport.pdf b/Canteen/CanteenRestApi/pdfReport.pdf deleted file mode 100644 index 01aa0b7a0ac03aa5c8f35c6d2397045e7515cc29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52100 zcmcG#byS?o_AQ#AfrMZ|gS$iH?(Pn?(P=c-6gma+~GFKKKJZ>&u`p! z-Wc!w!{V!2t7Lt%X3teL#Il0I)BqYrSmLS6;h(SoJUTo}9TQkiPFPw28+~n{v89Ee zHc+2Tke!~6o`H^uo{o-@fq@Y~NykV^M@LHjmz$*xnZCJ|v5hvKl(C_WwxFdh9)O04 zj)n=q$bzRq=HTE!WB%HqXQ@l0YiX`Q4hodDvDCBE)wdx7Ey31E+s5kOA=HL?#(#xb z=^6a){8tz^H>|#e-s>9a|F%{|Co6qg0d1hRnWZ6UWNkxzTRa9(zdY=}{a>H|wYT5? zzuiC^u(Y!P;sIc3C5-iK)fr!-H2)U%+VCG?u(VS8ddAxPmX7LlpnfJcCK`GcW;|9# z01Ydf=IaV<^g)CESpsMV3n1vx7LVz5a9CP-eOpUA8(n?d-+2b*L03T^h^I~qN(8N< zz9W!U%p9}>{y#?Gj}ZfnD&zHo$L}~11v)(DKLd&=0Pp~R1_$kzRv0wjZx>-Y zJizPvKywO%Jbv%(b!)FqA~u$GR)1c!0sspRzXsX@K@c*Bbxg@k9LCI_3W%u5OL8l`CUizcc6JxD_QoY)!Js};Gn!<=S${k7% zhUgm28V&qdycPD#^S!In%SE5n)8ozdlR`tUmD}@X)ts9|WsGUDb+L%)+^)vE@W`#e!Xv%-;Wb^iZ(s*oX)qxBnn%7o2ZSTIKhVEHC8iOid1$)LeRq=`erODaHtgrE2R%P;jIi8Px^7`XzqYZ9$RR( zLpz6V&AmDtez2;l`DCfxv+zrH$_?kPzM>L9xe5u{dvK0niX5+UBBr*gc6l-dBR1OD z0-^3Era`Z!HO?&AZ=!wcB5exm3yHRh61{Elc`RF0O>H)*e%aV~`p)cN?ktN5azfT| zt=M&Z1U$=KJ>U)I)8DC(X!~gx5;YRmeb;ZjFHlt?6cCHi5eHUCbab2@p;De zITlvbM3KxzD7~1%3at7rjO~T3MJ$6Ii8+Jtsp*DACv5hn;gk&(;hR-Pyod^aURaNv z2ymv5vd9?nmfd#?I_%1I4bm=O-x3SY{kq4(Cm9b+uu5&)TL9{W+GfpC%(-2o-e$`Z z^UF*5ZWn;PENl%8sA=WNS+CoIGiM^1!6q84ib%q<`^Ti7$dct^t4BRMf%_(*q?`U4 zYN2v(L~|kGeJ?zxC^mV@2G%|fu+~q^uEOIN$mBffg}PBJVnoVRDv=S#?* zJY*{$>-&AAga!5WaQ@hLVs_}H93VbQ;~ipLeIOpNI!I-78p_m;OC%X4SP6~A&{<6De$UnW+Nr~dWM zUNwI#6yGHo)svDVQfrbcMxv}$C@fBTG9;ryqh}ob2)?$+<0L!*#f;Mr%Y%TiPbNyP zWoVbnLq1;}E1``ixE73u6fpcWO${H_%x?VBsY zcW-tsq*KZ^RlxeI@$J4W%%rcRElI@=x~A>AEksb_s1RVzcsJGZ97vTXYS2eAMr1nd zI`!sK`{SOiZCk`VaFTI&E;Bb2I<<;9?{0DGhP{T7ooic@pXE!yyG+?!aT0G>i8Ud5 zgJ??AN4q`K>hPm4dz;DS{EYyivf-6ha^9qGaK=ch!!VE<=$Zm#whm*6lRtoEjMk~w zK41bNW!6`0{B#+}o$Ksw+SU6%FwsDx6TM<`FIzU34@t^5mz3|)>|9^3l=jaal4W6- zeI*%AA5#?jybY<>JWvLIC#RG4qUv`0>rvtxYIIEnVzKt!caQv}x7+M)i52@0(23GA zY=)h^M}Kky#_5iqu?9=pQ9XbbSlcFj{3P|96Nn=4{06xuJ*|m@T-=1C#B>%h-W( z>SYw$W#Vx33fWQqU2E-DnBnbe4JA{f11n%%LI8Q(EHz05ebcNqW;&kb%h&-lW zBI3d_QF70Dra7sO+tOa+d7*}s6-MQ(*+RHyB0t)swn@$dX+GNElBN^FFdJA(vr{Vm zdhaQsye~q~F+j3-jNrC|P=O!+yaey6d2S7E;~76d*BR@nU(acyTL{ev4B=g#E#&vZ8vhTs+Q87lF+{MpsqY}>_TMK;kbTK;`mZPM(I(M;KN3NNbvK&NO0aqyn1x$ehgSl%~X$B8SscwxeF=C3_m{J5xD#B zI#V#LNU15}i;#5H^&Pmr6o^qK6eT~ESPTCrChTIl=S-tL%%R}k3&r`3l{e{5s_P)E z(EU$X`3}xbnjb~{x6g&y2*~~a>J(N^6_BY!hY2bItW z(Bd^?_sI2l0Si>v3wzbPf2pazq}Z$S`^`W4? zt*(u+70}WKmX^;}_f@U3vVoMGfVP#WzOkVZ5RaLe9u_1F|MbxVm_aJfOxqBot3l1L zBk;efUuq^MRy=A3dR9D8W$>ytnV3OBRSYD=jdl4f49)cM=s=PZsBfKky#L-C z>)-bFKZsD;zf>v%)9-}*Z$YXVC1u)8_rdSf>lqq%NnpS~w#J)auL{Lx9{TVad{U6y zs|O(M+~1y_J-;&F34dGr6<-zhVxv&@n5@fTO4$%oXsT#&e0)t(XoG)F3DTP2pbm2- zRMjr`qrrs}rtksm%;km^!cTuUEMbPgtI8AF8kjXnsk|@BmCu7?$-i8u?vvT&vjY%> zq(Vo|WP+@{vv!`@Gt?D(G z0cm)I`P+Li^qoAK^!QNm;hPC>XlSPiVPN^YK#{T0)3-6U zFeDSx1L4#d=me@B<@F7XL9f$^j1N={>Vp~-?5wQJ^vz#^O!vFM`6tTpUQdBMEG@sb zt^RAz|1;{8@zj}E7}c3sSu~kgSk#&5L6((CorUGqvZ%Ar(`z!*(W^7j(Sa<(UzSmw ziShNB8T8BqvMlP1j0_;lrp`zQ&}0VCfyQJ8Sy0?>`#Sz>`>Q`F4gi|xcRQ;(6X+x{ z13+=F@$_`+jBFr322eabtLES9)87T&KbYX3$$iZ#=;#SqfT}W34r%|DLuyf2T1Cq* z7RImD8s6(U`hS(3Kg6J?Z2^3p&Q|^P75}4d2K@al;eWsM|IcWL`IUC)SU|MH$PA(# zP}2Vk+F|@V?IH_BmS{znb089fx_&5Iy(C_uUx7UU()PTkF$J3cC(L0XVKRksH-m@fA%V=zTYCxap-PB#N=3I6s2 z3DHRi&|dX>vP_=KB}6@VVr4IcRgz99Oknw@yX2d-(}1+~Yl7+zTzs(>J6upj%O>QO z1N8OHL0&I|^x*kt!c+|H@!(KJrAu!!NF_-tD7hlkNLwj^dPEvZ3Hn5$gup0V_{HdU|`T> zWmabZ-D5Ga(EX-4CRRFiW@hF;^!FF-{h>8Rbw-v~8vKjq03bSJ06qVm&KN*62>3I} zKj@5s1w>~I>WoZm|D?13xNrOCtN8Ee?Drx4Z*%#7QrT}b{FBT6e)092%l@Xe1o-}; zwth>LfAR4j`2oOVVqj%u1<}fXUX%Sxq0rL-nE$C!j@)1z6@_N63!5+FN~iXTQfoQ( zPl$4mk*Xpf_$R#(W_fvezYBJu@R;*)rVDMQXG$#s5F-zdav0iEvKQ5)D!c zCU(A$K*%S`c3lPg!SxalttmJzyfRZ?BkSa#N0#gL;lZ@^@GOAFr zF@js?!5;liZs58giBtweQRdnt6tnn43QcxL|R7TC1!Hx=(xP`hg5<1$y6XM zmyrK_tyz4Q$%vx3tr0mx6>A)!Rv8!n_JRAw=A!K)cNM`)Yr$2(mcl_zdB2Q5N*;BG zXs;ZAdw1NeCU#Z#qY_1Uh7m<)b<&>BBGqn2X!bt)r8!4)fO%YYE%bOYeUb#_K3=ou zaTNXZ(}CPEe^sUjvC+PXv*)wq*kpV`X_!aB`qA+E?Sm}0$nz&A9!bqh>ZjoC3g097LbWCh>Vq~(mz1h;0iFYNf&3}UJ$S0% zy9Ep~mwI3uu&_pcm7+a=i%iROd$C$C18l1`g*i*Bd{S$lIz$<}*w9iueh~X$W>Lt< z@+~zlZCMVq@n^SgMFWG#;Zco}gxE|&v`Wn*0dgrDiK%V2bAu}=b6GXIs;^?o>4O;UMu|;24i9_+f&<#=f^=>jhYKNoY`2)x-*8~%OT;v zAGW0N7xm=_s_pUrYC=vo+{Y%V{uCFMt>UbLOC~hxUC%XVHYtEgs!h zQPhC}7EZ@-bixpFIe0>xF?QC1xZ?Vq0w%=f9ddnpb_X zU}8_{;@R54t>-^)9hf6Zj-0MxT*0W6M6OAL9T_%+x3T5Wch{j6vZKr9!F?luVU2hSz@0$(+ zHp~j1_T#~qu#WBVtGPFVE_b`OAwK{Id3e!uX%q}Ukxg9ig$*EbauY}T=KZ+QDu)*A zj-*{@D_!PW*H2B4?5>sVJ>7=e_|ioO<4tnp_T;>Qe$zfy9 zSb>Ked|}d0rEWJr>2B@p9@hE!Zz(!0qqhat{%2g-27`W_Guc<*dwuQd3mD>FHGanO zr1wuXz_Q1xOOCoi<&W~p*^n1Tans~H#81x~Oy?r!xH&_CF>2N>=r!|{mqe{u&tC$S z;ioLf6WhLXKc;f3JFBTtvdw>UDzJ$?hpicft+{aD_tcAFChUtx4^?H1C7$4kF}`HF zZCBQWOPdwLt&p00KdB;m?(WRH$Y*K{K4PeEw8H6}(w4tgWnL9*?z>!?;|BEk_&l$c zo8i)+Xl^As1Sdepzcf!|UeCz;fK>e~V2{#D=>flx-b+#e<{ZG?ThQJqo}d6jL4JwJ zsKs9DJ?$=xo#5>u$C<#lHqPAWV?YKC*nwQ3g*2V9-KLzcmxuFXkTW_7)c7m_y#}M% zb7jP6?nlHM9Dwmee5{?gzM%zoI<5(1Fpu9HpyVMdjbgkL>Jh3R=X2srbB4K8prGWF z3O2^S|2fGG$L)zZnrA~{XgmL*s3&zIri@y62=_b9xhX?!tx5Jlw(^1_stiYFE7tnP zaS_|RZ%Vi}PMbvb!qqflib(S}Wvt<$AUr9}0~@>0COJ1rH?a zm^9329M2%#pjC0h7NY&{6ugx}{NNr!r^$GP2vz87`Js1sE#aZz4Zab@XT}ZfLk;Ic zYYTkM%^n^!n4GG?WgtboaHUDJ__gnXIx?7Rd&XI2 zXz8D};>+ABlFn~yl%?rpMpoRjH-Lr2xJJmfR9c@r~ScTX_%pyrb!3AC}vj z?Iirq6EVUl2Yr%RE$a}a8fs)bJxJf+vhlwtd|U9ZWUe8AdfLl#WR4W~&X!#w*{g!O z;#1MWr4nfQRGv~ME!4c`MeGtAXEL>**{gO(eOEAffXi(c)ZS#GvOSKEvaO#>+#}=- z`yOg%_s#}-OV7}W>ty&tJOdXs6EWLBWCDU^cy*7OZdNt{A(cV&LHS~=CXyE zw3+2Hy+)Dn(Ov5sGos;>*zx5Pe)*L^r$x;Xg5<*=DehZl`_WUlgZrlg10`kRMZ;sZ zp}^+Fo9QOaRI}ck{da3BhZewEhd`^=cjbsb$$S{-WjmNAD>G(iMw2uNmk#4-Rk*4e zQD@8pD?+To6D$YDvZ>?VK@cLC$N=jtv;)6LLgf626sQx`3*ygSj9#fFT#8<ekA-HqJo>IzLe(p6TdH9PSN5s;3;XBlB4&Hl}3CEU#z0?{o^sU+q7?}$hr>W!hvopMaCV)jo$t`9yrY#uF6Q`@U?ISGkG zt;GU2QXgBWXXg=g>jnGvy!s1Pz3#Yf1V#0BGp(atSce>gmv!+Fj>{TpYV?{uyHV`M z-)+}8Td-CAERW1oeBcb}@3OxL*qNEd=S+>aRBlzOH@#wkfU$DGW&`NgrRn@qYsbgg zvY8|_X~6wh|KNJu*r*{GLP(cqq#GL$zq3ny8Z+ChUP^;d5sulhv=Ax)+wmOofxBbQ z;okTo!ErH(6nu{+BPlWOGnkfc^YrlP5$sxE`rv5^?Akv0>X9E24~Y`~*>PS;ng?Lk zry=saUrn`-Rs$Cg&|}&7#5&qQ(jio1rR2hXIR;rL^I@Co=2F&WIbh!=D91nNlj^ds z?C8F((2c&EDmF$@;0je6%R0{&=)FWgxlc2bpoWNInIQ6fMjMZ@IkD z*}A`^A?O}Sai*BoPe_B)xdHnfCqk0IW009=g2GxE5r%-fJ~~pA!FLLMo z>WBAZ#knm<>^QauYyEdd1v2w5WDa3zOFkS*?uHzw&Vm~Td*P;`hzfZ(anOJP%!|m- z+%5spFEHH2k$yZRm4{m1Uj^&Pe$ z4l4)mPsEFa=bf?Q`Ft@dF)F`ms1)({X`YvDy2rZX#edJG%@$kqKiF4kcUDL~#6v!UjRstX4f~rPkryZXT_&F^2{HlEToWMaStrofTEp6G`t01j~Bj zPiSy7!7S*@i8zHdKX%Az#6O80>@PTpoNCx9woIgz2hlerUIw+P)`KQg(sCY^xlbpMjn&!%*unh}%D=bF4)^ za@qH}WEQqZzm)7;c{WZ%%emNEvruEE@c4WTN4cr?yQYaN*$aHE%vO6uJI`k6<5O<> zPO?NOVW{qAFG(1AYTCR`Q|N3gcR=onl7e1kWNDFF@p7!k4W4fiX3-7_qcXKr3zs{C zi&ek0eZ`=TxKRPSLjmU^QP0vwZssHTb|8utyuMHmi6d!S3zk;eTs%ugm7~I0n2str zj*^C!tJqm+&tdS3%A?|0anC851ByruYV}5Dp7b%w3${Tubi~Bk-i@tn`YA&gGMy2H4oXi84iBceY`Usxh~ z)!a%fF`ZqcSa3fBRjc}CI!Ak30Xx-f{0lx5 zsNi!S!iCr;v5=UUK2rEBqsGFE*{PRQA#F+x4gM0=`=Te5-gnn%IdN!ItN;v$B>0 z%c{JF2(VWrK)WtEQV}3iwvJ>pn5u;{bf}sX^pKXaurZlU$edA#Z?hTwa)^{oeO<5> zbD1Sn3&%i3>1SX_w2fBUru*}UP_hO4#ZlE;V`h<-sdxsXt=o+W<>^|uu~tIIWS;H= zyAW)^39}NwWOBXA>*P~eGKrD@mTCfw#eK8K84J`7pj!AsV1GKx~igcW=$lLf8zZ@JHc%qAqHEm zOCE)Yb}DLv<(qdm8Hu7jj9x1EL$KNi*P9CXiTI1{fefH8?gw3+S8cZ7xxwjNL|KBO zVNr~l-t>ia6H}jZ)mXpdxMf%f4S>XH&~iikFrj<^8s8WR6V|nyr$*7Ju#DN1m1XW%CtPT*Zl9HY`7Q@m(9T( zHV1mdpQhmItglHPkRHC@-i4vqXV0C}DXq}>!)IW(Q!-r65Gy(7iN5pW%_mj6 zwD(CC?+oMi$6W`K!FD)E&u~mwM>ww zJ}6L(9EwVc$9yPcHe@GWLY`E0HWO!;2~MUUhU3>y^D8xn4_Q-njI!i#KmD+eM># zzIZrk?J%aa(Ae$W3+dV8^qL6F`oP?CI-fdRMVNRDQ~)Y{BGlE1n=lI!y`XHFnppSS z82g^3m=JX&EdNcT5HFiQM=c^ONSiq2o-1Nn^Tf>}aM|6VIvF~1cea_>A!Nij+U(g4 zk&1t}Dx)B2s`Q(MpghTe%9V<}u~Tw4Y0lEFDXbXFH0H}g+>j$0R>UC9$Ib;cKNuRP z)crExz_;+=@aPYIB{9=m(>aO@2*~r|B3aaxiCf89*K0}`>x652 zOMuH}8Ys0CI|lwR7sZ98k=nOGNOYwknPLVK!;J5GdhJ%$t2!%PKdAodnnN3F|5e(K zbMI<-mhfXQU;_MNsyh2fbye?fK?1&f)$PiSYIh+%!BX+5&qH;Z(Zo!Cr$UuVcXP1D zk-NRhTNgzyN0Q>(?tQcwWF9&=R+CD8r%6pO<_7HY4+1V}UDAg^+{gh=>F$dYvT%mD zK858wWfDwXb13za&gAV7I`r&P@cB0$;#KCdMy_o8=^>MQL<3a3|y678Wtf`_XtwxfANv+BYZDJS;TLd6miHD+JSKIELk(R`m^0gi%PTa`Fmlny<+-zR zG0wbw*|+Z%hv&@ztGUEFT~#B2zIH2GO1VqW9}VX|Qs6Kgmx$!2pY>HAihPQdN@keX zl#kp_*J7Z&?bt)|pQF?#VjemjrB-M`3$;hlcpivladVP0I0r{ll4Ls%@6D{Yg2`BK zJis_`6wjnuJgO&ARhX2(s)H3$Gk>U;8a$d_-4_+39M~e9-@A-Si9Hka11eu$BwFeZ z!dT4oe4r`jqMuCFt^JX&DrL+@l$#S7v!0N2=a?6hD4n>^<_=8>r1K}__NyvUl~;=O z63SDhhl}6(kt^52^fidq=%5NJ+`+m$hpZ0lS#&OPej{&Qr^xU55Gj5GOrykKC%Eyh z^Qh;;S&x24JDjS=&pU&TE4#jrb=KTP7-#lk^ah{cXr8_%x`~|JN`vX>sY1 zGtz{Caz?VKEQILj=w*u_3|Y&t0IS(#^C@Vt)FZ<7T)fg)+J)#SSl!_FLGP2A;8okP z{jW}owuCP+CA#fBY+%FfY*(%FJ`pPO+1WVAS=+^zW@QxX$l}*l<~7Xg;8WnMo6-3R zkx@2>sJ}Vk(~m#EZxdJ93hl2()2!85>qD7azP5h|l40h#fAm>Cocnselo(%bL%M3U z3K<=*VHx$(b%Je9>vVN+FobI0a-HTeyE(#uwzKN~f^uO&9g$ycSHA+B*nwL{#^lwj z;EQUxTxJfM3%d_aT}A2%3J%rMpqbIP>1oVLrD+~Yh>qD1m5Ab`q9+-VnaD%8nKYmx z;mECjx-*F#N;w(`u?9RQZ|jsvRFOBcsh=CN=vnq#j44HBF>I1eVm9K-hiwt-NPaO0 z(!HHS=-Z$f*htbX9PK_4kW#T=t_`fwjcvU(KHkBx(zjs&dPYt{x{qQP`=jHZGfT^0J5T!PXxKBe{8h=WAc7)LfszW8wr0Da#Df6xIFndA4 z*aVK+?q|q%%Zc3~Hd(Gstvzka?gE!^bwkJX>UA7nFHc5;HPEXGcGQ+qnR^ft5y*vp z2m!Q$1{e_y=5W(hHsoO&8S^42DF+i`QP2?Iic}C05O}48Y~Smy$6HaFn}23SAYqKq zWRDno1ghv_?%~dJTFrI1fq!}FxB|~buScGpZ>RMl-n)(m{Q=SgdGMn2mu^y1(ygFS z1)R+?vyhn(mMe-D?d;4irD2}c9rpOIWm4#tbfd$Ko%W`s7sDsEw0 zx+6b6h|of>8Ct|SBxv4{ihV>q;l}!~%5%JLIcHt@Ss*82%YQ&x?AI2L6V^~wKT=|~ z3nrL?CN<1^Y+KD@Y~|(;%9!Ogn$dR&*2Si#JMVW4HPe&eIX*TLSTJxKxh|6#exCh& z!tyNT-u)Q*7>e=yMbpMcuf)G3?Xro?Fo(Es^n}P8Khn0g-+)$3Qt`2_Axd=+iJJ-% zV+KQBxU6vGGj8;TWTd=J>8E{e6Me{8%~>}k)!RsY0Uz82IXcntz9~-PSs0vAYb}K( z>oNh#(lvV~YZ~uuSv1Y%NFF_|oZ_HyKQH*j=tG$7t|$BX^oTp{yySs!+b|9ZfL8X9@NG&r*!+Z*Z;!|J0CkjVBGt8?}Jt#fEr+4Bh`i_ftkk0GN^{6 z9TY@f$%X=7m-{na3E+G*CgMn+T)y1=w2b2x*ldNU&5pmgfiRfFSHYmDpJoP#iMJ*YN&0qsN!n0 zLE5#fr`O<92~+rG2HVoNk~}sY`vjYDJ{g@8{n6!DFykpP3&{uc;l=i5|JdO;-0Rsm zhczDKh)<7OOO~oZzO^0<_9@;@#g=f=?5^B%;P=kZ&fh@a)J)34j$*tu{Oa7T<;rvT zt$86h(z2?4MrL8R$hf^}jf}07d=x3DG`NzzG-@VEy911rpbsHZHvXr~rjCJxB#oGa z1T!j8Wlql42i9#J3>_ws7?sknE62g41~_YZESX^;9gXF;V{LF}e z6^bfUxI0`D@2Ed_qf#{2h@z8bbCktX>%KfrC5~~OJt6H@U3?x}eYiEwKItC`8V!=F z(xXiSuHY^>IL(D}I6N`b)%7sEd{S*SUu?NaB<+iG-_MfTQ^z*ARuuh)YRiSQ+22na z*#O~ue%Jd`n`c@`ESDa~b}TYMC7;6n%NHb+naH2kR`xN8+2UAf5HdBS%u|Fe_BN{Y zBJsRbTstuhz+wibSzZHL2DKCei32J%84hDw@(P{P+t!biKnn|lrn!~00Udf$oyZ3I ziyg^YeB}3vqIx?%SjmCAk}@H3sYN+E!aYeV&jo%3vjtz|220557)-QcKK1OfR*6XU z_hMP970I0G#x{NM*O7|V08&<}Z6z0F_&2#q;k)b{ZalEeeYn)L9k9&|{oF2O_w6Ia zV^^wdnU8M|B}J${Ody?o*Q~Wf-xDR&ToL1u2}+*?r2#~EB?h02&`dX11r zt)0Y>0 zU%UYX99dNS%&H>Ov3kVuBoe3&_G+5v=Yqb=N)BH6%WR8IZ4XT~=Hw*71B&r6Ml#~! zmks_6eO-?!`;yfhsm3G{@>x;eM9(-b#ETSE#Dnlh_6KCSd~pWPKRLSkH3j1AoJEA2 zDN*5&cP8Nx&m$3p$^&XDm*N3F=A zeMhPgw}TgE^tKOjic5{>F~z(x9?BkjEAQMsWRo;)f^60yuxuPK+~*p*>}NAI0J9cy zb_Un<0~T`|iD9Nt=rJ0D@4Vg0t0`5(l#4PDuHO4ewMu@tz^mc{03KUy!DDlfN8uj@B^_vMFs z&R2A?$xBa(_P?X5N(yy4)E0XlbwHkHbT{d7=X*RpqPe4a5IB;%le#8q!)_IVRuPcp#ivHMdvVVA|IVaVWoe&p63k2i6@=e8u*2ff=Z4r?RSxwvJ+C* zm#?N6K1IvWooo-)?mb|_U&BE&XQq_3e7w_YK;Fwa!8z12=~}I7PRCH)UXt~L6Q7bK zIJW`$KqKbhx*1cWwCoEF&Qz~Q!hn4!UpYfNEf0r9OXG@*-0fF*x}+J6nwZQ62B$tt6DA? zFPO?vX{*^yesrhjlV>Q-MQ3@f-Fx3uDYg;tfNeT(4vzr$B8G9!+ZR8_TL#(KSW#~mm zePEqcPXsEWs!rwnbkjQlFxx0%l7U1;$l{PoeEz{=rkK4txK&BH?MohpBucbk+i^i5>o-Fbw8>m2~_I_zy~^&dFa~L z;S7;lFmaCV6)WDoWXLuQpev&5z}$59utO*DFm5I)Cay6Wx_(!7?=UUqa8Yv4tvAWL zG+K$$?c0$$;C7ou*x7#m%H`~Y)%wHcJJ>UR(THAnJ=>9TzUD3?tL9l)l%jj!Zv4EB z1}iRSQ6E-xY=S5vN&Z4aRL?>LKJ&NAJUp_QI-rL}KIgopGL?l#4WTk1c|bGcNdB6< zD$7(xXf7>iJPm_52;sfa*w?8N`n!PI=EEuGbgRH-%0?clorGV%ZsYi^9VdN;HCxJ{ zwkvovc=SBWQ`}?|x$fuNSC`r;)|j*t=NQeZ6xrJ*kFJtT^KcrTvuu^CcfC*Nnov{E z43Ww=LIun1sY{bk6z)RF2Z%;pS8lAy<6)gI2A^!*8_HbjVkIRa=RVLyzE##0wjxTk z$i*#t;O-K4b{X>CG9#~WrP4z>w z!-(=ZdY%K|7!}8jJ!Pbkosbc50$fykKO4U}&&6N$bR|w9NXwhf)ozU+p= zgqx2@^V)46So*-u?-XG1Mf8xL^}XGgplZ4+q12nyckGD!-H~6z9kB z%KZp=k8C0@{f#A|rIzI{W-*k-HLn}5@TCSR@toLjrO5EO|=Pg zgyD@5tuxZ7^SA9pqKxfw?&{(WnFYY$XK@9V^`+<2|zhL!SWs`ZI7dRBq_=7u> zb?BF)**JdgTHpL6EGkTfQ*qc2l?GV`;r_k`Y|05|Iyv}JLmD-6G%~=@<_>gS+H}hr zGNVt5dd|h$uVOU149Oh^iNzc8)>cB~(|Pa3U6;PnFxoIAO}Iu~!>|u|ye0lk@*dNw z4EIi}QPBO{)ZQh$`;Q9;Le&i^))c2%8ho}rDN>u~sChclev9cnyMhVVHP9E)V~Ely zxK4K(+g0-d02ww~XCneQ-qb6-Y$a%gEX5OxKiC#IxPTqwFB*(UP(Lm#OKdmem(aesBgJi>Z;W`zDBa^q zzz#(v_n2_#PN87WNBScg*Y%vht>`Cn|1!a#@XAV5`d8jt$h|iDL^_@`s(q=w_nvd` zYHJc<(h-g65yX7m=l96d`9o0|8flqxs}uXp>`xSeTW$BG>>+G25D}?3Rjl+4I zZaPKMU|%-7L1oMxxzH@s?%uZP@hy5 z!op43sS3}>!E)RaC3f2@Y6=bkQ+tms0@**+k?V>0J~4g};6Q!%(0f7p%ZY4f{Yo#I z2287ZAS*^L_>pno9AaK7hw^TG;PLBcr>%0bFO46YPLz%V9@Q~Pj&_WaXjv2>X(^$} zgj+-Cr|Y$cXePsg?i*UcwvAh!{7{R2Ht}jwnVl{)agT25TGGqrh-I2Z8o~po-d3Hp zy~7E~mF$H6dQD&QK`#Ex)`kM*J3P%txgGVOt;cmvb}uyiB~GPjC*HkkBe|QmoEOAN zz1mijDx1yYiI1wmg$q=2VNL2BB}+$uihSLzhjnP7uDUO+3l3VzebXnS($7?KJ`;)Peu+#AS2`CFo#}#l0%RXLVQ%ThMIJQp$?FTXsx&icU z9uGyp1WZ1EeuMV!&=nXzg}PSb<%cE14dsuJ{QAg+D=C-qUJyS@!*+us_EzivABJR?{RByUbx)JmN z%C=(~{qdXIOPqDMiFKlV;YA3uh*iD?O(1!*=F&%!xvS2-RqJhed+PBwWP`atcq8sT zw2sdmD;?1t%HrgX)`Z7k$8_HcJMg)rrr3I(puO@v;k#~}y?J)?CtU>Y6qi;x%24GX z{bTaYcUj3_xD>NA-e9X2nD0i!3-G-0Ga6P$zI+l9P4}~L+c5dKl1Y^bbfO=~H<_Y+ z>*3payZ6H6_E@{ljafhTqHy)3Cdy*sLe~rV{pGV!Mnq<}UPQ>^*K4BGfsZC@Lk`hi zgrD;DI>%hT#a~+U-`5hfj@|MpLD{C=NQpE=5n`Qkl;sCyullwk#(C3)2yN}ka`U=p zST5HDJz_!8=sJ=1xuiYVCh!xlE2Ppxn&0hhu>wWk`cDVlrZ&8gy8<&vxgoE0#YMT< zI@DR99a~cc?%y5C@ur2iL<>Drgne~Q9lfJC-Ov|u0&r`yopNxKnSM#@Ufe~{CrDY2 zzfP-m({Hj=Q;C06OyjoA{^GSeFPFblX8<0-8%f zQh^Kc1UyGz*eU-l>mK(wTm|AlMmRX6Xfrktq5#|x?xxKf+iM8NOfG8w<4XCD)^)+H zW|+MXGsu#>thiSmFw5{7{+BYIs2z~MTy^cJdY*3h^}Tn!zXsplWDI%5M>1nL(eT~E zcS!nZzl6WMZ-6FyH**7i{`3ptM#NnQ`<_R_!{F)6)Yvf_Ojga#> zKkH}h4;k4`Xtxz$!`$L7+8nDk>>c0+%GH>~bx`s|#8xZrVQkssgF>Z6v-%Ot{H0q3 z-L{J$J-N z+1`E5KWlRrDZfPx(`umIaC?ffYN3^G@~ArUeN5CFuBW>nZhrZckl!6kytwr94%0#) z-N|e}(b9RjBFe-oQhN|56KgN>Z3kRO@HmEr>^#FU|G4m!H3i@)G6=yxb?TNq?(m1O zJ3M0=m*32>!!jJ~SKkK2ri9(pvg|X(^JQg=Mh}`tfnSm}Zg9OD=qPUl-hQrtR9R-2 zRdLx^z!j50I^!;)mfO?O(HphEQld6`{r|xom z)(AHj#M#}mYQrq$wUSb(I8L^$TS@AWG+$hl$-cjgdy{_YKpyC7+3(0SqU2y&-SyCy zr_VSL@t)(&so;^D|8)oH1s6;k3nY)nh??YUz`iq#oT89UcC%_ii-L-9(>b~aEgJgh+Gd-^#!Kk#Xbs;1L$RmwPz zS)3tH4!d4iyP3i)3+JTvrtgMc!TH!Yi2LRW#_?gi?o%7?)I;M>n_k0#{GA}Tf?wPZ zGIz|eJoglfi1W9mcIq!ZV@D3NSBvR9owGM9`TjhU6p%tZ{B@Yj>Y4$Su>jPcT=(4W zO1G*J1B5)g?|t2n@f1|wJE?w-0>t3H3qh^=t#07WMI&3{Y8aj6D!kUwT~ z9)FdummCN0(mh|=!!o}A1~1pSa`);j!j?20E;uuX{z_O^}dVPSnt?rW7;2h3&OLO>u@`7;2hQJkuPD|;=rV%^Rz7%=|liB zxz_la1U+vZ{JYNQ`15nB-;nK8C-iYSd!@+_8l|1n!)-Emu%fkr*F*A|c#aZpyNjRd z6OKkFYghC59j8FL-B4XBbDRw6A-XTuEB;s$(OFr@s3ClbXGCwJlP2z8MxC#-&CI^m z#lC^P%$I2K7mJ_Ze*WUplDtP*!L=M}>n^uw`dL zHzauaI4H}k;CF`*3ZU9GME5@XY3T1py$|@#g6jItQ9k~2iCy@E=UK~$&d7*cP3HI& zZug7dX-?alr$?9hDcJcPdU3wbEB!2!R?h=1B zFI7H1MgJtb_weNWS=$T%)3t+?OR(|CHso1Xxbz?m-8h}Tbt(Pj&O6q|+wk%E*%~9X z6aBHdTnqU++xc4OlI!~~hOQ?>VDv8;jeCZ!OF<7^z{t*N@2v~xPuw&~0dr@xXEUbz z(uZolIirS7_(jR!AI*J+Mv*Ovy`O1?+y579?-Zkp6TIuLv2EM7ZQEL7+qR80v&Ob< z+n!m&Z*1!u&;I>Sa`wf^$-dg@q*LjOy6B{nuBx}5qNPdsu#Awr?^*7M*K7|}3Ou!Z z2@BZcHFiGh{i_KzV7i)a{J9Id$F;Ogv|I^d{eyTtZLQ(68yg&6$lPCUP*ARQ{>%h_ zyl>tOkb33+(s?&TSceg1x^uzl{Zju{O#1**EfRgbqwoHxEg5x2j-4_KsXe>iz6K^- z1YAiOZ%!u)2EPdAhxp~6KdI#sqTG7yUp|-m&)0u$d#C3Y?|ZMY0p4?b-#T5Hg~X-< zFLGv-{`2Emp6IFn_j}|mbRlm$ab?Z-Yb67=--nFiDM#tRa*TF@dhX;Cbmb1GuDJjW zM4C#HXy z&bInTJL8+20~eJVXvG^B&tqzvkO;*^%LVM_2-oK5>i# zPF#xr1rn<;lJiLgGv*S4^ugy7sPCE6AiW%6nJcD*F0vaD^HUZ+a&eN;N8S6~z3Le% zcC&(?1?3+g5oJs#5$)FQJNyQTU-qv@(t!HRUclLsG2XEZ(7$s0_te~KsvtG0vn6^w zzf$z!%XHZXKr<1TogaK~%^>j~pU<;^&b?#VWW#8~8E9r)z0XRZa|bY?CIwr4@!u8q zk|2czLK5?X&x1*|^0@_W)s6@MCQjR3Zp-kUleS2%a`^T7wlt}IiXqx}8w`M+aQtJv~WnNz!O>C&OZi{j2tSk#q= zko#;uqD+RS=5wu(RamqEt$BX&g~n|3uOvt*wrw9_$Q6WM6TQau-r0LZe2O}0NT zh_KwJMV~Fu(jF*f}zfM)yg7Pb#|#>}wAL4j_D36}-thGiJz>I!4K6 zi=LittSDze1Hxm!vzz?#!u|C_#aAP?_M~3A({=D{W z3-s;^*dL$y8Xo>Ub=UUYmId4xELP5$=Un8B$=v_k`O5-a@ydC}ovU7DZjBW0>*RIH z{Ar(VBx6|a9$%;Td>NJnlN?tPrb{=CCse@Qo`k~aQM{9xa`Q7e`Qg6wm|n!tR47rp zs?~XDhXi~3_O$`4`A-Cq3pnEUJCJWG*R+kEFhVNzfo1=?SNqvec8iZM*$XWl!{&b~ z{|(n;`fd|+8AgYGV`D7|*&#%}B(duQQuW0-+Zany#a|U>A|$#Jbdi@-M1QtR?Zv;@ z&tH=IQs$wrahfFdOtrOo$tuKj3ol7#V1n_2Xn#ZIlZgdlWa}^8SPAz zM0>`Cjr9ExA8rS7rnEx79HCyo=AVm&_;*!7O#EkCRk^zi{9mo@+VL|APO0 za(@8BKj4?-Ja#sUP%ClHCq{U>9T0lsgC>Xskv6@%RPOj-X^a3f8nPuhgCM$LVB1c3 zQfkn=2s3Jt$eG=xw=P2Batfld<#8jTgzpYOgniG31o2Zas#ZJGZ)|7BIF>y^vhL^! z8Vh|t7E;T?AL;0!>T6~-{Emy58sFYki@y)p&fbau37M` ze#Lq9kmZ;OHwpkTbAv$Or~#=B%E6wfTUi1>29Zt4FSWYk#NCIPvNX#mQ!e7i?^_Tv zI|Z&_P!G=={eXQ>Ij4bX)D8FQp#&ma?$Z%-4G*Ak4TTcJg(3r0v)+U56r_p~E6eHg z%0CTrn%h3f7bq9=426BgvrA|;N%p3l^b|oIr5x`(o+>}U@7lsX08k-Vy&!$RVDkd8 zUqR0hTVWo2r=vf43ki4EnDbV=u^_#$BlgUVg4%nXRe#)^`hXEN+2$C zmLwhqi{@udK+6-f-2mAN>_ zjUexJu>teO+L3P`kOrjz@>((yZbD9c%pgu6mLQ?zH*y$-3?%SSsvu0v$kO1XMJH+o zZYb*_n=gNPLgv8sl5G+}JoBfZE-!7v{FD0L{-tix-DzM31;F}v10J!;V}JtVi$MOd z%FSmq!To4Un~QxWp^Dxjb!$gzptWz@R)zFeR!p43f;eqF_if~5;i)lQ%i+RwY>;`* zi~VW6fa|yI$LxFs&FyemZ?v}?+*-uj5$4A#l5$={ptyq^+$yd8L2sjt59s3+w}gp; zk%?8Aom$V!pLZ=43u2@GEX8u^;V*RScY)8=+@T1>1>m~>yWoz~{`%k#TVJ#fGVwM#B2xe@U$Qm~>j9h6n_D63gP9 zu4noqa;2S{0tKc=k|qU*rK4%VtfjK-tu#y|L=V*KYBVRBl}#~$TwxZ|IP8Wax8eBk zrI28Y@Dt$1aa?la6E;0bk}lY&6DA2Is>@shQ0g`bqn|SW)#$^WA<{a@T`OD%nvH@U z@Xk;YNdEHm4wdUuy$n{)?c`tN_yb%Y{SRFrKEV?j0uC;5zPtTPN-u4#`wU;{ThcLa z%?P0=!HVC*bj}P2%1wTzz;fyi(*>!ad(oC;U-|YMjF{G*dixwl`kByu`qAJc`q99* zGTdaHzKQ#D6f#vwHa5aX0AG3I>rj4Z`%kH=-}!11 z{~Yds8wWTTo32wko9-xEQS$A^jQ5`Q_S#TqmoU$SD?B*wcO1A?j0m;0;4i=P9E)Zz z)F;SQie&(vjr{Pwm*uK&Mo9n(bf#MJ`sjb$hr?#4!aS^oigM3ByGH;ZS6=KJ0SNQv zjK7_E(;CB1>P4_@OY&)NXoiMpzw1H)yXbAifomGyLWI)ZsfmMA)UE4W!TOMK8{de) zGED(t@v%^&k#op3>g~E7b-Y3;`Iql54nJbYuXaL3crYIeWaQ#`99cyX4?s>3r2d`--8wv`ipNPa^LKy9`o zg~Hnc(e|y<*gdwpFPm+#4aHTdWi!5~e<-@8hLAh=EC_4_!G7w?#I3(BTj?s1UA==` z;NnvQlsd;)ZI}ZS8gs>1KKZKOJ!haQ9Aj<+4C5X&@GsaIDsI-=L?K^&c!|24gVa&B ztG@H}_oRv!C3(^vX{bI0{M2;kf%gQ$af;sjV&7n&pX~qM+@{$0Xy)CdYjkSMz|7*g zrPt1oP`=emBtj*n{2=qav-ZMY72qApM|p4YYdmkE><(&l@i*}-c_R<#fn@l+{hGfg z!V`Jmc$*H!0WEtUJb!(cy$pEmCAujqGlr>_mXVc0`Rgyj8;xo6%S|nqX5LXE#@{lv zZWNtA3yk|X9{~})~4uCSE{TeP%H}e`%2GG1pLV63M!5@AK07QM1-Q|7r zKMRhscRkZ@S%wcw{4e;kaLaiDv2y$4QbUdhmIiNxlT_OIU=6LHCbQwK3Euc-uXtH7 zTQn8cIBVz8>}U_B8tXaoi|G^x@8bs<-6o~c zF6cPW{gyC`;%B4yZ~9ZC+qB2ZH$$(x6k{E_S91EKyOByG+s~P1_kER$0r(Gh)F;m( zPy6+1DQ%Lm1I`sT9gT@s&dY5RFTM`#nzp zc>M(SAE-SwL5^$+J$SrEU%A+c_}>Cvrjgv!>?#6SwhKE8l}s=MyoNcZ@7!)T;r(dr zN?}HBeQTw=GHk~Hu>gmaJ}@Pj*Q-xEOG=#*Uus!hk}(hdwFLJm_JPoE=idn;i7`NR ze7~8|j`f0hzj_iV{w=Y?qtLThxcfkrgm>cOyXLBQ9e|BteZ_|g>*MWyWPt(G%NMnm z{x~JY6CT9I5<>$_AQfB^Q|&t9e`$&Q3>C&THZ=Gi#Xey4bN|1@9L#sd`Fd|9VyZ!) z?7Q>q#yZmn2B4ka*oZ(7Rg-$qQOwe*i^XMd^u0SpdjMP16YWWZMMx;ziQ=Ikd*|}$ zYqa_3@afN+3vPna>n+!hBPd<`51q0C3AU~%Gfh9@304%T;gyuo`(k3iQ!&vG6WPPR z#Hh9}R+B0>`B%q1dD6>j?EtfIWG)0Nn89yo6;X5OgcIbHZxm71|6Zi#0K~wpoWiTS z^z`}vcJg)hf6YAnv1KOJ>wV(YSkf~ij;>K32t?UwQS?brPq87jjzOIdoXpRWBjogUL_5K~LGs4|kuN1rTF&CQYN&CkhP{Ljc#(_~RUk11Ud zZc$jQvBO~AHo8=$a3x_gxlnajY*NGLgk*FM7wLd;0I3BuJGeLqq&Be>^fy8QNX&l$ zJY8^hFv5UHp4N&5Z9=7tN==6;hJSmA+Gk)-OVRCY4357e);jhmc->zs(gs78lp<}= zC%jWmbyCkbbcR2Ceqay?NAT3BT%ePc5=t~pE$K~@(cqZU(kPzP%zhn&*!qO9Zbv6r z1Qm_c;-CEr$>^%s$6>PWNAUE#U1-jfP&5%Nd9*~g4V(Auo!w-VbrVLWe|{JOBDIS= zyy31v$#qEs#ppm_Hn^Z3pzfh2v-#*3B{YwIvh)XNh072+SW$pr{6Fgi&M-ai^Pnt^ zMccu`#xm3k#_s4GEB}sx3waqw>yrwKZ)6K@3p)kK{BIC%5;3UPeg$M>x-GEt-9#I= z8Cna!wgZ&=l4693l9@`;ldrFZ-OhL%pQ1D z_@|_JXHa_lr9jtSi^`AYk0s2c>cl4goW*&|3P!^I+D)B9bX8x>%98Fx+qnYQ%dsLW zem=O!FhVLI<-b+&#-P~SHGE@@f!d)qB8>99*(3?1YVx199elhA9dTMh!7ym49-{}0 zQ;2^980LDQUHX*gTTuI;ugmJil&T6o-iWL>ELIzu(RqHV(N)o$UXNJ zu^!MTh?J{88EZk-$Z86vFhHD~vZ1|PV%jD%Ca^-$)(G|p#4bt+PONsDV!_(Dldnw# z2dnc_07cP3VPm(aY%Y_CZp(eSMT zaaAVz{lckh+{MQ*Ye&wMMBHHNxWGPw>Omkj$_kLwtT2hme8r^Pk=`yaS8r|liCxOLZ$r`mi1X&<`;g8`&mC&j3H6p%V`lKgnG-QR)U^!ExJwx zt;oR2Sx^xysc?$q7r8SL9XLm%fI3JKFJSzQIJp{yC`a!oQ#)}6_qRx*Nhv?Y#UWCl zaRP>ifYe8C=D9{cVxMk!A+y(mv6$2blJnPfPzVd7=nH9_GYSDZ z4a>uCH&15kptwc?c`1+zTyJCzFfK5@;Lspi)oc)$^KdUwwmREiFdUe~4x_6`>|oVF z2m_3J)W1u5T?F$|6Su=V>OePx!Gb~>r^NUkoaQOJE4IXsO8zYA{vfxdXg2*>lJzca zQZ=wPz_ESE@Og~+w0xWv4wxJ)t=ZVNF*Hwyn+>7mEQ@ z{uF(G_-tsljWvu>U)M&PHM;$J#Z9tiY9_Uin7Qbe+|_e0xVWVCcKix{ufII*CBlE* zyF@zbeS>=FpUe1qrV)#ovS_5Rqv+10QPdo$+7K_BNy(U?JI*#ArNNq5O@b)pDdI5E z2-C;jPqd0kszs@TwpJL4h{ml}$Ca}o~zx3JrMXUx=w>p4|;`)HU#H;_cWI(Xt&HTD#5KMn2oiu|igOsc; z!kdy3Yq5HlFKvi~|I6$?bW*V(YrMr^X;YYCzMGSoUOWPwsG>3m<5)pQE*m78@}SEw z4A!X@vv8JFNnWXkU_F#{CFU|B&!t&B>eLl<{~^W=OVF0$8*C1X^jS18OdJLVJdke9 z>@uwl3Uf0jcgZvupH5mT3Y@z#I@Rn>D8`?nE)aG7`QV+;S-?Qw^b_T#BCxwS&r?d^ zDxqrsC%zeKQfl}NA;`XTxnrw(Sj=$x3xl8!3v^>S;+{YhgH7@(ZR0Z9f{2w zZDW?^vMtnKT-pdu*Wb=7^(={Y8M)3>r?nx(s5qssJp8jF-k9toWwQZ&18m&4i>(+X znqUxbs}gp=oM=Ekr3GUUOnMMT^qQFh*l?sG^rei87BM? z0wHO;Xg$LpA8Mv^PDRk?YWwFp>A7Y%vRum^ukgPM#7~E|C+8r}CUmIT`j6>PueSAa zXG@DlEl+No^E7GSnd>B;tmOZ6uymO>H6t<%#M=abF<`@X(u*zzm-2BZ?$ySf{X5Lj zeJKH#o6!W3`vQws!eQc=V^L&5{4p9e=vUejM(=A5))uzTA~mA{h0t-QS*KUWP^YHk z=8XMwM+VPn4qc$GOu90mD5(xvq8XJyz*j6QeQE(C|AyA&CZY3A)k5cgn}e#H+4V%> zd3)>+*zxq7qF_?n<2$v!lCfjuM8VTQmDR^liTEQTp#qsED4`l9TC#ZJPBjhf7ZQ&+ zvWW0x44^vb29wM3RsszoHBg#sv=~nQGCre1>Pj+R3E}c(QNtM!x_D_D^(kZZI9=ubxk5MicHcf^!`4sqMGVxGx9`GImGH6E!&(yLo$oE^ zRvk4Q=HF@MFPMeHWhwD5Nap7)kjWkq#y#S4T(p9=relwbYLOQsA1u|uEQyaw>sCln zvQkWPd59+Vj|ML{CLsPR0oC#in~52+{DmQ+mW+A9JM$zdCCgn5MzUfF-m@86PWs9p zGLPb*x;bogv1n5s#fa`^4aS|>>hdst zZF^B5m0;h@wL+s}7fcIm60y8YV*+SKF6amA;r*n3KtE5n*gQ4`O#4=$N zfOBv$qf`|+IV~tUKY{%C+FMb+hrHsFn$es#b z)oVGp385M~f-5-5-UAqHm3)OQ+q6nJu+Uh%NCz*{usC=w2cSPP~N6m`I{ zFE*X1_2UD8+-Q7Mxl*(*UAs{+%zJ1BsS<``ybyAntTWG6{Hy)P#R!gx0CMv_&+-Zi zJu(>dpZX|mQ2fe*`w}7md~GC&`VzQ1{A=$?B>u}@1(Pze+471@6$W$V|A(^pKPb)r zFBy-MjhpL#(8B)*G9CvP&;LVo{onN7t6pzE_0>0Szq!t>D_2W^<&7CDTc&&p%*Jox z6gp(hWCB!jR7?;OSyU7ViGvVn<-#@HT84sJxz<`4ZTyDXGb~$!iZ*w9+fvNhma!$w zR?QUed{+y~krt1)UH~u=2t42B2l9Np*PQC37>6Zcx|1MI(s4Q{gVIf2COx=^9c62_ z*7sdCSpfLM=wU^>PFC%+HLvl!mV=XSb;HKo>pRUhrjRyQM8Ytw3lw*7r5k3S>cTo; z?+-Zs>)`g8tPoHV!(S@XXstDBj05_;GK9VCAl$QLFm!kA94_FCpRG(Q8(QD?l=ug( z5*UTNT8GUTVLC`jcl-+f^|_rp5vlyb^@|E*mnbJsfUZU?d9ZZ@EeF9SkP8V~V$r~g ziB_`wp8AQMH>Ru@YVpmAvkOf@gsE^m3C4biiI`Agf&7U%<^Y-0iq*yVKef}YxSTST z4_2-)g%#vGN1G^Ld<6lI3a>BhF53db#;~$%BxTWUAz25)yci9%5`{T8jKJ*_p#-CP zia?$}m+Xb=%N_HbAB?G~w@-Gq{UF@_F zZjp7O7qU0n-V43l;&20I!a&W$BM;eqi8}!nN!UtS)Kk*-osq|j!E9|Ep_M3xC5SueA z*1k>WW9OSbn|+3`K%}9BVSq>p;ilgUW>`l#Mq1bdyWfws z<67`0%ab%u=zD3VKHs&ZDmI~boRKu;<5Sii!ydk{t-Co|N+b-wdpMFI* znrAxFdgOXwx)(YI>v|Ym!)>c`kNFH~rS*WLiDI^;pHkSmrN951X8KU^ixH~ix;7X2aLEAs=3GG+$ zA|gq8Hl4)uOXDBjnb`UJ1%gX=HRuTEJE4?3luyk0#Od_x@t{%hgyurC5uNplyU*rE zQ}fXtUTxevo~q|W1BC5|>YbLDFuJq$!;+3a^x`#=XQZ_Lq?X7I5Wl>?YmWECZLQ*fz4BvPlDcj98Bvoj1f}=L~xoS zYJpy(2ZWxv>;>`3;G5}^NvGx?(jG|~L3jsR+FcUW~*TEg0g$TRgrrZ+cq0`QA~Vg5(~jh?X^;eKNB+;Ft^nfFy)j$o9(NfJ=YWe z^ofdxj@4Z%9Csi+Sv=jgpjCdtnB!*wGc{23GwKJFLA z3Y~jnc)FE%X6_q36YPVRtPL`|3BolZ%860;a*$;D9nv=NcN{E#{-iwQsF$uA)5449 ztO8D$N-&afHUL8*tT#Kmm!%txVRkpeAVjm+dm~ch+hOLVkhjIaiV`lI+z5>Ig~t#6 zX_4t(F=X2E5lh-%UNOia7I za$7}Rz>DO3R`Fz0M65Ud#EfVvq5-jXvMu=NOVCFcRrtlNu;A|3!i{18MrGJNWfEFB zv3qnwhHvf%8X)2Ojl z_%8>h^pHFjB~QK#AYK;Sekn0v z^R=gAwqX1ub{C#!5^%`2XUz|Xx&3$s(J*Q#E(G%PXnA(J=lcozg=*JqRNOw;#S8MX z;d@bJk5_kgWn~ojW^RAEX4qx%TqT#@PXAZvQnc0h)BE{wtZY24uDZ6e4p$?yike9- zol^Fo(aO1mx+W|Hq<{X>xjV-rdzCa>K{C{^d{w$=z!ki>X>8(1vy^IWb9kIotvr3% z%M6E{9xr`ivsifPXg=dyMOTOA_>n?`y3^*mst^6snyzULcjL?%csH7ku{l!X1qajcM^u zMxkLYVTcd(a|h{l?>`R0=3mYn3D*?TrePw_USz4bzWm8DZr}p?EzTQLc^j@-xKwXL z`zH@gg#6ADX5L6K@@FhmIwZs+7w`v8+MUO2()~P0qZ028^1ylm_xYU`KrwCJ{ApUo^HlnF(@WOOThJgk zztf~LAzb4DJG<%4LYE0|(F8kjB%ygYD4BK4K+f30I)$k+Fos1LK42Ex=D8;9tD{AV zud!8+5bm6{7C}Bu0F$RAg-7*bJtS!inx8|Yq_z#^vfLp%Z(^67mnq+C2qnrjyYr(~cNL6j} zgm6jLH38EFAI?fqi^Q_R#}@qT^%vir+mn@vSfIs*wXHr|8x-G<%nL>5C(a`&+X=mc zDsH#lqb;B5_o+$eCySW(8}gj_KnUVf-cqfXsxo-vzZb9n~To8soa_& zVoqavzS7d};ql%%KQ_?8E5ZR0a%OxY?k%>v+dY3e8-A#&+t)=rb9-mAmp=7cmr&(M z8faV>ZF}M1Xvbg|Na<@ zL{ORs)O_5yC6M1?pwH0Cl~HbPuWr}5>XzBo+M&-3E3L%ZK+KxiMb}PSY{AIk0B&yf z_uxU<*C9&F{I0SI=$DE&OeppojC_wW1>{!ds)nYf%=8%LivqsS@bJ3^QT3a~vF>B%aO}BpV$i@HfodTl12*(rc@T7) z7SeHI;rTeuVF6oz0sGm>LegoUu5`K`;Sp0BibV52<;qqNV|h!&pPy&dws6wb4$ylkqA^!3 zk^R!t46aM0FNSC3Lk&-BMNGVBBewG^Cwcsg@+5;x~P@Pv2iM&S`ohA*lV& z#YPD2N=o_;4%%5-)LvjKMWGj5NF*RioIIK8BWb{L0tv}Unrd-CB#s|f#S8TT=D-Qm z`kvR1#f9oP@e=BSDQ$jb9=}2g0Xcns$X30y9_t?G{Q1isS}w?Ui`k_-rPA!U;-rDX zE_w*=!`n@BKOs*8;t5CfwfHGwUv4ASOF(-tgK~ zw`j*gyF2q`cQI4`r8pwstPv^N=g6TVg0V1(RO?>#ZS14-1s=#dBIr&rGqNdz-aP8kqIg4j4`RKNzeNrj7n`Pa3^cg9=2X!V zM@^GSWyqHucN#jLFV}Z{r{^<-{J+e{ahD0)@j@{EjGmADlWA46oyY^;*L0rV`di#J zB0(bgAMcb4;`sFg>85%6Lziy>z7poIJ>H>4<-VS{Q8Hm1?nQ!ao*t_^7rUo|`zOhI z?y2#6%qYumoPIQdL}!*nw4ky@#t30#3j;>UI7Tr!Ng;Rn8fcu^(doZMs#%Z`2?q0p z@2#s=%~-3`H)S6+9~~YA*&JUw5|T{(So=RG-!ol)WHOgb#Ck`w#?sl}D}Ly|sWb64 zqII35VsC$8lGid0_b#uOaV&&a*%ZKG)VBT0Rm>pM=gV7J8ZESS#Z^Muy2yY}Sz}Sm zMSqs0x|`nxZoJH~h@i%&3{=b>X?dp84kFL=!CU-L&j?2K4_O3;9<7xdIQ)2XIA9nO zzOzE*&V{KnDWvu>L|3_>^lQ5&+cx^I`CzUXTwSeBcQeC%mJGLjb1@a-6$= z2W{1BHCyp;yIQof_p3BQ>AgI??+oWn2@iONG=@`l+lbJ_m_r@a;-&p8)9owmd+n>^ z+szwFHY-^6C1R@FX!NU_lt^MuVLoXl;K?*KK2)3X{;La3q#jW`aK4dg6Xz|U_b{%*j(-0RPEUA`2u?6ewz(Mhw7yT>%xD2`bz`Se(yggu-(s`nRXEa5 z2Giqj_a^S&Q13UuY{O?Gz|)B4;~ms1*AGhR8;_Ud!6t9wEWRhSN`*KG7B<3TIr19F zQq)mBQk=m<`{Yf7~wb$M6{}rm`f&aZo*R56G_p`Tm&hk*w3<`#CQem|>(}RDYvwvi zHX0e5sLro-?{Rc}#zYrjF1-_O)g#Tk9)PExs#{%ed*SbgM9ilAYg`6&sf<(ZT^M<#W^qTOVPPcRJ@kahP}FjiY?Wda4%aH24BQ4WQ1c+3T4Iyk0xr_s-$xRm zC>?9{x)kvSDeSlj8RDUk;c@?7!M}OWEChC|aUtk!IEpGzyh4KmL6yJ)R`xWi468X@ zy_kU5QXTN$;_io#V|^Ceuqh8=nQXCDVHAnh*ohu1%>uPhkl}m2tg8nI=V|&#O8xu` zI*u}W*kTU#(hqt^rtDUn*&^v4ZF}hniU1L?dJ;*NV&}>(P8mz~2RH2oDuf2I)zwK_ zxGjvUC~eYoCx$x6u+HH~LTs-reeXB0(9zeK>rkWN>aGsFxn0>CJZ;%dYaXX%%6(Au zF}96Og-^`H+Sx(5P`&WlgSCO$PkWHc^pyxKC%80;efRJ9A<7?*rR(dLz*JxDZYCE} z6G;@ibOz1r;q#?`@nMH&O}c3f2K!zVSI=)ele2J1U7r0#VfIqORh>N9u$PGdk)vEE zZ2V#}FaC#p8mR6P|1`NfsR0U<8cAI;a?mT_IZ5Uf+#$2Q_$qBxj}m25`5E*#tl+37 z&+{;5L61TK;uiKpOe3apGxq&ZdweX;uE7kxUy#Cog;kC8{tAr~xM7tv zjHvA*OVBtH24l}OLpVv`yJj=u>o3Q(0v+_+mUHMh?G24k?#I;FEDSfgEl<2_D; zWRVBH4wE%}D;Puq^;7w2!yLVO_1^Awo#HdXK!pa^USXhvdPu6>t!({@!-|1-}>Us>&W|9%|wQjU0zIn9EfX>Tu&^9L- zzAD{kL-ne3)Yg_(H>2}t)xMR~Es6K z_vg4`;un*8!%W4m=}g?-ENtk?PtJgCj>5S+MHz)Ndpd_DjtGCCEOH+s`L z9oN>`fCH1@rSJ=6bacmkSqz}B)$<|8XQc0c9m|*Tb%$v8ec2U^RjWp+rKHz#n9k5B zF_cx|y!JJJqwQRDnyg2p(?kS?xL+Bn0G8S|Z~HYHw$gqR@Z<=4+z8i1)d>|e{&Xg; zXnMba_F><5FG}evsvtU0JP4{)l^djPTJ4;F@BNAI4c0HBh;0nlKuA_>a}+i3i1TT_ zI*r0Nj*`a)dy%HQPe2cf3K$#^$MKsl^!KR&Vuz6(`Hv(6Dj`Rvd#2`3fcKz3{ttw# zM?je}`62aL92+|F<8L#uFONdf&YhNH?L3YayfB0Vg&_sfd`q|n2wvkI|4299kx+!x z#jy8H<%GLh`RA=6MEpTxX7|!prHRYX=j&IxP(D7|Q!S`4IFrB+lApNxA`K+fC*6Ww zhXO;Sm_nOR2FZS@ES5FR$SS$R%W5tx_w#OegIz`d!eX7a=X3iGk{40T4Hy2MAfYem zciaum*QI26n42~`YCY!-dsmN&=?Xg-AjXm1fz2N;bF8q@3ob|#)e!*F)ZELJ1JpWU{V*mjOCk4T2tC7Hq|_j z`lFf%RA6r3crPUSsXZz4OgGe~_@HK9a=`Ms1)WnuEKRz$VN9@cYEE4a0IS@3v5S9M z8M7%G{diSq*V$+~7Vy26xJ7s^V{{k0TfT|uFjQQp$yKMjs=-&~uzR(|XxmM~8P4ys z+!xLzu(9qvnCITE-%(|{4ws#7(AWWNZDVL=?6oOLS1SkX)Jiq&LF=b^L!ZkS} zI;{)~3oxRO^W3(+XT4?*T}n8Py>Wa}8pm2Rzt9e^jw!TNr{!kh+4I&~XobWrLpytN z-(Yt9PLoP;0BN$wH1uw>;0W3*4KS{jdl5%&DQan8q=e~NI< zQ$y`j%tU!~qTv4lJ(^%8;CpB}*C{9d+>^Y_-H zI|MAokJ;6am(S0taPuc}VM*yTlr<6|*yR8E9g!(5Yq-(L2Y-Q{CxVi|^A3EA-4Gms zCjD~T=Bttu`xKe0x#t6;UPyg_{#vbk{8aK^l4RzG_A__hPW0$(R))RJEG^+$mNo{A3pM(!x(k2d25 z-V8;zwo85}$#Zp6?U>b?*rD~K+oPGcu9IfRMvt`NZ%5cVj{5XXF%bI-RNT+%mo#MqtF4qmHt44yL}mX29>=}ySGK?#jmo*DzW z6%{!)EPs%)!#?Y4fz85%#oWG|4ZCiOYBX$0moYvmj4E!%G&gcV1wGW3l7r1|MTx}>hC?Ix~ z=&3Vbuv+nia_(fF=CdZ9j`DSh1o8JJSknxs zrF!HBJc(u-F9QqxA1&o2)fVN_B3y_!aUJt`kyX)RNDkxzM>sPa)(x!{Vg_);DNQbq zW_2#Q{q$my%Dy-$nk3Hglu67k?K{3a+=8N$KS$0vA<%j+#ZmxS%EZZfd?F1PSVMz) zpr;nvWe=~NhUj@+L}Y8ETMmcyPDq+O=kTVRgXv3kw=6Dqhxf5yEse zf&e6bj+~~#3OBDXyDVRm&-7`ead}R!#Hbcf)+^(gy2}snE=~=@P3KI~RN$zptd~w( z=MVOu2!h`zj%=|Oix#vma0MpR{y}I)5D(X?4pzh7wAw>>zL9@H;3!m@cVTj`_jIKJ zYH~RnVWqI-I-B?ED*fKPUIAhHZ^rAiQ>q4BeLc5s!n9s-#ikYW%F4h{emDU#mby@| zRg5Rd(9mv-Vjfy#uX7{S+$IO*Y$^#bnRjpwh7!Wz^pY> zOj3w3CJt>WfL&6pcyAN8ca`a*u@c(Qbks*^75DiH{g>fg20cTm6i5e}X8~fv8e$#S^&-)vG9!osnXLVJOOK|6df~A{^d&$OoB?iSMXZ%$r>vtU$t8+e{E1R zfw52<>c0i2oh>;z|C42$*B9!*MZ~^hRsuw7!-4-Jf+PB0I3t9H6MrwPSDIHpZ`I;& z-y>K)?4mo9!p2_=!DZ`auyeL;9D3%o5vk9F#i4!HXzGq34GE=?s8^skr%9sbKv&1- zc+N360!KujwT>L0tWKYGvC;iD)kF-Q>1;MqXz!^1fa0`2IfmGey?iodMuU9>mFWbKYU8Pv;=%$LOKSi{#2O~w% zk&_uNoH~}{GvDcR3Bd{JsRX$z1B#S*?;m{Fhj}e0y~H~`12F>_AUD$>^7D$pNaJxh zq2tVIaGs>UwWkQBJ<9!spCj$8Mbel5>O!#|#}@ax@H%>MaUCK84lSBF@lRS5J(3Il zbO=ix-r62Mks+x_6sV}`g;rI=rh9y&2CL8`vv3K#kHs4W5*>nV^>bC(=`R!|ijURv zJI?v@r5kZ~K{D~Y3TgX&AlPmGFV4=Xxe}&p!#lR^OpFO9){Zl=ZQItg?v62Z+88aSW2{aiUsrDl`oX`}Q+!35i!k4i_K z+5e#NvrvggCfrUuFpZF#bxu^Or!>D*u2VQUB}6IPD95C{}@`XIuP6vl4g3GL;_*hP?_iN@~>kusi zfHPs`nLUaD`wTv5Kpb(}EN_720F+#olr?T{rcnrI`mU@+OkM#UdIe&7MvEY(GM0)b zMeMI1!tMN7GD@81l_@Fv2HEX%NcKYCUHvprMcYZV?6hMF7(Hw@vby8?^e*?hrNc@R z$_Z&_QfNs|DLe@X!BAe{7Mqxx!ke2PB8BftbF&Ml6pEMy!Lb1Q6Copx zCHnfL$Yj+v4%7NNoJ&>Wcw}iH-QqA?Q_HTm^$f=-S~&0YGYmwcu!8J#D)&lR$e4qs zX83$qoPdo&32PmXR;KRMaE8uE>$+ry-|q?R(pD`cMUmTmWvjtISQyQ$dGdkc_$M}{ zBqhbbvk&*aBnAWC`gMXN5t(%lV@W-X*daDJC`yn=@^3|`RCrVPM_y)UZiR8&F_eYG zfy{*%YiLP3i65QV8F9){edDb7yM!T}Y|M_Ci4$sZ6Wr<|5yw>_{tddq1xrdop%$5Z zytUSEy3}89z;v^JSk0W411V0F@z`uE(& zDp&1FoIc8ID3nKm0{ykMa9_KV`OEl6OwxhNW?9#E50uXe7F-#ud7D0>%ZhKFcY*DrHPCla9zn|g>{n*3$t(o9%G0=ew~ zUN;so{CWb&#*ekX*~yWtTnvpv)7+>n(6edt26H zRJ+@`UO72U{c`h4g;uw6v;JLZmU?81L~X5tG$A^l&z+0L9{ZP&Z%yblf?l~Ynd;2Z zafBir6T^KiSk{F?OGA2oU}pf28yULZ=|~X9Lx+LrfiaiFM#A$@0uRrl4g(XmaeIlk z$5(m|1!}6nUl?LAM0@5hOG!SIybTX2nappAU%$9cV>Llx@sORTVJD?Wip;kpAH6=nqxRWpH+2)HYg$CA=Q@`k=^2W9FAQ^HYbM>PH%tq zkbJqESOf7_Vo0z}rX$)woC%Ihb}Kb|R_`&}1|LTxH4lB{#_18mCCkd^HrT=&X1i)h z6vrru@Uu=uDC4SSOJo0HkEM-PDU70N1K8PODr+RV)hm-~W!0!y|Dv<~QTenKIzD9^ zoXtV_;oO(e+a*x`dz#@bc1(gG=6U>+yAX!%y2M-N3(Y4+k-8%137Py?c~DLn{_pU? znFOi;JP6}>Cq^n2K#gHX?in6Vy-WD_o@1IRYjP@<%7*p>)Fufq>)ooaIA*(aW50!Z zNOq43ugJ5>aUHR5*&~B)8-I)8D&@)Q$?AE;>nH!AmL}wDQ-h0T!V7y5gwQ0B*o&aT zm;*jLCfpU003L;qwBtfZVtp@K`A=C5hCK1P(H>kpKKE}%hc4EGeF2@c2?I^`6pETf zoA_(ybVnA-yU)r>cEnhs^nN5HZXLb|!^KmSLGD(^)YC8<%I9G2mB5FlJc{>TCH_-^%R|4D$$>gp;AB1+|mu7qnVD-IK` zg|+*p+8f-9(07i=8;}FGD2@SAi*grZ_vD7(Vl0fy5Q*pIUPFu!8Z7oDBZJ*w#*ycOO8xwS?w)cM&$-|ebHu5Rcd5OG8#2j~sBJEnH^;uN# zQ6?3rZZk&?)5Yo+U9Wo6Z%!=f~-~$v+s~1!8tjz-|C)}W*YSeq>7=ky@gKfk$dj*j7kUOP?h{5!Zr%s%U+ZO0y`mTCZ?8;N< zN0ax=HqGYE&KIZXH`U+R875!Pr7HEC3VZ-LopR4-|JH@XY?u=M)dx^SBZTA7r~w}q z(Wl}~b}722#7gJvCP}t29`0PvIl3Ai3n$B)JGiRdHiJ7kf3{!E(QX)fH38iwSF2#$ ze4pFot9iN&ryGI9ACFz%+|JhYWUKNp#m*A`*!wiHM@adD16*z#YK8QLzp0g!=38xv z3mo7GFbX(Ah@t}sZkr)MetQ>SM{){ezgSZP=_R#5i6{ICyrgQ6cCqbbR%O=MgAeMpJbQ4o!~a%>s}hPvNVIbp_$F z%BIe|T7UVzgH(SqMFj^X+QWv9i8SQqEo?-X`CyO*dM%YSSC?>AzYB$Ep7C9atZKe+ z+a}Lk+4&rQ(Y}kHLU{BWvVhn>SrojszP~)j++jMf%`rZn(7d;oCk5v11~v*ft;A-K zp+j-)aWYO+|9H@&_L5a9O%_D0jY2g{8`R2_9L8X)t!y&`B~Ix>H$p#5#i%=d^N{;} zfBtdBi#``jr};<6I(LoS^zVT&Hg!}zmX=z-^csLUE>=z?LXySY7X7O`0ABmpg3i|Y zD_GE!`96u3vcCGdhLgi|x#EhFsJQ{i+F4aFmYl^>;vqh4i_DGgBH-DS6|A9&s} zV+%!KWcow_!m{wg>~_OF94^N@R4-QI4O?}e=Um*9mp z$r+o#=IH#lnF^{yvd0!2JC8QXvGkyoE?gbbk-5ynvAlUxxLn>w~Y~!@7hP!H4I#b9xL{LgXvek@l2@hP4T8A9L7M1{Dpx^%)$LdRZyEiO8g@!QLW_7Me~oqWfLa>_V88m^-pYRtMF39r~Iy~FW%CY?hdRwg>GEnh9bLEj)7=r{#cSv5 zS0uQ}64Ey?xII+4+VVsbk~bkSXfIXiQr?r-0HzZpQ0;}P!J$RbF^pWArb#2VM3m*vzTF(*= zHMr+0@*C%+u$DDNHui+gL+ksxj>0ha^8>J&IH{PBRs`9I{roL7^aMhy|FD&|a9| z#e%#KrYw-9sSbDlfr1L4=OkOVm0su|Tq3Ku&}li&F2(b+^bY?vjSQ!4{{GsL@spoZzdHwBuKNhD3kPeUL!20kz^Rp~b!+6UM0+r=85c##z_ zQ6L4_W3dpe}?yu^)E1%~;nn0poW6W0== zShXDOjYSv_&>Ye`B62%xAjPN1eT@LXA z2Z?=RQ*qM-F>!J7h!TiDvI%2I32R40(Zxu@CBo`q1LBK=w~*s~a#Ka9g)`905F5i< z6hdjrSfV834V$`D@p-m-K|P+${*${`kqa042I0CzB}jAuGg>jWpX*@83o^+b4hCip4Id%-8QwcRu+n< zDh=!Cw${EKSs6-ER+VoiZNz(n-#U$$!{SK($QB^14fc+47$CUg?iXWkTwH8yoObBQ z+<)PzY6`8cN+2vK8+!&st@%5EGC38L_4G1mAToYq;_$M}auJEz&&+%~B!3Q9tuem& z{9QiA5Gx%KzFvBYnqp$&TP(#^Pis|0dQ3S}aiu%XRadUNcrI8q{c!U{kO>JlDRVzo z%l4^Aet1-U9f)$lSKBgoXjzHiz3@kFfy<2 z?o^cE3jKTc{T_`s9Zf7>RvzjRpd}>73=^yw^jr*c{g*$?ZYhN}v6@`DnM04`d+wfY ze14hXZ4Ko39bC&;m{;~lkF)uF(q-{L_Hk;#*HTquc+BB=V|HP!+x=LU^2fH8Map0= z=BHJXyw4qJAphh&xZ|APADF#YUgMR0$?z|A(&U@7y(>{U$RPo}(WlqF>s;ztmgCs` z?7M8PK`rh4Xw3CJx55lBpab1oGvHZ#2W8`3?&`?G{ljpg)kcmN%_dOy`~X#|g-Zz=iI z@0AlV`-iXRBFMLfGC-z`AJy$RDO{fY1VaeqDVho!F&~+rlAaTTTw~y`q2=u}k_`Ah zG)Nz(9D{$43UNFQ;LybE$2*nxu{8>&j6^4=jORWWJz&=AmH8QJU4D0DXxkFuTmKWY z>p4;*wCf{rq-omsZNR|Cc}!6N57_crJ`SB}x<-^<-C0;vc3XzzZi_H{GnzKstV595 zLfpNKjWB3*S>JutmpY~4vb!n-n%tlqhueJo;QsZWH)CiO3--1LI>dA~qP=uAFRNyp0KpBn7a?W_#|YOyBCd!xdDawnEW3874X@$o+ZpG|?F@esnoV zh$JpNP#}CRutw`-8Qs&w*~u|`wFfGYo7N2eWRH+?$n_TY-2|#XVP0NMFhVgo;XRKr zqCX}tgV^v3p-_&nw?CiTh_c-gby<$?d2J|@bA`)&V&|DWDD1*`nxLb*bxe~5O8$i$ zM0!Nu>OIr$(g4Kgzm`HLAvJN>k;UfkhUji)B#uxlo5;ol)0`yAlVVaZg;ZxP)8XJ< z!@rDh;<7>t6;3FaU9HGl58}HJoz2f}zodnJMAXK0oNIthq;oQ{4lW==ieG|VCSD~1 z@%CLtTtq*J>P6hd!%~Tp;pH;ZavXFJ#{0J3;fMoJPo`Vf>ycWd}H=vGKIx*#U9a@Y2CWiwr*U&uk)&PPW5$#M0hNPrDx&CqPb#6uUFd?1r2 z!_6T6@h8XS@2}k7Ux;aTMb|kckX&wA?llYrvzjc4)M~u{ZE55`pjy@qD%@H{^5(=3 zUx%Py?4X+XON{5<0eGg!DT4kDwEtzCK zSOBV6@ID{0*(!d(cBfvHXrktT4z!g=D;Mp|<2iRi za8}~m9_A^sx{;dHm z^}H>DT>lz04rHDZhw-{G5y(0jW0llU_ZyNd%=1(R+6OwxK#~&?2Q0Ue@!>`nu<9Y; z3-dXJ*@zvOq%=3f05|}U87uwWuH?owelS^X&faZWvs+cg8(F3H`>4E!4*3U~=zQdX z=nQk`ZyCtPd2(c4)DL*o^ZT{lJ2$9ICtz}%L2s*bhVW#wTv>t-oR>JyqlY$G?n#s! z&N^3+avwZNF|F@q5vLY#o!Oz>yVeXj z@7svcj9r7DmTx5-d-S9pDf>&Niz{2;pS z8*=M30Cxf{GTo>YxM?y?jqnISkqB4cH+J%!dJc1N@f_EK`XrPBZEz$h(+{Yei~3b} zOMxVMqeE=rPI?8LgV?YZ;vTxqP;dW90LSlVVP2GZ7Kp4~ezD`UPx4^SKCU96mtQ@J zh82kbeZXlwsW-7d+Sx*)iyKrh1F8VZ(h#^I>PHFMnUB=DAc#E5k@8^uhn$7x$ujJU z#JF%e+?DG^zrM(`V|BisuRvWr2pB2jvgI-r!aaLC&*B3nQ?yTj+47g=QLu>iAl?67yxem ztPZPoQzEoUrXRx3@iG7Iz-`m#unYfzhkj^eT>*3M3)t8ZC4yO(IQNC5wEGCnA(1|IR4|7n7VBD$^((Tu#LnP=kT!n@G@-QkgvW@_ZEVk@_d|Jp!u-ASul2{1 zFRbr2^G=@Xn)G1JB$_Z(k#~hio|XZUQl&FMc@pJ~+vngu&oaLe3KjRCI1?@;O3WSp z&RAv`0?!sEqF!Wo`H~S}H2D}fAUt@)8jBqec_b0SyZil=DuYZS5sBc9#0*ag|N5Pn zN=_PP*j;+n!q6_-LDwFfo}~+Z&qrYg^KpFPi$48?e7ZnWHa5;`FO)jxiXKD$9Y-9U zrwIaK7rrI=;ktOp#jgGR`XF*b@H4BcjEGLX`*GNdInv2>avNLkw_kbUWCx>B)|1Lc zWMP6lx!)^%8YIr^3Hj-DtKy+LYql+e?!fU`8gfO>#Km5ZkUQ~P9r*TWVa zqkj+}Q2O&PyyHrFpiYq&(-#sR*j`^)3Gxvk7O|moG%L3+CtcBb&zT;aC)8R(!pIm# z(nRW?I-b;k&YmR*lbxEzk@KV523beOe9d3w%9)?(LlJYB!7z$M4sh{z$skQW{7@ru_HIoP6{grs6UZY&kTLW$?uw#+|&1LiyS*n=S#Qd8<2E}*g|3+RYPuoGsDRaYzv)_6kB9! z!0>={x_saX>LwAdU_j4uU3SDP8VEPBLmhB7?S9O9980_V1;!sR`^NkJZkqfw{r4k? z=MVJ$7RV@5KbmtTz@Fmu1y}!BVEA%*L1KgMVE^*)O)c+PgVDWcJ#h6rqB25!i1-gX zIXx0__HN}E&G1d7^kdU*2o!~JST!OU_?1Tt!IplnP!w9m2UF1$$AQn}7`7@Cfdt&jbDF(`>L0 zy0FUpx9f@9ZK$z!72vmh z59$_g#OvsK|3l;(96Kobj-7`pr}t%hcu=z_GsTqyRxn8uA>%{E#a6krY4W_pq6 z1$U=RhX6vJ^kJ0%v=UeD_oN0`*#@hbm?8#v;O=+<5_9BoGns@sAa1?|y``!u>rshc zkb2zw@c{ahyY-s@Hhl!24!O&Czn!qJ>OH1A;Fqq>%`f=zVC%$T7w*tO9y~9kFc$jm4vc(%G&gTFJa$;efn4p!?qk)dMR>2 z)2~MT5G%K>-#$49%zibsIh>*6YTnS7U~ypHpbq3QZ}_e$dBLZ@LPfri_wU$H;p-)O z5Hgq3siZd0y3Z605HDN<5dJ{AlZHT>PhPxtCYQBuw-4ZA{5K3wBOQvgL=R3Oj)4qu zks@wsyqWF%p12 zqY3B#4)z7kN)9l9YJu2Www%htpLAEm8W5^BD90rVnwn@;4rp6wxjFBCXlOxQZi9Q~;II9c+kHU%fOp}> z0es#tD~%`)98bq7?*9CjC9mj1$x-8o8#)zho=+ht^0j5+_LWtZ)Q+|2Q29_r^-jz0 zPK|UTz!&cFARr85yf7t!cFMs97gZ8`5az}+3rb5|b?@cyQkSWJ&p?3pOg{2wEd3r3D^?hYC1!_!*q}}28DE~ohniOmqENSN6 zz%8scb#vG9-T(~0#Kibj`)W&O25iQ8cw7VM#|?9lvGlind-N;hooIv&{y_(6NF-oA zp%dfA{&Wp#6RJwIyrmfEPHnOC73|?g{Q?KL01EO8N@vMw-*vDjXA<>!uM+ka1@dpg z@ALOJ26c>7qR`V*)BhvDxRgrywNOyV7_2pQ z(7~OXJ3$TdCIFxyL(rstlA8y9S_O6;i@d)ZM%Dj7{B&TQ8HDxc8NV02biyel@I@Ob zneHEm2e{J8MMM5B=HfxWJKc&0oMOu3!o>;fl0@xCj`_@TbS#h%d zSKi4FaT-$yzD0c-5b8Hf4U&V+MShQRF%rVX`R`2~710fN+T%M+Mv{K%h za&)1$3y)U-<#)FjuTISw5N=mKXoAvJdTz8yVA-7SV1O60RqkVh8(RM>olIfiYC0I> z=sG-bbdkuLY?+flze`@NnR%&Ld>|75}20hd%B@>j?oHHt0ybRchUjf zJk&T}*-uqad}U`^)%O{r#;iXAP~jXBWWWO;(E}rT1kHr|=mqPvAR)5sH zsebQS*30*B#fwMgSGl?VrNML;@B7nZ5V{~68kiH(^UIz5b6SBoyFWwF8{dQV4Au8W z_I<;lffdo)9rtkc_`B6e7OFcs9pbeR;~-IUL|vAjzq@E_4gD;Pt$+g^B$0#kUYebc zFnrnn<^y5k`ERerF5!u|@6~49m--VMKaaSm7x_^D4g_-^y%qfyD4#maFP#5q*^#}( zR?=#xy_E2*EFXLg9kaF%{lY_nOFdQoq65pCc1J;zy)V=>>kZ2}vUATU;9TeGB0>`M zXiQIe#$+Ji_n)Y!FsWP}j;JedarM$cz;Di+{Bt}GXtTMwFGRAW)FGm|6~2ignEClC zBb#B}cmboaKpQl@Uh%7XS$mv4h7gNfIh-H782Q)-a+B1C#OacU(6g(9B`q|fzP7Wk ziJ}&%aed&}!#m|@r2dUHhp8qQ+p66n!jp69?viZ~BUGkbiEP|l!&uCxL)_Y3cnUa* z9ZO~6R1d3Rl^OZ(rHJZUVqy2a6MkaABx4y}PW4HrEZDCl(+$g^@NvTN$kpw|q5Xrt zk}cyo9k|!JRW-glGxk8&OR0Q`aXy3i20URE`V&wC5+ zyIJudfY996;#zl<#pwaWwj=;`3amNxa%;&R#=nnPYN-4iYhJ1MMsPjSy!W;m@$-7_aT9=K4FgLbW42 z^HaOo#0UPxjko6Tonxj88U>24_r8|{8YeIYD{*(yhD4YNl^JD)*|uW>fI=Bs)PU0H z^WNrk?8B$OMpH+6LC6T0UFu>m_}mxvzmi9s-nRV-B$4ap{XBVyyx)@Z%6!Xo`kuXh ziS{ZGm^8vLZ|$Z*j~qn+ZVafeSP{D)rPU zODca681JwfTCZmmPjVTg*;`HUUXty+@4hVT8>nCnY9 zh_0}Gq&T$oEPB)iItBZkc=R_{$3JP7!OwGH>>;}P?)8HG{(NNyo1YAg#R5k1ogh6> zr}G8B5!)avNeRZqZhkG1O#nKHHIQC@{?68jd)+Q7g%r~rgUK;80FSenhf@@2v*Xtkt?TbBXQwP%tmVq@@+qJDT&p{cd}l3ETa{IW zrUhnt+a*?Uh`x>y*;!nA;P})aTNL3nBi-%E}y)|ujzNtdP6uQ&36}7cYICL zWWMicIv(&n7^kklzC3=6>4bF-Pj-EnB4@Q_aoT*Ok>sU6u{y6d)cs~t{)o5GoQdUX zk~$loDNgYH%qMSY+dLajBoX$dcFaJOnQWMGrC9k6ovD5GV`u%EJ(iU@#xqdjdn{!! zbX1!~-%r|*U;07gN3G1j`C^Aq*GfH3Qa2jTTA zHplfm$Mr0aJNkfk8`j&8(1MkHJp|%7i~E#Y4wSWFX7_PTBl!f7B2Fo>OP(O->F{5q zWRBRgNcY#$Nx!CaUMRm+oBI;pN`8@3mV3r@bv%tk&;Nez5^V+807+*TsOO95%|0)1Qd#6OlC-*vhh<$BDyHKwJAe270E zk~*jNXS5KErX?z7vnawxHKYf-Dhh)hA)=dYtst7V;xO~Cxji%fQ(YI+R78vF5H5|w zy!`AXw7Sj*+4BE;ZgYe8ih3_itucmfJPg5~i52{O5+FG5GxzV_;~w?=Is$2j(OWNt zAm4U#ExV*XA@*elRz0wrp14QyvZK8^pAA0e;*Qiu_nM2bz^=I|So{}pwLuwR@GRPC zHDWT38*{hY%2RqpX^?qEN~YsfuD#PiPE*md{+4sZ1awTAIpJN)|{X&o9E%f>MEk+&MsDf zSD+hI!#Hw}?tyT;8F>TY(G@+{igXEXi+=ehz#Al&mQk-|Ka z>b0DJ#9y*}SUho!;F@Bw_6p6|=S|PGx1Qd>;;y zBEL^+TlCiV8TQ`(l^D^uT!L$@RGT6dgt7I)%XV7?{s7nDsRh2kV!JtYZRPx>yPbYH zy)dZpPDcx7-3xgV$8FT@+19e05bbJD6$q1Hbj4F%aGLE5duc<=D5)sn{Zi^iua_c?N%HnfV_>F4!K8uSL2OoH0pws}dMlToZ|l5Ief^My})W8H5fqgc;yN}8s?PEXKyHRRGS z^S;;Gvce6L&z|6A#?(f-zlov;P7CbK+!p@x-?f$3rBCXMEoMqg(6)Txs6SbCZh&4w zkr%P37vNQZY+B2)IemN;Lgj?ovZx8rlCg!x`hU<$MCT6|mfs15DzpyvyXef#OX z4#ctTz~EC*l%LPkLh*$4d5NQLJ=FAEJL9*9nNhazO8<;dv&PA;9!H>6O_Soz$@I?^ zBq1;qLJ?Z3iGvnUMszvmt99@1HrHc9jpcDp&W~HiPLR;E@MY)}5(=ig%hdP5(v5O8 z&u|Ak#5P+-NCb6}&9em~-OC7SnBNB%2gCDU&;G2S?wqv;Uz?oymnv+wF751kE^y_w z)~?|vM=npamtEwTHRw_-fbm+?Yu}GiH0!7xyftaAuRDmxwEkjS*z06pYj@X{9Mw^6 z_1d6vDnt1q@SG#?B^yq=HIExa$tL%SwJ1W&q&Or(!fKJ=4Sal*5noj|M9P%!f1N7x z8Rk>}FzYqAS>UPYbrsf^6ZFbfsobW6HH=aj4@!5l&^`H4K!E&(_rMtXVYJ=<{AAG; zyN$Q={+em?t#Fg{xOZg>hV;M}b?aH!5|+M~DMEYemxsB{$EQ!(_p#M_5bH&;8@dGjNy^`mNGG+ichZ~rEPvX7N{inRl-@5}bDvGnjew?ZJbgJ$5J z-rhOQJGNu7dT?%L>65o5gel%zBFism&L%px}JLET*_R-aqL z6v316ukIAg-K5`9rZ>O(|NV!?d&0pVRcJThKNtQ45%W05_a2gM7JI|!X1Jp2{_tH7 z@GCc|d9jUzqLXaaNV?kJjy50_F!*L1)iRe4yRV!4F((W4R42#eWzqG(HCAVNpEc+e zC!{aBzPgnB{M*jo7unzw9rX>uC9?%yDwL0fiZMRH_1};OXU{ik^zFp(#!Cf5G)iI~%J!@rS(!*m1^SZas6?5yWR{1lVg?J>U<2!k>z33w6bRPDCC9 zat&TA56xXC%~n$LbvK_Vio|2xzb{C(>@H;uGwGdYK71_~q&x9JmuzVypUz0Cx9$pV zcbY9eYQRZvsa1n6qgYV38?s|3Gxga-Vc*k^RT@}lwNyI{8`cBl9@V{%-91#n@h{h{ zav3Yy*z;f0EKEH-YK2S#Tt{B}(=!&fl{H8sO;1;o(`@JNI(4ta9p=nqNB1rBCpZG? zAn_5spArb|gcGJ;4DkVu$tTBPM|ifBE(?Y#kxki(oDm=e+9#7`5n?ZZaf$hb9@ASc zUgd)3jaOA|Qh6VJ{?t+3afwU+=`*lk3}=0QvjZw3T73Zm|BQiM$J? z0egSs2@R_)fM2MTY;}1dfW1;l4Ss!D$S9Tr9*+z@(}hwo&ZTx&NnZkPK(2C-{3b8)AgHE zq}RRQzup!M?VLoSE+pVs%c1t`vgLuAgH%M&0cH3{6a>_!NHcRY{+#hgi66QI z%`MZwxhrnvu8zSp=z>zWAXTKqf3s#u`D1x-fKBpMbu23A=@D8%PF^!vuvN?78WW;j zE_J@Bk7?iep2c)#v-^!5(Xo5sQiFXw`NTAQi z=};foxFmv6CP|YS^M^1K3KR;Xs_|#o@r1W?)j3rVH8W*7CAj}#NB1joV^Pc2mam;w| z+|K}+0zm+V#ovyzE4`xnL=#C%0P@ST$z{v|s&OE+VKfk&FrjW?JRINr+O&JWhB|!l zy122uDGvCWC~_y~gK(k$knyv6uU0)1>q_R>%v})k`tJg>!lxl408sMUHw{p_%}@e? z^t9H=<)X4MLXkqLT9})SJZV^{+ZL`O%aIZ8InwI+=j!>#YX7aoh!Rz~G*z`U-!ZxZ z%@DToI5RBI!r!GLKCU0rjXko^tYA=|dSSlDH?SM~J(6g?^c%80$WOH20lpVOYMWI* zV~+4}O(OB3!y=@K)v@!+MaKFq@id8BuEy@b}QUU4%rMiLu4X zD0eALi8lcw3wU)Q8oxeI_mc1hI0$Ym@<9Bs$bpBQe=XCuCn0zxM}1xT-%~OLCrX1(XV68}eft zN@FqMQ-UK!Rvna-l$LA>-3>Ns9hqX3t%n&%n$0p;OJ@1DP$!w_u-SN1PjgSiHX~qO z`$Y~REHoK5E_>4bg`qcub09U4OYXp0pj)(mD1fVgH~NPXqTFYMSg$w|cIgh>VhoQT z57K*tea`-Xpzq)B9kvSiPm@#kOzzwL+m@dQbr-FrSk$91(>Dy3bB70n86O53MqFq2 zN6*350JC_=VwysCP&wMhaT^0hjJ~RAGsS zqTVXm4H7LtjH}B&1~fZ48q1374UO&U;kTvO$H$?d3<*O~8#FsLnjaTl6c^=)?{C3A zG?nzG@$y$>I+?nsI0 z!cD}34C9I{956>XXLle-{UV_`2_y=uDQdNTALnsj~{7nYO2w$C>Zhx|IJV3>-^JZovLzVlj?$ZNlI?z z)9Ps*YY7y$6lG%u6mT}*m0;%3DQ2P}g{NK!fhmf*!-tETD^%r3Cg`(mNvsBX<_DxJ zMtuFg;vK^29ey1=txf>G`QJV%c5JhGd{adKx%#E&8P!g2)uAy%b4bjg2g_&o!BMQ3 zhRq&>!{&+RSdpWcf{X_GY)ER&`)THy0KQsv? z(TdlAY0rl=%MR5a?bz!xG_oNMH=9dJhcHMW0=|qJgyyZ8&sJoZ%|conpRN?l`b5O> zmN%pa#&(FdpHQj{Lln>SBUXik?xx~l;!);a<^k~$@!{d##M9HG&5OrNxnp#T!ak34 z>-_OdZ;{?>biH+!4{MBiqJPSh6+_ol9cy}&wS7+?7h*lJgVju)LbWuGo+?!;J_)|; zuM$39lK$*}99}WT@#=7oa>i-_8cFws9-Mf4>m&;)_D~v_%JJ}ms1n~Oic*KoP{gA0 zCEJqHcsjD-W5vOZiILV(kHnWhzsR(5*fQs;7$lh_@wO~)M(W%$R-4kd?^3f!-cz^o z+3FgNoLnCgI=#G-mP8{4>n-HjXM0I77D^mPUP^cS9w zTcsr`Hg$lH(u@QrvMX><=i8JDQ4mlk7p|HKBisO1?jIp@KPA_f1bL%>h(HBj*NLhu#b z!0ljoSudWr)zZ%FsQ0znS=3DQl-=v9gZ}T7CMt-(Cg&$BP$326FxBCfckK9(A-F1( zrY=zUw$m{aSa*^!lX2IRQI{6FX)Ugjp}u@M=^CvuFK1}oQiGq(@hY$16Ii@HH`?Rij%85KV#zl5no1cKTL8~D3nxyAzs(JtI>gq~= zzEWB}9oAkapbJ?wa4?ysgNDcLDDFyu3zs4xTt99_@kRVwgQ%^6Lm^!|UA+G0P)NH9xxoQGXo#^wd(Zu%oKunv-dCouVRQp#rTUU9y%~5H8ju zA|5O{eklrG3$3AqFvYG%-zX$Q9?7!&S@A=CTS_U;>5opS?8@pH`#H{2-v8~(4&PsD z{WjK#u7`X%y^5UDoC2LR7HT;f+Xy|p`-1 zUG2Y)R|RHgn`?9&r@ePy>A)bt;lpN9CG_s}f!hb3H+W?~%wwzLG%4t~ zcSm2l;!7nCtH^$LBg*UObT$)19AiF=2;=tVxuSf!&+-6?zv1cbsQh&nVAS z&up?ZLQ|~udUWxIWqq$csqPUwxOvjtU4Nzq*~zKMS!=)k^ttokWzol+o}ZU~PB-){ z{TdSPE)lEXq2lz~BHA|iIlrLFrT_AlM^s}muSKaSN=@T3P%yOMGJpdGGgDJzQ-w4I zxR{}-0$5fd4=!eC0lZKJ1dzmxfVwcmEDbQkOieA&#f%LM3^Bz_OfbZZ%rM2wEX>f= znHU&js53FdqRzy?2t%)hIfk1}jm$9oW@=)HVTY*+hTn`#%?*(JTT+ymnUh+?Wn;so z@97e4<7Q-O;Ob&&XyE8%;OuJR>}Y1;W&{jHBU1wdOGDs3I>IVqfhOgph45IZ=tDisvFc6MCFC5c5P;P^H*G_^42QdM>JcjE#8#R*4> diff --git a/Canteen/CanteenRestApi/report b/Canteen/CanteenRestApi/report deleted file mode 100644 index eea019ab298dbece229221ec2cdaf6dd7068bbb0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1284 zcmWIWW@Zs#VBp|jkk;K2CTO~!RfCa%;VBaXgCGL~LwSBtihfFda%paAUWr~sZqC_B zzJ7-d1X|Z8Rr=oz<5;*NbA7`DmUYItJwmsotT{I{O;*Tjh)@)J%Jr^SLY;)Uv-8&8qfuNakqyxes5W=Z8+c0-$i%pL(ZMsj+S<V0(AnyI1ZL^~Oa)Glo-4-#z3nrc>XFJwaTO_pkn>|h>FK9PFkpl8QxyDg?1*)8zz zieLWkiq)s9ZvWNxxS?2aKhNOGhPqqMP zurh#yHAHi|ixx0gL6{pDtno#uImP;VAoBh0{WkW%fK@0&A$G}nU$=QkNsrp6+24?y|8xdwGp_-`>Qdy8njEVVaX_?8XF3?ng z#bA9@6-o*riACwDCALcX80kq#!865HDJV5DF)_u^)WpEpJkcb{(o{)7-_AxK#m9E2 zL3&@BDLe`ooFFU=4AN-l{JauiB8><6qBs_mR*4Td1ae|QK~82eI4bnZ@>0;^O&1b=@O%dfwSuDjw^uq259Z&o&tB4!}m38YO~Ks*3$IJ}qu diff --git a/Canteen/CanteenVisitorApp/Controllers/HomeController.cs b/Canteen/CanteenVisitorApp/Controllers/HomeController.cs index 0ec1cf3..97c6905 100644 --- a/Canteen/CanteenVisitorApp/Controllers/HomeController.cs +++ b/Canteen/CanteenVisitorApp/Controllers/HomeController.cs @@ -227,6 +227,34 @@ namespace CanteenVisitorApp.Controllers Response.Redirect("Orders"); } [HttpGet] + public IActionResult LunchComplete() + { + if (APIClient.Visitor == null) + { + return Redirect("~/Home/Enter"); + } + ViewBag.Lunches = APIClient.GetRequest>($"api/main/getlunchlist?visitorId={APIClient.Visitor.Id}"); + return View(); + } + [HttpPost] + public void LunchComplete(int id) + { + if (APIClient.Visitor == null) + { + throw new Exception("Доступ возможен только авторизованным пользователям"); + } + if (id <= 0) + { + throw new Exception("Выберите обед"); + } + APIClient.PostRequest("api/main/LunchComplete", new LunchBindingModel + { + Id = id + }); + + Response.Redirect("Lunches"); + } + [HttpGet] public IActionResult UpdateOrder() { if (APIClient.Visitor == null) @@ -372,7 +400,7 @@ namespace CanteenVisitorApp.Controllers { return Redirect("~/Home/Enter"); } - ViewBag.Lunches = APIClient.GetRequest>($"api/main/getlunchlist?visitorId={APIClient.Visitor.Id}"); + ViewBag.Lunches = APIClient.GetRequest>($"api/main/getlunchlist?visitorId={APIClient.Visitor.Id}"); return View(); } [HttpPost] @@ -400,7 +428,7 @@ namespace CanteenVisitorApp.Controllers { return Redirect("~/Home/Enter"); } - ViewBag.Lunches = APIClient.GetRequest>($"api/main/getlunchlist?visitorId={APIClient.Visitor.Id}"); + ViewBag.Lunches = APIClient.GetRequest>($"api/main/getlunchlist?visitorId={APIClient.Visitor.Id}"); return View(); } [HttpPost] diff --git a/Canteen/CanteenVisitorApp/Views/Home/LunchComplete.cshtml b/Canteen/CanteenVisitorApp/Views/Home/LunchComplete.cshtml new file mode 100644 index 0000000..58df41e --- /dev/null +++ b/Canteen/CanteenVisitorApp/Views/Home/LunchComplete.cshtml @@ -0,0 +1,25 @@ +@{ + ViewData["Title"] = "LunchComplete"; +} +
+

Завершение обеда

+
+ +
+
+
Выберите обед
+
+ +
+
+
+
+
+ +
+
+
\ No newline at end of file diff --git a/Canteen/CanteenVisitorApp/Views/Home/Lunches.cshtml b/Canteen/CanteenVisitorApp/Views/Home/Lunches.cshtml index 1720636..ec0419f 100644 --- a/Canteen/CanteenVisitorApp/Views/Home/Lunches.cshtml +++ b/Canteen/CanteenVisitorApp/Views/Home/Lunches.cshtml @@ -9,6 +9,7 @@ + diff --git a/Canteen/CanteenVisitorApp/Views/Home/UpdateLunch.cshtml b/Canteen/CanteenVisitorApp/Views/Home/UpdateLunch.cshtml index 0865272..31f6f98 100644 --- a/Canteen/CanteenVisitorApp/Views/Home/UpdateLunch.cshtml +++ b/Canteen/CanteenVisitorApp/Views/Home/UpdateLunch.cshtml @@ -8,7 +8,7 @@
Заказ:
-
+
Название обеда: