From 595b9441e9ebb909de6a421b9699cb7c4cef491e Mon Sep 17 00:00:00 2001 From: longpanda Date: Wed, 15 Jun 2022 20:53:35 +0800 Subject: [PATCH] Support prameters expansion in auto install script. --- .../grub-2.04/grub-core/ventoy/ventoy.c | 19 ++ .../grub-2.04/grub-core/ventoy/ventoy_cmd.c | 193 ++++++++++++++++++ .../grub-2.04/grub-core/ventoy/ventoy_def.h | 21 +- .../grub-2.04/grub-core/ventoy/ventoy_linux.c | 31 +-- .../grub-core/ventoy/ventoy_plugin.c | 12 +- .../grub-core/ventoy/ventoy_windows.c | 85 ++++++-- GRUB2/MOD_SRC/grub-2.04/include/grub/ventoy.h | 8 +- INSTALL/ventoy/vtoyjump32.exe | Bin 126464 -> 127488 bytes INSTALL/ventoy/vtoyjump64.exe | Bin 151552 -> 151552 bytes vtoyjump/vtoyjump/vtoyjump.c | 55 ++++- vtoyjump/vtoyjump/vtoyjump.h | 10 +- 11 files changed, 381 insertions(+), 53 deletions(-) diff --git a/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy.c b/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy.c index 2f1faa34..00ebba52 100644 --- a/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy.c +++ b/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy.c @@ -76,7 +76,26 @@ void ventoy_str_toupper(char *str) } } +char *ventoy_str_last(char *str, char ch) +{ + char *pos = NULL; + char *last = NULL; + + if (!str) + { + return NULL; + } + for (pos = str; *pos; pos++) + { + if (*pos == ch) + { + last = pos; + } + } + + return last; +} int ventoy_strcmp(const char *pattern, const char *str) { diff --git a/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_cmd.c b/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_cmd.c index facd0ede..d598a178 100644 --- a/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_cmd.c +++ b/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_cmd.c @@ -45,6 +45,7 @@ #include #include #include +#include #include #include "ventoy_def.h" #include "miniz.h" @@ -3366,12 +3367,177 @@ end: VENTOY_CMD_RETURN(GRUB_ERR_NONE); } +static int ventoy_var_expand(int *flag, const char *var, char *value, int len) +{ + int i = 0; + int n = 0; + char c; + grub_uint8_t bytes[32]; + + if (grub_strncmp(var, "VT_RAND_", 8) == 0) + { + grub_crypto_get_random(bytes, sizeof(bytes)); + if (grub_strcmp(var + 8, "9") == 0) + { + n = 1; + } + else if (grub_strcmp(var + 8, "99") == 0) + { + n = 2; + } + else if (grub_strcmp(var + 8, "999") == 0) + { + n = 3; + } + else if (grub_strcmp(var + 8, "9999") == 0) + { + n = 4; + } + + for (i = 0; i < n; i++) + { + value[i] = '0' + (bytes[i] % 10); + } + } + else + { + if (*flag == 0) + { + *flag = 1; + grub_printf("\n=================== Parameter Expansion ===================\n\n"); + } + + grub_printf("<%s>: ", var); + grub_refresh(); + + while (i < (len - 1)) + { + c = grub_getkey(); + if ((c == '\n') || (c == '\r')) + { + grub_printf("\n"); + grub_refresh(); + break; + } + + if (grub_isprint(c)) + { + grub_printf("%c", c); + grub_refresh(); + value[i++] = c; + value[i] = 0; + } + else if (c == '\b') + { + if (i > 0) + { + value[i - 1] = ' '; + grub_printf("\r<%s>: %s", var, value); + + value[i - 1] = 0; + grub_printf("\r<%s>: %s", var, value); + + grub_refresh(); + i--; + } + } + } + } + + if (value[0] == 0) + { + grub_snprintf(value, len, "%s", var); + } + + return 0; +} + +static int ventoy_auto_install_var_expand(install_template *node) +{ + int pos = 0; + int flag = 0; + int newlen = 0; + char *start = NULL; + char *end = NULL; + char *newbuf = NULL; + char *curline = NULL; + char *nextline = NULL; + grub_uint8_t *code = NULL; + char value[512]; + + code = (grub_uint8_t *)node->filebuf; + + if ((code[0] == 0xff && code[1] == 0xfe) || (code[0] == 0xfe && code[1] == 0xff)) + { + debug("UCS-2 encoding NOT supported\n"); + return 0; + } + + start = grub_strstr(node->filebuf, "$<"); + if (!start) + { + debug("no need to expand variable, no start.\n"); + return 0; + } + + end = grub_strstr(start + 2, ">$"); + if (!end) + { + debug("no need to expand variable, no end.\n"); + return 0; + } + + newlen = grub_max(node->filelen * 10, VTOY_SIZE_128KB); + newbuf = grub_malloc(newlen); + if (!newbuf) + { + debug("Failed to alloc newbuf %d\n", newlen); + return 0; + } + + for (curline = node->filebuf; curline; curline = nextline) + { + nextline = ventoy_get_line(curline); + + start = grub_strstr(curline, "$<"); + if (start) + { + end = grub_strstr(start + 2, ">$"); + } + + if (start && end) + { + *start = *end = 0; + VTOY_APPEND_NEWBUF(curline); + + value[sizeof(value) - 1] = 0; + ventoy_var_expand(&flag, start + 2, value, sizeof(value) - 1); + VTOY_APPEND_NEWBUF(value); + + VTOY_APPEND_NEWBUF(end + 2); + } + else + { + VTOY_APPEND_NEWBUF(curline); + } + + newbuf[pos++] = '\n'; + } + + grub_free(node->filebuf); + node->filebuf = newbuf; + node->filelen = pos; + + return 0; +} + static grub_err_t ventoy_cmd_sel_auto_install(grub_extcmd_context_t ctxt, int argc, char **args) { int i = 0; int pos = 0; int defidx = 1; char *buf = NULL; + grub_file_t file = NULL; char configfile[128]; install_template *node = NULL; @@ -3440,6 +3606,33 @@ static grub_err_t ventoy_cmd_sel_auto_install(grub_extcmd_context_t ctxt, int ar node->cursel = g_ventoy_last_entry - 1; + grub_check_free(node->filebuf); + node->filelen = 0; + + if (node->cursel >= 0 && node->cursel < node->templatenum) + { + file = ventoy_grub_file_open(VENTOY_FILE_TYPE, "%s%s", ventoy_get_env("vtoy_iso_part"), + node->templatepath[node->cursel].path); + if (file) + { + node->filebuf = grub_malloc(file->size + 1); + if (node->filebuf) + { + grub_file_read(file, node->filebuf, file->size); + grub_file_close(file); + node->filebuf[file->size] = 0; + node->filelen = (int)file->size; + + ventoy_auto_install_var_expand(node); + } + } + else + { + debug("Failed to open auto install script <%s%s>\n", + ventoy_get_env("vtoy_iso_part"), node->templatepath[node->cursel].path); + } + } + VENTOY_CMD_RETURN(GRUB_ERR_NONE); } diff --git a/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_def.h b/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_def.h index d1163628..3ce2374f 100644 --- a/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_def.h +++ b/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_def.h @@ -36,11 +36,14 @@ #define VTOY_SIZE_512KB (512 * 1024) #define VTOY_SIZE_1KB 1024 #define VTOY_SIZE_32KB (32 * 1024) +#define VTOY_SIZE_128KB (128 * 1024) #define JSON_SUCCESS 0 #define JSON_FAILED 1 #define JSON_NOT_FOUND 2 +#define WINDATA_FLAG_TEMPLATE 1 + #define ulong unsigned long #define ulonglong unsigned long long @@ -84,6 +87,16 @@ return (err);\ } +#define VTOY_APPEND_NEWBUF(buf) \ +{\ + char *__c = buf;\ + while (*__c)\ + {\ + newbuf[pos++] = *__c;\ + __c++;\ + }\ +} + typedef enum VTOY_FILE_FLT { VTOY_FILE_FLT_ISO = 0, /* .iso */ @@ -488,6 +501,7 @@ typedef struct wim_tail grub_uint8_t *jump_bin_data; grub_uint32_t bin_raw_len; grub_uint32_t bin_align_len; + grub_uint32_t windata_flag; grub_uint8_t *new_meta_data; grub_uint32_t new_meta_len; @@ -853,6 +867,9 @@ typedef struct install_template int templatenum; file_fullpath *templatepath; + char *filebuf; + int filelen; + struct install_template *next; }install_template; @@ -1061,15 +1078,15 @@ extern grub_uint32_t g_ventoy_plat_data; void ventoy_str_tolower(char *str); void ventoy_str_toupper(char *str); char * ventoy_get_line(char *start); +char *ventoy_str_last(char *str, char ch); int ventoy_cmp_img(img_info *img1, img_info *img2); void ventoy_swap_img(img_info *img1, img_info *img2); -char * ventoy_plugin_get_cur_install_template(const char *isopath); +char * ventoy_plugin_get_cur_install_template(const char *isopath, install_template **cur); install_template * ventoy_plugin_find_install_template(const char *isopath); persistence_config * ventoy_plugin_find_persistent(const char *isopath); grub_uint64_t ventoy_get_vtoy_partsize(int part); void ventoy_plugin_dump_injection(void); void ventoy_plugin_dump_auto_install(void); -int ventoy_fill_windows_rtdata(void *buf, char *isopath); int ventoy_plugin_get_persistent_chunklist(const char *isopath, int index, ventoy_img_chunk_list *chunk_list); const char * ventoy_plugin_get_injection(const char *isopath); const char * ventoy_plugin_get_menu_alias(int type, const char *isopath); diff --git a/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_linux.c b/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_linux.c index 244a684e..f0ac3251 100644 --- a/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_linux.c +++ b/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_linux.c @@ -1211,6 +1211,7 @@ grub_err_t ventoy_cmd_load_cpio(grub_extcmd_context_t ctxt, int argc, char **arg grub_file_t file; grub_file_t archfile; grub_file_t tmpfile; + install_template *template_node = NULL; ventoy_img_chunk_list chunk_list; (void)ctxt; @@ -1257,26 +1258,17 @@ grub_err_t ventoy_cmd_load_cpio(grub_extcmd_context_t ctxt, int argc, char **arg persistent_buf = (char *)(chunk_list.chunk); } - template_file = ventoy_plugin_get_cur_install_template(args[1]); + template_file = ventoy_plugin_get_cur_install_template(args[1], &template_node); if (template_file) { - debug("auto install template: <%s>\n", template_file); - tmpfile = ventoy_grub_file_open(VENTOY_FILE_TYPE, "%s%s", args[2], template_file); - if (tmpfile) - { - debug("auto install script size %d\n", (int)tmpfile->size); - template_size = tmpfile->size; - template_buf = grub_malloc(template_size); - if (template_buf) - { - grub_file_read(tmpfile, template_buf, template_size); - } - - grub_file_close(tmpfile); - } - else + debug("auto install template: <%s> \n", + template_file, template_node->filebuf, template_node->filelen); + + template_size = template_node->filelen; + template_buf = grub_malloc(template_size); + if (template_buf) { - debug("Failed to open install script %s%s\n", args[2], template_file); + grub_memcpy(template_buf, template_node->filebuf, template_size); } } else @@ -1363,15 +1355,14 @@ grub_err_t ventoy_cmd_load_cpio(grub_extcmd_context_t ctxt, int argc, char **arg { headlen = ventoy_cpio_newc_fill_head(buf, template_size, template_buf, "ventoy/autoinstall"); buf += headlen + ventoy_align(template_size, 4); + grub_check_free(template_buf); } if (persistent_size > 0 && persistent_buf) { headlen = ventoy_cpio_newc_fill_head(buf, persistent_size, persistent_buf, "ventoy/ventoy_persistent_map"); buf += headlen + ventoy_align(persistent_size, 4); - - grub_free(persistent_buf); - persistent_buf = NULL; + grub_check_free(persistent_buf); } if (injection_size > 0 && injection_buf) diff --git a/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_plugin.c b/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_plugin.c index b7152f9a..1d6e7608 100644 --- a/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_plugin.c +++ b/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_plugin.c @@ -2641,10 +2641,15 @@ install_template * ventoy_plugin_find_install_template(const char *isopath) return NULL; } -char * ventoy_plugin_get_cur_install_template(const char *isopath) +char * ventoy_plugin_get_cur_install_template(const char *isopath, install_template **cur) { install_template *node = NULL; + if (cur) + { + *cur = NULL; + } + node = ventoy_plugin_find_install_template(isopath); if ((!node) || (!node->templatepath)) { @@ -2656,6 +2661,11 @@ char * ventoy_plugin_get_cur_install_template(const char *isopath) return NULL; } + if (cur) + { + *cur = node; + } + return node->templatepath[node->cursel].path; } diff --git a/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_windows.c b/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_windows.c index 23bbc8b7..987b04ac 100644 --- a/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_windows.c +++ b/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_windows.c @@ -1015,7 +1015,7 @@ static int ventoy_update_all_hash(wim_patch *patch, void *meta_data, wim_directo return 0; } -static int ventoy_cat_exe_file_data(wim_tail *wim_data, grub_uint32_t exe_len, grub_uint8_t *exe_data) +static int ventoy_cat_exe_file_data(wim_tail *wim_data, grub_uint32_t exe_len, grub_uint8_t *exe_data, int windatalen) { int pe64 = 0; char file[256]; @@ -1030,14 +1030,14 @@ static int ventoy_cat_exe_file_data(wim_tail *wim_data, grub_uint32_t exe_len, g jump_align = ventoy_align(jump_len, 16); wim_data->jump_exe_len = jump_len; - wim_data->bin_raw_len = jump_align + sizeof(ventoy_os_param) + sizeof(ventoy_windows_data) + exe_len; + wim_data->bin_raw_len = jump_align + sizeof(ventoy_os_param) + windatalen + exe_len; wim_data->bin_align_len = ventoy_align(wim_data->bin_raw_len, 2048); wim_data->jump_bin_data = grub_malloc(wim_data->bin_align_len); if (wim_data->jump_bin_data) { grub_memcpy(wim_data->jump_bin_data, jump_data, jump_len); - grub_memcpy(wim_data->jump_bin_data + jump_align + sizeof(ventoy_os_param) + sizeof(ventoy_windows_data), exe_data, exe_len); + grub_memcpy(wim_data->jump_bin_data + jump_align + sizeof(ventoy_os_param) + windatalen, exe_data, exe_len); } debug("jump_exe_len:%u bin_raw_len:%u bin_align_len:%u\n", @@ -1046,26 +1046,68 @@ static int ventoy_cat_exe_file_data(wim_tail *wim_data, grub_uint32_t exe_len, g return 0; } -int ventoy_fill_windows_rtdata(void *buf, char *isopath) +static int ventoy_get_windows_rtdata_len(const char *iso, int *flag) { + int size = 0; + int template_file_len = 0; char *pos = NULL; char *script = NULL; + install_template *template_node = NULL; + + *flag = 0; + size = (int)sizeof(ventoy_windows_data); + + pos = grub_strstr(iso, "/"); + if (!pos) + { + return size; + } + + script = ventoy_plugin_get_cur_install_template(pos, &template_node); + if (script) + { + (*flag) |= WINDATA_FLAG_TEMPLATE; + template_file_len = template_node->filelen; + } + + return size + template_file_len; +} + +static int ventoy_fill_windows_rtdata(void *buf, char *isopath, int dataflag) +{ + int template_len = 0; + char *pos = NULL; + char *end = NULL; + char *script = NULL; const char *env = NULL; + install_template *template_node = NULL; ventoy_windows_data *data = (ventoy_windows_data *)buf; grub_memset(data, 0, sizeof(ventoy_windows_data)); + env = grub_env_get("VTOY_WIN11_BYPASS_CHECK"); + if (env && env[0] == '1' && env[1] == 0) + { + data->windows11_bypass_check = 1; + } + pos = grub_strstr(isopath, "/"); if (!pos) { return 1; } - script = ventoy_plugin_get_cur_install_template(pos); - if (script) + if (dataflag & WINDATA_FLAG_TEMPLATE) { - debug("auto install script <%s>\n", script); - grub_snprintf(data->auto_install_script, sizeof(data->auto_install_script) - 1, "%s", script); + script = ventoy_plugin_get_cur_install_template(pos, &template_node); + if (script) + { + data->auto_install_len = template_len = template_node->filelen; + debug("auto install script OK <%s> \n", script, template_len); + end = ventoy_str_last(script, '/'); + grub_snprintf(data->auto_install_script, sizeof(data->auto_install_script) - 1, "%s", end ? end + 1 : script); + grub_memcpy(data + 1, template_node->filebuf, template_len); + } } else { @@ -1090,12 +1132,6 @@ int ventoy_fill_windows_rtdata(void *buf, char *isopath) debug("injection archive not configed %s\n", pos); } - env = grub_env_get("VTOY_WIN11_BYPASS_CHECK"); - if (env && env[0] == '1' && env[1] == 0) - { - data->windows11_bypass_check = 1; - } - return 0; } @@ -1125,7 +1161,7 @@ static int ventoy_update_before_chain(ventoy_os_param *param, char *isopath) if (wim_data->jump_bin_data) { grub_memcpy(wim_data->jump_bin_data + jump_align, param, sizeof(ventoy_os_param)); - ventoy_fill_windows_rtdata(wim_data->jump_bin_data + jump_align + sizeof(ventoy_os_param), isopath); + ventoy_fill_windows_rtdata(wim_data->jump_bin_data + jump_align + sizeof(ventoy_os_param), isopath, wim_data->windata_flag); } grub_crypto_hash(GRUB_MD_SHA1, wim_data->bin_hash.sha1, wim_data->jump_bin_data, wim_data->bin_raw_len); @@ -1168,7 +1204,7 @@ static int ventoy_update_before_chain(ventoy_os_param *param, char *isopath) return 0; } -static int ventoy_wimdows_locate_wim(const char *disk, wim_patch *patch) +static int ventoy_wimdows_locate_wim(const char *disk, wim_patch *patch, int windatalen) { int rc; grub_uint16_t i; @@ -1285,7 +1321,7 @@ static int ventoy_wimdows_locate_wim(const char *disk, wim_patch *patch) if (0 == ventoy_read_resource(file, head, &(patch->replace_look->resource), (void **)&(exe_data))) { - ventoy_cat_exe_file_data(wim_data, exe_len, exe_data); + ventoy_cat_exe_file_data(wim_data, exe_len, exe_data, windatalen); grub_free(exe_data); } else @@ -1330,15 +1366,20 @@ static int ventoy_wimdows_locate_wim(const char *disk, wim_patch *patch) grub_err_t ventoy_cmd_locate_wim_patch(grub_extcmd_context_t ctxt, int argc, char **args) { + int datalen = 0; + int dataflag = 0; wim_patch *node = g_wim_patch_head; (void)ctxt; (void)argc; (void)args; + datalen = ventoy_get_windows_rtdata_len(args[1], &dataflag); + while (node) { - if (0 == ventoy_wimdows_locate_wim(args[0], node)) + node->wim_data.windata_flag = dataflag; + if (0 == ventoy_wimdows_locate_wim(args[0], node, datalen)) { node->valid = 1; g_wim_valid_patch_count++; @@ -1751,6 +1792,8 @@ end: grub_err_t ventoy_cmd_windows_wimboot_data(grub_extcmd_context_t ctxt, int argc, char **args) { + int datalen = 0; + int dataflag = 0; grub_uint32_t size = 0; const char *addr = NULL; ventoy_chain_head *chain = NULL; @@ -1776,7 +1819,9 @@ grub_err_t ventoy_cmd_windows_wimboot_data(grub_extcmd_context_t ctxt, int argc, return 1; } - size = sizeof(ventoy_os_param) + sizeof(ventoy_windows_data); + datalen = ventoy_get_windows_rtdata_len(chain->os_param.vtoy_img_path, &dataflag); + + size = sizeof(ventoy_os_param) + datalen; param = (ventoy_os_param *)grub_zalloc(size); if (!param) { @@ -1784,7 +1829,7 @@ grub_err_t ventoy_cmd_windows_wimboot_data(grub_extcmd_context_t ctxt, int argc, } grub_memcpy(param, &chain->os_param, sizeof(ventoy_os_param)); - ventoy_fill_windows_rtdata(param + 1, param->vtoy_img_path); + ventoy_fill_windows_rtdata(param + 1, param->vtoy_img_path, dataflag); grub_snprintf(envbuf, sizeof(envbuf), "0x%lx", (unsigned long)param); grub_env_set("vtoy_wimboot_mem_addr", envbuf); diff --git a/GRUB2/MOD_SRC/grub-2.04/include/grub/ventoy.h b/GRUB2/MOD_SRC/grub-2.04/include/grub/ventoy.h index 9199fa41..9b5bb4a8 100644 --- a/GRUB2/MOD_SRC/grub-2.04/include/grub/ventoy.h +++ b/GRUB2/MOD_SRC/grub-2.04/include/grub/ventoy.h @@ -139,7 +139,13 @@ typedef struct ventoy_windows_data char auto_install_script[384]; char injection_archive[384]; grub_uint8_t windows11_bypass_check; - grub_uint8_t reserved[255]; + + grub_uint32_t auto_install_len; + + grub_uint8_t reserved[255 - 4]; + + /* auto_intall file buf */ + /* ...... + auto_install_len */ }ventoy_windows_data; diff --git a/INSTALL/ventoy/vtoyjump32.exe b/INSTALL/ventoy/vtoyjump32.exe index 430cbac7d4640a2811654d016d6af16e6e1884da..6a3f12d1f688c774bcc28b969cc69e9416bfa616 100644 GIT binary patch delta 12320 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 DIkAMF delta 11820 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 C^{^EH diff --git a/INSTALL/ventoy/vtoyjump64.exe b/INSTALL/ventoy/vtoyjump64.exe index d0399e24574860bd48e9b60510071b5c83410ccb..5ffe4955c6c44f0f7317fcffd93f329b03b87958 100644 GIT binary patch delta 24642 zcmeIad0bUh7dO85hRYyaFCdpeL{R}zQ4nxM6cqHLpyZsP;+Q#-f~lz&1xh;JC-qpz zEYr-#vMdKo)J$>48MPeJ49(#xmNck1mfyA4T6^Am?S0lc zm%O#^d28L5Ry7;?(#A1N|5wGDF%RL%SOI6u1%!VE-^o6Fg79i7&*i=N7I{DSH+}a3x1_|fb#`s;e4RDm3t#0HY}4Z9v_Pi%VfL9RWWR7 z@e$AY2C?xSImPEyzr3A{S!_}ODvCXqw9^@ApR%*~fKN6Lc)EkJRNLOVI*WA1{!4Km z-!V=iv9S1Se_`Z%WKzQaZubU zAv#WwOFA4EZ@wnycYKBKm4EISB-V|WpLaYV0$-Jnb&3*+OXa5kX_DN!b8y&}sf?we z(5&5R@iwEpg|lSofL(!tYRj@0X3JAMhl*Fm%5vvak+Dp^*7;?zaeQ&-E}wDXIaJHy$LHTmH+>$g@(1ijG6% zGpU1lnH<*VdwxfL+UGan{8I6~zJ0jZG@!UcdJ-24hs$&NC5R6FW!&qTyZp$>Aq2(tWoj9|bmYGF5We-l5 z4-aV9C|t7$hsBk(|F$?I`wWZ2EPvjMY2Z+XfWc%Py{(Z4=hzsYZWZ$8y2gawM{)LCKFo;Q`l17evWyHagb^av| zv@E=zr?$}$auwqmd&p8$5SmRAoAKk-oY`AeI2;z+pwO&c)E9^Otn4u?I5QtA)86y; zKYw;O(AE`5(wt-^oA#biJ8fUx8`Ee@4$Z=pwfU6P#-Ij$=i zB!>=z@oahCusGgV-a4##&nV<5N)C-6T~^XAG=S_a5QR9*&Eh#j0yC_(7c*?{srHsS z^h!-X<$#yZ^M~^Nms9+{?V+kahdL>96o$egowmP_dk>Eni&BaUh8GF`Sgt=}ikQ$t zo;Tv4_^O+nH1ZDLS=@4z%tdrpd2iNs9w^Toedo2FXlUaP)Luz%qgOYsIviM^4Iy^b z!~p>Nhd($R_FfMij>^Us+h7`lrX((axY84;cuLJeDlg%IyI{;za2SoV*bFz2!nnqM zAYUKjYjsZ`p_;!w)ixfrQM$0yR4_x$U=&nRFiNu6(wTI@exQn2a|4J`&!xAZjZ$-& z8AOyZT+8T=WbC7(7~cT$PDMGP6Oo`1W%g6wtK~IX>M+N*LqSkRr_nUqhBznNdO4xw zU*x4@&HO8Q!`Q~Xm%m4qrLz>%UTx*46-@~Zu{ZCEj_o~|W;2dhSu>p})VueQwAgH3 zsB1TEeRW>#f5{%>lB{i`p@Z|9oqycnFqcv)-{HvV0l(}pe}H6c>D__Psd>iMD8|0` zyu$%eq9%$U(U+R2jV5YOqLrGcp(YaVa~i6A2=5Ar>THZK@Rp*?&;aUlh^1&ys8>;1 zsM}CW{{4`BG&ZO=Zl(OwxP}9xksY0BiSqUBe!^bSMO*yQw9-4lHi&A!eZk?72EqI5 z=||_#ekq3x3|))@{XK0P>SSt?C~qG>(9dG~m|;o4IL{#1Za1n_Iw)Jl54R>u`5ZeM zsxoxJBAvIpp{TrgmeWL6rC>2Ou-IgESZ&5s%#1zsqQhbGGX92|OkRe^fC;7rWhQUq zc`P=Qx8W)vvCGli`Y5*w<=TtSVwtAJ9z*lOJYllKtKeLYIq#{QHoYT95aovGoOp^4O0i*(eIe<);B&F-Wj$CzS+8#huh(P*RA zbmM<19YV#HB1^nw2G{PR=iAGhSzpu7CcRYDKb<$~)U!vxwp&4nC2MU{jq*}1%ARl-9r;KL{ zIkVaapb%v14Lg`80}4ykTGC7@`=RJU<^6qzmYaG!4kE`$2jMYVf*9Qh?CZk0=#woY z5%$f<{uJyjl5yliR9<*2$5Y);DxAZw_e z)gz_wX0D6F+!dJ%ub2vb$hc^e>MJB{bW73p(20=6KC%?;3C#jm_^YX)OkKCZ53bWf zO{f4QOV?t~r8`|q?Hq3^{21!g&ab$c3IkSvO^GQ@i8+>P>&at|CGF0G#MDGSGcm+E zDoM)!hAQ0XFfo>!k!*X5c1My_mg;ocBJH;<+)r!0lUGhdX(?@v!gD!ZNw&PM5IP-* zKRnaP;&eQ(b9$~{-W)zW*Go$3y0EKT298Hl!8TNrf5a>Pp=nVshdKpOGyro?)5vLk zvRWjqqZUc)S{l+BXiu87K6DthOZq5uDKNe8QI1U3>4dW|L>lrzQ;3|M$j_ah^KHGag@Bw6k^eo!4(^7%5Fq4Tj0 z`|XnsM`EY=oUl61B=8?+(gOXo3pgCwt1e|bAPFvo&bl&` zf7cVujy(s5;&6fOQd7GfZUx8SQ=UZSIvrt|jsq4)>B6UUfX}#TTfR5Q zbf;_f)^gLyt*zR0N%Di0bN{~Z`k(j9{iHw-+_knePp|DM{|x)2G6`Ij(qr-fBo=BZjwuc^a| zs*tA@%0r${-=!LDWT!dk3#b;=#j80~d6IgbILvu!k%p$K<~^-sQwKBCxS7_3l zZHD!8<&UTNcX<~oIvUMiJJen&WV#Nfc?qAQa;Mx@=+74qD5yMp3{3OWH}MHY^S59_oq*pjyn;G*gMkgaAhVc~%kA}Ghs$C`O}?i` zsorO3iE}QUyUVGtTM%L>J_e6^znnuwq*rL;(83l)17UoJ48MaRDj`FNM!~RVP+H5! zr+2h|*_@h@)5+8%4+F^-I^0|to8J<)FH`n3WZz|n*Kn9$gC&)Up>iCx&-|6cRalLp`q^YPLg2;|>j7`)#UsfLkqVjpo7qW}qfHFFQ@kPA6SAXQzv}`^k>N!pM-xJ{V(&t}I}xpg;vp3FVMnNwD?+Q_hxEsuznf8OH4)l) z4O#5%R5SDN7c>a;bVPL>f}wrrVTZ$t@$~vztvFSkc5@62k@q0weFO`Ppi}iyN%ty3>)=)uX)Pg)r zg?o=!TXhO9vh1p-ri)#%eSGC4KU){MC$baaWRmn33Q!fHDt8 zX7b|M4)cK!Ido>%?r9-v=gp*Lq^+IrbDE|BX>K2+`L67OMyTlvNTUYFGkML-Ax=jf zytsPiU?HaeUEF_`KNmxu%M;&7=dQ&&-f$Ojh9W$t7SbKWRI+dnU_!j%;bM|)SLeG? zXwq&BAevmXmjt%p6Hnwn=j;s$QjIRu8sQ`&BPs$$zgB;Gb}ko{kBiU0=_3MO&Be`H zTkw{#PWjdDZ&XW53O#Mbf6pH!!gjsG*bPv$#MsNAnV_v8pCyb%fW88qE?$^d?j@d$ zmIp3tE7CqG&R-Vj)T|3`M@efK8wr{VQb5~4mq4Lw8Ef%L@!l09xY)l(4t{@M{p!i; zc#ar=Q7c$0-+O;i#8Ny@CQCJOdbF|>$`#e-q;=v8L!BEPY!skpgWUbQN+;k75I z0}mtcFKG_*=SUT$;FfRLuvxBH)h_H!Rh?3C_b+M-2J3BCOZ?GXclA+of~qw1mOFen zs-dfzxI_i@c9<_$*A#T|YkBjB?YuWZV39^tq!u;8gO0)Wwfy^s1Gsx}@<+XS$CuV{ zmg6Vo(ON7te7TmhTsQm4K^7>83m?5>W*F6$$lxp#5Y=Q}xPvVCJC@yjOJ<%^;L z-&q`vo>IZWj1nB~PWv4dE5NJ-eG1wPIs`fe`Wf^GsQymI0zj=n-9ee4si3z(>p(|} zuYd885R*0*TfaKW{aljqZ0{U0TV#*it2b){+B>CXxF6MnV zX}k;(m$8bk^i}zJt7M-o34XyC(6k~$KY&FtJ22Ri@!=YI{Fc6A;6{1dmZXrgzrdNp zA+jPveW>j}P=4uz{nSgi{U<#ASZ=Vj$K*R7K=Vk|B;&cf$Z&cU?J45(OR+``BPlHz zN(j&pm|GC5OavbZ(NP1%VceZr=~2V;m7Gy^M-48J5x3I~|5+xNqCn$|m2&A;zvi5;$dHjyU;>IF5vSg4r^p?D+q$66gyJV_3Tp+jH+0uNr z9R14m-9^`5`+l4nM-AVW%dhTi-gB!0P5!eNxjsh?>%de09p*t-ah#a*pZ%Tdd( z#oz7P$3@v9dBL|GJM~_GZPvqrD@ah4!y^|_6oc=ZG)Z_8u*8?;80_1T2 zT8}iJUd6wD+X98mk^R1FC!XiYsow=P+lhO>)YGlVPz=T*<%iHwTV&Wp;)^(f%G%3s zeK#S@YaVBK5m05?&mCpC-k87_s4+GEG%8EGj>?LHe|=N--s>m6nJu^6J4~F&k@NSq z5~JqIoAo2!2CIgO(WMZIa5>3O_kJ0C<|2kG5Y5|5j2D=%h;aq;(M9>dz6dd3 zseFH5l(;)v4lZ33`~!+2`}T*3fqna8Vqo8X-G$;krQ5hTYm>7Ne8S^ppM$YNnJM=^ z81FHB4#o_jOT*|nvhCnl*Cpkc4r6`!@xhjjZ{||h%k5R2X`D{r(%=_+&fZp?&GK@& z+aW)(rCc6zC`_FFMV@~sj<=S#9qKE7enWN~>MwTW$Qg%28n4LF3R&BUx|-7%Pk`8X z*KknaE`3J+&*9L417MQ>#F67^4~0>_F$rl0Ez!GwA^4f72Hq^Tga&V*q|OP?XQ9Qd zcX^^2_NCA-wMZASS#CjWx8u18vvhe@vEfKl-tYqM5c$`eSoT*NER)X;OLg)s#emq% zFXk2}9v$c;1}%}_J08m07VkdZlMm_NLUVM7FX6a%LTsTdRXUjDxZe0OV?m%ukUuC9 z)E?9l=MN(Uu_nt-~3+JVAAUYF&8Cr8yE1DB3i8bUfnhPU$N(vtyhIr(%8eQ{K- zIN98gio`*sG@bj(jZP(s@}u&|Q=z6FM=aA@_5VQ*^Or~D z^QTfm#+}ygp3X9628U%cliXpRa76BOI!x?4B9A&fWb)U6*oxBSoB)j1r{L}H z4^lI^NhciUWtI%bG!GE*}dM<%$?AViz+co$4_ zn!xb4U2@17KXGA~-04g+G52tB=9w_w_M8>Iz*OK0D>zFyBQPv^ar?)RQ&8zgDh5yI zc+zs1+sd2E{ayR1yqA2cyiM|t2cholnky=QvBbZaF~%a99OhFblrGWjdpEH~u8#Bc zh+RTuY|)fRUsKa-56a!nwreyVV~9p}1K5ML+shbDH1M!2ooy^WTOfaVHdqWgC?7wY zE>@;eurTf48rvg;K`Q)g%mo~|pQwhTAiz={%@k+P+xtgkCwcQ!;RmCZ4O z@~f~f@^rG~??=q_6*r6HOb)JYhF?BGM{d)DVkSJl8gr&Vv;Cl%vAl%rIT%6s=M-A& zT_ocUSlgS@lX8C8M(|k5YRK8p9>pKTYcj&?Xb z#d7)ed16bB-0w!WfGyjwgK)LAS-2(t37^%=B9-CMa+|#VMt|}9d-B5@OUy$N$DKJ9 zfl!O|%(CBMNVA1aoGHKm%MM&`({GLxFU^p@x;b4`ye>Ds)xr1k*Evfxtw7AybAPIo zW`y@J%M))k7Qbzl7vJi@yUF`*oe>+pmY3c(i=o-_XSc&d=_dK~?RfF$blKxhQ<1ev zZhL1FZzf;4)6CPl3EQ@+(&#YfZj#;YgT=?wUlA#pZ;LE6}7SPmtU9QA7>@qr|#|Jp+gmWr4CdWwtR zddgW3=7`EqJ}c0B(`u1xS-$vBe#DVV)REI`_uKRww^rZX=tl( zNDitmp9+u74#|Ha78vuNIOY0DhH;~?7@JClOkk05$S8Ts(@2rsNxt^9QRMPf)an$x z7fkWO8z-csQcFAHBR+t}mL5`*&RQjhKkMxMYe#BXW~jyTxE${7c1Jn;nc1zsJERyJ z+4d~jt%a5dK_XPX`>df@_JM48K3M#?QqFwdIbzL9b)Y@yWm@q%ha**bq&}KHfZQS- zse}SI#_KEP@18e}dWfqhJ4mlCL+H+w2&d&RZ&fY7t){(9mu7m0PI*3ADI5Q8-(`lX z&J3LhrkW`7cy`qFOG^G<~Lx1YXtgFe*L88&?Q4eGM=cf6qe43Le6+J7vqMHa|~s1 z$nCAZbHGz{d4Ba=yphTg(m@0Wd#Z0|)*OUW!Kw1fL3zsyck9?MXi2A_7P$XeNWdAX zPv*zpQ$;gX(Fqj&8j8j`xG|e9Cz~|w2-3zH`jHA@nj*tVRr?=J+h5a0*J^jD+H6gm zL|SXC!KYTeR#gws)IGJ#f5p}m{f?@Q)3oh1?S)!xj;i(3v{9ONXRUUms;yq3cB!SN zT}4`}+G>lc{!vpm*VOZBGsmdfJ(@OH(~hjwHd3`8YuYB7HnCRgqH6OrZJ?%YR;#Ug z0~aTUd5orRpsAf})j#5_a+s4ftx?n7j;R@sL#j4h)4FQfvRdues@9FPv4*WAwwVPP zsU2RaYVXO+N^%b^^OD-ki&XVVSsgCD;%T+oDXR8sO>5HfX4GnjsM@8P)?L%a)M^t| z?F>zedQpF@!M9f3N>vZi)CMi{qjohtZlr2EXxhgc)vjHt)jpa*RQ zH0`&VHndi2ovW(HY3gq@wM(sfoT}}mX+P7n_UM}N=%;EUNE>T7OJbXO9T}-z>ZEGx zY1(4aBGdz!w)x?&9ARcT72XNVPfLNiZ-Lvbk3p31BvPi@LT`XT*TXN<^U4(}7xj=Q zfx)5W%2UDL=bp+kCm!XzWEtLQR7LwX-xsR7?%+M$5PEoEkzy@)%^Z~frW?;O<5<8u z<7LV-C*IKfE(|PEU&K0(<#^=Bb9!IjQ)%VQJBjOkm2u8Il=~`0&U~y}1}w2>mMVWa z^GNf&1kP*=LaD^uP{e>S1eXUX?F~H18V;4k2}ieQ8CqEWE*eblJ{i1e?X_4+4Y0%; z2X%+nG}yoTfX?c^A&~UZBp+&$2uKn&Ns%T&NXFPflf0oxIzbYtNye)ZYu`kOnrWhe znvn&P08NslNhU%Pu1TUaNj4;nG)b@~nGK1LCh<@uQXY+JywRWuAFZTzON%vOHO2>> zxo*;=m{~Hd?55yB*P#Xs!6gnNfspOB~>mw z)!E&d$c`&-I2Prf%W;w|+OX-<>UvyyQ)k^2JpcnOmD%U4!P{T#hZAIOGcW3)%=6`OysNU+ zmrvzwl_qBXn*X7nUN}sJXf)RGX?s7saKJU&h5x z;mRC;4ADp7$^n1=r&tqKQWC)b=6(UK@eq-J*e%Jl7wxRt1>t#eA+1o3aUm~^4!W+UFwxqdqz+zm=C`Nz1WvoW%yWm7a&T%4hd zYQ~$2=dUY^n(+}H-!-HC=HW2ke_grPjK3wWo>68r=S8N=+2}x#p&^C`;GxtD<=q3$ zkE4ohP|<^nWc*f5&(Bsyhw^!0kEg3yIzgB!ophM*sA(sQtuL$=CyMmtr^w zO7zl1-2s(vBHdO?w@`+J^A_UWMT#|?clFx4*#qYIUREqHU!k0Gl(PhM}(RAo^Mo*S?lcNRQc4<0f!X^{FwR{s4AT*SI5 zrU)Kj{c4JO;gqWEQTT8UQNJ9RCreePLb{6LAv0$m4Cu3AH@bWsQ9pN9U(U3_l0)YF z>Y=8>3bYNj7TDt2O7BEg*BY7%4yaml4`{J29cGSfc(gDTY{Z!c5uPYpkjQ3^)=V&& zzu{)#FkhOi>s>W{NUff3Qx5aa8vPw&Z03Mk{a#hSvPOTDm?DFE%fdrV2y8vc7I!N6 z^%|>nnw6yHEkpvQ!RdvL9QRbZ$)86f@L@(y_)dh!+1&^DkCOhFAi704%#)C1Ck18h zo~OZ+j7bn%5ThPz>D)d6e9my(U)9=-ZAm3L@)Cn;T8@t2J+_rrtfSj*TyG1V!`+E%<( zi-r*4fT_}A7%Qj<$!O4ozuTwekYhGHOjmwy#V_#oC1tI7xU;xtQL3W2Sv(FeagFBQ z+_$th;wSk(yV3_JrTCB!FE^Shk?r_p-dk~r;T2*+sbY`ejm)#hsBiAjjX`3j8 zDmSz9{HrZRzg6&1Y4xkv{lYP!^WaN4 z=6`B9xm#J(3I4G773D-Hc=fM?m5k1Ou=wm1<+ILwnz++Q@$bUtH{3a#u}3{|eZZGl zeev+R1?kEj*z5h3uenUu$&19bo3G^hJ}cePiY4cnrj6zKTm% z9>HCdsIGiO{j{#IXo;f%-g;a^WmQ+6RsUK%WFxd(j{+691RgBjYM``8;NjxVFr|M2 z?-@2JkY@fs{tZ1se|%V~D(-rmN_fs3H)2$Sy|GJr;Ex# z%9U1PUAp%=IP zlz>Fu!Q;{3nt2Q@c{z~>@RsKh?A{5tfMtFKAJE{J9e9(PMw@Z}ASzvbnL53*p|7$k ziT4WnXn=aQO`YLz6ggG?U{404KKbPjP@X06k%5&)T&*(P(&!_J{xGKCW}EzknZC-5 z9(?%GQH!wvJ~mC z!<^qsiS5T%c%?&`CLM;D-1Eg0?+kaBi3~QTEwZ_*eRb-f}3D0Z70!=to6ZQ&GOPBd(|7g0QNY(kOSovrGR`oj-%DiFxJ#p~Ql2-#bX$sF3$a^)z;34S^5YQxzE=Q}|5RM>o?3CxyLbOTDxP~+@f^k@l=~xi zPaa$nJ(5p!4%mJZ!;}A8RtkOY+Z|`j9DM55{>815En~RRU2LAG?3>I#6opkv<`n*h zm~*7$hberh;2}zz>HHG!UE-3>@h!l)+>-S(c$}#J>J{32V=v?5a>-y)Zs+j5;%HgP zhFrc%;K?XyHb1~q73VqpwD@A0^8FkhE9OsA+~>k6jhv=L&&4xNqB3|c?;!S{RBUs3 zrZ{-2q;f7l@8(wD8~Z72rMGeINPn-*?oaVx>g$jQfs;eb7mH_pxNg+(gNLx&|d`>Ya&V<}2ZRH_QNIcgY^ z|5Uh(&JeY_yUnftm%?tcDyIv0fRgOVY^7tOju|>m)N!_sZ|V4vidM#M>lK{SagUDcbX=d(a6`vGbi|Ju)lv4*&=^tGKa_kvb;pI7r6{I_BxPO2_Rwp4Rb(j?Z=UiqXoCj1g-6 ztdB03q2pURuF`RXj@xxSpyNp$D|GxrM-i)!oQ|z@?4n~I9f!yIYlhQw!8{!oE8Y@s z5%&BLOQgep@pTO&f6;JhG*{(W9Ee||dgqLon=YJ{eDIjZbFUtc!&|Igy`=Z z+qNjSCp<`OGAUm?!Lm=Hq4shOMkbU-mJU{W6wbaKFIFn%)D~^nOmG$ zl{F2)Ct}L$Pq}})O{Au55bXlhq$w-OR_glN;*?!ad21if23oe#<~Xwu0rPC2JbKET zwa*|qK7lvnII~y68CwV%rrZ8+Is-bAWhm*-cyqp1dHor0&~mMA?bU*@o**raN2eS- zJdAT;wQ}XFXK08;H?L^Jm}^_O;RedRXS|u{>Z{a$&i$-ieQO%z!7fHIeCo+q7RkWY zP4jxrtX^C_R&Rz&c3=a1fZYsZfg#27tJa}7yc~}~cF^awWePPt39_9vGBlCWg`ktZ zqOV#}9f6vrLTWRig1QB(m50OXDA{kVqubci?9{M#8 z^05Cci@sd=A6a0up*3sFmoxutzbrGxo*I*f{DGma%x7GC<`Wmke0VhTz}iI@r@g?O zeXciRZ3<)W^ul-}9T?=oJeRvwxl}l3J7tMzD#wC`svQ`Ft%1ZUkX_GPHy!Bj%-oj$ zJ6|Bqi-vrv+MWzti~>ivvJpAc*x+%~Jy;OWX1;1;mHG}m0it28bnNBet*jrxQPC(> z;QPdg0gO>PFpw6IiPc-~l1+_Egg!9HiMjK|Oz0h_pF3+E?}v`3qvL(_j>8^<7Z~is zJa`3j*6k}?&_Pdh{N^?0mh&@n9(Ri+4q?gz2RBR#2+*f*&`mZ1AN_m^iX<5-{@*k* zsWQr=H6RuZh(QC|);1uE*EB8)y0*}@(sl2R6wNRO?=2Et2=)p;Yqefc`6yI6nlVai zy^XHzZ8jAc?!wHxJ##6=@JEXb8kwb#tJ5~FD+|F>)D2Ktpw{qzr!ge|YeSywuQ+8W z7sl|#dZr!|Fa;n=2R1PP1iVmG% zb!9xjg$0arX900;EFi`=J21qV)#p*nwaQSTPA_$Wrsn%r%pf1N~=z%B1Gb{bp$qh_`w|y0UsPF4;9UL(1?Q2@qSREN~HxeQM;U zE;B@QU~5;_FlRe!7*`B0yoGsWs5|wZ3)UW$K?8a93}f!) zSf_gZLEr~~V*b@0m)iDF9xEQ=ia<4aJ_dgnRGUZZV{Q9CImcKDsHTtH-z|{&W83== za%28+uFOBCLAJWM$KWR(>s>{(a>-T1)%G*$CtOmlVGk}-8oOy;riYtoRjY4y3)jrs zjEz~YEN~OkY8Oe>ea4z27_eCHOC;us0zbo!(5?EtS2H`)J*OyZ_Yjd-P9}P^#!XRQ!kp=6Eqph z=6WKv7tMGyW`zFH`r%%`X4qghgS(PB9Jes9il>I&!uNG)AvW z+aaFn6`-cRc*HkHf!@?@^c|4l9aN76VVHw320=0YRpyEY<=&;H+OnT_<*qCWv0V(p zHBZqcnhK;PZbl?M3iLuRaCa}f6tr*_C~F;7D~J&pN}^GO*1C!&u<8c7rQ{k#i1LY1 z_}6y(P8w&e(>X1O<3`a@`NR`{@FudJ2x?v)*oYQ~FEjq3U20~d0f7yjna3YBw<)Dp zeQky&0Rw2(SHec!GK=*6J^;IBMST%TEAarVd;$Xu%>9NT+d0cAL%SL&^-aQ$^x-Da zfpDZrGz+HEwoqxHicdKU87f%$5WzY{2zE(XZ4yDQ!@yQY2>H5b({d4b`uCBJ**dC1 z{C7xCZ&SRz#O4-DTWaQ{{sQ5L#I;yWbz~jr!GA3tC*%Rt&8BX;27DH|5NrrP1YHGB_$lZw}U8HLr8&{H1Kr;G<2Id37QQ#;VsY-@KwM++QI9CSK}yF z1Xn0RQ#Z&`HvmJCnQfp7*bwdp{RN)zD99O+6vD($;8|D39)PIgD&XD(%>POxYGXj)DHe1XvjrQru#v&?R&NMg?+0 zilNK~UpJOQF%{3(u(cp3^aE`NPuK!P_R+vWlTaUcEq-Fvf+`eT**XPthIj{ItEp%m zc*1qrs2uzj;14s*d29aA$8*<6ffDEi;7`Scm=cqJfWDy*n0573ML7( z9SK5@IauxBy@1{4W4OR40$1n35g}%fwGfLAL|d+IOyl7qJf!Di`d~v?2+9Occoj4S zJmD|8Jfi?>?k&teIfS|a4+@01yp8>e41|3_AAzqE@K6IGw;|sIIbq+$jFplNuqOUN zXfHx%ASWF94z@0M!YMkR{SNkjoDGWzjYtHh{0CEjgCqkO@UGU&+6W0UQ{?2+r8rCw z+92Ex3IU(74C`jO=EOpPE;4)o;%|U0KeIca=`BddTh}u^8`-bis6QQ3h?PR9A@C31Epfj|8^vn6l0ZcM{h_0 zoc)cKneYz~Igr1A!*^gb8e^q!t;0X&rG&O|pgJ_Gc1YXzWH-X>m zMIPAi+>8DH#XejTkk}3kEQPxT-w4@3G zlnKOZNwvp>M?r_E0wDc{^d|U0z%DKV2l_$=V3AayYU@9O-0;H4L6Tr+Gr;4}xeBKT}zEJGLyd>rsM z5RFz9um#6!FElg)m<6In6TYGIvpGJFO?E;Q2J=MN5%I4nD5w+AVc={Yc>0sh?eJwD zZOg8}c_1o?Fv1OaVMCY&qKXMu>OA2R1eDjqW(APfL%a>VGcXra*362%3#NgGR;Vv9 z3q-9Z9FCw4@l$}3&MyH{u!rP?$3WDelfWo1O&$%*0a1eppMj{8&w;xTjr<;s*aHl< z`XI)Q`RD}ffj7C&p-2X90g<~U{K8+8ZvwUs;LH>9NZf$Dl0m)xi0Uw1!&qz*Oo9w_vmkL_H%M*;p$y3%DFay<7oo-h{JpC}CZS($A$sF1gWD1Jlh&_*nAIc7)d|)LFPvIOOR7RhoHy?I^$1q z(s3CAECXGFyaG5WinFWWrvURnJ{w4TL(bl%&6 z-{M1QnzKE?A^o)>9S2+uqRQ3+AL@KH@Ky#E8hU02t{KKz0P(<%FKhOlfZoHk9^>;C z76+no2&aSW;qd?2VB9h}%S2|vjvzAX1oRyN$AX>_{sLM8o14HdM{+hBe8wpJ;ehdI zH01^Eouu)lz@{^?o*)keT0p2w#UtQpYRZ7K=?8z2_`C44-{9=^IZ(hT2RL~yDu;Xu z@YI`{11Sf7G7p78z8-jKKGp~L3gD~-a7MHkfu$fi@ydX`Q9j8tfeRL*LfGd4pMpsK z9DiGoCFWysK|$zIpbfhx@G^)V%dZ0ELM$ZMtN>0~3jaU_0qKR@63ivxHk~ItuJeTS zYK?3N*)okMr1wr%QV>Hgorou-7fi$xj?;NUdI3aoLVAfqJmCqQC#3f*Bq!v{HJ)C5 z&?^p-6DI3CFjIXWK?-^=LGK-iCp-XtSUEM-N*T2du< z5-S%*H6UaT*>NsU2OR%|G3*cop_!t z_3(Pfr?h}EQ;x+C8HHbn*<%m19w^8^?3K#>dhcc|E~l`j&SW`f4bSiGJ=#v>F3SJb zSLnH$^j%OwP^%l9jW9*vb=wLc}^9WR~e&|2hvB)tG!dsk}Fv0gBn!dN^KP1&a;pQD#{ za29JhY`r^K%`L_H<5X!%#~|_bXi4fAC-QQoUpfvG&&TF>?DQoU$tlvU$W!9(XlZ-r zkHwP_QtznaJVf&BGMEQS?{w)W77v&9bTLzPx{eZmF3n%xbtLEAq?gg-#kt|qn3yNx zYO*w}+iC7AHSV4)UM$XE)ICy&c|-CK^$6kO%OvT~o*}%WRJT_dH%Wi>>K|A57E0DJ zIVd3AKD?-6iYW(8LY>0w(JB55sXnnm0g8B^%?`4g6d|i9t(_^y`2H7Yc#2^?I8^$` zdsIt z8pGmR-oGsxNL~Y5*K6^QLGFJUTlzc#xr# zQ&;yo+BW>CDSJ^+sv>!A%F)XkIkN_q+ia$sK|v{dsY*8E$ zPWMj%_W4N_21J>QD2Bp|*7yfEY&KLj2Vv^7lvqRIDWy@Yzx6~n=fno3zOEmy3C zuvRkZ5nhA|Xfw7&E+!Zyq2Fgo^O7QXytFf^QEVt8WXA?IC0$C)UX+MY6o>+B#zv8x zQT*j<9nkX~yHhW02wF>ZT5yyqJMxI+H|!$sAw3w@!^gFoBHsdeO!7#yk;!t_+E?oJ zR;0KPo4@F-Y{7d;?!zaG-7(VK;YY;lC@E&dUG9|MY^20RMx<1jvI~P~`l!3+QKlSS zp_4$>biN-`;S*R7%UN|CQ1PtacSc@0gF*UC?o2;vtZ1y=or;3M|aeWAhO;F^Z%K3 zTII6Sf+iHlDm}og+tmbfZN_?SP%!91<7qVH46%>R>1l@=eS_#QZ<>L)zyM5H46=`; zrDN*%N?WZ}#!#qEsQB#3Xvo2lsCeO#_#Ax`L{>*b52}0$f~K4t4-{-4ttiT{ur`){ z9}{Et2!#%d<;={JHk0un?#soex~d}K_1!W_#mgDrpyNc2T?d00yhyo&Qg{$ zw5ti#?f@ZGKa|iKj08}f%P`T_kyF;-PU@@)rD@Uu36xO&*Dl*^mOTbJ}1VcuHy!FGfTuLoI|iQaFXuDuQv- zBM@yRQ36EZr-2W@U^9N((oBOf{U@6-wiR{0{(ERFrPju<+oLo!#jdgNosPF$9~?s~ z-%J|67TxvJh^MZ6(U8PjT;j6dc1p+|QjLF!~92iSTZv>8mdn?@^CY`}`TX4XSbcsD^ z_1uBfGLLw~ME+t}IKig0cO2FB`dMlvwGJkWTBmp*)g|7tEhtIB%|R)Ysl~h@C>KmZ zmMzUG4#&qUZE*rQM*9$rC^~_B69!yxl!jc)NbE8>`il~>nL*j)=+}d%(R`)3va)6^ zeS@MH-)%wTL;n+$7|?xSYWexzRHz^vz6!#N)^-raT8_|!nTxF_!LE28t)Fq0qFiam zxB(tOqru@0pr#iHMWWN1ccFiTTA+=#5B8iz<|zz>lWr30aLfGV=sE238< z>Z*!52t~xHrXh+*uLqA_uYXF~F~!&T8pbi$ZeC+U!_=DJ63zNtx;`b++_DMvP(pe2 zb;o`<4GNskj9V#(V;GI`IX%khVC`saf)%;~=b#7vdr6zp-Pgv^NMD* znzG)NlKfCjvH+TR`yAb%Ia1%LzMZHWX`3>RKvpQajfy@1rWsKKVQH7%96~ROAEm~x z4<1FbnK(qQ|+w9tk{iOrUou#Jz;p0@)#3k}a?~IWjh{8Eg+x^jF0;+g>X!3O1uZEFtbh zom6aX^au50`Z-8S$nYWz=?s;qY#N`dwuPkG3k{vTb7)1N1+Sz95C`u>Zhi~a;TOVB*o@XjN^=g=1g31=w+}dqPzpIR><{_AXp|O;&!Mn7QRX?Tf-13w zYFCkO6jN1%C_NFydh@t4R9$S;2y|niywYH3b%e%@_AGj>Wc(Z!=$Tt@l6wXm~(9irUq!Vr!olT4VzTY5Pmyah4U&gg>5TE9AGv*q+f5r;b6Q)iH|m6}jL zN@%o_kgFkU2g-zDG{+`M(_;D0QrWb66V81E3votS-kKokyA(c*1Y!6RyeVgS5JLwk zr&{Z*=8RRCV8*CK>tSZ~d7{+Xpk}xS8Dd+o865+us`@Qzjh%C);nN$7{>!DT=}}($ zC=VSX)0rXFW}Mbgx-`9W*H-~b<>!%h$5Cjj`+H$SMKgyqYoNgez7qvTlDR z^-CLK_W=|6Thay#(cn$KZH6xw4zDG@nF+igfBZ~m5iunjcf_m`^sS*_!2!VdNZoKn zwoB>nx@REK5Pt9@LGU7Kun zOGY1zIc{0Lu=8eA)9$40CaxuSlw*K#=p^iKCsjU^_(GL0CVr>NUnBkt@Z)pskU}fa z)z4IP0q+9})Ceoqyq&P70+_OKV=-k*4L)wof0O!s+{54c9aM9aLz3<`@l#d)ndI?t z7yhpF;Nu=*(sxq$x~`(rTT>C(DL@#!$hbG?!8mYS?@C|2!|danJ6+Ax6c&403?7jMt=I7{=f zWYAE|(!CAOO}dlyv_Dne4#r|5x~^k)r?fgIOLq^;QpHSf4DpPw}2b(f8O(nr0sdr z#aEx?2W@)Cj-Qv7Zw_#&`~-WG3oQisyEiwr=ZErdY}v#44r%Syxf;@6z+8wf$-v(m^JqFo8-tc?Y1GNTq1C0Pp0L=k?1lk7r0dxiQ2;`H$;_D4U z)ZUuk`rBgevpW{oWBc%H6&*}tbaxOyaXyQc+;&8Yx?f9iJDTx_()1mjj8pGWd+Exq zVh~^Jqwpc?rNcX-e9oYGd049rZJHVpS|GP0V#o~9J>nMD|)I(G_Nbng(LAmn_3 z7cm8-W73ZN`kr54z{FUt#?gKEkrmUJV3tN3(* zWZBi&=Ys|4Q+pKIJG+DR0{LvI3`wRO4kbpiL@nB*q-(%%EUcWM0%EVbx$+ng7c_iy7yi> z0b37Y*C^IaIxqR|ZPb0#T4*v~zDf5g)(rqpO<^aCUL?VT>-=Sz?Fj;yPkNa*IAm1Qp9cbU-Zyey^X~7YsPNmH?-3RN;Q92M|YY8<)mZa&d^M0kBMt2s5rtBqqs81}q zqWp~qnjn$c((xbKh;0j`=Red5oIuy1?oQddFlCBmei8<*~_`&AFFh?4B zu&vLI%j)Tt4iHqO0P;!ZOIr_qUC&&G=JH4J-Xq2X%y42H!NiwI(~6o3u|nEV)LMKz zOFC1uuwK>`)xK>SF|cnth8Wnl9dIRo@}ZqvEcj3gII@XXNQaMvi(YBc-$x={U2uv^ zg9A|KIa`W4I>xc{d31-qQ2O#{v-+!MP}NJVl^v;_PT>^q6Mn(kO6kpv^U@zjeMHK6 z$>CVASa4fvc`SlolSUuwBR-lbZ9mpej89*AJfMDTx|&8_2dZgW{qPGk@qWQRfunS( z)a7{4Kmn7?=e9IAEBU7~^$*i#{${|NeMGUVAZ)DVaALm<~PDnI@f2inH@BLVM&Gznzm`Sv=5A z*yl(+P6hE_@+Y3^&WG5Vs0*DD&5Zk79R9Z)iLu?J_MZfr3wj5X3(5k`0*wWI4%!G> z1)2(44q5<82c?urc4tPqd*OzH+b#Sm*}8U%q|`HhPC<+45c+M2lzXO;?s+C>N95GL z+*>+*CR${aNbYBY43CbZ*~eJ1etX)C8;hlwv+dlzfeeB=HsjmHQs&tn0p91-qvx(- zrG2r5#ACtAF_PS7^eL9CXM@GmV##oB$fOaqG0ZGi)BMn01HoI@3{oOFSx(uE-AM4) zKpKa}`PhPB(+gmAM;zqX8{q<+Ev;cg6q81(i8qQO^RtdKssd#5%aOpkY znL3I*W&2?mpVO9-P_GW-v)ksN4RBDi87~}$>n6v17ftSu1niK2+QLOXnQ;YXtJHLHb%czOxlaXI%b*vu(aaR2v}EM+U?eO zBBx6OI>2wDwDZTWjK5<~h{-JBvDvy?v^_Y+T69;X)XNR{UMcr-^Fbey-mvdi@9Bxf zI{t1|?3eJmIUpTU)tTOwpzicm#kw1iqv}ZiDmZs=(NBv5(y-zmLs+M14odDN?#u@N`@W%1Ly>2`oG60x6rR%0f-)xTiK!sc3{A?2aT&*=}~G z%tP>dzU^ePolC>fO((&$;y1b{CS&1Oe8A-XwH`6zARZMk8!d?Cxd)B)PH;3*CJpIo zn;AR|JchF32-e+s2eUGIAbHbGmaE9`5(K8mtJ9*fTqaGDe9C%>eudJ=vM}E|g^a-$ zgQ*jv*qof!9yZ6MEoGeoF8n~c%;(max?HM(I z&3NblVq0_r@}wtM$MWm>!+u)A#fCG|t!tgc*fUc7>kUQ187T(P>5Me?`Y`d)9O>Zo zTaDIjpa!Xr3a$WWP41~I3hp$Uk=_}barOr3=+B+`fqedphY0L56J;7xW;*mzXZ-*s zndJ>klS-0Ic5c7W>Z+eKMhY)~<=hera%^@>@v+q5X0+ipwvvhibOpq&{bjzi{x$>UaUA!bO)w*p1aT~fxaxgsT9dULCb zUrIh^5RSGvCT_}n&S&&ASxRuT%$ElJ+D~j+BYpnsa--uK&ZbYn!-UE5(sanCi_Z!6 zOOtxu-i_n!>)Rs)pDqo*GgahHlg{30=bbc-vuMMrVw1(~P@E-Rk5%WGB@yQOU z!*A{QAJWv{&WR!0rRcjx;rPBZ^lq?7{YIL9H&Xm3RoZ{Iq44-d`sMC6enGNW1KnDG zgK1k?p|=@>zmfJ@2aCQ_C69aGh}K_A2k*5Jli!mb-P4<>T=Imlq(t*dTh3i;p;FE4{wmd3Ax{J*i zwMp9aq=DElCjamgNwjZ;;}J{OS=S%JV9kkoHo9tw!|rFfa$I+x7D=1&*+v>!^_=Nw zl^r$UEou4ROI@}M!&+aGt=ljxzy7ml++zxMZ%XT@LK^t>ilxRcy19=XiYPco9E41J1+wC#X~TvUu;&i`y{WILCr5ia^y6v z30Ws*24p@L^Yxj}?b3ZLI`0$=#)cN18!%h%kRqkL3=shxr4L`$4e7R?O5Fo5Z9P0} z#$D^s#YLtz#Fu>xO-@2URoG*_bopgR&y5|ZWXVA$)8D07-qv)G0$v%NwmU2Fuvqr7D8+LBGn&hEX0Cep?*Fm$!|S%40u^;~ z&;%@c(aKX<^uQti#D2V%^2w*z;pkAj&MWcH+Ke})kT>njJE6A~XWGQv@00{ayiIRl z7WHh~GYe^i9l_0#HtZqb#+;zoTft7ukh#H>I}v>QH~(aogT zp2`CkZqcQg&t~IsC{0+7z(0s6*n&Sjf<*!A?Oa9MMb+B2D%$dD?RZ5SplTnI z)*P-oT&+%2)IwE1RwHk&)^<{~w^u90x}$0rS8Ib5?QvCmL)A{G*19X&Evojas_ji$ zvr_73*c5EWWvcq3st&1+d`r=ZGoztS*;zRX!npdTsMluImVr2 zq*U0XXxFV`W|Hq$BX_Qj9Hyw}{ww49)!Mp>c7&=usK#a0S_efNt!nqG+FM~&?NNz+ z)n*J-wa6FwhwF}3tAA3|_Nw}OHS!nL+S7{mH%V!aFIDZ*YV8+_wnWu_tZFA#Yu75; zt*X|dYU9H=@>d#Up`u={s^_WdR@IRwE86!|ty$H2RBMMQ+C)`5OVvJVQ&r<=MH{AS zC#l*?)mn3NMeVJs$EoVw)oO1=`*fvJf@PJXOcw%}t@99AwcIV*tL+Ja@b5XG_JCQ_oi8HZ220GD74l{s z4>5*x;Vfr<5T%$N1Q#%xAbYTUN5^B#m!puR9ky<_5|l6_7X_x*PlnaB`dDm<^D{;2 z?W3`3>a5>k(m2LLv%qE z4OERxkd&yB7*#R>lFO>3wJJ%4kCkmgwEfhUygI*O+|QrdAb`<^Zg-FvrT>a zkL{L3`HdS-6eF6*iF)2ytX(31sON?LWs8-AqA}i*kP?fdiREGpo#vgh3&y$g)po*b zr~Jy3XNrXX$P2u9WA|~mx~Oi&_;BMh`Fk(^mKe84_N>L1=<~+oNZ8mk2H)ct_sE~u z;xmnPNR(Rhlo%WmD~EaWvcRoqT^w6*KQ94iDY4G_6mP$n4yVXG#~9XK4l(iw{y-jO zrf+dwchrUN{;QnKDmsQ%C*vf~yTtRIy~bY-q$A zifz;6utt11UfpTBx!Q~yrpfCX@x@|!sT>%@vklqrqXOBwljESz*6o+~1@W$anF!&u z3>Dp5Ec!`GxaIq@XE2`|{AH>V#X6Rp0HWmG&*whK}9g2?|Gf*>^0*(8Zye;OiK*8 z$+(j~8*0cZN7-Qe?4a`PCOwHHR2v!=9agl)N6=zi+Kk^J8g3SbMPFe{g9sPOD zma8V{%ujG;u^E?=nDhmzzO-6ThbfzJLX}=t^(EE%_Y}RUO8)^d**fKrg*#0E@;X4a zI8tF*ud*7TT16^x+adtddh`vDGrj?`88gvV_$(u>@g94$&AmVI4+VYEvvi2E8EYfT z9`ecDyNG`ven=+`c&NviI=1~CeA-($zD`n9zbJdIV-irJBtH z`C&U=TWtEFK;NEE=0WR|mE_!Q#$m&WGi2d%#*nySQLdVb=K&daO0!Sy{x`Pq9S4`C z8UM*)?tVF}Bi6$)$?}|zSk*_=U(<;X7DJQep`G}9LarwlcjEJEPk5WLr`>UQz^7Mz zaCJ>VxS|`Tx=kJt$$Rj<^5#hFAw#>!w<39-em714)8C;lnsVBnl|Sl?b{J}ucX#GZ z`EL0}XFlBhRcBZ^Ut45inG{b(LLm0vZK?+fF!J8^3=ZED5ajTmovKX{rsNXxhqc)>j%r0 zuDpl$A}1t~`TR|~n{_Z;jTnv7oaEbGu~MxVD(j>97sjlPD9AiK?3ye$$YF(Atnrmg zqIo;lFNRcgtsgy)S&A{B<`z!hbzn=kR34(-#u90m|e_Zao&Krmo_VR)5{2kw6<7r`wL>5>S(mto`vEUq$JH_%9qJLt+nOJ_D zi(#$>t9x?1UFCVmg}pd_q0(2r-iz1vINMjLT)b%vz5s2Rq-u@(5~#%Z&g$LCRMdpK zcsopx+naa?{(AwY&~iJmHco!ihj$d8$H^Vzu_=C6@Mk;^;a(kIP)TBhDf1bhfrI6{ zz2ugCd4oC=;1lT)eqtZSXLPLkb^H(TA7WMeLw=_(ALqNJ7o5aDFb{kjIur{-Ne|00 zn=!nX{A*vn%HuUmfo(} z{MFECC4#P&8roG~(dpIDhpNsIp&DQM%JBm+syp43Lx%CyV)~N;*FoHuy9{}Zwm#HC zH{fwW$Y6em3+bW!=McWq$yQ09sTv>1*+aSPF##dVFFouIS4@TD{jEwlG>N}o`vz9= zm}RG9E|&j2{Ait`V6<*VtZR`)cT(P;#HWgd*VNoD{z17paQVbr+|y zbNSO`?jRmlDET^%tWffeuaK7wP0zI-5wH*R{cc#)6 zS#d$u6h2h&Qu*hpyo~={usfCGOMrzl3IQ(&{c3W$^|L8)y8>&Z1w9M*t-WtX`Wi;AO|fm|2_T z=*8Se>^94XvUq*IM*d(iZ#ihoc^p#kG&$)+lF4F!IAg4n(;Jf|D+3K+ak7ptu-S5v zR5X4}Q(cn1w3VnuY;LZZwW6^4C>eOWx>j2~m0K<0KDw8?VO;QC6Y(B5A8tjDKaB0v zFi*n|HJqv81Pw1~s6@g)MImbZ(;8mV@V+c}8Zxb*ei}B_u$_kS3Yr;Pqh+vA!^s*B&@fuVRvPAN83btICt89I zt<{=(YuH#r{A^BXtXK^bH5^Td{Migmuu{X%G~B7-Q4P;(_>+deY4}t_w@@{s`Wl94 z*iFMh8cx)3HjwgXxtd^$hD92l)$qE8Pc*b|qh{ozVW@_^H5{wqd<|D>xJ|<%4X@*+ zLur~9njkPtO}L$gy)_)7;aCl)X*gHITn#_daHobxHT+4#`x?H`&?VegYqD?^Lp1Cl zds=vt;P|5qUJS;{%2k|uOU3fmT#@f!K>SYBv-G^G7&}Z=c*_ecyiuE~-=0$9*w`4p z>0_nOC`HDqbZ+3iL4KZs`4#+V;obXl`vU);`8!^^;O?D*r^~DVAur#PgdH1u~(o7FGTmSXC7(3%qhaC$QlM@*2pZBF%NIGKsCeM#h$rDxGn zgq6%ktC=^2N(nEdu-xS}@9A0Bs1`mk5+AC7>dLEM^Y+GMMT|i?$cYu)PKzP?|C0HK>RPb+ zd?oWu^+_?J?Wr&si0>cd$h^k3WnK{x%!`LISBza$vG5K0EXhZ$VqOo%mi0t?BkW(t zfw`@8s&pu~Pqj-Cp_Gn^`i3en2vY-rb)dCc+?rv3Uwh`X^560NvC`M(Qs4WdyfqsJJprd;i=49DXcughRYiYHe16rHs0JEk0qudGB59sFLejtbc?XRKMf!Q zb6M$-N`;H2zN=%$ocU5Fw2ISDh}DYsMa2_P@!nd+VUNc1uV=?xc{#J!?8_ZcK{r(V z_AksS?FO^QSuA=8TisRYCYDecl*->`!*R>`59qp9uKx}rj$%V`)cnJde;D#_Rh@qd zuPR$>=vqP7T+^-oRs^C6R$maEs3qLF@aeL}Pi=wHk&K0mVvNH64RlN&5zh4JPKQ*r zt5Ye}#tzKL+cJkDbU~;{L>eQIMgsF!(+C*H*e#G6Ml+1<%>E^#)$2(FR<$VBZ9HQe zK%KR?)nOTj?^;y6%UlFDqYm((#-j#0dWxk?#3$D9I^=56s>5fzi-|gniBdsNK8rw>d zPfTOXt+rZ2va1>XS6t>`#$POG!59)||D7I7BJN}0-ePW* zF6B7?UExt*P;Z7yAaOWs0crxp6&VRXwA2Ub(Y z@mUmpXv7-gANvR_Cs~aB3<|BIR{CFI%_eU#WBWl>HZ{VHwI$Vodrht^qL0PCBmGC3TDzzx2uNnR)j=b1j z4Dc`C#8~^!u&~!vt5Y48AKHt-4uZLaIfTlwIuX!2-inX*F@C@Lma$Wy(vL7+@LwtT z+cm#S^F&dgBRiOeBPBq|*z4|foCl&v98$C#(83ayH| z{Rm^nK#5uwo=WnLROjmCzbM8J8$jL;mExQ$#m^K#RdN0RZ^YfKI*wZX>Z(12&hf%O)#tuW@?A&a zTh6`g#lGMUnvvpi5LGRbQ#ySs_n z?W%M=LpgJ6!&$CY0B2gWx?#iCX5Mhc?CMG<)zLUH|0Q3m7fJ~GuuJeG#jn86V+bOGmi*2=CRT( zm3uoe@3C&odyp&h#;MeMng>r^qZfYFrHhC2)eJ(bG}ntxO(_Q&>f?Gs4(hd1?Qa+G zD|&G@S_{jo^dhKwg_+uevkyV7dAiO^*e{jrpVU{>a*Ynz7v9Psf~Z=~C@e>=LU^Qz?`~JqPCg$g#XigLI}D zL_11vE7Bu8YY;vf~ zY;O|XOf@Ibdz{!(F16(2# zapbJ_vw$am%W%+S@PwB@8Q{x-BYbh60G|SE;fM1t_)uV&KVv1t*T%7|E>3{pOM&C? z%)sESNClp0z*qqIDzA!}yfpuExdi;5;!o8qv;Q#T- z2*o!uF$e{RoX{y4KZgKc4(!!fJt4ynV^$q8@Rihb+K}_+KBz9_gfBs%;0Ya@FcuBI z+8qO)+%>LE;dcN}*dLSzo-hTp6g=TE&|2`Nz)85!?5Jf%vw*n{qBHwH&K#jQb;4Vt zNfCiC26P>KB5)Uo96W^N%y|XArc;N`7pFl@;hZ771L_RE68NYMmVNMw@5LOZdUa|# zW@XKKAluP5!ef!AR4^YULmAI-l1op zAn=55Kpnud&W!yDqKqqng;Df*Ap+HYBk<%uItH2yp6~=H1AHm)uW0-Z3VcncP)&ys zIgUQ>2KNYT2)_Y60Z(`mWDg$=Vejs!F!qL?SPyx351`ru@qq4-iQxA0NA|`W`r4mL@fV;Iyg+Cfn{*?go3Z>@FB-fn}HbZkQ2s&(!eJI?FQlM1>OUA4YZcx0;7gtih{4{ zkRfM{xypM(cnS0jMucsK!ixak3gM03}^${1FQTsg!4zERs7(xSC}!VDH#F%#-Uj#Az+nrhA?P6bZ~hPlJg}5e6 zJUM6F-bMF;C-ebL08iKiME0S;K@;)Qc<`zx#*C?j0J&)B3!Poy37b#Bya!KMl#0TE zCtN=b^B#O2(0)2bGUk0vpGr-C3;A7=)3FA?twA^o6bqj46VM>=pP0d12aQF5Fli=6 zJNOjfM|0t40G|u|9R)1`zasZvf9If$mDr>4B7*p&^{Nw4)A%vQ7hC% zEEPCpCDs7Q|8cE|f4O1E{c>GG{JL2GiFpa~gTI9^Y8CnnJbfWu4x-UZ*l~@@M+3*p zXlksCsX*O2)D-p}!20V^8SnwXK>8I5Di#VX%0p!!Cyd;rRxBF$vl;&=8xOGkXR6bO zkp4RfW3EOQ34+iytWhlKN*4R2!!lH4M+hj0a0YaZr`iT9t+$G zItrU2VDNtWeWhScfm;rspx_BFfhaEFZy>6e71-tnRUQG<6{1ChQP4t6s}~3a)Q2na zAY4QsQ=njzfy+RCkS_-ogD4^T*3PQ&gzbvd!gT;9fygG}5H_2`YTu_G!QKywMmknt z@1v@HJTMK!%!okDL(r~ZbST8IfibMy1?>B1-k_%(=(wgK@7snmwh_X0A6 zjUVto7qPa3-wa%K33D0za^O}FwbnM^lOHiiAtxMt8JU640B$YAUYpP8maJ|NF0KNjz^doG0U9E8<@XpUD zAQcYS{ui@a%L%{W99ND_CP2{pESq}^k--ys|EfkNj0I62#{<6uQQ>w0?`V9|ZG4Dy z2U8YtbAfSIbQ5@TlC->!bihXg$Ab2NPc?&C3M!%qz!jjQ;PZf+KqcTe1MgO-Q_c!> zf1nn^0~qxuni4kAz=oA5EXGg}(D;n8Xz+f(u^=ia;m;sCt~~%=c#i%b3!_V5w!c81 zf!_gq3{nOou;WXW?+k4E2ARQzun=?rd=W6yh9(8S2-pQKEm|?7fggY<G-%?;d9cLln6M+jHU;}>#BhyU{F1kC;S#fne71H0#OUy22QUJ$7T?^0N4T!Qj&)NJpueBhftAR020f zs(c>s0Gz11%uo;$0$=ED@PtP}iP)V85A?!dBOBm&e1#kh`2^r~5Y>P%I}SVs*B+pA zAJiT;-oPm!+T}8UXF+-3OMzd)d%6Yu7NEId0un=0cL2KfRr|~h_yveY?=Il)Aj+%~ z*rT7;bilTWoIOB79e{rhMJp1YglP;S`=!89!_*q%V-~guL~_D|#5czJUj!!UZG7*5 zIZC($q(laeO~x$10hKU(I38zU69Ie)3Id-ug0ms`RYN?*1-egEc@N;k)1SB8KMNxt`~hISIqCuu0DK5~1^E+T(|MeE z!@C;_JPx82vlQqtA1#Ls#t$fiNWKktHUr%Z`%+-<1*$yW3?_FWetiH1;oF&NvnKZpm^Ba1|IkbEkg+b?}I!r&>xng!EEDJYlPqoGryHAf)#Nk`vO~0`Y`%G@fv!%EL2vrNG@JUg*T0yaJcL;wk?> D`HJyv diff --git a/vtoyjump/vtoyjump/vtoyjump.c b/vtoyjump/vtoyjump/vtoyjump.c index 7c3d8037..81f5b0db 100644 --- a/vtoyjump/vtoyjump/vtoyjump.c +++ b/vtoyjump/vtoyjump/vtoyjump.c @@ -47,6 +47,8 @@ static CHAR g_prog_name[MAX_PATH]; #define AUTO_RUN_BAT "X:\\VentoyAutoRun.bat" #define AUTO_RUN_LOG "X:\\VentoyAutoRun.log" +#define VTOY_AUTO_FILE "X:\\_vtoy_auto_install" + #define LOG_FILE "X:\\Windows\\system32\\ventoy.log" #define MUTEX_LOCK(hmutex) if (hmutex != NULL) LockStatus = WaitForSingleObject(hmutex, INFINITE) #define MUTEX_UNLOCK(hmutex) if (hmutex != NULL && WAIT_OBJECT_0 == LockStatus) ReleaseMutex(hmutex) @@ -255,9 +257,25 @@ End: return rc; } -static BOOL CheckPeHead(BYTE *Head) +static BOOL CheckPeHead(BYTE *Buffer, DWORD Size, DWORD Offset) { UINT32 PeOffset; + BYTE *Head = NULL; + DWORD End; + ventoy_windows_data *pdata = NULL; + + Head = Buffer + Offset; + pdata = (ventoy_windows_data *)Head; + Head += sizeof(ventoy_windows_data); + + if (pdata->auto_install_script[0] && pdata->auto_install_len > 0) + { + End = Offset + sizeof(ventoy_windows_data) + pdata->auto_install_len + 60; + if (End < Size) + { + Head += pdata->auto_install_len; + } + } if (Head[0] != 'M' || Head[1] != 'Z') { @@ -1647,11 +1665,10 @@ static int VentoyHook(ventoy_os_param *param) if (g_windows_data.auto_install_script[0]) { - sprintf_s(IsoPath, sizeof(IsoPath), "%C:%s", VtoyLetter, g_windows_data.auto_install_script); - if (IsFileExist("%s", IsoPath)) + if (IsFileExist("%s", VTOY_AUTO_FILE)) { - Log("use auto install script %s...", IsoPath); - ProcessUnattendedInstallation(IsoPath); + Log("use auto install script %s...", VTOY_AUTO_FILE); + ProcessUnattendedInstallation(VTOY_AUTO_FILE); } else { @@ -1724,6 +1741,25 @@ static int VentoyHook(ventoy_os_param *param) return 0; } +static int ExtractWindowsDataFile(char *databuf) +{ + int len = 0; + char *filedata = NULL; + ventoy_windows_data *pdata = (ventoy_windows_data *)databuf; + + Log("ExtractWindowsDataFile: auto install <%s:%d>", pdata->auto_install_script, pdata->auto_install_len); + + filedata = databuf + sizeof(ventoy_windows_data); + + if (pdata->auto_install_script[0] && pdata->auto_install_len > 0) + { + SaveBuffer2File(VTOY_AUTO_FILE, filedata, pdata->auto_install_len); + filedata += pdata->auto_install_len; + len = pdata->auto_install_len; + } + + return len; +} int VentoyJumpWimboot(INT argc, CHAR **argv, CHAR *LunchFile) { @@ -1741,6 +1777,7 @@ int VentoyJumpWimboot(INT argc, CHAR **argv, CHAR *LunchFile) memcpy(&g_os_param, buf, sizeof(ventoy_os_param)); memcpy(&g_windows_data, buf + sizeof(ventoy_os_param), sizeof(ventoy_windows_data)); + ExtractWindowsDataFile(buf + sizeof(ventoy_os_param)); memcpy(g_os_param_reserved, g_os_param.vtoy_reserved, sizeof(g_os_param_reserved)); if (g_os_param_reserved[0] == 1) @@ -1800,6 +1837,7 @@ int VentoyJump(INT argc, CHAR **argv, CHAR *LunchFile) { int rc = 1; int stat = 0; + int exlen = 0; DWORD Pos; DWORD PeStart; DWORD FileSize; @@ -1835,12 +1873,13 @@ int VentoyJump(INT argc, CHAR **argv, CHAR *LunchFile) for (PeStart = 0; PeStart < FileSize; PeStart += 16) { if (CheckOsParam((ventoy_os_param *)(Buffer + PeStart)) && - CheckPeHead(Buffer + PeStart + sizeof(ventoy_os_param) + sizeof(ventoy_windows_data))) + CheckPeHead(Buffer, FileSize, PeStart + sizeof(ventoy_os_param))) { Log("Find os pararm at %u", PeStart); memcpy(&g_os_param, Buffer + PeStart, sizeof(ventoy_os_param)); - memcpy(&g_windows_data, Buffer + PeStart + sizeof(ventoy_os_param), sizeof(ventoy_windows_data)); + memcpy(&g_windows_data, Buffer + PeStart + sizeof(ventoy_os_param), sizeof(ventoy_windows_data)); + exlen = ExtractWindowsDataFile(Buffer + PeStart + sizeof(ventoy_os_param)); memcpy(g_os_param_reserved, g_os_param.vtoy_reserved, sizeof(g_os_param_reserved)); if (g_os_param_reserved[0] == 1) @@ -1858,7 +1897,7 @@ int VentoyJump(INT argc, CHAR **argv, CHAR *LunchFile) } } - PeStart += sizeof(ventoy_os_param) + sizeof(ventoy_windows_data); + PeStart += sizeof(ventoy_os_param) + sizeof(ventoy_windows_data) + exlen; sprintf_s(LunchFile, MAX_PATH, "ventoy\\%s", GetFileNameInPath(ExeFileName)); MUTEX_LOCK(g_vtoyins_mutex); diff --git a/vtoyjump/vtoyjump/vtoyjump.h b/vtoyjump/vtoyjump/vtoyjump.h index 3a8fcb61..1e37338e 100644 --- a/vtoyjump/vtoyjump/vtoyjump.h +++ b/vtoyjump/vtoyjump/vtoyjump.h @@ -72,7 +72,15 @@ typedef struct ventoy_windows_data char auto_install_script[384]; char injection_archive[384]; UINT8 windows11_bypass_check; - UINT8 reserved[255]; + + UINT32 auto_install_len; + + UINT8 reserved[255 - 4]; + + /* auto install script file data ... + auto_install_len */ + /* ...... */ + + }ventoy_windows_data;