From 683cab002353367014da0b9ec9571783bff295dc Mon Sep 17 00:00:00 2001 From: Mark Jordan Date: Thu, 22 Nov 2018 19:05:37 +0000 Subject: [PATCH] Work on #2. --- README.md | 6 +- docs/islandora_riprap_details.png | Bin 24005 -> 60747 bytes islandora_riprap.module | 2 +- src/Controller/IslandoraRiprapController.php | 193 ++++++++++++------- templates/islandora-riprap-report.html.twig | 9 +- 5 files changed, 134 insertions(+), 76 deletions(-) diff --git a/README.md b/README.md index 085f531..8eba3c9 100644 --- a/README.md +++ b/README.md @@ -6,15 +6,15 @@ Beginnings of a Drupal 8 module to provide node-level reports using data from th ## Overview -Currently doesn't do anything useful other than add a "Fixity auditing" menu item to each node of `islandora_object` content type: +Currently under development. So far, adds a "Fixity auditing" menu item to each node of `islandora_object` content type: ![node menu item](docs/islandora_riprap_node_view.png) -and display a very brief report indicating how many successful and failed events are in some sample data: +and displays an list of raw Media URLs for the node: ![details](docs/islandora_riprap_details.png) -The report will eventually look better and more informative than this. +The report will eventually display a report indicating how many successful and failed events for each Media file. ## Requirements diff --git a/docs/islandora_riprap_details.png b/docs/islandora_riprap_details.png index e39895a681caf68ce19531ae6984c2a66aa7e7bf..4cb092fb23b3e3f11e47d3ff0e33d4a3c0273984 100644 GIT binary patch literal 60747 zcmdqJWmH^I(=G@h0fGdAJHa8r-ARB12p$OT?v1-9xLa@u4#C~swQ+~WJ80w9Ko5}j zet+()Z_S;x=B}AJe`vZ-SJkdvRlDRl9ikv7fsR6i0tW|&E+r}c4Gs>$2M+EO3}wE5h z)acLGgJ`Ev!`SG8*KSGF*gI!UWm@=Yd=6t?M|>Qn!VVyC8(nREedZ_e=WEOoKimcW z-)p0DhP#m9r|TtrfXLgYE9TwrV>-&G3+pA$!@t{pd>nAa|J|(AA2sz&aWE10S4}$a zr=<}26He|^Z^WHLlM%xi_v)9Lax;mTnTt_uxEJ4OsZ|M!)AQYt#arHL-8<6!;(UiglwY4On`P?QTBwOWHEz2|ztGVFNjV6a}v zxg?=a1)y;1s$pJInqNYnDI_m4;&laCgQ;+a>!|O&QQSIqysxioKn^N*>Mo^r-0J!w z@ye-f)sxnM_Pp)#>z5%-gp`>UMon~L1D zhLz4X$VMz5q<*#!{Iw`r+or3J^BEzI6qQkpj^)mDdyO}uh-h0st^m$0=^4usn`zLZ zxw8Y2Ok$N2|I$--`TK4r!vQm)U#+Ug@YgiYMxKbAgXvq+B742$B5G(azzulwv zw2_cFMy0TMNEbYvrajW|CM|L(Rb#|soE6{6XExc^PIcWY3R1TYqq3SFQWCS9V1pAi z8KIy+`yC_pxlMDA(V=AZ)RiQj52{<-x&9juIXNzL^koAHuO}xq|1gOwoM_3&$;6WK z^FGn7b(6a`|Dc6HsS-VT9JGcN&o(mbR@&1*8gE)hhK)<%lB`@#)((r3pq6_3IL6ye z&1Cvhr#-?~_csC6$bd^!3cCp+8<~?jcOEi+$$+SH(~6N!tQX^N(E2#sL3`%Qbkpsy_bgO?X3KEwS`YQbA zE}5Q`(vkG`VB&J=^Mzl>#}50hi$@ejW9fp`Y`AFw2g8Hl=p01V5B|MLQZnj2lX>Q9 zh}V;=8}vpXKhHPc&plToq^E8V5$7Q>)87?b-(_Y$k&bA1O(i%hYB1!9$Mm&(Z}Xiy z`Ol@3H_%Jct%^r##X-?-`!^SXIB4F5u0}hkwXqvVFR|;9M>Fj12k=+FcL{u3>1Po~uI`NuyOz!hO>B*0vM1@0TM8SE4 z7+DG1!=|`b%2>iXyi$X1)%Ww0*5FM<14Ia5aB8qiwIC6mF&LCu{-JV_7_G_mxTdMF z)LBteJ8&v`Kub4=^)e^V77637tORH;Z%I` zprL7ncy^Efi_`;z*RvrdB6aq>8l8s=aSk8tLbQmD8ox-uV+%c%%if4NLV zR|LJs^S0mE;QI0W9GgF?*pbz_HsmVx$K(Jod;rMMOkf4T^DsF%P0#QZRV)>e?D292 z+M0}L23xO^lg*>;ZHU(j+-q76$JIsqS+AR&q zwQS@S$IjV3G1y~&PCF=v;_~3(URhT-s#kr1ts>;Atud=+Jrc1#Cs-^3PJbj_q<+)2 zWJErK3igpHqx&<7g(OXBX0%1JAw_N>ntbukuXMSNmR;6%jwA&%@Wt?to=apO9h<^V z!X(Y=Qp{_boRdQ{-9<9&I`i$V^R z_E~Ka;`c+mh?sGG+Ad5d-uj3gALAE9;}?E7*$_zwHmn>^H@i~Twj-6~CY6rJhHn&z z2z)HPhYJ{1@&w|}sfBs0V$9c2lxo(u&`-`Cfl9oO)l# z>pHMRY57(EVY#|`8}cIvp6-8|GHICRdOfk553ndd#>G zK92_nEkr-U;f`Hr7e^tqC<;$BViB~2n~_ZTwcL{I_D)`Yf341l4^y{|FmsgPUqQz#BI*^7>`I1fVm?D{UvX9#x~Ct)RmWE zTHci^C94+w>bq-J*3)aYoGsb)U?Ro(J!RB<2G_JGlVPfQ|)&Qo)-Fe zGNvYp@id&jTIEIJ9bB+M*(i$fJ<=hbghUvN3N>=)AU;wH816E}{6*KYzK__A{B_%*4enCc;F)qI;9e{uhdoBL>)N-FYq z+cLTn=ecG8VzxmJE8Kd%ZO5ycarW~-F%gS3g$aGgK6YH!op+#CglsYpmv2VdBT`XW zxjS~dbtdtm_}>migb)*3f%mNl4I_W~tbcZ<_`VYOHO8KHv>(j%F}-_YVtY>X z$BrxJV=-|O=KIEniClTyc|&{-CeOpA*to7!<}OqKY7K{zH(AiDNw=Cb2<}7MFA0_#V-`XzHw^P=Bhx9yMwZ0 z-VScGKtCi^Hh)88c)>NBU6H#0f-%L&w==4!y+EN3$nAaW8cJKcHFlUG#e41q%*geu zn3SeK?_oY#qBn}l6Lwcw7bs|QrgI-TO?wTv#4gwhg_QjrZcc>{(-cEgHVShSh=xee z8QCNhm3B!xdW{ZeA~=RZx!%0DB#q~z=v|!T!hgp$dsL71l=2TCzjVBY9$a{NCDbY_ zfAe0#Xt3|+@K3rW-(Y_~^F{ejX@3>rKICK{j?J1*m^9}YiNGMad5d|6*>39F=I`vT zPwMKggD_M#ElTsYI;MDuA0i}dG6fnGY15Gg%g^CxcR&~K>aUhAs!T1@MF{y3l%$6{ z(n&R!g~=g{flH&l=*CBQ%cN5u2?9MhRtTmOJ7awVu>PDx+V9Fq6DGbD*$)jXJSZ&x z0tH+r-;>A}GUX3cl1M}FM9)Y{@)4%F-E9;2>_+vWDlWI3B)cOu z2QNxlq11hN_~^t{^O(chiG6LKq7N@43Jv=cbWMWa`x%$9{<4i{yo*E{`Li*Z2C4CM zO#{Q(*vYs&j~v46%MTQvji;6Q%_Pk`CXg|I7)Kf}7qmXvJ)iE&bF)l@fSQERuMd~4 zxFlX1Qj3w9$BjBJt8fj&EL8r8;=Y_oQkofGN#LAF_Few=wv9O__ki*D6U06%yLt-p zimuP{xgv!->WLf_uax<9JNGx%`(Z=%K}bh6@gcm@>uNe;acvR=Khb!KGxa2f3O zI>P?IPAQLsNFs>{pTMvphU@`>&^H`y?Gd2+BNv3b`@oAjRyZOIT*Zk3xOG!H6BoWh zUai2XpFo?m_1TvrzWs_)pFbN*=tUVv{>On+ebFBs_#Cu1r}L7R{%I1WS*Mx`!X*pJ^+fqhbzHo|8`yAB5l&00`nMqaX z%+BiaupH^mCqA*>_9~)Q<7Di5ZEMXBMeAb{R~F1B&Ex|f_P9o;pC?4iHwmlKA`TNeZ_+};BZH*y+uS_7GghQLd9wAkc*6=rImrB7OAKM!0dM^At8#9Bo3j(-c< z9EW#q*Ao9ZD6VFh6QzJV?DPTO;dt=T^%9P|5=f^@wZ2+pC({$zl8w=Uw>=^EmK3TL zj&6HvM?nYu^E0Z9<}TK2^KnaqB0E`ie|he%ZG{=k&nibNF^S3E93c|zSrjr>D`{zk z3?ooqFY2H&7a;We$_685kKh?}lj7jI$o%mRh;T3w>4@gdjAs@2T>77c{VR~aj#>|W zxPN9Z>r&0SpRzb=c52Kfo0(sQrbkr)=TWIK`mg7YdA=2-rq~L$B)b8&Z?wRZ5U)g3 zDypK}lWs$9i8b4rruPiDhBTksR9Hv#FSMnRV4oLQ6MtD+@m3u)5Di~%PGOw&lYQu6 zg&@_(+1e8O5d1nu3heo1rKQ~;=P_g^sM3>R{rO`5@lE-Z|h?MC8T zjuo}IdMtq_`8I#5lBi^^@OD>@v575ImeC}<+^;}re#!yQaVyq=Q`4Lq){h;*2~&gX zRRcV2;MVRGy=FD{JA~g(yI&p-L%ZYSzi*TjWtElr^{HS`=+hdE;$eZAj3%5I5XKVc zG7ICIUANX>+W%J#im60`XNeM)uqyedcT@mLVmq3jfK|6Xrk^R`U?~wuA%R||f*i(X znBE+nH(cJWk@z!eWa^OD1{~85R(h&*yWdz45t-AVDU}5DG@hwD8WKG;SX;^L59?7J zUP?$dp0M^Jg;l8X7Vdhkh;<=HaT!+9vIDs@ryET~UQ+YmKDpiig^Cr!&r()|kTbBs z`}f%sN}Ziz=((2!d9*0SE^m+^KHVkMXqa7wr7AKc`vhBbh{gX2F~w4chli$p&6xM* zjCD$Fm(J~0`+w$igusQrb-fijB`|~p{}#P7DQOQPMDYLm#T zD(mg7WBZ}zQ!_-I8uO*qH7Z+j11n`0U`b$Q+JCcOWW5{x>J2Zhc<`Y3M!ApESR-7H zXE^2ir*e}LEBFQX9lSVb4TjfnTaR+Rbfsb|XbJY6l6q`=H2^(sMOm6hAlq2a(h|zT zlRn7Q6-yX5Ke_?$!@lWF=JXA(cg-O9-j`z*BzCu{dCQo&(a&7;Oq|k?LQevEa6VVu z-n+Xqk@yFF<5* zv+b*of+l+dwY4dZr%yILPkXqreC~_cSpGGp2P9v5ULzE`*^lYZ-y%({;8&heJh1o8l6OEDc{9apZUDmGJ4qW@8BQPiI~Rn_R!ruK;&(kjH*vuu?|r282gDx%xi#X_~owj zXqX3YMy-Q#zF*Py^uHPxk?Kja7`Lt$N0Vd6UD+AvVJDAeQWITr1o8yJx114 z!Hu!UKdt%cbp^G{S@+8;R70;kA8s=Pm$3-k7mSmvK+1pr@j9Dz!+vP8y!rhD5vpr` zyRZA$|6hMB0P{}8;JUEOsC$ekdvK(-W>m3_n>DV^p9c#AZjcrDOPsPQfr6SY+Um8L9cKy?dB&Ndkvp8>Gzd-p9;ZGm`w-IACUuklB^6h_1VsDy0 z{hy{K|Mx{@ZChtK&|Gd^*Yv-Dy#p=U@__bWpZ-}3;fvb;Sy7nmtFH*Ek^mJ}3nG|5 ziCOi`7>r>beAXKZmiVUT2#Eac<#l}5bKF~Y=lQVLR_LG*q}?WfqD}HI0Sv= zGhLSZKE+#b|*0O!mo zH;eU+9*6a=CpYcm^M*4%)H&w>pe}k-b-O8LS(A8sCM|HFKT0 z2{ZTpI^i<7CQ$9KN-CZTxg9>ciz?Rqpt~P*;B%#6Bl~7^KsWy1fXm2$@ah;`2gmtg{7ZIQ{pdHUZVKeXe?8RfBpoaZH+!= zHM>w%mEmD3?Y|lRz>>Y1{%nZ$ZAl-Mgj}z$#ge@8isnu+O-8sCHCN^#)q&NSo8(Q& zZ@~ql|C#jpzQ%d@eNz64({taXjnKhaeSXengWT{Ts6Gnny{gdoaLcUK9{!=*T}Urw zXnJ+{KStpDdioICOsH!WU#!7x0kMqR)fdyuHFM78B5g;13wjf+s>61Cm*J|0ko)|H(-9zYQ{a%3ZqF6aD@x`)eX{muJ6+dw+ODMY~scaXOO{XgtX6 zv`Qcg%z^5FMI`HG79xMZB5%0u99j3@oHt!7+$8+02$DPAsgUL+DOjl9M8+3d>cBT_ z0>ymrJ{0TX_WF9lH%mO~PCCT*ypx?&MlGneIw(r1A#5_3PeGeA(nn+g1C0jeM4 zW4-!WBad9ZDs9aHsl?(;bCJ+t}dL3|EOZJh=!jRH?ri=gIQ1WM0tT&3K>lT|r<1 zH+0Ksl>Yv%*szDzqLL){I#Y`iOY*8?g_qDH^7F)+QXXyjb zI;*7#wC$zcOPfu+lNZy8*8E&l@WNqSqdL+j)W z?XH?gdm7#Lj1WW?bR}%Q6U$vu=ckA^nmi~wFS7;=&E46`Jvs7#n>kK5NY!(~J%vTX zo$1nZ#&ncL_%{BPx=&D#n)5R5;PkADcQcIIGQ$Queb1r3BGggKUAdme%?=3O#GN8M zK(f3U4D07LM(un^j`7ho(f?BrP%Am{U?Hr+EMUg`UH4$IhASWxY#S$@;n{_L|OPO43$@t@rn zax?W6;0TSjdyd>e&3v5Tw{P#oCB-9&< z#sSUm3JTh5fL+L|h5mx+5G+D2kvwdi%T)O;D9LnigP0CJ$j#PQz_2mUKkfwspIwAc zH^SiB5{xgedW=dQr88sQDg=c^o=vJfv^N)=qQiAHUY?@z-V7AnZI!a9+YQH8YtsnD zsd=8sWTb50vwI$nl)GNhWu8Jq!*0%^Mzt*Al75V?bZvVOyH4SXiK6+Ys$Tg-3O!mU z@kp-o`H)OHF3J+AV8UEaJLv69>E}Q7sL0Jmw22OnD);KjO-?k-U|)vg9jK~F+gQPl zYq+fAeYp8E<`q!gP<)CegP!_Qt7DpAa~uNU2VX*){_ZCpFO|D!+TP&c$^QgcIh-tQ zPFN+c9whgFddr0-%!#!Om|-)3Mx#S;5fqTV7hw7aQ4!#8KQIzIK< z%hl4E&A+bXI(|8@>|K9b=`=EMx}%m;sXZsDWwk=#8QoJkI99-t!Net>IUHuy;+*OD z>}t!Mz5;ys!=c4@m0iX%r<29l_C7vPzHJKt7NiBhrMaD`PLm6T7F*kLP4w#xW7%x| zkp>Z_+rX8rmKTqBA)dqdLBm)v}Jc#92 zZ0xW25Hv(vDs_ceSgfx+e9<61xLLEIfWdxQBB4UDuztN?!EE7XnqQ9=W7?>`hytlg@CAm@_eq2H0|4=WE<$oaR8FAXLCwL zJ#^t?u)e|+is#Jbt4y9IwlBTQ?NS;};0FMj2uW761Ja$#H~cZF^Z8 zb>Kx5$T~HB*e)h4!A$)}o|njAp_zE^pePzj#o11 zIpv)h7~0#%=gSSxoAEB(pdR>%-QRAM^ZNK0zXjywW=K`8lCE#z+2C`e$?oqkwH?Q+ zG4n!6OzQ7Fz9E4vN?^H$HpzVtMknBI0zBp zU9s*oUuCk%qF`?UNb{mSc>Yy`bjP-zl`Xm0-MjreB5n-tG#^;2Zu7$ihyHBtnCcIA zA?G*ApDf+e4f2Rbdv)W8jE0%&^;Su{3h#5YwXTd};D0%d7(nHnS(G#W&H)YC8HLE6 zoM`c&XL<$pZw0OK#8)-!HM&6(wUQ0GoQwR5T(6h1fP(<^_55-V0p+olY03D40B~3v zwZ+aW8E*e*R;RUhOU9T>5cLCAo6yXjrflF~x+N{g4%)9ExvCvKf$n{HOQQ>y>;d;9 zj#*MP8V~OVml`1ce#MmzAQwCkJS5z6AEf1bf01Kl*6NR|wEi~>*x0_sS!Y~%k9PUu zrwEV0tj8^fjrT1Y21sv%IOh1X7b;XFc_d#mJ82O4KM@=7>f`m#Fca-QpK=~s*h72u z`VBu3^7_zq*n(I8wD8$^M9n*n#>-&<>ziX41bm?6 zyS*Q%ceBd;g;oBtJ1Ku@y~QWv!YHzj>$5fFx59LTvbnQ#ve8jYS6GMVVQBo~)_-^Rx}or>`2}JVF!0^K$6aZ?&-FOm#*8fXGvz zWZhGsru_Na<{2eHN%=|duE70iLh)EcC>H$B$i@FQP5$54Huzsn;Q#+4*~j2^p84tN zp20Xeb4$y!tNf?B)+nA34KZIfwJ)AQsjr!ya>LXc!-q~TO>eeD-9Iq!)?*5L6$)tw z^0b{qoG|w_AnzDv2A{h}r0tEvlnc6Z+~cw=tgW{${$bLW<=Mt4 z|ChT;AK?PqX;-~n-=Zc6irS@?e_!2Mr$JRa6=$>Vm`JoS?Tn?PCmS}1q?&8M-S-C`TE%Hbr_(tQ_nY_*(bMR~U7^z++VF zWBJ$<84Cr)@VXQ?1MH}XcwN%qNL`kFXX0Odu> zfUqSe?v6enl9q}pS)qe~RHB6@CAgC1fH#!N>)w5G)18UC@2yA=(?wakyT_Y_Mk(r2 z$=-vY*xSsvRNGs4B*wd?9L-FCt_)Sl<_YA(O%>iG_sr1*UfniqWcHJ+x>E&stPX&Robg10dlNQvFIVPwFfi zOm-UQ1QSD4eefnH7a2x|H~*HpOn!eQ>wJ2kCoP>{^V>oYm0l zTYOpu7Wgn*WdWi+TFU6nFL8B-*^&*t7t7)&&44cx>UPbPy}L4jA$n+m_fNtk*HAia zGC!KJ6PnxAES=FiUbvU!`?gFvGwu?O9H~v~)`!&P0ID}1melKv-lF0$ttT{-ug_4e z@Sl0s{M5u_+{9nG1v@#LtKX+ajWG+}V%4*#bzuubeUt-zWE2ieh3))>VF{;-D)6_2yv#b`wFJAwRplg8Q0lZf2uUK4{BtW^hv8ryln>S$z zD`QmUWV=(ptmwDhny>RB51I7TO<@BmSJ$K6q(I#Y-_O!E>z7d7Y--Hgk_%S%@;TeF zlQL@&dzRuvCjE&YuNXC|Qam!}B{D~mY7|VEy@H(vzgV2v(;ui@cFt()g56geg~yVk!=`Uy(H`&0zDec=N68u#VDl{&Q3l}v#NqLN8P3i zG&-ozt65P?Y$@otiLuV5qe*rzOzG{;_lT& z91-L1j8j|WDsW}}-nYidYBfn*+<}2_A?lj~2K7bz%z~v$Rp~t$8NH;z+1bA2i|{^V zgIis%JGIHdV9;l|qqp35w%lvktmW~+HP(-;FV(#iz~TivqICeL*g6X#&Fm!x;2b60w%f*O>vOr9Qx;?zz-z;9sC z`Vr4DTDcsRb@DtV+3$A{WS6lNFJ}j42u6a`{$%ptje@*axzI|vfVQYB7uM-i%q#LxpIcTe$m6*jv+1XKrgykIFE)Ysscc(wIHLl)$i}+|fH>sJQqG z&O7*OcB%TU3Z8P`l)Ml8!oNi*S;|pjXXB2ln{&c`9B9Y)Gns-ph?7?AekBP3U$}re z%d`VZ+z;F-#o{Vxh#4vpH=3Mi*{r|M4@b%Qf(+#u-COO<;76;H$=)`(iF04Q!Tu>o$FBZ z#iLKg#TXCO*bsjY%9;O)*&5wfUv$zvu=-YhB7b-bGHcQ47VP&MnAW^ew5Weo4UQqg zD25DBT;=2~??UVIe6g|dgJRzA?JxQ6WTk6rBdUXiMaTnP<&YZmXUxsmlg%e^aCYpB zx(~`S7`Ou5;^Rhc9XY@fLKhB)QW`+=4DAWi(Q)u`OaX5$^W7Z1x4hz0#lDLZX-;~=1b0DKw*=a%OF4tCe-g+jud=+cUezt#oSJg4`#SoSZj@b^ z=CVGi1}!!fb&$z=!|W5;ce`Dqkt5UIPnp=Hl(AB&bJo3*s0n7ll5z#$4PMH^g1WZ3 zhw#DNr6wP*Fls)bq4(IwHjq8o~87N-6jB0++24gNpcmt85F9@;S+| zlRBbMU3Y&ERhBd7QSBPvSC&Ja%M@wYt1x0HsT&hz*E}?Yz#OtP z%1)UQtfS7vNtuG2QUoBAbECYq!Z5J|*IA1nEK2KK=4^4+8-_>HS z+`(}i@TaGL($HddYs{+|m8Lm2gLnJ>#VU2G1u}S+oiS#2xZ5qG@rC{ErD)0~hq^Ez z=`e-OoKb$*K*@$oB60Prqds%M1s*#G5>b3V5OPu3R7MnW-m>Vwp*?Qby2~gb4*Br? zr59dE@Hy7_dQ=i8du;W*Ms$D7_t7o9SuA}`k>hgDw{OJ>I%99pG})myoZMf=xkN7* zi3cY<7-|#al)ry=Jasq03Yox@_tIh5POwkwqn^FAaY{z!-^*%iBy@MAw8(EH^n8#J z$PzaguIS7su@5oT4vYd&iSg0hWi@8(aQ}UX$SrNmFrf^NJT`P2DO$eGQMP%N5}BX} z95wNnrLFq{^D8LB=!rD+_HGUIicE}CRSTmzbMvmr*1Wqjqa4HB=+aSm^@Vuw#MOtM zV62gA(!st2WSCywRUFh6Ip1r1LcjUP(J|J{>`1hCtu{ z(p#hEg+i`1pXJn)q-GnQuDXF4*q^*6G1e3!j3tkq=a$DQK^J31n0_igmezkkJZlhU z)~Bws-~aQ3rM*q3Td04jMfWddw#S3G_p}X|1P}o?)i>d#Imm2H$85-F9)kv3Ch9u7 zz4s*8znU*3bW0x_8hF>%7~RrkaEg*9KF>b(py#$aJ*78u+&6oOL&PzEHzHTZ7?m%$ zuc&i7;NmjuS0<8Goft=`E3Gq|vlTCTdK&Hr7$oTO5aMSh+DkwG`+9MD;(L2B9K5|Y zx@;F7#@LUpjGQpx-`RJ!L^_E{Rnc@_ejAG5PH>6*YhD>+H9}EN!dM)OP>o7D zs=NT&Y!${&GuyDPW(!IgR7;f`Ls+o#n&}ctt`0F{rT|a0#%CH1+u@s5Dz1oEc$*lyBTu|T7e@G(p=z=<{83A(`j6I~%vC5UQX1`{(+VQL z3QWi`08G8H8DC;)BF*-S-p>cL@}<=H9^@}~mY2`50#C-NCu1Y5Mpt@0%!wQOmd7UQ ztKB#Y5>`n)5F|Lh=k?;uO&W@x{+QGVAKYK4YpdR0vIUlQiU8-p-AQfzcLwo$jwbws zQVT|=fL=9n*+sFz6=4B710i(Kgetjlvrx*2DR(RpA<8~?b=^6cvrvlc=^3&6%GF=4 z;|o(-!sNk&MV(L%%Jd6!@U^isGUP&i*Iey#C$_cNf3!F@xR8a0#}YqJXfg#>UfgX+ zYiNzghhcQqLG@*pC8}RdSI)+n`GS;>$5v!m+^FT1=QY*z4(TVR@{ES_a54m&YtNw) zO*fN*0PW_>*lMAuMU&v*$UZCpmDhJ5OCQ@H_Xb1W`&DOWabRT3$1@Zv$+{bTybDD| z=})t?D7TFACYzS+M&|V5`8He0Obb>(Z(oRMtzmfBWAOYkdjhwBV8wTy;$$`A8Gmqq z)KJh!x{*+Q2DAFzUdcxrnw5r4g%{J;H;RW+2iS%;6%y}>t9u~iF5~rJj%W~kdqUlh z8(Ys4w(Jf_oaB{eC)DJwX6AZlcpHsY=N;%0*?*iKRJXp|lwN9ycSb+aLsL-gTzw_& zruQdL4~jqvaiMxUVW+kcr{3(wmpljDn;8i``KLinV&Zc4|71rX3n??-v!h`>PT7D4NhnLD3F1Ti4x8Xm_F#YN7=r-j0V5d zl629i+E}B=Uf{7#W^DpfYU)BtYY3Oe5}QVB%hl^T(A;Kq4`^;?eKi}*B=J(Sx_ZG; z-qelU;QN@Dk%aimov2z$EKJ(ky1I-LFk%!5U)R9`HXm(xhF)2!p73ReWcl1c(VKgD zCw@V&QfuRCLnZ`JYI=Bt-@v8dlS;}W3phKzs{hvR%mXYVxFOgEPq|T1n!fTLegfUR ztj*6MUoT-Y2Go(}SXV0>hq4PVil$4_!;8|j4DVLNdD;rT(ov*g0i=r+F?X8_!EXRD6+e*cbB2LU&)^qa? zo-r13ciMh4=88`h?LTJHYY5CRJZ5|w)Aqvi&oij?5rmKQ-#x4R-*)`;zFAuC6Z+U3 z55!PCET=s#F1+J2zIIQI`BYys0eh$CNiTjHubsiuld(TJJuVMEm4dJS(^aJOlUNb{ zhsyZz-!l3CRP)X+`h>Y7xb+G-j2n0Sjc>sB<||w92;B0HIK%KqC~B_zQ)}#P3Uyigan%=p4i3q5LcYabWMK*2jZ3Zt<#bCSLw?Ou zpCK+oMcQW)ggiL}4_Y{o`JNoUZO$wA+}76Q#XsLHioY_9EPS3k9kp7B{yJjoj7=)x z>FKFz8Q;r0X&*JoO&6*s?EEal**twfJMC9*JMvWfbW(~J9g;OPA=kWAhZo=DRcBlT zXJy>RXpbyGePiTfhU3=0*4CIrDAkay1^lCPz=?!m>Lyc{sHYZ)+B7_vstNkz>}39V zJB=K>beCeZtq#fVC}Y)XjZt031eWT+?{CmkxexPN2!E5B9;rARADDC>C_qqJAuJvb zgp)(ngJYFSMOBfc#R zfUSs@7@i>mqZjOiIQEKv!^DV!j@XvhFgM5hvLaF~?=UxIhoGAd$+Kb^dRqDWWjOG{GpWU> zd$);rx_5D`&edOC(hM4+}yqFX6x&hAe=^dMmxsHZ&1DT`F=Xcx!nyy z{}C4^>qq_(bWEB+hw9mwP>w`oJUJ*BCzj|c@?bYmE*rxbPh3Xb1j%y;3Fthyh5oYI z{`-BKa-rwNjVD2SBBR_^bQCap1UKsIW&(o=_6RQNEIG*Z`rUldmSi4#eB}086Yfwi z$*w`9jC=UZsE0)PP02y^{Tv@2R)69Rzw%c%_7K5j$CQN`<1!5ITx8X!k%Rc+Epn%B zh*p;VE#PJFms`#JgD~;eHd});RCEQ=IXyIpAZhh11-Nc}YOFVUjmBTgE_D8EUh0%p z%wk@XwyZj$7;&hdn!b5>k7JK3BOuAE_iYSJAHScRFhyO3jixJv>@Lgb6a0~0d>qov zj&4i(^@ej$IkF1XhG9^HvX6yaA9eJrNq`9M$W>%&jQWGU<=>GTNUMf9@}11xgk4{k zw@ke_?OQq}$E;XGYl=wNpim$V>>1T{moF@OteXGL{CcM5q_#PB#&VOx@8|h1lwaIZ z=rG>>R2P0^B4;VOGYQqL64tO(48o#*gUu|Fvx{$+t)piA#xL_1wAvLl%NnnK0NS*Q zk$y4vdcJ=1qrFq}ZX2vATVASC{8EgfersqTRj=zW7d zPm|7TAetUhDCZmhg$fj1n;kx?$rwS^kF z;}w0AXuZf>C4z^j60eih*-b+qWV$vhbD-z9ch^hz?K)%)6TkM&6cPAcNv+ zP{NYyQ6fDLqHe!GTW9go)@jEvZ0&bz=au;s{1huMvp|9b)X zf}~J<`F5oVC!v+md4>;lVyt7VPttVN z?&20YS9Qt0n-4u2`H0-CU6(El7~^C^e{&U3q#VgaU#e1=<}_L`XaC)S8cV`2laR#J z%{y)VLE|HI2WmNz2h3s33^t#1<;fz|G-|d|r9Z8Q?Nyk7209G#iAue&bYYPi0{9o`CqZ%2XYTFm_Z$rN?cZCzGw^7y z*H9S-`H|1mZ=Gh^ts#vQzndPP&GU>5ossu}oseS}L>G8^o2oy1gy1dx)!hY}EGzji zTihRzBN#_=#8YaKyaPb$Ga%sWN1AH7p;hmDK*x_~WSK{%r^3#-Qa0@jE!i40iV}%k zqpI?hm6kz$#E)9^AQKo@g)mKSW9!}%61?MoOIaCT{Jk>X$mUPiwOX!s+b|9apZx+! z?^oZ2_NZ)uf6z>CO>*<@M4doLd9?*&MZ6$#mDc-S!N#k}l$U*Y>TNvBr*$3Gf1CM% zRwkjpw5$gUG{@rPb}S)#7;j6q2I`k|&IK?038HQWNg3}M!ICA@nq6p^C?p<&eWrx~ z$C&Mn35SO?gTU*rOWL~6E8gO{eCq-|*qm(5bj92bJ5+4%gD?^3kZsoL%V*@^1{A}5Teq2lba%(}VCMUQb)9WPdkH%Iv-51Z9Jr9(CBN+N3&}sj38i^|fz(c%9{_xV87@v37I{2j!}kxn+4#=; z>gqqpj$)jp>`qz5juvs3~vuz1F+c9jZm*^i}s}%xD7aX?N z-=`tD0PGKkjG1-Y`tWtVhI0}H4%#!L!5ByOXN$OHS~ow++wNmjn`cxAGXVVm2YYWB z6j#&r{U#xJkO09Ygy1g084@Hw(1hUb!8Par0fJkAV8KGL;O?%2yE_ap*Z{*|gADI* z-S>09&#Cj}oT_s^yj2fhrmFX*_RQ+;-M#+nw^o1gU0o`wf}i>vt+wmbavlNqvFZ$rc; zdm92NvgA{02+3|gvWMSJptVU*t9p2??(}%mdXyR+LVZP9Vo@aDaa>@#>*oQ+a7POk zA8|k03l|C;%dr0O0Z@|;Gt|iUhJl}-Y72|Ev0-q3U%<>g{A}=qLm;Da*Ke$i>jVaY2-AdF(eZY=~|2z!Z$1-f|&uOJ#5h-l> zO|8R54`U2mMiYAs7Rh+{>eG_``%n6H4ikn*c%+H(h$m2?UhgM&jjXx+KcfiYLzj(< zT4L^d@ygpfBm-_St;KVDXcyJabrGbM=Nds^ zsOOV7hZJ>-H9~&8fi#nO3~cEocO5j?4uNkxRZ!^xr(${Q!pLf-)KY;)Q*;i=4VaFl zM^HYq@?T!ia(wR!Li@L0;=c;k+NzRoOLC^aNm?>z!_{n~~d;#+ev}==D zcvHcVW^5O~;GI$2Tps3_*S{V4lN~=rFyMqdVQP*-wDyF#-b&8G_wrY}gI(Nc@?T-D zkiBmFo)p8D;L4fn7CR)A7RvpLBE=GX%%nMWtl^R>UdH{wts$HG?)jfiJWUrJcXHE{ z<*6AjVG!mj&_BAd2JP+Ug$2P`gt(Yr_I~Tga$tQ|a^& zLUookJ{xem02hV=H9U--ugU*l{rR^61K=N4xu@eG;MP!o?p)hM{j$1Jwodyo`&)DG z%o_$$G446-rNK`n4cbVSgvd(@sN}2@o_)IGQb;ZBR-TgD_R4{+l#$-y z;5^!Lh6obn8olXvn3<%U_=V-&m`?WI-ScmkJI4sT8c-|z{9Eu;?4Ud|L+}W- z6l|3=F{6-#+2{ycy@eD{xJPYSLJq=Bw|rRD%n6q?(o~U|z`; z^1rQ@&5-3gm!QEbGo(A@@9<6IGjxU?U!R;B zSD0n9%$+kC1;a|ctP3BRb_%dlxDs75?Xm-)NJ(a~N9~}>`ri!=mEK~5QD^9e6Pk&O_H=cAuM-|iD@p}GTO)1m~8k(toKcRRL zu_rw6N7h{AQ~R~rA8nUTeCo88%guVuelk`KlL|=7l$RJNI&ezWlXTJ8rtq!j*9_;S z4xXED8ToD!3}!OE>gMrFN`68>lFvt$@;mebblLYm>j1IhDxyZ1zEy{@yu6apYi=yB z!97-%f9)JxtSYi4(m8C|8N0w!9C}>ATNtoB^yR;@+2;I!)~Ib#d50byohsP9TTnm< zst6a@__qO-H}@1W?TsZVA7Q4sv*5SAErq`1{?ET*r=@c+ono_)+GxUr>SCoOj2OMh zpQ04WhS!sR^s3Jje)v|XG*lz^gX^6i@^`FeUUaS@kpO;veqj~p(#>4CQFUwUNVV12 zF7(_f9H%3A{803gply%#;v?5GQ|hQX4MlcAJ;9K`Bedf7cI&{IBhR~X8A~gQ(y^Zy z@2yg~w^Bd6_9VWEQN$!>L5ndcrq3FYcFN50(knKLUX6<>U|9l-BR5p;(h&3^XiSOR zT4Bs};mdUSp%Rl+dL$*}2Wgig*Dm)&3|g@+2d!?A$6RmBB?X2VC4pbX6l@@(9x4%~ zs}qr3K{_}PF$f40xl=-p<{~0?of)B?(3$3uH`321^AO!VH^&p+@T0D zVSMs@#OjRB6kliQT}CEc1+yRvY$?&|d#1-^Y^-~CRv+CT8rFOJnpnZ*rkncnSLVdr zFCjYkmz{pde|m2*qg;Xy#);F$D>!$|`?>sPyaLa|vAQS``uclV|m9s)*EK8)03C|)TZ;0 zlNspKQ4^Zhn6V(yUosF#qoF@I=+VGU!`XQ9#acyWT<5teAHe0u-vs1-^nbdJs?EH5 zp}XVw8(7%9TIV=5t&?Zx9l#v{pR=Go$#`ZJk5AHyk7(woVeOzKZ%Fn04ixPn|;*EikG~v9!$){!4 zF+!?zCnH)$PS8Qr65cqxT@L=a%$MhqX23>}KAUMcv}g;iH#mhc`T=3Tpeqt8UJwS( z#afiykQdB37~s64CA6S#WGQGGua~;&$b`~%ugN`^W4q#HUGJ{=Gu?ppOvq8 zrCL304&ePcc{TxdtG)Pg1VJU&VnjGg!olLbechlNt@3F50E(z_;C!e;uuC4SRlKfp zj&J6sN|MN-sj1)id&Nq6Rsq0Y8}x|YKl1VZSN+WE`(FGpvLyLtddp---wr;N`547d`zSX0y|cf-`A|6d)w5$v4SU`UO+f)~A|byrldkhXl@LaQGxd)h0#%J5$N zGC{8|50-mT5D1oHbxs=!C-oNsju>^d%(dGn!LPW4F#0Na4;!OfllFdd>w!QCvQvcc zWeCBkBg|h86MWj^t?A)a$pd;nF}8K>0(Y6hzb+P{1+6Rz8>uqJJ~3t(K5dsU&oy{} z5l=JAu#oTHzn@=R++4fATO)|QgWTU{QBX8Kn!+fM%KI=yRA`eI=(=f%se!XVtzsPi z&pQB=!j%6wuL@0h>d=?%1(}kOeHSpL%!R`s=gFQOh1f;Pv4em<@%)Ber&ECi`fhtq z=`oix?)=&cQ*uOgU1dkac@*7yG3@w35=E{Mn%{`P58Qt31TKt&K5w(4*93oS=RU=w z0v)PzXmpTu9-#{#yU~uqQqPDeBiGYD#CcP7s%$%p#ppT5ctVKpr_1D!p^y3YQoEaZ4unar5r zQ5hJpXkN>Vl2+6PbLSoEtBUqFo6dcJl!rSmKNnka84QQKm5w`jaxR&$Qt|Vopp>2A z(6wB5#y-w%R>2vcSgFcq`Q@}fE(xDu@($`uM&s2aGiG?eg1gQcT_72w-6DXT%xqp$ zB;Q^%W4squjO>!b@>Egj7(;9lqs?UdG--Kvb<|n&VOvD? zPmZaHi1O;B^A%iVOFSs%JN7()gN=k=Z;Lw8sUHAqIiq&ex(<&DUeNte$z#RCOWI{6 zOfrRC=VBZS!WZh>ja1@GN`F-;5Go>~GR_gV5Ro9%%@IRqfGaZRmN^R3!6S@DU(g*= z=VMR`rOKb9UAz`Q{o>K~YKl15a&vf@lOI6Z=Sb0@lKKfCmqhO0CNYGoJJciF6xy{yW@kz-e25Db6zN1C>DIg;km9vTP-T$?ITtCjwH(+NM z?g@-x1xa`Vbke|&QcNt#?#yR3Q`j{+&WJM&tuFfBy6zlJRF!7f#YE6BEIWzh%~Wc7 zhaOiq9+@#@n%dI`1O?MXRW^t(oRw5(cIuTlUWb8*U(fP=rsnbWlQPS`o~#Cxjh27X z)iK*XxbGt(Z8QEJ-n(diCGN>qyvMvd6t80Uqli2CeBs@np-83K97r7m{nz4)-zf1y zd9#ODXH!vudak1iO(tI}wT0JB0C7~f(rjtpqu{{t!wK*3?a$s`>-SWUSV+p~fe4_u z&FOoGZl;Ud;Vv%L$@Ig_UxL5!j67FPD=mFGP%B`8sWjAe5gHbiHTI-KWvKyVmg>zt zQq@Ln#R&i?0li-Gz3}stoB(Pcx$qd+G-go?!6(M91+p0Ty%YU@Zxf| zyx5CKQPG?VL&wrS;Fm4+kp+*y4qzoYDZiVK zjY1#@uop)e2p+TvgtptZ>XvKm%}>dd7MeCyPqBk(T-Ph0$jyW48 zi$r$s%6a8)K%5M@K2coO8U5h84qI-Jxi4hA=K!t6tKA_#W(Nn>;;; zgYe1Gksne&1O*S4jQHgDdanAs4ES4;%RvAf97T>GxcoQOKj+}$~I@2@grb?5Lj zL)|4+yrzezs1WG=>Pzv~{?kq2fDaLQsf>ouH#>;OQ0Pp`iAF^$lSQ)QKv^J=AG1)@*x6$9AGq}yWX9D>lq{;26Is(KWX3N>Y4s&J_PDe?>j+A{Qg6npRdr{VUBKd% zkX&>LR~qYJVF;@A*YYrefrA{c_9Jce8-c0pb8VYx$3`da?T9yy{w)LB+_bPAsA5~Y zPlByhnG>s~tYAHs6`+d(?{sCexWE_m46l^Ll=BHO3}Dzq1$XJ(gF) zUO#8DGw?Z+C7I5OzLl3?gvPwFI*7KRgtV7@)Lzb_ZhyikuCVfXrotw> z`i$rT?KrbKiH|(1b#+35?j~4VR>^KjOY+k{;()PG-eIq!o*LJuBKOspM~4;)5Q7q@ zpT_2^(^q< zE3qfRRw+A0!Kt&LyIS$p65i?`f6P@Y8k$B=&40K6!%I!!Lt<1$wU;=`~LjGGXM_*2f(Kf<;7p!>^znB6z7(ZR^n1ICac$8^j3Uf zeEi0i-8%h*BXUk}dh^N5y;>STf5mHX7|O_}@+};pA*cnRsE$CX6IZs!!o3Se|NDd@~3Xu!`JsaQ2MQMykClJRCx{`u!zQ15+$vsnEMGOpQ z`aST|OjNJ60XU`}Ju5*X^S=!pci0m6xCJ0eF zUgnrX;EYF$LZ3n|oMZ@}i>nOR7!?vSsW3^h!oU{d;@_{Wa zzBoY-9~pIpwA!D1+yA$-zLV_8d*v75TBpdQ@zf{%%N_e(rXp`wn?Rvkh{v2GwP0^= zp;@BM`8p6SWA1_DTj21HCk}NnS?iUmp5OA}4r<%gF1H=AqZMvyu zefeS^DM&@-g;FHRj~2kagG4&EnV@^hE@f`s+KQ0-1?l%x?7A!4ylYhvzFzSABm$7081f2-kAk{e$L`ICELAabgs6We-KgZm`khX3dm7J|T9 zXD4C9n9Fm5{^AS*guZa}oVY5LE9SXS?7ja-F-%n2x*!fxMI-OW$i`EqrM1vm;+G^m z@(}*5i*i9#mR0qa8JuPyTKGzINV%lP7s&;2+<#Pw_)3&25fnai8dNj5RQkr{;&rT? zclLFJe&_2Nzz2Tz0q4GH)wE$=9Qy=Nb58L#ynXf>rC6 zW-o|KTCw2C2ZnPFhCSD=^P$jr(VcGEAp3YarPx?HS$l}U`$K%Q1`G{ zDF^|+m$&Iea+8#Cm+$A&z;mlDqB_Wj4h~9$?l|~&LO(IBczZOd>VW>^{(tceh9_i( zx}y4PH}sR>N{j8bVUp5nFAj!E=3m+!6Sd)OYwz4e!%Tf}2Vx$q=nI){GfTl}0F|Y? zyBV&+Tr8qXo?AHkCT#OYcJ&ddsxI|x@l4^0x_bwHN5j|#KE}Wx7e=~P9DI>5U`?=r z4Nv03Z9v@+sUf&$pSZ*xHsPr>Yl1!U+5AZSL0K?RyXgdm*P`s1?PY$Aa$*D^?wcdUeDC zIY#i+lh}0ZSAHx7_4EA?VnyTG>ft&K_bd@l+vrBVx5Q(q$DuN(FOClhRhSfFURFQ; z=DP}%?EWy@8KXkzcG}{%ax(jm!%ke-*8kdUfR#wmH6;Q3bc86iRM?Auc=KxFa@TN) z_p?euDfv@oW^(Jw*TXUB3Z)kEj;egqZs6g9a_}A?l+XQ7)~$rDyfDGr&_k@myi z!cDa2(N@QXj^K>5F10teT;~@ZTd#-_taVA7Pw7xoI(DhI*x$!jCZAb;q$jme&l1QH zwZ`X^!H421ICzmRj#n%zpVNa`lfz+Hez@tVP)+Ap&)vss3CK)H=veS9q%t-WdfX_O zK;LjxE=~>IV^MXy4p)&;80}5h4n)JtR;GK*d_xpejQi`$&UFuFIvMj=mi z!bV2%I@#JKD*>NBlvn<67#)i!g~#5UW6O`d^w89*6x@6*L@M8a;r?=Pb5md>cI|XB z=EnR!y_dJUr>k^M_gvQW`=+A#q*s0@Hw^|ESxyY|4fWuB;p)bXUD?fiSb?^l{JOCT zrWps9D&M{{0diHbx`Z2~6FCOk4vE}=6Vql{#EZnd9|chvWp#TsVp$wgq?!xX$%q3$ zKf!^HQ6udua5uvuF@FnI!yei-^XqlRw9I!7oGS6Ht(}waQ$UwXm~Y6kk<1Spi|hQ6 zSPveLy62HI~A~|mc)gp&- z3Nw;?|2eKD%x2&HSEivT^DyJ7Zd;{j;w=91bwwx+p%+d$_&- zII-;37ayf~wBMf$X4wNbPam4Y`mG@8L6T@obR9;{R52nyBQ4T{jFjp8vKG!LvyOj$ z$=40e%!G69L)L$C0>Bq!K;(+A;5 z#K|1S%(oS3q2C=!6U8Iq8>)C0&0SJ;BdYK!k=}^oV_`!Bc}i07SY73vi79xF;z&$$ zJ7X?4p0z62v@|_M8+D29wJ2cVJbQI?-*-~NzjR-7(Uc*saNFeSB-B(%X|-t19>uNP z1|*6zWAWS_GCQ1Q{ruO#L;z+or-cG(Kl=#t?BR*??(23okxzxs^32MeR&cgWW88S< zm?Zl4cO*i5th?#yvglLUX}6F6H~1+DgdRnTlG{II~$qB=Vu~MfOSZTPXZu z?+GqUe577N^z$Hoq6;=Ch6df=@Bo@B?PnHY-ZuTYUW#c{zpdkTN4kvd_dhlJ_CApD zTotRad_(aA*q9Z|e2jBN_ai;0p;+Igp58t9D0A6ARTGr9S(?|A;!7A!ZztWwhH--R z(Wmf<@Kb)mMR2yg|Dsl>eia^IEx|l}qA=F&v%~(^#LuawoSX+4aS+sv`mSO1mo~wT zp3)UxuCU&BeYXqxP$)z1FaG09_ZWYX>v$daJvOFNx>S-<8?BNi%9n3>eU^+BP-&en zjs6Li^L7y@hL`q&=JtKXR6Xf~^caT=eS+a{dSGM+-lVAnKG8vV{c|6vSKoIFe(WukAEte$vmiCsRj%g3Hs`I9l4-_u&xkP=0q8ZGW)xn7yhW>`zh1U7YdqcHNeg zulD842=hQo^I&uw)w7ddx0)fJB#z!l^Exb#|GR2OyB5m64+v;I_P71Zbw=CE^~4Op zp;zn{Y~xH<{MfOem?PXnIJo|$QQ6(TFuulb%(UNYFEcy>_zF`c<6(#jUqQeU6Ztb@ z9D)h|A7g$2`js07UBpp%wB<6~cc3GJGfl^GC8^4|kQ-JXY+31)R5uA0&Nyz(#)-Ay zG{`@5(5(@d{1$PtRC*L%Tm^TFDD;G#iEZd#eitAG7@3`z8P~Ls&&i=2?d2}Y)Og(K zWS=BOlG7gwj2+K-8k{taC_JZQ>{(2;xa6plKc}%b{O--pB=q>N*qeJ&Z;Y~2?sl0JU>buF ziyB7~YhnZmPM$8$Hp%>=JTYQV^v;sAUsR1%YhQ~{%xMR5sqvTEHqa)Im*ox5h}lH; zzkX71B*ks*CsuU_EW5-0d6RXybI!&VP)9l1&5ee)kIyb0Ww!s9t&^+O$mUz;(nsI) zxYTw;?^+*A`Ss5w`-v`a#*1~DUEXReECsc-#eUr$p-=W6L7sF@j`_Om=}Vtj5ueeu zdYF~$X^O7s{B!J*41hUH^~4HcqeyuWr$k@bWfV>RI7dmaQnm@W>Ub4%wmkQGnQ%jm zu-)E7he?=`uP`L-h9hmUF9l5o)crbXKdr3+eN){iA@V!+0_o=uTW}G!Yz@CQe$Ull ziO&NZ&do&D^HBH~xlatj@3&6g%hM&HPcN0G>wtY20@t3DyquVLH`;`y@y`Ol6*IXT4G?Kf7rr-0MEz17LruwMl1+obG!n7#J}i2q{^_WT|P;d ztXD#Xeqdhv?z_Oq`C&O8yHEZ33bg)V%`Z&dk!*4|BhQHNmR={Ehe~|L$tA8WPQ5C? zX8#w#h%i8?W;H!pJ?C+=$~a$OdAC%;sUyI7yTO|zq(yO=g$QXh8Csty z+g0tW@FrtdTs73a9_CTHj&epS7K7EAA*Jz_oU|tHFziUdpVd?xCBr-*GruNYHJ@XT zvBsNij6@jd7CQQ|@zRw7=Y1H$cq|-533Ze-wP8ZfcDB^&)>aAlEIvB<8T%4OpkJyQ zSS+TRni`>Am7_GQO3Y)xwk^IOg&w*{GXC!{4ycj?tzQ3SYi;K+wK!_w2SKJXY6>o^ zj!xZ70$zX2hZMl{FjVqnc(uCFLzXg<1)-E-vao^#JNuTtOsoxlHj*jlc-hE)mt4Q| zY?;cfKpJ5|uVYkX<_GtuqAuexuL8Jx3>A7o)(J;V=k%w5lYLQeU4Y5OV=?7D@ArLS z*ZKXg>r-zXu2}vqkNg;x{sNG?XSMgG^-6bZ!@o9PpffY|qio+(lkW>38&+Fb-WoNQ z_7T>Z)%@@sRG?F*k28R`sfgR~F;Z&466j4a#Q9@6th&k^e7}c*h6kOP@9TWqEO=&^ ze(R9su&-jT& zN2TqXt!gi!LeASPGVq0& zFC3Nscw}U{wg1tfHQ52Sk{5Cq8q&BGTJFHC0M&<#D!|UIp?kF@H?pU)LF=0Wb8`4x zw$Gfcx7MQBHo85Y)j*gn^Jx8iIg6EM41*Z6|i%^lj`zmY-6VIxtkAm)Q|LMCLF(V)IO+6Bz z8EVUK_Sf(-+l1<9)zX%I=&E}n=fV|Fs#;EwC=`tgAzAigv{&2TrF^v@6uZF-*$_{E zd4z!$>NvaHCm{h{9Jftfja&VoexZ80wejwUNKeJsM)4AMdbg-IO%~=?f$-5W*H&a7 z=HvKF=e=xhXuF9SL(oB%IdJRcN9Ma3s{iUZc0u66!h*=NTm0N9Yj=0|#g;$l{PGRX z;lzTEmpV#6Q!+Wybzl+V2<$9%tFeUXu>RnlAvj-KFYv#SyqzRh)_|M4aCOR`e0egv zubpEP0DOMvRO6+fX_WG1{C7O}^wIN@oq-qnhw@Py2~19?@Qv5?H^;W?z=tsPHYz8> zpQd07waZ>Q{N%M>b8)6SYe>}&jgRGqfg|Vaj*pxN#ptXj%4Sx`I5_P-;z#kfHx2Au z^Ho1jSRQ;vpbKp|)f0nKXLY`Hi~60$kXkrbeH~(+AN3;q`F^juUX~m!rv|P$oXcI< zo7{Y6ElzE|k9CVxkQT7o?rm>}J8b-YryHQe_LDvOc)JqCAr`JC-^Dpi&B$Ufe24Db zik~C8MKQ1tde79#!Kc&r-0q%j6*7x>yv@J^v?OP5i2brgq2}enTKWBFiC8z3?^k#b z!S26cR|j<-8^#%6Bpkfn zV2p@alb?#TpitwOds5!*#taRq|L>s}cYCzw%p;SZi7sp2iZy-cKH4U1dZ53rqPI!+93UXMK&v+nK6 z$s2!cxZ!;f?+CbgnVcNdR{;^c(9I8Ov!kI?B~_LlcFmIPZ|}XQp@|wIKG6AZ5uTAD zWwG7zRZnUUM=($#Q5@%6G|$le#g91mg$HiPr|H!d{N|2^=3ZIk1)IjNBzXIe4pdMM$r4j4i_Sg zW;>lo?SpAZ_wPDmN~@`DVR_$8TmY(NyT2a>P-fXC^)jc=?>6z%^}LKTL|seF5b-|B z7~5UXY|-h!#Y4;9$2$_`cQfp<;8DrGQ_I|JTFW6kSJZ1Xx3x_BLWGY`N|@R~loUUd zfS2&_5x>;KSI>Ud)@9h}) zV^583y6k!SJW|<4%XIlurm1@CB@4-r@%8>=FM>`d!kl!*mHD?mI+I>xMlAY9uRK;C zh7SKe1tr4{cfzXntJKhS?HXvGMCm{9pjX?zZ&f;XN5>;HkUu4zsuL4U4GM}rM?s`` z5sl)?xS^M)Ta=hXm=_49OpryhcN=(n@)^5VWaYNTQO$DQoUQ-)Ah_XR&&ugbSax?- zfUD6p2TFAFnR}syd_)TX_M`GZSV<$V?vSnow~v5z(R(`zt@C})QpiJsCC2A2gdc^x zLy-s!R)JydZ3h;8j64#4H48%z2_D{PR)@||WKBJVOH5X!T6Ya9d*||uI3p@9UE$<@ zzBy}LaMBHSxrP=xncu?d`fl~-vD9jRB)j7lu3XkMcZjYGKY_P^sU_ zR0O=E;m%WC(%;jbTgMEb*ecVIutpgO{&W43wO6&3f~e1E)JIt~F2>Bxa_{4`BoZGuX*e^#;1;*IBQ1Yw$;VVKEGCghS@eKh+B zv`Jm|jt`_XruX*b%q_kVu>r&PnMp1xX}Q%jgOt!I^XKsQo2aa7Y|GcDpQi4;o{D9c zVR$V5E6`qph3whscf?deHk_;WR-Y>08`2@3;{hQIN-6aTRI4`l`>(q3M$tr?1)mcliM>gM5(Fq!_ z_^K_4KNAELYFHkf2{Aj+aV;$lQl)sOyzSopskx-PN8vrVSd=EiCk+Iw-FTY)7Yh&^ z9CCzPT|r{&J(p^`PFrm25I;at=!rk|WCq$v2b)XIJa;j32tIX5-^Oe=dyZGn-QOc+ z&$o;hb6Vtm(g-(K$L2fVu5wtB`(hoSE#d93#5Ml8{86hJZb{th)WHOOC9?&bUq_6> zwNi(p>l<538qFTcimw%zcN7+InuL0~x=75T;UKOfNKN!uu@GSo6}K9;EWZD@M{-|R zq6HS~<~k%a=iFxJ)N{c)Y@~mGg&e_%qui|?8y9>%bV(`5+@R1*j_*mR1}0Q|T&}(J z>PyLUt`Vlmf{IWjmkwEfVw)*zOR9F>sUBgq-B|Q_dVubM0!Gn4MMiF+fKe`hD!$q+ z?k%)nkyw`o1&mVDf?$3qtM@ogx8EHY-Ct)#j`n=5z5laQ+b$`w5e$~Ihe2)<$g{O> zz02>v+i%uyAJoE*LXQ!a3+9{W<>}{YEArrjW-jn<(@%9Q`tO8t3MU=`qolXkFpEQb z$B$(s@|?^po}`|4Q`(?QQg;SC)ICyIFbn-+i!7-y_ltfIU6sDtc#Fx-&L~mM*Z;bn z*Pkd!UsePa0^aZ_6t0*ly&$O6(z0I2L;W-T_pA8VSHzoxi)J1m(Tx|RI5tM*;vEkc z2&Eno-D3aq2>PB{Cr-mtu7}5=8s;*d`v2<=EN49V6XySF{`UW*c`khA5-8-CoF&

