From 86e9f19a30265d30a7ac577fb025d1012b672004 Mon Sep 17 00:00:00 2001 From: catch Date: Thu, 2 Dec 2021 11:50:03 +0000 Subject: [PATCH] Issue #2925203 by alexpott: LocaleConfigSubscriber can result in data loss during install --- core/includes/install.core.inc | 93 +++++++++++ .../locale/src/LocaleConfigSubscriber.php | 14 +- .../LocaleConfigTranslationImportTest.php | 30 ++++ ...ingConfigSyncDirectoryMultilingualTest.php | 158 +++++++++++++++++- .../config_install/multilingual.tar.gz | Bin 11704 -> 31262 bytes 5 files changed, 293 insertions(+), 2 deletions(-) diff --git a/core/includes/install.core.inc b/core/includes/install.core.inc index f1cee20d8745..fe8be4526366 100644 --- a/core/includes/install.core.inc +++ b/core/includes/install.core.inc @@ -31,6 +31,7 @@ use Drupal\Core\StackMiddleware\ReverseProxyMiddleware; use Drupal\Core\Extension\ExtensionDiscovery; use Drupal\Core\DependencyInjection\ContainerBuilder; use Drupal\Core\Url; +use Drupal\language\ConfigurableLanguageManagerInterface; use Drupal\language\Entity\ConfigurableLanguage; use Drupal\Core\Routing\RouteObjectInterface; use Symfony\Component\DependencyInjection\Reference; @@ -1830,6 +1831,12 @@ function install_finish_translations(&$install_state) { } } + // If installing from configuration, detect custom translations in the + // configuration files. + if (!empty($install_state['config_install_path']) && \Drupal::service('module_handler')->moduleExists('locale')) { + $batches[] = _install_config_locale_overrides(); + } + // Creates configuration translations. $batches[] = locale_config_batch_update_components([], array_keys($languages)); return $batches; @@ -2436,3 +2443,89 @@ function install_config_revert_install_changes() { } } } + +/** + * Creates a batch to process config translations after installing from config. + * + * This ensures that the logic from LocaleConfigSubscriber::onConfigSave() is + * run on sites after installing from configuration so updating translations + * from PO files does not result in overwriting customizations. + * + * @return array + * The batch definition. + * + * @see \Drupal\locale\LocaleConfigSubscriber::onConfigSave() + */ +function _install_config_locale_overrides() { + // @todo https://www.drupal.org/project/drupal/issues/3252244 Somehow the + // config cache gets filled up with junk after installing from + // configuration. + \Drupal::service('cache.config')->deleteAll(); + + // Get the services we need. + $language_manager = \Drupal::languageManager(); + /** @var \Drupal\locale\LocaleConfigManager $locale_config_manager */ + $locale_config_manager = \Drupal::service('locale.config_manager'); + + $langcodes = array_keys($language_manager->getLanguages()); + if (count($langcodes) > 1 && !$language_manager instanceof ConfigurableLanguageManagerInterface) { + throw new \LogicException('There are multiple languages and the language manager is not an instance of ConfigurableLanguageManagerInterface'); + } + + $batch_builder = (new BatchBuilder()) + ->setFile('core/includes/install.core.inc') + ->setTitle(t('Updating configuration translations')) + ->setInitMessage(t('Starting configuration update')) + ->setErrorMessage(t('Error updating configuration translations')); + $i = 0; + $batch_names = []; + foreach ($locale_config_manager->getComponentNames() as $name) { + $batch_names[] = $name; + $i++; + // During installation the caching of configuration objects is disabled so + // it is very expensive to initialize the \Drupal::config() object on each + // request. We batch a small number of configuration object upgrades + // together to improve the overall performance of the process. + if ($i % 20 == 0) { + $batch_builder->addOperation('_install_config_locale_overrides_process_batch', [$batch_names, $langcodes]); + $batch_names = []; + } + } + if (!empty($batch_names)) { + $batch_builder->addOperation('_install_config_locale_overrides_process_batch', [$batch_names, $langcodes]); + } + return $batch_builder->toArray(); +} + +/** + * Batch operation callback for install_config_locale_overrides(). + * + * @param array $names + * The configuration to process. + * @param array $langcodes + * The langcodes available on the site. + * @param $context + * The batch context. + */ +function _install_config_locale_overrides_process_batch(array $names, array $langcodes, &$context) { + // Get the services we need. + $language_manager = \Drupal::languageManager(); + /** @var \Drupal\locale\LocaleConfigManager $locale_config_manager */ + $locale_config_manager = \Drupal::service('locale.config_manager'); + /** @var \Drupal\locale\LocaleConfigSubscriber $locale_config_subscriber */ + $locale_config_subscriber = \Drupal::service('locale.config_subscriber'); + + foreach ($names as $name) { + $active_langcode = $locale_config_manager->getActiveConfigLangcode($name); + foreach ($langcodes as $langcode) { + if ($langcode === $active_langcode) { + $config = \Drupal::config($name); + } + else { + $config = $language_manager->getLanguageConfigOverride($langcode, $name); + } + $locale_config_subscriber->updateLocaleStorage($config, $langcode); + } + } + $context['finished'] = 1; +} diff --git a/core/modules/locale/src/LocaleConfigSubscriber.php b/core/modules/locale/src/LocaleConfigSubscriber.php index 2817251a829c..44b21e3739b4 100644 --- a/core/modules/locale/src/LocaleConfigSubscriber.php +++ b/core/modules/locale/src/LocaleConfigSubscriber.php @@ -47,6 +47,13 @@ class LocaleConfigSubscriber implements EventSubscriberInterface { */ protected $localeConfigManager; + /** + * The language manager. + * + * @var \Drupal\Core\Language\LanguageManagerInterface + */ + protected $languageManager; + /** * Constructs a LocaleConfigSubscriber. * @@ -115,7 +122,7 @@ class LocaleConfigSubscriber implements EventSubscriberInterface { * override. This allows us to update locale keys for data not in the * override but still in the active configuration. */ - protected function updateLocaleStorage(StorableConfigBase $config, $langcode, array $reference_config = []) { + public function updateLocaleStorage(StorableConfigBase $config, $langcode, array $reference_config = []) { $name = $config->getName(); if ($this->localeConfigManager->isSupported($name) && locale_is_translatable($langcode)) { $translatables = $this->localeConfigManager->getTranslatableDefaultConfig($name); @@ -209,6 +216,11 @@ class LocaleConfigSubscriber implements EventSubscriberInterface { protected function saveCustomizedTranslation($name, $source, $context, $new_translation, $langcode) { $locale_translation = $this->localeConfigManager->getStringTranslation($name, $langcode, $source, $context); if (!empty($locale_translation)) { + // If this code is triggered during installation never set the translation + // to the source string. + if (InstallerKernel::installationAttempted() && $source === $new_translation) { + return; + } // Save this translation as custom if it was a new translation and not the // same as the source. (The interface prefills translation values with the // source). Or if there was an existing (non-empty) translation and the diff --git a/core/modules/locale/tests/src/Functional/LocaleConfigTranslationImportTest.php b/core/modules/locale/tests/src/Functional/LocaleConfigTranslationImportTest.php index 468a62687b6a..72db6ef1b5e7 100644 --- a/core/modules/locale/tests/src/Functional/LocaleConfigTranslationImportTest.php +++ b/core/modules/locale/tests/src/Functional/LocaleConfigTranslationImportTest.php @@ -84,6 +84,36 @@ class LocaleConfigTranslationImportTest extends BrowserTestBase { $override = \Drupal::languageManager()->getLanguageConfigOverride('af', 'system.maintenance'); // cSpell:disable-next-line $this->assertEquals('Ons is tans besig met onderhoud op @site. Wees asseblief geduldig, ons sal binnekort weer terug wees.', $override->get('message')); + + // Ensure that \Drupal\locale\LocaleConfigSubscriber::onConfigSave() works + // as expected during a configuration install that installs locale. + /** @var \Drupal\Core\Config\FileStorage $sync */ + $sync = $this->container->get('config.storage.sync'); + $this->copyConfig($this->container->get('config.storage'), $sync); + + // Add our own translation to the config that will be imported. + $af_sync = $sync->createCollection('language.af'); + $data = $af_sync->read('system.maintenance'); + $data['message'] = 'Test af message'; + $af_sync->write('system.maintenance', $data); + + // Uninstall locale module. + $this->container->get('module_installer')->uninstall(['locale_test_translate']); + $this->container->get('module_installer')->uninstall(['locale']); + $this->resetAll(); + + $this->configImporter()->import(); + + $this->drupalGet('admin/reports/translations/check'); + $status = locale_translation_get_status(); + $status['drupal']['af']->type = 'current'; + \Drupal::state()->set('locale.translation_status', $status); + $this->drupalGet('admin/reports/translations'); + $this->submitForm([], 'Update translations'); + + // Check if configuration translations have been imported. + $override = \Drupal::languageManager()->getLanguageConfigOverride('af', 'system.maintenance'); + $this->assertEquals('Test af message', $override->get('message')); } /** diff --git a/core/tests/Drupal/FunctionalTests/Installer/InstallerExistingConfigSyncDirectoryMultilingualTest.php b/core/tests/Drupal/FunctionalTests/Installer/InstallerExistingConfigSyncDirectoryMultilingualTest.php index 42bf5b5fbb70..c95a201c6a0e 100644 --- a/core/tests/Drupal/FunctionalTests/Installer/InstallerExistingConfigSyncDirectoryMultilingualTest.php +++ b/core/tests/Drupal/FunctionalTests/Installer/InstallerExistingConfigSyncDirectoryMultilingualTest.php @@ -2,6 +2,10 @@ namespace Drupal\FunctionalTests\Installer; +use Drupal\Component\Serialization\Yaml; + +// cSpell:ignore Anónimo Aplicar + /** * Verifies that installing from existing configuration works. * @@ -41,14 +45,166 @@ class InstallerExistingConfigSyncDirectoryMultilingualTest extends InstallerExis return __DIR__ . '/../../../fixtures/config_install/multilingual.tar.gz'; } + /** + * {@inheritdoc} + */ + protected function prepareEnvironment() { + parent::prepareEnvironment(); + // Place custom local translations in the translations directory and fix up + // configuration. + mkdir($this->publicFilesDirectory . '/translations', 0777, TRUE); + file_put_contents($this->publicFilesDirectory . '/translations/drupal-8.0.0.es.po', $this->getPo('es')); + $locale_settings = Yaml::decode(file_get_contents($this->siteDirectory . '/config/sync/locale.settings.yml')); + $locale_settings['translation']['use_source'] = 'local'; + $locale_settings['translation']['path'] = $this->publicFilesDirectory . '/translations'; + file_put_contents($this->siteDirectory . '/config/sync/locale.settings.yml', Yaml::encode($locale_settings)); + } + /** * Confirms that the installation installed the configuration correctly. */ public function testConfigSync() { - parent::testConfigSync(); + $comparer = $this->configImporter()->getStorageComparer(); + $expected_changelist_default_collection = [ + 'create' => [], + // The system.mail is changed configuration because the test system + // changes it to ensure that mails are not sent. + 'update' => ['system.mail'], + 'delete' => [], + 'rename' => [], + ]; + $this->assertEquals($expected_changelist_default_collection, $comparer->getChangelist()); + $expected_changelist_spanish_collection = [ + 'create' => [], + // The view was untranslated but the translation exists so the installer + // performs the translation. + 'update' => ['views.view.who_s_new'], + 'delete' => [], + 'rename' => [], + ]; + $this->assertEquals($expected_changelist_spanish_collection, $comparer->getChangelist(NULL, 'language.es')); + // Ensure that menu blocks have been created correctly. $this->assertSession()->responseNotContains('This block is broken or missing.'); $this->assertSession()->linkExists('Add content'); + + // Ensure that the Spanish translation of anonymous is the one from + // configuration and not the PO file. + // cspell:disable-next-line + $this->assertSame('Anónimo', \Drupal::languageManager()->getLanguageConfigOverride('es', 'user.settings')->get('anonymous')); + + /** @var \Drupal\locale\StringStorageInterface $locale_storage */ + $locale_storage = \Drupal::service('locale.storage'); + // If configuration contains a translation that is not in the po file then + // _install_config_locale_overrides_process_batch() will create a customized + // translation. + $translation = $locale_storage->findTranslation(['source' => 'Anonymous', 'language' => 'es']); + $this->assertSame('Anónimo', $translation->getString()); + $this->assertTrue((bool) $translation->customized, "A customized translation has been created for Anonymous"); + + // If configuration contains a translation that is in the po file then + // _install_config_locale_overrides_process_batch() will not create a + // customized translation. + $translation = $locale_storage->findTranslation(['source' => 'Apply', 'language' => 'es']); + $this->assertSame('Aplicar', $translation->getString()); + $this->assertFalse((bool) $translation->customized, "A non-customized translation has been created for Apply"); + + /** @var \Drupal\language\Config\LanguageConfigOverride $view_config */ + // Ensure that views are translated as expected. + $view_config = \Drupal::languageManager()->getLanguageConfigOverride('es', 'views.view.who_s_new'); + $this->assertSame('Aplicar', $view_config->get('display.default.display_options.exposed_form.options.submit_button')); + $view_config = \Drupal::languageManager()->getLanguageConfigOverride('es', 'views.view.archive'); + $this->assertSame('Aplicar', $view_config->get('display.default.display_options.exposed_form.options.submit_button')); + + // Manually update the translation status so can re-run the import. + $status = locale_translation_get_status(); + $status['drupal']['es']->type = 'local'; + $status['drupal']['es']->files['local']->timestamp = time(); + \Drupal::keyValue('locale.translation_status')->set('drupal', $status['drupal']); + // Run the translation import. + $this->drupalGet('admin/reports/translations'); + $this->submitForm([], 'Update translations'); + + // Ensure that only the config we expected to have changed has. + $comparer = $this->configImporter()->getStorageComparer(); + $expected_changelist_spanish_collection = [ + 'create' => [], + // The view was untranslated but the translation exists so the installer + // performs the translation. + 'update' => ['views.view.who_s_new'], + 'delete' => [], + 'rename' => [], + ]; + $this->assertEquals($expected_changelist_spanish_collection, $comparer->getChangelist(NULL, 'language.es')); + + // Change a translation and ensure configuration is updated. + $po = <<publicFilesDirectory . '/translations/drupal-8.0.0.es.po', $po); + + // Manually update the translation status so can re-run the import. + $status = locale_translation_get_status(); + $status['drupal']['es']->type = 'local'; + $status['drupal']['es']->files['local']->timestamp = time(); + \Drupal::keyValue('locale.translation_status')->set('drupal', $status['drupal']); + // Run the translation import. + $this->drupalGet('admin/reports/translations'); + $this->submitForm([], 'Update translations'); + + $translation = \Drupal::service('locale.storage')->findTranslation(['source' => 'Apply', 'language' => 'es']); + $this->assertSame('Aplicar New', $translation->getString()); + $this->assertFalse((bool) $translation->customized, "A non-customized translation has been created for Apply"); + + // Ensure that only the config we expected to have changed has. + $comparer = $this->configImporter()->getStorageComparer(); + $expected_changelist_spanish_collection = [ + 'create' => [], + // All views with 'Aplicar' will have been changed to use the new + // translation. + 'update' => [ + 'views.view.archive', + 'views.view.content_recent', + 'views.view.frontpage', + 'views.view.glossary', + 'views.view.who_s_new', + 'views.view.who_s_online', + ], + 'delete' => [], + 'rename' => [], + ]; + $this->assertEquals($expected_changelist_spanish_collection, $comparer->getChangelist(NULL, 'language.es')); + } + + /** + * Returns the string for the test .po file. + * + * @param string $langcode + * The language code. + * + * @return string + * Contents for the test .po file. + */ + protected function getPo($langcode) { + return <<4mh-Q9w_1p)*D1b26L3j_@=3wMV=a19pRec|p9+}+(}&Cm0G2fJz? zPSsRR%{@KceHld*B9zlnk_i;dX~&cEUwJRSOt32+&E20&`Hn?@ZJLF#SE`GbbF&v3 z#8qQ`Aq`^Z)1S zr8ctTSqS(g)OVVA3F(J*Od&}Ezp^EF zfoHmAao4yiRFgG2P+ZU9GIO_Qd@=3Y>9wCBx^Rn2zDRHN()$Bw3`NK! zRpMrVY0X&ucjtFn@pYO&4+qEfkqW8UNA&# zCYWJ)TsTI3jjAn^#(S-zQb3S1@*{SePzvd7dvPdk+Hg1gtmDTa;rh_7w$SNL9<8}! z1GKxW33`qcAWYqO6;y_CiZege@%VR|#oe+wt`d@a8-_by9w7Q`<=%HMOnZ2q4#c#K2u>@EnNwm$a-nAf+Tu)Vh(bh4QqkSY-bk- z`E5MFcS)Fe#*%`|@dpACqi4#TVhTyOzR)|0PGW3N(%yZ)x^3e)^(ZkyO}a8Z(*OPx zG9^}w(t*e-E%pn}M4vcV=(M4CV)c=&2*6Kou=n;O2tLWGJ~^gF^dW!`h?VohWF9L5 zh{XU2l{uzIBZ>Um4gYT zuO7iZ2~sxQzqC_I@Cyi(A3E0Q7WOJ4p^ays;rE|{Twgct8c*P$FQriSKNR(X$lgqk zz=7vc|9zMKONZsi@4Bvr6)-`maMoA3(9jM#Xbm=_WrY#*dXFIFQzU>Q8uRL;(%pnz zSE>)Jo&{p&;wDUyg{EpiAwxodxOucuLYAj;qLR#VQUAv-ZG+( z{$7aDg*a<&xwa;+u+~IRF(agZEx(9tz!i*@AD&(zCP6MQn#uDoDbL-C3rj8}e-x)W z%s*h7i43sq9($QfLcie;CP4oI^TqnnzR84%ed6-OvE-}7R7(1BAVv^h<(?^IzdnlJ z=*xb5LfKNB0Oqnt{vylqs#`>pq87Y!VvuLoV|E+bVQg!U8^X#W&y4Ku!Yd^8-bQz9c zrrZpXmqg4{EoT4vQMMh(h8pp7v3X3d{pQ4XrVX~`X)m#&jE?_wy8~;maDN);;!i+(mI}8YFCsaP?cNkNnXcJ{{YA<2_bu~W0 zuOHf~lHaU!&2&xN2#O9&cl%kKRjm#SGO*#Rhbd&sszCps(dJ_^Q3G^ zy`~v#-`)aYDwl&dGFd}D(bRVD)+Ttrz4w;1@{_=!8w@Kx?cmadacC5)a55Pix)qPT zp#ZeVkc2Oj`tYrOp7p0kWC<;XR?%rW(dow!YD5vG~D zW^>_3V_lu6josCK%5c)1l7dAHK|cyo`zjTw^687Yj`NpraY@3Hw_{Ufc{!J%PkA36b=J&w zN1Zm<=?bZw;REvH4y&aI!X*w`MDK$KP0v?PXPo*-@FsDt1irvGDp%|V$GCeZ!OSkh zD}`5uzhax?h_A7k2He)}q%cl`KId@{yKl=bS^8R={s@P5Btw~kv(jW^Gv#orJwoOE zj#ClYkWG*uM_u`&qOc&sMLJs=SQCPk%v|X64SLs6L3R+p-_?MJ@`#UACwqblpWB&`TCQ_>4 zUVVH-P19K7=e`n-m&-Kvs1MOxiGP0kl&84yIEg;M)u&n0N97RNn*K64Z>zTLy0&HS z8CC>GlgF$a2?d&l{?45x3?chUnp76C=l5w%TP01o3+ZR=phZxT@#d|a!wmwj{YbhB zar|+SMO0|4L?Ob@w)J*X3kxLZ=*iEf!}J6vJ8`(^BJJG2&nD~Kw}x1^uwzhX)q3#b z*D-I@9^)_2%b5sYYMzD1Z^Hr1& z%RN$%%h_}!`e;%=ITT{vi+oA0i_;dK(ujDyTkG(IIedxLu*3cM&6f#Fi-v`C7OjIi zV3jspmZyh`D@qaG8}-QMw;OtrnS_lEOAKQ+Yw-bp2bH>fIzTf#<^o&i!$d}-0?f!v z*C!+*hg-TbvS%Tn(|4WZAxvuXx*ZBwBx6w=5^SA$!)!%o2Y^@gxzjj|(S8{>lGkn}8t-BCEX1rOt&c~G-Q95Q7 zgr1qp>=4gmC&m_Qvwvp(3)DKjY#v(?;^9gjSUuJ4=2hcgn^LN|y6Hw2%g0Ohb9Fn> zxJ#XRLIf? z`f5ID@-(Fwv=JIL&0Oo-$VD0?hCWXhyX03L(%J(Wsx|Aeaz?tnRDjZ zaCzPIBf33Z9TDn;qo|B4uv6pg$+te;!#@;&g^hN*I^*343z1k88#WSxT+Opg_ixQT z0ps|tII^NrtKiP3BIK1TwjM)unixdN=+rOS+kTytty7}KYr`tit7(et+BHmG*A~K~ zi;(<-qk;;ovijrXI)KRStKgLPVO0n*ltL4LC81HybuV1Tpm7f{%gjLrlS$IiSV9oG zDsMg|+jTC*6SrG(%Qr+oa9KhF|o#2s(!Z_3g|N63S*B!@z+^N@4*p2GUNh~iaUzdprSF5m- z3BooH=1EK5@*^3^m5)i6r=V&mB2}j4otpB*MEaX}&cG>si=(+#L`pTh2=lC*(d#eA zn#iN43l{kur!waqZb3;&iYoDGPK_bvln$jIm8#J%(UDH&=gy^v440n<-?H)xb~TMk zg=6HvCC_Th3|9`_#*ch2g3_Ifw_;a5PJBe_N~8$Ua@%Uvb>1BYeDpV8yJjqgg&Od| zLRVMh8`D$-kLc^wQ2A?0=@zi0I(d+|qn@$#p`#HFHG(&>WD~--X$c$B>ReJ`QvglIRZ-%I-c%~XxPFG&QPS|P0P_fkHEXoPGI=M-1|9CD?b%w`5K#0C zLZj>|fT);U$^#DHv+jVhAyHbuKqCLzXc%8zA(W{q&v(;8@AG33>vB6XRJF!OUe<~y z`=<-ib0a0Aj7j&-$Dc2bEI%o#bYBDls#cBu5(Hhg(e!3l-j&B+#GU7UbpvFTtf-(n z^T15>)edqeBuLA;7nHX|{K4^+*KY{j;Bvfm(6KBW@K<_v>(g=wK^Sk?_+^II!|O7d zJ?hz9=b~HkbpP7ho!p7MPXPUX@A@AnU6hZMcFpYN`#~ja`?abo$mN#mz1Jl}gWs>j z$3vDI7qF=xcE3Xp+6m&fh{`jwVhAs!YJCH#4v^_S6UuBAXNddhb-xxSPl3k#;84PR z(k;8eOvvScl|sdZVI_h5|$F2a+UwyPBv?qNg-Eym}8$VL%uY$fy5sH@}!gg zeup@P(x6StG|MRRxy$vNow?GQ$_)63iwuHtb8yS<3`jhX>c(D_oSAE2!Xwwjd}*m_ zLnn`lvPBkUJ^l9V965=T=DYE5NV9*q+lx8(EV-S9!*{OQ4xS7JsbJ|mrgGN=0vd%x zkPV9EJbYI+e_zVG zKFQ(vB#Z*iuB8D^NbB|ai!d$6@85JZiM!hcJfjM)M`?HJO)tfR?9Zd4^D$3MYvJ1y z5k6pVW^#swGnl3tysz5cB7gCP{VZc0nK;zoW zM9h*_@^r)(Vw(-62?2ta!IureotM3YySe2Tw}%Qp>~Hk>mpKAiHmJ?J?pJ93sCiy6 z3^I&wO{6Q3k{2)?-Z}6c5BNcA!>=Fdp1T0omX#{t>$p7iYloxSYs+j0HERe-E04-+%WjO;X#RN1ecR_z;W{<#lPwoht zg!TbeOW)V;$exZp7neP8C#k&=?#I_v=APVU1cj1zbq_tyaqgX_D|=Y{veXNKDt30} z7$AHHTzdiV5!(FMXgJ>-h*P5ZpbS+NhDKGz_NQZvb^_=K151g&!J@}8SzE-z} z0bI!AZe+hN_x3b4z(nG`y@LpHfS;LLo0gA<65Pw7e9=q?7yItF9ENZbHvNn~wYeJ= zV_~l>VOwG_uydHX8_%AJ^cxA#g@)|OLcr;`qd>q~@D#_RB@AM_9TFNjH!+%_W_lzY zH!WObj6@Fz>bWiUwz}?uj7KUpjQ82#q1eG`%#jQMEeme47rgd!I3@JyHy1Fm%|!EP=ogM~N;eMv5`a%51DyB#M2ZH%uW7G=)on#_ zA1_@+lj-b?iw0gEYTJ`+yt~SsJQ4n0cIj(|-=DFAh^mggoKjYefM;}qaW!9hrDz3Z zY$jy}xAY5^s9KiaVzMZRB6o7)M%c(4E#JeqG#>vjy{hin7EM(mgKy{YUbqddwcXDt zNc~IukQDP@wD|F`a2I)5S)VWG|Epw znu(?_6n&>UvIaXLMe~~$e;Kc1TFb6OKagOiqsb-hHv(w~Z$>0f=ULawJ`Ky*tC3@@ zHo*21(zpR?m|lpiT`C+icz6biBa<$&rn@3p|`%YJ$4NVZT$JBHBmmWUaA zTlMj72`{KT=J(Bz(j4+omJU57=5uTWifRh47T-I8XI7(}!l)?u`?W~3uced0>cs1Z zgA0Vx@0J`Q&2$5Z{MPLmV1vgR3j}E}JOawc&j0<2$qu*MR>L5p8x=Xi{0G3*Ely|fLU2+>`5IxIIEb=o;~qNLXYcn z8<-w^%uH!}4wrZ>mE|zXIXpC5{Rc}y5rS-1!_j%9GTcL&EqM8=h-t$ZhC`LL?A+^4W?+g)kF6M5)Yz{PVfWo;vuv13? z5Z+`oYGpG6lHDIs9-(wLx`dDyaDF!7!gRg2&SAJ0kVeUW1!Fn2mn3G`?tr1xV|lPu zMsS$Egjw~k)x1=S3}tN*#r%L6-U5fg2PP7pJqUi2 z1i9WrEwG42r?zzd;2sc;d%aNKIOY~-UnE*H9O-rF@q5t}u4|mg&M{OX(RIAOMr^F; z7_@BSE$`oIx@;l!ejMrhPD|ObKxngxgb$fM_+jmoCl%OYS{C~lXqUTSWGF=V0#H@e ztGl%-1|n`nYdirg%Yb#FazDsWCjZjGHW1FA<17F9bRcPnfcpB0Cu-4!T94 z9RuP%$-Z`Zf1SU=^KV6Nm^W_MTgrXw{(QOs`%BL_9=ojO&+(0~SdU6^=8@3o_KHf) zWXZkX94Ue+Z?TX)Hrssm!i_D{VS%|G8&1ScvdcK_KxBwk0>kTQ(Z4zI_qKxu1{m@0 z0h`aBa>}fuux`EB1kaEM1A*8^hp^)3ELRsEK2Aa2=<^e=-ffu9nuoWeeR)Cq9JB{m z5B^Y4nQ*cgRG;GyWcZRzkS5gw=yjh02DAaE7$?qdv`T9X{~DFw^$cizZrT3t?4Q8K zx{-OvUz71dQZ@RXdD9g#cxkK`%WS?Mo4$cE$;cf-j%StQ*!Zo&dR#nc&u%O2D!hHy z?G1FGf42A09<1yO)*Y}9ft2Fh2Am`0Vhon) z^?xe+^(*q&1}-rzgLOhW2iLUi-)+lBm8wYZxB~LM&fg`%9cOZ5?$}wY^>Tt(Rn{|) zHy@EZ{7j%|9tOiM)kefX4euLa@}b?rO*w4~D2w&IyKM_ch=#nsNYT#G3c|}Ro?-Yx z%;1jw&9>L2scpw7*Wx15MCDVfiLCpAmDPh@s=Ejp7WUdnOM!Sq&ym_mfr28|WnA8D zUHcZDmKI!|WIbD==`%B9s<{4E!NQ)FOzCUtR~X-Dz^ZiO7&M%y*$*<1Nk<3rR;?X2 zc-##sPNfR$>nAXBFcb|1=zH9(MmsJ_T5JF4N4HxpS}*vYc!`m&qNXQc+?8B-8QVqv z(&hZEt`^j%&tZGGdnZVtr|`2oYBr{o|9yvX>?%`DgDm8Cbd9$HNFk4LOwV=ytJ{Tp+<6PAIaD zK3AL{7S+&_-5lRUnMsakJDQM#PA(q5g6J}c`Z@U{RkLcK48l-1Pa1a+()9LdI%*oY z@737zBTX_2ZyEwWEbXS3(h=<}R_4k{&JE~mGe_Wt7%d<)VO?Rfy^S8^GVk4QAQd>677`>S+f9^5sra zeS@%opRTS=8*`gWo&3$M)A#(7-mQ6dIYy_#)0h1G?~DPTI3kRwMF$kP`=okdfU^<% z^#&2%zjJ|0_gg8N$uiG8ePnnP8}Zjn(xtKAS8KHRI1nz;n79%yNDjgjJ#+=|#no}` zVg6IhRF=!PF{hn_zy?LadtP3i(`vB&lL|%iN%jU^x^%asB}eywFpkEbT{)6E;fO2< zrk>xL_~7^nf0fPy&dy9W!T$F??B)`s?1OODJ*dsFDHRU%AJH->-%0KIaF~fW$%BH3 z&Nz6Y$xj3dAA}cdsUznh;g1`pSCBAe(f`Ad!euudgPZ?;$a-(?O>YRfW`|72J}uTN zoJb^vZlA<>tk)Z=PnC&m3@Vy4kj#jz%Ji%G1gN_K)Q1{_l}QA>X#WkV%DM|c*8*ru z$2|dLoI6ySew^NEZCR{fKZV+Hd#I@&2eJ@$`Ki55@*3^P8!DrjEp&J(2kzLf_|EM5 zfqh*T$}d7cfxYW_`CaV6Im9sqVPl`!Toezup%Uqcp)8)$jiJ@c6AV}F{jtVuo`bkZ zw@<0_&gTYq_^cYVxaJ{Y;oAk|cXncaugyqPERU)GL|=_6Y5^UE{L2jvG?d7){*3B~ zJ5cp8g)$|^bOd}6JW2W^{?lZ}4#?05w&|f;<88!Fd%I*kv{!42zZ1rEGWZ(>+Qr35 zqnq>WY<4g=#A=CgJQ#}3Li{YXRV@hL=8nA^Ob7qXTp#IG>GX=e37WVUgzNT|Vod-a z1oL|s7!7#@xi-`S1~NUV63!a+(+NuB%Sbkv=(Sbf*N};euTMgRo!wWwwUo5>TWmAB z-`1vt+C6<&6UL>kjz(%%gmKzm?MlS~-ftepd34|EHo=wEmsKP0AB|aN_yyzHXf4@8 z4T_juFL#(1I{vBEGTlwBY=PA^?+T=Q&P*E9qq$Sv^w00hssp)nlYkV4h_5$z=@C*A zTN#+OQ)%l%G4p7&D_ztl7#k?!5)st>na=-EyJTUlnui<{$GQ5bT*IT}H{Axn2-G1W zb&b7%vTA@|)w0_E!vp}koWiJ`s3GSG6FV;^upzDmz0S>A^4+z!Hm`B)1qk`!&i*t% zfA<&rTyWhL45zhBgqpvu=&(S9+U|Ez(sXyo6FcdK@&G($PB21aT1i7~uNRF#UAumY z{dPE>-70^ut(&t-FFgW0niU0yzx0+W^z||B8&8j16rV^}~B}nQW`b5bF&j z^L|-cU$+IdVP`j0q^7n_ToOqS>TR&u+UOH+Z#Lq;p#6E)7acEDaeNjMKgjOuli4*o z(;`jqe}4WTQbIkCu`njAK3&XqitDo@JP+&vKSJ5JF5V1Z9vaO6$YK~!^(OG#brIKn z5qtDTj(WE7!~L>t$<2=!s_YPA-*SF&2?s$Bgn%I+k_lp!7>>1}z~|;2v^h>E>)6(A zztN#+$el0`kE5#{z5n;OD+>3CCI@mhH<^JPfDj<~a54#^5%Pyb4@_;!#j_rzWR(94K+c)eF`JSRn6=D$Hkg{#Y z?$3^o;-|kOsu5zN_}xfxUI(E2Lbmv6WEoq1=0C2R|o1Hb1$I#_Hq86g-=cj0`45*d}^>mQy`)Kg25_j72au zTk&beNR+TklcTmYc@7p#PsRH{eYsk~qKY|)Cb%(!=Hv2_7``8Q$~DVx6V}2)JFSjF z3XLfxzsFujsDlwN|4$1CjsPuK-bqDgwYV@kQn`q`2+z{p#ET7wo>tH5Fh~gfos1Ea z`DK$Mn?PC#6ID~T?O5K@sBNJbhk_gxR(Gd$=-vNmCN?{}`7_Bao#4LLK3}S&GkW`& z6EH13q2aOVbcEdtgR>oC|15sy4lNQm%hVO-|FKY;KCS=4&J$|^XTCOkvzS}|L+#|| z>9s?On1YY{x2(0FxfoZuU%0M)N3al+WBb*e1YbI)yaNRfesvGXH(R*v?BLP1T;!#N zq)^CyMk&y-DBtTD1ToAxvq7!L!S!WzM9orfD;iw)OZ2f02pPDFuOjnB%Do*3SK!^V zPg3&ta}*j}st(CDW)tA8!q>!zbbiSC@aOg>GxkAz;E!#t_nZDNa|0!)R-b96S<%Wy zh9j2`(SK{!iZCj6@54OMndqd(3^QPO0`+{XNSw(0E3MfeP;`nV&>u6WydYvX2&?2sV#a zAHgar`iydrZk4E=fU5BlO>%mdSpPyD8S7Kc+!Q!?nG)&rvtd} zXrK_^aC?^GCELRn`buVq8uzwxbJMxu!B+?YT)tY0s_8E2f6%lgien8AqVY~ShK-{{ zkBd@*vu0!g-5UCc_dq~cTSniZa?|dG;eZWiJm6jb;?KN~%?{3(-<$vIz0Zh!%7+k^ z?$qq&h1{@;kwEjcw$q*Qwnd3kt&$hfdPaV5CPZ*w$aeSPA4S7jIjiWB+fojaS^~xB} z4Wjn$0?ba*&aXoq#RVj5$YbXnPd`VZV5UeK+_PhKFE>A+f+jnWq_&lvHqd^tZcT1BXsF|m)8W?m+4r<)IXFb4qVPM+9XfVcS6;b5gRUcUz18I zVp>hIGBC^=MHg$CMh)jI9+$uvsk3d!04y&D3p4Q&CJK<_{ZlGh*1wHh3Q3gy{IeC)B;OwFFOU?-OF5M&Ioh8eJ>h6-o;X>-!9eB{ zBEpQSYcds5_lM{qA)>C+iPE=e+Qrqmw}=f^+5@ezLw@t$A?thQQsn z){bRyNZ>!pgAc2Nm~#6K0glX#sw*FH7X4v$?196^U{#Vg~jDBLZ@XYEFA z25tBm)eRDSt?@v6#Kf)((Y)L-Fe2;Km7HE_4JRx8m9DGZqF%YkDecY;W|z=M_~I70 z$eSrQ$bbcJvMT$OJKa$>X1wJP<%IX>TW~2jauliI%LE}sLd#UjfrSO0Z$VJip`OGB z({rQpv*vL)vNybR-TG0u>@Yqyiis*_pWg--T7{3)?$B;PMCJ+@I0H=qOJ+Qd;h>=R z3-C1H!ccbz8$@P$wYqOxxcG``Wj3f}-ZEeGSw>Kxf)VVLe@Q~02f{PS=HXL(Bn=vw zQ$!dt%Yh^P&+j2etH>_>Zut0mVrQOU-+LcEm`&<5{*1=F>YIAP6KxP0cSjN$1n*Ka z#7^W8MwmpSXONN|nkw!b$<$HxH`8#P!j6cFN-Ls0W1#Fcte&0ZDQ?on*?g!GG_ zE`7FmA$2xCk5usdBZ`n2hJ<3oPE{?+3hag=iyp^l0}lBR?4V+_=H$DsU4V0j~b0pho$ZpA&&Lp;S zWsD5*$(fdpkO?%J55pX>EJCbb#x&zFJWuTGJ`K!o^Kt6s&25l&8_lvYxICr5j2cP1 zzZ0+{dBQl~jMty61oGs97h3+v*cHf?XE3gebEFg98lWd$_32cal)Gq`aq!LiF{&6w zY#1-mk80zO%O=gncRmFWKo|6}kkW7RpHa#0TI|~q;la^5AoK^x+b{c`*17mQRCMla zx$d-0Ip^D(3@>36v|;`UvLK^>$?kB|<8ZGsyeijs(DpO-^Dx}xQi$r{*(+B67MJ5F zNjq4j{`t{>>qXzHTD*x(`0u0-?2hY;r^tx#*Z3NFK4Urtv(AyFTBDgOTU}u$WFWr@3CO2K1PEPAj<&(q-jPJGNPi_; z_XqugRE?UxxZR-$xZSP2R=Ik?`){Dv!nr(x$Po1Uqt=wPB?eBW;4*TWNo7ger>ksR zxHO;r^z!9jZ_c}pK%z<_2au1Kv6rN6djZ(QZJ`pbKL3>rV_rlAjacVE3w( z|IKonVY5;Z0@*sOa(M*)(a=HumLTfx0Sv6e6I8_fjc+AbY3N9<4R;%47YO-P>E>ts=$p$B#83L-)!mvAfgsjTTxVfG%@p zj_Z<#kxGTQ6pHO0Bbs8Oql5q=cUdLFqW!5gm{jrj;UES!;|9nYver5V-lej4K1-9k z;u>g66yGvRLDfh&{1OrG4(w2)r#)@7=PB8`kTt#p>e)_FywCVKECSk>CMmZ)$1@HTkjb5KdUZKAf+^ycd!gVBv;E==Jo-@uJYKQw-PyFSV znv`dlO7W5iA}PLM-1e#aH}9IgupVzGJ_`7&UkTI-zY@%9nm;+eYN$M|YQC1PC!jAI z63wtTHCL7273-d)5~sr(N=990g%+8rHcQX;zx&bl@t*2Zq9pbb_tM#F(}gL%w+yXX z%f{eiNwWOp>$T*xwR{XYB_R0mhY)zgg6TI(pEZB2VOyWCdAw8gmTJY!C3vS3m8JAD zxHD#n6C*vVTjPwXkH%9v%#`T4jjjePd19k~$1=5nN}qa{b852&=H>sm(c_GzA&>R3 zc+;h1_|=__yu!=Fji&4^vf`bi3V*NRZdt=fW6>y*z=_(h+W(ClNA#{HgJA-ax!;t_ zls{#oy2;F)%BsjkWSQF=EI=;9gfr_W?j7`A+W7xMMU2ezSZS5U&rOCFGK~)Xj31RS z`ZFJ`-7cy)TOT$0j$$0R^rQdH*Q%M*PxUGpAaS2yD zu(cXo;&Wde_ZxbKNI9aTYDzwVyJRZSS1AeMaF9z^Z*bp;QZb#ZuIbWij_IBfawK?! z(|o1oiQyZlnNoIHwor(kdEjXpyIJHg{xd2Ykb)Toi5gBv`W(P|%?w)c?eruz!yj0L z{H{L()@#ukg?DIP2S!Ekn=Eg_GPpW#Mk<<2Z#f!;M8CU1Uy-4^Swd3AK^Lc2)mA^EkyXeN&_Ju$#4RVpM z<9~Gdj?(cC!A$D6Alir?um!WSJrDG|XSsV+b#0p@-TbN+N?w8+m4tf??+8F|jJ+Vg ze{gS~7o<4X*`BTh|3d`l=!4tm)~KP^kP93{+8l`WoHYU7ZnTxFNyg_+Z^g;&DOW-R zbuT{Axyho(3>Fce7|UDVVfE-CU(c;vt=}Dv`I3{4*of_S$WwiBK@#=r!|~=O&x5jau*OB-WvyXvvEcx8%M0 zuK}A(rbxygHTrTvkJ6f)w14GvU1k2V+2p{r=wUKr4UoTB_Gi@BVNuGd6BiGrWMZ;A zpP{}56-eTLinrCatqJt+IDQ&512#bV0QY=ySrX>7+7?P&cWl-C5M_xT7|2Zu@_o1RpRTB zo78j9nWU|~+F9$s#_DKff}OKiz9ZFRp;1KfUqfiQ9~EpQ3fGzJ9kFO&XQD&rt<17Z=Y zX3BwcxYenaH{>8Xg7v#B57GGFT2r zc?6^TlprGcjR%a4^TG6>9FETRxEQyY!8!vI##G`Yvtno@ebPC*Rwt0BK?8wd`e(>e4tr2BB zn?OPpaYVYWT@LYLb9vq5r-b2}NfgnD*TT+;{bcKa4qK)iX0}JdFu!3Jt<9GKM4o0jf}=Ya`xxwh zIZF7&{3~ywq>3gA#pPhe=e87sjyM!{a`t1%(4dPR!@lg}210{Pu`k)6(!5)95fN;? zM1nzGqenCTj-GhvKX6y2LqGk6#wWOl3^8nx+8jt0U~lf+QJeS=z~M<%j7Tql=%R<< zH*Tymbe%ER-a1L0&!~uR(2QC_T=4HLAODXzXR~poTt9w^!1B?R=YZ(@3BF9zPSzz zqEB5x644u!&~Gvz;|idSNLPLWbl>Gq44QVa7=HF8w2)Mi#6B234bRcC73IWVt(J>> zmr8M`q=?4+b1NJ7rv(9>K&xxRD8`ExLTE>U|8vuz;ozbmctdNg`m>G9I{|xb=WIg%gr)21FBgvUvA+S5q}P!O=wFol^=^ zc*`Dee$AzkR{j4;qjILR_PU`%B*@k89K?4Yu|^3)ZuMavb20nChZi8d_h@0ldJfc4 z$M!544|EJzMmg}>IpR5|`w^a%k6NCZw`Y9?_ z2<_uSgYE!_aLXUX!PC7~ z0*L+0Xcci}Y3<5yHs$_;E$89>PsZQ3fi54{@+~t^;hLvmOzTs1^`+fJGjIjH(`8IM)d4wOp50vdUlkr8@z#@|~G@l9G zt1Sx<=K%G;%*-peR94o2!$SfOP8^UJ;vEki_*-N-B3Y2Pm|m+60WIA1_O6dYcHHGw z5OP6&1`pfMnLz4Tmy0=Epr(-q8cO4x09D%o(eidefNB}}7 zM)dOLSEBDbnV<^UxCPy&3v-SKf@DnJfKk`HK;T#5ks}jBlc>@hNfiP{6?>caf_q#+ z&{^A|^<2&7U)Z?|{^l?3?p}fIdME-ysQlS-^)TB6o~Ex=X7E{uWmN6!n6Qn6&qDKq z-=y+O^Jn4=6O5QE95A~F-;IQ!A@pl^%M(;i-D3~nR^4zwCH4Q3Qbt?~A`Jn!up-oxZ_CciR1%)jtn2p8^=;pcV>G#{?1Aoi$5Rj z+$AklYfpz_L5CSVQIT(^SxY#}=))@P-Lv zNW8m@p`yp9SyS0EW<9}W`z3109L=h1uYx5NIiI-dMAIIC!>0}gy;{^t7k1@2L@{IY zRyttfMX)*IJI%5yacxrU)m#9s3i$syA=A+V4W3H;T+h*tXP(Yoe%@7sOxx$GUgjtK zZeM49-Ypbd+HL;Kt~hfe7yO-TgQ+$BBk5X_!mo5R_xgPx=Ck-hys_1EO z(u+G4baZ#fAjUH=91#EV0EK`;E6l09MGsLpch5FXPNW0>la^sV{Dz6X1GB8X;eN0D8i5mQz>Cbnt zGj%FoCESyy9r72WI0g^0pvNlfboq5TA8%a)1 z#G(2&9fXj&PDdvwel5uODSr7Uj;{vFmqG!?89$wloap<%ZfX+#%BYl*ILxmHi{`oY za@;J;=g|i(r}<8lum(S|P(EzG#y!H1=J+!ob70khaAmM>2w8l(T(r-zKK4>Nhz%nS zBY<|La~U`H^iE?7#y4x4GwD&1m!7WX^RlG8_hYBDhuv~1==xlu5rV-|_md%AJw`ni z{tOn*z38`;!@V7ww3O5`^X6FssI%|6yPtouFMgJfyYq2KpjRW2{hR#kD;+I=W1XM+ z&H-=hT0T>9O{)yyB$IVeGVn47uRpH_|$!q|v z<<$E-N}JNhjQ!)rJU>y#h90n7C8a)+X@4zrJtw7rrx&BO!5TZy#85ay{dkY+e?M^W zvD26)7Hybw9Mi|x1M3)_?D1y-h&elRW2mNJt^aQn`m6v?GDRu@8gN8^!S^qj!69%CN-w_f!nPc$8@KB6*%YL@lMFQ8{g5Nq(f*rW>q1+-ry z1mOkpcj)`Oqg>|QQQly}@U0rw5HqiTQ~~-@p_K9}eUV#3q1H~NlKuM4-S#D!!UxC5 zsH$tYJ8iK#TTkoRtsVqfv_2z4vp1}-Fw=54&0wd)I!km(Ykymhr|>M`qjKnPKupK* z+xZ$CdIdKl%15q3#FT*kdvH6>@Kq^Z^^qR?W-r{|s#};}|MaD*T>agk%1x%I@t~?Q zajuk6U~HagSY}lv6<3SLpPK*Aiy!1sLk-h#Cfw;wO^jfe0tJ!h*i-*|BY9Jsj?w1_`( zi}!t4bT&)7r|6KnT(ikRZ#17u?dxbHH%ynxYP;{9zK5hy^MaWn|04W~49SqqUgF;M zJ&z!iXJ*b#nw)HVA*B_UJ|?ma?Fe;&)2R%S{jTEv5O(p{G5F9pAwA z?|e2VFcaQFI8pkQ+Z)@V19OI(F)}FY*qk(D72g*zT@?$%D#_M_HuS1mx)3!hFxBv9 z@Ca_|EK=6M3PWP}a78LfR~Bj{nHqL~>TqSe&^z~i%Uozg`DWp?v$V;plez|W+EFo2 z9!LsK(8+uw$M1MgWq96hJ6dub*%s6EVA5Iqx@_%P#+#oY(9rgd&=x>D%nfSf%`l;t zt?=q;s(K^w3?PF_g{H#{=3+KE*hoO}G38_aBhe+!m;bRR?_ILP_)oGUM=nSU;?K32VWIJE`*M{?bs0?MhZ3Yf~+bkNS44>vP^-0{RyfjWUg*UDX8TPL- z_G=$LGIca~Qa^hIS9y)+ePdIT2t~3-M@xRqi%5Y`mCY}~~8uT9F$y05gwoH20K%C<| zue{YyL%#$rKB%}Q|G$>bf-R1w>(;mv+}#NtG!S42?iL8{7A$yh26qika1SmC?(Q1g z-Q8iBK0NPt{y^6?SJzbSeebna2a}n4(QPQ@)AOK@aECLjr1)@tBA2w5Z@kBFrMdr` zcr)G?eC;f9Fg=VIi+2Rh&zK0lNx5!hDou(_AjKK)#0|YVEU2*8EBU~1F zsY=c~HcmV~*2Py$PV6&D)p}rm)wmB< zcS?Q(2&0-aMe~*6EvxJu-X>QGcnBVO#KQa>o^)ue_Dyi7e9-ffE|Z-tMKL2Hi<3Xh z^!!gJqdi7ND~2YuXi=3gQ4B_M6d@m)qS-kIzs*+neR+PI8of$#s@%`e_jm`DeAtEi z#)kYr@JCei{Y1IrY~S|7Rx!#NmJb)($I61Gi_bj$#Z)ETD^V>|?sXTbBty@GxD^Q- zd?g;dExDxw8qWQOygfK9(O*n5b6|I-9^{ur>lt=-7KB!Q?+FdtXQowR2h%l5@^uY` z)5zaq%9hXx_NrIbn@^-)_q2YR>oKL_I3aMYdl-wDq>m_AgNti6~Hh#(DZFUZ8Oah+^qbkj8)c`4sPoZ#300ruf{kW3q;{ zeis^IChGL2CiHtINk06yYsGiKuXD*WUiOUxf~RN`O$eGy<4${2=#i>w7VsAheCuFP zu*vQ<@=GY*jKDHj9BT@gisfY^ZO^0J9zq*<4x znmuMr$bU%P!PsHF1;f?M*GFMO7v_^luZ4V$9UX`o^3N0wcw@T~5xhwP)4K%qQVBU0 z8F*o*{Zhp&PbMg1?>->Q#!3AkmUFRFo2{>jT=kd^SN^>oLer(SXl^t;7t16+9U(5D zR^l^kBYC|_nxZZxi6i`^5I4uMV5vdZ@Rxr`ck`M&!v(q^v}U>47-R<<%WLREHAI2b zl558Fl#XcWvul+5Q{Qi!x-$nqx_#&1ld%|$G;2BmOLp;*mHj%qg57V~9n7+omVoN? z;r(vIzMgAcVPPL8;%d(}B&MB))45X-r*}WIL#M3Wr%d+xYjt2Ke<^$Va6|r3iyEgF z#7K`+IdT7@5v@;mS6p>E|k#7xuoB|r@ z0>_xi3mCH%5~J#p5^QmRxY`C5vj34G<$2z(+g`KAhqGme?E7&F&le=}vt#d9ms-B% z+S{znBfiy(%wkyMp({nW&M6ef4}M)ZdNu1q9D;KKW=|}CdrJd5W4@3AnAib_LLDrJ zgsvticOOr}aJt@Pk{0P9;AW0DCsO2pvnfoqdV7RBX^AZhz27%VWFu|HZ^|R;x5D{w z?J6gn{=3j47>q;d-e=ZW5WLY1oi4@6>SZ+$T8qu_{#0_Upw|l9DAU+FFiQgqY`<5! z>UuZ4r!Jm(N%0K>HK|5?!0c>wiu@J`CaC{2K>mhPbRLOL zO#hP?;zJ1}tkJ|^+Yl84QukVh$ZQPu`K0OtG>B;8|623__BYgr$kj}o`>JQ)3qx2J ztkMFC-ovixBN8yO#Y@lS#reDY6|=|5%o+UWYPEI!njC9Ll(?wU2O#bY!3<0HB)rH4 z(^!<9jrdd%YQ)|LmXv+#?KR(=Wex99QVhb{Oj(dPZ8Jv5GK{a>)coHFzixgR2RF3- ze%FvS%>4m+c}LcC2=dvmMLeGJv0jz;_TFy)3Tk}4WF(dhGJv}nPEg$P;hdmGs;b@b zV{CGv3SPv-v_$pWX(5{*fbWq){xz}82{U(7au*}XTpL@vxBWI{@3ni>LQIYUqES@- zPni49>ps8zzyVhHlMvadDAIcGRn*q){REan{#j~REL~jT&9C}V^mesgLr$Btb)q8u zr_(gy1D@JT)}k&X3rhLcZNEn%*Hp;@EjaF=7f7ip zp-c~yoj0j1jo>!lT5u=0@xh~!iP9$Z^@qaQwaKhNb=&+SGzV04G`AUOImv)H&|XAzCTj1>ZGkf=z;vj5=Ln-Wozz@Uc>F~Cn^+d|^oH4F--p}Id~1h@F~ za_~dv!y2%))P9_8M|I&JCf(lXyPOa_i!*scm*;2q(fd4?M)uR-%E~Kj@b>vRkl#E@-2Nh$Cvz-`ylmz zH|xv%(gUd0a2U`^e4FbQ+~xlL9&(w|i9y*q@l@ltK#cK%Rf5zRvZ)DbU$-Tj9BdT8 zDnUVARGy4zw}h@r-Z06NJZ~WS+Nsxh;A|>BS2MG{rk<$(-%bNR+`hBHO7QvJMFBmX z7mec3bAQnb3R|haAPQ5y;9JFS+Qmar!O|0}t=sM>+0@?;8(^B@^+1&#fuA=Rb=?{{kNJIu$iQ zlpF{#!eM#Zu$ggvjO(C6V1g?EZJeG$l zl+=CRWoLF!vaYMyf42LA{qc;lizfT$*id&tSIeBncNn(OJpO{d`0nA>Uoi79=_{W295My2$a*rdfdIpFOIqX;iS z#Bhk$QXRZ6OK);{y0uuu~=evdax%MfY!+_LX>2Hx^{pNlbfQ}!rNM31nK=`*|fq?2X6^r!t zuT?}SCTwk^;G+H6so|VsjVqQ6<<|Ygq=PKd<+LfTma~>X*a}nYFF4q~Oiy?p$SyRsaD!)^Xkyw7d{10qus6WQi}H)@S&YrTDK zu~xPlE-#~Ndd~P)6V~>pEiPu(n#ZHUzFgG*mYQZfz>C9tA6c4ys5~FU@#?W&J|t5; zQk}@S1l}s)>cfZGIHhLf5o6kUT{PK$sqX6l0OI&wmtum%qnR-Rvj z+VlXw3{jYaxC3p(%w1>R)RT{Au~9j}HQnX2Co)9?Cg#DNg-+VPp~$Gna<4>e;>hNV z5Y~!UrWP2D=M7dld?=Zl5-;|`1X+Wf@rz1;jE?_cv1eDxFBX576L2RoB*;ZVJ+4Z| z&ASu)z}tj-PC22`?(z&NEl)YbiVgs7mx*NPsH5Kmb|t+1uqCC;YA_KLPD#fBipK{F zYOv`xfW6n6sBQvPJJFaAphoZ&P$<`Wrec+=g{JB_go`2g7~pCc@}KZyv5{S4QZI#~ z<`&a-d2>Q0O`w$#D+}yKAi-9ym4uc8QOc1pt16Gx7Eib=4)V2g`?K{w=hC^;l)u1( zB|NatXOC7E&#x&Ora(y0jcH>kmun09G-3`WK#L9p>b3(_^!?99q2{uIv{$M%)D3`! z2Mk+?76u}9pRtWiuYMtPVJE8n>|H07;To0h{^q}py{A^Do0riE=$XI;#IezDEqS7< zqtzSdFEBzeoHRnUnwjnR$?073q#C(nR1a`+sX4MkI!OK&Ajfcd;njXGE)~GDWn^*( z(v%GS53omG0O4H%>~p&@#r{v==7{fbp#$jo)EQG%qh%krpn&M(!*a~#c}G0~1u;`e z?{mX}-I*WQ4rCN3&RFOkOzq-OGle*yvD5T zP=a?@W+&yWabKy#o4DXF(=Uyzwu}-BkD+fK@Ef4(&q;>$mAVAB2MI4W1U!TR;OCE6#nlwdtPw*dP+2@)w2AryYJ(1TyAMhwqa%7hV5O>Y1oI?K^bn9 zmkZSi`WB!I7+fT; zc2qgU%x-&`?jKGDLu!B-(Izk9PSVvO??|wY_i1kflpHp-?_oX(?Y=`?{uXovUa%iD z2t^J*x~v{9O$q_a{XPY0{bYU>;9W_vliOkMi>85Yl-*!r@_Ux+RFkRW!F_An0LVl& zZ=&GbyF^#l1cmr8cew4qwq=!vaDE4fgCM>;ms~&anQY_T&i7sZQd?plOS}f-I7m21 z1th%2${}*~C|8p;aQR;nS_JEN{m&)I?7G-8D0LL9YM$d`7N<=gkJ!p#NLyRi-oKYO zq^}zvfJTMr8w@mlUuDhuG;Z3Pw$cyN{6j}|b=7XLDE)mLPbvlWdlCNTx|uxlK!${C zMKv$3y7bF_*8<$sGZ@yDeczeHibZq}xlKxlYp~MZ2wDJ+$9Ii=fvla-Y=@&zqPvQ~ z$qSG0s*_vz5^OW95^70gq5C{THmQ)cI-fC#R7v~%$lj}r19v(O7Idb>q=db!`LwTT zYavI?f|@5jS$SB`zHL~Epd^j-```Fmn?g0jaA6;}td?;>XHK6@uEJ-b|C8z;Z)9a= zH@TggJ-XI^*28rj=$lH%<3~ReB^E>9NyjX*dO~`iR%iQS`O$(rX_lA3<9ET2;(p%n z0ZS~=2uDrAagY?w!dXDvh;Kq|NH~E#&8+L0?%ThIn{g z+Zldu4`PBriW1dQq)E8`Fms$ElA)_B^|FUri2g8^i8yY)$qeCtnQHfMnQGpzqV!Q; zacV!p6APF>SEycEiFcD*wZuM2_72nkkfg^jC44F_jm=DkL(2Ncp{I*cq@dvIpsf#s z-a;dbe-t7fV6_6v#(uR0^IVibV%>c92)llqiy-ln*yC!x*vXlDZ)s7m(`l(a&r&w` zBHEpIL(s6L>WlKBBh(v(V)ncjm4YXGDfs)@?WJpKX6333tCtKCz&hP3u3Gz{nH692 zUse7Okk}b_VTJ#naPmG+_WqfVfQWX6^~08S2Fauyn{SqbYMzzQBbtcTVYB$;sN|%e zq9#T}l-gIC%xnE`%~Qt`3CkLmt^K6UN;&+G?P5Nc9t0^St($5JQTqt~7s&|>sk zQpuA<_NGe|JFmEl826LrrDwCEeMT};3y&1nz&Dk{httcY{?YJDDtM2Vw!pf5*e!2Q z(o-C#;8mZG&~9qb5Xa{Ltwtc`2dYT!l0z|ah$WQ*7Fut55T)I$G{NUm6mcnRmcYwV z90YRIR5J)vAaY_nEOdSi?-0Kw$Oi;*M8ppk9jcEIBxQct=e!?b zJxNn03VQOYDv$P4Qf?0&3B-=Qbt1DwXjZ4l5j^d>rvj!Oy-9;Rkz>&~3rM3fP6{YEoFFnpR3QmPG;5MAPp0;RG3Dg)xb-# zLO_ni{zGTYD zsUk3S65KLpxO(rBwbF8HNn||xO>(yhVBt5LJcv(*GvX^Jl!%?kaPH!=$BQQBTr9ae z>(oVysB}(a-cd8irwxzbV_Rrh;+wbeqI`dLLi3VhF$lCybU4ykQw?suK0R0*iAtBA z4zX)sLvz#`HkYqiX<|Ficy$&M&QB{x4yTDQSW!90oa=9Ch(6{NRrAoAN_i~$6gWBL zvioR}(biNE)r*qEGprrec#$&myD;nAo5P%$Nl0I9u{(%+I8hzSq(_joq?YOl1(UdHR-LxXMr+<*S(vg}eqo7DmLnL*2(0zf zG~iDiAREyn4ys9G=fnF{VpeAHJ?FXbVzDsFQ`E|v~yR$GzEd6)iT_as8M zM>QJZWrL?~DUz^#&8@27IxBzMG!Ti#5cfP>pt&{v{;EoCrr0Bt#EQtgB0Fa)si&EQ z)AQ>symK8zrvJ&Gs6h~CtHo%kPcw1B_e>w++vx-+B(@-3j+h~pVwkTvUL2>Id!u7T z7oW1@zKIxJ3+Y*Yyt`xE_v+XDgdI$s+zSU*kv~JCNQ%@HiEU%_JRUVOL)3ankm-9PY*Y>LUhmuJ!jz6iu`u zEv~B9_sk4h^j;YuaQaNWy7b(dieUiZ;=hBL6b@fv5{Qd!TIm7oRytl!!juG*^ z-(uHO?xF`=JAYL&)-a9vxJAKtNKDt?Ytu1O3mrCA_iJzp+$FJCe0u2`@<}&;SR6= zckN(g@#ZRU$18RZ-|XJb5o8DW zSw~78z&n~)wiHdpuCtb28#9)-UnpWy-zIeLE6qU+798h zyRno?NQQM5craFh*}K6h3i0xml2Le~q>cHX9qUddi=LH{jI1TUk|rce@AmM~9&KH^ zMkc43a;qV&Y_~O<=oI%m*V;T*>Y*zi($A=YqA&LJN7^j^*=Ep!_M=!Z zp6eII>Ne6W5Cr-CAYc5j$tsEwZOZ<+|SsrBaiyh4hkdic@RW7P8Ld}4y z6}`}%M8~P1CGD?aiti}j`zrc15Gnc{ljrudiNjA*SqMUs*6WynX_gy4WlXp@%>eT^ zRpLfR@YAS=!$OoH#f;~G+l-q}K+$M|2J2_?9SPpgOuY8w!ZahKPYjOOqF`J7yF!&2iG{yQpHz%ii$W^X zun??IHY<9bUsBE>TX+^?8Ev*&l;cc4D!p+AG>E_ATa16D&A$Ad&v;cBW?I)^^tn5+ z-HA(u%gB;)me(;#eH!woBN%G@S?liPSaLrD{DE)C*&S8Nt#YPZV@zR}$E?4~XJ0#! zGe_l$FEL_p%u;C{L*cJM+G;d1LW7s0`$!$$%uOO|PBM!QhXEb?J;D8C;d=gEcS`x; z-LzU%`Jd9HIN+>cHsr&+shPh@9KfD0%nxm384)J{ya^%(0O@jvsIT?I3i} z=jShE60vMr<16*(9UO-Pw{~n@{lm93!Wl|b5EuLU$Md8}y_!Llcyz(_7dx84FKB6( zu&~o_zJferutag*?23dSo0e46-tcr3x?I1n!6kDd5i4O`m>!X+3 z$FvO{U@sAW+NArmE7DDQM;Q-KCcdd}dbKd04*$8aUAv&^>iyN^*~`C_Q9nVG&?L>J zH2w-tEM$h}G4+J8=I+4Cc5`jx4t@|m{c1mjt5P-kRlO=ME|D7ho{A*_Vw&;x1?6@ypx~qCA~f%H_;^I z^G2kijAqR8I0Zg8s^Wp7p6bsEYa!bUOm^^wC{t1Tn|R9a{lop}$M;=BNH+`@v!d%a zY7_fYs9F;Hw-k|o-wxZKsf@8wJFzoY)tcpOR+Q)Z@{H;cmHXaXA}igr9-5MJj0$Ld z9z0Kc-YbJxDX|%bJah`m@{*z7W8S*fHFnTmc47{Vns{1ICCl%nStwm^)YdR4f$+6b zqnYZBh7)DpH*h#rrs*yHeM^+ZVydivU73egO_0tO{4Y?JWelh{fsT}z3Jqah{!UAl zi7RQdBVa&a3oyL@VVKWTLrC_~tl}@feddt@5+P=PHSx#Sr1O+IhMdWpsY2wdYo<%S zYb0f6h7S3>^ZL&M`*)$H65lM=Fs3*Dp8mrF^KeOvo$f?u;g2057Tqo}Tyj^5fNz(I z@GTR=+EA&|P^$6rVilbXDJbhyctW|7gND0~ntply6H-09OZ^^5P#Yg985i!(7i07iC%JIfIf~vqDjBDap#}xNjHRBNm8TQKAtk^kKZ-6w zq~Ay=S{=iv30G8m(%Fbo^F*_-x-z=(Zy$Mo%U&v{`uqh@ec_20SLc;Acyt2|38OPP zg^qMnN9};jb!=^p9#zpoyo*OTD;`&dz*IvSuxJ)N@-&n0NY$8D!zYwnq9yRb@)S? z{#adH#)klCea-|vwJVntG{!7F-idhtJ(G+7LEmN z^zVmTiw}<1O&maXILulyeGzA3Kp#PUzU@V?nyd(Ti!-;Nl==lZ+7p9 zUCu2{Yt~g6F!U+e0-{Xv&(F0bJ0szJFT938tdUPSf|m;u&(R|ffMqD~H?#~5S{+Du zbF{T)T_v!+otB>5Bj}46C8X< zUH_8Z^S5N%=L}TlkxDy=(s@j7*Jjn7706Ea8nFnY| z_y8Lhw_dtfXA4QbAvPyv-~Xv5mYtsY5|p?5q5s7;Jb;4b*^$10!EV#vFejOmO3a$V z4wn*{_8mQ(3Nw`gM;(qr7P1CZ2JL{jRC6DcOUT&~`Vo8k&kyGmyYQjpe?D?yl^%f? z;34T>e5;XnvrvuYn`)w`G>xOq-lIi*-f{`T4l!B1~(h$T^$STP5#4%JI77*{6U7C2M=mDXhnqi@IYx zh9~vs{C7G_v{r<-iNsGp`45_KsQE37W|tx)TXhn-X-(xKb|!btdg{vZ)g;IlP9>?z z?plpheEvgTFI&1RwJMcfVwf5^%SmtfLG@wi=OPA6lUEM=cmvgmDeIf}#hq?1grt%i zxp*0whpqc5FETv9B<1}*{|yEs@ayId6rZXO*jg)9!d`d2X9Z~a1ZJ~%?VBMglb|Ru z{Z`IgMIcp^-4+Bqi8{G{~1 z`Mc$ua>ySK&!0?urjk0am^FIsqP;>sRTbVi<+_X@Gb%Qnpe&@Zp(XkF%4zcySBn47 zmj!8@tnilxUB(ymV(R`1@&!)iV9qo z`4T(an->XV{G-LGS6BLf1~!TLTYD_^9T)UF149B3qTK(s1Ms_*6-(u9^gqT&x zT7MKHlXT6VuPoSUg891GKj8zlYWh~-hD}uPu1GQ53m6COp^`sH{l#eb5zzcw8Tpta z|BZ1RhCuc5wm~feK(B#;TS4`TcXsmT^;d^Z&VyCSFyCIEL_(zV(5Cord8XQ<`R23H zq{hWZBCEiMxcv(tm-p?c^hBf)i$n`s`3AEG1qluUbwfaP@b)W}wiynY3{N` zg?luIYAxFry?;BQBWG+xkd?r6DVqR$!CQExi*LIpK(z<70V;S9Bh)wVwE`{8{_2sA z_TkftM94izVa^!ckNtzc1*Dp}`L%Ni_X?D(x=R<<2#@Z+@=9_sS!+*|)$E*Ghc8Vz zxNmai>k=)QaYm%z^4d8x7q;)gP7GrKHDYK5zPuX!Zw1JtrFX<76^a&#TD_x7$7&5L zcHS1^5bl-$LFfkCwIZl?2s!0@o8;!WLAA~2(HWoDxScyKCujk)ASCt2+jnPJ^N9JD z`f}I%^Bt?;Q0|mg)!sgGW9l6Y_ZXs{0o-U~D=zXJ`FYE!o&)30;G_oH+qb_B>KE+c zK&~nw2CVazoIrkw(LQj6E@plbpttmlg{g#d)tNjsM$3KlqNYIIaOV;1Ko9#k?{I8d z-f8q_6QZ>sXZ%9&2u>>g`2e6mO5~Y2%KXocsJeEAb3r(hph-giKwY7Kw7lWS>hQr* z5DV4`B!2@lw%~yS`O#hQ2KU*gVrRhN2T%f_K_29pvjBGP&c>LOEdWOoHH;O--x)f& z4PsUb08}x@@4+gL0O8wDc_~J;g3{c4B81}w`?TldsEz=F5F#n-@Ebrr93J(eqbO04 ze)124=!3Y)1}@7dz(@vP`#oSAqyMUv0BB+oWCB)Z-RCV)f&8*j69COcIoYBxbMULv zCnB-;Kx6#@IHL<(6;AsKpm>WAZU*V2jw@ftVvy6+qD4#x+wyjtuP}` zpc5cf>NPBq*%vBvupz_7$Q`?wNua@fFYSF%lyM8`!aoHYmHq=j;#$}Un@`1le9c*K zs#Sp1lM&wC21|Y)l=E&}q2&d=FU&q47XmWXD{i;Jl|==<*n)@vrl{xYIn_QuxCOLz zZzbwm2IpwsNsKv_UunmE-24#{1|>iOb*PyOp=%TlURmtl;w(sdk>RI`k9iR#m0vm9 zKQZw0&8fW>GS;f&PbAxq&XC~>y!fQScgL+l29xGVr<6qdq8fdYcyig8Tn!Ai&*d>{ zA}y>Ss7f0-Cx&K5od$Yebu}Y9R0!O|`*ipCZ$RSzp z$aSXiGrFF=#Ipubq}fw&x4LwIO>Vm~uqoSN=7ZNs&Iu7X5zI>VV6c!mj;Dd)@iBYO zL~RG`0^~O?jdqA&n)<)tC#v&QT>mBBt2I9IrCl_`jprG5>zX)){s>Hzu-idtPT%mP zAv7-za%Znbs7ysW?riGoaVu>{q{fDMv9^1LbWV>g182pTfTnoDX-9a^9bAq|tMPqh z?$a{}zl~=|C{ir-2(Y1ZhnAGW0hPFs#~{^n0mU*_b3R`???YUxtF|?4j_)olo<~7+ zF?Gu}b=d3OTBpmS4Ggdd)DBvCtzw3%g7clMSUMqojQd;bT^``T;6c zRY{#4djDAs$7G|Z3`)OTI}=3I%^{W-cK$yqxpYonXV7b@XqvX4w~q% zJoyNhS2a-&6^t#T^QBbWp1u|FNYn6Zz}z1X<7DWt<~*Nerl%ULphvg;^WxmjLEKQf zOv2;z3!ru^(KrSc5-QDX2_67kXlDg<U!b5RS924zzYVr1Vz>sgH*$86d-&oN`??ZTZxt(_wvGjO#%iw%!jS}RQly)Nm!bF{C& zF~S7|dO}H}`F)`|v%p>h?Zn#?Tp?770(A${Fq9%mlGvNC`E{?IaFEW>pDVyt-CHTf zybE~jOa}ON2{|573d$LaGN}gg6J_(9sJq&Dww6t~ygPT_qECd)9t)%>U{oOZS$r~p z)fQ+uSaENu9w)b}Jsy5hlV>=6MmHMt*~@HM4Uxm${j>K5=H{QIMnz$JKhKli(lWPv zKG+8_IH(3Q0|MOVsH;9*V^_$`jpbZe=~zs|f>B@C&|vhs)IGoJI2Mp2 zW9s96H1MZn_q%k`Kj+tJ=V+Ji@%I13;)^GzUPoj~lVruEe7x!~wq?9%;bzMADTygm zPWqb_o#sS+U~<*g>BD}*IMVg>E39&)f#O3LtOasBA#ET8J-_G#@FHe`Q>Em+ESX1O z0RiLlz%+gypef;WdJbL={ap`pxqgdvA>of1@Z5sdNQQO_1_oM~x0-feniH zs?Z1462}3kl)-dxFwQTf7{EAf5ZdL&vLH~+atg?omO@8S%Wq(0U@7k(KOY;of0+s` zrG~l$kFD4|_iMcAGL`Nn;#X=(mLCRmW$o!~l*Sb4? zPoAG`r}xHa{xYtz#!>;BEnOI5&*c!)4)1)nTiuG_HYk}a%Pl@hK&(17I&9X-QFZt_MIe+RAGyl52VVF~9St2!3n7+OC8OM6N-zi^ zkB;lZKGqKpW!y}csEiP%Yzxq1e76Q&-F!^3V3@!rd`-X{xqF%lxOMgzU{l0G*K zo(EQM9|Ny`B!XHu*C>ME&7Dchr>QwHE&pMn_+&j$pTEjJXKpEzOavltW-PxOw-b)fx*~bd@RFLq*8%sO9;_D&5U`sOVUR^bD^ zW6_W_3wHPW28>kJPojFt3@`(Rrhh|+R*`g9oMSGU3j0uvVwi%e6LFp>7KS6HDN=p^ zwl;KKr0g#Mx2U!A39ov7&~o!hFu}6o?i&Q(O22S9Z6Vh~^mIA)h1)gF*A$PbRN$nR zq|f~sKsv8c{XsF+1Sht*lPrJ%PFmC~;}_6N*Rd!U6BJ=q2?M9!1H=?(!~p6Rn!9f| zruE0)!WTrr?!D9TL`SmZR{w%4Fw5Xn05J@E{C@&JvKyLjbDIVsHvFH$2RV@DH5u>B z_V*%hOq!&4#3?m56c07nipvd~?SJLghPfaiU@}2vv2rpWE|CcxO&TK$e6mcDW0`p*L zqaxWz4QF{tk>}v4^Sk0akPk>VN{R4$prDAqe3ib)~$uLIoQVRAM4ET9vOT8WVv0cfcX) zF;1R&8!X0Ncq}?UE{e?2b`pzP7A#5t#Azu(dGp@t?Xy#8H6Okc^sO_3fDydfCXPXJ zn~q_2lQsFgInG~2baUa?1z6?)nL{*pk&S=VjAZ3N$_hYMX{mP!Ccw`D(o@BsHpF#> zpvcBs%)rI~IrAQvPY+1{4*XZa^xsh}p5k`j>q#>}K~an4TK=35z}_h!t*{6rtF}NB zLsmZ*KhGMtt4>K)*8_)~mW#?E`K*v7k{`kXE`}M&e?ruVjCAcN*Dgj zHs@?k$mCpSs#(HRGT8ciKil(*w&uH-soO@Kj2UTXk&SJfx%T+Kxfa?Fn6tM0=HeWQ z=TG+dQ+tRav$BP>6P$zsFB9R!V+={ZOZy$aM0R*|`1mX zxD&((WpmJ^-JRzLOd`#2UAD%20uBk!ZZExh%}z$cccGzWe^o}PDNq%BRr z0kXt~ds|R@dmI&L9#g>IO=T5URz2vjEmJ(TN;n8r%TS0wS%XU0j}WFzs8r9S<+VWM zHtoVkNOEz*KMT{KP*>Tw#q(oSVEzOSNF*;&Xx|~Uu4~3u5!pL7@)>_=C=jOxwdf(P@EJaSBa?62J=d^xdD7$RdhB%UnQ=fShE#j%mTIMidwK;wLcse+6n(~ zWW)hza{kGgz-XkpBb4(EnX39^4@~t*I6lZmOlH8MGHb`B!Vj!h{D{OxH=-uE1|3G* zR=|910S+EJ=kV{q~ zw=b~R268hL_wG7FUjGLyTuN2x^MQugkz;Um0h;1l1H1&GYOX|uRtKXUgG+3>SKR;v WR9t%5Da%6uc1yIV2c{1J=Klez4gz5S literal 11704 zcmY*-Ra_KKxHh5EA&nqiqI83>NJ&Ubr*wDMf`k%M64Koz-7Fy?Atj+SNJ%aoyF17K zIlu4Xo2$8-cjkTGCx$*28|{A==3$PB_E|@3Z=R#nL*LcImz~bZJ$_giF}NdHxaWEM z#Y(u5T3@+bbH&z>#atiX<4V!E=XrKyPbUuvHyyM#G|W^R9)BT(8o^H(SWr_ePJjGh z>CD#)^>QSIOk~JZp%>jKn&=lHA>S3#taT!(p2JwEnF+wC@@vOFcK%O2-op1|Y-zGx z2?s|@0QR<2`$LXxL0r4@-lN{MA81<6k3LRNO?@3=tgqv)NI~{5P7$hE!xd z<3=O?AY$_?NS#3W?v!2frsh3%97Y-SOi>lI4Qmbc-Y|u)xoeE6!F4kR%ys=f8++i^;#Wz+i~CXII-;~Mhfk|eAvKh-A@gLqBAu&& zEsisj#f{e!w}R_745(jT!`<+|{4mZ-#fym+6-><0At9)h^thYlNGRg8z)j{llOtI3Md_@5ZOQa}Q;^&mrjH4vgS1KlrE^e+WwN9h@ zi-RA8puUt&5!Ublb)%ox06K>7Zn-QTVp-6Uf79J8xh8D0V_Qneo+s`ahMqLR>8C-} z5}f{p@%t1&`tJ=CDvEy>F6@#tpudm#`an?&t&t4xH`&-nXe4Mw!Q9l55I)@UW8v-( zFHK&!aBgcA6=Kc*tj5oj6%U*1v!3j{e&&{LimXHoaa{CJEZt7A$Q`K>UWdsqR(y4T z_}fBHc=b{Z08?7_9!1DH=HVG+^ObY}LO%!8VcrZcA*ygAo`JGNav--6^@B=-bsTMm z?15J*@dlwC34cDD3Nh%tq1UT)!ah>kwt2@*aZ3@bYuI4iCZ90a5)_%${akMn>!~iT zN8O8F!!QUH!27%MG3W;&Ax3q=jX$w@)qE9$bWlyh0rJBKbTxA#pWD2T!kGo69SD62 za~?252&fAG4-4PO$iH_Ge*F;v)U65eRli`4X;?i}p;%bdy8--rcOE1ZPM3X9<5SkW z=DZ}|54J6J+XM2*eI_$FZ5^~OrEYum`IJazK>j@uC>4mSSZYUbM$MN+` zGjgYT#jl;*HT;FD|C)KKP4XDO5pB$ajqyt764| z3^^pMJn0OIt8~*^!NNzQ0Ear^{1qbC&-{j#!s=o!Ytt`CKMF0>&$Fx|SYhLayu3T# z4fGJ%_flz>&Y6u|)m3J_)eIL}A~Nc85?9$oI+l!A-!IQpGSF1G2y3o1zL6uhtx`}` zr1F4RG@a`CT!`FvGCPgVwR@&X9h@rr+?;%1eitbBYA-Hc5Myx?)-?!Y+Ym%SNem`{ zQA~-VKDx1m@dY5pl=-HJX7pu`zaX=6*76LZzesu9W#sZQjXFmM!GuO6``d(!d+B=1 zupK*#x#ag=M~QtupeYIB!_cc4b#D2}iA+QhQlVevr7?h)j{vEuD*j#{~~?QVlK;cv(Sc%%}Se%1rf>J(Q3X;#j=Zy3dhlh4<;klYjc@205f7Es5ze-0^2nmdO^Su@7& zNzYr8Geq)Bf5iReBek`Dcy>% zdIJ{GI@FxZEyE2proC8_EYA{7*sV;UD0LK?U9MJ#R!JtCdpKN zEoKz9mUStEiskShnDDx6nN+agllfp1zROofoKVMng*wl%lU%yy+i$g|S9Zu>^gY{9 z%KL;ZRK*E2^zif~KB4_WB#q}9@T+YB_T&htfp&D?Tih42B!~mW8_-e`#vy{WElj4c zUJi%3s}s@D-QVt~dK+a7#MXc2@xkgY+i5TxO;`Bo0QqumoJ=UMtE0yi+4)({SB*#8M$Hw=J}0=DAf`{z&%ot9h5M-1D5tRWN3ifvMnnw!f$ zMtD9YHljQZWpl4Cf5iXA{SB&n*JzyOp$=BU_G@j|b}nzjQB?wh4(347jwc-pl+y0_ zko0eWq-41sO$km%lPHBe&p14#zZeejGsZH90@x9-OpyYiGEw0RLBpWWrDj6<$v*o}uMdTFC25E6!;ZX^O&#EH}4_gm1vE(o5dAWuOT;i*EA zZu+S5ouahg{S)5&T66`*D8+6#XU{J;An&r-&{+>&`&(B{aU8N?_=wQuc)!1iP zw>4xUs(l7IAlXIGCZL*j*E2oYY+_dpiKY3y^^Q;X@4QF9UX|ms0;Km$c3#gRc;Y_+ z#y8F*pgech>L%ALx6u5SBjBj~1VBEqAV@1YsbUHsy4HO#+8R*w9-8VvX3!Due1wVm zjJoo~B(|UJ!NM?sya6so4JwH#u`z46TTY^)E&PBb)|6F=Me{F9hWQyE4J73QDFND|3y}1 zZ!*Cge}3@@{Wg#w0RpY(hnUd9MTKU5bnk`Nuk6>QgmOa}KkZRrTCC~v>{5mV4!|^~ z(tBXP-edsM+XxU!ns=r8dUipzfdbt*Afp&FP=ac}7jM4s6|2YJGQUBNnG7TjWw9S@BUXoW25~GCJ zXc|!6C|H2MW>t7!&dk>@-l+pQA37YGFYxYX0?y8JvJB7rgAVhV4t0HQ)XBV-&{#^c zydd!lqzdo&Rk5&K|B#|&)!sA90m5j|=M3lvE|5g*NjfNXBQ2qCIt<5Q_=z=!yT9)LEQZFBqV?&FPKqHP6W*Fa* zW{+{!>=#N6Vg-}wTOc!Ndi-|B`7-{h)Zx|B6wUU(qay9|i5IVfesOQd)+`Ss?{%vp zpe1>Zm~QoVUlah0Den{%!J#Qv;6LXO{(3A}herPk4lvVu{579@89i2OgnFQX6|@6r zC_2^L80##Z?<3}uo_(5B9IpIWigxbI5+&6iTzKOz9t`ZBHkkdQ3Kf9^(Jk%*ub06P zRNj*?U)BxiV-Fs;p<&f~B-8!P@ZYQZwR|@;EtEQA;Mcd@CwW%wIaMp_Ro!7di84-l z4!*N}R=Rarld(&D?&%&qT28jY$V`l4Zf!g{Rmn2Ww%Kk&0 z!%#wSSm5}c@P0R=_ZrS4dyxi}f6p6?`X^xQ>XZj|?JZ<2uOzABvVYS`?KR#OYu8JM z;Dj33rv=Qv*VAJ>dykrmAok*~4R^8T!Cb&59ZkWm22irN<&{qUyh&(x|-Mj;F zmh>?C(eq^b7a2?TmQPo_9p_?8SM-%5-4=yha_e4H+aln`7c|W5#@;Cq3 zub}eCqQJ3V!_T(eAlmwgjX1C#go<7bVsmC(Hx4=Z|GtJkTRMkQmB7L5$lqIN&hyHs zXQ2*FsMn47=59t0Jp@Sy$Q;V=`fed>c|b+DsNlMXJ?#9b{_1U@ACp@8&xxVP$ICu$ z{>E(?7g@v;f=4|;bK@p)$7Yf^WEDQ)UN z%A46(68D=XS-yuXYr>pkb`*UA{Hwr2{jeid2O(tK(poT%l zv#Z@gRTOjC9nm6==noKrv}IcXs&XSus-o2AwntNq;qRg_*r`Yl7xiycVXwR_1H;^YX-+M~*> znw0Z2>bvk8oMrVsKKE1x?R#7(=*u&Sc{mbgf*RO|J^`s8(-3QI!gpKH8ZW%{ltt5twg=*uCKwZAaIm1=Vvvq+d+lSR)S z^J@Y??EcW&MD-f{kaf)gx22hhVA2J}9;UntzT24yX^IFeHrE$AcD&C{K?zJd9)MXn z)Ufz5Xru(g15GGTCS^<1q!Io0d1HkoqVe$fj^5)L!eT}1t_N4S78ml7a zHv#-axv*W1+(I%XDQnd0t&XhLxu6=OYuXxbGkVb=|HU>KtQ{veQ+F#@CPutF*iAx| zhSi@Cx*lJol`Wd~Cv$=-*At#x=q6!uZVUXu#T`f9n(EW7ymvlZP+8RM4UlW92KcP; zg}ej|X^W@y)o2;AREi`sUq|>jzx{;`L*;5Z3tQ}&&j}p%Q+`j*yso(w@%BQjErAae zz*Q#ZR?jcD%r6x)k(3(ES{VadlgV6^g;$V;U9j#a6xjo(*X!tlCqCbv{ydV|eim9V zijKyRznEN28CRjmcdNy1tDb(Dt9of6pk?2#88$bz@CLV0_?dnELhFSlA2dsR6x0Is z5lDJ1Af5I=q+5|k383|!;yy}z%$WFA4NWoMN_oRtE>9RpjBS6NPnvi*gQ>pXsMvRY zTd3!xiu|>5s&o|W_-xA^({IHOMSnFKyTC+l#)szQfVNsB1h!6H?_N>&CY(Riq?eyPfI+QNXQJL*P zWb#>SMP#s`Uxyw=CQ!a}j76tnnEjNC?%L8p48wm^l!IsKxcgqFZMDbZxaseeFEvFFm_MCpy7_bH4@(g|44iuTy*{}V^Fp2 z#a-^*G2!1LGYJnrds{xXjYrve+;H{z6RqHoCi=Aw=+M`dapziNR02g9M=jw(!D_3- zlD%UMY@)??XZ#_13QO15+AGn44mC$qpc|Mbo{FpLA={~!yv!8%eELQeBFQvqmkBL(?{&mT8)7rWPQ%vbj(3B>1`|%O*TWHJ#4K5}1WGnj=^Bts zFCidrYzlK~*6azrXjCVypL|l&BylSlQK#W5;Qc}tz@J_W?`H0A2sq3a_Zx|Zk4HE5vL$Af49>`+$A|1(bdnWPB>g?W5imm z(adT1Nz~DMv(jR0N6|W@wdC(#^V>sN#)lED7yV*N*jyP#_%A0>0p2D4SCm4^pY8@d z?ld)(uN}5L+x1{_I?weW`+si|n))ei2s1Lj4VqmJj@1wERF!T!uhhR7+F9bfbyS$Q zj)}{S!4MICVL^pm60>bhdC(dA0w9<`h9K9xQ0X66 zTfm#<UON0LxBjzI`$CVh8R4_@tnaPzNiJr@m`}Iyj{PxTsvUG7 zg}fMcWC<2#Ruf(ackNLD;(i?@k8mZa0^UChlNq;pPLFMEI3rznNulc-QF z(bO&d>ZrBpz)7f#5s4l=o>GEAR(vk$Jm1yR;Y*pyQ0RG2!DcYSozC(e-*z?+`I)uo z2_Dza9@n*zqRzdScCftKgb!!abJn!6zW$FF7!#zzoo|A3-kfYU{-`q|2x4tD?x}vY zMOu>A^X&*7HEbuh1MlF+RkM5$e>Um71Km(UVR01iLZUf#%&Z<75-w~=&*$Ukk7zS= zMWFFbD29_H@PZ^nr%uMkNfvq)`Oy!%-}&O|QR!WB{>x@y%q4X2r=ZkPho57 z3kvzPJx%=R88>O+Y3t2CKZbF;hG4F_KQL&w^U8c~%AN^NfaH%BDC<-TzF2)}oH$$t z_E>5BUsw(|ISh2NN)+(dXRd$7X8Z#5#_udV*~IBiJ#`knBJ#&1=d**HQN{Vc6uB!9 zb{{}aNWdaSwTrj~rq7Z%)^oQ|=u-XWQL{D|T6_X<%YquN{~L7X$AbuMe&!0nI&{r} zC!zS0=t^^B49qx<8?8(l$)`yOy>bOqhtRZ&2A2W3oov+reuYgvDaT*u#9%wi3jE4U zF6ARiRO|hICc-etp8#fSEyx~}&G>!Xv=vRFCI|Cg?!(Qsb%RbG14shC#vluK7b5~H z{Lkjd@d1ptLYiSDQ+`5!^0YY^7!}ZQiNsX@$Sdner9cO260Gnt2VC=48)Hh0YZkeD za0k@FdPx8JK*kcn*u|6wMqN%}bLwU{2|O@IEc4E2&t;68@@$@ebPW~VskfJpEuq$3JOZ5l{ zdF3v&z!`Yi&WAfBJ4=hf+FB132WOqn{CQIf8i-v;`jn26`aXR+=wm~JW1cP9u4t=B)Bs4)(aNg2Yfd?YHz zjAkGgb{g}@PDt=a*P9B(0AIxQ^{J~`4we%4-q2=%xXqt;Iv#&*7+uY5A70*dNIDT_ zswUJ4zUo2tgAj-bO{nq3OwYp+2KoA+*}z#6TD$9Ap@&#E*At|ZXz_KR-2@fsh0Kdf zLqTGyEi(1O-m^ZICQK@V&|%V^MUbJ#Vjz*b;A9VSoML`rhbvJ?7VDq!j$I-D%WrK*)sYCqmCF5Zj z(IZY%-j85jwx+YzMeB5@pGI`?slEc)pTqU&Itjlx)yboYM9aT6z%hz~Dyh)NY$)DR zY$Fz*75>w9NG7i+4e_~rMtv)<#CHp3prD9^{;wn|JFo5Y4;sd9a^`4h&U~>blX^y$ zp&1c0?9&Bi^zSTmVuscdeF_7bnH1{uTanhAH3uR+mcMTPW}WPf zGQ?l_Y&H+*%6!zpz8I3&iopNYRXiQFRzVIrN`s$(rmrF>fqevox_bh$@@j`_1%D@J zwduuGTk>vYsR-FvIcIa7YiICi`6-!^r^I&bUbQpbwkNL_X{RJ6v(S^PjLQG1Y-7XBX$g6^j_O&X)SlZ;Zb7ie1JQe7f(BPQc%M`}uJj*&6J9%MHlK>D5GKbR!b%Q3(-V zETHJb%S98%tO)0ANqo(~kX70Q(SBv!c74s4Yt%aYopB}a>HD|%wEG*CU3H~JbxZ_p<`sMS`hmowDiH)a<8cxa=*W9X%$ zwfl0^RBq{JqY$c0xQ^A4=`w^QZ>qeF@!C4S0&U$0Xk6mZzg*LL>zjL*yH4bwSjA^U zuM@ELyZJr+a$jP)O3cemJo zLQBe5E+Lb}sQ-#Gm8xBy6DniC9?Wurs*xXbt=dO7mWsT%QQ!17trYJm@ix5PYzbVa z>U3%P?0ZX;oGe<@Nj>OG>lC0MUD^JQz46yJ|I=)DtTfkhYHC|WaqqLAIIgHdq$QRp!_o56IhL4D& zu|Lx4hV`3AzI$7KTJ1G@=eoUmDP7DZLf>@YcBM#ue`G4(UHe8Mwt=IK=$vu1BCRh z^wMUYl`AUl&K0A13{pJvUjmE+@|h9!FEEwl$U-?;F<4?)NTfF(C|iiWi7orHCV%zm z$II>5`5dyJCx+c>;5aFxWllWLm9zCHbCq>Cg;pa`Jq-F&K<~o#JL$@$MLOc?sfZcA z!F8epQx6vN^`R1^S`{TUhMVq|#|w6^hM>7>yCB*w17KF@Z|kFLBok}ZDGL%CSuYWOn8`drpDP68ASTGYZEs-WZi@uXFSK$ z_?YJ$z8058ZPTVe_1cHA1ZDF3PhRzi6f^3>_Ae6@^_Sy+=-IyEQAsYw<|L-hj0160 zKOXoIjBrK~KkHIZ`X{GQBH&#bwpd`ZA{o!|$(eBX+9WqET%r5aFDLbAP`k%;F0Xf_ z>Dx!>jDU#N{a>3QIqh!xupWua1pF|X^a!<2y?oAR>S}I~5>(??O7L3iec3;W`vNsh z5tFMR%inXGBVxrxkA6(eFqPbo7gsr*D9H*I+WEgo&BV%MN-pc#Y35kbbZ47Y6An6U zg#6CLTVO3>r%3gGiFz&RX^mz${n>f1hydL~?+pTK`(k3irp*O=SBP3nUxB48&0Jjt z<$Ne7P&T;;$|@uQ{fK7;Fk=eH($3H{UZBP(693V1-2bardQ7#+xBx8Xvx#|2o#5M$ zeoLvPKX6A5x7~R{sqY~Q=Zksi9oS2^PbdRgo~rcKcE<1S^LPc`%E{I)gp;xOx-78A z9nd5jPU-=~St|^BxwG2ne3f_KarLqZzIH#kLF7l*G1*}u*(q>jAW%A~Yz9r!^eci_ zKN%9p-Ln1j8-`j)RpaE_Y`3^!`E=T`QT6rR0-lTnoc4A=9yVPEx;mIziMseQf)H1E zw+^+JZ#$#85vZjzv$&sY&~vZJUf72`h<1IKTk2*OSX)ivVt09PKCV}O)}S91()(Lwv|@_CVpzdG zcABZfmD?SD#zVt;y6|B=Jqw4)C5hub=~&-o$>~=G0$SILjfcz=F5cq(T)MqBe#BvQHA^qKqE0eH-dq*tiByxAh+frAh$ zV4!=0I$=2NLc!cav?X#XsvnRZFh1)lkLLt zjHbw3vg7km;@{!h#NK(IWJj%zLppJuDEoZPcpPrDGJyUW+Exq|xaT1O-p^5(*FY5i zB@dX`R+X&u#){g|pBOu6Ogf_D={#}|(yJ}16%c@MR^dIF_pO*KtYB`Y1=(7i){dZmkedzy7HLQHX659MwpPQ_ zE^H>?$WcD0tu2!h>St8~ssF1JU zNu$Hcn2po*sEz0Er&3?ac#C2-?8Hm7UnC{H5jVFh0}k+;Nz8~t4h4>Q_{>3bJetoK zC_=)twy(^v!k%6WYBx>kT;8?aD?PDqJ*wg;e<XpKURy)z%~bds&=meJb|IYNCl zg8iMOe=&F9t#Ksy_d;GtgwyOU=f{!ziOSnv2~^UF*qGO2XDnu)c|ESa;r^>P&}m{8 z4Q#8q9GlrX!Mx!RF&5%msLsh`&RHGj+z}EgpZb68f$F&^Eto*LbvkSt{{;AjR6rDw zy)PxzZHT;Wn;Zsn+9fkG*tZb3^ntQr40tBJ^sIN1{0#V3pKqO~_z9cmt@QG~4IlWD zpwBcF^-iZTWfO&vH|gIzC9I(NLwdF0w)=}1Mf_d$oD|}3#vnFSL%Hr z=N`8I`>G7Ps$8Z)z6;XqPO_I!I1BD_$XyYOmz-o%(j|GE8vd|wsh^1|k5eD7d~de^ z!W<_$(-t?3qOafRt7YGn+da0fcr0y?w-6G!HbT;d z#~XBCBFYwpy`d$~FHMtT_L)%IG?bb$h%JovW z7@6!tA4Wy^>(1~!!=-c|dXhhF8+8ZVs9l4wPh{^fe6$jI;JJt|`NMPJzkb+E?3>rp z5PfF|)y4Qw+ty9|IAtCKSwbn(bP$2T!d_F2zSUiO&-!NPmU+Ce0J4z%IQC`FgkxMO zTMS%_<2MXpusb3xc`J9|g%>C|yMLlt)+u}o< z+rB89F|h+%0!vj+Todz0ftG2-26mr482O2B*6ew;&6SxKEfRM{g_f9|I`}pmJMzrE zzHA7{z@Xz|Cpb%*UQS+o0>PMld&TEFR?J(k%R|SxaLGir$uoT3l%)JN{`?_&M}0hf zZ80(>0QzAeDyyo5y;NnC!d?QftCY6>bc&^QBB6txz3j4)rqN^r>y#M>A9T~LnG9h`g?A5`ere3!I_vRZi z!j2V&Y66~egzMRkA(m6A%YGRD0wxaz6L56`1b^HG| SA5Ov`=-3}T{L$Lb(f$WqZUfT*