From d21e2da317415d30b56a9f6a1b26e45de7d3070e Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Mon, 17 Sep 2012 09:28:42 +0200 Subject: [PATCH 1/6] comments: restrict to logged-in users; improve validateion --- compound/book/loops_book_de.dmp | 1 + locales/de/LC_MESSAGES/loops.mo | Bin 19020 -> 19050 bytes locales/de/LC_MESSAGES/loops.po | 5 ++++- organize/comment/browser.py | 10 +++++----- organize/comment/comment_macros.pt | 2 +- 5 files changed, 11 insertions(+), 7 deletions(-) diff --git a/compound/book/loops_book_de.dmp b/compound/book/loops_book_de.dmp index 171323d..0d3d92d 100644 --- a/compound/book/loops_book_de.dmp +++ b/compound/book/loops_book_de.dmp @@ -21,6 +21,7 @@ concept(u'issubtype', u'is Subtype', u'predicate', options=u'hide_children', # document types concept(u'keyquestions', u'Leitfragen', u'documenttype') concept(u'textelement', u'Textabschnitt', u'documenttype') +concept(u'textelement2', u'Textabschnitt separat', u'documenttype') concept(u'quote', u'Zitat', u'documenttype') concept(u'story', u'Geschichte', u'documenttype') concept(u'usecase', u'Fallbeispiel', u'documenttype') diff --git a/locales/de/LC_MESSAGES/loops.mo b/locales/de/LC_MESSAGES/loops.mo index e3d088f6b48f789fe72174d4b72ff9e04eb4986d..ebb7cbedc511a4b7c1bd788544f33e2447fc6014 100644 GIT binary patch delta 6254 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 delta 6213 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 H?M(k4VP$l| diff --git a/locales/de/LC_MESSAGES/loops.po b/locales/de/LC_MESSAGES/loops.po index 9e1801a..76aaab2 100644 --- a/locales/de/LC_MESSAGES/loops.po +++ b/locales/de/LC_MESSAGES/loops.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: $Id$\n" "POT-Creation-Date: 2007-05-22 12:00 CET\n" -"PO-Revision-Date: 2012-08-20 12:00 CET\n" +"PO-Revision-Date: 2012-09-17 12:00 CET\n" "Last-Translator: Helmut Merz \n" "Language-Team: loops developers \n" "MIME-Version: 1.0\n" @@ -755,6 +755,9 @@ msgstr "Kommentare" msgid "Add Comment" msgstr "Kommentar hinzufügen" +msgid "Subject" +msgstr "Thema" + msgid "Selection using: $targets" msgstr "Auswahl über: $targets" diff --git a/organize/comment/browser.py b/organize/comment/browser.py index 1a46402..2179c76 100644 --- a/organize/comment/browser.py +++ b/organize/comment/browser.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2008 Helmut Merz helmutm@cy55.de +# Copyright (c) 2012 Helmut Merz helmutm@cy55.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -18,8 +18,6 @@ """ Definition of view classes and other browser related stuff for comments. - -$Id$ """ from zope import interface, component @@ -52,6 +50,8 @@ class CommentsView(NodeView): @Lazy def allowed(self): + if self.isAnonymous: + return False return (self.virtualTargetObject is not None and self.globalOptions('organize.allowComments')) @@ -120,8 +120,8 @@ class CreateComment(EditObject): def update(self): form = self.request.form subject = form.get('subject') - text = form.get('text') - if not subject or not text or self.personId is None or self.object is None: + text = form.get('text') or u'' + if not subject or self.personId is None or self.object is None: return True #contentType = form.get('contentType') or 'text/restructured' rm = self.view.loopsRoot.getRecordManager() diff --git a/organize/comment/comment_macros.pt b/organize/comment/comment_macros.pt index 67c4b41..c512233 100644 --- a/organize/comment/comment_macros.pt +++ b/organize/comment/comment_macros.pt @@ -58,7 +58,7 @@
Date: Tue, 25 Sep 2012 11:15:50 +0200 Subject: [PATCH 2/6] fix 'state' report field (backport from bluebream version) --- expert/browser/results.pt | 3 ++- expert/field.py | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/expert/browser/results.pt b/expert/browser/results.pt index 2fd8129..4a04496 100644 --- a/expert/browser/results.pt +++ b/expert/browser/results.pt @@ -70,7 +70,8 @@ - diff --git a/expert/field.py b/expert/field.py index 2ff64af..ff813cb 100644 --- a/expert/field.py +++ b/expert/field.py @@ -109,6 +109,8 @@ class StateField(Field): def getDisplayValue(self, row): if IStateful.providedBy(row.context): stf = row.context + elif row.context is None: + return None else: stf = component.getAdapter(row.context, IStateful, name=self.statesDefinition) From 8f190776023cea6be16435a5b5a3baca139a263d Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Wed, 26 Sep 2012 12:58:15 +0200 Subject: [PATCH 3/6] improve and extend book layout: show images --- browser/concept.py | 5 ++++- compound/book/browser.py | 24 ++++++++++++++++++++++++ compound/book/view_macros.pt | 14 ++++++++++++-- 3 files changed, 40 insertions(+), 3 deletions(-) diff --git a/browser/concept.py b/browser/concept.py index e795ade..0aa03e3 100644 --- a/browser/concept.py +++ b/browser/concept.py @@ -413,7 +413,7 @@ class ConceptView(BaseView): if r.order != pos: r.order = pos - def resources(self): + def getResources(self): form = self.request.form #if form.get('loops.viewName') == 'index.html' and self.editable: if self.editable: @@ -430,6 +430,9 @@ class ConceptView(BaseView): if fv.check(r.first): yield ResourceRelationView(r, self.request, contextIsSecond=True) + def resources(self): + return self.getResources() + @Lazy def resourcesList(self): from loops.browser.resource import ResourceRelationView diff --git a/compound/book/browser.py b/compound/book/browser.py index d6e2232..533e12d 100644 --- a/compound/book/browser.py +++ b/compound/book/browser.py @@ -77,6 +77,30 @@ class SectionView(Base, ConceptView): def sectionType(self): return self.conceptManager['section'] + def getResources(self): + relViews = super(SectionView, self).getResources() + return relViews + + @Lazy + def textResources(self): + self.images = [[]] + result = [] + idx = 0 + for rv in self.getResources(): + if rv.context.contentType.startswith('text/'): + idx += 1 + result.append(rv) + self.images.append([]) + else: + self.registerDojoLightbox() + url = self.nodeView.getUrlForTarget(rv.context) + src = '%s/mediaasset.html?v=small' % url + fullSrc = '%s/mediaasset.html?v=medium' % url + img = dict(src=src, fullImageUrl=fullSrc, title=rv.title, + description=rv.description, url=url, object=rv) + self.images[idx].append(img) + return result + def getCssClassForResource(self, r): for c in r.context.getConcepts([self.defaultPredicate]): if c.conceptType == self.documentTypeType: diff --git a/compound/book/view_macros.pt b/compound/book/view_macros.pt index d64994d..cef53c2 100644 --- a/compound/book/view_macros.pt +++ b/compound/book/view_macros.pt @@ -14,7 +14,7 @@ -
+
@@ -45,6 +46,15 @@
+
From cedaf06606657122e5670e62343c88d0caab6bda Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Sun, 7 Oct 2012 15:33:16 +0200 Subject: [PATCH 4/6] collect error informaiton when updating collection and show in view --- integrator/browser.py | 6 +++--- integrator/collection.py | 19 ++++++++++++++----- integrator/collection_macros.pt | 4 ++++ integrator/office/base.py | 21 +++++++++++++-------- 4 files changed, 34 insertions(+), 16 deletions(-) diff --git a/integrator/browser.py b/integrator/browser.py index 0ecf9bd..ad103ad 100644 --- a/integrator/browser.py +++ b/integrator/browser.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2008 Helmut Merz helmutm@cy55.de +# Copyright (c) 2012 Helmut Merz helmutm@cy55.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -18,8 +18,6 @@ """ View class(es) for integrating external objects. - -$Id$ """ from zope import interface, component @@ -44,5 +42,7 @@ class ExternalCollectionView(ConceptView): cta = adapted(self.context) if cta is not None: cta.update() + if cta.updateMessage is not None: + self.request.form['message'] = cta.updateMessage return True diff --git a/integrator/collection.py b/integrator/collection.py index a6a6670..33c1912 100644 --- a/integrator/collection.py +++ b/integrator/collection.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2009 Helmut Merz helmutm@cy55.de +# Copyright (c) 2012 Helmut Merz helmutm@cy55.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -19,8 +19,6 @@ """ Concept adapter(s) for external collections, e.g. a directory in the file system. - -$Id$ """ from datetime import datetime @@ -62,10 +60,12 @@ class ExternalCollectionAdapter(AdapterBase): implements(IExternalCollection) adapts(IConcept) - _adapterAttributes = ('context', '__parent__', 'exclude', 'newResources') + _adapterAttributes = AdapterBase._adapterAttributes + ( + 'exclude', 'newResources', 'updateMessage') _contextAttributes = list(IExternalCollection) + list(IConcept) newResources = None + updateMessage = None def getExclude(self): return getattr(self.context, '_exclude', None) or [] @@ -102,11 +102,15 @@ class ExternalCollectionAdapter(AdapterBase): directory = provider.getDirectory(self) adobj.storageParams=dict(subdirectory=directory) adobj.externalAddress = addr + # collect error information + if adobj.processingErrors: + message = self.updateMessage or u'' + message += u'
'.join(adobj.processingErrors) + self.updateMessage = message # force reindexing notify(ObjectModifiedEvent(obj)) else: new.append(addr) - #print '*** new', new if new: self.newResources = provider.createExtFileObjects(self, new) for r in self.newResources: @@ -206,6 +210,11 @@ class DirectoryCollectionProvider(object): ) adobj = adapted(obj) adobj.externalAddress = addr # must be set last + # collect error information + if adobj.processingErrors: + message = client.updateMessage or u'' + message += u'
'.join(adobj.processingErrors) + client.updateMessage = message yield obj def getDirectory(self, client): diff --git a/integrator/collection_macros.pt b/integrator/collection_macros.pt index 6df9ca0..8c3e898 100644 --- a/integrator/collection_macros.pt +++ b/integrator/collection_macros.pt @@ -7,6 +7,10 @@ +
diff --git a/integrator/office/base.py b/integrator/office/base.py index 92ed93b..d4d86e5 100644 --- a/integrator/office/base.py +++ b/integrator/office/base.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2010 Helmut Merz helmutm@cy55.de +# Copyright (c) 2012 Helmut Merz helmutm@cy55.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -18,8 +18,6 @@ """ Resource adapter(s) for MS Office files. - -$Id$ """ from datetime import date, datetime, timedelta @@ -54,11 +52,16 @@ class OfficeFile(ExternalFileAdapter): implements(IOfficeFile) + _adapterAttributes = ExternalFileAdapter._adapterAttributes + ( + 'processingErrors',) + propertyMap = {u'Revision:': 'version'} propFileName = 'docProps/custom.xml' fileExtensions = ('.docm', '.docx', 'dotm', 'dotx', 'pptx', 'potx', 'ppsx', '.xlsm', '.xlsx', '.xltm', '.xltx') + processingErrors = [] + @Lazy def logger(self): return getLogger('loops.integrator.office.base.OfficeFile') @@ -136,7 +139,9 @@ class OfficeFile(ExternalFileAdapter): newZf.writestr(self.propFileName, etree.tostring(dom)) newZf.close() shutil.move(newFn, fn) - self.update(attributes) + errors = self.update(attributes) + if errors: + self.processingErrors = errors def update(self, attributes): # to be implemented by subclass @@ -146,10 +151,10 @@ class OfficeFile(ExternalFileAdapter): def parseDate(s): if not s: return None - tt = strptime(s, '%Y-%m-%dT%H:%M:%SZ') - #try: - # tt = strptime(s, '%Y-%m-%dT%H:%M:%SZ') - #except ValueError: + try: + tt = strptime(s, '%Y-%m-%dT%H:%M:%SZ') + except ValueError: + return None # try: # tt = strptime(s, '%d.%m.%y') # except ValueError: From 027b661110682717f6bfc8a7d576e4e873be0b21 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Mon, 8 Oct 2012 11:49:48 +0200 Subject: [PATCH 5/6] add request attribute to AdapterBase in order to be able to handle those strange cases when we need it --- common.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/common.py b/common.py index fb12526..985f27d 100644 --- a/common.py +++ b/common.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2011 Helmut Merz helmutm@cy55.de +# Copyright (c) 2012 Helmut Merz helmutm@cy55.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -98,7 +98,7 @@ class AdapterBase(object): adapts(IConcept) - _adapterAttributes = ('context', '__parent__') + _adapterAttributes = ('context', '__parent__', 'request') _contextAttributes = list(IConcept) _noexportAttributes = () _textIndexAttributes = () @@ -106,6 +106,7 @@ class AdapterBase(object): __is_dummy__ = False __type__ = None + request = None languageInfo = None def __init__(self, context): From 19b50d9e8f32b01c6101dc2363f68fb965c3ccf6 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Mon, 8 Oct 2012 11:50:51 +0200 Subject: [PATCH 6/6] extend processing of office files: error handling, handle description property as comments --- integrator/README.txt | 4 +-- integrator/browser.py | 4 +-- integrator/collection.py | 2 ++ integrator/office/base.py | 29 ++++++++++++++------ integrator/testdata/office/example.docx | Bin 20337 -> 23561 bytes integrator/testdata/office/example.docx.sav | Bin 20337 -> 23561 bytes resource.py | 9 +++--- 7 files changed, 31 insertions(+), 17 deletions(-) diff --git a/integrator/README.txt b/integrator/README.txt index cba0381..62b6532 100644 --- a/integrator/README.txt +++ b/integrator/README.txt @@ -231,7 +231,7 @@ Extracting Document Properties from MS Office Files >>> path = os.path.join(dataDir, 'office') >>> fn = os.path.join(path, 'example.docx') >>> os.path.getsize(fn) - 20337... + 23561... >>> officeFile = addAndConfigureObject(resources, Resource, 'test.docx', ... title=u'Example Word File', resourceType=tOfficeFile, @@ -241,7 +241,7 @@ Extracting Document Properties from MS Office Files >>> content = aOfficeFile.data >>> len(content) - 17409 + 20327 Clean up: >>> shutil.copy(fn + '.sav', fn) diff --git a/integrator/browser.py b/integrator/browser.py index ad103ad..aeafa87 100644 --- a/integrator/browser.py +++ b/integrator/browser.py @@ -40,8 +40,8 @@ class ExternalCollectionView(ConceptView): def update(self): if 'update' in self.request.form: cta = adapted(self.context) - if cta is not None: - cta.update() + cta.request = self.request + cta.update() if cta.updateMessage is not None: self.request.form['message'] = cta.updateMessage return True diff --git a/integrator/collection.py b/integrator/collection.py index 33c1912..35d4a9c 100644 --- a/integrator/collection.py +++ b/integrator/collection.py @@ -101,6 +101,7 @@ class ExternalCollectionAdapter(AdapterBase): adobj = adapted(obj) directory = provider.getDirectory(self) adobj.storageParams=dict(subdirectory=directory) + adobj.request = self.request adobj.externalAddress = addr # collect error information if adobj.processingErrors: @@ -209,6 +210,7 @@ class DirectoryCollectionProvider(object): contentType=contentType, ) adobj = adapted(obj) + adobj.request = client.request adobj.externalAddress = addr # must be set last # collect error information if adobj.processingErrors: diff --git a/integrator/office/base.py b/integrator/office/base.py index d4d86e5..67fe4bc 100644 --- a/integrator/office/base.py +++ b/integrator/office/base.py @@ -52,16 +52,12 @@ class OfficeFile(ExternalFileAdapter): implements(IOfficeFile) - _adapterAttributes = ExternalFileAdapter._adapterAttributes + ( - 'processingErrors',) - propertyMap = {u'Revision:': 'version'} propFileName = 'docProps/custom.xml' + corePropFileName = 'docProps/core.xml' fileExtensions = ('.docm', '.docx', 'dotm', 'dotx', 'pptx', 'potx', 'ppsx', '.xlsm', '.xlsx', '.xltm', '.xltx') - processingErrors = [] - @Lazy def logger(self): return getLogger('loops.integrator.office.base.OfficeFile') @@ -91,20 +87,32 @@ class OfficeFile(ExternalFileAdapter): from logging import getLogger self.logger.warn(e) return [] + if self.corePropFileName not in zf.namelist(): + self.logger.warn('Core properties not found in file %s.' % + self.externalAddress) if self.propFileName not in zf.namelist(): self.logger.warn('Custom properties not found in file %s.' % self.externalAddress) propsXml = zf.read(self.propFileName) + corePropsXml = zf.read(self.corePropFileName) + # TODO: read core.xml, return both trees in dictionary zf.close() - return etree.fromstring(propsXml) + return {'custom': etree.fromstring(propsXml), + 'core': etree.fromstring(corePropsXml)} def getDocProperty(self, pname): - for p in self.docPropertyDom: + for p in self.docPropertyDom['custom']: name = p.attrib.get('name') if name == pname: return p[0].text return None + def getCoreProperty(self, pname): + for p in self.docPropertyDom['core']: + if p.tag.endswith(pname): + return p.text + return None + def processDocument(self): changed = False docVersion = None @@ -112,11 +120,14 @@ class OfficeFile(ExternalFileAdapter): strType = ('{http://schemas.openxmlformats.org/' 'officeDocument/2006/docPropsVTypes}lpwstr') attributes = {} - dom = self.docPropertyDom + # get dc:description from core.xml + desc = self.getCoreProperty('description') + if desc is not None: + attributes['comments'] = desc + dom = self.docPropertyDom['custom'] for p in dom: name = p.attrib.get('name') value = p[0].text - #print '***', self.externalAddress, name, value, p[0].tag attr = self.propertyMap.get(name) if attr == 'version': docVersion = value diff --git a/integrator/testdata/office/example.docx b/integrator/testdata/office/example.docx index 0ab00cb111784f95f7cfefdc8ae46805a7a871be..7f17545457e83a8ffdf47e2a8eaba97aae2f36f7 100644 GIT binary patch delta 17557 zcmcJ%Wmp{1vMxMma3{FC6Wrb1-7UDgWN?Q70|a*n?(PJ4cXxLJK>{Dyd!LhY_Wka2 z?w`~A=rvSLt(vOUtKY8muD;F!i)aSJQj&#$!~j48U;qFB2_RJMr{@|N0FY9HMFtK` zmUmcXMhLxxxFhkElPjl2oiwNH9U$ zMqJ(|B$7;25z1?>iH5H%r|GM)YWOE9ShZCySM4|5u+ovjm5CkF&)LGq>oaV0r86}V zng~yGER>7i8FGECg(5TA=hM=$(qje(9@kVxfYu%B5+UOt z_{jP7j++~HN?b$ldklY>#gAtN*?_&oP2Hc!g=^@vk!$A>75CQ=%SJEMxrSbZ)nA{5 z3t@GHo#?>7V1?RVeZa!dRIo?bSL&d5>HBVj%U~RSIq&O;W>S!rUWuy_J$1kJ2Gk~U zH`PF)zIl;=J}!?4Uq#w^Bp_dp|Fwy`nqCAZO~ts0fj-)Kqb|Z1F+K~3KjDYIc>pRM z@DM$WXu~5{KXIo;K^Voowrw#QAbKB%Xfb9q$pp-Fp^zuk=g z@~fj97KHtLtGG%z1SA)1INrru)B=LP4!z*De*b1N-}6YvEcF=~Y~~8g_kr)X;@WU~ zaDmMe2N#i53hZ0_y|K=5zHI9oKja+q7~SB-bAVLP)UaFVmpPRjgVE&l@QI9QMHa~| zUrtTNR{#hVAEOQ(k{tq0jGgc?^gZ8lFm);)=)i!c~h3Zfm)cC_#9jak>LNasMswv z{$YP~oL?H>S^sLla%cz_KXtOQs;Fwp@s6pb)Lwrl-||~LT#aABTm&43M~Rj2GrCpz z&XGJ&cP2SX(EywP3EI@U?bFa1xkW8CiwRc9qG6?O)eF#;%$#9sI6MhFh99jS+`#`Q zY6}CH-&n=C3bM3imjGTrWZZxemeJ?0A^_lVnU2oWBtWrZ-*t{j{ z>A?)d9t>U@ds`;P*CT-$Fj3Xp7%_&~Vk~;)+;i|h@|kWyA@~dvEKVWZ)x6Dxq6@Om z-ljMf#Jg^EeM>+9UmKY7!0K4?5sC2(kC^I84@4i%TM)vHkV z{v$WQ<%Wf$E@%KCmH+@ieZMe09GuOV%p6SJ?9A<589nW6&$QPSR;4gH4XrkNZq(_L z$e~4Mi*w;1Q7Vd2raF$stxdjWE_1OijB(NE{WKxU*EtWmv-ScB41f7-8y0+}D6Ki~ zEQ~gpdV8DMmAbp=AP}SCFxG%7ym6)!@GF5g5Ke!jSJM=Q8pK$)ks ziX$-eIoS%+*_7BJefSgWmtp(*A$fB>5smV@aBWppo|3OAga^xT&7a32JEcPSp)Lo2 z68#cxFM6ZyB~v46Br7wF7_@?=1l~Q7bbB9peJH>cO!RLtc&M$QN!yrrbJvV^a#XB* zL8!aRI@9vCMt;H@b9-&Sa=tG^RyG?ocVECU=b6k>GdL2z8F>C=8O(74eJYd;?^g?J zD`sY@n=$JP&ZzamW~G1^JxCb)2*%6QeSwRi>}i!mJ$A^`x>I+R$xh|8%3l(bB4@>h*jShj)uvLT-u3izTq5XotUjQ~*adRpLe3A?g z`6SExWyDmMZP z>5CytnPWCb+)YyFnZ|Tp5%1o_UgC2%7nfuz!qJ#-vc2qtzX#mLpwnb~_k!U;y{``0 zZzmq%JAL$t~KHDQg#mF=I9>$Si z%PwwwW9KfQYHsSEY=-%e@FIQTGg#Q}39jh8647aB1ptoA5979H;$!GUU@)YszP0Qu{x z1HU*Jnk_c)sWkthg5x3@Fj{iw-gFoOFfY>HnTTq>!a>N2=KzNyu_Ti)U$(-cqdCl< zu^db3CWddeDlP~UU3V=Ot-#5iqc(R_mi8_h_O=j;ij)Y`1wZJ@og|;`OP7T4q?o6Kzg0ssBSn#N9Hi8j%pUqL6J`G zwu-8;JX>kouy1BzJiFfeWGb*y@DZV^7^0(3p>TKtbk2*s*JP^2=|H-kGL1Uh6wGsR zNdxN=tjgsC_qmiPcU`szD{c!)3@#_kenLuw)|s)_tW(G+N&hy@i4U-OjE-&*2{^Tp zZEzvHDtrBK?C{sS=c7A>!I9zZku5c_IzrAgl}fi&)(XgKwN<0H@w>1X->F&-R#u)) z8V&hrTX)^*ETLCl^MRN`*%~FJSj{=>>vmgJ(e1V8E8`D*4p>R8=luE268ge5=EbDy zQNG`6vH3B#1r0})t3KR6x|JwWjt1Sj59 zF0cEnz=JoA)n^WQQSrI?Ls7)~+HR`A8!lFk0aE#844K#Lbp~*<^M?A3pm2QYr%Q_s zmgJ9Ms`jrkGFDgUUbYMM*`roIhlZ+jXmjOFW2$PWo4dbi6HDFt1_LWeObPRY2J}U~_iT%YW*s6u$Gr4|hwZQj{ zla9f$J19ikn`!te+5&9+Eldzz=@hl(eJVc7@?c2Vf$^lb?qn3}%RGqili+-63yXL( zG`c;Z>ElbdEzjt+<(;F{V1xDjfj8xG)FT=+M?(u_8TdNzYKl;yDnv6{`cUDUxh~fL zCF!|6TTo1B8xA6u=q1n2rvnw1g7g;t@i;r*vFi(wHsiXDuR8q=_dF-X*qM{Ip6a&Y zNrA9Uwa6njw{Ck;FF{)tF(zPZpYLEb95gHgzEtE;u>m669z(EK;Zn=iFl@A)<{9%ebB52^UK3$o)3WN8gFrpHa(=STg~8+WV={;! z&ML(!Nq+pU_Pg$kjI9WCYJeY*9J?^cR-tKHDnw^D{WO7Srp{wym1Kx{i&t2% zn=bA$7?`bt85(K5JE6v0hrWVZ)bdP&;kTAwz1Qo~QeVPYoL3b#a@il4x{X{7;jOtM zF=Pofaq0C(a*AUe@(#rEw415q)Tp+<3>&D34gKEp7BQLg)49q>o*{a%A|uVRYioas z*)z5gH;>Hf-pkgLioLRpglJrzD?ew|lc;0*CqjV(%Uo>*2LOcN005N#KqwXt4zA|T zEPnvXp2j;sVaDjpuJ@?+8??SPpS`zt$1$k{rlLF{a>h$2(M?LInjHG;)@0^6Jbnfk+)uuX zAkq#Nq8N6$nVBe@N5L{J2UQp@(mtaDSy`5cxhKZW9Ye0kH?7d;@{I~MrkkN9dL3f& zp_G%v3sMHBl=TN(o+HFJhkPfnF-Ho$12MX=(Yf)6cI~JvVJxv(it*wNY+Hw^A6F<< z6!5sh9SU)Xu-3xk`7v?2jD*|33bH{yox^U|{v(;8Xy}Q#$VeZ&=RBOKG7XiQQL*^X z=PfF~Bz1i=_Ydcc=%uY>oRFKL9;8@yc&H~&_?DhFG=D0JZLXRZm4t^JvGGa%xXh?X z$WU77Is29tHq8EQoBg*R$)k>|Go&BE3Psy-^;xEG0E>gtdVAQyToj-YSb6a?5~iE_ zYv5?2lXP;bvf7j6kUKeH8aIg&PRb+Nr0AJfzVIed3dt;e3<=4p+-hdcA`!vEX?SWm zc-2oz2$yqtQBJcL!NljGAwQ9xH4@HS$W)_ zh<3G`pQ^!GVZHs}+52JybrMiymqT=K*A`brU4cZkp z=NR6p!;H6R^3t^p7SE=)eHUSqq_bVn5ZJ72WRCMY$vT{~-${z5s4We7%g zRR-)--`84I^P3KGhv*<4*Zu14SZjOrr&rqT2p)(i-IAnh;Lhu{hPYtYn~)222B2fu zf_{DrK4bH-(}ip7LNGC! z);<%Endd2|)W;qqcjOkiVel=VCNkqYPd*x(;&d{vt6*0rFl}D?!VV*^LDsrgMa|Oz zEt-I?InTZvvTlp`!4w)!Gz)&f36Z0hlbrHAy{5a_g=8LL9@EY8tEwn2cBN<~etF(T zOiyJ^p1W$Aat_`}e_PxS2Z;1FH*6_oE4NxKwi76Jl3|6ZFUO>3-Te{mZ9`DiDo*FC z(M!%aZ2s;cK;{p4Z-r1%;#4J1<6?zoO;sG%W^q+bz6!`6lNWL^KWqU!^01c~rH1th z(q0K$pFr54&9O7y8Dek5L#ba`b*g#AQ~U?OLT*NT>`>W>hy0M4JLl-;=*F4!togA$ zqQv+%_nX*?7C|uR{AU%VUgZLH%;0AV9|csB(c|;P zzT)TlEpCQF!KYaXzGZi>Yu(}Ag~$;MhEYXEa!F5tUa%EgtA%@<%DhLce0)K17dMPajgmXl4a2qA?{ zXiRu{BG|wfPHtNgo-!^rBv;<^=)BE@r|I%}Q%W$338BZ%48C^4fKDl*r#mu1`_j?I zhZ`2477nxsXO5)WCQIIaKECYgC`&M>1lN)`SGjgYV@%qSuA-WyV2tNuj8bDBc6Q6C ztsT5+mvX8yAwB(>&&A@QSB)VHTQq^HPlm(O?2H%VB-f)cAr_IyXJIl;7vF4nO(t|G zg?Sr@ae`W%pBrWja-^`_fgzX=zDwvsbH?ftu?2cf8!uM28y%PSso_NN2f#WSsWHO8 zo(<$$Ztcvd>bwm_xJkdXM-G11y|?~mh!zANKnv5)y7f^n3_Dd{4XrFF_R>X-6Lt4U za-uohGCZwUmb%`~o05Xo6451vP2MRN+W@qw8Cc;dABI&W`Yd&6L$43=VU7wdx=E`X z?f?QBWggrkxR8QaLw(4L+?e`SH(*mOq42i5)8Q$)f)-4xdJ$-0 z=r6&BhqPmCW+TS6yMxOKB9DFk{IR2qnyuL|C9PD7K<Q06|DnC9-HCg1K22Hua%GQJ$ zSjaqLSD(?AsURvP!DG5Hb{u8Nj0bGUIA}VFH@f_RpQhG|AzrEAdc|f_7ISSNe+d^7 zAa8S}Uf9J`D4sU{~jt1#`FOvPz?|=`Em|W<>=KAx6EuUyY#@6Q46XPYJI^y&_RI_GGpr zShkpiK*+&;6zq8J=`sXSkJJ%5+UM%!EF^_B*pEf-il2zA3C9(uzrW%Z2ofUcy4XGQ)eJp2C! zXW@zl(&B%--|!QmKuq}9z{FMiUgGz{H`O@->4ol4Jt(hew%&Ty-oq0hBNg<~7P3Hl z^9#BBjD1O|T?Yx|)!`<#kNZQ(s3k*%Dhy4;_h>ORNDDX(8ZV$v##+LV7ZMH=s+kPO zOnlqp<8rwIxtYH~D>ZR9MFT1gO*mfJ23pA32Ap+?VmqV@%bzo|aC@Q`})hw6;D><(B zhc;1e9Gt7G+mT9^fMAl%5Z~hMVq9A~!YI4i%3sL`&a{~IC2;$4wmH!{pU;vkD~-Be zF0JpGIMw=SE}w@@%%Qm@G9`RMzXr@>91tbeoHpLvi@E^8qh%f%wj>gyqV~L?EFWtT zB2Rv?SR0V1UZ#nwQGGG}Q3MLry_im@E~rhE+qutx?aIY57hs|>w(Y6BaHvc}Kc5jf zXs7+Xp&;5g&b)QxE3w+ZoaVmKP$EhS8K|k$p#J=%ioz>CDSU%!Cv3N=aQM#>D$@Fe z{OO;Jra=J!XaJDE9LD>j<*G*N5-Z{1F+4ao1?VMP_6K zsq#!rlx_)R-a<_J7}#40E8&S48|lF+RB$CNcs3ODJY&DLa*BW{hcZ$+`Qt~JQQFUD zf6@x`Yv?_#%iDKxp%NnDN%`|@ZJ$;s=GQ7|S>gVqwfG-tT}ApwT6uGonda!F8%5f5 zn|>hGa-n&&ImhPBp!wp(>u5uNfYhX}Q{3&Uk29I3sZgYNPb=p;YWqoSkbUD|&D_+E zR0v#x_|Qz29&d+r?A(Sd@AshoTRM8V#LOMj3ZFB_a2)F1CMcyH~_JM+atT z=z~@`F#Im%-XL}lYmK^v*3DV*U|^5!K_#4iN9pviQ{@7D3DMtPo(!ZHytSp$hS6_+ zbG1I49EG29Dh56vso@pvkxEyEN`I9phXJ*T-|QQ&XH)T;#*>HBNn;Jir|pf8S9R%e zw&X5|q#T0qgWYpCHUCQc(J_`J_Cyx74UM8TCCz6~L&FX_6 z9olO(^P^Z?#U`~0#jmGYL&B~?c6i=>l-Ukw68akNCwd^Wt)pc1I~GEodoHJ7xo$*^ z?Yho#YDXXtzjLuq_zHWmp!ZU|@ti{jbQn!UGfAPQV{DCpAGejOACTf3Dh;IiEHs(l z8K{i>V*}y?)ba6DRqF_%;AofQ$~MNOR!Kb4AOfVLI!uOxyNZ>XGqE~IApy^5PP0&~ zYM8F{6F%CM6Q3OP1lV}7opF5O76<13+AX?EB%plQ0~gk4ffV**c2K!^x9E+KIMkt> z56@?__#;GV2o4A?-#SDU`Z_rkn9#YMBr)|Ay4&C{56d5mEc*kd~WUpu8 zHZ1BMeSKl=xE1T}Ozg^x-Fe%Vj=cr4ko};T6`N4yl=l=W2)KbitP$}qBbc8l&{HP*g5v#D6T?JE#s?!W%+n`MoJ$NK`oN z`CaY%zCsu;;)pfDW1%FY%ro+=a;*$x+M(HjCX&T<7nX~rp@Fr-2r5qE~s%@hOYJ;CSIbEXdY<%wMA0v0p{Yc^Y-#m_kd>BNBKr-Bffk zwR|A8AsxO84uj09>Z`1+oJBrCG=7v+cBg&QJ&IyAh1cl`GD-@K@N|0WCG&WDv;QX$ ze+AF;a(XXF&cgn=-~VgL)WX5uRn6GM*8ES=rY~9FVTBpv52_Os>tu2g`K6YdS1#4I z+`nSAIKb7XV=LK6vcGxBMKqOAjb>#kM!n7T#Z-{{kbh0EJ#uc9)vh^#72}TiCZ)i- zci%nqOMCgnzz}Ql5TbOF8IaZ02%3LP5ZF5Ty(VG7li4t>B!@LoD_!1ib1E3t#GBR> z4cfF2s^&`7!B6P*RT!)BZ&=m zQm!J|Fh7~DW4JzV411|gN|s-^nQsJASyalgG)cMUyvO3jS-cYz2s{R3tQ3pn6aH@4 zq+(U85TH*eW@!*`ds9LV9ys}-M#BnqGF&Ybin*TZ7-1U>AIv?Fj4${W@HOrd(o&?} z_}QaAi!VF`Z{5IE_es!*6yWhn0FC3~xa;eb z$mbV}k77cH#R#JhqrfpMf6wheoJ+jXj?4a$b;Lt4ksRheKVsA#&fv1*Oqf?*u`HwQ zZIcEbRBaJ6w%9;gXHu3D(h9N2-yaGmeu{m(%3EP2>-*YG0uKIjIwWYgV;7MAOQ1Bj3r7Vxv|DcG z#QD$Z6Ku23>fh^&vz=+brsG0OcT?+d&;3;92`K{s^@yr3ua4KKLOriM4T!cS1yHvp z1Zv1>3~jyy^p!fw9HOJD4Kqk>T`@$!)SA`sN$_wV6gY0261Yf1`Zp({SAI^!+4h#= zL|bnwxs9NN#cx21^B2??M}8H({1qoQuQC3@`HvzLY@Y3G{IB=nmL9#a)fh|8mF^P-VMF`v(K$8HiZMDlv`l+fnouqHeVx&=i-VQheBPp0|x46Sb&0^5-gD(_42=m-^VbS?cvc<{|dy?og~vBF$i|haSj`C0UZ=AivM+z@yXm!Ld9v49|JJE=6hb$s6tQ=v$NE@7=?&+jh@Lu?v5Ha>1`1{nXTv zcQ3!V9>7uC9_dmeA?+*8Kej>nj$g!@a<*+2NM=Q=Ho<5bV|-K`oW1rGpzSxqpmFX% z;&-Cxkf%=oKP3803Le2S9K<|MXN8Pmh0Jn0E9Xr*2^2o&nz=FIl#5OomX=k*_f8$# zZ}o&4!9T?$pi^e{V;N9%VskdRd^uo@Pi>3r_CyAOrgf_`m^$cc+&Puw%c_qXo5Vn_d$=HoInJNvOhI1!SLh2?d0(Sf5!{`hKTu#x3hPE5wx z0#UQM2DJQi(?31`tdHVih51ChJRX~jMV8_jjjIN^S(qAhDhLy-B}3UZ+% zgg>MVfSXC<6+mei9WTu(iKu^do-z2CDtEzC!97oNx3h93pa8*%Y&<%*-DsuQv|h>( zcRNXc$D3<#+HH4i##ES1wul}O?HiwK3jBnNeJd#aIklBgZFi#or|W6h6(e#hh=vbUkg4tBJ zN_W?)A+~)z$rw?N)aN`E3T=nQMHJnD%rPEH2e2V{q5D69JUE9O_vE`xT!Mhxb3E_= za+G?0;PJu5$@%kPX)R~D@@2fZ)Q5Wi>XH{CjuR~8Jcq*zU1@2fCY}=vKFpCcH^96& z)}Q^4xlj@Z@G0g!c>wNvS3S8dh@+aZTq3&PY?GBK}v{|sMYUr zGQzo`G%{|#qkR7ck{1n%QcX*bqxC-wdNT{T-B1E*T8x>z zOk;gLZYXoA3Fh7{yhj{Sg#Awpd5iysf|=Rp{l~(DwF6-4!gq__?f=vKiQ>jOaqoNR zqQ((JRZrhzWilHCR{E|B3?D~4$zaI9q99Vt)C%u7lO{v$q<90$9y4OAPtJ8 zoA%==pfV~XftW@kRKwhq_PU%x3Ynw_6A6XWRHnY>`h}h~Q^NjfOaVFLu=DrtnMZZb zo%#b~sq?J%0E6$|s|hFPJsezGpRW@|PL*^rWi)4U3Z>b-k}9OQfLGACpqw7qr(+f( zyg0Q%RD}Mbvf4|Sx6zWm{>iD#Lrv3x-KfV?SbT&5-YJv9g)642){X@69Qz)TQJ*RO zqENG#FSSwha|{aR`6;ilBDaS!xEYL#wMsBUVgx+(9Nv{V6;trFj{0&srS|FBD9-yL zqYIa%5b%h`^ue6yKsPnuB|&ohMTnGO0Ch#azy+d-CO8j9kIO9j%NvV_KFpCwMz@y- zelxor`9er1C8szBqM3g0l^0i4|r0VV14rD&SJTl z09iMQpzipOX{}oO_Se2@`zEO)_8RrJwpPPE4R$^arFt~FE{({>-fI&i4i&*6c5w4D z&PLm55>T!g;V{s&vJKh`J)sx`80YLF`81WKHt|BwWm4$$zW(l{N@%UI@zSosS48>@ za2JL@yaifQfjUYgs?SPE+D{i|(QQYe)WnY>1NV*pw`YlXD$~iF429eUUq7e807rQ{m=76eO3Q2pyMa)U>_5qr0mFCBoz@d01w@# zKFWL7Uc)Qok97%%+cvZ$?{w1119LIk!JI)gsogkEpedJ3v8vE0M1MS1Gj#LDnI@27 zyTDO;>TU3(jIisO9!fqP-$)10Kn2|(ys@HFJP!G*aZRT{iiJI z57_h1oZ&jw-!C#9T^TRc*AyO~m!^^t)~G`yA*T(>zBmf41zi}QgFUG4(zcAm;5rhw zWn6sE2GV(bbtoQ+vUM@ET~YQ_@BH!O@uxAMG!A81tED`zDBAV;cM>y&@q6q3nd z2}31hk0*M|9NF}jN24Hh`d7pzdq7pTl4=>2+z~uaj$!>QyY|Y)Q5su_!u5sJ*2-r* zg!zR|I4E~WO);0dZ?v4SYCjIg_33^$o+QQ$t^;{`Tn7C1#Y~F{61&=oN%{s~Y`?fW zReVTpucIhE5LNUG66B|Ans9eX9kUXbeJ-R>Ut+t+p|Fn76gQO=J3lk+kVjh0EA-Bl zx{ZJKKTazI3wu3uQ0H(zJF`Vx-^xc?ICCc%^;=ugD@wfzREI>4xKg`c+UV$V$(Q=E zs;HK@6HH%LHk;VNuAI&A(_X(tAU!i?^fPpH=)D6Dhe}{y&$o5#$WoW*g0+zS$!{m@ zyi%YiTrJO>>Q$R;i*EK0h-jAbxhpkhRWFw2LQl<9{|Ap z@4!;i%GFZb!ou9t^&c3sK3!RLmFu16>~PQ-GDYl{IkINglhZw02HytQwlWWdO4{)Aj3v8__}mgVJV!)C_(-S-juW|O3_RJ~ z^yB$8`rzE35GT&Et@;*n_!{;Ae7&~!%PRX8en^Ndb#v>6EBCul<@nJu@q;X3-3#+a zVM>=4rLcf#N#`0AFro_ckFk`JyJWYjX~X`9+*6F&H+{}s%vhWi!--VgIz#jpw1SDt zz0?-VyR`g(QyNthM$%k^?)zygE1-nJZ}sF1EF=Q1u)8>yQ>AM~Zc-bunh+aFgJC1g zTQQs+>Rr@d#2{aq8F}nyogkENg|domfu521Hyv&~0#;XgLn-)r=C+6>OW3w4t1LLV z1Q?R;gsxvWwJUV-iO%7QhQc|veY=~l(zLzNSmU`^pXKGGv1TvV_v1}a*=Z@O>L!0$(0a*a zZP0QE2M0@h@|y;!f?+>$b~GIgywNpS7z4%!0&tSq45=eX#R;Lgv#@MB{w~`>Gq6w4 z01b9{A{!9W4WtQsT^{1*O}{1%-;HC@R#b_D*45SP0S7t@1V!eP!zR$0k}u<0%NNyn z$n7h2);g6e>J9K4U(2Ldv)Ah`Ncrf839)7b_=Do49Eq5h=WqNgH9CqEg%pJw4}O3d z!i@4Zc9@3AZj7H&ep=XD(ooI#w#G;T>-s$3?wdkfg!eoi+cc^=1hczzC*cF9)68aH z`YWZ}^?iC&-K#;jK@reF!q!f$6fIkg0z%h!-izx?TfW)Pa0yJeSW67~!*Gch*I3I$ zvG)eldxN~)MU1Q~lMMHGjhoa+qWMJK)z$){q53j7vYD_;)qjA$u+ox!gJE<@bYQ0N zyN}KKxxNXv?l|UzI@$NIIPUgf)i z;LJuj?`Ju!XG3xO1EWI|9y{2=Q7+oB?+k9s_AhwI{j`kVp=}QxaJD1$mMec!L4!YA>_o%O{0}bE(REgSdWi`_1evL+k z=@@+8Yw)2VOJ&edZh_|6-;Qn%Bml<(_d?};rjF+#tJ>1MIo5{+dpQU#QFUhI;E~CR zn>D7fsM$6pp(>>GF%=QpgPhkw2QSNBKoc^X{ym%>41DEfZot7#a`zdZ*!NvyftU(Z z@;M@+D`|b00(~6sRe1-(F47bH_~*^$`^Hw{{L5b?hn%_wBmqB9{UMdQG^79xbCSW6&JO6H5sM7PHm``OaN(~aUUKSu0%U(&Y#8!)5dz-b{}33sZG%A zT&X9S&;jO1)f18$rUPVnIikjSWEW17-=x;^@6mI>PE1Z5`W%MCdsmqp*AmrZbcr&> zH5qdxTD{?%;B3+F-~KNRASd{oVS5`%ZvDhP7 z;g;C%zxgT3gVT)bJ#IrQTWk%q8!#x^g!sk(IOE-M>vAzg3S{xv(}16G2i>Sa;Br|> zqkYtZ`~_n2gvNsRdN_{D>ShrEuPNlKCi#+hGu=yYCSXs4!X`6DMlv3Mf#o9e-5GWJ zm+hc@U>lIJg9&&KE@zrSQ?f|quywEWvo)?ItAGh9Ap3+OgpSwBt5#1p2wvpLTGI(? zNDsav0AAR!2BtFRhq?g2-sW9^=6FNtPUqLh?A1VcL5NudyB~oRQ{c_$4G`|1CR3l> zlvuV0K2v^-G%po);Kp}oUtSxd_G3UAc4$<&@6eQF_uv6m-343`#I6o+IofAPUhUks z+>F&Yr*9U0b(A0VoZlxWcOYCIwRnGwMH7iT-N{OpxA`?zPV?&(?d5TRbVTn zkox)j*U;UMw2~GznSt|NRu{E3&)RW7qWC<{v+{>&1EyixtlM%f&kdCfpi8sH_tl|B znkFhkU0QHh-c`J}k?fm?w?D*;x=V>ma1ahY0<0_?mw?!NVOYD4LVySiSfKWgDzIO6 z{Ts@DCZ&=D7>*{!KyiJEWx>@M4_5WbQu29itzp+Gq$RalS|i^&lOa*Ii^I^l4M{$O z7F9iN-*_2YtdLVCd;?+M*X4rg7_!6Ek<>Xj=xZcBUs*vQDQg*`7E`zQl1Phi`}M{h zsP7sPV@%&z$JnCKt_R51>YjNtFXM=9^Qz*1BTXmI3)}9k#Jz{;VvDUw@T~h*CGRp0 zA<#7B4h^Q7AZ$#2D@5fH6VjMaL6SyXONHQ_fImw8$lA*6~xM8MLE9?K!Ef@4-< z7yHVtp-zcomtwv~mQ?REODR20C2Cr*HAXgk7q+Fr+i^23Dh-sxm;ezMNS}3DSMeI|2A(ojYMz4fcrg! zM9a9lkA|mRI1uQgwY~ZRRXxtLgeD5r5a{yZ2M!p^;^h8XCJDo4j7Mjic>#RyTg;(h<#`x-|>%Jw(5)7gTTmo_VGhtsGz*rc3 zvZLlox}HVjZuxqucxa<|jPYS@B!}vvOh@!f&KnZHjP)&fz@HuEpxa`GBFa zn)G1-Mr|?RRk56f$ayxotjM5?k`Zw7VHaV$cszvg-Z)fia=y$k@D=(WTM(AQEZY6v zx7($#fVMbsf$On592lKda~?wR-rS-Y!Q?sSng|H|JcwRzI(i6aQ-XWcgquoPx&!bkrLWl3 zUp@6UmPUvbGK|hWjs3rmu*N1KUjkpY*NxH6UNDQ8fsO#aKu_oJwUS!-1WOkDfs2pN z3cjc4-$I?5rR~?Jh(gm5ovyD?W_~KE#*cJ~v$;CqLu9w0pJi%EFF&$0G5-J?Yk)1e zB)_(k$`0)m?K;cD+alzK)kghFKH06y&dRZ^wmfZ=z<5Myh(eYc4pm5m1C`{i{HZEO zFZg0&5GefPGrr1M5AF}*jfA7-n8r1us8w6(=T`YMKPEhn@Hmq3Zw`;_ELuv3fIKdi z#3gnAnvY_gRE|bB{4xz=s3mUc(iA_m_G~=I(IQ#T(bn6+j%DFB0$0xlH@vjXFI=#VvBg$Des3T_D7 zL+T>YPnw6nX9`lkcxx$QCLzO`)P{C;>xWs)a@`ZF<2zhCeL%_{KVNggzo5 z-&%a4zb0ckRYROtQOArRbeQCU@ihYlsOC#^a1lTe+8rOplw}@nlYa;H0r&McJ73eA z-hew6dVKBDVUk_Sjc1S?nO`hSjo_d9o5nd`RSA5dPPw9apBOkc!olv(q#l zw3NA{%u*)U$9;@onNKfgRU%g~LOc*+@QCDq0h@Lwz@)471XMC$>Z&kf=vcglMB3J} zM#wUk35rLvM!#UG9pO@}2Y~(_wyJo<;n0=RYqxqk&7Ke~&3cI?#mOtXkL#2XO3WWMp4eA( zT53I});5vSI7uh7&{a!3V=7#L?SspJ8_KUaUl>m(5Ui+O4`T=#3bIve>q^H1KD26y zl6+yK7yfkuxS`B0?g-J=(f>8%t&OlW$2vg`)&)phiU4WLWt7}V`QjrBZ1-+GOnDIJ zj);!>R>N=GzV3?a?oU%XqQa03C=q8spYu2bwBybk^OK{IPS6u?u$dtH0Pt}n2zJ`j zjb|}#yqfbNRYR{}8w)i;9ZO1pBok@Dx5dDWF2CR3KNPU5rQ=>-a7ewuree_93A<4) zZkw#izLplZiYT|Z4Bg5XjdhgT3l0}qth$Yiwyg@SP^{AjT1h>5<$eL&-1AU-dEilx z9x%*2sMvT25|_WKSurgjV|$(_e)xYSgn68T%Z9K)c8tw22i15mkW4{|5f zGCe);q@Hgfk|7U5o&w_4ePrJKP)ep3VAxI4X?q51UZ$Zr?|%ZDE#_~3S1pL**c?Fi z$6+r?(NTG2QMqJeW2t1%7%+Ch`Z}v*+epvx+ulNJ*QQ}Bp`RnU&mynJDphCDx@Ra2 z?;ee@@z=gu&1>?rnjP>{kIr+OFwx&1Fl@9Rx%QNk0<%7RGlKs7oc(=UPFT^z@sb|;LMY;ya!K&mN9x#0H}!U|lgn)Bl8?rdNmW2xNba8ojgYwuH_^0^ zX$E)hV;yB+aWnf(tRc!o#I9p$Wx{dJ%bcuGb#OrgMN@3Ken~V#%ZKSHf$AYbs;WmR zUo>n25srQxPO&-SwfnkFF5<8wXd` zaMuq}3Hp+k*$F{?Z{C87$S3=U`iD%rrQRdTo|>t{ieY2d>p!qptr+Jvyek(E96aq} z_nJgMHuIT!0sTrIGU4CJdfn1JhWAJs&3&NTvw)5d`^P|*9cb`-cu`eN_X2baZRtV9 zLRK>oI@;l8{%jHu;T@soFg)Gop*~Rh$nwcOWtOg5!gbzp>atj2Ljpp%u%5q~FpZ2~ zlB=6p-kh2=G|AxO@r-9dLY&|rUmd?v*v#!(K8p2WnKGstuW?N6)ztBth)q2OJXte7 zWXCTeic6CB1=D}6nu38d0RDeo&H(x;tpbJ#l9D0B`@4Z30Kk7Qdi_0QKmjsL`2W6> z{I47h4m2i1hWGCT=D!L65S%O--oJ13`YWFWNxjSe67v2@fc`6Q1BJ?x;s5(CjKA_| zED(eoDgOW6fk!-0_q)PhZtg!f!~eA~MgS6)Bg6miRL{R+0HA~Do%l(P|9|(fiUiaz zOA6YN!v*&z18ovxfiUGzK!tQD2!GAU(1QHs8S(!+ckQnj0C1ywXR?vu|2qTaugU=v z2wIUG|3A3^@5mA3uk^hY#sb=){|MTWN5TL1HnqZ2||^_0MRPqqN7Uy0PpV+P;z!~bYU`eb8&UB`y<2u&xfRUw(Otne18ulX;6d$ zDgJ*V-uJQj=Zyq^k8nBApaPl1Ukvq6{>@(npyI#WvUjsHF?Y7I|NLj2Ur83~9dQ8w QSnq#>@4eD%{Q30%0kCI`tpET3 delta 14267 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 QSnq#>@4eD%{Q30%0kCI`tpET3 delta 14267 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