From 69d6cb4d6b9d13f589833ce9b1c42047e7c6aa76 Mon Sep 17 00:00:00 2001 From: frepe2013 Date: Thu, 3 Jul 2014 21:54:12 +0900 Subject: [PATCH] added findEmptyRow method and test case --- .../org/jggug/kobo/gexcelapi/GExcel.groovy | 9 +++++ .../jggug/kobo/gexcelapi/GExcelTest.groovy | 33 ++++++++++++++++++ src/test/resources/sample.xls | Bin 7680 -> 27136 bytes 3 files changed, 42 insertions(+) diff --git a/src/main/groovy/org/jggug/kobo/gexcelapi/GExcel.groovy b/src/main/groovy/org/jggug/kobo/gexcelapi/GExcel.groovy index ca14922..4ece271 100644 --- a/src/main/groovy/org/jggug/kobo/gexcelapi/GExcel.groovy +++ b/src/main/groovy/org/jggug/kobo/gexcelapi/GExcel.groovy @@ -78,6 +78,15 @@ class GExcel { } return null } + findEmptyRow { label -> + Row targetRow = delegate.find { Row row -> + row.rowNum >= CLU.rowIndex(label) && row.getCell(CLU.columnIndex(label))?.value == null } + if (!targetRow) { + return delegate.createRow(delegate.lastRowNum+1) + } + + return targetRow + } } } diff --git a/src/test/groovy/org/jggug/kobo/gexcelapi/GExcelTest.groovy b/src/test/groovy/org/jggug/kobo/gexcelapi/GExcelTest.groovy index a04b2aa..aa62d88 100644 --- a/src/test/groovy/org/jggug/kobo/gexcelapi/GExcelTest.groovy +++ b/src/test/groovy/org/jggug/kobo/gexcelapi/GExcelTest.groovy @@ -19,12 +19,17 @@ package org.jggug.kobo.gexcelapi class GExcelTest extends GroovyTestCase { def sampleFile = "build/resources/test/sample.xls" + def outputPath = "output.xls" + def outputFile def book def sheet + def sheet4 void setUp() { book = GExcel.open(sampleFile) sheet = book[0] + sheet4 = book[3] + outputFile = new File(outputPath) // dateCellValue is affected by TimeZone. // So it should be explicitly set as GMT in order to avoid causing a failure dependent on an environment. @@ -34,6 +39,8 @@ class GExcelTest extends GroovyTestCase { void tearDown() { book = null sheet = null + sheet4 = null + outputFile.delete() } void testOpen() { @@ -294,5 +301,31 @@ class GExcelTest extends GroovyTestCase { assert sheet.getEnclosingMergedRegion(sheet.A4).isFirstCell(sheet.A5) == false assert sheet.getEnclosingMergedRegion(sheet.A4).isFirstCell(sheet.B5) == false } + + void testFindEmptyRowFormulaValueColumn() { + def emptyRow = sheet4.findEmptyRow('A2'); + assert emptyRow != null + assert emptyRow.rowNum == 10 // rowNum start 0 + assert emptyRow.getCell(0)?.value == null + } + + void testFindEmptyRowValueColumn() { + def emptyRow = sheet4.findEmptyRow('B3'); + assert emptyRow != null + assert emptyRow.rowNum == 8 // rowNum start 0 + assert emptyRow.getCell(1)?.value == null + } + + void testAddRow() { + def emptyRow = sheet4.findEmptyRow('A2'); + emptyRow.createCell(0).value = "100" + emptyRow.createCell(1).value = "test" + + outputFile.withOutputStream { book.write(it) } + def targetBook = GExcel.open(outputFile) + def targetSheet = targetBook[3] + assert targetSheet.A11.value == "100" + assert targetSheet.B11.value == "test" + } } diff --git a/src/test/resources/sample.xls b/src/test/resources/sample.xls index 80cd7804b48ec91f2b34b2fbfa2a46ab31d040bd..9d1b52a17b71baa4369d2ccfb4f4ba95a2e960d6 100644 GIT binary patch literal 27136 zcmeHQ2S5}@_n$isI6wphrKorU0!llIAU2wy0xE(X8^|4?2nG;EC1OidEGUXmFly`- zdoQSoEokh$VT(qi##mzI|K9BFvA5hEnB@Ea|KImzaBg?rzWKd3Z{N($ye*#o$?W!$ zO*Z9(m)a5?@~Ogr=yB)**vCwhDIr4G!SbhyiVB8E2<-lo{*5f~5p?xZoI`Ke>O#hI zt`AuZ*#NR3WFyG6AR9xj4cP=TxBxMOTnDl_WDCf3A=iU!3E2v=HDnve^&vNa+z_%Y z?xfx^^$gYsxAiG2MfGmaV2^sy5&HqNG|9_!s zG)aTMOgI;zBo(&lBpWPR^HdK!hHVIr1rjli3WSu>UlN8J@xZeurf>R55EbV6YzAy~ zfL6+|k)9wuoeUxIRF5G{tMnpz%1kdJb) z-_%q-0%2dlq)TGRa55DB;;8LA!dZ}0n;<2VB*T6x!>abzSs@?WR8#qQo+c~Mu-~xu z!+n1LM;i8j-2RjP^DF?qpy-JThxp9RC+Kl{vR{Yq~mp^9b~+YL_tQSmO-b+YXx3+vePn>l83~N8V>t`kcmUJ z;-5|0^cP+@d7;?7zG=Zc(BJj#2GsLBWYih;?*JLEbEq#~AF*wwkOxA>b|gW@YvC}+ z*uIgFu`TN$v+cui3#nKilcudL0HfXTx*U@vlVy5V?s`@3dROlHkXld&<)95w{)Cz1 zVkdN-&;x!G>3|7<24Y~+(%HI!No@fqH$R1uzd#o&w4LLJFoj z#8J;G1!K1nh(S9cs4XJJur-C51-1>wfA}@0za^A=Fa2#pXC;Ju2>8^f1=JEk?Q0xP!)Dv`c ztpSgy20Ying4M~o4vLr&YB!DgAdf{2cv{zhr){-70uoS-eXw0V)$$PFsjgiD=q1|E z1-9K#D-O^1f~)gA3Aqj~YN-_yc?2+ORj->twKzEXX}1HX?`ZS^90?WuO9KzDPX%-P zlL=1nld+AX)UceS^dwt}6$ZgkgH)DYG$R-9w8(XxboTn1YhBVk#>R(6+i>qE&_ zWDkvmL6ghDL!oSburh(Q(*OxDHj_~C10<~!MTI_<1Uol7S_m8vf z%_Q7P%_J%{0$^BbsVWSVsDxKkRiObuKtQEXUsy%KdPymiom|8 zYM|$7pli}c6aE&8gVRJ+`+Tc`&gfH>pV6l(eVGQFO&aK1HPH8Kpik96-=%^6x%zCQ zIC`voc>NT^PtXXY9uGQ@D^b{IF#bqd$fuDF0RkS;UMF7`~w64;q9fhF=$^ zu9S|Bp+euNmX0ixAJ<$ou{a7k4~M`dNgX~`Rj-eF9Bl6y9SK%bBt|Yc9z#zuGZTx% zA|f(2!|RulpGQ~nJC7Ja`4#8g1}=^i-&K{a#NqId5nGTkN;{%DoyfuiZX0vNZX`#A z?hMC-u*9^Wt4dtb(knGgG-|^{O^_oF;#Kel79EWhgkl8}8Xx9UFk_NPs)G2`1f(KB zJ4o}IfOvVUg7Dk#3m}@?FRZG1TcuQ-IKV=&f@?6L2-=SajyyY6p}GAS24{?jyv0OM zJxIk-Z6Fw1=YYsGXj1XGn4`%o-sx-&Ao}!lq9y?WSsFAco38}XS2S_#*s&FGc4@-X zjsRSm0fz>MXfjko%MtUHY5}}lr2^C|_2R{gDoOTx@J0>OGA5*@ItD0RdinC@ zN)XluxTa-=acMO-H@{;_K`EwVqF=$eQuTox@kpL0y8@dogqWCfSy54@tiUR}dGqE9 zqG$!HETt(lW|igASl>|6KuXn7)L%teJl!gTLXNmQPgy^xAX1K^xRg<;fEweuP>fwv zS^QyX(C4VKRfi`#s8u;ULqQc7&BKDg@I-;Dg5cDt5~PZD42Vq5)vhWC&S$FyDT~w& z(m(|S3hJ7p9OE@K$G#>Y=sfh2r2zz|tJO9~Cf5#vYo=;J$|ALc;CWuZvtbp5M`Qalj)^Krkxg<5dURm>dNFVZd_L{vyL{I-fCnzYLUsT zo@hJuWb$8ryP;mDxi*F?@g*3~A{SB*?BEi!Q_r|=;Inf&9UE9zy|LzzAr{jjRvHUgQN`IRz7Wsy6}?x~k) zsZFLjzqQvQlk2x-kq>t5R4>y?n@n|n>!d{{*Kf-rFWuX#UZ%A+ndTQBdqTP`s&aj=D?9B&(Hlc~;c9kj^g`mLAum3ed3%e2)dQ=Q*BYmv$ITQBcJ z7Z<3P*+`pAb$;urMJCs8y}UOsIjUZ!M4L=?ek;`?lk2x$-UTNW*A@QxY^+VDI=}VN zB9rU4Uf%CY^VPM}oY=vHS-_tg1i{!2$|;gS)UZOIH-D(~PeQtk+ovAeo{x<_$;WQY z!{+)S1l6NDsmFHUW25i!v77L)x&B5-(VpJwv77L*(Z~4MO?lW{zak_z;XC!%j(lwN zB|f$r51Z>hghZ@6q8{6ckBvUV$M)o5bNz&nH-%y9u#Mr7G7%9RkS>Gy<74S;u?HZt z{s94Z9g_+XVUJ>Dh|Uiol+mbT4jr!q1wwPUBLlv6P`Z*nK_el1C{ng6lF$gGacIfq`8XN2wiaAq@FdT8JsJ7Gg@Qg_u%-&~lj!?N65)sc_JvjNcsugwhpq~UKwT#h^o{Aw< zu$YK=<>~;ZE00sB!br&}A+ey3J7g*8ht;5-2|OVO{*X82UDuw9C0&3jgpMg#r1Cg> z{`5KBQi$hIAA)?$7>=kuTvQye`KV?bRA#V7yQ@L12v}8m6POXTITsa&YCdWm4k|ND zYd~e@Lqdw`%SFXO8W*jEww(d5H8meIbz`Y;kIeV8e+KFpL@A7)DE z!~W>Q>!#M0tMlRJ;KR%@)-LG7*a4ISSj${}@Jt(3lj!P$>NfeSrlF0|e_Q2>fXkW3 zC4zUHkV~EK8j#j#8JSwkSO7d8;aa8wZg8=^8}EXtScd7d>`26vSj#Xa)-p^9btbu_ zYRd!!L|YFoq^|`O2#rY_yyzi80-+IpXD0A^f{3!?QN|bsq%AfqZM?eS&j!%(2zU6y z8U^H zp9NwovVfy0(>a(sBTL}{=%t)vSZ^8_v@84_golm~0&~O10`h^h6yjKjH%uXl#i-*J zWAyX$NVzRB_yka~z%>2=bI9r%EV@7d)(y6_+wx zCP|Y^f<3vV5YIY<43(uP$`V>ig1lTM!H`2#Dg=3RD+GIUDuj3gvk&Cv^*AU%2!9i8^XaMX{njA)JzDL2LVrFD%9>iEJ0Zt=rNgbnZq+cXi!3eBn*Iu zr^~?DL8e43Aia7?^^-Y$r+N=v`opc^yJjc z$wSe0vJn-~_r#<*+-U_nkgc%IgRKkP!WV+TnXr|^_7QALVH*p#iM;?~khmUXU{oYH zk2DEMq1eQ@kaGmdQ4u;K3+O3GZcN5c-E001_8I_=Ic#GUCuBgk>|wHue(ocOrmUOw zrP z%^%%;!_2#jYg-lk-tAHM{z;P(a_+8L`||zMrh6_m^NiA&;I!_gK|%jZmwMiRY9Vbp ze?_-P-}<+s?aoi9z52dG@o(Rs9{#qOQM*fv zM@=~9A)R`3}8X6+uJ|7(|7FmjX%0wiyq=$kn!pKo_u#J_jxKX14Ph9rw&FVIvHsrl6pYyY%-hwrHhwp?0{Fqdp z)#kw1@y91ETiHY$J95}pOGjVZHehemnWe2yde&dwVY_s09h1pdy6lbK5S(!4xaryO z&}%;N4r5o&`eMMPM&EpEecLzk+^c%gm;459n7QhB#g@a;vTwT_99!agKU9?JHzzXr zUi^|(9(QB*<*$;hId6M<+s?NaKdNo$knF;G6QF@GO`tDhW+uso$~-u~o#Il#iPO0iamdK&%fww!Er)jl}d z)^Fc0ucm(8;mPm0N0zR5v-sA&9&hrywWuw<>zO>t+-_g&khBBC%}dtgw-X(F*K5O_ z6_(BBu5)+o&}hY`y{F9U9NyE|(yYgG=P;vjrSAj%;*Ij=o;VRaG5N_7tM-AfKMm`U zGk%6iK%gFxbs6 zy0>droy~`@*4p2{_v-Z?El28X{^P#&nDyIkrk1q8!d&YyZ^8yGe{jdxIl<@V!k{4& zvi3B6)xhgs$`*_M`Xl$vKD5&L`B&HX_~bR7d7<@yyyt`5cazhBU)7yHYk@<;hv8sXyq7x@8#Kz9~muJwc<_c_{PmvyzJj7=gqr^{-bhUKKbK#-d(2v z+eWsw0dEhUO|O@FXJog&fBaI^<YNPJa<^nsB1gx8|P)We(M(; zp7myObo-Ln^Ok*IED4_JJUFh;n%Qj|wwU45Z)->UjXy3+`Dx(b_I|M@UGuhV?w6L| z#?nAAuJ@GZIfoiFzj=?$ERNx`hT;io^#dKklGgXlr()tCJ+UaQ!Zi zfd_P#-a43H5`J?35010)ET%p!JhL~?-^0%DkJMJ*ca8q)*E20#<8RH{bNf51p&8xv zZrw?p_%Ly!&WxWIyl>oO#;z`1L?#c9nI-=sd3Ul`Qf%;dSufJs-8~R~WLmKA_O`?3 zPAj_Ea?Xm)`IlSI8vk?or%6*r=*+x3RJgxw?8pr-o_4?a>eKJpBl^28YJRP=x$C|D zH(Fobe>wB`nd^?(9jqU(Hn1PD{82#@i@e1~1)~=FJIwxYdd@^?WWk;Z^$k)kN)BEa z-EGo7Q>W8|dba75;1F}xeo7tp@|46C5y?YZzkGD!+gkHp%|G}+XUc_oCQn|@{`S-i zJ%8(%^somX=6m)zD>`)|pqvHCDE1xH$6zWKcKJPw*D9O)~y^6ICXi;7KZ~IbswH-?q*$kO3BnC?qx|gt{nB5 z`(l&bcb0nZlS+@o>rZ&QZSA2ih0V&d4kd^_lAg(Zu05DrRD5o+OaFn^#S4$R8ho)J zb@*iYtdw%c85!1PF+r^_$F6=N&-nS)RD-t>SHsUtuSkqN^GdYAs8Bdm&?q%SH>_p< zB3sL5_wpyr&VScWFnz-DhPT~@H8d(YxcYYID<3Qqx>W4&Oicb}<5w|@t}d~6a6WHe z*D!c{V>jz(ttRzqzP?|fLxh3#%x05a%w1mRJ~6v^$$wbrr7V+4w|{XgT9#aTyYst6 z?~B7u4_sDM9KYA!-=SomuimGpr;h4*r<^!>c*TzlO7 z+xOGzCwu)fuJ~^nIsZiG=1(48J$15s^IoqLCLcO4ZFS7*@HZZ@KbUkG^W3V|K0(h9 zgX96B$3@>pHgLEmG=5!fD$qCI+2P)iR<*yfJDc`)*yP%gQ;U`v)E<0!TyWdS9!omr zURk&LRN)_kR;QY$7T#@htl5zf?Sp&|#reK4xs&1?9k8{n_`u>if9PKF?r~)8)km&Y zS+NP_@|E!yvf5_*Z}b~tnb&$+qX#p3J!$sy)-fZyKmVeE)xwD){e>;0BUW|t`081~ zx1Gz)3>I%TUFA9|A>S}2tDeKdBffL8FU5WAFn-oHfBn|qG-94a-gJahXA7O%Ab(Up(CV$a(n0VBO zsR=&(z`cGmGcHQuOhFVguug`Dq!tt3j2|IROFOsQbe7|d$*0$!*O_>)xv_76L)Rz2 z8gFnFyMGW`r>Ay%o4cXK(wRN(*)3fWbZpP*4sV9%EdH%XFy;q` zeetHFFA(d(s09^UKDMx#lIYQ>UcXOWgEFp6(slmsNZD=sqBW7C6S2E@e}4-a#xz|Z zbc4s_G|k3=jg!>O&7&ez0r+#&%GxeqPtJ^$Uy(oOtE^}ND+BIH;G3V1#GimwBAro( zM5kkX489XoV$3pB)kcd;L`CSr8W7jnx}+bpei}~NNf9jMi#SUnI6$TWZ5oG$d>}{h z*0ZU~ThB&93p`8{OfyLjcu0Fk0KPd5p%PfO2_b-CLif$!7vJ<2lMkzZJKHHfDqsMm zH=}eH`a7Oda_M4>!EA!@9C!wG92_|a3$@08CU7Jn@VOH^Qu)HLD~;9I0W}C-a%&1} zH!Vz8Awa(q!m5rCQkg*IPNct%AlI9wM*&WpeP`I0)AT%`DQABPs9*r?6VSi$@XoNS zfUVDN1*BN)2$^Y(x?dlRh|<&@v=EaVy4WS;nkm{19(jc_O4!aR16^><5Z+6{B!rj( zB(y#T`{0Q%p{ZgYVt$weCX|NfR*28@Vp7nMpHG9ucNH3*1wJ1>=E$d^i*acmspr7$ z8=w=yl<@6h)CEhpW!lM<@EFSfQV8D&p~u2u9gZcW29nL`5axwf9Z;VjsEzxmM-XH^ z_)ZSW4~9%rpoEmd%k28ZR)GI>F2U>V)*x{ttm7I$ysI{twiY=gz~};2q&H`FD7J)*987{ht}cZJ#Sa(!tzD{0mqF{&@RYL4=y(S=ni}ux+<4e z**%cEvU?yOQxbxYp`J|lfQ3Bm==*8c5kM&vtc1sy&VruClmt)@W)zB&5cqHi$785# z81;2T!N<13D9V253#dhyqKv$#M+nfFns|%S1cr7(F2O)91>+<@WVZp$rfT{P>ZGyX zAT*w4ydJUr=03d4j0&OIh43e$zxeeES-3RxVN3z^q9PE&t#9~)3k>WbW+2@|q;_-<>$d~{txXodUKDH%>0i}R zA1|*}z1NT#^$~{ey?={;qU&RS^Xv|v`04X^`{#4zM5-0^TLC+f>IS!whQiIJ3?hLq zw8+Q^*y1FJBJxC`TY&FZrq`luaB=3hlKN-& zlzPAp_949L=qsj`>@k!MCV`^jt_tiSjhTGH4!k~bkLpRtPMA&&!`E&gU5EbCi>o@& z@FP;1k{@7Pg=`9IUT$6to&69fwiB`|bm~Bme-=RSO%~+DKc)sH&>tKHD($AjHic6E zi++^t#?zcef8)p~cpB`V^q*&ezi)ix*hb-d%uJ_4`;cxJ ztfzB$W)ja~Ro(s9hPFwq_EZZdv<(4MC}YC14*Ye5Cv{OvEMr)8wq<1*77_xMA4A{R zL}tN(u`i4oAVo}`!!IOGm|M(?co?aQ8|8HjA8I; zIR0>H7>~oYwTGAm8`s0n>0+FMjrnzixExy&l8*3PDO&=o(vQ0`oFXXU^KDE?7fR?E zOi2$)b(JN3DB)U9557c*77K@r>3M)NDTOK!6GZY}Q5`spO(XhZSeC=5AR%nW#O(zn zf@Do(!j$+;*+}~RUlfKXJDe`wn34!e_yRst(gjX@^_)S`1C;Sf6n!{`uVABEc+yz4 zNT4&S3D4b9wXiBY<_lHRCou|ONHG#(AB+$YRRBNhfFjY?!s&;9nG!0{2#zr*sK5** z3ReO25LN*(C;$p^6~M4*1WEmhQ2^ej23Uzgq^^nr_z{(GxW~n)gOSllxW~jOpbKq{ zAXAknTm{e_Sp`f%0Z@pm0LH{3$O}bPJrxUJlq{UsD@5v11ss$mRG^7M0X?d~Yb6RQ z;0VX?6rk_33Rr*wpb%F9e8(q(d^v@&fWC?a^i>qlrwZUT9Z!KiwScoi0e!{-N)%L} zsX_tlXsiNOpa3YuDzG1X8$W{_0SuLY2v(muEL*JsR0Eh#3fIAE25PG9hwflVrSSpr z2zJ`=DxxldAI}4?I0jvJ7?}q_IOfj}-cGQgH=yt|U;qjpm1P3ycuGki{y;(%tA--O znNTEiGYmgf3wt7Z1FBZ_p-4c)R{WFxj0JQd(3nOB(FgNoG_d%2{~rOqJAz>oHq}H2 z9OXnf{zDSL5(=ZU!(dSrPX;r@&-lgff3vc2Ta&8jn}6rj^K<3bM90tJ`M;DefZ(SN zbU)NV!u!8Ja762rJSaUaBTb$u=^}?01!R)Yk%MF@5-+LLTcYwkdK@K!ljZUjbWT9I Y-0Axf?k&hm|IJ@~jzRw6t+56E2OvDW)&Kwi literal 7680 zcmeHMS!|S56h8kfWm=#sYmxd>1zK8grlqW6XQnLzVPC{V5^c*A3Wbtdj3zDxE=1I55MGRlYcM35fN&pr3t zbI)D=+wZ?CIJ^J-;&YM`=8IRZC9);UMYoV2ku2wnc#tRUS|X81l99a~ZXyd@b#&z% z`Y?%pfO9?!2mskY4lo=b&qyb|iH3Mv)j=$-0ZxEJ8q?{iY-BgjXca=nxGTJzS=Wd|^eS$_F+_#4~jBDUlsZF5>FA$ZuAs7XBYqO&Y=t&_nE!Nb9CgSjmeH`%fh z`(wK-hv%+`$A#e8E`GH1TM=-yN~5&h$XclDmR#Z+AqRLu-`}vjVRd9_iLXH3z|2|8 zFjav~^@z{MN_@rA&E;6ScJ;c3()r0`VPxr=hEj?+*hfUM97@Z5R+shx`6FRtkjZe| zCY_d2`tL)d)AR%Jr=wHqK>W8Z{Qzugb9hcj+PT8mA)ZPvPeZRvL!Xw0o;@Jl4_8xt zcpKDU^zp;xl-~12kfe7HNSCA>o-!^uJ@kI^52lfGs2_c=2SU3f!8E_it7$=3mZpVW zK23|dhG{yg%b$1zi{6qw*aF_t@0%=HvpE*)43W~!8!r}2z;P>#I4mWXc&y@> z4M11`$7tYBoU~Wu7ieORUT_HX-eN~X?owR{I&O<~Y>I81XGf|k?I=)JPa2@E80zwps)F7>Kw~fqlm!h*0`0B`&BlsMl_4x&2POAJqC)Eg;b|a>N z(^;Tq&WAy-ym{&5vZj@_4=cS(zhfW(VKN;>F3K*{obXN478M%rR^CxE3DT@7Qin@O zsq}8!%p+YvsXX$UZR9cl*vVAhOWF2JZ$WzXj`I&s)%tXs~;J_hjqh9Lv@$P!V2JvDha9=Dy0ZgejS} zDY5wHy@-iKckx9a!olL)s;C0x<%u^QL^e-+W)G0;xG^LddIKg&+p!IMzRy!AM|JlJ z_cB2d$fMQRflu}QfBQb|z`NfNe7~P>t98{clD_Rt@kLHzDvfiWN~0I0(l|@0G)}C? z)km)%le^cC$!AI)OgQySdi8jHc{!#&ZsDfOyDsaf71pD}$^9-*-)2mm2YmDsmZ)p7 zzSmHS7o5c^}c8O63>cc~IGs_VM87)7Y!+xlVhRgY8}pP%q=< zfHpnL0lkTYH8znh2UgP!{K|NHIsCKbKu1b02e+%5t)8;`Zr5}t_ts24x=|{Pv*f1H z`4~p)wrzR%38z~)a%NK|jglq^b8J7Mk81_pu7z7b#;%1n8M_u$&LmiPQSf457SfQrV zj9Z!p*YI-BNly)2`DgdM{_EuxoAcj(DIgV7kNn7E?n!|A73--uZ_8nTlf4wcElwT; zV0+wL%zM!er0n6sRrB`4Jl|}>K-bIbcOlU{Q--j{Cer*D5A5rH?JIWKFQn6-eRxiN zb86p=3Hf_ph5nV757&d{PoZr9Z5%-11dndErLO7dsJ>;wjeP%A`=zXbfegjvALhd$ z!g{=?bjVg|(s$^shL}OjS0K(8HxjPFp*D4{#hCLt^t=r(Tq~f%mZ3K9;bZ?C5Bp~5 zsTd@)0CkI5wS$sAlsWx#qaEt_!{B|#5$TtD^w6w2#PmN9ndvj