From 0927f9d477d9120c2776b6f214b01ee110f8e19c Mon Sep 17 00:00:00 2001 From: jonaswinkler Date: Mon, 18 Jan 2021 14:16:32 +0100 Subject: [PATCH] some bug fixes and tests --- src/documents/file_handling.py | 4 ++-- .../management/commands/document_exporter.py | 6 +++++- .../samples/documents/originals/0000002.pdf.gpg | Bin 18961 -> 0 bytes .../samples/documents/originals/0000004.pdf.gpg | Bin 0 -> 17779 bytes .../{0000002.png.gpg => 0000004.png.gpg} | Bin src/documents/tests/test_management_exporter.py | 16 ++++++++++++---- 6 files changed, 19 insertions(+), 7 deletions(-) delete mode 100644 src/documents/tests/samples/documents/originals/0000002.pdf.gpg create mode 100644 src/documents/tests/samples/documents/originals/0000004.pdf.gpg rename src/documents/tests/samples/documents/thumbnails/{0000002.png.gpg => 0000004.png.gpg} (100%) diff --git a/src/documents/file_handling.py b/src/documents/file_handling.py index a5274a5f4..dd798e8ab 100644 --- a/src/documents/file_handling.py +++ b/src/documents/file_handling.py @@ -91,7 +91,7 @@ def generate_unique_filename(doc, root): return new_filename -def generate_filename(doc, counter=0): +def generate_filename(doc, counter=0, append_gpg=True): path = "" try: @@ -151,7 +151,7 @@ def generate_filename(doc, counter=0): filename = f"{doc.pk:07}{counter_str}{doc.file_type}" # Append .gpg for encrypted files - if doc.storage_type == doc.STORAGE_TYPE_GPG: + if append_gpg and doc.storage_type == doc.STORAGE_TYPE_GPG: filename += ".gpg" return filename diff --git a/src/documents/management/commands/document_exporter.py b/src/documents/management/commands/document_exporter.py index e2313e86a..250ae1adf 100644 --- a/src/documents/management/commands/document_exporter.py +++ b/src/documents/management/commands/document_exporter.py @@ -108,7 +108,8 @@ class Command(Renderable, BaseCommand): while True: if self.use_filename_format: base_name = generate_filename( - document, counter=filename_counter) + document, counter=filename_counter, + append_gpg=False) else: base_name = document.get_public_filename( counter=filename_counter) @@ -139,15 +140,18 @@ class Command(Renderable, BaseCommand): t = int(time.mktime(document.created.timetuple())) if document.storage_type == Document.STORAGE_TYPE_GPG: + os.makedirs(os.path.dirname(original_target), exist_ok=True) with open(original_target, "wb") as f: f.write(GnuPG.decrypted(document.source_file)) os.utime(original_target, times=(t, t)) + os.makedirs(os.path.dirname(thumbnail_target), exist_ok=True) with open(thumbnail_target, "wb") as f: f.write(GnuPG.decrypted(document.thumbnail_file)) os.utime(thumbnail_target, times=(t, t)) if archive_target: + os.makedirs(os.path.dirname(archive_target), exist_ok=True) with open(archive_target, "wb") as f: f.write(GnuPG.decrypted(document.archive_path)) os.utime(archive_target, times=(t, t)) diff --git a/src/documents/tests/samples/documents/originals/0000002.pdf.gpg b/src/documents/tests/samples/documents/originals/0000002.pdf.gpg deleted file mode 100644 index 0322a8039f0a1e401142c7fb9d5dc08c60ad105c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18961 zcmV(lK=i+i4Fm@R0@fmhlmb2@qV&@30X}=TA!MckkQ={n3_(37H zMcCZAX00DiNf+|llnul@B&doiE}<1}I*XA%fvL*7(d)xeJrh&(e~6XJiUD=a7i0dw}pE=Z>LkH||J@ z-((I_!zPP%_k}br0++oqJt*eP*d3?H>0DiXCN)ZN&H$z8%hvaW;XjZ5Z z)Xc#V?pBpJo;BHndD$vG_W348k56<_Qf%VawcpJgZ%9HAJ zd%2qJ2eP_9U?b8}*>GwnSY`VwM0Xi@iI;U4sZ&l~dE$*@Yu_A+Isa1rU5bE6L~R9a zz9cmUUn(p%V^!c95`l*D`0bM>Zv>*6Pxly!-CEc8^vgVw<|2!VwmxUHKUQeSD;Pmm zq9q_>+1pMQAp`kec4;=tjnkBjhl*IB)UsId%7w%6QP6?&vC@W7`|WU{3GpQnO`Mni zBmZZN+!~t{PE`{n$8dn{4y_HEKBVwQb3fH6l)7wNlZ_Y&LeyrF(6V)%7HK!V5Dcrsni z7r77Bi(C?PNm`m*c!89Oj^WP&iz?p0sb>|m(wOSv>W@MFC z2c*fiQlrE0s%9y~wCCV(aS410hIp>mJ2{U<0X2IyY3J?8U5&naS|f7z5>HLp1|FY% zrL6NnD~|$VJpzfMS%*a|KkmUG)!v!9C74l^Y&Z|1V#0r9ryU7nPiH zBul5SUMjD<_Ax=JUyGy{Qy060nTY;&=I@tMN`4ZX@{I6vTMPE9h}7YKTB`Ytv(j5T zXROKkc%!Kdz*1n%tz@|38zZM4KCIr^@SK1%~vMCJ(jPQ3PY z6xH`}@Q)xOq7q5Tf;Lgm@s-Zwg!!eDnHE-PE$yXyqW%Zkz7fIM}I+HoQ+QqO%zK>V#CFeilx_5Q-K9H_3f^FLq$#!%YlfFzAh?f)|4evvgOP)qj3iokPThBdkhGOa6&e>( zGGv8kj~kElbn^^YW?0~v6ihM*W2X#oX&l{#KLVWYgT2VUHPljrACUl`rhtwyFx#)u zscq`PtPyCf1W@M3t>Dt1Z@R^zYa!<)PC!#dBtliDAZ}9 z!&C)pN4Mg@t{_Z`fyl@a*b$lJ_Cs~Wn6j%e;yPZg+Wv)cUGXW-o_l*?0Wi_22TEJf z_l?Rs@D8tyf>p>VdAB)aazsVWkuDtn7>@p>iLtTdPniaj($av5C#iwH7rPtG#J|B+ zSY5~+R57zkbMQ580oBOG0!7ed$ve6!TQ^*`Gpo2YZK%Of=IFhbRpUO4#5~4-WgG(S z{o^Rd7aG%es%=c18q7B=e+$J%Q#-YnwsY=6JKPh$*1G4*_rJ{r+-N)k%RCWsB3(Ym zrh5r<%yBo$9*_4{Q3{*w`L8x5&DDS*!@D89`j87);!1QMY2~mD?-{$?5vkJHlQ8~o_rsk>jLV5aPW)&v0}{wf>IsD? zabQ*Ai&t(>?cWC*+zAAuCQ*ulIH~%P4&q?o8U>4#|J+Iy(Z!IYWj1&fl|#&q50CAo zk)j&5DJU*M^{PoH2$9OT|APUuc8y{@3bwA_jS!7g_KrEZ&+G$hIRY{U$s$1Xsp7>V z;{v2H!m~9U=%g}^{sckgp16%AnvLr)*++DQ6eOG7j}tX%Z9YA=qMauYPWW9{8yqqZ zt;?eveXx>*R0PXOgffn`HGIPEU=B`2#{UiDlCiBwFuNtz%crg!B%?cHp^*{ zjCS$5IQUo!F@&I4`9%IXH3VVd8IiBoogNjU{JG)~2fG-D9bZVO zKs_i@d9%^~F+@R>!h`(4ff^8PAc-RKhYURT%I~4_2%? zi~9xNt$5Z6^20|xO`B~QamW|t^6FS2^ogIcwD(;Q1LfIUGU?8*-$S9=M^M{eb)2}R?ub5(f;+K}hY zCxCdq0?+K)9=xxAI*xA!rFK#4Qe=gQ0fjAYQ&l>nZEj$Z>pLX0qC zC>M4kq(5&4I6+Dgoz@X`iu9bnVJrW#MzJXn_P>T`=TBI9jruhM>sFju@hl^%KhtZ& zE;|&e;ss)#uZ&z28xdUwxV>`YduD25Mt;Qjo-3%%+qM!+-KwIH}#hVv`&J27cc)S$J{j}@2m~6Zm z5FU>^RRwW>pogsIba&kh5i}C)I2({#gfrSM>88$;u;EXx$a909m@9Gmqo6A&3a{25?sgs(Z3E$KpTY10(`7cNaVX7%EKS-%@T$ zZ6#G@Zq9Ktb^;=hX$0K-aE=X5lCRv9ifF68ij@Rm_`+j4j@9lZcg}(xpqJ!IDzA$` zM~BSE!%2cB>%-y~xvebhHW4?z;kt#J&$!uEg>MdfCexUw)V#QQ5vr4rPY{WurTX3? z&?%&d-C)E1>|YBA1hRjz(p6;AqNqin(&iRT{ERpH-53LwpV~8W+mm1fyw(N?xYyKh z&YG%RL&gVbuf^JmbKn{IY5aW;1sNJ>Q=6^T_8u%X!=9t8+JF_jPeh^84}=bZ-yR`8 z!sY#`tpUnWOzJ|W!$_#{$E?v2ww-iKiG;*s!=AX1_-UqHI=+(s=d%axS1K6`a-$SL zpbq}Afy^}oxFI~H&5?C}9=vzmfO&g36D2%t93q@KKG6FvEYIl_HNmb(MM zg4-?i`t_XUq(;|F=NS~XeWKczEp(+P(*q*?kdty-Q3=jWMM$SHI2V5|j}YB+ii--k z725y8p`UVE!s_c<%j$zDuJWdKkoZ|fq<4&YWJ@P<@U}|(zg%k9s%Pf8CaG#{U`e)$+aup zova8$He5Ns+%y`2`lx%A$GOeWnJ}D%ZkMlzvj87LY4*o?(9U*CI>!3@Mav5o>^Y0ufYY452Jzji#OmHZi@*ZZub zuvIm2xGmXQY<-aNl01E*7&TcCgoKN>{x8mMZ#44!XidALDxR>?AD?yyPd zd=E;@hp0c1QQG`*Fq5Q}ubVno7V}zP$?{_S=pGYxD)m}fF|*bT7;7VrjmndP_0-NW zKXr3%WqOR}-5w&kExog-=ryPch|mygpT)f>Av7Pc!JrlTN#>zh7xk<^C#Dll>|52L z<~}FL$TDwGqj+)5d+?L6&X&Tg!1$yFgPr=0&!Q^SwMMsF2JN5TXXXG77m#a`*`;WL zANWZ_R#`!(;+W6W>+9gr)*D|9cV_&dr6rJpz*Bsj?*Y@?@DM$#szJ-MQw-57{$iLHh5NG$p%`v<9w&2bot{(%&b5 zbECkQmaEJNb>;>95K|QRI~AlV&9Hlyv6@#ZQ3p@VrddE$<&&Y!p|V>`@aW>}yzPvt znwLZVd%OVYf)=OA1&qjbKvE|Hz-*H9KL(&XLJy=Pqx3Zvbk(IKOnG(Z_YlAxC+tLa zp0-FMpeILPEvPL&2qK&}D4C)(2Tu5;>}SH)5R=L1Pq~@3-Fd2o8jY+wXdkTGKpL-0 zdWn|#a18%c1k$~bXS|ef7Afw?*4%CRAEEvn26H3P>vQ$XpMU^Y*eUt&1fz^%`_#;) z2u`X`emRforzTHF_kV|(-B;whf#64CM8mVWbD#OJBoZU<{D|U%#50!L=ymcu<#%D~ zG_%8(#bZJYgzEN)o)&jBh{5esc+u-)Xt!_j>B1fJ;X-S~&zL@0Hd!ws2w%A{gGi#)Wt!sd8^lnq zGF+SR@`6*Ah!=lEPCR1LF)3jwvctBsw&uizF6ps6v?X2aVM2(sg8&95sTIy!jXHj5j@5On_isF@GjVa@fJS%>p9uw$DPHh(}C~DDwwE0YDFg~at@+t`G z7pbc>wBl#7)M2UbxU#VlW;sk=H^`M;&Oe~Vy>6@nKK=`(4_O`s4~rEdA0^rEpXHFm z?0|KmS75)L1XXKyXc0P*&O;Ax`Z_Lr4|RV~RJ1BBpOM$pHUzftU!taKHv^aYXlv7@ zCCeF}+k%>-8u=6z34aYPj8;aaQ$Lq2CsClMj>8k}Bn|Snhfw=4E;U>L6Mz9=o|NdT zl!?{%uhoo19k?D^_C1{lyWqZrnkyYJCv?Lo-OVmW!byM=T?Z)gM5fI)3wgyc+U`&i z!H_n9x#vr)FV?VuKeQwGRHwss&7Qt_Mdh0dos;==<$cJf?DAc1N3veBeyle=kt(Sk zYFp{?=enPte?OzC4WliocbVWbQ_Oeq|3!tAY`Q7YTa~7SR^NJijOz%#QNnU4UMG`A zUxu?>z1WNLrVMFW{d_+$&-}Lk2Q`FQOGSK2W|aAz+PgX8ov>cp54wW4W7JszSx0n0 zhgi7hGG8eQ40Dc?^;|`cd{UG{1inY3Nm_9HVLHyelPEK;9_P>}%*U-g4JB}*k=wa2 z?Q%cbW1%i=Gw>UzXU1TUl201jVP`fvAr+wWe}~Iz7IqCR+V)@BgyDQm0YqX!nJEC( zogxq>%8F9~ei@@Mc^5~G6-+;xZ10r6<3hBu9<-n`7QnonV^Mn{$q*xD)!&S|PEzBJkGW zLY5_JPj3@K#C9aZ3Rl6QEjV~gbXK@3Aa=c?*bGgR+V`aaDQ|1ev7JJ)ht{EYN1d&3 zEC>ePZI@?93BK^PB~QasLoKq&b+R4rZHv{H$ozaJu_Wm{>B`-X^vY>d1fH9)~Ktot^bp|=5C)Bs^JC}iydVNNtqnrI<0 zYR!%ZJe1VDf0whXlJUrv@o@-y27O1LV7wb@?ouG6>X_Emr|U1Brt-ci-+D+#21hDv zN#hmN!yh#RU|FR&WW-lW20-8i3oc|^(NuccgC^ z&a*TS88Vsv=sT4JO&yd^#EQw?zA^4KFK}8{b@v)}dQf4Rq#Xwa#qI&H2wt}cy7Eoc zo?~K;=Y*b#nGrE@Pbi5?oxTlgZ3%BY(tgqn9Z_36%2Jn@2Y9pR|d)H zeQZ!(P@{eqOhx8 zT#Pq=J%7moBhD9MG&cqapOl4KQdmcP`t>1l?q>@C1Ch{0574Yoos~F&A`YeqpW^x3sx7|uI zb&TajpGd8woPlzGgcbi8Q8X!6o z<;-y{&oNAcZ9})_8+W+;7fzp?9#=#n>Q~EZZB1Qj9@V6fpNR&}N#ho;d!EL{9?yya z580ixt@sZ~4?wRuwuukDfi+4Dprm^kZZOQKj-pGTQ+)T|*L8lvcjAY=FDR!Wd8a5$ zqI0~M&LB(VyMKxE9rsjTfYJalR$ozRRYQTp;6GbC4ld>*OZ`-Q??WrjfEs8GH|c2O zXaRO$49iMs46$DcdG+Q*9@JQ2%($O8=w+l)w|9#j!6@>hfNon4NaEEW7@|)uNAa#k zbEMmCF}UGtbj6|E$Wy25wr5g`_^8#hr=~x_g4sptC>!f5APJ8P(nAkgV2o-!*QC)$ z10`K%O05i zTg}L+_9C+s;q+_HOE4+LU!ob(F3VqLmIRoSufWOegOU?twcH2M81w-e%=ipOAM`PX z36d9z#nZ#{o%p@fZ)gPc3AoarB*v!iv6XUmbg0yjzSETv;f}o?r{XGeZ3U)tgFb`N zvQFrwnxRYXd)4YDekaci>+3teKMu`OyJ63l@D^K5jdy2*7&-Hz{n$cPy(z638GI>o z1XOwVBN8D!2r&;vt|_CWZo4hNF!Ea4$?UYR?X1I)DRwr?raN{Z$w?S+46wHw|NP@nWLFoel>lsnwT#`uo z|9~UrY&B2A10xw3+-XqV!yZUBpRCI#(mXB0);p)$WgjDQs;}O}+FN!>v%tn92C={b zi|P8Bheyaek3A{SI2baeyt5$9aHVURut>H$h`4nEGBgM1P+ll# z={TaI>1F)`Lm=L$kY(_bAD1&|5vJq7GB5y84QrjN!}0dJJX$Yrw+)U;hiZeuBil;Mv3N<81-0rEqR=AgNNUEo46DlDV_ z!!+ywL4TQ@^(`w0>>I6{sv|3OZ70o-+7Ys4txza=JW^pjWM>VK-?K0b?G`tN+|=ntR@0OLeLif! z?FNjd8z0Zv<(KwSW{LSvKx~izLb<4r*;=hL_V^;&@bu9bIdXB6-?LWlH zm+HvRUL2Z1q^L<|d^NeBZufCIocdcxJ~F8gtXA6PIq)dWLQN=v7mX{GrOD#7vWeS3 zHWbQDBuA6B`ptkW3{nwP@qONMWI1(cX1sf!Bq%XMsE(|fZUDC&Nib?d(rKFrEGQjX z+JWsXlXKJ#nhfQ^X80M`OZ&BN;DNv)%%Z2nH%$yj3q zFZOTK70z132O;rKIzJ?iv7qgpWpZaU_kz}n0^}OgH2Y9kwA}iVi)t^%_*gI|ltdgl9pv)d3dU%W0Ty@&EVQpYRNPuFZ zVk71(biqOfC@sIyCOszc9pIoY5Wot+ZCBj{DLZC=5N9HEnolK2Zj07Pf^=aZD$Pw} zxa~RD)uzMYCs|-Y@7PMbNv$s#5K+7+8OBY;V~2HcvTRhk+X*DQ#t9&G`vyI^BO#2rtI}>;7OkT|7>ZcNmmlj3{$>~fc0Z$2$XPqs<;?Yh%8ta=X%QB5)ELtj4cP2$ zCc+vjgl+oPG}iM{2bFFmA?*Uk)1Vl{`vVPmWI_qVTfm$vLpqlmkEKhEIW_BvfAaGw2{PN;u`Lxw4=;z4owM1Q4QxdbaCt$4|Xy=toQLmAF| z2sodB8!N?fpR?tI!8TFDtq!5u=xqGtQG8hW7pM8lRRbR$_rSHH@PxlV{G31B#|f|o zuE#A*b*AoO&wlO=v*iBm>>P45^FEa`M_+@bm#NSwvCqLi9+?wk1u5 z_Ng@)JdNwo-i{BBDV3g`7=A%D9<#0Y2VqiQ_T-!u4?5us33*4%Z=|5457Qnxd+h!) z6;=b#(F`#*2U7i%5T=`Vl^{ho(raoVqTQy$Qft+fuOG?$Ox!<^5JxHB=lD{`K`ce) ztU90%$~5wsBekTvo6CZ|{wPAvTt;OMGYSlFwjzIqUz|?bz(tjM=-zKp6n>Of4FXPI zKE55v7=H+Z<{^89T;Kr6SF)z>lt^TgJz(O+yi9V~sZgM(VsbUZzm&T1-X1^qk!|Ti z@7=>rwrJl9E6shg^Qf@=s(oqR`MW#GD5_Zq_}4XmzrLy_70GZ`m3il}8<3ZcDk4Er zAut1+ntDVqj3Cg3^~dETYc zU9x9x?l*Df90$ng_QbyZr5H~V=@KhV?07&~2k zjq(qsg9MJhTYAYPit=T*-8`p+=}Bl6rKfQK0LcXZT{uQ{^+6kO7udI4pDyh_D$C#_ zz(Kp^>K;ITZ3oVL98&XNzp8IHJ`aw_Gk(^nVb7bry}%4cYjcx@e6bay)S zD$GVH>tHBISFknB!%o+5Ymou(cVvm5Q-=aW2mQZjP3NE0KM_+I% z8O*yF)C;@*U9yx85-f=SuMz76Nmk$oIs7cTm_1k5_SeuMNwkA3LS#cvt2m#r z*vLWF+@9%n9N0+ti`x~7gxhUxY*=TTzm>k-H7#`Cf`H>6&v#>`#1(MJ=G0rf?geZFQWMkyvVX7&(S-Wo51-O&2?OI@9SN&o!Z_Ys{ z0)AZgdc=$H)|f1aU@0<`^6tXui(|^?m6zyyXFs&V@XM5qbu{|Hyd6txPqq{38#*^D zC#0___5u7G42Z!M+fJx*uPPiveaKWXN7dnZ>7T&w^>6I_ZyG1ElLiQtJI#Le+UV z#iP>Yb1h$+vTo4OODctJJw@7pC_?AuLF6-#bbcy3+Q85x$gTI!NsifhW4qb%Dbf>a z@D$P?w0bN@8&RIi19r&X0hZJc7!twa@kj#R7^uy;0t2^G2&~A#*O0Yx| zA+o?Fae92lEr#P{n0R~z+G*l>9aQm&K%t>Wa^5^|5r9aFg!$zuM$u6meE4HLamljN z8j+QqE2t+cy~VYPq*9k^Vd~=X2K%F?b+E{f1)S$o3nhlKeP_>{j}z$EQbVYezMC;> zRoDMJp@J)XXBace((-#)kF`-O_Rblw_xuMOaL(%5-r0ahm++)eTxL3`@&-G6ymjRu z=ZeAH9lWCdCd#}mC_+y4EqwbO@hUHHPX+JrYd>Qm=I5GA*{%KxRDXQ_ z;7|HOug3}n*IGMY%y;H2h7Ih=CQP%nTmWe_%|3IP3+CQw^S|0AFOl|-5w@CSR8@5p zH3s116I@XIna!c8@*0}}Wz?rn*+EHaqU`2xUo!pkm3q4Z4FR)9t`6Y<36$7>K;R$N zEa>L*qp(@EVx-!CaX~xwp3>6F(OiZQ!@id4WS?2VUr@+*j#br`M?knSd#Nfgk5XVZ z;(i(xV}V@9i~89%Q`bP{f)rLd7+qi56}NncX9+7Xd`}YXrLVA86_}|l-c0gZI=ezs z@j;d$+j+39`-aiTgyyG8?_nN!gIq2K?oVFyxJU*TVN&37 zY?txVTncOyem8RKH7=4I>sJ+|%V1V|!Z3C8J$W0~%PSA^*5LhdoK!e;{ge%5m=F|( z4szdD?_44u@}jYpeAJoX7iuxp4st9UBBsIBZzDLjqI+1ah9(>a)T8Nzj;%c5V-`gI z?eKTik|RS&n4@!7T6dwTM9gr@zC96nNGUJk8i4h@qZ$6xtmRO1e1UA=qhf|Sq8RYj z1m^@W*GUbeb4$;n$K-s=k$CF6X5#cb)-=m`+D@X`mgG!B0pk@wkzoz^4-O0}lG8u0Ega{Sx!kRna*YB*k7Rt>Na1P__tpBh zJ&yj0eCa#M8Ie*O)e>|EB^PbWXA?8nxh#5-2N8)fg5 zN-H`iVeHdNKr9z8HKdQ+K3KwSq`tp_%(<#Tjs-ut=VG}J+m$X!~7Lp;8 z(R5s$Uq;Dkm)0CL@WA{t4*&U#F^*dNn?|&7WyqVffNt=-c?#h32)l%}V0&}@%hg_D zqM2;+@{V_5{LG=vDsr`=?>#R9o4X)aFJi1%CzENw(dj+w0$HIDoWVXL_FOv zQ)Z(i|7aKGfi0(kAHFAI{Kw!P>M}6;<|@U~hv_rT*|M8`om3^&cx#tPxwK|L1`U%@ z411)=Q$nmFzYa;cLrgXP14_9cLz@}2@(h#BT25ab#$pu(ZNq}{Sb@_QN@>S{tRVxp zj~9J^K>-uE-EQo;*aGnC=PC%VHDjWRC|ip&s+nZkJG0NKL}i8q50iU%e)YddMPr|0 zdyPz9Ur>FF`y7Ba)JW;ZK)@ob3CK`Gd%!n*|DmT)HhafriOdvLsWP!G`M_HiJTG4c z#8&AP;>r+>lIpwyOI>fm2*pA9U%v~PQ2_RAo=WWfMBfYW40N^GLYwZgUV0qjMSmTt z!%l2RH0LIgl}Y?eQ3?Zj!KjV(BJ|tJ3#lkAB8F&;S(XhyqW1XEL9!uBVrbc41z#j$ z#&a{N^`K~6nIJM2jU{8{T($k{&9IqVLs}d7&%~668s`Ux#ibC~@jH_J4loMj59Dm@ zkn}Z)K5AfV8RtMWOCbIq@;72oSSCefj;mZPDRZ z4-;inx0qy*8gDF~szSD-#k8H_0_^!bZfp39R(lVyZ zYJj*^*&3y>@*15XV{!V4J^?j)G=&TrjI**NqcFl^nTyStG)u%nnZh#CB$ye)XO{T? zw;+eg%}-Ni1ZcsR$bT0YCnw=HuZz4Yb)pvhEG8vwvLnkT28DzZ%Soj>R+5O^&l!Sd zp6I41I&A~W&wW3OtBMP~{pIG8P|p&6@tGOLIZ7mE*FOUWB7PPcjp~hmz2w2Xgc&Ri z@q9gXHX8I09q|m1slLN0*eWnX`>=%KHj4`DN3wzVgnj>s1B4}Y8;5WSHaxcWrCu&J zCzg4AS?bV|5hmB;2nskE7(TZ?Y&IOH5@+ASe|}k*NE$Cch(Cw((|^?c)lUDa1$hn8 z%~P-DH*^OA-P=ow*>UODU+m}z(D6Nb3?6R?nuFsx5}QfX7_YfW;#D-)=epIveEDm2 zS<-!VSq*v&?w*8=6?WW}UbQvA z?91D-__bhW%nB0@5i%_NkxwBb4i#7QW>SY&aLFSK6;cWP6vZOT5bvzc@>4j;mg!`= zx<1)EWj4lH_9Di)WYeD#;t1yG=L9Yb^LC!50|xHpCSxk;swh3Ayx-=DqcYpjmT6Ev zC%vZYbZtVw&8sc=fkj5A0=S2x7DDBw?*{Wa=xiGs(MPG?$2mJr(%J|BF(WNK!^eNA z45L`#7?Vfr7lNj1;kR4#)Znabd4841iZ+6$sHundkpi`o3&H?7^+h=p zKg;?St_&g%nfa4#9z;Yi3F)Xzd?Ijx2P&=;$oCCm*Q6>z%!`*uX9+HvM zGs)#hg(qMFtA%g+grUexVnwj%ZW0&Q*XQDZ{=uH`sCmMep>94<2UBn9@rrqV#0(2k z@X?{lj#dnh#IA0?ziL_yYK_Rk2fT@M;&sHM6;cvt4vD79(^FoNJpVVy^a=GK9aL{B zym@l0EM}h{FOTZ8oM)P&YZBuU7iK>knJb8)iVH0^RLLJ6($)MqDCYBbj?I>C8b?fp zf@oj*t+g03La8~rMw>=zhhUY2ozSZYELv5YpY4O6Hh8SQ-A5HpoWS23OuemSDx#*g z0SNC=vo+?cF!KBY*zCJ-Ez4kISa`)rp}ay&RJMXcX5&!T2kaguhxLd}d`WYjw^P(z z%T(WT0B%734b38+Aq--+f6el_u9<-Kt7$wLknxQ(R3lrOKb!)t2veJx&vD^RBY%_i zx~xE|zZ&wc)q1n$ZroGNDY&9Q27~v<5lgT}Iw;6PLVJGU6pESx>?{WdAEZU(9wm2` zPe&Anm>GYd47cOkXX*4*;d3Chhg}9#``$pdEgm~!iJ6mhg~hL~Xc7e2%bm;_YCA1~ zSIzyEAtNLD&sA3lj_70F<#7imLe*u>7a#*~(hlaA+x~7mtS+zDJN@`+~n0B`MbWW~`?0omYQP{O;#UKz>XdxIfm8 zD*^nG(9QYnxTQ5IS_hwMG4nash)Mfp3Gxw9XrY*UguJW)vdmzKC-r(#!Sc_bP)BKy zL>km3by%y*F6{P4_tm7e=oX;W{wbfgjv<$djnS%$bUHatc1>LOtp*~Oh9&TO zTHoy}d4$Nb;6QVK2|?1~)Y#xCe5^zsJX>MJHDsCW;GZ_cFn!MDY#yKChZ~@Wy*iw6 z%lC#bsP%eNaY&Mm){1(vgJ>w2T0^#<2YR+&^?TNz^<2VLU${a*BuCsABH|Ug!2DEM{Tc*u5Gu>v$7F4-Ziu#*DcW@#ee=bX z&ri;DxHt=#yn)LzLv5U2{7LChB6$dy)hlqKQcCCLG^KlVfZX8I`Q015a<+&R@7qGb zBRum8&B+5kbvQ5kBLc8_y(Xaxfa4jbc&lSl!O!+`v6w-UvS?KR`!z6bGFaQYpLF~o zJrwq8T-nD-1b4je*!m)g_3nskQ>PZ(qzh5JB(9|y4K@n@v;T1sJV4CZFx2zxqf^lt z+nB<2*YqlqXZ~9iNz9cg*|BiA0&q0Q^Xc z&(O2+hm=`Bt$;?^pPn$1(2lv-S1-Cr13c{*gDK_iHPe(h>FJ{$d}AoQbsMkwYnQ?+a%|yRBpZ4Oy2r7KfdNj7OHF0NjF__b*xk-OG2xYez=`;%2%L z^3=;3Mqq6eWvotp1;nDE59HttkhkJuSjXuJTfvu>A~73qol!$=E<&pHEh&&9cu7xh z+Ah6DZBwxrM6hhtKV}xz)Z%Gg3DfO0c7-Lq=V&6K=m2=R1z9xZEc~#7Y1AJ*msT%0 z+wmHWtR-w(k|#tS?Z4UYoKf)l=M()x7XZ7u!Ncob{1@}R>_^kx*5Iw+qgrw z2J|Tky;rwoXbb16Xem!QL$u@uc-fNWR;nh9L{P@=b0}5m1PJnXC@AzX)Bg>K=nx7( z$_N?U;4YSrr9lc1Y51zD=x}^YF}#26Lj|jUtqdj2-|dxuIZ`mb+=RRrO^)mlHepgv zv#wT9jQfQ>owNlOBWsh#S_l+(W=AOzkB@~+AWVN;SG6YNOw1RwLvuAiG)cStRsNjUHt_Mz_J3`srV{KuC!1WJH_9jMF-Y#xLb-sfVrOqA$z-6246 z83#Jxc*@uVb9(Yh!M;m;s}wmmC^ zKgwoD4nB-XbU9!sCll`N*8@{7=FKaS*aUl~601X%Yc={jVFpG~&d95M&dt5mIKy`n z2~Zu7_E)*Zf~OVz-l&9F1bI?u$J&knC_JKxiLhrjas-DNYQ!CR=Vg3Wf9IZt(P&wHA8AlQw!TUd8DKtLo`ccatH{NObkLnSZ@=}WaxJ9)CT7z`{~Yn{FyLw zIJjGQ+QyJEs%Y~w|70(KVpUG~#j8N*<2})BR4lmzJtJ`+*k1^fockhHD?Qlyc$JJw zK;p6`zm?Bp>lG<*QVF7UL$Q)?Zqf-w+oFv&-%d1|`3&M`#u89c*kU=|P}Qd2wP-JK zD?)UNIs?P{!AruXGCYn|RYQT0DzNl${s^#)VjU}nKCSEDHEi$lOr-c6g;>3AYW$=|0&ZoQ!7NH1f$ zIq>W1S%}ra*isOPOWpx^^IK$W$9CYf#YF+zdQ$4jFpU~)1C{A=vNeF~1#AY==j8s@ z8r3qp4G_0lfCbWm`4bfRteo@JhwVgZVpVZe2X549PkH(mGn2bUDuXL-lC?D}II0eH`64;S*Bco}2pd6r z%6N^&7Eqg1E3q(eClSwdbI-e0&}EAa>Kw?)zng^Wh0L}==MlPxaMSpWU^0pHOk@ki z{{Ix~GD!lxc(2(VbQL%p)&lCM$sn%YrlR0IfzeIyev~xmRR|0rs^6ljIR+AB$~;1k znT@TceRTXRXiDTkb~4|PfS_ug>FB5bwO=5^m5viMnHyv4vR61osoZ$J@I-fE2hri; zJVmD|WxRWUIG^eWTQFCBSjiFc#Xj~BI@Jin;h;lK7SZi9E+7=!b0~11m zSB-B;Y_s3+#UA^mVL!+U1H~o1%evA}V!J~T=Rg-7o-X!4fWteM@XKkd%(~{jyX*&a zB77ZQ5+yLn5phEny}}yoxHD>W2z5!l7MBv=Usci7d* z^s`Ay^-*?^cIdYh7J(g(6Fj5+uX}6^YdvIfB>k>x&A?35$`R|pE4MLIy2W6=u+Irv zE=PRWds(qSm0LUsa5(zf`E$rh$3@vVQ#hz35S+8U+fKfQ(GG1LNpt@46Ql##%Cj9Zd8sD&8tx1>!S`)N#XX`0f(Dy|t&sA`s)0*1xcv^(x+zv+&epQ&R`E=_Z zLxVjZW|U7XifD{^U&i2P+>HSpl-l0c{!7f!i!0K0>xO|(3U0)G<>DmFr1aMSTM(jP znK!3Bx4R3!M}5xn1IQlKXA90jPLMYIC6R`?PMn`pS*xkkvI z?1W;VC+ivxb$X7&yo*N?rRJ~iJ$W=19#&I3Ku!w1DdHiqc#H%^XG->%S;B(U?i2HV8qrXq zz>*t{9L+2~tRo~(+$}9%gAQb?DEYpr_v@dvN|pmdVGFN=nH7;Fg0<;#-OUKh-K@a{ zPY)xi$otN>Iw2B*uT?R^-_mxTMMM3^%c&K!W`clTj2%QTfZ# zlXBGpX7Jh|2Um|JIsSFcUR<%!`$|))x}KtU_^arx6Z9sQE?PveirPcYyBv593xkkA z{N5#%{MZ0PCf~`4xKLX7Wi;J;mL; z@5SBEQB?A2F{gI{GJ))EsV=nKvB5u|ol20_4aru$l^a=}z4&d{lYEt)Ng}(}iGugc zs#_w-sV?lMg)4={bRPrpA!!2%@WdzlYVs8PF#!#M!`s zr3}1nbm5?(%g$6-q!Hq3(+=RBl#k*ywq-}X{f98S>2zDo6&PU4HF>r{w@|#Gae$K`5-!? zG{9cR_!kJ!Hxmc3k2!-_=*dSDX9r;6?OB`#(~#ugfUHY@#O)nfVWKVqRx`T+;nyPH zsmII51!50l6++-^Qb({gN;AI#?0U5WgrKII7=WH9N z7ke3=sJvJCi6CPOQu%@55iu}vPZ~aVMM|E?iJefDi46aGSR@@1yR|HCjYvuk6F4Nz zAgRXAwh?w6A-P8LCk5*^_x6+jBC*UEKU2Ky+9}+xzl$$loQY5mXN*6w|k z1b=i*a|X7@oZ@c_we`S)HPCIB4M(|vjgB8N?m=IkP0Wdyo0&4)nqmB>2yoOjM5!sl zSN~qaGQgnpUalvWmhP}S>bnV0&WF6j<0{!HdMm~ln`DH0TP>0y8X_jtH+Vt@1I|&7 zX8TGY%}+B@iD)QJ6~^BUK2{iKSKQ9#@e`AX@F$hYxK*7F`uCn+lUG!Dtg7T2n&&j` z!ZL|^g)WPaPSRxnDNm&EeL2Aqso_?`Eltztc+P%`*2vlHcC5yUjRq?xSAW1pxu^3q zF!i=FP%`T^pw(Nc`uUK3-xy9W1-EQ%Eg5dkOV~+gRNqjr<5aXu(9;%43bP}ke_UYC zCTVq6uZT(tx)@ZSJop}jNJ=q1Hj5LU_j>$w27-H~eM=co3EQH*j@?uJbYvW_D!cME?G@NqypkQ%{d`fg7H# zorK$Gm<&3}s}f45<`(v0p5cIka+DYiXhGhgxQGeLpZX@cVYWK5SDNefWnMsK17n>c z3Qr2Bm(o~R#QV|}@Zm&T#yxR&uwa8JQu)WZSuHRbuTKPONTAWd@&dS{;dFtoT=p`P zv@*2MIHJcyHMHLC!#0;#;PAyoZ}%gu-AL-5vz<~ABaXZHHmp-Cx{dOx6{i=1q7lhW zfOERFb(jk#vQ&oJn87TCb>zz{qnGFU<3Q$e+EMpB;mml@`e+|#O1HC5=JvC$_NtkJ ztX21YIFomir9{O2KF?EhIPiyBYEJ)>jhj?iRR`T5dHT&I@eC>II|-s0vM!i%6$KHe z&32#AAnK~vj-ccq>cr~hjqk)rO9x3|(a|#WKa0+O=T*D6C=svWaJCh0Od+og%nUr@ zXlN=udi0hit<(~*Y1F)F;Jm}J`>XDBemjAOTn(eJGETy(#R!3+=IvokZvhgk25X%r z*iS1k2HVuS-u1BBd;R$26(ozjbXGk7(JlXQG7yQKn!~1Htm79@WHw%Wo*S7ip^zKS z5CUN=0WX)a_Q&{uL=+{~n}GJGusW(#^8`Tjb9~=IH(Iv-_lk*K*V+|xq;ap0iHfe) zHtFDSWO#Wc&Yi{##~V7a#FI+>J=49)!n^Gfv=MZ(^rk%^@;E;Uo-|7@^4REDoibVZ z_Ry+!W%t<8?z|k6Pgo6>E)*^7$pPwVIC$_fG9|(o_=t2>g`=Amw_CI)US*W}@9YQ% zpGGB>v}K-nQYnB_x`jEzt#B5Yqqc;w8ZeTl(&@ypzhsN_E^uLLKj<98yQK6j&{OS= zS)l*F0(HGOg{Zg2(5mXTjZxki91j|d+?xi;q`hrboC!5cwf`LN{;O+A26GJQL3ZKC zXrKUQkA14&E%`e`igS;80ZiGFt4JRw46yoM@%W^zS7Gjl%_HG^dCnw zv*wh5sVEq#WKV=7r>LAoWxH+7f#yCSn`Hw@?PKt|P}rzTg2X-X95@E_Nr3v6QvHtPM!uNu32dk+fK&g$tL~GoMtJ`GG2@dyu2Wv1m_d zR!A09i_|wOoWob9VNB+DEME8m+kySmCKuVEViD;SCv`_^T4(um{TL0Sen@m{m=c8a zIee&R>@G(RS5+0{6@sc+E-I*;7L&nGz7t^qRGPmsT94*?Xg(lIeB} z`j{lDD7hv~tR3xS>~bY^d0$C@rehnZG?(J2>5s8>V|GQ} z78|xLXc9V>g>A|E?k3j-1`$)R9Zyy15BE|dL6NM;cn@&mu2UL8mkFJ8Dt*SBb@8~z(Q<`&Rb;Dq5C zWy(U0bhKnX$){+JTBZ|tE(Sf;&rQeAp5AJz9A&r0D*_}W(2S&e^o1^Wy*R7?DEDSS zX$eXluYAR&%`0DEUNlw0_-I$ znM2gWKxv`OLVcUbLGW67u3&Nezg~TYNIH)ktS3s{9rFNEXgNjB0?cDG2#ac7p3~Mu z5%Xj*&IF>1$F<^3iaCxON(>m~p_(|v;J{0BeN+3%88EANyL&(Q9XGIKr`F2*NKkhs zJ=kKHZRt=sAWTW(tPDnl-q3~ruDE7h5+<=|%4u5p4X*G$2%Z^Q+t)B*M3L1v7lMOj zRZ4L7Y}MM1cpeWA)DUJ=7Zv^50v?WP%?|8%)kQd$oMSQlVFtxH1G&aCl!Eltf8G!W>dyvW6v1v@N+~g=I>QXp$Fq0_G$#qijHj?$Fa%X70_`F>cYFw zYS$QodL~xyvZRWjvX>~W&cyY2%DyKi$NwCC1Ykc7M+a_X+dYB@-LbvfAlXQ0_=V2Oi2 ztH9=%tjh9)Wp?St1J7R|s@4P3L`GoXO?zW4gmsKDX&IQsb&qpKrkfSIDgYV;A|XQCRFJstt?;`^RXks3eb-I%JLrMJdYw{9x_xS8|`f`Fd7I= z<(v1oEa)L-0v6d+6{*qzpTYRqaE&T&Foe&AU}^59R?-e_i8!N-Kaw-h#`@AY#81Q) zT^okUpUrtM{=~b0<^l$=+fp5F{kR^?I~IEac*x%*lXj>dSN9JDJ?GPC41|GWY5~)) z7=K}00e4*mhjC(wNT7OEyBR+=6A}1TyWEc9`B4t-*ST$GYz|_$g0~A(;55S#y23BkS=}=5{L8BI4 zmmn>c{2*dgjPndL+0kCQFIW5IPO~u|Ry6**q0u%4V*;{2=ScN#%u4sFOrF&u98N5N zq3M|!%J(o-gepQzZ>AQo21xvz)at1&Q>r+sb=zYa$zmJDhoKPdws8$L0&^0EC0YKW z50e&mgT2*5jfqTr1zIG{TD~bqrAyBf`zsIN=31c%9IKH(9KhNm0CNF|!Zz;L!W>_R znvv%m``!%<$er4U!AMtaMEm^4Gw@Ej#U)GwB|!(qsvt0yL4y27Bb`}eK^fYW#$V~4 zWGG_gX3MT#g7O(1LC$RIAW&smBzMkxkwGIbnHJ{hjchgdC^%`DyJN+?N>LJP+xIYY z&j$zJgPo*@;q3GID-gc4QI_N5Vqyas1x8CHEb_v#B_cqLyE#&8&JOTr^`7I&U0>Ki zfS{oee%$%uQEVr&LMr|8DNgP5Hi+|A^mDfp<&7e-E?QcQTRtvSf6ei10p216r2Q%C zh^d(MPRrG^dKk5Zw?nUP7|GN72{HJguUzTW&oiX?W@Xq z*>ZfCuO^{x8y65CbdM3z79BoG)oA-yroBc^R9O1x;qcsGP4*$E08%E<&WaAm&awY- zE&=&pbKMFT=xV@`)>&nFO*%065k4K(C!2r&!~YA%N&71&7<(zOPxX@ z>(8s8-*{*!9DFC-jpjw-PTFKW3@!0es-7_ZdgHAe;voH-SaP}03Ke6ZjMWX_4F9>G z6op}{-3dwh%%<14)8*OUxiIIY$%Y%@ZVLp&=EBs!Nl;r{#JL{e-()?S*v*i?r`u|s z^&2tTN>i59o~r#Saxs|^*iqtT6+~a3cPvUN3QLx)p{Uz9wB3WGI~nPaw8@X(;gOKN ztZW$Z`~EAO)(%oa6FJNf6ymilews^f8GCBOuL*WCH_^JSe^d>IPPzuZrn zZ_1Av6UFf|&pO_mdCQHID|BOSAwsFAv!zKgCtMUbIYLo=-RQ1-j#JF?2-B(~EKRkY zMN^nuB(`Z<$L~NqQ68asz>o|iR7?N&7Cdd^+#o7wr6jgsXY|TmAW9+AC1btX@2f@r zCUcSym43d|3L9WXp=5sqyN%I{9aUjwiEt%|Y+#DjCLH2%xRT`3iUGBzS=;LD(CKV$ zxF0gc?F;xKt+ZYr`TvDqU2hkY3deW~liV_dam7XweU?cC`IR8fEtayikC{;Kz)95W zd-tq((W%Tlr+t-vuYQ@O=b|H7{B?v853zVl1DTGH(dC`|6dy)n!Kp=_Ei&dHBn)BO zM40s@#5Bh&nS>*|lzr-e_Z58ZLD}T+-l^@}yo+#K*cDFvo(7X_-r*z3|uD3Hu1H_KMODiQkEw39?(q*kX&wHDkOb(t6nH>qR&c16;`-Q9DDtZ>6f z52(3rxnrT800WQ$(3jk%&H10V%nHAYNsvIU3Vzn}(6~JxF4Dn;AI}nxPdHMbZboY+ zk2%AktuvlrFS_jgYKi?b8uME=btCiDArVC@s$zi3ZRCr&QaX>B8~JrbZU9@H$RH`n zK@UR|rCVgwX)TATuf}>C_Hb96*(Vnp9b5CDj#_|;ixInoxO@U8C$~u|>5qw{OF7pH zA67o4_iu%+NnHtZ3JyGC8xAd8uc?&kZ1a$$lf6ir-E+qjU00+&Zu^8{|Ji1ocy?ag zd}yv^FM{O=xV0XVVCtUm)gLgw6y+ZU`dlb`>so@%rPwJ+U(;^p!q>Xqg zJf^$Maf_ZQGi~R8{T|ZT-NICHIpGr3%EPqzR3Vanq!!C?F-NZpDTE*m6lUAV^7-PN*t#!jdzM?9`h!v?BBy!VLZ#vC0ENEDm9u8jRkv z2Ld_Rr{8|!1OV1(y~8?4QTVC>V)>+4;iY*YuzHpmVa;l@#i*1-BwmO7YUr-Kgls9F zpFK_a$aexc=|R>ix|{(C`PUwvdTS1RM}1VI2I7~OA5pc3cOxVYHshOt6?Ao*OxR?t z*e19XXkL8<^1+Q|ElU2m_aQCu2kSzmwPRk)lUaM{X$HHTyy58jeoAX{&qdDYUn2=j zOo;&#t%2r4FL%>`YMf*Xs@+*`I-^JHo!!3NuDp-&plmDN)l4mdxR+QEh#@z$)qq+} z9Hmu&iaQ1o0uGx4w5=dSKAOFlozO-OSB+_|9Lwaa6$*mL9{ShkXggz!6J8G{;uP*+ z?F@5W$TuLV^Q*5kpR#Fp;>XVTc`G=th1t@sKk(T+ds@)aiise)fT z2muT4hDmCl-AJ<;eonXoP(mh!&f7!?Y&7`5^(A?0k9aQAep?lrMWx*oJT1Co!qRW| zdmfr#7nn1CQ{UXm&1jf*x}F+KM(!}QSwL2c|MJ_8roUhYKBPo`ZeOoe)L-^y_i5P^ z7cb+?k*lyDEWF#>BpQj9Hwkp># zvgccnQ6YW%wB}*kQ%MJ##u!Hv;NklG);Cbe%w)!xiOJ~2lNj_WHs4P72GV=}u^-_$ zjIY=08edcIRjOrU1g_q3Qof`BeZ=tqX>_eI_W_g53b7P}jeg1YaEPNX*UL zKTP)Ad4G-es2!(pkA+{H>_*UTUWWaU1n_(PWZ2-KJ)QC)lf&%MV$T9wm4H^c;g2$< z%H*b5bD}@X3XRicXjaE#9##@y{GhZj6#bq{Zh6=?vu%0eza4A zh~9Z#jEn^UlifFsi)?|0g6l!!K-QkO)0x=1orp9FCq8p|HR4z~^57++VCCH$h}I}+ z^T%q|G4tL+Gm}Ks($rm7nyt|I!=sn1+GH^~f`}}_XtmD<8z} z#TptO!!4js5*oGeaa(U%aus0G7rf!K(pUg5lxqj|^@Q;=TR4nFP7OgWf(Ot1|2;3-UbavWmV~cXk#3skEM!5ktW+St$cl2 z15zHdvL>f48FeFg7ZF3t(V>M&$2vsJ2EicJ46sc3x|K`qPjT(imnrQ}rQ$s2Lt3D+ zj(wA}>LlxF`iVu>KvuSN*e|DG;wPVO=M*?cix(nIUKh%dCA8SQerH0A8;6Gwy5 zEDgy;&w?8acr)6RT9PZ2)g+$3j{e;iFOxw&@-o+D;AB`pSuDttg9n_HE^LWa5?r1i z5NN&mD*O{67L_)P_fw~A%DWWX3iq(Hq7Jfsl1JcVVX}mdR_vc03t%!+YvirGaeL0j zjjBVD&9o0bF0{iv{BLe0^98$0RU)>ykD8T4GyEMKCX!3cvuF z)XA*0C=eqer`gG`karxSI3AXF+IQ;91?mSUxqY~&n3b@YZkIOlYON4w1d9-NxFjMk zto5M-LIC(!xC^@7_w0?!9*mJ{Lac(Bs@O0fyPUw-2!v{OBjeYW7}12v;32%wQ2<-` z&j0|qttm|*r5o+uV`6^hERYyi8;tv6h~C@hBFfyNQ3YAJjl7SuJg^>n#5@`I)A z^uMzte9_uQP8apRPr*>^|1dvLI}P7qB%^V_4Z^1P_0!CWd~0XOH&;OVb+|{9!R2j$ zO!C=Sl*5wV>)z%I%+twKZ&sGPa1+zQOm*kP?&}2W8L*NozP7qu3<}#?AQsWo5?six z(17$oXQ3&>+_kh>|4VdTPto@8InO2ImUQ?tD^pE5%N@wvbl}l*D&-s@^D=YYw1GeM zMbh$sV+uSP8+PbjiCC{r`6sc}!|n`6&U=AmkN08E1ZglA*DlP7>61duBb$DuNytGI&(V!T}TXLH-Gh2D~^@ zypZ`t$t&kP@tcF|i+U>=qDrm6fA}a2h#kOjnu}iq=q`|$x|FO10yMU@yv7B+QN&Dt(-(0tW&rekCEFCG0_U<#bNJjuf-F|{bRsE!~K zP#(D@a}r6Nj2E%&&s*`P{IOWpX_PT?3_N5PFGoz+`hzYhkM;X$MUM-cw{9k!l*#Sa zuK_!1M8H3m8Ft~aB?jy}fPP+<4cj%^)YQS}JZzD2bSfKh zkU2aK?Q5CR!f-c>iL2*ux5WK^+}w36?;HZ2#wcoHg#JK(zr9Ygnr*iJVtm2F^p^3j zi{4K6w|tD1os&^9WaV5_hZIAM!{lGVPe7Ez zxJR=4<-s#U@I4o`dUPS#k7nR104D<#u1uwFKDV})AHVN&h7*omg^F0njp1ThTD zKWAGIfHhlX>(CM@&ZxQWd5iWF7ekaFb+pV~BsA5!7!FIbRXDpyZcL;zYVJx72i%`2 zG`Elv2M@1x>$qq;ZS2cZnwgf0pkVPWS6~YUm0FJ42Kky;|F7OZ%8YN#yxoK>9qETF z@%HgCF&I|yavjrZi>ZTy*MZs(xxxl&T+md9&L~3c@GMC5jb>`C_I(F%?OHo`kaiC z_244p=uOQnotY48yxlX=xS9%w6gZt{=ooQZ42lRW6tmMynZU&=tr9DHcgA(i|zt?S$#kPRm0LSEU336Kuk*Yjij}Xvq)(szyEYAw?)IGg?f33aGaW|y*uRN9)^=Ddq5Z(rP@)xil~5E4IsmvdFRB%X=r0NOfuZI$4lq>`+jqkORM7FN z282h_lcdwyrerg^8Ki$6oswCV8>e;fX*cJJB&lESz;~od6;S-tKoa`8v>)DeJTB%} z5BeKD_n%Xbmf`J`Q~`PePE_<2<65d@s~|_Sl3fUm6B2uY&$jQuX$L79EUvR+DVqBd zoSKiu_+@_d|MNNOZ-J8~fpP5XWex`ic;CPh%DY)fqN04nb;I)oqv(!pQL|UmP8^Jg zKkb$xXzFnQ_6d#x&@?#n$eCYwET#@36qQflFmym)9eE;+6@Z7u;`huaX$J7=te|C4 z7Su`>c-pn(w`cIl9b~Y59s7lws_39pH;ILvcD@Y3=h8js;cRL|$JJo|P$L}aL+#as zlBN^)iBcsJ{HBmIu6=-5Rx zTR2?JJ|}1gDRme+Jo2Te_SYirg>zdP}tW zSdCs5%QC$9SuS1VTXYFG&7RYXiv=aj+($OUl^L}GP(C+Mn+pyp?GN>!Mqwv|M|h^+ zm`^`6)p7s zW-TJl|B@dtps*1&aex^Z3_>o@X{5{$#zTVffBl7(>cTqxD-iQ-xV?!Lcn3%6so{>F z!K$ps*!%POwn9YKCefC4C8Np4FJ;mg?GXaAHS!S99Q7t+XD%00tScG=P`b=6WJw*Q zAHgo=KOn-Bg%c#YP|;;@KSz(RgoX)lytvqt+}SSKVV5Tl3-OUunugAI=4qAD(_pD3 zV^5?`M;gO>9Lv|5!)$2@YK=db#mp{`99rs6I}5tfh@iz4RTC_71rK{kEYld^L6rr) zr-mIE*rQM@jQmU|t^#f{Hci7Fph}}|uwGJ|3j3kQ4$p_!xof2`8iJrxrGzcBc%-J{ zM8F7ux+~D)gVkVqO;hBr?A2C0$QiUby;-bUpz~GwmZgqBa66YrxqUt7bkt8H8O&AL z!_v4QXK=zVOCh7?*>ofmV?2Rfy6&2a=3OR%#7t?;>Z$Fz*2euQk8l-ZZsUn;?D3VUWC_#DN;kW4 z%9D0OKNaQpdz7N}&E}uy^frtNj*93Uz^h;=7uuWPV6^-S`rT0_Wg&<;osc^8pBdqW z*gz(sish1$9{_1C_T^b$T*0Ej*}SJoUE3v>#UsBg(2O7-o5~0_|Q*1WfXw;)ar?$gJ z0S*zQ3V^DcD@X7nt_aU3SCv+d?|WGd_P`zK90$H)i_5f8+t^I~7lo^-(u{3ZP$oGz zz$}>S^kdm|0+wD1(-^;eHnzidX)vNRpJIq38*VFqW9qw{RFe`Sw8Kqvjs6kQTr|hj zg|e1-rM5FpuZ`;bj)3k)r`%ex6cFiv^JMfM*R3Gxt+0QX%^w6x>)gL7mr%pn&n(<6 zUYUN;b&WRt6?Esp$d-$mZ3SUmmWt`5A~h|rfx3Q%_GQ2Ms5w+ z#lq`mCJ1)F*{v&zFO`e9D4qi8L`AdC*i0RZKq+ybf-bQIr8QVH#^v+z&j!W=JNM0U zg_R^N2*7kN3yTTOYE&t+e$h@nS|zwl*tK+nF)QWE%kn1XzMLsX(J4klVSlJ#&oO`K zqv);CkwBI}RlBw3!1*r1DoE9w~hyn3wdHs zl9yYY(Y!JDEm8dOs5;f=I?YxOEqKUv*W4U=Fbs-4glM*g|at z*jD319pOY^q~$`myVwD~d(**zM&J9=IXt@kJ%b~mU(ICszrO1@Y?G6QGukbIY-An6 zu&utwWC*PYP>a9^bld-7!_bcVAzNXFfh!Fu&r%7x5}_=egu>I;VdJs86$RNIFQkP=4h7{&{5u>WjrNbCo!ZC)TM zSR1WFuv~y)h*?|y`+=2A27%C}JW18Cw`Van9}|T$?RBR%L|%U@j@BH2+bu6OC?dfC zB+vL{gBa)8N~M-Lzy%G(#6s8!327%Xr9FMGoFgEi_~DiJiHB#}-3IZD>+)r1my*g9N9HKhyW!dwP# zX*Zf>>E^?DCXltT0Sz4A8QpO%&*_g8hF@|CQrpP}PY}QnH@aetNU*8k{%p;M&`g{$ zes>2Q@;Wf&wOr$5nQepZ0y#|d!xB_L;@t&9E3vM$H|iIV)YvCO@<8M<{C*@$U^#Bi%|73nO3Ag8>StS*~WOp1&N|yA&HLvT1lFY2DC@Ki{ttCBw z75Kd)pjODZ3X!-^dGmiW59UcW+&}?}TlU_V7h4UsTElpk7g-imitA9AU?9khoA(8_ z^3+Shz##k>#3of|m{=UHFKO|+G}flwqr^g)Z!c$FAVsiWA-LV`G?2Co(h0sC9jYmY zPEyfsO5Yx#B;^wsy9tCMR9(mk7#Fr%$#(QH$&Ms1r}Ind*j9`Dx~sUe?IZfZa`J>yL)ColN% zb+II2(d|4#9&uyk#R>iBVP2IE0+^gTet55AUEF_iu|wG?QyZRDU8T2d%~|u{+8-)3 z2X~XC_`I@?i+Aq2p&j!HqSv#3v%T<{^6g6&^ABMK)U)7kt*et$0v+iL0^j43ywV>n=x56l>;^hE>28*^iB)c zS1e6J8LTo%5qS(CF?s0*$z^Vh%}i7o#3*j&_KTD>xht;6cdM(HZ)1C>+zQL9KD{|uQ=yR7>k`u1u(k8W+cW> zVRu%mo2%_Hjc5|D(u&#=>NQ*-JDKJfi7vt6<3!vNS!WG-Th`Qj=w2yq6#LjBv{ev5}BN(6<# z5jx7I+ZK-dM*Gh1_;T2yT_z4^Jv@GI!VH0Q6#y(Bh~op$x8fx9O(~XSX6*MP=eON; z(rM+xhBL=zm#PA4wI|~ev_ECR1oml7)Q?d|?NTs5E3tP*K*2z{_nB6A%l4xtMsk_D zpC~x+z`Vp=IPO+geHSd;_3ls2!(H}68A&T{Ff=!Lw_TDbb)(HKK&V?OlaA(!^Nky@ z9GLUyNi2Cu)e(nW@2Zz$J93J-XfC%Wu$|=9xpn2Ag0l@mdq&C9i8w%IjG%;0nY~;U z6Vnu>h4)zSm}Gq#;QEWNw-lGN6V+oH)IzYZm(XN+*smMyA?NfxR^f4{C$5$)C%dx+ zSin)pClLgy(0()0`mF}NTc@gef?Un1EbfL{#C~da3-)<#aaCS0h?FkgDB^Q7>00zU z$zdRLFEC}R%8m^m*#m!jm(aKc?5=Ms72VrvkmuK@M6)@FngyC|h5FulbbA4VFFn*6 zk?=vdm1rosCn46{opux4?RnLS!FDSyVu*DQGEdO!OTsf1mz{5-yjtzUT*Sp)Y=R2i z%wsZE)_}|-BiJ>?goY3h3yAMB)w8Wlj3`VjJ#$?fIDf(2DezRI-OD0)1xP2LE}LPO8Vb4c{DEGA!%@A^YENo@xU%pR%;GAn`q>8- z>P2OH(N=>0eYzp8BmDFIQbsvr_rs6vv2H*hw;6#e&sJNyI?!G=<3u0G6p5&aKQYz} zu%KDZ=}z*(Cf+PhzUdz_oLMPKE(%!*xaRJVc#zo}xT;gNRKDl+S$q^xA;?`HYqJ(U zqY;C4W=rh`!Joa|S8GtMX3rZ1q7r#ZuG0KuA<1KPx|2c8(a(q|wL0`&)L;9V-szBj zdy6yyVZFLKcjaoL^yS7_-a=2TH*YvOsGO8f8VLiv(fLJ zFirYf1R_E}(H)x5%=g8t0g*rtoyffi2#XV6mbkfi+`8n5o37)&YCg>3#1Er#uOi?@ z%g)p1s=CPOfP`OF-S8Mh;VseKDB;ok%__HXzfHkv!70u%j>m++yrDWkEmecv?bNZ9 zL8F%^zm$q0SM(q&mwd;JmYe|$TJiW>V67J2^iIt${^MS1%tXELY_(u zkKkQ)`Vf*ucoA9A;6d7KLz!C&7R4S+k~xN?2_PurfvcHK#;o31W)Ij=X&}z zFykE4;}DMmOZQYbMcPc&DB^@3B>GU}GZ*&q!yXZqE=Pc;Jwg8{@Shco5#j(=o=J|F z&!wwxy-s8SkLy>V2uS2mJ=*lxiDGohLhPDm&vCBY#TRk|Mx}CdtbEN=Y@Gne4N+>y z{zVwsO-Av<#jJ)gd?(p}x8{q;;jDK4Y6>u}OZohQ8`q~+9+8$ikO`&kTqWiSE%wnTt-2&M4u@vPsQ}z~9mGF@22kRhXM0EEq_l z5Jy~BI+05VOx*`nP(nYo&&0=a3QxC4RHNriXS_~TT?aInu})L!>!n4Jt;_v{!g2+9d(P(PH36>b%)GAuLp6#tXRbeIoIap+!gTc)z_ z4I2g4MEv`%>2+*=J$e|u^bRo2eJ*Am*9co$TqU&ErEz`oh6oD5XT%e;sy} zzq)e@wG5NEG6681gt6FE{f)NaPl(t@7EZs!x^m7;FomNL1hl-9DWm~stv=y`$@?Ot zdwTdE*88&_apK6G0aV1!=t8rcc(}w@#A}sy3}Z69D`EGw?ghS0;^+VQVzYw4je;i3 zaG*YpUoeOeSS^IpWK~{2u(ampvTn^fwSzKzT9(4h8{+#k7OU0zuK5fikT~TL_{lX# z%G(*Mf%-L(dKq>aY|dRCK`eh~L$FU`WyHN&H8tGoECs^)_uf%n!oX_+2zbNKBD?_~ zJP3{<^|u2l{(!GaY(`zJV$d`~eD*eQG_u24N=>RAzL&+C>Kn`5*uB>&DXJ9k<)wHN zw4huWn=@(vrYTT-#=cj>2{&o7V09+e+i0q|_690?6SxdeiRQWxF7)HNV^sN!@(j&G z3ru0g$`nI+5;9wh3=XK+X#y_6D zSa%aeP3q~HW}uLJWu{HibGZCHK{Z$fYZYzsLwZ^T-)&H{EWgVG!{C3e11=tpX#!YW zpQ4SB{O2T=S5?&lZaNk>U$Rs}2bV-2f4pk+wLuai-GH#%E`hN)l&C`ZAsvOfE#S*v z+2v2S&lg1xdI%;s_%ibnvdZEttd3&d{INbiJASBVA0`8F}ARWUjH> zv?pRy$zL$??De}SsS&;YSJ81AlkUoF{@1~0>v9L3{pP|IO5kLFduG!6e$oTz+}F?7 z=0D>lqHJKfW1e0w`5V=0sCYD!P-XojfrR)r{|c{W3yl!o=0gSGfak{^G!% z>^(Z|{cw(16uxY%&%viU=hf^d$x{Ue+VD91717$OWMSh6YJna;n2*swmX4U3KXw9A^~rGq&xA~jxM})w z?+Q~^$4{X;exFG4Q%+6L5noXrO3bP1n8L)AAhDXxb5|%&AqP>yyKXdRd6?T3T+h}~ zWHiz;QC}_d{e;dADaMKSyJf7oN(uHfciO0Dw8;N31*3b z*Q(xs971R*Wx|&r&5v>hV(V~j^EF+@ciV`yct)C3BuyXeQM$M$>piyd@p!>9sT22%3wn?C?I6N5@iBXl@6($bI;Li|$7AKw&EkN2G&=aRV2^5d5*Rp!N+#<#8{uN4azkLxLh}Ip9o>tC zY)V49$Jg*FY*ozBz0hV?=FCv--sGulJrObb_L=!wG#J zZlCu`T={btQ5XLGJq?MGmhWoY{cz7@Op~x;bcae(gGv`9!b+z&i=y3mcAl5?S#w~J z{TP5>U!lo}6wuR3phW%79nMi(43hDL;XiVC75sQDAYOsdjGwpT@bmibEOl*f<9$7o zL%Tz=@{IRW4Pjtv0JC{sX6sPaC1*{}B z7Qt9VZFPVaP!ID!p}s7{BJgwFx=`RLcx;yV?pr{+l!@s{+Tlm*zJ~95u5`ST@8^4g zN9KYiJpL^?j5ZgXTj~C%LGP8*aSP|H8aThbqv>z0;m#k%F9ggA) zLP$9z#~X%4B{~g#+#^5o;_$>YZ>F8$?Q{5vhj&VCe z{;{Iv%cu_#O=hI9ov%X$)Ugd&;sDCMs=i!#z7??4nx&_2x!#;V%n?goyV$RhT}zDu zWf?TITX8%L6pk0kc1Mkd0e}qt|LCU>zN)ptG9l|01KHs13>KL<8EhzU=CdTw^D|tS zZ9HoT0;7qe$Nr@@ufeed`a*ASYrc>|8Yh!Of%oWUfbO;Bo~MgA;dd?Z-E0P(_&pAS zXH=_Mm@M?aS}>E-k?s<)W#b#B?9|D zS`hB66%``l!46PGoShh;faXM!uzy(*kCBK?G5*DHMZ^p9Pl{`5P%L5K*@{rdgxr>L zH`H?z0+1iW*CdtAoVWkyL;VX5JQi3jB4zMilp>X!JC14D^zl74kcq2G%F^QBeH|PW zj1A>-*Q>q2e|V)fU{y<7rqqIYh^FUGgwOa5WizsCI?h|{B5y8r6BbwcWtwW8FogWm zY_%O!qvQN;R4E1pMZZoiaso0H6~n6YIWXG64SAGoxC&K|q|#AS%nZZs`Pfj!{o|*9 z^dPhbw6N78OFRIlRsid-+9jkM7hlg+PVSh+0#KibF+;Ls^qyR}AqOc~-t8v@y4g~& z*+Vt;yvgJiv=);J2$hhP(EiIPd9HhFuPc$24!+bfawB+~25mR_;D5$DcEPJIC0=xi z{H>S{P#ueSM#Ubty1}v?x!9HuWb& z%;D&X)?U5`z@z~|iy0e=3fXvb5j5sJ16HMuc<}{SSM$yNUnDI>@uWiq*ni&pf5rvh zf~unCF^>)pnA_1ap`Nb{24$UxLJ{U2d)g%g^uB6S_(t;b4EB2Q12a^}6v=$Lf1Ol% zy@xq>m*i)dDi&iFx9g}carmA@uC@WuBIrlwkbXKy;GA$x}yq$vgVcnpxu zOS9}tdhDf5-p{0Uk!%eO=BG~AihXJr_KFKUi+1F2C2j4*k>3Fnvqz^ec;jkW5E_kv zO$R?1<;8s=_B(V&QB3As;#&nzc>q##;fjag|iQRxV3ff(a6*V79r%2FYEifswH( z8m)%`QyeLhL?YaPP!WD@lQC%Qjiq8m`N&YE-ZWr>8Ca~aX2({H_!~U*s>v-UXpm%b zmdB`QRTsZ;Kapj8tv47R^UGPwqVB7u*yaIb1)KT=sv+vdErTA72?c9nt1d#d4(8!p z4t7L;{s4}?9`xwd64h47b*maoa{vc>$zL}@{J;KvEa}(6+*H>67OuBM?ao;S_e&+8 z*uIu$@=z~(s92BjkkcFLC_FQ0*2 zaD|(WQK+$BFKd#GZK-{h`DH$T7M&VVaxr9VgWui)z8c-VJ*Sk^$+DDCG0magyMU!* zUC{qvDOpLXQ(d*hM+*yCCE}(%o>5{TK}L)p&$(&KOqA75vYnY&|pth0ft%} zBZD`3h*k|5SG$5jFRhv$6U`bG%%CkliCTQrtqF#ZCwq!!Q#V*@-b+>Y>oMwseo>ql zjan;_+jO7)rjB@h_Mov)3s7fH!tRApCIJ> z?EWx|mrdPToJrpgqlJ`hl#r3uw>#N$J^paH_}H1VOc$CdMOZPm8^lF=4)jS`Dh!Y0 zrZ;_nZT4aGdYLQ)xBH4#!bFJxUTv;cZikvpKMYFCLOcQ7_!YP+5l0-wIo-;~@_lC! zS$B_Uj~md7zELO2YULU+9XD}hNq|0TD0;HB-I;^TokrMizWdXVVB2a z8DnIe(B`Nt&A%Xa@<^)jJv+|8p3^Q5qQoGR=c5aPqudTepobA7-AeRPcu~Z^ElIE} z3yEw;7;LKl&BFAA^iJ>pyfo&N^d22XmE7Mdp0J@7YOc zU_SYb2|gF}aaWb}Wnzdj>hD(8BEml~f^WB9Kn~$$x@zj-MQ*qd-LLcgf{|7aJm?}J K)LVU4SZMNPYqQP( literal 0 HcmV?d00001 diff --git a/src/documents/tests/samples/documents/thumbnails/0000002.png.gpg b/src/documents/tests/samples/documents/thumbnails/0000004.png.gpg similarity index 100% rename from src/documents/tests/samples/documents/thumbnails/0000002.png.gpg rename to src/documents/tests/samples/documents/thumbnails/0000004.png.gpg diff --git a/src/documents/tests/test_management_exporter.py b/src/documents/tests/test_management_exporter.py index d6e7ad6e0..e3fef6b78 100644 --- a/src/documents/tests/test_management_exporter.py +++ b/src/documents/tests/test_management_exporter.py @@ -24,6 +24,8 @@ class TestExportImport(DirectoriesMixin, TestCase): self.d1 = Document.objects.create(content="Content", checksum="42995833e01aea9b3edee44bbfdd7ce1", archive_checksum="62acb0bcbfbcaa62ca6ad3668e4e404b", title="wow1", filename="0000001.pdf", mime_type="application/pdf") self.d2 = Document.objects.create(content="Content", checksum="9c9691e51741c1f4f41a20896af31770", title="wow2", filename="0000002.pdf", mime_type="application/pdf") self.d3 = Document.objects.create(content="Content", checksum="d38d7ed02e988e072caf924e0f3fcb76", title="wow2", filename="0000003.pdf", mime_type="application/pdf") + self.d4 = Document.objects.create(content="Content", checksum="82186aaa94f0b98697d704b90fd1c072", title="wow_dec", filename="0000004.pdf.gpg", mime_type="application/pdf", storage_type=Document.STORAGE_TYPE_GPG) + self.t1 = Tag.objects.create(name="t") self.dt1 = DocumentType.objects.create(name="dt") self.c1 = Correspondent.objects.create(name="c") @@ -34,6 +36,9 @@ class TestExportImport(DirectoriesMixin, TestCase): self.d1.save() super(TestExportImport, self).setUp() + @override_settings( + PASSPHRASE="test" + ) def _do_export(self, use_filename_format=False, compare_checksums=False): args = ['document_exporter', self.target] if use_filename_format: @@ -54,8 +59,8 @@ class TestExportImport(DirectoriesMixin, TestCase): manifest = self._do_export(use_filename_format=use_filename_format) - self.assertEqual(len(manifest), 6) - self.assertEqual(len(list(filter(lambda e: e['model'] == 'documents.document', manifest))), 3) + self.assertEqual(len(manifest), 7) + self.assertEqual(len(list(filter(lambda e: e['model'] == 'documents.document', manifest))), 4) self.assertTrue(os.path.exists(os.path.join(self.target, "manifest.json"))) @@ -69,6 +74,8 @@ class TestExportImport(DirectoriesMixin, TestCase): checksum = hashlib.md5(f.read()).hexdigest() self.assertEqual(checksum, element['fields']['checksum']) + self.assertEqual(element['fields']['storage_type'], Document.STORAGE_TYPE_UNENCRYPTED) + if document_exporter.EXPORTER_ARCHIVE_NAME in element: fname = os.path.join(self.target, element[document_exporter.EXPORTER_ARCHIVE_NAME]) self.assertTrue(os.path.exists(fname)) @@ -78,7 +85,7 @@ class TestExportImport(DirectoriesMixin, TestCase): self.assertEqual(checksum, element['fields']['archive_checksum']) with paperless_environment() as dirs: - self.assertEqual(Document.objects.count(), 3) + self.assertEqual(Document.objects.count(), 4) Document.objects.all().delete() Correspondent.objects.all().delete() DocumentType.objects.all().delete() @@ -86,13 +93,14 @@ class TestExportImport(DirectoriesMixin, TestCase): self.assertEqual(Document.objects.count(), 0) call_command('document_importer', self.target) - self.assertEqual(Document.objects.count(), 3) + self.assertEqual(Document.objects.count(), 4) self.assertEqual(Tag.objects.count(), 1) self.assertEqual(Correspondent.objects.count(), 1) self.assertEqual(DocumentType.objects.count(), 1) self.assertEqual(Document.objects.get(id=self.d1.id).title, "wow1") self.assertEqual(Document.objects.get(id=self.d2.id).title, "wow2") self.assertEqual(Document.objects.get(id=self.d3.id).title, "wow2") + self.assertEqual(Document.objects.get(id=self.d4.id).title, "wow_dec") messages = check_sanity() # everything is alright after the test self.assertEqual(len(messages), 0, str([str(m) for m in messages]))