From 010e3a1ba960ea0dcd7e5092073d2a55a21b0ac9 Mon Sep 17 00:00:00 2001 From: Dawid Weiss Date: Fri, 2 Apr 2021 11:46:43 +0200 Subject: [PATCH] LUCENE-9900: Regenerate/ run ICU only if inputs changed (#61) --- gradle/generation/icu.gradle | 31 ++++++++++++------ gradle/generation/javacc.gradle | 6 ++-- gradle/generation/jflex.gradle | 10 +++--- gradle/generation/moman.gradle | 4 +-- gradle/generation/regenerate.gradle | 24 +++++++++++--- .../icu/src/generated/checksums/genRbbi.json | 6 ++++ .../checksums/genUtr30DataFiles.json | 11 +++++++ .../org/apache/lucene/analysis/icu/utr30.nrm | Bin 58720 -> 59200 bytes 8 files changed, 67 insertions(+), 25 deletions(-) create mode 100644 lucene/analysis/icu/src/generated/checksums/genRbbi.json create mode 100644 lucene/analysis/icu/src/generated/checksums/genUtr30DataFiles.json diff --git a/gradle/generation/icu.gradle b/gradle/generation/icu.gradle index d450d4878f0..f7f2efc4df6 100644 --- a/gradle/generation/icu.gradle +++ b/gradle/generation/icu.gradle @@ -43,12 +43,21 @@ configure(project(":lucene:analysis:icu")) { icupkg = file("${icuBinDir}/icupkg") } + def icuCompileTask = Os.isFamily(Os.FAMILY_WINDOWS) ? "compileIcuWindows" : "compileIcuLinux" + task genUtr30DataFiles() { - dependsOn Os.isFamily(Os.FAMILY_WINDOWS) ? "compileIcuWindows" : "compileIcuLinux" + dependsOn icuCompileTask // May be undefined yet, so use a provider. dependsOn { sourceSets.tools.runtimeClasspath } + // gennorm generates file order-dependent output, so make it constant here. + def inputFiles = fileTree(dir: utr30DataDir, include: "*.txt").asList().toSorted(Comparator.comparing { File f -> f.name }) + def outputFile = file("src/resources/org/apache/lucene/analysis/icu/utr30.nrm") + + inputs.files inputFiles + outputs.file outputFile + doFirst { // all these steps must be done sequentially: it's a pipeline resulting in utr30.nrm def v = getVersion('com.ibm.icu', 'icu4j'); @@ -71,9 +80,7 @@ configure(project(":lucene:analysis:icu")) { utr30DataDir, "-o", "${buildDir}/utr30.tmp", - "nfc.txt", "nfkc.txt", "nfkc_cf.txt", "BasicFoldings.txt", - "DiacriticFolding.txt", "DingbatFolding.txt", "HanRadicalFolding.txt", - "NativeDigitFolding.txt" + *(inputFiles.collect { it.name }) ] } @@ -82,7 +89,7 @@ configure(project(":lucene:analysis:icu")) { args = [ "-tb", "${buildDir}/utr30.tmp", - "src/resources/org/apache/lucene/analysis/icu/utr30.nrm" + outputFile ] } } @@ -92,6 +99,12 @@ configure(project(":lucene:analysis:icu")) { // May be undefined yet, so use a provider. dependsOn { sourceSets.tools.runtimeClasspath } + def sourceDir = file("src/data/uax29") + def targetDir = file("src/resources/org/apache/lucene/analysis/icu/segmentation") + + inputs.files fileTree(dir: sourceDir, include: "*.rbbi") + outputs.files fileTree(dir: targetDir, include: "*.brk") + doFirst { project.javaexec { main = "org.apache.lucene.analysis.icu.RBBIRuleCompiler" @@ -99,15 +112,13 @@ configure(project(":lucene:analysis:icu")) { ignoreExitValue false enableAssertions true - args = [ - "src/data/uax29", - "src/resources/org/apache/lucene/analysis/icu/segmentation" - ] + args = [ sourceDir, targetDir ] } } } - regenerate.dependsOn genUtr30DataFiles, genRbbi + regenerate.dependsOn wrapWithPersistentChecksums(genUtr30DataFiles, [ ignoreWithSource: icuCompileTask ]) + regenerate.dependsOn wrapWithPersistentChecksums(genRbbi) task compileIcuWindows() { doFirst { diff --git a/gradle/generation/javacc.gradle b/gradle/generation/javacc.gradle index 177975e7de7..f5270341cbc 100644 --- a/gradle/generation/javacc.gradle +++ b/gradle/generation/javacc.gradle @@ -252,9 +252,9 @@ configure(project(":lucene:queryparser")) { description "Regenerate query parsers (javacc syntax definitions)." group "generation" - dependsOn wrapWithPersistentChecksums(javaccParserClassic, "spotlessApply"), - wrapWithPersistentChecksums(javaccParserSurround, "spotlessApply"), - wrapWithPersistentChecksums(javaccParserFlexible, "spotlessApply") + dependsOn wrapWithPersistentChecksums(javaccParserClassic, [ andThenTasks: "spotlessApply" ]), + wrapWithPersistentChecksums(javaccParserSurround, [ andThenTasks: "spotlessApply" ]), + wrapWithPersistentChecksums(javaccParserFlexible, [ andThenTasks: "spotlessApply" ]) } regenerate.dependsOn javacc diff --git a/gradle/generation/jflex.gradle b/gradle/generation/jflex.gradle index 57c78015288..d0810b7a1f6 100644 --- a/gradle/generation/jflex.gradle +++ b/gradle/generation/jflex.gradle @@ -49,7 +49,7 @@ configure(project(":lucene:core")) { } } - regenerate.dependsOn wrapWithPersistentChecksums(generateStandardTokenizer, "spotlessApply") + regenerate.dependsOn wrapWithPersistentChecksums(generateStandardTokenizer, [ andThenTasks: "spotlessApply" ]) } configure(project(":lucene:analysis:common")) { @@ -118,10 +118,10 @@ configure(project(":lucene:analysis:common")) { } } - regenerate.dependsOn wrapWithPersistentChecksums(generateWikipediaTokenizer, "spotlessApply"), - wrapWithPersistentChecksums(generateClassicTokenizer, "spotlessApply"), - wrapWithPersistentChecksums(generateUAX29URLEmailTokenizer, "spotlessApply"), - wrapWithPersistentChecksums(generateHTMLStripCharFilter, "spotlessApply") + regenerate.dependsOn wrapWithPersistentChecksums(generateWikipediaTokenizer, [ andThenTasks: "spotlessApply" ]), + wrapWithPersistentChecksums(generateClassicTokenizer, [ andThenTasks: "spotlessApply" ]), + wrapWithPersistentChecksums(generateUAX29URLEmailTokenizer, [ andThenTasks: "spotlessApply" ]), + wrapWithPersistentChecksums(generateHTMLStripCharFilter, [ andThenTasks: "spotlessApply" ]) } class JFlexTask extends DefaultTask { diff --git a/gradle/generation/moman.gradle b/gradle/generation/moman.gradle index 32a0e0d97a2..39b6e87297f 100644 --- a/gradle/generation/moman.gradle +++ b/gradle/generation/moman.gradle @@ -99,8 +99,8 @@ configure(project(":lucene:core")) { description "Regenerate Moman-based sources." group "generation" - dependsOn wrapWithPersistentChecksums(utilGenPacked, "spotlessApply") - dependsOn wrapWithPersistentChecksums(utilGenLev, "spotlessApply") + dependsOn wrapWithPersistentChecksums(utilGenPacked, [ andThenTasks: "spotlessApply" ]) + dependsOn wrapWithPersistentChecksums(utilGenLev, [ andThenTasks: "spotlessApply" ]) } regenerate.dependsOn moman diff --git a/gradle/generation/regenerate.gradle b/gradle/generation/regenerate.gradle index 920c40ce981..2f7b8b517ea 100644 --- a/gradle/generation/regenerate.gradle +++ b/gradle/generation/regenerate.gradle @@ -56,9 +56,23 @@ configure([ // constraints to each node in the execution graph but not node-and-dependencies). // // sourceTask - the task to wrap - // otherTasks - other tasks that should be scheduled to run after source task and - // before checksum calculation. - wrapWithPersistentChecksums = { Task sourceTask, Object... otherTasks -> + // extraConfig - a map with extra (optional) configuration options. + // andThenTasks: other tasks that should be scheduled to run after source task and + // before checksum calculation. + wrapWithPersistentChecksums = { Task sourceTask, Map extraConfig = [:] -> + def toList = { value -> + if (value instanceof List) { + return value + } else if (value == null) { + return [] + } else { + return [ value ] + } + } + + List andThenTasks = toList(extraConfig.get("andThenTasks")) + List ignoreWithSource = toList(extraConfig.get("ignoreWithSource")) + // Create checksum-loader task. Task checksumLoadTask = tasks.create("${sourceTask.name}ChecksumLoad", { ext { @@ -140,7 +154,7 @@ configure([ def deps = [ checksumLoadTask, sourceTask, - *otherTasks, + *andThenTasks, checksumSaveTask ].flatten() @@ -163,7 +177,7 @@ configure([ // Set conditional execution only if checksum mismatch occurred. if (!gradle.startParameter.isRerunTasks()) { project.afterEvaluate { - resolveTaskRefs([sourceTask, checksumSaveTask]).each { t -> + resolveTaskRefs([sourceTask, *ignoreWithSource, checksumSaveTask]).each { t -> t.configure { logger.info("Making " + t.name + " run only if " + checksumLoadTask.name + " indicates changes") onlyIf { !checksumLoadTask.checksumMatch } diff --git a/lucene/analysis/icu/src/generated/checksums/genRbbi.json b/lucene/analysis/icu/src/generated/checksums/genRbbi.json new file mode 100644 index 00000000000..7607c4edb94 --- /dev/null +++ b/lucene/analysis/icu/src/generated/checksums/genRbbi.json @@ -0,0 +1,6 @@ +{ + "lucene/analysis/icu/src/data/uax29/Default.rbbi": "71bfaee5e81ac272aff828d1e44d0612be1b8363", + "lucene/analysis/icu/src/data/uax29/MyanmarSyllable.rbbi": "4c6817658b454add5ec1f9ac8c0015ce8eb3b5f2", + "lucene/analysis/icu/src/resources/org/apache/lucene/analysis/icu/segmentation/Default.brk": "1b9013b7ef4ba32a851a330c58a8fa820b9dda79", + "lucene/analysis/icu/src/resources/org/apache/lucene/analysis/icu/segmentation/MyanmarSyllable.brk": "cc023ec17e0148518086098691785a32b88ee09a" +} \ No newline at end of file diff --git a/lucene/analysis/icu/src/generated/checksums/genUtr30DataFiles.json b/lucene/analysis/icu/src/generated/checksums/genUtr30DataFiles.json new file mode 100644 index 00000000000..33a412fb246 --- /dev/null +++ b/lucene/analysis/icu/src/generated/checksums/genUtr30DataFiles.json @@ -0,0 +1,11 @@ +{ + "lucene/analysis/icu/src/data/utr30/BasicFoldings.txt": "fc5badae307c5b740f8dd81407e4be04e3e2fde6", + "lucene/analysis/icu/src/data/utr30/DiacriticFolding.txt": "2d48c24758ed9322b49eee84c23c74b7f11337c6", + "lucene/analysis/icu/src/data/utr30/DingbatFolding.txt": "ca562b2029e208bdf07cb2e5f689e509a336265e", + "lucene/analysis/icu/src/data/utr30/HanRadicalFolding.txt": "f5848aa38cbf1a11131d59384f31477f3b7f077b", + "lucene/analysis/icu/src/data/utr30/NativeDigitFolding.txt": "434ad7eb17fc32a441385795e4a4aa7e589ec30a", + "lucene/analysis/icu/src/data/utr30/nfc.txt": "ec95d7f7e5910791717234dd09efc4b13dc32d35", + "lucene/analysis/icu/src/data/utr30/nfkc.txt": "b8e91bc64e354af505d51f6072a43c90c6b4d1b5", + "lucene/analysis/icu/src/data/utr30/nfkc_cf.txt": "22d90ea4a7771e6ddebaaeb9438e98ce625e16f5", + "lucene/analysis/icu/src/resources/org/apache/lucene/analysis/icu/utr30.nrm": "32a6a3198039883c93f9ebef31fe24c1029f2b07" +} \ No newline at end of file diff --git a/lucene/analysis/icu/src/resources/org/apache/lucene/analysis/icu/utr30.nrm b/lucene/analysis/icu/src/resources/org/apache/lucene/analysis/icu/utr30.nrm index 92a6919e37f8ac973ddc5b3c2ed065fad7396e52..6409b872edf2a1f0ff286fea394c5fb074e62104 100644 GIT binary patch delta 19335 zcmb_^30#}mb*~mAAwUuWB$>@1gbz^=~=5J##ZZ-HVXkhhcJQ55h6eIo3r9Vpa_T!fEv3L{yGJYw99-;h(}_!ru-5NdzT=7ts{))rg-`n3PIN3*`poU#O{6C$)omi~4I+ z6b#0TerWMvbhIAS{pyc44>4O9Or#*v6*&m@B$!9!S`3DsM6aN`>EEC~j!KDYiu!8Q zKSqZ{mqmX*`n{Ntn6jA9$Gpb~VU#gG&v=g+!YpHcp7|atgr#6zWR0<&9g-Y6bLg)R zy&ubt_1a@E#oi8P8vDz*%(y=Y`u6R(Z^r#%-xqYn$HcQSn0RQIz%TwU;%5^`2^xms)NGW0syp=?k#Xd=QvVf$;ihnH+^>VZl*US{ zO}m^nn07twX4;jsYiT$ByFTy#44eNl7w`W_DgMjZUpe%NN_>RD@Ho6C9~;NS@!kdN zS9!em(^Jx$(%(&gKO-fhDdXLY_cK#6ZJA%m{7F_+R#nzlvVM{snO&LvIb ziTt6-K$3DuDDtD|Ac0Ur428%;$;7V&f`u@AKmHTiDJOs^<_P&Ht&}97pNEW23;$U7 zg#aNjRQQ(=a!oiE@P{4?G7#P&h6dcie?%GN371|5yf54ga|m}ySAxVrTSO5h2HhBp zh%Y)45K$1O5S59l15x273?|454G~!m`pEf#Bsk$0e320`vi&&Gr$dkJ`-0h!M*}W$ z3HfF1kPAWLY+@iIa3&Op+JY&`ML|~}-K#z{Otd$JMfIX`LUM*LF(RG2jO!1i@Y4+J zyMr##Ac+msnQ@}O5q($mBhfOjS`$4(@IeBE4$(4ioGtFHxRY^z822fJ9ru|yciiU? zK2n6}5OW{~@gV2pnh+P#h4jaLI?fsQ*|tA>NTtBnc71$}5lt_F)norB zd0X;D$=4*`l6*(%*no;u4l3z)FlM|7XkdvKrBuAUmnDeQew{yOj^R=9B<$NdS zM>+qT^Q)ZSNF$^P(roDwsaD!3{gm`==@+G6lYUG39qEsx|1A9#usTwL>;Laz%trfX zEYYpSVBK2ZJCP;6le$PR_5}uu-Nx>sffy`~jKRW}f}`W&aY<+xE(6EMA=q795l)9Q zL!1Y98h0Moj_bl*!d=E)#SP;|ag(@d+#K#6ZW;Fww~pJyZQ-$aGMG&kL?B?y_7ew)L&TfJ3F0(yj(DHALR=%R z6E}(5Bs_^iVvv$ZTv8TEN-8EPNd}UM&XU?loupn;Kj|vz25F2mMVcWkkd{c^ z2c$=&4bpScZYU{~9vU0U3C#+Xh8Be?L-nDiP+&!=|W(sqJwS=7wYYXcP>kaD<8weW; zyBRhSHXSw_c0X(-Y%R>Y5%wZ%H=G;Gi3Z9d zWtsAjd>>As-qgICaM)=0+9&wR1e6x{A>2FGpMIgrf%(j4%7>< zZSJM^Q?F4+(3E5@5o(S)N*#ZNkN5XyTj~CNQSGkVL$$l{rMu2;0|aCC+}@V~!H7Dy z^Cf~|fs8-p{w#>_w);=1x4;g>1!7RQc2B(hGyyRx-CuBj39$Fw{n0D%J!M80xWDSw z21XgQ#O*-CQD>-g!6wATQx~Z#?!Th0Q8%d1fo2DTr4eWp8p{_+Pw`n;kyKg|jYmUh zg|u>-o@RpC{jl$yI->9EtS~0cK|4h|M{B2bf0(~T-a@u6L0X>gd#uU=S})BiUMBg7Cio!(_Aj9Ot zk+evd@FO_^u_O6G@gs91<&m1N#0k8S#z-?-P}D@awqgT?-fvelMdT^kwm<%C9R_C+?rRe-<_D{yFe}-~9o6feXy+?jJ() zod}5HatOzoVOheG#K3qNbznMlD9ck^t4Y4hgf-^1M|S)9C&W z_lNF}0;xPW57EyrC}x1~p2$&;U~>VRji|@u)u<;?Pothi!FFUHp0J=hYC9SmO^T*K zK2_LgpWVgteL0fojZVa1qj^E1eLFg9-whN})c3Jsp%YKAkf=C8zcyH(Xqw+4pszcU zh4WBBs3Q_!aj+o*%@b&*gE1&g(D=NOEzDP@!KG z4!Cyz0c{dtkn|J9hor%*3{8IUe&C$)#r=u@KcSQF__ecAONHF>98^yn;{alJC z3WEh*(t%C{?vOqIUCccX)7QvLNRJ+go&b@i4-&qPFNm1nt55Mn-$f~-7x(D{;^Tnd zJCRI5^lJ2a^fNyVOwI@K2CkpO9b_Pic>`G-?AKBFM5%Gdf>jk{@7DeX)tl{Q7ek7H zO~9*o16QtZJoOAJdLs{cLoZ|ddbt#oYg@bTwJ#hh`Lj*N% zVx*1X1`~ettB-!QFIX_tb2xzDsCykFlr|k^@zNsp5G zO=FN8?E(RJOl~l2-;OB?x?>bCUH&nL`eJ;S%43USYJxEVdl$DG()^v>(B}7I>SJs% z?wC*Sh6I4dL)?$hsRJ!}U|L}1#GHGT1L})u3x>s9eCg_X>FR~z9EyzT3kIOJyAA@+ z_`0$&R?pCyB2`!gnRN-f*>f(xxV?d!Pg*C0rJC1x<@TFmvB8!h;FJ@lfM2;DqHJMWXRPwiC)*I%o6gpap11$XuTTSx8zV-%5w7zQD zpH;w2@v*t%_4W396zzyNSoNrlCSVjYiWv&nq;5rSF_a7qLw}GB#2Xp4j0T34;b1f~ zS{SX2GmLYL3k)ygBBPVh&FE$L7?&AW7=w&!jO&aWjGK%x#suRQ<2K_CW0rB3vB0>` zSYkY2tTG-k9y6XW=ua8X7%v#x{;YSIcqR#LUhiJ*XyL3AtnA?SC0O-n+yMloe035F z^gt-v#|8zH#*D>Zrt+y=CI^reHbCSsCCox<5mQ0gVtO@94GuxIJESaT4GzH}Oe=b- zWi~TgsdOrxvdKKh^fEhxneN-zZQSM1QMVR7R)_9T)(G=(c7{_eaR5CtgTe}lSS7bn zmeDgY`4M)T*~`4l90(mn=~3+n^EzeCt@V9e3mNV}# zXPI}I3(Wh#dKtuF_(PV^5at7v6*(5o49$kJ96ADelLg9Jy zd`av{fp)jOGDiFp+nYmtzhK54+C`UzYB*&4HQEi}DEkxtK&$h8u3$&8oj^#SB(M^a z5;78ygu(Cvnk$`t`uL&0Ln0BC}kvN zJY_0nCS~65UrKqH@+9SX$}We@iRL6?upHQHaNw}afl~^nh@<3q4V(s!i_^+E&$-Cy z;q-9^I74u+HqM#i%y8y8OVkz4L+Tpm33Y?>ocf%zOWjE&(+H{2GzywQYGP_esx(!e zs!KJcx>8Sn!rzwKmD-njHFYF)GIb{PUh2pFE8f)g)aP6*m%@$Za=A$A%By~E5m(7I zaBH~^43^uY^tTO~{MoCGp^p$IIo(c^c{t&q$;2l5p`nGi(_*UWff@IBJ;ZiW&|8IJ8EM z1c2Q|0Xi`>1AiuGc;|R~JDmOG*bOu;YJ}I#>xb`k-nd7MG5}UnVCG(?p6A`;E%KIm zt31E1&(HA*b;fT$<@pZ_7;O4pUcpq@4fpTTiA6mka!~Svr{?tV^yqX}dVG2kas72m z+kQN%?hhLPjo>JmK$zd3oX}}3AcXHvBO`I?99SjHA+R8zKL57FKk)}# z0V;I9L0!Q`1x}Pn-t>%gP=%)FLvf4Km1O9r>3VeL-oqTK{|x9piR#o=f}MVE|V2pN=C>DSW7(r40_(jTY4$RK5~GI$xe8On^>jOL7U8J!t@ zL{7$)jH?;LR7S?ljPZ=Aj9Kbv#(c(o&}o8(7uJH`8qcI`1~SW7MdjUdKkLmC4S`0;lb8Cd>x`Wctt3nJ;(r(DdjoG9@n4h{0x>gJj^gXEwvP zHS;V)AEsye_vD#9C_yIFK&G!<&Vg-b7%}q(_{M=KrXcfn=3M6e%$3Z?ezMI>|4t!` zkVV_)i@|2aX8HSE7C*~>0LhYPX&`x7XjV;@HOrHA20SGRS#4RJS(mb|ypnP#>t@zu z)*T?I3dx$yx{FeJKe=1ZTF6?=dXV)n>v7gb*0Zdwtlexvc6c^DJ2so0oso@X=V!~a zRoRAYQ??`fRQ9>-_U!KLzU;y5;q0;OsqES8`Rx1I%h{{hYuQh-H?v=4@9+tH3ZKDG z*^}% z5mckhg3ddEN$X&hqi%F6K#hPa$UrGj8=a2?d;#)0hOY~QEb4FqDOhfzpje<3=)jqW z6EuKz%=c;KUzG?P!~sEz;Edn`cANA-aFH-C=q4)#KJo(dGOGx-UTai_;0n|ULvRhf z=m;A?w|vYj%4rC>As7Qy=-WP9MTqZ56--iKj``5n9%=PesG3S%&N;!k=Raxt-qHz4 z!)Rsrhf7?fU_vmpUr&C8QH&Q|2ZDiuJAzrkUBQCjzFQY%bC8iX9gia3yFqy=e3&LHQI3y2rF zh;$;|NH5|;E+bcvLFAfHiCjl+AUBaQWCHH^ZzFe*S)mcR3wQtbktO7Tuom6`JVG7| z8;~c+Q{)-)Lg+xYkzFw!>bYG^5{JV}fM~Cnh1Rn;9$o}+g#GX;AWJM1OT@Y2LUFNJ zAy$etV!hZXt`&}p8^l(zL)%wQ^8}M3SOgtgJCB7}bBc2uC6)%Xw#rMTa;s+w0cvbvJEPO0}B7Q2$5>!Tx#~gB49k^b#Z5@=ggX5E57xB(UO1E`aF((+j2_ z%r!8ubCFDdnFixmb4nJ$wF+iEI51FK@=UUW!RC;1VB?$^UtEc{b;~fAle(IgoD-bBUJ7|jg;K~{s*vj7TPwB0w?&FBd)bGi{tcY8OX`yjNUx&`A&4B6 zqRU;ASNd(~cbk7A{eJULn|~(#f%J#cA2qaOCL!; zkp5EoZ_$MK&nACc7@XA-gFX3sgd|C&(sbw`8|vcLWQv zS=n9Lg6zJi6UtcPl`Y9uWshY~WiMpAxujfLE-N=FmzOKd&CM-#t-H2QQcfnFL{2JB z)|_lUdH!Vg$$^tMPfnk_e{${QR&z84o2$&#=ho(0bDMKpbI;{^b31c;b1&x(=3dXe znLCktJ9jpBA$KWvHTQAu)7%%iyLqHMS{^GeDUX*Y%*)O57UwDR^m(;;*1YDt7DSoX zy5D#KSKgVt3wiB%oq0WZzP$dt!Mvfo8+oI76M0j4ck<@)7NC*74~_F$Z-)Iw zNNLV&7B?3(mo}@LtD5VZo0|Wi`7_Ob)chySUugbn^EaCR9&}>CD%u|`q6wI8x?ys$ zim!+kgh_dedCPe#c@Oi}^49Y<@;39H=WU4|=k4TU^9lLnd`dn&pOGIMsN%1jVtVs6 z`G)-3d~?1d-;>{(e>VR@etUjreowwHzdwI4e<=S({%HP0{#5>*{JH#v{Kfp0{I&dz z{Ac;w1=s>|0i}Rmz$l0?Brs6bv&UZ5(_6&MO?3QPs&0(*fA z#`CFy(*&KI;5v=?*~bQO4e3N97&74#Pj6kIJBDi|&pDHtsnFPJQtDwr;qDOfC6 zDcCH;7e*H*7IF*o3w4FYLPw#e@N{8EVPD};;aK5x;l08~g-;51jb7F{VCDY{d% zRP?Cm#Zl5x#?i#1{G&xjHAfqco;rH==*6SHqgRh!KRSAJ^62!@xuc6mSC4KMV~gp< z++u05qF7aIC~heB6rV3{FZLA=7GEzODIP1HEWTYlQ+&7hUhz`#O7WxOC&kZ-w@dIP z;U&=}@gJSD9q=Std2E|zqaTq@}=87vtpxluA&GEp*J zGFviVa=&D`WVK|ixFPH1&M!89DmAm9E^3(Ej z@;3QJd6)c>yk9;jzb?NipO8<}G6n7MN755bn6ps{76wegfW%#o2vb`(OxHnxSWy5=b5MN_WeM<1? z=2zdm@)`l%aG}#B?8@>&8OpMF^r-^OC^kIAz(FqY64UuK`7Mi@i&Ft0Or z$~#yT$e^dZkCj;7|CPFAGRt0mH9*xKS&P2KU=rp?ux^#Xc>y$_8%zbt2kQE3b$^7a z|3RBw`WiKUV7?4|e~G1D>gF}v^cHd*Acd&d@!EgxGs_VC!+vGrpckV{bo z*htTNo*6Jfpm#8-A#SJVJ#eHY!=EES)1dHtztQTqA;j}uV~hC?oF!fW(c2NO1+?`7 zfPl{>AKN_kT%RSCkYbUCB_!DieJl*bY}J%}Tq{rSvFIDNifU zD$gt1l{kvbuPTR>!^#nHxN=lEuAEd(DW{b)$~on{@}6>0xh&pR zt|%WW*OcqZ4dte<&Ym7tQLaQPR28}kgYS#>L*9yximr;Dic1xJ;?9cxih+u&6+;!n z6(bd+72_3?6;l<{6*Coc74sGMM2{;LE0!x(Djrs>RjgNRRBVc_RXnfQs@PFsRRk4T zMN!dJ3{|WuQN>nqRT(P23Q?)VaQ(;hfPpM9; z&Z^F<+EneT4po<`M|DZnr|MS?sIIDpRKuzf)u?J*HK{~YQ>tmzjA~9)tD0BcQ!T2N zRV%88sx{TRYD2ZDdal}%C{#OYteT)Et0`)_nxT$WCsvr$Y&BP%q2{X*wN#z2E>g?Y z_stH^)i?hzw4oTO}(z(P;aWAtGCoU8mt)h zr5czEG-NbhL(%N*Q8iwMCRUTEVQaXW3=Lm{Xr!8aO_4^fDc7hpI*mb7qcMrLHD--n z8wTJGAGt z7m${UKGj35S9?*@q3zUkX}h((TAzANds%x$JE*;;y{=x@-q7CE+Q+mL+FRP&nsMzN z?W~Hey{nngE@Y{bAx+EP}m!ae95M8dWNT<*#VYq3jI*rbttJRrxF5M~JDF`~`)t%9u z*Ligvx^A@S0q8D!N_AItL!cMz)D7!Kbfda)-K1_RJzO`dyQf>xt?QoYc8-&d(~rj= z=N=ax&p!?m^Ksqr+T-@)EyvG-8%`6)yN>(dJ8&FM6URr7-#R{XeBt==@khruj=#`j z^#px5zzZ+${D{^Ez|sd0uMZ$e9{@)m08bx4mOcQ`7We@tH$Pw#?nj}%P+tsC0F(d? z0R0&O4STTatw;3m(L46gtPh|?-=c5b!#Vvq{e?Yv^#NSeU(|Q&yP*Qpy!zff`1C&g zWxy5vm1vTF5O57}9dKh0WBM`u6krap2zUtC0Bq^EDhYnjD^bMnfm?}G7J*+?sjsZ5 zY^bzXo~k@kdA`zH*-_bDdAV|+@>->LxN^MmR^@c%Y~_6A{mSLa)ylQXCzYF(FDiEo zcmvr$GcXMC2DX7`;2R`{d_%FJ+@LWS47CQc!C`1MoHbl9v>SR1K107@&@g1UVHh<` z815M63=4)u!vn)Z!-nCRVau>vMW_m|VpSzpajG(^gjLcid6lwC=dChUS*u)CEmfzh z&Q-Nlbyf9NU8x$Xx>5IO;)P1ts}SSODqWS)cq>>J z#@l{T>>xxpn!RzRa>sbrc+a@xui}SLikl$%ZO?H}z2~Iyk#XJl+_+s$s-{%ORwq?w zRU_3!)rx9;bxpOsy1DvH_4(?K>h9`G)t9RWjQ6UqRS#F+tZo?pFD4uhG6Ip74E#W! z3520NrFy!08v1v#w|b^}9W|Z2Q+WFeW+LhY1+6^#^wa;sJ>Iij|I!5gV zh-a=#tb^_5LHNEDS?aCh*GcP&>Xdbcx`sMeU2EO>y6(Eky45>f9V*$c@R^M6Q4ILEiL*)A2g6Vo+{pI>A^@H`->aW+| z@Ydg~AMK`-fpS*62`$|&ceUDFh!#vF3MG(5B z3W3pF=lkNPwGsYl0Mr90eE)cg#Rbj4L7g)&MTdBR0=4}E9(cqM>$fo21~NFAhZOyS20~@H*>tz3bo$!C+EP6e?2C=YL1|i6>hS8s&dr#|-(13b`b_b-3zP zUV8%X6)eClNb$)hU~u?*%@N)A#kU0L8&~u>bF6RaElSXHIN-4G;(grHw8-G=v*4>o zv~t4sA6TIk6yo`==eyuY@cqTed)I8JK8F?2Fw!v9aIaylVXKh>k%tL>dNj(rf8mM#ebW95t2d2b zEG!^s8Z=kRn*R&0vQV42H)bLJ4VR=a*)do_kQxKH+Z$%$ZAYN6E|`K55*dJjaiLCRtNWLqogqx zm(*C;Slp<9w+BnCjz(pprcsYR9BVYDw>H-P?lh1BP2=59)X>NSMiOAMl1p&e_BReT4mI8gCdOc2 z_h_LJo-9z7OFJ7UVFbcknvah?az<%k<86FR<4of`IxkQg?>8{dS8tQVg%8_l)m2D8=d$Xgb2%+2N&bE_FPasimnnZ4#tbFcZbdC+{_ zeA5g!g9kvsns1xYHzWyO^Q`%FYzV_{h0ElC!Rg{LK1vP6Rx#3HriTZ+sr7P+Nd8;`1Hv`H3~MOR_B7&LNAjm2a! zTkL+gEG?E+%Nff#OPi(L(qZYc^jI!gynU8_%YfyoWymsY8L^CLd6rSjxMk8ZrBPX? zEi;xm^{{2$a?i48S+=ZL9$MBc>y{16Gs_FhwwYwvwc@QLE5#aZWm)5`Nmh=PXU(z- ztr9@4wa6;3Fj&j2Dmcm;t+j$@)&{Fpv~6`*o2@O@)7G=r3tp?&dePcx?Y8z>eb&p? zE7n2lHS2Zjh;`IDZk<%NTc?mD>m9(Hbslifx@di1eP~^?u3I;(o7U&nE$faAYa?jP zHnNRoi?*?}wKkS5UgNSQ**G?yElcB3GHgPd#FlF-v=!SFHl>z$JHbx2)9lf9mOb9iwsY+nc78>l9kEO8 zg?71JY1h~d_8PC6jzZ0hqu5dIb!b4xQ{yl> ztPY2x+0o)?b)0dWbF?`wI=ZZLj$Vh)aoKUjG3dDFxbC>&xak;kOgL^;Ty;!4W*l>l zdB;7+qGsN)>{xL;bgVhn9Zwz49ovpwC*DbNhCAs_hBMxouhjZoepQSvqh|TwmQ!`&pX?k?amHom$TQ|=j?Y5XrE}GikqER zo!6Z=oHw0g&I#v~^Nw@YdDpq%T+}{uE<0D9YtD7&hI7;T!ny6-b>UqkSGbGjigv}i z5?yQ;*OlcGx+Jb#SD{PpQo1xQy~|kUGP%s?--o*#u4dOM*J;;T*Lhc)tKHS%>eA6% zy)K{Yvg?X#&~?o<>>6>6xh5re*KJ9(Na4EUnswck@LUUHId4D57AE6EF*x`~M9DDG z*ukV=lJOxgL&Ojwfe>sk1pgiI@dCcFBY&J1;l-T<8ac*|Yxmoqfq3E`buymx(iQg7 zmHyI&f9VR}b73)`gN;ca=Ko^a@skji3|}m!5Vktcz#R&5;89ue-$L`kkK#u#W1U~P zPCAK0{{}>kvEvK@I}wK|h2pqy=wA=XF|I`PGDMDPO@za+-%j+~pp3x(9hfmNe-Gvd zU}nKgL)K>@b(NpWjziaDImR(o`IYNbPBK0^C@n~rj4$2uq4Jdm6efX6p}!Q zuk_uog{Gj#0Xc^6`}w2EUrPjLEwbZ)SD(g_oQfetf`JOi~5uCwpzwUng zf9E~7=RD^*&$(a1zx;so^Y4+~O{v&JApAl~AUxW|5R?Rh&wP_WAihr^9F8IoK7b&? zcL{`s*9nBCDloqUzYPmK^q0*N0)a}9{q*do_Iln8_#ufwGLX7SbAjZ*qQH}ZlYze? zr;y#`zajrLh!a#9bSCHrK~E^DlqSkw5eSrNDv_E`eVsZ={S{3>v(WyU`a10=!PH<4 zfe_pod^vcT9#3}=2=p(|zY{_Xi4Lg>c`M|5j9`X}VQ2I+eiFJTv?la;=x8X2iT!!7 z50eQ-$?U}3FaI&8A!dm{2ulbvhk3ys0dt3@ClJC};RnL&!v7}xUIaIyD&nn(Z%6!& zmCgDj>z`P^V<)j2*k5J;f|JB);Cz+y3vLp(fjh{3$V=eW^FGh}(VmDs<$JpJOh*zT zJq3}kM}EnlY2<7aElTV6ZQD_&qo%ffepl2=G&rN>et-0_=)aBrWlR8p5F-QA9y8AD zjQP!8$=4nu7W-Z-ls_&b?qeZw@5Q|zpArAD`1j)9ABzt- zL-G(3G7>(P@Lt0A6GIY96W>mpOQK^rBx#aPg@w`@lCBd7d?H`L2i5Vv!T)V?R`Ms3 z-$?#!@;k|&O8!jpTmMs^=YNOIpUuVdzfy`nJNr-V`G^w#l|V=dNKty@1GoVxonXD6 zoid$DOjV|KrcS33)0AnQY18S%bVYh=`sMUx0V-$}ToydbKr)VIjAlF&BEr{%UlaaH zBoeiF-=tn5{w=VGDPZXQ?Z$75{?YI9+oEp+zVG+pHu(cz=nsKO(mv6Tu|Ux;M8A2N z$QQZ^Bnf*ErVlYY36OO12N1a@F6gs(Fp{}5dMgY>1S0kUS|&4#k`UfPARuLk6=}w! z$sZucA>=d2=W#!Ezn=y26|!&if!I-uK{oP@7Xj1A4}+_bpHa^EiTyV6KC+bv3lWEi zqj3>M!E$k;7zQltk8U6k{H!p)IB%zqCd88jAkE&e5O&sfoY+9!zwN_PVt=%YTeg&j z;w}h7K;n!bJR@+%>=)PhQ_@hs3#WeBhlPnhhQ~yl#N>qJ9Pi$cRQ`>Cckyr^&8N5B zewX+S3J0juqr^Sp3*uq%KLM+6i+?2kj~4{LhUhF$lp@L)rH-nM(xZeZQZ%Hpmhe7;(~9!k9qvmwk@7h|DBR z+)OE;5bT4#VD_F&Tjpz-Z)Coc`8S#GWqvdB`nw3WZKOx5ow3C zTY6qPEWIk7lirg)m9ER^vS^t=mMhcCEV3iA4q3PCylhx@RW=8#4ip5u`#-~&gZWcp zP}36vvFVBT&9DM*lsK#e^AeYdt5_gzz`sV^XnGPr#Qb2B18Bt608RiuKt>=2CRW zNgbpv(iu`8X^=ERnjlS+=1B9TyQGJtCDQXiVjvyT(*ikxv4LrUlEAz`WuPIjGSD9A z4r~oP4l{js;JLsHfkT0#fmZ^j1Lp#71ug_WBFzUb1wIelB-6;AaB?&`kt`(3$O^KC zY$BVuL zS*Mby3@V2jOHHAo)EsINRZp#;TB(iHqts*6PHGqRH1#aC555CnE>SO2$ElOl8R`wt z+dTC)b%FYbxXk)YqNOhGqMY{&}EbW#LcWD^z`>;q` zp{)m#gBiiR;Mm}_VAKkiJA;rEi8%Lc&8LLlQ#-A+nIX5KV|N#A6O|h8ziL3po+e6>=t|mo^mAA95+= zGHE_!B4je;I{4>9?uI-Fc^a}3vcVuTm<%2xo{`3oFmf4csOM?Q7(>f2Fe(^UMk95c z(ZXn_cF~3~oiI)?x)?o-bHVM53qW%*D2*|~xXidhI}g1FKs_Bm^H9gJdI@gF0-*Fh z0P!SaGI$bGD>T20@LeabGiD$=05G1#08MI|aWjC%xQEf<0QNW@F&{p~p0NtmHsnj;@g-zz1kggskojaNgQ2CxhH`?^uxL6TGog_LVrXnAKU5Hk zhRSh~uwMSZ0neY!s5kUN=uqh8(5s;{FjVhL_jB}f37rqU8~QMG zDfId8bJl2U=-OG};a%%o(|Y5gGQFXDqV|Wbhi)=SOgfXrzImMjC@VW5Y;S1r9!=Ht({hk;^AVv@)=-ziq9Nxc- zk_KRtY_!3{#EKok@#_n-pLz=%lVDprxA7g=wK;C8qh+=sW@ zs!!a+2w{XgLK&g=?u*HUZoN}_%#CTn{W16J?vLZi-Jf)SdP~mjvSFq0$sS=0AY*Ha zhzi<7M0JEE!XDw;$nr&d4Myjq zg@k{>-F=kw{!3;oYnR+1NnzXz!SMoMyg+<^k)fs8Vl%~lqK}ju68XdYHbx7aGrj*6 z`&#aY%HhugN`lw%7Gr;DaT};MzyEu0XP7B9V%RSUZbyv!R5|r>sQYt}VU*7OHXaO2 zeT=q}%tqXbScrHWu^h3^BC~v*#-Dum=Hpw#elp4ZIRX(jV!lT3;v2Z-nj_rAvh$X< zMy0YMS&0N9OZb8aYc;#;JI4EEOQ81?35_h6AR&!%I}Kil0QcKa7Ose;XH~N7J{lOs zcj6VCKN+x-ftdXYvZyA!jqKzI?hwKqU&sRCpRN_S*UES2V(S?+~AX75p1~^c5t&(tSKR4x{=)@~fymk?ejO%Wqp;pNIzt zD$FJ(64QvtpCFGfmp4-O3QJg@g=DgZW5nE-S-zsgO#!TK@7t*{$xTn(@8a-peO{HK zly%mx#y`COhxb3Md>9M=3WvW>?#2k?!0KgP@V=Q=mxK)#ewLWMTLP?!m0@H)^E*HJ zcF$)G`op$u)+N82HTuHk>yMa^brqQI$!AUbqi}mOU^B3(W|P|FV10-6eb$dz|GpWB z1B-{a!`Kjj6?<#k;7VB!UuJ>%Sd0EJ*0UF`)fcXHEblNj5N@OCHxSt79S|fYV?7yf z8UE;3C?(T3g8GTJM^oUG^zsrE)7_KZxNPf?Kx9+cbT*UCV)NM1>{xapJB2M^BWwv< z&dy~k*hOp&ThBJKE7;X+3){|ivEA$=?4#^9_Azz`+rvJ|KE>{4pJ991z3lS@CXwCm zmkd}Bf=qSZ0^#QZu^hcW6efFrE)4YkR`~mLd{Et{^}9YgRRWLKy>B7mL=L##fL;5W z`1q5LTZeJpZ-%i8w{_unx!?9TNk4zg#^!@pwz-Vd?bV8(%`1t^y{gQQ2f^|MMstuZ zj?acD?3@@?wxx1^W85G6rf_xbLwe0Q(4CL;{(OnEK^wyM{@57+2I4Y#9V;ZZU+0pk<6K6-G?znN=I-Ts z_*@~J*3h{!ZXQ?7HE=7rR&FD=g@$n3xhH6HZYTFN&B;B>=%StC_R-ETdT2x30q!N* zFn7dPbsuV^c%y|K>0g8EgRRQl?iwF)`RgAd@XhP)UtsiWcMNPhU?>HOANjKR4R@S7 z#l6nG$-T>c$bHIPMUNHTxK-3EVSshdDd>P;F*8ulcOC0z~GVv}#u z6xJn^W|QWVpr<4~PFhY{4>j>gq2{D{ytDEdd>%iZpN8p%FX89$)qDfL5<3aminsHd z`EC3Tei#1?zmGr2ALftouZFhrui^2&bT|07`1c|GQ~oM{6Uv`V2|dogg%Q9~aA`N- ziLq}4XB)8M_;N%f4&o{Xj6IHIdNMPagS)p=6PK`%h{)u`WE8%NWP|(59*hBjm<)B8 z4CUBL-k98++>+dyd@T9JT0Hq=XdV`ud@31~=X3Spw*O09+RkcsSA>zgj#2N}Olw@p zgAttMq2%G@(V*$wCY0@X&<`9TD}4yGM$Kr&{D3b7Fc8}|Jp2|fk* ze4s-ge0xxQl7Mg+k9_nmCSYK*&y##5d73(&JPT!>PrgHa1onN#Bz6w!!vJ;`il2i9 zO(#Pv95q+M(W>v<6Z0iMOy`^b}?a zD}{$?CnY*1F$MecB&G=bs>P3H;pkQC51}ptsXRrKVoo`d(vi}gaz14^Tv3K>J&H~`%<@3LAqPM)C>N!Q193(Fd-`SF+_s=ex$CZ zLc!BWX*7u57oNt$BGTf0Ur<4sce+>@l%@ce76{n;(<;)eY3{Vvv<@FhSK1k$-Iw;# zo+51|ZNe8moi^vQZ>QadCx%@bOfXDBRwa*DBX}=4Fu(Z z>6UamM(O$J;x^rt-kg3ky*<4ny)*q(dQZAHy)V5#{bKq^`gr5tNv z(w_^60=j@Bh!vy>B!WDFMqmAxP!VaNFcv5&u*eyIG^a6T?=Y6JMI4B$v4hu(xW5NmH zRRU2sCA=oQE}Rq23vUVU2=58+3m*a=3!e&~30H*Ah3mpi5lKW5(M3!VOT-gJ17byd zK$=J>LQ6$5QI052qy(r%T9H9y5><-KBCE(Ha*K|Lj*8lRI40^4c|<2gr$pVNGa|33 zS9D&~FB%jLiH1d^qA}4G(WGeF`!yYpu_AgdS{H31B!q&{K?!?2@PLAa@Q`R>8xo5o zA}NRfK@bTd7j_`Ih(hQ=ii9T-4WdVkNCi@jScKh(UFb$!h#NVA97WoYV@L<$K~5s4 zkZ$A*;zfEfjUeZdeq<0CLWYr1WDJ=Q4kA~PDdZY*9hnmjBlE~D;TUoUxrcb}BM*_s z$W!DQvVuHE)`i!QP2qJhNlX#b#Y{0v%o9h8W8sxVidY~<#1gSwoGVs{i^Lk?Q?Xub z6jz9=#TKz$>=L`hM}*JCN5yU8W8x06N4PFNDLy6c7H*2qh`r)o@p%zN+%Fy!4}p^T z@DO2CJSLv-h_7Nw7Eg(M{`ky$b%M%&Y&7pFX}~&Xa!o0T2MRcLfz;Q z^eEaU8byzx9jHe%hn_@Fp-4A+2K9>O(O&et=pNdS4x&ToFgl8kp%ds;bPBzOUPtH9 zdGwZO9U-B2pw14#u0A_&yJbQRCZhMy`{+aTG5QpdqtD!5g+=(U;RfLE+<&)CM2Lo+9GZsu57zr3yc4TV6n7~-TG=e#b^@GggU`~SR@%IW} zXm92KgbioHq?I|93DZ&LtxTANG9PCygSe?tnK0SlaKGn%4_giph!V1d=IeP}mjv>c zK>iZQUjq3{Ab$zuFM<3ekiP`-mq7j!$Xx=t!x!?G^n!tWw;>spfCQ2$2}mHhB>@Q} zk0mhc!CQ*0Glh^nQYJ<(jg%%zg;F`z&%vjZszJ_rk5nf;*z}sTyy-8SJ|V4=)=F(n zpK5xe=`&5AZF;Ne9jQy&B>fBNYtlC9C#0W}z9IdL^s~~pr0+;SFa3h_i%p+z`a;te zo4(Zam8QRK`unD@HT^@=H=6#r>03?z+Vq{K?=}6P=|@ff*7Wa9KWqArrYF*V>7aB7 z9&?OJ$D|YRq+?2YO?q8wpOel@Z%OaK`;Pn4htkLJ%Hx@IMfzO2F5Q%oWE6Pu!IZIN zJb3pJD@&B6!0Qi0CXvbE4TwTkgzLfI7GxTD7h;rE2-{@U@IJ&Yb0GpKV}VEJmK~KH zlX+yPWM^c(vVPf+Y*aQOo046Z%{O#4^fp{-xY}@|;eNw%BdL+on9`WjsBg439&PMw zJl8l%Aj7Lke6KuFo+d}+ zGI_3CDc8si@(Q_GZih-Lhsv?}D&rHrYIsozjo)hgPU8<6|E=+7jlXRCRpW0P|IifF z6xzgX+Sioal-ZEdntKRUmD`Yw|{Uv%E##DsPt`m!FV#%Dd#J zk#2d9{H*+(yia~XJ|Mp+zl5t;J|e#?AD3T|Ps*p|GxAya4f##^ZTUU<1Nme5l6*zJ zCg02^XVbI8vw7KjvptE~Y1v4&EIT(_nXSn-WLIRHv+dc9*)7@a*(b73W_M?w&F;&- zkUfxnG5b>XNcQFI@$4(vliAbRGugA*H?nVL-_E|9y^#GN`%(5{_EPq8_G%+mqXu+n;+ecQ|(}_j>N#+{N6D1K|f^4+swA9jG|qKG1gH)Pddu z7Y~dam^^Ufz`X;Wrw2Cj$a$>1#5^=lo~O*y=9%)$d5w8T^E&g+<_+YH=gs8Z%DbEQ zAn$43T0Sj5JU=lX$(QHnAh`M2`#C>RQsB2p2rNK+sRnMaYUP%1PElcHK-Rk#$*ild5l zMTeqOaa!S3^eOrk7Zt;b%Zdrbq+&*KLvdTNpm?ZQR6J9xD%J~#1(X6t0jnUgAif~2 z04b0cC<-(MhJwlhtHM;^E;w3ntiV%ns=!+?P%u<5QZQCV0;tjJJo@w z3){e!U%tiCzNl;}MubHHYX|l`0=qMe`N+{3&g%c|i`^jmP2ou4nBR@rg_DIdg>!{B z3-1=*FMOQ8R`{%NwQ!?wwTN6qFXB)u$BXvTVvG1-gkWSr?L~QD)B&_21DJ{;bCHWy zS#$(U8<>uuw4#$>x*3--=0#q{Qc+(~f6*n{P|;|hvSB&xoE9$Mg_qWyAY*jdy!{w_YxiSJ#6|YL;s#QYo z&v<*n@v{ByIQO(l<|`Sja;sx77p7WlhANzd!^Ba>33l|f}vRjSM?tIDZrR5hzwRIRFZ)p6AcRi~;; zbz0SQh}%4X7@vE~!RTmsR7cE2>G=v}#5*tGc1Osk*JYt6EU$AE+Lw7FA2C zW!0)`O|_vWs>y1anxPI?bJUUQz3O;1U!A5Fs!_E}oukfEE7fYXR&7w5)Rk(p+NyS{ z8`aI~7Imw-9g0;G0|y~+KL-2rUG9{}zG6)xh8>PN91Ug*zANOUKsWsQ0n#VO!H*z( z&4WNZyrQi z&!P(TIdz}FQ*mXnx!79lMEku@>aslQ zE5$d9Zx`P!UMPN0{HS=bc&T`~c(r(~ctbO|`V0}EF8Hfvk7t=e|&aqS6hr?yLbT09J)uyoa)^~Iml_Tjaty`UY? zUesRFj%Y7y$F*0qliF$RjCNLgLwi$uTYFc#pnZV!YaeMBwM*J%?W%T7yP+fM$T|;A z$IyifAL=-|NO_BHuP$E4*QLo%=!7~{C)4HV@-&xpN}XD#)fsdqY#XVo)R}cwom1DS zYu2@h+O+3%t-5yIaoq`Br|uLcj;>pGM(5S_>dx!>b%VMg?G4?qZd5m>b?PQ`S9Mdm zYr5;YIo-VOmhO&6cTaa;_fWf}d#qj7J=Hzat>~WX*0qhr4Be)lBxY*%mNe@rdb*CG zXX?WBEIm&jt!>fA>J#-TdVwC%w(2E%xjt8~&==`7x;(vJZ`54USLh7-YQ05o*Sqv? zomGECdscr`=PbUdZ__pEkLg!rj}N-3k1g;xdkEsb@5 zy)>;<2#18cQnXZ7np2ursw`C}50)BB&83Z{t)(5MU8QGA`$`8(M@lD3r%U0ytMqp1 z{nEwKmC_9Y(LezcZit32-+;h3$53Q27^)3U!x2Nf!DBdW=rMQ!o?Ziv^9CIK1{{M1 z976^i!v-9q1{`As91{i{R}DC(3^=YCt{JWa<^c16TYx)&dw_>qcx-rlzyKe^(=9wR z;8-!N7@luo)3AAvv<1pR9Q1?qgRFxrY$Wm=%E1}%-#mEd;KIR&2Nw^n9$YsPjT9rp$TG$n z`9^`!gBtUUMMkaBXsk3^j83E5*kWum9yfZ7UB+(XS!1v9f^pDz$vA2pH(oVP8?PI0 z7;hQx8t)q)8J`-T8#l^GWwbI*S#()^SxT9(Oj4FprYO^wnaZlmtYxmU=Cby(jOdiu|)478)rU9%hrXkbF!9~*;Ru$v7tg9`-9#=YVi_LYWS64aTi0;tR4jq*X zUeeM>bmY^|wq~}pQjX#}@qkjc6jClPyIpp#yvVPMa*a=vMG%68WnXSEc9mC@o6GG! z6*renmdinOjr*JK@4A0nex$s${6zW5@-yY<$_L7a%E!vDl+TpUmES2}C|@jpR=!?A ztYB2IDk3XlEBNK+3PA;0A+NCH{h0~#{ER>(JG2d7o591dmQtauz>dD-JQaqDN`SSZ zv7)7-z2Zbg7oex&LdC_3k&4NR8NiK-+kgeYqlzWKYQ;vy#vw9*b7(Js4-g)b9m+eT z22>uh9%?+)e&__C>rl_3bB8V*8aXr$m;}rKZXCLOXyMSKLraHN4|!lTArLFcm5fSG z<=#qRr3|31G*ntE8v!kq?Uh}XJ(U+KFIJ9MPFCKiT&P^CT&>)wB3Ci0I8}SA_*KFx zSyf(@8ZtXqWvHsGvQ{-#wN$l(u~wa^>Z_@XS86MDQaLc)EJBdb)b1dbavT^-b);p!#<8 z-Rgzv2N*-&Rhl!|2ltmTU;-q=NmpoIbzk)b+AQ3EVaMKnK98ywlTTu|UcLkHAp)^_ zsd_p2RP`z@o(BRp-9M|L5r{P~P1NjlKdDJ^|5pv_{-7rJa8QllWH;+G~z)p|hs5rfUnQYjE_`;5b`@<6I4nzM8(83xI(d&p^#Zz@;sW)Zn;WgJZk~ z!<8*e*5H_~!7)>VW3~pzjT#>!JUD7@ZsB$fj=MED7HV)jsCnRlaXUAn7e~!g!1J2t zW)gsA2AyE_4|i>|#MSCYKD8~vRVQ|{04lBS0aeqJ8+TjhV(lU0O7c*~B(#auKXMo1 zffpaU--RSMS1%>EG(D-l()8qyFnDG9jA`0b#!PaznQ3N01I60VSu-!kWR5n+niI__ zW`P+oOFU+|Ik)M_|F2^ivjXoiuRMM9{0Ya8zG~QU1nKkdIEM83cN|6f{J!Hz%tauY zi_99czUhhCXs$3?~91UEtK8}-Mwy(znDLcsA2{N3;QtdGh;3Dq)!UL<%dH?=s zVGaJ$YPaU~(RY_{fB!j5rfo(Tn{A)p<^G&+yTuLsLn!28dwpN|%e=M(-YOZM%1^Ny zzulzs{@`^HJf!tK@Qw6Fwle&leYm5vH9ZV38zwavcm<0oCK$h3$G+Zz3?7Mnm<_=( z-hXf1S8l#+o;Ke$FPb-M!)y8QgO}go#JGfq_h2Ca-%fkS_r-9F(d{T3gkw2k`*9zz z$_S~I)v9aFwJo)swdWvUU(j}(?*~oz^(XeTr9b8R6P`!Gl_{1lW77A9D^tu4+Ul_o z|B5S9h=G%Rcowjok7wHd9$>db1fu_L)}Imn9t$5@KAaKu@PT@In>ltPiKW|}4!`&H zeDvbif6-gpUkkGefml0SJDQSGJ61bUd$o3oJCZb2d#(0*0I_zicE0vjN@DFD?nv#u z+WWN+YaiD>t$mifS-bMzr-2k$8qap3=d}~S=o&D&15E!|rg$bV)34(v3cEGiKNjZw z*2haj@hVRgO(wg-7;($wTzW0EfbcjmMP0M%XQ0~*kzfw+_K!U+_T)bJVco2Jad3-F`hbCoxAQx-O;*s?Reesx)XJsbzRykb*Jlk>dtB>>w4?X*Y(#8)?KO_ zu}sxnuA8X4S~pd9O?Rg5I#N`3qwZ$i?Yg^=_d?wR-5_={qZ_JwRJT~XShu8|ty`{J zty`DOS3bX=Pa>t$VHUR=zdODzth~tIV2X&9f@4YOB_&)s0#WR+F{TYS!Mg zTCGlNqZYL`TU)HH)^_W0>j`V8waa?iddBLt_F4w5=dJzLLF*;!sCCRbVZCadvR<=Z zx6WDT0k^Dotqa9>tq-h^tWT}atSiD^>vQWm(r?|gk!%zj!xnDid2G?PSX-hk#U`*J zHi=Dc%e5(NMK-O?U^Ce&i)l79a?NH3G}@X0Ew)zMG201Sr>)C&+SX$`YddG_vt6(a zXdl@w+JIJGOha`?iO+Mca~X*|ut1 zvw1e`Bs;}Uw=?Z5JI@|%kF_UiSM4cwfgQEW>^b&4?S@@xSKGCAgWY7Ww43c#>;TE` zv^UzD?Jf2;`!Rcm-J>JgPufr0d+cZRBldIlKKljxfc>I<*gk3>vrpJ3?bG%d`>bZK z{f7Of{f>RX{?Pu|zGPqa*jMdq_6;4mq}f4qkR3D!!@+X!9MO(gJ>8M$NO1@qs6*z+ zbtoNbJ=39e7#t=?rNiv7I-Cx-NylkNkK?SP*Kt9(;uvsTbX)?A zI4X;n6ty# z>FjczcJ?^WI?p-JJNuo3&LQWpbJRKJyyBd4UUSYmZ#Zu`@8}H9d(HGjNdR()iBY(3xBSTCqY>LvB^`rLX&eNnxpUSDsluc)uqq}5yNo%N0N z&Gjwyt-8wk_WI-XC+a)vyXw2^&(`pf5FpVhC_Kd)b}-*k~&6!D6S?h1EtT#>H5u6P&UC2*lGnJY)% zray+#U3sn|m&T=c8C?}Fv&-&sx!kTJu2y}AtKHS%>U4FvPP=+sURST{ysO_e=o)ej zyGC8(t}Cud*R<=pYtA+Ay5+j#T5vsdJ$5~HJu7yty4Lhwz1OwbKx&{hFdD)eI1P~v zdmG{#`1;-kK?BktX^=PMHYgg@4cZ1{LnS)YU_mEDj~na_t_C+chaIJlef-m_L>7_Y zgyAItOePo!EGxb__SHACL#W`(1>ee8S@%Cs5(oi=b^>+`{Kc;5TYS3eU#8XF9~7!(#@+G0?K z+hd`_-zJa!^6T$0$G-3{E+VDL7kt?JyXoYy^nX3ZCI176@sHjw{Unhy4X$foz6}PZ zJ<@l;Tp#=1PuL+L#9wc|Nn8Z;pPO%b!yff`FFraJObmj6|JZz!K=2;;O=OP7Xcut-s&#_kRIq$m4JT