From 14c8073e2697fb52ce2aa724bcd1179cabc08bee Mon Sep 17 00:00:00 2001 From: Eliot Berriot Date: Sat, 2 Jun 2018 09:17:32 +0200 Subject: [PATCH 1/2] Ensure we can serve images securely locally --- .env.dev | 1 + api/config/settings/common.py | 3 +++ api/config/settings/production.py | 4 ---- docker/nginx/entrypoint.sh | 1 + 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/.env.dev b/.env.dev index e117dbe56..7037b1dbd 100644 --- a/.env.dev +++ b/.env.dev @@ -11,3 +11,4 @@ WEBPACK_DEVSERVER_PORT=8080 MUSIC_DIRECTORY_PATH=/music BROWSABLE_API_ENABLED=True CACHEOPS_ENABLED=False +FORWARDED_PROTO=http diff --git a/api/config/settings/common.py b/api/config/settings/common.py index 50c62e9d5..6ab2a8303 100644 --- a/api/config/settings/common.py +++ b/api/config/settings/common.py @@ -303,6 +303,9 @@ ROOT_URLCONF = 'config.urls' WSGI_APPLICATION = 'config.wsgi.application' ASGI_APPLICATION = "config.routing.application" +# This ensures that Django will be able to detect a secure connection +SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') + # AUTHENTICATION CONFIGURATION # ------------------------------------------------------------------------------ AUTHENTICATION_BACKENDS = ( diff --git a/api/config/settings/production.py b/api/config/settings/production.py index 2866e9103..39be40dc3 100644 --- a/api/config/settings/production.py +++ b/api/config/settings/production.py @@ -22,10 +22,6 @@ from .common import * # noqa # Raises ImproperlyConfigured exception if DJANGO_SECRET_KEY not in os.environ SECRET_KEY = env("DJANGO_SECRET_KEY") -# This ensures that Django will be able to detect a secure connection -# properly on Heroku. -SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') - # django-secure # ------------------------------------------------------------------------------ # INSTALLED_APPS += ("djangosecure", ) diff --git a/docker/nginx/entrypoint.sh b/docker/nginx/entrypoint.sh index 14e072a7e..ea6a3322d 100755 --- a/docker/nginx/entrypoint.sh +++ b/docker/nginx/entrypoint.sh @@ -12,6 +12,7 @@ cp /etc/nginx/funkwhale_proxy.conf{.template,} sed -i "s/X-Forwarded-Host \$host:\$server_port/X-Forwarded-Host ${FUNKWHALE_HOSTNAME}:${FORWARDED_PORT}/" /etc/nginx/funkwhale_proxy.conf sed -i "s/proxy_set_header Host \$host/proxy_set_header Host ${FUNKWHALE_HOSTNAME}/" /etc/nginx/funkwhale_proxy.conf sed -i "s/proxy_set_header X-Forwarded-Port \$server_port/proxy_set_header X-Forwarded-Port ${FORWARDED_PORT}/" /etc/nginx/funkwhale_proxy.conf +sed -i "s/proxy_set_header X-Forwarded-Proto \$scheme/proxy_set_header X-Forwarded-Proto ${FORWARDED_PROTO}/" /etc/nginx/funkwhale_proxy.conf cat /etc/nginx/funkwhale_proxy.conf nginx -g "daemon off;" From 290cae9a8f6790d8d412b36965ad73ac3ec8139e Mon Sep 17 00:00:00 2001 From: Eliot Berriot Date: Sat, 2 Jun 2018 09:21:55 +0200 Subject: [PATCH 2/2] Fix #231 and #219: ensure we import covers regarless of the import method Can now import covers from track metadata and track directory as well --- api/config/settings/local.py | 1 + api/funkwhale_api/music/metadata.py | 113 ++++++++++++++++----------- api/funkwhale_api/music/models.py | 25 +++++- api/funkwhale_api/music/tasks.py | 114 ++++++++++++++++++++++++++-- api/tests/music/cover.jpg | Bin 0 -> 107 bytes api/tests/music/cover.png | Bin 0 -> 379 bytes api/tests/music/sample.flac | Bin 9793 -> 91522 bytes api/tests/music/test_metadata.py | 14 ++++ api/tests/music/test_models.py | 8 ++ api/tests/music/test_tasks.py | 71 +++++++++++++++++ changes/changelog.d/219.enhancement | 1 + changes/changelog.d/231.bugfix | 50 ++++++++++++ docs/importing-music.rst | 9 +++ 13 files changed, 353 insertions(+), 53 deletions(-) create mode 100644 api/tests/music/cover.jpg create mode 100644 api/tests/music/cover.png create mode 100644 changes/changelog.d/219.enhancement create mode 100644 changes/changelog.d/231.bugfix diff --git a/api/config/settings/local.py b/api/config/settings/local.py index 592600629..df14945cc 100644 --- a/api/config/settings/local.py +++ b/api/config/settings/local.py @@ -76,3 +76,4 @@ LOGGING = { }, }, } +CSRF_TRUSTED_ORIGINS = [o for o in ALLOWED_HOSTS] diff --git a/api/funkwhale_api/music/metadata.py b/api/funkwhale_api/music/metadata.py index 522c64c85..3637b1c8c 100644 --- a/api/funkwhale_api/music/metadata.py +++ b/api/funkwhale_api/music/metadata.py @@ -9,7 +9,13 @@ class TagNotFound(KeyError): pass +class UnsupportedTag(KeyError): + pass + + def get_id3_tag(f, k): + if k == 'pictures': + return f.tags.getall('APIC') # First we try to grab the standard key try: return f.tags[k].text[0] @@ -28,13 +34,39 @@ def get_id3_tag(f, k): raise TagNotFound(k) +def clean_id3_pictures(apic): + pictures = [] + for p in list(apic): + pictures.append({ + 'mimetype': p.mime, + 'content': p.data, + 'description': p.desc, + 'type': p.type.real, + }) + return pictures + + def get_flac_tag(f, k): + if k == 'pictures': + return f.pictures try: return f.get(k, [])[0] except (KeyError, IndexError): raise TagNotFound(k) +def clean_flac_pictures(apic): + pictures = [] + for p in list(apic): + pictures.append({ + 'mimetype': p.mime, + 'content': p.data, + 'description': p.desc, + 'type': p.type.real, + }) + return pictures + + def get_mp3_recording_id(f, k): try: return [ @@ -73,25 +105,15 @@ CONF = { 'field': 'TRACKNUMBER', 'to_application': convert_track_number }, - 'title': { - 'field': 'title' - }, - 'artist': { - 'field': 'artist' - }, - 'album': { - 'field': 'album' - }, + 'title': {}, + 'artist': {}, + 'album': {}, 'date': { 'field': 'date', 'to_application': lambda v: arrow.get(v).date() }, - 'musicbrainz_albumid': { - 'field': 'musicbrainz_albumid' - }, - 'musicbrainz_artistid': { - 'field': 'musicbrainz_artistid' - }, + 'musicbrainz_albumid': {}, + 'musicbrainz_artistid': {}, 'musicbrainz_recordingid': { 'field': 'musicbrainz_trackid' }, @@ -104,15 +126,9 @@ CONF = { 'field': 'TRACKNUMBER', 'to_application': convert_track_number }, - 'title': { - 'field': 'title' - }, - 'artist': { - 'field': 'artist' - }, - 'album': { - 'field': 'album' - }, + 'title': {}, + 'artist': {}, + 'album': {}, 'date': { 'field': 'date', 'to_application': lambda v: arrow.get(v).date() @@ -130,6 +146,7 @@ CONF = { }, 'MP3': { 'getter': get_id3_tag, + 'clean_pictures': clean_id3_pictures, 'fields': { 'track_number': { 'field': 'TRCK', @@ -158,40 +175,31 @@ CONF = { 'field': 'UFID', 'getter': get_mp3_recording_id, }, + 'pictures': {}, } }, 'FLAC': { 'getter': get_flac_tag, + 'clean_pictures': clean_flac_pictures, 'fields': { 'track_number': { 'field': 'tracknumber', 'to_application': convert_track_number }, - 'title': { - 'field': 'title' - }, - 'artist': { - 'field': 'artist' - }, - 'album': { - 'field': 'album' - }, + 'title': {}, + 'artist': {}, + 'album': {}, 'date': { 'field': 'date', 'to_application': lambda v: arrow.get(str(v)).date() }, - 'musicbrainz_albumid': { - 'field': 'musicbrainz_albumid' - }, - 'musicbrainz_artistid': { - 'field': 'musicbrainz_artistid' - }, + 'musicbrainz_albumid': {}, + 'musicbrainz_artistid': {}, 'musicbrainz_recordingid': { 'field': 'musicbrainz_trackid' }, - 'test': { - 'field': 'test' - }, + 'test': {}, + 'pictures': {}, } }, } @@ -213,8 +221,12 @@ class Metadata(object): return f.__class__.__name__ def get(self, key, default=NODEFAULT): - field_conf = self._conf['fields'][key] - real_key = field_conf['field'] + try: + field_conf = self._conf['fields'][key] + except KeyError: + raise UnsupportedTag( + '{} is not supported for this file format'.format(key)) + real_key = field_conf.get('field', key) try: getter = field_conf.get('getter', self._conf['getter']) v = getter(self._file, real_key) @@ -230,3 +242,16 @@ class Metadata(object): if field: v = field.to_python(v) return v + + def get_picture(self, picture_type='cover_front'): + ptype = getattr(mutagen.id3.PictureType, picture_type.upper()) + try: + pictures = self.get('pictures') + except (UnsupportedTag, TagNotFound): + return + + cleaner = self._conf.get('clean_pictures', lambda v: v) + pictures = cleaner(pictures) + for p in pictures: + if p['type'] == ptype: + return p diff --git a/api/funkwhale_api/music/models.py b/api/funkwhale_api/music/models.py index 51ece7d7b..0ba4d22c3 100644 --- a/api/funkwhale_api/music/models.py +++ b/api/funkwhale_api/music/models.py @@ -23,6 +23,7 @@ from funkwhale_api import downloader from funkwhale_api import musicbrainz from funkwhale_api.federation import utils as federation_utils from . import importers +from . import metadata from . import utils @@ -192,10 +193,20 @@ class Album(APIModelMixin): } objects = AlbumQuerySet.as_manager() - def get_image(self): - image_data = musicbrainz.api.images.get_front(str(self.mbid)) - f = ContentFile(image_data) - self.cover.save('{0}.jpg'.format(self.mbid), f) + def get_image(self, data=None): + if data: + f = ContentFile(data['content']) + extensions = { + 'image/jpeg': 'jpg', + 'image/png': 'png', + 'image/gif': 'gif', + } + extension = extensions.get(data['mimetype'], 'jpg') + self.cover.save('{}.{}'.format(self.uuid, extension), f) + else: + image_data = musicbrainz.api.images.get_front(str(self.mbid)) + f = ContentFile(image_data) + self.cover.save('{0}.jpg'.format(self.mbid), f) return self.cover.file def __str__(self): @@ -522,6 +533,12 @@ class TrackFile(models.Model): self.mimetype = utils.guess_mimetype(self.audio_file) return super().save(**kwargs) + def get_metadata(self): + audio_file = self.get_audio_file() + if not audio_file: + return + return metadata.Metadata(audio_file) + IMPORT_STATUS_CHOICES = ( ('pending', 'Pending'), diff --git a/api/funkwhale_api/music/tasks.py b/api/funkwhale_api/music/tasks.py index 993456c27..218e374e8 100644 --- a/api/funkwhale_api/music/tasks.py +++ b/api/funkwhale_api/music/tasks.py @@ -1,7 +1,10 @@ +import logging import os from django.core.files.base import ContentFile +from musicbrainzngs import ResponseError + from funkwhale_api.common import preferences from funkwhale_api.federation import activity from funkwhale_api.federation import actors @@ -16,6 +19,8 @@ from . import models from . import lyrics as lyrics_utils from . import utils as music_utils +logger = logging.getLogger(__name__) + @celery.app.task(name='acoustid.set_on_track_file') @celery.require_instance(models.TrackFile, 'track_file') @@ -74,6 +79,7 @@ def import_track_from_remote(library_track): def _do_import(import_job, replace=False, use_acoustid=False): + logger.info('[Import Job %s] starting job', import_job.pk) from_file = bool(import_job.audio_file) mbid = import_job.mbid acoustid_track_id = None @@ -91,15 +97,32 @@ def _do_import(import_job, replace=False, use_acoustid=False): mbid = match['recordings'][0]['id'] acoustid_track_id = match['id'] if mbid: + logger.info( + '[Import Job %s] importing track from musicbrainz recording %s', + import_job.pk, + str(mbid)) track, _ = models.Track.get_or_create_from_api(mbid=mbid) elif import_job.audio_file: + logger.info( + '[Import Job %s] importing track from uploaded track data at %s', + import_job.pk, + import_job.audio_file.path) track = audiofile_tasks.import_track_data_from_path( import_job.audio_file.path) elif import_job.library_track: + logger.info( + '[Import Job %s] importing track from federated library track %s', + import_job.pk, + import_job.library_track.pk) track = import_track_from_remote(import_job.library_track) elif import_job.source.startswith('file://'): + tf_path = import_job.source.replace('file://', '', 1) + logger.info( + '[Import Job %s] importing track from local track data at %s', + import_job.pk, + tf_path) track = audiofile_tasks.import_track_data_from_path( - import_job.source.replace('file://', '', 1)) + tf_path) else: raise ValueError( 'Not enough data to process import, ' @@ -107,8 +130,13 @@ def _do_import(import_job, replace=False, use_acoustid=False): track_file = None if replace: + logger.info( + '[Import Job %s] replacing existing audio file', import_job.pk) track_file = track.files.first() elif track.files.count() > 0: + logger.info( + '[Import Job %s] skipping, we already have a file for this track', + import_job.pk) if import_job.audio_file: import_job.audio_file.delete() import_job.status = 'skipped' @@ -132,6 +160,9 @@ def _do_import(import_job, replace=False, use_acoustid=False): pass elif not import_job.audio_file and not import_job.source.startswith('file://'): # not an implace import, and we have a source, so let's download it + logger.info( + '[Import Job %s] downloading audio file from remote', + import_job.pk) track_file.download_file() elif not import_job.audio_file and import_job.source.startswith('file://'): # in place import, we set mimetype from extension @@ -139,23 +170,96 @@ def _do_import(import_job, replace=False, use_acoustid=False): track_file.mimetype = music_utils.get_type_from_ext(ext) track_file.set_audio_data() track_file.save() + # if no cover is set on track album, we try to update it as well: + if not track.album.cover: + logger.info( + '[Import Job %s] retrieving album cover', + import_job.pk) + update_album_cover(track.album, track_file) import_job.status = 'finished' import_job.track_file = track_file if import_job.audio_file: # it's imported on the track, we don't need it anymore import_job.audio_file.delete() import_job.save() - + logger.info( + '[Import Job %s] job finished', + import_job.pk) return track_file +def update_album_cover(album, track_file, replace=False): + if album.cover and not replace: + return + + if track_file: + # maybe the file has a cover embedded? + try: + metadata = track_file.get_metadata() + except FileNotFoundError: + metadata = None + if metadata: + cover = metadata.get_picture('cover_front') + if cover: + # best case scenario, cover is embedded in the track + logger.info( + '[Album %s] Using cover embedded in file', + album.pk) + return album.get_image(data=cover) + if track_file.source and track_file.source.startswith('file://'): + # let's look for a cover in the same directory + path = os.path.dirname(track_file.source.replace('file://', '', 1)) + logger.info( + '[Album %s] scanning covers from %s', + album.pk, + path) + cover = get_cover_from_fs(path) + if cover: + return album.get_image(data=cover) + if not album.mbid: + return + try: + logger.info( + '[Album %s] Fetching cover from musicbrainz release %s', + album.pk, + str(album.mbid)) + return album.get_image() + except ResponseError as exc: + logger.warning( + '[Album %s] cannot fetch cover from musicbrainz: %s', + album.pk, + str(exc)) + + +IMAGE_TYPES = [ + ('jpg', 'image/jpeg'), + ('png', 'image/png'), +] + +def get_cover_from_fs(dir_path): + if os.path.exists(dir_path): + for e, m in IMAGE_TYPES: + cover_path = os.path.join(dir_path, 'cover.{}'.format(e)) + if not os.path.exists(cover_path): + logger.debug('Cover %s does not exists', cover_path) + continue + with open(cover_path, 'rb') as c: + logger.info('Found cover at %s', cover_path) + return { + 'mimetype': m, + 'content': c.read(), + } + + + @celery.app.task(name='ImportJob.run', bind=True) @celery.require_instance( models.ImportJob.objects.filter( status__in=['pending', 'errored']), 'import_job') def import_job_run(self, import_job, replace=False, use_acoustid=False): - def mark_errored(): + def mark_errored(exc): + logger.error('[Import Job %s] Error during import: %s', str(exc)) import_job.status = 'errored' import_job.save(update_fields=['status']) @@ -167,9 +271,9 @@ def import_job_run(self, import_job, replace=False, use_acoustid=False): try: self.retry(exc=exc, countdown=30, max_retries=3) except: - mark_errored() + mark_errored(exc) raise - mark_errored() + mark_errored(exc) raise diff --git a/api/tests/music/cover.jpg b/api/tests/music/cover.jpg new file mode 100644 index 0000000000000000000000000000000000000000..71911bf48766c7181518c1070911019fbb00b1fc GIT binary patch literal 107 zcmWm0!3~2z31GB5)nfsvnqF_+an6cl2fu6{1-oD!M< DR3TKT literal 0 HcmV?d00001 diff --git a/api/tests/music/sample.flac b/api/tests/music/sample.flac index 6eff1c06e43f6f536c2d810d0d059cc6af319f5e..fe3ec6e4a270da0ff0a3f1ca677da4990ddb0ea5 100644 GIT binary patch literal 91522 zcmbTd2V4_P_dmKJflwkHO(Z}hL69Z^g@oQokS0wK^Z`N-CR8VwKy0cj$FdgJq}?|bk6^SSqKc9YGVnK|cs=6hy$XJ&&P{H*{0 zP(}eL{tuhK?}`FP@lXAb))#`R>?24Ua`NRL?v*q^0KuC(_yPz2_~3&E+6VQuu{u~? zeu5nTuyS^EadxwDHF1v#iiktG1|>&C#z_AoaPf8}+7aAMbaixasEE)AC_mMj=w@YQ zf)(MPdfQmI{v-QS_n&Hr4i@f2XD1V#KlKJhkRk(vVod%;=^ufMtFyI-62JU!opBikugz` zG5&F(krCqmmD}Cb!s-w|yN)S8#nHo!Xl3bYL3BF$mxY6+hogn7J6}1`+9bdrI5<$( zKUnJk7RUbz2-4LG2n@t(>FNgK0uJExv3i0268svhE!=JXaiNyZLH_>7s6X~Nc{p0~ z9fbV{;~$OxSjyLG_HSDM6V^Xg@zv^KvBCI*I)Pev{J{fSdIy7pweUIzNLu=O`u@89 zI{GAC1N}d0E!>DsCYCxnSSwp+7sta&f0F*kem7@VcN3@3h#(X(f^-7q8I6W?S1YP1+%; zkrA=lkuf3r!$L_x5wStB`va1+B1l@X{`>W`b@rc%-H+p!|Gznwj}5CEaL^#|fWDSL z7O$&y0FMvS^2cL?wG0CN_4N(#I{sJ^b|=5=f4aoY-NN0&%_K57IFuCXA12S2{4a?A z4(|_ltStC!aJKtT-xK)fC|!d;0vjhjY@7cF!v2roe-ZYNr~X^u7)mqeU)5jU; zWB(B9PZazo>Hn1ekHGr(R{K9hgPp6hhYO!E2l05F0A0OcE&T&nT`j#JemLTBc#@X? z0h}H-_y9jrf(`ziZT}rfI>CCudU`=xxIi6})`1{>ycX`D9$t$S5NM!-4dh3)F78j4 z@gIi$pCaZzrT=dCe~0yd#kmmZ=q$f7F#iw@4fhWT+J7=CD1`q{#x^E0B2E)!85#L^ zSWp}ayB~XipZu>I=xF8dvELj((%zP63xGfX0OEgu-xGip02UDVv-39ye-{)M6ofzo zMWIk3VVEckCMGH-wnJQ6a)-E-xR{vaPDv>lSvfg5n8YslPFc9LteothNqn9f4@?=I-Hn#LN3ADKIEFi35iL` z>E|;tFI>EoMbEvOmw&CG@cOONvfFpcD=P2S*4001Xl!bJ+|k+fyqnd-?j0H)dHrT| z?Cto6kKE~*S>C75bIU8MYwO=OzHk2cg9`+J{{t5P`#+HV8!jn6E&&Jx41xZ^1rkW$ zA7Ckn;2x}yw8delf3%FUZmO`XC9R~UT?DP?`c*C<=9TD9%z+Oo%YUH#gY5quu(bbQ z$o?DH|KJ)2U|sL%&ldr^E+dPRQg!-VK%Z|xhY$I zK~p5i;lsrq7`C0O3LeFEhicu{uSTZrHxwu-q$T8i&QKi#Qv8Z6vY0D+a?i$H^qf02 z2F!yHJoU+_XbP!%7GxXb-kh~J&x@yWv3C(CNOiJvvRM0^PQEO5e@Vm=UbH_}=$-jA z7XhY-Z%a)aIFoN?sMTxS?45O<-J=Q!5T;YO3adkzEh!#!46L^{XI>3f1`CJ2Papo_ z0!ceae{(J$S|~&uKQi5hssIv}e(o?#NkY>j>#drt190Ee{wi3}F^OexO}5+zLt{ha z1t~-gwBT7?cS&p`)L3nM`AuPhX#I+A&5G7VcW>b!H|BQ?=ch^2bKnq+rt&b~_NJtf z`rUrq;YJiPt&{qmbMnz+yHl{tndxlbQ~*_j;bD?j@GOLxgXb1LZK{x4=mU>1Jv@r| zoPM)asTwa(-uRgMhOqtV)x?gbdqVQgenRGRiSUIbb1BVxC)<*+k2B`gm7b+GDe83- zSWXw-<*)^k9N-C~&ffWHxykx=fmAOC#;bD1ZJ!X3sdQ8(e9ia9$LIEo+LROgYVH z^FmSpzdr)vsM{RBm_+aakmK#TOpB*lUqF*3_N!?+F^TJ(XbNn-Vru9}A;Riz4a$zP zaF`4}g;t!Zn>*>X7^t`ZrmPxTH8D@3-zzY;okumZ4-DFy6kqABpj*^3up$xU3y2#^ z+6j>{KHp0pUnfXg9jL6A#VPuuG2&%P&K(Teqo#c4x(8iqqDF-T*t30LMhLhBtRVbJ zolxqH#9dBKvf4Oos&EYxQrYuuzydhqe&4zL{)sP*QWW99=37(FWgR9 zHxQ2E=`rGx<+0Qx9)m|Na(zv=9ss=W8 zm7@t@j}v(_pP*q9A9xjV2d~mYZwJvtyGr|lt`-%@Y+MDzL3rM%oF$afmTmZ=hHzzr zG^5cH4dLaoxnmv~MBn=1%tCukSARm7D-ps?UrA18c9Dgq*c!Jw=yK-8EI5isZjRTf*q3KcqSYM=GK8<; zv(bMQM%m&4nYPIO6pp}zq4RX1)^8vYpLyLLQ$rb=2-$Ph*7Cba7fH~(hhPP z(8`G8&<$gmC3p578oRSfQf0pz+6jYKLqpY*IEu{rwY?uSgSC%4zG$+g;ug;y-{zuX zoF4)Dp+ltU1G6{=@0v796U1ZWHYvt_9vdQR>JO#Im|l1h-rU3E=$LfOk~g`W4abxpOW)zvHL9u0<;vpqg`VrDR#d|rq;K3 zw~=pRlsNc2pX+hW;S1LE2_0{}45HUvhGb&<97uuqnc^0i=9nbe|1c;15Yr`{E%<|r zFeQ`94<4P}_c7Bt>kK=hOLjFuZ$CJX4Oi-`C>9AEqU{MS;1JRddZ!vW;fyYz$Yl%) z32l0%{yp@tz-A8lSHLbHyv>N*21Tw;9AH24)(*%n+p7Y(pNSX9Zu66C$E+jfhf2u4 z@bS&b9=&|8nwC9LAT$#WI$n&7C}f&J@kKA2(O|sdI#JPGr4U z^!?vi9}xjwd1dO5@ZCx}urrezEUV$v_Xj5SO$B7<)DLTBy6v8>3rU|dGfgrv8t9Wf za>Ui1t**@$SoDOesv_LFof{9^+^BC$543hf7J2|p14G z{FmZQTfO-r`@j|3h83R!$K8L0^q!ZvR=%t_#+sogJrEX6hH6 zI!sB;-&TLZy1syNuqSnHW>`k}R*A>bh2Rmq^wH~pcG~9o)uN~ZzrB6f19XtGx?vOy%~hD+dMhNL@_`030;!{DMBY$n`qwInOl zYiEum!byLl9XIIoEDs>c?%ayleZ*@zoBB3~!zBxw8^(y+;mew-AmmICvA4of*&`bS zaJHD`SI&0di1k;$Sxqxi;KeY2_wRh8-a9+{2ESNf82B@eTaIm75q<+vemS}lc>H|P zaE`F!$b{$gvuj|zAdY`?Ol%`EkeYUy1oP<6cW`cmSUP#;n%qX(1rb}mH`bcc2F zVaIW+T0b!e&4@Z#6cuF`Q7|9OX_vPZzzp5&Abwl){py{G3yUzzDHh%x+(2ec%S3br z^!Fq|>793oZRla}yesR}Q+NQ?LrO5b_k(S850VjB6!Ft(hw?bjo)dIgNUF6UxTnpp z=@TB&!$wyNTuzkff0X6*db>+2Pk{&)B_MnOiL*~<$y&GjbCqkI8eXXB8n^RZZmd{< zg7H4Tmwn^SA#dukz6Ea^<_1JORN+7T#GAe(FK3D@PKv;? zYxnx~<1F$aD^FsaExx-qxLPE{JpY(^5M8iJ;Z@;`e*kuk$+ZnNN9%`(C>zqVFEa^x zK+>iyv^oGvdPf#Mc+O;8@JfG3kZ7^L_}O1}zKYKHA08>O-|VzSJ9ihG1_(U=5d)4J zL?KD^eM6rw!*-~L=ipfRbXb)+>Zu4Q5pxz{n$v$t*RtkeBH52NbIE}d$T`IxbPi*x zf!+sZ!MpC9(qEB0s?`+f3pkw-viS7wrca7MUrdarFxMgt*@GRJjB&z)*O#)0njWxF zn(&F0foUDpD-N8HXUMboGwu3!U9KfqH23xZ-r{;anA|)lVy&2b?&y`7s%-6o5h z>}#L)K32LznjrVoyvI`FBZpM(mOh$Q1E~`xOEiEaU9HvQd7%*!7{4^a`W>Hv+n5Yb zmseG2TV5zHI&8a%-A(vxE;&U|k``9PvsG0JXlXG?cn+ZVYolDIUfH7|Uo2I=%)+vx zJl-6_RdDWi-o)65P5KOY$)LO9)72nq2p6%CnP1v^W2Z`{JZG(QXfl;iJsiE$>U};G8rNfS%Ce+WOUYKUW3P%Odx?pu8uDi*tDMnKV~ffaAH@$JzR?%ZKh#PUsMQu)DfVMR zos8B7aIUf7A`b$ zKKyQGV;m0UN#!<)U!b-$@vj-mP0a?aAa&+Mrg{d;ldl`aHK)JG#9t8Y z2jAPpo5d(TOSs}TPDTySDqBp`B+g4*p=G2k9JZw9em zEM&^K7YFZc6m_XJw$|ps5mW1|k7pmjhu?2mv7dz*rM1~wKxl(vFV}eGy~!gnJ}(gY zGNOYs83=U|d~{=uUJn<-lWmXIsKmDPRCVYl$$xJex2#5GKS>%;1KU)qtPJO0Q{3^zXPDRynod zGrN#I6-%|%%X;w5@-tr9-6i#v+pNp^o$VMZZhjE8!M`1BIAO)ZUcp+tOO;D)Gm1$x ziA_&4O3h;Sh3P)NTiBuYUK%^zc{0tCJ3DB+w)E*_*~(qrhf~5UuZP3_mdEx$Y0T2- z-+=LpP&MlY_eSF6*{^wTk>p*jKwBfb-%!5`M87{>Ny`Vt^3w(n28+a{W z?>Q=Mr5QAw<|?U_V4hl+hE1LCOZj+rFrr~T5~I^sf9Ei*gUvRHW~?L0hN-T;6XSOY zA3qU=L`3WS$8zwfbT%sFj*glD!qav7(C&%u-Wh|_1<)N7sUFBzV1B4*-(x$w;NY`_ z{n|sj^5ma>-cF94bKFcwR4$Z*q}pp}7~b{EM>D9bIiq-(w4E+Z#~ifsKEBKKQ0yq#GM9xwKk_? z@$e~Bc%FIq-E!nU{HMhEJVl0!jh)V(z53DVYUi*uji7jHdV`w42`+Oy@Vc2gV(PWK zTF%@>jC$=*Yy5e%8GR z$;*er@l-YQChfAcKKby|q{ZB~w(`%;zI|b6mq4E?JUxFzkd)LOdE-3--@|$;j{6+2 z03NQsN;KTnu{;$*luh(>Uj;wI`o zXt}qS-c2OyHN1u)Nb@<8@msC5_o|QFo?>Zwf?gvz#a8laP`W#B7<{EHAJ1zO2l5rRdbLT;>yfX5w8ZwpRO*i@r>A z{txnuILGw^>96HFRS)VVFPle7xDP#bx zfHN_&51V<5CsmUjY<<^A^T+( zF!dqo!m81e5=aS_DQD!GYja(u`TLMWY7ZG>CTb8v_z`7DaZk96vG1GZ_w!YOAujQY zfZ)_SPWqW^92u$v&s?-xQ_8m2HHZeIP^}`3bDJU- z8Y_OdPE1TXN~Z10)9SyY*Vrsd!~=m+MMHN#v?Vnbzu(J(&VqC7s%$ORKflXIpgrXS zf+$P_dkd{@VLt#8Voc?YleLe&y?1DLQjG>NKSZr}SyDWzi3fcdlN{GW)Yc9U*Lr=? z=U7+iK5TuK>CG$EJg3ITLFXUW=MvEiS(fDR(^7*bPTV>CpzrHFMvf6RCDffZV`l@z zDou3HuvMAAMnEM-c8T+v1^qM*{5Jav|28arbWao7Oy{`=%A2(>0k+gpuVO2n5TX#B z)5H;XG75g)X(eC?SM(a#t4zd45O(A^SFi_7Z$2k{-0S^D_)t=49SEL}M+|Pn=zR}# z5xjS?pqurjLK~y4&&3H7JpA2Jp?z8^r;OZt?X{;`L&_Bh(62r1U%cij z^c7b22>NSB74~eV_OQ+xMPDy+&fs^m(6}aPA<0FxHWGwtK4|h&O~5B$(Q^^Eop(`h z`=aHuUISRnt`fx3=j+u9okaYO>F~(wHdFNk5om<7r5@!QkEw1UcR#v6ps*bc5|OCq z&VJr#(gd|BBrUmN)Gl5~X|sfHzd|{185KP+y(>=5yb9oAS+L9JuvewQwnxn0?jetv z2qmubXjxf@r;qRPiJ^G)R7`>fp*V=Rp;X(Cub)eN&KV{K{#_=`)s#ofH{~Q#$P%Zo zUwJ_v`hd|ZyR!SEu3jS;t$;^Lv0_Ib07sks51w~55-ywHlPN6*e#s>BRCAZ83|_oYn>NJ|a+%wu zy10PgaKYtZ<7jg!WuzqO(l@%m3+*>f$)}Y1p2(pm#e%M!929-Ltc6)Y>_YQrerQ?%ydRYCW>uW#9VQsJM7+Y(%JXOQz$Zn$7Rz;rGmXdgj*L6BWL`D292Fu!R!RHB53r1=FP1r<>?<~(euBg2SXpQ4 zSh~K_JMphAs3Z!$9Uey4wb))|<|&Y6SUP(SnSzZUv>P|7R>0ku$*B_u502m8xjX>_ z0)-4{D^0wjmU?PT(jeLdYc6-6)@C!m+wFVU1r?NAUv^&S4+Ru(kD- zYR6s?o;``^;`r^`L*T9`nF}7fhHZ^4*z3;D=A!+_4@D0{R#_X5UBFLYQfMzQb?Q1l zr%&k9H*x-CA>3S2Z_xu?OJCOR`g2`Nv-<|z6@6o3H=5WB&n+}#EVCu?D=P!7Tm}&T zaDJ7vJzd(>sB%;gEn2c7aF+pM@S34jY6AU71jD%nU1_@3F$b~~yec4mrv`LQ@C&Y9 zFXRdmuB*B<1z8pgp*X2IPVO~J6OZinj@r;@qLRif_v=#>Lnw>_EL#~QndpYkB#`-_LK7X!@){}iuXa|<1qEB(T(E$cZKoB z^j(azH!JVc<>O9y+Q4_1{v3n&rKd7T$oRpg^0J4G1w+;?Q$%)-6eDn*4TY?$GAE-z zni_FAxu{i=REDsU)}u^!KP2bo)9#%lUIHt<`@Ykm}#<^;&+BMJee3be(T8&aG$L z$r4HFn!#~O`roNKF|FyNaFg$NrK9-}EklPlxpLOyvj?Y|A4^&wVS#>e+m)A^U#Tkl zrM9X4g|pctLpZ684m^wcE2cDH#$44B)LQGSH7X;gpC>kvh~G<}raOk2*0D z1_i@A_~QqRxc0@9Hae_R>h||R*+;swunut`sS5SFRBHZB&O{;k!v^r>_+6Y5e(Ng+C8c z{LRGZ@%YNV@ZB0c1c_C>vcP?~9j{Zk*HJ4E#*@(AAGKqCg^_isPSGQbz!g03V+F85 z>ebp{A`|w}dTVWE;%$Xdw80&NjmL|%rl);PXB&ONSLvRb_f0N3~w_|m>-tYJxQ1w!e$SdtrK1WE+3LONHrXo`LpM_=U&x!eMk{>_!Q4b z5xzxj>UK(wt9a*4ddBOkj{|hBs0q*6SryGw^}5Yfo8GYoT2o2JrFFJvBg*935nE03 z-Gb*b=N9{Kh~CfD>#41NHx_?q(P@}AfE}h1?g{Zb zGGEJA=?|4P8(tgLf+i@W-1+rl!MOA9De5~`{X5w$iDo(|aTdB-Dd8RcgL{kaROz^& zJju@)5En8>AQZ%t)+Q&ZcX9@)xykH=WqPqAvEIJQrVR++a7%Q2Ojl<=DwJ7qAbw=F1RtM~PCx?JS@7+Xj}P1t5GIU3S7to??yXAq-?qR_!@ini z>$BJ~mM><2LxIY7s|*8ko3furGn=+=#68fA@+~|&gs`@8$?0XOp1|?asj-ZrHqf_) z*)Hup*RA8=wA+>+Vzc|7B$k+v30#gyCk&aRH<~8Qx~=W;O@Ttx{Doc-#Or10<@ZI{-6Qsw(aKl%=WBoRyYM2 zsrS){chl+o8ouILVL#1P(xP%|g8GH;9wpQ!NScFHA&T2Y4$tT(VNV)uMClqM zUjeuN4G7zv!1z-6*v?_;Vm1}aAXOWSPd)c4?D7+aO{dCt*J^Wf&bp0IPItwvDb~OC zvi3i&w4Ow1Jz?vl>qR#r!C455$Lm7Po$vdoE4Z-(DR-huync|e)F*Zh>t8@N%A~{^ z_4`siFpEO-$d>o$^fWz6$olQ;`;05z_FR%HD4~?rOcz}{ffSD&Fw1k)W|OS;oF_zi z22e_)c`DA(cnMrL^n;7V$qpM2W$!@8@+eI4cqhO^rn0IZ0mSfF!!G-tSI>19-bw=r zv1z!&>>b0ZlvB^WA2&8Dg=8b(`L3>(hnl-ZOiLM(B5jI!1@wcJD`St70_jhvwg%x5 z-_ev96YTY8DHWCx%B?kyb!DmjV7&jKE^^MS!Pw>q#8~?GI6&7fp>8SNg^$CQTW2t@Na0NSaVeqEnEwW(I-{DE#CE2wI=#CYCi#bCzIJ)_TsT(w3^w!|+ zbaacU!T`s#wA$Hf-Z?$|MZs@?;I|wRYWuBEgM{OJl{lO}$)mY+J&1-JYE_mC3>eJd z@P?`JyixSiKXc2GJHL0_>&+M(7n5maP!eEfsBWVtaH{Trx)VqWaMiMkZ=SKqk2WP=_vDk{3@Y>L}N?Vz+C$so7 zUNzmr6Qfyo>yS%UGqwH$*v#-rjx|&%M05a*b&N&~ZdwpvA*Iy*YYRCoD^0>$-x%JKG%F zrI{TslqJtNEifwE(bYzTMK!SD0K)hiO{?o-x=|1skR+&@w2U;+t3H?gbwJQV;~~Ar ze4fIon2sI0a_u<9(g8kGlDeHmY&DD_yzczHAEn{@iDsE)|zo;L1pVAQ2k^NxNa zCA$`x*VacWH#sNznC@#8LoU$M-#ghy`?cXfJ--#W_65i^if_1T?La}doft{endHxs ziQAbKKi?&D=GH+fp|uIjAl&N^aGwT1-4bV8?vCUqhzi(%Wuye-9}1U)A=5ivw3}UP zx|=}xwD*!qg6nT!ZbLwyBiSb50(Byjo&Xv)-}0;!zv&dSZZt+KWKOR3!BV2r-x0NQ zdsAOtE0_tw>qc0xIZV(zMf~UEZsiouLp3LCs(cW}wTx5-k2+=6O$#}3^UC!dk7H_V z+pQT?;U7|?s%b`1pb!^YaAIDSca|YoJ`LFD3;~0yO_E_FC;jRRXA4B$=fji)`(XD- z*-h;~q)qOQ0D2MoA~o)YD_dGVjJSB-AhIB2Lh;e=@YJrl&PUXE`BQIaV#!X??YyPr zGbaR$Y^jInxBglS4Yu@|6~7;2uKEo9ekAtr^RS$OLi#@Mw6KmQ3NArWe|HCh(p&A*+N)_|<8yFX$2a{>% z?fOn;WwEzbij7045MgHz4;LMc9N+CqIqz)Bee^!2Vh1gQcPDW&nrbFoEz&^Uqvj17 z_+$xj`EC-GoZVRrP+Z$nc-APD;|}*kjv3I2F1EuXlyzR}b3hlrbGjz?R6p}@>`V0; zlT|7%M@0;8-qg}Bz+k@c~P<;JZsb3p-U*Z$85jv zit}kw71rs=us&wL;UPrO5#gL1ONRfsmbq9K=4*@&z%ITnpsZsQ4hN|SP9?d|&>fp8aZuG+jrx!(At7DtJcIgC z55lz2V@-ds+?N-f`kt&elFmqx8AQpv8^7P8h$t<5dFy8BzTJMQlgsS`=YF1AJ)msR z>{^U+&jI37i>|$`HC&eqy{aLl(Be3=2=negSyJoVd-f9x!Ck(qJ3*AbN(&6iwvs(v z_0k7YeVDRbboMGJenlhOiLjISvKPqCF`O|UG_t$n(`@|hvqN(eP41{zMnay)QQX^t zjdloQeGo~a%-*UCF_64e8mU&*zY9f*#PELR55ni4>%WPccp9P`_6u<&X341eQ{pGW z5_`dX=U8jQ#Ly?Jy1zFgCe`NKx})iUVrRANWuPu#1Cr_1cnQv+>+Of*Sc*RlN1`1@ zb6a;wURp!~3PljoR+#|*vT}-7WnK}ZMdMNJ(gL2_?_;}I35Ww=+GhMmvVvR%gMf~g zsxH_Qt)y)}AcCaZCjSPqoufl%22uHu?{2nFqg6)Id#S>J#4NrWmeTs^_-FINng$!c zgsLMj3j}9%G?l7u6}>-y$mIUn6rh&SC3M^zlHM^bZSvz=G2k&U`vDaP#s`lPG>mUHN(|B{dwo8t&@VbmFZZ!flu$L$!)Z znSQ->uEzeJq$Ew~``g4nX}`W*6b} z9!tf{p;_EWWC#dSlIg{eV*DI#l40r%n#}#MbVcNATuieUQ+b^8p?MlD2Uf7fcPHI% zUI<|ZS->oAEaITEZlBrE6aK@+;D;{&trycZJ<=Y8S-7XAZh2aQ&Znd>s>#Wj?R%%> z>s=jDQWYAC9zL2-#hX#X6|f>8tV~N-Eq17FnNkpJ#zKES?Y5uljqMVnIA-- zYXB`rpeLD@wF`4PhA#!rY>`3%X+q`9Qxfc6nocYo4@P|3KFOw`yz@0&Q!j^mV;K<0 zv}CfM;*+hHA3vbH-iHMs^#d|4m%rqQm*NMj55jlJ!)}Loo$hZ&#|GKOwxdx$Nb}}9 z6$2Zx^r?8XOiYxVrA$v}_!=g}7(Dz)i~i9wixU`VNp%xVRPRJ1xG0%Hv!j)NqmPxj zs24{z4f#d3_pGzq)>uen7Tt)db+tY}!<)uvAco&<=H1a-NPYPd!u06qp2;gAWUg@c zIDy9S#%mVCrcak|*B&yaLqa(N9G@A8v_-&V4hWh)c0js!iR|xG=+-d|VYq28 z7N_}@^e+oe)Ec1V1T%+haSF+bPof=9fbZXv4Vdai3r9EcRFW`$wD#$rxVwEjmoW8v zacyjgrc5{@3O88U{`rcP`Of3Z&)ap?@AT-rs)z#dB9VS+c8w*U-TG?|)l9*(MA5=m z=^Pkcgat*g@QcY&-H)i_=1oDmreg?;?9BL$cGV@RLC2@-%5^tQeKM*0jGu=QHBTE- zLKxHf&Q+$z)dVu`%UFdCU5=S+ubTzc?`VdB)_6soPma|MPqyZ=WFJB>w)z5dIxz$j zJ5yfc$+B8DlC~M^1U`MS-Dx;IwcE+AVxg#`$|ecFOVWPsrL2312McWvB1Y<)M zw0pwnF?QnHnJn*{UyH-xZi`X6=cbHZHv`{ZWO}~Uli97zL-64Xs>=-F`ZT9vly3UYskH<)}b$CW+lykok*EpmBcmZG+@@=qP&%ghr zjt>%Lw=lRRgEdQ@3)T54r--F`C{K+&{Q;^Tm^1H6C#wHCnfl?{z-9eeuU?%KuRV0_ z-XV?`8#rvaYo;3LC_2z?EgmalaKtUz+It57>T&@>_zNGUk0w26q9CyT4nalHPuF^2a+U4zTo%Oq6_}vt7bJ8LqFdGW7Quqg>3t$>d@QqglB(8D3b>(D z#YKZ>+PJ1q2CE!RL;Vlk2uUrWQH8wq1yQL@oF8dtFMRg2roZ!9$d9kHwfz3}*F(}Q ze}o&4+gLJ}D{jotK71RN+P&Q{)#3!;+QIZh91HonIgmR3>g`qgyXKCs=vDnCm-U@h zH-qmHLl2~sNpIeh1`vn7;m606v~gTY^q`zz*Iiz}gXQU4&#jhV{ZYxeX%;`0zrO@8 z-QeZ+r=es|XX^K~Ly=e7DBKJVY$ShW!XmVm2%$Q?OpumxhPji{(-KV!*D6#fV+zZJ zTQ(@@k7)OLpS43}c$v^&2=J0CCui$i&A@^;(Dxu$9LFj9M-HX}#JjZ3*(fBpN&M2o?KIwrLm=35cB&OD`v)mVy6e^3lzP#llQ_d?aj96{w0EdbJo|PRVK@B6H``N^BRvk z#fL6>MB&k9sneWk*swNjR=QI%KT_SnuQK*^ZR~_`JYrkd^^j}8N}4)>wlq;6(H=pW zx(LU&ahQK@=l(i4jm^WR(+*(jY!m!yjFECsYO=&hTBHa1kw#RXxN$2%vUWN9?I#^L z>{Pd7NYAr?%aDDU9vzRRPEy~puTsi`ew6XG8(xn~}G*wJ;d zPs1=rWb^Fdl^G%wOo>+@KKFRK<>X!Um)aL>4v{~nG)W;%JUS|58<_w11v>6Va@nQ& z8iW>E;_EN(k5!i8{zGFElfE_MLb3~LUDIl)Q+Px%tWjqof~b64E~-ysr-y%!0@Xrw zxTvGFY0Je{PrawY{7h%G(pT*!jN*l=+`}0aEN@nm~Lg3e_OH&9uDM;;h~KP1!#2Vo&5gu z=1kwjF;#~Piw08NoaprLTkigt`XIrAqO?Fz+Ys=kbyOOgegv{fES-@9d3fBF@> zL%=j@imeKvI@;{Js-lmHKRopYzQDShOcIVB?Q#fn*Ax+kw$iuRukxq_cdVd|wxxR{)5 znc9D2?`K!rv9=_FS0%sy0^ueTV5dw+KnjefHXR+gNu_;$X7R^}DCwp_=O{hq$mW|* z26-l9mjW%W6mU3zF25^WT{Dh8Z2aoZZvZP*LM!O*VWg%ti!lwwpYVrwLT(-(|F}=} znqOGA<&FyoATS=c2396(`THM9wRSdS*Tm}yNO&CEM6^$gD#dYg_KgZI4jEkSy@n+q zI_nI12@%onQK#1CuUBiAeUwsMy1r9o@6;+D^stlvuFBHroBQ?M@}bDSnJ-4l@li)0 z(HVyaBP1+d0Kvor9lD($nz4`@=kF4Zs!^!hxPas-j&#mgHQ1mk1I{nNgxlJIis@(u z*X+{s8;Kb+^F*m^QEnerTh51W$jN1uEDhIADdC=r{w%u`-?*g04IKxWr0|9j{MW98 zKT@SPmH%qxsx4E`eg)QffYkOeTlLxEnxhlXHN|J~z4U9?2oDvaDsFlOJMuI7@O#@1 z@7v}>_SDO>LYkQNt!HX*vjnPP^x|-w;Ir#+OSnJEvqMd@jb5hkJ_Asho>R@+&Lc*} zN>`xLL?FB(&(A+6IaxsyVuw^H>1aZFVD=y!(Y`jH!BRM*ez&GJJ|7`#9C7%VSI`AK zj@N+yb?RUc{4=5QO289Sk%4xeev zC)$tS(|&X2JQs?Xr{#zz!ntqAnlEA_-~~}E)RAu>UN8} zp%s3GNjNA9CA$cgo(YGw{OEc-8&~C0iKHyK~-S_XM(> zZBMU=V15JkL3PL2CnAdTVp~sNQaoKZT)x#bEpV1GVmt05{EAh$^N4?(1-*QhzmOeu zPBWU4BkcOJE8_UMtKC9ttX?lhhEWPK#qVR)+ z;k`}QgOL)LJrsNcYQv+R@+`HMNIn6}L< z?#(u2j&5=?GC74EapS?_ofGFT-ea^f@-d2~2rdHp?9K^+u29)G(GTNK@3Bck6y_mR_1nwU zeeKybuS|k5EsvyqBwvh4PC%Poc|%rhyy4X7Nu)$@QgcP1WT->*@G9?#oZO?=&(rFO zXbKimNCTm%U>KKjRw+XkpdAwqSI+RYecp8DMct&dJTHbTK(y3__|z5fw|rMNk_Z9rq@dXQ=I8(t6^mA|O% z`~5SIOnG-|`+c^QvVH@4FG?Q&RUaW)X?=bfW`*KbIT84N+tv64a~PA~2$(xeklazo z>6JuYg+d}HZuSZMv_uo}@D0x_7h%`~&`fgjkFy@?+fw=a=pL`p@5&@$P-NVv&WRP% z`jnGrI=2jVZ5RDfGcZKlzMQzY)A~_#-Sn}Erd}?dR}?v%X}Nn=gp`R70d2ny?mk3f z>cozYzC308!}z_>{@|-EfAgPr3Y_>o%$_Ibaw^f^wJ`o^b31#TmmjnQDn_UIa;p;8 zWdBj5_g{*R%O~kBg!O3yRkzjoigR)PRWs!g>Vvaz;a z?R=T@b1impcfBA{rSt^R6XQoWh@GeA?LIAjEi(VdeN7SMy+3vr$@erF@MU#rvM9r$vl8{){7;Wv%t<-L9YVTc*h*{b+s9B?E)o9hI z5o#7iQ7cH*-dlgUKi}`?_dL%(ka6DUea`hduj{(bPPoL`AflO$`=LBSJ>%N7B_CbD zaRU77y1OHm0UsVC;UF505p496ejp2 zB3(~_-cddBv3?hOX#NdNdJH5jXyHX&$+XG`nTVdFs$FD_-XQpqsal@~RbzFFl%@z? zknhv^V|9ccF`*n_RedSQcnLHwLZ?3d1iD$@&tEYCco#By=s%9`lxRD!yQ{zSA>xzXw zK_R0VJELcXQLWI8eI`BcZtg$KTWRaUH~A|P!7*@`dmj75{!UZR=tGN`tHY0^E+0O? zJD0Gn5J3e~MjHY@8(NMJ|Bcr^KW}+LcJqxbU8c>at$b?TM7>w^abU#tvfZV+UGC91 zosNLTNIf`TkEGTh^6FlXGUGD>EI%bDLsoOwlHv0+1&WNV@^z*)M(?(C+ zqXvkSfJl6Q0Zi*J<~k>YU_TZJGOgOs(3|9 zpUn08|1)5BH9~&uZs1kv)UrC5&o^ei#%=(o9QOPip7u)$`Wk9+O*JY*(npLr3kX@n zq!P|m7rrnmGdKA-pWd~CZ8#^U{p33)+5`t1na$NU@b1GOf>pNHBY8&ws%vn;y~F<| z!{V9QF`lQ_G)uUBrl(;pN49}9wTx1JJpkyq{6S3+Ct8<*9)9c0q77g3j=^Bjx@<-^ ziQz0d6&tsWe+j|Tsf0gt(>Q~E2S4R2yL+UjfV&py9qi1UWp~O_4oqJS0s9mg>?ba*shq3M zR>&4T0PFc-+|?>U#n=V}fh9wt{sP7*x$re3UEIo;HShfAH8*>Jzo+L=@V_PJ%760? zC=ub(Be^NADG|P{L#vDsw7=U_SXa9XaN>9CZOQZOiM%uukYtZ2M_E*)HUa^x0)l_TOA8vBKATsL zXT_47=3=8TEMB_OL91HnsP|fcmot}>+js@*A7+p+DdG6Vy>djaFQZ^`HqeLqxz{VK zLC~?bH4C})Olh?G4)@pY_YF@T#n7<_?wP`S>~MgCMdPb(b>AiX54>fi=N+JrabC>+ zV4CgJk(lnndkw=g=$Qh$K07spTeSZoKqglm9TKI=bCtnva*39lt*nog?O?%q(aooh zlI!_DZo+m5=ms;nQWMV3Z)7kO7FxL9y^{OR0=8`8s6FOWN*xrlgxn!|3-TA>pOUIe zVJt)9cXDj+dq{?x3i6O5y?g%x@cIDA>~U=S&fBjv0ERZC9~hb1g$n<8^QXCmv#Uk- zq>x_^6lDfgE{s|wC>nbYE`97$;1RCZAf=BJVzG?f-O76s*01DK9Ex(fztu5{Aij}A z@)u7+t^!g$>;sXJvrRNj9>hn{s)+e&HfuI(zvXO4h5>gc4GY{elV<&<-Kdm1Lk{~V zBfaRlH|iG4$XW~{;stLIG9^1&Gmn)2wzgmDlKRPH7a|GOqlGDY4+K+h6@V#-a5_`Uz9@gJDfUG!@k zg3Wuxm_J72wAxz1B#iA?L=L&)N$qDD1aIUSm;aooKq9#)xM`NrlbnXWn84n~<)*Lw z1O(grs|>om%xeJ_K?Nqi;|VR!2!W%+<4zTKz5lDf?Eh-&0iiVRxIKP*#U?47zITUY{7mO;+KR%o*_j?8A4xp*nJ*d>yjh$4b%Hu< zP#GU?Oo4pF^PK;wzvOgln5Ex!Ve>`(LdEya?UZ~$z2LfW9iv_e>Tp7vx?$)b zzFnI4efO)-52MYfaxboLmua1m9h!J`21M%WEy zrf&d)GR<*Z4NhhdG!Q~c#~a?+QV)bBkDD9&Au}T}e*vV~guQ<|BlC^UmYRQ2(%c_? zL1w;crUF1FChHJ!r=NQzH55b;7N7iXl;+J9ZhjW^CdHj~{=X6aqxK9smcC50Pi|a6 z`yU{R2DtW!J5{2m+erhzjH&Q!!PbkUmv?@9X<9N%$Wyhm&eSrbnpjkOsa(CoKi})j z)oF$#L=+)e89?y7kR<4uu4WMsK{_5$>mHEV9DdO^Ag#tr`Ne&VWm__|9mP1!cT^`bd_zxlKBAi5MQlf zF!BV6q0~mJLgu)6Bilt_$@5~n~VWn zIm#TlJFh2d)Lumgs0P}t7hK%Wi!^o&8juz9cl>~hm|4yY>Jc?wjEW(k9stBk4QBas ziV1-L%#QYQ;dD{h1I_E&U0x3W9iU5H-}j0ywLKH0MV$`srYXol{JAzIweHAU0S-1V z?$T`BLOSz-q7K7c=%G}>2hb!h<}`T%>Ms0sd!!3!TAG6Wfc%|$YEk{-^HFUBfju@E zOV2%Lyi`|I+vAbk#bvm5A#?;=SLO>Pf1Ho2rI@alVhGmd5}j<;fX;dsgJbvYB>^r2 ztBxVjtlNo}VjP)sp@Uh1_869@8{r9K>dir5a{cY4zW}aKg|a^O}^&1KyEpyP>~zo19nmhJO{38oKv zic9UsIi>kNJ5QJyb=+0rXOYEdEEK*RA3sZ>!@AyB47`TZfSph0fcS{v5icyO%l)!b zA36w@d3YuHGy&95ny4_^keE<~A@iDlPz6#xGu9iZ&kD!=zBV_uB(tt@4ONu%sKYqE zX}9(O9QcEjGe|bF{&MA+3!-iPKTjT>B`UL)oS^ez@d}#H7|chxjR-zU{6Tx9-$F-U z3!lhy+*x+g()xMX{n9Rkyft{dngFp8-iph4wRUJq@CmZ^k)^v54JQ%g(v*x}Oolfu z{KoXVD;L@sCM}BoZ2h`uPq@ebtC2*1vt|8e-g*7$%^wH>`O~1;(PhE-hc^cT1Ju~t zF=s>|ZQ$Zlk!{%WvvpNtX}K7be(ArOo&29G%y@RIw-=Goj0>lqmOYY6D@FQ6(z zg2ncHqXE^xx4mgKF2M9rOug)ne0MwTE4yB4BFt}1Me0krrXlm&9u}T!Z<;6)otu4Y zp$vAPwlZVC-gcj#!l^Vr$uob$qT&}b6bG*GWOn5|3Q_+!vgnvSRZjhVk*@dh?5gF8 z7%V-GPYL^^m+;>0vaQW?cTvZ@o_RXyC%|Lc!4EVRkqi zPNA(zX)n@>)K}6nemRUZ=D?&AGPZGyJ;2omFfkE9gQm~6IQn`n=23M`3S;u4qNiZB2m9-M5il!PnhI(u-^Mz zqLdMhCB5xjG`v#*&zi%B=yF~1^1Zk#twrBITf+t1WiOubJsD|w-%f)QV~Htd4IYl} zq@sxoCLQbFpm6|f&){tN@rD~p^q$KuJ*fAhR9b)JlIZB)xyn)KLw-fGgaQ!hB^^!7 z)PC{X9*RJi9vOaX{U@A;$wsDaIf^57)Sbq^6JEU0#AdGx5N(BXbqU>Z&I7NgT7HdX zDs+hY^8jShOC4VPLPeA;Fc!%GU8MwR2DE^q5R7x*iSrsI#Gq36cK-1nUs?tmqaOCB* zu-_aIhvqQ3v1m-GS6;4ePN6N+Sxo6~v2>4x#GkqWm$5Q0Q+4Ki0@v>|%&z-RjEuUw z)$93cxr8gQkd^oLg^f8C4+nMbI!H?6$u%W(rXr6C4Xdi=NvfeG2#7akC+MJ5zg#L?b9;^CEz;i398fGUZcHraO)|R*M$?F)<1kA1t}^Y=G{C;#%cgMshR-B5WUOQc>+ zb#d(-avv_#_!poukZs(Q{c9CRtJNY~4wyiNTbkS*2&7+Ctw5=!A9?!~J>|69ouU2^N%nDg-3h0i__)`s-Jlz~WY zdnzw&(0(4Ezz3faEbBcE<|?aT19Jh&7Fp;F_TQwY=U#l|ddwp|-t|&K+N32p5sFmc zCniNT3m%1fJq_{Dyq|t9(VCa^G{#%oMkejlis_HEOoMZ^M@zyd;_dODCY*+*j!t1@ z{~^Yn19}z1yTJmcDZZqLI?AC`{4ApH@OP+ZULWIgsc0_$4mQ$EIYX|;{ir-%W2B&qd2@Ycn~9wJF(z8gRoCwz<}CGw4%Yj%OTr(+3dF#fnDXObYd_yJFjV!)_(V9 zik_t!$&;5AKP-prW#AuOC- zGZ#$pvr}T1mV2pO$v^+!U<`?o9P0A_csO*mKgOOL4R`(nIR zy}aB0$nPB>ft||Vx^?ESW6=pgVl^4j{%Pot^C9@*%KsDU)1y_@q}#q_Q<=z^Cj2h8 zp}3dSPbc^Bqm?5Z!s#Q?HW$xP8=uTv^^B~98-Jz93Eh-ZUd6kf_<`vm;QdJnLeq;-KDVp@D$&4EeNhB#O0 z*+{fH)Ms%Bnx-LbwIR0nn@BuBF_?0KzU3AR?Mrn}{uX=rU~z+Z7`ZZnJm{n(xYxyG zUfF} z*Ntd2xD`+8f2Kxfp`bHR&Q2AKJy*vM$586Q&mnLJjJL2CkH{MBMbYx#54^zahxZ zi9zA5rdTb%77HD#Gy{$Es-cx|yJeR{#IFoP9#A|uz&?f`E3-0Qcj^B;TvVDK-|w5B zWZq6?O{MqHU>jFf`Yriy4ujUO)a2@Zi4fm**#H;IykWd8qA(bY8Bt`ZN`e@>AYrD<%`HIlpf7^O{m;9P1fPT zPSATTAl>BW__0Uwa|C?mi4*1Veik`(`cKvmtfJ2e;X+Spx=tbzE{0Rmif-P(M(hat z)y>vycJaoU>CyHJQc7vnUjScKemHYrvw^!qv(;x#-UOo^0^smZusz0XjGybrLKbNI zdLS@{@I~z0hOhn9nd5(Qe`m8Z;(c!CL)yULQ=73S=J>Y3iG`x zYv)&c`%Y05Rk7R5+WM{xZ0U81$d~Y&X9mfOM+GG5B;8*&$FE!l0Izq#Gr3($h3(6M z$ywrs$IaaJGfyAV{slOtfX{+P_LT;it`oLah709h_2!Ch*lH2!kxWI~C36Bv&A^!z ze}cG`aIQh}Qp}p~am-_OR$V&9@rj77d-I>$E|e~A?wxv`^X%^tJJ}+YX^(mX?4B;1 zUp}>2=#t0&Y95ia;!c!Q*0f%X8Y{bHocD5?T%I!!f8Ch8b+g5O+bvQJ3gY{qr*vPu zEVkiM06Doin>hAK;F%?=Dj^(pRDZ7;V>L0cdL=7sE9*wxt(+fMU};`}#c`xnG-DfI zr;nADfcnb}V{H4}Vf$O<8=*QwO+vIMu6kuU-r6sRMcf`M(8{r2`>3{``eVBulNVc zX>Csto}Jt*t)CWpe2IHi!w(`3ERUQ?jCo-ZTBEn$3L4fZ=U2{JgWCRF38irCON#uA ziU#SYx3>ew<2&wZH(NcfTpc}2&^W#W@EyVK`)Yjm482!r{`%LC`9l8w{6HT@FsQk~4Y?d#2;Cn>EaqjDYmiGdky`sZ71pvdMlkNd*|!zWr;uNc&3uUSk$ z(O-?QGE)@6OJLi|`0e^1`O~{Cbx-z_C`I^aF>p`=4%JVj0~>ryL>-ZapCO;*e=Te- zU;?Q2T#EF@`yEt4#;I4(F17|d{cYntgY<$9dthkCBx;uJ3Ddw;pqO3sq1uVJ#1ZQ4r?%NkUJ;vM6)ZbU)rg*VMCqrm$Xz~ zVX4QwFT}8faM&j^I)X_p@NV#i_x`_tL*>7{iT!B&?lakwjCV_Av`7v)AAm)zx@}={QTKukdYPGbcTMQPkIcoGSw?EZU>&E)BL4!!PMl3E6 zE|?aG`b7Fq?~8CBzc4xa3&`1cMhd%Bu&YwLAconXsw1r?QJP2eBiELXLOU7jQgXEd z_em=cRi>@tUDoHLEdS|`7kR>gm4&wvOUYpJ^}=V@*+B~?m!s7rJEyq?+N0u5OTgrJ zqLjcV9Q^QHdYE!dI2K9XgMr<3*$bUT1UXhmro*3tx5wkB;6Ey{-v=05&rz$bQg2+9 z=Vj+DdL=v!qO}1y21xoS89IJzqFtx@<_j(l-)FLFPZw>YdIlKwk>USOfVcuz)n~YG zi(03CW?+T{?-fx%&aB4d!&9Bxs@{0Ythb~x^e+IC48v{Q&Dj13{_!xagRh+)#TH6N zb;9aA-K%>+DL%UU~iKvMLA|L=dC5>NV;lY=Z)6M3~XC&R$(z=CIaO3HnOc>D5+ z)lY|;u-3V0MxfLMJ#!m^hzjC{+XcH!Q%8hF~>RSXS=vK zZJPl>PhZx@7fXos{>OQcQ)^)_=v00^MMeIfd$g;Ofk>(WG=s>@MEqok?H`BOTZLUv zI7@&n$8W7xa)}7H?j?o(hthW>-gGd6Cc#OB*xi+h#ST=;7C`bXD z1HX-)T(qhPe>5N3^6J~8iUNNhFQv1BSuFbTlaKYg^St+Yc9JXOfRfUTgEYQtbZBqY zOF3Ek)w+G}wWyvXJg8u};2DsWUq=O>Z0ox}^SrNp@gk?uEL1WkcY(%tkUX@TL^zp~ z%yEfjEw%TH%kbo5B;z5J>o$5mpX(#8`iRi*YC;7x{ z)wHQTR1-unjlFW?2JMv*-MZx|hw>*ifLQ^xIJdumFKv4uBUO&u9q5TE#;au5r%ybr z+HffSILw>S*r_U27-#YlG@~La=%g>(*h75e6UL^iX_@|jDe>6fA){933#-g7f1p5n z54`nOizBC#e5-w{QLHJ|Cm})n?$8|hT~HpQ=AQ+03brahX8xN55|vNuY0o?B>wc} zpLW~|M1@hvN~b@@(!d-`K`$k6S~nQo6A1b7A@Yb7LguB#@4WxK8h^rl{w&D*&NgM0d8|UJ!I}*fKAw?po>&n zo?U1hXO9AkMMm+I#p>EF2b-+h`cVy1BY01buiR%XUtl18zVyvb?S9Nv>lAI=)8vBgsv zv3=RBZe&04`%HJ`q*Zf%ifZ-ZPG zm&U<^yNQEf`5Mx(8O+7f%!B;d?DkVJaqs8PH*(K_?H8bnZpzRJ39WLOk=??ZDacJ` zy&Tv=0^nxa<8)9#9jM6*ZJjgbgi1BySueDV3)y!YgH5RI5fgkdXx!^P8i0lpXQGr}VtO{<>+ zEsWn0=j$`!G#uT3RL-Anw{+=&0!!vS%Ds7Bm!p;lrp8xfFGHo>-T`pd{TldB98N@$;Ezr7LM_OaS1UeTqvI@^N5ENBU9f#;ZPA@yJav_-q;jc>iE^ zd<3uL`o^lGPa-wm=(@?XKhj(Q-4w1AWpRY07|j31rwA!uF@J3}ByAgsUWDQaG&Jg~ znYz?Y1|v2uNnX}C^y-HtIyg~9&T~s&@nAZ+e8l7C(B8CK6c!zcryaz+`WXL?rf7&DRmPuC| zL8KqS(gHXVrG8!gtx0#sc1|p;)fSKS-t~=?!c}6;sO1qQyWH`E{K81BSc^FM0WRl+35sQmjN4j#+DXmf!!?UO=G=PV|i$S*6IE9Y1{OTZRYJZ{KJ3fKxWQ zh=5w*>w2fR-fT#_Lox3tpDJj}Bc#iAe;u-;xckyT>qeJt+B`6t!64c=;>s?GLWypd zOpDOdnX1{L&lSk!U-~J#gNQf9AFBz=vIjfXw;Pn~ zuRm%8Vx#mzzpHY&?`tL(`681nsF&14l)QB1#<7iOh=oATKUUe6T8!z}_3-vg3=oI& zjp^OP@Q)_%d_5n(%l*B*(bayK3nr@=Of?pH^QuA}@0!mt(eyUHM=Y`g`vkTEDJ*&G z{-x(W$R9~a3B_~bBp>o}IRVX}nnJboHQh-e)yA>u!!a z)dsJb^UW~PYGnUuh(GF-1v{_u^ir87XA3?&DA9=}Duf+A;2W(833JihWqDRVV5XM! zj7pFc6Z50_AZQ~@l=@fPbaibFgRR9Q;Y=w3z7#SM+zslytB{@C)bXC!-~_v?1ac6E zu%f*bDf9PKLyhY5iCA2APM)EDZcZX^4~d>WAL*^l`f3R@hM-w+6k-|LisVQ`D7V}p ze37MsMEpKja!67`T#}G@A1_k8mWo4zwh09koIJLbmuH8dTG&P%|>un?{H@2>;UZxK! zN_D8axy;^I26PiF1>2?8W|A@6`u!mSX-szkxKdeeFMk}l*d%1Br^_oliDe$Qu4Wlv zfOs{$vmoT88rp_IiAFgUPz9v}RgoDoQKI^hQav%qoUoZDkgs z$u(pR7lYBMPRnV2{D2oVz-DjwV&Mys;t!s3DP_at8Z&nOu_Z?SrhD>wh(u0Y5ktymnmm?fwoROy5CLyK(RYNaek zAIj{)(tNKGPv7TZeHbXlwE*&&xRvvBqh}Ti*GyS{8hns!0L1i=0t8aH0KE>;dte?K ztV(9MIr?DnYyuVsKG{>wc(Il0CG?ZZ-009_EkBX(bF?%oqrkaekO-$bkEvu))7bMk z$%lLli-fQbBl#s$gAI3?^{9#Lrb*hoyq_?O9GHlJt;0Nqyq$`RA(E2=?@UYht4oHlHcQ+v_38%c$g;87YLzuYeo@6vPr2Q8Q8rEJ>(1utUHSZSYz z^KW~+F1EQg=;rhqE*zctXyQ1C@4e>zLlPI&3P1aiRlvfsz>~(LQ91#oVlUnXKE-H> z&!Z8J=T1MbWsNNlZa;{P% zpaXx?g-Og@@Li0}@CIO~47QfWUgIhp>N6e5@0jL%dnlvWV8D*^ky*ux0s)<0{D7t= z&74L_3(j|Z`m0*;f_w7lX4_?C)>mV!L&h^?0S?316<}XA6mptd6Dn~fPFZB7@@a|I z3!kQkT{&(zweDZ|MPEEWe$lw*jQ66w*|lm?-At~P{Tqh@4o6Dfg1qkRv91FFi;gl)G9bxO@p7N5p%&#BN6xtn0ZiM3a3muBX9eifBPaGjFWhDjqQ$cC6p=q#uU{|L~0fR90OB~({&TO zRRZ&?y}YAVS8dp~uPoedlIa$~P3drvLm0l|;621YRO|l?VneMCc-@YpQGWqqw2^Qa zD;|rw_#(0RFnLC9!a4#!->Hvb+GE$WnxUjtBalM}4?aj)R zDMZ~$3(djEFts_A7_(-ofOc^sV>FEq4~FOZ^_8X+`|sk|U77A$b?aE5zv(?`6h zUkEX-;_FMQaCXh(<$Eqqu}DY5;Rt?0LmuNz2Q5dLCM6iX2TZN{rjHC^j>Pw6;PICZ z_3KK&uw3}$hJu6pFDx8!Fd%-8# z-fC--%bHi<9-KZ2P~z3Kr0^-LAvJ|oizpb`+@ugbanP5A`}D0ldd7&E=b9>&XU2gW zgvEDdtV$9MpHEILNK{~pKfWx4-Bj0=^^F?5Z{ljtGaThn@lN{}i(x#HT9%cOFHCNn z;x=!w=HYoq+1?49q+t}(7%bEMNAI_0?J zsn7E3C2EW}ai3lf$hCpMV0zG?jpBYis4l_rlhudvvnj{tw6A^S<9p~=TOr%3-~o9a zejg~cbpKTOr92?^3l^^YrZ6>p9422=p$YU~YnBbhNlPn2s8ZT*{k~BUG{ay#-Ib(m z8zb3a&-wH58^!;DaQULte@#_)b14|9dL-v zkkOiQaDMsd!@xiGR@w@edL$o1b)}U87WXy@Ki@)kh9@n?5KY}X?`4z_19Akk-Ifm_4 z63xYz-+6Rj;|kJbB&2<0+yOT}Lj%IIyX1N<-fIZS$9?BpWG(3x_D@ga@{-jnZ5FJ-7^( z0p}z#eiCl8tHmlCMMYs{h`+lU32`V&=l*N`g_V8O6gv`r0-C zrU)5>L1xXj?8DSk?{{!qwsStx-s!37ZQW}@ev<^xR^ z@L3hiLzOK<^P4{hK8r+~0Nov=17CN}d9lt4+>re4+ep2QV+{tj^ULkO+4Q%+F5QZ5 z-1P#wt16q$rLM8L?Y;!Kc}-jCaqM12@Fvf{2LRaF>ZE;*JPtxalv7-D(tA|P;b9`w46lHBvgik zFua1#wHv)0_s7*k@@wLP%jB%bLwiO17M1X4XNdRch3ci+5$6|S-_R>uKH@yB`k;M% z?bG)9J$T6jhet29#?-ht1a1&a02C*YS$Sy{byQx8fkS;7C(x>fz6XX?g^PGl9g3uz zt*vuZz-+&L&z#it{rDW9D>Fi6h3BY?lq=G|sz9LtR`iuOaihV16m5M+>QE~y9_wB> zw`4G$4`WV!hXdPmxU$kVXk};~_JnLfEr=M@y1E)tu9Y*Nz&oO`b{Tw79zTy3c zcO$E7+K&icnF26-^0iwEVIL&wEKQ*n+o+*3Dn_W;cSGNiN2Lm^;h_&3?QC z3BHMO#^#h8%-lg0jvaC)XkitoYPo6bqX=?DV3B@&U{bdO&%mGn6BOzSRQ?t8J9r@y zlB(@1rX_SQXvmWn)&?vdxfs`NIFt2tzbW;iH(tBIB~SKRn%+0{4RL9zsn6B?zr@n5 zkl0--bqyb}WRvm4F6maPf#3talV!pOn0NaDytl%GxlDOzs)6Q=_;$@Fkj&Q#H9*c7 z(>Z-im40;lFssY#dYIRZ8GB0 zm{?cx{N2?cLnTq!Ht9|SRVP8)db?;wffsMz7Jg2m{-BbRg-MaImW)}3 z@@lVzr0BxmxKwW1s$Ww|4UqIoA0ha^Zlw6>zXbHjWEqb0o^=?~xD{q0rhO?Tj*LGn z|ITucrAFORn3+Lu5M$58xM=SmcC6G2_uUGNzh*!1x_J0;NazC#A4DP z!~t$6Z&Ld>@sFk;c?0i&RoZT)7T@3mSITR&`wzz^Uf3`SvXEdT<#rm|^_B5_51}24 z=S|@*DXt<}P=pF@?&-=1?}4R;<$Bq*vL-iz8>Xj8rC4URg>2oG?|A+7TTOSEryOI{ zlggZL(F|(!^~~KQ;V+`V6@f?r&`o9j)rDn|T_O73EMX{%qCJ0}kK8I|$NS{j)?Yx! zWW@8@=l6aa!0J<}{+T%Tok9f??;ljPuR}XNO#Z4i*GUx_Xs5e7mni~8AiWfQM?h7d zRO~lXlI=?`F&i|drm5Qe0+DIhb#}bd@z{j)PC$6JtNd1>C>JdVfVaOrG^Jjqw7Y5J zPPr52Y7gJebbl-OjR#pxwA}k_gezqCRlTyHDlOBmH^gC*TGIm+G>P?St_5t+qjo28 zb<-~uFcJGJX_trefh+~}5y4fG`IOd@il#r ze>wlj(p`GgcJ9}Pe~gIImL7DDhE#ATBCuto()QlA)QC&OE%EAO#Oek-kIg9Lcdxw{ zj5RZ+N)Ix0%LC138+a};uyJwyCzO3$JYQPZs^sCrBHPCTJU2{QwF|Nr7t^EzJ?NLF zhv;u?zv&LxMNM5adqa7QO+^cY?q?a2W|SJVpJQ=W1ex?CwAw>D&<5PrDQ&5@j-ohx(1jPPBROr z&xA@Wd&J`MqHt(g6guqG6 zn;!SA7iKC>-3=2%)pEAUYd^cR2K%vu1Z+@iW@RPG{ZFyN{lc^^G6ONvmskZ~=_VF& zJl0s{s86$HV@hLjfIvv_bwc1-DYg4*V3%zrSw}wKD2wH@Hf)YkT&YB^SBUo`J+A(o zVP^)#G?Lzpq__19stu746$kpJ+OVi3EQ5NPewrp65;kp%JtkeNH67K2HCy-DF@I!n ze4aJIK+d0Y2Anuo=TRfFuBdOHXHd`Yu-LT?$Y3~C_xVma#lQ5?=9x!p?8GUZ#TlNy zhYPaGba$)F86q_1?K!)bbk4IgO^&}}qV-f+;e+I{V$+b2l$h-A!Vk38>+RiL)r0!;E zMQa6!OS&Yu+EQ(v!8i0&bRSzt^-*@~aPbzU$cAt2G$7O9d;kzo`Iw7JeVs>+^R18i zr8cZr(8~IBm`gdEf8h0)F5T{CKbUGXgutiC-&5)UGSH#^PhKVla) zj2|tT)2UBL-SZP6crl9b<41-UTsN=1Zr{oOr!SUnK-Whms%>S29OTP8m+~G99B=?3EKv8sR@E*!u2FIrs zz*N54xz}Gcm{dVf$|tw3);gmYihR3pI%D=k&Pi^sZELG0*`*k2{9xRsUIMg)ao4iBIJ3o!434ulfD>E=;o?v8U4BJUq`JHO?NK_L;T~Pob zVNsqHZoyZbZq_(My_z}9G9s99vq%pdR_a5eOp!ZA^|-6%F~(O;x%=65A1f3?VUAe^ zu6(hq`9&Rxx}-FhgM@-rhGi$s@imYKu>882SjlHtaP(xda(k z>!$OGUg#56sAO^q;3DVu@N5k0foI)y%Ro4f_={Z6;s7?YF`lO4Vy;$4TsK?qDD~Gd zyv~qY?_@v_TYqnZY&!?c^)>X+!bxdYa^G6Kb6=Z_tLKUo-0w}6w7jMWLI>M&(9uc=YC5pm;S;k$Vm$Ea0*3-{|D^u_k-z^Ba^BHbCyw%M&HCdq_x<+a?#io$-w z=arbQltGAR7?6JAC}hEAtWEmEWMjIc#^;20DOxEfI--e8s@O2zSSXrmE@cjN^dYu< zo$Xv8>`6BTO$l9m?1g`omFJet2&T{7P6|{wZ69Xh`e5r{{*v(3)7K&GcVY%<&R&Ad za1iLZG#ekPS6yGVs(gM@D2pM-Pn6Ar0B9eJz_Wn;YfgHW=SE}Ric=Dkf=>*1P0MIe zcNura5~Wn47v%k)9k^s9Uv0Cy=$r8=b#Ysw_}OS-R!yH|_>2Bpb}oLJC_q55*v)`H zo^MG%0v@F$Tz}vL6V#<(7(Gi-AsuLL60O!nLWHvMsSA+=6tc{LEM^JCCB8$fZSB^E z1bLcw^<+GW;xJn&VmQ5hr!Q3B-H41FRHo~Q&?7tZaYFntq=F@{3c+bHR zOl6R#+%nR@s7et;*9Xt=u2wmH3$k3-8A!k&52mcxmxFMb#5c$Ay;JiSn{VWJDZRxB z^Gq zhYzf0CY&*^+5_A4r?)`V<2vAeRMu-^o+w7Q5kGIZL>6Ta4|O-Gz+WU?dy8qT)YX|I zXRBdAC>5P8JzZ?c7Aq9*iPA9h}RR~IV)s=rn|X|{ah_o zB(ol9dF+=w(<6G*T-wZN{QA}c6$jjbA?fBFEIG>p4qta)?|4HS) z3cBQg&+{m$+}o8(zCvQ+07M z45>uNvr746jhvwD%t~Y@;~5~>gKf4P?^1Ax0p)lHJ1cvncF*EcX)~ z{DlQJEPx%y*mrYLrom}H942!etR;fk!5bt4UJU^g1^u-jEOp2SzU>I33&>Gnb4U1z zVmoFz8a(iRq{IJZxtQu08A8HzLONDssG(huLw|-omRYzss{a7DsRt6lnPE+v=$x#q z=wheo()Z5BA44Y(`eBt_@HrNaryr*=0iz~ZHb1&~<(lgat8^3jd=ZLi2t$F!jod2X z*_KLuyfSNc3xz;tvc<1GB75`TPX>`?4v%Md?xnha$NY@6w>IPF5X7OF&*f$*5s$x@ z+BTixLQaly`a->>(G0jWoq3He{;+PpOROH?n4ee{Ld%ED%M>-S*R;!ze~V{Jq37~9 z-=Vu%z%0OY$iBce{Hewa>9mbtsktwK^a>&t|sELw_Q zPE45^((@EqR--^fF`Yd)GlPTcCCT02x_4!pLMP648HaLCv&05!7)+XSr*8_6sb;Mt z-x*x>Zy9b-;6hSjJRhKJ=M0+bbJwZT_a*W*De&LZg4}Ub!EFzIsH4NOj0@MJNJoX< zh2mQm=`g#O`;VO)G%e;_)TQiL@Voj;0RRvH^)Eehng3bmU+C*O;b{PH@{0j_MG8(n zG`J1)ZSb#zy-Rz?$Ga)iSqkl%NJ?s*#t%_L(_YV0w5J5pH&_}DgwTLZYC;>Mk_m56 z9())b9g&T1wcV#^>2$zExxpX>=wfyf-SM2Hv&D^rtIhkDR{4KZ6CKuR`zS5G@2YgzgT(0dmJdu?7(Ybr0zEhUT+@{xX&N}4uO&LFcGi$h;56tLGHBcmY`H#R^)hHQ=lBng z)pr97vQ65+{5oAci)T6=ogaDZaae`|%-0gx&uZ6-#x~%gs8g?SkfXSw*P~?+%{GZh zB>&r9v|kCt7TguelIxOkRexbJ?VYKRG@-u&`~6hX#`){KIfO&L%l8ZTFHB@)0$c({ zYA?v@WQzZ4NtE=t*&@^ZLaVb)0o9M(F5xL1a-EaJuqc|X5^VoSR%E~V^RBNFuFe@~#T5Ifd&YSVKyD;7GHIH~!@s>;L89kT6clvr6}hOL zpsxABaBW&}O3y|r&D|?6GWTkNjo)6S3+@nNSflVVQk3_KJJ#DMjXRfNvzPPMS>G*o{TW1(b&T9i)F>iU_ zHw~1jz8{^g9RN9NxMN-c-(0mhBBpqr^DIg#B2)S?U_NteB>S`aZXcj?yS^@DqEU^| zdI_@Ph6>na!8}PHls`Kmeyo?h?c(oJ=&co{#~(CGn}AU}FV+$?<#Ih?g#vdfRO#;t zfKJ#kJe}s{{Om@=4+S6Pmxv1G5|Lfw857wGZJ>*89~&5^IVvJ@)>)3qQMwMLUtfKk z)h1TU-DHyr zT#-0e8-fF)U?8;6XJ7YtT*q`(^}hI0YNaxelS-zNBAJF$$sNb&@}Et2bqqR(03{mN zI*|Z!HUoNC3*?O~-X+k*@twg<2v}x*FfWQdM_e7`b>p_B=hXrByuEM0!r6HkO0*dH zaf6pzv%M+>GAz27h{NJ09^5RU7=t7XhHt!Se+Ff0qPxFcOzg#afWnwfu&sG}=6ir%!O{ctQ2fm=(>2@oWF0Mr!FN33*BKVY^!?7pMfoH;QK zZq_QF>Y}vEgiX_0Hj{)vs;j3eLlwHyjP33=UYIY@-`+M*1bUEZnm7KuB2&b=yY#S^ zW$*cZs+Q)~xGLsS*poKz9iRbSQQ%#=gwwgU))d~2G~_^+l< zprR2!Y;!P12)A-`Il)*kst+@-8gzE^Sqc+YHTyMX^0~q!6TWZvZb+>hI3_c8p{On4 z2A>`Q!$5egAxrpfd7W_wp8Hc+kPU=Jz$g)*gnq0zMH!H2UD->+Yo*9Dkbr|VY!kbP zne)U^CM0adRUUfur(@|JCkHQ5=D}k6Tj}xvVr|Yld|sp7c-i*236dVfWK;7ws#pzV zqJZbkgYFunO-YVfCyXUCzy8(rbeVq$Tr*Jbhgz%Gw16TK@G>M3v$!{sA##4DgcOE0 ziwoo9plL=fY`VF5Ht65TDYW2d(OQ|1O0j{9o`h}K;!vEd-R%{i$Jsy)yGyV2%O0H2 zW&`FNYbcCnf?Y027S{b1?paz2zGRQsO@)-15#tQkxrH=96I#T^O!-D?- zwynXl=RcnpF-q3Q`@?e&;GO&`7hIU-f>u18GRgM8;!dsW7Q8+`J$5I%QpyePt}L$3 zFaUOW=ta$bG(IYevT+VBw`T4h7XWi+#hzYjy$Dl z%OxhCcs(F;tKj9jAoI&fwfV~-T%Wt0bEmmg?IOT3MM8J){NtZlrSBcnC7!XWNVdsj z($brbVB=->{5m#ny!H(4mz7HL`fldwZ};}S!Z+4hM1zH@=Um-i9^S62tIfsMaVeJ_ z?t_SjV{|LsgM?d%!`P$BuUp|aqN2MAL3#x#Xn6IT`HC1~rnR8&PW4fV&v038$M|}w zXb>ly(m1_IuQ!NXeY{tGJnO#+$LKY`<^BoiCYU!=k35$!A|753d46-!)yknc7y*yG zPG-1%s@QntsUn(=IM6%y>+DRVKu8xo@(^ZA6R>RK0g8Xb)=|QgNE@i zXxi+eT!^q(T<8w}48qaIoe?9x?!9<-(%{UkYhbvHF zY$kAJHkPCj^8P>TO6gl*WG7$uO^Vgsqr1L4 zNmX;tjQJc(x^iDtP$!`dIUNcHk#x8EQonvS^~mfZpyw>FfU@sf8~@eYLhd5_?4xbm zvZH?AJm8?8ifIj%Rn&8S{y)Gez`YQsZqKxl-g`ual`%7i%{H}u&FIiW<*#2~mjzF1 zX9zuRC8W1TM$o6GgAC$DGMy^?-FY;-^oxBo8hXTgsO->OdBl?PfnR!k^y>nGyC?U=&5-Z915XJ^T_$q8viPPDXX`D)#$2y+@Qt(>Lvjd z`~ce^*mMGW&p$zzTJgyf2?#Yw=?rY_2fyiBq&qp^KWpaz?F~wJWI<{T9s>vh3^oa| z%8pFoF=#2D&Ko=2BK(32dq?2P9r5q+y}TjEsxG%{QlERE8|j_~Rzlz`t>LKfPOeb< z1B8HNz06n2#iUUY3!e5{$&Rx(4 zb5)#Udwk^F%Otsb{Ap5hZh|}@{a8&d?Xmu+j>#{sWK~V)@D32~Es*k=q$BwamUDSV zsYW+zg$sm4vF00R8bO>P!vh?JO{d0<-nQQW-oI_;Ece!vVqkLEiu$A0Com$W{rYZ> z8|h2WIkP3uun74NfC25-aJ*iai_&OsW*Wb|kEp)ffy4hBuB?`dv`A7q8gGXmj4J$g z-^E&nZ?of&#*{XJKO=k(IbJ@DoP`F*xsxXlq)a|@LdkYO`mWgaB;zSgdQs$l^9#?#mhe#r(d?^NPj}x&%#i zT~APXB$AC$@08cL!gmP-_|y{oGKmmF>&%i=aQADns=5L4nh^>kw;Al( z3G56-(N&$I>dYVc#9_lW2nv?6(%n3|bE)M*t(ne6jwLS<6G>bvC>LUYW+&|4j=!9` zRaiNU^hgNS{Ojh= zr8U7W<=B+@Yu`8h@HuAG-eX#}P!$@|5ylEd{fVf&dHBQc)QY^?2Kkh*pj{Ijv^l?O zm+>0JANCNhuHn@Z07)2Ffu4bgN_z;hxm z!0xmb9n{z{38b~a20+IH56;?x{Z5mD=PTWt2nvaYt}Ud9^8Se@sZjSw;pdZ8pm`J= zNnaPlA0qw@ifG4LyPN`tqu1Fs!2fOqP@c>BZgTUQ)_5i+`vSc1opflQ z?yO%vMmYSktpIzG3cuNCSSEvJ0r16FqAtTMa9^Wv*V@0_)H@Lwxi!;3#SOXu zhCo3?+5>|-?YLR4OX?z&r?FoF9^udRJ&E_0X_G7tMOD+ET$$Zzd8&>Zy&nMkSdiW$ z0uKL6|Hdnw1`lR%VYDb-a;mF22ypNPFb_xm)#_KOe;+l4oj)pKw(|A&!gQAxJM}|G zh)L8R-yf~+XzTF#Vl{FvrPY_X7RZ#AEF5bC z8~z9AIotio+RS8&Nj}CqM(L-w*DWCKfIBP0>LcjzPnFQN)pQD0ivVl=G7)+#yYb*6C1$XTsnICU)=P?UCr^Y;~2S zox%}^b;_&JeGC$?+o?dx*_i))i;ds8^GotaMS(}7wPg2?a1u(>SjMyRr&YvhG~ge} zeE6gE-nALtQ%Wn^2HF#~IkybO&P8xaA5t)MC*3wD)1vk%3Y-pS@QHlvo*2J(p4TQh3#rgVXV<*`ZUlnb{-NsC$4mk_S}m_+ zIbJHM;-j&*?I!vZ;O`GoZT|xZX|tub>wfiX=m?KA62Xn-ss9hZkPg^h){&e$Ogp2LGEL>0*OmuuC5*4z1SuI-XaIr*1#I zqxmIeNflg?^q}o7zY8O}T9bcHCWdHV?AmXgK8MpH1si1@MlRo&X<1ArkDs{^i39Jq zBK1t@R)(KkTV>Lis}IL(hH{53yYpLbvs!T`<6xLD_~MGW{z&3pX8Xp^DYoYnXPcBV zY0{>@xeZ!qon~UMz4y;izcy2A=VNmU(#bPR%$g(J@s4uyKT~es}#KMk_(MxxhM}!L{)%(%PVPzG-=@vi$-c znWhj>7xbW)ljy|_ornJ0?nlCP6k04g$mI=pYd`W>V?+pA*(BD54d^0)FT?9xjkb?- z(V?N&Xg>f@oDU-s@U%U;1aDzyLyDtyPorq+&6t+W{sBF&DA;4FrDv{L`k6sQI=>6O zg-TTFzaX$pe?xyl@~FiKWGG%&e(M9(^xS_K(<-n|qYVQd1_vDe`GGley_rSQ+Q5}) z2t+3=cKA{1?!NP)-L2EHpcwO6aRdH^vVx8H8q&^*B)#onCC;Lf&VEfbF<0K{?ot+= zyC&Eh%&*Cs_JpScJUAmJO%aq|M=m}y+#>A59heBf?#~gN4ZrV~6aigcNcXl9Luf*> z1%}^MUYGs&>?qZFv+vAAg?z2X2n_e2A;fM5eOI`>(jyD@64(rv7K+*WV+8C2+LFY0l*Q(?;jR`!S}zO=vwE12`^ zH{AfV4_sdm+180t_={rIjRjgbKic>K&c3Z#+W=Wn*Ap!G%NDgdo~R)gfgTYb?4MDX zJ6?5rVWRLc`k+b2^{;AeUx+rJ*>drj3UHXoAC2ORBh^k%!<`FJ0J8%7I9HR!jik;F zZXv^uiO*~hxxD9KEg3mC_Y_NH=02{q83+YfbG^P6$o(b}TCoxHRRapE;WNLsLESut ztXg@9ZhMg;JqhR5h8p#1%LvUiWGaXevhWyD?60@KC?L{oX3=r;;k2jzCQ(3!eLCE_ zG4*PuH77o5!qWS*q-Ci7nh9qt4z*w`+9QxXbtUj=0S$vWCteBHtH~ZnqE8!a3UE97 zos&6>_Of$>^SM->=to0#*slSQrJg0tyFFa%MdhRe6HHEwWZQkVVKyn*y;9kJziQ=S zZxAHjKirXYnMc6aDga=MXeaxH%;jKlYGv~ATKwh*#BP(MWa zQf+|8)=E;eN;r9#8r*}H3L=91elo%rx3gdNohD*6hz z^39UNxz=nVQ}jwo?Xyfd!?=`)Dl5G7c-pz;@}J!eh0qBNsD$y_OFuG ztq$--k~+pV`I+4fm2Z4NLP@8QsJdAk^_sCDcv+Lz+c_tOK&&`z=rXSw5A$*hf9^B| zLC4VTIiGeQjXswN)XYyP$Po-)c5diOTZmNrgMG*6V|W;7?&k&8djurePz z2#7|TAw8ZkVSzdi(INmsSjg(6{%*e#S68n3OGLl;$=jd3@uUg_E2s^%ZJ>0+A;&#% z#+mD)Tz82=mhDD_Cu63cw=C^-sgM1`-T=4#$bb`{G{8vqm*psWfD30#c5w)gv$NziAAlek;>*_&_QX zc?!dmrR`_LcpA1g5GWDh49(sLOKkqVc% zm8Tj;!DqDo3o$;)e4h?!*J+M4%@cWbshMrs2?x_6S2LpmUzyt^-w(O_!2uD7qX#q8 z8mdBQdk7h2%DBp`*<(&Td9H@P=KY4c-aJu8-Jt!W{}ma(poDNf+MVZ$V)_}4kUx5E zD>CdP)l9AbOTBxdPZRe5W;i^RO2fc7z|vYbh{MRvP4yDy4HCp^cG2(4t44U1o>`;on>WH@Dgf)hD*s|u`)n=ZRjp2)SbkI88x{zs5+d~h z(V+`BM7_+EN)G7}Px4I7dd z?{$nVmmiqIp4^!9T*7#0ksj!8?}!fxQ^t+YIK)(B<8?R#vp*-1X@q-_RulyAeoB9r zWScE#dIP!Hcv|064%Dhb#p%%s07FUMuLgU5Lk6!_&6@KMdxj4eTk9Qo+)KT(Q=1ov(e^-8;8a;_Qha|wW ziHHtdyXS9(YFAx$f~ZgT>u;~fCyKHHo~?33Pp%YP2=N~PS@jY-81TCx?Zyukpp^GD zOaOa2au*S@7e&fpjB1Wy3OsJ0q;?a#u~mXNq~WieJAU>J;X}!T?ICE=%bk&nO4phx zsd29v?*LI;b-TGTa*4CXYkq@tSVDaUMUyHlWE%T6OY4@!o_~jil>Wl|*uKM!1O-a} z-n|8);#L9E`2t$=y-*t%CMOU9{&c4HzbT_-;rGm7IaX+&0~-V8f_PP9 z7#uFleW!gBewJq(TyfD@Hs^nU2BX%3Em`4D>2?0*b~w)GJo|a|Jk(Mej%XE)*|J?36Mu+*dtxXY=(mSJb~*-WTcxcEr+$etwcMREc5ZIc_qS zv6$w-h2J_1^<|r6qR5_XB`d5%NG}&XD!QLlt(Kzv6%4A7ejlqsTjzTJw)LBawL?vq z0tE=MR*#Kf1Z|H^I`KQU}!?(QDX427;E4>Ssp@kM7jHkJ(v7{?u z*DKjz%>Me+cTvhbp*wQ(Y(>$_+yk$MlRSjNu#i;N2^tS8gs%1rCR+gz{hJ%_mbH>0 zstGxLbxiggK;c(){P1^04e@Vg4Z@Fndvv7Oy-q=tQ9<9$+ZN}#=EqKT+?-C+^_0tE zr?m;l&UpjnXKz)Wmf^%h_ZyP=zSIENr*Re$Xe_z1tLHTFO2c$nID-YsYlR83<90m% z*zhQe%YIpmhFvRDs7^y64dc}j(luX05BTmEB(Y*NsGlO(_q$e_4hE=uX0IkJ3>F6$ z&gER{Q^uTMVVbE{Wb|c$Ey+U_1|h~Gso_1^PZe1KDeZ-|Qtz|$vgt_ho8M2RR>N@Pa_^!dordK*`}jagEJ-)a3UW4N5JL6lIOmF|tvx9TKGn^dXa z$E8=WC_3Qoo1Wvp?vSG{dB>pS72;@@lMF<-uJiRAwe+<>i8l_L|qsK=4N%he|n&SYwao_pryHU<-hxy{Qw z;Dkkc5L74Cn$tuA?I60(y>JpuQh5zmKWJoA6RzI=cFHW{@VW2{i0Jg;s6LC9bayVv z+Pt{7F@qJ+TdbsA zHft?#rT|cY9nOPzw(0PwY{kLRI_p^uhJPr5bkwvh>qMJf=y?!%`E$yjULH3S!2J#& zXrxI3CRT{KK94fy6K!HL5xQ&?+UV-n)c>cGBS>>Hf&hGQJrb9z>#>vz%sSKmrlA7Pkwd zQLQCf6F%P7RWG@fzy;-5Q`P0ose zhb?u@;okX&1^vb_Px!TW&t=0un9T3$RN>v-?YJb_l z2@dUq@Y78GQ8yR6?os+QXp0G z<7gfLW>zh2GqcG9g7|cdlW17)D*XSGY6!IfCAPS1do>;4wP*P%Amua!>Yccv%% z6}>0F0c+)n%5Ov27n)6mHqg6x`Oa#9s2ri-8s;h+spW}>4IpU89al)4Is5_Ghm=0ql|}gI{u_BNrGO zCEU&zRjUTS^18L=jhEi3va%I&@oY5e&vmrBs7?H4IlWKj_`;RXV#3xN8W(=jPWde( z9G-dJ73!75Ad&E4cS0)@vp7jXLdYD6?3#7xLdtWJz zl5$q^H!}6|-GCG%6U=sZVI9@JKLj}5um$i~oO57udZ*DjLr9}^@y;-VC;W1nni97^ zt^@~{05tn3g7HEw0K*NIxi%ZpJ1*abi4-tgJ>;)9eDGRhxv0pKxZHSolg9@@K!Ff~ z#tMdCCV)Hth=W~HF4Aul?`@hg{em!@LLZJ}|2Cq(O;av5r5AYp#P?fq>&+*v(xz^6 znEQQg;g=&{FtkmP?@2)+m)T$-ug8}|wEczA%p0+t{BL0#aW>r8^=O+Z{ab!y7U>Mh z@YZRxotz-IAaJ4h!`@I}5T$>nyB+amUf@d*xWYA75bL@HAP(`ACp_Fw?J%_vp%P^@ zvdIjCgx!}9a6yh9$|-6~(48!YjVX))-EuSOaSBp@a5K`~wqo*N|N2Jd^?oTfJ7eoF zTO=p-Jf8-yapNWrKM%5yiPiW8>5sZsMX-D*^v`FtMMOu= zPafdL1tRZ0aJhHrUzlQ4Bd(LsA6#ycaG$67%}FB53m4I0fOmR)MJ3y4tiiIUrs8f6 z+s^=VyC+?fP5w#HcKsP$aGG*S=Ua`#h^KGns_d;)Sjl_CZ`4)+6j?Y z*?E>j6`8)FV2Y0!f2)**04&gx6mJ-Hq%s(zVA!*Op`JadVR0r0B%lfGKp}`?lUocq z>CBWZsR`#twZjfA@_c9sb%zEYxoLn<{GES7J2&?nXU~g8>@I~lnFfWSE=6+MvS*yI1VaAa#V1Iu7l(WBu zg;ZBQVxYH8>f>NV@INo5LzQZTViyt+`rqcsub&?NaQc-t-p{aoqm%2^{;)Y(Pqt+u zi2%O)9@}jd$xh+K6)^)1m%p}L$Q{D|51>D2jgdLd8GJaG3wR-dt&u(vflXd*VauwX z7F+of<8~aD^C}m=;mi%9@U)zXOsJn^_(Smv)0zUZ?b) zt5&mb>G@4^JM612{mjdVyUxuiC*S=z*So8+{P})s8(1o2B58!C98#@PdZuwx2(plA z6|c;UF|Rst3a)Y55p{DpqgAMIW6@aJ?5(){T0=n|@{bVq?(3NNgX@O^b?Z9?At9WW z?}>UuHDUfn832NWS)52%x*DCAVt9VS|D-v#N#j|&Zx0s^2wA3m;9*ub{D=R#;1}%| z(vA?ccYPNnvgqg z2W#MM7&6#bBa@4rb~7i=&pfLyI_011Ki5sFv>I%CASa3^m_S&x?;HIE>t}EBAqW3L zWHfmkOMjU8g8*KaBT8*2%3hELhaBgXE3tW4#&4 zVWHMG68scr`9|pnRt8Z%A8uK$8y2nKl(n$cK$jHP{k7*2KCf5HF;5#a{5ag_KmD_` z^i}Obc$U9paMs+?+{HP8^WDK{5D22b+XskLNNW$dc#7uZqI+L21qpRuSRntBAo~jh zz3s2jT$1sCpWUV#V3;tOmNj+EY<-MH_Kyc|DCChd++~@cfYG-4&&5*L^nU@;7G4gMC^WiAq;0WV3Zol=}Sxx zA9tPkRwa>9`vT>|@)F4=ZuW>I49HNexomy?a-dFLVVo~M?yBsjG8fs()yr2O<^Dus z86OG=4c52hLg4`BbI`yJU48QELErkD%NY%qu1vpS1PFM_QA38eUy9^7TaOyrHcwHm zHsg3?&x5EkqdR8^a)nsQE;xF6Dcj9Dtfp-~Y00FMajV;6Vru%LxT~!@PkTn*t!tEs z1!DNt??SnTjNr1eG(PGE)ayj&@=@%2kH>J0x`1`XTWa+&$*&09tW9<`COG0N027k- z4SKB{;5kRE!aydiuzHQVUr*O(jh8?j3P6&A&T^sC_W-nr&aTC47Qa86epMyHJzCE# znVF&gvZMP`FQ)GIJizomK_B&=ZV&~)iHfYv$#j5sQAJ^xjo%p5Uc~UCXSvXIQmM?5 z;2rZzVi);)-pk9WzEJ{5K=h1SEM(9-MrJNO=h`6h!hMNzd>vo(eGQ8=NQ5Z9Y-_4Q z9_K<0JTt&OFB%ZRI6)fwx3g+2kjRf2Hy3$7QLAL=D$PX6DR!|aV8aI$+L2*n*fZuC z9dnn0=3z#0rI1!Il5RPqT5{47h)kR4=0Pg(Q$`uLa_}S7G1t9wemMM`xs*8vHb#$6 z3VopMfejdtWnDjm@PAV-{9lyGq@4NZxY=&36yPbM*w6xXCieS7x zPO0tD-Gbhg1LED50D&jiZnQy!^ud;PPga@b`uPF?QtN_%!%^fGV_=J$pwuIqJ9qIV z5!4hVqxe#6qD%YLZ*);1C7km}&`AH9@d-bE$48TnBEwboYliMnrB>|T$X@gaEZrPl|D z!p6I>5iBLm~I_#<$5P z%}xaX*O8w($Cvo6l$eRoa|*mouS~xbZRgf-kNC2E$F# zO75*bj(+rW?eb|mHiOR>M>F(UF_xo&huOzin5*{-^V43|#453ffcd?8-zuK1<9C5@ zwY$n+L)cYh=YmTFf{A`L93UZ6!TsWrZNC#LChK8)y4E{<-8@^ux;RoX?9|kdI@a9L zNzUadr$TfLzo+68_pn4sG}09Iv@ny@qqBg9`WpX0K=11&J+5D#iwGK-ofmBdD{I4;qQZ(eP;DPPUk zonr$u;_p%L`=MX$ZQV{uBr&dSo)!rVcUhwonVHu{UOU#N1-1;rG3QJ+-h8=t=L5gS z^0!Zh`ITig?=|{#uARPb>0?R<7r$?spUC_lz=7js|5F{3`rs9HUt0zC_yz)Vi}J0Q zxqQEBVeBl&+2oi`D-bbvzfu3*{K8*l^pX?8>oM9p!9ni)Iga9%Ryv{L_4bCCUYW)*qr+^KfEVDILHrNu_#+9`;wPdC`ZkLY;UzGD1fzr zw&1sQxeCM*kq1+fzXOy&R1rcjn?uOCK0ZY>jqr4om`%E~oWYZ&{s+I@VbHd0<5WAP zuPJ;`#u*5b=jOIYvgV=SUqcd6+UmU$A0tXXPg84xz-zmUj38tQucxe!ipm6CMe#G{ ztv*a-c{E=6u?A<}t2EWwxhr{7S&eO9&PB1(_-*4Eln9@x_Vz8;SlmaY73-RQCPu${a6O z9lL}w4I^*dw_{Nvr2Tg+c07)XUc~|Tlmg`=?zUWvO#6?2GzBC(lYs<#kieEynic`L za4fXe*N}9Gs#uUDuAV64<$Igua32C~1vR*-_%@UyOCb{3v!6trBe16LhgYR`t*b%E zNjd>MJOECO8o+>87C*FVtH)hEF>QS+B?vS)M+h@=Vl8~X;mre-vqll#uy zJz~7*=-IEl0)=$`@N7uu=n!3{vP+u5KhbPxxc4|-Wa2`q{Cko`sb+~cAhoSSJpS!| z0&({@7T~Yd^UT3&L`983uC;S3@xt#$%eKZl0k+h{W;P~zV41U5qs&_Ejt;K?mW$)f#`_L5!XJeXGS7yRKoQUCTTOmf$MUh3IKXSzCk>h14Qtilueb-KPaxA*Q> zly=vd_h&AOsMbQ(>tHfCY=B?^qatcOJ}tiPM^XH%c%KO;jOuA3?q*(xt{0IwEyLWN z{$33Id0B0){j3i~q(>Pgmt|%ZMTsJl2uCU`S>nkHhO)!(X2rnIE=wHx0>Cx{K!=bk z8vzZFwf3W(|28e+Vo}LBcq4-hq!N1SlCrb2DH;t>c8cgvltKspRop>mqS6^I!yAfC zZW^2TKhf(Q2B^K4m%lUftm@uVICH&?*9&Y}M8gmoSmwj!DDam|k=W*2=#*{6OYsY$ z95p*kwo5fw5j0?Qdr^GdFjKznB_4(Ylhprm-i~Zj#UJ+TtS{UuKKW7HKhVQrWiFyT zD`2C4Qd34QPd30Ww%n*S3U=eGCynPK)T6I`ls zW5=+O;^m2d_~Oq5{c5|lPg&LuXwOcQ4HO@QrNJVxv8A+#7fu(_|GO%7{qZcry74Vd z)G-&du?*d}(%l#}Kr;TDXr8d(YhQw!3Ncz0CI$7F<=7dQx`&cEaW!V&oLgSC7qtDN zNI^lgrd9Se=ykQr;pKrs_B%K5Ny}Ti8}GB0{4{Zz$WA75o^T@arS{->Q?BAVe*h5P zWhtQ=%>8p}eR$-0^&PBlxz^bqT&DB}l7Wbj6Kb4j*!`T?#&-OZx4vgbDG>r=uT5dsDOyjTG^%EDkJ^bA71}=(96sNq%+T zB1fKST6yM=alat9!x2tdZ#}5D{jG^QBmySd#J{oJDvg94e^`{N$D9j`yv7@@WL>f> zLrC~lA$xuFn>g9Cm;CJFhjd+mk1HtE5NdQ3?Gf;f;!pGwWn8iw8$c1WjNCVLH90Pd zjB>{6l~uLE$?W-5M*fLSv5ABQ%GK-1`;&*cBc z@y%&O&a`EYo8(kZX>*+OF{hkEa;BW+oMRNtFcD%@a!O7Wa|jC?Ifil;h9zfmD)sr^ z-+y2~>~SC7_jSEq&nL%w?qL!I{pn6y(yLwAFJ9wk`~&cQktpq*aO^XYqwoE~VMW4q z-(Kx^jQI77?86ga9@-%haGqRh#yp1~sGvN{1Zn(Sj>xGg1HZa}d6nt3SF$oKZXfVn z3TB67Qk^{i{)_^V#2fDXx_15pwTvf42Z@)4+(*jYzM1$ls-FgZBPJeGuAi|G-ksIX zlg0k63(BCZpt?es0_ANE`AhYMU+a)_w1&zIjKH}FWo*aCeCKqp>|4tqy612yX+l*y~ zeZF*wcfX@Qj@;IKjLjzTzFfYGe#uQ?%el;CfI8p*s0OV6_dIr)o&;cHRn1%8)<2KCbF%!p4|su zq>9|9d~nSB!avboYLd8ycX+18e%+s>ZU8B%!<@4XZNF|xqOx1dc{0mIF7hOBpwwe_ z{S5CjMv2{hW;YGfCWZ9Cqw6GcCa9T1oj&#+1>HtUp5HJ({}?wgWMQ_W7>?F}#_Y#G zQMTk&>!LDm5KewH>`apfNci}axTo<=TX}=I>O&`GRN%kp5l}>lA-^(L-xGvU5uUIzx_9)_IE=W5kC znEM~ulTT#!D5vT|Vu67;p1%VzbGnor37;o_5XgeG>o4^~x<{HKTpq0MmU4ED-c9Z6xBXY@Xa~I=87YW-KADyUofaUqJ zLAq_8$i=3zIpA`qgIDHhG3-h_vzw-;l?^1v83olV1))b@vwhaTtf)SgqdcLSVUZlxaM&3lfrUC_Bf*{ zFTL!S_ItGLPb+`FF*X$O%pIbkm5xir?G^7FhL=5AvwHXEC%_xPE0kWxKnm~d?%=`v zhxJZsXinQevvH{kRY zNh84<7`FYMn^F(W*t-rq=px|C9OHr%_}4ejC9Dz)l^H=(T`Z{2Saue53JOI*!Enp^ z%CA=<`-|T3rKK(!F$91PMi19ZJ`wP9@!r*S;LsL_>)RlD;vN}nc^cLW(nF*kbSwHF z&@*H=G_M7=s}L$Gs>OXfw$K~1=#?;ajU5+1LsofC=^iidxiM;}a*#3` z&fMh$y@4I?7(%!Eh!*g8t$8o26On>bXYuqi30HiZg0?xN8SI_*-c_$GJ#kkzDD84F zxF$F>xX%qFH;AG=C$@phs>5;5wbYJLs~$-v)_-*UvSbWj=UQC&_XCZ<9`^}G^AyHP z9=-YTa7?DJVogCB)V>&G5DvIkV}H|uUz9s)to|L)NqC8(JqfZ3ne(SrCl7N79fms$ zHg?suUZ$%$edXzOnxL*O$1%vkK*g^0zDJV9WD5|Yf+W_qa>L=s#iO5QlE8a<{4t>L zuzpqV|Kmktlp5QwAFB7eN+D@)YkIQCCaUlJt^fTq3oX$$iwE}x_=GDs4Zk^diBdzbNi9muGU!zE`WUll_i#teo$7qSFiq{pwzp03)0LNb zj6}+fmPNpMyWV-mv$Ld^nHVSB(O92$P2G+ble$v#K=&>o`334{6pdc^cJhAaLHg3a z3nwAMtdVZrW+}!L2IF*QG6-5b&jA>kg`R@`h35Rbws!kH+Fk?h?9zX4QqECjKu&=57B|48x}4O-4E`{e&{h$$|@)45DwcVYwOB%v|&cFWq zI+H+}8d7*c)l^ob%+sUJ9z+QmqLTEgKkT^1 z`s#CO{h`n7u(sXlMR4YD>xl;FBya7uRN$lVW4wW=!2!3@XLk@JO1YkvgXg$oC#&i4 zABfZMyx`86ShQD4B=e=qg>xZH7i3uRujn)5{XnPhmhU;@qh#+Q(?0$O3PlF=G$|;c zhMDAxzpV@qKoj9|r zIZYLJZgTX?wa}9I>mK@@0emu9?HJ3l%U6o|$6x=^LnO5`a|?xdL1&scSuf~AzxQoK zm)Ovl3h!M*8gi`)6tTHhI_(jHRQ?DtPwa}_xU)7t7dV|UE9wNoY>epi{Sw>_9ohV) z!T-g7t7C{i^NwHx_46(3bMb6$9X5Y!0aK&;#euG98a5VIG5cdOJnMOeKKUy@syr>q zmrI`x1ut^tM6ZN^cU>B)oesh6-wncFV6=QU zA@m4=2Wb|ABJbyZeLn=XWtF-rr3D0%HO>})hyCiR_3k-}2pw8O&GH+iUQ<0th(bVV zP|6#jIXm-Ef8Gl>Pq75Y;EM@CXtF$^9jAWa5dHA2#vL3A$)wmako-Ori#w%dx-TT4 zqXMWOtPq9k7D>eYuiD(|au7?Ld|!ayg;qoGi4;!&e(1xBO)FxA3BFE7@77v#3Kg*PAlP;?*QfdMtScW*0F? zMBo1rLx@@-d@9`2;p>i?1eSj#e#rR zgfq2zwF1=g7{7XZNSs5GESNT{AZJHA39MeaMLqlS`=QVFM{^kyWrssh!P^ONSaN_l8ilNdq9$kcXs3X(KUgLiH^n2QatHr}~T z2LQb{>xTM%MlXiTME(LfeDks7qj7KFQ&a3Pb=^DQj1HqUL&<)9$y>vs9B|vs7lT0^ zW~xV&1wn((w@QB8=Bg@hbO|mrSM+6GZZL|5S5Q@sIah&D;(SA1=dwY`aT}c<<)ny2 zjQr8z1^u~Yv1voMd$yL6=?s7;L`>tLP0tbj`jMwcQO5i6%H;_pU4d$@QhP*~Ewg(GI) zth5xySg+3k9fpYfDRCNa8adL<7Fht4^OMN!mE_5t2ipLW(C}Gs@t42PwwNDVx8h$v z}h##xr5q$1clr{sI>UA?IvxQHTnc zc8^3{F1In`)3>c&kJc<^lg{^qO$qFsoovJSrdwo?TunRe`;~no4@eB08<&N#smkTxKB1QdI6?B8=4mP_E zzT-}QPJN-~-?}x3y{tnKja&KF%s=<^bWiGN%$iLQ7LF1-!;nU zvvlPg`C*kvnu`Vn0fp^!QR2Hfa89R{?}}3dC!*qe^qIRBg9%ZfXiJ&ze&NN+r`6XL zTDN7phQWPZv>%YT-Z!WIl8*(q20iU1E&GO}5b$6^!3c1vMBekrd@yk!Qxp36@c2jQ zaMa6M-%m?#_xL7itHaN--&|e{VwKZ;%?q|#hRNEf{kg+?@0^?FARLIXP;i=;SA_0G zfae!<&THa#st?vCDHvrC$T*%Z}io`gUI`(Exhr#0N4i?)j zg&==L!H_(JNWoSiRSU)+h+tETSYgTw1BmwZdFP>s{JP7;r+d2 z1hs|XAh1~XU;44~Y*7As-mUOubJX!lyy=+As{zDg7)eY4ONk6&GH*d%KMAjrmHoD9 zk}ZkdI!6hf!TdTGVqi8WG`%Ftec3(FKrj34ANz5u7eJ!!&mLy63qXg>sdhklVy?PCWf=d&6nSfb1^YDDwPAo4naVQ z0L+{e>dswX%L?rKD=+ey$kr>k(5<2v>pfn5Pft#`|M>}8?TR0Acrc?-K zfQ$r*&4u=ly_y%8jxu-nh7FONs)tlqKkpwe$x!;mQ$47tIObE5KBh|z5L+e>N9$CW zejel*=m#9DgWd^qzdeF~3*R&);%-IiV#fmAtP41C=MIt#s_q@^0L*pCGz3<6&}eYh zn$c<=xE2hYxW<2cb+}@0`g31(rJrC!4g%3bSA8222w9{r9;9W2}1b=RoMvzu=TM7@w_!l)I-ObnCHwy&p8$Z{7ChAxyn(m zI1pyJHI!~W!z+IpOk^6iP5_ULQi)YwPwtO1TC6^mI&GkyQ^A6Zevz5N3G+{$@Z(11 z-J6`yrxEghdWxq>i}!`g%`jrb@V3G*9k{(UKybEQsqudNB1sC~5+;b)?f$iUG$H&Gw4~p{;Qk=b9hNS)hp-6^@t=iu7H5 zTO-i-;a({w_Q<|N$j0rsc#?_+tHS)y@}IufI3v6M1kHKR;aio0l-qZ1!(s(a900=| z*)cBLA1o=ooqOV%ot(2n_)g>dBfopSt0B@r=Y9SA4<>h24ZoqR(I99y}si^a#Wqt#F_204$=HH=P@tKRs$I*He;GPE0`)>ck<+I_tIV8uz8hhiYm~4 zVMWalb0i`tuDEsbsjo`JjQfF*ulR#OV|l44vrBTU*a z%fQ{Cg6whkIAetUR`1I*xGnhlC+fv^=D(S9Zy=#(6vq?d2x-bs%O~9xKMX4e&c83p z#zxEnB-?9!-y_}bMhZkmy;6OuF}IXJxzXt|wQ^L-uDmJ!c0gF(6!^fGS2#_;2Qfua zS2ZXaNzavEMBa>|6#fTl6IY1X4T?k!8=XZ*(7XJb`St+yc);*Wxny_$(v40a8MhEW?5~7J=5Po7)Nn&HX0`|s=SS4J9uB9P_|8Gh<@axC zUPkP2D(>LWg26rfN8?VaTEsLLQ)66-0`(+K^X89um153o}3t%5K= znf{Lx)0s{5Px>S>i12<+he@D|b2XD?$aoB!qGdf2LZyZNqLx?^vHE^#69x#>NpVZj>}U%_8n+hm(*oQEL29 zgc=R6`e(u}`0@3wF@(Q+Lf_{BiVKQHKiNPn1m#Op)UqkODGtG_!dbasmLE}W5RuT4 zB^{V3&d`b6=6;&{7zs3RB+yIdPxm6-3$rDM zs^v2%E8@;*s2xhc`0TBMH33Ne2LDbrZ|wmdf}n@({J?CPrGI_-wdj3>h9l9%9h@ST6M1?Q&yvXJczOJ z%?DI5GWPV3PMuoN3{uB5L?vls=2g3vfT)F9eTZ1>>I1th78pbD8PEfsWybb17v-Eor@V|U|3E#`ez6`n)W@YYe-9_4`kbH z|Aoc#0IY3?#hFvF$0%TK#^$AePT0*OOS^6;f!XR6uHf*u&~3K8M858VTdv4gax;VS z@2{wU+tg7NWf}0$io9kfIp-Dq&rNnd@GC)JHIImLr5iz}CEh()hvb*YF=D_+`|yc=z4!?$onu5p?vvMXPn5S5(*4Zj+CLcooRq+v}k8Pp3h{Xz*CRZ7sg z4CDU$V-K%$c|-ykJPy=Hg}w4;DMaM+rcK?FDBH^z&HM5VdniSL$Nv7DI+9L8!6Mq=o zyIL0uI6h1~IUh!`dst>8M^@=75-_J9ji`bOQppM}MnzDIqg zwq{us#aqk@9zQ^Bky*|Rg403%-7jwpV(kJ(({;}0uNM#D;;(dkmFefvuVT=8N#>h< zl(W`PffGG6K_O#S80<{-VN$WIwdt@Rt%Pc*+K(qm;a>D=9j|=#7!e zFJrNiZ+?ze;uco1BzLx|V4)txoY>W6)T1L>&HoDU%= zXcw*XW2F00-~mi;esh!SsZ#LEQi!0|BAa_NKzFwr17yOT9&fLx=GP*}CpkVG_YG3Q znIMCPhw97#&z#BuiA8=>yS-Xl^4fXff_6s;f?WWAJ)Q%|?f%;N6hC#<_N!<5ZEmOk zK%S1VwO?j956~h(Jqf(~96BUH#oIwAh$Z&o(%D(PKyL;YOX%f%31OWd@g>yFixMer zAHd(Z1mOIl7}{AnXn!R6_Pd3&-4SyWf2m&Ci9MOY(g6*{q@4+1+{Ey! zWpE-kdZH;$j1RFeu7K#MO-dZ`M|E$}=IBGih41i93!!AZpUxR)@UW4}1L8)sq0>rbHWg}{z zD$=4GQM5Sm=J8WTkjM`R$U;9z{`YtUm|*Y`qzb<&ZsRlW#H7z47x2*ib+C~9$`nL|-zc1qhXVs;RiDR+C-r}T!a|2bwZ8lnP=J6d5 z+8c1@Hla%xa^}37_sDmTr{}lVbF`%AgJ1@a^Pkt@wN>~SP-mt_L7iyF?!t=-!+jPZ zYc{qJ31klL?|&fppRn2i@@+2v!?f~t+%T(jfiT;yhi7uo1I6rN<}-Ayb9=CCyIE!0 z8qi?#pu1J8I1U*5a*cBH2hx|GpP5fymZOOo2yYbuZ+HyQkakzo+*P=t|fIs0peO6!w z0IyP|F#%2#Grm&xA4s1LrhS^AxzI;(qWM6kXg}{>dw*Jc=h;9gT=y(XUS#_ebH3<^ z%=AFzT-IM4Z_}kksZ)X>XT7Ze;gnWLvGMW@iEmYi2J&ZQ zj9?ei=gO7~^jM}*FE=e>i<^zB59#jn>+sCiaVY!f;gb*r4h7~u8jwemGGlt6pdQH$ z$$e_p=zKNLo)P7VQYCi%A8a-|=l1joU*cf+nswx3?lw;LkmxKl83p}mpak}1b1fTt ze**zmFdIlkZ7UP3UBh>}My|ajIP6UA9*ch+aJ|A5oZ5xjlv6j0zL~oesRKPL=xJeS z36#krc`>$P+3*m*H|iTh9~>!X&%D(ZZvG=Ys|NO z+I?FoXQ=#DGFXj%+W-wi-ltvjvK|`!&JZZ`wp}iQtxZ38V-(j-n3odB&~`xXdnJHs z&8G_t-6*)ojRR$s=psTXAJ(U;2_{G-aUifF1K?t!dJ_S?BJ@@M(ZKr**)KwNS6Bns zdR(z}56YOf{z@6W&SNdNvc0BIu476{HBcj9NF-z!CHUq%>tj}=S$+SiSVKnqH@J}E z)NT+&Vt0{VVPR);JN8@l@N%3T3R1qAJaTh=H1u0dZ+z$H^lOEd0z3TyPKP9r&|6%~ z#<$wJ{QH2BMD;xea$leox43wH2pc@CNWR>Xy{en_*v;3**rY!|4#WEM);LOt$P3oG z?Z098>=r}kW!Wr4)Q_GpNXEi6#V;?$!M#b2H)QD2H&G4Km7>bo9CC<3v!%sMx8O=f z(3c$>nQ`6ML?>^NqJyI2zfxTjg_5sAC2=ymnde{*;4bkHW=-<};8}uNG8}Neys%dw zX1hL~m^DoXE&dbQzje#SODSXJAqd?iJ%{C*@W4M%9|n75(45>XuF$>6-8~mbUF{dt zaN;_ogx;K8V4)hpKHXT$JJ7w`VhsYKEk*R>h$5kv2~zqUv2T!=vS3agHLgFy>Y*9k z0FTLe{8ZYn@5F&Eq2rS(9mR}nV-*>s{!#L!2;wjpneK#F6MYdmO zxV(S8P=~Tw>4g})nbgj%wS`j=Vg$L%-&8v0-z9Ui#S(0R@?%k!GN73)8LJ*ZwDQ0k zk=hnWS1o2Hx+40mSzJOG-$eJ)z}<&9n?PlL1}J8xMSU+p3${U`9=zjE1{0L+$JE%> zDj!MslI9bSiQAXyGl`A5a?kR(xIlVOr`!EuNGyT4u`^a$VA0ym=A{QVQ$E`w7(sjh zj^N)oLIG1EoBXC!hu4?)y6W|cQ`F2LkYKgF+SR|s38UIc7_HdQ?1><77aV+cfDsC; zaG1YwHJ5=YXqtg&> z*Pn9_1vD^$YIi~I*^?;1a}6vOq9Kpe)V+h@zG~;!0xVPL)xZhpVI$#3!WQ7g*7)vX ztDiUabh9o(a(nUh;hd=HQh*os&Escm%%DXf5Cxetf8znH zEEa84x9Hv{-F#f#VnMkhfI-pFecS5i@BhB~=}(&He;_UF=M}~t&EB8p&@K{G0`bF# zo+gM`)Qu1b^}nwvkR!is6^YU*dDa|I^0@BCZe7=a{?nHC*6vO4XRxe#X-`mKpe?g;V1K^h@a(~sOXt!KMDO*d4kwU59PU1~7+(9_c-;M=*Mr7 zuhubq_kcV6=D9MC?cWdXMlT>|P&1luF$w-^vGY=Qy}ATXRw7DSvnws+6x8*Me#B&3 zmL-F@H7~~Pyat)Hp$}h46bTU~iqeCAmC`+hhb>wb(Mrf!*;|LD^ym#^eYxl{kGzqO zplxV>DI-OFy{w1||5YK0Uhzr_KDl3d?qbb_N&b-6Pxof#8nf`Nf#)6s-&TrsJ`vb^ zLRQ}I70#HneV+yLN95M)q<+OA=4EmEL-Nvw!qd{C#US*r=QSKmxjy2q^AG-8J8@ z07~ZD`SH8fffv>n#P_~G`ZXZ%)oXN10=H&ZA1qT-rf(+Sh2>Tagj+ypO%+OC64ZJS zFD&Guj}|@t6@6uPQToy0bB`OkSQK^$1DbM{Z#YyeVGh|D_AEdms&G~5 zN11?G*9wb?d(|1lEE*S0b(Zm;jA_RS<}=|1rxEIVB!Pw|FFjW7B#efx(wP<>~>)mruU%4+07K2 zLe2To>YeF6B337QYgIbsZsZG`4ST{SeKiwm1M5)|_{yf~d;UYI#y2u4xy{U@jEijE zMO@ejK|PS^{R`>KO!sl$?B-ax1%nhxKNPdEp~so?>W;@6_Xo6xV5SfM{%o+lhb;>G z#|;{>+_BCT_4sgsPFJ7(iO^`!_lR*cRbnnl^=oKF*#!;jmj)Jb;Ta(Y&ZVw|_Ml)4 zICVx*z;I+uQF$|=65XdJ2_>Uo8>j0UIo={ZV_wkvH&@SA7KKVd7l{48j<4z5yXZe2 z)l17}w&3`T0k*a=?(ocRzMvUORH#oVQfBuJD%q!tN-+EZh(y9lnM}A%(-ej+qmk9d zODz(q>J-?>?W!uZB+qP*JR>1jfuMf>Q<8fkR&uK?J^j1qpaRJsL4KUrh0GhV{E``G zcHyx1mc_S*9ybL;PIq6n&vr;U`R~~$p*T<}TMW4+rXVlA(5@>yD*>9E(2e^2K+zE4 z_0TlCZhG+!9$HLWg(PqMdTY3Cf_&4`F#%P`f6m}9917svH>39zv!wpkC`k->`g%z9 zwj6-FoZrl46Uq*9CJRA^a1&6j*L`Jwl0=ZFM1sc7i{JmW%Uki019`-&tR0i7`se28 zQckn9SYSe4a-X;!-57TsSv=klwAzz-E$7(flT##kK^qTS@(eO! zzvkCYvtD-Y;=yBvqbs2sL#%#)RR*qi)TqkSpyR>$Ie3H~1$Q4;8@Lm2zP-Vpy@430 zB0F3i)Q*J%XpHp|Z9lB-@aIo-%@%Y^w<^zhVK2SO7AB9J4nwN zWt#&>JrP=!NLGyN9^oS(Q+BHsm!^A>$Gz!j0aM;fZcCE?^)KvH(5Zl(_ILl06+H{O zYnFnZSx5*I^lcUhFiet>oQZh+3b8hShPm8FF+*KblAo$sU25TymYZ(XxF8tkB^cjx zzm$nmcBM3(l+lu*doNXn8^e$@qV7|f7g9+GJLp-}I;{xI=bE^~A)LVr_8a&sw4ih@ z3C&e#Alhf@&4Hz5p~z^`R{E_@@wYmcN(Z`t9x94N>)6a5xieGDLkWaTzp$@;iVo7L z-E_w@h1jz{jMIU?&aJV_R&W|XwzZfm+^At6jf9EphGO_#bDay2g<`3S@YgzYoHXIc zML7~mqe3(6Vv7%=`LVPvgKNf6=bBdH@uS8+zv$n(%l>_1{6xmf7N=H_94G^l2sDdC zp((NZidI?=c;#vahhS6J^($mEJ}ai2t|wyV3MVrj_BB;bs3MgvHz zojGa^#;=?2ExeH`DR~u|{T&&{3--O&-7qH*#L&Q+lNpCWF&wF*sD+)rUJ+#>TkDy* zhHjkOF7rYNmOGCfdue+*9pB{dMky#`kHS1^SOW4+2^~e)Lez47E4Yz z&p_zEswBIs-oD}!@om`49Nn4Ep`XCxSrC^;f2M(x)}utL1+rd(DUOsTE|)B^N}(q( z=|_?dYoF_li?%k~h_aID@B*?pRazot`EJwhzpN(=ZkUSmCD}MI;5-@uN@IXX)^mw@ z>!lFJCtOG{QbH|fuwudqo{03%#6l_sV%osB67Q1fToXm*fF30kea-ptycw z0jcA&30(GCYFVy0KL-G|jX@Cz!hALE!<+I)<<2fcaJ*iifZ-?kJQ22CjojFZZ1DoveOqXRY}A!h_@Jt(ZuMtHjBR`B`;4wQ#{V zRKdWbnNXGGJE2# zrBx0fFFd0Py^Mw=plIqU$7SIWM3(d2 zWt()lS=lXVo&m{tb`WBG=EeI$X*=TVLEpB91#fW+H9&!7cs$e3ZSHX%pMLQ{;!`(P zYSza{a&SWY6LtN|;D92BcPv%{1x9m?+jCH!l2#7E(0}M5!@jOLCD|r%?Vhez?%4#E zxd+kF;p=ux&#%1Tt&jS0eR!l<)KP)>nNdc5B2()GdqLs#$DCQEdS2w4ZP95XBp!2* zCV}-X?f(TDJP+S?D2IhJo4zHwGcZx%SfN+M-(S~ddU%ww%RF^f`=0`w;eA6jjuG4q zjws%s{=j?Zdb(G^Cd~`<+s$4K!aZLZ!U_g0Wd?ZUxz2adZ%uh5WATwFV9wecZXPOq z<)S^+f_vFpz<3KtfA^EriDaqy!nrwwlBI}L@Y?&bRM1M|KsY=r_|yjK@n~~x;?uG{ z&SBA2I0DusA(1_-c&zpN22GMP-;HoRBUdooUq*Qwb=tCoA&o%KF!07(enV$b?9y}+Bc{X`}Z@h|@KJJgvN3`Nb%{;JIOdc%I zkZd3p1QJL1`aHCt=PqA$^#z%(zRl}dD0eakVoyDKlwP-Y`>dSnLz`=jC7D+_2uu=5 z-kEqHwV83GD(PWAzZ!g;#$=;2j{^&G)H0Vx$y~x3h~U?t%Fw2@>w@wCMqm>CSE_wd ze*I|6=kxfTCs84A|Gq`IH=>gv1emAm=FFzvE|jfi22)oPhZVFBp)M4(+C*KjjJ{CA z8~y`UgXT3EBLO0Mk-a<9bZkhvU+i@|w~1I5%j4$H%p_2V^){q_k)8RPL#ODiV73C*5bl z;(f?qPb-tEGj9MgmEn8^jEeld>vuCA`TENlkt^+#9n_~OPlK>Ul8#s062zk13+4UU zg1dU3BJW;0lr6%W1?kIA2$?~Q^L}a{gGA+C@#8$E*gQ!{n)(TxTA}{9T7S)VTVs-+ z?a?EdQYk?qkQk4lqTbxYpRbRqI^Vw4vf>*RHyFXGvUfOA9t76&(g9_#nGVwZ+ZTBq z2kg~5v~bDCt&{> z-k>!iy#EjEGy9arS)BdL1iIlPGBD*wTT~`Au?T3*_rckIQ^#H&^w^S~`{sCWPl1*U zj-xcNT2?HA52QRl+>J!w1-EMkF`P{DO?D0Fk9L6rWC87&?jp|kff=74lB z2qHvF2Q`%cWRw*{_I=KLB*0>WkteOtiVg+kDX?cZOx`?7DZryfr8BYJ$pdth-v~+u(2JbaFoB z_SC0}{cIkwPo^6~-|vIre^EnzljOCOmg?e{wdR!>8>((?IP_XB|5Miq*6ypxX_?wGgn&`rxO2dF;F z|GqEyK;y%=nT_rdjTqhx`)#2hCT)!!Z8?qOlY=fu^?cn-fd8T?vxsWhm7biG;g}WN zBSFQxa@Y^{3bf;2)s{E?T}CmVBcOy*`Spx>IhA02c zl~(rxdVE|v7)dmbV7R+q{UW=Gqg|aMcyf04;H!p`LAenxn>)_cR!549Ksi4e6Ef#| zIOHGSZQ|G~)9f39FY~C*71Ji+zJKhJq89@6cf!#>HDpqU)%WLW5FpP-tdv-SN?dMk z%$@>y<{P>;K)V8pqBw;BOZ2YacBG4xEeFOPTmW)^@$uiO5(Jtds~t>`yQPLpCC2mr z`Y#F(A2u}AIQg9;6{N6_nY&tlk(W@!&i7H=SR## zr1K}^eNi>|2yQKZ2Fq;+uUJVZZhKnkBK%;MzC2zru+z6#+e&t`bU!}U0U#qwbCH+J z*nt%sdA)!-5c|5< z$|eNIB9u^KUMv0i+SS>dp3%?z{q5!Iwl}kGiFiby`=G-r!9%gRM?I-u)W$Lcuk8Q1 zC4z=Y=0b#HM2e29-rrp>aMQ)+yCGE#dDZ;?jf}>AZ2cv8nf~W`XMphI3nDt6_xWDB zt9~`|bS}#WK&1fL?Q6eZ=ZDT-*5gknO+PptzHj#0(ddN=gz~BDF4xbuw_vs_wN_2G zX;m|-$Fx(M6E~l;o&$|=SM5p}z}v3Tj{pDddBiazKnZp3SNnJQYefO(w%iCnKgOvB zXNFGBwEl%0QBHEbMjszKY&)~ec%lRJ!LZ>6%#_KGQO+qj9j0XWX0g>W=5}`)k4K74{yVn)(kgoR{W^R=omi9id9kvL6gw{NMOUFm>Ipk% z8_y@(^BootAB_4};t=b{jp=XA!B+}dg(#QGYK4cxl>Z4Gu;QJi}ybr9s}Yc63Jxw^|7~(8=BGs zAHDIW<)6TM639QHiR+U^)GUrUKsf#HYYFR_P7uIvQXC^JHTVc-1k#VZPggqJ5t#|6M8Wr&S)q-T8igKd-=iQ$#~NCVoK|Pysywg z6jz@qATRpUwKx8){kxS!jAXHw71Mv9tJ}E@E7)MHJHdyZVNQ-k$!y6(t6`YV8{sQ* zQ1TpCKpU$jRX)#iZvJxbJTb}WO4*_$j9RODv_4jRKlDCJYEWt1PX2R*NSJDytN#XN zfrkBRAGq=qRb+TB2j8#{-Q~?8sU@*T?R*!x$X~A`^M$BdhG8|fNzXfHjRym`Soj`6 z;jZ-UmP>nulI|De3A|TmBc^mQv9!#<&tG33ek{wb)~m;Zz~S$VirhhrE6KybB*E&u zW@sxhODZsO-kH3h9Y(L(xwpVFrve{k3S)P)PcM_J2F;FH+X0X;l*EL4VMx8M&y0e9 zSr$DJ#C3w?NicwWV?(jabzY zqZA$gdQ(kCZ+)71_bl+*tMJojpxF7~xqXZTz1o4L^KEmn0*zsyS@PnWp1AS;lwdIS z_+M;-&4;X8Ywn#XnBHJf%H+#mK>ZzJobeK)jM*L3w{9e_<_i@txP}AVwQJ#@qh#}Z zT&MP{-NPJQ^~bdOHOhWDc~Czp3BT(afO+K-5yy zu%=_;n$Z}i6=p~(n}@nxJT*%w4HslG3oQiM6$JSA~1<8$KU<)3py88RuG`i(fD=7JyK$8C)nl`>Z`PPUVxgKEo zsoneB7cOEg`t!>5I_;==+ywZh1u?2D9~pO};b~*K@irxNomlg%yT;+VrVjRdq>ghKY#-isUq;$NgJ=q5L+;Vfl%iQUVf>2SC3d zA>wJLxgV(E+VDDE?}cpUkQ}`>x5iYxDw zsU9JA;Lqf=>(LfGCg@fx5&Kj!})%{D;u?HhX?Ub_C zKTB|TeH*1a>xHKgLzSAP=Bgw+7&S$VML@58dVVqT-^fduUa?^)2+Gcg&!>-NY$v9< z?`G)F9QE+F|F&QX{>Fc!nYVxi*(+OJ<46vP8b#=Ar-Vd~ID|wR2vbSBfUmok4XhP% z6Pjlpq+>9v`H+Vm1!<@IOCzTpv8wqa0 zaN@_eyjF;i-hBzVbbnbVn9K}_(FONU9K9E^&Sx2)|2{EvMTap-usVpOBSQ=?@!(~O z*S*Y+7)Ne6@jifpUV{>U*@K=xogMnj&l}h-OAv9x8T?&hDv^j)={9~%E(#Wz>j^>@ zkumtM(nYs%s{Dw&x!nmz8kymOxHmF;x&3`}sQxM0w%Tr zo99zxMauWex+?S-y!vE*K?!Il-A(9!0P?{CJyJnlItUqbqY#B+d#KPM;Nm;${g^zp zpLy2&^3MUcx0Bhr7@3EK>tD(|jyEyqvPBR(&I837C(mxx|^XLTmVH4Jck^c@)rINz%bSVA_z6O&*xE}mI4FL7qN z$Ile$8m{TsHP68tcCffT9Wm#(wDV2pEv021Xwf4X48^;3Q9lchnZIp2L{^>q=61r# zH@)THHIaj}vtWV^4ioLKe;L_qiB)!`Jj)&e14$5S*ogH(8plyF8S?6+iUZgQ&if=I z-Nj1!HL(-$6R~-xj-|e+dm6zF$G0H-MBp1=BV>VenE+sSI7)Jw-6EeEp^k5bku#OR z2B7cY#aB4(+XlL7x0k)NR<8VIK$c|mqj#k)SnkBoQPoye4{o%mQG?lBY?qtIyhHu* z<{ft6(QX$T5>GuazMh0(Cnm1_iZg=Z9$99d$^o{cGK943^jjamMWZ8jYZ9?djbQ=f zkU5N~DE6A?JJsmWexgjvT3+X&i?(|1&iV&JpCi`G!s;GieQg4~Ir+LHYwojKN}E_q zF}B@@0}v*H4gR5r0TJPw7hcdbYa728rcR{A6!?M4kpKApJ$S*Y{sNf?iK7P-n*vwY zz8a4ZN9t}pJaE@>o&c#^3x`h7Or&0&dJ}pZcTz>?xb)9zqO|S3E1@LKNLWD>;Ky#k z!&=aZshUriT&zc>Ko9|I5Elgyai7^;<@}Q7aedPp@w!i~h0XK%impF54sF!3^r6}K zp^<#nVK4BM&`Rh7vBvd3>w8FQe7`X_%X-^6O9thgxBAlYDbMLIcnkvRU1qOIgsyQ3 zsvly6o3looJ;sNsB`dmpR8+0kSxRMYw455%AM^RcN#(WfBchNenHHePwRC|IFmy!I z?n6fe_TysG^3+0>ANlp^MfAMHpm3o?{20yfnElq<>NDq5`1Zvrz@9g{#@RI6&~GO6 zu{;20V!<+L*ZBf702$EZx#EX5*2I87@vjMbw7t$>-_-Oww?4bRXf}QKP1G~OTaBEK zQPsVK2(OD^G?W3@T^lRq z=eqV_$Ft{yBV3wYqiuZ$D=tV(u8%UJUPqKZnjhy zba&1Y1QS{+$gaT@iYSepJ!rRlsgW-rq7rf)iGKh%j^U~;4zIn5WJB69C6m)Z$AA8; zEu=_IfnH(pzxIq-=Z0d8Mx`x2&{nojr8zcVhR5&}*%_a4*~buBZ^ASV8`g&=vN<+p=gq04Pt>?dBYnl;sp(_MpnP&jun3GFK6FC~3Kf6+Rd zfVt4_;}f55?dFZM1ulKP>(cxLy}p!N#NftL&ou9Bvta~H)P!M6xl#maf%l2z`M6#k z+Y@!K<*@iP+r)T8rw0{@399`psOdcU5P|eb2O!>=O(bw}TqRD;nft175f9=oc<}Hf zj*5c4qULwciP2nNYsf1<3z5|gkx=>pqR|1{Q5oZ7?&gizgEM9MgK8Uo#wd8oLab~) z5u=a~$4+0dzVb!*(dCP9Ug}N?4Y)+hzYBn0KG)*h9Yk9T_@XkXGDC>+@!=*pJJhG3 zr!+0b#Kfrw_eEv)CA!coTnqb7|4qd(vP)@}LKkb}v9R#Qizx3(uK&o-=#9GWl|ID= zLRDM6KQrTI9H3K`|G@TcKb{MHrG3JbHj8VS$03Cd9R??)ZSf2^N2X1dXr>d^v)nM$J0ibr@G&X1SO?CeK<*Wdb(kJlIjG*dA78ABrQ z;O5h0lK%dD2&xa@a;L8GJ~Idzp9uIcoR+?`{Q!#TTBXhG^ELZ+(3D>gZ}2{IEOG3z zvmvo-w2tXG+we%_6vCCaB=9tWndId21aAWCGV2f5{~qv`QLJbt5?r4osWYR=fi;eR7q7MUl53v^UbK`tZPwwt7VUEUyn7SUq|Y& zUC3vDcXce~etY`#!4)$D&!T|`_R+sVv>DEqitj+bK%cyE%UidBvVn^V{0IO6%~CQ% zcdid#BYg|xecft)n2E`pI0L04JvcwY41SNBTE+BUJuI>B2^#wB#2i?##V7DZuI?Qf z12;L~HCqO>Ek-me1u*c8{lB$eKHKwj3|*Cmk5nP806qY*6b~5t4$G)49aH}Hy~f`f zTBLoacKL|KQHf@`9AMgQj>7D)s=k^!&%(F?$=WSt2@J*=wXCKHX2mv4TLSaXSC%YV zV-N@oERpJ;ICEDMcx*gdv-{0@onpt2Q_8jGlH7HX+u#^=sdair>isJM|m zaD?w}>ph&6#q(8|7=urEzLMt^7-ts~%4DZSS-nJR^UXcb#ZmC^nc|Rd1gv4dq1|;r zfr7r@h-d03PpwrS!NS7iJ6BW5P6<0ZIEfq^!pjtm9<(?}yR?GVNs)A1C{2O32w7Hu z&?yw5zITL1J??gpD=5M5J%{X{o;Cm`$1D`7no6wC#u|9VomF4|UNe6!Z-N;Eyf3b4 zARIZO%{`?4Fn6fyxUIZ_{h|wL7LETdDP|7P8E`q{KE)?)Bz?0f#{qyr#x?-we|slq zp^#U)jq+c@l8A8T?Q0|zeVp{I1n znHRN=&EHW%hQVRwFmDX~I)Noo0w`f>)&1K>w7hl@)s7$Zq5Vl*b9@o_o$|?C8gOjc z%E9;Pp6X^>6?Gm@p7N&e8QY1%Zw{tCV zq5?3QH3e=dxLNTiUC@g97)B!Yqt((yWIrA~*NaN4FMM3)Rvy^iS;BR>r9DIcCeM8G zZ6`ClkHM35pKh4M(|M1h>4hN3{O(G1d{A<24=V7&@=1%C$5b4I9%4)2!W&+#i_EFr z%?=MmT!MgA3ll8Ai5Tk1np8+T?c~|jnadNTW`%j;)7np9lwkMVCkLrB)0bpBg?wYf zpgk&bckrXNBevR~(&bZBnjiH(QN!g)ysynK6nQF}-zJ=M7O3W~JEg&AIr(|MMtC^x z0k22m7|GBWc}y5M^uqhtvKA;KWxF>eR)kj=#k$~Jt8U~b*ll61g+9_{e?c4w-OvkX zRGd_M@+RzB`Uz&Z)iWW2g?5~2`~>nZx=?W9#A9t`Q;3D`iibctJH+m=(pUk*(o!6n zP+n7gj7V)C{;+9{nWj(TBbxQJ}Pm zcW(gB(Y{u={T$s2dBuZk;hKW$-|rP+bevp8i(3+`+y6nA1ue>h|sV2u@|A?;oZ^G-s+RB>WaPsE1;cYEeQ1d&n3uD zR;Ujmus3;Hx3_x5$pajM!SK?)JbVK%8dy+Y*39e#A4S$!+k@pMD)!)hWuG*rhrB+h zv!vIB^YtW1SR{<>VLRaz z?M@6X#Nz*xGG+^z^Ou~oBSg*pkUxS#AozYf71Z@rKh%Aq=BE8I%ynIouH$7GuB)#7 z0RjZ)YM&BQ<^>P_2k6pe-45gTgU*Fhawk`rs|k8yQyt)I;|nbxiXZp|I{2U9&HQQt z!V$o*J@^h5uw^&-gDp11*ZqR}=lS{B#0H@xLjm@#(bM{0iR+pM-#_T7${qNXWU*xI zYVc_n*r(o3m*=+cPVcB;79#MO2KeqnS=4R^@$8b#c1Tx*&##?l zuatP?7N{+ohB$chibo4~#P+|TtS>ryUGvz~ap*2)BQU=IHra>&1K1yXcKDFQ#zhuA zZnfDEoTu1Y{?{o)o4F?c%KTRB9Vb(Yne-2f(@n7hno%MAEab=8D+kBttYbfFZ0Pb0 zP(%dvgkWLrkvuK84t#Z$|6L!LuO}8oWOQ;F>1KO>%6U@hsjq_1S$$VLjeDWnA64N- zou{=x_kK?VorC-^&@KN<^L35cINHoLpU|Qunmt7Rz00~qd8}d4ckT211(D%qcKkRO z%{eA#aziA3kH2V0@I_J9=_<(^awLb)G2VX-!25IZZ^A;hdqjq|HZnEoG6&om3G@%j zrJg7d)9)L2(hnvod8{}EPafT(9qd({d-8SToOHZQHL}z$E2X5jJ*LyU#uh(S9pFH1b)VlJK=5uikzjT508*F!3+S@r?R;ry<%^ z15cskZ*8WsX!!Cw?O#GZfa@*(AJ3T6C;u^(mCxh&#u8kCtsL3J+F_l)?k<^}%V7%7 zH3Oxt4kUqFK?c97EZ{5O7nG10U^R>tgv#j|C7|iMXxlG))f1OGq2NM(LE1jX- z)?o>XI7EcwvCy$8!;Y5ix-Em`ts2nrr6dFYx2Tkuo|kGO^>Ywe^ehh%Yb4FPivY-0 z>j~|xC113@Zn{awafnU?)Am$~2r{jWbgvmxp8le)pkDuy&O(woqd$_Nwt;4HzA6Kf zW&we?D>oRE z&Fo}ToP{X-u=$_+XLnm`lUe)N&JA53J`ac}mIF03d}!3(y#kaZ*nGL0W$h(sW=-i3 zkR9U2r)0jZue|UUKhXKarH1Dhytvx-Qzve)nai54EFns`Q z6BU8UMo|Kx?gB?U7}E4%b@5F)B7;Ny&a8kSxZvcjVVM%DAkVJ&X5W8IU1jvy8zzQQ{@*~5M zo*k(1AH@)eB~I1r6Fs?ol2dB4z&rR3-x+ z4N6bbTSMA>y~2 z3a=R5EazU)ju^El#XHq}vhVF&acJ>)atfn186ih7VHqp0V|fKcBcJPxTvf$^Hh__x z$e;fZyT(s1GlJJ)TF9bi{To*H=q|_xmL0Z4{n!>pe0d(#{aos9-)EsS;1zag7cU1Y z1L!wLlJn1B)OPK!bb(IB#mM2nW+`_uXMy+T7Ddwg&Nec|ee1g36G8__RtL3YmQB1( zn;4{c+wI@qX)OhhOaN${!<(|R#Ftf44Q!3*cdX$3(k;*&l% z`ic+SDn^7I!aJ8*=nGf$pJZ8tA{sn+hJ?d+QudZRv{`KaQ_a?=XKh{~C*}10SKOO_ zvv*gw|9KpjoqsVycCF&MHVDb^RDz#b?xef7Y^dH6pqM_!H3@Y!$y6pMhgcAQE@e#6 zqE2SjzsY=^uKG|Mzn%J7?VF`c?Jusp_e^>$(Ri}N+@6c0ZNsf6CVrvWeTY*cpRQJj ztshooW?Ds#O4@l&sPjpuM|*c*o_((~o?OWPoIWWu>F36Y02|Ok@E;ZUHuz}D|3y3`}w?YOmc>M$ZD@XsPsYWi}a&b*c{{b~q$bkFqcCGajcYh?><*m;S zRW9<6;{_Xsxm3(_5pI5d74QrbVB+lpYH4@MCVlqg{q@JuLJNa zYC4_#a8cqutYFoaPst~FQJyzhhay^WSjM|EfnNVL{^_w|=AVSC(3xj$Ly^chyL(n6 zQ9D?v{`vU*_J=DNxLz&vpTsYU-KAOm+-otVp)lLW69Wg9BhqmMBMgNd3QTovufD#%f0M1D9P66%}4tNq}80Obho_cn%?~bAp`1s-e6VO6F1~1Ci<8j8Y zSI+4jRgx8bf#oLLVWRE)?V`70FF~Zi)u!Y^Tb%cZc3aDjI6L=_z)N*Ox?~czOHfy*hPREmqN1c{4=hl>X`S_)D^wUj{8#3>Jw2rlm z6B?U*fkO7>{c>5JX`x-{Ker-G^DsIW)`haB<4uvX)ZZT4(R;gV3Cf_0wjwfLo{G(# zlm5f#=Sh23IKq{N`Mwbd2BhC7@B3VMF}MU5juRCYDKnv)1~6A#+%$%tLoPIqW%53R z{K$y=lB6G2dbd?AC%igI5#PZ^Y>*QQf&KSZW$@E)0N1vJD02H}Kc!5&eT6D{nE$P{z?w3FcSu>cn>C?_<07Vi1Foy?xJaD&w>Z zo_)c{94O6vy!ElW^{r2w>i>Z$%?JP63sfI)~xO+(?<11qruaF-E*V2 zBpA5Z3FOg}e4YsZbchN_DbDJfHZ^Rq_Kb$N7MOh8TCD#%wnf##qMkB$rDxA#Vf5X0KF42O+IBSuli9qaBaFD*K>(>P+H;9daF`iqHNet+YZCmfHO z>89P~j(=VNG_z~%x~_Zp*P=L_g?-J0*g;$->q?YQJVWMp-oV9(K#fezt!^vFoCIr_ zkGLjazM%7DM;NpzYw|ojVYqSY-xUk2M^waD!;WFVwR)0yV9~UKuejY)q4OrZG3}HP zqq2A9-mVQd>kV51(`HTo2SD%ose&vsVFnBV$B(VjL4bxU7f$d1X# zj$Fzh4p4=J_Q7RAKD0gLiBiQN#);vhnW!3Rr3nmfp8cD>l6&}U<$S!D60)vlrkn|e zcCNDQBmXG#nE$8o>0(0s>olMg9iZi_$C@^tOmU1^l~xsskv5DPMq~oKG5J- z*9sU(*f=ZH5$7xR+QD9isIIFq!9ohpg4ud^0OHR+Fq@lC$#3)UStDib-1eA|)rmas z)YW6%3EzbUF*5?N+P!^5nPK!*c4KmMg(Iv^&1WFaL&LZgH6~-ZC%KMs3fW+aY{WlZ zK6;$qhy@jRc5>H-F)_qE| zNvR%!seC3_yiZ4WeZ{P<+S@$0f3k9r4OPs|3Fbs?`$ z!h7Ut35&1axRu9~RB-~nL4u(qqX!7!Q91qLgG&5kUr^dxND*%sJYv6VKCL2DpHbDy zM#gKxL4pG6FJdP<_x`M&G3|pmTa(kPlkOJiA~2_?GsX&D-Sir&eD-ml3400uLIEss zE%)hQqYlh4z)os-c~Waw-YQM@)`p+}dIr^LSl_v~W?!#or;Qv~cyx(OgKg@>Q|EcG zMl+Yy?Q<944Xy*!!5vlZSv7`7M5#7q}M6v3WeXL62%G!9$uOn)VEz=p!AnDb5A2e<^oPGv1+ zCuGwcy#m3Tvc>f`yncLS{Guk7`*w!<_C)aBbN*u(*e@k`MO%GrN4j|gJlGxI1mCoL zZ->2!fd?q&X+F2WMg$v3@rE58E5jJSbWVktv3rNeGr?WF>o8ai0q9L{j9iigFq8%@ zx-5REpSZ&skldn4A68AjTe_6InJYGTb(wD`HuCSmFS0~N_!vh!E^2J3A-M!Ovyo%v$e^6o< zqRAw={;WXcmAOy+_e&~vARBOCCyt*!*e}98*i}z@i%SaCGu3aJ6?^JDUy>oASxdj0 zXX~r$^`KsvNy|viGX07s;GjcqF;1OT{5RDm7%$C(IVLv**(^SsO|!dDBgfkIA=ADK z2}trOhLYp^F-u<%iE}U7U9whI`~+{<3VJ++r)-g#9Q=r$KkXxJi{nxLI7 z!w1+O$})b))h{z*PYF2ir=OQptI?fLi2T}_#hSmX8t~k;MBH`Vy7(Ky6BikB#6P%s7DO>mB!MsGWF(%dY5430|;zw zW|D&oN5ULFt=i1UBGO?Ob-j6AO zdh}}|(wP+V)BbZm;RGqPtxQI>IS=!}{C>MnjjlC(A+}k|a*#an>Wy8PP{!2rzqv)* zqbD-^r6QT#@iX)6&9-NpQhIc2}o%GTMa`?Pk*ACcJLZ32HTQY0M+3CQgw6YrT<=7a-H(pf@I^i3zlo|s5JIXC96OZ_h zb@Cw-2nFFBmEH|$PZvUdxL!NKBb_L2b5!aS*7Y@-f&NKrB( z=q@&Xuj^cBPsGI|OGS@|ZY~AYX&&UT=Y_dL%g;Z`pqh^V-u&C_Wi*LZiSc*icHw&* z*^bwjd>cBiuVd2HLbSBgBmabi?*6HAx^+MDq@}!6lm6Mj=K0V>mQCi;L|=))2l{h=f~rAF($wPED@>g!hvt$D@%EO<*3%yN7(Z8r0epfc1JVvMv z&3U1CjI=~fGY@Jzzv|yn9G#su55P$dk$bh8!;iI)tPtFmz*#e`XH$+LXe1f8#Q_)RnDR5O;f-I7iIcFG5x>;QX->i zy*tf1yb*a$lKh|{aL!w4Xb5rmt)wvopOWB^WF79!MD#hrg(zmRlIDYZSn7#vR{F2UlCycXVOYW}A>yS)7TDphDH0JO#(o%*cR zh~WX>?fVoSdEbG*wyC*>1dc$q`S^_*`jY1^hLe^(8g@>gUU!9rCbo^yKEouw;???s z?|5I8e1Q%8gsp6m5snD^TBd|yd158=PY(>@d92lKUg!+*UE{rDuzjMe(KfQrptb$@ z_LBm`V&k`F`wZUg7EZBjA80vgphGZwV##lDX5@{gGeIt)1O9ghY7 zJllQw=R-TqgkeZb^EYCr!T%$lbh^j>oeD8)bv`wl1aTJ`PuH}F{k?bky+!wI) zgB!hSM|d?tER`sREoVP(ywF)!$}>$;fAIdl6&WB>nQq zzyuKeQ}9V^t9@pE-70y3Vm?pcx3Ac~&u^w1cpGT0ekgd0KPjSv6#kaR=1Kz#;UPUK zO9i%IDY5pXFcK6oDZ8xkwX&>;1qfvt$4LTpGc+F#{_QC|;Hl{0f~dj2I+sd`Kdwl> zkMy#>?viJt?BZPQ<6k2g#@GiLMpkZFoVt(7lGGBdaWRuUP$Y#!QSr2y@$Qj@jeNGc z62ayAah5H_-@x1OFDeg^AbZ?J;qj>^Z1tc#KuuHx%7OAmr*)3k*kpzD&bM7SY3^+0 zcltd6)d@m?#-=KJfIf#7fK&ng>K9Gq9VxVIJ{S5>8C@*?XrN&K`lIcZPh9br)E*hld-;J+PMYbLdti}jR)qvG<|Esg>aq>L$q4rm~q;tI5~eLnY&+po2(*c4HUD!cQi~U$tb_0 zQbmC>0a^|~231$2U3(m~Os)BcY_GbZ zX*qR8ud)yTg%5q$Q@XK~45;?d?pLG)d@Pw+LPIhAB6zBt=Nhw&v9E=!JDBrI_nxV| z=ehp~hEI#Z)5gh<%v;M9tqFB@5b5jsYRIc+0R!}TLrDR&0k+w#zCVX#AYyDGn3(GS1&_~VQRnjw?+3d8sv zLacH(Z5x)Zqs!&)w1*_V&KPB<07<>1s8OB{M!wBhr)!Ak>*dR~ARaw$!vp4@n{V3d zpgTC5P{xd^Xceh>pVQP71>$>ZO>L|7@-ump6k34G>D=eMu|2KOEVS^+f~lIW!UTwz z(929F3`UQHO1ob=sRpp-FPaf8hJ_Z?ME;Ac8g+iWz9E#I-ur3GL*+o5*$I}@F;N1& z#L7jtU4-2}nYt>W)5#YFfOsQloU)pLyngF^+PSN^s&_-lS|=cThMU?6QJf9{HUr{h zz9Z$5UgKy2`RcIs1w{U9U6uVoacRgqJ37HkJf}MWGr;{i%h=thqc)9i{$H$G)= z_yA{&E^4J)+>M9r(DdUIu_BW{2S3IO@Y6#ras(m5;Y*|$ZmaPIH`9mEK4?Lap#e#H zTM1Dq61!Z>_zelw$~T>&alriIphhCyjtgEqFc1H(F}09yG@4TFE$HBJHzZov@GH+y zO7$<%?9}I{)wF^XpKb(ECC0sFFcl4}$d=D=Gwoi7(m%)fAyi>J6@dAMrc3q^4w5cy zD60Bg)4Fd<^w6eR4xq+JmR00&?XJ@U*5qbPFv)H(v3Zk^hbCZf*Bs#A*3mcKbXqJ! zTtE<|*ti|5?oEwyT(}MUbTnkE-A!ZD(Gj)*K_5hM%KQ0)Ekh>+;7^ zbzp`wN-T>3Q&}?96E2>pCJZ9eY9Hplbt^FN4(vpvH+Mq+90}ytET0;_uy%bLqVp`bTd_0Z&$`x^-f=i z0*Y@(vVP-g{p+uGw%D~{?KCVvLq35YfV{3nxOEM!z z*bcr!LUBC;XPOM_TJJl}Sb>U`5-jDif8lSGX1;I>j(I)UcC0HT#Li$V{@0$KP2_0(0)PA0(15$oS}e>;TeNYiEtnqK)b(ul{{jyl=v*Gajav# zCx~QNf+D151%+5xqd^D&C(Z1VIa$NL)g0)9b_nKRn5W}_(ET41c?qAk7l|)KPkG&! zL-9Pg!a))&LaC%#?Jtsm$s)?4(`BNn#^|6*5KajM;*x!D+ulF?=#03f`8_?!0#Iw6 z8v!8pV>e7@$7FtIoa@`0A!S%=nHEJz5nmlN7U{5y=fF z5CXYLJnYysQKE(e%Fdb&m^Q8}^gC;5y#?+el#XDhC%#ZY_BHuJ;XgPd1C?gqr{BcQ zHldB)mBCK7MBG)sa(mmxZyv4cAg2ov)B~lJ!z4%_Wy)&_a`MwU02I4&_^Xj*JVlvzb9iNo)k6aH5aCFa)#(e4A2~ov%rFDv@iz3-IcutIcDd7EDIdX zOwG|gFML!Mzdm}WG}n`YP~Un$v>aHvJqNEqf~Y?JWp4lA$C4cLuef-BdA;sj{M8P! zWZ=Wi{6;Qu69Qj!Cd^Ndt0(gYVFH*i(*1N38N=w%q&E$9mw35saQ_SZ!$2QA+dler=i!z8_sW zgWb9=pvzM<5QLG}(%xooYepRkMU53D9C@T~!E7kfwwkor>!0Bvh`h6H#uW0*`ZWot z-M4`ihH*zm029(Rzh_8_T6vze?XuuUH0W0<(BvVqY-oDnpjRJCbe6B^%G&c!=U$Ad zw6h-|vLIYO_B7>^%d$|7E>E>qNd=QbBZAV804|)w1S_a%k|K+}medKTOpXEJM9PxV zW~uy%dQ;p&44mlULHofpeGr7o5EHgRP{FFO3s&GAz%#k%@7_g}l@ zc-9F(q@6uzIrJu;va#x-EX#-|VYyE!>v23nyGTxrvBn#zX~Ra(c#iX*(xKq(3Md91 zhIj=gcX2grjlTnPahDTtY4Wk*)(qK7JdHc`q+M4CJgp>hv>`}%s|gMo;pXH#_V=n# zR&#DC-@Kdz`<`=$c2k-jfM~Q-#+O$)bwBA`pbzin2*J`=!y-z=eL8Is82C~l5_S(?ljM&?~Rds6fRl3ek-W}@tZ0C0(y3gzgIqRDfxhP4| z%NexIcQqy0(9-zV{=#MFfeIiO*uG;Av+eZBq|4cInoO`FWU_+uQEe>bOn%CP0X9ik zWGFPv^AqLMMc0RpxkEtkF;dlN1tO#K=Qqp3(stwaivezW`sAdT(uICAkEowN*FHR? z==xOi@4UQl&&@Q+gFybno#i*8`P%tVT=W6uXt`UsN8N34H*A>k9hpaHJYfsImP z0^Fk4J3Th}OS%Z?RnXzpKa9dtDpF1YlA??1+VNj%h^pux6UoUK#4!m2)1burHwtSF zO+e&{v@)4Up)YOsf1I)@SMCvG6qiQbL4dh(Pvj!Hlx*}(O{}{@ZNHh5F;Nq1r228Z zFNK`56n_mf#kEFABNWZJKZLj4Rnr4b`uET82$6C4_y!oq;7;e?n-?p9o@%y33i?-0 zdAG}Q3`C<7NuSZHSn=z_$2uDPSA^eN9ru?D*`FR8U80q24Wp*lCs4f_Akq733LY)1 ziOne#z>jtNZ1LJF=YhH+O1wOLwh%TUq(e58z)Q3CN}tP9&xeZm#F6MG z_sCT&v`)Z7xz6(SE4UWGZh{nhvR3F)NX!R{XZ(#dE|2X$HoySiuNQI0o~d%)TzclA zqJxir{h56Na2LR7mZbE1ze%!?#l!C|ItMMK{Onpv;O9)l36yU8Tl;1YSX^#e4i9G< z`0OeH+qiA<5^YP^ZML=gne8~%15a5kY!`=n?mfVieeOI5_lX=Dd1TS2_}F;P!zj4L zu#I9}Y8{e&LecNh^uhVs$Z2lhDGM%JB8=r07B&2LPH1=$daG;(p3z@BDvc%FjUqMB zquUzNfcwFpom&QdUIpzg-|Gn6>47a85JgK8_kCSAMET5M5v&;M(%kcwP{T^zUUF~c zMc=wyL4FRG%o{z*TR)54tQ0%?J#;|j(%?3Acb+O5D?B++VfBJ)B2i?@-ZpYOGdNz5 zBWi2H`meh|LDvgXlyV%2g9GWRBC$4{8OJKMfRn)1Q~p9-)MJOWX=JRSmEpaz8Gvc_ z6~jR{IN8UexAA*Qob~QJzTeLFuZq`2;<|5^$9z>1@=~L)Uj>n>eOy|2DPX!w6}vR<|7r*$2{`}yfS2*%xHTVR@~wrt zCOurc3nqmBiYav~IWe-`^%SzGm~yOG#+i-hzH;c{vo3Gq{mDW(PC}L8>)>TDGJ+$Q zZ~8WPZ;;uX{wf&cPWb=V*V3rxo z*O?f4WXcXEil^Q&;3{ZBFTH8TrsC3&c!nu8weRr~T*&)N#^=!Ci~g+vCb>g}3~SOg zh=<9b5cPk6Xj(2jqpOh5ZiR_aQ_iXIDDne0@`1!{qe-DuhelMPLwZTSL87SJ_cQs0 z>2~0vHBzx*;>L&7%Qge^$NPKJLU0AzF|&8Uwx|!ZCubqzx%5F^lnb7zFhG5C{aQ(#89bHB&89d|9dUheeUeW;;@o<}r3kvhtoe%(Yi zUqZlX>thcFL3EEC(aSIKtnV~Rd=g%xB;5}o|7%p>vqT%vqVKs>7x7-jSw5JSYX^>t zF`4$@t6j3~TNCGSepXiEMiXJ&3Ml}^G`Mqhf{RRj8w9?TpOV0#-#jQ?D$ z7({gR|Ij<5XyW2&04VXscNwH>Ghio2fr3?onX0H7) z6H(3-p>hgKG?Wbsk>rq8o0gPvemnNPzTfXJ-~ZwJxqiEDx9j%0p0DTab-ixa>-Bm* z?hneCuj7m9x0M5|pstd=?{G}vPPC?+OgTfnl}dH9)n9;c z3cbR(rHYXC(mjM10gv>wg(E({v;kKQut0z#EK?D?{GnXlvEVCGk8#2>vnK_i$bi9M zCC>L~i8Yqe=#d~d2JWaSISz$fNb77n&rVD_JHb(Rih z`m^xosckXEsH}ne)M;jb_K|UMci+ae{;az+TqKwr;{c47!5p+{KU*0uA=i>sM5zeRXY`G1#vnM+_ftm+vM>?&Umz1R8gzbZ9 z%7a+#F~mdiHX4I5U|a&+-@W>)o7z%2{=8VWt3DA@OOS(t|3DW*l?b;C47|@@d1+`1 z(lg_>S=ijO8Fh``J0ct$!i?KtXnuOy z{f&^JzzuhJt(^*@eujsdQuxcId*s8%UYZc6_FFw{n^f=PEmC;gr_hiyw42?ZFXsp_ zh^M`31?}YD#gz0EMqV$z_bBpiZvJDepcyBOF-I0Ox_wOFns2(NWZm2bwP#we2cv-G zEf!b8HbMC8H^D1)@1b)m`Ff`Wb4g^6B;vEdgORT@#jwXAYMHZPdz4 zwgdP!R*0MxNTg;vAp<4z(3%fN6yhnj{=H&phoXP6?KC< zlaYKSYk#$aBxZwu~F#9a>po29xTUXB>8{@m=hC)I6W)FNZ~0T=W7e#9&n?<_i-HnPv1^>UO&v@mS6n8-+Y2Lo3v zuqI?Ql9_9GH&3l)?=CjDl6pLby)y! z7p&0}9rTu-#;yKEj)cW(3AXh4=(*?jv~XM{f}_Dz?Qv1Hif3fSQ>rME%(+C9U6@;MN#=zlFc$opD;}pYh=_N1p z0w|uGl*C|;=OktI>qe-0Hnxi;3x(Rkv^ZgKD+sp*WtYkAba%aP0<*F5zirMbn&577 zALBwNzGyG}C?h~+#VQ3D6GMMID%ex5%QKSX5Y5&6$q3Df%xcNQdS_x<>=*`?2CFe z2gH}u#2uCdxvi(YZl!__yPF<4?WmS&nJLefj^~iJk;h}vuoy17TI1#MPlA3GLl4)yM9pkE;MAC5L z84Ia}bHoGIq9<$P=8yDOiW6a6+$M)0?vm|Vuxnu(FXH8xuUFPH zwy@SxOS2BTOWN9xzR>h6oq#$Am5Zb5Q8tFJ2liTC`<~h1;w!WmA1iEmdgqGT6_dnc zgmd??fDc7J1G68S%_j9fa_^6?G%wW(-L-Ax%L2EzUKcHBQ8XG!EUSY#Z* zW--O*qh0dqr}Y;}%xBMyCSCKs+D0abIMkWFeXpf*5G|0#f2I;Id&$$N{GItBrQEdN zOD~6XzX0VDTEJp0q z({Gq<$|D49#KAoqs!4pXuRah9rj4Mf*wQVqt5;CUTK?0^Af|s##1ee+d!4GUxaDp zA0zL=*@USnXsdw$(y7`LIK~h*2^TN3>z)`i0g%+YvC9@~QOUGZ4}EeJeMM)dy~w_g zy-bv+VXJawv$=QH2cLFjvF3B)qZ}#1X#UjaWB1}}!%-zZbs@F#ZD1Xn1tAxL?_&(p z0jDLHAp>p>70$HPem!b@Zz*XAuWRL`Kb~zkc1M4|WmadCof)F2Mo*v2%j1ZX1{YRK zqTZ4Wo?)Lv%GxGqKN>N?dL@vFl-NaQ6U8wwCR2537)3WpR7tc}(3f)|t2MPr)jxZMSr@ zBSZCqq1eTosm{QoFntp};fTo-HBt(W>vn(_`Z%R?+x8o@b%{^05Ym^LF|8`=VyYb1 zv!1iQt}`zF?xcm-W9rSXCcaaU)m>#tsQ>1$P_1nqWx>BZQ(TX}^RF2KaqTDbDQ1($ zAvubuTfu`qGO>*`zhA9EF$5SN3WZxf(pDg}=E|^JkHT!nNK52m1s=GVuE1}YJEODT z{|;OFQ;*-UbTl%XRPvw{7sYhM@4I%l3%PtS`XSYoKMRHrng#1w8Zn2zN)@Fehnv4o zSk0Onx-DV4dI9Z5uu(I=Gj9?hn^p9q@lbN#v?NrsT2*qEf^vLJn{@TlH!VL7m3lSP z*Y|}qmGskaSg6cMUA0GYGT2r#5AGo$;xn-dz-hwiV9^eGP=u@Jg*K%VTY(at0F z!3w#LO_1m88dd4{_!^G}$Go$ZAfeM+WP)@5q4L zpjb;RCf*VnJSj8(uZ+zT_yf(nx>_2wWYtR!)Ab2(Qs}Hm)Do0;TFM*|3bzPznjkQ+ z!NL+2_+ON}4c*x(uHQ2I1S*|XJ;+cYcWkkJ{qN%E(hu9&W$SOGs|VKv=zQ!^TwI4? zSe}S+Gy;2>j}DP6puGm%PIT?`^ehawh9Ms!MZyJi2byG0o8NWefns=+lVQBDIfqXk z(NADHuL4j!H9s#;!{E5JXuir$oMxN#Q^fTqeKd<^8=NGSjcVRp`4Tc&b1_lbiXQcD zQK!?Yf0-;11q;^G65!gs^wL=B|LsgaD_HLsZ*@t3jyc+)QTMS;T_aaDlI5C1IzF0> zSpYUuSI6!(<>TE4Cl1+e4a-*S`*D&}ToG@$g02}q1u0U@ZpU1^oeGgzM$HuxykY>= zmgGI`gUIHi5F(`J=-X7y1QrvnXNlXWntZKk>~A9O?~!D!@0ahZi75R&3X8jZx6$Ao zL!C`_c=WD_!vQmx3fx!l*rKb~#NJ31+aHj>{G&os?EUeRM6v^9vz(4%t@S}N+6Gt( zov0x?9Mgx{E~9*Ne_W9o7Lf7hY(k&vas5^(7`uv#J!5O&L(~YW6mTU-v!}Y_K~QLf z$qKj1EV+fg+^=I&%+p7^>6yX!nqv*cR`3|IgMh(2IyY}*uY-4mVY*{6!&gC-7P~X( zs;{fF+&pt-?_NWJHbM#?31FnYThGt?9FpHU8C^3)@S^sJ1%2xC{;U+eI@I>qX>ubs zrPS6Rqm#6958F?Q3xZ3|06ipiP3?x4OuJTB&0}|~Bdg>`oS42RS zduF-CA*1yWM~@0W`2i^r5hE{;9@U)@5OR5xKJ=lY_;_opldaX`{C8s%HZ9VZV#ytU zf3_)j0b7;w)GyV3=A`Az6Ehrs)x|I_B+I52`?mdUVi4RdeR}WXPdN-@JNnQU21GJ= zjfa$xbHJeXi89Aadg{xc;qxLzTq`x9DjhlfI1GnK=Is_$mx@YOPj?!}ID^5L>GcCWF3TV@GsLNG!K}c!|)YBi*viO8%LB6g*hNzvuxvj zg&L8DxgQhjcdWp(b&?Mr`~O8`sPjp zFWz2}>0HvCp(R*xWnAK^LaqF@pCRN$@?JFax!au!9rXKV$k_tw#|Az%Z>Xwu^t)Dh zyaGbH*|FjJ(VL)0+|=opIlreUW05Y+SvF0Q!e9N^#Ax97l@kZ}HQ?op-hZCDnt~tD zyhlF|*`Cg!=!IT6NSXHzW?<{i3(=WufP(P}P6B#X{vyoT%zq>=8z9pM%g-XY3M=66 zxLWH#pLExn%q8jB{!9k1SOOQ#2ik@G)H~MIr0;W1|JMMyP#kt6>p|zOqQJRz=^yfB zkF{%=pvlsm)xIB+w|GFjh=lF(DJiLU)SC>TXfxoF{X0wh?shTTg2U`9Pl|q8*gN({ zm1lqe4LrF4vdvMOwgv?u;-eO>JZu+SI`T&J$y<)-P>+ zk&BhMdhh+SGY?m)sl8M9$tA&`Rf;TRiRb7%(4}WOp%*UL&4(Ond^D@)-H@=dR_Aui z?a3XBmvw1mMw5iqv=v}+y9T^EuCB+vSgXu&Hf36_FC3~_2+JC!SM%C#Xni>4Giqg` zXB8>6bdcM+D76CgUfOf&a7!V%vIQAMU!dbc#v#Oc$LR9@!5LSs)2N`rzCb^FXwrDe zA0TFk%oUPdihGc*1)fLjj9CHQ$ao$Q!RcnzWErqi7y}@iLc;3&XQ0)6Ve}7QmF91^ zCclN?E3VBAS}HOXz~gc{4zG_sBiuhm-!eE=W4msx{gx(dxaqqLggxNi^bgrJUb$CIW_*MUAy-W6Xh$;^Zz}hjJ@617%hw}QDUN2g1RZ^2`I1MlY zH!&JlQ@HMAibxlcsyPU%M)xO18&v|2qA&HWVc>%1s^LmsJt}!8s_gAhZ>%dUBp;{^ znyLFXh=1JV1)C_}b;L_F2!vbz0x6#&_xD>wDI%V2Y)9ALPxk36zP>u5Cw;n*cvrzN zgqk$G85`;dxW$~Ond8`p5+AZOQojaI6N)=fb4~&8fQ7EnRBC|0O+kCrTr7W_2lp?J zS8Hn1^FUtTf6`Wy4U<`K-FPS7 zwuY%+UW0KECJjsd@CPFKJCOi_fc|s+Cjg(hhWNSFlSznkR zDCpuC;%aMTU|^wZURP2>soT1=Wl$u(c zY8{lHl$odCmYJ8FZS9zoT3no%mr|6k;GADnl9`ujy?F-<6XV3$lFW?^3fm7RF#cfP Vej$PJB~j#bpvqO#ccw6&1OVeLVa)&l diff --git a/api/tests/music/test_metadata.py b/api/tests/music/test_metadata.py index 9f9c93984..326f18324 100644 --- a/api/tests/music/test_metadata.py +++ b/api/tests/music/test_metadata.py @@ -58,6 +58,20 @@ def test_can_get_metadata_from_id3_mp3_file(field, value): assert data.get(field) == value +@pytest.mark.parametrize('name', ['test.mp3', 'sample.flac']) +def test_can_get_pictures(name): + path = os.path.join(DATA_DIR, name) + data = metadata.Metadata(path) + + pictures = data.get('pictures') + assert len(pictures) == 1 + cover_data = data.get_picture('cover_front') + assert cover_data['mimetype'].startswith('image/') + assert len(cover_data['content']) > 0 + assert type(cover_data['content']) == bytes + assert type(cover_data['description']) == str + + @pytest.mark.parametrize('field,value', [ ('title', '999,999'), ('artist', 'Nine Inch Nails'), diff --git a/api/tests/music/test_models.py b/api/tests/music/test_models.py index e926d07fa..feb68ea33 100644 --- a/api/tests/music/test_models.py +++ b/api/tests/music/test_models.py @@ -110,3 +110,11 @@ def test_track_get_file_size_in_place(factories): in_place=True, source='file://{}'.format(path)) assert tf.get_file_size() == 297745 + + +def test_album_get_image_content(factories): + album = factories['music.Album']() + album.get_image(data={'content': b'test', 'mimetype':'image/jpeg'}) + album.refresh_from_db() + + assert album.cover.read() == b'test' diff --git a/api/tests/music/test_tasks.py b/api/tests/music/test_tasks.py index dfe649be0..77245e204 100644 --- a/api/tests/music/test_tasks.py +++ b/api/tests/music/test_tasks.py @@ -56,6 +56,7 @@ def test_import_batch_run(factories, mocker): mocked_job_run.assert_called_once_with(import_job_id=job.pk) +@pytest.mark.skip('Acoustid is disabled') def test_import_job_can_run_with_file_and_acoustid( artists, albums, tracks, preferences, factories, mocker): preferences['providers_acoustid__api_key'] = 'test' @@ -183,3 +184,73 @@ def test_import_job_can_be_errored(factories, mocker, preferences): assert job.track_file is None assert job.status == 'errored' + + +def test__do_import_calls_update_album_cover_if_no_cover(factories, mocker): + path = os.path.join(DATA_DIR, 'test.ogg') + album = factories['music.Album'](cover='') + track = factories['music.Track'](album=album) + + mocker.patch( + 'funkwhale_api.providers.audiofile.tasks.import_track_data_from_path', + return_value=track) + + mocked_update = mocker.patch( + 'funkwhale_api.music.tasks.update_album_cover') + + job = factories['music.FileImportJob']( + audio_file__path=path, track_file=None) + + tasks.import_job_run(import_job_id=job.pk) + + mocked_update.assert_called_once_with(album, track.files.first()) + + +def test_update_album_cover_mbid(factories, mocker): + album = factories['music.Album'](cover='') + + mocked_get = mocker.patch('funkwhale_api.music.models.Album.get_image') + tasks.update_album_cover(album=album, track_file=None) + + mocked_get.assert_called_once_with() + + +def test_update_album_cover_file_data(factories, mocker): + path = os.path.join(DATA_DIR, 'test.mp3') + album = factories['music.Album'](cover='', mbid=None) + tf = factories['music.TrackFile'](track__album=album) + + mocked_get = mocker.patch('funkwhale_api.music.models.Album.get_image') + mocker.patch( + 'funkwhale_api.music.metadata.Metadata.get_picture', + return_value={'hello': 'world'}) + tasks.update_album_cover(album=album, track_file=tf) + md = data = tf.get_metadata() + mocked_get.assert_called_once_with( + data={'hello': 'world'}) + + +@pytest.mark.parametrize('ext,mimetype', [ + ('jpg', 'image/jpeg'), + ('png', 'image/png'), +]) +def test_update_album_cover_file_cover_separate_file( + ext, mimetype, factories, mocker): + mocker.patch('funkwhale_api.music.tasks.IMAGE_TYPES', [(ext, mimetype)]) + path = os.path.join(DATA_DIR, 'test.mp3') + image_path = os.path.join(DATA_DIR, 'cover.{}'.format(ext)) + with open(image_path, 'rb') as f: + image_content = f.read() + album = factories['music.Album'](cover='', mbid=None) + tf = factories['music.TrackFile']( + track__album=album, + source='file://' + image_path) + + mocked_get = mocker.patch('funkwhale_api.music.models.Album.get_image') + mocker.patch( + 'funkwhale_api.music.metadata.Metadata.get_picture', + return_value=None) + tasks.update_album_cover(album=album, track_file=tf) + md = data = tf.get_metadata() + mocked_get.assert_called_once_with( + data={'mimetype': mimetype, 'content': image_content}) diff --git a/changes/changelog.d/219.enhancement b/changes/changelog.d/219.enhancement new file mode 100644 index 000000000..fec9a07ac --- /dev/null +++ b/changes/changelog.d/219.enhancement @@ -0,0 +1 @@ +Can now use album covers from flac/mp3 metadata and separate file in track directory (#219) diff --git a/changes/changelog.d/231.bugfix b/changes/changelog.d/231.bugfix new file mode 100644 index 000000000..0b37b6274 --- /dev/null +++ b/changes/changelog.d/231.bugfix @@ -0,0 +1,50 @@ +We now fetch album covers regardless of the import methods (#231) + +Smarter album cover importer +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In earlier versions, covers where only imported when launching a YouTube import. +Starting from this release, covers will be imported regardless of the import mode +(file upload, youtube-dl, CLI, in-place...). Funkwhale will look for covers +in the following order: + +1. In the imported file itself (FLAC/MP3 only) +2. In a cover.jpg or cover.png in the file directory +3. By fetching cover art from Musibrainz, assuming the file is tagged correctly + +This will only work for newly imported tracks and albums though. In the future, +we may offer an option to refetch album covers from the interface, but in the +meantime, you can use the following snippet: + +.. code-block:: python + + # Store this in /tmp/update_albums.py + from funkwhale_api.music.models import Album, TrackFile + from funkwhale_api.music.tasks import update_album_cover + + albums_without_covers = Album.objects.filter(cover='') + total = albums_without_covers.count() + print('Found {} albums without cover'.format(total)) + for i, album in enumerate(albums_without_covers.iterator()): + print('[{}/{}] Fetching cover for {}...'.format(i+1, total, album.title)) + f = TrackFile.objects.filter(track__album=album).filter(source__startswith='file://').first() + update_album_cover(album, track_file=f) + +Then launch it:: + + # docker setups + cat /tmp/update_albums.py | docker-compose run --rm api python manage.py shell -i python + + # non-docker setups + source /srv/funkwhale/load_env + source /srv/funkwhale/virtualenv/bin/activate + cat /tmp/update_albums.py | python manage.py shell -i python + + # cleanup + rm /tmp/update_albums.py + +.. note:: + + Depending on your number of albums, the previous snippet may take some time + to execute. You can interrupt it at any time using ctrl-c and relaunch it later, + as it's idempotent. diff --git a/docs/importing-music.rst b/docs/importing-music.rst index 4d256604b..b190dff36 100644 --- a/docs/importing-music.rst +++ b/docs/importing-music.rst @@ -76,6 +76,15 @@ configuration options to ensure the webserver can serve them properly: Thus, be especially careful when you manipulate the source files. +Album covers +^^^^^^^^^^^^ + +Whenever possible, Funkwhale will import album cover, with the following precedence: + +1. It will use the cover embedded in the audio files themeselves, if any (Flac/MP3 only) +2. It will use a cover.jpg or a cover.png file from the imported track directory, if any +3. It will fectch cover art from musicbrainz, assuming the file is tagged correctly + Getting demo tracks ^^^^^^^^^^^^^^^^^^^