From 95b645eea9cda5c5f1155b6f1e1fa1df9a880b16 Mon Sep 17 00:00:00 2001 From: Feenix <25067102+NayamAmarshe@users.noreply.github.com> Date: Sat, 20 Aug 2022 19:04:08 +0530 Subject: [PATCH] Fixed compilation --- .gitignore | 2 + .idea/misc.xml | 4 + comepress_pyinstaller.py | 195 ----------------------------- loading.svg | 55 -------- logo.ico | Bin 43053 -> 0 bytes main.py | 40 +++--- main.spec | 10 +- checked.svg => res/checked.svg | 0 comepress.ui => res/comepress.ui | 12 +- folder.png => res/folder.png | Bin res/inbox_tray_3d.ico | Bin 0 -> 4286 bytes logo.png => res/logo.png | Bin unchecked.svg => res/unchecked.svg | 0 13 files changed, 39 insertions(+), 279 deletions(-) create mode 100644 .gitignore create mode 100644 .idea/misc.xml delete mode 100644 comepress_pyinstaller.py delete mode 100644 loading.svg delete mode 100644 logo.ico rename checked.svg => res/checked.svg (100%) rename comepress.ui => res/comepress.ui (95%) rename folder.png => res/folder.png (100%) create mode 100644 res/inbox_tray_3d.ico rename logo.png => res/logo.png (100%) rename unchecked.svg => res/unchecked.svg (100%) diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..edd9d60 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +build/ +dist/ diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..d1e22ec --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/comepress_pyinstaller.py b/comepress_pyinstaller.py deleted file mode 100644 index c0c3d8b..0000000 --- a/comepress_pyinstaller.py +++ /dev/null @@ -1,195 +0,0 @@ -import fnmatch -import glob -import os -import shutil -import sys -from os.path import isdir, join -from pathlib import Path - -from PIL import Image -from pynput.keyboard import Key, Listener -from PyQt5 import QtCore, QtGui, QtWidgets, uic -from PyQt5.QtGui import QCursor -from PyQt5.QtWidgets import * - -mode = "folder" # or "folder" -os.chdir(sys._MEIPASS) - -def restart_program(): - python = sys.executable - os.execl(python, python, * sys.argv) - - -def include_patterns(*patterns): - def _ignore_patterns(path, all_names): - # Determine names which match one or more patterns (that shouldn't be - # ignored). - keep = (name for pattern in patterns - for name in fnmatch.filter(all_names, pattern)) - # Ignore file names which *didn't* match any of the patterns given that - # aren't directory names. - dir_names = (name for name in all_names if isdir(join(path, name))) - return set(all_names) - set(keep) - set(dir_names) - - return _ignore_patterns - - -def ignore_list(path, files): - filesToIgnore = [] - for fileName in files: - fullFileName = os.path.join(os.path.normpath(path), fileName) - if (not os.path.isdir(fullFileName) - and not fileName.endswith('jpg') - and not fileName.endswith('jpeg') - and not fileName.endswith('png') - and not fileName.endswith('mp4')): - filesToIgnore.append(fileName) - return filesToIgnore - - -class MyGUI(QMainWindow): - def __init__(self): - super(MyGUI, self).__init__() - uic.loadUi("comepress.ui", self) - - # Remove Titlebar and background - self.setWindowFlags(QtCore.Qt.FramelessWindowHint) - self.setAttribute(QtCore.Qt.WA_TranslucentBackground) - self.setStyleSheet("""QToolTip { - border: none; - color: white; - }""") - # BUTTONS - self.pushButton.clicked.connect(self.browse) - - self.checkBox.clicked.connect(self.checked) - self.checkBox.setCursor(QCursor(QtCore.Qt.PointingHandCursor)) - - self.closeButton.clicked.connect(self.close) - self.closeButton.setToolTip("Close") - self.closeButton.setCursor(QCursor(QtCore.Qt.PointingHandCursor)) - - self.minimizeButton.clicked.connect(self.showMinimized) - self.minimizeButton.setToolTip("Minimize") - self.minimizeButton.setCursor(QCursor(QtCore.Qt.PointingHandCursor)) - - self.setAcceptDrops(True) - - # DEFAULT VARIABLES - self.backup = True - self.dragPos = QtCore.QPoint() - - self.show() - - def mousePressEvent(self, event): - self.dragPos = event.globalPos() - - def mouseMoveEvent(self, event): - if event.buttons() == QtCore.Qt.LeftButton: - self.move(self.pos() + event.globalPos() - self.dragPos) - self.dragPos = event.globalPos() - event.accept() - - def checked(self): - if self.checkBox.isChecked(): - self.backup = True - else: - self.backup = False - - def browse(self): - folder_path = QtWidgets.QFileDialog.getExistingDirectory( - self, "Select a Folder") - self.comepress_folder(folder_path) - alert_dialog = QMessageBox.information( - self, "All good!", "Successfully comepressed all files/folders") - - def dragEnterEvent(self, event): - if event.mimeData().hasUrls(): - event.accept() - else: - event.ignore() - - def dropEvent(self, event): - allowed_types = ["image/jpeg", "image/jpg", - "image/png", "inode/directory"] - dropped_files_folders = [] - db = QtCore.QMimeDatabase() - - for url in event.mimeData().urls(): - mimetype = db.mimeTypeForUrl(url) - if mimetype.name() in allowed_types: - dropped_files_folders.append( - tuple([url.toLocalFile(), mimetype.name()])) - - for file_folder_path in dropped_files_folders: - if file_folder_path[1] == "inode/directory": - self.comepress_folder(file_folder_path[0]) - - else: - self.comepress_file(file_folder_path[0]) - alert_dialog = QMessageBox.information( - self, "All good!", "Successfully comepressed all files/folders") - - def comepress_folder(self, folder_path): - # Get parent folder path - parent_folder = os.path.abspath( - os.path.join(folder_path, os.pardir)) - # Get folder name - folder_name = os.path.basename(folder_path) - # Destination backup - if os.path.isdir(folder_path + "_COMEPRESS"): - shutil.rmtree(folder_path + "_COMEPRESS") - backup_destination = os.path.abspath( - folder_path + "_COMEPRESS") - # Backup folder - print(f"backup: {self.backup}") - if self.backup == True: - shutil.copytree(folder_path, backup_destination, - ignore=include_patterns("*.png", "*.jpg", "*.jpeg")) - - # Loop through all the files in the folder - for root, dirs, files in os.walk(folder_path): - for file in files: - # If file is an image - if file.endswith(tuple([".jpg", ".jpeg", ".png"])): - # Convert to WebP - try: - img = Image.open(root + "/" + file) - except: - alert_dialog = QMessageBox.information( - self, "Error!", "Please check if " + root + "/" + file + " is not corrupt") - return - img = img.save(root + "/" + file.rsplit(".", 1) - [0] + ".webp", "webp") - # Remove original file - os.remove(root + "/" + file) - - def comepress_file(self, file_path): - # GET DETAILS - parent_folder = os.path.abspath( - os.path.join(file_path, os.pardir)) - file_name = os.path.basename(file_path) - destination_path = parent_folder + "/ORIGINAL_" + file_name - # BACKUP - if self.backup: - shutil.copyfile(file_path, destination_path) - # CONVERT - try: - img = Image.open(parent_folder + "/" + file_name) - except: - alert_dialog = QMessageBox.information( - self, "Error!", "Please check if " + parent_folder + "/" + file_name + " is not corrupt") - return - img = img.save(parent_folder + "/" + file_name.rsplit(".", 1) - [0] + ".webp", "webp") - os.remove(parent_folder + "/" + file_name) - - -def main(): - app = QApplication([]) - window = MyGUI() - app.exec() - - -if __name__ == "__main__": - main() diff --git a/loading.svg b/loading.svg deleted file mode 100644 index 17ec48f..0000000 --- a/loading.svg +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/logo.ico b/logo.ico deleted file mode 100644 index f7d178c4e4fb9a3d0062ebb2e6e42bb2f6be8dca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43053 zcmX6^1yCGK)4s!L)0w@6lr2qi_dpSZ~RSq4680Ec)t{^Y{@xQPCJxB=eFFlu1 zi~nk_ALS&0%fl>?_X@I;ypAgXfQs|q0|aDb5dr`uZ3@y7pFFZo+J~!Xl~NhLjjf4< z3R`YuZ9M-gbFdLdpD*|nSZq~eBOQtVadsS~=1g`x2M_f%5+C&ymap10C@xN06Z`S# zF_gbE^}(gh6z$A`lv_Aar*Hf&`N#|F-=7pBeroXA`1tq)R5&QT!O8HppngLQdTNvw z>blrf2)UJe`&-xfb|0Jb^02pynRA9E=E-Kf1GsvC7&XM7Yp(2?8Ap}H=h+DoX5 zG$laLwT96MLo2yQWhP1GlMmebudfeoRNmy;xZ0`P=^0=sCpI?WK1#a#75v&fpKe z!EUtUfLrH^@%K%F52uwRPKLj+cPLT~E(}d9Opf$U9KC4u36GST%Un`}12!1b43A3J z{!J+UMj7w-nQ~_4_xr={{pAe4D<_FkIftml$gfv}8q?>?5*BWx7 z4z&>86};p{xr+SEx_$W67vaOL*G;^y_=RXtK-^Q&1jh~Q6 zZpG&wW0b>-F0uviAHc^h_2kGBs5@yqW9+wLX&nCTzRie$|6lGD6!9Qt+yx>zS%KKj z%=O-n|H?m9W&1R$j@&TQ!k9*njdrIC^|i52i=WvpzaMOEPKFgn$J}VvWQ~xdN$zma;+;Zb$os=^|Cy!13 zO-Qus`Dn*~%}VH+^U7s7zrFGwd>`*cE{cwHA~Cz)VkGLacA)fCDT!v12hoDH(+DKU z!k5|e3JT_4@n)KUFq~8akL6Fbi2qY-rjoxF3&bIHOO%!=-#v-Nrxb+0(0F%LW!1lYxBY` z&NBUTC0$IsIvPP7>N$={F4=}==VWDs$N?UrO%4s3^-hx)Plo?5w~OkA0&Zf$i{wK@ zD~CKAJLiY_i|&Gt=IRHwIs9=tUg}BePiQb9#2NrW{t-2ktE=Bq;Pxe1tZ4qJVZ1wY zivQoxSIoWk2YJ&H>Dvrf?jcqDN#3As(8>0{fe8-I&lYwN*Npg&C^*;HyR3QcVdw{) z>`(s>CMF{Ow16EUUs&2hogLC#gP3Q)KW>f_?KG&(;Bkaqo$%$!SMPOY_+m}oy`h;f z9~`P3cmvG5@&KIJ2ltK7D))#W8e$O^SiXg56Q0PrR8Z0vQX01yKRgE zY^uCYl-v$lCn|Qfk=xE)b@Pj;J9EST$uyzY8vvGI2u?6`B_)@pEV@b*Hi9#lDKx8MUJMh6Kq7I&u0={|5NS~8Ln4Jr+>yJ z^`y@2h|@cK;{$k69e>BQjEyZo0!_}9R^IXWCrC-wGS}pclamqsaVKvzm#k~4?aX&D zMrw-PG<`*;W`4bUJH|9t@4(IMVPk1`Sm9i zmegFGiS6(|#JHAj!} z5W(BRnAvKha{&i!WQtcFxeN+dz`1C3htVABQqUUhc8V#V&k zA&%d^IBRked3CScq|4MHcb!2psjRe!oeOS&BSaAFco1q&0bJbAfhB3Dq~;>jlr*!R zr&@yl)Wj4yezM)x^&qEkDtFY{Z9`CX6aD0y>Ac-DJW0ml0CH5`lE7*j0<9@npPZK5 zswjqZx9XX_iFJY(N|N9IRLlN9UHgUSDG3-l;iPdQ3?jM8^4$oXytsU|u%}!e55sxW z%OCG9I{VmzA%`#8Y)bc0056S1`i_R%Jg>F5V&F7rT@LQ{_Zq7I%ZDB^ zrmI|1pfTzA9wq3!lMV5#@sq@nKmW5CzrGVSoFYSB=rb@u9ed6RMdTI%|LipwCQBV49RFfZEC11bdkqAjKvN0XR;BwgXA7w53c;zK5zeTF$~ z+H7tl9Kn0G&Sa0o_=scmA~uw}D^hSk;qr~TI|yM0w>VBl7gsDOoBf-iyWTs_ye171 zid@bT^L~p}=Dr_Na!wF^TGAtGW8VG-GW6erU-~Q+g}tb*|CfjnRrqr3`&J_Ap^*at zBBRLx%t+?+VE9jp_Pe0(9dgFiF_Ust{|(f<3J!oBIkhSf11Sur-D~M&ehy~uwDAcF z?7B<35F5za6zHrBC>rX`Bluz2zH!R`>9)~hR|jbbfog&lqvjXL>H|9+aJXLjD+Syw zuSXs(U6}n12VCv~?`gZE*XBL1WGvpopFY!jANO@Aq&HF%He3nmNov)b4q)djD%5pb zQuw-}WU&xn;2TzjfDTCYAjA8R6PG6DiI7$PM*?Np0$N&|qTGI3{M~&=@WC$fdmFRy z53vyziPlO==?FFYD$9CR=SjaiFo0z*2G3%D@tu(i5p) z=SDAPhKt#YP29Gj1Zy1e(gbN_d0%9;fl6n2%w+L7zhdc#HnOX)ftc25u&v^bXHnH` zX_C?!D!yL7_&IkQnqE{)x_BuwMkrV4Hz|(3&sW=w=wIvh3}5d2WTv6TLs>^%nJ84S zUy|gc(=rvzl}1rmx7NC$QjJ(#%HHaZZa*8NLJ~S~1FO4$W%QJVk@OwK6`K##$giHr z5@J$=RU?1X<`d&Qk=Qah8%rh!)LtF+GUoZpnH|^+=LQM?^~0)jyO7tzb5%IZWh`F? z76;t&6~pwn07;48%rg}yXYT8RD8_QiR{iWp{=EA$bwC%#$0hgK*xKV-Ef^yov9+eT zowIv`PQY#1VEUis1xriqzH7~AVaJTyHuP~Fu`VWxdZNIoCTynGzk|;P-@{*9{Uu>w^oLs&siyJcD zzvOmo!1rW@Me~9o#<{}B@D+IEi3WMUi*^O2&jLfnhspz@!X-E%zhS}C?&_^e^N=$>)bjSt{5&t*^9P64^wS~W$IH~LHuw9>`+VXrwTZ~;-Ce^7rFe3BV7&e$#L<%C6>b-U}yEX<5{JlUqo#Dc8T5?f}+Yu49i9*Lnm zP*VenbvgzHzShA*66gl!KddUU&Zq4s-`%_D%Q_UmIf=Vq3ID;!HUp_ILzvv(Yu+BC zxexkcF^QZ}IE(j81>;OJ24QY)LwFJ4lr{!FvYxoY}3Y zPJkH2q-6&e|G^!DPX=z#GKEgLQLLa`x%IyY_B!+R&A8%BKkz{_7J=VJlz+!5O~k9n z4pDGen28&7mbcfW)@{Qia#b@q3dm8p?&%o^U zirLu%v_e6MCO_PEM%Aiq>hpo{FdbdrMH7|dIK8YcxIgmUH%3=&tyan*<(llLdw6&1vX+eY?-;e~kx}JS zKzKaey{2-q(aN^%Jl83BK?h4q$b4=6PkfAgKA@J~#K4i~c6A>vU5c>-YH-bvNw`rZ z-+?E`Vn#sJsr;=dd0Jk(*m2>q*xxU5atyoY*`jWktrlG5JXgER+ZTUNj(}WG=rQXv zbPYLC5%=J~``Go?Trs`f(Nd{tf)oDI2j7{v6ZjRzPsi4X{IfHoP4{(Q*nH z$cN<7S$j~Pp1*t3Ed)#~k#dMb9jI{j#$B5WL!Hdva|HN_aXY?tQ83tl=oxcTHPQ2~ z^M&H=>0EkmRZl@o>p=(JKQxDH1l0}t5OW#(HVjE-`&#*kPvkMf?uZ$Bb6FbX6d2?i zSoqCfnnSKsuy@3Ah(+@g6C>JM(XeiR3C{{GK>eWr6fW_b5g@DEK>yJx=@D)|F=ad1 z)0!HC>8*TsHjoS%Svr8r$%Kq{BzmRev|vC@+-zk}i$6UW!O+2vTwhkVTy8Gvi-}aZEQ1@c|e0pOLVDQR63!;Fmp(t8>Wh zHrxa`IcXMHKr|y~gH%P$A(M}VM67Z(i6iaz{WB$LPJ&`?J zNnGR${6l-w^D5*Lk(~F;tU+&l@%YtAyDDbT&o`9RDHQh#kbaGXe1zof6SFHY7?Zv2 zKkoEgGOY&kh26uA%n*A;PH0gq6_p5v6V@*vH#p2$O~V3Kc%Z5-4%5QLUlXDt;Zo9M z^aiMl&%NS2N4X#wE+tix<=ZFrB1Idd(FJ1{Se%29l~YFh>s#A%R5lF8Fjj+fT3;O& z^g42ScPs)42?y=Q@Q#(&3%EBIOM3225HsC?OQc*x0q`-D=p=n+@~C0OVoSF6D8vK% zDD+5OF)=R>47m*qkXwejgQJsD*E*R)hS7=d%sj~&-Z8#lUSdm5SRNDrPuLovrD)7a znbUN*5@TM(3&A)?2Ih3EXMfSOa#8}inmVQM?O&)+sE;a=83_3RSw}k*?i^g``7N@;g#pnN~2>d9~T4{MlAlq$``Zs z0`s*Trb}p=<)OWbWdL3hLea2p=O-YDCIyKyb^D?G4B(xi;qMW|7#WT;M3l!x?2QZV zB4y9rCi?^8w(=yg<1?x=op2ubI&`Y!FwiBf3Qf#b^vSXxk!IPWK}rvw`IJhyPYz8{ zU~aK`vxJH1JLXRO`5;oGQW4pcAH=kRT*o#N7K9%l@68?R?%8g47^%SDZq<6w&!MA# zTXCLx&yr6UW))mJQ?Y|xf7?#XwsW*=E^<6)2rxJ{B=hh8&JfDg{*-o`NC#Xbp>SQ{ zJ=<#*emY8Ae%O3SOunk?=+v%=hdgqWYZMl2=Qi^&Fw1-uE#@m91Zs#cK!L)Xe?p&2 z|8XuuMTHTG3HpHH*fdoVgdq~xD5|9O@IztX-UKX0>CL#iK==#+PbNu7T=vpbLBP!x zAV5VsMD&l{BX0o`E&%Bz^8i6DE5`Y6Xk~;pBQfLgXR$o%E&R<+UtS+4cRz-JNR43} z{)ez!4crq^6sIsEP)QPH#Jw?Iu_hr#oQtZ)We$}_*7lQN%;f_|sGP@+DfkXIqz8HA z1eW5N^vRXHU_5I>pTGp4Rr6b~;PIby*#)m}rn>IA4Q9Igp$Cl!(~NO3bjJi;q>~0U z^n2mrv>Tx8eg&csQp|;Dk(s0xs&b8?3V_aP#kAAkVtFO2=5oh)Z1$-*oq8)qo|@kX z-DPrDIOaoXX2`+9FrzVRS}6%I;l31ET%vJoW0qG!oq4M0J04%ZX%oiAW|Sa<^+pD?@ha zSvAATyJ0Fs1LDdmAHj@QnQWIQm$-)v$o?lDsGbKV4m7V>1-xvbEE-68^=CBd5io$* z^*m_vfLul%kK;Nqg_|DLnp9VWsbIRQ3Cs0A_ZHnTdVOgE5-Y$Um&fAC$g|qMB_05h zj4WyjlPF3bN4guAMV+6O|Hs>3`5F}6=~~}MZtNCYb49TW&EEE85XeHjmpsKBde(T7 zk_Ju-uXD-YvZ1ro(e{r7B}+-P9l*1hzQ2^y$caMZbhSb~ljx zOCwB7<7h%}0L(l%DaROpj8SlsSa#tJF0qG?Q6>#72IoOuC#j;=zC)^ZsXAZy|BWEx z#aH7fcOvfla+Ho)6KY}%3*x$r+Csi|4=+f@AW>>PIiRiMK5Ribc-C;`%qRUeq^SoeE9ZLks0RC>)@Eiyr#?(t|8Nm_Nxg9pPqd z{lc=QOTO`He>8kceG`1Pd^@6WoO%b0R^VI92`TX1E;59LIf!OIzMVnt&tD*yv9HFi zk?zoLvzW0pu`Vppt3vN^ng@XO8=%m+ zw{h+G1Dol}LL;}hhNF(;Q{3ifBqyhgdIVhIq5S)TPW}re#M& zZ9;Z|&J_3}s4ge4EI^wQFdeL+&9u*?KY5R=nX_pXJXW7{fNQCirb5tv|n^lDZXmt3#>@M?`q&XDLIY%$Iy` zDf)r77eCyh0C~aU%;w=kMu8=&*vORHS1luZ5s}$xsc*9&Q+3~KX@;s%2Zpv&JwO~-wLYlPd$wv}y;@hz1fPgptVh)+JSb=^whD`! z+HD(k;sOs|k_Sjm&D19yAVnI0d~1OME4fpoOypUV9z1f5H3^#LfIsZ7X_a?TqqNO| z6N9x6#ahDPHH^Yg=u63iOo)Wz%U+X7vo1EUj+Ky&Vf-oTo*E0d87Ka-h>FC%2?Rr6 zdq)>J+GK!E?MTMU+$JRqjC^PW0|)8e?v8*1F0DKQ5U-)GNjh?blsM4{>=V2l1vaMO zrvQO)4Y^_wwDo3Ub*rD@48aOXIGz#-Na5HwiTM?mgG=~xVL9>IDfKRvz`LI}dii{m z#>y~pWQ_;Hk!lJ>DXO@d4B|PXQ|1(xX+8e;B$97wjVh~o2d|1)@kfQ-e+vH+^-kMw z-Vq$TLFO@gvCFh&jU_8~8_30xh-!Je<9(U=1GcGH*b{9ynM66v%xPv!{pJo_{ zf*>TA3%sO^3^I2ZOP>|-%dth~&J;)DZ^3p1(ZAM>~~ zzL%;Nqk?bH$8w2d54W1o(JF}l%?YYJ(ZrQbRCqy`)Eth+M7@k%Xi-?M{#fi#epC64 zHEO*b8+t-8JZ>^_5*}fRjFTxLI#M$to)vuEs8PHQ4!pB&eVi;`br+@$@xf!lm&q#v zN}1#Uda!Y7MI9ElS`>HV;LyD$*bSv9>Py+p$>l!_msV}PLZa`{3>)|L29hXdC-ojPF>xv<{A@pub*6+qCIfF$>b=-u zF%WGknB=mMgL!C)xt;;dwzQpVa0zE1swz3jFK8<%oi-|me;_=9`N1c!k`Zo2{=}9R z+7I(s_VozT7P#sN2`;PZ4BL-&G>(?ci%h@N(9&Zy7MBLSz`=56xe|A*nfciWNx@TY zG^SL|I>aM#RYOdp`k++~)YS2hj9$QaPO^fuo2yi(RlkVSP=O|_^CndoM|>%=u&^o8 z@ooy`{B*T0H3mkc72Nah)2BgIetXRwiy<Oi>SzU8@Oph6@0ut>8_i!+?Kgf zBxWbLPVaMU>+8SPC1;}oGDv6oz(hrff(av7?gz^pw}-veeqglT#14uaO2NESv7CHL zfo|IvEGP2q5ah?f#xDV<&zy;qA{Ab91e2{Gv-u%JMIgS)?b z_Xi7%UX)8+@3H#fZ_Wtg!Fgz)J}QYxse{dbpH4Xlu(@LMNP@6E@ zy!hBipuq9|w$68#Z#=@DPVV6B@xr?EY2tJUVVET&PcED^Eaxj``rn$MLD-X%^vGG| z5MoqbwSnxdc{`Ng8J90ObA8D&SKLv-J9^PE-1*ZF5|#ju#)RRCYmETC0((eM6$QJ| z^DADkp)c~TV<+O{hrJO!ke;OA^CZ*k{ z-WB&ns-^owW#EL*n)Na)kb@QoJ^H(Qwp?dW=j=j-u<>yha990Qfj z8(`3?i7f9$ING`hGXp7z|n@_t?s)Y#Hh`fk#$E5E0qf!&a7Y8jCBb=hJd> z64&BTJK@KVKa|kc-ki{n*&%Rm{fkpR53J4Skl?c$_%X*6WTN^+1Rc0-_75>h()9-Y z92z!}YRmh$6RvhGAWg+Q1LSmj?S-un@oJ||>Tb%?fMcyq#HarIek2;?R?<49M7N#V zP_hoPyaihlpGH5RCN7LUIA*9R(hnpp&Bk>Hr@$fleX)zUlYP>#duJF=d6hdY3z8Lc zsJ<1aB9!hg!yJ$CtQVs$ZihAAd3X`Szn&D!UE4Xqe2010Ijz^wF=x+Sm+~E5+=5CZ^x?L0?CG_HhfE@<>(= z!q0b5f&-heYmbB~aU?g)g{B;S&D?}rkeV0j7^@r^KVr1YvaI+!_I%CK#Ta}>lQ+5r z+a}XwK!dGaQmu^Rh3f>1L5R|l#2uBZd267@0{c|#=s|-^sKss^ZO284qMaoI|JE(o zTnB5-UviJ2(1H}F#X54=pb?^SL#()^$%$x(Lwbvbil{ZT4u!B1`(U`voIE!^qX)D)N>4*)5X zv+E!3J|wgG`ic<~^d1=1S05;?E&7BIhS-dowR=u`tBl;Pk&0b06ASq)Kf$OB-z~pR zV(D=Gg*i`;qgbkQ3|y(qFc2QJ@eyPYCx_+Wk@n?^0mCf2sR_ac<5NA==}E)x{YKx# z{yDR6CnO>Sxi|Ck`6eWzv1lyTC#C~9@tAJSM)iN&5qm?t825dBIDEanF3+5>br=hUa3)7!dK|c3{ZKn*TM!53qKZ)nlMj-@Uu>+232*m!jUAZ` z0q+!We_#<&qWp-cHJ#lP1jHpqn-G!FfV~_-4eT%kPou9Rxot0WNUD#}{=qi2hc%j4 zjP`IHq|fAqTFr+j91U6@`+WEEnDc$!W;pG9`uz-{oZ4jQ*uFUV`JEKL zZj0SNSr>gNbc{p$^O>TgEk*&blfB$8v)e!mvy?fyq91fa=kXmS zg;oFS+Ms`Kh&Zbfp{&b@O#-<+>NqaExbm*AC+v3FxzYW;q4?dioHXoto+CZS7PE`H zSs33QUomUL#{r`O!3#d?Gt|>sVadEUPFRhg#*JnMG(R97t|`dl*oY(^Cx>%#XzXV- z1z}84>R2p~JWU*O61<6Cv+0l|H8u5Q%oU|^Q$0CahYt)cau$^kVRI^JP}-%F&?nqVshWlC1iA5Z1X3W26iRbZ9@r;>9>!3d0~W z!Vfj(!{`O083!s)@68_&`B^rn4ra73l>dmt!GEe(dg!w!uVz$lfytSs8y#&p#Mol&n4I`!Wztpy5G*=v1&G+ zs|((9O*{T@s@KR4>SFrbum?ZK=V;6q=PB+&o%jt{A`P+&$5hDK#tY{D6gv{9g>$P4 zFPrD;W8woQCjgT}<#!YF7kRa;6rYhsw~=)b!Z-#z;Z^hqctgL)Sv|#PoeQ#h!?|Do zkpvwa#TJS>OA?Uu5)EA&FZ1aFzvehDrtW$LxfeX+FS6_0=HJ+_=H%uyY!_l?6u(JP zd=-5jgyg6`9lq_n{r-Acm$HruFd6qd5hI!_A)iGlb%y zXKwJuAkzWU$E}^<`z&wlQwWO9UUD!ga(PW4o$+qJ^6*4yIr`0a`iY(NQZt;?d`O(S zwR6fn1`KCJ1N?o`SZLSD5uu!5RZkUyAGL}JG zFb?ZJa)Qhl=}FM?CWmU5jf#ORz7F})wb4NNSb!pumGhr^F?CkK{v*DV~&E&`TT^6TdB6sh{%OiygFs;qr zfl1>&=_hjcOHAi?tx_?f`k7=|gP0Ah1mXBcYatqSkeoUUq%bVHB*f8>WV;#9a7`$q zsuGw1G6==?a2Mung8NSa%yYUggKFLF4{(3@I}uM~+4H<#=qt1i9?LBX!yrg#g|POu z1ii{SuD@~?K4}~6NvU<)-t1RJVfz!#gK3vJ0{kpfhI1o4Q4h5G;^AR$ywqhI=gWdP zkA57^ZF&aHWKDK09tb|S?CzE?A!umC#xaJ9YmMSRmJzY^!fLDKb~!o0?Y`$GA&6&b zk(y-1TYlCmBb>kd7*CU}cGP=2ap3jxd;Ou+S9x%8$iAE~AWCQ^>DF)NuFPTC@cU`K z?PRQ|g9ReuYj+{y&rd5F%PoMT#bMNc18rNDI6KlmIIGwR+$4sUv|0@jnC|o^w&TVe zw-N;q4Dg97X=}^{MSexr>{=mkW=<^MlFKil#kda6>V0}AKh)sUMG=-%U?qVwJ7(LK z2f}R0A;;56qO!**xsWu_d1j15$fQ+c=TR_}l?4W**fV2UI)-1Y$cH%=yIRV!F-R21 zPDmU`UboV@#n%3DjN?%U0P~%BQ5PA61(**0A)L<_o}mYO4!t|h56UD@_XGE*h<1tQ zmf)r6areMIfo;N?!P>%?|NfcsaVF@|nROoxeLznn&&i$SNdPHfhgSB5cJ~ov=M$+2 z@mhx2oo%&)<||jOi5FD(v!8lrHN~>W*X;bNT@PZ-?_lx_e|{$>{8;Cy^;f)19M_MS zoP9Ff2u(ji9reQkxg6^4Q}N(|GHnh7 z5sA$h#fHA2ge-G)#9gFvS~FAn$yb@N_2u|wiNfs=hEkPGLf!J4Vvu$ z^Wd9zV|cza@mVjHZREoUG!llgk}u1T1IZR`mIR;i0%uC1(*<7XExV!D7w%H zk6;ZeaR&?m&KyEB_Xy-iXV6c8AQnpQ0~6(zVI7l;{n>@gd$E!WUABUI`h$n%&*x&H&bZ*W19eSg;C0W3YF0A(ub{~R&kb0rpdsP+o#5Prd}bf}r^Xb(JA2rC)1>mxs4tjBbYim9%Y!U9m8eMoRYIwL56agm|=|Q#m@apgf3Cc7=z{GY35wF!vQ38LdRsxU-2xl#}(BQ zkdSoHYXIRR+qdrV7=)L3*7>gdlbL-VQ=vw!@%nx!v<95W_0tzpk5oxI4C_ zWvIcXoH}Osg%WI?EA@y{3)lKHw{dAc3vdFb;4CVzK=!sUO28~~7m;Fk;xdxl6#@n+ zSFvpZGL|ccNk^xE2&*%m@u+N72>ok= zOu@2Sj8J+rNOv6`vFNA%602jeh0JetgG$Z)8je3-t=iYq z9!g$>sid<%^Z?oaU^v^SobV569?l*H2wBhcUK+u$tEp{iQHTb0-oJ>2vXj43`S@No zZR3&l9y)3gdvGdTNeKFprFoH8SQ&Gv)4`*DOeMsdp~$4%f=__bNd=CQ2r0IVAHD`X zoNOk6aYlrQWIZB`!UO03PvT3*xWX5faR}oc?hy$%pi&dMq z&|^m}=x#$;DnGYJWX3CXj}Mqkg1DUQbYWP1)l-)_Zt)Fv+6j11`WmomMs7D3Nhr@= zV^47Zx77jT<$|d^CvSOLdE4CuS#3kFJ80C_3Ph|L#(V7-wK@$&3Ek?WU$0)^{hY>t z=J_5Q?f%_xQ(>x3WWewT_i2f{B(@E4k}?!YJt}unK?Ci=cyG#r$7<*D(3*_Q=e#v8 zZfbuU+2$1yx{pXvaPS6uKfX-Sy;v8!{Z$}{PC9oi4*yg7wrfLo3A$LuwMRfBAd*CM z%BDL{Gi5(M44mV9lPB=Tcl(Cd)2I~*aIBQ`2uOHiTJg-Kz9d<}ASV|R$gwfRBg2Oa zR(L;|q7xnYw&lhw7@|N`VK!GqWf^~#XuPa&L_QH;~2@c2$IH4V_Gq@5NYEY~;%%+Ng zkD8p_6&m_V)JOWt2&lBgxj*ZsxrZ@+s}g&Ge?EA|+!`$u^FPnfya!_Bk!T^^Ely!j zsj%h@><>_u=z8Yzwimh0%2I=4sip|0)c%HmG5LeZO>VcDlQ7s<0PK}y)X0ceL12}K zYFML4B@0vpb056cHAkZ3XNrl4@~zqV@-C{G1ypfl)TM?Fd$U zlf%0)`8KQKn>klDpqVSJD0Pl|`jtuia6ACZuOr(X>ax%+$IgD?hMxG@-94Jg)(N1R zA6p#4BL8oW4^P63FoVp~BtuxF@*pXDo`2?df6|04K0<@wn|Poc8cG=v88RIo<4j%a z+@!B?54QbzliVP*cbVpXU#=6g)A!jM`tp|n+Pg>8hEy^X#fY?yBII-1jQU~ZN875c zQx?N7Pg%5|qqGomEbJ}o{2`u6lPx=ylhM_wp3LUFO_=kbKIh;bBjN)mQ8E8wIvmNz zYRQvs+N4GGfG3JT#;QwQUcB4<_uNX*kYbp}2aA*1_<~>)jI?nvAHnuR&p7 zr}PDd{mb_urA3bu{B6tHJ2@2!yn~6kj_Hv(X%mx7&B{+lBeM}4I8;t&5tA@R;`;bR zkabV9SA4eki%nH^fU>#(FOJzI26^Y#?w~TdjVt_Gnh6rr4Gw^QT0XCkmgP3uX%;P{9*#l1{nqF5P|M%1d?TZ6WVn|TqUB5BvX0}++rsxCd>$%!1 z+5OJR-BvUtIPd|)X1e7N)v|Rw_Uvn6U?9XW$&^Qg6F`BGH0m-^lkT38)8h=}n;?T~}+3TCOker&{Q_Fif)WHJOT7pBYu8So8A18E5#opBUdaHb}IGnD@k%H_k?RY8gx~I4pzO;=X_ApLfa5KvngS|Lb+*k->c;j3)V~6>p_G~(;8kmaGvUAkqQh+0CZ1-^4 z_-N@b$qOuy?TaAAp1Vkw-M<;G*)QrAKON)an2&-=v6teB!R zbk}xg2eb`H>Fm_jVMblg^FC&Qtm(C3yPL7Mgj|X@ge)HDmdMuSb>x<<`*xtNlq=D? zeGM6W#1}@Dby`ceJQG%V^@SBqER$_2(si;8b&@|Ig1Ltk{fptc>gqSgbjl7|9CC{G zgUy+$xp!l>T<|66oWocSAw}3bY4`-gEq5&yZGYm}>V8HQP_p5qTVajKS0ua;i^_$!+&uYw*}~IoRji)24%sX zee|ko@=D2eZYxDz|aOXWDm#0CnG0VoOk177ao`3mr1u!n?d2+P@HO-dAyRVy4%`p>N?6J)uj=K)jG( zQ38U#^E-L82KSZ$SLTJxDSq0DoLcVz6am;MMbzhZlZs_gEhdtI;!YGFR<(A>Dmzw& zH9duLQXZvLJJP;G->rv_=Pho-+adHAF_-4#4Q->vwApQzC!T?o0>3t~inBP(K5^;d zn-bo)M*H&oaSy!RA>ZwO$d>hyNrVWFb#R?1yea%uQ4}LzQt+(|C-wm8MNT11ddl~9 zDx}nQEI@s1iZhg{_p4cTcL|HHzH|77DYTArsTLIs+#O_aYSZmmc7mN1-JhTx7ZY$n zK~qcyPsosX*eVYEaXXtIZQKmS4_T zX}_ku?yF>zLN7I1T>dcF`t6p_J{^CkUL(H&YdxS)(~6hUOGwZwW25=71|7*$!mbpU zt`-2GP*_qbEA2ozAV(ghmBRwm3Qx*h^pw59#-%{HY}rBz ze71u08AaVzyGVrqMFrAetF-D9qBi15GJ>lRY4&_0pXltT9bKJIxYR6To;%JH-fdcA z>TOwL-MOLw0!y^eW+oVew_B9r#ik)2Mx-6pd2|%?Vg@Y6LJrisY)@=ZL1Q*m)OZbK z!p^KKF7{{EQ&+8URZw%5KyyYDv==S??FiS;_dhQw=Js{Er20q|nkD+9$?huFbmld| zidF?>#=vqFCy8EQQQ}+3eK;Xp4M&BXY7y1j&nL=jnbby3Hu=^+1KRoQYPaktD@a=GcdFB(I6Egl;WNE*k1TyTh?$Sdx9BnVlLTvRDBFVB$nXp{bcp{{?nT}}yr$5msPJziyrVcz#8 z|15gv6H=PoEiRs7AX@BA&>0RP%O{4gdW^J2CAYMB7I$8F%@3cN|65;>o!z`uKgT=$ zPl2OQ-~TWnVRXwJ$ej+ICH4j@#Zs9@kd1JV{{_`~hKAgy54Up(*QLyIntSsNH4yn$ z`)M-ELrdow^`brJ*8Jo=ixp0b9?Uw2cfC4V*Z9A zk7ym<{wokagyUvJ3j-QqL6p@aZY0@6%P0)@C6rIpy9VNfIQTqcRY5(lK(t;Q)`)V8 zi@|u@LJ(~W6NA9=9yRCt?`rDnaPfo(j-p|T#r5go`K$V=?fpI^gKI^NvDJHue#W5KqbkNOC!%*n zMi+lj2lOdO@0y`F#>(Dz-#OLlc3;f%-e>ZXw&{p3hVf|7JJ52`p4o6yVG^h8e)U56 zHTABY2+m|@t&IN!In|M%-9zgQ^Yw^Ig^k^J$7Gg_;+T~2N zK$$NB=je~bwZVFow-KZ>+DdXPHHQ9^&#^LzXjMO$@18A_jzzSo?>p3B5%({5uhS zvfGo!9P`#*5t&Rn_;EIeuOB>yFCTpZFHb&&tJxD+xJgqt7 z!Vui_#L!iJDpW>^Y1?PBe+w1I&qrt=3V`Tkzi1nHetZi42}0_{658c8!0UI=TrN`% zeG(mMs{)ty;wvlU`xKtcp&@p>^=;;0V4rdjwxR_!tG#C-D04 z3EWOj(nOoI+YhkAux4atM#KCpoLLyL*4)<5!04bD8m5kNylQkN=i0Gmp>1tVj37FclAk;=y&LJ>3Mp3#*FYLIX|Q-5E#Nt}IsagR0_nTc zbNJ;4e+zzl{tNi#_!D?HJ%Lpd*S%XM#*YhjSTDZ9upkJ}(euHm(RUj@(@xvQ$TaRw zc}f$U=y~c@mMs*pupd}y=*mvK9C+d1srX+!{5ERDGM4{YrDhbsuFK8^fMp7+`WRN( z@y{R1jtd1*7%)wQox+F$Bvm%l=_JCQge{9~H)n6l?J@#{7|Gn-JR09uW9*XTQegAq z$}AEjLK1RdSTxOf2Z__Mb5#3V5_D6N%;j2|=o-p*$^)9?Hv`1UDlG$#jE;gxRB`Gufit7|06cv(D;Rd{@CBKf zZMaWygdwI-G);&m3k==VL#{H2#5>Mrv@vgHFlKTSYbHn{*=^)~k50NY9Xc*g9(T_{ z=6-W{2HkWD{p~d@mY2}?O9<;5n62aPT5+eHxX(enSDzQ;0L`fnK06tGTn3lZ{&`g- z>aV;22ltap5r%ae5aN&UcAy>39)_X4iaw*iM37^RT+9Zrk+bhFFt2tSoi+d3ua29qk1;*AQM_CY5 zKZ)tF^>S`ous`y^Q*_>W3qOq3BmYDho6HMHFx>|7O$5@XG319(|GJ5*2;tX9k5Dk& z!XaL8)OK+4@;0p~baWk{Yhza7Kv|I#4rFM{x%akj>D@C5qE}4zStGT)LCydDG1~o) zp22UPqTPS`4BkwS(*heW~5{1?1vTLXl6K!hRXum^cIK|Th7*?yMj!3H^OVvTZq z)Dc*~a#sw=7PO~zr++-7(}8IV(XVrbz+gdPbkx3>|EcU;0Epej-?>9+QB9V@o2*|; z{-A_5GK|mXs54L*N~M3*9u^U!4&3HRm4J{zx9qR?&viJ_DspBZO-RI}yP5}C^in6~ zF;d9egon6{Iii47*8w~{hi2yCv~A!N&4bsAZ(;uO5{_?r=sG-mKBo9{N;P)02`Ss6 zR;Ll>&o+4ML)!8jk4LB95|PKt!$bJxqYvS?&pw4OpP}|YdMDYb zrH#I(BI_eizmuXpzV9}Q{`t!u2moEpS7a=6Ji}o#fINc1NQDjlWICh2?AP5Ud2NPa zeq(sJ6>x~gWXD!*nW*HacsmIr(F!!f%>@G`>B{J}59axX!I~!eTZGKXHQ47}h;H2+ zF6IC)AC53bH9cF!jYwXg5O@v8%LPntPylqOnI|FH=TR6A#N4vluxynWa`-SUYn@^7 z3L*XFw1po}j^Q_tKS1XH48DHw5j>wh!F!{zF)Z>nUmWB2Ixft-P*`uI#mVkZr^Kz) zcu^M5pSSJdUtQcw9$NGo^@02)wvM zqwS#VfdJqEt?@B{V8{Sa+i_Jbn@8?|oaH4Yb*bH5)~j&{Rr5kJ)jj# z?lWVzn#>cKdzARK;9Qy`@ABRV=^PI?C=g!F=kV2obNJ%%hw#;t&)|oHC-7?W5bKK* zm6rG{sQHnca<+9ShlIL=!=wU-Sum(Xn$^&Zy5yc1GAeOtvCJXG@rOwZ zH`6(Mhc^G$4<4e;{~>(+=u>!g^fBCY^K?%iJ%ec?f|s_kmXpYWz$TDB7hyo_KH5Id zj@{fgPrH!ucuEi32+5XF1SrI?3@xKb)y$6cgZcv`V+k028T676j<&blgvH*idR!m7a(ixU!NWG1H6F~=aBEx?}kW5IKN38(LC2SeEVtk7mJEK*r=U@Qi zL_ZaBE@uWCXm4)r$||&e6Shi=e1wozK2BSewH@>`m-fVJ9GU}R4U=JjgX>#3yt#tu zYMuOmDK*&V#H8q~^8?>I-#>1A8doij`xd-8IEHT@K7-#P^#AhwL-_vW8N8c4fMq-% zHGjq}jlz0vuhrblEFw5nxGMNyNgIIiV0Kx$4LQxiK@z_VFV|&52y7IM5?NZ}l-(fX zXQDVnV_}2(RDgx5O_~0j5d!xDAQvk@%|V7;vO*6K0|jBFQnOTbvIn00TEsg#*izB} z>*zE2*}>*!TJJ7H{mhtNQHA_$@vUL7_*P5*z;`wAal=qdYO?&bW5#f4X~48Yai4cM z8scWCZi4Fn1Uxb>TrZ)!xQ0hBdU$w!l{OlQ`2piJBM_ff;ccKBo79ZBHQBA7CcnbV z`5Aoo;7LmH{rVv?|Lifm@kg+Tn`g!?xKX&|`drx`TZ$%F(etwK+Ykc8Y+@1EWGd}L zxzC0W*aFM#m{o8=V@~`CCP>WVZJFJXaASl9mIOtu=yS6GGfJoqWA3u-UH}wDnMHHD zZF1)pxNfrNKnBDP0KXfJY!?Cny;L-ptFPXEduOz_g{Pr7nMlJbI55qoAMI^7NF(I_ zu)ULxxV-OOymm~m9nz*CE3q0fhDbXn4dFkNgdCK8;l&_@IG9^s=tNBas?xz zfluC{NpL&BB(2C3#lGe zooneLo=f)E#6P37v33SpL8Xxh5`omt`!HZtoFy10aT`N2Jicx5kh-u<$1u{|s6KOR zYw|Cfg2$P^1(YPpP|a7IS=P=T{~~4uX1Xm^u5mLldSum{0;rIXGy4?8EhsOV2HL|D z7$1EA?J`3B4rbq9!Tj|N%wYwsTfyMga6M_^&Flc)oj-)jr%&L;@j3i(bPiw7(Edj> z@M=0wdl`-{ZwlH3jvCf*m;T5ae)_j$aE# zt_Wg-nh}oFUg0bhZ0|&4Ff(&RU<5{rWm`j0hnZL+-f)81;PNg!!H_L&E|8dtX5U4V zJUTuWc zr|=x%{&SeXOW(l_ng)G?MnYQ8FE1F%{UUs#l8?F|J1I5tqR9cw+|rNK37c!{lcR40 z@de3fuv4){fMCCJ9tFYq5H^$t3kP9t=L*NL=9AKMh+H<~!)F9eJr6=3Wy-QX<91>6 z^Orpk08|pe^I(=*Wdl{3Qo~1OBd8LBRHXAi{&jm!cS%i!@Mp}qy+LxBJPE~;GXyjM zmx)(#Wo}EOa|0wa=D_4Od3*&P0{}EU_hup zy}W^dX2B(1`}SZ8uTPKQ^86glfXDEzo5BSOjf;?lNSsd)Q-T_BIyZp-R^I*sE3r)E z=PMA8N^*@JhGJy&F5IVTj|Ve;%-~iq*1ka*9%+vbSCG|?09ZV4TLroBOWaX(A(8T) z>iE0cQM!w=a{*v&r2M|=Ayu)Uou@1E28C&bUBy>`AvCA_CQy=VH{8UR)ab*UdRIx! zp__^Tpk=QG;;=0#kcS&c?Q$6b1>VRYX*!-)r_l|TLxHyq^qe0M@>1w=HK7R}YdeJa z9k}iQ8r1ez&mI6=tYLLK!n@w5MLn)hrf`F1z%?R?tv6rAOMx4# zC(odWL&vBXv#RbwyW4z%%6G93W#3T)!atA@cp^XT9-1aUa$IEDiGD<2vz1J5tTDeh&5={`mh3P9peI^T{W`4 z?&FL^6a;wxEByYQZ{cDxgZ6YDR~Ut54{+lfxawM1G+m1Cr}^+nkmcQaVx*vv1{Y6Y zj_NZ5^|9tOxN6I_{LCYb11D~6Ox3F8uQd^ZeRm~jEBZ-MR2IV9Vnp_2`orTQPFoP+ zCeLNzKi9BDXB2%URlkqEf4;JN0l>v-!fijRI2XpT(t4{9fJ|fqN&4W-!Vgdq+;(|P zm2Dg7`aII|JUv;$j+)kPgana0hoRCfLS|sHo5jv_L~mjWxS~n2x)IH7XQ9DcV8xY$ z;u?NK>(k_+CEE0_(WakHI~;tU?zKdYzaBjbiM-c9YF(f``bYqX%#nw=OM|IkV!>v$ zJYS!FmUL&sWM=rBiIwW*t~dv5U&CEdo|1O*n?-!(%0McZ?PEDXJw?r1gaHfejBqTH z(QEE~093des_`w)DZFjWv{q{>_^TzZrA3h;_U47UH&+uuWu`6;Ky8GUV_MFR-6?-hnSY14KV zbSy~ZcPD)-eQA(|jrQ1?ignoxL+(e}xd8a7^8Sue&MZF>ftj%otuF!V_tYvv+gx2~ zJqZ%bOh_mK94*^sPziU5W${p=BV{xYq2)kD2s5zsjqNk4uo!#pyE~9a zt*|$Kw@zI-S+8KSC`=gBB-7~kAVzcEme$nH!F?z@7XYO*#6jT%6b5$o46*;^Brv*L zfq_Qk$gx%~FHPiF&G6#-s_L~3PDyiPHke^Pr2$0;d`*J+1#@dXd8Zneb~TnrKpj>j zN=;XdI!Vg7612q*$a^2tezg*|y7}=NLMGPNAl<}mz5;woLa$qRb2 z=t1tq$Bb}gp|6l+PNn3{vLvNY|3LaBL-=C~1vV=w+9YX{dv(LM4FsA;P995Ez*hh(O=1V|O#BBiN=9 z`Ux7T*mA#JmOT&vVe_*QlEG4)+j34-Y-pYBe!I#mU(9y6k`j@dvjn$AFtAXtV1k_x z+yLtV=dTq&ww!9?%kk3yb;cWO8<(f<3QDq(1)3Y+LQ%I002XwvAVlw-2!ecAkxtrL zEEtWJ4tpqaW1PK@X|ZjCqw5$c1lulci*RxU3f27iD7)XrTav2@p%o9u7i7MThX?=J5SCP=H^i40n{Jt%FD#L>^A%P zuD0u~oE{cMus;%DzXX6K3Sls1G=X$LTA|ugpddVf0Q#O7H2=|y(gkG*P1{gO@eLs$ z(gt`j$dW#klA@WCm*O{?D`--Su6M^x4%&WW9>@X}%yNua9NXGTq%sMLnWEBup?WCR z_H5(FFx_Z9-A;2Ti#9?|LQ)NDh3`mAV79|Hq~fMru`4{=?ZE+oQ+$5gH}64eL|8^O5G1K22az(>c?!p8EKJ48HF z2uTHw2Jrsv1&Y|(5&#S1^_XSwu;tweF>I+(2wD*a5u~;Mw?1r zZScIzCJ!>Gn>khKlg^X)bSMi#(&ZvaL!DyFvOPzYEX z&3Wl(Z=Q+GBVsOz#PG$zXx&l_*+aSRiuoN+?lI%S!@?=vRhx@v<}Cyqy6(?eB^Uy-YSmun1A+1u3^s~7Llhp}&$QgpzB3;0;9lR%7O*9p2n)0@#cHp1r z*{$Z4R?@>TVa0w>h|UD7FjrWBuH!@)xldq~rfrscOXpQ1;Peou_iilMS_wX1BMYgk z6!pSgmZ!Ebi_(C0W{nz@;bEh{MYx*Bls+-5HL>@e&ZfVbrfr{zg~W!yx3{$C?}-H1 zxd4z-bH|jIE`eaMf_b}l0#-$b zd|P4SQO~eQ=^8<9{aT-BF(xrxF@SVFzsV?X!K2&m!63v4gY8!+>@JU56%RsqnRcs8 zJ^M5pim9~41*wPpWt$07)=~DLo?{{f5Q=tK+2QOn8e1H-+kEw0T8x+jHO`PNU+9jTfkCtj;b;s z7zl|Q*|z|OU>RPrhE*wV2D2J(*6;!-jT5YRh$IAzz!2xuHX^afuH@+lkT9pTH&!S6 zhq2&NrYW?MWqj_AiqXe9$^nKz#hC}%r*)rj8g6kPr-A@j5SIB5(tP$IP@9W>v~6YN z0(bQv{T`~O5|UDsP@^RKJh>GcQ^akkIrXubKe4SD8|b4(gSj2|2;l#BxdSi6!|cZi z7P=X2b+@3FDy%SJ8VXx}v%iaK+4$j(n^wQO>UmOnt}B_gyk3QXt!3jjchFj`i-b7~ z;ksqD#>%;-&8s3UC2WwkxQa3L>iXhRLl?5RLMrc7*zf5=VP(fcQ&XqZY}f)V?*b-j zqm|Dla&12tpUdtAK%qG6&S7b+6Jx+gRMu*nA!I}f8vvYMm;qv}C+(I} z_<96M1?_)L1Sos(uA<#j#@FCfD4^mPOfpxUFO*;UACR) zywmILvzg~FVO04bVp?r@@bo%fSFvo15iF#&H>Yz~g~mB|4NZaqD~OD=mV=v!q$q<;D}kTSF&8lNTTectnc}IGk(|+z*53hgKG;Uc zdzlKW_pxS|O-z#O%<~t5uzv2XW&@N?QPm!0Mdk!EWXj*vMa`19Q%HQ$ZV6LQ2Ar7P4+vQ06feK5j-BnEOn^l4xJ{M=%E&G*Tnd8d|Ws zx@wq37MaHgz0kQ?$QBZi?itDlwe}LX*T@HHu4$Z(u{KJ0-c+Yy#x0L#t}1*iLHn&p zEh=cm+3uFQh2BPOpNwR!J_-;FUH=&kJ2aoI+i12ZrZWUT8uMu*`~?Z9nNOmHSbA|{QDYF9Pch(f@ zpEBBrq!07L$gCEK*$TR_+StaDwUq$on8*+7>{O(|OkJnr^77!OBQ`#7OidPe%x5Vh zmG!f5bEWT%@6A_;Of%O&S(JeZ*#+aaG=r1{kqU5@F!KE3?9+BuDuejhm16@&iGY$> zjS_+!b1ZkO2LR)fp}7i9Js(1^e4v)2Mk#x{vVZO~u?OcKYM#w2Rp)OH`Cc;Y+ed0M|UA3Y%*4uYC#~~$XL~5 zO(gp)&WOXnlWgferU~Mk4E1rA;Q2U5Vl>RBjJQ=OO3MwyZ+Ui0UkMQzc%U++p46;j zV3RcHKKI*$-&Jyt+ohvZab_;Soen^IKB#uw5ay~0^iZYx_+X1<6pLkz z=Xg!o_m!Fml>T&0pcy+O>8GI!(ZDt=( zUl=sTzMG_l$L;2nO`k5_r7ws+Qa#>uOaNYDNx_pbP17?v=_cu4p{woP$*5r;%FYFV zvW)&spG*f8&a7Z0e65bm*Z7k3PU>|{kqz}FMOy?iY)7T#;MLkKH@K{G3$iTQZmX(d z>oq-Rg=WvG)oIB>n`ImG+kQ9b!t{q&=Rw;k8N_#VhuG`P92?CE)IBAmtAN&Hxt>kT z;i|q08)wwF+~R(7{ETLvMJTUP5tPr>#c4spi7MqlOjfOe6vCZ8pWT$53jj-GDrM=r z)9AFOvxe$CDwUR$mvQ`*=hZ^MGJiREdaWL1%^xbXqNfspSV2Y~9eLNqtIkz$yxPD7 zO{`H$*RUcJUqNch6_r*lOpw~oV3{zKOeh#5@PyooJqd4ISB=pLR_DSzw<&gX-`AvJA?*?1Nfuc+HpzK}%aH$D5l!ITM>y$}2 zz6_f-Fl*Bw+XCqgYhsY(u?lgU^gg z7ZkfXrP_kXXt+a^l#VPYk)QpofW)jdjAxQ_$?d|N42|uzxw6u$uAfUAtb!gZvMJ*!Ur)}V&zp}A+nQCDG<94I*K>clmfT@I(?Uu3PCe{n3Y*fAd zCuV;7oFWM$X9wmR)@wwRY3ri8%4(q;ORGrssq9<;Y_2E+X3&Yj7;-x5XbWFCu1yT8 z9)3!U!5`WtZm41RsDVu}Tr-MODwZa?{3n=ru%@;0fLlTgMya|D3KWJ?)vdn~taU}@ zMpH{WH?Orn3SpZ%Tme^A*wxOgQWyl)>g2@KDoLXg*IMN#sK_}`XJ4+-3JdP1kghiz z=S(}CX%%biphKB&w_o>dQb&EfyMlv)o14!u;tE zL2$P@;U}1}6M=6kFPTj1GLqJu9{#`fzN|-*97)ee_sFBNs=8;ox98AmcO?P4kNU*| z1n9>spjSOefL6jng0$C6Pfyp88HdwEyNw=^)jP*_6qL^HsECYkr_)K=XP+IU`{pVu z4w>%Mzyk(Q^F-ldW@(rU>&;s8W++4Z9JS#RMg1(w^#S10j5!OztW-6|A+?mT3e0Y& zq5~LOW8m6`Bla7=m;5t8nxIJ$s97Nuww72zwvS7?l>`I>wI0wR%!#a_M;Lj27Wom{ zC#z?qNI#^$MZ2kd70er)AdHAs;=a?pMaVDuFLxr(|F)7|3~({uO>?JU1#|F>*Ggin zNQ$XWd(dY@A`%-b(avPKXlJLC;3~P}0nVx4leu7XMnJ=yqgfF}_j&9e{nnvwa8a2iBKE2fchap8dOOyCYE2geE|#jxll&pjfaB&AsFk$)|+d z*uKvf85%ceY*}fTfY89j>c*HydBv#JuwHdJ%ml=aU!z{+pa(^dl!mR)5K3l?>CMUt(4WkgHu?spNq;@()vyWbYseF^QV^N z>kNyFR0ZX|3DMgZdjzgCDe1SCrab?v0un0}N5M9EhIHqc#^DmSMf!CfFh~r;zO(2_ zGOdyc7&n|~#~BE#?Voz5x+YHmw64 z{NcN2Zp$mo02-|3oQEjLmvap~K!=-rCC1NNUPcB3#sDz-B(a*@Snux(A=9(&x?;IH z09;x$k&*N)ZL*~Eyz|!_&(0UdF!ev@O0Uw9*Og#sWIe|R(dK<}#2NE&R^rrdoL#ms z#Y=YPxrSc-ly9zt#y(Gfwfh7w=UwDe}3g z-c^UFoV3wjw*mokG#Z0BugBg>8gpQOfmKzsQ=bD{V>i}g#hX{yCP%w*)AXL`5qm8~ zkLtWUo4%JtJLX0C#8E$fxjFz?$#Lbp4*>sG?1)iC4$o*9#7LO~3k5m@h%i?UONGSe zRNadON2nQ`Wq!zW(+?F$%$uBl`7|9|*D2So3Pi)V7tb$gg`4fHV!aKYFQF{(IkuFfu7+mZ_ZyTOpdvF9tKMc-EYkJ^e)a!F&Vke+GORMuFFeb`R z56_BV=$ql@R=PpX@SU#P5A9d> zYUMdBcMfB5eXG*DBb^iXooSN^={cDC{X@Q|;tv&x27>>7zM-i|akM{oc=77>3M)a4 z-$I=jNL1NCMuAl#5C|5K5QU^|t`at^dOsr7&!XR4A2L=E$3f7uF+Nu09wKF%|fI52C#uW`n&hGX)<>~s>^;yzDS-6HWK)oH)`lRkJ&Ep;iGf~qb*f}+?t zaIOK@?uB3{;Lf|}CRY~z{KQ-NbHz$*0{eLuW5>9^j7OO$si2nxlxKS~dYgiE4SCsG z@iV8b?tjHV*7k`pNBzltA9|ksrz^%}iLW-t@;>aoi`tyh1u084w|A}i2LwiNXX9s5 zt_}c2AB8Qc5f?OlMr|7iD83NKjv7D7zedyM&Lk)mn4E$11x;qlYOCpb1(M^9$1Vg? zG#}M#XV}%spuuc%#ol+3j=SDCa+J9QXlJw+((wT((!>Z^S;#9q`Qv2EyV$0SMPvY@ zB{>Y}Au_Eajgo`l$Y@K9)0uFB-)Tv8q<_3=Q73vEavfpbWU%tf`#qW6kLjA0ZAszK z)`cIJ*6sTRfRzOa2K56uF4I#36&QI242vwnhvJMQ)BLQz%)fPk@m!-^9RSWt(omSR zeJJ!0mDNU_S&^HfBJcmr1aM35{k8Aoxj+)8q|`>?Fd;Lc5y86@wYXTEEnHeU@&i3k zBDtikLIon@7{Z+$aOt{dI??W@T$p?pR1(HrC&5bK2*WT91WFDu-I*8+#MlKJ?n1OZ>9d|K|-u?LUpj(@Uct)aPV&PAcU7q;GWskdGj2e;E5FvB^stez*x> zxBSEO=0_=42Y?*TvccofPDf)F0@rQ`V~A%x83qpTuerZH%-CQ3y#v9Aeh4LDP_&B% zcvhyc7VVNbk}ctf$6sno8=KgUihY9BK$FVpxPa{+L2%=Tpo1dHQP= z#ykUoQTXF-lNPmWCa^oJXywOPTM%RW#@T>Fn^S+Mlij3S-?uhppz9#QU;5yZ4}gaF zP$)E9$l=e&?fQh7`aE%Bius4(wRwKuUs7fGJVU_({!f| zTpr}0+@tz0X@U^Kl2Jh`0bh63|C3vUuR0C*&aYj{elF$e0Fc9P`bE6C2UvuLlTv(AC2F3PnA*gw*ZYA}AJjLu z6MTJ-@biZT-*w^t_Nl?Xi~Lghs|p&k=NrR*mXIW<#xNVt>4;8@G^qxufS5349BrSJ zX+n)Qd{AN+V?J9h6U*Ok!fZui%@bQFQ3oOhQ8k&X^C!vL#Y6h6>h)_B*e7|Z> zSqU^e^GPO7IjhIgbjE!E62JABIK3iEC5x3!PHW2ARKN>;?oBYU%CsAc3x(fjsxxGE zb>Auo+1WS_GC*F!clsYDt97`Exq*jb;|VtpyY`&l1SGS0O|7x0(NZ7#^8Tg zh2BvL@XudYc)i=fPhQ`^FFsE2x4${U|Nj06fB)eK-**t$cQ#0LgQ#Fk z%t3%K=B<2L&V&e5urFlA`(OMTWWN~oIddp^oqBdLo3fc;Ha`Nby~<)dcAldX+JDlH zSh)~FpFkju!AQNVEhCQPh===eJRL6!x&f&zxXIcy_X`XZYFK@%bu_)MM_sUauN?Y_ zQZC4D*Gku@b5Z1{IfS*In1Zd0wja97POj#?YOL?kC(H>%m)&xo8O4r z;y^tnXI-;g9{^U=&c4jF$%`YYNqD>`HX83blW6#Nx22004aQKsML8lp_|w4*))53yFw0aT7=!T_ z$aH%JChMCo32jWz+ls&lw$d0#Qcov;@X#s#tD6aa@%9#e`DTVcechGA9l$rY4Zi41 z;B|kWI{+-cB|$6;Hl!c=(z|bDdI4y1T&=QZ!6FWA*;0Wol$B;gSeejC_%o-~Q%4Zc ziKzoLQz-DJqkf+Z-}G~S*-e6XuP6A&hY9}I_XvOUTZI4nzQI5Cad~PB?Ar-Q=&%-_ z(2^y#LT^+@rA`9Vy++Fe1XK%ClUrsC=(ki#+LFreMF9xI`wm|7*kvw|)_G@U!}{0^ z2$^q(3XTZGg<_K*OE}6(WDFV{(D_w0X@1JMSK+Ken?B?kltijV6Vc^g`*+Aq^xvfo z918A&{bg4K-*k=tS6}bo-*&_Qm#-T;h+lPJsAcJOop=nI*pR8eQ{U&|Uw3Mb1{nx2 z08G$$!%=y)Z8@-%aQMVzGmTYUxeeBqD%5ZYqG{%VGU|3vTtqB=Q=0z1!&7Gj0Mly< z5mxx-zQDIn$i9L1{r&w@g~x6hJf2zygKi=$0LNx)&P!+;bt)N6JT4ShE)wqX=_d^< zYLb{X4AAl$_x4e8N<(t|k!doipvXB@iEe}?a|lq)1_;gN$wJBg25SQ59s?C5!=$X? z2BIN&q5hE~jnY0w&bplH33eT9XIQws)rAofO_y&ZB&%)K{;@26qs_yEMYQiq>PMSD z_WM-D^tI7g(G#(PeXkn(B~zQ0u-!wPc~ z(;tC!^}Br@au7e0P{7pz;C!#lP17>4;6$LS<@K=v?>+P{6q(Zs!*!~^`M z+k@ZS1AI7Dc;5y6-IKjqHwjw*z5~G#;i)6Qu}S<`v;^f8G^TYV^rtTT`wkc<0(lZ# z1u3JWp4(ncXj9gm#QM0d69GxL=Z~%O=S4+6i8!23!;;uYafM!7f^ksrYm;TY0Z42R zlKcORkb{eA5i9$yzu#5@)du%uST_pio^~bxp#gmwg z-A+}2CAvNL7me-14&e0-_VFd5pWtT?0AF{?f8RAd3x1us-e%*}f<2twa#{7`suUv) zLw^|=)B2T|;aNXkr(7KXBE(d6*5R2}!qxG<?!ATOYekcRVc}Bo>bFFaVe)x2x*q zE&X)Sl;j2Nca2Z?FCS0DKsp=gb$&b*c)g%!wyzBmf^_X0Qj4SA6(r73jq>L0YY1P85rk*( zGJQERfKg{TNPuBXwidxPU7x#s;vn3SpxsoSoFvTTuOaQeEH#7`gd(!`@5i0m!T@kQ zHJv<@40w~x%!Jk>+kW(-^PENKJ90h303MIPCdh9O2;X%U^6SF_@A`p{P1*qVtojRm z5jUSf(%x2@9ztuaK_DMFcpyp$2HhRee9E@``WE0XJH7t%hpuh=>!EAj-PDvyt8jxb zAi5^AC+fE*An90Bif3vH^{@Og5H$cWR#%zw*Dm~B@cWD2$>F!_zfmUW+<)Iq)D~ry z9NQNrQd;ndurea9pF4QW2Egdovq8|FGl!o&Yaku6nE+bMPS0VbWOXU)lFaPv+4X|4 zI?HTaS-=4x8(}2FEg^5-?MH+Y_!=bbGSMvbBW)ljB4riI-!&Xw?u49NbI3%RxIIl% zn!(V&1qei#3Ir%vAesVB>#U;O=9$WPd6N%+?*_dLwj>d+SMH|mcT0P7JBZ@vLvS=|b%$0T)t`wnzgJR8VEegl(LJakJyjK#|T9JyFtR4*<@z*aerwzY9MBz(c3` zKff>Vrw2Q7FsD4>0sei_fo8^K(jbg?3L1t?mlEx!=Lv z?T#t9t>UyH$;=^-sr{5wz~ygD2~>GR){>XLOH3dD**iH2E)J~6#-2apYK(2(W$nM- z$KEfmJdkrmB$Vj0X<$FGD)DnD*9QRKjY2)kW_$YY9C7#Wd=fX9snNhc5rh; z+h{D(cDuelXjhXazyv@$Z|Dz)EN6fh`gv%68OCDxy_m3#<9rqY8O}6%J}R8B^-aMP zoj(B~0%9ncqbYV;lnIoyzIX$GRMyW~yKuxxF9)4{ZfT_x+f}7z&Y5KAdPQNR2@uNB z2h%oz9Geq)_de6obz?#f)7gb|XmOEA#M@F9%2J|@Dv6qkbCR^{T|L38I>D;~yk_C4 zzbJmPtR}87SnVs{!NT$p*3HzOSW#)acc;^;#d&Kr-erlxYZH9Y?f+MunNS3!PW>2K zPFrEvwYjXASys~dq6VA>1l~J?`I1Wj1?C}+a8f3pL%BKtTrSboICOfXR<0#~y_fviVhfwd39-TIx>!bV@w0rwqRO#q&k}0| z&QZy(oV85SP|;|oj%*5G)tsSjFHcAIw%>Q*dYDRoO>peTpSp_mr{O{g|E6hMv%lRx zvcByyZV^~gKfBD>0kTStPM{^T^9%w2o&LYtQLg>cZQjP4#IAAjhY1V?Gl1J!^COwRS9WarS_}}uUT;r6Xls?~07~nd zOvRoPQSH~F0Fq_7L_P`n{iab!@*g`4mr*Ya^`&t;LnW!BsZv0T|LgA7HfQPgWqU4w zl{Kvz^+9aRo;vJV1YM7seHTk!`Ims>I5dI45OQ+u9@YCKGm7m$IrlqjO>R?eOL7$f z4A)T*K#d=FVVk?uJ#?G~-XP@9m1yy&Oc2^Kt@ z=F`&YR>^bKf5Y`qCuf{%{`G8tm;$AwstXR2)3l-_9Qhfrek|C~);!5d?OkP4989xa z9D+-*;7*X>!51e42=2DHOK@lL;O_1a+})kvE&+nO%L0qMJazxZosTnJHB~(yrsbT| z`AwGUm5>z7NNlAd?;xbr){q7}KcA&9z?^U831<4wGY0wIk`6uv(F19Gx66r!snkrC zJgUFP!uX#ZK4Sa6hdh;QzW)>ikUP)ldiv2#|E)CrnV3K{=A2~jK>hwV*Cp*kg%dal zxA{rma|A;Y_wrdWj<=&{B~X_mLfpCDkT6it*Q&t1OHCdB(R0zD_|Y~Gd5F8e#z~Ef zA>2B-9ImGx0V%Ha0a|2C?d-Jmz^R|2rc?zH++n+=X#*FA@3e5TU=!2qzwr{ij5y}u zWF^|DsCZf<`DVvRy(&e-~xp8fQCF)wk=WJNvP!8@Z_0DXnj?r&lh#aCP%aU{0AUjN z$3T?Tl*8~7nUsb@K3BvK$qhx+^MqAP2r>4xOQwLu~ANmgPi#8s%98f`*= zX5y08#9n-inKeT2-)@!4Wpm=EX$5y)m}(&JEG&(-XeraFrXVl20#1_pO0o!kiGqF{JS>d+erAJWZZ`=C@{u=NI=eX zeLpCmPXs*z)dewT0UW?CXKDk zQ#{`e8hTY3)8lOD&K15@9J$ggN0TL%DC&7+7NV58+C(>|+a6w-Xa@xzru(1GnpJ=hXlYS%EE@$) zopBx@p8C5`D<%-Hco3pt?iJP?RjNd0Z?(y0H2q2>2{n3ul!Np~-!T+aLvy%x0q~jz zs`sPfzZ^0c-@Dr0b`01}atj2?Guvr@5DKjuympgZe#Z{?rJBxubU&46t>x5gj=(Bq zitVzmI!nb}cgIQ7TRDpF%%`jRCC-kcvsAbE4YUuiMc_sIRl+Q(95`P*bLz#T{OubD z_sxVMyKRP9GM%NYcDClC2RCs!M5pSK4zy2Evdi(AUZt44hIto}kxfYgM-j@@BhKj- zC;p>2fpiZf{}tMd`>Seg!6KFhD(G1ZzUgx2H1>PE4gTYOrQJ_GR^mO)13brWJUNkK z^!1>XIp9MbBs2z*#xyhl1wX3B$cuYM&_v+V;Ke4X7uMR;N zumEyPzAJ1GINS~6+ziZyzF3&(^4*hm@#`)Y9%p)AZ^`XU zGVZ>#kzNk6oK=TTqrd?DWl#XTI%DB$T(;_EGWl$8(QMIwij;UG@>{JGybI7?2+XS+ z-9ZzI23p(*CX472h<5_9!3HJ9f&E+X3JTJ^WYHZG-szu43Wn*I?;!kQQ)++A0e~iF zf*uW7J~x}X$KWWjy0gDC9LSMB1?56hL_eh!XwX?)<7M!$@~N8MvNm)za9d)}(S-Bx zT!rWbP%55UTHA(@}w2HLj2BOP9=Bi8qrcdMQToG3R8(^!gS651ORA3*R{KuiGfW4I=iJXyMR?e} z(S)=w-E~3Tz`ob3X@3y_Xyc4mG~B-tf+OC8j}VI!p-?Iw1g>KhOMCtk5GN&Up}No@ z95(|gZ@!#}txz($w5<(C&t4Fe!!xJQ67PTT^6XQ{Hgf$sD2xUij3my58P;ydvkV|+ zVx&|RS?xrL1Ag5?iLqUm`BN&oe?OS?ZkAVXQ7OI}ISU~S&qnp~agPhMJ2 zHnaG1?dZVC@f+fVE%l#{+uUE)uXnSs877*i%6RCp&GUeOOO{3{e~q*l;{`(tTq8kJK0c~IOduqA3(0gc)O?c_XLcSDdh^hJe z)wOTdLuEY^tQ!gApp34tSnT{=u%s@c&I)SeTArOr=jZ-2A(jvMviBKbt-JUUi^Z09 zH35sJ*q)bcFBSBW=M#})W-&p341m)U-P+`AVtZc6UK93FKivAu!iq1l)tK#}Lw)a^ zg{{Gebl3z?_d)H8wcbRKE@^!}8g*-lh^Mqn#pqGBe|Xtc9nT%~BcN`$PO`h0|C$gT z)*fWG+TDU>&ej4iAwFtcc$e(lWq>)?rOGwg$Oj zv4PMec3*^gbaaR5)hT<%{hZQDTHldp;+yR+_Yp8Ue*^sNi)CFi_tw4B*K^Vtn(TdV zLrqz>!@-uH)PCHk@6bKGE(j5Xvtvp?_`dpThW2Soc=DGXtqIDN~H z$eZBYc<`{)DC1^l;72T=VmFPKS_eyR+J;im7am{I5`x;gW51XrXT_%KFR-4PK)#R= z{W}y%xWl`I+j%oiI)M}MohB|Pn~sit;0#v8f7`GyzVWvHWZ2BA*K!Ax{xyJzBfwkm zdM%4w7aTb4%MPPH9grGn_I0dPP>2+{qXs?8!i_UrO8e3wmL!C*(^J|2@h%uv4^ehn`3*rKt@tc4(L-r+- zL(3#=-d?!l?VtYdbC6zuOv=jj$ib#_(XV7JHI&WCb5Tw|!D1$oHaK9c(2(;)jL({@ z43(C7A;;Wi2%*u`z4rXV zBy536tti+Q;l$A8K)Gh~ccIeatqt%0_5735o<&a9)G5DoYP<$`c1zC8{$h1Z*VAt?#ehnyZUZaXdYz}O?|J#TYZ)8Z_fCeOjwk@}PUoD7WGqW{L6 zTWRwnO_frWC(L$w5e|f%!*219isEA>Pn)crbhG7z3_UThv(JOFPm^hx_@4b)L$}`D zvwVr%mS5$BcRrW7t?*u3&D~$`(1W&nEz3Bw8Rs`heNZbjSVPt>CC0L3NOr3h&)lBq zBf_t`;NThR4jaVA0CFdf*hE7x&bS@FDdnK=9 zqJ#AAr|^Y332QV{^o7DTgEHr7%|Ct?GKz14Nv&ZGLcUA#&fE8=s}L~FoD`PTt$q%z0{K=Uv@f(5zJWlhzQ)|@sjrE7P>_E(`WE_9yU3nSbo zI{3x2%b0pLbpM9Q#B}0jmIr{TQf)!%Lv|81!L)hjvSLE&YL8qRth;*$6{D6$>ccPN z5WF=mdjP0tw<-jyP+|?|;+mQol~sf)78ttk;8Hmflz=(_e=BS8>%fM|O2EK)aevVD z43xl$QaC)=di_}ey<{FMu@sT9b<9R;71Xe@Y{QOz@HH=>dv-A2JAkjn&Cdcj;-f}g zGKLk&e&lz)hU`MH6FV}>UrvsGdF%Q}HVWPJ|2N;4W;TrO`$;JKB9E1f+YrXO);AkI zOz6CU*kML5+!PP3hiBXsPsLkX6poG`K12OD9E7Y6#mw4ez?R9BA>@~*+0k?jY`YidV2M0Q+ z%!$$it)JM6CE1cTD5ZFenvg7U7Ak(KtcNh?qgWWJRfYDCqQ3KE`r=%3u|0KJZE}Rg z#4rp(m^etS@4M32lVwtaHeb;*8=sMmQp|*oMTn%m-U_=cnV)yciyBF) zq@SeM5>?T+W7e3CAhk0iU_m=SQ<21@ZYYH;O%ya;lY8XzO~7_eq5P}Im7!YYrW*(L zses+LByJ=IflZvfl9XKlmp;o^!5d5l%O+mla6Wn^Sd35}l3+69e)Li7S}9fg6quF_ z6k%VfUfhtIs^!dAa6jy9^X#n9AU2Xy!e`M>srH=u=DppW zdgFUd#m_ZSh9tWMvAKfdR5ilkz;e!<*aL_uS=|Ai5#WLE2yRP~1cjRowqa64#Ug*p zz`3{xascpEXO8mrZHF|RrhrB!deG?fDn?!2C|xnva(}kb8*2ABl>BI|bR~G3%Sn;D z33f4hyN*ehoCGcM99m18ni^Ql35Tri|5yTh9-%%o!<>&(0woc-_~|fbF(cQTAmzn1 zlR(lbnT>EH5PbZ1MGnCF>g~!C`GHwaZx*0z=b^Hy%Mz>aOvSaH8&B$38WYc>$bfzC zNKa)Ur$;ZkAOtIS@?b&`Zt;Ws8}32}v{<1$4MmV|X6{(erugJbxW?# z*I2*lKOyTIVivgFE>SF-41wQNni&g_w;G|JzWJHml^K4As_~W=v3YiNHU&dnl%Kx5 zQ<|NF`sZMW11+cV&!iJwP{oFzN1SVOF6l|MY6}%FnF%2$#1c}p_I5ao+Z)YKia39? ziSx#mBN|2bhX?~$w((dOb+!kLccP*V2H3+SNlV9_F(_GcfyNjs)yD^nA(gdKVnbLrHnO8T>l3`ZiF$H*`-7 z$Iin4a{|{|wmyfuE@4;=VNo8re)U@qr zxy791gGaDoofijkYg33r!+F{X%O|Jb;7ChWS6Opy{>pnnS8=l-8S`gB$A2hEuKr`~ zJFdl+M(^9)tRZp?GfO2+P!WMg$m3x9E(6;%Mas57cU?S%PKVs*p!DRiyUf41_NWrY z9wp8O8h&xOrHE3&6PS}NEE1y-!%sFR$~r5C1#4Y`N(? zc29}3{F<7(U#Qw4sXJr5e~{^to3Xs?)R06-KQokJlu15i+5D?IgJeAc<0igjJ80w8 z`|&@}70@Y;%l@rOcDZl(g#800GkH)euyMwR_esx%w)b{mtg~91{c@MYsi!3w~(l~9Y5b8_1vJOTc?s=Ur>68wb(YQ7J`W? z_7l7)y4n>bbJ-Z-!a1j(=tnON*p=KdmWiGu7)js0BN z;$zc7S#Q<3oxaPTkL^hgO=VkZ@AWIttjscfQH6h=SazrKzA#07ZtuWq4k`Dk1S|nX zu>%Q9X+8_SssQZrq|pIt@M`LlIssw9tK^wvLHvZ{D*d|5wBR71%G64JKajsx?j-ck z5_Y_d&j-QN!7O7pZG%$ZC|ZOK1;t#WMvi9-=8(hO785C3&d#lLbwJ^C07fKg=L6$B z%IGc|MbEcFBS4K_fOGq$`V3KYE$h!Gmx(2Ww|CKaGng}mv(C=WJ!F8#D8bY_`~K%Q z>)A!)g;I{@0(NSZ2?~1n%_U_j198#ZHV@dYb%D=1CYT)oZqfg~&1xpVQyklK`z^DN zx(ai&3%Y)%{#33VEuK(V#roU~Y4$!3-JEs>d9@U=tndQ_vm8RDQz0c~a6R(t6Ob(T z>@lvhH;UHB|MJrwJndE&+^{tL?LCOU3$arRFC{cL{FJWv|2LIbG71N)S0=78%->!E|`T z@d|zV$%Bg}((pjk62-^;zES9nJYCBuqTBDBQXv|UqnA#<&ge(bL0iIfgHR$3TVK$! z7;o5_bzZ%sTZf0IpbOy8)sNsAA;Rv6RpHb2uE<>~D(DWHK8SC>Zbrw$m6tBH-y=^c z-Yoz@K`58)D$G6qFustQ;vTN|u##KQo#0fLrjjV?im#rJ8CI0#Q&@#E-Y$2R_wW`v zEKWX$u;I7NiOPEy_vJ>n>*d?xo_Ml+b4iGY zzb=DFyXVqZI7l%bpo+W96&l~AnP{r%2fZSU7HV`uqGU>6C>_&XwxQ=e<`8CKsaN+zP+x!6&kp^AEWjTc8Hi{oWLvM6RB2NA`9IK2zBM3+*LC} zQd#2Y7^ONZTkN(GmKoS`Gm-}JCSw_02jR;QIegDydCe3TKSYkVbutLON4^3=u;6Rxa23qv1>du@YQ+zM)N-K*goQ7h zS3^Zy+riDmOP99Tih{TNF(e%I8#m|i_ct2zRfFpuORsFSLxx264fVaJM<#K9CSORmNB?Vj}QZDPlZ?SsG_)`AbtF zN#Qr=zt##Q`Bw`k(%H(W_wc8`yj>rPve_*F8gAP;D_+K4OxN!drW0GGAjI+X=%v zvs9fkJZ?A+MGT}_bJG`DtrYWg^A)Qa-}J?omEPn0S+%U@W1PUu!}w9x$TBbpD;NA#uHtT`RzyTs!Saa|<-=Y-K{Pbw2;c5P--Y;@LMfhZ zlnuV^FBf{Hn#*s;{eM*B(WxX1VA00gqtWV3=a^qT9f`Qx5rOf6c#gC&VKvR z`ua(R{lVJPiSNZ`mX+7$l=rE-$KREzQw`R4Xg=mew|VKA>suZsWSF&n6S7o|Nxt^d z1=;E195Y5*F)b6QL*@SjYQiMJJnXm5*oY8d`6-mG$3W)f@LG!P4D#tcK~7J5KA*?F znI< z@q>POOQLnFa@j;W^0}DUyiId}Z1tGFaj0+a6Y8@BN;8M{A3NyT+4}kYxocbJ1zN5jC)(;pc|*7mEJ>&N0*i&J@y63_tm|c1DZ%FfJmR#M1+n_ zD7J?aKoJ)pfAUp9P&9JX9z%?s;6sbXFUIzHV=_;2W!%IqFYJo^Nf|G~kTdz74;kVi z5ly%_lH35oFX9(!qP@+6vhn~_+pF^^MG7BvC-yal zcFQ&wt@mSk(E#h-1$gV9nTUOGMe?89$|(8rVib^g1%+JC-jsgOl-Ojo6-~dbomot2 z2sZ3E@@ES-^3$h3O zJe4X)n!Fg??Xx8P)a7_w$MrB?9J$ek^Sb|Eyv~yR9$5{Xu9OYqARUeKEN=|#I|vkiyuh# z{X1&_^}RHHyF8zlUt8at*xY=DbbA0N?vD182~QCLm%!J9O*Xhg9v~sdX{H(F>`*@g=scswBKr5JO9sV^c}W@8b}(SFLj#W?tx`k} zne(02)}Vaji@$LBc=z}2Y2Yf2nw)Hmv3rl>^U-EO1?$xmLr&K&uz>yWtwh_ETnQu%(h$jua<2Yw^YUTIXv2TTNmL0YYr3tcucU#*>Qo1bFyt1ms!Z}CE9^THS76;+NlkkVr+_f|l^0@-4B!NV9`(!cL@ z2&C2jGbQdgq4H4(Ps}XzVCie%w2%ahSeVhuI$li))pEAUb1RWj)|l?1nM%T5D)4(N zJ{+&DCT=6u!g zapFPs(Z7Gct$xDa&u#Tl`ZJIfPI2ce<%{QVQKik^AfBE{GFgjrFUAuA>(VVuCTGR_ zE<%z^&pom2LoEzNn#O~SS!+_|v!B8E458E_rjD@Rt|KiX*qpqnE{Q;k>gSEYKpa$j zPZ|M?pV49;(49nJ;N3h#u6H5b>Pgn4{%&=Wgbw)6SeFN|Jf^PiumS)v>3H;-!h!$0 gE9L(W-<|M=)U|osdmOJm4|rcPl0PJ>#6SW61A(VAH~;_u diff --git a/main.py b/main.py index c50bddd..07d2d16 100644 --- a/main.py +++ b/main.py @@ -1,23 +1,22 @@ import fnmatch -import glob import os import shutil import sys from os.path import isdir, join -from pathlib import Path from PIL import Image -from pynput.keyboard import Key, Listener from PyQt5 import QtCore, QtGui, QtWidgets, uic from PyQt5.QtGui import QCursor from PyQt5.QtWidgets import * -mode = "folder" # or "folder" -#os.chdir(sys._MEIPASS) + +bundle_dir = getattr( + sys, '_MEIPASS', os.path.abspath(os.path.dirname(__file__))) + def restart_program(): python = sys.executable - os.execl(python, python, * sys.argv) + os.execl(python, python, *sys.argv) def include_patterns(*patterns): @@ -39,9 +38,9 @@ def ignore_list(path, files): for fileName in files: fullFileName = os.path.join(os.path.normpath(path), fileName) if (not os.path.isdir(fullFileName) - and not fileName.endswith('jpg') - and not fileName.endswith('jpeg') - and not fileName.endswith('png') + and not fileName.endswith('jpg') + and not fileName.endswith('jpeg') + and not fileName.endswith('png') and not fileName.endswith('mp4')): filesToIgnore.append(fileName) return filesToIgnore @@ -50,7 +49,8 @@ def ignore_list(path, files): class MyGUI(QMainWindow): def __init__(self): super(MyGUI, self).__init__() - uic.loadUi("comepress.ui", self) + uic.loadUi(os.path.abspath( + os.path.join(bundle_dir, "res/comepress.ui")), self) # Remove Titlebar and background self.setWindowFlags(QtCore.Qt.FramelessWindowHint) @@ -59,6 +59,7 @@ def __init__(self): border: none; color: white; }""") + self.setWindowIcon(QtGui.QIcon("res/inbox_tray_3d.ico")) # BUTTONS self.pushButton.clicked.connect(self.browse) @@ -99,6 +100,8 @@ def checked(self): def browse(self): folder_path = QtWidgets.QFileDialog.getExistingDirectory( self, "Select a Folder") + if folder_path == '': + return self.comepress_folder(folder_path) alert_dialog = QMessageBox.information( self, "All good!", "Successfully comepressed all files/folders") @@ -143,7 +146,7 @@ def comepress_folder(self, folder_path): folder_path + "_COMEPRESS") # Backup folder print(f"backup: {self.backup}") - if self.backup == True: + if self.backup: shutil.copytree(folder_path, backup_destination, ignore=include_patterns("*.png", "*.jpg", "*.jpeg")) @@ -155,14 +158,14 @@ def comepress_folder(self, folder_path): # Convert to WebP try: img = Image.open(root + "/" + file) + img.save(root + "/" + file.rsplit(".", 1) + [0] + ".webp", "webp") + # Remove original file + os.remove(root + "/" + file) except: alert_dialog = QMessageBox.information( self, "Error!", "Please check if " + root + "/" + file + " is not corrupt") return - img = img.save(root + "/" + file.rsplit(".", 1) - [0] + ".webp", "webp") - # Remove original file - os.remove(root + "/" + file) def comepress_file(self, file_path): # GET DETAILS @@ -176,17 +179,18 @@ def comepress_file(self, file_path): # CONVERT try: img = Image.open(parent_folder + "/" + file_name) + img.save(parent_folder + "/" + + file_name.rsplit(".", 1)[0] + ".webp", "webp") + os.remove(parent_folder + "/" + file_name) except: alert_dialog = QMessageBox.information( self, "Error!", "Please check if " + parent_folder + "/" + file_name + " is not corrupt") return - img = img.save(parent_folder + "/" + file_name.rsplit(".", 1) - [0] + ".webp", "webp") - os.remove(parent_folder + "/" + file_name) def main(): app = QApplication([]) + app.setWindowIcon(QtGui.QIcon("res/inbox_tray_3d.ico")) window = MyGUI() app.exec() diff --git a/main.spec b/main.spec index 996561f..b991f83 100644 --- a/main.spec +++ b/main.spec @@ -5,10 +5,10 @@ block_cipher = None a = Analysis( - ['comepress_pyinstaller.py'], + ['main.py'], pathex=[], binaries=[], - datas=[("comepress.ui", "."), ("unchecked.svg", "."), ("logo.png", "."), ("loading.svg", "."), ("folder.png", "."), ("checked.svg", "."), ("logo.ico", ".")], + datas=[('./res/*', 'res')], hiddenimports=[], hookspath=[], hooksconfig={}, @@ -28,18 +28,18 @@ exe = EXE( a.zipfiles, a.datas, [], - name='comepress', + name='main', debug=False, bootloader_ignore_signals=False, strip=False, upx=True, upx_exclude=[], runtime_tmpdir=None, - console=True, + console=False, disable_windowed_traceback=False, argv_emulation=False, target_arch=None, codesign_identity=None, entitlements_file=None, - icon='logo.ico', + icon='res/inbox_tray_3d.ico', ) diff --git a/checked.svg b/res/checked.svg similarity index 100% rename from checked.svg rename to res/checked.svg diff --git a/comepress.ui b/res/comepress.ui similarity index 95% rename from comepress.ui rename to res/comepress.ui index 225f68e..8334101 100644 --- a/comepress.ui +++ b/res/comepress.ui @@ -1,6 +1,6 @@ - MainWindow + Comepress @@ -70,7 +70,7 @@ border: 2px solid #323134; - border-image: url(folder.png) 0 0 0 0 stretch stretch; + border-image: url(res/folder.png) 0 0 0 0 stretch stretch; false @@ -164,7 +164,7 @@ color: #ecedec; 1 - <html><head/><body><p align="center">Copyright © 2022 <span style=" font-weight:600;">ComePress</span> <br/> Made by <span style=" font-weight:600;">Nayam Amarshe</span> with ⌨ and 🖱</p></body></html> + <html><head/><body><p align="center">Copyright © 2022 <span style=" font-weight:600;">Comepress</span> <br/> Made by <span style=" font-weight:600;">Nayam Amarshe</span> with ⌨ and 🖱</p></body></html> @@ -195,11 +195,11 @@ QCheckBox::indicator { } QCheckBox::indicator:checked { - image: url("checked.svg") + image: url("res/checked.svg") } QCheckBox::indicator:unchecked { - image: url("unchecked.svg") + image: url("res/unchecked.svg") } @@ -229,7 +229,7 @@ QCheckBox::indicator:unchecked { border: none; border-radius: none; background: none; -border-image: url(logo.png); +border-image: url(res/logo.png); diff --git a/folder.png b/res/folder.png similarity index 100% rename from folder.png rename to res/folder.png diff --git a/res/inbox_tray_3d.ico b/res/inbox_tray_3d.ico new file mode 100644 index 0000000000000000000000000000000000000000..407299596dae512f5c6801383fcc528db09a1c04 GIT binary patch literal 4286 zcmd6oZA?^G8pltw{ZM0?HfgdUZJ?&DWn}={(h)1gwySNoy0Nv%*7%{XX+PLDX{6a? zYei&meW5DgAPbc@7nOJ9MHq$wVFnyvUhmB1-nn<)?l8nPeUe{k%HwThIE-{1Fz z17*Z|u7?bi)~_*XTc5gC)sZ@Jwmo%R+m>o7Z%G|G-k92_sY$zhxGJry=q#!#tw&Rx zHgL2yZM6JS>ST4-GELQXKQ-NSWewA)Bclx+D;lmpT2370U8MbZ^;Sd0g??*ouix3w zFWKw*Bx_BNWY)Gz`eXG{@8N2xtFSWEiRvz@3ibc9RvIb0C|Mh?NbJQS$=x(4x&J*V zxlnAg!7u8}{Xw&HYp{Eq_^hs^G1QfwAwQldPiZZ!wvT8pfwOS{*d{%=&+EWZ+XvSw z+Mw^qkAU7mccLCfD_g)+-43Rj4wydQ2Yjyy#P%`ZFAdA$@F{eRf^^jea}JMvmiMO2 z&WK6*wI{U%mDBP=b&T>E4cFmquDTnz)rZ-w5{I+$$JfzRxOkb{F+Cl4Xp41~-s zkcS#KdmL_ zPMuMAoo!rj^j!u2gad+;j3P4w0rVVnpjTFepxpt2Q4c)IZ*yRu0CU(MvaldcVlGfY z`kZn@#LmNY-oFr8h2K%vMA~Z4t8K%kg%ImOZ$ezutD+Ek4osWDUi}$N9?gS^qxmqd z{T%plBhay*=Y{?bb6%MDhZb(mMb$UM(WL%O14G2vuUCsU7xD#M5B*>qL7N2v)=5R! z_H>njtvCx@CE38B%thH?X*!1E(-5#s;S*(>#(l#2h{qK51{M~6x~WDb1`gRvHG?s*8ag*IPX+cO6*yZ?LkQPO z@MH5gR`hQ|{{rTJmhyYG;4aQYp2DPD%Hd=!=PP}5jLxCT0tfP~jT*Tw7Wvnc^T#p& zi+tXX{K|Xs?~Wl6)4lj5AYlze#h{%3*stIR`j+yS=ip8Z_hK*guka(@IDduwFZCZn z|1uxuN$f0qxMH>#j?`#G>2cnxD%nkPI5_ztaqT7Pu^BfrAG zhu%M!|D}Aoo*V~qEQOn(aC;?ul+MDJ8)l$#$G^Z)n7b?ng`WWyWT63Gb}ANj-Q@zXdMMMqp45%}a3j{X>wyUV!(~gUA>^i$DzBRPM*uO*MNKAGWZz|_g|#`W4GpSyu4EW z#|8~#RHuKEw=qnB{@=kE=-x?~Kfl`x2mda>oB3gQBQuQt75Net~KRG+Vt>HiMWM@Nm!2`3d=0eqGQb zJ~~*_Mk3+a71^r|ZdMz~h8G7P+43A~csJd@jDINCJ6is?$eI&7rPY?X@9{0UMv{@E zyNkac{TJqXuU343{J%a({uoioe7EfXW2}F9{}uj7#hwT4Kfzb>|1U=maoh#p!5%hhW=@a&4d4&BNd0$a} zpzK0H><_2jpS$n+TJ6PcuU{iOUWkxC=kRNHs{<*YIF+~!;R)kYUN q`^Eff%lxj!@xFuq5%St?LY|Hh^4M=Bx*lB@VvoT+b^B?GhW`Wh7Dm(n literal 0 HcmV?d00001 diff --git a/logo.png b/res/logo.png similarity index 100% rename from logo.png rename to res/logo.png diff --git a/unchecked.svg b/res/unchecked.svg similarity index 100% rename from unchecked.svg rename to res/unchecked.svg