From 0ee1e52ac100cbc30f91d9e5b5e5182e926db0f2 Mon Sep 17 00:00:00 2001 From: "Taro L. Saito" Date: Thu, 28 Mar 2013 17:08:01 +0900 Subject: [PATCH 01/35] Embed libstdc++ into Linux amd64 binary by using my own g++ --- Makefile.common | 2 +- .../native/Linux/amd64/libsnappyjava.so | Bin 44616 -> 221744 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.common b/Makefile.common index 4752247..0e022c6 100755 --- a/Makefile.common +++ b/Makefile.common @@ -68,7 +68,7 @@ Linux-i386_SNAPPY_FLAGS:= Linux-amd64_CXX := $(CROSS_PREFIX)g++ Linux-amd64_STRIP := $(CROSS_PREFIX)strip Linux-amd64_CXXFLAGS := -include lib/inc_linux/jni_md.h -I$(JAVA_HOME)/include -O2 -fPIC -fvisibility=hidden -m64 -Linux-amd64_LINKFLAGS := -shared -static-libgcc #-static-libstdc++ +Linux-amd64_LINKFLAGS := -shared -static-libgcc -static-libstdc++ Linux-amd64_LIBNAME := libsnappyjava.so Linux-amd64_SNAPPY_FLAGS := diff --git a/src/main/resources/org/xerial/snappy/native/Linux/amd64/libsnappyjava.so b/src/main/resources/org/xerial/snappy/native/Linux/amd64/libsnappyjava.so index 62f164c59fd9d130a5f566479b54490597d2929d..20cf560482859a1f81f633687b74f2a4a4311615 100755 GIT binary patch literal 221744 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%0D5k!sVvjcss zn|p9=22p-sD`2)>M^fYosi4wV(GSCLySOSh0NdcG2~ZxUqpTS-wVW2Q^g#g`Z0f~W8kwDQnS1~`3@~E)AGmo}H@FrP!vX|~d?CKwg zSW#bqQkwweiO=w92|DKq3^lwW5(-_~0)bs#2n1he*e3|#OO85@2tYA>9$Wy5Ji8oJ zZ}I6iN5n!6`P|qu`0Oc3z`D&mo(}m`sD0^sCXwn4qQkVA-*I*T$Dg)EA(!K26ee-<-pRM5iOFRRgtX6!Nb|bbK6ra7 z784dnzOW5m6%VNciJLJMHjp>~B{us)e#~0UgjddmAe&OYw}d~(>(7pf;w>YepB&=@ z-Y^S1GdIY*GRQWB0L|6A&>U2lituVvJf3_jXTd1Ujl>7EH_t_jywJ>Wh1^jF?iTH~ zKX;G5ZGY|&aKG3w{HcWCUF|&V)uSBbUnFy2kV2843PpYzD3S^p8_%4MAwELk z0#TmW4wNE>GT-@rr@EP!{aVubf5(aQmoBy=wAPg>FM#&7(xq;+5x z-%Rg^mWJPtJGJrb_My3_fpdZP1vaeog`Nm5+=7s>{xMp0`AL@c^yef)ls7z zW9bseSMMrBXuZOk_Sx)3cAv&k@*+jb4jRd7g6(yr^fH8pw+I^4x}pMy;j{1fax3AI(5P6vTi`RqBw; z8Gv_kjPEXysWM{Gc)Qp!Xb;D>CfB;}R~o$e}Nf+ zeo$I`TNkf%m(Mgg$tlbg+Vu?;Q@>J0B5|QP3z;zyAuF!XoLi(xbQN=mW&Gk02_?-< zcCwsJu{^KS+tk=QeC96rcl0dRk?#%Oc30pZG@m*1Wc+*8tm741l;p(Z;aO!_a|oKn zl^zt^k3C@02|7b@z;N%_@51X+rHMw)JKbEv1Lg#Zw0EKxKSnct+@&{bV?QG}pJ{+q zp5JLCn`ycJXz1GYLkEg~FuHmo06Cdj%+(MZ?*dithXPbQdm&$-8;zD__K>?!u73gm z4ul&wQI5nEZ|%jDUM(-rq%mr&BBho%%gkN{C|RLjk3c$uRdL0RVVON3D}p{=fefB^ zBj-Y+CrfG48RcZ@CAEk@**04iYno+@*@VMc}P-@uHc|0CL~%#aX+l==vZJ34I7 zwT^hEqe{smH<=PQ$xPqS4=mufgcqe6P_o!i<;v_9yjZ@`*fZXWV%Sn&q4)UiKa5hX zaU|6kfI<`1)G})9keF1Jd}<~G5OuZ=T{llbW|znkH8pb3Q&c)UU$ciSouU8)^7zb+ z<{6Bphw!C>I492JRNhT0KZi()!q*;2$UQzbiby1BE5KDZ&f{%^!G1KWnK(3%T#Vuz7_|)&N8d2S_0M#Vc5NS&xX*FOoX87(9n59a~{e z3$=td{J{QSH#KgU5gXam`1SCa!}0IvSwjT^aQsm6`xVfkuTzl@wknRJfP43j;!rkB zja6gN47g)sUQcdA0!e!36Ck;0DSVhv{Hq>}dJ`AMAkyLN;kd$j83j#fj`A(BV)@5= zLt)ou`}3n6tTpFV002Ezvi*rHSIPc6 z?+ghwFC?Pza2F@Ao#BwBDV{wkx?Mbb1{QDGA$Y6$j;q7(49^V4zlUVX@b8d}A>u@U z!`CCPebfFcgSG%{JX z$bw^hyR*H7H{qg0&P>!%`!S!SXs3Vne}|FH*H~1-5_21XM%aK}4MXApXD%y^_NAkU zEQEdFr#{WGV-J>48M=O|CJpo;?P_j6F~h$6#0>L0V_E&7ujcC1LKDWVhZ%daD85{p z7$K2bR+7fY;N7Tmj%3o@w0=4c>BRCwm)rWzflRlYx0d=ElB+_JJCC z=h7Lb^%XRD(4MikEwrt2p_Q3&FMkYZH|2Jp8-R9s?(Opew zuwUpPT3%#{EY0nO#(kuvE zD1!*uG>-cpgUk7vPKBF;Cu<^D>PMwS2o50Ifz|WlVNO!kVNh-~;*&RIHj_^Irh~Sk zU^ZCunLhe*h+(TNp(ap0CPuI7{z%nBZkj|$Ivg6^39dZ4OFTOww!2xyWcI)h*f`Fe z;Rh_C$OiSl`k`pq$+3w%#D}Q2QIMAC8l`4jZZYytI)alP%1Ns^DcwU+W>@@>Nz3p< zCN(lR+yzl^M(7RLBr_hz8TEb7UUhbqs%|aeOjBcK8mkwXQ@GU492c8`0!}C3 zv@ZcBa1jEn1j`G!wk`x{Y_=G0)Qt@{cBGTIO;<`?`VopQt>N&Kb4cW+i!A-m+RN|P z@6+*}-3#yo2bM`X(((*eb@A-6p}8laIS^7$e#jS6kHLirsT_p0;92x%%ik+O9=-Y~ ztlBu8hw>V?LMimA>YfABd?IzW|PlRN{ACoCaLe~8XLu`Q?mi~EeNHQ7A5Mf^0 z8UKOK+x-U%0o+1#Ym));6!-`6p6&^TbjK3eM7_x%nB?UbPdrG{wEMc}*l6oJe@bFh70_XLXy_*sEm z$w2LdLkZ2xcCosky8+|59!&4qyKofxT!GdWXR94*gG%$C!FfW3)v(GN{#bP&9vTT6a z{bd6P!dEuPs5?0t&NVdmJ9yN9I~lRa=T3&;!p+b{7q=E;@G)SFLH6P<6#{0bwnaxN z8a99j7pUR<1*&{A5wME7F9Aw27@V2>Eus3R8*irTeaFaryzQMDdBAx1Hw^mRL#4eB zuhzYdH!Ng^wQj+%m*9>Cx75gNjm|cE3x?g{4SUxNJ9Z0(o#PFA)(qQe3x*xy4SU24 zd(*Isxc9}94P-5K2P_=_wkOSWQI+0-zT!Qv$rDkK+Og?d6rTgvqh}42-Hl9%#K?28 zEf;#crtDnk0yp*q>`Pc3_!a+3+1;5?iu(YLO;vAwbC(aBJ7gHO+N#s$m7E|Ex~GS3 zToHO~9kAJv?=)64uA#R>RIo|hsLb|~t!IXtV;wy5!_sFULOg-}Zs2Eu_jbYbVb6K_<&?Jk2aDs|nTDLK+)+yZ*mW4C0(wAg{%T*W^3Zs>&cWEcF=G6)_c zsgJj9Ee3#Rgz7Vs(f<^;|L)qqqVN7y1~LK+A@7>gb1N5eQfkXx;@m}kx|MOun-m!9 zj{St*z%CSXUx*E*AStEdr=Mg}7MfFv6o@#7=6sL(1%4eDnzLRi85p|hO}3+LVa^Rn z4mqZhaujelj5Iq#YR?20WGA$ALmv} z4I3|~MkSyC{#_-QdmVUacJucqdH}fkbzjw8mYhHu3{5+`!L$EAArjCmF^b7noSBh2ull|#L;#UU2( zZL*cb#1%@3TEPKE21j-JI9=&m_fR!-gEPTCovOBtgm z29sY}7#y578EGgp)rcKUPel zeZIb`ZkrR83y-nbbH#ZmX`y>_(2U9)WpUe`uG3n@l|I#Wk~KB%S=1V%+#p97c&J~s z{b~^r$@x@d(hpIQkFAQR4;UMkFPrAsBXHNPI0@lPhZ%{jdl@y!dwG!)p!5W*DBka+ zFT~<^p@^#fFl6Cf19(EWs2XhBuWDqVG?^GgoU9WK$F8@RemA0R?vA<_LUMhBRHSO7 z)8pC6tXoZrUf$hAyf@(~CjZ~Yc^;I=%EQc}vcH0}lyatA@#Ca&ZcVQ4$J#C@g4oCS zX?|3u05e9~%Uou7Y1mR5`nP`xGE9J2^~*5$nJTfMJNS*b0ILS>=#F)pkl2q&p)YH& zSkY?xmYDhM0+P5U_<$A+!ha^$`KYP!qgpv1(n6#;*==7PSvOq-{N znn|>UVv2!dr-hpT>~GcrA4W?^6euHg_X|3vpU``jDJyq1J%q+iqNC%^o+R`wZW8#! zT3~RUuK5Mn1gQ`(V##>7)G`kpy&8}Q;0gk$0{~DqJ$8bf)1rTA>`1q%0P1{rNLRNl zBJri;MWktGAAof5?b`zAZCgx4E&+o#9#S z(8j2C5I^}8Zqbyr4LVuMBP32gDQULoAq~@!=TD^vwLdj-*V}<7^mTuH=nGNMLlS#B zDt&YYlEaOdu6hwj{>(S^!OQ&Q*22plsG z&1nK`JjD^3!+j~ds43Lkt;wXId`OHw!x|cbEwdymjAHriGYzdP;bd)@-bp*hiheUY zknQInIe&Wrv~ZP*~(D!1J>ib!$NZZ6rReb<}5 z|CGKgfeVP{TNT8k3SyE4v6belj$Er#fzljdZ{I0p11gR5aFyoc=S4LfkKWUyvc@Dt zmI6e*Whst@ikP32?gXQJs5b3)qdoIqcCuX*#6o*LP_Gx*>kY03OVd)GbfFSWaiPo5 zrH7gJu-mS);?%D6KbW&_Zf|02tz-@D^t2{uv=>+un`OwgDog22yE{WpJ-C;rnUj}5 zKrpC<&B1n^ZaL{@Y9+6JD2-UG^RXBM_%H=5mE`@*fgrK7Jy7l09h}K2G7Vk9HrY-1 zU?gWFa3j}?xx@3pkA1Cv!fa1^bi8iN8;2Kk8D##tnV}lSR@t!$;?iM{AZb`&Sx6R2 zzj@ADdS~EB=e&O^Yb+3jDU@zT6ee+Gii+II{YqScBVXpB1_Ux!w#dx#3Lb{)IYtET zCc;)mdYDK+cqncm#6t~4E12oAsTNjlenR~&L3cPwgU(kfgw7?X57U({G6uh^FwUB4 z=Tdk>(Y0~U!q>FnA|1vGAI$Y(eRizcUKX18nlI&nRBjX7wEQaR52Q{}Cg>_K%F=~A zX>eo|rHq=Wy9+%D69e~cb?rBnPjV656zVNi}-FZ>~cJ18&8 z2B_}vsSi~v_y=tVW6oMb+nmZ7t8f>ui@wN{>8WTcql9Oqj=-0BL9(6RIlG?YJ5Y^{l76WhVAAa z0Dzk>`R*WYg7KYeCFc#3pN_*&g010v5^0BEwN5^pKPJEo}bNIAUrGQPb`n1aLE{pCqoFreOhfVSPl z_;O5=slZ`XXOuu0gTt=Z9ETVrX6`C*85CH}g?5kz5yD>lbZg!G%~N({J3i%GAwLE0 zoj?U`5&*;|88KYQ>UPYxC_oz@qq|R`kR}%9qdY1q7f1;;+@J_CAhPxxm?WU$HDA;I zqg^mLU7$>J(C6PXgEJOB&US#Cx#mOMAxM`H{B#N7Z%c>+LMUBR7#%)HHgf??YC9}#WyKEg zcs84V$3jbsK>L&Ub`58$!@eCmU$2+*J4qn#yFPT>)=8@~tS)S{i zS7|QOO`}X-4@y2AcxFDQs{hZww1JI8A-=-!6H zgdVF~-%{HTFXhwkSOYk@&Jm%<8rHYWBi9WNazET{Tzy7fh9Gi=s=zUYmckE)9aY0$ za8Bb>XO)yZ`9^y3ze5djzsW%(u?EZXDlt`9JKv zdwf*Y)&GA&5}0tCQL#ovIbhVFfC&O75Hx`V&*%hGL8TQ9F&Be`BqlQu6(u-{aypL2 zR$HE`ExltOZF#C9^@8CVuvQ}~MX@$ot24$6-Vjll?|bcY&delS?DPDd@9X=|j~6GO zv+rxKz4qE`-_FE(ug3#v?i0Y*T4H=+_0WLhBtV8INg>R2$UC5f*=`NLH23~qSuE^yEICTHTIpP)B2s+Dus$QsYRxE+_VlITokL_lI-`yVMo$%cx+OPw!UM zeym#{__Tl~%dG8|e^(@pG|@{q7nbDb!cQ!Rk(Re4vPEM*r#l(Wt}Wh=wYF zR6X3U3!FpdDi=D0tP?8-1{&>S6QYL3dxVzFa$?brE=_)fxIZIW^e2h9R%_e2DS5Qc zg7l#y(54Q^rYxJPc=2myzn1+_r)Wim#V?ideefeX(kfbchtv>^?5}t7 zPYlW|LeM%+jij$iA5q^0V_hJ1iBq)D(!%0nbTdb9oNTO&~nC;x-HDkqlYV5v(&K0)JUm~*T*D+5cD^eb7S z8RiUEu;eqP;6x}+QkNT5Pd`}+w0a#GkQo&U$*Qi>c<%Ng(l`0CjnaR~6<^N%_~^5o zQIbTGYnm)ZCsSgW?F&flc!uv)F0(^SAytyuUaP{b^aJ>MgcIU)SX6;zeSy3Ed@Cqo zlNX7~v9?26<2|mEL?=TOyb71`1=}QMj+aI-cOKF#p}~fUP+vqNi*R3r{x@ipOEa++ zxq|vxFp@&|Ii%SR&D$_N;(16+hXJP3z*dfjwlZo@wQ|4kq^2f+s^w&8HF)1D^=t1q zzoZRqZl2_B+bptYJ5OfTo8%nnZu^aL+MT$6Px`J>ZBCOnU_T@`veml1^MZ>%ldu0J zL|Iir-CZcK$={&cDzKMRPkrO6?xKbQyKAUEyp!%L>vDl##u;$gddxrRHc^>w#l4-r zz1Hzb^lf~UUbUorjUB;Odj5KtvPMx^rQX;n+CMNLV-_(BT~DyvORt=K%WVLi|EpKj zUPoR$)BeoLLQ^?3a3ZzUO7=%89DPu-3SH(%d-Qc9A0(@ZOYr4XJ6+n*(#?`|U47E+zt!UBbF5$=kuSp~-Ccds?XlC{ zbF_53L~mTtC*31~vX2OIIW5-sLJ|f-jABy7y(B`bh0QLDK!v zN++E~M)RYXkl!V*Xlqh2aocQn?=t#1S2sNvq&4y?T39TC6YMjgwlh<0WyV8KRA(*3arDv0Ke=b>VLo^efwkP{AR%`+6PRnezl7|2Ho2FE0 zg~RaOX)kyCPu%hLwrdz4+2W)4CvsNFsxr=x$3g$NW=N$9*_HfOGhQTyRr<5xf1Tk{1J52NTrDm z(^sNlxuR+5B(4S>D_4Wq$gw-^Wl#OU5332ufbud;(am+SnmSV5M0Qd-E*eQZZ4 z5NKOvDGrUX$gm^JW{$gUMN-}&d)@mR1a*l!o|en$TuyeJ;mN1k1o*8QSTbfMHA_02 zc=ocpDQCbOdiu544`tWhrqGT)tz@OUeed8zeQlbim2|k<_Z;dUE<5PtV6DAJHz!33 zPY&E@@o~FVgE*h)S**3MEV;e)=GzzCauR=UT<)wW#GB}icjHZ@x?*3`K?bV+D^SN$ zOth#E1z+D_Q7|i+g8oyYm1y5+MxS(B>~zCby2A{(?_xwnU&&Cca_WWZ=8)g01jqYH zz&z6Qme?GNuMqB&gH-WG>X)Q7VXMV&7;Np6pkJ%b5|ul>4_zLiD_7QZZE@_1JjbPo z=m~vdDPw9}K*)3IW3!#Zh5-&c_wkk>*||@eIXWwzXC#wHqa8AP|5g8fENv;1>0#Gf zjkVzgHJRqau8QCdSISU>0uZVbbV$zqD*ud?v-F7#SJ{bvLZV&{EcGK_%A3__RsvcwQdc45Z_-Iuk zKp2uPer0{KQjL9XK-6b~+(P9$sgDTk;FfxHMBlWBw$&GX`b|IKT$ya$NlPEDwI8!` zP8oi#C7GkRORQXsT`zrjpO18imXV`GKeww>|i&|1} zY7fZ_gZl?@{g6ze9evWkEiq}XPk2fXnvyWv#@lT& zO>X)-wdgO56QQ0169bo?PQgjv93Q$gY0*6<{9x-b*3;W;*K$L^&i(IPg6X}=@vXCc zyTq6C$reY#le38~vQPyry|PqqbNV>j-zWZTl{o$f{Z{-*_;*B)wujR=e zvhI}WxXpquTW z2PMcPsH1mq@+Z_)7I8iKyxe+s3hqCbuyvwj9M_W%BoZ8<{ca)#P2@_ntfOiw5@`>W z%Xw%xN#<^UDK%c7xWYMuq|qm>0E@5viTyxg{6``ws%UAm)ha*hQ*OWh)+1WG;%GT< zNY;@31@ae?d`u#_w47{rD>hq8P}lVkB{m>lDJXlt$)YUnXq3&e%I(AcQzfrQth^4- zhts9|nC&fMN(Y}7(BwOcwrut1TAigbY}t9f)*@@Mlu~MyqB5c@d_%rwyFb}NXNWOX zzFj4qbR?~pD;cWZobfj8Rmj7P^7WJ%QaP~_Kdq$mmL#+EUVF6a{Rh%e(upnKIZZ`f z_Uq_Vmg=x+ebkP*k(lx7L6JJQVD%G={V!V)6dP~0`}^PCpn}$Co~@|i$&2j#u20Ud zKf4}*3DHS?==iRkF8^rhZjy9gOX2Y@JjG6zaQvEwIl?e@ zqhT_$f{of97lY+ced?QP?(4}t8Y9GBfj0MPTWZ*3vQX^ zB&k_GEjhm{h=+TxHOo%3KE%p^1xcJHD^VYejL6v-_pRkIX=}E*aWzkJ@+;@M%!-@$ z#-M)bD9On>Vzb?9{V(^}X<#L1@7O?86+tU;EkI41{w6V!58=3P4Ihl}lv_Xlx?2v_ zn3p}rguYvIw>_-X0jqZCf&;HvyW#g+e%;mz;<<7MDu970*TJl5{z+;bG44EBts};r zBkgl2Ay^xh$iWdZ~wlny2v6aCsWS~M5$|O$9kF78%Z>Jso5<9xm79wKIs}mdBy=o^^ZCRh> zf5$2GWd9!Lb)+A%)X7ArzE>#)qw4E4h|K6z3)>B+_>yCF*5rn>V)c`s^Eg3e{bEd9 z<-mdX`O>{GGLjnHe}?<^jWki8!y7r&G5*QS)1<=6juhJAz{}W+BLAhZH!5d~ZU1ey z|77vE?}|wL^|t>h;%^N%{LYpx)gYHkcPqBsBL?b8J=)V;atQ!@1J+_NSfftHOz&Q&>+Q*&Xe$s%-6vxZCf@-$)>QOMDaK zIHId>)mz@WVsuyJ>z7o8Bk={EUdyA$kr-ho4%K5LHaqvwJyqt;0?#@U9Z`95=~pg$ zS#_t4#QL;c*7Bh!0@dQX$VGlFxljLWpsaY-Idn}J%jw-Dt07H&^cXKiBf+Z4&m&z_ zgRw-VYdB--e&tM-JQb?WD_GYUc5@!K#~$dNVrUB)j44Cb$@-M@f>J)tVPWSu6;yOZ z{z`o~FCq-z9q%2Xor-t6H#jFnZnQj{ygiCQs}9X7ZxN-gNULOae!tAlcQSL1hm5y9 z)R1XydDzT5_UNvE#oV7;5XZXt!izg*v}6@E}VH!oyepOBOYq8}v>FY7upUKP!=? z@+tSz6Z^!;l4}r-PlgauoE%5_c-6T(Ar#UETg0B$FO`??!(a-_N58Nw`JCAMy{CrS zrN+S?*;}^{73UI%N)f}UkJKT+@i3VPgu@F+5PCo{%A(3TM?M_O+%S8*=9bW9cNmqM z_|B+&!)3Qo`K-)}Py@!_&j zsN{a>;KBDOlMm8a_tO5Il%2>;H*~gwogkO)-)Gs&pUt19Au^Y{T^1XACmUhwAS1lk z^`KO>q$m1&;gRJZ|9-?tKe7YE76V(XHW}iqc7&`&53(8a$U*gEQ(+aw$zG|XeRoMF zn;3@%&}h#@CHz$i3 z5*^NM_sIf)6vS_~5 zx5T2EhuU0k1|FqJ))?WE&JB`8gz4dDsb2W9&d^nl!uIvn@&CooIad-Ee9arpASMPq zPTHj_@-m%>_ci_R0PIF`2NKW?Noqt5QJ6VEB@1qu=iCA4H-vI40cjDVJLbFR^x`Hr3gA^kP@!pKFC7vifkWk>B0SmnqbA zrNrE zTg#1?-U@CUT!0EBNIFOOFk{Tj=NGX`9G0MlfMMbKvHh2~K*$oSy~5>aw8t zQy;k3XI5oJyyjnhray~@c|WhPHCASR<8C_!xhZz9d)I63DmHt9J?`NCp-bG6w;ntg zOUf@i?0XB;JghQp1^3Wgu{YhLiiJ!3yv`;$hTn?u7NZDQ3_Q4H| z+nS2!HA{#)KZ`kDw-Kt#%JhY*vUDGB*}jlJD@Q&Au-QFIGu+Qeh68#ZuCekD`?Fkz z`M1a(B~lE7#aXW2jt-+zqNVlT<{s55{8D73Mg6ctrE@>7vWZqIk3!AjZ6SP}x?wr- zNt|MgK4`r34xBYI_6leJ8J$dQyWHR=8u%>?7gfJ#frQi~_^~bh&u5L%T-(wgvEX3~ zerLfiEV$2tdo8%j0@H$^1vgu;)Pn0RSY$!91?3iePXHEK^1<&EA>02dx}xavqRYJI z=S6e9=F4*o^Dok}M*bH@*9tj7EdSiWC;4lHe%PtNG{ijH_}&HH)O)g4iC6xM?x1=J zU$)&Bp8T7uH4Rymd6;M^aBWQo0^$;ZEHRTl)K%odsd>%(=rTuMO5E#qTwFQgPG8C=vA2*z$zKx8=qeuKBC;0!E>WdKOFrD| zj#yqv?hfcWG~AoxaZ+rHD?z5vYK2ffjW;=j(LnBe~7kA%vTf z1P_28hXnfx<|J{jGwpDpmlJ9+nazf}G`)TvcgtFZkjQm0e#J3vQlIz2i@SG`WTUoka{=Ff2dH#K_d9fTP1?m z?2g_|oPSGx4f9DkbB7cs>HovjGv2?;o^<|xHftWYm5!N5$)dZP*!}@_V$`jWyy3r`g0P79MwdjugJH_XSBPbD!R=^0r3ao@5na zfzTeFo5fu9t-aAJka~=zWP7RTirmgW=MY`&6){%6Hq0+DVm?=23IEjiPj6S7qM9h0 zyswrQ{)us*j1z{twrzBAZ>UXK3*N9*J~QJBjPSAnvB>r*5YgW0HMhCj+_b606k3@9 zN@cv2v-rix-KF8Wfob0GRT*f?$OFGV7%OVMIiuRkWy2IB+>+sL`;tO(_laqt_1h!I0ducwmy!yI zbt375J^WrN-}oD^a{im-%u3O*;Cc_4r7UXk6t3KTM#v}Aj7^a(pV$rPHSft< zP02?49;+ILyLfj|XdqHUZ3d=AvV5`qD#tk8>@~aKfLdU3x2suj-|#qpCEa?_ z7fFd_JfXkxIe7e4pM3zsOZu$xiInm60!LpQ#SV?@KU#lVyRa{1cDNu9d5CVndU5oo zSbNCzy&`MTy9luC>eibF*Sg!kRt7~`20h{!`U=Z8_qIs9xA9l;oZc@d5q#!GpP7~w zS*b44%+2!nLTOo~D3cTcl{2TOQvC&7kaf4KIaWt>q!^^5s3yu~jF{H@dLNNYm2!Eo zBeydeBc=F=p6dO{da?7Oy$+r0MQ2A}$Ei4$CbA@2F4y81r*{9!o0D9X<_+DUG>K@G z4pJ-jx8@t}_Vb8pJlWOBT>{OWZsdQDZ%m#he&O$D8=;vkUG0U!MM90PcClGFJjf!U zOMJRYGA+nf;rw9t*v(xfdCD>N#jX;=3Kc~_e+Ww~Bm4s?zpJEHg|)B5VFf?XDzV0H z>}nU4XN8K6wL(iJr9|#(7cN=B+v9J$orsb?68GNkc$=jj(o4qbs79%dt2OS*;YSM_ zt$;#aYpvHZUR$i!1-#~{*RW8JE6;MRwp@jlOInLC!*X?6t}@HjZMo)It{%&^z*wc|h_;xF^g@Lrr4Rs3E-STFqY5VoydX}IWeq)`dbo4iD)@W+v$=-IYIa*m#g z1H8w z-}8v)itC5qR~IbZWmIma4;!X`i*Dq9v-FYnJ^oF>UQQCRPw#tO=ffk4W^;QVCDIB} zno%kFrS(4UtdCgEHIDvpKO-IkjLLnz_b5B|apms4-5D1)h?}DJMX#rKcDUCmceF}P zms!S9SE~)k|52yX~jy4SPm@B-I;wY%R5p z-Y&7FJj>{o`Ns*W9!cZ3H=|39-z+=1B5j<2FABz(CwIB;x`v!e+aK!`{)N+D%^ahZ zR>m$4`M=R-xYwoS`G?GGeQLUNGc7Qrz~yeAC{+nfF;X8@ViLU&x6QxcR|DL49*aAC zaV$LNV0h*?M&%9`=2_kk`JZFqt9T24d@t)h(}&Y6epy%T9F^~9i(dRH#eL^a)LVE? zEIjj|q+3O!6DuUrV8U$#b&DSTr_zYja}Y5lT7I`-T4L)C-%X(OD``n-py+Q@Z1|({ zZ<74UoSextx>5zUN&Qs&&cRLlMq5E?@0luk%!&RzoN;+2hb&KI3TN;QRJQuWuh|uy zVnv}m%b+SeTzeQ9%ASg5BRO*RB}m-k<@|sPt+_o`t?&N%Ut1 zNe@w?{gM$}_Oh-er%M}TxH-D^2P>(=hwE?#d-iBT;5(9Z=Q`>VJx=Jc=a)n&lTi0v-(Vak zgv|e){zB%C3z@rpA8|#{c7O<4^c^v*m3)6YKZ6G;tRuOw;|EcgQMt_<@^7UcBL?{0 zMXgVzD}i>m|A45i2PkYlFTHo$d@mU2zpdcJ8phKSybW`&v2p(eM(#Fa?6&AUe4P5V z@8ma*Wh_5cdD3eMx1cfl zdD<;{pS+r%s2Ux(!1&@zzU39YO+3dwAH78d?#F1q5+r^252Z0j=F>lI5yrY#Im zNUhI&$G~hu^RZC0uPy6u#4q#@Zhb22BjIeoCu{A7x~=s&BU=$sx>S^mqHS$i|ByH` z)p2>dinH>>6}q*M0@&bjx0R3p!``16x$kZ2*9gz!V=E_uyT?3adJpMVKrj?qHDq}8pkM|j&fq#X{j=tHIzVymaiOXAA z+^+djBGOyw??&imOBWqFF7zwUXMP;n#fnF1`%_t+Wb2n|k5rw-Yo@&}b1Ngb6)XCy zV*_^!t6Z(?#Vpa>?SB+LuV;Ldf6Kk2tqCi`wKPDVv0BEN>yM>ZhAz`u3o_|_e?iW@ z;St|)3R8u6%@KBiUmfdi*U7avZ0P~gvD@7GRGJuk6nzhW9f~1pi^ttIo9NL({s>=u z^x)KzcocVAj)aNf@A0UshvTt56m^fHwLFt>}ZD z-FT3!g=Fq^@<~JJ3~Xrqk_?_B3VTMqYi<3b?(S7~TU@9RnOC^|^~wR$tG=8F2DzIFPm9=2U% zC82{rcl)^H@)?fAGWEOY530`?VarDhKqLBWlKz+dxV^F;$F9xi?9s4t@Kxjr8CF8d ztd+wBYz73E9q$_GpGsAikKGqk-Hlpa0u3_i4&AIONf%93au~>^I(}c|ygTFjEJl~w z%8{B#H{qPgd?vPhb#SxYz8pp{t=*o!!Et`4^u9rVwKkSyq2@E}<8MTJtfZ>G&{Af1 z%QJf$?D)a2($$Z&ZQv52<}Th_YJOSD`2;g668#J*w4&H9_NdE==r1?mqs$6ryKqb* zo=U7D$GW+iWN!9P4(@kxe#v~tXTBThq#^9r$GEx~+@DU2+sNY9MEgC7!qMnqLZrF7 zPakU~M6(y2P=n^Dc3pZeP~&%kBHjGZYwq@$Zw8+q;6>{sC}If>dWzaV2$VsHEF6uq zXyP^ZgUBd#p)}MaLC|)mYGe2jg%%XtpKH;Y2Z8fMP!iBW3&=R>F;}+gy zxlf<=u8yFdz)7|la$O-j-93Da7P-1Zj^_9?TBr988$;BIe3 zLpdG7d?>3GZukdn3tFQPy-qwV#;|rM!w~h2l6lS8iR??{M9Pn zjnG3`t0jZb{aLF(U+C9aYZN||wO0IBY!NGgnauw-^`r~edeF>83?cvCq2%AulDGhP1D z$h;qLmZ5#0|3uEJ9B_&BUY5sX8oP{* zxGlO!o7!KOk>4=S>wV7B2dz)r1Yefte@?{@bjL?}_qy~wL&iYn+$<(P&}WVMfs4c@ zm7}igj`tR}PJfI@NjmakLgIOdD)gwa(>58xxV?DhMc-3>sM|QZU8K#MYApcAsqM3V zjLLLj(Jt5b-EM2e^n6NXehL$Ej8NJafuW)dPl%jlN`Gp7>O93~|9j-;+T0;WJLSc( zSB=o^QfR_$=RYcu|Eq)T{L^v*o&ruX4E@5dNB+XsMbR7a{Luy@zOb_v`@%d%Imllm zE0KTb_DQbo<&q=|i`Ru^p%HvRu~9_bVObWnIu#lPzdfgT;?{@A?<}kD`Lq2`tj1YX0V9 z7|fK2<{epuV8p}yPqfO2TvkqZ(|077E3cv`nQuL%dglQDTSoXtkCH=fXYXj?=a&OG z3)oehs^cftB7+tuG^R@<`A-V@N?fg9rmP$s_!~1aSy=X^>bh3jW zQ0gkqT7q!?$##}0GG}H=P>Yqy6}CQljX|A=hG0JUGAkh_=r(*uvm&&B#e)jht@;)pL4*y{`3 z%t0l4JXTB3y{{wh_pX-i6>4t;taj}x@xTXIC3MLt3uA0I=W;UDM)Dgz^P|WvbRq+A z;C}X)scA&!XTH#HT2xL?OHPKl8G0hJxXS(&gVZT>3{HH9eZzQBpR_%MI3u)}LZ1^B z$ImATe>snZF+v)X3YpbCuv7T#GpQHfk@cFd_~b&!iuZMCHhAlWY+6KZ9{nS-17eNv z)6xPqzu%xHrHq%EzVO51U5c{vU_toI4q#3@SE-V)Lh6iU3E_v-`x_x{H&swIrAjmqmGuU1_Hc%e7LnG=w5xb>6B} z9qpr82MMbu5{1Zh%UkYFEP8U)q~=2RYnT+VXM|;N$vg2 zl6=k}FUxW*GkRN`@zh(nr348GPuk2nr#D0|BZ4oS^%rcMEUCo}rTBV7X<5u=vn~u* zjZg8K155JXy=8K-87&FdWu=tle{{=w^0AYWQ)upH%!(=IP?bYyXjV%mh4elkdY>sx zl9k`#t=uYw_pY$@V9^!6@QvthREE;q>UVJfdfS*ifA8QizpGXRxpHyro48;TT~-Fk2TR-N?9=UhU;GTn489KqGB{& zo9I|kSJ+Jq#YN`s+#T^;yw>(W3G?s+5w-zhXv#xFLv2d(3wuE^%)s(d+&5y@gWpNk!|ID`GdLl#br*ReSKh zjLwp_JuPp_S=jrEg8wY^-|Mx0N|kT|*frW;{bD+4GcEuQLf%oR=LQ1r$Vp>1aoGb`dri^cyUQa7QCe1{z#gkTI4N(}z;cTtw^Lbltx!gwWUKa+ z+jhEF%H$xrNb$(7uOq)_1>bE9#&rJ#k>4EudBIqjEx*^_+*f|b*)pl>X|VI&*M8?* zZjwD8jCuSoL?&2S(5{K~i?6LYKQ|1~N-R|>8%Pe5E68)w5<}B-Lxaz%D>h{#O6MqEwk=D;#L159I=y4;U1*K0O@ zlv>CcjmR#MyT@;W^-$&wGxp2DnyvBh8rfVR+{;lT!rnB@5947M$)19&6|?4I4QtHU zxXUr0reUdz-L@(@YhIU?b0V8$>J6WO=ECXH>k{*d+^?zT4*tzWc{_DJK)Z>x|1U$`zctu+55{}@K9QmAQF zoM7ciZOXCjOv5ij7=^wM{O!{0I{NJcOJcVbn;)_Nh|I|M^Cd7F9|p+ayYAe55!rvh z9k~gNOEcS-va0wkBJFM~5RpU*a}xCmX5&}WA)>?VFj;z(yyx!eeOvT_%)KsjC2wC~ zdx*%$@pdumt+qfq7(n5jE2%YP)2lc{H{Dhuz2;;1CjC5{POf@*Z=RHYlS`8iAINq+ zg93eu8-rZJGv{|x2vbjPo0CWo5jwv*lYZ1(5a>|bWFe>4Z3O3iN~DT<9EpqM@u z_YdL)IdK2>xUQfDm`(00He->yuucU}0OLG9GJD(S(xcmp;A1j@?d8JQxO^emNzA3b zw*7Eq{rmCK|IhmO4^|e3=wEdi%FnTibrK$p@YeuSg=hH2kZuEr%DW&-z zHaA=x9yh^w@dIyY{zqJZohhgP*g8&4i(D;JN1ER1A+$tKF_VXRh`7=jXmS*fczrID z4N;Rga`(|A=ogV5W&BfF(?RGi96 zwT_dOztLg^9iG?Ne(A-^NjWw+d9t&^2bx)=9(+-7(6d2z--KxjgBeRT+ zU!fOgvTrnhE8HnoV=7%d{Vo-Gv;SDmY#gLpAIFqXO`%$tT<=dRj-r-6Ak<-E$OeAz z3Eq&8@-Sk&rf-*}0P?pj8N~?#S|;#jJea2YJHhPzkXH%J-JWu*B4s0$>Zl9Fr{4-p1;@Cd$QPd7J5uTk;E>Zy5Q>g8SBiDp^@d?-NF7X=Y>v(|BnT zPjrZAWDLeqAxUf&52|LrH;lyP?h%Fm4rfS9Lp5{&q^Gp~ZFk!fGIr58Xt_ehtKeI1 zB@(1H;zM2UDWdHx?c=_6B`JL2#b~_u-M8I<9h_?OJqBfax5MAA^mBND>6o% za2=XO-8~rn=rfPGnJ8?5-kwhQ~ARHEP{8{co!9t?bZmeF^DwDsSOb}z4tpw%uiG&VWS2f}hS%)BYK*0#tUk|K0C>lK-k70tfaCHtAMH66};MId@0zm=15KnLhKO`}RGOFk_eh3~y*owhTI__{>+m z=1X3Np#1li{7ps7*cIrp=aG+Jk*TIVK~9&qt)suHsTUKlw>b^+L2tG#cPnCL|MFL% z2Z_OQhr!melgvL;4wHoPg0Ymq?ozYcmnvW1oaW8nzx4G|jv}WT*}nW2)S_Iedq$LJ zug^W>T_<^9qv%D|+0K*V+hTs`-r>(EJ*`=GL5dZEOBhZlgz{# z7p)|txKcflaUzs5^v=}%ml>61*gmge`*_kK*U%Y!p_^m|!1A+n5ixXLM`?LEfGQ-? zqqi|YDEmk4Y^zQ_GqZPSV*MUd8e7MVB-xmDzuFp|qdNM`Y{M+dHbUtsdq=a}b;^N{ z81>DW*-@@sAnKQ7`@+KpN>KQeQGj6{pS@EDhFuTupLS8X+Iqr~ViLS$xZF*>pYeQ!0n@VQV%VFaOrZF*6ug>)Zxo3Lk1Do5}o(@NTP z8nqj$1{!uYDTj|dR1WR7J)199iPWbU%w2TNQ;hI+DZa|I$R**lG+%yK)9G>;BmZM} z@HVM%c*JlPJ&nq7WH4@=k^fQi3mkCkeS;%qOKN>#yek)TJBFaj65C$p=EelX0D0M4 z%$`saXFQpth@9ZWNKbcJGsPVQcq>aZZ^{-QM?e^&xQLwEjCd~6eP(5*65Qxksuj6y z5mOEM7vCR2Wo5Dv?spZ3PAF;L8BptG$@kfV(_6ObRG@1Xe+35$s|{0B?rbFgmdqN0 zSo+W7aKr2mq;(i(BSUYH5h;DKc!;G(V6F~0%=!nuIYFt2cjYe>&V9Z2aS4Vl#e_loo{yN-Zo1g zP_tq-gmNh3w_B;poOo3}O|A_;)gGRH+xw%nh*xa>Q2OtAH_TIhB@muor(83$uZ;e{ zs$ocZOl||NG|XAn_HTl}ihik%LqEh@G+&fN^R9S()fp6Z8YQ<=hR40uITYD-Zl{Xh z$d@VRi`K!eld*{biUAv5W?SpI#i27x+TZrS<_n#^af>eM);|=oAM2$;Ey_wbOHxJ@#wNl zBmXRaxi@r`MD?GFah&Zn|6a7OL{ACyc=H!$2L4GbI&UwAi9=A95OkrMRqgSg$J{NN z1rNx08UbR@%BaS7Ctk4mmdL>yx;Zm4z5ZaV_mRlD+Wzt!eUiS~SH4}LL2Tw&%a|Pz z`87V+h4gkszgTQ1PqbHJs+!LTtY zNCzu%v1(YtT3sYnc$&r%sJp$B3}hf-t*JXSv(2qXnqdpQEZ){s83@AX}V!EhNiJrsJc_3m(~G7DQfTzZ}bH!cIssRPbNnigP9WAv##?QTnPx((AYM#~Wigh!)lYqd-B1wGf zh3{gJBytI2AwHXh9_!!iDb4j2jg2=okqUx#{H~6cInwlzZn6t2cQHc|= zU;Nz3iD(UhrpjtNqLbg0IkvCkG0Do!U(s}Jwf`Ke(DAtwawp{2jtP~O+QRzAfWN$X z;f>XL!E}AmjJk%(MRRazODgID)%x`5dahPm(OfHU2AI9Dah%>lR8BvT2^EHPqBJR}-X9nLPR2DOz21y#!3s7B=EXY8AJfoU5y>97L%2x7H#%d_!m}|S5`Fp z3kW(tdr<&5cjDrT7XAG5ZQe@mN##@G(aPylLXM{>2ECUx}i>$Rp19zZ5OamEuX^BuKhzfMVvewu0ftbx=S14a(P^OhL)C*;mObkYv~z-J%jZj+Q5t_*Y zPSj7*(ubVnIY~cR8#v@-&&m2oZP1XBo{{<~nrp}@o>TNwwTvOBdQR0xX@iH1@{H1T zZO9PaqwAx!w4tLtqxCUb`p_|+G5TrRz@evkPSdlrK|`}VS^DXkYv}2o)Acj7jGcbEclH4H=s4$=1heX~V{P#_DHj>BG+QoTZ$gmtw4w8^IJlB(}Pt?+fPxMUG&(#JFKi6|E z9c0k(NuEjiWX&~vvS+eBMavjI#WO`ePa8b^JkNQ0o;GB7o+nSw*V5eio_u|(mhPVF znW|6I2D+ztrs)ORAa{YMKu>YG+|xbN^%PHr`+U#&dP?SC_XVB{^b~!FyUQrxiWmC2Et%|yt4UIQsS2ol)`}NA&il(!WI}4D`WOtazIuaiTYblu!35Syr^)xX6fUdW7v{^qGueGS)6oK@G*&=jw# z)$#jLnVgV!r8=fgowcyOs#H3!ue$zPe{Eml`f@$d1pRWhn9#TWCFosgIUh|hx3;2w z%A{<&*_;|DYIdabzJ*X(QRgJ=Lk+3N>C$9zS{jQM>XPX)Z&tA z^saa8<(j{?sbOh(byHJAlg5BGVUp5CqKaZ{4amO>oF+xbp-!9qO$+OBfobuN;R53!;)m2x?#RdNLD{lt(&930NpXa}Lw(uOYukUjc ze!FJCs&Ce9FRl zC86b*vH=-wlJk)CRSkI;xm-4OmMES`%5I#wzgwg)$Ya5zw zNDe*peRl4|@(X>J%qa4em(MQGotT@Pc|4Eg8uZPhfBK0w!4`E%8CU|M&1h;^go)kQ z)UbFVs%w@K8@-}VjN=;+W)y4nlIkk0%!&{XX+~c+*DNIDvie2!4NL2Fi$B7TBgvjn z+MmAM6>$MiX%2aa{5Vq(AUME#A3Jc{Dr57=Tn}-bNW8N z$1feflX)iaD9Zcgqj(qB5D8W$ysY~6|Jz6Z<-&}bhNfypzw&s(BUW8y)i?cQmAYCme_9|NeS9nZG%4UCYq3kcp-k3^s4cH9jT@VUE6z%anvN z>LIT=LXYiCFbcKUP$|SosO6A+#1dfMDOQpuhK>4DT~V(LOEt07su}`J9ksd!)VuwT zGR4$@8G^YJ^Rz&Haz>a*37=$#$|MmaS&|De`s5M!X|8R+B#Gy3ImKevmI}e;ev2rT zO+1#OQ+Z98FhQ%Tu3WgdqVC*@&fAnp&YP53TTxe|s+v26+$7U;C-S0ct>?vJm-KtY zFZrp$Esw-=-oFhc{q0A1j+Bq2k$fdx6OY6bKS3uihc1U62|Lo`#7R!$(CzpMiXZZ& z^%TTnpH1g?z-*Lv=lR(7bK*Guf-ex}D1R-xqQ0U2hQ$qmX1%^*admSeHsn~XVzze1 zbgg2J#-9r9j5D-~DvdvgU!BH;r*g42jYt1)mbTsVQYwN{XaijEE_eHUo=VI%5D(U@C zd|&;YB)1c%KfX@9r99$aU}OI{M|1zun<(FjH}EiiPT0|KF6nN$Zq#QD*GlcsOW zcRBe@ovK}=HZQa#YQ56FQT;#)hVfrW>q)+J#kBOqUp7D(vLtb1MA0R$f$D8Ca~9vwT?T z*T(5uLnCWJ(mkCQUDK!PTA)s2x*g!DsiKm{_rS^7cRW$<2x=!D~o9ZeSUsF|)t&KfRyD3mFtR)q> zpQdR)ZDJll8_LtlGk<9;_SY8X9pPB)2R9(cJa6%wbR&0bd7kF^oM-$^u~;?F13a(r z3|q!A3!a;K9^?6dXXMR^=Lz1w?OAjS#}Rl2FOS8_T4S-RZ)J--Xkiy9&#P_d#&+bG zr;Dfjwpc80C3}=SXPee@0Vq%E9gImlH}bq0f>to+&RDFLXEjg#U9s3`o+$oG3%VcY3-2<=x7oUIrFc$lY=eQrmV#)7kLg2LZKaa&0tfmck3VFnRcfThSe-}@V9lrS&vDoXsjKz-m6@EOI@GRze zmB;gIHeGpIc;4h0{+n2ABF_UnukfV)miFTL9Z$;du%UT6c)sNM-WuA9y#H@J&ye@0 zJWbF&bZsp5#UHKbDf|5)@P3{;Fg@@;LsHo+7ySx|*@1Nk=%JUk}TRfleOnbao^o>Pw1VR`?YFYvciF+% zJl;KEBdCKb!5nZkSO~5M%fN1M0T=-rLG3%Nv4ELi2bcqPgJob3SPSk2TS1NAiC6`C z!0lkp6$fK$!9pPemum@ZNuIBL7esDpiCjMA(D-CeU??rri(b zfIGl>;6K4u@c5gc51avZgAL$*@P3d30NNiw1Ka{Of^UGUz|X->aMUu|2b>OiMnONA z2W|lufNy{+!TsP`@D^^x?gsw^YPzOn-f}RO4Ne5hz%sA}yarqi-U@C9SA%=OU0~*D zP0LzN{lV{pwcskS1N<6X4;oxR?*U%{U1K!u)D_epycV1XJ_@#i+O5b-&4v1Zvhv8zXn%=-QZgA0Js}0U}M&@KUf9ycJvn zt_Hio&JOqmeg<-|LmR;-77cI;*a%jEtH9rbo#5AC1RV22>VFpP1m=NF-~w<9xDtGd zFG;Nh-@b?XgHwJ?{m<64>%eTV<|ou2To1N@%T`f;!T+HC;BUdbVAfBm|2X2`NBzN{ zg0@~y(9|iY=z6Z%a z2Y!I_z&n2rJz(B{LO=L3um_y*5bc+%Y4?FS;C65x`254f2WS5Q`oTBWLO(eCzo362 zdoh0^fADg!3|s}afKwlV9`H_ZJ7_!#U%?-MndkE3w2#48uo0{U_k$ha)OFAW)`C6Y zQ=p483|Bu6UEpeP9{4=i3XWNiT!E{=Ztyj5KRDyh@M$t~3mV|WCy*=953T|SJc(R^ zSA!AoYtS==c6*BU6MUNX1HZq4`h%IzP=D}Qa5s1m)Xqb0JE=dI4VHoDgDv1(a5Z=x zxE*{R+za-AnR&>`M(Pj#VH0$LgEvDL_)~B@_!hVqymJfj^Pzt$@xf=oT5!TP_ysNj z*Ml3t9&lh6{FJ5$qw}Vr_yUsfUxJNbPB--j zi@;8BDHs7)fSyA7DVPVY1s8xXfGfdQ!L{Iia4$IcMdBAR?t(dB4Oj-Q1RKHHozw@M z{u1fH`CvEL0(xdJK7u*mpTIJ32iOSy1MC1ZUWO0gB(Mi816?!GPhbw1_X_dB{{TC{ zKY(k&2-ppd+XbEArJ$!6xd8LP^Z!P@z_Zv+>BgL`Nn@IG)YIPgv66TA}Cyo`rnHu%K5&;@P* zTfx79Yrv`~^#GTE+C{VNWVltM3< z13m(lfj53ezXLabtHHOy?cnb}Cmr}9m^qtv+ef{?*T7ov)Gv@9uozqq4&D!a;B3%! z3337EfK$JOK2SRVePA)T2D}dJ26MimT|qynm!ZEv16=Sm?F#-HTm?Q0c7h$>(5~Rr zgVg7{j8kA9SP+BXU@f>3dVQmDQ4K{*p;41J#uoL9B zbYcClP=q^EsFdMudtOXB%tH7b$Jm>`1ff4Wx&@&(T9S(h9F}MKyJ-8D55L^q6 zaKkt7ZqRj=rfmXqz};XYIMPGAfHT0g;9PJocpaE|HTo4S1h<2=;A>z9_&&HE%shs6 z1m}aUa>gq#2iyjhfuDda;FM#L7jQnf9b64YK+kd1V*zpq=7Gz=1>hQRCHQx6EqGuA z^#HdXPy1JB+KbmRNaKWjh2k!vafWHK{gU^5wup4w$Q{E`jgHu5Ryc(on~rU^Y1XY~%&39Ebda^Cr;0 zz}$0?8}PLp&`t$~|l z*HCZpcVHpdR7rYpOcm+DE5OxY1ndO0YSM!vL9G#e4Q7LBHPjoN1J;7KgDb(mfNQ`W za61^d7QF)wtcC9DHEj`?2X=w;z%Le3Z?NDx>J9!0Tn|oNNxi|>P3jFkdvr-1b9T^9VCS>Yc@uO#M?Jw-uocu_B0abl+z+nZjl3*lJbo2EfD6EtU^4o*FfgNBW*aeL&;j;jW8@RPwiE$QAr88Zw~VB2$xk z$iI{u%Y3Tk2Hp4Y-MV&ia{FZwu2arQpwlK&j{=@-{5K}~PvU(pPY?cU9RC@^Jw?Ma zZ%e&nK=E+Bcz8}QZNS{Y@|IaN+%rRH)1=Ms;F(u+F!tI&yByM$49}b~T%R#KyJ&b$ z(eS+D;f=vTw+*}_J)CxD>Rkg;f1Em4JPFEH(TFS=77e+FyrkVC7aokAJ0OwYjHLV$ z`4meg3xb0N%p*HhQlIQfh72$Xn0ZJ!Glwj}f7T)X7Y`{vtpAK5#n2?}*5N%Edw}<} zb1@(k(V5}YI|q~u*Qv^F>35`2Sa9Hl!wUyoHF$W=OsPLyu&Y-xMDh43@`;eo)>QKO zrpn1DnP17wx@h>?V^TjHaM&6aIek;wVFdhIPUcdzyTt#^IQ znl&?PCNq}bZ77;-39IqVMxR9g)5075#&wF68+TXi^C;EnaX&RXHW1Bh?1 z{FvKv@>ZiRU=+edp6P<+Y63TDQ6$=KaVXa#@GnsD{;OR*#3DaL1`t5dbO%`Y7JK1ixRe-0N?NI=3bWtSA z_Uqqn&ERGvt&tL>&=(fRIR5T~j&a<~7y5=T?U7~B~;H`mSW16Kgft6e(5<$ya=_jkS9A3y4PDY#2?uFTEx zopxUUH%8}fa&z;*T?lT9&Q-g)DsYn%;P!wk0_RoVc5sCWaK|Oz`&hp9m>^O8YHCfu zm@^!Oyw==*Q!s8f!r$e3Ju2Mw$OZQ-I9!tZf?1kB>HFM2%E7&#K>2ondmG%jdcHTh z^W`U%4};@4=Gxy1+*~)f{oqn{?q)Za3@0yu^V+^y;P!&MLie}U?T_aHFM=!7Ikt1I z#il{41=pE?zb0@Wfa7^He#W-j26w(kC>BSe%XE(UN?%Qb)(0*d9LFt}KO@g}NG=T* z2qoaQ>Ky&m#OhH1?&sj9>zt}AePOKx_g(^A1Gu3$?$7GyFW*(ZHgM_S`qhKwyDnC~ z9&mFK;6~v*x)PjMJ7JsPH4@!4r#O+ZXi+oMc!#CO9r^ z#}@FdOCr%K{B~_W)_Yy7-re9%U20uNy0~d}Gn)RAhhk0{{xCJ=3vPAiZ%mDi3t8YM z!C#J^@11UcMc@j-y+>}k=5LqfkM*tvm%JA#BhlG9XUwn*N-l_l_`Tpt`f;%Vf?PVd{owNYani{UPi`K#x53@2 zbKEYD@vsWq=(0%kLY*tIi)Z@V1MZ9jxOQ-(z_Cq(SnYPX&F$~Fmg$->zfNMAKbM%SLOCs4sIzpuW@q+xV7NW6WsM+zH=;}%(n&HZg5`XYd5$< z;J&2$GyBUL(;@vO4@aL#fXf1RECH?vT<})!d~3mt2Iti-P2k3X^Q!L=a0LnE+Xt>B z0WJ+^{*~aoj>iSyR)XU-hO7V0cK3rya0|eFOXs+Kx5c(^1Gq!rF3~ydysQn}Yv8^> zE(yI=ozJXv=i3AB4RBt^_fg4KzUSfmG5GrYm_L*+aJt{_FWKM@+~$3LR0^&gT&iA= z*zjWR=XK!Pz+Iqox47%E4_qs_44qry<~qgSRGl*>+aUXWa0Kpwz~9_{Tx5jPH_Zpr}u)TvB5G`@jvJGfe%n_hzn$E^Y54y&ypo7;IF_-^nsbe`=kyB^C~ z1#ZY%yu456tadbuKyDAXQgCk%)Q*Q^?br_PjCGOdb-F*~t1c1f?>M+jaAi7Y<$IIb zekr)HssQ&Lont*7kM*xyaJ}Hx>73>7R^_i8+@$r9=wmuZe-Fj{?Eu#V?%+UNON?s) zH=`2stvYArYn~~vzTM!e!EGIw+eDAt&dH~O1$R5ozlY9o?I(fD`=5VjgCF9-VI0l3Y2{;L0|jRT$K-2r|#c&~c3fO`{Mt?t*VzvT;pIIY!GK_Dj9N5n7;3En0 zY?nUp8}1t5Jl$%)Mf6QB4JR}&g4?E-gWLH&s|4fT>(5?wtIw=Bk0f?EdeQk`?m z|FJ#|;Fg0M!u|fyS+V|Tm9JC3E@}s#Q-x>1bic;ks+r9C90&I(xNYp`1-jorjRBhV zNjV+uSuN*P2;0Xi)LWf`k;?@)1XVR+qn8 za7Vy-m9GgL|EFO~KYua_gLt;z5pX5oyxOl1++E-X>xcB0h6&V-;JnIL0Imt#?tbNy zgN2l@65O~N@A5T(n+(pYd~M*Sf%7U~54d&UzS6IJv57m@chqQ{*C$ZEY;bRbTi(x~ z?CetCQgCP2dY7*b+%$0gj*rHpuKuzQ+ zDjtkP_mErOFaMp2tEE41JIT%M$JHsW3EZMO**;hI<8D;k5pa)!^O~pZ1NUMATpA{R z-t^$O9SgvH3a)|M@j1*osO@OBOW@1SElIu#{L*^N&yxR6KmJ0UZvxN%Q8W1m2j|)T zo#3C`9*JhNU9sBbLBEpeadSHbF(LHB1h{l?uYp6ex&6huo#}5LxK?oEbS~EIO|A-D z3piY!yZue)mb4buV-L9932^P;wt%}*_lNqHi%a@D4(`zexRmpdH#l5Axyu)u7BcIR z3$7mAdr-apKl2S!+2+WA&HUx2WS)8-`$z^#Knul`pFZX-Ca{jvev4se*Japyb3UEelv zcZ2gfPUDj$zWc#>^}kW5=O&tz1nXdxJ?Ogo#3{E^V)xd zWAO}k0{+s$vHiUEw|U@JfV)uNZrXjVDsZ5$kky`cdTC3h@55RP z9jA>k|MJWcbuNzQrG9v;<9R9S+!iHBPaFK~nwSrSspn$l|BjzQ9jjdi{G?urbrE!2 zt_`TyB7Sb1^l8xcV9kSmiJo3fS|FZWJJ#t5aL2(FfMeN$Sncv^$NdyPu2;eF+{VRe z_h0$EaxS?2ec@aApH_&S>(nt%LtD?|HIbxh+S5>7NK5*^;4w( zBCM@fT4O5pDy$=sKG&(=6Vn?Ip9OuO{>yf4!Fo0Ha%XzhZK>sh(d4?ZR)f2T5$ar# z+*e{8%ae@udJ|lxlUo%lPdfDXpg-f(jVDcj=?kEjKN5*9cIj4!r(O=d3Htd?UGCFU zuY>+PboN)foN_Hjy$Sj=&~bY)rpvPx)Z3vyG>Fb*j{T`@nPY!qJ8>;Sde%SqyQ^b) z%#U5cc=eY8r04i)m!H3}uzXw``Mu-m701z)vPPuj6YaxU&=B8o&h;;M&0T zV*B?yZpxSo*=)le*gkMx$3s5<_%1lKw0l2x^h<7&Y;d1}!|Ak}Gw+}v5(_y#|M(HO z68sKgwYPy0y8%p&{p>>2x27Mb?rvHB`26EWaQ)_;u8r+u^w$aQ0JukVf8=Bek{q9Z zoUjA`cL3g1zQ9v{wI`C}^N-Jc!}~caKL7YSxN~)X*tY|xSuW|1&p)<38j0SamyctB zT(FSi^N*)~Q?BC?w%d=~W~+qc`26Et;2y&7pp!GqOK8TJ+k?+Pz5{L*!fq~hf=qvW z{&C#SNOXQbE;g}4j?X{d0B(9eP9E|@JogUXDGHagQedF z@QWI~&u7}eWrG{+x`6w654elKZRK|P7wj!+%tiiQ<44sKgP-qI45Aky?-J9>qGRg zC*vQ_cw7%df7qFxeJ?isXl^ea*EfK>9M;ZI{_g;{D*>(r+#YZ|e{hv+NvvGVw;StjaIcbE<}R19(Hxh* zyWIY=z|8??`kOGYKel@jxPJ$SGgo){&>qyQpa-9cuQxzHe-OO|dQKdj_34CuGxUSZ z|1r#}sO@IXqahLtIgZ;^5wYQuJZl;#8^GF`f}V}xz{^ij@z5TdG#-j+qK}#`raKsUyj=seAhc)KDV9& z&MV&*aM|F@e9wuWFP~d~TX9M8IX<_(;aTtU@wxRK;JnJm=hhzvXO{1|%i?YiKDVCv zoOix_ZoL4USH661eFiu)-p;oPz!x@b0oTne*S`^jH}(OtGG01P2kpnGw(yb z(~rBCqcpiA;NAi^j{dOP{v72Z*9Y!Ra2UaHpTXhprr0SIxwN4;hJaf^ZijA{pvDe+e2%=I&h<(m-bul;I#JJ2d)~NSNnB>s{&`X z-)fyxK1v+|C5JdEoXYz*T{J3EU)oyRCPhZ|nhg2%J}a+rb?KhuhNb zelXAN@3`d4eKUyF-aqttC`^Dh!QV)oo9XtK3vLIvQ*}7~f4b_+{wH%u+&_{r@$xXZ!LI8$c4mQN`PR|j@d>f^v-)X4Z1k}9yHfD2 z3HYr8$9`k_-RteQ1^fr#$LsZqJvL(Q_uUC{$;p<#5xPI~i7G^5VLN4kdmZ_DaYf+v zfy+f2SG#M+ky>zv!Fl!XCU70#`khZ}&pjRi*A1>j&sUo#=>wPYg8`nWF=7u=u)b-i zXg;{*x<6}sn=^dm3czgvH(BRmkIk9wR|#$xIIsFPfNM;^UmLg=6Y$pqZXdYY_427n z62!9}qryJl-@%=(bFt|P&;PSOg7jx2y*;)#=KZq~-2weVr!Mz&I3^Wg9V~s7q>tyn z0s5gq{I__d@09cyHe%(Md%-D)>cjd1{KwN%aNX4a9nBa^FZbe^J{$T2gQPElUO9+f z1-*C>|IF5LJ%7tA$Mt+VG;ZT`q`w6=h}GUkvFBm!k(=y1tc$=8HZGE@!kP>2yRgCI z=-uw~IP>8>a(l2I1m`twwF@^HHi*^sr|nP2A$7r@*Z#!q(h06i_h-azD6)KwXF z?{SOsFIR#aEMK-a=U=kGeU1743BBIkF4yYEi#G6^z~jorU2pa91>#xG9&itU`$zWE z5~R}j!{5$u^h1`PYZ20OUMh&y z_91gqj3QHjbp|+`0lT@C?(>jJ=yMa`8o=Es<#y#OWru9$+Xj1G0$dNcba33(E`R!U z6}DFpEMPYdY!$(2JnQ8&}Jr zFNL1#Oz#+%>!5EQBz+U~x7ai+)E!yx^qL;pMUIZoZMCJm?;K)-Z9wlDgbUB18wKTANp z9Qt`LTmR=~>&7OtfYj@t-v@m+e#dm{e?zD@K_Aue*MB%qd@A%ao&M!rLT3G;CqvJ5>dyTidM5OEdxs~!4y z=$APC%QH>PzX$rnLGn)?g5$*?`KLoK8YKS$=yRaYb>=TGf-vh3ebXR%9rPEVFLI@~ zE-=mQ54~p)y&d|vSK>d%(*wN>`cGZ{U$Ofi-)}Os)%w5OSpTyw5Sf2E^vj^fs~_iy zmqMT7^e>NQnDvK#AN1)?-LRekpk4>P8G5|^s|kA7AnDto4}CSh{~qX>(BqXac^J+s z2GRL`lRKctD_;ThXP`H@>i12%eaoR=aKO4wi?y$Hjh4pxL%$9BSDop3?z7t3M;Xm_ z;ym$-;O4u=nK|Y-LqA8LfB2I~^b@BJKYg{c~?$!M~;r7G#n|%Cp^b02!C@>+Gw-ox=f3fDHV)O&r>3g70_(df8vP*x_E+^k_a_}{4p3C+x z*W^r}4*fmo3ve8@^}t+%1)yF4J>^&Uzp0>8|6Wk(oF{JnbtD>rY^OK=YL~wbdfgk5 z=$)?eRhs2vJ2gRn_cz!-vEA(S+^&;{nLg;29N%v;v=h&*JN=N$a&I@j-{jmsSpN@Z z`;-3#V|`LEzxp!t)0}<+VY|Jup*MF$qE9hndwVq6^(lgW+5e1xysd&h0s2ap|1#Tu z1N5&PjYQjA{$I8Iw?IGZkCEu#T>2-r-UQHQzZJaEB!}yJ#wL6eGJ>trI*=yDfC+CKXL6hE%ts>3;n{s#6RxsfxZ~} zFJ1l*+Wy<14?nIw|71L8>)p`54V~A$c00>8uUUUgXnr61Lrz_uiKCtdJ@u3L=aqcF z$!O?gZU1u5iQBOh`Y7o4I(2ME!!f_lv~}Prz}@QPmzYc5DN;cuX`p z*5zl6U5;+(OYv=qxcmPpKHuZeuW_ZHWT#Jqz8~MDc$^ukb})9D?Z|TS{U%r88x@?t zvGo~zH(g*>KsGr!zTae3TGV<^vGT)yVGX$;torc%CU1aq9lru!w9B&(`mqb~ePAX~ zehlko@F+wbfj((mG&+sCEX=~JxSgwJ>T6tX~FB7&AFW-@Z0fCicL80 z=DVb)yWe!Z&B(($e}|}dga=yVy+V8bfUnk`k(7)0{_hCKOT4iZVC_WyyYOv`-%9@0 zJIbv$oKH31e9kwOBmcbc#t;g>5B~bU^PF$Tw)~~z0oqJ_8)FN%GwPG4*T;G{c3$|f z!S{CuHu(oEI9k~{PpN{xwfMHi_n3it&%OCl`Me~&Fx`GH_a1O3!2N<;oOg1Y?U)xn z5I{Yi9_W?oOp7HO>v8zoaBbB5KYj7XH*(|6)_6yHO=xovZ!`}W_Y5~*j*b`1n_1$W zuT0N=l!Z?A7Scb>ezc%2z_)tOM%G)6z&(C>Z!+^K0#`C68eK*XPWYO7ysh4RSN&wX ztA01$RS);*!FaWNZj$kgBgpZE?>E_=i*G96H{U~j7uw{yq&zbR_VX6}IRKsAQ7ue& z1o1B+ehwp%j_*UC=19l)o4l{3qrYTKlpaMq=S$VX_%uWe#Phqh*P1U)hfM!` zzscUI_`W!KS-5@r5WfrY=6ImSk$mpW)3=85>xSgl44t#_q)o$&ySZ2ACmA~rCL2=O zETqrIMA?C9(dfJMsnXA>!+WA=wXkK`Zv1Pzf;W~5oGXM8&2mBpEer+tD>2F$ibbSEd zFxVQzxWysM`ewr%4l_pMK%Z7%Jv-rN4!+TI8~tEExD)%ql%(nSn zreF=H<~ULXKWp)=AoIK#<>Q;-v7h4abopzw?;db3fvc2p#QxSq|8EjtB=-mA`v+c^v-U$G3@|V}$ulf?0fjrlM++(ieAin+KZok~{cE8!7{$s#uOplHK*rDR%--L%FiK+-8mb5UgKe80(2=NeDpilAxFGGwDeDee` z+BZ+=mJ5y$;qm9*@As|53C>PGih-C@Qg*`ay~fLdy+eHmhFXzlOr84EVZOb7aJvG} z2l4xN!z?BF($Fm5Rrr0g6;4?)^_h_GfIsj^$ajz~9|#=tBj(AFrJuGi^pM}TDujDm z>k;!E$#ujzp;f+%MlJGfl!#$z=S}r-qJTw8MHzj~{uciuLErsBY)(WDJ8SH0U#SI* zJ`Z+c2=~LLhA`Pxdd{oV-L(Aoa6R#leU@#p$aJ?#HIhPGFShqfg9PYh=nZLiVC zpx^5cJ>&O3$;!R!Z}6k{IP{DC=S+ML;pdFdhen{oz{T$Vz!h&9zD?YKs2E$#Hw^iq zVMbjQ!ddT(&!Fl-L;{7-z{i4=u^Kx+CTpG&?|obL07z)CTcCO{MhQ^AHQPR zAqVX)PYl(w7BldF^G^dOYkWR+JoahfWC;f)&r>9fTT?!+XKDHvEj(7jJeA?%4D-_D z646!u&M@^WMYnpCJ4`)W^x^o;#TllaCpxyDx#;2fqH~IXi!;nEaFgiCri%G@3DdXL zaw5brYlK(r=L|E?O3_vMoMEQ9*O4Ey(8CXkj;SJZ(Zdq`UuGVc{MGi+!%vBhsa$i> z!(Ih@LDH-CbB0es;vb35zQ{%IkFSbOmW#9fS>|7ej;SYeafaDvJ4ILhLk}O-{OjQl zG+hrL7hUyVJscHX)!!Lr9}GTj^+NvUqK8Llx*oo#(Mo@>ScbUXC*dt(xi2vO0SRx_ z`0WyY#KAMoHwK8OpPdr_m{^r>qlBLntMYwH!p}J3sqK~Ub7GaBW(og5EZc|tehI%K zmT_EPmGDo+a@#Zh7ZPrF@XVt_!oSwyezDvS?)c9@*|GO6dfrLL2 z%Q7;LKS}swjsHZ#C&aQJlkbyoRO5{&sQP>%v8w#TB%CBxUyTr<|xb_Liwumml8K*GV5iV8Iua)pdvD@SL z8JT0{KUwsVl3ryrCr&!0`y_p)aG6?qn~U>fG9R|ZqROFTYeiT2==yf0i}0it*7?uF zpSQs0E%12@eBJ{894&A(*E&9Jd`XUrVmp3lg^!B;KdsFH@&BIq9VhcuGsJJvKj`19 zT)TE!$G>=7iH9C9U83>NPqo@N++ww7q1a2zhjTISBsNihUfkqw4PIZb^q=dWx4`Eu z@Xyl%)~JH#8hIlgiwd`C;SLF_>$r`_EM8r=jhFL!HD8DuS>~eVXP27~S>gYptZ3g` zc(#m-ntwcHmK9dlmw5ETTmoW`&9cTpH9BoEZ=zfG!-=SQSUk#NE+>9#Srvb1w-r|N zm6?}YVRe11@{2^H<|XJB;c@rF46A&PN%*eEt@MAD@H}b z&;M6zeIR@A`t6-Qu-+`=M61{iv0Y+&#YV)2|7^A37_k{*bHo;kEf!lLwpwhx*haC< zVq3*_i0u;FD>foF{ITROHbZQV*g~(*iD7IN_tJn^)U1EF1M#P5yBKeEW z5St^mP;9Z-3bEB<>%}&TZ5G=qwnJ=}*j}*_vEk#Azt{}1IbsXN7K^PATP?O;Y@^s_ zv8`e|#CD186&n#7{zUQ@n;|wwY@yg(*iD7IN_tJn^)U1EF1M#P5uB!96P zVspe6iY*pfA+}m%}&TZ5G=qwnJ=}*j}*_v0?LJ zedI4TLu`)NLb1hSE5ufdtry!Uwpnbe*bcE>Vtd6##D?VxV2s!du{mN3#TJXL5L+#_ zUTmY-X0feeJH&R0?G+ml8wDMvH!d0d-iiwc~hobojN|RaQ?-qSs9mQOiZ1anK>!*s?4m^@zIr%a$!J+pw%`ZRKK=qr42Mm#$y$%UD*qW*tna zWmYajB06HO@M)HC$?6r$;9w2%!k-MY09Iy}hc&BLmsM0+hr56HFXv4-*P`Yr)clLG zxu;rLC|%8isQH>xAk&A^)%=XI+q13o0T`|-{b(!Ncb3Gf^lH9GSv9{SxQzBHgy(JW zlXER9y_#Q9Hd!W;l&;$hr03j?idXYD%1)N7Save1{1WZE20z#qD!rO7QdZ3uDP5&k z_0QANtNABo)qEAxbIwUmKNoR4@~HVSHNU2;$_I$KsO_f0oSt*0-znGA${yebb}TCW zNQqkr>r7uF$2nyWeVuA-QR!67E%@O~ujT`l)t|Re`K$EHB)w{1_1uB7$Ie%zWmDZj z-ztQeze=CkZ2eM}|AXmV^!)FH=uE%%XI6S;%a=P-$F`q}tNbDUydQ4^tN ztku`#r)j={zw8qMDcG*d#+vcFF0=gT?XCKc3E|IUSXq9H#=qNW>BlQjte$?imi~~W zKa^np-__E;CF$Ri^m=}JxLHeoRMH=n^oP!rf{RIY2YoLi%za1IU(HADoo>bKV&gb; zmA`7&HfYZF%bz*cG!IRWyZ#~zw+}7ExnqrJ~qore@uaK(!ZglSLc^U7g*^h zNjhaTcfPkEFwUZVzSMufvalQwse NmGC`hB!27Z{}+1C0BisN delta 12226 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 Yd!Q9?QLIE;o)#IneJ4fXu4Qun2Yvw|$p8QV From 2b502077b6dbaf34b71d589aa7b47531b610c070 Mon Sep 17 00:00:00 2001 From: "Taro L. Saito" Date: Thu, 28 Mar 2013 17:27:13 +0900 Subject: [PATCH 02/35] Add note on building linux amd64 binary using custom g++ --- README.md | 10 +++++++++- src/main/java/org/xerial/snappy/SnappyLoader.java | 2 +- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6ca93c9..1c2653f 100755 --- a/README.md +++ b/README.md @@ -51,7 +51,7 @@ In addition, high-level methods (`Snappy.compress(String)`, `Snappy.compress(flo ### Stream-based API Stream-based compressor/decompressor `SnappyOutputStream`/`SnappyInputStream` are also available for reading/writing large data sets. - * [Javadoc API](https://oss.sonatype.org/service/local/repositories/snapshots/archive/org/xerial/snappy/snappy-java/1.0.5-M5-SNAPSHOT/snappy-java-1.0.5-M5-20130319.150524-2-javadoc.jar/!/index.html) + * [Javadoc API](https://oss.sonatype.org/service/local/repositories/releases/archive/org/xerial/snappy/snappy-java/1.1.0-M2/snappy-java-1.1.0-M2-javadoc.jar/!/index.html) ### Setting classpath If you have snappy-java-(VERSION).jar in the current directory, use `-classpath` option as follows: @@ -91,6 +91,14 @@ See the [installation instruction](https://github.com/xerial/snappy-java/blob/de A file `target/snappy-java-$(version).jar` is the product additionally containing the native library built for your platform. +## Build linux amd64 binary + +snappy-java tries to static link libstdc++ to increase the availability for various Linux versions. However, standard distribuions of 64-bit Linux OS rarely provide libstdc++ compiled with `-fPIC` option. I currently uses custom g++ compiled with the following options: + + $ ./configure --prefix=$HOME/local --with-gmp=$HOME/local --with-mpfr=$HOME/local --with-mpc=$HOME/local --with-ppl=$HOME/local --with-cloog=$HOME/local CXXFLAGS=-fPIC CFLAGS=-fPIC + +This g++ build enables static linking of libstdc++. For details, see GCC's home page. + ## Cross-compiling for other platforms The Makefile contains rules for cross-compiling the native library for other platforms so that the snappy-java JAR can support multiple platforms. For example, to build the native libraries for x86 Linux, x86 and x86-64 Windows, and soft- and hard-float ARM: diff --git a/src/main/java/org/xerial/snappy/SnappyLoader.java b/src/main/java/org/xerial/snappy/SnappyLoader.java index 99b0e7a..56f719b 100755 --- a/src/main/java/org/xerial/snappy/SnappyLoader.java +++ b/src/main/java/org/xerial/snappy/SnappyLoader.java @@ -499,7 +499,7 @@ public class SnappyLoader version = versionData.getProperty("version", version); if (version.equals("unknown")) version = versionData.getProperty("VERSION", version); - version = version.trim().replaceAll("[^0-9\\.]", ""); + version = version.trim().replaceAll("[^0-9M\\.]", ""); } } catch (IOException e) { From 1ea90b2421259481cd513bda01b3b8ca1b52990e Mon Sep 17 00:00:00 2001 From: "Taro L. Saito" Date: Thu, 28 Mar 2013 17:34:29 +0900 Subject: [PATCH 03/35] Fix doc. 1.1.0-M3 version --- README.md | 22 ++++++++++++---------- pom.xml | 2 +- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 1c2653f..f6ba7df 100755 --- a/README.md +++ b/README.md @@ -31,19 +31,21 @@ If you are a Maven user, see [pom.xml example](#using-with-maven). ## Usage First, import `org.xerial.snapy.Snappy` in your Java code: - import org.xerial.snappy.Snappy; - +```java +import org.xerial.snappy.Snappy; +``` Then use `Snappy.compress(byte[])` and `Snappy.uncompress(byte[])`: - String input = "Hello snappy-java! Snappy-java is a JNI-based wrapper of " +```java +String input = "Hello snappy-java! Snappy-java is a JNI-based wrapper of " + "Snappy, a fast compresser/decompresser."; - byte[] compressed = Snappy.compress(input.getBytes("UTF-8")); - byte[] uncompressed = Snappy.uncompress(compressed); +byte[] compressed = Snappy.compress(input.getBytes("UTF-8")); +byte[] uncompressed = Snappy.uncompress(compressed); - String result = new String(uncompressed, "UTF-8"); - System.out.println(result); - +String result = new String(uncompressed, "UTF-8"); +System.out.println(result); +``` In addition, high-level methods (`Snappy.compress(String)`, `Snappy.compress(float[] ..)` etc. ) and low-level ones (e.g. `Snappy.rawCompress(.. )`, `Snappy.rawUncompress(..)`, etc.), which minimize memory copies, can be used. See also [Snappy.java](https://github.com/xerial/snappy-java/blob/master/src/main/java/org/xerial/snappy/Snappy.java) @@ -91,13 +93,13 @@ See the [installation instruction](https://github.com/xerial/snappy-java/blob/de A file `target/snappy-java-$(version).jar` is the product additionally containing the native library built for your platform. -## Build linux amd64 binary +## Building linux amd64 binary snappy-java tries to static link libstdc++ to increase the availability for various Linux versions. However, standard distribuions of 64-bit Linux OS rarely provide libstdc++ compiled with `-fPIC` option. I currently uses custom g++ compiled with the following options: $ ./configure --prefix=$HOME/local --with-gmp=$HOME/local --with-mpfr=$HOME/local --with-mpc=$HOME/local --with-ppl=$HOME/local --with-cloog=$HOME/local CXXFLAGS=-fPIC CFLAGS=-fPIC -This g++ build enables static linking of libstdc++. For details, see GCC's home page. +This g++ build enables static linking of libstdc++. For more infomation on building GCC, see GCC's home page. ## Cross-compiling for other platforms The Makefile contains rules for cross-compiling the native library for other platforms so that the snappy-java JAR can support multiple platforms. For example, to build the native libraries for x86 Linux, x86 and x86-64 Windows, and soft- and hard-float ARM: diff --git a/pom.xml b/pom.xml index 775bde8..4e962fa 100755 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 org.xerial.snappy snappy-java - 1.1.0-M3-SNAPSHOT + 1.1.0-M3 Snappy for Java snappy-java: A fast compression/decompression library bundle From 920b838423733bcedd3500073a43438ae8cb26b3 Mon Sep 17 00:00:00 2001 From: "Taro L. Saito" Date: Thu, 28 Mar 2013 17:41:45 +0900 Subject: [PATCH 04/35] update milestone --- Milestone.md | 4 ++-- README.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Milestone.md b/Milestone.md index afc50e1..4c24fa6 100644 --- a/Milestone.md +++ b/Milestone.md @@ -2,8 +2,8 @@ * `SnappyIndexer` for parallel compression/decompression * CUI commands (snap/unsnap) -## snappy-java-1.1.0-M2 (28 March 2013) - * Fix linux amd64 build +## snappy-java-1.1.0-M3 (28 March 2013) + * Fix linux amd64 build (embed libstdc++) * Fixes #26 ## snappy-java-1.1.0-M1 (27 March 2013) diff --git a/README.md b/README.md index f6ba7df..592be3c 100755 --- a/README.md +++ b/README.md @@ -95,7 +95,7 @@ A file `target/snappy-java-$(version).jar` is the product additionally containin ## Building linux amd64 binary -snappy-java tries to static link libstdc++ to increase the availability for various Linux versions. However, standard distribuions of 64-bit Linux OS rarely provide libstdc++ compiled with `-fPIC` option. I currently uses custom g++ compiled with the following options: +snappy-java tries to static link libstdc++ to increase the availability for various Linux versions. However, standard distributions of 64-bit Linux OS rarely provide libstdc++ compiled with `-fPIC` option. I currently uses custom g++ compiled with the following options: $ ./configure --prefix=$HOME/local --with-gmp=$HOME/local --with-mpfr=$HOME/local --with-mpc=$HOME/local --with-ppl=$HOME/local --with-cloog=$HOME/local CXXFLAGS=-fPIC CFLAGS=-fPIC From e1f4364c9a262b10d5718548cf1d318e73a1efb0 Mon Sep 17 00:00:00 2001 From: "Taro L. Saito" Date: Thu, 28 Mar 2013 17:46:28 +0900 Subject: [PATCH 05/35] Fix javadoc link. new snapshot version --- README.md | 2 +- pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 592be3c..6974246 100755 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ In addition, high-level methods (`Snappy.compress(String)`, `Snappy.compress(flo ### Stream-based API Stream-based compressor/decompressor `SnappyOutputStream`/`SnappyInputStream` are also available for reading/writing large data sets. - * [Javadoc API](https://oss.sonatype.org/service/local/repositories/releases/archive/org/xerial/snappy/snappy-java/1.1.0-M2/snappy-java-1.1.0-M2-javadoc.jar/!/index.html) + * [Javadoc API](https://oss.sonatype.org/service/local/repositories/releases/archive/org/xerial/snappy/snappy-java/1.1.0-M3/snappy-java-1.1.0-M3-javadoc.jar/!/index.html) ### Setting classpath If you have snappy-java-(VERSION).jar in the current directory, use `-classpath` option as follows: diff --git a/pom.xml b/pom.xml index 4e962fa..6285dd0 100755 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 org.xerial.snappy snappy-java - 1.1.0-M3 + 1.1.0-SNAPSHOT Snappy for Java snappy-java: A fast compression/decompression library bundle From 90b6f1e606c081707655a312a54065c0022c06a2 Mon Sep 17 00:00:00 2001 From: "Taro L. Saito" Date: Thu, 28 Mar 2013 17:46:59 +0900 Subject: [PATCH 06/35] revert version --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6285dd0..4e962fa 100755 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 org.xerial.snappy snappy-java - 1.1.0-SNAPSHOT + 1.1.0-M3 Snappy for Java snappy-java: A fast compression/decompression library bundle From 07bfea7da00f50a4dc064bba4e71d7b709a11602 Mon Sep 17 00:00:00 2001 From: "Taro L. Saito" Date: Thu, 28 Mar 2013 17:47:26 +0900 Subject: [PATCH 07/35] new version --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 4e962fa..6a1ea63 100755 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 org.xerial.snappy snappy-java - 1.1.0-M3 + 1.1.0-M4-SNAPSHOT Snappy for Java snappy-java: A fast compression/decompression library bundle From 8ff03ba7821ab298c44cfc8189179d32fded174a Mon Sep 17 00:00:00 2001 From: "Taro L. Saito" Date: Fri, 29 Mar 2013 10:37:33 +0900 Subject: [PATCH 08/35] Fix native library version --- src/main/java/org/xerial/snappy/SnappyNative.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/xerial/snappy/SnappyNative.cpp b/src/main/java/org/xerial/snappy/SnappyNative.cpp index 386b039..af7be0e 100755 --- a/src/main/java/org/xerial/snappy/SnappyNative.cpp +++ b/src/main/java/org/xerial/snappy/SnappyNative.cpp @@ -33,7 +33,7 @@ void throw_exception(JNIEnv *env, jobject self, int errorCode) JNIEXPORT jstring JNICALL Java_org_xerial_snappy_SnappyNative_nativeLibraryVersion (JNIEnv * env, jobject self) { - return env->NewStringUTF("1.0.4"); + return env->NewStringUTF("1.1.0"); } JNIEXPORT jlong JNICALL Java_org_xerial_snappy_SnappyNative_rawCompress__JJJ From 34ba11cc9aba0646126108474ab2a880b3933ca0 Mon Sep 17 00:00:00 2001 From: "Taro L. Saito" Date: Wed, 10 Apr 2013 10:33:28 +0900 Subject: [PATCH 09/35] Fix Makefile dependencies when generating SnappyNative.h --- Makefile | 6 ++++-- .../native/Mac/x86_64/libsnappyjava.jnilib | Bin 48156 -> 48156 bytes 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index c4ba514..11173c0 100644 --- a/Makefile +++ b/Makefile @@ -26,9 +26,11 @@ $(SNAPPY_UNPACKED): $(SNAPPY_ARCHIVE) jni-header: $(SRC)/org/xerial/snappy/SnappyNative.h - -$(SRC)/org/xerial/snappy/SnappyNative.h: $(SRC)/org/xerial/snappy/SnappyNative.java +$(TARGET)/classes/org/xerial/snappy/SnappyNative.class : $(SRC)/org/xerial/snappy/SnappyNative.java @mkdir -p $(TARGET)/classes + $(JAVAC) -source 1.6 -target 1.6 -d $(TARGET)/classes -sourcepath $(SRC) $< + +$(SRC)/org/xerial/snappy/SnappyNative.h: $(TARGET)/classes/org/xerial/snappy/SnappyNative.class $(JAVAH) -classpath $(TARGET)/classes -o $@ org.xerial.snappy.SnappyNative bytecode: src/main/resources/org/xerial/snappy/SnappyNativeLoader.bytecode diff --git a/src/main/resources/org/xerial/snappy/native/Mac/x86_64/libsnappyjava.jnilib b/src/main/resources/org/xerial/snappy/native/Mac/x86_64/libsnappyjava.jnilib index 75f3e69c2a2993edfb26364edfa75d946fdd9052..392e03b036c2d524c3d42248fcb1ae9c03fc01bf 100755 GIT binary patch delta 40 ycmV+@0N4MV_yU~x04 From 04ccfaf7b621d85159a63aeb9604ae682b81eef0 Mon Sep 17 00:00:00 2001 From: "Taro L. Saito" Date: Wed, 10 Apr 2013 10:36:23 +0900 Subject: [PATCH 10/35] Fixes #22. Add OpenBSD native libraries --- .../native/OpenBSD/amd64/libsnappyjava.so | Bin 0 -> 147576 bytes .../native/OpenBSD/i386/libsnappyjava.so | Bin 0 -> 135992 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100755 src/main/resources/org/xerial/snappy/native/OpenBSD/amd64/libsnappyjava.so create mode 100755 src/main/resources/org/xerial/snappy/native/OpenBSD/i386/libsnappyjava.so diff --git a/src/main/resources/org/xerial/snappy/native/OpenBSD/amd64/libsnappyjava.so b/src/main/resources/org/xerial/snappy/native/OpenBSD/amd64/libsnappyjava.so new file mode 100755 index 0000000000000000000000000000000000000000..e6e542b6c5a36597efce2272652f99340f434883 GIT binary patch literal 147576 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 s-D@TtX#=236}~rt(>>EA@VG%&vIqwAr Date: Mon, 15 Apr 2013 11:15:02 -0500 Subject: [PATCH 11/35] add support for x-snappy-framed streams https://github.com/xerial/snappy-java/issues/30 --- NOTICE | 3 + .../org/xerial/snappy/PureJavaCrc32C.java | 617 ++++++++++++++++++ .../java/org/xerial/snappy/SnappyFramed.java | 128 ++++ .../snappy/SnappyFramedInputStream.java | 452 +++++++++++++ .../snappy/SnappyFramedOutputStream.java | 317 +++++++++ .../java/org/xerial/snappy/CalgaryTest.java | 112 +++- .../org/xerial/snappy/RandomGenerator.java | 68 ++ .../xerial/snappy/SnappyFramedStreamTest.java | 300 +++++++++ 8 files changed, 1996 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/xerial/snappy/PureJavaCrc32C.java create mode 100644 src/main/java/org/xerial/snappy/SnappyFramed.java create mode 100644 src/main/java/org/xerial/snappy/SnappyFramedInputStream.java create mode 100644 src/main/java/org/xerial/snappy/SnappyFramedOutputStream.java create mode 100644 src/test/java/org/xerial/snappy/RandomGenerator.java create mode 100644 src/test/java/org/xerial/snappy/SnappyFramedStreamTest.java diff --git a/NOTICE b/NOTICE index 639ab66..7f27722 100755 --- a/NOTICE +++ b/NOTICE @@ -1,6 +1,9 @@ This product includes software developed by Google Snappy: http://code.google.com/p/snappy/ (New BSD License) +This product includes software developed by Apache + PureJavaCrc32C from apache-hadoop-common http://hadoop.apache.org/ + (Apache 2.0 license) This library containd statically linked libstdc++. This inclusion is allowed by "GCC RUntime Library Exception" diff --git a/src/main/java/org/xerial/snappy/PureJavaCrc32C.java b/src/main/java/org/xerial/snappy/PureJavaCrc32C.java new file mode 100644 index 0000000..fec20eb --- /dev/null +++ b/src/main/java/org/xerial/snappy/PureJavaCrc32C.java @@ -0,0 +1,617 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + * + * Some portions of this file Copyright (c) 2004-2006 Intel Corportation + * and licensed under the BSD license. + */ +package org.xerial.snappy; + +import java.util.zip.Checksum; + +/** + * A pure-java implementation of the CRC32 checksum that uses + * the CRC32-C polynomial, the same polynomial used by iSCSI + * and implemented on many Intel chipsets supporting SSE4.2. + */ +public class PureJavaCrc32C implements Checksum { + + /** the current CRC value, bit-flipped */ + private int crc; + + /** Create a new PureJavaCrc32 object. */ + public PureJavaCrc32C() { + reset(); + } + + public int getIntegerValue() { + return ~crc; + } + + /** {@inheritDoc} */ + public long getValue() { + long ret = crc; + return (~ret) & 0xffffffffL; + } + + /** {@inheritDoc} */ + public void reset() { + crc = 0xffffffff; + } + + /** {@inheritDoc} */ + public void update(byte[] b, int off, int len) { + int localCrc = crc; + while(len > 7) { + int c0 = b[off++] ^ localCrc; + int c1 = b[off++] ^ (localCrc >>>= 8); + int c2 = b[off++] ^ (localCrc >>>= 8); + int c3 = b[off++] ^ (localCrc >>>= 8); + localCrc = (T8_7[c0 & 0xff] ^ T8_6[c1 & 0xff]) + ^ (T8_5[c2 & 0xff] ^ T8_4[c3 & 0xff]); + + localCrc ^= (T8_3[b[off++] & 0xff] ^ T8_2[b[off++] & 0xff]) + ^ (T8_1[b[off++] & 0xff] ^ T8_0[b[off++] & 0xff]); + + len -= 8; + } + while(len > 0) { + localCrc = (localCrc >>> 8) ^ T8_0[(localCrc ^ b[off++]) & 0xff]; + len--; + } + + // Publish crc out to object + crc = localCrc; + } + + /** {@inheritDoc} */ + final public void update(int b) { + crc = (crc >>> 8) ^ T8_0[(crc ^ b) & 0xff]; + } + + // CRC polynomial tables generated by: + // java -cp build/test/classes/:build/classes/ \ + // org.apache.hadoop.util.TestPureJavaCrc32\$Table 82F63B78 + + static final int[] T8_0 = new int[] { + 0x00000000, 0xF26B8303, 0xE13B70F7, 0x1350F3F4, + 0xC79A971F, 0x35F1141C, 0x26A1E7E8, 0xD4CA64EB, + 0x8AD958CF, 0x78B2DBCC, 0x6BE22838, 0x9989AB3B, + 0x4D43CFD0, 0xBF284CD3, 0xAC78BF27, 0x5E133C24, + 0x105EC76F, 0xE235446C, 0xF165B798, 0x030E349B, + 0xD7C45070, 0x25AFD373, 0x36FF2087, 0xC494A384, + 0x9A879FA0, 0x68EC1CA3, 0x7BBCEF57, 0x89D76C54, + 0x5D1D08BF, 0xAF768BBC, 0xBC267848, 0x4E4DFB4B, + 0x20BD8EDE, 0xD2D60DDD, 0xC186FE29, 0x33ED7D2A, + 0xE72719C1, 0x154C9AC2, 0x061C6936, 0xF477EA35, + 0xAA64D611, 0x580F5512, 0x4B5FA6E6, 0xB93425E5, + 0x6DFE410E, 0x9F95C20D, 0x8CC531F9, 0x7EAEB2FA, + 0x30E349B1, 0xC288CAB2, 0xD1D83946, 0x23B3BA45, + 0xF779DEAE, 0x05125DAD, 0x1642AE59, 0xE4292D5A, + 0xBA3A117E, 0x4851927D, 0x5B016189, 0xA96AE28A, + 0x7DA08661, 0x8FCB0562, 0x9C9BF696, 0x6EF07595, + 0x417B1DBC, 0xB3109EBF, 0xA0406D4B, 0x522BEE48, + 0x86E18AA3, 0x748A09A0, 0x67DAFA54, 0x95B17957, + 0xCBA24573, 0x39C9C670, 0x2A993584, 0xD8F2B687, + 0x0C38D26C, 0xFE53516F, 0xED03A29B, 0x1F682198, + 0x5125DAD3, 0xA34E59D0, 0xB01EAA24, 0x42752927, + 0x96BF4DCC, 0x64D4CECF, 0x77843D3B, 0x85EFBE38, + 0xDBFC821C, 0x2997011F, 0x3AC7F2EB, 0xC8AC71E8, + 0x1C661503, 0xEE0D9600, 0xFD5D65F4, 0x0F36E6F7, + 0x61C69362, 0x93AD1061, 0x80FDE395, 0x72966096, + 0xA65C047D, 0x5437877E, 0x4767748A, 0xB50CF789, + 0xEB1FCBAD, 0x197448AE, 0x0A24BB5A, 0xF84F3859, + 0x2C855CB2, 0xDEEEDFB1, 0xCDBE2C45, 0x3FD5AF46, + 0x7198540D, 0x83F3D70E, 0x90A324FA, 0x62C8A7F9, + 0xB602C312, 0x44694011, 0x5739B3E5, 0xA55230E6, + 0xFB410CC2, 0x092A8FC1, 0x1A7A7C35, 0xE811FF36, + 0x3CDB9BDD, 0xCEB018DE, 0xDDE0EB2A, 0x2F8B6829, + 0x82F63B78, 0x709DB87B, 0x63CD4B8F, 0x91A6C88C, + 0x456CAC67, 0xB7072F64, 0xA457DC90, 0x563C5F93, + 0x082F63B7, 0xFA44E0B4, 0xE9141340, 0x1B7F9043, + 0xCFB5F4A8, 0x3DDE77AB, 0x2E8E845F, 0xDCE5075C, + 0x92A8FC17, 0x60C37F14, 0x73938CE0, 0x81F80FE3, + 0x55326B08, 0xA759E80B, 0xB4091BFF, 0x466298FC, + 0x1871A4D8, 0xEA1A27DB, 0xF94AD42F, 0x0B21572C, + 0xDFEB33C7, 0x2D80B0C4, 0x3ED04330, 0xCCBBC033, + 0xA24BB5A6, 0x502036A5, 0x4370C551, 0xB11B4652, + 0x65D122B9, 0x97BAA1BA, 0x84EA524E, 0x7681D14D, + 0x2892ED69, 0xDAF96E6A, 0xC9A99D9E, 0x3BC21E9D, + 0xEF087A76, 0x1D63F975, 0x0E330A81, 0xFC588982, + 0xB21572C9, 0x407EF1CA, 0x532E023E, 0xA145813D, + 0x758FE5D6, 0x87E466D5, 0x94B49521, 0x66DF1622, + 0x38CC2A06, 0xCAA7A905, 0xD9F75AF1, 0x2B9CD9F2, + 0xFF56BD19, 0x0D3D3E1A, 0x1E6DCDEE, 0xEC064EED, + 0xC38D26C4, 0x31E6A5C7, 0x22B65633, 0xD0DDD530, + 0x0417B1DB, 0xF67C32D8, 0xE52CC12C, 0x1747422F, + 0x49547E0B, 0xBB3FFD08, 0xA86F0EFC, 0x5A048DFF, + 0x8ECEE914, 0x7CA56A17, 0x6FF599E3, 0x9D9E1AE0, + 0xD3D3E1AB, 0x21B862A8, 0x32E8915C, 0xC083125F, + 0x144976B4, 0xE622F5B7, 0xF5720643, 0x07198540, + 0x590AB964, 0xAB613A67, 0xB831C993, 0x4A5A4A90, + 0x9E902E7B, 0x6CFBAD78, 0x7FAB5E8C, 0x8DC0DD8F, + 0xE330A81A, 0x115B2B19, 0x020BD8ED, 0xF0605BEE, + 0x24AA3F05, 0xD6C1BC06, 0xC5914FF2, 0x37FACCF1, + 0x69E9F0D5, 0x9B8273D6, 0x88D28022, 0x7AB90321, + 0xAE7367CA, 0x5C18E4C9, 0x4F48173D, 0xBD23943E, + 0xF36E6F75, 0x0105EC76, 0x12551F82, 0xE03E9C81, + 0x34F4F86A, 0xC69F7B69, 0xD5CF889D, 0x27A40B9E, + 0x79B737BA, 0x8BDCB4B9, 0x988C474D, 0x6AE7C44E, + 0xBE2DA0A5, 0x4C4623A6, 0x5F16D052, 0xAD7D5351 + }; + static final int[] T8_1 = new int[] { + 0x00000000, 0x13A29877, 0x274530EE, 0x34E7A899, + 0x4E8A61DC, 0x5D28F9AB, 0x69CF5132, 0x7A6DC945, + 0x9D14C3B8, 0x8EB65BCF, 0xBA51F356, 0xA9F36B21, + 0xD39EA264, 0xC03C3A13, 0xF4DB928A, 0xE7790AFD, + 0x3FC5F181, 0x2C6769F6, 0x1880C16F, 0x0B225918, + 0x714F905D, 0x62ED082A, 0x560AA0B3, 0x45A838C4, + 0xA2D13239, 0xB173AA4E, 0x859402D7, 0x96369AA0, + 0xEC5B53E5, 0xFFF9CB92, 0xCB1E630B, 0xD8BCFB7C, + 0x7F8BE302, 0x6C297B75, 0x58CED3EC, 0x4B6C4B9B, + 0x310182DE, 0x22A31AA9, 0x1644B230, 0x05E62A47, + 0xE29F20BA, 0xF13DB8CD, 0xC5DA1054, 0xD6788823, + 0xAC154166, 0xBFB7D911, 0x8B507188, 0x98F2E9FF, + 0x404E1283, 0x53EC8AF4, 0x670B226D, 0x74A9BA1A, + 0x0EC4735F, 0x1D66EB28, 0x298143B1, 0x3A23DBC6, + 0xDD5AD13B, 0xCEF8494C, 0xFA1FE1D5, 0xE9BD79A2, + 0x93D0B0E7, 0x80722890, 0xB4958009, 0xA737187E, + 0xFF17C604, 0xECB55E73, 0xD852F6EA, 0xCBF06E9D, + 0xB19DA7D8, 0xA23F3FAF, 0x96D89736, 0x857A0F41, + 0x620305BC, 0x71A19DCB, 0x45463552, 0x56E4AD25, + 0x2C896460, 0x3F2BFC17, 0x0BCC548E, 0x186ECCF9, + 0xC0D23785, 0xD370AFF2, 0xE797076B, 0xF4359F1C, + 0x8E585659, 0x9DFACE2E, 0xA91D66B7, 0xBABFFEC0, + 0x5DC6F43D, 0x4E646C4A, 0x7A83C4D3, 0x69215CA4, + 0x134C95E1, 0x00EE0D96, 0x3409A50F, 0x27AB3D78, + 0x809C2506, 0x933EBD71, 0xA7D915E8, 0xB47B8D9F, + 0xCE1644DA, 0xDDB4DCAD, 0xE9537434, 0xFAF1EC43, + 0x1D88E6BE, 0x0E2A7EC9, 0x3ACDD650, 0x296F4E27, + 0x53028762, 0x40A01F15, 0x7447B78C, 0x67E52FFB, + 0xBF59D487, 0xACFB4CF0, 0x981CE469, 0x8BBE7C1E, + 0xF1D3B55B, 0xE2712D2C, 0xD69685B5, 0xC5341DC2, + 0x224D173F, 0x31EF8F48, 0x050827D1, 0x16AABFA6, + 0x6CC776E3, 0x7F65EE94, 0x4B82460D, 0x5820DE7A, + 0xFBC3FAF9, 0xE861628E, 0xDC86CA17, 0xCF245260, + 0xB5499B25, 0xA6EB0352, 0x920CABCB, 0x81AE33BC, + 0x66D73941, 0x7575A136, 0x419209AF, 0x523091D8, + 0x285D589D, 0x3BFFC0EA, 0x0F186873, 0x1CBAF004, + 0xC4060B78, 0xD7A4930F, 0xE3433B96, 0xF0E1A3E1, + 0x8A8C6AA4, 0x992EF2D3, 0xADC95A4A, 0xBE6BC23D, + 0x5912C8C0, 0x4AB050B7, 0x7E57F82E, 0x6DF56059, + 0x1798A91C, 0x043A316B, 0x30DD99F2, 0x237F0185, + 0x844819FB, 0x97EA818C, 0xA30D2915, 0xB0AFB162, + 0xCAC27827, 0xD960E050, 0xED8748C9, 0xFE25D0BE, + 0x195CDA43, 0x0AFE4234, 0x3E19EAAD, 0x2DBB72DA, + 0x57D6BB9F, 0x447423E8, 0x70938B71, 0x63311306, + 0xBB8DE87A, 0xA82F700D, 0x9CC8D894, 0x8F6A40E3, + 0xF50789A6, 0xE6A511D1, 0xD242B948, 0xC1E0213F, + 0x26992BC2, 0x353BB3B5, 0x01DC1B2C, 0x127E835B, + 0x68134A1E, 0x7BB1D269, 0x4F567AF0, 0x5CF4E287, + 0x04D43CFD, 0x1776A48A, 0x23910C13, 0x30339464, + 0x4A5E5D21, 0x59FCC556, 0x6D1B6DCF, 0x7EB9F5B8, + 0x99C0FF45, 0x8A626732, 0xBE85CFAB, 0xAD2757DC, + 0xD74A9E99, 0xC4E806EE, 0xF00FAE77, 0xE3AD3600, + 0x3B11CD7C, 0x28B3550B, 0x1C54FD92, 0x0FF665E5, + 0x759BACA0, 0x663934D7, 0x52DE9C4E, 0x417C0439, + 0xA6050EC4, 0xB5A796B3, 0x81403E2A, 0x92E2A65D, + 0xE88F6F18, 0xFB2DF76F, 0xCFCA5FF6, 0xDC68C781, + 0x7B5FDFFF, 0x68FD4788, 0x5C1AEF11, 0x4FB87766, + 0x35D5BE23, 0x26772654, 0x12908ECD, 0x013216BA, + 0xE64B1C47, 0xF5E98430, 0xC10E2CA9, 0xD2ACB4DE, + 0xA8C17D9B, 0xBB63E5EC, 0x8F844D75, 0x9C26D502, + 0x449A2E7E, 0x5738B609, 0x63DF1E90, 0x707D86E7, + 0x0A104FA2, 0x19B2D7D5, 0x2D557F4C, 0x3EF7E73B, + 0xD98EEDC6, 0xCA2C75B1, 0xFECBDD28, 0xED69455F, + 0x97048C1A, 0x84A6146D, 0xB041BCF4, 0xA3E32483 + }; + static final int[] T8_2 = new int[] { + 0x00000000, 0xA541927E, 0x4F6F520D, 0xEA2EC073, + 0x9EDEA41A, 0x3B9F3664, 0xD1B1F617, 0x74F06469, + 0x38513EC5, 0x9D10ACBB, 0x773E6CC8, 0xD27FFEB6, + 0xA68F9ADF, 0x03CE08A1, 0xE9E0C8D2, 0x4CA15AAC, + 0x70A27D8A, 0xD5E3EFF4, 0x3FCD2F87, 0x9A8CBDF9, + 0xEE7CD990, 0x4B3D4BEE, 0xA1138B9D, 0x045219E3, + 0x48F3434F, 0xEDB2D131, 0x079C1142, 0xA2DD833C, + 0xD62DE755, 0x736C752B, 0x9942B558, 0x3C032726, + 0xE144FB14, 0x4405696A, 0xAE2BA919, 0x0B6A3B67, + 0x7F9A5F0E, 0xDADBCD70, 0x30F50D03, 0x95B49F7D, + 0xD915C5D1, 0x7C5457AF, 0x967A97DC, 0x333B05A2, + 0x47CB61CB, 0xE28AF3B5, 0x08A433C6, 0xADE5A1B8, + 0x91E6869E, 0x34A714E0, 0xDE89D493, 0x7BC846ED, + 0x0F382284, 0xAA79B0FA, 0x40577089, 0xE516E2F7, + 0xA9B7B85B, 0x0CF62A25, 0xE6D8EA56, 0x43997828, + 0x37691C41, 0x92288E3F, 0x78064E4C, 0xDD47DC32, + 0xC76580D9, 0x622412A7, 0x880AD2D4, 0x2D4B40AA, + 0x59BB24C3, 0xFCFAB6BD, 0x16D476CE, 0xB395E4B0, + 0xFF34BE1C, 0x5A752C62, 0xB05BEC11, 0x151A7E6F, + 0x61EA1A06, 0xC4AB8878, 0x2E85480B, 0x8BC4DA75, + 0xB7C7FD53, 0x12866F2D, 0xF8A8AF5E, 0x5DE93D20, + 0x29195949, 0x8C58CB37, 0x66760B44, 0xC337993A, + 0x8F96C396, 0x2AD751E8, 0xC0F9919B, 0x65B803E5, + 0x1148678C, 0xB409F5F2, 0x5E273581, 0xFB66A7FF, + 0x26217BCD, 0x8360E9B3, 0x694E29C0, 0xCC0FBBBE, + 0xB8FFDFD7, 0x1DBE4DA9, 0xF7908DDA, 0x52D11FA4, + 0x1E704508, 0xBB31D776, 0x511F1705, 0xF45E857B, + 0x80AEE112, 0x25EF736C, 0xCFC1B31F, 0x6A802161, + 0x56830647, 0xF3C29439, 0x19EC544A, 0xBCADC634, + 0xC85DA25D, 0x6D1C3023, 0x8732F050, 0x2273622E, + 0x6ED23882, 0xCB93AAFC, 0x21BD6A8F, 0x84FCF8F1, + 0xF00C9C98, 0x554D0EE6, 0xBF63CE95, 0x1A225CEB, + 0x8B277743, 0x2E66E53D, 0xC448254E, 0x6109B730, + 0x15F9D359, 0xB0B84127, 0x5A968154, 0xFFD7132A, + 0xB3764986, 0x1637DBF8, 0xFC191B8B, 0x595889F5, + 0x2DA8ED9C, 0x88E97FE2, 0x62C7BF91, 0xC7862DEF, + 0xFB850AC9, 0x5EC498B7, 0xB4EA58C4, 0x11ABCABA, + 0x655BAED3, 0xC01A3CAD, 0x2A34FCDE, 0x8F756EA0, + 0xC3D4340C, 0x6695A672, 0x8CBB6601, 0x29FAF47F, + 0x5D0A9016, 0xF84B0268, 0x1265C21B, 0xB7245065, + 0x6A638C57, 0xCF221E29, 0x250CDE5A, 0x804D4C24, + 0xF4BD284D, 0x51FCBA33, 0xBBD27A40, 0x1E93E83E, + 0x5232B292, 0xF77320EC, 0x1D5DE09F, 0xB81C72E1, + 0xCCEC1688, 0x69AD84F6, 0x83834485, 0x26C2D6FB, + 0x1AC1F1DD, 0xBF8063A3, 0x55AEA3D0, 0xF0EF31AE, + 0x841F55C7, 0x215EC7B9, 0xCB7007CA, 0x6E3195B4, + 0x2290CF18, 0x87D15D66, 0x6DFF9D15, 0xC8BE0F6B, + 0xBC4E6B02, 0x190FF97C, 0xF321390F, 0x5660AB71, + 0x4C42F79A, 0xE90365E4, 0x032DA597, 0xA66C37E9, + 0xD29C5380, 0x77DDC1FE, 0x9DF3018D, 0x38B293F3, + 0x7413C95F, 0xD1525B21, 0x3B7C9B52, 0x9E3D092C, + 0xEACD6D45, 0x4F8CFF3B, 0xA5A23F48, 0x00E3AD36, + 0x3CE08A10, 0x99A1186E, 0x738FD81D, 0xD6CE4A63, + 0xA23E2E0A, 0x077FBC74, 0xED517C07, 0x4810EE79, + 0x04B1B4D5, 0xA1F026AB, 0x4BDEE6D8, 0xEE9F74A6, + 0x9A6F10CF, 0x3F2E82B1, 0xD50042C2, 0x7041D0BC, + 0xAD060C8E, 0x08479EF0, 0xE2695E83, 0x4728CCFD, + 0x33D8A894, 0x96993AEA, 0x7CB7FA99, 0xD9F668E7, + 0x9557324B, 0x3016A035, 0xDA386046, 0x7F79F238, + 0x0B899651, 0xAEC8042F, 0x44E6C45C, 0xE1A75622, + 0xDDA47104, 0x78E5E37A, 0x92CB2309, 0x378AB177, + 0x437AD51E, 0xE63B4760, 0x0C158713, 0xA954156D, + 0xE5F54FC1, 0x40B4DDBF, 0xAA9A1DCC, 0x0FDB8FB2, + 0x7B2BEBDB, 0xDE6A79A5, 0x3444B9D6, 0x91052BA8 + }; + static final int[] T8_3 = new int[] { + 0x00000000, 0xDD45AAB8, 0xBF672381, 0x62228939, + 0x7B2231F3, 0xA6679B4B, 0xC4451272, 0x1900B8CA, + 0xF64463E6, 0x2B01C95E, 0x49234067, 0x9466EADF, + 0x8D665215, 0x5023F8AD, 0x32017194, 0xEF44DB2C, + 0xE964B13D, 0x34211B85, 0x560392BC, 0x8B463804, + 0x924680CE, 0x4F032A76, 0x2D21A34F, 0xF06409F7, + 0x1F20D2DB, 0xC2657863, 0xA047F15A, 0x7D025BE2, + 0x6402E328, 0xB9474990, 0xDB65C0A9, 0x06206A11, + 0xD725148B, 0x0A60BE33, 0x6842370A, 0xB5079DB2, + 0xAC072578, 0x71428FC0, 0x136006F9, 0xCE25AC41, + 0x2161776D, 0xFC24DDD5, 0x9E0654EC, 0x4343FE54, + 0x5A43469E, 0x8706EC26, 0xE524651F, 0x3861CFA7, + 0x3E41A5B6, 0xE3040F0E, 0x81268637, 0x5C632C8F, + 0x45639445, 0x98263EFD, 0xFA04B7C4, 0x27411D7C, + 0xC805C650, 0x15406CE8, 0x7762E5D1, 0xAA274F69, + 0xB327F7A3, 0x6E625D1B, 0x0C40D422, 0xD1057E9A, + 0xABA65FE7, 0x76E3F55F, 0x14C17C66, 0xC984D6DE, + 0xD0846E14, 0x0DC1C4AC, 0x6FE34D95, 0xB2A6E72D, + 0x5DE23C01, 0x80A796B9, 0xE2851F80, 0x3FC0B538, + 0x26C00DF2, 0xFB85A74A, 0x99A72E73, 0x44E284CB, + 0x42C2EEDA, 0x9F874462, 0xFDA5CD5B, 0x20E067E3, + 0x39E0DF29, 0xE4A57591, 0x8687FCA8, 0x5BC25610, + 0xB4868D3C, 0x69C32784, 0x0BE1AEBD, 0xD6A40405, + 0xCFA4BCCF, 0x12E11677, 0x70C39F4E, 0xAD8635F6, + 0x7C834B6C, 0xA1C6E1D4, 0xC3E468ED, 0x1EA1C255, + 0x07A17A9F, 0xDAE4D027, 0xB8C6591E, 0x6583F3A6, + 0x8AC7288A, 0x57828232, 0x35A00B0B, 0xE8E5A1B3, + 0xF1E51979, 0x2CA0B3C1, 0x4E823AF8, 0x93C79040, + 0x95E7FA51, 0x48A250E9, 0x2A80D9D0, 0xF7C57368, + 0xEEC5CBA2, 0x3380611A, 0x51A2E823, 0x8CE7429B, + 0x63A399B7, 0xBEE6330F, 0xDCC4BA36, 0x0181108E, + 0x1881A844, 0xC5C402FC, 0xA7E68BC5, 0x7AA3217D, + 0x52A0C93F, 0x8FE56387, 0xEDC7EABE, 0x30824006, + 0x2982F8CC, 0xF4C75274, 0x96E5DB4D, 0x4BA071F5, + 0xA4E4AAD9, 0x79A10061, 0x1B838958, 0xC6C623E0, + 0xDFC69B2A, 0x02833192, 0x60A1B8AB, 0xBDE41213, + 0xBBC47802, 0x6681D2BA, 0x04A35B83, 0xD9E6F13B, + 0xC0E649F1, 0x1DA3E349, 0x7F816A70, 0xA2C4C0C8, + 0x4D801BE4, 0x90C5B15C, 0xF2E73865, 0x2FA292DD, + 0x36A22A17, 0xEBE780AF, 0x89C50996, 0x5480A32E, + 0x8585DDB4, 0x58C0770C, 0x3AE2FE35, 0xE7A7548D, + 0xFEA7EC47, 0x23E246FF, 0x41C0CFC6, 0x9C85657E, + 0x73C1BE52, 0xAE8414EA, 0xCCA69DD3, 0x11E3376B, + 0x08E38FA1, 0xD5A62519, 0xB784AC20, 0x6AC10698, + 0x6CE16C89, 0xB1A4C631, 0xD3864F08, 0x0EC3E5B0, + 0x17C35D7A, 0xCA86F7C2, 0xA8A47EFB, 0x75E1D443, + 0x9AA50F6F, 0x47E0A5D7, 0x25C22CEE, 0xF8878656, + 0xE1873E9C, 0x3CC29424, 0x5EE01D1D, 0x83A5B7A5, + 0xF90696D8, 0x24433C60, 0x4661B559, 0x9B241FE1, + 0x8224A72B, 0x5F610D93, 0x3D4384AA, 0xE0062E12, + 0x0F42F53E, 0xD2075F86, 0xB025D6BF, 0x6D607C07, + 0x7460C4CD, 0xA9256E75, 0xCB07E74C, 0x16424DF4, + 0x106227E5, 0xCD278D5D, 0xAF050464, 0x7240AEDC, + 0x6B401616, 0xB605BCAE, 0xD4273597, 0x09629F2F, + 0xE6264403, 0x3B63EEBB, 0x59416782, 0x8404CD3A, + 0x9D0475F0, 0x4041DF48, 0x22635671, 0xFF26FCC9, + 0x2E238253, 0xF36628EB, 0x9144A1D2, 0x4C010B6A, + 0x5501B3A0, 0x88441918, 0xEA669021, 0x37233A99, + 0xD867E1B5, 0x05224B0D, 0x6700C234, 0xBA45688C, + 0xA345D046, 0x7E007AFE, 0x1C22F3C7, 0xC167597F, + 0xC747336E, 0x1A0299D6, 0x782010EF, 0xA565BA57, + 0xBC65029D, 0x6120A825, 0x0302211C, 0xDE478BA4, + 0x31035088, 0xEC46FA30, 0x8E647309, 0x5321D9B1, + 0x4A21617B, 0x9764CBC3, 0xF54642FA, 0x2803E842 + }; + static final int[] T8_4 = new int[] { + 0x00000000, 0x38116FAC, 0x7022DF58, 0x4833B0F4, + 0xE045BEB0, 0xD854D11C, 0x906761E8, 0xA8760E44, + 0xC5670B91, 0xFD76643D, 0xB545D4C9, 0x8D54BB65, + 0x2522B521, 0x1D33DA8D, 0x55006A79, 0x6D1105D5, + 0x8F2261D3, 0xB7330E7F, 0xFF00BE8B, 0xC711D127, + 0x6F67DF63, 0x5776B0CF, 0x1F45003B, 0x27546F97, + 0x4A456A42, 0x725405EE, 0x3A67B51A, 0x0276DAB6, + 0xAA00D4F2, 0x9211BB5E, 0xDA220BAA, 0xE2336406, + 0x1BA8B557, 0x23B9DAFB, 0x6B8A6A0F, 0x539B05A3, + 0xFBED0BE7, 0xC3FC644B, 0x8BCFD4BF, 0xB3DEBB13, + 0xDECFBEC6, 0xE6DED16A, 0xAEED619E, 0x96FC0E32, + 0x3E8A0076, 0x069B6FDA, 0x4EA8DF2E, 0x76B9B082, + 0x948AD484, 0xAC9BBB28, 0xE4A80BDC, 0xDCB96470, + 0x74CF6A34, 0x4CDE0598, 0x04EDB56C, 0x3CFCDAC0, + 0x51EDDF15, 0x69FCB0B9, 0x21CF004D, 0x19DE6FE1, + 0xB1A861A5, 0x89B90E09, 0xC18ABEFD, 0xF99BD151, + 0x37516AAE, 0x0F400502, 0x4773B5F6, 0x7F62DA5A, + 0xD714D41E, 0xEF05BBB2, 0xA7360B46, 0x9F2764EA, + 0xF236613F, 0xCA270E93, 0x8214BE67, 0xBA05D1CB, + 0x1273DF8F, 0x2A62B023, 0x625100D7, 0x5A406F7B, + 0xB8730B7D, 0x806264D1, 0xC851D425, 0xF040BB89, + 0x5836B5CD, 0x6027DA61, 0x28146A95, 0x10050539, + 0x7D1400EC, 0x45056F40, 0x0D36DFB4, 0x3527B018, + 0x9D51BE5C, 0xA540D1F0, 0xED736104, 0xD5620EA8, + 0x2CF9DFF9, 0x14E8B055, 0x5CDB00A1, 0x64CA6F0D, + 0xCCBC6149, 0xF4AD0EE5, 0xBC9EBE11, 0x848FD1BD, + 0xE99ED468, 0xD18FBBC4, 0x99BC0B30, 0xA1AD649C, + 0x09DB6AD8, 0x31CA0574, 0x79F9B580, 0x41E8DA2C, + 0xA3DBBE2A, 0x9BCAD186, 0xD3F96172, 0xEBE80EDE, + 0x439E009A, 0x7B8F6F36, 0x33BCDFC2, 0x0BADB06E, + 0x66BCB5BB, 0x5EADDA17, 0x169E6AE3, 0x2E8F054F, + 0x86F90B0B, 0xBEE864A7, 0xF6DBD453, 0xCECABBFF, + 0x6EA2D55C, 0x56B3BAF0, 0x1E800A04, 0x269165A8, + 0x8EE76BEC, 0xB6F60440, 0xFEC5B4B4, 0xC6D4DB18, + 0xABC5DECD, 0x93D4B161, 0xDBE70195, 0xE3F66E39, + 0x4B80607D, 0x73910FD1, 0x3BA2BF25, 0x03B3D089, + 0xE180B48F, 0xD991DB23, 0x91A26BD7, 0xA9B3047B, + 0x01C50A3F, 0x39D46593, 0x71E7D567, 0x49F6BACB, + 0x24E7BF1E, 0x1CF6D0B2, 0x54C56046, 0x6CD40FEA, + 0xC4A201AE, 0xFCB36E02, 0xB480DEF6, 0x8C91B15A, + 0x750A600B, 0x4D1B0FA7, 0x0528BF53, 0x3D39D0FF, + 0x954FDEBB, 0xAD5EB117, 0xE56D01E3, 0xDD7C6E4F, + 0xB06D6B9A, 0x887C0436, 0xC04FB4C2, 0xF85EDB6E, + 0x5028D52A, 0x6839BA86, 0x200A0A72, 0x181B65DE, + 0xFA2801D8, 0xC2396E74, 0x8A0ADE80, 0xB21BB12C, + 0x1A6DBF68, 0x227CD0C4, 0x6A4F6030, 0x525E0F9C, + 0x3F4F0A49, 0x075E65E5, 0x4F6DD511, 0x777CBABD, + 0xDF0AB4F9, 0xE71BDB55, 0xAF286BA1, 0x9739040D, + 0x59F3BFF2, 0x61E2D05E, 0x29D160AA, 0x11C00F06, + 0xB9B60142, 0x81A76EEE, 0xC994DE1A, 0xF185B1B6, + 0x9C94B463, 0xA485DBCF, 0xECB66B3B, 0xD4A70497, + 0x7CD10AD3, 0x44C0657F, 0x0CF3D58B, 0x34E2BA27, + 0xD6D1DE21, 0xEEC0B18D, 0xA6F30179, 0x9EE26ED5, + 0x36946091, 0x0E850F3D, 0x46B6BFC9, 0x7EA7D065, + 0x13B6D5B0, 0x2BA7BA1C, 0x63940AE8, 0x5B856544, + 0xF3F36B00, 0xCBE204AC, 0x83D1B458, 0xBBC0DBF4, + 0x425B0AA5, 0x7A4A6509, 0x3279D5FD, 0x0A68BA51, + 0xA21EB415, 0x9A0FDBB9, 0xD23C6B4D, 0xEA2D04E1, + 0x873C0134, 0xBF2D6E98, 0xF71EDE6C, 0xCF0FB1C0, + 0x6779BF84, 0x5F68D028, 0x175B60DC, 0x2F4A0F70, + 0xCD796B76, 0xF56804DA, 0xBD5BB42E, 0x854ADB82, + 0x2D3CD5C6, 0x152DBA6A, 0x5D1E0A9E, 0x650F6532, + 0x081E60E7, 0x300F0F4B, 0x783CBFBF, 0x402DD013, + 0xE85BDE57, 0xD04AB1FB, 0x9879010F, 0xA0686EA3 + }; + static final int[] T8_5 = new int[] { + 0x00000000, 0xEF306B19, 0xDB8CA0C3, 0x34BCCBDA, + 0xB2F53777, 0x5DC55C6E, 0x697997B4, 0x8649FCAD, + 0x6006181F, 0x8F367306, 0xBB8AB8DC, 0x54BAD3C5, + 0xD2F32F68, 0x3DC34471, 0x097F8FAB, 0xE64FE4B2, + 0xC00C303E, 0x2F3C5B27, 0x1B8090FD, 0xF4B0FBE4, + 0x72F90749, 0x9DC96C50, 0xA975A78A, 0x4645CC93, + 0xA00A2821, 0x4F3A4338, 0x7B8688E2, 0x94B6E3FB, + 0x12FF1F56, 0xFDCF744F, 0xC973BF95, 0x2643D48C, + 0x85F4168D, 0x6AC47D94, 0x5E78B64E, 0xB148DD57, + 0x370121FA, 0xD8314AE3, 0xEC8D8139, 0x03BDEA20, + 0xE5F20E92, 0x0AC2658B, 0x3E7EAE51, 0xD14EC548, + 0x570739E5, 0xB83752FC, 0x8C8B9926, 0x63BBF23F, + 0x45F826B3, 0xAAC84DAA, 0x9E748670, 0x7144ED69, + 0xF70D11C4, 0x183D7ADD, 0x2C81B107, 0xC3B1DA1E, + 0x25FE3EAC, 0xCACE55B5, 0xFE729E6F, 0x1142F576, + 0x970B09DB, 0x783B62C2, 0x4C87A918, 0xA3B7C201, + 0x0E045BEB, 0xE13430F2, 0xD588FB28, 0x3AB89031, + 0xBCF16C9C, 0x53C10785, 0x677DCC5F, 0x884DA746, + 0x6E0243F4, 0x813228ED, 0xB58EE337, 0x5ABE882E, + 0xDCF77483, 0x33C71F9A, 0x077BD440, 0xE84BBF59, + 0xCE086BD5, 0x213800CC, 0x1584CB16, 0xFAB4A00F, + 0x7CFD5CA2, 0x93CD37BB, 0xA771FC61, 0x48419778, + 0xAE0E73CA, 0x413E18D3, 0x7582D309, 0x9AB2B810, + 0x1CFB44BD, 0xF3CB2FA4, 0xC777E47E, 0x28478F67, + 0x8BF04D66, 0x64C0267F, 0x507CEDA5, 0xBF4C86BC, + 0x39057A11, 0xD6351108, 0xE289DAD2, 0x0DB9B1CB, + 0xEBF65579, 0x04C63E60, 0x307AF5BA, 0xDF4A9EA3, + 0x5903620E, 0xB6330917, 0x828FC2CD, 0x6DBFA9D4, + 0x4BFC7D58, 0xA4CC1641, 0x9070DD9B, 0x7F40B682, + 0xF9094A2F, 0x16392136, 0x2285EAEC, 0xCDB581F5, + 0x2BFA6547, 0xC4CA0E5E, 0xF076C584, 0x1F46AE9D, + 0x990F5230, 0x763F3929, 0x4283F2F3, 0xADB399EA, + 0x1C08B7D6, 0xF338DCCF, 0xC7841715, 0x28B47C0C, + 0xAEFD80A1, 0x41CDEBB8, 0x75712062, 0x9A414B7B, + 0x7C0EAFC9, 0x933EC4D0, 0xA7820F0A, 0x48B26413, + 0xCEFB98BE, 0x21CBF3A7, 0x1577387D, 0xFA475364, + 0xDC0487E8, 0x3334ECF1, 0x0788272B, 0xE8B84C32, + 0x6EF1B09F, 0x81C1DB86, 0xB57D105C, 0x5A4D7B45, + 0xBC029FF7, 0x5332F4EE, 0x678E3F34, 0x88BE542D, + 0x0EF7A880, 0xE1C7C399, 0xD57B0843, 0x3A4B635A, + 0x99FCA15B, 0x76CCCA42, 0x42700198, 0xAD406A81, + 0x2B09962C, 0xC439FD35, 0xF08536EF, 0x1FB55DF6, + 0xF9FAB944, 0x16CAD25D, 0x22761987, 0xCD46729E, + 0x4B0F8E33, 0xA43FE52A, 0x90832EF0, 0x7FB345E9, + 0x59F09165, 0xB6C0FA7C, 0x827C31A6, 0x6D4C5ABF, + 0xEB05A612, 0x0435CD0B, 0x308906D1, 0xDFB96DC8, + 0x39F6897A, 0xD6C6E263, 0xE27A29B9, 0x0D4A42A0, + 0x8B03BE0D, 0x6433D514, 0x508F1ECE, 0xBFBF75D7, + 0x120CEC3D, 0xFD3C8724, 0xC9804CFE, 0x26B027E7, + 0xA0F9DB4A, 0x4FC9B053, 0x7B757B89, 0x94451090, + 0x720AF422, 0x9D3A9F3B, 0xA98654E1, 0x46B63FF8, + 0xC0FFC355, 0x2FCFA84C, 0x1B736396, 0xF443088F, + 0xD200DC03, 0x3D30B71A, 0x098C7CC0, 0xE6BC17D9, + 0x60F5EB74, 0x8FC5806D, 0xBB794BB7, 0x544920AE, + 0xB206C41C, 0x5D36AF05, 0x698A64DF, 0x86BA0FC6, + 0x00F3F36B, 0xEFC39872, 0xDB7F53A8, 0x344F38B1, + 0x97F8FAB0, 0x78C891A9, 0x4C745A73, 0xA344316A, + 0x250DCDC7, 0xCA3DA6DE, 0xFE816D04, 0x11B1061D, + 0xF7FEE2AF, 0x18CE89B6, 0x2C72426C, 0xC3422975, + 0x450BD5D8, 0xAA3BBEC1, 0x9E87751B, 0x71B71E02, + 0x57F4CA8E, 0xB8C4A197, 0x8C786A4D, 0x63480154, + 0xE501FDF9, 0x0A3196E0, 0x3E8D5D3A, 0xD1BD3623, + 0x37F2D291, 0xD8C2B988, 0xEC7E7252, 0x034E194B, + 0x8507E5E6, 0x6A378EFF, 0x5E8B4525, 0xB1BB2E3C + }; + static final int[] T8_6 = new int[] { + 0x00000000, 0x68032CC8, 0xD0065990, 0xB8057558, + 0xA5E0C5D1, 0xCDE3E919, 0x75E69C41, 0x1DE5B089, + 0x4E2DFD53, 0x262ED19B, 0x9E2BA4C3, 0xF628880B, + 0xEBCD3882, 0x83CE144A, 0x3BCB6112, 0x53C84DDA, + 0x9C5BFAA6, 0xF458D66E, 0x4C5DA336, 0x245E8FFE, + 0x39BB3F77, 0x51B813BF, 0xE9BD66E7, 0x81BE4A2F, + 0xD27607F5, 0xBA752B3D, 0x02705E65, 0x6A7372AD, + 0x7796C224, 0x1F95EEEC, 0xA7909BB4, 0xCF93B77C, + 0x3D5B83BD, 0x5558AF75, 0xED5DDA2D, 0x855EF6E5, + 0x98BB466C, 0xF0B86AA4, 0x48BD1FFC, 0x20BE3334, + 0x73767EEE, 0x1B755226, 0xA370277E, 0xCB730BB6, + 0xD696BB3F, 0xBE9597F7, 0x0690E2AF, 0x6E93CE67, + 0xA100791B, 0xC90355D3, 0x7106208B, 0x19050C43, + 0x04E0BCCA, 0x6CE39002, 0xD4E6E55A, 0xBCE5C992, + 0xEF2D8448, 0x872EA880, 0x3F2BDDD8, 0x5728F110, + 0x4ACD4199, 0x22CE6D51, 0x9ACB1809, 0xF2C834C1, + 0x7AB7077A, 0x12B42BB2, 0xAAB15EEA, 0xC2B27222, + 0xDF57C2AB, 0xB754EE63, 0x0F519B3B, 0x6752B7F3, + 0x349AFA29, 0x5C99D6E1, 0xE49CA3B9, 0x8C9F8F71, + 0x917A3FF8, 0xF9791330, 0x417C6668, 0x297F4AA0, + 0xE6ECFDDC, 0x8EEFD114, 0x36EAA44C, 0x5EE98884, + 0x430C380D, 0x2B0F14C5, 0x930A619D, 0xFB094D55, + 0xA8C1008F, 0xC0C22C47, 0x78C7591F, 0x10C475D7, + 0x0D21C55E, 0x6522E996, 0xDD279CCE, 0xB524B006, + 0x47EC84C7, 0x2FEFA80F, 0x97EADD57, 0xFFE9F19F, + 0xE20C4116, 0x8A0F6DDE, 0x320A1886, 0x5A09344E, + 0x09C17994, 0x61C2555C, 0xD9C72004, 0xB1C40CCC, + 0xAC21BC45, 0xC422908D, 0x7C27E5D5, 0x1424C91D, + 0xDBB77E61, 0xB3B452A9, 0x0BB127F1, 0x63B20B39, + 0x7E57BBB0, 0x16549778, 0xAE51E220, 0xC652CEE8, + 0x959A8332, 0xFD99AFFA, 0x459CDAA2, 0x2D9FF66A, + 0x307A46E3, 0x58796A2B, 0xE07C1F73, 0x887F33BB, + 0xF56E0EF4, 0x9D6D223C, 0x25685764, 0x4D6B7BAC, + 0x508ECB25, 0x388DE7ED, 0x808892B5, 0xE88BBE7D, + 0xBB43F3A7, 0xD340DF6F, 0x6B45AA37, 0x034686FF, + 0x1EA33676, 0x76A01ABE, 0xCEA56FE6, 0xA6A6432E, + 0x6935F452, 0x0136D89A, 0xB933ADC2, 0xD130810A, + 0xCCD53183, 0xA4D61D4B, 0x1CD36813, 0x74D044DB, + 0x27180901, 0x4F1B25C9, 0xF71E5091, 0x9F1D7C59, + 0x82F8CCD0, 0xEAFBE018, 0x52FE9540, 0x3AFDB988, + 0xC8358D49, 0xA036A181, 0x1833D4D9, 0x7030F811, + 0x6DD54898, 0x05D66450, 0xBDD31108, 0xD5D03DC0, + 0x8618701A, 0xEE1B5CD2, 0x561E298A, 0x3E1D0542, + 0x23F8B5CB, 0x4BFB9903, 0xF3FEEC5B, 0x9BFDC093, + 0x546E77EF, 0x3C6D5B27, 0x84682E7F, 0xEC6B02B7, + 0xF18EB23E, 0x998D9EF6, 0x2188EBAE, 0x498BC766, + 0x1A438ABC, 0x7240A674, 0xCA45D32C, 0xA246FFE4, + 0xBFA34F6D, 0xD7A063A5, 0x6FA516FD, 0x07A63A35, + 0x8FD9098E, 0xE7DA2546, 0x5FDF501E, 0x37DC7CD6, + 0x2A39CC5F, 0x423AE097, 0xFA3F95CF, 0x923CB907, + 0xC1F4F4DD, 0xA9F7D815, 0x11F2AD4D, 0x79F18185, + 0x6414310C, 0x0C171DC4, 0xB412689C, 0xDC114454, + 0x1382F328, 0x7B81DFE0, 0xC384AAB8, 0xAB878670, + 0xB66236F9, 0xDE611A31, 0x66646F69, 0x0E6743A1, + 0x5DAF0E7B, 0x35AC22B3, 0x8DA957EB, 0xE5AA7B23, + 0xF84FCBAA, 0x904CE762, 0x2849923A, 0x404ABEF2, + 0xB2828A33, 0xDA81A6FB, 0x6284D3A3, 0x0A87FF6B, + 0x17624FE2, 0x7F61632A, 0xC7641672, 0xAF673ABA, + 0xFCAF7760, 0x94AC5BA8, 0x2CA92EF0, 0x44AA0238, + 0x594FB2B1, 0x314C9E79, 0x8949EB21, 0xE14AC7E9, + 0x2ED97095, 0x46DA5C5D, 0xFEDF2905, 0x96DC05CD, + 0x8B39B544, 0xE33A998C, 0x5B3FECD4, 0x333CC01C, + 0x60F48DC6, 0x08F7A10E, 0xB0F2D456, 0xD8F1F89E, + 0xC5144817, 0xAD1764DF, 0x15121187, 0x7D113D4F + }; + static final int[] T8_7 = new int[] { + 0x00000000, 0x493C7D27, 0x9278FA4E, 0xDB448769, + 0x211D826D, 0x6821FF4A, 0xB3657823, 0xFA590504, + 0x423B04DA, 0x0B0779FD, 0xD043FE94, 0x997F83B3, + 0x632686B7, 0x2A1AFB90, 0xF15E7CF9, 0xB86201DE, + 0x847609B4, 0xCD4A7493, 0x160EF3FA, 0x5F328EDD, + 0xA56B8BD9, 0xEC57F6FE, 0x37137197, 0x7E2F0CB0, + 0xC64D0D6E, 0x8F717049, 0x5435F720, 0x1D098A07, + 0xE7508F03, 0xAE6CF224, 0x7528754D, 0x3C14086A, + 0x0D006599, 0x443C18BE, 0x9F789FD7, 0xD644E2F0, + 0x2C1DE7F4, 0x65219AD3, 0xBE651DBA, 0xF759609D, + 0x4F3B6143, 0x06071C64, 0xDD439B0D, 0x947FE62A, + 0x6E26E32E, 0x271A9E09, 0xFC5E1960, 0xB5626447, + 0x89766C2D, 0xC04A110A, 0x1B0E9663, 0x5232EB44, + 0xA86BEE40, 0xE1579367, 0x3A13140E, 0x732F6929, + 0xCB4D68F7, 0x827115D0, 0x593592B9, 0x1009EF9E, + 0xEA50EA9A, 0xA36C97BD, 0x782810D4, 0x31146DF3, + 0x1A00CB32, 0x533CB615, 0x8878317C, 0xC1444C5B, + 0x3B1D495F, 0x72213478, 0xA965B311, 0xE059CE36, + 0x583BCFE8, 0x1107B2CF, 0xCA4335A6, 0x837F4881, + 0x79264D85, 0x301A30A2, 0xEB5EB7CB, 0xA262CAEC, + 0x9E76C286, 0xD74ABFA1, 0x0C0E38C8, 0x453245EF, + 0xBF6B40EB, 0xF6573DCC, 0x2D13BAA5, 0x642FC782, + 0xDC4DC65C, 0x9571BB7B, 0x4E353C12, 0x07094135, + 0xFD504431, 0xB46C3916, 0x6F28BE7F, 0x2614C358, + 0x1700AEAB, 0x5E3CD38C, 0x857854E5, 0xCC4429C2, + 0x361D2CC6, 0x7F2151E1, 0xA465D688, 0xED59ABAF, + 0x553BAA71, 0x1C07D756, 0xC743503F, 0x8E7F2D18, + 0x7426281C, 0x3D1A553B, 0xE65ED252, 0xAF62AF75, + 0x9376A71F, 0xDA4ADA38, 0x010E5D51, 0x48322076, + 0xB26B2572, 0xFB575855, 0x2013DF3C, 0x692FA21B, + 0xD14DA3C5, 0x9871DEE2, 0x4335598B, 0x0A0924AC, + 0xF05021A8, 0xB96C5C8F, 0x6228DBE6, 0x2B14A6C1, + 0x34019664, 0x7D3DEB43, 0xA6796C2A, 0xEF45110D, + 0x151C1409, 0x5C20692E, 0x8764EE47, 0xCE589360, + 0x763A92BE, 0x3F06EF99, 0xE44268F0, 0xAD7E15D7, + 0x572710D3, 0x1E1B6DF4, 0xC55FEA9D, 0x8C6397BA, + 0xB0779FD0, 0xF94BE2F7, 0x220F659E, 0x6B3318B9, + 0x916A1DBD, 0xD856609A, 0x0312E7F3, 0x4A2E9AD4, + 0xF24C9B0A, 0xBB70E62D, 0x60346144, 0x29081C63, + 0xD3511967, 0x9A6D6440, 0x4129E329, 0x08159E0E, + 0x3901F3FD, 0x703D8EDA, 0xAB7909B3, 0xE2457494, + 0x181C7190, 0x51200CB7, 0x8A648BDE, 0xC358F6F9, + 0x7B3AF727, 0x32068A00, 0xE9420D69, 0xA07E704E, + 0x5A27754A, 0x131B086D, 0xC85F8F04, 0x8163F223, + 0xBD77FA49, 0xF44B876E, 0x2F0F0007, 0x66337D20, + 0x9C6A7824, 0xD5560503, 0x0E12826A, 0x472EFF4D, + 0xFF4CFE93, 0xB67083B4, 0x6D3404DD, 0x240879FA, + 0xDE517CFE, 0x976D01D9, 0x4C2986B0, 0x0515FB97, + 0x2E015D56, 0x673D2071, 0xBC79A718, 0xF545DA3F, + 0x0F1CDF3B, 0x4620A21C, 0x9D642575, 0xD4585852, + 0x6C3A598C, 0x250624AB, 0xFE42A3C2, 0xB77EDEE5, + 0x4D27DBE1, 0x041BA6C6, 0xDF5F21AF, 0x96635C88, + 0xAA7754E2, 0xE34B29C5, 0x380FAEAC, 0x7133D38B, + 0x8B6AD68F, 0xC256ABA8, 0x19122CC1, 0x502E51E6, + 0xE84C5038, 0xA1702D1F, 0x7A34AA76, 0x3308D751, + 0xC951D255, 0x806DAF72, 0x5B29281B, 0x1215553C, + 0x230138CF, 0x6A3D45E8, 0xB179C281, 0xF845BFA6, + 0x021CBAA2, 0x4B20C785, 0x906440EC, 0xD9583DCB, + 0x613A3C15, 0x28064132, 0xF342C65B, 0xBA7EBB7C, + 0x4027BE78, 0x091BC35F, 0xD25F4436, 0x9B633911, + 0xA777317B, 0xEE4B4C5C, 0x350FCB35, 0x7C33B612, + 0x866AB316, 0xCF56CE31, 0x14124958, 0x5D2E347F, + 0xE54C35A1, 0xAC704886, 0x7734CFEF, 0x3E08B2C8, + 0xC451B7CC, 0x8D6DCAEB, 0x56294D82, 0x1F1530A5 + }; +} \ No newline at end of file diff --git a/src/main/java/org/xerial/snappy/SnappyFramed.java b/src/main/java/org/xerial/snappy/SnappyFramed.java new file mode 100644 index 0000000..41fbe8d --- /dev/null +++ b/src/main/java/org/xerial/snappy/SnappyFramed.java @@ -0,0 +1,128 @@ +/* + * Created: Apr 12, 2013 + */ +package org.xerial.snappy; + +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.channels.ReadableByteChannel; + +/** + * Constants and utilities for implementing x-snappy-framed. + * + * @author Brett Okken + * @since 1.1.0 + */ +final class SnappyFramed { + public static final int COMPRESSED_DATA_FLAG = 0x00; + + public static final int UNCOMPRESSED_DATA_FLAG = 0x01; + + public static final int STREAM_IDENTIFIER_FLAG = 0xff; + + private static final int MASK_DELTA = 0xa282ead8; + + /** + * The header consists of the stream identifier flag, 3 bytes indicating a + * length of 6, and "sNaPpY" in ASCII. + */ + public static final byte[] HEADER_BYTES = new byte[] { + (byte) STREAM_IDENTIFIER_FLAG, 0x06, 0x00, 0x00, 0x73, 0x4e, 0x61, + 0x50, 0x70, 0x59 }; + + public static int maskedCrc32c(byte[] data) + { + return maskedCrc32c(data, 0, data.length); + } + + public static int maskedCrc32c(byte[] data, int offset, int length) + { + final PureJavaCrc32C crc32c = new PureJavaCrc32C(); + crc32c.update(data, offset, length); + return mask(crc32c.getIntegerValue()); + } + + /** + * Checksums are not stored directly, but masked, as checksumming data and + * then its own checksum can be problematic. The masking is the same as used + * in Apache Hadoop: Rotate the checksum by 15 bits, then add the constant + * 0xa282ead8 (using wraparound as normal for unsigned integers). This is + * equivalent to the following C code: + * + *

