From 6f790862d612cd1493ad27bd83fdfd23d192ea76 Mon Sep 17 00:00:00 2001 From: TheFloW Date: Mon, 1 Jan 2018 12:11:02 +0100 Subject: [PATCH] Update v1.77 --- README.md | 6 ++ archive.c | 34 +++++++---- init.c | 90 ++++++++++++++-------------- main_context.c | 12 ++-- resources/changeinfo.txt | 8 +++ resources/electron/context.png | Bin 1831 -> 1840 bytes resources/electron/context_more.png | Bin 1254 -> 6360 bytes 7 files changed, 87 insertions(+), 63 deletions(-) diff --git a/README.md b/README.md index a957d785..6aa4ed04 100644 --- a/README.md +++ b/README.md @@ -99,6 +99,12 @@ The english language file is provided in **'VitaShellCustomization.rar'** and av * sakya for Lightmp3 * Everybody who contributed on vitasdk +### Changelog 1.77 ### +- Added archive support for .7z, .tar.gz, .tar.bz2 and more by using libarchive. +- Improved archive file system (opening archives should now be much faster). +- Fixed keyboard freeze after using it multiple times. +- Fixed file browser cursor correction. + ### Changelog 1.76 ### - Added DLC refresh + restore license from Sqlite DB by VitaSmith. - Added license database refresh by VitaSmith. diff --git a/archive.c b/archive.c index 01eece7d..bf42b973 100644 --- a/archive.c +++ b/archive.c @@ -39,8 +39,8 @@ typedef struct ArchiveFileNode { struct ArchiveFileNode *child; struct ArchiveFileNode *next; char name[MAX_NAME_LENGTH]; - int name_length; int is_folder; + SceMode mode; SceOff size; SceDateTime ctime; SceDateTime mtime; @@ -75,14 +75,18 @@ ArchiveFileNode *createArchiveNode(const char *name, const struct stat *stat, in node->next = NULL; if (is_folder || stat->st_mode & S_IFDIR) node->is_folder = 1; - node->name_length = strlen(name); strcpy(node->name, name); if (stat) { SceDateTime time; + if (stat->st_mode & S_IFDIR) + node->mode |= SCE_S_IFDIR; + if (stat->st_mode & S_IFREG) + node->mode |= SCE_S_IFREG; + node->size = stat->st_size; - + sceRtcSetTime_t(&time, stat->st_ctime); convertLocalTimeToUtc(&node->ctime, &time); @@ -336,7 +340,7 @@ int fileListGetArchiveEntries(FileList *list, const char *path, int sort) { list->files++; } - entry->name_length = curr->name_length; + entry->name_length = strlen(entry->name); entry->size = curr->size; memcpy(&entry->ctime, (SceDateTime *)&curr->ctime, sizeof(SceDateTime)); @@ -355,7 +359,12 @@ int fileListGetArchiveEntries(FileList *list, const char *path, int sort) { int getArchivePathInfo(const char *path, uint64_t *size, uint32_t *folders, uint32_t *files) { SceIoStat stat; memset(&stat, 0, sizeof(SceIoStat)); - if (archiveFileGetstat(path, &stat) < 0) { + + int res = archiveFileGetstat(path, &stat); + if (res < 0) + return res; + + if (SCE_S_ISDIR(stat.st_mode)) { FileList list; memset(&list, 0, sizeof(FileList)); fileListGetArchiveEntries(&list, path, SORT_NONE); @@ -392,7 +401,12 @@ int getArchivePathInfo(const char *path, uint64_t *size, uint32_t *folders, uint int extractArchivePath(const char *src, const char *dst, FileProcessParam *param) { SceIoStat stat; memset(&stat, 0, sizeof(SceIoStat)); - if (archiveFileGetstat(src, &stat) < 0) { + + int res = archiveFileGetstat(src, &stat); + if (res < 0) + return res; + + if (SCE_S_ISDIR(stat.st_mode)) { FileList list; memset(&list, 0, sizeof(FileList)); fileListGetArchiveEntries(&list, src, SORT_NONE); @@ -510,15 +524,12 @@ int extractArchivePath(const char *src, const char *dst, FileProcessParam *param } int archiveFileGetstat(const char *file, SceIoStat *stat) { - // Is directory - if (hasEndSlash(file + archive_path_start)) - return -1; - ArchiveFileNode *node = findArchiveNode(file + archive_path_start); if (!node) return -1; if (stat) { + stat->st_mode = node->mode; stat->st_size = node->size; memcpy(&stat->st_ctime, &node->ctime, sizeof(SceDateTime)); memcpy(&stat->st_mtime, &node->mtime, sizeof(SceDateTime)); @@ -598,8 +609,7 @@ int ReadArchiveFile(const char *file, void *buf, int size) { } int archiveClose() { - freeArchiveNodes(archive_root->child); - free(archive_root); + freeArchiveNodes(archive_root); return 0; } diff --git a/init.c b/init.c index dd44bd51..a8c8544d 100644 --- a/init.c +++ b/init.c @@ -91,51 +91,51 @@ static DefaultFile default_files[] = { DEFAULT_FILE("ux0:VitaShell/theme/theme.txt", theme_txt, 0), - DEFAULT_FILE("ux0:VitaShell/theme/Default/colors.txt", default_colors_txt, 0), - DEFAULT_FILE("ux0:VitaShell/theme/Default/archive_icon.png", default_archive_icon_png, 0), - DEFAULT_FILE("ux0:VitaShell/theme/Default/audio_icon.png", default_audio_icon_png, 0), - DEFAULT_FILE("ux0:VitaShell/theme/Default/battery.png", default_battery_png, 0), - DEFAULT_FILE("ux0:VitaShell/theme/Default/battery_bar_charge.png", default_battery_bar_charge_png, 0), - DEFAULT_FILE("ux0:VitaShell/theme/Default/battery_bar_green.png", default_battery_bar_green_png, 0), - DEFAULT_FILE("ux0:VitaShell/theme/Default/battery_bar_red.png", default_battery_bar_red_png, 0), - DEFAULT_FILE("ux0:VitaShell/theme/Default/cover.png", default_cover_png, 0), - DEFAULT_FILE("ux0:VitaShell/theme/Default/fastforward.png", default_fastforward_png, 0), - DEFAULT_FILE("ux0:VitaShell/theme/Default/fastrewind.png", default_fastrewind_png, 0), - DEFAULT_FILE("ux0:VitaShell/theme/Default/file_icon.png", default_file_icon_png, 0), - DEFAULT_FILE("ux0:VitaShell/theme/Default/folder_icon.png", default_folder_icon_png, 0), - DEFAULT_FILE("ux0:VitaShell/theme/Default/ftp.png", default_ftp_png, 0), - DEFAULT_FILE("ux0:VitaShell/theme/Default/image_icon.png", default_image_icon_png, 0), - DEFAULT_FILE("ux0:VitaShell/theme/Default/pause.png", default_pause_png, 0), - DEFAULT_FILE("ux0:VitaShell/theme/Default/play.png", default_play_png, 0), - DEFAULT_FILE("ux0:VitaShell/theme/Default/sfo_icon.png", default_sfo_icon_png, 0), - DEFAULT_FILE("ux0:VitaShell/theme/Default/text_icon.png", default_text_icon_png, 0), - - DEFAULT_FILE("ux0:VitaShell/theme/Electron/colors.txt", electron_colors_txt, 0), - DEFAULT_FILE("ux0:VitaShell/theme/Electron/archive_icon.png", electron_archive_icon_png, 0), - DEFAULT_FILE("ux0:VitaShell/theme/Electron/audio_icon.png", electron_audio_icon_png, 0), - DEFAULT_FILE("ux0:VitaShell/theme/Electron/battery.png", electron_battery_png, 0), - DEFAULT_FILE("ux0:VitaShell/theme/Electron/battery_bar_charge.png", electron_battery_bar_charge_png, 0), - DEFAULT_FILE("ux0:VitaShell/theme/Electron/battery_bar_green.png", electron_battery_bar_green_png, 0), - DEFAULT_FILE("ux0:VitaShell/theme/Electron/battery_bar_red.png", electron_battery_bar_red_png, 0), - DEFAULT_FILE("ux0:VitaShell/theme/Electron/bg_audioplayer.png", electron_bg_audioplayer_png, 0), - DEFAULT_FILE("ux0:VitaShell/theme/Electron/bg_browser.png", electron_bg_browser_png, 0), - DEFAULT_FILE("ux0:VitaShell/theme/Electron/bg_hexeditor.png", electron_bg_hexeditor_png, 0), - DEFAULT_FILE("ux0:VitaShell/theme/Electron/bg_photoviewer.png", electron_bg_photoviewer_png, 0), - DEFAULT_FILE("ux0:VitaShell/theme/Electron/bg_texteditor.png", electron_bg_texteditor_png, 0), - DEFAULT_FILE("ux0:VitaShell/theme/Electron/context.png", electron_context_png, 0), - DEFAULT_FILE("ux0:VitaShell/theme/Electron/context_more.png", electron_context_more_png, 0), - DEFAULT_FILE("ux0:VitaShell/theme/Electron/cover.png", electron_cover_png, 0), - DEFAULT_FILE("ux0:VitaShell/theme/Electron/dialog.png", electron_dialog_png, 0), - DEFAULT_FILE("ux0:VitaShell/theme/Electron/fastforward.png", electron_fastforward_png, 0), - DEFAULT_FILE("ux0:VitaShell/theme/Electron/fastrewind.png", electron_fastrewind_png, 0), - DEFAULT_FILE("ux0:VitaShell/theme/Electron/file_icon.png", electron_file_icon_png, 0), - DEFAULT_FILE("ux0:VitaShell/theme/Electron/folder_icon.png", electron_folder_icon_png, 0), - DEFAULT_FILE("ux0:VitaShell/theme/Electron/ftp.png", electron_ftp_png, 0), - DEFAULT_FILE("ux0:VitaShell/theme/Electron/image_icon.png", electron_image_icon_png, 0), - DEFAULT_FILE("ux0:VitaShell/theme/Electron/pause.png", electron_pause_png, 0), - DEFAULT_FILE("ux0:VitaShell/theme/Electron/play.png", electron_play_png, 0), - DEFAULT_FILE("ux0:VitaShell/theme/Electron/sfo_icon.png", electron_sfo_icon_png, 0), - DEFAULT_FILE("ux0:VitaShell/theme/Electron/text_icon.png", electron_text_icon_png, 0), + DEFAULT_FILE("ux0:VitaShell/theme/Default/colors.txt", default_colors_txt, 1), + DEFAULT_FILE("ux0:VitaShell/theme/Default/archive_icon.png", default_archive_icon_png, 1), + DEFAULT_FILE("ux0:VitaShell/theme/Default/audio_icon.png", default_audio_icon_png, 1), + DEFAULT_FILE("ux0:VitaShell/theme/Default/battery.png", default_battery_png, 1), + DEFAULT_FILE("ux0:VitaShell/theme/Default/battery_bar_charge.png", default_battery_bar_charge_png, 1), + DEFAULT_FILE("ux0:VitaShell/theme/Default/battery_bar_green.png", default_battery_bar_green_png, 1), + DEFAULT_FILE("ux0:VitaShell/theme/Default/battery_bar_red.png", default_battery_bar_red_png, 1), + DEFAULT_FILE("ux0:VitaShell/theme/Default/cover.png", default_cover_png, 1), + DEFAULT_FILE("ux0:VitaShell/theme/Default/fastforward.png", default_fastforward_png, 1), + DEFAULT_FILE("ux0:VitaShell/theme/Default/fastrewind.png", default_fastrewind_png, 1), + DEFAULT_FILE("ux0:VitaShell/theme/Default/file_icon.png", default_file_icon_png, 1), + DEFAULT_FILE("ux0:VitaShell/theme/Default/folder_icon.png", default_folder_icon_png, 1), + DEFAULT_FILE("ux0:VitaShell/theme/Default/ftp.png", default_ftp_png, 1), + DEFAULT_FILE("ux0:VitaShell/theme/Default/image_icon.png", default_image_icon_png, 1), + DEFAULT_FILE("ux0:VitaShell/theme/Default/pause.png", default_pause_png, 1), + DEFAULT_FILE("ux0:VitaShell/theme/Default/play.png", default_play_png, 1), + DEFAULT_FILE("ux0:VitaShell/theme/Default/sfo_icon.png", default_sfo_icon_png, 1), + DEFAULT_FILE("ux0:VitaShell/theme/Default/text_icon.png", default_text_icon_png, 1), + + DEFAULT_FILE("ux0:VitaShell/theme/Electron/colors.txt", electron_colors_txt, 1), + DEFAULT_FILE("ux0:VitaShell/theme/Electron/archive_icon.png", electron_archive_icon_png, 1), + DEFAULT_FILE("ux0:VitaShell/theme/Electron/audio_icon.png", electron_audio_icon_png, 1), + DEFAULT_FILE("ux0:VitaShell/theme/Electron/battery.png", electron_battery_png, 1), + DEFAULT_FILE("ux0:VitaShell/theme/Electron/battery_bar_charge.png", electron_battery_bar_charge_png, 1), + DEFAULT_FILE("ux0:VitaShell/theme/Electron/battery_bar_green.png", electron_battery_bar_green_png, 1), + DEFAULT_FILE("ux0:VitaShell/theme/Electron/battery_bar_red.png", electron_battery_bar_red_png, 1), + DEFAULT_FILE("ux0:VitaShell/theme/Electron/bg_audioplayer.png", electron_bg_audioplayer_png, 1), + DEFAULT_FILE("ux0:VitaShell/theme/Electron/bg_browser.png", electron_bg_browser_png, 1), + DEFAULT_FILE("ux0:VitaShell/theme/Electron/bg_hexeditor.png", electron_bg_hexeditor_png, 1), + DEFAULT_FILE("ux0:VitaShell/theme/Electron/bg_photoviewer.png", electron_bg_photoviewer_png, 1), + DEFAULT_FILE("ux0:VitaShell/theme/Electron/bg_texteditor.png", electron_bg_texteditor_png, 1), + DEFAULT_FILE("ux0:VitaShell/theme/Electron/context.png", electron_context_png, 1), + DEFAULT_FILE("ux0:VitaShell/theme/Electron/context_more.png", electron_context_more_png, 1), + DEFAULT_FILE("ux0:VitaShell/theme/Electron/cover.png", electron_cover_png, 1), + DEFAULT_FILE("ux0:VitaShell/theme/Electron/dialog.png", electron_dialog_png, 1), + DEFAULT_FILE("ux0:VitaShell/theme/Electron/fastforward.png", electron_fastforward_png, 1), + DEFAULT_FILE("ux0:VitaShell/theme/Electron/fastrewind.png", electron_fastrewind_png, 1), + DEFAULT_FILE("ux0:VitaShell/theme/Electron/file_icon.png", electron_file_icon_png, 1), + DEFAULT_FILE("ux0:VitaShell/theme/Electron/folder_icon.png", electron_folder_icon_png, 1), + DEFAULT_FILE("ux0:VitaShell/theme/Electron/ftp.png", electron_ftp_png, 1), + DEFAULT_FILE("ux0:VitaShell/theme/Electron/image_icon.png", electron_image_icon_png, 1), + DEFAULT_FILE("ux0:VitaShell/theme/Electron/pause.png", electron_pause_png, 1), + DEFAULT_FILE("ux0:VitaShell/theme/Electron/play.png", electron_play_png, 1), + DEFAULT_FILE("ux0:VitaShell/theme/Electron/sfo_icon.png", electron_sfo_icon_png, 1), + DEFAULT_FILE("ux0:VitaShell/theme/Electron/text_icon.png", electron_text_icon_png, 1), DEFAULT_FILE("ux0:VitaShell/module/user.suprx", user_suprx, 1), DEFAULT_FILE("ux0:VitaShell/module/usbdevice.skprx", usbdevice_skprx, 1), diff --git a/main_context.c b/main_context.c index fc2e27d0..b081480c 100644 --- a/main_context.c +++ b/main_context.c @@ -103,12 +103,12 @@ enum MenuMoreEntrys { }; MenuEntry menu_more_entries[] = { - { COMPRESS, 13, 0, CTX_INVISIBLE }, - { INSTALL_ALL, 14, 0, CTX_INVISIBLE }, - { INSTALL_FOLDER, 15, 0, CTX_INVISIBLE }, - { EXPORT_MEDIA, 16, 0, CTX_INVISIBLE }, - { CALCULATE_SHA1, 17, 0, CTX_INVISIBLE }, - { OPEN_DECRYPTED, 18, 0, CTX_INVISIBLE }, + { COMPRESS, 12, 0, CTX_INVISIBLE }, + { INSTALL_ALL, 13, 0, CTX_INVISIBLE }, + { INSTALL_FOLDER, 14, 0, CTX_INVISIBLE }, + { EXPORT_MEDIA, 15, 0, CTX_INVISIBLE }, + { CALCULATE_SHA1, 16, 0, CTX_INVISIBLE }, + { OPEN_DECRYPTED, 17, 0, CTX_INVISIBLE }, }; #define N_MENU_MORE_ENTRIES (sizeof(menu_more_entries) / sizeof(MenuEntry)) diff --git a/resources/changeinfo.txt b/resources/changeinfo.txt index 11861f90..f8f23e59 100644 --- a/resources/changeinfo.txt +++ b/resources/changeinfo.txt @@ -314,4 +314,12 @@ - Fixed C2-12828-1 error.
]]> + + +- Improved archive file system (opening archives should now be much faster).
+- Fixed keyboard freeze after using it multiple times.
+- Fixed file browser cursor correction.
+ ]]> +
diff --git a/resources/electron/context.png b/resources/electron/context.png index 33e37a5bc76629a9f352c67cb30f1a49a22f3764..e99cd439a30546c0e852aa5d8b55dfc8bda0e6a7 100644 GIT binary patch literal 1840 zcmbtUYfM{Z7(R#7p3~Ew)6#;jWeE63Ba+c|FtUMMdSP5jTkdijWhMYLSQ2jAgW z3wEfX;ZGv(gXc1nzDNf)rI}};+IK>;&P#P|GR+y8_Dq<%B~0U#X@QNH0zus z+ePMe<3*Qcx>lrmj5KshayrDh9k68*FX|VWE(%Hp2!n?(^&;kRxaMu_`8NfnSEahM zgs~UiJ;|%Oj+T#LrGr@65U*;KUwI8JA4bcD(25bnJi)IV1!7>J$J7hePLT$WB#OS=X3~)2Lz>q{HjsdJOS?lbc1ls1X?yMh~FQs zX%TIy6DAxMZ8;IF3^;nV(-&&7tYs8Zp@FW|s2(sM5@#FC1CC=bp?h(=+||vB_)!pT-3&08iu9kTA7B?jpeRAe<=Yc{uT7@+t9*u-Hfn}WAEJIn z!12QleXTbv{V7D_r;}NzG4x%YB^DV$R0=sk%tctA;Q+s;rWY|)A~IbJH({xSMWsA0 zv2UC$LQ`?}na3*N|9K!S3Ii~=u~dky2oF^FVdsFt|K4UGx{exPF^Wnx0jqE0tIGs&mw(q1aWmxo=Q~JPHljK^SPDatB)yESU0VD=b(CX zk%PR|8Te6#2Igo^a2*U`JNW_WR}y`70oq__9zNlZWFjM8rKSU+a8T4;tZ_`nAt^W{ zCPY%?QN+@Rzj z$t=sGOu_555^0SM`aT0%rB=i#_!{Ga)y#!t;QkYmyLW4gxEsxZp!>YlEsm75=H_NM tMQJ@YQW0bIHmCPRKez6`mH!Xmxcd;zzb&14U5gXUscfA=JFGT0{Qc7*@{ literal 1831 zcmb`FdrVVT9LMin3w_Yi2NJd=+n`G?VvWI`}kA3gWJ?H!$_nhD7 zck&{|d@6Yt8G<0HAT%Tjj5Y{*Z4VI#X1~)LeZhcF4GIr}pw2><&15IAhBKr1!BCrR z_cIV#8Yz-;fsw&0g-#66Ln|0u9g|bc3@LUCE_CA*F+)n2oFcd2BATF*&MTwy${D;e zD8=F;x#k*HO^#}S)%~ub8k(?*9DSW6Yo>;yFw#$nsKY1RbW(QEL(6G`Dr&faByFOK z4K$&i$t`h-1i5;Ww2>mN#U*18!xTGFJY%4Lw1Sj_~xTTbcdKkHlPw2)a z^%4|jd_or?ro}0~(^=W>tS~#rwL8bPImLIuDHc~zHC2SV3iXtTS|(RV1?LH^q>5`@ zq8gwR7IJi>OJqG!c7rH4;Szhm;bC=iV{_m#0CJ6#s>fk zsiJCHNFgnx7*6PfmF?8fGQ6S{uk0YinCQS8S`H3O3P%ajMtqEk8deP_18DVt0AAHi zlw2c4)=>oIgeW6H+TbK>0?+_GK$R>pl4MO}Kqk45AiDuj)3`d4xRxTQ06g)E7K%tu z4bxM^7;reD0~co|O6sU014URt4=uxCC(${{n;D#Znm~^+SKR{4ontY)-~v#DdV<7= zmp41fn<$~>FgUQRkcOoM}iCLruHh&`CFm1E)<{|@=bgvA3n0v&md z3`e5F(Y&3DxiBGvN{7#}cDT0frg+~9`_$)&;ejI%gcAxvf~4mrmqt>jDiDb9-JS51 zm?)l*Y~SmtV0e4JvE$xM%TE${v6fCEF(f|w@6Xt$)=o^X>vpQn{d#2jz@6EEJ73t} zg#ocwwDp<$AhIdds8oU0s*`9>kBcS?h`h4f-MAb-kU{bCLO&e!+&#N!S{t&lRHHtY z?vxRaGfy@9PI)4^1!5!m4I;X~7+^GhE1fgWA_0*a!?bU%_!&A9ab*=5&)I75cp^j7 zUKC^~lTwdU&>z@$hd1gM0w#}H&!bamF_PXgU&6YY5 zOjLD+X?JRbD>WXoFHPO=C21Fb@n0#pBFSEUbSPK6iXzDQXpLc#WxeG8N%qkr`*@H0 zGp~BAKbt>j&*_WN+JW_e-PGtSza|6l1jnx(V4g9n@v11T=6Ej4Haa#orWo(<$^?D(LXWY(I{c|5yKMqkPo}Xi-13-PoX2$V zu|3e5b`d><)R>Li(oO!h@UzFd6wSGyo-dv8>{V&Iu?@GSU#aOmt7Z8+M9mf}_vaRD z%a-Vms^bARqt324Y>fr`{ws8=vHJt<7?xFxMo;7c*#AM%!nyV6;LR6{ezG^MY_mKr jRa#K1eC3kAI^E1a2ATR+JevhO9$R~*t7ob=J3Xg5oz diff --git a/resources/electron/context_more.png b/resources/electron/context_more.png index 0e8567abae2226660c67a78867ed90122dc6678c..cd3b98af00ef82f88f1c494952ab8df3c58f379f 100644 GIT binary patch literal 6360 zcmeHLS5#Bm*4{}d2Bg<0(xfT9NJpv=0cp~kK?LMVi2@QzAOZpcazvD(RB4KbLzj+0 znu;NGL6K&m7pXCT+?{al7~b)ZJH~yvFaPji?=@GMbItY5xz_&nx?^Ex#Kdrn0RRA| z^GE|L0D$2E04jKd4s0?03X}l=gNnDlzD0nQk)GiBbNb5iYRbye3NrElfXT{E3%0&E z#vMm&QE9Qb&zkU{@7h%>D3YlKnIdyq9?oivzXu2_8(5_lA4Z6SX0TE&hu0{8Z!XI%&)q!ShB{%Pvc_&iqZr3#ALaa>l*F4p9oWsR8R!PT|{`9xQ4b3Nf09o`BvN zkF_u3;-BxTv9~6rpb$K>M@S6{tzz!cf#+j&y8ORXBErp-0g3zLGT#C&Uh$E3zb~N> zCH*-Bm_oj}v^F4X|BlGf!_wLN&QXS4q$D08=6o^sZYoFOG?92=HnH=a9J9*ZlQZ(8 znFt5I=^KD2anFG>#1~N|tTC#prYh$v?b|9b6zQ_}`2Nn#G}oBO6@-BRseRinB9jTI zDE6owBggrAa{(@k5R0b$I08x*NT_NJV#Z$QZwz;}>X?!8l6*cs?rZ|dy>?1=Zk3$N z9I1aPoM_ehY4xicW+PSgexSU*tBRjzXt6=Z>)sjkkE7pm<46MZKZE$W+4e+Q<7FS5 zGw3Nc6*Nt&b$ZPaPn)S1t3%3tL}F?GSvb~^cIN|$tuM_US|oH#CxRc4IL#&q54$4S zw~A%#GJ^deB=%=!WbYEAeq!zFO@F@T7Ku!DH!@JDXSeKKdbH;VRT2cw>A)6rj?ck3 z@H8**Z1n)k6bz~>5l?d+B|jC#c@JVB$is=N&EtI#RfZCON*9#JrWCD=<_)~%KBc5e zFLSF0MKcbul4H)nomyjfr^6a^`!y?Z9u=&tdqs�B**Zyy;)OG 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 literal 1254 zcmbu7ZA@Eb6vuCE=?lH(wuNMNn=+W$R)~@a(=aNguk?l1?zUZl%37qCij%Solj_Xa zi;+Z)qopmZT?^}MX~$+ArLL`o7?UN#I$3;)k_j9J^->5 zewNA)vcQGOeXtc+(@AI;U@?Us*r9*4HGpb@z{Su_GWUN3r1z1@<|OPhst!W=V9@S^ zvm1E>*XWSKqm1^b$%p1n%-wm&>?;p~wFmBhyrada0Pp7+_#7`r|CsiNa5r4Wrxg;R z{>_`eFB=jS)C%c0vQwtR4#)2Fp~ESP!||i#i>|9n&y)XLnY#UbNB!c?#Sf{)`}n^t z>2y`q5aukZ;9ncAR4eXnys#%f@nXF-B6xfvgxjxwrR8HbBIe1?)a!E_8@vR5nswdj zUG41~QZ{Cv5}R@f)VoS_LNvV#q7$h1NYn28%_L-hUPrx&sB!3$r`8SC-@VJL$$z^D z3;IPv%1rY!;>eQU7sBJ38(RLB9&5~V{Oz83W#i>Npks!$w{L;SpaG=!R*Mhhd{yxG zW^_TzHxJ;=bx>4kgrdKUwwPx?3@rzq9IdL&FXy1D?-*1y3ZUwz2q?{;L)-b;HDX@* z*6a>(MBw*_@Pq0vwfq~u^u#TMeErve@O`L&WVQ6Zb1&lAvW+~uluhB)g5HL${m)6# e{RsWvv;Mk3R*|3JM>N}BE9MkZjU+CzocbHyTM35%