*IziU?Gdb6>c*4M>&*>>#0OQL!<6esHcezxzNTs-@4|ucr!%9sIX?!Aqzsu5e^* z3!=rtJk|h!^h|4(bfjhPKHBjy1l$}|wA3HNS0X*^j_QQRkC=`#C3cQRoclnIuJ<>| zz-0#m_KX>`#1XQ33L2X2qoFaa{3tEnSe05Tx|MoR=<$1sdnALLZLwaNRI`4*xSyX_ z^2Czll=o|Q2M@S}sYpT2!P zWaP&L#8@&HQSmsJ7JaOh6{U6jfe4#{0<_*h3-Wc=d1*y(e_SQWQ#=%!WpX~l zZdlrTVkiUnPPiFybs0I@F;f{D$NuM<`Q%9%)fnQuZ^NiKD`6OfhsANSk0AHO%c5>} z4xPV{dv;?BSqNx-g@{jEAI9>P7$*x~*Hit$-Ffm-?QYn+tAqbMVk0w$P7`~$m2rB` zM_7Tf`Q7+Ul;ciy?kR7G!!)2KS+&Y=605xI#QbmFWrbY!=}Q&9^VCY_ppJ!oXYQ=t ziqAm5j6ZP<>M5pQ8cY`52L?S~EN--1$3(@lAF$O7Y4n3F=)Zpb!!F`5LiA!unMJ&B zy+hXOJr+HeWaBAhI`duG?{!>nXJU$4CcycXf(~*7&O$UyUBl^wki)TSt7Y8k z*GZ^)XLLrd3Tn76X1&u(1Usj-9g9CrED1j^I)GiD7@PgF^i_Pppw;1igN^s*aE0vk zmik|EuewpS*f-5v)fh>nFGYzv%XP^qa?Xi56hHQ<>&J^{)*sjE0_vI(Ay%=+F0R0z zFxV2%rz^fQHVgl<^$w1FRmLVp#f?DvK^ugQ{l|u)`Q-f7_uPQ?c5PzAb5ImTIUNGAXQ&44qlhKJR1xY%=ePUC$7FjwF|*>Lu&(Kb+eHAAUd| zqA@qM3`nfiNV1gr())C(`Z#ut-()+S+v;PtItS;-^O+%YQivA}E*`0qcruNGE{Jy% zpAAJG&jYT#_!Y&iiPC*WB#~MECpLr9tRf?a&DSWt@QHUY@S3=JMxu_70;eeU8|J*1 zoOljlM&k@0p{<@)?-Rz)ZYu_BpYlJ~y}SG)1YHP{oBRFgk3O`8_VN5k0_Xgf0K&Gm zNA&Fx7Un#ZR?m|QqoDeI5B>3G#{zD}RFFV2^OB$4wuD1wf}Mht8G>-CnbH&43@2)v z$0=WHvv{*#mynfl-uPlxb0_QzWBk(x+N2kUU}`Pid<&5rwT9LWN|G+>vvY(tmYD+QfJ%8PL5do1XO05pZ4`pG(k zqnoqCZbK28lNb_Wjnu~_=bddyEp)`wC zeSM8xJ0k4~ed4b@YI3-o-EO_}=XrXniQVrD1hSH1Cjy;GofQ!5Z#+Mv>S+=)>5`7w zF4PHSZW8FOuuUd_eJwd*i$mfU*&Gvx%iu2&Gl*6hp~_I8M-%Hf-M-u%% zw0dtXQ_XD>)~7;litQ4|m#OP9Z1ub^r?kgD!FoLJZt?GKtQ$CwB$a5CT(YNNdCz~{ z1W=u$jsedPvuvkN1k*s&3z?Q&k)*?@P3PuV$Hi1YlQm%(=4lviRN6U zi)XfTN?g!(npJ7BZvim0#y%$@{i1ctuBF-AdvEIV+jle9y9cjr$fUw-KLkoL7ood^ zL_79DgjqyHT4?}z3At71A70>6Q7vJpv1k?XjPnes`#z;i#y{WPr6lov_e-exBk$jo z@iS<#C(MV+Dw+%94lwN&Cq)s0X`{&Me`Qg^8tFqdCZ80S8p7n7mqfnT(F`m^#w zZPVK7w?E@x7lSJC*^K&Qnymu)?5EzZr_+;HAJJ!Zxn#=+)8p?f7m>AtX87>NWWMD$ zBHsS^micO>#*rC?3bnJUQ#vSj3fgKZ>+9#cH+K1A(v+{Nm1kUpn;|&jx#xG|#^3R% zPsK|9PLL;K;q6n4j5Ta~82>bh<+>d#i@PWRBSlcg)^V8aOF|~3ujhK zevzD`?nkwX*p>V5MSo~BNdB_1k>-DOgWPdA#LJVMD7RYn*ACrm%bqS$mm@boqg;F< zbRhVJh*>mxsRP{4FG*%V+U{#OmGZl95k-OaI-q?JAE%m|jU=_lr`Qh75G9H;`A3(l zhIf9?Gk&irGbJ$A`-b{JEn~?v`oU zEtMCS*^Mn%tvCx(_-4oN;jcGRUM&F8C2k|=js$Man`CbWcD%HiEEDq?%`~QZq-1Ro z;>T=Rb6|4sC@lsFwY#v7pJC-O6OboT&u<50qh3Wpxl4;3;3j^*JSUXhEW%N>C);Pf ziZ?yUBeM9?KxQ8MY2m2{VJqhE1n-in)PXsst~~|6watQcJNHPRSlv4g-vEm<8Esu$ z!J1m{t+wBaKR^!Z8lTYzUqs%?+TVcQC{umD+>1>rFEG(1mCK*1Wpu+N?&6kc%RP3> zJ5H}xot7*Q)zZPK55pjNaS1Es)Sql}(QOOz7O*Y@@#oH{fY#{o)06VSFw~y-kNRmx zvU+0wHfPH_|K@Vd-=Q5cIvZIhfF)L;?+KZ zt@91qIiq^Uv{`^%Ti|ANMNQM7%~U(%D_RyvRcV&6N1TP*IWLcJ|9WRTa#l;2yN0G| zc)J%8-~w2>mFZtWC5cDxz%v0KJ-lFEBp==f_oNqHzSN0VudCOw*_JVbYiBZ|KH zZha^jlIti|Vxw5<=MCvRoRX;;Ud<6xdNX;iS0L~}IiqpuB;GoTqh0R(Rk zi&6zpyuY@qlVs9S(pr@8y#7o6{wn-8Snw9P+dkOnaud(X=;Wim8Vm{sgqrbKds_sXPb z#U|ufNSP!uOp!ievbSH{!(0>|h{Qi)+5>_{Up=L{|Fvm{Iu6J4?}lGceAC{G-@>W4#xH=t1Hp z$g^Cift}Xxvh<|#wl(v3ghE>Q7s6N!&Ahj5yC$1^r{^ zxD4pRbvm#m{vS90k^iNN~0cu4TpfGzQD12+11w8Oz?HT^FpS2o7;pQP%Kpb4W z6*5Z`*1nW(=Cku>V--z5UuULor+ts!ydVr4B{WOwj)QOa&1rl|F8%@XRk`_Y`?^ob zGtS&4Nnr@X<9ls8z{Kf6l@L8RV4Z~7K@~dxB>>bJ68a?W4{lcgYwwm{C$N5kQRkx< zEd@z#N@|N92$UvK|Fgd5Qz+Sr1M=B12KiZDAI*nf}?v+>?00*e1Q@qkwWZlJpT`6OUq%r>e9DZi3$% z*e=|!^abQ0>@2iKX_)c2pSxMLxm9BgKOdL?gR*K!M$(@ z5Zv9}g1ftG;nJJ@-*e7;ZlBv@^tj);zcH$6LowIdYp>@wpEc)SwH+8j)|U1<(=Axc z(CD0ciOG(Ys)0HC^yU${*A{-eXcXu$oKLjUx9^*^fo|LkSBH1Lwa z#pQ@Qzd_65&{d<$RS~#fNl2oT0= z`lywX5J_?=TRxGl)l18nPqx^KptiQ?8cn0r2`}imL~b4y{&f)j@6vJ>p|6b5nh?WN z!4A5z`mW?z)i>~dtrM^kC~}R4{$0C5{Or;(4NYK85sSuX3X&0>J0lejXs~jL*6H3P z?7JG@5v}ixTw2_t3OyqG*7W{YKIhZ)0h|7Jr|s7BPu2d1#^y!6MSE|faFh`L^#l7r|j_giPgzz6=@ugBl?VHEsZ-blK&>k zFDCdmD_hX{R~fxZ9+p$DBKmODw%d1sB2xeLWyMaWUzqKagQ%i5f^p0zeL*Z;3r+7_ zf6*JHNGgA48PA%XLtMaY#@M*Y@45tTQ}1}E#K9ZY1i8K~KS<-~q%r<-b?5o$6^T|l@QW{NqYzU70sNEp=!=K=66wu}prRE#6x<9>(kCnI6!>&AB zZK7v?!++jerKV{mR$VWVNg{9A>t=mq0>8i5W8^hKwsgEXS>&KoXI^@A4QR&Nn^WiX zBFL*!cDN(&`wG}xLrp%`@_D|OXI(Jau}<4xH#O*!U?`Jr*7w;09uqy|m|;a2Hf#GX z;<;g4NSNx*{VL0m!DheKzsz(0hLTaa_y9s*Y^{&ZFBn)6F@vSjYm8Z`JUm-MQS2RYi+I zac}q0&P;ar%8xj7PCtVZsgrWGm4o%Cu_Q;@_raDn_WX-t9^51Q>{eUbVpzJSmdL>K zHPJv^_$?v6=`@4I-XtOVYG1CZjCs1uwarJ$9P=o9G4fjM-(U}FdD{7Ow+P84w-Z1U ziN_Q&t?XTT4$sv_K8xW8Buc!Hmr6=Od&t3aDCVCI0g(RMRwhcq>dl?b4%4rN;Yfz> zUJRnkG|$vo+O*_>U-k4yVnT9zmKyfB7$CwE%*=QRjDKN#lyR?pye-VG`mP5(cjO-Qlgte*OM}sf{f00X!iDpf;$wIRg%)&z2 z^NMrc-h<hQaV`$=**<*KOjK4=E`?`zBaKiFP>it9$TR(qPZILhHSMo zz@9d&jHA<2u7<@#-1K|SXT}2@>HK}m?9t*T$3BW_ntJlzMf^IYT9^MO%x82SW|1Eg zJ1Bw#wUXOOKD^;FmkHhJeUwhUP&WFnF>_uS zn3|drSgB!59xAV@n%u&o|HTgr6pZ?Fx`$kC!Y;Wq{P}e4iamE<_s_B5rx5IZsFa7( z^=8@=qnAl&?q3eTxWkk39T*s(fUPVn-)mE?s7XSy4S6P%uIGADu)?Fl82)d$O<SyuR_WDz8pU%yBbP>E2DLuu;xYThy~E zc`Vs;&PD-lfy^T{jhlh(bBh|FN^?Fn+p_0c0hpz{Y$TdXQHYP*3lN5MgIJmUrtd`B zE-}xqQfiBW40LAG>mrs!$9;2YWD6!>OMD-sT?v**($>ZYw-mo%u}WTF%)x#AO&1bv zaxhN2S$S)pq>SKPS?*I0d7rHD!D5y=Dd02U*X9ulf`zTo(zOR0{n#tdNM}_u^yV=`xbV@%h6~ZT@J3yD7d(cmKwGEc9cr zg{|!LqG%S*KxcVIifgZNLDw>l(|H6_&#iJ;0f|R{n2)VKDo-&GvAN@cxzW??QMOK^ ztDA=l^%Nd%{CKLkiu$3u8`U=y7-f?=TbsGWz*hv^qK)Zi4?fBP zibG+LL=c9u#A>E1_hfyPrIqvdN9;L}qfK5x&%A=McLO0>xHIrwlM5_Fzhz1D-FXW) zPe{ISeb<}+yz;93x)$+_VxshoRDmKF%XNH1zeWmr2#| zurGv#>+h1wGHJC*fvQlJJTQ*l8qGjeC=%h}*0ILxxnXnhjWgV(^cJ1q8DPJ{z{rmg zb3VJ(<8c6(e9YO>YJjSXH?N#=`s+}W50#V@EzBD{BV>G^p}-b7u}#u6x$A8Jz8i}- zxQZIjZ2Fb-?cR0tfWE4>2aba#}D(4Y}^C*+T`TC-g-0vUXju`>r zS*v-zvEZB^@3{yG31h@5cu8cY;Xp7o#aVOkEXN#jO|-$88CO@;i|F4oWhIBtD?SPQ zk@wm&81Cl5;d7rE80H}XiE0aJO&-bIrF4|?e!WK$WfW@LLNTMww_frr2D6^ z2A_aJjykS~>BS9^!VQzK*VXlfZqjC>A4yWH5zfpE=Y8SYB{Q$A znMB?Lf#Xf1T<6QdO!yh>Ff?|y&*v;GGZIwm#e7sfyZWHNL$W*f(o41h_L{<{*`qiT zpLJCzs!x@Y{_f;K-=Z2W9U(#WFDwS441b{?UUNH=R%xlLDojk4E;#1y5w3DVI?GEZ@O z9jtju&tEsX!U;5G^0>e0+EpM(^&{mXSF`%nP}{paSNDfi$a@kd4!fc)$K@XDBm%fYTez9V`*`E zPW&e-xVn{@q4ZR5)*?LiyoOlCNl|J&^{Zk`hOsp_@3Vv#OK<@Y`jt)0OE0_~b3n<1 zyO%C;H^sdtY<+x;yr)574(?Vu9Ap0|d~kOaP$ue!u~CHk{ks8p_#r|=%Og4g_5XZ7 zSmOq3tzgcxqXr{7W{$60;q7;bVhg1jce0%j1K{W%F5N&9eKz&JdpaZGX>U^FJB) zBdKl?k!Sb7P{{CDj&&q-%%x>%(S2mVXxZk;k-la9UuJ-6f|-WoMz_m^1`c3r(=zmM z3_i1IaCJ{hOFMl4oO(p02KE=s$BuIwm*+fM6IX;SF7Z}rO{?+&R58*$<6WUGAw0_( zTDFfn;YuD7drGfP=P!@(QoRfHr+eiTo@5|TVBDwWMuDjrJ?D+ zyBeUTY&~oVgmp@Nxg?4znlZx_K=JH#U-rqBK~IUhyVy7~2{T_{YBb+RYZy6}kGU_% z-y3$1JJ{uP_u-H`eEe}87QHf3#uuuAISFceTCG7c=CW1wZHi=0+E#7YD2F$9O86tI zCz`i*ipIJCzAIV9B%P~S{@I&L(~0mlZf7L2`L7c|Xgd>S@Za+6TW{*VK{MYZxJmpf zxjN}dE+c%|G;(doFF{MHwhgT7S=(>`eeHPx3bp0oR+;yk*NK* zp>K1jL? ze;;Jt_;5x~zq1jwJJ(!*=%pWA=c<;bwV=dE=*}*3DD~vr<7&3eM$z7Q?b+UnF0$e6L<(dIAZ6b=?R@PC z^5hevwJNnMX~}@h@vuW2|L=H3YoIVldW0ODsmc8|qNrPpYI}UV_hx-E54C|*~)%NiKOOM zT|Fn{(P5c!4I6(cdE47YrXV?EoL74d22%}oE?|>PW+q5Sr9iqh)YnHpchF7tV}Tj4 z0;S8cXMqZmQ6c9u@4|Fdskp0t7~+XhMbRD@@P=`U$+I;8 zrYup>(B2Oy5$Wy@F?gUK5pf0bg==M7KmG{YNm^X}TtcCf4FllZa0O32!}u-1=3z{fIwSluH?{R!Do z(U}jt?=Z&ot1VBBVYK7TbyG8O4IK_?0`Lg@-`0(qsPX7eS19l@Yk`(AS`psbsxNpY z6f6&@@E9`GNskiiSU{0{iyuBXIN$$-LU~8G(FXJ^;GYIp&uZS4NUdTF=!Y>CmZVLb z^ZuA-I0@J!>K-P(RUht5iG}J*kInq289?p_z2N* zV*RO2UH)qYQ1lr0S9s{k-foVJ{0n%+{j8E>CdSmsEOBGYaCIoL+el0|jf;Z=HVbAwRHD2~KNUqIwfVR81vpuisKmM~8x~$ftx@kn5v)*Kkhg<-lv%i;H5;>VDnP zs}=O6&a;s(<>72J=IV`Kl#i88usY%u3kD1C*dzJyFu8-KS-fkuv{J8co(1CUqG?Y-O>{%YBZNC zV=0uCPW*i6JwGu-yI%8nUNtPAHY|H}*tf%Yh33>T6Fn8H{BO`eKFP);kW6o55~Px% zB+gL;00SV>-8U`BMAJ{-2v>RbPp9oeAe4?wYNu80RP+? zvQ&_yHEdwvq}vxu$(AcYeC88L)Bo@ZA=`aNmtz4`W`mXPA-l#s!M7g zfHUQXf0{>xi`3A3z;n6r^c_0Xoa6g*{XP1;x7o64K(!mlaF3ZR&BuX9T;3-UIu`0pCHylQ>8X55UMYEw_awY8pz`*<4 zrpir{#9Dz&w+uB(N(PDIM3&|bs)dcN7V)G^K+pYHO5ARx=VH(v`|-AsSPXBcQhZYU zshs+pg*vVXW3Os1eDH8tu~+aCAqrh$2wlm@IT>2|%B9R}v}{qFPnE0>_$;kiu{aY@ z?AeX?CIiBwye~85B^TeCo|4CQ{EeDK&w5!G=PujvA+S)`rhq1J4deinA_>TgEkD36 z7`1Y&pcw1|H$d3oWxpt9m44akuMsyQ7b4m0vzNx*ObSC=Z}d~Z2xHYOLzEpXfYGuR zz=H;=vK-}o_YYdYn$wa$praq>cD>T@NKBe)Oe4`UpjlW;R*h@1OGnB2pH9 zP!V7~f+4#(; zBsXsa=j7_mmiu~{giHK+K-NX`^-afLY?4}>M2SnAB!1P?`1*^6PWi#P0)?#$iq)Ux zwZg*q&%F_9eUZ|+eaW*fg}<0V6<#`6tWeq3Dk@#{5=JKJ$Mg z(k}Plesej!K#*XNq_loG8E@~<4@5;j03&3a4v+1<#7AD!8~rbM&EGL{qNwIof*M@P z;R$O%)|V8S#U!`4ce}?9WesK0_1T!AFY9g5_jXBj5BgquPG)NSCR%RWb?Kz(*-mB% z?Xld{93~APyIb4FX!y*qJY#mrWQ!2D)s;8C$;|lUwQ@3$3LV-e^51;7X7x~LAVc;8 zJOmus5J16lyuFB%{-3P-M5>PC64s_Zga31C{C`x`dkN!WxunX0!m!S4@bd+-4EP&J z=Xq3u;Ph`qF;yQ;E--`r#DLCOPb9jSpd?^xEU8QFxs@rXiEP;*7qMuGLIpkFocAKb z|14u5T5MJR8k(5|&l2Q-Y*gR*yrvueZ=Cr|zd7*9qaYuuI70|R)`0bYDjItN24%Fn zr}y~GB`XjqK?tRkhJeuA`1_WDeyJzPoa;!4J$!_+h`a@@aGZVd4+1USz2A&zi!LJ( z1MnBxFeOLA9oaGJJ*8~0kGLGdT>KH7o0XdNOe76)PF!A`;w9?a5kq(jDZ{Jk*N7uM z1g27Q)Rfydvq@w--r|m_U!Q49Q43;)x}Fx0J>~~YJ7uvPOi(6oN4XyZGMwp=14*^M z85JPs4TYwK1oezYBBPtOW0kKRhbSy%vUg+V{bSEY`v0CQFJWY~g(!`jpcYC1NhsB3 zu^H;4xw~lH!6;rw$y6v5d)GNG7``Ak!|ncM7WgRqc6?wimCe;3QeM4B89DemO-3gp z<4H~0o(!LYB4DIZ zX!bGj-MYj~P@`}(J2_B(P{81Kf|%0^}R@pnZq7%rE)P^y&n;OYmT_q_=+@U93rq zM7fB*Sj{t{e($CQH5(nE2loiTc>$V(vIf1>6HglWs*rfwF7__``ImHBEhr;BV%Olch^&*Hd{o+t z7EBhmOf*P~04?r0#Hmyv7caL~wGU{7w~5@J?PrAycfC#A_{OE%!NGYTH?Kb~+%yuz z3guJmS?4F|qbVRPvgwFD;`uvUS}ed6*YXd{5D+o<_3>f^=uDeA0{*+yJEKy!LVi_{ zEBH^LB5c=(zDj{Ib6vMw=ezw>-;aI`X`r9dM$Ew!{keW&!CRLrC_jRPd+<4{vrGCf zg_9I0MKTn+*(}Vl6{I?f_IDsKt2^}m;hmYpq&)&$aSv~|zHPcvz^mTOlbY0PJLuPb@WSe=uRU zwfc5rNy+)?Kd>#O{wHGd#Vwq3pWcBLlN8;`brmS&i+j{XTkMyWm8Zk9n{CxC`7YPj zF4u1>G|1v;D`OR#A0pmz|~> za5HaCG2mY;;1Avy5IUP>TlG_fgjY5snaPPtN3)9uKy{RbId2gtMx zzWodHNU=kiF`NtS(4h42f*BQ{f|ifB4%;%mWA!>Gok&_*DM)Oz^aTpJSt$pLFn#ea zUHvfMpwcxoEZ$n5%uJVi=Lb)B5{{&T?-p_l`eH_?wCppRY^MqdExdb(*o~1ix%WaW zeH|;p=R$!93wKX`B_@yD=g$|>v)x;Z3270R>EuuvCwIKO>46$w&6jiO+(GqEkxu}m=e=CAqW_M?G zIoMBiv+qvmd=AFdH#v+zoem*FYTjtmPeT3E)Os+B|k^b<~P#S2MThk-ZWk93i826^xIDCHIkI zo+;Y+IsmMDy|~u_{Yz#zH&ZdzQ2)jCU^%N z9}1F5-m@%p^c^#BN;Emnk9SY#r_lS@YQP{4zJuWz3 z;I^EoPetDONE^=IMPF0Wqo^+LZxWd13STcJf+^N% z7vPw+hcBhkw>wxs{??0&UL0-;*fD)0lxJO8`}E80Z&TH)7Z)2E!Y2X>h&2&@Wty~l zrduUj?8$T-TADk+=ct#wv_``WbMB>-&`yN9Jz(FDzJhCYoX3DvY4IG$OM8ShPrrCJ zgr@SIY|_;${o5=~HCvmZrIt-T#+>N*`1>og8i{&ub*UI=bal!opqqw<-1R=^o1bmn z*D{r2sn134_k-x#z?P#<;p?2VB8%Fbp%Ce*I4azV4R)N+_Q#jXRQM#^s6Pu4@+Wk@ zXWnMg4GF#7E0j8UK6PYX9i4BF2>cTUBz)n1v(5wAnN@Z1(OCQIjkkiB_xl6*0i&#u zD>MV5BXT9gP?|iyYjKa`Z##zn#QUo{9^mS>+do~K&X5KBs4(Cs$am1kRUei?M_Vr= zh!^B*Ym{^HdW4o&UU~SEBf1?mdkvDVRrUM<@FULOuWX+U5}j#~&NPOj7#rA6xRVQ{ z`s$pn1Fraz^A2IuH_{izZ_g;Sz0Vu0N2HxhtR=8}x@PeUW4!mo#A-)-*9dA?ZQ@cg zzkj$CH7Uybo6f8kNfCc$V5k^hA5gu4MynQ22PEowj+wg7ZMV^T2gi$U zWF8IJGP9Mni>Ld91s^$_$R@K+o8@^Rr&M)J@43adIne&Sr8~RoGTTTm!s$yDxZN2O z6#FAJEbn3h1*^kU`=e<#=MT~`LrD-cjQFJkT;X(J3j~T!VWZcm-0kZ!2V~d|+GfC+ zD$Jtv)61IauBUDT_+5_5`9PI5`?1{z2`8cQ{96eQUip{OXpiYv-9#uks<`7hb6Da7 z2#FJsPE^#~8Ge53B`(+Eu8829^3iT=yx&Wj@N1)$1Jtd|2)xZsg>EUeM$UD z9@^(uM856P31@trWh;{#WkZv)dwM!t^fI5nO5MIOs<~87z9>Wu-_y#kixYOW56;-K z{AKpV3WfGdzKw{M)mzS=$)B6EVUr?t1Ry*5orMcKY_s5bF zT9al!g|zcZ4kouRXm@JKESPngkyWd(CSWoLCE#aQ96ksk|R0 zdZr!U-QBpiEOP)q#d9udHELl%p!a?Lc~(CmDn1IdQk2OQ$wP8Ljh1?BF7O`eT4`g&58#A$|eBxLyEk&@fg3G6ABq#h3*39ETQR2*K0 z9gmL{lCR0IC4LTXSg!jq(Gzjr(3adWl=P5C56Lk}nmZyg)L?j(q``e^Svs?9Sgc)= zPAjh`J(69%Q!vi9cFv_G+O_p|6Nl7Z%90NqZ2EDYi3r=sIP^5d#i|UC46r3 z^qah(xLzZTe*jp2J5qi1tRj`j{iwglV_%wfc6jqfqVc}HVre*x`9Hh>ybjs5sfZE0 zT@{R4`kr-T+jJMxn=T9xH}CDKo^d1wrP;E$9?eY*b#)oE!&#zax1qe%8F1l!yO5Ui zGd1WLo(F7Kn-7I zX8kHC&>g^H{fMebe<0nY7<=iaI881oB}8K%!F1@P4fB(dms@&47xg%Mk%+O1I^=W< zpMagnsmuaeS(ZA`2|;_^=W+tQST85U{>I$C3L_ZAHoh%0y3~04uJGX#mL5Y~yM6sh zE%Mhwq6oT(22;A?9@{2$-3kZ3{0I$7so|~m?ZY+`R%-p|uN`)hXcT>ejs2$&P7QwV z-(T@lcwJTEtc`xi&BIWREgxJoTi~O48x+OP8!DNy_Gb_Nz#9&|Tn6=Zc&94=1wMVN zIGrf9K?leqF8WZa%T?NUa9sYS5#A2BYNOh3r>0EtI}emu>_nebOD{YN3OpHhJw)%@ z!FlX;TIR;9Sj)U1y$z{)b#-I4JG<$3?!|b{wruU@ztb)SyADQdy)1b82(56Q&Tn(D z6r<@2*NbUG_RBPm<7RqO|BN{V$JdKX)N^jwog75Ve=0UyIj+e7O{mH_jI4WJreZMmPsb9QGFy1L=u zRE=Apv%8t4N*siqZxxD|EWV#A?i`LUTYT(i)O?4ZK#?RFO^-j5O5%zTz@;{}imTK! zIg5lh`Z-XA7KI(JxeZg=VMe8qw@ZOqm{z@Y>mb+b09!NJiY~U3Q|^<07m0q3)X(kP zNizAiS3#05I*xK1T1wUy1wVRtS`hXKA9Q}{su#Xuvr08BvCxQv=1?Z7Ssls^F>pv{ z0*y$i!|&&A3k~MO8hFglIp;H%t2xv`BuABA3L- zr)OX|n=>o1f$k}Cb8}xWT{ZVSK77)EY^+I!<(*uhvP>Z+iUxkRjuGogPT4iiEwb{j z@OvRGq8XZc+yjsAFBUR7(DF+Gy~}8+95dI4-@ix8Xz)d%%JT$7ZiJ+d=KSa*1Z~6DT;v`t`P+9nY=2|~eup55T z(l#a&og0-}?j>WW_{<(n7B?7`<&31#tKU28ae;QFTk#f~MeKbBj9}g>RGDPnwSS5I zv~p>Rf*~~gO>S~qq(BP0uLipmEhHDFQhACO5de6By+zHtDk@N*&q%phnJUpAjx5N zY$)jZtGnv@UgZ|F~$|Q`lw2r)@2dOf^+f*sBoJ9Z`E25)W?VGw+Rr_3RLq)${g+q%UK|}!0L0a4}Ve$lDVp z7cHrx-TkdU2sCH;=5FDd=f1$7QBxm~zL@M+ehRj7PAHzlI&Lo35spGaFf^*$@`Avb zZR^3YFBZPTl=$xUBW%A~+#shI3u!pg=EC+dXT5NFux9j#rH`LW%-WG;Io~l!h4Rg- z$jX~U2v=8k{2k&BXJuLC7F>_>+?)BC1TPhWP ztKWq-_X@T>bB%*J89j;O#g8SsnO6s@1sj#`-+#;Ucb+$*!&R5LpW3kH(k)AX`XyL4 z=E$d5uh`;am#f+;g7m#t+t+C|EwL;}I1Jgv-Z!aDxW*`Zp4BwUxk7)+ybi;&zFQ!q zIsnG;OzaJfwR6Kjo_>|{t|Os7R^Qr0lDm&{`S*_PJdZ+@+Ixp$O=oYTH12kw0uz@r zu$Rg6%|>}UmPl)ruTi1NTU1>&>pd<?J^CB)~#L>W!_T75A?itf$rMvR+ZTc3h z^5uYOxn^Do4^Iz5P3IIGgkO_3b%&?Aks(>@Uy(`tslpe#*`)V>hc)ot+#`SdSom}n zCvt1SW-M?1`(j=#Jb-66P5ZD>ZmOD~M~1@b_Yl3ah+#rv;?_YYlc$LP?6}~)whrD^ zO`s^8Ndk{oRgAJeehkQStkQMhS1JGDb~VsoXlozneEdPgG2}N(T3{4)?Jlt5t13~( zlPkj{dz|~S4b7M%WV3X2nl(WzLi|gtEldN)nWK-Ib#52J*HFINVs<08V^^c}JDyg~ zDP7v#AE*uj?NC=ZS2bRAJU@+lS4J-h@Yqh+(Zb%xEKz6S{M)NQ%NxpTQ3dneu1P1U9{ zr{e?@L(RhQ{hN4U87xt*-82Ywnx&ecS5@~~t@^98i_gyFFW4I;?>A71Cvh9#YPt;@ zJk{4vtq~vWs&p;3!_=N*TslO5H>VTz*!BhDOBPV?=?JZ>S5k*7C0w5zY~cDB|M*q8*F=n??J zC;b4s{tLT0%(xbBUCH!-Wq~rS*oU~bRnW+}h{O>RU3rCm?Nl{vCCSRnIU*;*Z@M9@ zG!zybe1ow|N=Apts1F9BIVkw(c$*vwNjBVvuVtcD5!8q{i4n5DWoK-3F@FT$bm^Tn z8{9+##LuIVe8}0=eFkwWLH%SkAw=F9y3W|NSz+;ezbq74>CU$UH1wmTJ^qb<(8JW& zysThoQME~x7JJQQKDpTtsW-(@{KERB9)st(=QcFh+5$G8cL0*E{)Fz^!^ z^I=6*RV=H~@QOY63v2Gw6fQgesXdI(i?|(Z>DK!kkjefR)E@%7#q+R=Uq^KJ&1%#Z zYRzT`cH7pvL!z*Ba>}KWG-^|Sh70wBugZwXlc=@r8iMg)q%0d5eC_SSZ%kP&&ft;# zCXL+1>AKbxk{lFR3oRD2UBEn=RCgx{Tw{G}d_MH+;9O^_+@I1vY3GjsM-OVkDN-$v92oT`2@VPf{DN zqRT$X_egh_Wme}cV`)?~kp#NtRZ>z63(~#{yaKbGtD7%R$J%U@J(@!|ZB#9IO6*+R z1N(l2L4qoXO0IE53m+zFL)MG)V;?LmDvO@xm9O$ggyyfj)o%|iNijGIp^Y{@-7>`U zjau~5Krif49w(3h4yFkVn$0#wdQ(%XGT6gGd0NMblL-ZBi(yEwesB##;Mgo*4gI^$ zPtEq&#v0f^mB24+liI-v2qPk2KyR(*0CxCVf_s-|QphYCrDR^) zmZ4Men2ERuKCbxXTMVOLCf(E0^R5qXytorvSI^gMXUZZeaL_PEW=~v+)Q{qGhir0i zz!C9(u8Fep&~9CMXTpf`d+9PbIb9$28M}>7q2pL2+K%^ZhF*-8tWs>)A9P&b?l0Ej zeVcZTyF8UX%$h%@WQ!%UxW&JS)6i1?yIfd!-5}g05F)eKzZbNMsJSNpQ-`|yH3i@E z@m~LKn4={ZU)@6f(X`?p# zHR2RQ=kvlLWWwsH*LZb?rl_)J6OQgZ%iT zp5(|35`s};YH-w$w~5o*?&)u7KC{(7y{co;@{;@y7Tsk!PIo(mAGNe6d~>Rkq!%vn zBWGdk3grV2&^Z>d^e#%Y;1w4cWpS0i#}zXhzIu}qhDn4G{SkkLh{4_0XcshBZF9P) z;EvFX`|1sPD2qCib#47yLc;9A3*?+|pyB#@s_E&iwG>6K{Z$NDRPFDWId~m{x-UX~ zWsT!b6n;peOD3ZQjQf_<@MFQ4h1o=Rv40}PH*|g9t8l_5gAnY*+}PA{VV5*Es_Wpc zWMrYCv@}eYuW))~#?8`YobBGn?se+)Qki2xt!0=hftZv^iKRDFKI`j?4%TjPlY)Ck z_NI+;SQk_!KRzEj+2YP(yqFYYK!wjLrgTnu8a>b(tqNH~V%dIT>N#xa~c82Mxu@TKT+?t;7+r5doGo2)EmZ^&#w zs@l(>3%HDiOib$Pj=K)m&uq-LMD9N+8Nr&!lF;)n`$~`+1p=-Eu0%-Rkoo&k_6zEp zzl~;qg-HBgeHIA5|J%n#eEj0m($9OjaI5occ)fy9@JehJbzL;+z-zOs;l{8SBz!qTzgrfTE;dnyR$VB4@Xx5Ohc7l)O>3#W$3jvD&8YnubDYlQ{$1XnFTX`w4TRQ)vf+Cl8lOq=nlrE2K9IE&rGs5 zO2VHhlx$3B*O{wIxQJL1iMxe*{HJoYwKTAEVnzmx4ev!n>gK_$fGd&7`)I*XFhiaA zAfxT-g$XPY-0=!NmR?hBxm_qmm|f1rm%1gW(qv^siAX|H@V66GR*y&C?UA(Y`y1x^ zLtK70yn`+0d?D3Pjvnh=(rHagaFeO-Ck=WP&_QSjPxq}&>Nf4;D9#jcEjbrnr%f}ak|q6GK>l~qL|nxpV@(@g z(L&0~DRggHBl2~F^=ls(%{D}t6Ytd-sVr+bf+_(U6SLwb=Y;V{BAAL1dlr-# zH^b}IzOz9_FDN_-snn>)Bbsy^1;>Df=cO2>-9zKeo}5}uVAaR6a|835mNS5WAs7Zx zj_ac!IOYXF+H}I>>}&ldZ5$lih1g!dkL&jt^0Tu3Ay3SX%P7N)6CBx(Tguh2OUfgp zyr0|p|3H{9MEpDqb4E%m)@K4!Req^V??ASSA!Nu<7BGtbfJII9p9Z^x4o#0&b&k8L z$Ja7(iziqjh#=U^q1w)}yAuw?3VvR<5yAJsHhA5>fN+tPO z0hV_#qbIx%BQ;hZVkP9-kxoLdjTb2ao!brEZbdSNDW12&2sTMvQLAKa8SlzjS&5dx zZz428^ZVGAmINrx;iFbz+D_$=7ulms5Sx6lW{}0&y~(22(Nju@48UT%;(7;;iXj8bJ#)OP0DHul>RwD$BuOs1qn~i*UC?=|v|pOZ&OMdyBQ~}3WbWKZ@%GxHzDv6J zofatC^y%waO?i3ypFgkbG*0L53YAM(K%kLit7b8~3O{uP82A%Z89UR%kx~VCckQcTRvKx|WZ(v|XIVt9=TsBizE}y=- zJMQx4VJ$y5;-w=;LvqgtCO*l>@%2@a>o*#o-o@E0ci23r;tL#W`kIfY{2cqLi@MnP zlTqU^?B}+ZPYX_}o3!$!ZNZE$-BLQ{OZJ&{Eo~-^mjW6#fJMk5D^2fFHRXwl#G0tD zt@jga}C?I8@=V;RE^zeY0*E zSoYGJIu~t*oQVyD5hV}GFLGpXe zq5BVE)(;E6xHzkg7Z&;$Ru2`fO3X#H*yK7|h=VzU)P0;fi(xAJ&tHH^^2hN&0P3orm z)+QA7*BY4xn(jRKV7wkZeS~jE@vCC(mLGeLeA_Iz75k(Fmr@1kw1*qaLgL_icxMWX z%Z6{$=EhYA2Sy%}WOY>BN4iBPKlJP}!mGm}8Q0vCye~e3@3q?}!CwRVZY~3{Z8I7; z`{X0K^kMRIRTDptw^7d&XoelB9T}yRYu{XUeX}U~g4qFKRG8`{rRww40I?^!&DHbX z6;&KfO&?rmV(R#6)H7^s(BFQ%T5@#>C5>8EURk-Oj|zXqIQP(~rPY>9m<)T92K?}) zTiM(H8|RZAst*o||E0Ul1BuXOsK&;g->t;zM(R$=@83R|gg-%`A3yRMF09injH_Ec zcJq1WM0-HWC6?T;d$$>{=dpAtA1Cfi?DVKYVUi2?XLsGZSeO|`7@)EJ!;ZRTD~$zr zz9OMAp~QT_<`lO_y!!^xa}O#vhC%we3M>)~IbnCu#L>j%UHK{A@}A>i)eWuF*C>`- zq{bfOv*N}NF%n6JRY?%F9ZasNm6>+o57BOk@`p)*-QK@>m^d?jap6XQC5~cs*feju zVs1kD;-H~l#i?tq(irj3h_*~cY1{E59o`-C8WzG`xmEH&z#xVEsICAjpGB-U{q(sq6L3*X z8RU!n>&AM@KF=trT~0<;NAO*#v;}YJ@YD*EQ!X&&0sr)mk}Tl%TY9rpp1I#BOYQ={ zt5$$>W|k_m+3B`>TJAU)j1N&{~vZ@<8 z?A&V(+U%FaE*>{ot?o|0k>hCA+~<{XA1v({BUQZb_TliL&Yi`<;900j*CxsO;;GI( z56M$gU%r2e1xA~&#`d|b3+zy*!?<){_+p30;gh~@mj)i@vz_zyOwctZe zZpq$kUE!SG-%x}KuJ!#*+sYKD1z9~Pj^N+S&lk=7VYBiTi-guVTUz>jk?n&b5QtO1 zv35BY$!#j?>&SxKyhQ*uefBrB-?Ed48FwY9+&lB&*6UzX=1$(NoSd#`5C&~aJlk(wmQ&Ub&9XV@ z$$&2V11@X)t!5WCs9kYKH0^eByw2flllmNutEQI&s;IaMbG;J(sSv#+kYQGN48z^7X=7uFYx(*BM>lYG2i^}CgxlldJO=}3|2yz>R=5G4 z#KC`NZ`!mg&c^ce#eaPWrBKxMBAJrx*c`{4qQYyrXufZJMZZx^@5q!E+O&PbN?Hpr z>Kry_@?2BBDOILWqDP3E^KiF(X@g0#*Rhy<5-3#feSe8E_T+59o>_g4UCFvqhU=T> z2W7m{PQCc~I3~Ts=pF0#d_we4dzyJG^IzB#->aa~_Bjo1 z2=UjE&AILqoS|Z*5&*j{x9&}*e6AKN_CfAS;_o+#e)sy#V<Cy-$mOTUKDSMt=KMrXu9n@Hp4h+;_Q~{q>6f35F^hL(sbm@{?WDk>JN-@ca#Ra zslnvJ4a}g9uf3A3iq6Gteth!@Iigtb*oHD*sw5FdT+ny=$%wX0D|CmcWmH7a4|~>> zm8#0lK;4&&h9rqvmR9PNjRQo>0mi@oN?4zt>qHdQ3f}X&z^m__wltHde0D_?;#tQ{ zN-nL9g2Rt@bR3H+BY&JL{f8Rm4PVJy<>be^^h7w;FMwMg6graNFWEA^?#(4fc4HFB zJh?;^LPDoVN?4HJ>{Ef0b$7qb{wih$ZGa^NovH-o};L5?Mnmt}y3I$Zcv>oPuU^d)SJWUW>(cNFQRub#Zx zVrGe1bgAb9t<9gL$&rs!ViYn@;h8B~?k#WC#qrTcVVaBMp>-9`MKcMLGUB$Q_P}(K zpdY8k;&IJwX=jnHxeuN*adAiMm-30>C@19=^t7iMwmusc*50kKLZ5gDI$keaMz{%h zq(S24wn(Ca!NzF)F~!|QY=(_&w3URV?(h}3Q6An4Lzlu&i|a$Y=u@2o<&DVVm&g z3u@R?JTOV8P3T9+rtR@huk~n#~k(bN8!-kJiff3qFsLl#{HOb`U zg2{3xgE#O}okxG#VE$=AmLsh`iW$74`n_rK&P#BBgT0p_WR6dI*HYK72wGDd8#CkP z$qgbfdHbjZJ&L;>B%(nRMLlOlZC^u;ukNZ^Ig3$>c!~!fU7*uonhQ^{lyL?+)&eHn zj~^B!g96Z-hbNjQCo885jlq~s-vX*)Jbn7WX-$`|G zYIJ41dbx<{une6y8wMd5QMA4@h=Cu0KeIu+^bFxw%GG7gwl{GN-XPJM+#p}pA30*j z`bawz_g(AS-cSZ~FeLeYM26^^f@q<~3<0pO7c*ZDxQY047UAC~di&l!13>oaa_h{ORprz~` z2hc|95$5k@$B=7rAPnzn7xnXqNT5ACg2?+k_qB=MFwc{o3{@n5{_?n?dNeK6Mzo;4 z9HTz@QkN6w>=yHFs%kG9oceYdQ`yqhKT*K6LcNd)-Gdg&G9o69in?JmN))Jio`m#o zqD4I^0@}8S`1tiqvN%TB3t&pA0n6$O?GGbY=kpmJ07pG=LJ0rVxB}y`#F(r_pT=cm zO$c*+1go)}hUdc%%~Xm(;&^M081A-8rjKt=HdY@)h!+lYf^e4s{S{BTw0fCH4lhQL zTZnGjbmCY5 z)WBFfm^hZP34ctS6H0IB!15W`hoz;kSNs_ylTTjzN!$jaYXBhS>1X{DTw|_&h3FkO z=*0{TEd-IRrm!pF7`63C3?MEX6#k-xBl z?$hO^gQ)ZmHD)B}i@YOGV%<6}N2f)5MsSJAz%n5db!_EudkSg{hjRc@V5!s^APTP7Be zy_LfA*xJoH4GSaZ>G?P-jhTzY`+3GXWdU-7Y}NXeYI0+6Zmh76<3|Y$hTjCH5{ayB zUg#8Ui12~r^5uO_Zd&%>`*mR3cI$TfOw01+E!oWUwDTM6zXOGCJIong{O@>wjC=9# z&gWNWdeHNbdi`w{=ii5-r~sD(YPWUGY^_RmgO< zq?zCiigtbsGktLrJ_B1cN&@xmgAE&Yda8KrIjSgAh{@f?z&kC=zp$gK2OCyB3z}wj zH(>RT5-}qI6BoiH!tQ5bGrXRE-pfwgyavi~jn8P~{QMU3Z@~mTG=SVDm(cByGtn|# z$HJljNy?7nYUitNW}WG|Hy{6Edg_FKTyZ(Kzi@qa-Zo}{(SSz*1i~`5Y#%1PKPrgG z4K(}Gy19fov;HHO#3G@;VEIJw{X@o|B2ROh z@Cen8lqCp7kBWL;q4BtRneZ^{FBU;zL6m`@%T`$1XvpuGxF)B+TkW6e;T2Qc8N#AF z;S0R9L+x69LW1OG03llo{U7o4TqG_JfH(6xJgJWyr5PS?`q?m=(eRllPAVlOnhE|f zt&5r>+b%skQ^ETmLOyCDrTjbl z&DX9s7ksH0nc&xi(l-lUJ-Te+&Wiu`{=!(bOFJ;np7@DAz1QGJ!Xr5h>EYU$U$KwH z<4gg6cP7;yCN;Z%yonU&ak}`#GnrK>EBp4zwC{gG_zVOEfH3Qp@0eM6&eF068NZU&^lm}b`U$s93@N}D+E&TVi0b~#BzS#-k#I>P)!@O3 z(*cKtXIY?0){v;?nH0JdI2mdy?@%{%ZKQL%J_*MqzwoE@HKW^AOB(*dhC^=jGBPyJ z9qIOBb{5o}91tLQ=XNVw6u~LxN;kGvR0?EN|Dw&4=;ED^`tL{t#>Tpw@EFbqp2_f} zw+F89=y=9AyMlDj^zr4U?j*Zva?Z1QWXJcQarrT%c)JM8ZUUlMmqD0er$XFt)caP8 z02#y+Am?wVpeoyQE38UqMf>vGix-`W0nGb^Qt8d9`+tC?^P`aFg0q;5u&ty-3^?n9 zTl3q*E?>~#jIv2OZ-SaJ!piT#qdkKqb-F|OWv>xw)c_-!XF{~5OVkpZ=;W1p;p$Ez z+MIB4Pkg<*CSy!S8w^<>Vf^ZEO|jcOv9MooMkj z9*%uSxrZ30Jpb)wnqzTMACuwCNZc-3$;5D z29xI`lNB@5<2K)!Nkxml(AO)M7$XI&@?0)#trMBzX2wgk8Owv%ce49^p2TjoGyQTZIgjfQgc@ZOU?)x3m#Zjs8`TQoZq)Y5@nd{^Vc5C|w&?wk^dF=Zk z|IvN9=2nf&D=)06>@se(S53v=%H(Zb+u>T1QnA`3RKCHs<(enuL3JuSLV;7~Raxs@ z!E$)%{N-}R8Lwg3h1C1>FN1@?ciDcq#?eHWy&JM@`p$}rE5=XL> zCTTb%O0$A0F-zy%K{prhDxD1Plft|8JG%8!o%w6uPcYW;U91xKeLxSrv3>RmFDDaG z08ic(XVh4fM&X5rclr4aP4+3p1$g;kq2IdVLN5K@fzukjdsw|adY?^-OH!}fx41R^ z#vLh+i&)8*l)IN;G*-=_Vl+AUgHU|ItZG)+idj)ls|)@@eS+Q9v3&X*SDd7c%;kdI z*#7K5-XNbqd?Q0MQ_SSm$K%OwYMSjs%|&)Ihih|(NdisXqBGFD^udI=S+X3+tTgy3~w}jMoWw#QQ(o|xxo8=e9BY=nL1c( zz@8AZNZQVaAAVYo{gz1g3-xj{(}YS}y8D4#Wquv`@0-(R=7^#TZz+#U5Jq0OGmq|zo_J-`Bq^(HuklTOKO2GHiXS7Z2f!hVv|jhSz`~o_UpcH{ybxnt6>7%dM3wI z5WvG^83MEp3L$|I&WtOjx7)KOHa5E)>=Od>oX?ixjb^XxZ1KXy3vCm2{ADkj?V63{ zyJX zLCfdcor2Z-d?SL>XH#>6GUhmY3`B;|I4xPJu7%$n46qU19eon?0$j`KjIocbNnVyw zWmm(kzBggq)^r#(QrYr)!U8^w^;z=%v-`Da1c0-Q7$$_Y;C~}SGg%-Dykv)9y<~mjjz8v{-&dXb=7D>=ZRPN zpkAq;{~C?QZhY(|Y4DiQvLxfr4xifc93&CkLS?jreSX#EgG0u2*`DO1aySWwX-EB# zP_tvcf+|1*A1G2BKW4B59`Xk7=gsL5)SyQ))xw6bwFFwrD zoRe*FmN(jHMrm?}^SX&4pwFdQvUsM*V4YQQ$_g%_Y#)w-A^qy1Nw!yklFYPS4j6-W zLuX~VxGU){;Cpk*F*Px1@|Gw#B)k*ZFQwBPvEAR|7{eESviqnC)Otxnoi;2KARaCU zHZ=dlIknUk8#l$~r3kJuIeW#S@s{Us)`F6kOyJ^K=)X4!OLUk@cZP-2^$C%r7YB2S zf*?yv{xh=C>5UZ6X2Uj{>_U_L#~=4I)9q!N-C|* z!O^j8C%)%|5Bi95{$H^-Nte2;KX+VSs>OY!Z^JTbY1gS^RX@bFZh1T?2ju*d^~{fRsFWTEV1W-Ri@4#7w3F& zxX`r(n&N2KpRI;TlgJ5gWompw;zG?a!0%DgZWrIOy0n+c(4uXw?|l_r`HrGd^WH_< z(e18vsSz_W(37}RfJxvm(uf7~+_(X|fH|8Ng&k1P%Z-{#Ll68Ru~EXzoLvNJO|4r# zaab_JE1=IGZbfzgle-m7)as%>{`tD(hH7kPj+ zDTdh`#z^&_W4(}-23Bx$|0}^XfqzrVC^3`Bj@u#YF}5L8LP%oK$_5zxoE1W`9Zems3-C zcb-Aojbu@A2MB<_DYpw0n$~rl`lhWc*l$Gik-69~Dt8+MG&WAgh&_a@)j_kTH}x{0 zNoYXFAr5`%D&3C@l2&nPd1urI@^A=SNn46u=>E^fkcH@coaYwJsBDmK>G4S4oD7gU z{Z8_JbS94Z*b1W`Io*JYg=l?1J@yj`+&RgSgK77Yypwk~6yI#-h>Z^9sVyM(;g}+HhH5Pc)|so*vv15Vxg;xXm}v znVGcqV!j<6`b|S3$!3x`&%*}6>#B?V=K7NVv_ub%$0b2=t{84LpUiJbH{TvAM52A? zJcM5V9vjQ`Q0a%VaxK!Cs_|YD+Ox~*(*MzwzVF+raqeCOxp)EC+B$yd{QP9xiSiFK z@-e(7riH)UokEea61zr~be3(nKPv#g-|i!jR|yMnP2yy0>`gfo&7`{++^MO3NMha`k-Yx9wl7 z-HR;W&flh2`h8$uK!`mgB=f3Ey?OYi8I#r~c*{Qh_Q%C?oYPMdqh=suqU?tWC~`h& zSdMXC-OP~n;Kc=#X-SU{6a^jA`LHAh9=ZDcIfRjY$!G3m1O1%Z0RWFY&yc}=>)D0% zR}f5Dr)uZ7VR`_c6!BVO;BLeQo`;()I!8`HZ_f^@9Vm0u7Kt)2K+@!ONSNTn!|PmT zFtOzNXWLL;uI|a^oclNBxs${h;kIaQ?e7sJL^%EA<|d3O%}E}t;3fXJRD&|XDAWHX z;=|&ExRnv_g3i)tIyDX}H4TO@fEe*(dU3*VrfU}y5s`D{t{qlryryKp2fXZJvfHCH zOF&~7bxbfz{)9qM$mZS$*zEb0{9Y=+)fqy)m%u>rjyL^dvh4w5-pZ!_^1VqwA%kix zYsD?$EsOp6TbXIAVxGGzi4ZJ6A^k1sC6tj`kRE4Wmc4Ryb;T^Jur3+KVX1#*3%sX?=9GF{ox_kzO`Ned%ORiK7H6U{S~yeKlN ztQgkJPJ#RLG-`J>5zdacmcN0@=np=bPect$tyF9?fy$`A}g$!!eJ?S>t9gUH~!q;$KM_gj) z)t*m@e>2x{pB@T8S5~`o&*)s>;Z7(uaLCnDj1cUS*1-`<&Jby2;#s+j$DVD3eYrH< zy$+65oT&&D-iGd0l8em#DATA-b~E`S$`Sn}Rm0J>7D-iyYT8WvVGC;ERwkTvX+W@b zP)bkMt6k6Dqmpc%N9>SW$Zu~ox3<-~W41xyy_WRgFu`npS+8NqF7@DGYQyD`emQ+w zSeY5vG;xQ|27hS_ z4izgYsW$89`cZ|_eBq(%GKQXCU#~&kd-kDZX$f-=xEE1@gH@1LJbm9+7B?dF!&3If zba_>5sY_p+53Q-P7Yf)ERXxBzj_(PLDGM{kNG&RL*KBWp3$Uu54ZnK!etPU>rKN`( zrdEq;*6Zyd8ZWBKhO`0aHQCOd*PlKhK>@n$k;aM9E=b>RP@ zhYm9&k0e_&Huj81=FXVACAg{Z-4L6XS*HI!d}sZmYe^&{gZuSU=rQL7!@4>+Z#(1H z>8rlVDj&d{t$X%L;^Mu@iWmUIm|%x@R4?jUpQ6`U=p!w8SyT10Bs+mDb+i|3e?lmf zc@X?D;~!iDNP)|GSS!~tqh+{F-0_18zQg;+T~Bf-i`9L$Cv*S}w3GESLFO-T!<;bp zS$4H@g81`vQ|qmM8_%IfLqq+?0rj>^*mKeJ$p@Y%3sL^mlKqE`#C$%9bzekA>vFl;!?q%;ID{>Sd)#|*zbid`h#p#{*jR8<9$I` z(m2n3A@Im8VnbN)$xu8Oz1ex85kJfSvr0|)bp_JO&F|=WD==(M2Nj{J6|FU9Xv3@7 zcWfZ$MU~LMeN=9hAOlF%BS~_d7tlN|ZgdbKfAHPMKPQ$ff9?O<8;C0RuckY2+I#{< zy&!D%uq}MTmvX|F)=(t$l0v|Y4>1PCmo~bezKmkf-T!FdKXc-$x&G5V2=X$p=lEMp zeIhISf7xd6|F{1rikymnrTI60|Mz~!{+;cNOT)bOsC2U*`T>j8J4@chG8Q<2lkkID6P~PSzSMD)sv`WYTx+eCx zT7+I(_|`ita4)(ej50D;wwbW}N7+K38VKy&T0J2eCM&z=AyJ7u2vEnQC&||k2UYuD zHs$a^CA~J=(uy05Pla9Y`wMp!54IblFMe;QM1|yOsP&h-waBoiUuL5c*)vfFM4Fmr z;5mHeQhc24eB^L6>v8bvk8mkl%d26zcoZ}H*CH9!e)s00#R*#BG$g!3n$dZ+RrD4T z;xOPi`}hUQiv@LwW}kW~DWBVZ6DjXskICeM5Gc$yZD5XrG2H(05JsFR0Fj#72i32a z75DN0Q18~eybn|V+LnF-j@~9aA{1_SyGHl6HK#^BdjiMZ{@wF4Yx=W>MOT0VVi=?z z2TyFiZD}}G8|H6d>p5vr^l$E*VVJ)l7E`2m!N;9BLla~y1ef1U%I>y}k;joL>0%(x zzhd#8AiPqN+4XuyERhv5Y0%_N%Pu>q#DA-4{&9i#G&7La4qiR&Kgh86c9QWts)uZmHPZ2-Atlw=VpZnXUczu_KmI>T8h_@nFQ&d!hIB}1^Ozf+q)NScQ9Ft) zq%f#+`-`{v-E8d<72As@<0k=#$|Sa*jVTLbXrfFv8i%7XWc$xKu11)u!h?k)jY}0%E&a!>$VIQllqvE;=GCj*;bE0 z$>Vm$?+vvMqVyWtH?eCwu(^1gPo{kv6=OgBQBYD1$T^ND9*HA3f9ip^E&2Yc{R;)X z@(C18j6PG$#-G7ay`Pu>ObIj+Y~|Vhux~gH*`W8r3&X{nI#GZ^=KlAFiL_Y#;0J_- zB~{xyT~h9rBmKLQfxEW1irr2vwraS-!*{8RG(vit@!*C7?_f=#jZ%VvhLTb_|uKL3i1o(Uljzd6G(mGu)B0= zb}8K3!K}TXX3+*7vOANU`_P8<(C}N4cBsDsxGk43=zAnY3qH- zSGyMHE$S14tYDtu7^?o;qt7KxSBsusxFhUp{gfEKcs?jxOLi<4ok_!iYIUmT=&sP0+8!~^)h4ouN{O^ z?1i>ZXNa%CSWGL|GGO?~Pym<5Ftm$l1zOCsa(aP&*@GlG;MyzQiGjB?Ork!s;(gF{ zVjy>S7A~?MRGkclG)Of-N9`$>$)`(Yyhjp z;Q=oXMovbb`Ng;i%j-|{94=Tuk9h8r3tJM1w^CdW*xATRx2qPSukLfV(F^1w+Po4& zGXzJg0C^|f8)d}j$9H+YC5{R?_Hwf2@y(|*LWZNuf+EDrO)#|O?j2L-dxrEd_~|~~ zGpBU)3&CaQn5a%}4R4ZVYgW-6a$~uNbZ0$|>*l=eBlJ1(>1W~XsuBLB6%;?WmLK6mJ_-ikVBMVu53Bc>5hRt`03?5NANrY_~AOI zL!|P_RN1QWEF`5!Pomqt*An;Walvw(+J_^v-Z0D&L2W`0^&0Cvxj08}low=LD&dtj z%?fVJYc-LU3ST>&*>}CXU$-^mA?Uj98NojujmfCI3rC6F4q#u}HJl378H?phvJ%5^ zM_3G854ZBbCheIg)=x6!dwOC@_sWj25k!ENMjVkTkFM|>4y}wvQ9s-};j}fZ>T_xF zL=*|uE?$NB#^K9v#|_<))Z;uID=EQV$W(6N!R6^_CT~FD3|sFKV=_m62VZd8;7=#U z<3fYpBHycn*HyI>>3R;;ISoyrPBoVk+;*A<)#g<>Ty6|v325LUD(%JrYG+9 z7w~jd%=9v6lx!q;YJ*CKJiyQ^l0N^+yS4@XrhR{hsh(}ygG`01T@9V8t6nCZ*P!)8 z7qJ%#vM?ZJGuvof7{GJ& zVAS`p+o&F)5%pgns&1F9w>UVGs6a^iu=vG9d0>3YE$ju~>l28$Q}IdH+D7FhsEJlU z##nvcC+$}Q_!WmY#%$Wcoq`j2x)7(>7qWL|X5^*52yDkd9_SymCmqtl1G&C{QFm+- z6J6a$nNB-d)e@cB%_nrEze8+ob9^&2KNJ&1*yj~XzL8(Y%zIS6U&NZ~7QF6y?#o=* z%oWQ6wp+S$C4sTYwWv({jJy>Sy;7MK;*sCaL947Imq93wv9%r{QFze6XxU93a}!sSg#pYBPny=q*X>rXmtv<&Z-VOnJ;GNq}LWqIA15R=J?cL-u88?*7f43UE@2L|% z&|TH7u1sdH*yZ=VluQq&!Bah9I_vmrw5+a7nEB(2Lx&~tciZD3*@QtSRwjL!F|rvz z?QMMbjIUc-c!SAWI;TR4np04r>lZpcGozB6oPMf#Z*bzzi@b*nNO9@VReyccAjyw{x*{C5G zP}gLWoxJiDLj9H&#~C~)Vl`Ge*V5fB>qGTo&uusjII2yXqV;)H%@K7@C2eNurC z$tA*%y z&_pYA_I9FlHQ#3jZvXuN(MX)lWOQ4fm~|euz{m#lg2iq+r{i&lb@paw0uDU%3AC*@ zoVHP3yVMoGEwnZzhIpzhXQb7pmHHfi1}qZ>fE=WoTwkc1yPtL1jrxvS|9m!y_|&~; zchQbaICASN1%b>>apsyC@02C{!}nQ@NHS9osz{l2Tvxm5i%|g0k#7l}!r=8jl~SGK zqzN&pA0&Abh=M;Iq?2*wB}@eU9F(%Wn*y<56Wpl`8rVCZL=h`M@H1`%`_}9Z+KPf; zD356C?fcBA^~Q&Jp7ca^?*{h52^IvLuJ-BKUi_=ZgyG%QMEucEj*Eiq*Ja>Dksn6v zaxtScHuHoYc4WswsVgHYLdG3S4%eRY0v0%8Nv1Csbt>)#5F-EpChqR_8ZaB?1IezZ zY5IgGS4K{4#z^-ES>2{fv=HHkkfBIV>5*=!5>_0F)%W{CJfkN&cuQtnx}X|^L*D|N znBbO4K5K?spQ2&3#D+@;XO2Kyi>+Ptl^0*hfkaQDJ^LiuS$CY%jamm+EA+iI+U;0x zpHq87bb=&!_0G{v0fZl%XDtcPmwl-;l*0sx9cc6Q?1C_T?STV>8T9Q`XVc5_MT|+F zh}H1K&Yl=5LVKE$a(qsUyTzo{JAXMt!R1O}=q? zySRDjpVElB2IL4NJ1A*-%3x}XlKb*7`u1fTL7m8(r=&Ydk(13JlDMnE{*6b&CEC(HA7po9N{l8ck$^0b z`E##rS(_^fXP_nvYiv&XqrQ6`nbT!lvv+bN!s|0Q&Av)bF;i8F^kQzmLyXE%a0-ui z&oby|qn?i9x!nTc^lqc3*P&Y?h;b1X64R8<%1ldBbEO8b(EQ8dtWa8f4;xk~<`nVU75a>s^Bi zbKlr8_j6lam?>Gqg8P!yRE`3qu{Gzghmq81)|n$#17idP9_O)7u{x9-M)|E8`vNl% z(#x9yi=QZxzAgQ885TT2eLAC5`JUv)Z%#uf-}s}^bJ~pZ3)_9{2l7yvFgYy$eDQd} zpyj3`p#|oNFvKHo?a4fUr@#w$>a!zzB z2hM@3$dZNbam&pE4hgRZUT0KvS*_g6!xvY*mvc1 zl`vXl9sdqJ^_BO0%vYdwCT`gK^L4aDUhl4kM_Y|x^h7Z5`jLxlQ+O!lqeoltGCmpg zda%MrY9F0t_fPe=RYlIEdP=$88VSAZ%y%SgWf{Zs!KEdDBZAHJ%*h$J%MOCx^WgQ0 zIG}`Hmr6TIk+WClsg@ObrJUVsi9Hftr2Sky+e!Zs9C_=$g4n0%VQ^;)k{lzekZQY^ zNa~p8cX~f;8!^*x&B74fGCAR5BHO^?_pv;b(Mac;XZHx8Pk;nV3W&ZUKp1d&*Ahxo zbzdj+V!0!`8{+np*xBWJT>tmPa{?Kl+nrwRvQ!g#1xSwqI6sL5<2i?(uKU`xWwX=T z&vap~uj@2A?K)m0gH7Cf174eGB-TM89KSedeLl}za9g%T!Sdf@JB{*+Nwt%qYTJDs zJIU{8KaAK7r z+IC(|q3t(x)SSot8alro-EsOBU%w>{aZ(m&ZY7nINa$lD5w;K8Ke|;q5J?{q0p1x|J)>ylH#bm*h0GoK2(0PwmW{J zYp_h%3Y%t&Fm0AY_eew(pUy168qg1Ax#A0!3GciK2_>>Xhanyp4_pmVSMBOVR5(jw zI4sgA2%12{_6;bu2aa2|TiabQ(dL^SAI`U6(&lZCKB0aHE5Jn z9oc0q0UHS|C7|U_2t0YP@-wj!&AZhv#NRgn?S|!)vO{%_O!YiY4O`29Ki9t4ik_-~ z@8RSt*5k~T$%y*8{a|w*-zQlXi~pVd%d}4YTXUfLWa=le{;#GK74`qM8Y1QYn&kig zU)$9Ch{nmy?Qk&5s;;4dphfmK4>p#_j*^a{X4UKT8)pg$LeHl32W3k}vRTb@h>D3J zXr)�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%0DsO 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 diff --git a/islandora_riprap.module b/islandora_riprap.module index ef46600..547b4d7 100644 --- a/islandora_riprap.module +++ b/islandora_riprap.module @@ -6,7 +6,7 @@ function islandora_riprap_theme($existing, $type, $theme, $path) { return [ 'islandora_riprap_report' => [ - 'variables' => ['hello_world' => null], + 'variables' => ['report' => null], ], ]; } diff --git a/src/Controller/IslandoraRiprapController.php b/src/Controller/IslandoraRiprapController.php index 0fcad24..df097fb 100644 --- a/src/Controller/IslandoraRiprapController.php +++ b/src/Controller/IslandoraRiprapController.php @@ -26,7 +26,7 @@ public function main(NodeInterface $node = NULL) { $output = $this->getRiprapEvents($nid); return [ '#theme' => 'islandora_riprap_report', - '#hello_world' => $output, + '#report' => $output, ]; } @@ -34,78 +34,129 @@ public function main(NodeInterface $node = NULL) { /** * Get various representations of the object. */ - private function getRiprapEvents($nid) { - try { - $container = \Drupal::getContainer(); - $jwt = $container->get('jwt.authentication.jwt'); - $auth = 'Bearer ' . $jwt->generateToken(); - $client = \Drupal::httpClient(); - $options = [ - 'auth' => [], - 'headers' => ['Authorization' => $auth], - 'form_params' => [] - ]; - $response = $client->request('GET', 'http://localhost:8000/node/' . $nid . '/media?_format=json', $options); - $code = $response->getStatusCode(); - if ($code == 200) { - $body = $response->getBody()->getContents(); - } - else { - \Drupal::logger('islandora_riprap')->error('HTTP response code: @code', array('@code' => $code)); - } - } - catch (RequestException $e) { - \Drupal::logger('islandora_riprap')->error($e->getMessage()); - } - - /* - -Query curl -v -u admin:islandora http://localhost:8000/node/266/media?_format=json to get list of media. - @todo: How do we authenticate? - -For each media entry, perform the code at https://github.com/mjordan/islandora_riprap/issues/2. - This will get URLs for each media file. - -If necessary, convert each media file URL into its Fedora equivalent using Gemini. This will only be - necessary if Islandora is using Fedora (perhaps an admin option, or an autodetect if one is available). - The Riprap output will look like the same data below. - -For each media use (Preservation master, etc.), provide a summary of the total number of fixity checks, - plus number of success and failures. - */ - - $sample_riprap_output = '[{"event_uuid":"cdecb9ac-5938-4992-b5b7-8ef9e4e94c62","resource_id":"http:\/\/localhost:8000\/mockrepository\/rest\/11","event_type":"fix","timestamp":"2018-10-20T07:35:04-0800","digest_algorithm":"SHA-1","digest_value":"339e2ebc99d2a81e7786a466b5cbb9f8b3b81377","event_detail":"","event_outcome":"suc","event_outcome_detail_note":"Fedora says hi."},{"event_uuid":"f26ed6cc-e6e2-4ebe-9607-5ad7a2e4b857","resource_id":"http:\/\/localhost:8000\/mockrepository\/rest\/11","event_type":"fix","timestamp":"2018-10-29T07:35:04-0800","digest_algorithm":"SHA-1","digest_value":"339e2ebc99d2a81e7786a466b5cbb9f8b3b81377","event_detail":"","event_outcome":"suc","event_outcome_detail_note":"Fedora says hi."},{"event_uuid":"af60c8d5-7504-4be0-a355-06177855b8b8","resource_id":"http:\/\/localhost:8000\/mockrepository\/rest\/11","event_type":"ing","timestamp":"2018-11-20T07:35:04-0800","digest_algorithm":"SHA-1","digest_value":"339e2ebc99d2a81e7786a466b5cbb9f8b3b81377","event_detail":"","event_outcome":"fail","event_outcome_detail_note":""}]'; - $riprap_output_as_array = json_decode($sample_riprap_output, true); - $successful_events = 0; - $failed_events = 0; - foreach ($riprap_output_as_array as $event) { - if ($event['event_outcome'] == 'suc') { - $successful_events++; - } - if ($event['event_outcome'] == 'fail') { - $failed_events++; - } - } - - $output = "Report from sample Riprap data (3 events): $successful_events successful events, $failed_events failed events."; - return $output; - } + private function getRiprapEvents($nid) { + // Query http://localhost:8000/node/[nid]/media?_format=json to get list of media. + try { + $container = \Drupal::getContainer(); + $jwt = $container->get('jwt.authentication.jwt'); + $auth = 'Bearer ' . $jwt->generateToken(); + $client = \Drupal::httpClient(); + $options = [ + 'auth' => [], + 'headers' => ['Authorization' => $auth], + 'form_params' => [] + ]; + $response = $client->request('GET', 'http://localhost:8000/node/' . $nid . '/media?_format=json', $options); + $code = $response->getStatusCode(); + if ($code == 200) { + $body = $response->getBody()->getContents(); + } + else { + \Drupal::logger('islandora_riprap')->error('HTTP response code: @code', array('@code' => $code)); + } + } + catch (RequestException $e) { + \Drupal::logger('islandora_riprap')->error($e->getMessage()); + return "Sorry, there has been an error, please refer to the system log"; + } - /** - * Only show tab on nodes with the 'islandora_object' content type. - */ - public function islandoraContentTypeOnly(NodeInterface $node = NULL) { - return ($node->getType() == 'islandora_object') ? AccessResult::allowed() : AccessResult::forbidden(); - } + // Get the URLs for each media associated with the current node. + $media_urls = $this->getMediaUrls($body); + if (count($media_urls) == 0) { + return "This node has no media associated with it."; + } - /** - * Convert from term ID to term name. - * - * @param int $tid - * The term ID. - * - * @return string - * The term name. + $output = $media_urls; + + /* + -If necessary, convert each media file URL into its Fedora equivalent using Gemini. This will only be + necessary if Islandora is using Fedora (perhaps an admin option, or an autodetect if one is available). + The Riprap output will look like the same data below. + -For each media use (Preservation master, etc.), provide a summary of the total number of fixity checks, + plus number of success and failures. */ - public function tidToName($tid) { - $term = \Drupal::entityTypeManager()->getStorage('taxonomy_term')->load($tid); - return $term->getName(); - } + +/* + $sample_riprap_output = '[{"event_uuid":"cdecb9ac-5938-4992-b5b7-8ef9e4e94c62","resource_id":"http:\/\/localhost:8000\/mockrepository\/rest\/11","event_type":"fix","timestamp":"2018-10-20T07:35:04-0800","digest_algorithm":"SHA-1","digest_value":"339e2ebc99d2a81e7786a466b5cbb9f8b3b81377","event_detail":"","event_outcome":"suc","event_outcome_detail_note":"Fedora says hi."},{"event_uuid":"f26ed6cc-e6e2-4ebe-9607-5ad7a2e4b857","resource_id":"http:\/\/localhost:8000\/mockrepository\/rest\/11","event_type":"fix","timestamp":"2018-10-29T07:35:04-0800","digest_algorithm":"SHA-1","digest_value":"339e2ebc99d2a81e7786a466b5cbb9f8b3b81377","event_detail":"","event_outcome":"suc","event_outcome_detail_note":"Fedora says hi."},{"event_uuid":"af60c8d5-7504-4be0-a355-06177855b8b8","resource_id":"http:\/\/localhost:8000\/mockrepository\/rest\/11","event_type":"ing","timestamp":"2018-11-20T07:35:04-0800","digest_algorithm":"SHA-1","digest_value":"339e2ebc99d2a81e7786a466b5cbb9f8b3b81377","event_detail":"","event_outcome":"fail","event_outcome_detail_note":""}]'; + $riprap_output_as_array = json_decode($sample_riprap_output, true); + $successful_events = 0; + $failed_events = 0; + foreach ($riprap_output_as_array as $event) { + if ($event['event_outcome'] == 'suc') { + $successful_events++; + } + if ($event['event_outcome'] == 'fail') { + $failed_events++; + } + } + + $output = "Report from sample Riprap data (3 events): $successful_events successful events, $failed_events failed events."; +*/ + return $output; + } + + /** + * Only show tab on nodes with the 'islandora_object' content type. + */ + public function islandoraContentTypeOnly(NodeInterface $node = NULL) { + // @todo: 'islandora_object' should be settable as an admin option. + return ($node->getType() == 'islandora_object') ? AccessResult::allowed() : AccessResult::forbidden(); + } + + /** + * Get a list of all media associated with a node, grouped by Media Use tags. + * + * @param string $results + * The JSON results of the call to the http://localhost:8000/node/[nid]/media?_format=json. + * + * @return array + * An associative array with taxonomy term names as keys and media URLs as values. + */ + public function getMediaUrls($results) { + $array = json_decode($results, true); + // @todo: These fields should probably be settable as admin options. + $media_fields = array( + 'field_media_file', + 'field_media_image', + 'field_media_audio_file', + 'field_media_video_file', + ); + + $media_use_groups = array(); + foreach ($array as $media) { + foreach ($media_fields as $media_field) { + if (array_key_exists($media_field, $media)) { + if (!in_array($media['field_media_use'][0]['url'], $media_use_groups)) { + $tag_url = $media['field_media_use'][0]['url']; + } + $media_use_groups[$tag_url][] = $media[$media_field][0]['url']; + } + } + } + + foreach ($media_use_groups as $tid_url => $value) { + $parts = explode('/', $tid_url); + $tid = end($parts); + $name = $this->tidToName($tid); + $media_use_groups[$name] = $media_use_groups[$tid_url]; + unset($media_use_groups[$tid_url]); + } + + return $media_use_groups; + } + + /** + * Convert from term ID to term name. + * + * @param int $tid + * The term ID. + * + * @return string + * The term name. + */ + public function tidToName($tid) { + $term = \Drupal::entityTypeManager()->getStorage('taxonomy_term')->load($tid); + return $term->getName(); + } } diff --git a/templates/islandora-riprap-report.html.twig b/templates/islandora-riprap-report.html.twig index 925ee6e..1e7d927 100644 --- a/templates/islandora-riprap-report.html.twig +++ b/templates/islandora-riprap-report.html.twig @@ -1,4 +1,11 @@

- {{ hello_world }} + {% for media_name, urls in report %} +

{{ media_name }}

+
    + {% for media_url in urls %} +
  • {{ media_url }}
  • + {% endfor %} +
+ {% endfor %}