+     * uint32_t mask_checksum(uint32_t x) {
+     *     return ((x >> 15) | (x << 17)) + 0xa282ead8; 
+     * }
+     * 
+ */ + public static int mask(int crc) + { + // Rotate right by 15 bits and add a constant. + return ((crc >>> 15) | (crc << 17)) + MASK_DELTA; + } + + + static final int readBytes(ReadableByteChannel source, ByteBuffer dest) throws IOException + { + // tells how many bytes to read. + final int expectedLength = dest.remaining(); + + int totalRead = 0; + + // how many bytes were read. + int lastRead = source.read(dest); + + totalRead = lastRead; + + // if we did not read as many bytes as we had hoped, try reading again. + if (lastRead < expectedLength) + { + // as long the buffer is not full (remaining() == 0) and we have not reached EOF (lastRead == -1) keep reading. + while (dest.remaining() != 0 && lastRead != -1) + { + lastRead = source.read(dest); + + // if we got EOF, do not add to total read. + if (lastRead != -1) + { + totalRead += lastRead; + } + } + } + + if (totalRead > 0) + { + dest.limit(dest.position()); + } + else + { + dest.position(dest.limit()); + } + + return totalRead; + } + + static int skip(final ReadableByteChannel source, final int skip, final ByteBuffer buffer) throws IOException + { + if (skip <= 0) { + return 0; + } + + int toSkip = skip; + int skipped = 0; + while(toSkip > 0 && skipped != -1) { + buffer.clear(); + if (toSkip < buffer.capacity()) { + buffer.limit(toSkip); + } + + skipped = source.read(buffer); + if (skipped > 0) { + toSkip -= skipped; + } + } + + buffer.clear(); + return skip - toSkip; + } +} diff --git a/src/main/java/org/xerial/snappy/SnappyFramedInputStream.java b/src/main/java/org/xerial/snappy/SnappyFramedInputStream.java new file mode 100644 index 0000000..0c02018 --- /dev/null +++ b/src/main/java/org/xerial/snappy/SnappyFramedInputStream.java @@ -0,0 +1,452 @@ +/* + * Created: Apr 15, 2013 + */ +package org.xerial.snappy; + +import static java.lang.Math.min; +import static org.xerial.snappy.SnappyFramed.*; +import static org.xerial.snappy.SnappyFramedOutputStream.*; + +import java.io.EOFException; +import java.io.IOException; +import java.io.InputStream; +import java.nio.ByteBuffer; +import java.nio.channels.Channels; +import java.nio.channels.ClosedChannelException; +import java.nio.channels.ReadableByteChannel; +import java.util.Arrays; + +/** + * Implements the x-snappy-framed as an {@link InputStream} and + * {@link ReadableByteChannel}. + * + * @author Brett Okken + * @since 1.1.0 + */ +public final class SnappyFramedInputStream extends InputStream implements + ReadableByteChannel { + + private final ReadableByteChannel rbc; + private final ByteBuffer frameHeader; + private final boolean verifyChecksums; + + /** + * A single frame read from the underlying {@link InputStream}. + */ + private ByteBuffer input; + + /** + * The decompressed data from {@link #input}. + */ + private ByteBuffer uncompressedDirect; + + /** + * Indicates if this instance has been closed. + */ + private boolean closed; + + /** + * Indicates if we have reached the EOF on {@link #in}. + */ + private boolean eof; + + /** + * The position in {@link buffer} to read to. + */ + private int valid; + + /** + * The next position to read from {@link #buffer}. + */ + private int position; + + /** + * Buffer contains a copy of the uncompressed data for the block. + */ + private byte[] buffer; + + /** + * Creates a Snappy input stream to read data from the specified underlying + * input stream. + * + * @param in + * the underlying input stream. Must not be {@code null}. + */ + public SnappyFramedInputStream(InputStream in) throws IOException { + this(in, true); + } + + /** + * Creates a Snappy input stream to read data from the specified underlying + * input stream. + * + * @param in + * the underlying input stream. Must not be {@code null}. + * @param verifyChecksums + * if true, checksums in input stream will be verified + */ + public SnappyFramedInputStream(InputStream in, boolean verifyChecksums) + throws IOException { + this(Channels.newChannel(in), verifyChecksums); + } + + /** + * Creates a Snappy input stream to read data from the specified underlying + * channel. + * + * @param in + * the underlying readable channel. Must not be {@code null}. + */ + public SnappyFramedInputStream(ReadableByteChannel in) + throws IOException { + this(in, true); + } + + /** + * Creates a Snappy input stream to read data from the specified underlying + * channel. + * + * @param in + * the underlying readable channel. Must not be {@code null}. + * @param verifyChecksums + * if true, checksums in input stream will be verified + */ + public SnappyFramedInputStream(ReadableByteChannel in, + boolean verifyChecksums) throws IOException { + if (in == null) { + throw new NullPointerException("in is null"); + } + + this.rbc = in; + this.verifyChecksums = verifyChecksums; + + allocateBuffersBasedOnSize(MAX_BLOCK_SIZE + 5); + this.frameHeader = ByteBuffer.allocate(4); + + // stream must begin with stream header + final byte[] expectedHeader = HEADER_BYTES; + final byte[] actualHeader = new byte[expectedHeader.length]; + final ByteBuffer actualBuffer = ByteBuffer.wrap(actualHeader); + + // assume that if the input cannot read 4 bytes that something is + // wrong. + final int read = in.read(actualBuffer); + if (read < expectedHeader.length) { + throw new EOFException( + "encountered EOF while reading stream header"); + } + if (!Arrays.equals(expectedHeader, actualHeader)) { + throw new IOException("invalid stream header"); + } + } + + /** + * @param size + */ + private void allocateBuffersBasedOnSize(int size) { + + input = ByteBuffer.allocateDirect(size); + final int maxCompressedLength = Snappy.maxCompressedLength(size); + uncompressedDirect = ByteBuffer.allocateDirect(maxCompressedLength); + buffer = new byte[maxCompressedLength]; + } + + @Override + public int read() throws IOException { + if (closed) { + return -1; + } + if (!ensureBuffer()) { + return -1; + } + return buffer[position++] & 0xFF; + } + + @Override + public int read(byte[] output, int offset, int length) throws IOException { + + if (output == null) { + throw new IllegalArgumentException("output is null"); + } + + if (offset < 0 || length < 0 || offset + length > output.length) { + throw new IllegalArgumentException("invalid offset [" + offset + + "] and length [" + length + ']'); + } + + if (closed) { + throw new ClosedChannelException(); + } + + if (length == 0) { + return 0; + } + if (!ensureBuffer()) { + return -1; + } + + final int size = min(length, available()); + System.arraycopy(buffer, position, output, offset, size); + position += size; + return size; + } + + @Override + public int available() throws IOException { + if (closed) { + return 0; + } + return valid - position; + } + + /** + * {@inheritDoc} + */ + @Override + public boolean isOpen() { + return !closed; + } + + /** + * {@inheritDoc} + */ + @Override + public int read(ByteBuffer dst) throws IOException { + + if (dst == null) { + throw new IllegalArgumentException("dst is null"); + } + + if (closed) { + throw new ClosedChannelException(); + } + + if (dst.remaining() == 0) { + return 0; + } + if (!ensureBuffer()) { + return -1; + } + + final int size = min(dst.remaining(), available()); + dst.put(buffer, position, size); + position += size; + return size; + } + + @Override + public void close() throws IOException { + try { + rbc.close(); + } finally { + if (!closed) { + closed = true; + } + } + } + + static enum FrameAction { + RAW, SKIP, UNCOMPRESS; + } + + public static final class FrameMetaData { + final int length; + final FrameAction frameAction; + + /** + * @param frameAction + * @param length + */ + public FrameMetaData(FrameAction frameAction, int length) { + super(); + this.frameAction = frameAction; + this.length = length; + } + } + + public static final class FrameData { + final int checkSum; + final int offset; + + /** + * @param checkSum + * @param offset + */ + public FrameData(int checkSum, int offset) { + super(); + this.checkSum = checkSum; + this.offset = offset; + } + } + + private boolean ensureBuffer() throws IOException { + if (available() > 0) { + return true; + } + if (eof) { + return false; + } + + if (!readBlockHeader()) { + eof = true; + return false; + } + + // get action based on header + final FrameMetaData frameMetaData = getFrameMetaData(frameHeader); + + if (FrameAction.SKIP == frameMetaData.frameAction) { + SnappyFramed.skip(rbc, frameMetaData.length, + ByteBuffer.wrap(buffer)); + return ensureBuffer(); + } + + if (frameMetaData.length > input.capacity()) { + allocateBuffersBasedOnSize(frameMetaData.length); + } + + input.clear(); + input.limit(frameMetaData.length); + + final int actualRead = readBytes(rbc, input); + if (actualRead != frameMetaData.length) { + throw new EOFException("unexpectd EOF when reading frame"); + } + input.flip(); + + final FrameData frameData = getFrameData(input); + + if (FrameAction.UNCOMPRESS == frameMetaData.frameAction) { + + input.position(frameData.offset); + + final int uncompressedLength = Snappy.uncompressedLength(input); + + if (uncompressedLength > uncompressedDirect.capacity()) { + uncompressedDirect = ByteBuffer + .allocateDirect(uncompressedLength); + buffer = new byte[Math.max(input.capacity(), uncompressedLength)]; + } + + uncompressedDirect.clear(); + + this.valid = Snappy.uncompress(input, uncompressedDirect); + + uncompressedDirect.get(buffer, 0, valid); + this.position = 0; + } else { + // we need to start reading at the offset + input.position(frameData.offset); + this.position = 0; + this.valid = input.remaining(); + this.input.get(buffer, 0, input.remaining()); + } + + if (verifyChecksums) { + final int actualCrc32c = SnappyFramed.maskedCrc32c(buffer, + position, valid - position); + if (frameData.checkSum != actualCrc32c) { + throw new IOException("Corrupt input: invalid checksum"); + } + } + + return true; + } + + private boolean readBlockHeader() throws IOException { + frameHeader.clear(); + int read = readBytes(rbc, frameHeader); + + if (read == -1) { + return false; + } + + if (read < frameHeader.capacity()) { + throw new EOFException("encountered EOF while reading block header"); + } + frameHeader.flip(); + + return true; + } + + /** + * + * @param frameHeader + * @return + * @throws IOException + */ + private FrameMetaData getFrameMetaData(ByteBuffer frameHeader) + throws IOException { + + assert frameHeader.hasArray(); + + final byte[] frameHeaderArray = frameHeader.array(); + + int length = (frameHeaderArray[1] & 0xFF); + length |= (frameHeaderArray[2] & 0xFF) << 8; + length |= (frameHeaderArray[3] & 0xFF) << 16; + + int minLength = 0; + final FrameAction frameAction; + final int flag = frameHeaderArray[0] & 0xFF; + switch (flag) { + case COMPRESSED_DATA_FLAG: + frameAction = FrameAction.UNCOMPRESS; + minLength = 5; + break; + case UNCOMPRESSED_DATA_FLAG: + frameAction = FrameAction.RAW; + minLength = 5; + break; + case STREAM_IDENTIFIER_FLAG: + if (length != 6) { + throw new IOException( + "stream identifier chunk with invalid length: " + + length); + } + frameAction = FrameAction.SKIP; + minLength = 6; + break; + default: + // Reserved unskippable chunks (chunk types 0x02-0x7f) + if (flag <= 0x7f) { + throw new IOException("unsupported unskippable chunk: " + + Integer.toHexString(flag)); + } + + // all that is left is Reserved skippable chunks (chunk types + // 0x80-0xfe) + frameAction = FrameAction.SKIP; + minLength = 0; + } + + if (length < minLength) { + throw new IOException("invalid length: " + length + + " for chunk flag: " + Integer.toHexString(flag)); + } + + return new FrameMetaData(frameAction, length); + } + + /** + * + * @param content + * @return + * @throws IOException + */ + private FrameData getFrameData(ByteBuffer content) throws IOException { + return new FrameData(getCrc32c(content), 4); + } + + private int getCrc32c(ByteBuffer content) { + + final int position = content.position(); + + return ((content.get(position + 3) & 0xFF) << 24) + | ((content.get(position + 2) & 0xFF) << 16) + | ((content.get(position + 1) & 0xFF) << 8) + | (content.get(position) & 0xFF); + } +} diff --git a/src/main/java/org/xerial/snappy/SnappyFramedOutputStream.java b/src/main/java/org/xerial/snappy/SnappyFramedOutputStream.java new file mode 100644 index 0000000..221e242 --- /dev/null +++ b/src/main/java/org/xerial/snappy/SnappyFramedOutputStream.java @@ -0,0 +1,317 @@ +/* + * Created: Apr 12, 2013 + */ +package org.xerial.snappy; + +import static org.xerial.snappy.SnappyFramed.COMPRESSED_DATA_FLAG; +import static org.xerial.snappy.SnappyFramed.HEADER_BYTES; +import static org.xerial.snappy.SnappyFramed.UNCOMPRESSED_DATA_FLAG; +import static org.xerial.snappy.SnappyFramed.maskedCrc32c; + +import java.io.IOException; +import java.io.OutputStream; +import java.nio.ByteBuffer; +import java.nio.channels.ClosedChannelException; +import java.nio.channels.WritableByteChannel; + +/** + * Implements the x-snappy-framed as an {@link OutputStream} and + * {@link WritableByteChannel}. + * + * @author Brett Okken + * @since 1.1.0 + */ +public final class SnappyFramedOutputStream extends OutputStream implements + WritableByteChannel { + + /** + * The x-snappy-framed specification allows for a chunk size up to + * 16,777,211 bytes in length. However, it also goes on to state: + *

+ * + * We place an additional restriction that the uncompressed data in a chunk + * must be no longer than 65536 bytes. This allows consumers to easily use + * small fixed-size buffers. + * + *

+ */ + public static final int MAX_BLOCK_SIZE = 64 * 1024; + + /** + * The default block size to use. + */ + public static final int DEFAULT_BLOCK_SIZE = MAX_BLOCK_SIZE; + + /** + * The default min compression ratio to use. + */ + public static final double DEFAULT_MIN_COMPRESSION_RATIO = 0.85d; + + // private final int blockSize; + private final ByteBuffer buffer; + private final byte[] outputBuffer; + private final double minCompressionRatio; + + private final OutputStream out; + + // private int position; + private boolean closed; + + /** + * Creates a new {@link SnappyFramedOutputStream} using the {@link #DEFAULT_BLOCK_SIZE} + * and {@link #DEFAULT_MIN_COMPRESSION_RATIO}. + * @param out + * The underlying {@link OutputStream} to write to. Must not be + * {@code null}. + * @throws IOException + */ + public SnappyFramedOutputStream(OutputStream out) throws IOException { + this(out, DEFAULT_BLOCK_SIZE, DEFAULT_MIN_COMPRESSION_RATIO); + } + + /** + * Creates a new {@link SnappyFramedOutputStream} instance. + * + * @param out + * The underlying {@link OutputStream} to write to. Must not be + * {@code null}. + * @param blockSize + * The block size (of raw data) to compress before writing frames + * to out. Must be in (0, 65536]. + * @param minCompressionRatio + * Defines the minimum compression ratio ( + * {@code compressedLength / rawLength}) that must be achieved to + * write the compressed data. This must be in (0, 1.0]. + * @throws IOException + */ + public SnappyFramedOutputStream(OutputStream out, int blockSize, + double minCompressionRatio) throws IOException { + if (out == null) { + throw new NullPointerException(); + } + + if (minCompressionRatio <= 0 || minCompressionRatio > 1.0) { + throw new IllegalArgumentException("minCompressionRatio " + + minCompressionRatio + " must be in (0,1.0]"); + } + + if (blockSize <= 0 || blockSize > MAX_BLOCK_SIZE) { + throw new IllegalArgumentException("block size " + blockSize + + " must be in (0, 65536]"); + } + + this.out = out; + this.minCompressionRatio = minCompressionRatio; + buffer = ByteBuffer.allocate(blockSize); + outputBuffer = new byte[Snappy.maxCompressedLength(blockSize)]; + + writeHeader(out); + } + + /** + * Writes the implementation specific header or "marker bytes" to + * out. + * + * @param out + * The underlying {@link OutputStream}. + * @throws IOException + */ + private void writeHeader(OutputStream out) throws IOException { + out.write(HEADER_BYTES); + } + + /** + * {@inheritDoc} + */ + @Override + public boolean isOpen() { + return !closed; + } + + @Override + public void write(int b) throws IOException { + if (closed) { + throw new IOException("Stream is closed"); + } + if (buffer.remaining() <= 0) { + flushBuffer(); + } + buffer.put((byte) b); + } + + @Override + public void write(byte[] input, int offset, int length) throws IOException { + if (closed) { + throw new IOException("Stream is closed"); + } + + write(ByteBuffer.wrap(input, offset, length)); + } + + /** + * {@inheritDoc} + */ + @Override + public int write(ByteBuffer src) throws IOException { + if (closed) { + throw new ClosedChannelException(); + } + + if (buffer.remaining() <= 0) { + flushBuffer(); + } + + final int srcLength = src.remaining(); + + // easy case: enough free space in buffer for entire input + if (buffer.remaining() >= src.remaining()) { + buffer.put(src); + return srcLength; + } + + // store current limit + final int srcEnd = src.position() + src.remaining(); + + while ((src.position() + buffer.remaining()) <= srcEnd) { + // fill partial buffer as much as possible and flush + src.limit(src.position() + buffer.remaining()); + buffer.put(src); + flushBuffer(); + } + + // reset original limit + src.limit(srcEnd); + + // copy remaining partial block into now-empty buffer + buffer.put(src); + + return srcLength; + } + + @Override + public final void flush() throws IOException { + if (closed) { + throw new IOException("Stream is closed"); + } + flushBuffer(); + out.flush(); + } + + @Override + public final void close() throws IOException { + if (closed) { + return; + } + try { + flush(); + out.close(); + } finally { + closed = true; + } + } + + /** + * Compresses and writes out any buffered data. This does nothing if there + * is no currently buffered data. + * + * @throws IOException + */ + private void flushBuffer() throws IOException { + if (buffer.position() > 0) { + buffer.flip(); + writeCompressed(buffer); + buffer.clear(); + } + } + + /** + * {@link #calculateCRC32C(byte[], int, int) Calculates} the crc, compresses + * the data, determines if the compression ratio is acceptable and calls + * {@link #writeBlock(OutputStream, byte[], int, int, boolean, int)} to + * actually write the frame. + * + * @param input + * The byte[] containing the raw data to be compressed. + * @param offset + * The offset into input where the data starts. + * @param length + * The amount of data in input. + * @throws IOException + */ + private void writeCompressed(ByteBuffer buffer) throws IOException { + + final byte[] input = buffer.array(); + final int length = buffer.remaining(); + + // crc is based on the user supplied input data + final int crc32c = calculateCRC32C(input, 0, length); + + final int compressedLength = Snappy.compress(input, 0, length, + outputBuffer, 0); + + // only use the compressed data if copmression ratio is <= the + // minCompressonRatio + if (((double) compressedLength / (double) length) <= minCompressionRatio) { + writeBlock(out, outputBuffer, 0, compressedLength, true, crc32c); + } else { + // otherwise use the uncomprssed data. + writeBlock(out, input, 0, length, false, crc32c); + } + } + + /** + * Calculates a masked CRC32C checksum over the data. + * + * @param data + * @param offset + * @param length + * @return The CRC32 checksum. + */ + private int calculateCRC32C(byte[] data, int offset, int length) { + return maskedCrc32c(data, offset, length); + } + + /** + * Write a frame (block) to out. + * + * @param out + * The {@link OutputStream} to write to. + * @param data + * The data to write. + * @param offset + * The offset in data to start at. + * @param length + * The length of data to use. + * @param compressed + * Indicates if data is the compressed or raw content. + * This is based on whether the compression ratio desired is + * reached. + * @param crc32c + * The calculated checksum. + * @throws IOException + */ + private void writeBlock(final OutputStream out, byte[] data, int offset, + int length, boolean compressed, int crc32c) throws IOException { + out.write(compressed ? COMPRESSED_DATA_FLAG : UNCOMPRESSED_DATA_FLAG); + + // the length written out to the header is both the checksum and the + // frame + final int headerLength = length + 4; + + // write length + out.write(headerLength); + out.write(headerLength >>> 8); + out.write(headerLength >>> 16); + + // write crc32c of user input data + out.write(crc32c); + out.write(crc32c >>> 8); + out.write(crc32c >>> 16); + out.write(crc32c >>> 24); + + // write data + out.write(data, offset, length); + } +} diff --git a/src/test/java/org/xerial/snappy/CalgaryTest.java b/src/test/java/org/xerial/snappy/CalgaryTest.java index 1f98af2..de72038 100755 --- a/src/test/java/org/xerial/snappy/CalgaryTest.java +++ b/src/test/java/org/xerial/snappy/CalgaryTest.java @@ -24,14 +24,20 @@ //-------------------------------------- package org.xerial.snappy; -import static org.junit.Assert.*; +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; +import org.junit.Rule; import org.junit.Test; +import org.junit.rules.TemporaryFolder; import org.xerial.util.FileResource; import org.xerial.util.log.Logger; @@ -44,6 +50,9 @@ import org.xerial.util.log.Logger; public class CalgaryTest { private static Logger _logger = Logger.getLogger(CalgaryTest.class); + + @Rule + public final TemporaryFolder tempFolder = new TemporaryFolder(); static byte[] readFile(String file) throws IOException { InputStream in = FileResource.find(CalgaryTest.class, file).openStream(); @@ -91,6 +100,83 @@ public class CalgaryTest } } + @Test + public void streamFramed() throws Exception { + for (String f : files) { + byte[] orig = readFile("testdata/calgary/" + f); + + ByteArrayOutputStream compressedBuf = new ByteArrayOutputStream(); + SnappyFramedOutputStream out = new SnappyFramedOutputStream(compressedBuf); + out.write(orig); + out.close(); + + SnappyFramedInputStream in = new SnappyFramedInputStream(new ByteArrayInputStream(compressedBuf.toByteArray())); + + byte[] uncompressed = new byte[orig.length]; + int readBytes = readBytes(in, uncompressed, 0, orig.length); + + assertEquals(orig.length, readBytes); + assertArrayEquals(orig, uncompressed); + } + } + + @Test + public void streamFramedToFile() throws Exception { + for (String f : files) { + byte[] orig = readFile("testdata/calgary/" + f); + + final File tempFile = tempFolder.newFile(f); + final FileOutputStream compressedFOS = new FileOutputStream(tempFile); + try + { + SnappyFramedOutputStream out = new SnappyFramedOutputStream(compressedFOS); + out.write(orig); + out.close(); + } + finally + { + compressedFOS.close(); + } + + byte[] uncompressed = new byte[orig.length]; + + final FileInputStream compressedFIS = new FileInputStream(tempFile); + try + { + SnappyFramedInputStream in = new SnappyFramedInputStream(compressedFIS.getChannel()); + int readBytes = readBytes(in, uncompressed, 0, orig.length); + + assertEquals(orig.length, readBytes); + } + finally + { + compressedFIS.close(); + } + + assertArrayEquals(orig, uncompressed); + } + } + + @Test + public void streamFramedNoCRCVerify() throws Exception { + for (String f : files) { + byte[] orig = readFile("testdata/calgary/" + f); + + ByteArrayOutputStream compressedBuf = new ByteArrayOutputStream(); + SnappyFramedOutputStream out = new SnappyFramedOutputStream(compressedBuf); + out.write(orig); + out.close(); + + SnappyFramedInputStream in = new SnappyFramedInputStream(new ByteArrayInputStream(compressedBuf.toByteArray()), false); + + byte[] uncompressed = new byte[orig.length]; + int readBytes = readBytes(in, uncompressed, 0, orig.length); + + assertEquals(orig.length, readBytes); + assertArrayEquals(orig, uncompressed); + } + } + @Test public void byteWiseRead() throws Exception { for (String f : files) { @@ -115,4 +201,28 @@ public class CalgaryTest } } + static final int readBytes(InputStream source, byte[] dest, int offset, int length) throws IOException + { + // how many bytes were read. + int lastRead = source.read(dest, offset, length); + + int totalRead = lastRead; + + // if we did not read as many bytes as we had hoped, try reading again. + if (lastRead < length) + { + // as long the buffer is not full (remaining() == 0) and we have not reached EOF (lastRead == -1) keep reading. + while (totalRead < length && lastRead != -1) + { + lastRead = source.read(dest, offset + totalRead, length - totalRead); + + // if we got EOF, do not add to total read. + if (lastRead != -1) + { + totalRead += lastRead; + } + } + } + return totalRead; + } } diff --git a/src/test/java/org/xerial/snappy/RandomGenerator.java b/src/test/java/org/xerial/snappy/RandomGenerator.java new file mode 100644 index 0000000..c75a8aa --- /dev/null +++ b/src/test/java/org/xerial/snappy/RandomGenerator.java @@ -0,0 +1,68 @@ +/* + * Created: Apr 15, 2013 + */ +package org.xerial.snappy; + +import java.util.Random; + +/** + * Generates random data with specific expected snappy performance characteristics. + * + *

+ * This has been copied from dain's snappy implementation.. + *

+ */ +public class RandomGenerator { + + public final byte[] data; + public int position; + + public RandomGenerator(double compressionRatio) { + // We use a limited amount of data over and over again and ensure + // that it is larger than the compression window (32KB), and also + // large enough to serve all typical value sizes we want to write. + Random rnd = new Random(301); + data = new byte[1048576 + 100]; + for (int i = 0; i < 1048576; i += 100) { + // Add a short fragment that is as compressible as specified ratio + System.arraycopy(compressibleData(rnd, compressionRatio, 100), 0, + data, i, 100); + } + } + + public int getNextPosition(int length) { + if (position + length > data.length) { + position = 0; + assert (length < data.length); + } + int result = position; + position += length; + return result; + } + + private static byte[] compressibleData(Random random, + double compressionRatio, int length) { + int raw = (int) (length * compressionRatio); + if (raw < 1) { + raw = 1; + } + byte[] rawData = generateRandomData(random, raw); + + // Duplicate the random data until we have filled "length" bytes + byte[] dest = new byte[length]; + for (int i = 0; i < length;) { + int chunkLength = Math.min(rawData.length, length - i); + System.arraycopy(rawData, 0, dest, i, chunkLength); + i += chunkLength; + } + return dest; + } + + private static byte[] generateRandomData(Random random, int length) { + byte[] rawData = new byte[length]; + for (int i = 0; i < rawData.length; i++) { + rawData[i] = (byte) random.nextInt(256); + } + return rawData; + } +} \ No newline at end of file diff --git a/src/test/java/org/xerial/snappy/SnappyFramedStreamTest.java b/src/test/java/org/xerial/snappy/SnappyFramedStreamTest.java new file mode 100644 index 0000000..decb43e --- /dev/null +++ b/src/test/java/org/xerial/snappy/SnappyFramedStreamTest.java @@ -0,0 +1,300 @@ +/* + * Created: Mar 14, 2013 + */ +package org.xerial.snappy; + +import static org.xerial.snappy.SnappyFramed.*; +import static org.junit.Assert.*; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.EOFException; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.Arrays; + +import org.junit.Test; + +/** + * Tests the functionality of {@link org.xerial.snappy.SnappyFramedInputStream} + * and {@link org.xerial.snappy.SnappyFramedOutputStream}. + * + * @author Brett Okken + */ +public class SnappyFramedStreamTest { + + /** + * @throws IOException + */ + protected OutputStream createOutputStream(OutputStream target) + throws IOException { + return new SnappyFramedOutputStream(target); + } + + /** + * {@inheritDoc} + * + * @throws IOException + */ + protected InputStream createInputStream(InputStream source, + boolean verifyCheckSums) throws IOException { + return new SnappyFramedInputStream(source, verifyCheckSums); + } + + protected byte[] getMarkerFrame() { + return HEADER_BYTES; + } + + @Test + public void testSimple() throws Exception { + byte[] original = "aaaaaaaaaaaabbbbbbbaaaaaa".getBytes("utf-8"); + + byte[] compressed = compress(original); + byte[] uncompressed = uncompress(compressed); + + assertArrayEquals(uncompressed, original); + // 10 byte stream header, 4 byte block header, 4 byte crc, 19 bytes + assertEquals(compressed.length, 37); + + // stream header + assertArrayEquals(Arrays.copyOf(compressed, 10), HEADER_BYTES); + + // flag: compressed + assertEquals(toInt(compressed[10]), COMPRESSED_DATA_FLAG); + + // length: 23 = 0x000017 + assertEquals(toInt(compressed[11]), 0x17); + assertEquals(toInt(compressed[12]), 0x00); + assertEquals(toInt(compressed[13]), 0x00); + + // crc32c: 0x9274cda8 + assertEquals(toInt(compressed[17]), 0x92); + assertEquals(toInt(compressed[16]), 0x74); + assertEquals(toInt(compressed[15]), 0xCD); + assertEquals(toInt(compressed[14]), 0xA8); + } + + @Test + public void testUncompressable() throws Exception { + byte[] random = getRandom(1, 5000); + int crc32c = maskedCrc32c(random); + + byte[] compressed = compress(random); + byte[] uncompressed = uncompress(compressed); + + assertArrayEquals(uncompressed, random); + assertEquals(compressed.length, random.length + 10 + 4 + 4); + + // flag: uncompressed + assertEquals(toInt(compressed[10]), UNCOMPRESSED_DATA_FLAG); + + // length: 5004 = 0x138c + assertEquals(toInt(compressed[13]), 0x00); + assertEquals(toInt(compressed[12]), 0x13); + assertEquals(toInt(compressed[11]), 0x8c); + } + + @Test + public void testEmptyCompression() throws Exception { + byte[] empty = new byte[0]; + assertArrayEquals(compress(empty), HEADER_BYTES); + assertArrayEquals(uncompress(HEADER_BYTES), empty); + } + + @Test(expected = EOFException.class) + public void testShortBlockHeader() throws Exception { + uncompressBlock(new byte[] { 0 }); + } + + @Test(expected = EOFException.class) + public void testShortBlockData() throws Exception { + // flag = 0, size = 8, crc32c = 0, block data= [x, x] + uncompressBlock(new byte[] { 1, 8, 0, 0, 0, 0, 0, 0, 'x', 'x' }); + } + + @Test + public void testUnskippableChunkFlags() throws Exception { + for (int i = 2; i <= 0x7f; i++) { + try { + uncompressBlock(new byte[] { (byte) i, 5, 0, 0, 0, 0, 0, 0, 0 }); + fail("no exception thrown with flag: " + Integer.toHexString(i)); + } catch (IOException e) { + + } + } + } + + @Test + public void testSkippableChunkFlags() throws Exception { + for (int i = 0x80; i <= 0xfe; i++) { + try { + uncompressBlock(new byte[] { (byte) i, 5, 0, 0, 0, 0, 0, 0, 0 }); + } catch (IOException e) { + fail("exception thrown with flag: " + Integer.toHexString(i)); + } + } + } + + @Test(expected = IOException.class) + public void testInvalidBlockSizeZero() throws Exception { + // flag = '0', block size = 4, crc32c = 0 + uncompressBlock(new byte[] { 1, 4, 0, 0, 0, 0, 0, 0 }); + } + + @Test(expected = IOException.class) + public void testInvalidChecksum() throws Exception { + // flag = 0, size = 5, crc32c = 0, block data = [a] + uncompressBlock(new byte[] { 1, 5, 0, 0, 0, 0, 0, 0, 'a' }); + } + + @Test + public void testInvalidChecksumIgnoredWhenVerificationDisabled() + throws Exception { + // flag = 0, size = 4, crc32c = 0, block data = [a] + byte[] block = { 1, 5, 0, 0, 0, 0, 0, 0, 'a' }; + ByteArrayInputStream inputData = new ByteArrayInputStream( + blockToStream(block)); + assertArrayEquals(toByteArray(createInputStream(inputData, false)), + new byte[] { 'a' }); + } + + @Test + public void testLargerFrames_raw_() throws IOException { + final byte[] random = getRandom(0.5, 100000); + + final byte[] stream = new byte[HEADER_BYTES.length + 8 + random.length]; + System.arraycopy(HEADER_BYTES, 0, stream, 0, HEADER_BYTES.length); + + stream[10] = UNCOMPRESSED_DATA_FLAG; + + int length = random.length + 4; + stream[11] = (byte) length; + stream[12] = (byte) (length >>> 8); + stream[13] = (byte) (length >>> 16); + + int crc32c = maskedCrc32c(random); + stream[14] = (byte) crc32c; + stream[15] = (byte) (crc32c >>> 8); + stream[16] = (byte) (crc32c >>> 16); + stream[17] = (byte) (crc32c >>> 24); + + System.arraycopy(random, 0, stream, 18, random.length); + + final byte[] uncompressed = uncompress(stream); + + assertArrayEquals(random, uncompressed); + } + + @Test + public void testLargerFrames_compressed_() throws IOException { + final byte[] random = getRandom(0.5, 500000); + + final byte[] compressed = Snappy.compress(random); + + final byte[] stream = new byte[HEADER_BYTES.length + 8 + compressed.length]; + System.arraycopy(HEADER_BYTES, 0, stream, 0, HEADER_BYTES.length); + + stream[10] = COMPRESSED_DATA_FLAG; + + int length = compressed.length + 4; + stream[11] = (byte) length; + stream[12] = (byte) (length >>> 8); + stream[13] = (byte) (length >>> 16); + + int crc32c = maskedCrc32c(random); + stream[14] = (byte) crc32c; + stream[15] = (byte) (crc32c >>> 8); + stream[16] = (byte) (crc32c >>> 16); + stream[17] = (byte) (crc32c >>> 24); + + System.arraycopy(compressed, 0, stream, 18, compressed.length); + + final byte[] uncompressed = uncompress(stream); + + assertArrayEquals(random, uncompressed); + } + + @Test + public void testLargerFrames_compressed_smaller_raw_larger() + throws IOException { + final byte[] random = getRandom(0.5, 100000); + + final byte[] compressed = Snappy.compress(random); + + final byte[] stream = new byte[HEADER_BYTES.length + 8 + + compressed.length]; + System.arraycopy(HEADER_BYTES, 0, stream, 0, HEADER_BYTES.length); + + stream[10] = COMPRESSED_DATA_FLAG; + + int length = compressed.length + 4; + stream[11] = (byte) length; + stream[12] = (byte) (length >>> 8); + stream[13] = (byte) (length >>> 16); + + int crc32c = maskedCrc32c(random); + stream[14] = (byte) crc32c; + stream[15] = (byte) (crc32c >>> 8); + stream[16] = (byte) (crc32c >>> 16); + stream[17] = (byte) (crc32c >>> 24); + + System.arraycopy(compressed, 0, stream, 18, compressed.length); + + final byte[] uncompressed = uncompress(stream); + + assertArrayEquals(random, uncompressed); + } + + private byte[] uncompressBlock(byte[] block) throws IOException { + return uncompress(blockToStream(block)); + } + + private static byte[] blockToStream(byte[] block) { + byte[] stream = new byte[HEADER_BYTES.length + block.length]; + System.arraycopy(HEADER_BYTES, 0, stream, 0, HEADER_BYTES.length); + System.arraycopy(block, 0, stream, HEADER_BYTES.length, block.length); + return stream; + } + + + protected byte[] compress(byte[] original) throws IOException { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + OutputStream snappyOut = createOutputStream(out); + snappyOut.write(original); + snappyOut.close(); + return out.toByteArray(); + } + + protected byte[] uncompress(byte[] compressed) throws IOException { + return toByteArray(createInputStream(new ByteArrayInputStream( + compressed), true)); + } + + private static byte[] toByteArray(InputStream createInputStream) throws IOException { + final ByteArrayOutputStream baos = new ByteArrayOutputStream(64 * 1024); + + final byte[] buffer = new byte[8 * 1024]; + + int read; + while((read = createInputStream.read(buffer)) > 0) { + baos.write(buffer, 0, read); + } + + return baos.toByteArray(); + } + + static int toInt(byte value) { + return value & 0xFF; + } + + private byte[] getRandom(double compressionRatio, int length) { + RandomGenerator gen = new RandomGenerator( + compressionRatio); + gen.getNextPosition(length); + byte[] random = Arrays.copyOf(gen.data, length); + assertEquals(random.length, length); + return random; + } + +} From a5507afb6e54b967067a80ef78f9d854c6cc764a Mon Sep 17 00:00:00 2001 From: "Taro L. Saito" Date: Tue, 23 Apr 2013 13:11:58 +0900 Subject: [PATCH 12/35] Fixes #33. Add Mac/i386 binary --- .../snappy/native/Mac/i386/libsnappyjava.jnilib | Bin 0 -> 43716 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100755 src/main/resources/org/xerial/snappy/native/Mac/i386/libsnappyjava.jnilib diff --git a/src/main/resources/org/xerial/snappy/native/Mac/i386/libsnappyjava.jnilib b/src/main/resources/org/xerial/snappy/native/Mac/i386/libsnappyjava.jnilib new file mode 100755 index 0000000000000000000000000000000000000000..6df932df2a2f4221ca07e73ffa9baddb2132382c GIT binary patch literal 43716 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 literal 0 HcmV?d00001 From c48ab66e99f780a8e92d479a3dfd3303bdf7888a Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Fri, 10 May 2013 23:16:25 -0400 Subject: [PATCH 13/35] make sure magic bytes are read fully --- src/main/java/org/xerial/snappy/SnappyCodec.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/xerial/snappy/SnappyCodec.java b/src/main/java/org/xerial/snappy/SnappyCodec.java index 18014bd..8358a1c 100755 --- a/src/main/java/org/xerial/snappy/SnappyCodec.java +++ b/src/main/java/org/xerial/snappy/SnappyCodec.java @@ -91,7 +91,7 @@ public class SnappyCodec public static SnappyCodec readHeader(InputStream in) throws IOException { DataInputStream d = new DataInputStream(in); byte[] magic = new byte[MAGIC_LEN]; - d.read(magic, 0, MAGIC_LEN); + d.readFully(magic, 0, MAGIC_LEN); int version = d.readInt(); int compatibleVersion = d.readInt(); return new SnappyCodec(magic, version, compatibleVersion); From 2daae5aca424bd2aa3ffc20a13e8603abdc59b0b Mon Sep 17 00:00:00 2001 From: "Taro L. Saito" Date: Fri, 17 May 2013 10:28:14 +0900 Subject: [PATCH 14/35] use snapshot version --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6a1ea63..6285dd0 100755 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 org.xerial.snappy snappy-java - 1.1.0-M4-SNAPSHOT + 1.1.0-SNAPSHOT Snappy for Java snappy-java: A fast compression/decompression library bundle From fde51d8317dcf92c66ebf151298cc604aff65db5 Mon Sep 17 00:00:00 2001 From: "Taro L. Saito" Date: Fri, 17 May 2013 10:32:54 +0900 Subject: [PATCH 15/35] release version 1.0.5 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 46540da..b5b72a6 100755 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 org.xerial.snappy snappy-java - 1.0.5-M4 + 1.0.5 Snappy for Java snappy-java: A fast compression/decompression library bundle From 41b11f7ebdce9834a77eb4ca48dfa6f1d7e9e026 Mon Sep 17 00:00:00 2001 From: "Taro L. Saito" Date: Thu, 6 Jun 2013 11:10:35 +0900 Subject: [PATCH 16/35] new snapshot version --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b5b72a6..7e16061 100755 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 org.xerial.snappy snappy-java - 1.0.5 + 1.0.5.1-SNAPSHOT Snappy for Java snappy-java: A fast compression/decompression library bundle From 8c69129359bb7e08c6f8083fef7a8f9c632e4057 Mon Sep 17 00:00:00 2001 From: "Taro L. Saito" Date: Thu, 6 Jun 2013 11:35:42 +0900 Subject: [PATCH 17/35] Fixes #34. Use canonical os.arch names for native lib folders --- src/main/java/org/xerial/snappy/OSInfo.java | 50 +++++++++++++++++- .../Linux/{i386 => x86}/libsnappyjava.so | Bin .../Linux/{amd64 => x86_64}/libsnappyjava.so | Bin .../Mac/{i386 => x86}/libsnappyjava.jnilib | Bin .../OpenBSD/{i386 => x86}/libsnappyjava.so | Bin .../{amd64 => x86_64}/libsnappyjava.so | Bin .../Windows/{amd64 => x86_64}/snappyjava.dll | Bin 7 files changed, 48 insertions(+), 2 deletions(-) rename src/main/resources/org/xerial/snappy/native/Linux/{i386 => x86}/libsnappyjava.so (100%) rename src/main/resources/org/xerial/snappy/native/Linux/{amd64 => x86_64}/libsnappyjava.so (100%) rename src/main/resources/org/xerial/snappy/native/Mac/{i386 => x86}/libsnappyjava.jnilib (100%) rename src/main/resources/org/xerial/snappy/native/OpenBSD/{i386 => x86}/libsnappyjava.so (100%) rename src/main/resources/org/xerial/snappy/native/OpenBSD/{amd64 => x86_64}/libsnappyjava.so (100%) rename src/main/resources/org/xerial/snappy/native/Windows/{amd64 => x86_64}/snappyjava.dll (100%) diff --git a/src/main/java/org/xerial/snappy/OSInfo.java b/src/main/java/org/xerial/snappy/OSInfo.java index 4ec6686..6c612b8 100755 --- a/src/main/java/org/xerial/snappy/OSInfo.java +++ b/src/main/java/org/xerial/snappy/OSInfo.java @@ -25,6 +25,8 @@ package org.xerial.snappy; import java.io.IOException; +import java.util.HashMap; +import java.util.Locale; /** * Provides OS name and architecture name. @@ -34,6 +36,48 @@ import java.io.IOException; */ public class OSInfo { + private static HashMap archMapping = new HashMap(); + + public static final String X86 = "x86"; + public static final String X86_64 = "x86_64"; + public static final String IA64_32 = "ia64_32"; + public static final String IA64 = "ia64"; + public static final String PPC = "ppc"; + + static { + // x86 mappings + archMapping.put(X86, X86); + archMapping.put("i386", X86); + archMapping.put("i486", X86); + archMapping.put("i586", X86); + archMapping.put("i686", X86); + archMapping.put("pentium", X86); + + // x86_64 mappings + archMapping.put(X86_64, X86_64); + archMapping.put("amd64", X86_64); + archMapping.put("em64t", X86_64); + archMapping.put("universal", X86_64); // Needed for openjdk7 in Mac + + // Itenium 64-bit mappings + archMapping.put(IA64, IA64); + archMapping.put("ia64w", IA64); + + // Itenium 32-bit mappings, usually an HP-UX construct + archMapping.put(IA64_32, IA64_32); + archMapping.put("ia64n", IA64_32); + + // PowerPC mappings + archMapping.put(PPC, PPC); + archMapping.put("pwoer", PPC); + archMapping.put("powerpc", PPC); + archMapping.put("power_pc", PPC); + archMapping.put("power_rs", PPC); + + // TODO: PowerPC 64bit mappings + } + + public static void main(String[] args) { if (args.length >= 1) { if ("--os".equals(args[0])) { @@ -78,8 +122,10 @@ public class OSInfo // ignored: fall back to "arm" arch (soft-float ABI) } } - else if(getOSName().equals("Mac") && (osArch.equals("universal") || osArch.equals("amd64"))) { - return "x86_64"; // Fix for openjdk7 + else { + String lc = osArch.toLowerCase(Locale.US); + if(archMapping.containsKey(lc)) + return archMapping.get(lc); } return translateArchNameToFolderName(osArch); } diff --git a/src/main/resources/org/xerial/snappy/native/Linux/i386/libsnappyjava.so b/src/main/resources/org/xerial/snappy/native/Linux/x86/libsnappyjava.so similarity index 100% rename from src/main/resources/org/xerial/snappy/native/Linux/i386/libsnappyjava.so rename to src/main/resources/org/xerial/snappy/native/Linux/x86/libsnappyjava.so diff --git a/src/main/resources/org/xerial/snappy/native/Linux/amd64/libsnappyjava.so b/src/main/resources/org/xerial/snappy/native/Linux/x86_64/libsnappyjava.so similarity index 100% rename from src/main/resources/org/xerial/snappy/native/Linux/amd64/libsnappyjava.so rename to src/main/resources/org/xerial/snappy/native/Linux/x86_64/libsnappyjava.so diff --git a/src/main/resources/org/xerial/snappy/native/Mac/i386/libsnappyjava.jnilib b/src/main/resources/org/xerial/snappy/native/Mac/x86/libsnappyjava.jnilib similarity index 100% rename from src/main/resources/org/xerial/snappy/native/Mac/i386/libsnappyjava.jnilib rename to src/main/resources/org/xerial/snappy/native/Mac/x86/libsnappyjava.jnilib diff --git a/src/main/resources/org/xerial/snappy/native/OpenBSD/i386/libsnappyjava.so b/src/main/resources/org/xerial/snappy/native/OpenBSD/x86/libsnappyjava.so similarity index 100% rename from src/main/resources/org/xerial/snappy/native/OpenBSD/i386/libsnappyjava.so rename to src/main/resources/org/xerial/snappy/native/OpenBSD/x86/libsnappyjava.so diff --git a/src/main/resources/org/xerial/snappy/native/OpenBSD/amd64/libsnappyjava.so b/src/main/resources/org/xerial/snappy/native/OpenBSD/x86_64/libsnappyjava.so similarity index 100% rename from src/main/resources/org/xerial/snappy/native/OpenBSD/amd64/libsnappyjava.so rename to src/main/resources/org/xerial/snappy/native/OpenBSD/x86_64/libsnappyjava.so diff --git a/src/main/resources/org/xerial/snappy/native/Windows/amd64/snappyjava.dll b/src/main/resources/org/xerial/snappy/native/Windows/x86_64/snappyjava.dll similarity index 100% rename from src/main/resources/org/xerial/snappy/native/Windows/amd64/snappyjava.dll rename to src/main/resources/org/xerial/snappy/native/Windows/x86_64/snappyjava.dll From 26acd403ba7054bc545fd3f4710cc839390a2f82 Mon Sep 17 00:00:00 2001 From: "Taro L. Saito" Date: Thu, 6 Jun 2013 11:44:13 +0900 Subject: [PATCH 18/35] Fix the native code folder paths in OSGi settings --- pom.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 7e16061..bb1ca38 100755 --- a/pom.xml +++ b/pom.xml @@ -182,12 +182,12 @@ org.osgi.framework;version="[1.5,2)" lazy - org/xerial/snappy/native/Windows/amd64/snappyjava.dll;selection-filter="(&(osgi.arch=x86_64)(osgi.os=win32))", + org/xerial/snappy/native/Windows/x86_64/snappyjava.dll;selection-filter="(&(osgi.arch=x86_64)(osgi.os=win32))", org/xerial/snappy/native/Windows/x86/snappyjava.dll;selection-filter="(&(osgi.arch=x86)(osgi.os=win32))", - org/xerial/snappy/native/Mac/i386/libsnappyjava.jnilib;selection-filter="(&(osgi.arch=x86)(osgi.os=macosx))", + org/xerial/snappy/native/Mac/x86/libsnappyjava.jnilib;selection-filter="(&(osgi.arch=x86)(osgi.os=macosx))", org/xerial/snappy/native/Mac/x86_64/libsnappyjava.jnilib;selection-filter="(&(osgi.arch=x86_64)(osgi.os=macosx))", - org/xerial/snappy/native/Linux/amd64/libsnappyjava.so;selection-filter="(&(osgi.arch=x86_64)(osgi.os=linux))", - org/xerial/snappy/native/Linux/i386/libsnappyjava.so;selection-filter="(&(osgi.arch=x86)(osgi.os=linux))", + org/xerial/snappy/native/Linux/x86_64/libsnappyjava.so;selection-filter="(&(osgi.arch=x86_64)(osgi.os=linux))", + org/xerial/snappy/native/Linux/x86/libsnappyjava.so;selection-filter="(&(osgi.arch=x86)(osgi.os=linux))", org/xerial/snappy/native/Linux/arm/libsnappyjava.so;selection-filter="(&(osgi.arch=arm)(osgi.os=linux))" From cfebd7432b6b1ae46e60870c1b3da0505a7a8994 Mon Sep 17 00:00:00 2001 From: laszlohordos Date: Thu, 6 Jun 2013 11:36:47 +0200 Subject: [PATCH 19/35] The Snappy Java Jar is not compatible with Apache Felix 4.2.1 Framework The Snappy Bundle contains the Bundle-NativeCode instruction in a way it's not compatible with the [R4LibraryClause](http://svn.apache.org/viewvc/felix/releases/org.apache.felix.framework-4.2.1/src/main/java/org/apache/felix/framework/util/manifestparser/R4LibraryClause.java?view=markup) because the osname and processor definition is mandatory. They can not be replaced with selection-filter. Snappy 1.0.5 and the 1.1.0-SNAPSHOT throws the same org.osgi.framework.BundleException: Unresolved constraint in bundle org.xerial.snappy.snappy-java [n]: No matching native libraries found. exception. I saw in the fixed issues the Snappy was tested on Eclipse 3.8.1 but I couldn't tested so it has to be verified. I also updated the x86-64 from x86_64 regarding the [Bundle-NativeCode: OS/Processor values](http://www.osgi.org/Specifications/Reference) --- pom.xml | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/pom.xml b/pom.xml index 6285dd0..11651b0 100755 --- a/pom.xml +++ b/pom.xml @@ -182,12 +182,12 @@ org.osgi.framework;version="[1.5,2)" lazy - org/xerial/snappy/native/Windows/amd64/snappyjava.dll;selection-filter="(&(osgi.arch=x86_64)(osgi.os=win32))", - org/xerial/snappy/native/Windows/x86/snappyjava.dll;selection-filter="(&(osgi.arch=x86)(osgi.os=win32))", - org/xerial/snappy/native/Mac/x86_64/libsnappyjava.jnilib;selection-filter="(&(osgi.arch=x86_64)(osgi.os=macosx))", - org/xerial/snappy/native/Linux/amd64/libsnappyjava.so;selection-filter="(&(osgi.arch=x86_64)(osgi.os=linux))", - org/xerial/snappy/native/Linux/i386/libsnappyjava.so;selection-filter="(&(osgi.arch=x86)(osgi.os=linux))", - org/xerial/snappy/native/Linux/arm/libsnappyjava.so;selection-filter="(&(osgi.arch=arm)(osgi.os=linux))" + org/xerial/snappy/native/Windows/amd64/snappyjava.dll;osname=win32;processor=x86-64, + org/xerial/snappy/native/Windows/x86/snappyjava.dll;osname=win32;processor=x86, + org/xerial/snappy/native/Mac/x86_64/libsnappyjava.jnilib;osname=macosx;processor=x86-64, + org/xerial/snappy/native/Linux/amd64/libsnappyjava.so;osname=linux;processor=x86-64, + org/xerial/snappy/native/Linux/i386/libsnappyjava.so;osname=linux;processor=x86, + org/xerial/snappy/native/Linux/arm/libsnappyjava.so;osname=linux;processor=arm @@ -214,7 +214,7 @@ - + org.apache.maven.plugins maven-clean-plugin @@ -231,7 +231,7 @@ - + maven-assembly-plugin 2.2.1 @@ -252,7 +252,7 @@ - + @@ -332,7 +332,7 @@ jar test - + - + From 88275fb84654df42335497963db45df7fb906e0e Mon Sep 17 00:00:00 2001 From: "Taro L. Saito" Date: Tue, 2 Jul 2013 10:10:25 +0900 Subject: [PATCH 20/35] commenting --- src/main/java/org/xerial/snappy/Snappy.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/org/xerial/snappy/Snappy.java b/src/main/java/org/xerial/snappy/Snappy.java index e44ded2..6dee2e3 100755 --- a/src/main/java/org/xerial/snappy/Snappy.java +++ b/src/main/java/org/xerial/snappy/Snappy.java @@ -26,7 +26,6 @@ package org.xerial.snappy; import java.io.IOException; import java.io.UnsupportedEncodingException; -import java.lang.ExceptionInInitializerError; import java.net.URL; import java.nio.ByteBuffer; import java.nio.charset.Charset; @@ -35,7 +34,7 @@ import java.util.Properties; /** * Snappy API for data compression/decompression * - * Note: if the native libraries cannot be loaded, then an ExceptionInInitializerError + * Note: if the native libraries cannot be loaded, an ExceptionInInitializerError * will be thrown at first use of this class. * * @author leo From d7263cc36d4db1adf7fcb15cf29d13a51b2e5978 Mon Sep 17 00:00:00 2001 From: "Taro L. Saito" Date: Tue, 2 Jul 2013 10:27:10 +0900 Subject: [PATCH 21/35] Fixes #39. Comparing two native libraries directly without generating md5sum --- .../java/org/xerial/snappy/SnappyLoader.java | 79 ++++++++++++------- 1 file changed, 52 insertions(+), 27 deletions(-) diff --git a/src/main/java/org/xerial/snappy/SnappyLoader.java b/src/main/java/org/xerial/snappy/SnappyLoader.java index 99b0e7a..6fa066a 100755 --- a/src/main/java/org/xerial/snappy/SnappyLoader.java +++ b/src/main/java/org/xerial/snappy/SnappyLoader.java @@ -24,13 +24,7 @@ //-------------------------------------- package org.xerial.snappy; -import java.io.BufferedInputStream; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; +import java.io.*; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.net.URL; @@ -356,6 +350,25 @@ public class SnappyLoader } } + + private static boolean contentsEquals(InputStream in1, InputStream in2) throws IOException { + if(!(in1 instanceof BufferedInputStream)) { + in1 = new BufferedInputStream(in1); + } + if(!(in2 instanceof BufferedInputStream)) { + in2 = new BufferedInputStream(in2); + } + + int ch = in1.read(); + while(ch != -1) { + int ch2 = in2.read(); + if(ch != ch2) + return false; + ch = in1.read(); + } + int ch2 = in2.read(); + return ch2 == -1; + } /** * Extract the specified library file to the target folder * @@ -372,34 +385,46 @@ public class SnappyLoader try { if (extractedLibFile.exists()) { - // test md5sum value - String md5sum1 = md5sum(SnappyLoader.class.getResourceAsStream(nativeLibraryFilePath)); - String md5sum2 = md5sum(new FileInputStream(extractedLibFile)); - - if (md5sum1.equals(md5sum2)) { - return new File(targetFolder, extractedLibFileName); - } - else { - // remove old native library file - boolean deletionSucceeded = extractedLibFile.delete(); - if (!deletionSucceeded) { - throw new IOException("failed to remove existing native library file: " - + extractedLibFile.getAbsolutePath()); + // Compare the native library contents + InputStream nativeIn = SnappyLoader.class.getResourceAsStream(nativeLibraryFilePath); + InputStream extractedLibIn = new FileInputStream(extractedLibFile); + try { + if(contentsEquals(nativeIn, extractedLibIn)) { + return new File(targetFolder, extractedLibFileName); } + else { + // remove old native library file + boolean deletionSucceeded = extractedLibFile.delete(); + if (!deletionSucceeded) { + throw new IOException("failed to remove existing native library file: " + + extractedLibFile.getAbsolutePath()); + } + } + } + finally { + if(nativeIn != null) + nativeIn.close(); + if(extractedLibIn != null) + extractedLibIn.close(); } } // Extract a native library file into the target directory InputStream reader = SnappyLoader.class.getResourceAsStream(nativeLibraryFilePath); FileOutputStream writer = new FileOutputStream(extractedLibFile); - byte[] buffer = new byte[8192]; - int bytesRead = 0; - while ((bytesRead = reader.read(buffer)) != -1) { - writer.write(buffer, 0, bytesRead); + try { + byte[] buffer = new byte[8192]; + int bytesRead = 0; + while ((bytesRead = reader.read(buffer)) != -1) { + writer.write(buffer, 0, bytesRead); + } + } + finally { + if(writer != null) + writer.close(); + if(reader != null) + reader.close(); } - - writer.close(); - reader.close(); // Set executable (x) flag to enable Java to load the native library if (!System.getProperty("os.name").contains("Windows")) { From 5e3ba5578216400c0238148a15e6c64ee6280970 Mon Sep 17 00:00:00 2001 From: "Philip K. Warren" Date: Wed, 10 Jul 2013 13:17:07 -0500 Subject: [PATCH 22/35] Avoid leaks with GetPrimitiveArrayCritical. It is possible that one of the two calls to GetPrimitiveArrayCritical succeeded, in which case an exception would be thrown and the memory would not be released. Ensure that every successful call to GetPrimitiveArrayCritical is followed by a call to ReleasePrimitiveArrayCritical. --- .../java/org/xerial/snappy/SnappyNative.cpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/main/java/org/xerial/snappy/SnappyNative.cpp b/src/main/java/org/xerial/snappy/SnappyNative.cpp index af7be0e..f3d1f51 100755 --- a/src/main/java/org/xerial/snappy/SnappyNative.cpp +++ b/src/main/java/org/xerial/snappy/SnappyNative.cpp @@ -90,6 +90,12 @@ JNIEXPORT jint JNICALL Java_org_xerial_snappy_SnappyNative_rawCompress__Ljava_la char* out = (char*) env->GetPrimitiveArrayCritical((jarray) output, 0); if(in == 0 || out == 0) { // out of memory + if(in != 0) { + env->ReleasePrimitiveArrayCritical((jarray) input, in, 0); + } + if(out != 0) { + env->ReleasePrimitiveArrayCritical((jarray) output, out, 0); + } throw_exception(env, self, 4); return 0; } @@ -110,6 +116,12 @@ JNIEXPORT jint JNICALL Java_org_xerial_snappy_SnappyNative_rawUncompress__Ljava_ char* out = (char*) env->GetPrimitiveArrayCritical((jarray) output, 0); if(in == 0 || out == 0) { // out of memory + if(in != 0) { + env->ReleasePrimitiveArrayCritical((jarray) input, in, 0); + } + if(out != 0) { + env->ReleasePrimitiveArrayCritical((jarray) output, out, 0); + } throw_exception(env, self, 4); return 0; } @@ -265,6 +277,12 @@ JNIEXPORT void JNICALL Java_org_xerial_snappy_SnappyNative_arrayCopy char* dest = (char*) env->GetPrimitiveArrayCritical((jarray) output, 0); if(src == 0 || dest == 0) { // out of memory + if(src != 0) { + env->ReleasePrimitiveArrayCritical((jarray) input, src, 0); + } + if(dest != 0) { + env->ReleasePrimitiveArrayCritical((jarray) output, dest, 0); + } throw_exception(env, self, 4); return; } From 06f007a084b36ea90f9b77f5566f4975b68cda12 Mon Sep 17 00:00:00 2001 From: "Taro L. Saito" Date: Tue, 13 Aug 2013 15:46:05 +0900 Subject: [PATCH 23/35] Attach UUID to the extracted native library file --- .../java/org/xerial/snappy/SnappyLoader.java | 226 +++--------------- 1 file changed, 34 insertions(+), 192 deletions(-) diff --git a/src/main/java/org/xerial/snappy/SnappyLoader.java b/src/main/java/org/xerial/snappy/SnappyLoader.java index 6fa066a..5f8f7f4 100755 --- a/src/main/java/org/xerial/snappy/SnappyLoader.java +++ b/src/main/java/org/xerial/snappy/SnappyLoader.java @@ -25,17 +25,13 @@ package org.xerial.snappy; import java.io.*; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; import java.net.URL; import java.security.DigestInputStream; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; -import java.security.ProtectionDomain; -import java.util.ArrayList; import java.util.Enumeration; -import java.util.List; import java.util.Properties; +import java.util.UUID; /** * Internal only - Do not use this class. This class loads a native @@ -136,92 +132,13 @@ public class SnappyLoader loadSnappySystemProperties(); } - private static ClassLoader getRootClassLoader() { - ClassLoader cl = Thread.currentThread().getContextClassLoader(); - while (cl.getParent() != null) { - cl = cl.getParent(); - } - return cl; - } - - private static byte[] getByteCode(String resourcePath) throws IOException { - - InputStream in = SnappyLoader.class.getResourceAsStream(resourcePath); - if (in == null) - throw new IOException(resourcePath + " is not found"); - byte[] buf = new byte[1024]; - ByteArrayOutputStream byteCodeBuf = new ByteArrayOutputStream(); - for (int readLength; (readLength = in.read(buf)) != -1;) { - byteCodeBuf.write(buf, 0, readLength); - } - in.close(); - - return byteCodeBuf.toByteArray(); - } - - public static boolean isNativeLibraryLoaded() { - return isLoaded; - } - - private static boolean hasInjectedNativeLoader() { - try { - final String nativeLoaderClassName = "org.xerial.snappy.SnappyNativeLoader"; - Class< ? > c = Class.forName(nativeLoaderClassName); - // If this native loader class is already defined, it means that another class loader already loaded the native library of snappy - return true; - } - catch (ClassNotFoundException e) { - // do loading - return false; - } - } - - /** - * Load SnappyNative and its JNI native implementation using the root class - * loader. This hack is for avoiding the JNI multi-loading issue when the - * same JNI library is loaded by different class loaders. - * - * In order to load native code in the root class loader, this method first - * inject SnappyNativeLoader class into the root class loader, because - * {@link System#load(String)} method uses the class loader of the caller - * class when loading native libraries. - * - *

-     * (root class loader) -> [SnappyNativeLoader (load JNI code), SnappyNative (has native methods), SnappyNativeAPI, SnappyErrorCode]  (injected by this method)
-     *    |
-     *    |
-     * (child class loader) -> Sees the above classes loaded by the root class loader.
-     *   Then creates SnappyNativeAPI implementation by instantiating SnappyNaitive class.
-     * 
- * - * - *
-     * (root class loader) -> [SnappyNativeLoader, SnappyNative ...]  -> native code is loaded by once in this class loader 
-     *   |   \
-     *   |    (child2 class loader)      
-     * (child1 class loader)
-     * 
-     * child1 and child2 share the same SnappyNative code loaded by the root class loader.
-     * 
- * - * Note that Java's class loader first delegates the class lookup to its - * parent class loader. So once SnappyNativeLoader is loaded by the root - * class loader, no child class loader initialize SnappyNativeLoader again. - * - * @return - */ - static synchronized Object load() + static synchronized Object load() { if (api != null) return api; try { - if (!hasInjectedNativeLoader()) { - // Inject SnappyNativeLoader (src/main/resources/org/xerial/snappy/SnappyNativeLoader.bytecode) to the root class loader - Class< ? > nativeLoader = injectSnappyNativeLoader(); - // Load the JNI code using the injected loader - loadNativeLibrary(nativeLoader); - } + loadNativeLibrary(); isLoaded = true; // Look up SnappyNative, injected to the root classloder, using reflection in order to avoid the initialization of SnappyNative class in this context class loader. @@ -237,91 +154,23 @@ public class SnappyLoader } /** - * Inject SnappyNativeLoader class to the root class loader - * - * @return native code loader class initialized in the root class loader + * Load a native library of snappy-java */ - private static Class< ? > injectSnappyNativeLoader() { - - try { - // Use parent class loader to load SnappyNative, since Tomcat, which uses different class loaders for each webapps, cannot load JNI interface twice - - final String nativeLoaderClassName = "org.xerial.snappy.SnappyNativeLoader"; - ClassLoader rootClassLoader = getRootClassLoader(); - // Load a byte code - byte[] byteCode = getByteCode("/org/xerial/snappy/SnappyNativeLoader.bytecode"); - // In addition, we need to load the other dependent classes (e.g., SnappyNative and SnappyException) using the system class loader - final String[] classesToPreload = new String[] { "org.xerial.snappy.SnappyNativeAPI", - "org.xerial.snappy.SnappyNative", "org.xerial.snappy.SnappyErrorCode" }; - List preloadClassByteCode = new ArrayList(classesToPreload.length); - for (String each : classesToPreload) { - preloadClassByteCode.add(getByteCode(String.format("/%s.class", each.replaceAll("\\.", "/")))); - } - - // Create SnappyNativeLoader class from a byte code - Class< ? > classLoader = Class.forName("java.lang.ClassLoader"); - Method defineClass = classLoader.getDeclaredMethod("defineClass", new Class[] { String.class, byte[].class, - int.class, int.class, ProtectionDomain.class }); - - ProtectionDomain pd = System.class.getProtectionDomain(); - - // ClassLoader.defineClass is a protected method, so we have to make it accessible - defineClass.setAccessible(true); - try { - // Create a new class using a ClassLoader#defineClass - defineClass.invoke(rootClassLoader, nativeLoaderClassName, byteCode, 0, byteCode.length, pd); - - // And also define dependent classes in the root class loader - for (int i = 0; i < classesToPreload.length; ++i) { - byte[] b = preloadClassByteCode.get(i); - defineClass.invoke(rootClassLoader, classesToPreload[i], b, 0, b.length, pd); - } - } - finally { - // Reset the accessibility to defineClass method - defineClass.setAccessible(false); - } - - // Load the SnappyNativeLoader class - return rootClassLoader.loadClass(nativeLoaderClassName); - - } - catch (Exception e) { - e.printStackTrace(System.err); - throw new SnappyError(SnappyErrorCode.FAILED_TO_LOAD_NATIVE_LIBRARY, e.getMessage()); - } - - } - - /** - * Load snappy-java's native code using load method of the - * SnappyNativeLoader class injected to the root class loader. - * - * @param loaderClass - * @throws SecurityException - * @throws NoSuchMethodException - * @throws IllegalArgumentException - * @throws IllegalAccessException - * @throws InvocationTargetException - */ - private static void loadNativeLibrary(Class< ? > loaderClass) throws SecurityException, NoSuchMethodException, - IllegalArgumentException, IllegalAccessException, InvocationTargetException { - if (loaderClass == null) - throw new SnappyError(SnappyErrorCode.FAILED_TO_LOAD_NATIVE_LIBRARY, "missing snappy native loader class"); + private static void loadNativeLibrary() { File nativeLib = findNativeLibrary(); if (nativeLib != null) { - // Load extracted or specified snappyjava native library. - Method loadMethod = loaderClass.getDeclaredMethod("load", new Class[] { String.class }); - loadMethod.invoke(null, nativeLib.getAbsolutePath()); + // Load extracted or specified snappyjava native library. + System.load(nativeLib.getAbsolutePath()); } else { - // Load preinstalled snappyjava (in the path -Djava.library.path) - Method loadMethod = loaderClass.getDeclaredMethod("loadLibrary", new Class[] { String.class }); - loadMethod.invoke(null, "snappyjava"); + // Load preinstalled snappyjava (in the path -Djava.library.path) + System.loadLibrary("snappyjava"); } } + + /** * Computes the MD5 value of the input stream * @@ -379,35 +228,14 @@ public class SnappyLoader */ private static File extractLibraryFile(String libFolderForCurrentOS, String libraryFileName, String targetFolder) { String nativeLibraryFilePath = libFolderForCurrentOS + "/" + libraryFileName; - final String prefix = "snappy-" + getVersion() + "-"; - String extractedLibFileName = prefix + libraryFileName; - File extractedLibFile = new File(targetFolder, extractedLibFileName); + // Attach UUID to the native library file to ensure multiple class loaders can read the libsnappy-java multiple times. + String uuid = UUID.randomUUID().toString(); + String extractedLibFileName = String.format("snappy-%s-%s-%s", getVersion(), uuid, libraryFileName); + File extractedLibFile = new File(targetFolder, extractedLibFileName); + // Delete extracted lib file on exit. + extractedLibFile.deleteOnExit(); try { - if (extractedLibFile.exists()) { - // Compare the native library contents - InputStream nativeIn = SnappyLoader.class.getResourceAsStream(nativeLibraryFilePath); - InputStream extractedLibIn = new FileInputStream(extractedLibFile); - try { - if(contentsEquals(nativeIn, extractedLibIn)) { - return new File(targetFolder, extractedLibFileName); - } - else { - // remove old native library file - boolean deletionSucceeded = extractedLibFile.delete(); - if (!deletionSucceeded) { - throw new IOException("failed to remove existing native library file: " - + extractedLibFile.getAbsolutePath()); - } - } - } - finally { - if(nativeIn != null) - nativeIn.close(); - if(extractedLibIn != null) - extractedLibIn.close(); - } - } // Extract a native library file into the target directory InputStream reader = SnappyLoader.class.getResourceAsStream(nativeLibraryFilePath); @@ -435,6 +263,22 @@ public class SnappyLoader catch (Throwable e) {} } + // Check the contents + { + InputStream nativeIn = SnappyLoader.class.getResourceAsStream(nativeLibraryFilePath); + InputStream extractedLibIn = new FileInputStream(extractedLibFile); + try { + if(!contentsEquals(nativeIn, extractedLibIn)) + throw new SnappyError(SnappyErrorCode.FAILED_TO_LOAD_NATIVE_LIBRARY, String.format("Failed to write a native library file at %s", extractedLibFile)); + } + finally { + if(nativeIn != null) + nativeIn.close(); + if(extractedLibIn != null) + extractedLibIn.close(); + } + } + return new File(targetFolder, extractedLibFileName); } catch (IOException e) { @@ -485,7 +329,7 @@ public class SnappyLoader throw new SnappyError(SnappyErrorCode.FAILED_TO_LOAD_NATIVE_LIBRARY, errorMessage); } - // Temporary library folder. Use the value of org.xerial.snappy.tempdir or java.io.tmpdir + // Temporary folder for the native lib. Use the value of org.xerial.snappy.tempdir or java.io.tmpdir String tempFolder = new File(System.getProperty(KEY_SNAPPY_TEMPDIR, System.getProperty("java.io.tmpdir"))).getAbsolutePath(); @@ -500,8 +344,6 @@ public class SnappyLoader - - /** * Get the snappy-java version by reading pom.properties embedded in jar. * This version data is used as a suffix of a dll file extracted from the From 1c3c5653527a8cd994c5e9c5125b3fe5e847e3ac Mon Sep 17 00:00:00 2001 From: "Taro L. Saito" Date: Tue, 13 Aug 2013 15:47:05 +0900 Subject: [PATCH 24/35] Removed md5sum code, which will no longer be used --- .../java/org/xerial/snappy/SnappyLoader.java | 33 ------------------- 1 file changed, 33 deletions(-) diff --git a/src/main/java/org/xerial/snappy/SnappyLoader.java b/src/main/java/org/xerial/snappy/SnappyLoader.java index 5f8f7f4..83bb252 100755 --- a/src/main/java/org/xerial/snappy/SnappyLoader.java +++ b/src/main/java/org/xerial/snappy/SnappyLoader.java @@ -26,9 +26,6 @@ package org.xerial.snappy; import java.io.*; import java.net.URL; -import java.security.DigestInputStream; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; import java.util.Enumeration; import java.util.Properties; import java.util.UUID; @@ -170,36 +167,6 @@ public class SnappyLoader } - - /** - * Computes the MD5 value of the input stream - * - * @param input - * @return - * @throws IOException - * @throws NoSuchAlgorithmException - */ - static String md5sum(InputStream input) throws IOException { - BufferedInputStream in = new BufferedInputStream(input); - try { - MessageDigest digest = java.security.MessageDigest.getInstance("MD5"); - DigestInputStream digestInputStream = new DigestInputStream(in, digest); - for (; digestInputStream.read() >= 0;) { - - } - ByteArrayOutputStream md5out = new ByteArrayOutputStream(); - md5out.write(digest.digest()); - return md5out.toString(); - } - catch (NoSuchAlgorithmException e) { - throw new IllegalStateException("MD5 algorithm is not available: " + e); - } - finally { - in.close(); - } - } - - private static boolean contentsEquals(InputStream in1, InputStream in2) throws IOException { if(!(in1 instanceof BufferedInputStream)) { in1 = new BufferedInputStream(in1); From 2891c692c05854af0f6cb64165ab82779a5d68e9 Mon Sep 17 00:00:00 2001 From: "Taro L. Saito" Date: Tue, 13 Aug 2013 15:55:58 +0900 Subject: [PATCH 25/35] Removed SnappyNativeAPI, since native loader injection is no longer necessary --- src/main/java/org/xerial/snappy/Snappy.java | 40 +++++----- .../java/org/xerial/snappy/SnappyLoader.java | 10 +-- .../java/org/xerial/snappy/SnappyNative.java | 5 +- .../org/xerial/snappy/SnappyNativeAPI.java | 76 ------------------- .../org/xerial/snappy/SnappyLoaderTest.java | 19 ++--- 5 files changed, 34 insertions(+), 116 deletions(-) delete mode 100755 src/main/java/org/xerial/snappy/SnappyNativeAPI.java diff --git a/src/main/java/org/xerial/snappy/Snappy.java b/src/main/java/org/xerial/snappy/Snappy.java index 6dee2e3..cca16b5 100755 --- a/src/main/java/org/xerial/snappy/Snappy.java +++ b/src/main/java/org/xerial/snappy/Snappy.java @@ -52,9 +52,9 @@ public class Snappy } /** - * An instance of SnappyNativeAPI + * An instance of SnappyNative */ - private static Object impl; + private static SnappyNative impl; /** * Copy bytes from source to destination @@ -73,7 +73,7 @@ public class Snappy */ public static void arrayCopy(Object src, int offset, int byteLength, Object dest, int dest_offset) throws IOException { - ((SnappyNativeAPI) impl).arrayCopy(src, offset, byteLength, dest, dest_offset); + impl.arrayCopy(src, offset, byteLength, dest, dest_offset); } /** @@ -134,7 +134,7 @@ public class Snappy // output: compressed int uPos = uncompressed.position(); int uLen = uncompressed.remaining(); - int compressedSize = ((SnappyNativeAPI) impl).rawCompress(uncompressed, uPos, uLen, compressed, + int compressedSize = impl.rawCompress(uncompressed, uPos, uLen, compressed, compressed.position()); // pos limit @@ -283,7 +283,7 @@ public class Snappy public static boolean isValidCompressedBuffer(byte[] input, int offset, int length) throws IOException { if (input == null) throw new NullPointerException("input is null"); - return ((SnappyNativeAPI) impl).isValidCompressedBuffer(input, offset, length); + return impl.isValidCompressedBuffer(input, offset, length); } /** @@ -303,7 +303,7 @@ public class Snappy * factor of four faster than actual decompression. */ public static boolean isValidCompressedBuffer(ByteBuffer compressed) throws IOException { - return ((SnappyNativeAPI) impl).isValidCompressedBuffer(compressed, compressed.position(), + return impl.isValidCompressedBuffer(compressed, compressed.position(), compressed.remaining()); } @@ -316,7 +316,7 @@ public class Snappy * @return maximum byte size of the compressed data */ public static int maxCompressedLength(int byteSize) { - return ((SnappyNativeAPI) impl).maxCompressedLength(byteSize); + return impl.maxCompressedLength(byteSize); } /** @@ -330,7 +330,7 @@ public class Snappy */ public static byte[] rawCompress(Object data, int byteSize) { byte[] buf = new byte[Snappy.maxCompressedLength(byteSize)]; - int compressedByteSize = ((SnappyNativeAPI) impl).rawCompress(data, 0, byteSize, buf, 0); + int compressedByteSize = impl.rawCompress(data, 0, byteSize, buf, 0); byte[] result = new byte[compressedByteSize]; System.arraycopy(buf, 0, result, 0, compressedByteSize); return result; @@ -358,7 +358,7 @@ public class Snappy if (input == null || output == null) throw new NullPointerException("input or output is null"); - int compressedSize = ((SnappyNativeAPI) impl) + int compressedSize = impl .rawCompress(input, inputOffset, inputLength, output, outputOffset); return compressedSize; } @@ -391,7 +391,7 @@ public class Snappy throws IOException { if (input == null || output == null) throw new NullPointerException("input or output is null"); - return ((SnappyNativeAPI) impl).rawUncompress(input, inputOffset, inputLength, output, outputOffset); + return impl.rawUncompress(input, inputOffset, inputLength, output, outputOffset); } /** @@ -463,7 +463,7 @@ public class Snappy // pos limit // [ ......UUUUUU.........] - int decompressedSize = ((SnappyNativeAPI) impl).rawUncompress(compressed, cPos, cLen, uncompressed, + int decompressedSize = impl.rawUncompress(compressed, cPos, cLen, uncompressed, uncompressed.position()); uncompressed.limit(uncompressed.position() + decompressedSize); @@ -493,7 +493,7 @@ public class Snappy public static char[] uncompressCharArray(byte[] input, int offset, int length) throws IOException { int uncompressedLength = Snappy.uncompressedLength(input, offset, length); char[] result = new char[uncompressedLength / 2]; - int byteSize = ((SnappyNativeAPI) impl).rawUncompress(input, offset, length, result, 0); + int byteSize = impl.rawUncompress(input, offset, length, result, 0); return result; } @@ -507,7 +507,7 @@ public class Snappy public static double[] uncompressDoubleArray(byte[] input) throws IOException { int uncompressedLength = Snappy.uncompressedLength(input, 0, input.length); double[] result = new double[uncompressedLength / 8]; - int byteSize = ((SnappyNativeAPI) impl).rawUncompress(input, 0, input.length, result, 0); + int byteSize = impl.rawUncompress(input, 0, input.length, result, 0); return result; } @@ -522,7 +522,7 @@ public class Snappy * {@link SnappyErrorCode#PARSING_ERROR} */ public static int uncompressedLength(byte[] input) throws IOException { - return ((SnappyNativeAPI) impl).uncompressedLength(input, 0, input.length); + return impl.uncompressedLength(input, 0, input.length); } /** @@ -541,7 +541,7 @@ public class Snappy if (input == null) throw new NullPointerException("input is null"); - return ((SnappyNativeAPI) impl).uncompressedLength(input, offset, length); + return impl.uncompressedLength(input, offset, length); } /** @@ -561,7 +561,7 @@ public class Snappy if (!compressed.isDirect()) throw new SnappyError(SnappyErrorCode.NOT_A_DIRECT_BUFFER, "input is not a direct buffer"); - return ((SnappyNativeAPI) impl).uncompressedLength(compressed, compressed.position(), compressed.remaining()); + return impl.uncompressedLength(compressed, compressed.position(), compressed.remaining()); } /** @@ -587,7 +587,7 @@ public class Snappy public static float[] uncompressFloatArray(byte[] input, int offset, int length) throws IOException { int uncompressedLength = Snappy.uncompressedLength(input, offset, length); float[] result = new float[uncompressedLength / 4]; - int byteSize = ((SnappyNativeAPI) impl).rawUncompress(input, offset, length, result, 0); + int byteSize = impl.rawUncompress(input, offset, length, result, 0); return result; } @@ -614,7 +614,7 @@ public class Snappy public static int[] uncompressIntArray(byte[] input, int offset, int length) throws IOException { int uncompressedLength = Snappy.uncompressedLength(input, offset, length); int[] result = new int[uncompressedLength / 4]; - int byteSize = ((SnappyNativeAPI) impl).rawUncompress(input, offset, length, result, 0); + int byteSize = impl.rawUncompress(input, offset, length, result, 0); return result; } @@ -641,7 +641,7 @@ public class Snappy public static long[] uncompressLongArray(byte[] input, int offset, int length) throws IOException { int uncompressedLength = Snappy.uncompressedLength(input, offset, length); long[] result = new long[uncompressedLength / 8]; - int byteSize = ((SnappyNativeAPI) impl).rawUncompress(input, offset, length, result, 0); + int byteSize = impl.rawUncompress(input, offset, length, result, 0); return result; } @@ -668,7 +668,7 @@ public class Snappy public static short[] uncompressShortArray(byte[] input, int offset, int length) throws IOException { int uncompressedLength = Snappy.uncompressedLength(input, offset, length); short[] result = new short[uncompressedLength / 2]; - int byteSize = ((SnappyNativeAPI) impl).rawUncompress(input, offset, length, result, 0); + int byteSize = impl.rawUncompress(input, offset, length, result, 0); return result; } diff --git a/src/main/java/org/xerial/snappy/SnappyLoader.java b/src/main/java/org/xerial/snappy/SnappyLoader.java index 83bb252..1e234e0 100755 --- a/src/main/java/org/xerial/snappy/SnappyLoader.java +++ b/src/main/java/org/xerial/snappy/SnappyLoader.java @@ -81,14 +81,14 @@ public class SnappyLoader public static final String KEY_SNAPPY_DISABLE_BUNDLED_LIBS = "org.xerial.snappy.disable.bundled.libs"; // Depreciated, but preserved for backward compatibility private static volatile boolean isLoaded = false; - private static volatile Object api = null; + private static volatile SnappyNative api = null; /** * Set the api instance. * * @param nativeCode */ - static synchronized void setApi(Object nativeCode) + static synchronized void setApi(SnappyNative nativeCode) { api = nativeCode; } @@ -129,7 +129,7 @@ public class SnappyLoader loadSnappySystemProperties(); } - static synchronized Object load() + static synchronized SnappyNative load() { if (api != null) return api; @@ -137,10 +137,8 @@ public class SnappyLoader try { loadNativeLibrary(); + setApi(new SnappyNative()); isLoaded = true; - // Look up SnappyNative, injected to the root classloder, using reflection in order to avoid the initialization of SnappyNative class in this context class loader. - Object nativeCode = Class.forName("org.xerial.snappy.SnappyNative").newInstance(); - setApi(nativeCode); } catch (Exception e) { e.printStackTrace(); diff --git a/src/main/java/org/xerial/snappy/SnappyNative.java b/src/main/java/org/xerial/snappy/SnappyNative.java index 9b42064..0a53d56 100755 --- a/src/main/java/org/xerial/snappy/SnappyNative.java +++ b/src/main/java/org/xerial/snappy/SnappyNative.java @@ -28,8 +28,7 @@ import java.io.IOException; import java.nio.ByteBuffer; /** - * Internal only - Do not use this class. JNI interface of the - * {@link SnappyNativeAPI} implementation. The native method in this class is + * JNI interface of the {@link Snappy} implementation. The native method in this class is * defined in SnappyNative.h (genereted by javah) and SnappyNative.cpp * *

@@ -40,7 +39,7 @@ import java.nio.ByteBuffer; * @author leo * */ -public class SnappyNative implements SnappyNativeAPI +public class SnappyNative { public native String nativeLibraryVersion(); diff --git a/src/main/java/org/xerial/snappy/SnappyNativeAPI.java b/src/main/java/org/xerial/snappy/SnappyNativeAPI.java deleted file mode 100755 index 6bf9fcc..0000000 --- a/src/main/java/org/xerial/snappy/SnappyNativeAPI.java +++ /dev/null @@ -1,76 +0,0 @@ -/*-------------------------------------------------------------------------- - * Copyright 2011 Taro L. Saito - * - * 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. - *--------------------------------------------------------------------------*/ -//-------------------------------------- -// snappy-java Project -// -// SnappyNative.java -// Since: 2011/03/30 -// -// $URL$ -// $Author$ -//-------------------------------------- -package org.xerial.snappy; - -import java.io.IOException; -import java.nio.ByteBuffer; - -/** - * Internal only - Do not use this class. - * - * Interface to access the native code of Snappy. Although this class members - * are public, do not use them directly. Use {@link Snappy} API instead. - * - * - * @author leo - * - */ -public interface SnappyNativeAPI -{ - - public String nativeLibraryVersion(); - - // ------------------------------------------------------------------------ - // Generic compression/decompression routines. - // ------------------------------------------------------------------------ - public int rawCompress(ByteBuffer input, int inputOffset, int inputLength, ByteBuffer compressed, int outputOffset) - throws IOException; - - public int rawCompress(Object input, int inputOffset, int inputByteLength, Object output, int outputOffset); - - public int rawUncompress(ByteBuffer compressed, int inputOffset, int inputLength, ByteBuffer uncompressed, - int outputOffset) throws IOException; - - public int rawUncompress(Object input, int inputOffset, int inputLength, Object output, int outputOffset) - throws IOException; - - // Returns the maximal size of the compressed representation of - // input data that is "source_bytes" bytes in length; - public int maxCompressedLength(int source_bytes); - - // This operation takes O(1) time. - public int uncompressedLength(ByteBuffer compressed, int offset, int len) throws IOException; - - public int uncompressedLength(Object input, int offset, int len) throws IOException; - - public boolean isValidCompressedBuffer(ByteBuffer compressed, int offset, int len) throws IOException; - - public boolean isValidCompressedBuffer(Object input, int offset, int len) throws IOException; - - public void arrayCopy(Object src, int offset, int byteLength, Object dest, int dOffset) throws IOException; - - public void throw_error(int errorCode) throws IOException; - -} diff --git a/src/test/java/org/xerial/snappy/SnappyLoaderTest.java b/src/test/java/org/xerial/snappy/SnappyLoaderTest.java index 81ecd53..9bcc85f 100755 --- a/src/test/java/org/xerial/snappy/SnappyLoaderTest.java +++ b/src/test/java/org/xerial/snappy/SnappyLoaderTest.java @@ -24,23 +24,20 @@ //-------------------------------------- package org.xerial.snappy; -import static org.junit.Assert.*; - -import java.io.BufferedInputStream; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.lang.reflect.Method; -import java.net.URL; -import java.net.URLClassLoader; - import org.codehaus.plexus.classworlds.ClassWorld; import org.codehaus.plexus.classworlds.realm.ClassRealm; import org.junit.Test; import org.xerial.util.FileResource; import org.xerial.util.log.Logger; +import java.io.*; +import java.lang.reflect.Method; +import java.net.URL; +import java.net.URLClassLoader; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.fail; + public class SnappyLoaderTest { private static Logger _logger = Logger.getLogger(SnappyLoaderTest.class); From a48529731dc8acdad93271947f7c836f5d7f508a Mon Sep 17 00:00:00 2001 From: "Taro L. Saito" Date: Tue, 13 Aug 2013 16:07:46 +0900 Subject: [PATCH 26/35] Add Snappy.cleanUp method for J2EE containers. #27 --- src/main/java/org/xerial/snappy/Snappy.java | 13 +++++++++++++ src/main/java/org/xerial/snappy/SnappyLoader.java | 15 +++++++++++---- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/xerial/snappy/Snappy.java b/src/main/java/org/xerial/snappy/Snappy.java index cca16b5..3c6f409 100755 --- a/src/main/java/org/xerial/snappy/Snappy.java +++ b/src/main/java/org/xerial/snappy/Snappy.java @@ -56,6 +56,19 @@ public class Snappy */ private static SnappyNative impl; + + /** + * Clean up a temporary file (native lib) generated by snappy-java. + * General users do not need to call this method, since the native library extracted in snappy-java + * is deleted upon JVM termination (vie deleteOnExit()). + * This method is useful when using a J2EE container, which will restart servlet containers multiple times without + * restarting JVM. + */ + static void cleanUp() { + SnappyLoader.cleanUpExtractedNativeLib(); + } + + /** * Copy bytes from source to destination * diff --git a/src/main/java/org/xerial/snappy/SnappyLoader.java b/src/main/java/org/xerial/snappy/SnappyLoader.java index 1e234e0..d60f82d 100755 --- a/src/main/java/org/xerial/snappy/SnappyLoader.java +++ b/src/main/java/org/xerial/snappy/SnappyLoader.java @@ -82,7 +82,14 @@ public class SnappyLoader private static volatile boolean isLoaded = false; private static volatile SnappyNative api = null; - + + private static File nativeLibFile = null; + + static void cleanUpExtractedNativeLib() { + if(nativeLibFile != null && nativeLibFile.exists()) + nativeLibFile.delete(); + } + /** * Set the api instance. * @@ -153,10 +160,10 @@ public class SnappyLoader */ private static void loadNativeLibrary() { - File nativeLib = findNativeLibrary(); - if (nativeLib != null) { + nativeLibFile = findNativeLibrary(); + if (nativeLibFile != null) { // Load extracted or specified snappyjava native library. - System.load(nativeLib.getAbsolutePath()); + System.load(nativeLibFile.getAbsolutePath()); } else { // Load preinstalled snappyjava (in the path -Djava.library.path) From b7755bf93dcbdcb12f3d736b754b7d1d1c69f74d Mon Sep 17 00:00:00 2001 From: "Taro L. Saito" Date: Tue, 13 Aug 2013 16:09:29 +0900 Subject: [PATCH 27/35] Add a cleanup phase for OSGi container --- src/main/java/org/xerial/snappy/SnappyBundleActivator.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/xerial/snappy/SnappyBundleActivator.java b/src/main/java/org/xerial/snappy/SnappyBundleActivator.java index f36a4f5..1055f58 100755 --- a/src/main/java/org/xerial/snappy/SnappyBundleActivator.java +++ b/src/main/java/org/xerial/snappy/SnappyBundleActivator.java @@ -24,12 +24,12 @@ //-------------------------------------- package org.xerial.snappy; -import java.util.jar.Manifest; - import org.osgi.framework.Bundle; import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext; +import java.util.jar.Manifest; + /** * OSGi bundle entry point * @@ -56,5 +56,6 @@ public class SnappyBundleActivator implements BundleActivator public void stop(BundleContext context) throws Exception { SnappyLoader.setApi(null); + Snappy.cleanUp(); } } From 640f626c3670dbe97c17fe696e2366c5a5d0342c Mon Sep 17 00:00:00 2001 From: "Taro L. Saito" Date: Tue, 13 Aug 2013 16:18:24 +0900 Subject: [PATCH 28/35] Fix OSGi settings in pom.xml --- pom.xml | 9 --------- 1 file changed, 9 deletions(-) diff --git a/pom.xml b/pom.xml index 93d294d..cf4653f 100755 --- a/pom.xml +++ b/pom.xml @@ -182,14 +182,6 @@ org.osgi.framework;version="[1.5,2)" lazy -<<<<<<< HEAD - org/xerial/snappy/native/Windows/amd64/snappyjava.dll;osname=win32;processor=x86-64, - org/xerial/snappy/native/Windows/x86/snappyjava.dll;osname=win32;processor=x86, - org/xerial/snappy/native/Mac/x86_64/libsnappyjava.jnilib;osname=macosx;processor=x86-64, - org/xerial/snappy/native/Linux/amd64/libsnappyjava.so;osname=linux;processor=x86-64, - org/xerial/snappy/native/Linux/i386/libsnappyjava.so;osname=linux;processor=x86, - org/xerial/snappy/native/Linux/arm/libsnappyjava.so;osname=linux;processor=arm -======= org/xerial/snappy/native/Windows/x86_64/snappyjava.dll;selection-filter="(&(osgi.arch=x86_64)(osgi.os=win32))", org/xerial/snappy/native/Windows/x86/snappyjava.dll;selection-filter="(&(osgi.arch=x86)(osgi.os=win32))", org/xerial/snappy/native/Mac/x86/libsnappyjava.jnilib;selection-filter="(&(osgi.arch=x86)(osgi.os=macosx))", @@ -197,7 +189,6 @@ org/xerial/snappy/native/Linux/x86_64/libsnappyjava.so;selection-filter="(&(osgi.arch=x86_64)(osgi.os=linux))", org/xerial/snappy/native/Linux/x86/libsnappyjava.so;selection-filter="(&(osgi.arch=x86)(osgi.os=linux))", org/xerial/snappy/native/Linux/arm/libsnappyjava.so;selection-filter="(&(osgi.arch=arm)(osgi.os=linux))" ->>>>>>> feature/lib-loader From 171775e92bb1a8e9a2de73f253bfa37738596c88 Mon Sep 17 00:00:00 2001 From: "Taro L. Saito" Date: Tue, 13 Aug 2013 16:50:58 +0900 Subject: [PATCH 29/35] Add a file permission setting code sample for Java6 --- src/main/java/org/xerial/snappy/SnappyLoader.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/xerial/snappy/SnappyLoader.java b/src/main/java/org/xerial/snappy/SnappyLoader.java index 0f07ae7..61c9252 100755 --- a/src/main/java/org/xerial/snappy/SnappyLoader.java +++ b/src/main/java/org/xerial/snappy/SnappyLoader.java @@ -207,8 +207,8 @@ public class SnappyLoader File extractedLibFile = new File(targetFolder, extractedLibFileName); // Delete extracted lib file on exit. extractedLibFile.deleteOnExit(); - try { + try { // Extract a native library file into the target directory InputStream reader = SnappyLoader.class.getResourceAsStream(nativeLibraryFilePath); FileOutputStream writer = new FileOutputStream(extractedLibFile); @@ -231,11 +231,17 @@ public class SnappyLoader try { Runtime.getRuntime().exec(new String[] { "chmod", "755", extractedLibFile.getAbsolutePath() }) .waitFor(); + + // Use following methods added since Java6 (If discarding Java5 is acceptable) + //extractedLibFile.setReadable(true); + //extractedLibFile.setWritable(true, true); + //extractedLibFile.setExecutable(true); } catch (Throwable e) {} } - // Check the contents + + // Check whether the contents are properly copied from the resource folder { InputStream nativeIn = SnappyLoader.class.getResourceAsStream(nativeLibraryFilePath); InputStream extractedLibIn = new FileInputStream(extractedLibFile); From fed7278fcd4fb85bc7b691e6918ce6ff6f933d52 Mon Sep 17 00:00:00 2001 From: "Taro L. Saito" Date: Tue, 13 Aug 2013 17:00:54 +0900 Subject: [PATCH 30/35] Fix #29. Need to recreate native libraries for all OSes --- .../java/org/xerial/snappy/SnappyNative.cpp | 13 +++++++++++++ .../java/org/xerial/snappy/SnappyNative.h | 8 ++++++++ .../java/org/xerial/snappy/SnappyNative.java | 2 ++ .../native/Mac/x86_64/libsnappyjava.jnilib | Bin 48156 -> 48244 bytes 4 files changed, 23 insertions(+) diff --git a/src/main/java/org/xerial/snappy/SnappyNative.cpp b/src/main/java/org/xerial/snappy/SnappyNative.cpp index f3d1f51..78af982 100755 --- a/src/main/java/org/xerial/snappy/SnappyNative.cpp +++ b/src/main/java/org/xerial/snappy/SnappyNative.cpp @@ -270,6 +270,19 @@ JNIEXPORT jboolean JNICALL Java_org_xerial_snappy_SnappyNative_isValidCompressed return ret; } +JNIEXPORT jboolean JNICALL Java_org_xerial_snappy_SnappyNative_isValidCompressedBuffer__JJJ + (JNIEnv * env, jobject self, jlong inputAddr, jlong offset, jlong length) +{ + if(inputAddr == 0) { + // out of memory + throw_exception(env, self, 4); + return 0; + } + bool ret = snappy::IsValidCompressedBuffer((char*) (inputAddr + offset), (size_t) length); + return ret; +} + + JNIEXPORT void JNICALL Java_org_xerial_snappy_SnappyNative_arrayCopy (JNIEnv * env, jobject self, jobject input, jint offset, jint length, jobject output, jint output_offset) { diff --git a/src/main/java/org/xerial/snappy/SnappyNative.h b/src/main/java/org/xerial/snappy/SnappyNative.h index 477d30a..d1f3e58 100755 --- a/src/main/java/org/xerial/snappy/SnappyNative.h +++ b/src/main/java/org/xerial/snappy/SnappyNative.h @@ -111,6 +111,14 @@ JNIEXPORT jboolean JNICALL Java_org_xerial_snappy_SnappyNative_isValidCompressed JNIEXPORT jboolean JNICALL Java_org_xerial_snappy_SnappyNative_isValidCompressedBuffer__Ljava_lang_Object_2II (JNIEnv *, jobject, jobject, jint, jint); +/* + * Class: org_xerial_snappy_SnappyNative + * Method: isValidCompressedBuffer + * Signature: (JJJ)Z + */ +JNIEXPORT jboolean JNICALL Java_org_xerial_snappy_SnappyNative_isValidCompressedBuffer__JJJ + (JNIEnv *, jobject, jlong, jlong, jlong); + /* * Class: org_xerial_snappy_SnappyNative * Method: arrayCopy diff --git a/src/main/java/org/xerial/snappy/SnappyNative.java b/src/main/java/org/xerial/snappy/SnappyNative.java index 7e9dbb2..b95e213 100755 --- a/src/main/java/org/xerial/snappy/SnappyNative.java +++ b/src/main/java/org/xerial/snappy/SnappyNative.java @@ -76,6 +76,8 @@ public class SnappyNative public native boolean isValidCompressedBuffer(Object input, int offset, int len) throws IOException; + public native boolean isValidCompressedBuffer(long inputAddr, long offset, long len) throws IOException; + public native void arrayCopy(Object src, int offset, int byteLength, Object dest, int dOffset) throws IOException; public void throw_error(int errorCode) throws IOException { diff --git a/src/main/resources/org/xerial/snappy/native/Mac/x86_64/libsnappyjava.jnilib b/src/main/resources/org/xerial/snappy/native/Mac/x86_64/libsnappyjava.jnilib index 392e03b036c2d524c3d42248fcb1ae9c03fc01bf..b9a2085626ceb0272f3ce6ad4e56e07dfae347e6 100755 GIT binary patch delta 7193 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 delta 6797 zcmaJ`30PEDvOf3P4c!W|$PPlIY>GmovbnHC(2IiNjteN_pySMQnI~?E={9aOEznp- zQ4!Io(HUdVR-?SAZCs*e#=(plqlrPYwZ<4sj1tF5zdE-rF8#jm-OsMSs{X1vbE00rGJ6Sx z5eBFb(!BDGWPaL#Fdse_(tRUVl4TJIxh=wc*I<~YRza>9;%i$?jE@q*ZM7UxE9$(j zloQ*a40fd)sZg+sI^V?=M3wsza=U|^*r--n2X)FHZmLXdP60Vn^oSFTxIFSD@gTs+I#u53x8H4pKg?m6Zm8cDdG zV;Z8FoLN+O+M5tFTo?r#;JFUcg?_?*p=WKqF(_Qhk=X7~tkCb~^ z(VkTLB5Cf6AUS5LlU?1O)8|Fb>uaH}&--H0EbBKug@QJC7-M#qnT)}_UVbpmZ>+dy z4jl1I5KopuwZH#5|15DzDGc!+Dh6^#rr{CBN|lK_5t>4A<4Be6KcH@Z;}2XPbd~5; zobE>SO->gQeT3*zPA3!n8K={bF7*h@qBR^Nt+-!+>))^jYp$?)N~Y{a$+YaKWGaJ^ z0jtF|L*cW4M7R8*m^okuiliA35cpo;#v!P`Rf47D+r!HQU>UX=ZUqi@9l+VB5{L=< zK0RE^qrlv-2YoKV=HY7R0*~pG~E6bZJe)VC5#A8 zb8W_M?f+8@5IiTe5Sbj)YQ6z;O;2-7=S*EB;nRf2xuz%f>SAkHh*=OHPqpsrnkI;i zMb`VF;bM?uDzBC}vk2GXIBry|+=ecD`V@!`FHQLg{YbZQx`1eJPM@62*r^t=yo2O8 zEt#{==a#f$Z<4vJG1v67{maR4HayIbPqi(Dm^=~>BGw+klV@Qv-lYVh=W{y$B|3*_ zZyGw74?Uac0jS%168#I&eR=k1qEmSBPDEcRVg}y159f=BAI16mljOk=@UQ|RpkF{Jkq9YTaM|>@JgR_z9YZ4Cr*GRQ9Z;D$HUI3 z!%@GD!;lrn8=g2EY=N6(mNom=+-qKDlU6wvsO?wBfg!qA$9K6C55nFQI2;`os9DT2 z<@0$R&u0ssPdlEsnnmzq^ypxB47O|JjMGx(vg`Ia_*KiZRVgqjCN;=9mWl!5%crb* zEW8&JCN3QdmttNE8p|h8nK%QX>3w|Q;7(qMx_#hSYtJ4_g&=u=%EV?Y(uBvB^J+fu zp3(1|=qZTxlff3-J#+~!kH-gY!z9y1Y55)2#z(#;oqC|f!%#RGgkGPDrUJOyD_ks{ z1Z};hh?+?-zISi2Yd);%T_)}x3D0`p2}&C!_p%`$$GS=e1!PRXjl=yIc|Z5e+RAlv203?ISeN` zax@hfBNs@KoxT&%i3N&A!&~}D@sJkw>Z1e=H0#q`@e7E5X+l*(hEN3mOz_i`${o7@ z34Tn75>IKsw~tPI_d7`LGbL;jc8xb*=`Jn-g=}PbNx$s!I#Nlwz*~mr$*JK#+*ng(O zLKD#0JXVgzxMOOZ#oc7o%-PL%Uqkc=Gop(@bCSQIeHC*|pV1;dNh)c^6_rZLaIy26?Gt`-;9YNTIM;NqeeK#Cesx801%BA2OrO75X2RLj zv*PFnu(p4?XYox3?nS;G@gCT_v{-NUzv*EZHv!*?Zew8lXm z=w)S#&Z%8c!Bj@@RFbVn1P=)81a}C&Ah<@*OmLCl48aM4qa3`>sSlF5k6^cT;lx0d zu*_;H{6yt;AsxFj4be-c#1k-cdam327miXmIlaGI>aovQC!uvTTs$4q5J$ zy`yxlfk+W!Y$u;h-!J$?^zFJe8GQf7IdEfalw|$1A(u<+_UWZ@J#KUiRPS z`hC*B5aNW>I#szNdB>gPcYe_%F^|hoQ=em*fV_aWA z`eClmBK-i@r;z?0*Yio=%k?bMcX2(1^ugP?(Tj|&T-TAliR(V3zs+?G=`~z`2J-AH zx!wxa&c;>9|oBw8=6Cz>%1^@>M$alxq5cP-4xA)mKf%0#Gl>`{aA?#4XkrW?To3%(xc^OQc_g*tR(n3|ku~{6(f_pkuU5tw*g-Iov?X zPj);)$Ky57zcNm|wgzS+G_8Tnl|!^|t)USQVpn0Hsp=AX+>0?!Pd8VM1xMqxp7l_%E>2|i(1g&k74EHz6H*`$ z;G zGdd5O*7tSiciXs~lH#yvta}}L7VjX>A7#%K^fbOh9xZsijRWr_>tFJ~S$OL7yU6n{ zdZMA_ZJpM0H+drE9o}xa^Bpd9^89GdEqu>FU~;8eEqN)u7GKn=>HZ~-M&t;dEg zLI3(Bt!FbeG!eYEg+WWLO3ja025hhAt8f_uQ?5hDZE?aLNZpo<-Ob+?uhre4q@9@5 zT^)flXn@Pxh8o)cc&azhJ{zc@q~KTurz!Yn1s5y0QbCJ?bqelL@Q{Kw1^=$#bwUIC zMsc(%_)I~Kks9(*P^Vxo1ydBvQjjT^=XO#a;6s96Hx%5XV7-E#GK-rq9|E_BP5g^d zwx0{5Ql^_PxjHMjKuLd7L5qUziBuM!3P$qa9o_CPHX8X~iM#2QqT`ifuPNA`Jlltd zc{eCw6$-u37u`|Tj2)7PXp4c01F2pXu~}#kEJB0WDm03%q6MxUn1qvYhlGRv20cEe z_=Rt2%tOGv(MLAf8pZbH1YWoB!}(UdY%+h;x!tVTqZC{Ii!+9-QS8s5Hd?EX3`Me#Bo?>}iQ)hv2?N8voH1 z>tqj*ZNrOz5l#VxPWC(}+vsH1IN3*?>^rh;eBRJKZX4JO$Ingyzfl2P2fAFaYgK7zOnTdf?JQ#^C_3095c@kKucs{2wBr eaQSeurYl2F4>%ka$G0o;>ot`hNje7fO`? From ae0a3e4d49bbc93e4b9c14912dd39ccae721b8ec Mon Sep 17 00:00:00 2001 From: "Taro L. Saito" Date: Tue, 13 Aug 2013 17:02:16 +0900 Subject: [PATCH 31/35] Add isValidCompressedBuffer for raw memory addresses --- src/main/java/org/xerial/snappy/Snappy.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/main/java/org/xerial/snappy/Snappy.java b/src/main/java/org/xerial/snappy/Snappy.java index bfaf175..3e6b316 100755 --- a/src/main/java/org/xerial/snappy/Snappy.java +++ b/src/main/java/org/xerial/snappy/Snappy.java @@ -320,6 +320,17 @@ public class Snappy compressed.remaining()); } + /** + * Returns true iff the contents of compressed buffer [offset, + * offset+length) can be uncompressed successfully. Does not return the + * uncompressed data. Takes time proportional to the input length, but is + * usually at least a factor of four faster than actual decompression. + */ + public static boolean isValidCompressedBuffer(long inputAddr, long offset, long length) throws IOException { + return impl.isValidCompressedBuffer(inputAddr, offset, length); + } + + /** * Get the maximum byte size needed for compressing data of the given byte * size. From 9671c812240d38bf4eb8d3acf44fa43df834150f Mon Sep 17 00:00:00 2001 From: "Taro L. Saito" Date: Tue, 13 Aug 2013 17:07:02 +0900 Subject: [PATCH 32/35] Removed the note on JNI injection --- README.md | 2 +- src/main/java/org/xerial/snappy/Snappy.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 6974246..226265a 100755 --- a/README.md +++ b/README.md @@ -125,7 +125,7 @@ If you are using Mac and openjdk7 (or higher), use the following option: ## Miscellaneous Notes ### Using snappy-java with Tomcat 6 (or higher) Web Server -Simply put the snappy-java's jar to WEB-INF/lib folder of your web application. Usual JNI-library specific problem no longer exists since snappy-java version 1.0.3 or higher can be loaded by multiple class loaders in the same JVM by using native code injection to the parent class loader (Issue 21). +Simply put the snappy-java's jar to WEB-INF/lib folder of your web application. Usual JNI-library specific problem no longer exists since snappy-java version 1.0.3 or higher can be loaded by multiple class loaders. ---- Snappy-java is developed by [Taro L. Saito](http://www.xerial.org/leo). Twitter [@taroleo](http://twitter.com/#!/taroleo) diff --git a/src/main/java/org/xerial/snappy/Snappy.java b/src/main/java/org/xerial/snappy/Snappy.java index 3e6b316..ea43f68 100755 --- a/src/main/java/org/xerial/snappy/Snappy.java +++ b/src/main/java/org/xerial/snappy/Snappy.java @@ -66,6 +66,7 @@ public class Snappy */ static void cleanUp() { SnappyLoader.cleanUpExtractedNativeLib(); + SnappyLoader.setApi(null); } From 3dd90fb43f0d5adb30de5659c9508a31b178ad31 Mon Sep 17 00:00:00 2001 From: "Taro L. Saito" Date: Tue, 13 Aug 2013 17:23:53 +0900 Subject: [PATCH 33/35] Recompile OSInfo class for Java1.5 --- lib/org/xerial/snappy/OSInfo.class | Bin 1691 -> 3321 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/lib/org/xerial/snappy/OSInfo.class b/lib/org/xerial/snappy/OSInfo.class index 98d832234b7792b549ede92abcc199a35010717a..3052227836339ad60e60735ddeaa8bcf73ebbb67 100755 GIT binary patch literal 3321 zcmZ`+X?q*h6@JH-rE7Tt$$%k{r3wWv3bJtQxK8YvI1Vmu?AS$#je*o1$zyqpG$TeM zFC}Gb3uSFupkTVv(xwY7PG}W3DJfm(Lf7x@&*UX|R|LK)nO=_I6?sbMUzPjU1YQ$(U0_w<4S}xZ!lKw?~1t^-#gKA=@gt zy5&ylxf0EU$vV^1tspWo*wa1JbwEK#LR2y_F~swJ(=y!wqHXPyJR7oSDRup*X&EO< z`LyAj)YCaqLV4Y^6x`JI;8v?r@V2bsp3q%$(HJ$;!**`ga3*wje%N+~N{(Y#?s!VU zjcx5)rI{AWj;BuOdD>|rJjhJ?*e=)6tzu4h4gdV4?W^`rTiUj2yQYCX8)~YmH!BkT znOr3e(Ue_sGRCkegKip6jaYMbhpeTF`@j%FiG*EL@e{lq!B18E4DYCT0MikysW^`d zOlTq@J3+;Rm{xH=rWM@m^+KSmM@yzmkcxNla|KFL#V;gZ#4dJN%z}zCPOEqbr+u2# z#{%h2Ud2VMD`;SOO3NyKiA&6$)ZQ^~%j|8x+7cBc)25XyQbAoJL-*!PYc|%ZpsO{O zkj7%IIWxVmnC~dst+6w)c|)I#B{~T$>rS>9bBG(cxmaS5Bn2&5$0)>FPwLs3!J{KH zlfx4;lI?Je5P7p^(KVc6YXp~7{0i@>xPo6t@V<)Q;J5UfAfr>xik19TadsX}iZ>#t-K2-5(FIiIz&R!}q zSz|hbt$S!n0aW}2e^s!Q@zL23r2>HgpEf^dX8ev!Q0`V_O(B- zNhY>K5Aj-MsxWy^cWixMzuBw&MiHvQz992xfuAt$edEH4d zHHMWjyfpaj;9bi5O02HDK2Z*z4WxO~u&R*hU&vTCSgW>cPQpN3bUb4ei(i2&YD{8It^2n2O;=5sws zjeEFrn4lqk5z2W23Qlnid&E1?h)GNlmaGoyJ?i23mC&0=Xm#=W17*~&V%r6T*3nQ# z_`DX`Ocavn9XCp7Lw^f3gKmWB$PQ}1l~#ArQVXA!B&Kl}PU8@#U!#0#D)zgX4*9qH zGNRKL(d3y_wQXgn>!2aEjO*5T9*jVz2EJnz4f{O*fky56b!=b9j;q-Xvh#tfu>S`Q z2vOl#O(Xm9xOPJsH?AV>No&nz+_Z{Q+RZ#04Znw-)Aiadsp*h*Yihco;-a>TZtdq! z+bx$pzLTl3b?m*fjE|HN8`$#(!rH#Ia}Z*Y* z79Jzzaej9`f#>lQ`-3lZB?G4`B~Qe)xEF3%i?78sy2a4L+J3@*8p2vL;XAcN86CBx z?nQ*|Jk6v&!{_Q*G~+pbp}xRoe-XFiEKTu!tC-qXG1a(Ljo*x~l6|Jyx5_cH%fEkL zMv~2N*Slz8mb6Z-vy1~%66~sh-8JxF4eY6bAFF}AT5naup&EF&2KLp!eyzXC`|%n$ zpbb>1ch|rp+L0=Cum&EjfkQR$m=D&j%Oq0=v~o6d5;}kwy09PJ=)pk@avkMmnZjZA vLLc(z$1?8bzYs_85{9sfV|a@*==u8w;GnmiEQaVJ|YcpHmerRc3}yj)O5pnhwuSQUt6wVp?mj=v7fUb7Z>lz);kiKFoL3MCXN#p*Zv{fjc>&n)up-yPeT@z4-fJ(j;gwc1 z^IMf-X;r=tAIcpqC4cKPc_gW0J0A$pA;5KLPch2yBoD&rZxCPUgpi=sd@#v2HN!7J zCr&dmaRz6JsOEPvZcfkEI=Ywva~iXa=t2zL9GRk*=8zur(GJlbF%C1=?K4s)#V9|R zZX`jZHoc#W)Yi`&nz8Mp%pfz=H@HQTr}|9C*+;`ZnsyloBxq|yBP^%BL3tT{0Qf>#*#Hk=KM$U0cGl>YM(28j;HpBI2k1gn; imrE Date: Tue, 13 Aug 2013 17:45:03 +0900 Subject: [PATCH 34/35] Fix for Mac-x86 --- Makefile.common | 64 +++++++++--------- .../native/Mac/x86/libsnappyjava.jnilib | Bin 43716 -> 43804 bytes 2 files changed, 32 insertions(+), 32 deletions(-) diff --git a/Makefile.common b/Makefile.common index 0e022c6..bb1d6f3 100755 --- a/Makefile.common +++ b/Makefile.common @@ -33,7 +33,7 @@ endif snappy := snappy-$(VERSION) -jni_md := $(shell find -L "$(JAVA_HOME)" -name jni_md.h) +jni_md := $(shell find -L "$(JAVA_HOME)" -name jni_md.h | head -1) ifneq ($(jni_md),) jni_include := $(shell dirname "$(jni_md)") endif @@ -41,7 +41,7 @@ endif # os=Default is meant to be generic unix/linux -known_os_archs := Linux-i386 Linux-amd64 Linux-arm Linux-armhf Mac-i386 Mac-x86_64 FreeBSD-amd64 Windows-x86 Windows-amd64 +known_os_archs := Linux-x86 Linux-x86_64 Linux-arm Linux-armhf Mac-x86 Mac-x86_64 FreeBSD-x86_64 Windows-x86 Windows-x86_64 os_arch := $(OS_NAME)-$(OS_ARCH) ifeq (,$(findstring $(strip $(os_arch)),$(known_os_archs))) @@ -58,19 +58,19 @@ Default_LINKFLAGS := -shared -static Default_LIBNAME := libsnappyjava.so Default_SNAPPY_FLAGS := -Linux-i386_CXX := $(CROSS_PREFIX)g++ -Linux-i386_STRIP := $(CROSS_PREFIX)strip -Linux-i386_CXXFLAGS := -include lib/inc_linux/jni_md.h -I$(JAVA_HOME)/include -O2 -fPIC -fvisibility=hidden -m32 -Linux-i386_LINKFLAGS := -shared -static-libgcc -static-libstdc++ -Linux-i386_LIBNAME := libsnappyjava.so -Linux-i386_SNAPPY_FLAGS:= +Linux-x86_CXX := $(CROSS_PREFIX)g++ +Linux-x86_STRIP := $(CROSS_PREFIX)strip +Linux-x86_CXXFLAGS := -include lib/inc_linux/jni_md.h -I$(JAVA_HOME)/include -O2 -fPIC -fvisibility=hidden -m32 +Linux-x86_LINKFLAGS := -shared -static-libgcc -static-libstdc++ +Linux-x86_LIBNAME := libsnappyjava.so +Linux-x86_SNAPPY_FLAGS:= -Linux-amd64_CXX := $(CROSS_PREFIX)g++ -Linux-amd64_STRIP := $(CROSS_PREFIX)strip -Linux-amd64_CXXFLAGS := -include lib/inc_linux/jni_md.h -I$(JAVA_HOME)/include -O2 -fPIC -fvisibility=hidden -m64 -Linux-amd64_LINKFLAGS := -shared -static-libgcc -static-libstdc++ -Linux-amd64_LIBNAME := libsnappyjava.so -Linux-amd64_SNAPPY_FLAGS := +Linux-x86_64_CXX := $(CROSS_PREFIX)g++ +Linux-x86_64_STRIP := $(CROSS_PREFIX)strip +Linux-x86_64_CXXFLAGS := -include lib/inc_linux/jni_md.h -I$(JAVA_HOME)/include -O2 -fPIC -fvisibility=hidden -m64 +Linux-x86_64_LINKFLAGS := -shared -static-libgcc -static-libstdc++ +Linux-x86_64_LIBNAME := libsnappyjava.so +Linux-x86_64_SNAPPY_FLAGS := # '-include lib/inc_linux/jni_md.h' is used to force the use of our version, # which defines JNIEXPORT differently; otherwise, since OpenJDK includes @@ -91,12 +91,12 @@ Linux-armhf_LINKFLAGS := -shared -static-libgcc Linux-armhf_LIBNAME := libsnappyjava.so Linux-armhf_SNAPPY_FLAGS:= -Mac-i386_CXX := g++ -arch $(OS_ARCH) -Mac-i386_STRIP := strip -x -Mac-i386_CXXFLAGS := -Ilib/inc_mac -I$(JAVA_HOME)/include -O2 -fPIC -mmacosx-version-min=10.4 -fvisibility=hidden -Mac-i386_LINKFLAGS := -dynamiclib -static-libgcc -Mac-i386_LIBNAME := libsnappyjava.jnilib -Mac-i386_SNAPPY_FLAGS := +Mac-x86_CXX := g++ -arch i386 +Mac-x86_STRIP := strip -x +Mac-x86_CXXFLAGS := -Ilib/inc_mac -I$(JAVA_HOME)/include -O2 -fPIC -mmacosx-version-min=10.4 -fvisibility=hidden +Mac-x86_LINKFLAGS := -dynamiclib -static-libgcc +Mac-x86_LIBNAME := libsnappyjava.jnilib +Mac-x86_SNAPPY_FLAGS := Mac-x86_64_CXX := g++ -arch $(OS_ARCH) Mac-x86_64_STRIP := strip -x @@ -105,12 +105,12 @@ Mac-x86_64_LINKFLAGS := -dynamiclib -static-libgcc Mac-x86_64_LIBNAME := libsnappyjava.jnilib Mac-x86_64_SNAPPY_FLAGS := -FreeBSD-amd64_CXX := $(CROSS_PREFIX)g++ -FreeBSD-amd64_STRIP := $(CROSS_PREFIX)strip -FreeBSD-amd64_CXXFLAGS := -I$(JAVA_HOME)/include -Ilib/inc_mac -O2 -fPIC -fvisibility=hidden -FreeBSD-amd64_LINKFLAGS := -shared -static-libgcc -FreeBSD-amd64_LIBNAME := libsnappyjava.so -FreeBSD-amd64_SNAPPY_FLAGS := +FreeBSD-x86_64_CXX := $(CROSS_PREFIX)g++ +FreeBSD-x86_64_STRIP := $(CROSS_PREFIX)strip +FreeBSD-x86_64_CXXFLAGS := -I$(JAVA_HOME)/include -Ilib/inc_mac -O2 -fPIC -fvisibility=hidden +FreeBSD-x86_64_LINKFLAGS := -shared -static-libgcc +FreeBSD-x86_64_LIBNAME := libsnappyjava.so +FreeBSD-x86_64_SNAPPY_FLAGS := Windows-x86_CXX := $(CROSS_PREFIX)g++ Windows-x86_STRIP := $(CROSS_PREFIX)strip @@ -119,12 +119,12 @@ Windows-x86_LINKFLAGS := -Wl,--kill-at -shared -static Windows-x86_LIBNAME := snappyjava.dll Windows-x86_SNAPPY_FLAGS := -Windows-amd64_CXX := $(CROSS_PREFIX)g++ -Windows-amd64_STRIP := $(CROSS_PREFIX)strip -Windows-amd64_CXXFLAGS := -Ilib/inc_win -O2 -Windows-amd64_LINKFLAGS := -Wl,--kill-at -shared -static -Windows-amd64_LIBNAME := snappyjava.dll -Windows-amd64_SNAPPY_FLAGS := +Windows-x86_64_CXX := $(CROSS_PREFIX)g++ +Windows-x86_64_STRIP := $(CROSS_PREFIX)strip +Windows-x86_64_CXXFLAGS := -Ilib/inc_win -O2 +Windows-x86_64_LINKFLAGS := -Wl,--kill-at -shared -static +Windows-x86_64_LIBNAME := snappyjava.dll +Windows-x86_64_SNAPPY_FLAGS := CXX := $($(os_arch)_CXX) diff --git a/src/main/resources/org/xerial/snappy/native/Mac/x86/libsnappyjava.jnilib b/src/main/resources/org/xerial/snappy/native/Mac/x86/libsnappyjava.jnilib index 6df932df2a2f4221ca07e73ffa9baddb2132382c..9daa6e64283a105c2a692a9d9cae8f5492b50f00 100755 GIT binary patch delta 5143 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 Nw!^c;O@|&-{|~kEFOC2J delta 4676 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 From e3f0fcbaff42c31af5559ce9011ce1dc08e5fac4 Mon Sep 17 00:00:00 2001 From: "Taro L. Saito" Date: Tue, 13 Aug 2013 01:49:51 -0700 Subject: [PATCH 35/35] Built native libs for Linux and Windows --- Makefile | 10 +++++----- .../snappy/native/Linux/arm/libsnappyjava.so | Bin 22084 -> 22084 bytes .../native/Linux/armhf/libsnappyjava.so | Bin 22088 -> 22088 bytes .../snappy/native/Linux/x86/libsnappyjava.so | Bin 169780 -> 169780 bytes .../snappy/native/Windows/x86/snappyjava.dll | Bin 118784 -> 118784 bytes .../native/Windows/x86_64/snappyjava.dll | Bin 136704 -> 137216 bytes 6 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 11173c0..04feafb 100644 --- a/Makefile +++ b/Makefile @@ -88,16 +88,16 @@ win32: # for cross-compilation on Ubuntu, install the g++-mingw-w64-x86-64 package win64: - $(MAKE) native CROSS_PREFIX=x86_64-w64-mingw32- OS_NAME=Windows OS_ARCH=amd64 + $(MAKE) native CROSS_PREFIX=x86_64-w64-mingw32- OS_NAME=Windows OS_ARCH=x86_64 mac32: - $(MAKE) native OS_NAME=Mac OS_ARCH=i386 + $(MAKE) native OS_NAME=Mac OS_ARCH=x86 linux32: - $(MAKE) native OS_NAME=Linux OS_ARCH=i386 + $(MAKE) native OS_NAME=Linux OS_ARCH=x86 freebsd64: - $(MAKE) native OS_NAME=FreeBSD OS_ARCH=amd64 + $(MAKE) native OS_NAME=FreeBSD OS_ARCH=x86_64 # for cross-compilation on Ubuntu, install the g++-arm-linux-gnueabi package linux-arm: @@ -108,7 +108,7 @@ linux-armhf: $(MAKE) native CROSS_PREFIX=arm-linux-gnueabihf- OS_NAME=Linux OS_ARCH=armhf clean-native-linux32: - $(MAKE) clean-native OS_NAME=Linux OS_ARCH=i386 + $(MAKE) clean-native OS_NAME=Linux OS_ARCH=x86 clean-native-win32: $(MAKE) clean-native OS_NAME=Windows OS_ARCH=x86 diff --git a/src/main/resources/org/xerial/snappy/native/Linux/arm/libsnappyjava.so b/src/main/resources/org/xerial/snappy/native/Linux/arm/libsnappyjava.so index 3299072878be828404e870fd278680bc8b138a41..0aa1d90795267803c02b449f85aec2dbfb0afa9d 100755 GIT binary patch delta 3317 zcmb_fdr(x@8UN1RhYKvQASw#T!UDU3IDmwN1d|n*yNDKu7^4nO6`2O}nBb!wt<3Bi zAA?hEq9-=sYaBb1QpLKsk`fC6rp6%-7%0@H4RwV0K(PiLlO-A1+uzw;>el}{(>wF= z`+bk|o$ov6+`ETMP3%$=`yiSP9h_|p$|uV6%E5e-rhurg;NY7V?cb=k-2Z(3OE*t> zI_}>#-#z=1ZP}>^B8r3P{GxJ5)l@)Mi-Q;$%A_xdcGguD9k8nNHM%67H#Q!zMu-WL z46#7OGtUQ<3S0om@atJVob82d{QdZoaSJ<_JvuhA`ZEc~)L2RQm-+oiQNSh?5bf9X@UJx!Rr>YAYCF-tV94BRYVObM4SEkG*K}8C4Rl+nSysAJ{0+2_BQk<=rf=f`E_#TYSwGGEqJ!7 zxVV@f3`*ulg2(vYkgB%`2ZvESMv7%MLZUWq3?Le(A2ca zKW6K^LpmZA)&3`*(G0&&jQ8b}=ndDa`ZUQH+XdU@_ebI%WPs zc%FUAcw_u&z*hmhFMxLk@Xi3<8o-?ayfJ{E4B+)o`J9mto+=}C0o=hig~y~1;(fUe zvEtp)we%#amuiYMOLi1)E6iKCy-;!g=3DAWgl`Bjt^CvQn7L2zwq1sH2%=i5F5Xdi zbX7>R;(o28#^&tckHQy37(3zaAaY=Rg25%8X^7GEv=go5uNtN&p9hnc?kKb@RIRJA zQO7Ch2D!#2Y&yT~*L^T6PqwWidu^UwdGb4eha0?z=yW~Nu@GL$(`8WHRSSA(ws zKLY+Bfk+P?3AqN|1KZn>PH^F0nc}({ox>7`j6}8258(~Ejj!P<@Lz&o1sCy^Nv@PR zk*c}hUm)6w#s4Ihs0xi2BhLx&b>LYEu9b23q&XSqeKA*J&;;ZZK9dgQ&zZ~D7;{** z>!8slMb`eo7gd35YJ3%>XnrqorF5)`=bKKN-n-a7I==HUGOOdT)ev2as#;nyFmWtv zdttpz*FM5ENq@BOlaI=|@?R&mEmX_@oXB?6+f3DzxL6*5MJpTSdK)c>?jVasj_N2K zr{L0Y797(rHxEwGjV$IEPwM?xY}FcUC&g7U4`tlzM)9= zxZ^xwM~Y;9gQ#@jY9ifS#dpsHPgFDn=Kqbw5 zeTvC+W>Sm_!>I9g5hWpN1ERk7ju9Cu`0rBE*ls?MVm4>NBeLas`%Cj!z1cEab~!b& zUN*?u26o!xUdt2A)7cFEoHl)`|(jd>Bd4>XSBy1H7531^f|RPzHQ0$9wBTCj*#!{QHTD5 zq2)cNYo(=@u_8V&Z#|3V&!v7OUBAn(rlzrv`H!i2Y_se6w3iwCE&s**`)n)Uke-ZB z-M;kKnc6j+zEL%+F1B(6v7E^=U!%_ozeHGU@)%)%C)G zY4Mp0#BW*ERmJW+Baxyo{miHeS|$+bcFTY|kY+T1~d#~{AuQ>66kDlGy>NtN~Qe*2TBX|if7m#J^}kJ@ONPU4)_Cv`C~+!`b(k+ z=!+o9kOYVh_8!~>1rGUf94Mv~HvNl4Vm`6-;z|OH@!mCrLEK^VKyfw11qN42o>RIY zq5^U7kRDqb46NfnFEwXc5QGV-6C)yl)yOa%C}!~}%DZK-D?nVNXdHNx_m;k5AH=Bt zr#R6|;L}s^R1^OZ^!fd}`-p4>1+HI}wKF!zmn@GD672{nC(ei}l)A{}KPz{uxT<$41=@t{MfQ))wc`HISs5&p7m#i@9(2M9tEnKesD_YsV E0dH&xQ2+n{ delta 3121 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 PgV6XdjVkY0$r|B5K7KE( delta 3329 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 E2T_#z*8l(j diff --git a/src/main/resources/org/xerial/snappy/native/Linux/x86/libsnappyjava.so b/src/main/resources/org/xerial/snappy/native/Linux/x86/libsnappyjava.so index 008546530fc92d1aa6de1d628bf92c68641ff7a2..4534c1371e9015f4cc553efdb8fd65c138a48e05 100755 GIT binary patch delta 48435 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 Vb}!aZ+7r*1YoZRy$IqCJ{|7#0Fm3<< diff --git a/src/main/resources/org/xerial/snappy/native/Windows/x86/snappyjava.dll b/src/main/resources/org/xerial/snappy/native/Windows/x86/snappyjava.dll index 5fc42523b7d41da77ea9a0e97d46e69d96ece7c1..53177651edd37c70d3753fd4826515db7412e9b3 100755 GIT binary patch delta 8203 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 CyJZ~! delta 8037 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 So_>JVFNeNk#(wlx;Qs+SW>~TS diff --git a/src/main/resources/org/xerial/snappy/native/Windows/x86_64/snappyjava.dll b/src/main/resources/org/xerial/snappy/native/Windows/x86_64/snappyjava.dll index a54064f6c198149accb9b1f0645bdf09b8cdf300..b367f2a4d0b8ff9ad03a8e3163dea34c65a12170 100755 GIT binary patch delta 23257 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