From 331e72a262cd2ed4defb889ff3eeefc80452f79f Mon Sep 17 00:00:00 2001 From: James Ahlborn Date: Thu, 10 Jun 2021 00:49:05 +0000 Subject: [PATCH] add unit tests for extended date/time type git-svn-id: https://svn.code.sf.net/p/jackcess/code/jackcess/trunk@1366 f203690c-595d-4dc9-a70b-905162fa7fd2 --- .../com/healthmarketscience/jackcess/Row.java | 6 +- src/test/data/V2019/extDateTestV2019.accdb | Bin 0 -> 557056 bytes .../jackcess/impl/BigIntTest.java | 12 +- .../jackcess/impl/ExtendedDateTest.java | 154 ++++++++++++++++++ .../jackcess/impl/JetFormatTest.java | 3 +- 5 files changed, 163 insertions(+), 12 deletions(-) create mode 100755 src/test/data/V2019/extDateTestV2019.accdb create mode 100644 src/test/java/com/healthmarketscience/jackcess/impl/ExtendedDateTest.java diff --git a/src/main/java/com/healthmarketscience/jackcess/Row.java b/src/main/java/com/healthmarketscience/jackcess/Row.java index 430dfd1..ad60301 100644 --- a/src/main/java/com/healthmarketscience/jackcess/Row.java +++ b/src/main/java/com/healthmarketscience/jackcess/Row.java @@ -102,9 +102,9 @@ public interface Row extends Map /** * Convenience method which gets the value for the row with the given name, - * casting it to a LocalDateTime (DataType SHORT_DATE_TIME). This method - * will only work for Database instances configured for - * {@link DateTimeType#LOCAL_DATE_TIME}. + * casting it to a LocalDateTime (DataType SHORT_DATE_TIME or + * EXT_DATE_TIME). This method will only work for Database instances + * configured for {@link DateTimeType#LOCAL_DATE_TIME}. */ public LocalDateTime getLocalDateTime(String name); diff --git a/src/test/data/V2019/extDateTestV2019.accdb b/src/test/data/V2019/extDateTestV2019.accdb new file mode 100755 index 0000000000000000000000000000000000000000..5a7d1eb0e8dc4bebe137f04b514425a17c920f83 GIT binary patch literal 557056 zcmeF42Vhji*2m}WZhEqtKtK#_=^fGtMZ`1$#1um4AdqAe2&tsdEJOqwPq96FdFoR> zdw&*Co(-wiXGgJjpJKzO0^k44y|a6FvnkS%b2pnkJN3+O=H9(CbMB1LgvhTesB{(7 zxST0zW1Q)!B2WnNNTs!KZpbr}zr15!P4X$?`m=7jWZ$Z5|@`+{D`xOqwY@Nd5y zRQR7sP$F?~EHvSR2`~XBzyz286JP>NfC(@GCcp#^27wSQRulX>ZV70b%Yh*Pd050c z$0EnUXjPmB6JP>NfC(@GCcp%k025#WOn?b60VZ$=2v|h05W)NQ%sFM>pF1qt`(dO{ zj7^B?m~-!ID5u5*l&<+vB1}XH3%=8vYy>p26TqROnB{OvD@0h~7J`)9ke@uHN3cx8 z+as7_*f12O$7m}6gpx-n1n^2~CE0m-?A1aj^FVh2;}Me%LtVWhh?TCcO{p6$ z?KHe0%A~?X0HT{c_G(tj!|KjMPl~F+F49DmsKl#S6p1{B=I5M%y4V^}B_K%(v}bp``PK0ecB#}2tR z(@C?SMAX%%<9zwQxsF)loVe2@q47T^zyz286JP>NfC(@GCcp%k024U+2w1eQBS@4Cm0iJJO?uee#sD6V=EoTP&BwRF7(*RiG_FvHX=r`AnG0xRIt6Zyvqyv}Kl<025#WOn?b60Vco%m;e)C0)III7HzBSPY!~q zK6NGa4zcRTdy1PM46E{B*@q{iepnO>O%5D*qL8zSZkC(03y>bP@`AbhPv-d2!_&)G z*6K$0p9To@7@l6f(fwCR`FPOCf!`Q`jRqx*kp$A;H-;S+1x4uhmt#zz0_NnQFetCV z2mx6i*zw=&7l|=~Wzw`>h1Olnwh29Dn2G55m&o2fnXeZ?a(TsTI+QuBPVThG{Jzc@ zpQwd-dnraOS~gF&pf05y2ui&|mYw3j-lG|72`l2L)gnA`@E}7oacqbaDbrW^s6it+ zaO4@kkYQAVl-pOFv^U8r#n>GWqNfC(@GCcp%kz_Ca` z(|%GG?|4d|*8huhd}Cj0FSK{IzZG$LL{3CV#B<@x!$*ey9Cm+LSy*qMN&jQ9%&apL zU;<2l2`~XBzyz286KD+qIYrT$fX#$yXvUAd4h{iYXQ?6i0Mj}si5#E~9R06NK+bC( zXb}%A5t~*R(sT+q2{g>MW5(7=QZPOmbbVbnVFrPS5{V% zIXSP4@J6-qcx7dl8IGFnnC~i`tA}c!&;O_ ziL10icWS3Qm1UPsFEO0j8%~SLkb>0Y1l^?~GfQP5$VFS8Kfs!ipP4*rbW(nDYSQS@ zsl!t<^G0PP<)@C$9GRb&J$zL104tSECKIDanp?K0OfPF$g{u_Bm7X2Vo<>0eJZ{;p zxh1pn>a$(5tL7H!ss}gntyol&H^7=%QIVNFb#7i^g-kfAiD0>T+0*A{>IHN(5oU7L zbXs>qMA@4NFg-6XFV|HCE;3j|Gr`KH7fv>Ug*OpwwySWmOed^~0A*8AaWX_`6Co<{ z>h%DTO$4YaESo;LFfTW2QH8E^h$moS=G?rwnI$rVPG;wYC7FeJlS^GyCE1x3d6QkG z(~TPH>_3!VL0$ZNR=8YQGxM^I*4DLAAl-L*uAYd~<8O{;^El71%5&=z=y7h`{DaJ% zWv;4HoNuzM-8>$(Ww|J0_S8JD1_vl5s6H9EyHDV$nT3<{DqOSj3eBNCA~{=S z{K8Cs^+qY1eRKr9{YNYF4eecdeOh~!<8VxX2`~XBzyz286JP?ZC1BGY3pcvgjiOj= z!I9472CRkN3ZYSKb~qXcEZ3DlZyy5g;G^1-fEtgACIQcKM71LUqbyPFNxNfC(^xqnm)Hb#^EXt%m)-`p%zBfC(@GCcp%k025#W zOn?b60Vco%j&lN-<~*p!K}ioYwtxDtX*)xjn!IeywEy7<^QQ~N5!?i5x*kV?P=cle zixR9PV1BzGKna0L2vR~Y37GmW2vI_)62g=aP6FCeL6j1t(E+(gqXQD8(E%EJfigNM zkVXgOB8?76kVXeEA1IJU2PDK$f+TcQLMIZ?-V1t?01JhJUL?Rmp|FP%q!+nJFW4*; zD&vL1J`{#r`qCsn%2g=M5J-?_2qZ`|1k!mRg&|=O3DB@m8YYk+4HHO^h6&KHP#PwX z(1rq&(3S)kK@<#D!Vo3Ik^r-ag7HeoRKlqwz)+$fO$q5r7(+rwcqJ<#MG2`Sz?h=o zWF?GN!YL$lh1WZq7grQ1EBB2+&GL$e@3FAnBnMOgJ z65^GRKmrUm3VJI+8j_HUtP7ZO6!ar668bA)00}VeD9BPmwi0qkI0;_4hEOP!ppkG2 zs=%TIs}iKqN;Rm=5ae?Wbi&Ff8L0Kjhet?|51Wu6A4?%2(lBEw=%$43O6Vc@U;<2l2`~XB zzyz286Zk6;(6lvb-FNg>JnR4cmCDFvVFFBm2`~XBzyz286JP>NfC(^xV~jxLF{bY^ zpsr1G+HJ>xo~$AhU;<2l2`~XBzyz286JP>NfC(@GCb0hmc>aI?*>OxJzyz286JP>N zfC(@GCcp%k024S=1n`vd0Ur$qoB|R^J{XCZ(l{uV4f~UbO?xr|PboKj=*9tfjGB*Q zk-(qbsmmoA#b|z$F1cISu}Fq>W&%ur2`~XBzyz286JP>NfC(I51Z>(D&Gi3iyyakw zxg1|ikEYT#?#)wu`sw9+?YzyM`lG21Sr;b21egF5U;<2l2`~XBzyz4U!60DMK5wS~ zPfMfYkB?)PK%@SDc4kH1WLN3*ys{<+0(5sC^*Ls%oE2vROn?b60Vco%m;e)C0!)Aj z_$8oe(e568U-5{;lYy{-&dV*iZHQHh$z}P?f_IugOYW~Y#uVM5v7n?R+5xjA{xIId6dFlUu1pZ z&_vj%F&`7BcTX!h>0Nvhr%A}PP?RIHI3#seIG#zNUF~p;l&`_U{2Hhyn~btzcQGT` zw-RsOLCL;te1-~3gMvF1)sPPS6Olo=EMF-~SBa9%M+vJ@2?h9H4Y?BKp0R$KX#ASu zDGPQxGcrxu`VX0@%G_V3X~=}?eI7EW+APCoWuq*oh{mr;o-DB&+n*>W)nO5`Ef#6W zumU9`v`gf-ax}aOKMJ^DNa6b`^eBK0;tU0nU;evn=O2x@QhtVF8$kt{0M{bRdNiFP zDbH9xN;H0r^dyYE=!}Frl?1*=H8^mG{uv4%m9X~-WIiFrqh_i7Ws1hHah`0j8=jGk zIzMmg|B{p1U(?xm&QpJ9;Uv_i?`xtbL+sUe02xw=(or(sSE?t2lNx1k`=2P0zteoi z`o?W=3d-odvJ7))dEbKrKcTu(pS}<)Q2F{uOwWMlHfN6e#50-5?oV6JVK4Z`4k8Dp-3Se%GBXKV?A9*d|#EG(qenh28=>G z!Wyc}^xq5h2`$BBH05HHEFJ$#)W6deWCPVc_E`1F@B<^`)?_#d znJhsjH{f0XOdahbOr&I>&6CUmin!3TR6*HgmO`5)^$`b4|eivGiK^~eg{Xpvd zl9^9=|6=LiO!pS}eP~6ZDfl5D1L`xMipLMT?<>}$BYq)Tk(~MNloD-0N2D2vgdG;4 zh<<&`zg5r3O*S28?u_-{1mkLcE@I$lp=U&$QiQ@!wn|og!nL8fifVkjJ_?ypOOO>s zx;CA#`avqh)syaJ2mswk`M%;k32MzI=;<0#QtF1n{OP{AuxRNK&`dlG6{q8#2noC2 z)5^UHu5L$*s`km%W;eJZv&PdC)~bh;X<_56$gi zn_7p$~$Yi<*Jvz zc^>2xrakUf^iH$4`#HFkMS=J26HWbDP}pb*LWtG!lj5MrO+|pa6>-`baV~Vn0gYzj z*bt|^R~&QgLp{XBVMD#(AU`w^`S#~01JOTEJlPWZ;-}hWbfTLl*2xIzpIfNmOKf$; z+&Qwq1egF5U;<2l2`~XBzyz286JP?ZBEakaw+a&nVggKn2`~XBzyz286JP>NfC(^x z!%86eVC3dJ7>Vr9TKmo9Yo0f6CRp=c`;&-GJHbwdF#Zmj@#W*#Ca}Cg8feTtwoAd< zGXW;R1egF5U;<2l2`~XBzyz4UffC^U|A7)by5m#-AJ3uBJ-W4I?U(=)U;<2l2`~XB zzyz286JP>N;7}9b{{NvSd}Pz7{y!G;ntNom;M|!26JP>NfC(@GCcp%k025#WOyEcp zuxOXj%7j?nSYPE$>Ert>K@K^X96R6}-WKn*{b+eWIy4cAwb^McSXz3LS8UU%@P8)2 z1egF5U;<2l2`~XBzyz286JP>Iih!oMWdEP?w}^F)Mec7$N+Zsf2`~XBzyz286JP>N zfC(@GCcp%k024Ua1on6SKL(Thcw7C?|66$e|6o@Xr^f`C025#WOn?b60Vco%m;e)C z0!-il2=M&>0l?#^On?b60Vco%m;e)C0!)AjFaajO1db5``#b;N3G@GW+x*Y}+j#!} z7^#0&lL;^ZCcp%k025#WOn?b60Vco%jt>Gn|9^bcGnbMHFaajO1egF5U;<2l2`~XB zzyywO0{c7v-v#skcn9+Q|MA^^xb#eb2`~XBzyz286JP>NfC(@GCU9&J;Q9Y!qn=nx zCcp%k025#WOn?b60Vco%m;e)C0tZ51f9L<5nE%H+$p8F*FhBn<_+SD|fC(@GCcp%k z025#WOn?b60VZ(t5a9X$qo*!d6DGg}m;e)C0!)AjFaajO1egF5U;>AV!2ZtvcgOrc z-VXos|B*cZf2b;q(`5oofC(@GCcp%k025#WOn?b60Vc2?1bF^`KcI0GCcp%k025#W zOn?b60Vco%m;e)C0>>DEKQaHW3C&Zuo|yl~JJK`%-v*u*BR~kx|9eoe!~~cC6JP>N zfC(@GCcp%k025#WOyGzU;Q9X}UInZG6JP>NfC(@GCcp%k025#WOn?b6fkRGUf9L;u zWBwoSP|y5-h|M$qzgG(tQ$&F%7xki8?Av$9i@_N%0Vco%m;e)C0!)AjFaajO1egF5 zU;@n$;Q9Y%;IJ1HU;<2l2`~XBzyz286JP>NfC(^xzX$<~c9orqQh;asJ#+b(-1jM8 zPN1-fK#yZz1i?Fu;#lz#LeBq3st`8v2tXX&!zw+3@m*RB=t~KhW9-#}DTd7_h7iGe z42xV_z&l2`M`5!ERwWP_q7=pl#UdR>2z7Y3al2%|y+F(pwWd%xaH&A(7NfC(@GCcp%k z025#WOyGzT(6n)~|4&K;igk`fjyT6R_O4!e40+Dd4KgbC!Z6H;elW|(NB~8qCbMs+XzlhP07*}fCA`; zC0PHo>Ba+%O#xs9K$>`F{B`32G7gZ&16Dt#0EY2^vO~~g*p%@=KqCW%y_z&0AfpDq zmJ30!UC@s}3V{Qei#cw4f+J&L&{Jf?B4H_P7be2~pjK32d4(ELBxR3o=LC_y8cYwG z`U^zO4Wd9e&X@m8VF0llb8K;T~U_(|M1^8SFZbgvD_M=94IHrLiS$B}F$P&aj z74a*P0)5kj1^Qd@Ml-?x0K9dDDOWz2025#WOn?b60Vco%m;e)C0>>BuO{+)SPle%6Ccp%k025#WOn?b60Vco%m;e(v1OyrmMw-b7BN6ApNaW~A!VBLE*h7=?DD}YZ*hM6(QSeEr$p4#)-whiaC6JkQ=+$TQ%GW`C)x3nD> zUvp`fh(Wewhv-r}``@n)ukHNl)eG~iV&0m?`Po-Inefc}Z~t-SI_oo=vtHf)Vv^%c zdymYA=6_q-wea(vb!}Jwr(wmZqX!iX`f|uur#v5a|G(_*i{Bgl)@$EAe%qznpItCu zbkB8Holzfn+Sct8GXHk!wpR!Jac8&Q_iy{(RntFPx#GhKqep$;E9klhi+k7ZSoHdN zF;S~T)eXsiT$HtDY0y8E?;=2YiH&!dw-rXC1UfxGC%CRd064u zr8o4x=+R%^4q5Gpe7SP|FT-D&dix~_>6X4PU%&E`f~&5+Z{4+>9*d8kTR1bJ{gmim zQun3=-F>#@fw%Hb8};tHXU9F?Y4OU`n@7BI-?p>wUiDj1@8vtD-Tv`=oi4h+{<6#d zc>K3>FE2m;)qgb9Z`z%o?Mc0%JyBaCBG4T(#rpAxF_(+U#=Wy`)zGna_7Lc=Z_k= zApgeFd!y1qr@Y>MhGX?RVRtUpuDzhsSA*_2xnGY@9zXH!XFd-Zw|qsHx6(&ls&!iV z#T92veri|hsMQIlPrL4}@jDjX`RR^7F6%h6Z2T8*hun~xv+>41_C%fazuSsNS#K-c zv;OOkiX8m|$|tSZ_rybQt?M)Lo<|1uuDfu?uHDanEIyyPqJwCt>>?U|Ui|#lKL(!u zeEN{SVw>pL~-s;j!iZqMmj6I>fw{YKG}M`qQuz2(8hJ987??5l*WYsT(#8x8-1E(pvo2|K{?54JJ3ox>*E@aMy1eeA&g+*ovGZ-0 zc3d`O-@mlg7q7jdebK+>J-=t%ZSTGC#5EmU{|(#I?|<_ns?VFh<+i;~Z@TyC-is67 zU-M?lEvH{L@UGuq?b-FAmpbO0+9fh0dgPXSbe5_#@2g>e7+&=$#+MM9Wd#ewCp|ip8fj2uK3}Tk}iYa?f>gt=cT-U zZv4>Q4^A!*?7868ulmpI|9I`hKQ`U*TZh!-3!mDss(t>=BY%G+uTU)7{?RM(Bibd# zWer^Z+p~||RsQ=Omp=94j}9&1tpELJfBo72j9K%qpcCKR)A9Ykoq6HK?UsJ}($v?3 zURhoG+8JFhzc4(`_RnQ$b=_~eb#=#|Ke40_{^85BrtDZ*nwHq-$BW*XpW?cB;tgkH zWNw)B<_#bIZH#lnXHRA?xcR)k-)`T&=7Rffo%+k}|J39y__*uE7f-qB@v<#p+soeD zJ+Dn+T$h>IpXWI){>PKS8&{uLbJdrzW7loFqU+56o3Z7?j6R!pl-+yHmjhQ#TKw3? zi*9yRTh8hA!?0zWSB*U>;qiWB-wo=pZFcYNzdloV-jMO{zEI_uyLZ%%mA{n^xjyog z9;bg&fBV(n{deG6J9U;$IY*w zclDam>t_Bg{x;)(neQ(yO#0W`i|<+bkG-=d z#9zCqr2h*Qoo)-eX2lmL-Z^d1{im(^?tvdSUVY-fdT&X3?x#*GAA9AGYx+j7xxC%8 zU*A4`%(CmYp88wXE$@8#P z{`{_Wv%=yAr_L-1Ss8P;E4#KddB?LKU*9qOjk3R-AiksOnv+;-2FHJ^)Zr=EA~!*4Em;^P05MW=0uS-S7(IZu~=9P;5y z^=Ew^*DfRQs;*CDtXr}1-AnJjxp3$MquvV1|1IJ5TV_68ylZ_@V8&0Ko%P>bQ90tJ zXSa+zf8lH2e(*=nhu=@R{kaa#=r=bEc7AZdj{g6B@8`+)Cv@sNXHb5~V>_M-8L-H5 z<(jN>-rC;dnXk|Pru3z!tV1t4FMNBuf8P{wf5H_Z0naz=TD9`QrMC`x;r+9#PW$E7 zUN4_{^Dhm3a^Ic%(~^5%y)<}T)#|(YJ#=~5KgZoV;FarB&VB0RhJ=n6KfmzjJ1%{4 zYJUH~r*~i1>HS9*emOI1*Q&p-eE7MpD;8c?^XBt`0k!tJdfUr;9*cPFtUaUtd&|}n z9-G-NJn6Y%58g2LziY=nll?{a&v*2E?z%x2JhA444`09arssaU@yZW3cHa16hj#ar zC2gz^u0Lt)v|Bsevhdw?mzCe}Rm`dZ)1LY0@9SR7+xcVd;_ob(9iLBHG^JzosBzm8 z2Todl&I8k~p7&0{q)&e=e&}`kXSem*{#l#R$*xQBt_Xc}$gDm^<#R6i`+Do1hezhF zdEtfM*LNO!$%F~nbJxH6L?E&5wM1lk>&*&b|1Wx(^0re|cK@du9Kd zu(DuO$C#@4$vdWA*Klu_$LG91ApG&{h-I9 zWAdBpVkUq6(LYzOzwxst9)7EA)yRK$xc`&u({8MJapISkz4G1{AKv)gySHw+e9fgj zyX?N?KZ_o^?v`GKSB5i=X`R-5>W}J@%=KD@xi#Z3zFp@XHlb&U`!U&IP^h`R2 z*lkkkr6XTC^}(IBD?`V1+X**i zIPyH}lHz{vMD3hA^?^3GFFL1P`{8vzM?L*apYYr6UuM7HwYG7QZ652^yM~)b5$Sx zZ~WPphx~lPKkwMv#h5iuKe$kt2>9S+V^C)<<_06-(03?mpl3yofS>o>NtM;EnIRYzyz286JP>N zfC(@GCcp%k025#WN0flKodHd+-5Vy7#Q*qsS z;{K$VSz;Vs$)XEZ#JA(Q=DTd#33k>0_bsJ-*xJ{TzaLWsmN&?S83rCxO0%*|fC(@G zCcp%k025#WOn?b60VZ(J3D`7ill^}ooCiHWPVn#&kp2JVuKfJz*?B<~Q}gELb*h*; zx1Pp=cue5%Rt4wA1egF5U;<2l2`~XBzyz286F8y-c>e#0;y>h>^ZfrIN6Z;80Vco% zm;e)C0!)AjFaajO1da&;7Hx`LI`_l$&CqV1Yc+&*2`N#d9O-WJ?B=ID zG?`R@+|AFNIf7D*K)j6o|BM(m5p8VpS1i)7Ra`MPjH|4z z1hsSEN{?PdVk0@)X08}p$<@ga!FVuZDdH6i+Gx+x?524(U`;f%@ocmgAhc$p1t88) zBhK0Klk!0vThmzuB2JQ593tXAd^Xu5KWY=QU3mOtaPp&Cl{M?*rxS{9M1;2K>(Izm z5yTdc(9ViCZ@A~K5f+#L6JP>NfC(@GCcp%k025#W2Sh;AG`mV5$Y=jQ<<6f>fC(@G zCcp%k025#WOn?b60VZ(#5J)~4MRgvGL=IrHJ5ToBYwCI2|CDr45;-V4?(Kgfnl>~f z)+qG}SpPrS@t*w_dy&1T{nLnhBdQ{t5$}cH8NM*QZ}_KSE5c3=3kw>+#Cv*AhEo0Ql0d`4frq)@5C0vK2aq&T8xDKU(e)=^ALD>lBMMg!;CmQw##H3lz!1NMeqdB2q<)m;>uSb3s+2se&|Xp`a%s z(QqLe@F5SkX(GO*$hEL*MXixhx-`}-fPtp2bq?5OV0~;ak~dva_`bPPNE=;G;zh~# z6i(3zkv!2B2Z>Fa3%sIHU_IIdaHQK-MF;*719*KDpN|FU`AtACqP8H=yq>$=V z7NR#AKo?(5Drfacfnx=gn-r(o>CjXZg_Z&)O!)~ zD@BFXwKi83oeYJuQDH9Bf4Ntgn^jsx4?y&Zh*pgxYW{rg)Z5LFQ7cS}6D(&_xXymn zCC^i`UH3h;ETwRyG%XA8?-NM+xm)dSDTKDwrxpcN=c>7V$WDfAB0YVBc z@o89+pJGuq`q}GK=_f8dTb{kD6cn&ESNph*Jb(@*Yx`iS(zF++#PB@9X&krp>7F=P0ML80=VolH$`66H?NKo8JhLJ|Xqw z?y195Q-%&7kvepQ{)YS5w3EA!NF0$gEHNczc-rt`!_(NQ&v*8a1`o(|pr9Uq&R5IaZ&+idnU5o)n(ZDL~+lf;=l z;s?j}i0vWLM$VdATIs41i)&})FRh)L8#y&8ahA0>esG;AFYJ+g%d1P$O0C zE5%%)IV{MtZPW^Dku%Z~wyoeQy208-ffNQKr5<7g-f8GG&ob^@=i#oJ9z}E_{Ziuw z-HG1B5_CwCL_dT}1FQ{AsLx^0 zAqO#z=lc;qny@(4(A_#THm2FWl)RwtJtL&jq4Ap;@kJxr1t0X<`(Bfb9| zIe&c2dvMK??5a?jS-AK1?9CMi@{fcaRDQHI9tEdk~Av?#OGy7oq+7v9vSLW4?q>Mcg?&O+&Eh+-=AoC=*2 z;X=a$^3=qcN%3(?LFXQ_^kZZjsD~T1Mo$YcmxLbD4Mp!L+@c9PJ|ppN134P+_7-~D zRDVR2{_B?r-EIH>Yu?$*Z$(ae6m{P|O$$c;`=2(){HqXHf_Bj$+eWw+Dy-V|z37WY z1lm%Hii&G%t+pwtDZ4+46ahB;xWpwreU>36#0M=m#H7R}5UsZCf})2Wj1)GCl5|fG zLmGB3q!63>ag1x56^V19R{rQ+J~vXJ@oO5*-8V)WNWVt=^rotxBpoakQ#dsoiE$4t zFG9`#%hH(sS!}_P&g2F>dG0Hi0axlSrFfrgpLrRNx+mwd^-{_O%jixJ3g2I z6JP>NfC(@GCcp%k025#WOklqV*tGYQkp}lrf&AtkCXho7?lA}X%{{sxM<3k75OR3IJmt}3f=&7EB8sw&alUCFlBeudK{6!%@!rYs>RprE~RA(vCn|K7DRpeOXCfw(clr z{bmctOi%QLCei0RH!4gv&I zV$ft}Ube2BG+hW=o+P8nv4^nbxzkH!EG(zl5EMwyH|eGh;mfmTyRu|RIW7@JWpby~ zo@&SKR6AFOlg18F?h@z&7|RD(p~V2JIkvQuXhT`ccsx*X6r66X0ux{YOn?b60Vco% zm;e(vstH)MKWHHj@dw^&k2l)LkGd4*BZv0TqkfHX3`Y>W9iBbo%-ie1Za`0rk|7UT zFoF)7zEhut1`MPJebTW)gi#ECd;7_x8t?6A!x+O@F&WF4q$63{PtLOgpWVF|Up5{q zs)mo+e-97iL2WvCXE~h%|7QYBfC(@GCcp%k025#WOn?b6f#ZRIrgf&ZK;>aI_Wx7g z`I8AS0Vco%m;e)C0!)AjFaajO1egF5FcEN?FaajO1egF5U;<2l2`~XBzyyvz0%SB!E6j~Hiaz$<$1V47xGMcRNBXKg z>;Lu~IlngCapJq!0n-Q~t?{-)Ax$OdWy*IkY zjkIB%Z>rQG9)mYohkNq=Dm}lp5=d=g&0-aQ;q{9V)URVHmz@iXT}3W*TzZEreJ=OSSCbq zLMxMK*C>fCq{Sj3e!jFv>$IRwzqb}L32bJ1=f-ZWOQLO~BqR%T_CZ*wQWoa)FqK4NHAj6NtpNy0jf`DZ=Vo)Y6u?G&WR>?QAK&%WGp+8gufj zIB*UIWw2NxmK$j5&jOHYbnF62oVZBL_@)uBQ%I1KtR)$U{?XQt^l8&~91g?=t2NkE zRxbgsa6oAIU;<2l2`~XBzyz286JP>NfC(@GBEZl8b30%HOn?b60Vco%m;e)C0!)Aj zFaaje0)gZf{9EPiRG}J_upggJ6{kT7t^Cxqg^rVquvYP|<6pU}-0K0hG6@dG1egF5 zU;<2l2`~XBzyz286JP>NfC;pQ06n&^+tH_qdKjA5!Q8w;+SSuC23g^|xO$)HA{y(K@J}fp`g@BJ^nE>rDkLo{J zkbuT=vfS$)k8PZ+TF$XtI@X;DFaajO1egF5U;<2l2`~XBzyw-Lz@phBDC}404$@QS zVUX#qo<1i(I*jN4X*@!99Fq|QZwg9l0MMbLk}My`CqW4Br|yr=wE)ad|925%@eF+x z24bp38de0L=lkc$)fbn_)g*ma2k7qg?7tJsFDymOV&OEU6X_L()(2?3rU0!Ipf$fv zK(fHI{rb@$KU!W}z?v*j3jOe`EkIR9H7r*Ypan9UUt2&%S8Ec;mf^GRfWD4{3??iT zfQFQeH1#zJ(lLzH8m?1BHr7^Hib1d(uwR6g7YalrXf_p>*66HlF-|S5y}$<(U;<2l z2`~XBzyz286JP>N;J7BBX>Yh!`nQR7jzx|*$2V@5;~EVYo(V7kCcp%k025#WOn?b6 z0Vco%{t5&RifKDdhad29PziEI_y!~o>uD!ec zXK5dxhv5HAfC(@GCcp%k025#WOn?b60VZ%v5%4@2PBzSg950rfo4gO&dL}YV$*e? zJSl=Y$k5ua8kDs(@5ZO9uqFcAv?tyDf0eHK#Pk1=&g2GIiSt4LipjC|X*~a*BA@?9 z8%PN?76M3-3jv@xrC5}URS7mF1Sla;2|*;F#ij%+flhQjm;e)C0!)AjFaajO1egF5 zU;<3wXeYq^|D(Nz4opAlrBk6vjyZsm`N|D`u3~i;zZa)UZQe?Lu!)Ph8 z+mFGw6xr=ZPhao$V<0dkgi^-vVG4~3^1%d{025#WOn?b60Vco%m;e)C0!KRmi&iP^ z`!B>yuv+1bYz)X;zE z+()%b4}%yh_xY00%Ri|VtL?S4hTkOc%oT-V0Voz>g+*SUkLrmJCcp%k025#WOn?b6 z0Vco%n82YV!0Z1VO1hjj6JP>NfC(@GCcp%k025#WOn?a-c>-$M`am>kIFQIHZn6>% zNfC(@GCUDpY=<6RU1A6+T z)g5WLLtiYA)^`kr5j?H#SY^{ru&e&RuZAiKUw8g~>=2-*^ihu)$BxFVDHC7;?*wcuh5WqhBG$e|VZXni>2$b>}!-c7FaCl}|_q}73Wsl63?42xVu(Ck6$ z_<66c7c3@;rJ@=u#O>Rsa^+7Zzyz286JP>NfC(@GCcp%k025#WOkjTqXqwCY%)dpf zb1ZUy+n>}p4ijJkOn?b60Vco%m;e)C0!)AjFaaje3;|~|ey#S}pF~2m?;TlFQnDx$ z%=y3E>dZJG6JP>NfC(^xzZik+iSfdTRdgCe7m02u7o!6H%;#Uyamk z0zRvxwO|cgsgCmTNm>>_Bhp>f4QUr6roycdxe{~Ixze5cU~r^5EfQtOuLe0(LZ(<$ z$2n4)48$o0c^6{$Hnjn#m?%@Ml6p~%>Rj~Qf>WShHA0snEvmKNQb%G^2M*PyQl~<{ zQsnEBZ2LA5j!H;+)k6!NXD6SK*~q05{pe1kN8rHqI#kB?g^JKYp@8Z79gcl;lC6i z>Q{n#CjE+KNr-7Jh^lL4D*Wb29q1}qf>h}0 zrN=0f@#f(>wI#ax5{YUVhOU;>zMOEUGo%1l40S~&pL&F%8uVNhn!0|eHaN|#lU|d> z@;s*V8ow0>q**89%IUdM(lwoa9jKmS8u?O-a-mG~MgK;A^b26VK6|b{T^fZ|ZH}(R zOHn7j*ZO>er0#FW6_>8C3()@PH)NAWKl(5j#}O_xY&4EPDGO{YZj*-J_k;YVtP9OHz~nyA z9bQ-mLB1GaEZVOTGJ7l%NA~|Hjr(n0|1T#15dx&yzI4t;FnSxoDG9UOhSJgxa@Ln5 zq&8wa7eHQS^Z&h?e3HN-6Cn>3-H2gr^uWMgO(tcN4<&df73{v+wh?1+y`wXt66ceC zSJU)!2IojMH9T(6)Sm@K&ee-0E|4534zzA60^F^LGeO0XpB^^&x(^4r;*6lfTn8pU zf+#ZG<(h-@Bo?h>46d5x+KPJ?ec!ldBrO2-{#68sZI0?sp? zf}S;{%?A@;0!)AjFaajO1egF5U;<2l3H-GQXxbZgRYIGz|BrKg<91O#{K*8E025#W zOn?b60Vco%m;e)C0!-kTB_QWi4^aDt1B@@DCm+E?H0=S0H2#MUns}O@{y!LX!D%o7 zCcp%k025#WOn?b60Vco%m;e(v*aQNk$viy{QUOzU8q;X%X$KW19uJPR!9!K_kVRM8 z|4;S*eN{8t|NHv!_hW+q?f-{Hk#lTl%UUu4Ccp%k025#WOn?b60Vco%n82YT!2SP2 zMfT`Om;3)mM?J6>On?b60Vco%m;e)C0!)AjFo7dYz@pX4r~Ox9lGwa1o$tdDIkaG- zzO1A4nuuv-yv>JPk56}y>+u;$7z_1bMMS*(cv!H0p2eSs6-)bBeLUJ=^+s9(n3m6_ z1uJO*&KURdqU5?nek;fFo)uX1&$INX?w60HD~r5B&|!RxAk!3i$?x z2Ki~mXj;Ng`uWqJ7vVGT@dp!N0!)AjFaajO1egF5U;<2l2^=~Cn%3F<%)ixG|L@S{ z#wjxaCcp%k025#WOn?b60Vco%m;e(vHVFhDn`*nYwrNg#p8FdMOn?b60Vco%m;e)C z0!)AjFaajO1em~Ik$^?}ErQCm7uNb_!*#=W-(BRKAlTvu$@K-L*JRlL<840vy#2q8 za`f2$TaDE4paFSU;icRE>mKq61oE)K!zLdL&^?0b(FF1cfJcDIBOD&#1oQAn!6Z>7%J5k!qQyjfmf&3@zZc`EdgqpieP4T_8WH zeC}f(4*FuV$y)MPMzBB{R=oMa12;Dom;e)C0!)AjFaajO1egF5U;=-60-Cl)KL1Yz z4KVEgzp<}%yZz+>Z~>VB6JP>NfC(@GCcp%k025#WOyDRckbD&Dc5JCe_WzTPEtOeY zCcp%k025#WOn?b60Vco%m;e)C0!-jf60m63%enqpE!qDEz&s$pllU~)|KlyK>vdQ2 z(*8oohXMSp`7dL5Z2m3o2MuHle{23r4{7}GWx>B!>jJy`0>cu&&W|;JjF&%I+LyaG z4QPJZ{|=^20lecyOACH_9-v-SBhRJyUkm^iz_8+tCll~L0B^Rg_p}z4m;e)C0!)Aj zFaajO1egF5U;<3wNE6Vsac*1xK$HD{q1*LHYsmRC0Vco%m;e)C0!)AjFaajO1egF5 zU;+n9z@p8R>;K(g(bxYAL4x#lPsErYWctZBA7g^@G!3nI9LShN!j3`uM4QG3ifI; zhG$(s%fI#9`yk+WkuJhT1{UcnhGBq9#9`sSbQl!Sl6_;u5`0Fxzvsxs`zqjDZgSN_ zOC2hZYyZa?TpI+B*i6NjN zfC(@GCcp%k025#WOn?a-Z3G$)hC;~)BN6ApNCaufS=0kcD{_Al(X_K1SyNK7C}%w0 z|FZtN(s4kVaAYRH1egF5IBW#6C&r6dKrV<7=Nm4s~`_LFH*+P4w>IP5+q7Y$fkwTon&q}BU6RXMcdySx+oG?vl5M7XZ z4t6;mFPtI|`OvPYOCe_?7Z<+ug(mayS%J3;?iq#=l~d|bDb1#6O_o}O(^IFor7#Gh zy;5uOE=uU|qkhN?w*sU~B^Fi1sUpx0L&xD?7dCD#JHiELkxqorN_@fii_kbI~zZPa@<+TD0}yK%ZxO-I^AXj#;PsJ-Yr z_SPcb39_Bk!H;(0bxH%WD!CR<4Z=|?B(pryvH%)U2-W&XyBIMQZiUE|%1t^~x^o{4 zj>NVIYy3xv$xcd znACwowW-vp(2w>Kc1gB5$@vTGY z^^mnNWb}l}fFH&1`1UpVroy)rzICX(N|dV#uX1_isDVbkO(DJgh_BjPncBN2zkFGP zMM#wlEp;8a)LAvkU@n=u3f9V& zPz>LEFk^cZ42=t&B&yb3_(4uit3TBzbeH}M$6OdPSyMrgepd@ zv^SNET7+t|-HkHRc{W9|p{p&i%ROUMs~Q zpIH4{h()_&S0JXo>$U#dQ-!=ezdN+cbr&%XWvCUoxW1R5o=LxASrTGe3!>`RAQgV| zqz?2uP=b`{>ZQjhlkw)^JGCYHeIXLnG7MdRXeVwb-02J{z!igZplb;E)I+8k^jsC1 zx_+rPIL)n-UX!#dIOSK2tM!3t*2%bXdajgoO{d>Ks;8JnzSN>zD93!!zmXsP0+_GQ zo~uunMqyQ(qigX})QRu4KHngz`_mrh^sBr8?T>y#HfeP8px--$3k`PN_`?wnfvm8} zo7`!qb|qWgVKf`9=SD{x++76V)+1Jo5QD`~d{V4HQ%EvArxZejW(g(h7uDLE)55+aq*MhR_|5UqrEN@%Zy6CqHZ zT8u|ctrPi@B3TJyVudQ*Z7qX|}Yp44*^w5hNcPh&3OHNpZsy;zk-yi9<)YJx2~BHIlE$41apx-kPe#Blhi0 z8WNW{BrZN_s535pWa3c78f*l2PRRCEI#_p*2|!Hn_2=)$4}qnYGw`&yq>w+8wtY_hK(4Ss9NLjxDj#j35i3Kh7BKq*7)SLOQwvz8k3CH7#|xS z=ZuS`))*H**a+N2Yg7p!dv1-#PvdJ;Qm@t+WL{>qQP8FxWGfunw7-`R{c!Kw>&&RC zf>48do6*L}P((ksLNs#{#3m)UeQ^>@#?f7!1c_cJfzK5=#qSka#Yd)m4gkXOdMvS= zE@r7Ka*%xH&)v*O@V*i^zAq4Qsu3o5HNsZk7sv!apIhPa+5}NlK%Zrp*! z$rd+k2<|{>Ccx`ZEsg@igIk;zo#X3^SBtZ0Y2m8>?}Nc1GDHruKzsc7%?k2~iqV-6 zH9X^qY9#L+HP|O=Qet9A;!yoc)A!^XUt8z@+aU3;`jTK=6On?b60Vco%m;e)C0!-lO zCD2U&-%xsg`u*LG-U1(Inl-#+93k>^)3!|^8@FtIp1zRF3omYbaeK(Nty?y4dST=9 zA)9C!KOB3|^$%zv>eekA^)x6g@2Hj*qQ10wTT@Z3Ek&i=^s@Nos`-h!W#e{tSt(`{ zQH4*`&0DvIY~A9C+DuskeWGsN{9?!p+g^0%+Dz17pQtZw+Z?iO`!=7bFK(CB<4rgS zi!IL5?S_uC2F=A~0!)AjFaajO1egF5U;<2FzX{m1mm->&{}&cpaHKQ20Z&%!ck&$Z z2oqS|AQ$hSB}kwdeT@V>k}}Ie0=kg1tR!GA8Fm5?U>Q6sfCN0^J1dX`3;@9n00K66 zn57Jf1RqR*2`~XBzyz286JP>NfC(@GCU8s<(6pBvSc5?xn%K$f{vA`b$I3DRCcp%k z025#WOn?b60Vco%m;e)y1Oh}KeD=eeR`{nU`PD+CF<5$06J0f}M6R_1AFS~Btz(g+ z$T7ijvZKG_A^Sh<7ulEDt@iID-iz20@n}SH#Gr_nh+D%i2|qJ@LHLhhAB1fWdm=0? zEH5j)LthSgGUU#Xt3sS15h1??pA%did|L2lL9YeP3K}1j6tp4m z?!apTy9YV~{|HzWP!ljG;0xR9wr6ao+J@VD+3vMoXFcBP|SRanHDK!yf!*a~DVwOY9Z0t0x6EutJ1>Y`Q~d9xyDlk>?=~|pbz0RA zE3>SR#9zO5+Q*eQZXbTOv?3wgO75$(_vSRvh`8!#Ky|$PKRAN%GO7@j*XSm zoesNll&z0)of|8sI~{iAC|e)px;9o$cRK9KQMNwH(bG{rCxq^F*p;JfeU$6bSUKJ4 zuq#K|`Y1;~Wdmb-s#eWDd<>oV6!Eu+b`h3{@4}aa7l%&_ ze>ZGX*dt-1!v=(P2)jA-;?UDWZK1nD-Vd1^qU3GsIqc8oOcH3nNhZM^Qi7o;Dl$re3es9hgmtw)<-#d zXwlr0gucq@Fe|6BHIbXzSUKf%n3Yr6nv|Q=SUKf%n3Yr6nv~0HtekQ>%*v^3P0G<6 znopZkPKQ}Jm90rRj0X4)Kk810ebA4x71*`Wq#U~bzRKxNhg~_!)~CmYPMoiDC`Z})C`U8Q zKFX2PVOK6h``(c?C55ghH2(QAee%Hsm;e(v$_daWsnIkCf*oEbU^`#h9=#OX=FZ1e zw943KIarLv=63qF%=)Itw0SOVlB;h}J`wR~1NBbEw#weVli;%iVcTN|*&4*qHzD`L z4woB&(+1eIC9YkDqAiwdm6!L=2K>!)`rQeXH$axoIx=~8B$+o8yw1u>M($KfV$HXfX!$RxSN%QCdBZXtXh+q_td1UIU^a-8XOB_Q2uQATRRL_lpu zJ^|tA%po3c%3g%NH8)0e@D00Bcfcms8gP!i_i@Yp8?H*f&XK-q&-%YTNBd^WnQw&D z;MR4`#mfO^{RApEVsCG^a!dH` zmFX*HBv0<}(>FHkDP0a*uEd(aM1h9W*@3H)C~O-7BWD^ZsI}<6E+!$stUV> z%LSRV2<2-xd=WCxA>~b}Bu9E=TNGr(!(QXU*2W_Tw)KPwjF$3K6xY@cGR+Q>++Mm1 z(HA?m_ZLpobP{%KkHtGq#6ylXWcs8Rg&WYya06Qrt`>S|uz{sTtElCu7VX>8psV!+ zgrRk;N$z0iP1NLW?ZmV*VW3iVF+$RL;8c#ZJv$u_;;qpZ^$2QiekyC)h>bf z!=+gUL5m<#M=9^EDGeSsMv5kC9So8vt}I+5yl@EZhjwSQ*2oK;)2;ZOvM@3D zAMJKCpO30YzUQ+l(k3((lKr%Rrb+_l`%{u9{Ag-E_mxJABU_=-A!!(jmG9L{(+1kr z^~WOGIYy%y@WBL_025#WOn?b60Vco%m;e)C0!+Z00PM1&Xoy5VvN0^V6vLA_=*KU@ zfMtQ~)zg4_6$Wst;nPwGnz+fuNa6yF1{7h`Y=2^S@}p6rmU67cSdvR@63>ZS#1+Wd zj?uV%f38?Gs!k)v^W;z=&EK@Fc56a-3gVr^QaSw9Qo+3A=vq-xcZj#dKgGF_WKlJ( zGGx3_e=*{9$Ni2~jvPlj$0qv)_AEU6|3t)@5hEk^gg+df7akM-UD)kmRbhR@z7Aa< zS{&Lb^p%kNF<`<66JP>NfC(@GCcp%kz@Z~xl}|aC=iBM-yFDf;12Kze6?mAFO#ao~ z;Z)p`r{h+ftP;q6K-qqftqNI+=vGM8kSlTjN=YS)QJ$nG`AI4bQR&Wp9+IT{buv1r z^pntNG18L|8PogfM0cn~NKCi#A*%{9AXoxR3bNGDtzsJMmj$aNcTuxU$x;z(5tYnN zbTbJmPEX)DNV<&eqWDDF< zGJ5UF9hRQPqOm(WYXi{~ut5YD` z07dgswI3Wx#2gel1GYLtMS@6#IY0&^G7?C{D@hs;q`(d*0inn*39czHBglYT8hjHF zdX6#aTOjLV8XB8hvpy!xlu3@>c$5Ls93)qVm)^vvkYs+=h(@ngB&4jQD6&_J=+TPE z-bOr>#BdbVU65|ANJ3dKHp;(iDiE1e!GCfom8!w!+09H$pb-Sk;qbjLgxlx|bis)p_rOd2~(FIP$cm;LcsUWFf z;!ccgKK$!qzB=jW>0r^{6Orc9Rm7$)x_(Y?vNuuD@^A?wV+g&^PO5pGm1K{jf~MeP z8Dm_mV(=^A)}KtkR3P)UP0!kt9>Vd#1egF5U;<2l2`~XBzyz286JP>NfC(@GCcp%k z025#WOn?b60Vco%m;e)C0!)Aj9ODFd{l8AuK^3^8djNXk>WJEe^!xzIv+ly7^v zh~pw@SZEGO3;ucX)|Z}BOZz!}p5)Zyc^-9K3X4g#5Sq#cx zPPx=$4c2wisbs@Gl@{jH7u}<KT|V6sseRJi(;Bf)_6(JeB`a4=>;G}i(A$r4xOD7!JrT?(u^J*=!7>t ziJ&j$I91m6e7I3fQQWEUEi{#YYF;hx+TO=qT~E3jWn2te`ZBg;B24VEkbZ^CgQ)0d zjc*t-*mgoUwe%{riOFVvtX){w>5Ji{}c&q;sVMYK>Y}74lX_<#c_j!&P-0 zNYGNYC3vZYR;eV!loqX3*UD75&67INRk8$W(REIbQ3gMTs?gN+OSQpiZk^PMl5`%^d5zzS1JbOMpR268YP)cy@_tao zDX$FrLb3fD`FTG9LRUeGOR|*@G!Iw4Zy07v0?-swi${~iWO)I8DykD>mvq} zr9Q1gh__q=(-vxkB;PRdrRd>C6k1>~0u51bX!Ns7KNX&zY)Z*NDUlGVgf>cOtAuDJ zv{OQRCCC*ek*5~pQB&(gzNAQ3IDP?xeUhC<0Ft|z-O`y{n*by z_0G)egzGqfTAsa`Edx9Y#vhX9*?HZ5?8Bj|f!FO9a)f}cTTQLo zKMsDH=#Kw1-l*RwnXh>?5>$@cCJcducSR~Q{f0V?`~L))4<^6_4lx1l_H(!2w@XiR zDBSI*IVqZL(eZ>u^?~P zhf9M7(+cy(g2%>oeYB41LFx7z+g%3p{J;J)!T*^66F3+IxS!AceD3FyHFbN8xs#PH zS^Lvs>)g+;1qE7$p8NSQ?!=9prlxns-ut-a{tZ{9U*||)wFlGKWX>vg&c^miS`gi{ zujJ`{p57NvrDBrQ)(*zIvPj+oLi>E*Ehk8@|u{e14{Q#%n);C*cN^Gl`X2Vr_&_4Czf89MTY zb58!YEaSc>dn`X^Q0aG?_FzQTl$5Mq$=!hJnFzwh2NPfdOn?b60Vco%m;e)C0!)Aj z9IXUs*E!m)akQbJ?{FeHKX=#4KJTvmG}#D3gDPVF+S%dynkux4OdMR23~%4z8-GSO zG#WDoZyNUTlIx3WRGTwA-e&C%|z3U%Nz2WiV9V>QTINx6i(FjK= zDBE{^`kqqMkJcCs1^cAoZ9Jq>YK;LAm1jpqu8%gfK1&UJR7$#Lp8vFZg1?&j$7v@- zt8#hklw(Bp?Zx{e)LiM*(*gYazo#}>VggLyzzOjDKhOX3{6EkCS7B{3qA(A4LG$HP zinP8L&;QdE7PI<1|4*xYsM~ge(wbX#|F^{yyEV7zDz@3ym*O@)Fx@PuQ{{b7wP8k@ z{s~Jc1T69;v@l~@8jiH+m#keaLiySaUxW;FNO=>@;Ri-~WLp$u>W;zP*2W_Tw)KPw zjFvLb{{s`x|I0?ESq7oi1ku`cJ@sa%S^6k}?flVDc>Z76&jdF$|IhaS-j{g(#sm&8 z0q!qzf0_Hs++XJYGF=B~k>)aV3~R(pvT!z5nBI^6a{rkV@!maQD|M3lp>K?p-dp>W0WZnNOY*7iv)AJ%sw?d~;`j)zKL_>M ze3g;!j@YRZ1PbW3{6^lV}zN`1V7E4h8fkfG~EC9{Tbo!OrUuJ++*h+JNMYR z$Id-=?y)y%psM<>N9znX_t=dYcb;Y6=eL`~v+O*}uJtOUY>2&eiP>$VM_G7Zg zPR{^nu&2WSu+Q@bYIt;@T=T!DY0ZEAN9Z)+#ICGP(FbqZS+oig_y3#k>#;8rFbHtB zpS%6s?dNVkcl){9&)t6aQiW=u!#vHe?nM3HJMct3EyBkW^*m8ec22ZUo73HsyA!93 z?~--qGfT}0`#vnA=7f3gJkQ*=V)d7psGlku#zE`$8|wmwYTEy|cQ&zcU1bm(*kLmEsnq-h#L;yC_^n*>4Xme8n433VGlZIK+?Nlg6{dB$~8kSMGuq99gmKx~kZ z*Z>uqf&_&{2@*(^SXAs#S%8o#byF5BQr_>}d*OI`s(|a_D z>gzw!-F>L1x3B;3z|jFa&yIIC?*7C3*Jh^Y9(w=U;e&_z4j$_6t{mz)+Sji_T}j@` znbVD+SWSBQ^7`NFzwyzO2wX0G%{?n8eGf@a|3<4buWh+Lc(|{xufHeP36u1=6S`kr z``7Ef6ApwW>?S)C^g?phtfNG@|Hf8^dPx?yf>+ZSG3(^0ZxF>MxMF^ntqw}Nl zqw}Nlqw}Nlqw}+g-cKec4hDgF!9~Zi4X^v5iyn}O9c7mxvmhUx-+IW+=oojD&Oa?m zas$o#gU%l?>iX%ie>@%i@A%8d{<~rB?Z+=h(JsIL-_PH${r`H{|F4J<5(fex00JNY z0w4eaAOHd&(8LJX)(}hWx7YpV)qRco?YVcI%R3omzr9Jn0wUcduhCk+Xm7i)e_&X9 zl;6TcJUaEe!v`NK!uHupKd2P*6Q4M6n& zWjN$tW&I!i->fwErkpq28SV^shC9QZ^W6Dw*SDG7OMWxE%ZqMi*Qht;btW6_*~~88 za(>9wavHT#A!jc(cU*f5HC$y&v3<{eRI9F>xRO0w4eaAOHd& z00JNY0!@yvGapfp_70vfrz90SN*(e+_%=@m?{y)1ap>Ylv{lDmH5cdHQK>tVoNB>9v zNB>9v$9DcYZ0C!f2OFOQ?Kc|z-}L%@+ClA*?DV^|D!WUe9&Glp*~eyI;s5ae zRp642Mz0Q9xFZdh zKdi8Pnt88qo73>Rd(u4Xw)pVxtZeySh0O_wg}3^6=P+H6hrH;n$aT2?JUUc8|IWZ8 zFVDUBS4TKK^7lWiPi?N(1zl*x{;k}P(E3?e>vgmJ5upFyzIQb( zTTKMe|Iz=^|Iz=^|Iz=^|LYIQMGvBjFCoBnfpf9F0Q!IV=+Alx*rM+>WaIrbt4Z6JR0`&hIqW{DHSCeB>7YH;Wz`O(V4$M0+ z@4&o6e%|4k>)SGMz27p?ExKi5qa=pQgx5-0fh=(Utn0AGpRf4)Vw^uOVOjp=xYG`G zXG zA2axDRl|-Xr%~BTh=l*=z3PLga7;96FSOobo)kbyFRi1Pu9jX4wt&w zT0XMaZTSK0|36j5{y+c2!8Z^90T2KI5C8!X009sH0T8$y5m=7>{~JHU{y#sxiT%Ik zrlNN@ojUvQDeKjm$9wa3?A^2p1nyh}(Eri@(f`r^(f`r^S$A+9>kcG~q5rq-cS~=D zSQS!{Ytv`hozzm}V1(beLCBIqBl`cI*aMd&%u^54$Jic<7`=wJ*3?zbEt+g-^R_ zd9NDN23}9Oi~2vQzfr}XQ2dO(RkX|cwDyp$>D#nCT~(FuX?>3Qvg2;V$5)khUU@32 zWkl~W<*4dgkL%WZK%o)km~@xiuyT#Nb2^e8VMO0Ye7$>BkHrn^cvfeKulU+6Wb&Z5&a|td3|c zJEQ;8Ldwpsrk2?;YQB}jYLVp#*T!16-F;DU=Txg%U{-Z|GJT-pp7ckY_U*DO8e?ef?-0_L^nOb9)%;c4Tb1Q!uN=|q%N!3@U7|WQfomQOQ$tw-5)vHqUs8}e6hL`NOgkseq2 z73J8d9ERLUwbgpn{>)j<)^VGEF7a9KN%~m+7;$enp_WeSnqAU4WX~*~_!w5*))U5* zI;6VeJAGIPJ)$$OD%S4KC)L_>dRxm(Oz+I~D!Yy~l?+GhOnP2??ZTBmt6XEci?(LY z%z8xVv%8Y(W%t=xkByB*hTSQZob+`VD&bzt=dqqt@z==4tjqcvb$v_ZHn$5??m$DS zeM^+G-ao05cCT#HRkNNot-5VAjK?v%XLq>AbPiSbd5wPOb)Bt!WByDG)2a{+W96XI zF8DUsD0yB-vC%6o@w_j0LEo(}+30IXT=IErw6y+JQM}zD!x}Ndh-@jd%4JtD9Tmb@ z*EoKKKKP}2o5G}+-N$xc>$l>%TGm-G%7#&UR3la67;HUiROfWj?VFcozW~|sIURj= z%*z}4oQ=g-bWIxT8A_0h(>Ep~>{r$QY>d4c*$=t7{V)z1mCckS4!d%c==&C5%7k0$ zd7^ST3Ckm7+lOR|((R78F4wRBR%%@)XKQiAOHd&00JvT0R9jEhyTO>;s5Y|_&@yrPUinnRBlc8|Jx$3 z$GkuQ1V8`;K%hAhfd9k);s5Y|_&@v~{ty4Zv-$s@HXTbI^CI`w_nY&HkFy2=5C8!X t009sH0T2KI5C8!X0D(1$K&<1J)b{Xar?J&-)@G`0daqM_$+fx{{tp~kpcViC literal 0 HcmV?d00001 diff --git a/src/test/java/com/healthmarketscience/jackcess/impl/BigIntTest.java b/src/test/java/com/healthmarketscience/jackcess/impl/BigIntTest.java index e3ab82d..98689d6 100644 --- a/src/test/java/com/healthmarketscience/jackcess/impl/BigIntTest.java +++ b/src/test/java/com/healthmarketscience/jackcess/impl/BigIntTest.java @@ -79,14 +79,10 @@ public class BigIntTest extends TestCase "num1", lng)); } - Collections.sort(expectedTable, new Comparator>() { - @Override public int compare( - Map r1, - Map r2) { - Long l1 = (Long)r1.get("num1"); - Long l2 = (Long)r2.get("num1"); - return l1.compareTo(l2); - } + Collections.sort(expectedTable, (r1, r2) -> { + Long l1 = (Long)r1.get("num1"); + Long l2 = (Long)r2.get("num1"); + return l1.compareTo(l2); }); Cursor c = t.newCursor().setIndexByName("idx").toIndexCursor(); diff --git a/src/test/java/com/healthmarketscience/jackcess/impl/ExtendedDateTest.java b/src/test/java/com/healthmarketscience/jackcess/impl/ExtendedDateTest.java new file mode 100644 index 0000000..e4de3f0 --- /dev/null +++ b/src/test/java/com/healthmarketscience/jackcess/impl/ExtendedDateTest.java @@ -0,0 +1,154 @@ +/* +Copyright (c) 2021 James Ahlborn + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package com.healthmarketscience.jackcess.impl; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.Map; + +import com.healthmarketscience.jackcess.Column; +import com.healthmarketscience.jackcess.Cursor; +import com.healthmarketscience.jackcess.DataType; +import com.healthmarketscience.jackcess.Database; +import static com.healthmarketscience.jackcess.DatabaseBuilder.*; +import com.healthmarketscience.jackcess.Index; +import com.healthmarketscience.jackcess.Row; +import com.healthmarketscience.jackcess.Table; +import static com.healthmarketscience.jackcess.TestUtil.*; +import static com.healthmarketscience.jackcess.impl.JetFormatTest.*; +import junit.framework.TestCase; +import org.junit.Assert; + +/** + * + * @author James Ahlborn + */ +public class ExtendedDateTest extends TestCase +{ + + public ExtendedDateTest(String name) throws Exception { + super(name); + } + + public void testReadExtendedDate() throws Exception { + + DateTimeFormatter dtfNoTime = DateTimeFormatter.ofPattern("M/d/yyy"); + DateTimeFormatter dtfFull = DateTimeFormatter.ofPattern("M/d/yyy h:mm:ss.SSSSSSS a"); + + for (final TestDB testDB : TestDB.getSupportedForBasename(Basename.EXT_DATE)) { + + Database db = openMem(testDB); + + Table t = db.getTable("Table1"); + for(Row r : t) { + LocalDateTime ldt = r.getLocalDateTime("DateExt"); + String str = r.getString("DateExtStr"); + + if(ldt != null) { + String str1 = dtfNoTime.format(ldt); + String str2 = dtfFull.format(ldt); + + Assert.assertTrue(str1.equals(str) || str2.equals(str)); + } else { + Assert.assertNull(str); + } + + } + + Index idx = t.getIndex("DateExtAsc"); + IndexCodesTest.checkIndexEntries(testDB, t, idx); + idx = t.getIndex("DateExtDesc"); + IndexCodesTest.checkIndexEntries(testDB, t, idx); + + db.close(); + } + } + + public void testWriteExtendedDate() throws Exception { + + for (final Database.FileFormat fileFormat : SUPPORTED_FILEFORMATS) { + JetFormat format = DatabaseImpl.getFileFormatDetails(fileFormat) + .getFormat(); + + if(!format.isSupportedDataType(DataType.EXT_DATE_TIME)) { + continue; + } + + Database db = create(fileFormat); + + Table t = newTable("Test") + .addColumn(newColumn("id", DataType.LONG) + .setAutoNumber(true)) + .addColumn(newColumn("data1", DataType.TEXT)) + .addColumn(newColumn("extDate", DataType.EXT_DATE_TIME)) + .addIndex(newIndex("idxAsc").addColumns("extDate")) + .addIndex(newIndex("idxDesc").addColumns(false, "extDate")) + .toTable(db); + + Object[] ldts = { + LocalDate.of(2020,6,17), + LocalDate.of(2021,6,14), + LocalDateTime.of(2021,6,14,12,45), + LocalDateTime.of(2021,6,14,1,45), + LocalDateTime.of(2021,6,14,22,45,12,345678900), + LocalDateTime.of(1765,6,14,12,45), + LocalDateTime.of(100,6,14,12,45,00,123456700), + LocalDateTime.of(1265,6,14,12,45) + }; + + List> expectedTable = + new ArrayList>(); + + int idx = 1; + for(Object ldt : ldts) { + t.addRow(Column.AUTO_NUMBER, "" + ldt, ldt); + + LocalDateTime realLdt = (LocalDateTime)ColumnImpl.toInternalValue( + DataType.EXT_DATE_TIME, ldt, (DatabaseImpl)db); + + expectedTable.add(createExpectedRow( + "id", idx++, + "data1", "" + ldt, + "extDate", realLdt)); + } + + Comparator> comp = (r1, r2) -> { + LocalDateTime l1 = (LocalDateTime)r1.get("extDate"); + LocalDateTime l2 = (LocalDateTime)r2.get("extDate"); + return l1.compareTo(l2); + }; + Collections.sort(expectedTable, comp); + + Cursor c = t.newCursor().setIndexByName("idxAsc").toIndexCursor(); + + assertCursor(expectedTable, c); + + Collections.sort(expectedTable, comp.reversed()); + + c = t.newCursor().setIndexByName("idxDesc").toIndexCursor(); + + assertCursor(expectedTable, c); + + db.close(); + } + } +} diff --git a/src/test/java/com/healthmarketscience/jackcess/impl/JetFormatTest.java b/src/test/java/com/healthmarketscience/jackcess/impl/JetFormatTest.java index 19d95f0..6f01bca 100644 --- a/src/test/java/com/healthmarketscience/jackcess/impl/JetFormatTest.java +++ b/src/test/java/com/healthmarketscience/jackcess/impl/JetFormatTest.java @@ -56,7 +56,8 @@ public class JetFormatTest extends TestCase { BLOB("testOle"), CALC_FIELD("calcFieldTest"), BINARY_INDEX("binIdxTest"), - OLD_DATES("oldDates"); + OLD_DATES("oldDates"), + EXT_DATE("extDateTest"); private final String _basename; -- 2.39.5