From 259c0adb90a52fdc20f9e46d33ff2178dedb2233 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=B0=D0=BD=D0=B8=D0=BB=D0=B0=20=D0=9C=D1=83=D1=82?= =?UTF-8?q?=D1=80=D0=B8=D1=81=D0=BA=D0=BE=D0=B2?= Date: Wed, 10 Jan 2024 01:54:35 +0400 Subject: [PATCH] =?UTF-8?q?=D0=BB=D0=B0=D0=B1=206?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tasks/mutriskov-ds/lab_6/.gitignore | 477 ++++++++++++++++++++++ tasks/mutriskov-ds/lab_6/README.md | 199 +++++++++ tasks/mutriskov-ds/lab_6/Task/Program.cs | 181 ++++++++ tasks/mutriskov-ds/lab_6/Task/Task.csproj | 14 + tasks/mutriskov-ds/lab_6/Task/Task.sln | 22 + tasks/mutriskov-ds/lab_6/images/1.png | Bin 0 -> 34443 bytes 6 files changed, 893 insertions(+) create mode 100644 tasks/mutriskov-ds/lab_6/.gitignore create mode 100644 tasks/mutriskov-ds/lab_6/README.md create mode 100644 tasks/mutriskov-ds/lab_6/Task/Program.cs create mode 100644 tasks/mutriskov-ds/lab_6/Task/Task.csproj create mode 100644 tasks/mutriskov-ds/lab_6/Task/Task.sln create mode 100644 tasks/mutriskov-ds/lab_6/images/1.png diff --git a/tasks/mutriskov-ds/lab_6/.gitignore b/tasks/mutriskov-ds/lab_6/.gitignore new file mode 100644 index 0000000..154e127 --- /dev/null +++ b/tasks/mutriskov-ds/lab_6/.gitignore @@ -0,0 +1,477 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET +project.lock.json +project.fragment.lock.json +artifacts/ + +# Tye +.tye/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.tlog +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio 6 auto-generated project file (contains which files were open etc.) +*.vbp + +# Visual Studio 6 workspace and project file (working project files containing files to include in project) +*.dsw +*.dsp + +# Visual Studio 6 technical files +*.ncb +*.aps + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# Visual Studio History (VSHistory) files +.vshistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd + +# VS Code files for those working on multiple tools +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +*.code-workspace + +# Local History for Visual Studio Code +.history/ + +# Windows Installer files from build outputs +*.cab +*.msi +*.msix +*.msm +*.msp + +# JetBrains Rider +*.sln.iml + +## +## Visual studio for Mac +## + + +# globs +Makefile.in +*.userprefs +*.usertasks +config.make +config.status +aclocal.m4 +install-sh +autom4te.cache/ +*.tar.gz +tarballs/ +test-results/ + +# Mac bundle stuff +*.dmg +*.app + +# content below from: https://github.com/github/gitignore/blob/master/Global/macOS.gitignore +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +# content below from: https://github.com/github/gitignore/blob/master/Global/Windows.gitignore +# Windows thumbnail cache files +Thumbs.db +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk diff --git a/tasks/mutriskov-ds/lab_6/README.md b/tasks/mutriskov-ds/lab_6/README.md new file mode 100644 index 0000000..d3419a6 --- /dev/null +++ b/tasks/mutriskov-ds/lab_6/README.md @@ -0,0 +1,199 @@ +# Отчёт по лабораторной работе №6 + +Выполнил: студент гр. ИСЭбд-41 Мутрисков Д.С. + +## Создание приложения + +В приложении были созданы следующие методы: + +- Заполнение матрицы рандомными значениями: +``` + public static double[][] GenerateRandomMatrix(int rows, int cols) + { + double[][] matrix = new double[rows][]; + + Random rand = new Random(); + + for (int i = 0; i < rows; i++) + { + matrix[i] = new double[cols]; + for (int j = 0; j < cols; j++) + { + matrix[i][j] = rand.Next(1, 10); + } + } + return matrix; + } +``` + +- Метод создания подматрицы для удаления строки и столбца в вычислении определителя: +``` + private static double[][] GetSubMatrix(double[][] matrix, int rowToRemove, int colToRemove) + { + int size = matrix.Length; + double[][] subMatrix = new double[size - 1][]; + + for (int i = 0, newRow = 0; i < size; i++) + { + if (i != rowToRemove) + { + subMatrix[newRow] = new double[size - 1]; + for (int j = 0, newCol = 0; j < size; j++) + { + if (j != colToRemove) + { + subMatrix[newRow][newCol] = matrix[i][j]; + newCol++; + } + } + newRow++; + } + } + return subMatrix; + } +``` + +- Метод вычисления детерминанта обычным алгоритмом: +``` + public static double DeterminantSequential(double[][] matrix) + { + int size = matrix.Length; + + if (size == 1) + { + return matrix[0][0]; + } + + if (size == 2) + { + return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0]; + } + + double determinant = 0; + + for (int i = 0; i < size; i++) + { + double sign = (i % 2 == 0) ? 1 : -1; + double cofactor = sign * matrix[0][i] * DeterminantSequential(GetSubMatrix(matrix, 0, i)); + determinant += cofactor; + } + return determinant; + } +``` + +- Метод вычисления детерминанта параллельным алгоритмом: +``` +public static double DeterminantParallel(double[][] matrix, int numThreads) + { + int size = matrix.Length; + + if (size == 1) + { + return matrix[0][0]; + } + + if (size == 2) + { + return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0]; + } + + double determinant = 0; + + Parallel.For(0, size, new ParallelOptions { MaxDegreeOfParallelism = numThreads }, i => + { + double sign = (i % 2 == 0) ? 1 : -1; + double cofactor = sign * matrix[0][i] * DeterminantSequential(GetSubMatrix(matrix, 0, i)); + determinant += cofactor; + }); + return determinant; + } +``` + +- Методы генерации матриц различных размеров и с различным числом потоков. Поскольку ресурсы машины не позволяют вычислить детерминанту для больших матриц (процесс занимает большое количество времени и памяти, происходит зависание), вычислять будем для матриц меньших размеров (2, 4, 8): +``` + + [Benchmark] + public void DeterminantSequential_2x2() + { + double[][] matrix = GenerateRandomMatrix(2, 2); + DeterminantSequential(matrix); + } + + [Benchmark] + public void DeterminantParallel_2x2_4TH() + { + double[][] matrix = GenerateRandomMatrix(2, 2); + DeterminantParallel(matrix, 4); + } + [Benchmark] + public void DeterminantParallel_2x2_8TH() + { + double[][] matrix = GenerateRandomMatrix(2, 2); + DeterminantParallel(matrix, 8); + } + [Benchmark] + public void DeterminantParallel_2x2_16TH() + { + double[][] matrix = GenerateRandomMatrix(2, 2); + DeterminantParallel(matrix, 16); + } + [Benchmark] + public void DeterminantSequential_4x4() + { + double[][] matrix = GenerateRandomMatrix(4, 4); + DeterminantSequential(matrix); + } + + [Benchmark] + public void DeterminantParallel_4x4_4TH() + { + double[][] matrix = GenerateRandomMatrix(4, 4); + DeterminantParallel(matrix, 4); + } + [Benchmark] + public void DeterminantParallel_4x4_8TH() + { + double[][] matrix = GenerateRandomMatrix(4, 4); + DeterminantParallel(matrix, 8); + } + [Benchmark] + public void DeterminantParallel_4x4_16TH() + { + double[][] matrix = GenerateRandomMatrix(4, 4); + DeterminantParallel(matrix, 16); + } + [Benchmark] + public void DeterminantSequential_8x8() + { + double[][] matrix = GenerateRandomMatrix(8, 8); + DeterminantSequential(matrix); + } + + [Benchmark] + public void DeterminantParallel_8x8_4TH() + { + double[][] matrix = GenerateRandomMatrix(8, 8); + DeterminantParallel(matrix, 4); + } + [Benchmark] + public void DeterminantParallel_8x8_8TH() + { + double[][] matrix = GenerateRandomMatrix(8, 8); + DeterminantParallel(matrix, 8); + } + [Benchmark] + public void DeterminantParallel_8x8_16TH() + { + double[][] matrix = GenerateRandomMatrix(8, 8); + DeterminantParallel(matrix, 16); + } +``` + +Запуск приложения происходит с помощью строки `var summary = BenchmarkRunner.Run();`. + + +## Результаты работы приложения + +![](images/1.png) + +Вывод: по результатам работы, для малых матриц парралельный алгоритм не дает прироста в скорости работы. Для матрицы 8 на 8 дает прирост только распараллеливание на малое число потоков. Для вычисления детерминанта больших матриц (больше, чем 8 на 8) не хватает вычислительной мощности моего процессора, но можно предположить что в этом случае увеличение числа потоков приводило бы к увеличению скорости работы. \ No newline at end of file diff --git a/tasks/mutriskov-ds/lab_6/Task/Program.cs b/tasks/mutriskov-ds/lab_6/Task/Program.cs new file mode 100644 index 0000000..8c63a54 --- /dev/null +++ b/tasks/mutriskov-ds/lab_6/Task/Program.cs @@ -0,0 +1,181 @@ +using System; +using System.Diagnostics; +using System.Threading.Tasks; +using BenchmarkDotNet.Attributes; +using BenchmarkDotNet.Running; + +var summary = BenchmarkRunner.Run(); +Console.ReadLine(); + +public class MatrixDeterminant +{ + public static double DeterminantSequential(double[][] matrix) + { + int size = matrix.Length; + + if (size == 1) + { + return matrix[0][0]; + } + + if (size == 2) + { + return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0]; + } + + double determinant = 0; + + for (int i = 0; i < size; i++) + { + double sign = (i % 2 == 0) ? 1 : -1; + double cofactor = sign * matrix[0][i] * DeterminantSequential(GetSubMatrix(matrix, 0, i)); + determinant += cofactor; + } + + return determinant; + } + + public static double DeterminantParallel(double[][] matrix, int numThreads) + { + int size = matrix.Length; + + if (size == 1) + { + return matrix[0][0]; + } + + if (size == 2) + { + return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0]; + } + + double determinant = 0; + + Parallel.For(0, size, new ParallelOptions { MaxDegreeOfParallelism = numThreads }, i => + { + double sign = (i % 2 == 0) ? 1 : -1; + double cofactor = sign * matrix[0][i] * DeterminantSequential(GetSubMatrix(matrix, 0, i)); + determinant += cofactor; + }); + + return determinant; + } + + + [Benchmark] + public void DeterminantSequential_2x2() + { + double[][] matrix = GenerateRandomMatrix(2, 2); + DeterminantSequential(matrix); + } + + [Benchmark] + public void DeterminantParallel_2x2_4TH() + { + double[][] matrix = GenerateRandomMatrix(2, 2); + DeterminantParallel(matrix, 4); + } + [Benchmark] + public void DeterminantParallel_2x2_8TH() + { + double[][] matrix = GenerateRandomMatrix(2, 2); + DeterminantParallel(matrix, 8); + } + [Benchmark] + public void DeterminantParallel_2x2_16TH() + { + double[][] matrix = GenerateRandomMatrix(2, 2); + DeterminantParallel(matrix, 16); + } + [Benchmark] + public void DeterminantSequential_4x4() + { + double[][] matrix = GenerateRandomMatrix(4, 4); + DeterminantSequential(matrix); + } + + [Benchmark] + public void DeterminantParallel_4x4_4TH() + { + double[][] matrix = GenerateRandomMatrix(4, 4); + DeterminantParallel(matrix, 4); + } + [Benchmark] + public void DeterminantParallel_4x4_8TH() + { + double[][] matrix = GenerateRandomMatrix(4, 4); + DeterminantParallel(matrix, 8); + } + [Benchmark] + public void DeterminantParallel_4x4_16TH() + { + double[][] matrix = GenerateRandomMatrix(4, 4); + DeterminantParallel(matrix, 16); + } + [Benchmark] + public void DeterminantSequential_8x8() + { + double[][] matrix = GenerateRandomMatrix(8, 8); + DeterminantSequential(matrix); + } + + [Benchmark] + public void DeterminantParallel_8x8_4TH() + { + double[][] matrix = GenerateRandomMatrix(8, 8); + DeterminantParallel(matrix, 4); + } + [Benchmark] + public void DeterminantParallel_8x8_8TH() + { + double[][] matrix = GenerateRandomMatrix(8, 8); + DeterminantParallel(matrix, 8); + } + [Benchmark] + public void DeterminantParallel_8x8_16TH() + { + double[][] matrix = GenerateRandomMatrix(8, 8); + DeterminantParallel(matrix, 16); + } + public static double[][] GenerateRandomMatrix(int rows, int cols) + { + double[][] matrix = new double[rows][]; + + Random rand = new Random(); + + for (int i = 0; i < rows; i++) + { + matrix[i] = new double[cols]; + for (int j = 0; j < cols; j++) + { + matrix[i][j] = rand.Next(1, 10); + } + } + + return matrix; + } + + private static double[][] GetSubMatrix(double[][] matrix, int rowToRemove, int colToRemove) + { + int size = matrix.Length; + double[][] subMatrix = new double[size - 1][]; + + for (int i = 0, newRow = 0; i < size; i++) + { + if (i != rowToRemove) + { + subMatrix[newRow] = new double[size - 1]; + for (int j = 0, newCol = 0; j < size; j++) + { + if (j != colToRemove) + { + subMatrix[newRow][newCol] = matrix[i][j]; + newCol++; + } + } + newRow++; + } + } + return subMatrix; + } +} \ No newline at end of file diff --git a/tasks/mutriskov-ds/lab_6/Task/Task.csproj b/tasks/mutriskov-ds/lab_6/Task/Task.csproj new file mode 100644 index 0000000..9a7137b --- /dev/null +++ b/tasks/mutriskov-ds/lab_6/Task/Task.csproj @@ -0,0 +1,14 @@ + + + + Exe + net7.0 + enable + enable + + + + + + + diff --git a/tasks/mutriskov-ds/lab_6/Task/Task.sln b/tasks/mutriskov-ds/lab_6/Task/Task.sln new file mode 100644 index 0000000..1443023 --- /dev/null +++ b/tasks/mutriskov-ds/lab_6/Task/Task.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.31903.59 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Task", "Task.csproj", "{936EA1CC-95C4-4808-9277-C06DA37F431F}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {936EA1CC-95C4-4808-9277-C06DA37F431F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {936EA1CC-95C4-4808-9277-C06DA37F431F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {936EA1CC-95C4-4808-9277-C06DA37F431F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {936EA1CC-95C4-4808-9277-C06DA37F431F}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/tasks/mutriskov-ds/lab_6/images/1.png b/tasks/mutriskov-ds/lab_6/images/1.png new file mode 100644 index 0000000000000000000000000000000000000000..64318d5e048085834b51119217e1914845e1cdbb GIT binary patch literal 34443 zcmeFZc|6p8-#$!AIVDAfY?YA0Ap3fjO0pGYH=~5?jeTsRg~%4gWE+tsdy;(^2@`{{ z?@JkDG838^+YB@FOq}O+U)S%t?)!dz&)?4i6hsczY7_yH7;uL?<$>TKA$UGd|;&#?E0ex`u+E$k5AhW)brdre$G=mrcE^ksWO` z%lxRllHJ@l8QF2oYw1q#4y}%wP|;XokMX4?=`ogbnCJ*|gcbbAy2vS*vodt6`2xa{ z47zSNQYO7lx7MlARAQ1Sn->sEjVS5w3q01BbUzP}{y0~%$k|{;4@%bynP%QKVe}zv z2@{ABnYm=2))M+UIDBA{4mVYF@YonDFA~D&k2Nn-7O?rrK~#~Iup_|~FYP{;_{2`v zUw)@Q`Gs+w6i?U7jtH0+YN{^ZdAhr559lYZX20=Ud{}7qI#8`Fs{(xFfMc8d#c#&%{ zVXMAU#n~REtTM)!G%KovNXogJ_f^F=6^pug@wMF9dQ3jpt)+64wi_BUIeD-8bD*)z zQZy{pErgA*QPaK`mU2&CWxE zRa&NqmP1l{w75F}T?3TS!bHK7uu9sh3e;T3!PhD54!~ zl3>F&LFZazNgAhI{lba^-H>ZveW1bb<=&7!cMUsKv_hz0uTCc(^p~H=Q8%4D+u~N!?n`!cXx4E}Eh6pBzCNi^%|2pe+(UU=fx^}p;Ma$v zRieXPF27BGv$jr%y)5W%EN7Xy??lLjX4R?}$8IItFPb^EEWJUwOL}Jqmpneww&dKh zbn%E1X#jvimHI95jzaB1_xa77R#oZ%bvDDtLx4EpbByXg5%=kjj~?#(a!1xdP1!KP zfl}`l7|sP4-nd#M7OpMYL(&eJDTt(NgYo4|NC6%Sflu-apG<1cz%Er~Q+2!j{#0wS zF?-qBOoG_`z_0^!iya?u;M#ll_qP`fFLj);Y!cyhzR7Vv9aoPiE2aNRldyQ9$6KHF+(dg zfWxMb6X4F1GCp7hGUpIc{x$hKfwWeD5DXU`_Es6vk7us> zXvHZHU8#hJm0y4xR1zcLvM9eQTyXF#Bkb0Jc{FZ~kG~;l;kAFRiP0!gbNv|}*GSr` zeG~J}<_~pJa?0n2S=s9Gwa}#&glrEj#yRW2whyt73_XD_e9-{2o-1e46k$N$q}RqHp6!SlWq^2h>iFSP0%xa;Ju}8` z^cd+VR(JBl+UHE(2k3~(xWdk5Pi2v5wnYN7wwmDO`eRNbFYfi0N+-6d4nJSmdJbpM z>X1y8QT~klZRhI~*?KNvXcEp)wAi?c>i`Baa8K zqr*NhgeN6>0-pLqJ0w2V`>%fX*G{$J@Bp4{q9~|3389klBwUD51hWVUF7>RIJl>9x=&zP{zHlG%gKQC`M^;m-*+1{zRyM{lSmNCtE(a{*f7S2y@`U%m08 z{_>_J9W~c64ZG@K1}f3$c(CNySRo{^>1+Gq%j9K!RCT3|nQN-Tc@zaEo{wD0kyksB zaXS!?2^7KFlw*lk4eUML}ac`Uck)y z)k=7P{r#+wfb6OK*O|?Lh<;OfT38b?@|S5 zu}D)a&I_A%(_2q`W8c({eL1S5RQi{$&r_P8qnfV4{B+DyFQ$3VYmnZ-S~V-KID}_> zocQx^rj()q0K^7mK|I`kdsht1d$-=)$Boe+E!NxgI(sKp&iPp83j`S#`v8^#uyEZBa1i`Ccw7wh%U2xNw|Q9#i1vDHH2x5tL0A-0Tb=fx*$ zd+jf7zE9n9x?7HYyhdLP8BE@|kZX~YJWr+jkmo8<)uYHm(mm&!C_D=$_L_CW{E1g1cdkDj*QI3GY80R_EtC3f=A2$=s^sQdCeXw4C~L) zBjw$dyu4b!(iXVvp&WXy$1XegMKUoYM|u{K3aeUN#Oqh{EL}~vEwF`{uSkS@SHoK~ zvx+klFzhpnji&q}CP?Q+yL3I^cEGf`P6Lm**`=iYy>3e#-{mQ&J1H5jo!-1qnYVcs zof;W-Yd4O1V9uPY5_lAielwm%){xP}q4}$CeRcMgT(VM6 zqctCR+-Eiz`KaObFJGgDnB#}iMt~vjI}c{c8$s8f$RL}}nK}f^00<#8UutvbaU%iM zSUvgE`Hv#ngG?k$&gz*b{gI&w$8@=_ryV;xCgFFwP7dxoDJ0Iv^hapSjh;DTum*Mw zv*5l9xU~kO~&$=3l^boSym}yt6LtRHqB5IDju+x25TcjYa z6s6Hp3$?4KG~AwiB}OFxb%5Hu4t3j*L3rI|`3X0(;Cv5APHAsjTWIM_#LU+ng&9NM zfO(R-+I+tUa#Q0d98b>F=9_a@S-&OnM4zq{6he3xw$ea4Uhp7-uDBaoAH7@22QU3n z1gC#=&~&_NU6DR>Xyr!>aSZJ0u<6jXa)T-2l{kbNm}1OG?P}DPZ9J5Lhti6m_c@}I z>>~E{t`JX>C4Nya8hwk(s$ti%q8T7UBPtembz=~7D~Y+q%lyUb*%~?2AzDWBl4R>V zpypVN4q~9{vY6~_()Tzx*;=D^btcz;7Q;#b9BB+)AdRDGbKAp|H-*Wk$h_PqX|m;0 zg+RV%oNl5}C6*!W(063hm92^WaS=gZJy!_`F~(`y{vL4CjbMbwo_D1BE_cX9Sa zz>N`TLjSXe`5sN)z&DemQ>71rqQf5LW_99@KnuK< zW**+<&BlZmw+(C^e6G8x-Go(Nkzbxr(XCAE9D4axdxX=tCzi5z(8)7CQ2H2?4jtd& zwzl3*1Ss;JIEm$w@wzj5Z4kP%^QA%0nRi)Zc;aXl;_?d*?wRC39q?GPd4ws`=ye8a z{fPvpyJLBOe34CkyGKC)!Qf=sx>zBGHB!e(<~B%gvaj$_fR5&1^t)GKV+Yk7AwVxI z<(T+%h1?r6%VOd7*1$6(WUXwgp&gd5|yyd502;$a%fi67x1DfiUtCAkU*CGX0D zZQ&1+RUMMPv{+wYP5wxdh>h5V-uwWwkULxf3TFaNk_Pi}jl{eQ!y>l8Q-z@eZf0J~ zleO9A&NEd8tuIO;%0&C3tG0&tzFQAhX8{iSRz@f|$2=a4GI7RSI1XLtB-tG&Smc zca-+`pb~U7HTC2D2L!)-;+Z;p`IVZyl&&OvRy!GH(D5?*kjO+0A(?MVomg9gofASG z|734H7qq@3OW5!a3xng;M6jf_iY5_2u3h5xCM=e+2v2!Bgq<#fPW9C=ZuwCncr!MO zE2MW1#dS5u%y8IE>B0{&ISeBqy8U6PbJdO)@^x@|Rkf0+g*&f-gsW3NNk!hS>gGX# z&unB>i37yG;jK4PUu0HD#}C>(dYz#~Bgv|~u1_aFKUp?gquq!Y1L^cn-q3Q&t~(NP z6d!-8TB^Ft z@E?}Sf1O~$Xqi)F**o>bW+6Ds(?7=% zCfXyUWo`RJAGBwm*99!Fu1JH4D{t*_t<)*x!O7Z1Xz4ujZtcBq#Mz0y=rYOtOr1VX zcx{+>5DZH|4v7I6*TVBZ6}|IzcfcI-fxpKtLnHy2M>>XpW3ibP-5!4Nk$OXmzo+Xu z+nHe`KBn%8tu!5@_wMSugPyJP(k-^9J5d?DPd-084jArEEM#wl^kxK2VVCMI`G=WA zWEzdD7Jb44tA=0Enrh3}&^qv(XZ}rzrq6{jcQAv&>+d}DNJ%mDQ+9zd=Ceef!&sMT z*Z~w!OTSlw#MNCxCf+QW7T$CgsY`vmv=`IjTq zRkIU#wZ#1;)r|PxD&FR)eDew7wJ_*BHTRU#Fn)MCnK8NLgBkfU84tZjoaj5)dt{=v zm_CuGLR1`+n_229Eqq7%G$yy1I0QFI@2~ZuD;^pwzHs~%_UDMt{k%98kJ^OTqyRXK zv4`Yemk*;oTDajW{ z(~mTg*7%U(_+u{cpBHdVU~A!9ldK2I0v$hcaYdzLIw#>?-)rc7^!t-S($@pTqn^@B z57tK9^@4V01ZgeD3P*knu`?A)XQOi-esRo#hhhxJbV#YA-?iA6i$iDNE<45~KNaTV&e}W&@-ha`sdNDaxv?6skaK&dLRVW@k z#Sz^?#y2i^_j4+#U|176-@V_3e-l9W%< zaAJEkko0w5U3-H@KU`DSJag-VH(2Eh#v$O<5Ec zTo_xmp(qw>LTA*iS)E^qK@C@;3g&_-6=U#WSm32KYvrhYw09C;lQoq7C|1m_;-M zL2KS=D)v3LfQG`K;eox9QlfhtKM`4QAR#25mz3R}Hamh_{_Leg{EQ0*bsIK>8D7!A zbm^;f8r|sK2u1{EU<(xCCK410sWDTX%(^=gnJC=1l&yluCd7F{Fd^hHpwA@px+Te` z#MW+H1_|-dvYwL3m|ya2HKvmWM1yXxP7EHq8w=n0*b<+#%3L#IEKBj5g(J)EMoIK; zKg^FR1eK&L?yR<)Ef);(Y{fN?@H5T$^-y zw}J><1oi#dRGU9gs6Y{qAl9Vo+WmM6r{G)Wedanf>#sXAvELOh_FZmb^l7_|xB;@e z-#q=xMbl$o^%!6DJQ)WL*MIzQbgb#K#skRkw5oBMC5EVb^(0h+hm!Wx&7=XDsyXxO z6J>D=)b173O_>Ino&DRB6E2d4U-LP*wmN3j7FkD|YW89Y z)dw|@XF3GP%vHF0wbI1z;rW}OfZPH2V`Sxr2+4umHUir2Y7u<;gAMd2J6q)G-Fb7W zInFU_cTz7kv3rD5k_2~jB`2!c+~43$7-EL_MT0si>ucJ%3y^*oc6LZ z*Fkd{`nb%ampNr$i&Waj?@+8>s$GMik9YGfuRY)`wi_vSrCTYfIwx1y_hqDjIw3!vPlUGfu?2|wQrMvbQ68p*y^6Bdy5c2Qee zof2KpO^}UE9QKz5lg8xfUI`9BBUBqdvA7aJ*KZY?K*~O{v(|Z5=j>1&=XCCVkXnDTpjULi^PRcN+ zryHhE%(%pzanZt0zvfP+*p!2Xgl^+6)kE1K`&qKQ^}!yNFfYciv3>LUw^;lq@A~&9 zMsj!kW=z&OU}LktvAYZ(emmAz_Ez+r@P~E4fZ2{8fre?C`*qhTSd|pIZ_95-JZ&Y8 z19U2JD4R^3I454B29?<9oqJFEOw?^VK{nd`plK%#mlheLa3AY1A*4ES6fO2;OHy2I`iP4Tq=J|luIkn zyV3n1HD-MOl2tY02PW+pp)r%uJ=r)xHw`^3BO?LaB&zoEruWA!BFKqqQI3oas?R#| zVuoDBkz|3oBR(Gp#1~EeB{E6h{>;p*75*TSqunwi^LsIeQSWG<_FPf|rz{@3^X0a~ zb#Y9W`Y1xAE6Kfptj*>7pm+d=-9YmWN{FiYq)K@oy5jfQ{f$y~^Hs0>heU$Gs}yv_^2umjxTks_!?DpaAOqa}UFdqsM>t+vt!q!&g6{6coFp7o$SoAYblsjf9JaRhjaR&C$yS`2XN8pY=Z*|(=HU^AO!y(B1h zzOlGG5_E`UqCFN;``Kz8kZE?}W$R%NhoqpHzIwD>1AOh}{aMo6i3lzqE=R6_V|^vO zEzft+HNB4g)z5kxGueg@75P7kTJeT2H8x9sMhx@S9jy@5X)gTPE?s}-5dDuRh9T5_ z%H{HqnmO_ZOuIDOCE4LkLo>P*Wv_NObLCib_uBS|Y-RXP%MB}DtDZ{=V#!?82HEKm zyU^un}4*6#P?-Ua;?`q__83csgSqdz%6|tU9H!5r)e3N`kTBTy|>6E z^VN+n7L*L%m}=YMs_jvnQJ4X(LfqWl!gMR5YakU3-tKmUCcTx#=|R#Ab`kQ^NwBPD z;+@40p52qz^;FgIhABuIm3ou(-%q{cRO5Eq|4tuMdRC!qE{cRh8VK6Zc*NZQL&V0L7WKOy7 zM3(629R>x1Yg5}%O4n(A5f(rw1LdwiH679ufEIZ)$q#?tceDQ{uK31webCG=OVO|| zaT~&WWt&)G1$;f?c#3*J6#e*?DVI4)dX0!dmXVeK$B!JyEfb}9fK13 zlY_OC-$Q8n3G;|%?~9BAMQXtOjKC~df3kK7*697SW(TK#0`D?SBP35YuQ(R<^xmCc zobd-{WmfT+YmMo4Cf=Yflh%~rE2B;oO~;Axp@$>5`c!R(QO!iorn*>xWwn>P98^SC zb5yh`iMn?0f-FP_IU54sFVjp^9=UOki~B&ec^3ft+hin0Gp>BUbrcaiy3DmE*nuzM z=_Ox=BHV#vrf#mbYIS4oXOqZ4dUgnnG*H^}b_j5tFpdT5X5v7%3YGR5MgG85e0Uqo7S$h=)BsVdF~ z32J*SP|TjN46=`|O%yJ+9?AA!Hwm@1Xr2($zaVo@S+NVI@bpdh!i{J=t0spUxn?0S z>|{6fjeh^dgo_n+HrCF7PHhNsP}xstUnC&_FMi8w^kP%ry1|P(@+xHr7;Tm99|Hc3{HZwXCQZP}t=RI}0WXEn~E?u&cH3YHvm3Bm4%h#sB~htxf= zg?p=BF#GDsF+1CklT&$qxqCE6;_G!aW5LyW1cK+c1bF&^{Y%%%$2(7MFn`<&vOy!y zX>YGwjLDHEh`Y~<34eGuc-Ts~+<6Ws3WL@CmSVv#Lp@s;HZ`T>GuJ9#e_#*g0N3~z zIB!19-=2RL*HeH6BG$Lr{{lx{?o?rKaB_!AoFaIZvY&sq( z2j%;=G4}xk9b>XH>9i5Xk*Q1HknBxyFosVnoAF*1tInr&P1ijP;E&RS2-Mvhxt0m7 zyC7me)vzh3k?d?Uk?c=aRHzK^-RzjtHUpQkq>fwDqeCWV=) z%+EE0uFe!&Q#YIp64$Vt+Npcf`^G5?SSRPXJIWPcXm3e8*116{aEm?N%^f`xc~?h{ z=CCnL{Aw%vs#7^>6$oMR?tl-oComeXw4!u!U0X5q8pd1a@sbrh0O{TGwSK751u~E$ zCovqLMmL#p3t|}_`Zv2{#^{YEl$ImS5Bn~z23s6j^vPjbGMn-y<_Sk3U=Fy+o~m-? zs72VrWWaJ~^;~AwdjBVOg5RAlw8DPe(awie*T{RP}ys zEL4{ie6N>;=SGoy8;g74C+YHP>lcqVVvD^zj00I?rAcDki)5){psuhbNBO1jmVitm9?@{<@E;5MI@dt|z z*EKwRpL;k*wEKd0EB`;vTF?EjC#PDPbw2~_Jemy7FLTkA z?#1i$mdoC6Z#&Rq9v~i2Wl}YvNy7`xWB%rpuYW86|<0 zlrzh(d2WQ91BNt&2Tr}iWmqWmK9DaWhW5`Ul^ZEP|M;oV$0j(PfIDE zy6sVY&kCHv*5@iIWr3YoM$Gevyz-UJEN)!a{)Dlkle;};N#J4<$z{#^8QC{qC&T}$ zOBvUqt!ur&&Fm?5FJKPFnYhubw z7aDRgd?EK>M4OYE1#pDmsqx5;r&IUA?3*6Cd2=eI%;561G@D-mw7f2x#X-@Aq6^0} zgQM|C#;+J2Yf&?uyB2Zp~ zFxQoPmn0GD!^YxX!fAMKHoN5k#I`B0u<6_O9HZdW+%T(&=P1!_X6%~i{_mn{#-RLr z&c@C$(5apL&V+v)qNlBjv0?SOG`yeNN(>wQl~M{kO8hG8bxZieAe^A5f6D$AC*MIG z^J}3J1Ai1ggl!Txe*gvkqD0wC;>Pd)ixMM{tf_oAf|?;n0KwLaRY=Y>@hPL)2louwZd%x19bM6ha0S;ma=NR>^8e5i44QyC8Q0v^73 zLK&KVv^D%6e*#!JY8?o*rs3bwK}un!=+%jqR{3MW0e>ZO|66AJjE9xB3+x%>o~>+b z_5UM#{a+=`|Nlq-ZW2&db%Zi;Q{pW<@<_JXflvEI0@YhRf`FPr4u2xw+P->hx~-CJ1S2yK+RsNd1t+%mje7eiyL}yXx)FD8jf_ zE_~)0AIlj$SThVs#w?Sl+7`Q19QKG~1Bb5!E1rTwX=IHu6Lg#Mxy7AVeUj+T5pyc3 zNPBSJFojfvkUJtQ^E@MH~0Tn*!wBS$n=Oc@iEk&}51UxXpe4GofN_#R@pN4Js( zCnF7ca2!R$i=vylt_bq#6AelQV<+ocHJ6blN&iz8wODXZ|l+y_1RM<#TmN2Dp@=af(3?^Z z5p$R49u3y+#W=(9*B+$f6*y6nzwQer`Ha#pERK-+@bOld&_m6_@qSrf%5|)d&X!yp z*t|jkwa$Z21Uj^6ug0T2gpw%6yPHaW%wyeGmZKNGO{yu5yl0dr zH!)*2-e7B|C#*2NkV`>WO8=f<*{{74-p6wIbyn|b_u2k2rnwx%O3tEtF_Z%M zOxUs28iH8ZnYs?@z~1(4@K`r%%5$m~bC2>PyukPQfz!$$>CM)wXXmV zi0c+KesyYpX@gu}Qrd2w$U6~fcmxP7xO!p=k(!83UTjmwyFuP7=lD{6Uq;D#lj|Yy zv1}4)8IM`=3I4z?tlHw3pl|U6N%wf}^7UEJ^mZ1h8~OaRdZl>n-LNM#inf?%xNc@h zcf!%&&D$^MLU3Bn3VpBk%;jZag>MClnBOP*AQ=9Xg}rY(IS&hTXhTio(IV}TBfm}D zQ^E@N|AiC3A=f?OH%bRv{Trr7960t*53^pe-E!iHj=K-nlkRjrGOvA*l?DCDdRYDi zgpnl((}K71$jM~|v4UzSA z6a9A5lQtDG7|mH!{WLLH9NaQS(%qddbKid+al~21RQ~TF@2IgpRR6CL-gi>?Yw5ln z{qLrMi3O)WRmXh(jhFwv9_7Cql-X7<{9P{jyM?)}^7K4w4gP+(^7KA7_tjc<;*N&n z{^#@jE^XpWGHh#$rXe08v4_g6fnYVTS-Ww>O4uTHW?*_>2|Hg;(TggfkcX-vYn){h zjIaU8lm4{oBw^`M%3&)(ryi2(v{fzzs#M_Lc==`LWM^pSVg*Nc|) zz6Pg)yTl`%NS>WJ)VVrNuhY7!;!!B6VPd&r!x%;g|Br;M64MD=pY8m1cX%1rqGwmM zB8XQI?+hBt(Ji7L#dp@_K_Sl`=%C(O2FaDdo0479?tUwt%7;Hb>r^y1;Mb|KyId>P>~_EkkC->iTD|DQ zBa0Ha+>=iNsDIj;o4&T}82LU10E_bbmFyhS00lKaE71U?`gYZPu&!*HF&@P=Z)^%2 z?2S0UGKD*AilqZBvdzc*K4r72c41dVpPz-_OGD6<%cN(c~-gDv_(TWuaeq>nVf^lrouLs-i0Ox+P7yK;CLvx8QJP%8!S?Zx44GN!WTWb)j3+1$Sy z^~_3+Zgl;15ITS|HDZ(f%pH)O7}R|*V7n&kXMtD|NY&ejJ{vF-;_c-sI^rTi4(&Vd z-%fUKkNPw^ESrIoJ~Xy`7)L3^7Iu=RFgX}Sx!7qb2ELtQ2imK`jQP?{J zW44LB<+|c$)`(Fj-%ff@-)zM>XX*9XcT3DpK1{!B zq75M#+xslzJ z4Y4^g_QS~|Nd;j;AI}XY)oZ78t1TM?n#ty#Pw@7F%Y=40d1YKo2G?aBp%;r+0?VcK zLa_6_`dZLh6GCt5c!vN15nfIhQXG|vg(RO6dTu{Bc-0_biGo|KO9~Z*& zT;sohe2)bJSp`zpd;bS9j&}h)I7VsB#cMwpf%AU<%A5a}Jb{MFZZ$K?t_dbDLfvtq zn<8?|SzrhpskqC;sJ{`^doFTf6?w{Th`BZr@eUoX6T)FxHy5F2yonCeJsWRy>FX>Q z6AYnCt3?;Ke(rEgId6C@#ZNx|`j6EmC5ML*C#;LYhBnN~ zdl-d3@#3(i9?G{L_0wZ^om6=Wv*qtBgUl+Q0*@y7gkF&kBbUut)q!ZhmikMQ+s}V~ zZmTz*jf`r!fgH461+*un@%pZ{s4|Y{bEyb_$SAv|<_CyUoJ$%xpGh|H^^P^plH=H1 z7u8|bPY1ydN??71Rt4})JUr#rDVBaOD7u~~~dYVXn{3$={ zeEAD#9i0e!19G~Mz*V#JGGdn{!vBRO064#FZ;?A?8Fap0^4YY?wBwg4!I$7|rA7L* zH&}74`dST#uc~)pt8ocja-MWK#;xj#&wXmDj)t)*Trug-qhj5AWz9{-J+ilrSo}b- zb)Dl*Kszip2nq_!BeZ;0S+IL-54sxWIE`^%UoLd>f%JGYsF;i5R&r-X3M7pT--9{Q zQb4joNjF;T{qAWSIe@z|G?EBGUnsu!%S_}KV7!D4BdU3l=}s>V7d!*dn3V+>8@-?f zYX@oM<*@GIB#!23*V?E7FX41D6=wof6>?3ZCL+Clyvg6b4-rdJ8;y~QhO6s8upd<4 zcsGnhCiZ>$7S)N9r)Ucb3CvF?QJNQ-|3Hkn$n?}I85hfu%SB4r@*c@~7P?Xh_tINRc?i3T%(;p_!nr%4 zOa2H8-G`s_Qb897VBRC*iE7&?f^ktnY0Exptbrv-r_GHXT>$#nozK8|WIi6}w0U!@ zC}N2^I$NK}y{xQHeKFsyl;9Gdd&=WdLY#SvM4Dl)>E&6OIV5QC!Hrjsg1ei$>!&^7 zaWmjEebgE(kiz^2gEG||>8aqa&_c2)_04jLwiRn+7pdlBZogqxV?bn+?@=i|lN@CQ z4W3_d)4af+3R%fE-6c= zQpqp-Z9cG1IiGw2o`xx?;v;3m7t&ogn&_7!L+VD6pcf>Y%^mDuIzB*K1)#oOKO9p% z8c*S&AOruVL{=v)^b526OPe!6!rDo2Y{8SwUC?SI78HrNg{ow!@+Jn z6nuMq&*dz`onKKpH{6W)u@-KN#4J)}~6=X{PtssMZ z67x?<67tC*w)f3boU+WSZ{Lx}cKF(2l$k>^tM&MY)Xj}S%1*-nVcBeR_Jr|{f6JH+ zYZ#jO8^Gf!C;k){=qwO=uv+hmKrr}E>08Wm;Lw{U6ObB2$7bXSl93DS+Z*{ZpSyK` z9{Jf?4)zyWB~noZ{7^GLd++!7M7UmG5LKHi#!qg~m0|HP_dLnV>}!-6e0`gRH*;u# zpuz{tmpayhurA>b{Q^r?r-<~KzTf3}zMk=tRz?g{8m@%%{^Lc-{X;hY8`^vj6DP_l`F63y~%0 z@rs*@d)i1hkI38_^CSLuFg`E!7mUjsDTd#f-9P$F(;<#$JUY>^5s-!_Z8cuEM-hK< zdO}6EH^&CjPa^v3-)Kw>3&HNchhIcd#d4(C!SZ{~218h(T1mB|r$qC|>m)888$jB9 z=VLNUAMDk#MbnjK4%{SfjJ{>b`LN%Z1pYEquBYv@aWU0)WLcShp@gw9FV0%b;q03Z zTeL1})hB^xwm%Cg*a!TC;bd!bol{_8fyRE%9iy0IrkBqNfbW=BT+LA=tM+bzt$;g6YrCMoV@Kg~5-yO6&%n*avpjjX3?Y%BexW z)x6hotMD8K&Wu+W7AT!>w8b zvy4H7a@BhyWkA8}&tc0ERNOU6*<0P&Sm?JAi@5O3lZpiC-c0L+^0a*#b%*VXEr6V! zt%2!Ljv|}ReaiUA^q$Lbx2dn@dJOj|w*@KPr2;G93l*=Tmkw@K z>>f(kdamRMbf%-b(n0k5i73xvJ)IEjd4cj(0j;^(vE^Vgc&T0QJyu8=RRA(u4gs(9 zehJL7%aLwx*z=uPVwfF}@GqGCAH69DTjFNe;JfXqSge=>(?H>09JJBj7FlG_Ua#~& z)iAzW9R=V12ZMaGI?B#g6Eqcx(>tlXqxJ-J<+o7R{2zsS`YOAy{ZJ+#sIkewrsxvEG`$z^iL5E`UwL0jb@cBna7$+VI$=Z#q0z6ipgwx30&m?hfJ!9 zGGmWVBE3)bHa!-4GW@xI+&t;Jwnr{^ZzuAZ;P>H)!6@x}zRFkjkGk2MwKOY9)Fhi^ zZ%dk{JU$f<6NG6pBznTZ5A9?8bQiv|yY(_z{fuW{ELLhd z3)-Qu20&sWH+UsT&Sb1}2No1Z52^TDUo)W`qagOo5x;&J@oI-u{BORJ1Q9fQZGcx) zq%*L4OZJDoGSzW%<*qc=XT2#P!;b4i^D^svvMmyc|A46srTx_T%Dv`Y>W ze~H%|o;R`?MpsJ4aM$c(?)(SEUm`&J-vz%EPqR10H|!zhUFsy+!ws1@qI%@JgU)n_ zSSPH?P~Yp23bKFSr!Lw30n-_Nt;UO|F`q`Smx{p(8UMl)Guv(48M_Kwk69YxE)csH zf~=xl8uXDzL|`V1CW2n6kNh_@L4wHdu!bo z-r)$+D3Ds{9Q#fj+#r!K-7ej{)@@W(SbxJkbx!&20noGRwH?GHXHPs<>Nri#=ZP0~ zN&W$hHuO#{(RY9rQAH^~Wx)DJ6GqaE%c7X%?L0BqDR7_9xn4+tZky#l7iS{RUP@}h= zQ6D|zNR#gTC7GCpgcaEe%2~YMOt8y<`xXe$wwwIN)^e^0{UqC-z?vtZc}Ry5kiH#W z1QiO~zH-#{zj6VHVo~$s>5U&edLWo{R@;?v5SXiM4(d%bNTO?5+0d5;ELc{nITKpyf5^>jm89 zu=i*)etG&~?sv+Gil^Ng+@8)Izh6H^b`eUyME4sC1Fj~|=tQgWqV3QK-_>K-s7~i| z@U~1mmcn!gi^U=b8UQiXe~Cj@5p?04bmz5=j}Ly6LE>6Bs!Yh-;byw?nKxvxaYWSv z?Xy(h-YAl6K!>EqqISs~4+b4urP}Zk^beb#GAUZS{<(zzXWn1n~@L1RGUuD&BXbM#i{o`5Nb?!so6FA`z7|4^FI%b1^#I; zZ(7xg_)U4)-&KgxG=`)^cN4CWx=biDy;1`+Ww`^aG|CpZ|Avk!(sP=1MV;8VK0Vo| zS<hn`0e!^{O+})SU$_EVyB={o>sVq zlw&xDE?A?fUmEOIZ|q_{ERuEQ*HP_=ly_Cl%-(oh!U(^sH5z}^)X&2TVnbdp8cK#( z^#fRoWezgZqEl`|@z8*Z%)biqj$|D#>^?vP3G95y#GG?8Bf!lC1?}9m&4u*cm3pOc_gdS<4ucWiZBIFnm9QI-T!x z&iOvi^}DX;kKc9XKbJE1d}ii;->>y!U7*ep9L*Ddp&lHL_g1Ne`@640WLocg4bIK% z8y$?^6abm5{`^3GLGsukZYg6m-~{rfo3gp6;OhEu2~g@}Q1U=Z6hJtYFcPFbOe3Lp zO>gCINL_2fpYTpc@%EcEX7RJZ70wW~B(8S8<>V$2MtaCPpcCse<}H(&*(DW>VXV>df*lk+`m!P9!sH0HUXo8B z14E29xLILaFgd0F8Ll*(OS*ebR~S!Ojui|kyX!4M^y=0aE-mQ~jK{W7RQ9D+-tB@F zB4Y-K>o#^tmkq1SC5&lS1(>QQ1)};PhYCrl$?9(jt78OLEtP#PsHoVG?%c zM9W53)43TX)Aicg1(g7+O}Rdj6uy0&tNWp3BtWh_b7Nv^9Q=HCrk(dyHDhu0j=-YA z)SF7#z-gu)kizDpm@X*cLNZ1)xYX<5TDX5G!|eC^K$QrWH?p&^TUZiOD!IBlHZS}hN!OEbgw7Na%}=_;sIh8``T*d9s~Ud7*@B(I91L*Y zSM!a@_KkB-WCgL-fU>nTGxa6K0c{26a!?%^#d`st(p~AoEA$`fY0-(G2zF^Y=X!7Q zeVG4&@bz{WI!%-Z`Ag4&FuLCxp-kY#ok*6#aSSyIF0H}VFCi9G1gk&-B=~6lmY-ph z>i5v#qmC@%o}~8EY@g2?>?!+78O7;h{6p!A<4*LvFZAju;cG4MoM>=ia3jzI1Tu#g zF~D@QEMB(5c{Z5yCFn=QTi_?-6dRRb=BbR&!5}~!avhw}GNGAR7(efqJfCXA&vR~M z*oMVsMUGGT>dWZyJNcrL3goea1Pxw6fZY&wk)*LKJ(5(zB(I$uDBgOm^V zP@PNEYBV0beWwy2TOuVpH0^jq{;)%!R)8IoIr?;^6J>4o>x0Gs`OrLai{_dEB8k$C z>#X-a%uup1+k6RfES9WqsD&{3uXNI@Bm;%8n6fw%<82&~2;c~x?{S2NsU8w}L1`E? z;;@m47@TvT;%G}`=ww_6%DymW*S=Op0|D%{jun^I0#+h6i~yY!ozi6lxqNRqPyOo-VcQX)E7u~L)gtXxpn=i@;em5jwN?>e)1&z>m4dBUguC>iAe62k_Ri^qD(a?WRE5y z{-Jq=i44(84j*FvU>Mjys}jBlm&y{ zf+&UIesN6RfqoISZh@0mRi<5fg0~1NB~vwyg}awkT(PoRr$cY`lg3dS zOz@lbluf3}2{AzZZtxtOdt&Wqwx~ODk2vf%w4rG(ZEmg;Yk|G)tS_DF-^(5s85kOB zn@)rYNTuU=7GCGMC`l=Wil8(uIlV?TyX&{TZCsB|pE*YMU48Kn&41bH~vQ z?}dBcSk}&X%9tRR`Z3XM9@Q{|VuwYrEI#aJU77o~Pyvv`sSkewT!~%vW!r;Cpyblo zPO%^5rr!0@7v*`+bQazJKrSEL*ZPhX6cb9mJn*XJk*voI2<{l)Hg$7J^?jwC2vnis zRpiFgRiZ0Q3Qgc2@6-xM*qI$~)z~`gyRc-s{%RHt0wWkIcH5T`_&$UdCppqh|8y033Ut zXNpzz$I<~;mq)^_D>f5~r9V(-it6Jtzpnd3m)jTrDvP8rEvoz+^ySlEZhu>L03e7H ztG|~okkOXb#V3B3FM2LSmGp?=R*ARBBhgX3C@2G1B_yXS7n(J3<0`F!8=!--t}72f zo0%x(>1^~;!?V_?=epTO+Lo7Tb`8#EUmox@8KqO2hLBaIHRRBGkVf|CbW1i+u%&Bn z=V{96K7;IPWgH6^<>78=C=lE@VAPhnN_+s5!jhaN;;|Vsrlh(Lg+GzDIsvwH417Ww zQ*9~gKOGG);IUKV6?rAfd%De)`Ddd!j*<0=y*djSw`d^*z?xG2Ev+{Y9FO1Y|YEHK?>3W^IE{_C2Aa>A`#YF+7YV>Y> zi)Quj47F5s6f!t#nxVb`d^Zf2!YIZq=QGfnG7%@E60{4pGCwqR^L- z0WzpnnxaOh)KQY&;EXFowicFD_RaOU-c`Q-(YZB%IMlN9LhWCx*Ls+hn7?POZhL%? zr{pYJR3mVndq2kXc*tA8-b!fL?Ut;qS?mh8I{eZ>V&2eL{mM}V?FVJ5#`J{JET)9b z8^9`Uu%5FaIIBb8tr*pa!#sc^}9nFko1`AFtz~}o7 zH~;~~3#uC`koDj>&6=WnZ7JVbbdfzPswtZorcS$eM@d^3U#dLa#9vr8tjmK0VQ6!h}O{eVF8TSmZPYr-z z$8P^o^nmw`;TL7BD>ELL+Klll(0lJ6D zQRmDLuRl0#l!j6d-^oR#(bzoJvXrdNV%L4B9|UFtJQ5GiDvF^avexU$=(qiI6%`0@ zSv7My@AwA4Y8xs1+sT2bk{~nq+VteuJJIHggs=Mdg?qQn2QQdm%dT?(R;kqaDlbS# z-AyIMYij=Q?fcXbdp2r9d_>)tBPV!eouIYkeYn1Q!S!c2rzr za!4!1J1Q@3c38JY^%*~H?4G(l;6nhGQoY8`^iGYrVYlVwO;O~H0$HoW%H&aq1NG^= zL1_6F%uxz`D6tNRBAwEWP3pVHrV5b;a^Q~JI)4XqYQKXyKT1O;pLWCT-KsxiI%c9p z8zoV3vDS&L50yQx?57qchkz=6kRgxkOEw9Q?c83zi}wjS4E=26gU`!#67WZ zYGg((`jqlgmm;VJDjY5EUqq`bZ$MOAw@QV_{CQtRCyg~cS=;hD!Mnr-O*xH*sw2az z&Jbtg)-2z9pPwft>?4>=J_h$R!>?g@QAjQ;XV>Exgh2(Q3F))2^Q8%fuV_^mmq-k@ zzkF3NiX^4I;P$!OXrRGN&PKKH7)GhCqN%-q-*3xSt|njdY5Qb$O}w1(DHLkB^D9a{ zfxKRRP8YUIxYb@pq;_sn$#es{7O~EdQ|v4)!8Y#7ef7gNkkJ{d=mnC#bA`50;CdlI z?U61aWN#0fLyK}NLfs%=*|I;XC(DKsB3i`G1XV`WM_r(fnNQAcV10i4S+Q92LZ*-XiGq`Ii-J` z5knVpd%sX27A)-PnVhYssy#Il0kDpc(UUx1!eBj>-l}pqH#TbiJ{jjuM&_Xq#haAk zTF@x&f^yve(JR7D9YvrV^q>QLrS9n9R!s^=-#riR1{)gRrf2p)RN1BF@AtDFe^+}Q z;MC4per`FxcVA{%{kXNo!=GursD0_~y7nuygv`2d)^V-WBN{o5_;w+yNjf;89H-@COEJ&Ztm%={mmWgir`C{5RW#UE0 zItjGT;?zhOrX2$bik^T}C_0)os{oa@hwgSmMAuQn#<`XDv&TsF-ZNO-ToaCP?z>A1 zka6!{7Mwg;E2W@G^!PI}F4zVdpf(JC?XjxMoT_N2?Wszm=mGc*b$}~q`7EHnl-M*a zeN|t|a}|c~b*H|QsrS5Fb9Ds8Da*ksL}Ozt^Df8U4GcX!cQ<0=%O=_vdv1-)Pfm1=n7vyhxLo?o)Lnog6wCF>e9HSMKK9w=Ovi!5 z?8vN8t%(G$K`Iso#g+)B0Li0dI>a|nF=}fs1SZ65ux|`ppg)H@!6j;IVtq{{+yTNT zKI`zhHE?gRC*+3|b!O6SGrLyDjsSXgj{)RwZ!QtJn$wFUdex! z(Q}C#y{LZ|3A4vmrI`#zQ9r|{8aDv9ZM%0;;5b6@5L+VXjnz5Xs$b;HhbfuW$u+%x zrCKo5RuL)FRSlN{6r6@5J+k_75!l}~oJ!TBefQ!O8%nCFpY7;1ypW^87ERnGnM&%f zio+p#3^EDyIY0pjY`xI;YhJ>0c2i=H{-PU=oKygGQM24OncynqL{@(+t1MvG|JdYOX9k982=AytTpSxkOXNx~ImG-Ee-WJAH96JO`k1;^0Og8dzp10=YI*Z!G?1be zknQC&r^oqe<$`l6B*G2-Bi@5z!?jOB3aiebG72kyZAsFm)c`cNbdL!4Jf01@dW(K@ zsnOT`NR#WI%0XPe)D16+V=Mz8rsx_Y1^u&Uy z9jF2w!=22Ohz{d}K3bn%SeONXSDN2lGi4a`m{<{kufdqoQ0%3CHsF)({B&se znto-_${ZzfshccuaVKp*75-rJ99*>lMBpW28-u>3L*}7k*Pj)qzjYmQ_x!aZ{m?1# z(;y@g7=goB5o<>26H_TN4KFZKQwV93B=5h1*l(o&0pt>`7$@v>tf?p^H$ZK^N&lyW zvEX+`vwG(Yd%M_A+>dxGim&llw!Hi6d=Ty?qgXfxF`=0tTBRA!>*}FYr-ygWQ)UHw zj^CN={ZLlQ5eXJ;)n&|kBwg66r!t&l;!ROkmde6aeSAYvJT%TCc}nnlwNWy`uf>y< z=8=fHqo%*r)&h(|Vn(=szJ1YH*OrHP0`jjO;_QJU;)R$l!U7)aoCCa$TWtm8{IvdX zE&n#2;LN*MOSlgjc0KnJ6;4Dh4gwa}%-F4kKeDIuCo;mt2U1rmVN>*(vscZ^EOR}c)>MjF8t zn#3X_7>U)0GiS5swiQgh=cSS|?$|o8QjO{)sAzAUpln%0CYbZFRetnA&YwBglApP) zQYnCOq8!q>JAu)`uICs`gQ)1x4-H^pKpPi!<+gbocxoyk6qe1<1>z|CTVH-65IRELN-!bV z40RW;sb0!bq(bsh+xF>+RK;Bks84cklrN1fQ`k}g-8cb5ZMhSHjdY*b8Fd}(-g%!4 zbdAZ5oWJ4}bD7h#{6E#RR0j;kVv4WT+1q{$ENjx2QEsCe>Z{A+YbwKs<<R5+yLIf=eSH61VNmn+X^CG5{ubf4Z923}D72 zfhD>dkoNgK_9^OHz;4oYC~ z%~bC(8ZZG}Q0prB1R*p*&czJ93XA;1Or|T^R^I2Mf5%~7I9ob>?z9v{1o}E1l2Jm* zpIH`=1bt1#l%ZTG)@Dws1lB9K)X2-!$Ab2klU(q2Sdv({>yYc30RvbLe?*1+`tJ5K zY;{2!LxZqknEs>0L5zK5nP^NX6$(!SkoQlvE_HC_8=LFWZGpAJIu|`Fozm!qJFmKiWvXk2*>w2&LE4x^$5z5 z`FF@qpW_|*kjP%fGeXP!o6_{`D4ZKoXr*dyGAF|mTmIg%*d4*YuY38m`0U5rn31n0SkmrEY&l9klvO^+grafP7EyZ4oZAyk{4BF4F5# z0ABT`H$SC`cUUE0LeXnH5m)n)TX1$+N>!@-V{z+nzM^WY+ZI&@bd8D8iPMLpT*Bgw zJpdCL*YGnhaPhNn;ct$P`I+rY{QJesjLapoPHD68K1pNAop*Wd)t0o_ap$$ z^sZ555%yvUOZgj5fiO>>7-V37gZ#TULCQ36n}U~#$|)u$t<65Z3}i}lOTv!k<>K#q zp^xCM#)L~>vvSUaNgHky!={Hp#ZNgO7mIQ8@gut^7lUdEsID$-_*sBUpMQAZ(VkW? zPN{Y<#RYYiqjuT5&8wSm)>ZvT77iY{eJ)~}0eM2uj;Cj%qdpckxoyf~Adh6G2_u24 z1qS+o8IxkVu}NRu*psuZtqpm&Q!M=mv6u$qE<l$K47lk1zi4A zM37=+fgO%e5d6Yx@Y2voka(kZ3%~)^&;VIp_RP+Lgm5G=Hpj3q57wtb6Vyg!?9GCl4bU?1W7HKq+cUwqdC&CII0 zrb1sa!L^Tl%$9v*$bZwx2>R+|^h0woZI(~uqhDhcqd%LYdYz%MBi0WjG(iimCh12Y zSUmsDxo%Cqi{o@{Z;iPlcWD$Au3VkbpUY2NKOj$feTkusD-OUM3M`RQRF;B1xrIxl zToE2{%i$sE!ClZn2U>X>s$@nyM?bX$WEs&YX@pagQeApcRK88-nwc%Ubf13p?DZ#9 zN5DxK_g79rF+uR>g*>qd?<@o&r>G+r;@Be?>HEH>6Gim)$)4)L@w$*>mYhNqi=5J* zCN4*--ppJ3k?U7VHSep+qcJ~w%V-y&lL;4cojZ*}-BgM4#!AoYyGG343Giq$b4AS_ zQxsZw6#f`#?Op9$sjR3MQTuN+j8=3x(pXjQ&mbkZ+*aIXh-3@M<ujZQ7l!H+=vsOZ6Cp>*L><0)JCYP zxwA})s4hG#;6H}UNKQNX*!tw8ORNJ+wTh z*X|fJNn^q#t69nwwYf~qc( zv;^R*a|qC69G@OaJeil&G47t~J}3qPIo1%hT9nUb{-W$B6RrLJ)EM`Y)c{YXgSN1?C(8ho$C;KQ690#PJrK!(ui*4!wHYb{){ z4^=PU995D!0JlROt)aP(mt=LKmQ%UksGZ?Ko%~vDvNUinM^5KbkacKL3R?@`L`;;4 zOnPl{+9*h))6w?}o|cBMIj;W=0@^GP>uw`d_oo zS*U2Qh*P3{je1i~N7=>s1rI3?*tcn>1 z1*%#}qT9#|Xh=9QcoOrw1BU+FA@R%CzGs3@in1|5@Za#jore;i9+9;Pjjx`gb;{4* zzcJh?HUiu>@Yz;0c6aA;%_U0P(9^1`&K#BmaKI{26_$|Ub8%FVOaBii774 zwGFLjN@ee)xaN$zH@IW$(^Y-=67`}=PLWlV^~0a~TpS1J|1=is2R#cXVg9Ax2Cxlh z>Ot4s93WTpXHsVEu0f_532>#LDz;rI+eV~|JRblsoSy&k!M3~S+Al2?wSb-H_8Beu zk1#%?N2~;+CXUn8v0oUgyqt0yOQVBKdYEUrw;eXIWT${)tYhJIWdFVSr)L{J63Vi8 z6vzvTVXi}I)P}wS+q-IjIg5#kGj5VEkFME$-2~!JVxB!&s2+T@FX40woM`oV(wkX! zFs3L2R*_v<0!u4SJxC*TOy?X8&*~j<_pyqcm>)ME-~naj0Fhn2C^w7#kMW`e zs=QrKXG&WIz(m;f%QS3rKXjmqGyV12DIW26^fGiFXZLskvGPV;{1`L%KpgyFaqGQd z6rYPoS9Dj#-IeYae;@GjE!RrA@v`HcE}}^w-?%Ofq9&2Gpn^zcziIZPPF7d*9`w2o z@q&++q!YGy?^U>XN(Yel;QlSq$W*r@{jMLTk6wO5Us_Gdad2K}Y1Du@B#`gEXcq!i zD85`(yewk*{Z^wT1H_V1U{s73Ojfgv7Z~Z2sGrN>w;seoDlQ3UHIw4Mc0YYpOA~^} zeSH@y{}tzMQ_TBbmt8N8;zc@QJGH(AglkHBW=%41!!Du+eB2p=|Igmfxsf0J_uM(3 zurU$M)IQgIeJ9}S*sUg|ucUXCA4@soS!}x;Lx14=s2HG{uJ7GaO=ZmeS4CyzN8Wb2 zmm*$$ubhI@2~!g}>{>|w!8dj?!q>8E2~$hw*%5-*p0XI~($a8=lgs*Uc4o1j(D5j4 zQlyRQaOD@cT1S^2Jr7&e4v|r(f*D7Xs=HM%G zpSOqyR4J}9hLTe#ZXU}<_&nRS_3AV>U|riCnVYq(y+`Z?p9z3Z?C*{h)EW=b$=>P^ zYJRVl&syid$3&iwzF-3ECq*@YlP$@}bt`9#tn&s+g#KmfYHUy4hbH;apJR=$0a~ho z@=P=mS$3$x-O_B>S!Y{Jtuk=H+B{M{yO-X`=vxdL&Nx07iO0VjSvqmRQn5C7>K1P6NF&-0FGSiv&E zb6aT5Veg(8FiOyLWV_}4s6vli1i3)9C(% zik=6F z-Rou7rP3K4e(}5={?i*nO0$zs4l zXJ;CXI*CO`NO}RQRGDN&cWtl9iKsNsZ~QE98>H%eqtArGfDVYc+yYHtYll`r{cDu- zo*R%eIsw1?i}v+v{sreD)y4se!_zlD#c&Uslw*cAy|JYZp;}Hy^fhK^<-y6@2{sd# zZaio^!FK$B&8gW7?DZ8X>P0QoNJr_1LzT`Vb8IMI&uytS9dGsgH~_6Ej|VPAHdI~j zP3tB+tCpAT3=#_{Q}ktY^Ghdl7CZVrm+vdko*seN{t?Swj{D1C8_;;0@xSKiIdP>T zfwcX0)C@ppmHA&f>l3M8^#rS-Oq-SVqguxcHC~8wGZ(|*=Cs17p9<4(ZXPj1OgZzy zrTC{N008Hf2>|Y(Q^xSQh8bNGOtg6^wYgw&o4(t1+$R+mtnRsQBnZ=!DgxGgT=n6y z9_+Z`pE`!ff9n|9Z?Cn-DO`(Zh6o=Tx1rZn|LXKD^wx&{f%@Q+K+zFTxQOD@aGFz~ z5H?C-Y8E&0WdzjtiHW+yxSL=2=W(@}s}8^}1Nb%H1ao8E0X9r_84?3YC=7FVGmL*< zE>MDTeD}Ea`)Ac&sW^pGg{fHSGRq zs-`mU>d<-ZFoLqi`>G5wfK`Y}gykegx4Ooz4!k!B7j$tsT1`>-eu56KQGk1$dCN~x zu-2h*{&5q%DlY};LwSwx3XF|^6Y275TA7^7zS~g>k*M!EVixoMyk_bLJ(pB^tbnT2 zjj*f`z_|KFab!z+WLD>)0#Klhm)-@&(*!IrfwJ(OFuNI+D_$B14gB}R)&KWR5dZJH zs(fD%J3`!G+W|aOjxuklxMN4$<}Y{bxWfE1z(a)jguvrDGqbT{$Gy#aj{`Bjlgu#R zjvW@8LB1V3&TQV1@t^@4%+J9;UzvZl3*ck$&sO=*m|$)P|BT50Pmc#i fYZV)d8!SIPaejYs)GnI&USGbTcfL^5;=%s_8G=Z| literal 0 HcmV?d00001 -- 2.25.1