From e6e463d5e7f36fdd197c2fba5ddc6b0b335b7849 Mon Sep 17 00:00:00 2001 From: Hilko Bengen Date: Thu, 23 Dec 2021 15:42:58 +0100 Subject: [PATCH] Add adapted appendedzip implementation This is from [Spyre](https://github.com/spyre-project/spyre), with crypto zip support removed and a function renamed for consistency --- appendedzip/appendedzip.go | 55 ++++++++++++++++++++++++++++ appendedzip/appendedzip_test.go | 39 ++++++++++++++++++++ appendedzip/testdata/data512 | Bin 0 -> 664 bytes appendedzip/testdata/data8190 | Bin 0 -> 8342 bytes appendedzip/testdata/data8192 | Bin 0 -> 8344 bytes appendedzip/testdata/doublezip | Bin 0 -> 304 bytes appendedzip/testdata/fakeheader512 | Bin 0 -> 664 bytes appendedzip/testdata/fakeheader8192 | Bin 0 -> 8346 bytes appendedzip/testdata/regular | Bin 0 -> 152 bytes scanner/main.go | 2 +- 10 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 appendedzip/appendedzip.go create mode 100644 appendedzip/appendedzip_test.go create mode 100644 appendedzip/testdata/data512 create mode 100644 appendedzip/testdata/data8190 create mode 100644 appendedzip/testdata/data8192 create mode 100644 appendedzip/testdata/doublezip create mode 100644 appendedzip/testdata/fakeheader512 create mode 100644 appendedzip/testdata/fakeheader8192 create mode 100644 appendedzip/testdata/regular diff --git a/appendedzip/appendedzip.go b/appendedzip/appendedzip.go new file mode 100644 index 0000000..048324c --- /dev/null +++ b/appendedzip/appendedzip.go @@ -0,0 +1,55 @@ +package appendedzip + +import ( + "archive/zip" + "bytes" + "errors" + "io" + "os" +) + +func OpenFile(file string) (*zip.Reader, error) { + f, err := os.Open(file) + if err != nil { + return nil, err + } + fi, err := f.Stat() + if err != nil { + return nil, err + } + return NewReader(f, fi.Size()) +} + +// OpenReader searches for ZIP beginning-of-file signatures ('P' 'K' +// 03 04) in r and tries to read the file starting at that offset +// using an encryption-enabled archive/zip, returning a *zip.Reader +// for the first valid entry, or an error. +func NewReader(r io.ReaderAt, size int64) (*zip.Reader, error) { + const BUFSIZE = 4096 + var buf [BUFSIZE + 4]byte + for i := int64(0); (i-1)*BUFSIZE < size; i++ { + len, err := r.ReadAt(buf[:], i*BUFSIZE) + if err != nil && err != io.EOF { + break + } + + n := 0 + for { + m := bytes.Index(buf[n:len], []byte("PK\x03\x04")) + if m == -1 { + break + } + off := i*BUFSIZE + int64(n+m) + ssize := size - int64(off) + sr := io.NewSectionReader(r, int64(off), ssize) + if zr, ze := zip.NewReader(sr, ssize+1); ze == nil { + return zr, nil + } + n += m + 1 + } + if err == io.EOF { + break + } + } + return nil, errors.New("No zip file found") +} diff --git a/appendedzip/appendedzip_test.go b/appendedzip/appendedzip_test.go new file mode 100644 index 0000000..38caafc --- /dev/null +++ b/appendedzip/appendedzip_test.go @@ -0,0 +1,39 @@ +package appendedzip + +import ( + "archive/zip" + "os" + "testing" +) + +func TestAppendedZip(t *testing.T) { + for _, sample := range []string{ + "data512", + "data8192", + "data8190", + "doublezip", + "fakeheader8192", + "fakeheader512", + "regular", + } { + t.Log("Reading " + sample + " ...") + f, err := os.Open("testdata/" + sample) + if _, err := zip.OpenReader("testdata/" + sample); err == nil { + t.Logf("Note: %s can be opened by archive/zip", sample) + } + if err != nil { + t.Fatal(err) + } + fi, err := f.Stat() + if err != nil { + t.Fatal(err) + } + zr, err := NewReader(f, fi.Size()) + if err != nil { + t.Error(err) + } else { + t.Log("found zip in " + sample) + t.Logf("%+v", zr) + } + } +} diff --git a/appendedzip/testdata/data512 b/appendedzip/testdata/data512 new file mode 100644 index 0000000000000000000000000000000000000000..15c435001e3208716916d0f3587018e4c3d14ce4 GIT binary patch literal 664 zcma!gsoTGyYVuLBABd^J{Cu{7nUF;T_YvD%_^# z_q?u*{hTWK@L#$@e&W=dvn}t2Cr;gTes#zD!l0r>(weJs6r{AOU)aUSyXo0VmaSO* z({_4?GP95E9_7^K9%eSFS%R)?N0%*F+iX>D8TIbgY^_@LOG~4+uYJE+W~NSrgXJQh zo~|!lE|rCIT1|33EbeP_J9{%^!onkuW<=PE|31WHsQ7f#I^EEe`HXMb_IdqZ*toBI zOYCAju|ro3kB0B~5jcTeashwxHEDJ^TR;Evj~p_*zAfN$deq)_tFLTRnZxD6roPI& z;((m@+TvWt^=#9AvR{8}6(ry{|G(_A;NM=1l?GE>U)}1LInVGqUNQer`}fH7>s^iu zD!22?a6eR8Umg0p%hzE;T9EwN|1Jk|{!Qu^WtiB#>Bd*ncUlhr1idB)c-QFbzv-Kz zw0W*YVa9o4@=LS(8C{(b5NSF)AVNsT#=xTX&hqy>-{lr8HAwE_&Yn4| zXP2*`ZFdW|#?4jR?KTANo?{W<&CJ5Z00P!^nciRqlwf3#VJHa=;bdSI%4UfI;nE6j x21b?_%nS@*BEXxGNsbwpW(l}iOBz8;pi!(4qcDtNWdkW-1VVQpZ4Kfu0066<0HFW? literal 0 HcmV?d00001 diff --git a/appendedzip/testdata/data8190 b/appendedzip/testdata/data8190 new file mode 100644 index 0000000000000000000000000000000000000000..4a1af7017bde09a535bb9eee37c3c00b56ded692 GIT binary patch literal 8342 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 literal 0 HcmV?d00001 diff --git a/appendedzip/testdata/data8192 b/appendedzip/testdata/data8192 new file mode 100644 index 0000000000000000000000000000000000000000..6fbabcb60ed0627209a2dfdf13ad57f60aceb3e5 GIT binary patch literal 8344 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 S@xKeO|4D`abdmoKF#ijcwEYAC literal 0 HcmV?d00001 diff --git a/appendedzip/testdata/doublezip b/appendedzip/testdata/doublezip new file mode 100644 index 0000000000000000000000000000000000000000..29bc8f0900be577e4389f996739f192409d560ad GIT binary patch literal 304 zcmWIWW@h1H00HZ|Om8p)N-#3WFqDLba569pWwS(qaA^fM10%}|W(Ec@5#Y_pB*%

@Xw!}QFnr)}^0iy@I ztvP16CBDxJel|;{>q3#6#o@i&i= ze59*wxk>)MO;_?}`c4zhzxh4MUi{VJS?senZ@#X&X^YKiz0DqvDlIw<&w1Rraq+q7 z_siQZO`c=-)+tu=XzVuqOYfS_8r;9W??wH27Ou7FTb~>~xUz2JHfe($a*y06T3Oq& z)GrG9dU?_^XD;;zVMcqlSw|>Ll)EbURNivsiNfQF^((R#r@d@?Vft+SgO{5QUJUHv zy3EP*DDSI>oLalk}d; zK6!1go@v+@_M+SM( literal 0 HcmV?d00001 diff --git a/appendedzip/testdata/fakeheader8192 b/appendedzip/testdata/fakeheader8192 new file mode 100644 index 0000000000000000000000000000000000000000..005afd62f5512ada39edf5cedc88d2b89ca1e215 GIT binary patch literal 8346 zcmZ{KV{k42&t+}fws~vYwr%^?wr$(CZQZ(kYTIu2eZSq=KRcUDPEKZ$^FNs=%7B6u z8Rb*9Xtjs}63XrpmOUlkztxAlK$y6@n$;_kRHN8LFa$|AR!1dX5wiIfBx-5Mw1LGR z&^$ALufeJHnRwGshhrLNM8;a7RQZrcJW-Lus72lzj7*1(`ss1gFUOUAvktZ?NQ#uX zjIy<7m=@Nu_bg8FEh$Dt?jK`d+w@POeee!M(YhcJzPv@0sUxb#m-w5TMVR&uKhL<= zvaf=9czh$0pqm=rbZ4LK;9R$8LZkS*Hs2_Ja2&dXif50|b;y^@WfPQVwjGx~(?(CU zC$E?_&9xF!fd6(@7|iJGGj94JCSCv+h3xQcRfW_nvNwN7()U6UM~hX2dFf#7~H^rB`UIM&>*UMzIlHPi(EDP9q|I)6{2>A@Vnf;ffl_<0vA-f5RfKbcR~yVeg4gmvO-~3zfXKM zB9a0Oh?*kvUbTgvAggVGa78UAANY+>Uqa8jDCiiTDl2mQ8%ZV}V z!Ew3EoHC;z46SEv=1QEsF;bM;du@1?DpP!$yj`C7y+l=oswFzRlwfxeUc)Tl6?}oA{6Q3F*rPoT(pt#-#flxgEnujYYn(~O@*6} z&4dXK@#Y4fmguN9K?7J=ir{{Gd!*oht`oniWP%+3C~5V<%~!W3F@6Z$wM>-^h;!_J zQ8hPF(Bxclpkt5?8)zw9fNhdAQ98tXDX|#y*G(1D!=hv$aj#!G4XwAe)NWzRYn(WX z>9qcwMQ?2bT8l@iUvfro@h@cjmqt~k7gGd}T(n=ybjk~`?tOch&zfJ1`^EUxWAxuu6LW z@!r)8mj1d?fq7r6DZ?X)PU=xs%*k6(&K%y+EM(Qag+Xgo=6^$2&Zev5-aE2w9j(&t zzi9Gx{xZyqf6uvee1b@O)VIT|1TQ%hAqr-Z>7}HOrGN^vW7gxso&__YjP{N~e&PEG zYbB~{_&|h?lR&{C(nIzON*IX+rWPXTP2I0LN}K5K-a0suh=Ae>k)p+@Al{7fDrRMP zscCzHV0d9Q->3M7nIwV62rMY{(y=+&XhtgE*=J^yuud(PqG9*RBJ%Xyk=ublQj6Mg zUC=h15b5pC>eB9IjxF0>r!R6eU4fo1z3R3US@64-U1}`jg&NZyrjg0EQ zA8u;7?2~$41p^~X{KIoRE)@gfm{&qYuUR9QsF-wT3?v{HIHy^l+*+94gXahDh0toO zdt2Rd-dZjy>P&^3jUsLbzH{&r+01sAZ7EKIrO=$<9n5fAFAUvzIDEoh&A7{IPJ*%s z0g1T6X)Am$hGx)HD~|x}khA3sM>WC{X73{AG@J#7>dkzR!aE7JuN&vrMAhUoFI z7N8OFmq!8OmVyjUsJpgcWD)2DNFciYMBkMfEtid}qFrS6p>p|xcS#}+MzD`3?%^mN0FAXA2 zgd-9iq`PqL-s6Y^f*grACzXCj&YJ|e0%uVCAcY%rr>I^$CUJ>{P3S7vX(4R8B~&d? z9^3>+@6@@XwS?U>Jbcf|tiQ5TTCybD3x+yPH6yh`&61Axh2V-D54clEg>*yf+uNK9 zV)vKCs+JXU!+rFeCfA@}Uu`}FVD}clKA2h!=$i%<(3qs?#U;?_(#bYjP?Z=RV;$LP zaLFkm3PW_1rzwT9v>{?yVkD@rkPpEfoDXR!b(2~b0VlxteGH}dKan+{r=#?^HMX@X zK!!p?TsYM8w?FxigxKqDhJPEImZnlcerJ@Ux$Nl#kbDbFpWYNY$)iXG%xdr`=}?j~ z=OYjxh&Az!x<@0JXhP8tkl9Z3knH8Eu2-gaM0mW?gm*ZI02G0#UkK}ROadp2EB}a=7pR0)Ll_Sv{A=`obUPe!D45&a*7Y1y(2Q))NW^C+!gbnzhECj-E<8jo{_? z#ose)VSC)ml?0IQ!~=U_f+ITV;o2=%peipUntTWs9^eqz?xLpaR>f#FP%%F28%)#R zr?4G|+{DWT<$ozOym4;cYGNh=w#RWsO8Yh(0hD)q`sAiN6OILH!!E6DSUJq*{SOxo zXojH`#N-13fL)oGsK?ZOCG=qo-kOJx|6b3Y)gVshbFin~Ml`m8D=qN7RRSa5uMCi%}%V-f*b7cWGtJ5O&NI_`H@dT9boW8-bi&68d zfU=d2Kg<=HlfPZnKWkD_<)q^(xF!%iLA5rx16o#lV7+7~P}4dX=jBHc#~v9vaJ{ld zzInnfezR!dS99RI!QxgibMab-22;z6z5nvU9c@``W=_=ElC3Q(gbC&ka@223P!RY+ z!oV0OJB04UaMZlc*IqP2wLUz8I^U`ruj+OYZ48q;wTN$)6qm$dw(q{13I>gvjIjP< z7k1?BmE8{2N6MEjG1*Bj7MTy6+G2iBT6v=&ivv7pmUWb6A2*MiUmxMs5F(92t&`8z z>5S@u@oI39AvR88~uLS85t|As7qv)B^7f#_tgll zQsvXo6)gV@san!@Pd>54zY&A@-@5YJ%CX_T z&b7Xw$?_CedU^>fy`SYg@wYJNg;YU9^|WEk>~)i3#i#R>%`tqhk}|nFn@V`2J0NY4 zKj6=Dgn}73rhP1-;N|l&z441h*{&A%>md6rV!q;oR=6G+ob(6Ph!d5P^~Dtx&zM&M zk3@f5+U;FvV)o0{31BW7LPnQIc3hI7DTV2bdZH;cCi5EM;u3+5*loUYpD#SUPqI&m zo4`kV;-8JO6rE*~zRyGwYNie{GGTkxNrR&mrAf@O3p~M(AkEqu;XaUlE_}{TQ+{GSTp!p*;A6jlT+M-o5(PD zXXe~5iAURNN4XIn$o8GAwsL=bHh$|b^IYu_CUCfxaNR9pkX9LJzxw>w@6yqp2Q~PW znp|cYKsxSek^SzfCf-|*;66n5)KxGy)Qjkp;1=J^t7YRD6aDZ&q&G`?jfV<;D!+kZ z0~c@ko2(=JrfW}Fy~ei@JOwM&G#^L3TqC(y4mp7=G^-fQo`t;DSJFwe%0!QsbIM6U zyU+Q87?Nr3KTJF~00-lAw*xsxJq{ac~ zXaA#3$kw!snAOX|9iEy$x??=pT(gZ~b1h>o9wf8xTG!p!*86HX4`W&OP&Gl6F`z`- z`eVI~Xg$OdkE76wH(4c+g76m`*kW{w2e%`}8s5bZr-jJ{(G;OhCt_ z_pjY@2)}by?@rrm=k67B$-i-I*98O$-adg;O{8>oI(~ zWb}hWFqS?T82d?Sdd%co$yP}s%l*Vv2K-PY@!Wz9JC(+<`a8`djJy_HN%-&NWrD5L2gDJ_`-`amJ8LwEnRZ^z_VL!N`KMT z#`=2Z1ClIQLqlKmLGmE3CHWdcE*goF^OACx3GNwg^x!oF;&XDsqD)M1dsuUQ zL$wsy3BlV4)iOD6vwqzm+ntAM|KY1tiD+8jYGS_Yzia@m=F;QQXP5qkjEjZ=$)U@;DUJ$qqM)dX@JeU z#g}iz!O>;b@=c&>=6iXMmbdRkTA97(k=v>0T$FU-6P}$psefZ;tJ8DfxV(Fs*$+CS z|BqEaYh5Oy6%Ncml@UI+%Z(&`=<;tjY>G=yHd1c|;?NGSlZ)1wqlqMJCiSi&XL7Xh;*G~TVDFYDB zwzOH517mI|n>>}!$et6gI&=k`8!Df#gyA3nsg)$t5!AOQu|A$bz(#^gUzaGO&bBa~ zEG_vLy~J*vwrEAP#dbrx^=!^FX*8bc4Iphe(ezW#LWYA02|LgRLWuroBngry++0nAG4y{Ry*s#ymMCL*z6rm866fO_`*Px_2gm#m#J9FF-gW%^14kRj;zCDB|DCW zj{3137vV5xdrAv~e}Od$PkY#1oOP9a*_qi+B2vV_DUh|y!(QJj^+V$PJ*-wavqlCc zaQVNE;ui-1>%Nxl-|xfK{drjyAsj}d0r?vRYrpR@5W04BrX$imhp1(X#KaLX1yn7@ zr-VOYm+CFH6d7DmKBN=G_u%gvh-*FABXJO(LM0Ojdg%8Zw~8$uTj1v<`Pzc+6HMo= z&>C^7P44GlchHlX3?}!>Qk2XyiT>l$NeES`rmwHUT^_i!uESz{#^N^{o=?m6gy2NXHx+{=+aB3Ytv?f zCO97x0(HXH?)nl))yA>0WOle%p!o|rB+1{8*YTrwG5MSNxJMjyadL$aJN5$}sKl2L zw>b2x^Wr>X(xp8)Hu6V)TN#jEV6fYxZ@S0@Rsb7%rq4%@0ZP-{{onMlu3NUs?l(Jz zsdO(QVpE@Vj{b_Ax52E$KVyAy!S~L}!E0b{x^C7O?OKTqhi7er4#jOdv*$`cuCvVB z(qbDP`qKj2RU%6>K+)O>+>#-3Oluvq2m*Kcq$=1xje%HaJOYxs1*94l;x3N2)U-R& z=`8PuWmTY^`4NY#QGU1zGMZ2J<_=jCK0TG&clD*-mbO!2b8kH@M>;o&DHH2R!N zQ7RoW@=n|vp@r;xJ{pe&&8UB1SN$j3)H`HF-|?)D`{N++HNAazv#f_ zrOiUgyit7d!&prH^D>j^<4KpMUg$ch9jxx~1w~H#lmqSaK~@YUL&49d zuYUT%WQ!uAZ>=`aZ$Fs3bFz~zpR(fymhZVK53-Ds{bawU#{ivLE80P}ibD9r9TV$- zpK{V9`>AA1CD}V6jvU%FnZF}DiJhd+ z6f7m(Cf_$4pI0!!1AqLxxCtO5n93JA;%r~=FOd|D-NL6T8a#?&z=69Xn_w=mU!3um zlcs48G>dc4jy?KgmoSGFx;i(Y$mIjYYqukaD+?cM6lC0$X5!3->42p=_y|XzmtQ4q z0O~rY2a?8ocj{sV?n$4RR43|1kxpa^?T!R3K(2HIH{1!i(5`!;ifX!;LoK%>Jui5j zuuK}*QQBT^2??QRC8}6Vbsf`Xy11*w_S8{S3$+!&%bw?h;QByl@YnJZT2SWVA4iDq zf;E+M4N{$B0*U{M@0GmpQP?L`im0wFAri)JuGvRMpT(00%GrG%Hk`oQTnr?iF>{Oe zo8rvaEjz8OlI+JD>nAcqwj*vm8N@7d(AV^_{@|7L9*ZpMckrTvb@SXo^=3S43@N1- zcFT{`CCiYRDF5HFu{Tw$B?LOJnZEhgVs;T9ixgMAM6vz@TxnpHaiy>!x)B%psMA-D z!$3l?#y#T^z?nDl{bi?HMk(hh4my-|hW;D#O*x#7s2A=oOBe4{Y@Qhn7c^R#v=ofOQw&^=jC*-2{a)yUV;a|)74{R`EX4R zeELEVqCosCQ#ektkEveb(OwLQRe@}^|JT~v84na>;PdVhvwvNLUKiR7%D;B#e>0?WvdHxG=~&>EDCvGTz#JY5Xt<_ zpMznp^BSotWCS@_EfdJh@xOP4JO;aIyc?aJ=SUDXwU+1lh64;`iEa;+*09gbVXa~C zN4Qr<#(7AHoIc#XZ7ty_`@x~A)1$O3o`gg4o$B=tGb9ETW37ac2JIlEaJfKwF zkL(mj6G>O^%zb|;zCJT6LJF!gYXM#Im^a;QRurpBQBWvqz_|_J@#R|c0zF1 z{|C7l5kd(4GgUh`5E+9agL+iWX1xzs^HBCIyK^l$ut_Hx_P3Z6jN9Qrdb_yZoH10{ z;Bl4!##_cdZR=Ao_63h>G7GGz&vRCKS6>MGMkURu^S$bp0DEGAb`A&~!PmRzXO11^s)l6wDK?nK z45py%^Ec$D((*~S`d29!W%CIpOJ}KvV9oPs>_$AU>&7KDjq#StXB33tH|C_{!IaOZ zXaNkmQLNhVAi{3yE7()b`=@K6WS;aqxf7vt0bQgjX3VW=zNgTeSy|UFOWkNK**np; zG?R+Ae9)DWa*28EBO7t}zLnMeRWeXnK;W|8@AL2TO>SjwKSYL%twSt%8yh)*x&iY2 z&yZKnOn0j3YT1@YoWBu6n%Xh2C2*cl^b~s@P3*ew0;cG2bQ4?1&0m=m|6DR-Acawt zj%1LhVqiqaNIIhRuUNJMX6%=y^S{=f%?WkuKF-v`web9zXBx+T**BdzO~0-18gykN z%w8nrSmkb5i@6{SukmJ?^V&WfSzKTvnw+e>iCnhM#^2o~-IEJAFB637fGf+QKI_oE zg@jeMf{=|HdDQ1~N6r)#S6fgGL6cI!m97f%>!cRv9!%>vHR@UTMfeOyzn&T9`=2gq zTdWhHz4_r|N{dwQFpf_zsk~9&LI!VbH!HZM-fyL`*^ck>Y3~ZkuX$Q}8NSz%2vU+> zmkKjzyrgV=Qcb<;{@O5>LCMcHn#Pdzc%tZ;0k6OHmGX4w5a)BEYrFT@KRGccCFi2G zP16_00vg5yn{^*8rUbo;08pwu^?}8|LLz2p9KZ^0hBQx&sJzVQQ`HT2RBjsle3$s< zP$oxc<7P(3=eDnIzE`pkF{(wB#<18~V={@^#dQ#slXQpiQ8n#>pd(P7LsiH{!oEtd ze8OSS>;G6&)~^W{@7E}cM(u215wA-^7S~XOSAxtk3YY7$kXh{c-!3tXJ8ak+*(p6Z zh3<7DdZz#Aavz_Bl3Rp~l!V1#BTkb}XLQ=$)03$n#X1`|F8U81V z6)cRg;kUJd$Krk%NEm+w6^_T5Y^zIyw-5;?rEBFiRBuLpCdkfetD^wEi;9udN4^dP zp6aG4xsCp`um`jC0TPM+CDKM+3edALC9znX;1)3(3F27 zO3@A@HaW%x@!zAvqzH(qm7V45{6M@9GT{&-_X<@eeW6^u%T-sfZFvh#(MlFd{E02M z^_p21@IlNl*llUyT@qx9lZiw1S5@I(1ed+f#q`v9v(nMxx0;b-gA4rZ%-`oLjZ zW)Qi0e2XNO$_pr);Ks@G2`XGe*-fpt8#f2?nvtUeS_M5)&ez%u_`<%+{V8iSs63x_ z0SUM{x-*>Zpk{EvQy3T)b0CpzMl_~4o(Qp?k{Lv%tC#c&q*nZTZV6vl@Q;B(c&{RF zE$P6XX(piJwdY^y?#K^>d5v_>gCz%IM_N)1U_Tk2stp3r2x?a08^+hG%>oH%52pCn zTem~h;Ml&?$Jw*=p9BQbw(2xi29U21_Khq3i%KlasqMSq7@F_THJFf+p;)mFfSUtb zw*xJj9&jaOghRhSp_-j3G+q_JjNW~#oOZ3mnH2yviH%|UF;M{MT>n2~wE<=o`h61N zDnjoIzf>7BAa_BsCY$&;w{=3z9)bym)*(c<4ip8jmJ&&8;s0Du02Pr!dEYg>|9*1n zF&dk{f9uswU?!L*YpJVrwZ1oK3l~*RbBC9Tt5CsyS@1uDB@@}w_+08XvIFVuCsg1i z2Val(W%@CzII$Q^@-@3b`2YfTahhfdy171SQ*nZx(fFwis%v#ZHFtujI zj16TC;V3?u+(JwK0=kuv#v|=S zrOSF8ZN6DLB|-O5mmav?-|6K~DXK;F&qTVJ!ds%|7C;DGM#JUWM z87C+VSpyLLm38Wkq2q!>9JH7n6P~9tx?C4csHFG+K^eay6caj#_@rUn9D`w5+E>+^{FknjQi-bMY)gIR)9#OoN{r6sGDkz( zOb9#ZcZ^n!78bz3e*7c*jub0s61;_*u#P5BWa;41@>ds-_AJ z1d3tj%B1{~tQ4Z#0# MiT`At{}w?13x$&I3jhEB literal 0 HcmV?d00001 diff --git a/appendedzip/testdata/regular b/appendedzip/testdata/regular new file mode 100644 index 0000000000000000000000000000000000000000..7ff5c06ff1420b10934839b39835a2268f02c468 GIT binary patch literal 152 zcmWIWW@h1H00HZ|Om8p)N-#3WFqDLba569pWwS(qaA^fM10%}|W(Ec@5#Y_pB*%