From 5d34917d4978d9acc61fdfea8afad8615e6435fc Mon Sep 17 00:00:00 2001 From: kohgylw Date: Sun, 24 Dec 2023 18:05:44 +0800 Subject: [PATCH] =?UTF-8?q?update=20to=20v1.2.0=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E2=80=9C=E8=B6=85=E7=BA=A7=E6=9D=83=E9=99=90=E2=80=9D=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TODO.txt | 2 +- .../kiftd/server/util/ConfigureReader.java | 42 ++++++++++++++++-- .../maven/kohgylw/kiftd/pom.properties | 2 +- .../kiftd/server/util/ConfigureReader.class | Bin 37908 -> 38134 bytes 4 files changed, 40 insertions(+), 6 deletions(-) diff --git a/TODO.txt b/TODO.txt index d59b572..7862dcf 100644 --- a/TODO.txt +++ b/TODO.txt @@ -204,7 +204,7 @@ test.auth.xxx=ucd 计划中 v1.2.0 -------------- 【已完成】将文件体积的单位精确到Byte,以便用户能够更加精准地获取文件体积。 -【待实现】在账户配置中新增“超级管理员”身份设置:具备该身份的账户将无视权限和分组设定,可执行一切操作并可访问任何文件夹(包括“仅创建者”文件夹)。 +【已完成】在账户配置中新增“超级权限”设置:具备该权限的账户将无视权限和分组设定,可执行一切操作并可访问任何文件夹(包括“仅创建者”文件夹)。 注:该功能旨在方便系统管理员更为方便快捷的对整个系统进行全权管理。 【待实现】新增扩展存储区导出功能:当用户删除某一扩展存储区时,可以选择将该存储区内的文件全部导出至指定位置,便于对其进行归档。 【待实现】完善移动“m”权限的安全性:当仅有“m”权限时,用户可执行“复制”操作;若同时具备删除“d”权限,才可以进行“剪切”操作。 diff --git a/src/main/java/kohgylw/kiftd/server/util/ConfigureReader.java b/src/main/java/kohgylw/kiftd/server/util/ConfigureReader.java index eb19bea..f3dff12 100644 --- a/src/main/java/kohgylw/kiftd/server/util/ConfigureReader.java +++ b/src/main/java/kohgylw/kiftd/server/util/ConfigureReader.java @@ -195,6 +195,9 @@ public class ConfigureReader { * @return boolean 是否具备该操作的权限,若具备返回true,否则返回false */ public boolean authorized(final String account, final AccountAuth auth, List folders) { + if (hasSuperAuth(account)) { + return true;// 对于具备超级权限的账户,判定其在任何文件夹内具备任何权限 + } if (account != null && account.length() > 0) { final StringBuffer auths = new StringBuffer(); for (String id : folders) { @@ -1019,12 +1022,17 @@ public class ConfigureReader { if (f == null) { return false;// 访问不存在的文件夹肯定是没权限 } + if (hasSuperAuth(account)) { + return true;// 如果账户具备超级权限,则可无视访问级别对任意文件夹进行访问 + } + // 否则,根据文件夹访问级别判定该账户是否具备访问权限 int cl = f.getFolderConstraint(); if (cl == 0) { - return true; + return true;// 若是“公开的”(0)文件夹,任何账户均可访问 } else { if (account != null) { if (cl == 1) { + // 若是“仅小组”(1)文件夹,只允许创建者和同组账户访问 if (f.getFolderCreator().equals(account)) { return true; } @@ -1046,12 +1054,13 @@ public class ConfigureReader { } } if (cl == 2) { + // 若是“仅创建者”(2)文件夹,只允许创建者访问 if (f.getFolderCreator().equals(account)) { return true; } } } - return false; + return false;// 除了“公开的”文件夹外,匿名账户均无法访问 } } @@ -1575,15 +1584,40 @@ public class ConfigureReader { public boolean isEnableWebDAV() { return enableWebDAV; } - + /** * *

获取删除留档路径

- *

该方法返回删除留档路径(绝对路径),用以将删除的文件归档至该文件夹内。

+ *

+ * 该方法返回删除留档路径(绝对路径),用以将删除的文件归档至该文件夹内。 + *

+ * * @author 青阳龙野(kohgylw) * @return java.lang.String 归档文件夹的绝对路径。如果未启用此功能则返回null */ public String getRecycleBinPath() { return recycleBinPath; } + + /** + * + *

判断某一账户是否具备超级权限

+ *

+ * 该方法用于判断某一账户是否具备超级权限,该权限在账户配置文件中由“{账户名}.privilege=S”指定。 + *

+ * + * @param account 要检查的账户名,例如“admin”。 + * @author 青阳龙野(kohgylw) + * @version 1.0 + * @return boolean 该账户若具备超级权限则返回true,否则返回false。若账户名为null也返回false。 + * + */ + private boolean hasSuperAuth(String account) { + if (account != null) { + if ("S".equals(accountp.getProperty(account + ".privilege"))) { + return true; + } + } + return false; + } } diff --git a/target/classes/META-INF/maven/kohgylw/kiftd/pom.properties b/target/classes/META-INF/maven/kohgylw/kiftd/pom.properties index 65b110b..4faa2e5 100644 --- a/target/classes/META-INF/maven/kohgylw/kiftd/pom.properties +++ b/target/classes/META-INF/maven/kohgylw/kiftd/pom.properties @@ -1,5 +1,5 @@ #Generated by Maven Integration for Eclipse -#Sun Dec 24 12:07:00 CST 2023 +#Sun Dec 24 17:41:48 CST 2023 m2e.projectLocation=/Users/kohgylw/Programs/java_workspace/kiftd m2e.projectName=kiftd groupId=kohgylw diff --git a/target/classes/kohgylw/kiftd/server/util/ConfigureReader.class b/target/classes/kohgylw/kiftd/server/util/ConfigureReader.class index d80364bbb85e5743b9fc7c56e67e2a9acd10f46c..24a8db513781675d1a7ce84076b947e7acef9594 100644 GIT binary patch delta 16430 zcmcJ02Ygh;_wSi|%o-DyVtixw{)M`u^{IKJWAVxZIgJGiOepGbL*u;pZOZ;V=KS z|1c4Cl3zH9tL?GzYH-)+?cL{inz@Ow#THva-!QVK7gZI^on2DdZ*KK;C-bW(JWX3% zLz}|ba<?V~R-8}9VMvkl^;LdWhYuFl#{$#f?%22nZBq_h!p`P|Q@_K}^RZLlIElXtN z1VQ;F3#v_aCnLiiYO=c+g=r*1<^g|MnPy;vMK`g#8OfB?af96KUUr|8ZPb{VC!?dq z?q^p3S4CxUX?anZ$sS*~tEvw3|KBb1o4vTosqFdPAZuWwn{0L;+F8xJ|VkpvN zFEb)HDfX(xUelzQU~Bq-iejL812Yb1l&(IDi&cI5SSl;7F?&b#jZ0wfsR?mO?1Z`| zt_Ay0-5`y2AL-qD%ioaN$D);(EUf|5)oYgUM7nIJLT~<1^w4@k4xwN>Un~ecw z6;&lLm!RlI4ahB-S5jtj6U>hqkX5E@Pzk_8D=Mo&IuBESdgECm72D)$7Nc%&($*2r zn>e{w9d44*w5c|Ru+pl$xmDG<71K(~-OSAsES|`dl+n}|70+8(Y%jY4LguY3`i-|% z!*R^sOIJjLRv8evRnRll;biunU<$k1R%lcz%`g(kJt zeX}f{t@}1Atr{}Br2H}n8{JFGP2L_78ZtB|U-#;0@lNb(ST`5~eK1Mh#i9|n!X5za zX7TRqzmN)`qhNR!*nPUWr^Q_$8KvG9??a!%sLYD_k(aRE69TJmy{Q0x#=t) z0Ds{FRqtl4k}tFP<@5>UTUj!zVqVG6$_hAb^+Jtnki|Y?A3OPAMs3wIO`52LM5~9J zU&-?`M+Sj7&+*wf(oWB3pCX!^uaeZ<-~97tqIA z;-f7-h8HSNLN_)}CbnYJ)v&~THbdQ?ID?g`u%w(0<$Si2SHS3O zoMjMy_Mr0Wl4&KC7N0{Of|S`sl~pBZ6GU}&Ca+e@lk(X-^;XgqY=LUhyqqmktD6sJ zi`9qC{p=bwzQs7#Qj1zs8stS zz{fXQ{60dMGNzQ36jef8v`NeC0gFG#y1|C4V8hUuZhOe$4|9YP6Kz2e%anrDQ5wyo z7JrOQ$K*xD#cn#rw^;m%pj8hntt^>>K)EnO1D>?_HVtr2DJmacQe=1DVey^1%|zSi z%F^l*lkZkPwQj-osHirB**-O)O>1*GKVb2L{E)h#O&j*K+SaCL=jHrai$AABj4MAy<9Abh*i2hh6F+<%m}R zzp0*R8?TnOjgNU7_E&vr6aw^JK-(p}hr!jAb3x^CEGn}WR?R8PDk(3TT!xkp)cLka z@gG{$LhIyXAP>OjRw6uns@f;VG(nhqo!@2hQ_xVh*3g$0{lZ(D{A)ES`SR#*8HLX% zo;<~85AXrMOY$S zolTkSXe1gtMWh;^8XplAG)e?oQ$(xfsU4DHVIe;rTs0T8^)f{~#E=o<4)rGLoz$-W zW{_S*<+QBn9kK#*m;%}l2y}V}pVqX`6wM*BnWa;!P0PHv#k35GiFwqq8&Wq z%E1Mu=)mYX^?Q0N^)dT5+ zUA-+@LJm{(Rp-)&M)$X9AtHkq2>+d0RHj9BnHrn1xGh}5F=%Mkf~iwYaV5$@^Ax#o zyyDU-+g3%s`Xi&-GZZ|}D=jXm$eKEJ*6fmLrWmePWUlm#Kznh;{PMDjqT;MYrL#>j zN;S#4CVULg%`cf;Tr|%VW7R`hm2Jj@Qn>g+M3Bi?yGV%%mY8Ted1+P7tl8BIO;MzJ zW>0WUvFLiuTglD`vpX@iR2^@Z9l0C`e>}K4D=W(>R$}#6Pj`rpa*GuRL}G=w9?PIu z#i$$7D32Q2K3U$tsJ$xc*i_xwKHjy0k2b~4jM7wIho&)Kt-bHdRcpT3defIr-l4r) z+{$RM@^)&fPPdCw-VRMAB3=Lbh8Z2Am{LnRv}AXv`#a2GcdMw58O`s73X6(om6m7C zo?mQ=`@mhGs(j8#y4v)rJEOs#%}Sjc*H4c)N38%#iQae^>xQg zwnfEu%9C3e^}+n@Rau7!^>C*jUHipBr#Qf65-*9DRnso3 zGv2jm9?f@)_r!6hcpo#_E?JHhQM*RA4)s+Cv*HA!9=60k?~=w&s)(*}j*l$yvG_!# zcb#YA=7tzU(mABXyKpd>~F);tTO5q>1%nU=fz`a=2Z}*Z}Zr zOMIi=?s{LdGYCe-B~y#$mR08!EzlV#@(b}_OPmuwtDC#UvES4~-FgoC%Mx{(bwu9M zSzt;sOLE;1R$Y->F&~mDs=`Pmr6mpNfHaU1RragaQw~ZUU`i9xm}W}1O6#8ADeiBR z4lk1c~hgG^TAeQ&c4 zD!a#>th+kWqjM2FbUC$wC(FJTEu%JJvaRfI$pLzGG^bRQS3{XqAg^?GzvALbK>0>f zUJe-i75RR}e777V2RkL)Hqus(y&dUSSy{BO%96Pco%Z$!?-{G8DfFB_6OFlV?6T`MhF zrJ*qcb8>S4y=+i!&cq?ZFX=JYlJj(rh=D^!=jRUTH_+}=pa(Co#cC|&f z>c$K5M%{?jDiiyv;0~pSV~xDsDQ{ED`osw(*Q&eww0GSp?{dm@jN;YyKJkVn*UJs+ zmp+{(vZw^Lrf-7jk{jjyPI;di+BZ#Xk`JgQeLMO#%FUL1NIn4Ca`HzEFPs<G6tS!l^U3@L|uc12lP&b*TH>MEz)r^#N^H@;bz+$#@Q@}ORxo!SnOd%H<6Zpx>W ztAAVejB3~4Ct-}wtMdM%*pZzt^uLKY-jTA%yC3iwa%@mm^pX0QzB+0hMIT2lXFn8 z0Xx?WI&Jtzk|dLey`Pr8hh4p%47nx!2y2&K%gQ#g)C26A!aZ!MPiF38%NY3_HPqYd z*vGDC^fW1-k+zF9IzVR&)A!Q3J#^l~Zmy*ZUIYKsGFHoG`kY?p5eoB4ud|ljI$94! zs=T4@aA=^ve&ih&2ia&nY@J5n@EQRGMgT#e;?R}7Y<)&8yC>^0oIwyR#Sc4Ta^RPY zUl;sx@Ed{O6#V9RrH5^*We?u1c@$f8b#v{czttc9JNS`Ht5Jh5t$EmE7pr26W+zCn z^va`Th%G_t)Eh(7vo_VziN8(zx9Y=xhd!cGhBfm)cCk@x0r`^d#lJTo&m=kmjUC0_ z|0Ns*yo}BJE7X}@rP1^nji=YC81-^`i*BU1X&t>o_t3kvnckyE>3!NxC+Jf;Nk7uZ z^cQ``!s!%iMqjZs`j&O4)2s*m%r2*2SgxPWuzdP2TTH*Q8|ggTfKwHHjYm|Q9k$@;W2>fI@AQHHc9gU6)uyEFaGw@Fw}tPpr;k*_ z7Dsb-Kn)w0n9UBtMvqVgI);1f$~F%>ybVKyJtP8OV$l@MVkn8lsfh)N;%T`2(t>8j zv+%L!)uw_B?@=f-&BI>W&5i=mQ6EgG&qu9y&Xmu((EY3%Jpk=K#ClQ<>qU>TzO;q) zqbJ!w+76zz8aqK1MEgT(r2Ul3-UPdx_OiF&QrrQp)#3>2;}K)bw~tU`(D}CNJ+djw zRbxjcvUkwQ%_GAa4EEvw{!taK%+Pc18158ih%SwrDLfcj%( zeB%)i*+|M{qo^ys-Pjn_W>hQoL13Db4X3$EPZOb!C@^~yO#}Nx-9D-%o2dcHF*=1+ z*rfrZV?FFt!{Jo{D!A>nPMX8k z(_D5BEoAqp#KMe>v+TeB!soeqt2~GK&xQD$SJ)Q0;k|{ex}D#)gA;z@pB!!lhfjjT z?ci_+INSve_hA10nEwzsj8l!qHWv=|UvSwhj$?6v7X{d~D*-kuisIFhu@b{5rvWsL)%kI038&$) zKiFPo$1idPy^QfF?os{5d;QV1EZ`M9Hoca|ttT@ozlMyc9<{t#K=lXhMYfhV-^*KK zoz;tL5X9SHNb-7ed3c&0lV1=Wag`Creg zAxBhxUeMGs(0ecMjILd4xi8RFuckUIYDdsc)(yW@yFYhEb;E!fN(xo=Y&8@ata{jQ zs0S+HK~{SFjTOHgK#vDuy#ndP4*E8b6kw#ZLxmaDr-q!Msu%Fd-Zj)*Bh{lkye|Zk zP|N$ayC#edkilq)RUrY21t#{3Q)R-kA!MQ?O;hBJ{D?~Tk`Glc$Be@GxiD& z!7s4k5TahsH&9#1^k+gc{R>vYGt`EirM_^-LUxWS*{`tR-{>B8p6+885XAqYhglsx z$~kR8MBc-l^dWcA*W69t@o@T;N6>lRm^pb2Ysq6-Dvx7BcswgWc@+1ual8qu!q?B6 zvAcKz+mG+_Jc+%+Td=`D@s{j&-U`RF+-Z*K^ZjQB} zV_L>uJ`2UPUEIA7rVS#lZE;FjL-4tOXosaIumbA=3MgjVCgw=UP2;V{*U$@=tTn&}hryCVTZ4hkl zC`$368EY7f_-b^Fbn65cSlVbT4zJ@VMccq78jIM?{WUbs>nQYLmRHoTMQKCRY+A5e z@T5r_92e{sK)OsL4GSVg4nNapdd(2h6+xue*3ea6v(V?#NasvWV(rvzlbiU_Y$L-r zfb4pW%nBg0Q!t;~>kjd`S|f{Uznkr=q4YGbTWf;t12_BbrKUCyH=>7gi!bbwN?Jez zIz`#dZ-%~ZK1y*m{MK4O@BxhN;ISI&q+!7mv)zCssksaoy*l{iLktf?ReJ`*F00_nnXV5rrSFaQ|yL>;_;T%}?q%q<9czr`HKfIng*Hf$U{j*OH z_fsmXB-Z~7qfK>pt+ZH-WwXH1Ad5HEElvwY{A0nrE`J^r)h|)I*~y^nPin#0Og_GW zGBx!_E*02I0TNEy?7UJhFmp=)zXe%_CU{M?o7&VL?hS{qHc*!S0#)03Zr%u>`m6z} zNC>|nt#AFE)>A=RPia~syb-|(@cr8a?_dHyq;RU?49+bcu5B4H;eB|CUYl8Bnunj* z%})lJKl1QTYWZirM&3pq{y8?Y8!66PU#aC^;DABiA9UfbvUV-78FAq&IS(Uqmpfp}D@uklcmGmODSKNfa>wd}r)RT%hu+ zUGd^yos0x{^N6NeIJVb_giAChk^=oSk6=!7<`FG+^IvU23V$mdA0fFT1m2H9FnZ7Q zT0nvHrbo2dBa$_xwXErStS%mrx?7~zQ2UELG8^{DwtLv&Q?%FgxwfPM0e!k#bPPyQ zbPkGD_`3$^=&s3V>}?!e<3taPOKZ#y>=wOhsB4Q>5=GVFLI)ny~rg%Y94`& zo}R=Pb!iPtgXmX7O*~?N&DDm0HHe%bMcTZ?n7`pbZLkWPk(e@4<7gDZ z@oWIcXpJM*8>?}|7W(1>IFcG&LPVTK;GdD$vrr?53?X~e&kU~M{V0zQpfP+PjpsR3!Y`vTemPa}K{TIVNvrr^x{c@J z)-|8j@*#9DABy|D0(y*(psjo)QrS^-h>u1TAA^*(kiOt!=_@{-zULF@H$M{2Klvo) z;6->LGMP2vQ`jUvjZNj#St*~vD)~${7f%9~@!9M;K8M}PE7@9J#n$m^_70!Nj`R8K zBwxrr<%`(od@=i;FJV9OWk_|GbK)zwi?8Gn{94|aU&n{=ReS_r%}4Va`FMU4pU7|F z{^|TyK9egxpReVM`5owbC&23fT91D>@QwU#Uc>LSoj31KW{3)5tpO#nfXJi?FR+gi_fWIKG;YZ~4{HT1AzbJR` zm*j`|e!^dtpP~I1{(@of*NwLP4WlD}(-^?tGN$mijS~K@aUDNqDE^-DAb;O@jvqIU z@DGfy_(|g|_kZY+{3Aze{;?yOf9CM<|2X>b&mBYgDMtnW!m)sV>A0GI?O4aZaXiAm zb?oEcIgax09k27#j-U8Xjtl%}r^SD9diWVs({8L1l5u&l#L`0cM!ege0Xfs>Hm>oo%*+ayexx#CX6iv)AqM12XB$!h~ zqB&KxFlUOE=0efRTrOIh*NPPLHj!%HDbmb$MTY4=Au`PmMYj2wXlI@h9n90BqxqBQ zY@QKa%-=+JmlQsiOZ0GEA$qy;L~qwn(bqLn^mC0716)O7psQG1=9(rhca@1NT?@ou z*AkKIIwWE5vN~En<%QAyMt#Cg!?d z6!Y9~iTUn##Ul4dVzK*6u|#j|Sbu6xir>E;vHv-D0*M9W6r{BgGt)!i}@? ztf)jO!ZDN?q6*VBa$4jR)nYD1I^(IAO?4y;X@r<(LwC_0F&`r$%_cNV;JF1gHph}> z_lq)bNnB2>RQiQ!IurM=m#qc(O+5_Y_+c78PHJLdNXmV6V7y?t2V5zFfHg9Bnk z;T~~qZn}rZ;?zf6HyS16RuO?BJA=(#piv*R*d=xx`;I{AAdZ}a;5OJ820CWoz(x6vV>J|fntAFAUz-znC?6t`h}ewDZjQy(Iim?hTZv_YTx#}O{2p9~xeU`FN? zx92)B(l@vHpbeLZIUNH2cQK25qH+R)5*wqg2$a}5T=76;ERW?wYAWF-uYaUZrsJYW z+#izC1CWJR9-$nstQDJUs8^n@nRYGXseGIOn3*_93(v@Wh|G-4TJccEQvoSHeyK>G zuth3yPqUP621i4160`x|!QgotB59|N2Ttm_ipC@-ed|a;jgPluMfNN~AL!FzKl=S!Afj(yqoOs!nDCpB^ zesi|dKF;T-^_l7=w+7-F9G}LpT>)sr!+!CG4c#4po@qGtBO6*9fd1ML`kjXQ_lUii z59j)P4cL!FFyuJt!JS=NM*SUVt=QK)VS~OZ%s4`)60lWyExlG8#$g4rZ?wXl?3>Sw z;J!jU6Y^%9vxIQwEZBP(;4Y+Nq@;!*bpb%wiUSj ziP)V!;sqWU$sQIJz%aj~$*n5gsy z#wcglrh3{2c5DbNw}C&{z^)B}l^U4x4ie3#Vn5R37pYW__jz4CC_ywDVJea!+ z#xBl2QE#dtJJowvd)I28K8D%7^u7t3$g@w>%Pdx37|Lt0fL}+AU_b^i!a_um=>^qAq~VYZUtMAm9~Mx1`M!96`dDa5FH->+ndIU5l=v9;oRn zd%#f3^h)ejuZ@;rrPzRW57okT4e>qzYou!laN$379p%Qsvbz47=KhC?%SR|&K1z+{ z6Y#RFlq#R3ZgLy-mD_2!+(FaiPMR-k>1DZ>j>&!SrUUf3JV;;4!}PO!iq6Vs=ue49 zWAX*&l1EvDeCcAqW|8$y6$vlZi5X`R>`{0tr&M~^g3D@O>P9cfXw|{r#nl+PVKT;6 zbL>^ImuOkW|3k~N=|8kA;{#eo?*>{v4lSR6mOp@&KZKS)f|i?GG9jd9nFuwf2)yA^ zJ(ecJ0pgEGUC*xWpPPCt121{tj`8Xyf08lXu7WD4GI;E5Uj(kE4> zLC`HJQKm!vg3@6V8Hk^O2O2t3+Wm3a8|t4KOxi5se^R{Duis~^N`|Rs$!s97Z|h|{ zy&8+w2rBw5QkV22WTo%ZC$Ct61FvgpWsAH6tTA3AdGgZ(=gLM66?lyh|2~;v3&rQG zp$=YWeKW2r>@zoZGcrRjo=mT3T%ZM_yVw_dFKZlj=}{dF3w`q0i?5yH8@_hJ3e9us z-!YwHK7;uj!E`ZYq|d2Qc%AwVP``XK@$N}%_R8nv7A*Sp4JvhIqV|<+EyAJ=_aESJ!o{ME%??NU146` z=nKO~zZl)=oZ(}wjUFu1=*c>uuYTS!o?Ke2^&zE;>}YE=jwQ)Xfn-xrBJKcK@XD4E*W?`)W%L5ovbzP_x1MBVES!NbBx3kvZJl~0OF+q#IiHm z0`GP3swW&bm{@W39UV+Tw#C1AEP!2tdq( z4c1vB7wc>^=h-&&+J?}v>X}<&SXTg}J+fOvDE`c4ag1{Yn@d9aRO9O>xSKJbgmDEe zD|w{PVOy5Nwk(IXEC(zrQyZ4_*4NclHzl%%)bZ;_bY1{IUr23@MU-h=4c}f&1;!F8 z#kbtJh87r0VM%^kg>S8~jP{}5LE}1Aw5mmT4?D1zQ){hgb?d6+=urMo11`!;y}YVv zPwWP`EgY9l_(=B90+K!H8)#m?n;8qM&~dqG+Ai5^J;mVD2Yh(b_sM>$#p*ck9hYQS zO+)sHgms`AwmQx^P@|*e0iiWaY>WpXG>>|8byI&1UZU$4c=9qVd%1`nsd@?8NG);e zhzaFxsjuz5>48Lgue@TP%tr{=9vC#d;UM(?p9TSEuZ!7ZZ)(&NH^`5Y%Xo~UjmP1* zTd1}11lEVG)XR91dK=pz{v9;J*hz)PE}CHMrb?rhs*Jr*!#?G|A&!ku>u$)Ngwx@f zxdEE=nXt~%oY;NDXa>6BvRM|UW$c#Y^g0b1x?QB9t@dx@FohXUQLOPaB^u9AE8|&8 zF`k3=pGSm$fjS#URofeTIES?P@vM&U_@EIa}+1vfJdA7g5;{cuB$`n2><&q*yAwR6Cn8mNbDpHH9n*Y<71j;P@SCa4;VMjuJEqQj$*Q{ozM57 zus^5*zTf6A>IP%i|MP+dW*>Kn*#mXR>?f+4o7;r{Zj%sr>Lb;fTawgoH%D@Z6aF8o z4Ow-%B?^CwsH4GT+py``2GPLL%7#v{dv8VW_IAD4-V01_uorOj(O%%^`fqK6PB$0J zsCK#x?Fb%O(onl{YJKt-+HGF4nT$f<$KTkHbPS^u$8bt>jJ(80GeSbe^F#Zkr!6(% zCzcirk~$7Vn))wiA#oi8zD5jy?5SjjoDO4?+eYt|GY%hg4^G=5%kh3!4yhqI8kISy zI6{?bRLoFiJ}Qy*phc)TLm)gsxW^dM(?(IaQ%>K8)hZI}STnhl67aev72h=KNL}#l zO8v05Eyc6od>V%Da2iJwq~YUSi>LW23cDl zWUbc@xgx~cwE@=Hk9cAgBAI=IN{CPPJt{_keo(w(8<0fC{yWJat*N?YjpKh$9_Yaz zg#MGBRUvwA2++d?-f@NK;e<+%1U#feB}g3TS!L7HfE;H~g#Q=xaQ!+xKo7qL%FyqE zFCgCIZ-Q#&9eL>)jzjY9La{^MTTm!>$Oj7wjUDpgf_?H)p|ezpKPt%2+$VS9wK?9a z)IU3aFqDYNy*?uM`?c~}8~U6+ zyK@9{y~3J0k9{yFUrgor26^x zxE4p{i*V0uIxJt3FGKfTp^Pbzx1=GoR=y%%RjI0lU*}XhowlL!wR-65$hY*t!(1Gd z=mf{kedHRa-0GCO>T{_&non+>&0GR;%Du>>oOH~|It7v&eV8ZClc$avHN-PGn3UBK z^7a5CI~ziN@&;z-@=f^`z6f*jINDCg59LSlW3*s@DnF5*$GrO<7`d+)tZ;$e|kMQu9{@Q^hYd9Vb?>8`Pla=5aSNa%B}% zRZhF@n)(A7(Q=N3`Lmi2qW^6VlP_kC5@E{ z3a9rkD+JV6RAO9!9aZ^p3GA4vj!R;1t2^Rauy@tIxMl1k)g!(+`&5mKAJ+95_LarH zX0L+a+_KUl59a*FV&CeD$PrbgmBq7)CJvl8rD%3#aapNu{oZ0fuvgWm@#CAGwkTF3 z@*4){4bB}C7;mHYQPB z>+0?ncL6ozdRV+CeFn8ahf6Dlw=AffZt~vX+ogF~(BGoc!YnVH=6#^>yf33>se@Ii z)g)CD+uz~?=p&d>dC{!0xkbav%VrmqSI*Z^FSXcv?0q*Mr0!{!ZeGSOxA+h~RK3y6 z*WxmsYq8JxFh&unZHL+xSX`E^Y3t$US1^iKA9jjw?B&Dhq@HA?#YgecDkGsA8>@;E z+OjLv%?Y(^in=th6)RFR5_8!!wJ&i7D^{(O2D)bQS#DmU%93JZOX&k>>Fk2?ilV`# zm4fK}d6UmkcO~Vr3iVCWAXcS1HZNt>>Vf7X*nIVC^B`NOhPRASD_dOZS!_{jN;Y{= zz1w0gTZa0pJXc%PM%P`dcD1Z#*Q<T)^bF zK$Zb5e`WEt{5BQc`tsl%klZ-@Gx<73eB3yABYu~~?;irepGg!a^?{=Z{)^Q%Fe% z6qgrGsVpm>pP?JJSo|^DNlhsz9Z^(Zciw98ZMx1x-I(&?$|95RP@d!#Y?n$;9>Qu> zb#iMn$oE=&AK$MwCMUBe)QibII|uob7Jo`R1Zn#e{tR?yDx^8Nq-@H}3O(I(7JpuY zcFmeuSX^FV@*^tHCbP+l7&88|rOQqJGSp8GDTOyd^Q&rEn|3j;L$NB0X3Z`uFDRd{ zTha0cTH@8oHu1q@7+hIi1uTy|b+1V!lk9sR5EAv~6n(JA<2R}lyR1}q){6}D3 zURGAAG5N`&mb%X`DmyhM|5uAz>C*2KOe;R5X^(f7X=&C{*tU^s063B-&HHTUxJ zKlyn#{|m0-!ot_T1a8I>B$(Qe+A)d$DTE~?y8&LSw5WP;X+>p0>69X`a0$~b-0H{F zrotnCDpT`j99GDW1it8IrQ9~9@ugDa|l zS1(h#J`mSx)pdXwnE1#A%y+cSArf6Enyy+bRTEqcUB!E4d_ohe!%#Q8a zckbAATD~b-K+MxCD`!{KiCMstdYqcs?K?ovM6yNq@@A$;fvOE3(m$_#2k=d_wP+#u zCj9C3{b$UqFhwQ|fmRqRc?pN*cx?v zhnDPCwXee*cBe}3n9+Pa#8FT-m z#YXXvTfp-_RcpRk;$cyvSf@<(sLJk?BR4a;1PC-$Ih|tF_D+9#_K1CM zv6oQ`^@bIrf?X__!hZFB=O&l$5eF^tgkAw7^a@y3Qdm^pzr3gb&e9Z5f(=>I%FC+2 z>8IfU(oFFzk{+6$&s*ZKKu}~Dmm1Pb~4N_)Hz`8smCLd|`<%)wf;m?Q{x$q_AjeK~+g*PQg4K03tRJ zKU?A#@dKkMkQ=J*H{S`8P4TNb)UD^>bC&o+a|9l?c$TL1FH4-)6=9WSL(8hcpn?j( zQj%GcO93V!kSXsACdkymZTp+j0F$Pf(yjV;&utd{H#9~RRBAM2tR>^b59+b*am=rt z?_TXnvSf4FLiGz|x>_MVm#tM*;7yjT2KBg|bx|Mn=o}9_TTaQaN7>7wWt1EyTggi- z*+*scjBnqH-(|`Ha2YT$#MWiiUU{h;>AX zIWkvm>zTras}nt&XXR-{gbL;rPb-DoC2T9qRsp9%Pd~<@REp5KeATAchG?Cef9C;#29D4@=2>#S?qQ7@K6F^$ z0nSjjT&UjZ-8y0k0(*_qGjgfMX_*SUq;mwKn45Lw8F{U)yiN_jWQ=R2T;-NGs>d#g z6F14#>c}PSU2Ej6Zh4FP>yiYaKoM-B{=E9HZhd`Ld5 zV*5_@JR&!_<)e(6sO^1yad}wcil=~?o8=a*iUl)^(3GkQ`nFPU_VxR=Gpyg<*<~dq z1Lqc%R#v#>PW4ycgeE)WZcEncWzIdNth5p_tQSilH|0LnxnCQ0K#l7ckkFMwYJI=a z?5UkU^;^YUugcfm@-=n!fE005zM&o)@NwEJ5p;`I)Z>=CUan~DmT#c~lnus0SZ=Sa zMVRwFM#<`_0m;HGKiK)vzz+oLxAWlO?~TkpB*`RVFQ*@7S?RT`>Bm)uz0po{dZW?;HojY1|j77^M}%QvBn4Jbbk6?`fU%L^|4!P z>0B*iwQOd<(2YK}R_9%Q<1mH!rQfJ!dc0F`>B3%idqyo=m$eC-6b^y z5L+(Bjev-Wl_(d|Yj7m5(@k`gZlyP9JsqQa=`E_ExAA>~KBM>PXFACkeZnH> zbCyV7u}u1gWz!F=2mQ$U&?(lBerB_SbeaX}cea|&vJE&IfW~64E!d09MfU)Osn|M0 z7uZOh+PN}{(Db72QMQS=o!d-)5){pvV*FzuA)T_>2S6cIXBRKoNcq~ZlVX+ zcH~?@<;pc|2eOjw1avC|cr)7t&7X*x@znf0C6U`r%uUM8*1K8Ijbj8iyOt<$o-X-E zlkP?eurkz#BeFU?N)c?cMqKY`0sdCxvyp-V(wbPSdCqN~yX@J+)hDB3a`%FRPUi_| z)ty_RbNFFusuLgE2kkvfjV=_n`PhMN=q7AXjgS(H1V^GMiAAgX@)E@p?2vjoubJ^A zZ0c$CXeE&Tmb5oAAlvipi)NmVK1xcBRd5B#90%trzx4N8F?Yd z4Az{oSPN>;T2n`sLY-MEbz|uifN=Y=b~K1}pj_6G?qi+7=PvXR>rOQ+K$}=E+QNF% zR@Rrcvw^mBJ3&H3`|G4j`)Me9736Z-%U*-IaTkPHi^G|uQDe>54^t%Yd|d@cHD!a< zU854&8>;W3Xdio1Q+_cMb2Jm#Tk7{wNh!x|R;4(s(uJr?YFW`bkiLt_8VV0Js9vMv zBd-9*Mo=cpqpnE1u~BO3=vM3~Ssqg%4+YWwI|XUxfl zV@mWG6*eY?&9-xc#>A-gW1?84E@gbqz6go^9l(SPsSM~fkkiog{2VQ$AI9_^@G?kQ zPu?18yn}tYZ3p`gKHqJFp4VwYOWT*ugTl_IMo?TITSNtH2^FzrRLriSS=f%x9@|y? z$i7gU#wNs`vbinC|5(TLmsm zw}a{Y?+uB33Pe7QNuI?d&x6P#Ao4{J`3i_^t_EFYrQ)n8MCe6E&)p4;{tZY!dKmZo z?^e&fHr9^S+l6gD9(DmK$Lfy*skdSECt&pnoQJEwu4=9$cXAu%l(eJ z?6a5LTAr|%Ct=mq>usosx5SXv>&WBdDK(iGlw04@7A&0Q#@OH zs>t!l2`}f=kSi)TC#04c=(Lx2K#xwfysOF^-(r}I>W0c1O0v6fX#=XEh)~hTeyyL; z8$z?&KhR{yLrnqo?D!VJ0EWokHPl=K(JemS3v?yaa(EEX)-OR$QoR!*>HPiYKLRoX zo!|scrJY|QIAQb@zbyCfgEMRSU}rpXIkogL=Fpw(xaF0!J#655>SYh%!QuIOQWQ)l zjETx}qL@8=1ZK~(r7{Lmky~=@d_MA6!x@&w|FUy%V9sK&9*1wlet;AI5sTp|N@hP% z9~fXh`-RHcY3S^)bT|8*?qz4-u+P!M><@aBou}XyE@%&z^a0%P*W69taxeYP!{{t; z#N0fJwd6k5mPfN;Jci{VKN=^!SMfMjfi%ed>`vZB{MW&BAu0Ad^s{Iz4$*``xUzhSJmgUM)FR3+ih(P*a=c73ksK5(vAf zkmg8C2Q0h!O2{|3@(9J*9ad?0XqLO#n>Ex4Z7V}DO`{9d3CQx5KEB$=*VOV`ef)MG zzY`gZ!O%B%&^NX8<$Czbe3am4uAJyN8M{I6m7I>z`#8>pwBtLm$@id;FG$cR$8O`>lQaAx>jr!sH~?B`hW^ zlF|L=)r3Mb_$E3B!u;s@$U5@rbn`lF;E+DPo|3^G2fgiZ)0#^7OCR4^xA#kNX#qt$ zUOK#nM*G9-ytGDJ`(q8(AIbu9qfi#W+iKt`_9Czw(47Xj?}jsIm^Uk{sM%$Exc2{m zswa&J-^c4KYWab6)VUs84ey_QLa-02vZC1FAGG$6(M2*m5fa7;%{ZILN7hrO#{Suh8Ftt~;e<`j3;4D-%PHm-2mUPZvTlNx{yxFU z&;%#-1mXU0uy8$P=@b*Rsi*N3XM&RrCWwGY8dC6@ikR9o*vQ`~1PbZjKpk~JebNw= zdy9{2-G)zj3swX3UB?pBeEjX*{Df2eo{xV}%TERx`y2Z>MECAJ6z8um)bdYp+92<< zO*-h~pKF^AalpsF#H{|t_MBhiTN?=fMw=U^`_9LI0NmaDRH))-?5gaF)1ivrY%@Ls zlRR^nl0zi(Z|Zn@77%sY1;D{w{KQ`VN3Gyv(C`gDr|>zwR~Uf^f5bi!#<16}3PjW~ zSVY)d;jrp+J`v@>J7pK5ox*9m5Q}d|wwg4bh}X=qjYc%NNJJvo%;~6!1a+D;pGe%z zPumoW=Gwo4bBF0iFdcl+JE~V5RiL9j(Q=Pytr4wdP1j*{@`*OPMQRPTztAJCVUG;E zhwV;9R&5Zx_iRZ61p0WlXy>p|bO`ZP!0CbUqKif&(jOUGBSkmu86(+&-6Bv!UDN!L z+SQ6c+Aa~W7fBJY7s&*0%_n+l`FgelqAo6BX%PtdnzZwYJ~mnF9S<-1IlY~E2k3c0 z-eH>LkH`-oG=4#KElwPDsl8@2tDzSDNS_#Fm+S>g?50CHIF)v4yK!;3h8Vu3hD^KK zfsEbO%s`Ys>M#}fqw)hj4LNZ}vnZcWTm&4YLFzHJlbnH{rjU+#ww*S;L-<~pX2*N`Kj z27X%&CfbrJP>W`E3U(q7?@ZCW3&r!U)Pi?IgxH zct0xQ{i%cxpfY|bRrAYe1s_DW@WHs5971dPP};zAa1Az`Ht{RyaXtc}Zyr6tN5YAZ zLI^yXzTji%E1pl^@vG=e5E1I1d^~gU33wSXku~O%*d$)art%_I%%`z(KAlzZ61I%b zV%PCfb~7(yYx!(;2cN@^@d|c=SF-o{T=p@q#-09r_8niqe&kCK8wWY@rQE}p@kV?( zkK|YLVf<`)t1ti9 zHJpFqD&wEJ=JC&53;7qWJNTEbNBCE+ef(?J5&j?7Yy2D6DgM3d9RI;>@gEU0pK{0Z zpWIFP&+cJJNAO?Vqxf&`ar}4p0)EE5jQ`iYg8$)O%l~w*dx#iwsE9R3i8ynt@S9hPCgv2;)SN03&6y&}oG+T2%S8+GT9IttBHEa@ixl%M z(bf#UE7HslM27i^$TU9}+2;46oq0-hFn8lM~bcnRldJ=4ShPl>q9GfxciEEa=32gMN2(_*OSIg#smQ4I6EBChZp7b83; z#7NKkVwC4&G1l{)$oKptt_*tHiE-Y}V!XGTnCR^#CVBga$=<jpiSQ1q6n3O&Uj9VsmMvT3^Ywc&c)7wBh!&H zd9^u56eH*5n<-4pz~C@3ke1o|$uKdCF4y}>vcxfWjF`#BP?$`i%bYs7kXG^u*q&PQ z8Y&ef$b}mnjoo5a5FIT;8KXoga^c2ld0Lbq*T^-T8Dci3YwWhjE#`=Fig3qMFB|I! z_gXPhRM@S%XpgAGhzPR@T_LJa7inHemfbJPyoHYub5R%Jk?eC(ja-yx9-A%jl7XT< z-%;EjVm`95-bu6q%!{CS?>5R53wJ&-+hXim_0pUa&t>)=^*rubUZ2xk>ND$|iRIt2 z;38+CH?hLoM+!c%q&_M*AeQFu5zB|B`?wEBJL2jw$a!(hVBK&K=;+fkqGu#6M3oeB!!VvBGxnH^A#-3C^(#H`;}8r*IPr z+o1(P+Cp2!&31ZF+!8wI$R!_6u9i@;2!a($sjFB<{lsz_Dz2u{;u@MHuBDmcx>TwX z*F%ABpbcUr-G_9exRJJqRkTgqLiW=nP*jn5O zfn_X*<$`N!&MJR!L_ntFT1jlE`TzuqWmTt0HDyfu~;x>n9818b`BOL;ow}B5jeL~z44Dq-Ng@eay z!Q5#aOj)(^?I_-ZUWZju`m)K%6 zx0KSvW8!g=w7s6qhyKRq?$pyf5A+Ou3L}=f#YX*~57(uQXUW?aiN{la3UrYqaKkLN zs;<>ZX5H36O{k7#TUAwcbGFSsr03u0Bh-to55yt+v{Y<&nj4<`i&vcH9ZvJ9hNIte zns++QryDkZt($YiE`)^kQ7c~z!Xtpe8JrB^axcAB)b>tTuP+ia4%6oe*pR%6x&ye4 zM2wAEn2&wAnGxDO0Nsz~#d;51D4w4em--YGK_BNd@`b;yHcu>Eu-J z`6Ky(47F^OFE~SAV~BGk@ruDE{(_%8PmLu}q~sJM1vQb9lBGc@(oF-TNrlowrP52+ z$S}H2hSM6^h}O%-v{gpXb25@%lTmaO`S(!wxs0d(NI#vHP3Sk7Xe)$$xkqQ}4*m*| z9W7pfxq%r>-}7-?Kz=V?gxeJ~0H*p9>Le~7mx`B>GiVKs6tB>YXkSm4i&v3z!y41Y zYiKp;IXLy#k+W=5y@M>5TC>2<_NYw@TH^cF1sV80Yv&UdX5}3{LYdk%;Zcj)E8ZM> zK)jQmmcC!SOYqbm?i5FN;EKCee2k=4e7+q>I_IlRFg?i(a>-1Jl3CPB=1`i4(K?HaZgIj!H?t(_XS7VFlw z;=6yleGq|$c+AqhgW`J}`r8@_GnDwl9k*6BpZF1>d=8Y;la{eZ{Pb9z{?%Qs3%#?n z_muY8Vwl}a?`kr2?|L@H>iYz_2+QkYDAf`u)KY3Mm)VMtMp9KR_J{ojX>n>#QQ~*C zZgJ`)yti>sVqXIxeXkVZ>6?C-yy@7fZyeJ z{tOtpWIRX#n9`r27D=kblGtW;t3BALAM7{s11`Po$y<^<#W5u83J3dLK8b3WRdfyY zKuKTKJEcs&#Afr_XlWMrt)cF9C9f{QaXW36E+qhkv$~9YWGJuRU($Tk2IBHw3Wvc* zf*`+qh}z1BsT=MS`p8FUgnX2y$xT!(AETG#Ryr=X(FwVOK9f7?OYAFulC?0dz4WI% zfU}{4%p(u6M)D~&JQ$bM2z4HmMyyWbtPMLt?Ej)kYnlu z38AYM%bEwFtnw5D_!9*9D+Kr(1o%4ycm@LeF9diN0z3x+{zbcB3s2&)*E5EoR}D!= z4Hvy{c<7|zrEd+3P8p4C!*DLhf3EY8^fNrHElRwfs1xOmI#Ej62wA2t?-Y_{vkN!V zGQoa%@D(JkZ`_9*V3BxG;~T1NxmG6blPwt`SV+%s4n#@i;uc_KEq&ib#>l(Km!26T zBV3bkMCKgLqMvNT9BGU-^DBg&smPQPv8?n^Rh@(D+j|Lk}E+T43 zh$xf#%VhFHKV$H#lr{*yIo|drN<0*UgH4Buw1tCp9%$g&27Vp=akpF7KP?oBS;YUO zc>8@u)U_#4<#hODtXaU1%S=^vb&Nhm#k%S|sR7kFAui;mJ4eDs4dwZbIt~P6hRv1$ zu3I|z-SySDs<6+?*h<8ASY#dFM_;ZZ3yS2hM|ZdR^OA;V=N?Vl)txoY56EXOykUyB z-!S2tkd*T*2@5svSO1LZa~3dIz!i!BQ%3}F+rt|B-TLy+@7A%N8XGCD3OJD^ff7X%I+ZO@Z~g;LAdMH|Uu=L|d=O12|GH*1Z%e7(;z?1wqc zF%nbAcDCFdz)Ky#vIFXz$2z+xA{_UYSdVp>h=)3|6~3LfI>Gb!4UBnlJ?`uD{>a`V zWt|5N|1#=4eh%dR+aTt3Mns>dehuK^CbB**r2%$e8rBac8(oKYb|W`*@~3t zx_F-YU*MZcyrF5_#@8pQp5SRL2IHh;q+cPaGxB4%d73qpkWOMq5uCj2rvT|Ld)LN zcqDF;?<0?KKSdi4z-~8EYvVy`Ydl1~jEAYW@d!BoD2+5WQNFR6CKy|&+<1&CjIEHs zHrqb6(H}XL;kmKnh|wf<#x=AYotCj%j@64e zu`rtz5ZX+_2{aR!PlU!uR~pr0>?MN zv^QzEag550<22WJn{G2s(7ndHv>WMu<2`!L_yCLY`}CIa0prGp%rK5J)A;nl`o+BU z4$mvE(#i$J^g=(iYVUVc8^=(1#bx_3sW#pe9TigZ|3%3Gs!qwrsdG0avs0?Y>KHa2 zb{(UJu8!cwUyh|uuxoBu9my=GVj?QquqL{oINFMTT|#hTgI$8FqfL$T z2FP%zi7*Mjsst_io#NLpBfS?Z+94W}@J# zE0m&O))nTU5aBe9Ku0_wSm&;5t46_a3i&(bfSXif{V`M*oV2Xv%uE^8dCo?v_5Cofi(PBGep|D5NW-3 z$i;P}1s&4ZcX)MFM-BTDg*rOfe^9u9@#1X&5)u3FCoYW6Lz|1)~P2R}9ZCqB#T z@VUmphZEj7)#LLg3LzBmAPt2Oa^T={8=nT~xI--bzrcs<=h_ZFdd0W2NA@9h`mpkN!ynJJayf1H`+$d-aVx<~JxtaUqV|bs9M<>8)MT_uGe7 zKJ6rGJYHgM1Tp$K>1c9jTwkM4|0n R`M&%RTb$dV2`62i{{ej%