diff --git a/src/tests/__init__.py b/src/tests/__init__.py new file mode 100644 diff --git a/src/tests/data/test1.bin b/src/tests/data/test1.bin new file mode 100644 index 0000000000000000000000000000000000000000..87428ea84df4d8a9a3e95ed9ed373017f66077eb GIT binary patch literal 65520 zc%1FdZBP>g9LI4bBF7nt0ig?oAy)=@VJEPG@-Vu17*uE+0fP}VF6R7Cc@%DMOzSNlZrEgNFxbxk#MX8)6JF5I?1lLyy1KS1owUUx!?Wo{}tb;Pyb!* zB`Muge6&xRR}-%9-0+6amc9R^_q^qNvNU1v zJ~wk`qfBwV!0A}BuD)6jQ;@44wplhXl@~|Z2}eCw{#Stz$-laM5uQWX; zu<3E^_$qF?tq#zbE#vm8p<9Qq{*qRy4Lb1Kj#!D0a9EoCqqnQlG~XTErw)2IqEY8} zUbA(Dye(a?J8PdLwK~1l+Y)%Qsc_2^Pw&b1>3h{9Finz>tW8~o=a)TGp2B`&S*F83@?GnE*LX3Y^Vnw9!q5NqYiKWjakhIg#u#IaF~%5Uj4{R- zV~jDz7-Nhv#u#IaF~%5Uj4{R-V~jDz`2XsHTJ3_qLrv|PhQGXaXBoeID)H{y`5))+ zEEznhiY)bQm~N*!4rfh-3|&&{$FklN%Po${30A2|wD$*z`h{5c>>D%PgE5{xKiL-6 zAEZ>=b~oh8&h656l?_~|U2MO;D?bRlFh%rBtsC_dge|c2IBq7Y)nC8=S(^OE*S_jI``>%r zzWz-7?)sOfp{{jj(Wz}XHvj+t00000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z0KT&a2Lb>9002P#uZ^Ips;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 bs;bf+91;Kk000R3|JoY{000000052xR1sjU diff --git a/src/tests/data/test2.img b/src/tests/data/test2.img new file mode 100644 index 0000000000000000000000000000000000000000..e726e31e215e1c03b430f4d643c5d7629a67fd67 GIT binary patch literal 8388608 zc%1Cp&5s;cVi@otMSVh%^F)CPqEe zHJs-3bkBD6keVfEYy#vMBgg0%BtS0NV@^q&0LmVGF_2vH9~iI!!w8U^mG@p%b@vQE z&0Q~(^2@7#c_M{-@3YgN)Isa(PKWJ>Vf$v-PKND;uzm4ASO3kw|95X?|E&8z z{_KDKt3MbW&&I{Q@$BMkZ~rGN%vT?I_7DEgpZw_`zVYoB|I;5&|Iz-vTYnhy`)YM= zxg0-DCmwSA%wI=h@K@AaDf{BrR^s^o^OsMqoO;GN0ssI200000000000000000000 z00000000000001hpS>@i$ccwv|COI%X5r_|mtTFR$^Y=nFTeFnGw`fE+587TpXzb& z-e;#jskfiy`1^~u!at{0RvL$=Klx#`m1ka9Ia!4{9k#DMdn_>SHiX$ zwno@ahwarToD(iSB7Fb=000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z000000G`aru)Vr+;$(OJ`Q*uN*f||O|I$k1FkN!e+?Vx|VI2>=KfWH`y{ldzN zCkC74b$_$EZl_=D%%*v|?r()-zq0b$iE%!=Gnww@)1nOfOX=E|PmCvn6z*?V`6%+~ z?R;8>`8zSp3ooCD7nVoh`4z|c^7#MXFO=gScut&p))@ev8RH+GU&cQ?zl?u)ei{Gp z{4)OG`DOgW^UL^$=a=yh&oAR2o?pg4Jhxt0DW`xJ!}e0xUJlzUVOtGbW2OF$K>1sr z_}iZNTb}sao%maw`1_prdz|>&oA`U1`1_h)UWvcYSy}nJVf%Yw`}<-0)v*18u>D%t zz8bbHY_Ixz?%AUj5!Xzq@hu+Q(Pk z`ffX3*R7*z#T<2aCdI6{zILONGT4o|X~%He(_Yct>+j~ax#{M)bn4Fi zr|zUv;pBL^B)uc$YHd&3$3t|BS$`Uev^ZXtx_6`wTHAN-3$eH|oEeU{CVRv2&EC<- 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 zcUsBEZyXknG)Kn7BFm`+^Q*(t#qZC;(?z&+@oaIVD627d)j~Hsr2h10j4JN=mU3v~!)Lt0h z^#Y>~*RB_ok6Zd5Te&T-hr^{skrp2hUCgf*+vT6?97%Uj4~yddC#QD#xO}_~9@u%S z3SWCbKmAthrAu{Grn~5Ip%&*g-FrYb(i;5M(ki@qP>zjuEB#H_yvEA~SeS{1;mNx` zc>UIm>uWd4<@yu0#uGQkW833V4YE}EDe>~)PrJga@>lhKbf^cn%5{Fd-hWg(G?tgg zX?+&!JN`Xg93bHyy1Ev?_w|k34{9?uboqXJjUr@&PjNLHTUs_vQ>tEbWnXF>0 zZ#3!gAk5eInw^yB#f!V0d1NvC?)j9|)s2s?d>q&R^E`E{#dR#|0~g=dhl4aj4hKi? zp4Ij3uxxLXZ{&LMPn|-)xqbc8jmG?)-u&R@8;#9=Q66k|o9O{$KH+tX{V+4O!tr)^ z7Pu55jV+m;2jk7?jr2|@H1Yg)R7cfr42#LTAw#|Tt!;PyVLZ9hYIno4(stZ!HP3!> zcJJ)q+S&Kde)sIv(7&qtXqiI%1G;eFz63f|{Gpip)sxcv)!1T{5dR>ps)b%Ny?AVf z4qiW5)o&uh-cqpYb>mXF>K$dfapq{qdR7i$kKc6W)%)g+000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z0000000000000000000000000000000000000000000000094&9lP0WxH!hV&aOy*f# zhYzzR`zW8s6r>Hizn>R*v%lZ3<9s%prGg?`#IB3>%xHgeYP|W-TQ%&us=H=g?X$c& z3gt;G`q$eH!=jwV@$O-@I}C@**(_Fh@nn4EDhDB}!>o<5GfjgV&qh_urv2^g4BDcz zqZBZ-6}p-`=Xsn@yW{Tghg$y94*|bg>u-7ew|U;gchdK-EQ;~^Xw)9WNz>n5lvO+} zveEQ#caZ9g+k(+#S=D9LAM_@p_;s8to7mso-JPVTyNRL64%0UwpM|1qLi{?fn>rk{ zi6GVoq2Jp%s8isw+Rvv4AupQvBv#?1$`@I69**Pra9g8obPx{bN&7wL^Zz5c6UhzrH!dF2H_QbP&qo%9z)&*8$V-ltR)7 z!__P4vgc)!v!htWb;yJ9UTV_o-3o7y!fE*MURYc_U&N3dH_MCX^Wx&WP{-pGr)!+5 z?Tx}odAyv4r!f@YfBQ5$zW7(@LJd>Fi|6y0S|62RT88DkeDUx6#q;L-Z-=4C>LxqA z_%4-B<}oW$s5`00vc0486eyg$_$IcUET6U!vheJ3LY5rj-8To6z)AVBjUt75Zxm8WU(Zul@BF9d>erWv zZ+!pPhfUrtq4z)g~=Mu?fi_4w(}D?EtM}%(jFmhBczk-g!A&SR@d2G*{xgQQBlV#Ww17M+qw+R zQTv4%rPA~hJ~+v$Y!Oxic-U4tJa1wh%EPB^7E5uPEZxiEN!PB8vYN2Gi`zC>-Q!h& zN7Lap(sm}-$#gr&ZWCCKe`H2i@k3dKDxS=o8oKz;w8ouWt8sn$4H# ziu!*ThV)Z6)vUYqw|`UL9^Nj>v)hAqE{CE2s%vN?G}j)Oot< z^M3Hg?7ZTM+-{50#H=66d3x|3cGr93$$a&EcCCM8O4ke18#k7tvYMtx^6>oHij~!q z?)mzK(-80r`0qdebNv;-YnwelSzmsfl=Jy2&7^bfztt|FO<9kt81KH;3zzQ(#(VFl ztwOi9w5PX!=63H1t`@cb)57)Vl=rig3)9Z7Nx`nJL}^bpyI(Ggru}pp>rva}v4zj~v8S?7&AZ|)7QRBH>qXtJsqUsic@?@D?1r@;7n)f>&b zM%(7A()RZU-8?N~lQz$rp|?4?eYMe_% zxGhW9wcj3uZh@%J7xTP0u2+?|gXyFPblEBYU7DyEJ`tM&im6s3RT zJy9Fx%4?#_K$|D+?pK4$@s19c`Fz?I_pc3hyVPDiyMFRETc-cDYqvjc8+QVLKVN|S z53GW~QY{N!0|D+9rvho4parf;YrD7)uCdTc)UIN!v=yZ|dqMv9&TlAElvZ&Q9PTa$ zJWpO$B4^0qym4MMsk30R%|oC0VpFC0;NAW9Ax(p-MSi>H82gAt@z<)H@0P`6H7j;i zIZN}zWtv>Gqkj(Dv0*7Z>7aO-@zLjo4_dP4l~$5s6@74ss^1OFK3zSwMH!r#rxPP)$| zxxVLDX(HC|=hL}Lz8G|xfAav5-c<@1#Zb@8BYP*yWwD4NT20HiOLg)%`O=5SX&$Ct zhs%e4Gk)Gy%rl8Su5zaVe*NO<#oMQ6j=p&N;hNdpvF<&(&)%HbKmM0#3VKvkqD8iK zC{3C-O-V-oSA5-H4caU?)cJbUc(#2W7w5B!Vg7e;Hcvj7ACL3mC*?!@vxpu$W^-3p z<8klm>Mr%~S6989hWW*~jo0>#d5JcSV>jvfsGo5-e^GxJG#Qp=bgON@_x$v{YIlkU)?|0jAe$dfh;{V;qk^0SUb=11*o+VP$ zwxInat&_CTqPm(a7vH9LUy8T2>$UaOr zG5JN?dBA+3G#+T5VxP3UAyM2%spU~a-KAIS7@6b(kFZg`|52`PwzuP`;t^+5-7nKb z_PTf38@#!A8+S>KV=zcp=|%8o%N+i)sQ>ngXTRBh{2xf)_2TCwFNOYRsf#E0{katO z4_Prd2^t?p%k^ZIX6oBbzd1fESJQP=#c^-9oj?26UNdY<$vA(D_G!)yR}Rd!yl_ z=J88^%l>lZCBo=Lw(Iq>YBv4T80c!bUd6bsdHpZfH#afAnN;y{|3iW3h39#wT?cCR z?e}M|+vC5jkJRI`qFq+VtCz7U7UQuh9bPV`i|xZ@QKo_4!}WR=OXuZ%jQ{JQbP9UC z+vZn8FQQy<~!TZBL+WVdMYWr!17*915mSe=yBPUK zUpBuCnC%}a?_%_N!~5NJO62&<$+9Zbm+JPR{@nRBLPUwHkFQgn_PZBocQdZ`m#P1B zj>h%!|35k$EXz$be)G0HP){m;|J(jiN(V>xk5U;o#c`a5=;FEuiZUfX_jdc`=z3~( zSc*>Nox05VI*rI<4iUAW4$_NzM$z@tSUUgKVpvZ=V_g2SoDLojt($7qKThgs|4WU* zu;@JFsIxFW80574ODek9FF3kS(_6_X)_jWv942v{!|KV5T?=OBRzV8m; zhaZS{axO3HHw*KT>dWFfb@A`waQ+_Q#+_fn=`YFZF&dC75GPXOit3Cn|V~UrrG{Ex0rq7{UmRl zl&jo-OmAbtTgB0R)Q9zM6L*Y5_nYV}wCAYxZ0#-hy~ z|FD?N%2j*EO?k6hPBzPjqMvU1%`SB|>(w-N($jclP~5MV%cHCPgtYbV*HyK+PM7={ zsT{P)+^6$Zy5h8K)0qn}U*;}#i18DNRBo}lkbjQUNl65$S6tdY{U>BtlT(lS&qGI; zhyT4^^R@1_-W>nR>m<4JUCO129aM(F&Zm`tbT z{kBT4nfLYi_qS!N(ag)#IwDy9-sDxZv?izGnrU#mS)>LQRUpSsW6f$Y+h=LqAho+~ zs#4SSW>&9(ZORlWr7)tW`AnVV^Kv`A&8PEKayd;_hk|IT!q0#IALjqndit*1eq6t( zBX9Bw)c$0%&~myqkOQyk$w+!jHNlV828KtImGhelO&T8Z2E!+5Y<#`DsVhP%{>g5+ zE#ftC2za~OE|wpERR7IgQk?Iu8C}&&Kc}lmgL(~Pxt>mz@kBpw^{KbH?$v8ZfB5>< z>tb9yc~YGEq(`czkV6l`t14h z=l^zktfu!#E)^3l3G?Z*yDbkD?lP1sLVQNdIuS zu3zKhsqy^%X@En#k3Xt+JzlS0ZziiMHR;rMq|hl*ueOuvyK$$Aj%Lv=`){7dro$pl zUhZP@a-5)gStoud)BXf1<<4DMRg;^tX)!6#apZlf@|?7;n6o)FEKbidQMc5wvX`on4y`#mgH&#}UtLhn348O9;b#K|$l)O;b@1|hbiF>+e_)l^=r#HV{4(HnhMu7N|%OYl0%T#&Ouq1U|>-R~COU{>44w&mmE}zRH4ZTOBQFrkDILr1G{mtcPhtJPGyKKww zu(}xC^Z3L4_0wi;p$R{#%JSXgyZ-uIr9X{YulXFW%C#q_%XM|K{}{O#dpMn;Rvvb2 z^SksXG>j;%BphytFpV6TE?DT{ZgH84oOVk-XFfzzvpefrMK{? z{4R~hpIcV}0000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 d0000000000000000000000000004eD{sAJ-8+rf$ diff --git a/src/tests/data/test3.img b/src/tests/data/test3.img new file mode 100644 index 0000000000000000000000000000000000000000..e12ad005638868f3ab986c6692dd3756c24f2582 GIT binary patch literal 8388608 zc%1Cq+mBr7ff#mjB(2mX$y(cM?%*%F9IY;-ZtO& zopb8a7m`D1cdVV?PpVgRW zFR#z4PYCz_{>dNx=(qmeAN}ZsbAR?{H~;i}3ir;#Z~mwbT5tEw@cI4lc`bZi2%oQn z&(Hpkwg2XS`X_H>|5^86|C|5ozxs!x;3Cj z`@8*DufDXgxqkJv&CUGkU^9PxZ{zjXUd>`J#0yKYii! z{MWmS`~Sx0%=5BKPuc%}9(M5m{mIGvFYo{S-+KQ2x1O^9?|kLy`+wo**nj&e`~SwN z$KTcZUkg7P&shhTpVIz{wbS?iD@*(TX4v<)!spx1k%lWz+5f+KhW!6(`0-btGyk2Z zl>fi{`sww*QvRX-8_(GWu0AFIjqf~t{P}AkF@HULel2|d#^)@D?o;yro4%*V6t;iK^T+hw?F*>+m^SL$$+@!s%m z8SXo2**DJ*`m_GtaFoZTzglfO=-)3MjdxSPzZ#bP>bb9-AMBLd{k3Yl{eH1Oo91b| zzaEzT#<_2wALp|Nlj*&DT9jdbEp7Yt^W(`Nh5H*-I*NRHKcALi{$>>>ZWx#RdJ6Nc z^E>%?cmJTD7XC(+u7k-mzd!D$4gZ6*-8aq`v;HjZ?mrB_|F;*ue*S1S9F;M{FQ3@Y zm;3+!{gtx+178wf{h|{9d|~u|`0~>K;mb?^hc7SvAHKZwfB5p!|KZC^|A#Lx{U5%( z^ndvB(*NO0>nrEVA>eD_^DE)=_3-&d_^gFb<6QlYK>4mue77gQ%M;(-iSO#f_jBU= zIPu+^_`Xeizb3v@6W^hU@65#aWd5V@`CH-hABWH14xhghK3Vv@_!p2j0000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z000000000000000000000000000000000000000000000000000DxaMfBH}V`QCJL zknQ)2{n<3nv*E$vWID^<4Zm-N-`{Rj3w9@?QNBAHPR7N2SuxqYm(LbIAB9y*8;tjc zce8$xzJ0rqb~Dar4<^%l`Lw8a^kKQ=SMBc4Lt5#Tdq6=dJeE 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 z)LGM@vr1#Juk_$g+}ZrrLA|^B&FK5>`IB9X^6Q3*I4J)L*vg!_yYv)PIK8{SGz2g1 zlddMHy^{C%EXtSm3Ha*lDPDsN1zY#o-g+Yx;dmDR&6oe;K@peCj=g9d7uJ8S?bucD z5a-S6c5S)%N-rK$$}8maZPJy`)$noer-nWD2N>oXtR^!)OgG=;X#p9*>VrfBRX;0Z_YbM3P8C`2jEsF*8#qsN;{D(FBvAE8#nNL4dq?Bg5iVqd^1ZSj ze)!(s58sb=M)}pybnj&c{ky~6_(WnJ29x}LJ}xe0%{K=3<5Qo5xM6y5v40S!;`NiP zDUuuG`@`vE9B&af%ZXP$>kmiaWb?h7Z+@7qZ?12={L1x>S6^K`A8|MwWWD&*PTX_- zqE=k^y{vp%^gXL+4N`}UnE$}%jeHmd~`FNcg~-# zsGb8#nY^%(?S-`EgROWuFC2L{9=GRRH}8htHlB3iOn92dINDErL}+aiJNB#?4$9Z~ zV(}JvIN2Sk4&zVCeF?{9zfJBurS^%JqDUi%w&hU>lcrK^48-gy2! ztQxK_el7oq^SfTNS>K7P&K=5YIP1N7^LQpy{TMfv&Yjl3+Z%p&9N%die|H$ZuXnOm z_|LF2P7lH6)7?-r{k!@6Y2NPkVQZKYTfI)uYlgzSxTu}^CRN>sATRb7N!?mhb6C@f ze_Xryd(-Cf*=Wqr;<@|u{Oz&lkeeIp>lf2?T^!zjm!Pj{iFT000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000008j+vj+zP00000K>n|dpsK2>s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 zs;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80s;a80 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 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 V0000000000000000091S{1?9F>hS;o diff --git a/src/tests/test_overall.py b/src/tests/test_overall.py new file mode 100644 --- /dev/null +++ b/src/tests/test_overall.py @@ -0,0 +1,78 @@ +import os +import shutil +import hashlib +import multiprocessing +from unittest import TestCase + +import config +from hashtree import HashTree +from client import Client, Connection as ClientConnection +from server import Miniserver + + +dataDir=os.path.join(config.directory,"src/tests/data") +filename=os.path.join(dataDir,"test.img") + + +def compareFiles(f1,f2): + with open(f1,mode="rb") as f: + h2=hashlib.sha256(f.read()).hexdigest() + with open(f2,mode="rb") as f: + h=hashlib.sha256(f.read()).hexdigest() + return (h,h2) + + +class TestMorevna(TestCase): + def setUp(self): + src=os.path.join(dataDir,"test1.img") + shutil.copyfile(src,filename) + + @classmethod + def tearDownClass(cls): + os.remove(filename) + + def test_build(self): + treeFile=os.path.join(dataDir,"test.bin") + refFile=os.path.join(dataDir,"test1.bin") + + tree=HashTree.fromFile(os.path.join(dataDir,"test1.img")) + tree.save(treeFile) + + self.assertEqual(*compareFiles(refFile,treeFile)) + + os.remove(treeFile) + + def test_push(self): + ms=Miniserver(filename) + p=multiprocessing.Process(target=ms.serve) + p.start() + + for clientFile in ("test2.img","test3.img"): + clientFile=os.path.join(dataDir,clientFile) + c=Client(clientFile) + with ClientConnection() as con: + c.setConnection(con) + blocksToTransfer=c.negotiate() + c.sendData(blocksToTransfer) + + self.assertEqual(*compareFiles(clientFile,filename)) + + p.terminate() + p.join() + + def test_pull(self): + serverFile=os.path.join(dataDir,"test3.img") + ms=Miniserver(serverFile) + p=multiprocessing.Process(target=ms.serve) + p.start() + + c=Client(filename) + with ClientConnection() as con: + c.setConnection(con) + blocksToTransfer=c.negotiate() + c.pullData(blocksToTransfer) + + self.assertEqual(*compareFiles(serverFile,filename)) + + p.terminate() + p.join()