From 3c521823b15a8a189f5485b606ea903bb86f3296 Mon Sep 17 00:00:00 2001 From: xfy911 Date: Thu, 4 Jun 2026 00:02:18 +0800 Subject: [PATCH] =?UTF-8?q?feat(tests):=20=E6=B7=BB=E5=8A=A0=20config=20?= =?UTF-8?q?=E5=92=8C=20log=20=E6=A8=A1=E5=9D=97=E5=8D=95=E5=85=83=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=20+=20http.c=20=E7=BC=93=E5=86=B2=E5=8C=BA=E6=BA=A2?= =?UTF-8?q?=E5=87=BA=E9=98=B2=E6=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 test_log.c: 8 个测试覆盖日志级别 getter/setter、前缀设置、持久化 - 新增 test_config.c: 11 个测试覆盖 JSON 配置加载、注释支持、错误处理、merge 覆盖逻辑 - http.c: 修复 response header 格式化中的 snprintf 边界条件,防止缓冲区溢出 - Makefile: 添加 test_log、test_config 编译规则,更新 .PHONY 列表 --- Makefile | 8 +- http.c | 36 +++++-- tests/unit/test_config | Bin 0 -> 46688 bytes tests/unit/test_config.c | 206 ++++++++++++++++++++++++++++++++++++++ tests/unit/test_http | Bin 60024 -> 60024 bytes tests/unit/test_http.c | 7 +- tests/unit/test_http_asan | Bin 188840 -> 188976 bytes tests/unit/test_log | Bin 0 -> 41272 bytes tests/unit/test_log.c | 81 +++++++++++++++ tests/unit/test_static | Bin 69408 -> 69408 bytes 10 files changed, 322 insertions(+), 16 deletions(-) create mode 100755 tests/unit/test_config create mode 100644 tests/unit/test_config.c create mode 100755 tests/unit/test_log create mode 100644 tests/unit/test_log.c diff --git a/Makefile b/Makefile index 1a6fbfb..4f84806 100644 --- a/Makefile +++ b/Makefile @@ -84,6 +84,12 @@ $(UNIT_TEST_DIR)/test_http: $(UNIT_TEST_DIR)/test_http.c http.c log.c $(UNITY_SR $(UNIT_TEST_DIR)/test_static: $(UNIT_TEST_DIR)/test_static.c http.c log.c $(UNITY_SRC) $(CC) $(CFLAGS) -D_GNU_SOURCE -I. -I$(UNIT_TEST_DIR)/../unity -o $@ $(UNIT_TEST_DIR)/test_static.c http.c log.c $(UNITY_SRC) -lm -lz +$(UNIT_TEST_DIR)/test_log: $(UNIT_TEST_DIR)/test_log.c log.c $(UNITY_SRC) + $(CC) $(CFLAGS) -D_GNU_SOURCE -I. -I$(UNIT_TEST_DIR)/../unity -o $@ $(UNIT_TEST_DIR)/test_log.c log.c $(UNITY_SRC) -lm + +$(UNIT_TEST_DIR)/test_config: $(UNIT_TEST_DIR)/test_config.c config.c log.c $(UNITY_SRC) + $(CC) $(CFLAGS) -D_GNU_SOURCE -I. -I$(UNIT_TEST_DIR)/../unity -o $@ $(UNIT_TEST_DIR)/test_config.c config.c log.c $(UNITY_SRC) -lm + # 编译规则 %.o: %.c $(CC) $(CFLAGS) -c $< -o $@ @@ -105,4 +111,4 @@ clean: # 重新构建 rebuild: clean all -.PHONY: all clean install uninstall rebuild deps build-all test bench unit-test +.PHONY: all clean install uninstall rebuild deps build-all test bench unit-test test-all diff --git a/http.c b/http.c index bd4b7e6..226b75b 100644 --- a/http.c +++ b/http.c @@ -245,7 +245,7 @@ int http_format_response_header(char *buf, size_t buf_size, const http_response_ /* 状态行 */ if (resp->has_range) { - n += snprintf(buf + n, buf_size - n, + n += snprintf(buf + n, buf_size - (size_t)n > buf_size ? 0 : buf_size - (size_t)n, "HTTP/1.1 %d %s\r\n" "Content-Type: %s\r\n" "Content-Length: %ld\r\n" @@ -256,7 +256,7 @@ int http_format_response_header(char *buf, size_t buf_size, const http_response_ (long)resp->content_length, (long)resp->range_start, (long)resp->range_end, (long)resp->total_length); } else { - n += snprintf(buf + n, buf_size - n, + n += snprintf(buf + n, buf_size - (size_t)n > buf_size ? 0 : buf_size - (size_t)n, "HTTP/1.1 %d %s\r\n" "Content-Type: %s\r\n" "Content-Length: %ld\r\n" @@ -268,21 +268,37 @@ int http_format_response_header(char *buf, size_t buf_size, const http_response_ /* 缓存头 */ if (resp->etag && resp->etag[0]) { - n += snprintf(buf + n, buf_size - n, "ETag: %s\r\n", resp->etag); + if ((size_t)n < buf_size) { + n += snprintf(buf + n, buf_size - (size_t)n, "ETag: %s\r\n", resp->etag); + } else { + n += (int)strlen(resp->etag) + 8; + } } if (resp->last_modified && resp->last_modified[0]) { - n += snprintf(buf + n, buf_size - n, "Last-Modified: %s\r\n", resp->last_modified); + if ((size_t)n < buf_size) { + n += snprintf(buf + n, buf_size - (size_t)n, "Last-Modified: %s\r\n", resp->last_modified); + } else { + n += (int)strlen(resp->last_modified) + 16; + } } if (resp->content_encoding && resp->content_encoding[0]) { - n += snprintf(buf + n, buf_size - n, "Content-Encoding: %s\r\n", resp->content_encoding); + if ((size_t)n < buf_size) { + n += snprintf(buf + n, buf_size - (size_t)n, "Content-Encoding: %s\r\n", resp->content_encoding); + } else { + n += (int)strlen(resp->content_encoding) + 20; + } } /* 连接头 + 空行 */ - n += snprintf(buf + n, buf_size - n, - "Connection: %s\r\n" - "Server: Cocoon/1.0\r\n" - "\r\n", - resp->keep_alive ? "keep-alive" : "close"); + if ((size_t)n < buf_size) { + n += snprintf(buf + n, buf_size - (size_t)n, + "Connection: %s\r\n" + "Server: Cocoon/1.0\r\n" + "\r\n", + resp->keep_alive ? "keep-alive" : "close"); + } else { + n += 35; /* approximate */ + } if ((size_t)n >= buf_size) return -1; return n; diff --git a/tests/unit/test_config b/tests/unit/test_config new file mode 100755 index 0000000000000000000000000000000000000000..89e7b78cc9bb6209de8a3acad16e7fe07489450e GIT binary patch literal 46688 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 GQTjhAqw%Kz literal 0 HcmV?d00001 diff --git a/tests/unit/test_config.c b/tests/unit/test_config.c new file mode 100644 index 0000000..b0c4ac6 --- /dev/null +++ b/tests/unit/test_config.c @@ -0,0 +1,206 @@ +#include "unity.h" +#include "config.h" +#include +#include +#include +#include + +/* 辅助:写临时配置文件,返回路径 */ +static const char *write_temp_config(const char *content) { + static char path[256]; + static int counter = 0; + snprintf(path, sizeof(path), "/tmp/cocoon_test_config_%d_%d.json", + (int)getpid(), counter++); + FILE *fp = fopen(path, "w"); + if (fp) { + fwrite(content, 1, strlen(content), fp); + fclose(fp); + } + return path; +} + +static void cleanup(const char *path) { + remove(path); +} + +/* ===== config_load_from_file ===== */ + +void test_load_valid_config(void) { + const char *p = write_temp_config( + "{\n" + " \"root_dir\": \"/var/www\",\n" + " \"port\": 8080,\n" + " \"threaded\": true,\n" + " \"num_workers\": 8,\n" + " \"max_connections\": 5000,\n" + " \"timeout_ms\": 60000,\n" + " \"log_level\": \"debug\"\n" + "}\n" + ); + cocoon_config_t cfg = {0}; + TEST_ASSERT_TRUE(config_load_from_file(p, &cfg)); + TEST_ASSERT_EQUAL_STRING("/var/www", cfg.root_dir); + TEST_ASSERT_EQUAL(8080, cfg.port); + TEST_ASSERT_TRUE(cfg.threaded); + TEST_ASSERT_EQUAL(8, cfg.num_workers); + TEST_ASSERT_EQUAL(5000, cfg.max_connections); + TEST_ASSERT_EQUAL(60000, cfg.timeout_ms); + TEST_ASSERT_EQUAL(LOG_LEVEL_DEBUG, cfg.log_level); + free((void *)cfg.root_dir); + cleanup(p); +} + +void test_load_valid_minimal(void) { + const char *p = write_temp_config("{\"port\": 3000}"); + cocoon_config_t cfg = {0}; + TEST_ASSERT_TRUE(config_load_from_file(p, &cfg)); + TEST_ASSERT_EQUAL(3000, cfg.port); + free((void *)cfg.root_dir); + cleanup(p); +} + +void test_load_valid_with_comments(void) { + const char *p = write_temp_config( + "{\n" + " // this is a comment\n" + " \"port\": 9090\n" + "}\n" + ); + cocoon_config_t cfg = {0}; + TEST_ASSERT_TRUE(config_load_from_file(p, &cfg)); + TEST_ASSERT_EQUAL(9090, cfg.port); + free((void *)cfg.root_dir); + cleanup(p); +} + +void test_load_invalid_json(void) { + const char *p = write_temp_config("not json"); + cocoon_config_t cfg = {0}; + TEST_ASSERT_FALSE(config_load_from_file(p, &cfg)); + cleanup(p); +} + +void test_load_missing_file(void) { + cocoon_config_t cfg = {0}; + TEST_ASSERT_FALSE(config_load_from_file( + "/tmp/cocoon_nonexist_12345.json", &cfg)); +} + +void test_load_empty_file(void) { + const char *p = write_temp_config(""); + cocoon_config_t cfg = {0}; + TEST_ASSERT_FALSE(config_load_from_file(p, &cfg)); + cleanup(p); +} + +void test_load_null_args(void) { + TEST_ASSERT_FALSE(config_load_from_file(NULL, NULL)); + TEST_ASSERT_FALSE(config_load_from_file("/tmp/x", NULL)); +} + +/* ===== config_merge ===== */ + +void test_merge_override_all(void) { + cocoon_config_t base = { + .root_dir = strdup("/old"), + .port = 8080, + .threaded = false, + .num_workers = 2, + .max_connections = 100, + .timeout_ms = 30000, + .log_level = LOG_LEVEL_INFO + }; + cocoon_config_t cmdline = { + .root_dir = "/new", + .port = 9090, + .threaded = true, + .num_workers = 4, + .max_connections = 200, + .timeout_ms = 60000, + .log_level = LOG_LEVEL_DEBUG + }; + config_merge(&base, &cmdline, + true, true, true, true, true, true); + TEST_ASSERT_EQUAL_STRING("/new", base.root_dir); + TEST_ASSERT_EQUAL(9090, base.port); + TEST_ASSERT_TRUE(base.threaded); + TEST_ASSERT_EQUAL(4, base.num_workers); + TEST_ASSERT_EQUAL(200, base.max_connections); + TEST_ASSERT_EQUAL(60000, base.timeout_ms); + TEST_ASSERT_EQUAL(LOG_LEVEL_DEBUG, base.log_level); + free((void *)base.root_dir); +} + +void test_merge_no_override(void) { + cocoon_config_t base = { + .root_dir = strdup("/old"), + .port = 8080, + .threaded = false, + .num_workers = 2, + .log_level = LOG_LEVEL_INFO + }; + cocoon_config_t cmdline = { + .root_dir = "/new", + .port = 9090, + .num_workers = 4, + .log_level = LOG_LEVEL_DEBUG + }; + config_merge(&base, &cmdline, + false, false, false, false, false, false); + TEST_ASSERT_EQUAL_STRING("/old", base.root_dir); + TEST_ASSERT_EQUAL(8080, base.port); + TEST_ASSERT_FALSE(base.threaded); + TEST_ASSERT_EQUAL(2, base.num_workers); + TEST_ASSERT_EQUAL(LOG_LEVEL_INFO, base.log_level); + free((void *)base.root_dir); +} + +void test_merge_partial_override(void) { + cocoon_config_t base = { + .root_dir = strdup("/old"), + .port = 8080, + .num_workers = 2, + .log_level = LOG_LEVEL_INFO + }; + cocoon_config_t cmdline = { + .root_dir = "/new", + .port = 9090, + .num_workers = 4, + .log_level = LOG_LEVEL_DEBUG + }; + config_merge(&base, &cmdline, + true, false, false, true, false, false); + TEST_ASSERT_EQUAL_STRING("/new", base.root_dir); /* overridden */ + TEST_ASSERT_EQUAL(8080, base.port); /* not overridden */ + TEST_ASSERT_EQUAL(2, base.num_workers); /* not overridden */ + TEST_ASSERT_EQUAL(LOG_LEVEL_INFO, base.log_level); /* not overridden */ + free((void *)base.root_dir); +} + +void test_merge_null_safety(void) { + /* 不应 crash */ + config_merge(NULL, NULL, true, true, true, true, true, true); + TEST_ASSERT_TRUE(1); +} + +void setUp(void) {} +void tearDown(void) {} + +int main(void) { + UNITY_BEGIN(); + + RUN_TEST(test_load_valid_config); + RUN_TEST(test_load_valid_minimal); + RUN_TEST(test_load_valid_with_comments); + RUN_TEST(test_load_invalid_json); + RUN_TEST(test_load_missing_file); + RUN_TEST(test_load_empty_file); + RUN_TEST(test_load_null_args); + + RUN_TEST(test_merge_override_all); + RUN_TEST(test_merge_no_override); + RUN_TEST(test_merge_partial_override); + RUN_TEST(test_merge_null_safety); + + return UNITY_END(); +} diff --git a/tests/unit/test_http b/tests/unit/test_http index a95cc1915d17f023a21f59223e46d622605f3b46..a3f1c8a84d07cdc1e715836ff98969b98877f94a 100755 GIT binary patch delta 15122 zcmaKT3w%sh*Z$0rAvZa3iwKg4A&E;QX@ayFGMaFPNd*ZZ5tk6RxF=|-iB5v)bkJ_E zqN=6Zs!LsqsFJuOaSv70ty;>NhSE~vQuBY-*)tLE_y4~6{c4~6thJuK_S$=|z0W>r z^|?CL=jv>AS9|79Qz^gvX*(LKbA-l@fBT%s8j-y5Gh4*%2~mx5Nc*bJa-5(NpOuDe8KS*9>5a`|K$~YL;&y(gkR_QmrjQ~fj1`n zSB`(h@hC6g&&L7(jpN@GDDCU)M0Aq`H@F~jff5OI3*aXRzsd0>oaiVK?Iiqnj(^1Q zd8EIJ@LL>r=R8Nfffo{fo8z;&{?z(tU(O|g%mr_A!IS#HQwg_oT%NBuG|vZkJmGgZ zK7#AVH2|(9{4U2wb9`Gv;NFD)$?+VHTN(j>I98=H?Y+kZTb&IwhTsYWd+&3+A2$dW zfgdLPFOCo7_!+`C5&k#F7jmArDH2Nw|A*tPDNWo39uXDi)5{x3jV{XvZ z*#O~2!mBynnd9U9fX5L2gyYd1pGSBL!k=H*A-@o{5SqzuHw_f(WwLty zf$H0=t$&bEp22$g2MS+jurdCDZ!E}AsSeat!FXbGm8#euPf=$j%P*3pOrAip+jSu8 z2N}TPW=?TghW)J!R^nf1oTXQ(tT9^s9*i6;qa4L;iEIR5@YwRSZpEPhu&!^+0KQ@f z$9HPoe9>GO7p2dHXzmcUq*mUSYvp<{750DaG(#3KcZ=x$0%oYVS zYczVWN>#8=8@wE%d@Whmfpsvu6yPni9m(W?If?1rL2KQq^@mQ>S?+FeBJ>Ynj;iE1 zh@;LHCvomh`Q-6VZ6%cDN$K1nzqYKjSz~rT#EX?TH+jzJ#^FhAYT(H&Ou{K0yWgU{ zutvvPwu}&_>R58i2v5C^>&9tobl0_99BzpR44)zupAJ-@ai?RG$fxlnMqfs@hE))o z9q26-WidB9vYB$3c!p!+}Oz>CQM)@QPu;MqQ&BD*2Pn%4n7XkSzCTBpdqzKG&CEs-~h^ ze2~O8o!dl+iWO1up_dk^l#14J_%PS}HJ1!_YL}8|0Yv04aUBz@=gp(Y`ZORrax31QAhQ~@SPme@A(Z6dzEng!5W1w9CU*OHr@9~ zQu63D{PX!Am>0J>`X!-#f$qP>0ZOiNHv)d=fSG`f1l;7nGy+$qVUqR{ z7c4`Tk`q$#&ulwdc+AlPLffUXn_*w5e`gEBC9Nm*#HO2{13}~f{4+s@x)(>M5E?Lm zJq+KiE@hkAWyZARg11IPP>oq5zjhnyK^*N$=x;#x2XY{kfHN$xHk;AeI9g{)ar0L(dCkE zCZ|)nL+V}#g}r|-wy%T#Yh6iUcx`Xm^0uPMJOEOP?g*y>qFb*QtJksRYceKk@#xxi z=X)xB{F_GZ7^GyE^U`j2Pd2DyOVe_)8(-UQKDXOLcJGjMLT%|-F8z|EnIz3sq|T0C zrJf`~MGQ)OWwhs#eh1Q@!r5%P8Gs}chTD%*P9qghQkm*f8AB@2c$lPgWh`mPI1Cj} zb7>57YMkX7Lr9~HG^V>W`Z+bWa*brtSVtOpq|xv!9RT>K#Y1F&KZzAaEcX1Sy%I2a zO+#g~i0|Yr98TWRyHjJeXI48d8rXo1ja=l;H_#Ga(yPClFHZ9?G;)Kri@GXS0+F|d zag+5T^NU`o-p95@$M__oeGL9o+Jl<+W)GqlhrNyiqh#KvEurltzbl;&oIBhCQpT20 z0g2p*c59#c+&*MDkj@5n@wI)XFsbOQxU@tndL%AA=w2xn`I3(1U#Z9;7P{ftV0pB+ zauxdh$cS8d^s2*QwEVpvXC!Fxx@0*d6_tpE0|83mvfgqSwM7-AkzH9Zr-`F}zFVSg zxI=G#?jbJP3Vg2{32m`uBXB$>nns`{iX9}>aN(8_T=w`1mo2U(Tj7*lcFH=sza%v~ zWe1$HK$6wtoViZf7f#thQ(Xw5K;EP~g$ta*2Qbo?C#j%9XTGpKFR;I44Ap1qhw8KR z!w!i-idYTt{$SEUM`pto!N@ypw9QgGQ8%s8;*dv>#Bz{?+c9~J;V*1G9Xj0$QKg!> z*8HNLWcAh>Y)Nj$>@sowW{^r&gW6zw*IP2*t~OYb-4ZRO25X*JEm`v1tEKR2qvZul z>D)Y7vXn~Uc76B>z0Ig~n4kEF^AiwXq+0VKwL$%7xtkWwsdB{0ny@h_^_Kt8F-~7z z)R^WBeunZQI<(RD$%;F-G(8Z_yKp9zEV)|$B`-(&7b*Oby!o=jVXz#gZcLHlE{cUs z$W_~$YD3&%vCsiFqvdyF+>Pl?^#yaZ7<$oQ%hft^BE+CVr7_9!$Ntyxgxo@WLlwSq z;%i82D*T$w)YDAO)9i+L9hO+eP1$%>>1YD z38XNo^alKUhN5n=ZC^|Bjuy&f)6aat*HdOz>^7(pp02?8sRrmOj@V+O(~-yuE|R)l zTv|la+U%xPV}>YE*ISe+PSeMHU*-X$Ds0Zow&NWmr`xiBl-CST6oGr)mxQ*S=_XCTC{w&8f-t%3monCWs-gK&9cHaBvIMtK69~4Rv*dY zZaE`a=lCE4%|QmT&2p#IgiIubm#HgD;x9GMBm=t!|MbAwMh7QHOlT&9Kk4Y;EJF;Zms7DlKlcF={ zJkGQom5KTb;vEJZIUSf1%)iiP!7Q~(EULtla~zO9>HQL3I%r7Jln|@LT|NulA00%R zIP@HXGe{CX&LpuN0BtM?x5}RPgl1s^CJzgVZzz=f#5%{fR!6cS@$H)JCB?F$V)E0~ zC+bH!`!rrFxC!h~e7L$lyBnX?Twl#Ou?SW67-xlcQhO-N(T(&MpCdm#wWVLjGyU0QCGhQ(c8`h_-nGhZ)=Mc2WhFDukgU1e{E8DaIInPAQH;gm&B5ge-* zhWjE^SnqBDrXMBsK?#$^a!o3=*TJNyT5s*I#>V5E1=d90=a$3<&+RSHL93VEV(SW1 ztFg{=i&1!Pzd$nx`=@K_=l`foeF}1|ssA?GRcvR~wylG_+Y1v-+@0u)a3?l+Vc!Fv z_t5Cr3($LUx3LZcM&X6M0WgJu`c~8WGcfSX$X;}7-K`M@+Tc77)x)!7ebZO6)z2D0 zj|2QA%RdO3Bqo*?%x;Bw@f=a2*Of%8m(ivf$cA-qYI<}A{V^X7#>q&s&Q8G5DzAA# zcU7LBA^WftCyVd>10y-|tizFH8|CH>9qE7S=rKI9w^PR#Iw}8C=Xc_f(HikIHe{dE z+Y+^{jZ)kn)4LVS4n}g&bj2H*!8WG}=K7yTTmA8@6^VY?pCW2C8x*(=mM7pHfmGz=MUucS zq>xIM@~9GdH>~yQ!}gm>ybItu`NZv{|HIDYw0qe5|6}+(?SF5um(y_hOFKR-1P6=6ejdxGP;PS&kH577MSSDmyBfNk3TF)0bV+w-=7}W%YV= zXm=WS6=LCc7^8Xd+UYaKP^eES*cy(F%brYFekvQzIpr5z z@^GiTg3FgU`FC@<$)+(o8(7a38aN3)b`d2SVak5I4cg}uX$-jxzd5zawuqjovQQO@I3Onq(q2MIA#0frxW!1{45_@0NbIc%* zhI$7Wi$yBT7W-^03>QmQe;T`SK!iv#zu>MKW3&XssxSXK^7wm<%Hhw zh=lT)6U>&>*7OAVz}dFuZ{^w5w&rJ4(e??-7-CWh*gpWxD{WtfOwK`P?ZXfrc@A33 zd3mByZZ<5swy?sx69!1R>9FWpav%Y9P2f|jrY`H!^RO`Q82h*9N5bX>?89DN>g_zL z?2_y=X@*+OCiiN_hDlx77(;z_uGd6OyZI`WprD-$UDZw4Si^9(ytnk4WQ~n0!j+}6 zoj<-RU%?fjWd7GfTreE|+1`zWfa{aC0Jd~e&`+U zlY?rFiU)hxJ2L8G8Io+_&Ah5aTQ*+nWDqrhmR{U-!g9RyS3&wwHeVOb)gE)t*k*N+ zzbRvBeRPe+!wQ-^%V!f^{`Cw*Dgm$W z+%S_2m78k;K-G5#khXDGbwpw9PQqyf{CJsGn~xb)Blc7Xbe{mAJw+pr!<>hoJpg1V3>2H2hm|3~t`{3lrmmo#0M3Kjr6#EE zP@tH~TMo0n$<0k6sLLmb)uy|L2`bad0nxE}P8aD)#hweM+Ve#+>#Cuk8i02ON*TJZ z$aI&oW_6z-TgV#}8r_f3;-0S{z^pq;W_c}PGM3bW%v^70jovf@iY_ZE{rWTaw>p`c zfE+D7pxs*zQ{;E^ro+kS1#mKy;<)w@tnilasnEsVs1aC5VAGY;{J)Dc4N*%lEv?ZQ zqnQ38pC+j_c0B~tXN5Oos9ieL+I8xnRi;};OzWUq^-azaQUvy1Klbxm$&Jn*R2b-X zlux1~2U%R-h>^dWlu5Kk{s0QKC(%#zYJ2GAI+Q1HhMh3rvuOx`sx_|HK|ZT`a;3$j zq|B<=gY0PEE`rg-gp?72eJ(rMzpXH}l-W|k8}-D|0liv0*X2`eDLa}nQr(Jm=ocz{ zQ^L~vh1Z{30wr70btoQsms$G-ng$SJja~Jw%d7_gB_C0gV{tNubS|VBN}OmG217%c zdWOeWW1A_mW__1Hq(|zG zth!Tko{=|lf`@Zl!B`2vKHNcL=1gSz)HGb14Z!@d#-5nN-s^7==FL%JWqxuNq z2cmD2Yba;5qO9^j%sOa3)UYNd`B%u??aj_x+xYmQ{(k7?)UsF z=-Na`4@96txRv}Pt({OQF~5P~!m>D~9~j+cF#5#rV(foDRL+!2fPGtT>PkJKE_~IM zEgu-%XdwWx({*wFA0P+ba&}jCd|*KvHKKc9H1U7ER|)xjeEclBEH0!I(*fMls^mp` z*_1(JJo6!t%vEZ*>9>qbLO>oA33@;SU zsii1BzAP6Ovv<;4soSts=|QHV&QMZgKFYgs!2Iv;7)WX};6q-7WY%26lNuozhB8OI zS8~7;5;0tJ8g(TlJ^}$h@*u12QS5wRx0>v#%4if}J&&}lx*;fJ%>##qQc(xieQ-;U zDJ1dIOr60-4~{l{*Aohre^E^G=xFkbyn~jQP4^)Qb~^>WBv`4ey*XNcx$*&2$~FJw zqeVEkpZ?8=6-G9mT z{$qtJJ&9F;>xaBoT`ol(Bi$;ag~wt%!p9|ftY=1dp*)c-$ml4{N@Tk-GW>Q=f7R@J z)MY;wn%PD8^G!B9Gh8sg$*h^}g>G-MJt&^^V83U^sUuj>&~6@+kt#tvWg5#F+Fkg% z2m5+xMBm!FCH@3;`Oyw0Wpx%#=~+QmxR9-98?)N01KEYF4#Lj~OfxJ_ z?ZdhcGk7FUA>t-UQ`m>Yo|#mW>Eu-=udh-%e5^Z|PT*rACc~FVaD3PAvrQ3>!e?}O z3kebJ3wKbKYo0@?_Gl8HoI(0l-8#sK+sL^m5%(0%ZE$jXspNZG6>?d}{6@q?_24#1 z;m_sUq-xW7keL@ZyE)P2()-+MKsPpfL~miiM5Y_nN@%>54IkCCMKP>;k*_1|bglX) zO~VU!6|y$0<;c($?x4W|>$$vT3$phXqorKda3BASXTwK^dL%&sG3q&yEg9KVOrz`- zRw1UIK#DBrz;=!77U>Tx(KZE3>fYT4iK4HjZwI6fJk);?hihKT!zx`((ibCQ8!&Bl zU;k313^AMfmd@?4RtO>IN)+REV&8GeXe3_Zg&Y`OYmR-_()cyr(E`Bk%$T zlkfo;D1C|fhuSFD1c0~pNCu)VzrC3q8P&zKWIT7LE4g6P4I!dT5W$^Th`2kKHz~r0 z=)c?@LgF3+Zu>;+Zs=1VC&>dcwCS1X4ELeqTi5SD3>?yLP7r(CqFUuh8WT2&2aW$ zbX#?E7LXI$;D^o-M%;YIn-9hLFg84=xo{?qy_@4NY>Hza=L9!xfJSNurU~lul#T3E zPBWxwIY-;JWUSI|DGIU3>TLIN?5pk8VbNovTgcdIoKXa7c{MjBLZsjf)a`b!PR(CkRKPnPGgsuqc+5 zjBle3Ww*x1hkP~a)h=#8UDkZ9yq}LjB(~%4ASS#aoQz@fCUkAm9`tEBk~rz8UeGUoeHR-MO8GEm7=V?rZ9Hto6i5;m>H6HnDZoYAsB3M1^0^}1iT6F(@iVRM$8soK zK=LudzV@sqK6xYQTXhdXK-{Z1_x=coN?;D|6;5t!Bi%W9*N&`gYFxC9+gR`+OpfAq z1IR9o+eOs)bnY|7r=cBL)HFY#s3S8>>mih8GTXFP!dsuQt<#zZ%p-qST~tDtLZR}- zfYE~O$bO#|+B^ZT&e%-;m2a=cX0q96IW6mWi)~rx^k9!7$T2GOGg->?u0ld4dw;sN zX#l|5{S8E2etR`LGCkhoc!pwdB7=G6^*80BMw+xqJ%kfz_-cD7SJRgSYwVdJh_3QV zIrCH6>~7I!m&qglU5zXQG8nEP!vo4Eh`VCpez1aJagA22i{YLez!|0wp_ev=z8Qp+ z(YKKg<(l)bs@;K0sLMp4yvEQyhR4OcG$?L%Dw6-P-2XswBTjMSvRKrWb_bizk3cOz zJHDE^j=Eisu_5`bglp~CyZK@6p`bE)#fGuX`O|yk4yKrtp@r3WB3EP&qO|GSx5IPC zpYUvrtqU37oi=@fP2-tbq#F`CcIJk&ku!9{=5)4ZhF0kE2`iuRzUhs0g;c(APGQo7 zgQ*@pTVt;eaxu+csR%zqSmZzOL4l@3Lu$HQ(*^dmqe6W0GSau|egOfUh8A${Z^9tj zNaohqLML|*{8bevZ%yQjoaDREm#VdT+g#f6218f55K%$Xei`ou6xjjPU7IdGlr@|c z=J649B(M5x5PNgh`~40Kq=rw?TCjL)<>ADNI{<2-5MKenITRW^N_AE!!cEu_Njgw(BXE=>5Q9c7DxV1rH0HBgnIE8^Ib~-7pAeQ!_e5R|| z$#?n)F{vzIc9^ht8B3fU6@Os>1?GutS_VD#FSUDGKFgc=zBP!>)4!f5NwWi$=G zf&oJELQY=Bw#^PpKaTdX4IV~8e@-GS_!||1bFR|!8;#I4nrd+Jz zZB;Xeqxi@WHOH@45gMZuhGIZo1J{e2303*hf6#qw%2r)4Rgc3>gzql7d=EG7l#QBF zH_A2f1K6TD%}i}LSKC*)g2?!t8m^N5s7~Nq^NDLQap5Yg9lD+kAs;LcGO)(>Cm@(Y zU%iw!Ih@qXH9tT=v!QCaa`_PWbbvHi@pT08dvpH$06a(5;&-dz-#~QM*a!Vw{41RN zYErkxULpaepen;|TFOlC1}Rs6_{Kx`^)_7;h$Kra{VAhlX+kXU=^_gH;qfQuqwEe^ z+RE|GG#GYtbuK?-HCPAv!X>n4KJ0%eXNm0f9kq>*0S=sdbSFu-!li2}$v-DQ+le#D zS1t?wSAZ5>8Wfc)U}}hN2rxzTz~DzW6i%1kc=<@*_vnX9gg88+=)sFVC~92-@-qmc zu_Hy*iH9R?fIJ8;!M*!|aPRvQO0<@yIHM)MPC{$PsuXs7Zn6-QqFg4Ie#CU9<~}iG zAu1Lf(^FWEsfVzxFTZX6h@FJO(w0y#;e!AeD*LiWP-x5*)_h0|riU${aPOGXX2n~s zHYa@uz^rSFTU=Fs2e?)l1hopTwx&j{7t}JW8Wq&&u2Z=evFTQl?keb3oqc)xi7t;L zI~)&G621v|D=qxX9v9R%Nf0Pm`rZ<(+wNGmuh@mxwmSh8e(g>7+WcFByUTtH*#{wU zykc)puGQ`bHTM4^aVYlQu@%rz9GJXh$KrWw>Th4Nv!N+$wZq|!`8o?{rCgL1C>Nsa zic{Z=9;N`0@s{^F%COC7808+67g5go77o@&16yE- zau&)Il-1iDj;$!=?QoFfJK&HH$~_LpI+PbtmY|$f>~P#f>Ax2ah~PyTkMbgJ566l) z%T(`oIF)E=5^^a(zcUgyFnfLIRW*QTks+k5KMG z*|-rDQHG)PzqTW5-O9RZnLXK{tuwq%7z^I$r%Cjx^H|M%w>4?l3t`5YQFXtrO4S(Y zqldsoZfvhU#ujai5Zsor{Tl;>uFKdZ)Ml+D-+KDE>%B-830cf1Z1tu9I9j}^dEly54#)8t#l4DR z4C;kYO!<`ky{WUhnuTxfB1~D$Ms98=>|D(jZ4UHH{LJA%^psx*{F~|l_0QPB%@F|! zn4`p?O7!ua;Nz~s;#RGKcl6MHc?;Yr?2CEbH3{zs74{(ok?>FqebZvbEo4 z2?^_%u%(Ck4olkdh7kNEdvD9Mz)hI0ZxglT<2w(M%H<2+q%IBSKdapXlpxR>}C`p?8;VmO(y2)6QXd!hUi`d>y@c#it2%EFrU44ZWZSNx_l(MtH50|nR z+g}&L4zbsF^cHfDu=zWB4=Jf|II`df{b&GZVg7m_#k5fn3>3-_fcXQ%few4MkFQza z_&VUjfxlY|rvcmtyy7Tpw=+O!ag6oc85mAkuJ)9mzr0!wtS4FGN5c~g?A#99&M(}B zvG47O{$YljP>{qnlxFo#Fe*x_&Ad=OLMgyo-((InqU{(zZ6QA-H z>whpyQ1xZoQIz!E(eThMK~QC~r$=U}@3X08i-nRrCX_Ei<-_u(!sim(P@bi}&O9oH z^Pl8xIZW_W+PzxEn# zCwx2M*VQJ)@m6kVl@@}xNpOQJe9G|;+<|8i{`+hAgyz6g3BSql&zu2y0FNd77RNv5 zczAu_oe2Mf<6mYg{`Gb;S{($3eaC~ng;L(Kt&G8J5TN(q`0XH4~FBjxH9r!@tNeT}+K8z~_i@+ac0)NEu zQ5>%z{3_x9aC|MdvxG*XnDA2rO@Qwr{HcPQB71Sc2PD`)f@fTzr_%x9%L#wZ z@$MX-+7$R?!e4Mag5#?QHxm9Y#{+pl1%!7a{3XZ36nu>SZxXa5frAU`azpXHz}*NJ z1SLu9I~`DR-OB)8hvTA?Pd&Z_TrwAH?PoLhpKRJjEsRcKcYOVY9x1GzpTF9dwf74U zo{VJ!{rrWW$FfX6|K8t@RjCT=s-Qfxg-TW6hg$eW$#PAyl*k{F>`ooXhCv3fpqW!# zl44&umKFKs7tHx~jwJ%-~4bZ*{o z7sN%$iy+!FhOKYb!95b1a3yzUMa?=1i4)mh%~m&G-1n8aNUq~a=JJ!-y5`M%HYTf7 z*++GOc@Qnok#^Vi?0B;P_Dge5VblaBH(wsRwh!!D59s_r3ctwXEr^9eA(B)jPlY)A zVnG}?-em!Wd_Y$Yvb=RPk7z(U*z{o!+SF&IEleJt>p8qtR|C&(X%b#Wvj;6Z3Kh|; zRjW|p<7k%9D%4|cH0MrjTf^Pn>Yd<%-hdHPm=aTA8Js%@Kb)&e`mjN|h5nHFYzZrn> zbI8j$x~6q@_pOxAlO7a?lU8L9G-^h_5F41QryqeP7mye|-RoatG_}oKaVN>9C30CK zmu!Xj4dG{oa(rGZMQ456HKr553$ZLz@>ygFrn4A;WVugM>EjL94LX#T2Xskj7Mvon zP46}nBKr_UqvVxF5^Y8oIb6z_H)fE+0o?`?eG3r#k(7+A5-BVMDTLM+SDGeQ~&77+}pSE z|H-eG!=A5Gc6Md4?f3fEBZ?#Zw4ng8Q$U78f1q+$8LsB6afh{|ZPi*?t*w*Cn!|`Xj40;2O&LMQraP}zpTlFxu zD-#x7rw0JvuB`)Q!!`7Zf5 z11aXYV2G1|&F@=?#ei(Yt$HZ>KaK(%)9-@;+Dcb*dq>FLQeuqY z3~bhtrG5#NcR*wxKal;_v8hQS#%Py~ElwK|+(sVRXitn}XF$qk?Zc(-kW@?3F}0A>xK!C7Cc!^r^U&BRUT=9KOb zy*`G*{^kI7w3A=gDMXl5JDO3j15yO34}z3Nce0a!(d{vS)$81;0Ez z?iub7q&M}I-kmr$x^pX286*WWYwI11Q~Vtwy`3bTRa=_JrJs@XZIaGbq|T22NoeY69 z#uDQ(&ZvTgF2*n?<2nL@mjq&5BE}+OG`dJv06uHc5ZMpMvYgO&JT8Zj=WB9BLplan zbQe$Ik#YZ^EIvxgDy1W&_NQZgUa7105+peNlBoJZVSM8=U&28rBX zIjeOeJpM`p)D748-f#WaY(riF-Jpu%Rh(9H>2Z^ zjo2(t|LSl^mb=G1;Ld1qINK+s+#)f@?hY)t+F&V0Yu#xuq)Fw5?B%`=uLW+gw($;w z`Gvcj|JinjmI*mVlcAGjkY;z1(htZI<3+2L>^Bf%L$V1L;4tlAKL~v`s!bbD%GM- z%rEOnR-;ZEZ;Nv?PAU;s?}u5*8n2GGt?-o0cdFwp32w2LX=pl_nmd+3V z`N(bH)s!&lC&>yV7SryNVEMslRUM*Kia&nSEkXSQin@bs%Uh{3LR|*LgGqH92CL8d zwHxX+#(X1}%tdNLRK-e-`B|Tp*Nv8PY0_iKd`c}HzwTyKm!qg_RLdnfb?J77>HK$| zPnCa$V$Vboff^rmKWnmx9XvWP>wdI*R+Z86R0_7+3=aKEB+nvguq~$*-R7i873Qb) z#5F%7$j2uz5`8uylsc(xcA}Zia1zs>B-gcA+Vv95+WA5ImB)UP|pv;_-K?ZXP77Vf| z&Y~m_CDWVV{!4R^jSy6?(!ieaFW~iX^M=!n+Ub1^Ws)s2)d}BKyofnFIXv14|G?qg zM8xV`Ht@XJ6<|05q{E;SYu&5yM4h5^P43H`}yb8b2`PW3Fy;e zEo~%{MQf=*=6Tg@Ba-DWDY!&keq63&IsQ=k%w7*!D_MtQugLX;p?LFkY(E>xW~}9R zY*XG)HTvSuGh^@xDY!gV{k!@1YLoeyc3w6r;ioO<&BwJyt7lk(#WO6bV%~lG8;BXB zs>K5o&FPGv`BX3Bqxuq0L#0>nVlBcXFx?KVn~g9)m&+Q%objQ@S%a9Ap^ zh`pSP_#Ob-=;_R|fA`cmrtnSs=BrtUUoDIu?h9H}xj2+rqW#q2?33sa^+Wc3w6A&_ z`y*N>TvN09`e3z{Me4`3uvBx?SZONza%Y2%Kl^O9M?cZj;03mk7xs0KxWn-^h1*=xmv^$lxnB;Fxl^8#!r$+8npnL4s6$f#fjMWP~-=`-LUemtE-N z*X<{arM14nVp|M#tFg`ti&1!C4^no<-^FiZy)mY-zAx>+!S^BLgv0)*nkDx2Y1##K z@mpgZ$c@5FdmuFfV%e;|ZTlR-8jH8QP;Mk&)81h1?=9K9&X1t#2)}sCKj^9?#vadJ z)>CO&J%_Epu_8<&@DnI3^+Ybe4x9I|}4KK?Wq%f;`{? zP+~2J9@ev$1!4_p?0Cd6TK-a=>x?$97Q@lBX|~b|FFj5jGKz6!(xg*ZQSr8Dx9}qQ zZiU0sp_XwMGDh7M%~#pp7(d~|RCYF|rRlQ@C9W{bDSI#IzS;()N&mtNEQgI&PVV5B zF7xU;{F!nZRMn^K(aJz!cXsk`jQW50y*U52aw0kTQE+hd|5Nbb3a7aOpRDE-ByB0I z(9lBtJG){S8PJmYKqul6EN1awvKr@n&J{7|Dw^_z3O2Og7-4N9+u5(9uql!K+^uMWVR0i_=l-3VhK?jUJpzHAwK$7JZAY@%{rye7 z6j4WrB+E_gFQ3B-Es#4Gu!c{7_W=MLQaM_p*dp75Px4Zi+#LYP`7?IpNT>V@m;7lG zmzPme*&@d~?XTf-lT90k#Z+yI{(WV#HTaT-|5<=vbH2D;=O6#c9jFrM$!?dXzy zpy*~LLMA%(M3<}%=|x`5>IUI5f(O-K@lu%g%? zQzqW7WL>hKrM*u%B5ax~fU1rwZ1C0?LD+An)6;3-7j9qz(Kdw_*@vQ?VTSPt&|d%* zb5%$d`!Xbn%StE~shBeri2ZNSif9a$}Pb%S~Xr)9CDOxcqGBf^Lhg`^K&7qHR|J(dY!B$=I3fO-#InB+D1t}+aR`CoT&&3MFVTM;H%BjsF`DkVld=)l8}-CD*P4<5<#21zV`aNP#oYs)UP z;=y6zJMeBUF6UNORjh3i9s^`p_yd<>gLv?q_X+#8d3EPs;BC}hK z_?J^kT1*FkBPmNGPeszhT_XS~iUk^!17J}w5IlVomR+N{nY5MB>`^nCl_1by%BE8+ zU`Pwof6pvj1tX5FzNwfen=jGJ!<`Iy4MWM7F!77JzG5vw;g{Oyf z(#k=K{LifU2=d%21lfVcab7XBaI5oB%th|65sV>$P5(YEfIo4$BGVF7->qTvP*ktU z7f5Q2Tnqudby4i5q}lz7+tTP_3h{%b46?Kx+^R1#))Nuf@Zs#sp$UyYKdD%_pN*)L zB-(hAxhIBB{00D$=wmq*gxX2;BR%<@e6~NZBabVqEN5D*{!6urqjLA=u#%Gi4~}#si5}ikLqBrzk+57nh!W+bH`(D)A;PwJc6(H?kkN}Z939av7=7ZeD(rtfa^B4-@K(#Cs3+8gg;8wE=)lIw z0K_iW#ntqYnizwl*oULD+f`sy6uv?B7adWCya+(<6>%+HnF>3SVB8TFlbq=h2Z3a+ zQp@+)-sEm-2fLlzxyR*2VA1CGP;3~h^OTnyb~s=iRdKXtc^p#h46gdl)KZ8~uE~1L(~ny{Z!Dc07#OR(%KxS@Y1Lp{?iz6UVl4k0D8YjbRas z92;TE9SB1C-!vv!bT_#s@24eZ(@!A5w@!gK2{tKfZ@JD-E`JD0spb^Eo?`e^$LJ4K zPNOaBl zcmAVX zBPoGRZ6Md~#k*)@^8Ze0>7LH*j9Kt)tK&maRo`xoAR-te{Hms${HTyF+B^L)WN+8{9ufl&SK*y`HJmmLklVs zlg?q+Ozg~7PwEpUT-_3biJ{ww55P1nGw~r3y-C-jH}B#r zBc`PnM0^ac?@@$bMzd3s2jIr)`9>RI)*cK&i$NbpL*d?SWech!_rI?YR}uI#2jf(7 zXQ1>c;~(--s<}J;^_lz&Z8?4q+xSKg(|FV=oSqbdO&>yrQeg<;XdvR@e6?E<7Nh@i zUkJ%|CT!bh;=n_nS~!h7Bt@J44~(kp%Z(IGa~a9tM$*a1vp=|zHf(T4WB+voT?S;Y z2Ycosx_&Q(o_MfYZnK*$&j{>Ljwbey3PN*#$BskWdsPn_^c%Pgib*%c&~}YO*vX9c z>MC|OBeJ25grT>Vdh)6GJeY-Lwh%t<#S$|8gyp?hW@e!8jj68>%pYjWF}v8-%x2iR z4`u4wuLlCZ@1hWMtxmsRb${LO4@{U6(ee;ZAGyvgWn%D|Lkv1DkEE4k(}zZ}#3_Lt ztEar~js9JhJo>Ae13?V>o%f@65c_aSH}78~c@LWK9z15(rUVMRBbjC{j`*OTp>8rO7pHwy0;j8MC0?NLptL@Jgu&9u;vsjox_Yea9Oh9mv= zh3%BYCH9i`ENxo%hRui`dSxjhI4Oo|BHFX<)4~Pc9_;67F~Y{Ktl9Jh!np2i{q%O~ zC+y(#=r;8Evi6>_6m9v(FO+BYOpL^vk<4dCZ(&O$8#be7ljmJks*xFzIP0|KN4nC3 zP~4SmozcAA0Z2$tjt9*3R2OHQp>`#Xlf21F*FTudew`8Sy)GONsL#}kriK?`2_I_9 z{Ab39eE=Gc;-Z7-z3?w)X3q2zhPGvEW_A}$5v*`#SM@XYaAufrtSf6bt8LrBNv}t( zLt8d|hU5D1c4Y!}5p4Rbw%Xq&DxR;g_hz*h@+Y!mv-A<+5#UDus+=#LM#~*J|AwM+ znQ)yGr(HFV;|C*H=h}XZlH9e(GAjkF9?19Yl7nWK3hGzy-+lP z?U}8QFrbsN@#-tjF*g;@cEY>S za5Lv^VeEM3Gq>6lm`)qSdAa%*#roYYptq#DHS*Lr*V>-`u_DaDB~Er+rnUVUPgSYz8D6`_GWH-9oa5|I&4pM+Qu;=a^u=i_TIdxh%~NaNy1Gmoa?nE zy^&n+WtuCd?c0=?I)^g#{HDUlP}XdIKjGapmNvh&;J=M!&u`Iu7{$A}QW?TT8Y*v0 z7%kXP_RahbExch15AgrW-+qL{WVg|BLDqARkJ*#?f$k$A$08h+#saf?3f^gKY?jXV zZtCm({R?e5{v)1yC{LLK zx6)yEn-05FKJvLWvW}2JaVjYmDqjQs6myOt^I;*qhNW>?xGy*77W$`{T;}at_-4G9 zVkp&o4z1b~wi9ic4Dgp|c(vhPnKcr`6;2|>AIanYt0TBkN*Gtf+@5qg*z~sv)B&_7 z0dU@vd!At-3tJ0&Ij zs9Pg{!pBX1IxXLfL*uzx%rR59ZTjdC7O_Y#tQf=QF4770HnaB^y=AHoI-PSjFDaIO z42Gq8RJTUvC%Y_-`cM(h4ubIR52zz08j9u=}DXAs}2{~89!_8M+`3EBRN z)UA<8PTT!(=4}FE(?7(N%IloQ527zspBQW_>BtKPS9wQL4yOIeOPZBZc?5OWruPhD zzb_7Qp9qdr-)mAbYrN#GVegD4$LDD+SUh#|c(RJu0u+7@eGafjb_Row(hnaf!sX;X z6GD7y_OyEHuy=~N`RExG=XGFzEr}BfMzP4HtxW@h%8iqgiw|$7NDh)1G$N2Wa5C+#8r%? zJ&k92Ioq;qu;4b5-CY(Wy!AfwSsot!MG_6nQ+eq7;IV(n?*;iHcVpGT&`)^ZZ8u@I z@oAURU?CJRBroMw@3U3QgOWdle;k7wP~hDkUf=319C?$FnyYArML(D0(+FR0(NE;f z6osa|Y{dht#>i28cu=osI&dVM(H4ecL{>xBv)oWL<(==L`#6-X`UfM>Jc}?feBV*X z_vv*ub|YWvMybX#iH%#)%=8avu=N;4EnD|Vc~Fh5_0*isZH*#Z?~pCL9ScF%yF$pb z_3}ob*2p#l1k%u#5dfFtiC(I)K|tA1m8ZOq@P9T!8l%J-PWC;y{kRsWht;xwX}HV& zQf~hw0gC;pPWx)2TO)Up04b;>DBNeSt9p=C0Uw~6~wdy z1^rO{%vqHyH_(01{~7)PMj-U)b-G;q3hN~QOxv-!*bo2GM!xb5`Ht0T9k}=Cw-7ha z#WfWzxFnwiLH^vO!T%kdMc)oY<*hI|qL&6pk%qt!M*|ejkm|pxYMoWQS8zuaMI&C& zr@mV61^FEWqhTJV>cWR(zC??cg}DAJ>MKJbvCOUsk%x%j5@vvPl;LwD-lbeNFG_kXm}1xgI_% z(3@`lS)mdHMc+jF0oXTQ(=Vv4pIW0&|B^$|_l(SQ8R+}&{`5CL_F@k_%lEB6(8zQM z$G9g_cE?8!#|)I!DA%H#@+rPUqb$Si@)62Pl-l~}Hp-SLt5JrbJcJ9c5#`#?9gZm| zlW}d&K^e5e;n;>!`=!HCiSiIiZ%^Pm9gb*}l_*m^RVGz6Dsuq%?ScZzWR!nIl&I~<+75%DR9BN=6NiNmoRP*zvq3m(cH7afjWgkQq4Ls^NdK(|J)ixrrSvJ&M6lyo)T(HWKGD~OZ? zC@WD)xB@>yDWmjh3?j-Pl+v&J$8FzKSG|lq-KncHr%o^n{Hm#@fBiZy)y#WulZFz8 z8J9!VgSsl!cII&0W$OKYY{^$X>bKasuR?`x8`-h1nhR4lvR}~Jk;goC^%{E)ColAr zA3CMFR}XUz3?pBIskACpaV?%7BtF23fE5yJaD(e=VUI@xt)V{2!XTTxiEZ80T<(={2Wd(cRIv@br#H~5TB5oc;=GTT#~y#RmId$WDs0%s#_b7h8jB|Z zml+zLZb;|EkJ%@C#tCyiWy06})Gb-u*S&?r?d;93=lNen<}M-AQUmXq2z4-qClJl; zC}X~4jq=+FN55p<^F!2OEHb}C-9QZ0_ML29eu$8_3q>1tHD9ZF8)^EK=`jK7y^qWb*O+n+Z!R|9ATmRLevuLyss@=zE7+6WV!nW z3v-It#eE^dqayZlUoRo~1naebkg&O!t=>Oq?1NH=V;n__AI;rjWN&mCl14!=M=0M0 zCIQ1;2M25eZ?nMh?ZDRqUr`IExjPEHx{QS!Xf7B}vjGSEgU_9QJsap>K9vC*K$`f` z%me~++iyGYsaD8awLjv!g>FKAEZcc}+@Lvw6_RQbUlJM~f zysb zVVlGzo*5UOh=)b`1z_6f*8wYre9(bJKUZEyI`KgE_ZeRyW+n4DJFdCPIrf>HtIBth z){kXxo(;u7?LE6lC|b5Zs%2x|9Q`mpXL)9vFygXfqSXEmKi;=;N I?qt;YKcdE1xc~qF diff --git a/tests/unit/test_http.c b/tests/unit/test_http.c index 596633a..4e08690 100644 --- a/tests/unit/test_http.c +++ b/tests/unit/test_http.c @@ -179,11 +179,8 @@ void test_parse_keep_alive_override(void) { http_request_t parsed = {0}; http_parse_request(req, strlen(req), &parsed); - /* 解析器先设置 HTTP/1.1 默认 keep-alive=true,然后解析头部时,如果 Connection: close 则设为 false */ - /* 但当前实现是 Connection: keep-alive 才设为 true,否则保持 false */ - /* 实际上 HTTP/1.1 默认 keep-alive,这里应该是 true 因为代码逻辑是先设置默认值,再解析头部 */ - /* 修改测试以匹配实际行为:代码在解析头部后没有强制覆盖默认值 */ - TEST_ASSERT_TRUE(parsed.keep_alive); /* HTTP/1.1 默认保持 */ + /* HTTP/1.1 默认 keep-alive=true,但 Connection: close 应覆盖为 false */ + TEST_ASSERT_FALSE(parsed.keep_alive); http_request_free(&parsed); } diff --git a/tests/unit/test_http_asan b/tests/unit/test_http_asan index 7815e2d4e2f7e0acae05c3627d5dbc567b2115c5..4d7ce2e3c57d6fa833ebc2b5ad5eecd333e9a7ac 100755 GIT binary patch delta 30072 zcmZ`>2Ut``wB8w5DN64}SP(@4X%@f+77%-jQ4#g4Nx=@5tU5LsL=$B#@?f# zM#U1lvG)=*7K|m9m|zm!_n&+3vcP+9zYosLIsYkhrrepi3u_No-+H9_qPl#{wY-o! zwzY5Qluzv&JDk}N?%Hy-?|<)~?q1co{^pg#s+S!oY1uV?$9#(#wqDiFtH`aVm{PD- zt2%?&X6NC3J6`1$SCKwzC+^vWw=X@XqOVmEb9Ys(qzeClX0Egf|7^P*AKCxHc}kiH zacb*1NYyU7P&uSfk?j;A#yD9!l~s{Mi}OwqJY|C5&TZKU(cU@9tJq}ZVr3)k#5(5) zvB()lsz|zum(CGhnY~ne?4`)nz>iW|^ZDx3RG*to;lKrNIi(jP=ONK?9MpFW*?tvIai4gB3QR0Ob+^B5PS!8>o z1s|#0vMN$9aUN3LFjX3Rv$C#1c=<$n_EDK>RfNGJ)hFUhA9$=H2p8*oB6#s9;)YKW z&;LvW`X+hl25UxcRrb(E%=ED|z zMvOHe3n`kcAhI)ThT2w{4PqYh&5cvjckr|NSmHDaW;cjIQ zr^I#GC>g1Fs3N^60s_%0O}D6u^rjdd7$J%StVMocOZKU_7ntN#qO~OLUS&V8Max>4 zc%#I)T9^}o)}pvpf|p^O7SwN*!8XDx2%~k9Xdl#;O%`7UC3)qKRUu_npaJ4#5Hi$L zGjzYQp?V^&HrA5i;?vp~!lq@q3Mf{bsEy@zlIEa_G+sE>K?+Pu^@GX|+KN7q8nlHj zt%|g>D1fv?n>s~Rq&>ysI+19ecW@Hd4HW}}+p^(eeK1zkV2s>{l^u;2Hg(IVeOVRZ zRMD+&1lJ80v+5>!WsX-h(;ii}Fjw5Ii!oRiwyQ`MiF)-SJxvL&B3vTI)`RU4Vr9J~ zuav%;?b6D&*9sPbu~rZ3X-I-su@*sD71S<~7ZSls#)(5ANjzbwunkQT#Ua+BcPN&b zVPaV*hL5%!#Qt8{!7cGNG(wbwT05mxk=z$8!|>$lF2;o=i7{cAVO0RH#d!cqx(i-E z>C5`oqHFz@rnVM6sqDo{tg9c%28bK=5y@w&EcR(-jQftb@LnrwE%U41f<*Zdn!S5YY|NVr|Wc{iCw(D6upuLO4dF$yFp1#N8+~d4O<^ zZtFQgvt0#~wPS4b7v3VFll7OK5_sk}qE)9PajuiKScGcA3UL9|l+M<|&>7VQVqj;q z1=X!o{YJd%j3Fs^H0jdWif1m^G4I2(oP8%g>eH6x?^xOAx-W~`F@4fD#ymuLnoqRD z0-f#vg;Dx)g-*BI1*JXs(IsaeP0rQ7xk{yDrH^xg;)FW2LQG5Zu6~#p7Q|RB^3!~x zR#4rN>KSCl9i<9pT3=JmOeU0`P<_PHG@nl0s9ufg4M@wgveslxE0j==;H=b+P+pZ$ z-87Vb#|Kk(F*aIMpB8Hy^QlhPE_Zg2<3Qn5R8LHr7R+xC7vD{*!-P0Gtsds;i)sD& z>&2q$^dZhihMB-dBQ^HMUJOTd zvfi*3v)1Tz*>iqOH5zl2-^oi_7P+FKySr3u?XhDxv2~q~J8UqQbG#1zVLsBj>(h)qAWgcP>*yShN^8&)sRHYO&vOHH1B1i0pYyTt5asL-;m}3s9VV;?34o4rm1cPL5g^* zxBUj2^HiG;4yw>r6>X-G&78_Mn`t&9Cz_oj{NZbqTzK49axwciB^R^jRLDi|drB_8 zKC0v*=qPd#DkAe+^1n)yeB8cUDIei?m3)LR70X4_I)m@2`8aKg-4f{iU#qdl9#CUn zEZ&J`bu2XKNfUHs37}GiUfHig8;Aj4HEUb|Bb4P+CTIdd(P$bB6Ex`g8I>9uuu5s@ z*%GCp%}UVFIwE;-utT$1YGX?_qvIWa73qup`Psvw<+tgg=GR^9QVx^nU#P1a-4;{6 zZtc<)oc#&pEc;jyh_3XxIQz9XZ*W^Y`MPDT%-cp|yWFpWQvN_**ttDe_YjtyjoD6r z(M5XLUb#iM*+G%rgwwMAEM1(HUQUA)<=Lt-T>dED%9?Du@K}-%cljn-oijVA&0`og zEfMQsy?kyND433&sNG~&9iRjAX*IN^=5@^eqtx-X*u12*%?Nl;o_WM^i@2MY!8xQz6 ziskF86pQ!Q3;&;W_=vKgjYzKKe%3e2poqMt42l(3l|k|QieUQ{Q`9ID4kDvth5xq( z-gV!Omf!YdY`2i#HD?>dm-p{Q3R^tPcjWIR^`od!U|nqkj6CTkGEdYL zF$HbdeKEbDk^MW`yqV`9kxgmuT17cFNkJEkv2Uqz;UiVe7ESj zxxS6RT8rH+rhH$YJr--ePhd+#>GuIXw-!)D%h8uP%5Oxpn;vK_iynxeRY85$C>?r* z`gG%Yn4Cka-IwRk;}6vyKZ*fIQd;JdbF)(ZCBJT4&1w_N)jlS*N2=OFQLxJGqupj$ zi*i^H!AezFZ_WBnJY3Ay51G}h%GI8oh1z3PEnu^7T!WNEPbpFR?Nr8(gIcS*QyD+kMdA7cHdmCbZ^@HR ziKZLs^Wc->(+yGVPqBPM?TjEi2+dI%ek^ZX?USY`tDiuWb_fM|ieEzjJgOX0NJQYifg`wy0Cw^9kPVjwR~s8<&WLjdtvn=)AEBzj|Ecu5IY>f)3ZF zJ{)vHX>`^OrO{bOsnPtSW6G>a#>Nd1VffIjaaL=go2k|O)=^QkKAz=>H=Dz4Mjlmw ziR(nzmiji0)moQzVjyZdwdS==EZJfhRzIs!tF}>Fm7WeKn9^mgKciI!wN=UAtI1eB zu%cSDS?zCtRkhnkpcbI2Iejk-TU|pxHsgxRaX%0)P{rNAc8+o#Gf)}uM~={d=j)Cj zO+GTS6|)jIwmRA$q2m(rRg7U&dR&xk^=C!GbK8D4MO@w1j(0gM0=GxnG(W85zn6XXnL%?JZe`U^@aF4`vcnCF>);(9vQ^@z z9Ss}~(47xl=F_s);E;H~!@#Z!{~sS&w>v;f>Ee_xce#t8ozC`K@W3x$HyevKJHzZJ zR%FG9^qo_!dhJ)V#LFLCh088)`=aR;v|>fmT~X|!7_}<_58chX8abSzD;3iSi9eu> zkUATb5z_xBWrQ@^MB&(cm^2MrLk*^$2K6E+-Ro3<+O1X1+-+AimzU)G~ouQ zp*mNq(p26}S289nWE(YErV72SRdWeS8>R|Srakj}s?cbyI*_1rKdC~alzWvAHDQQ~ z{X(n85O#7oR)KC1tM|2YD5e36bwoK{ezi;4){fhRZEdbt^m(AjoY|5m?4*6IPw*~U zpvvzhe!{A80L!hebo&%#vzmgNycJQ_XLe%In0dq??w)oPU9)P5JNq0R&d_8tc`5jj zys)o?Q}IjQX$KkiZuq0wc&^(I>nZ)p8Z<~WI#@4u>~@HA=A6TpMSYZH?!bcd1&kt< zUn%HgrB2-{?V(e#qZhFU>-f1;Ql8*d8c537s`4ap<6xA_k!_0oYp}0fkIWN(ha&j6 z9n>cFtC)GHv%{}+V`pl_j%`Y+^42LQ0RMH$3833nJhv#( zO~Q)=+!I)?QKH+0ZpA&pip`axd%lUHi+w)WoV=`J%iZfM1ce-r*XGWecry$OX~|e6 zk_DTUNdDbKk=Xy+r9vcU#ld3%{LE?ulE+pnag5ra#PPw#N^z{-pv1BI6SD(~V`t?! zey6)2IPTxv3`13Zro@rBQRyx`Ay0I6*iO$LQ$jvpuOy_+DoO~uAoiae#e>jy$Vc_{ zmE!2Tj^f~bQ^nX*E!;BK(%E)S5Dh%j(e{uya;jF7Bb5VttL;-ZH8BUK{{Sbj-9J|b zI({z#PJ4DcTA8~>Q~$W4`d2vD>^@c*_+A4>R{$abBStC-@LH#I#OG_#5#Hj>X|Id| z4gaDo2HADkLT8>)cytZhY6IE@bzhRw8$a;=D3=bP9)k3J5~TDh4pJv&A3?gVTUBWZ zN$I5-cn!*>2Fx+&W|STxF}>e{xM#WeHLVgby^5stjtbJr<HQLjFr}iukkc886g|D2H~vqC)Sr0raIR-B~X6z@-WqIzrM{s`P5P^e?*B zf%FHGzE-7g%ca%mst(e*B>hvBHuw2KZ33E#dqom|O5!(~xLkVhp(^c2(lS+=A)L;+ zTfbE+1tQ{{d&WO%<#4&4)9(~SX^q9`FBJX^p!4DRa za}vuOcIlegP4qg@m!3e^3yj7CSn=R&F_8c|hTi^#IXU!6Y!t?tx%Rg6>=4bfro4BP&eU zJ!0DxPciyRZ1v&gyaC{~;od96-&dC65Sn*2+vUwSaO9Yi_+M6WjKlt7boFnd{k|a`xfm+}0`WvX3Mmv)D0j zXG;u>MPFVY!P{&SqpsJgXF8S*ev6K2V5QT&c5s~2*Jw0?+6Cf>?(o4uhj4w}ZDRLz zU$;Hl=GZ{!=hc*9Hbne>y)|1Y!f(`#+r3m#EH{w76$W}8eC^<5V(C98R)kV@_`Ddg z!V#98g*Uv~e+WYIB3Ab33xb80re2u zZU*v(Tg2s?!K{aPcQXpt1QEAVSejUL%ac74>uwFVeTyyjR7Ygzh48)Y9ZE;cxH*Fm z#B`S&eFxOCm0FhKgk|j`U%Cwc9Q|h^^|l}Hx_-yZ+cu275jl50;Q@=qi#v(jR*G#U z?(C50{HuSRm0uZ+n%WfS1NEt67lQTo3bKUW4<*hFA%0zeFB}Dy7UD!n zC!2PFVmqF%!+pAoh`#H`4v21d-MrU*Nh4N2uQ5}`>)e+Zp4d|8N*9UDyIvU|5QrD+wntp&T*PyLb zQKE)yKvgUnx(Pl2NpbyNRK{w}$&)`!vOslJc)Ez(BqG1ZN`HY+iWFXthH9v5n-_EugxNH<~J{| zdM12=2CSyKeJPB;dDbplh#67Qd)+5K*uuMi9GH{fCsF_sM5F! z_!(dlzNa|#pk7#0s^L14?8m5O*nhCVY`>m{XA6blp%0rNnmzQ#v9s^PQ2$j?n*9M4 z@ZW<;_NOfnrytY}O{J>lpr2ZXgX$F&x@Zc)!vCS0uzzI5mI?Pq{%ntE{3z7#WTfU} zPOdqo6JU~$0+I2kLD&qcX)dOyWw;2gfFGgZTjz>9k4Cb=qC;st@4a|YNk(R38SIfxelPt5h2;#z< z)ojYw{!=cMY9yGk~TsqBo$1+w{T9WDH26%5`1lQ6r$bHzh9v6PM*lZF=eLKgeXjzk-2JGy_eu#KV^njoeL`^RvuRyJ?tb;L#SsAtJGK zl3TgAA4L0Ct({iRR3d%>wl#kAp!E|V&U_~n^u}Pb^OlaWr?y{&dV^{{{>94|AUzN zCM+zQYMT8yY8mz$RKQQx@Le**g*Q>Y8|SJW`3fgDJgAh$iF-=pa029@siryoRxQJ6#|rpG8h)54`fD)Wf%*NN%-ek-hW%X&uUY2* z?dg3A=NK|bFY$8{?`M^m){R$U|KD}|+ZwbW_zZIpNnnzW-wa_<)-v)_e}suWaSA<8 zzMY09VCk{IW|+Q>kO?NX$L)?;25B4P>0(0J$JWKusi|&we^gf2dXZYm7FKWTTBoR$ zr6LBENVT#~41JprHrJ1udx4%vZnM=gni~y|ru0lAE+XqZORa%-Yu*J13p8(vKG_ z{%u_IzsX?d%;`!Ss+=~5^U19{L38z(PA~oq^>g&qa(61t9H9f41brmp{`-iX7GM1r z8}^A0wM%`{4p7Tzmt6&|Zp4LFy);qwUl4ck5q|G{gD^g6d-t5koMMOB*gc}2c#V)@ z>OA>U^nZs*HdAE0^W)uTitpZq_zwhL8CW&Z1XJcx$q4k~Cga&0AZ*@O5A{*)DjNU~ zwT!TSo@7?C(Uk6r`1gSczj$E_>P7pQG+Rjd{3v-lC~%xx#i7{(IVahb+gf3{9uWh{|>B5QKijXRB(V>oNg zPRk!TYs0R}eikg0ZIHDsSPUDl)Og!5a-IeIh<6wxA6l@M+alyWv!2zoKH`jQ0#{P3OPHDnOb9l4Cr11KV#I`QT6X@2&(ISjj%M-lhW^3jp zy=_=OtK-nF9M2quQy$MidD4dU<~2vkAX~(9QI4`@0S+td)Oen-MQ|eI3R@Nz&{JcU zI(}*n=>sq+q%iR0JbUIXovO3?882&?<9eo+k-2Y%n-za0E))yF%bIbz!p6gzt|fEz znU~qwEa0qyEAA<02X@dQSleKBxNzh=P!=+6P z)`HEI$soMlP&u~-{;;jvaQUJJYw2hYD-OHL)AU5Pv|}CFcDcZgwPVBNH9J-_w6Se@ zuSKAUewgqXB2{)zV=pSrVw1el6sK|0V9#RwF4<^tFC1bH=pvZZwheNkJ?oJ;l&V^f zexjC4prxI+}@aW*LsiIj4wBMV?VC1hvhcqdlRZ(%j99qm6cCt(4Y)Q%x?j}sf;np>fotN$0= zCvgPg5>HS5wAA!lC$+URNh76IT0^ge@taz);cqvj8$rF1<3z#Uy(iW1!hyG z9)`6Jp01YB!65_9(Tyf9qDuk~3Jz4w>4`f5ZMtIDI;8%ck)9^a~Sv3GQwC?LE#c{VRa*T2xB5u&0(yd#XDC&K<2qH z&!$6CaOGjZcA&H`N@}`}mA0VRj_F51QwhgV!TKQ0dNU;)_EH*Mm|K&7aYao&@9u}D za`$3TZ?WzTFgdt}lF7jyz|=dUL$b3g3mQ7dg6VP+pC&IsZ{?wkxW6Q#UNn6{#bf$G zAoM{o)l|$?ac~_1`}E}sbW!!v;3CzT@f_MZhSY(u9w4u~vJi`>oXPZf=8FuI|h&>eD-_!YriNJU>cn0aWUTakHPUK4G|(hMOn9c4t97 z8covaax6JIHP@{k%J{N#3u6gzeJAL2Pa2{is1S<6Nh;7v!SM9J-Y{1mO9e+1KBIya z3O}GAGS0iZ?y*$d+1&?2`{wm<8RNlf+Wl+hB=nQ19?Un|nH;NM&-OsPNP$%my&QNl znFgcDRG1m{Qf~2J-qA^B&Z)kd9{EMMq-U*$kYYxymj8O-L1f=ge&Wd*u(wirV#Bst z-t@$VEk$CB8pT`ml|8&zLvGzyW_w{z_M<%Q1?gwf$(yy|A$?^pZ|FRb-=ON8|1tGJ z;@qQ|KP`c`$Gx58OK;}S4oD{-R>yJeM-XRY6Q4EXn$BVNOxf0lbzqyM@L>(?PV`Z9 zF`cX*|0OT_uuk0nBN^z+>O@EqWha(EuLOF<4#-aqs-cPJvJ-!#J+H%p4Pc@a@362y zPWEM;T&6(@k5z2aF;IWO5hweoOfWEm{M(m#asOV@xh5ON^?l^@nrs@6{ZPKG$;NTl z-g1;5o5cFc`+h8kVX^hcx^MY`+~m&&vr*E;fQ0SpAyb1`w97r^F`z7!y?QDMA0@X1 zuy8#*`h6f@8(1CZNgq(Ndd^MGp5=+0JYHriTNq&SM0dqTjYei0pUNKsSkoHeX3lu| zEPyp}>aEyFoI7`}flTDus3v~urkYqglE#Y?MnAbDkTqkA?+6l zv-)y-E#|_0mq%-{B+v2P)v)M3Yst~sJXYzi0xQKbJ10|uSc4k>DGR@1c&z*`h_z(j z$-6-?yif+zhT*-PRm0!chT*reur>_O!l{wko0GUvF`T9t-l|s(|0=uHf#D9r%OlQ| zi|VkJ4x77>nrY-PC5_TPnAy7ijqko_t-IA3AZ&dSrN1|899FYjXAhh(sFz{dUNz&V zt9XamF_v;cFpG8GO$^1$Ueb8{%tFniZ$~AQZpmideVwR79p(fxxg~%_QkNP!%DlR) zCvVq5ZMIuIH2Vu#uO4gV=?b{o?5#?(&neAr#Z~)b+pG3(4=Hbpb4S(we$~E=31JRy zCltBzhZzgntMX5o{5XWg`abPo3Ozt;Y$+Z!)o2w?m0LnsFb+*uLzutM6ar@Bpqe$~ z1t!aWn)P&U%}r+Vg%68#cn`~%82D43SjvScnde{M03KD6k7Y)}yb+%#tra!padxaU zqn+Bmy`iOm1CgX62=C4|A+MqHxqRcU**3+_(6u& zXWsEX$<+8cnC<3!4O=`|@wRc3s;Y=W=fr}QJqKvKAEV#8^gcOrlI86BtW9(o;zfe+ zM%yZD6AAI^jfhQ#ZP9zs$3dzovO)R(s#N|{AM58~86M6IQS>K>h>@iG4U~OA7ElVZ z=itFZaS_o?)Ql~%kQw33oAr{*KzJVuxhov&ZXFBxIGhEsTGBoOS>7mnM&S6IEN4cr zzO0A56M>`Ml|&g9i8Xnp{4A0+sd@jQ(Rg$YJQ;Pz=3sc?H9r>r?m0?X&J1MUF-qp} zP{Yu%#9T@3N8u?G{OdN#0%oHcU{6xA6gA8$=m^7-nB;-25WJduwI|~ggu{F+eaM&M zIO_$*)r3zqShC*I5e{w@{M z8?Z(WW%w>aayI?(1a^vhARp(;o8Rh2_p$i5As+`R=U2g+RynUlke ziWc%)$SVz52%p_t@6Dop!YmTvkEg>!%klAoxtA24w~*G2 z5!bPgE5sGjTy|{C>Tu^~azbN(8nuuI3DmhFXlyg7k6{fBdtseSJM2m@Ajvk^U!;Ag zZ8RdFAn~Fx$f0dT)!&=S`7x|NU)DrEjbQvL@mC zZX->miI@r$Ewk!9XPcmu%9otoKa!VXSr>1oCV*wnNki{rOcT-JmMT|Yua|5d$3AxN z+mzy+Ge#L5I`uicwu#&v#}ar_Q~4r}b>%-ck*%7r-WkhaD~Ik2@Kw2^Z7hm0Xj&Iz z;C$J;eBf9Cf}n87RU}1b$+I|R=#uYy;6Bcv38p zCRhVA?5G(v&5U|MC_6LC@KL$To@P{ga34QXzJ;TNKh=zih%;tXY+1fp~P>q@nj8&orYxP)36?!B3b`>4f^&jM|)GhJ9~_T_ac{Gt62U>x!`% zW>hq|j~&dYfo4=MGipAe9^=rWb<9s@R8*|eer4=DB-mjy%-y^|RW}<;0Qd0aq*W~h= z8P&;*;#dtI|B4Bx1r|LZqugb%8P=CzyUnoqsB4QgGoyA9N|;d(&8VA=m0Zw5;h2Jj zVvOdmH7c5+A{Ek;Frx_5NyFruF^kP+P7)+UgS<0C#+f0(soIkCzMCA@f+g1&)QFae zbNC|3BIS!D@@xxc9X;v*#c-_jXGklY&xSO>`79OI_V>^MkgHGBaAz7xn|K!6tkx$m zPp7Vrs6eN#JSxzs>o^tY)MZ4$Y%_btfA}U;wm$o!oDt7FUAA1T^u7EXegBJcZ9Hq@ zF!KsrVhzj$Dcu<@U&b>(zW5XAlz^ki4;N%g0&}%aK!ELXduDzez`TZTp-OgQX1m

dD#4lRr6UF~%#PiTTOd=dqGe;QI|QO~6SFX=&7db^%qaX@hg-gaHgeAodpk z;3ZHGlI7~>U&g}TvLW*d`7BD&83snX+==<^vT;pxJ~{hUa&DtP2P$UOXI*du8Q+q5 z@bJr`;Gj=kCsoZ>QR|rx^sg1s7ouSmUz5BvmHv#SHQW3%YRxiA8wN(x3pmoc}BPjNac_~ zEY@)QLJPgxu|M>?y0S)k)>!`44LgRl-C13k*^{}khVtb;)>hu`$(FH3GVMc_!D3|@ zk?6v-UN}6l7+KVtWz>%`G>mN6FxJqxp&=^LFl=z@puyvsL^X~AyHUf2_#M~S5MvlO zcx;oXMzLZW_m!D_*i{xMdw;~zd0Yc|?IV^E7OPol7zKE&VNB|TVNIeVVWeSPRJ5UC zbh(k}$VMln%|Kc1IyiYK9ubQieQa<_Kh{k?cK^rL$;xbtLu>-7OVa#au z!qx(j%fKmk1r=S`V+yliJgTwmH5Iq>F>>KljGqQE^5s<4R5qN(YRlAVY^=O7jkT14 z)6ud0r(>7jxNzQd=I-crJKJb{h@U_3Q-&Wl4_`Gb+&Q21vgA?Gh4y)@t_6>ZDUAJ! zJ*y$Z3RoP*%76m4g-11%jw@L!o0wQ#NO;HAvC)MeuVlk5GrUUQ8z<=TC+$z(8<&HA z_58i@22KolHECYo#*kgOv z(CHFe7>%)@;qfp4YMlTBp!YzRfDXf1s0j3VYZw46#`&-e^sjc%x6|qV#C1R{=xtm$ z^aeeOtBN$x!QG$_%0Dz3i$UA>G8#)j=l3=mGj#SkT@9QK4WPlekWT>ZHOOd80sVcb z(U=L^XN1w14|)N#81xNj3FyL+=rYhYqYwbD!nT3Nf_55>06>R=rh(oET>`rOGc*A7 z9OyOBvd^#yD??%A7#P5*ZPZv801f*b20)YMBLL73zC@pc))hwM5zx<;qVGU+L2Eea zbUQ&KL0y)i>p(+5$AGp0T?G08=vGkw6>tn%_$|&2&N^L}d{3jXE((tdpa`1rJt78O z@qOWyb?gFT7i821=5D`|*RZkuYK^|m@MzEXYSHrBeUbjOQqjN zR!2Yf>3d^_qUO-Wq&62@)#K0QXp;Z&;=OUVs<#DtxG>wd5$3YW-WwmtZJS`uNbCe@ zw+U=F%(HNLa3k1VHi7LU`w{yuOt(K(^mkzML)LQhCRT^dl9x9ze}1^S{A&~QW0ulw zGpa{x$i|zovA9)3ehA8H%86jJ{&F!%Puj^{#GNlMZ^o5QFZm8cUlSAb8>JaCehVBg zlAX4&V7|>mcHY7Qs}*5wxZowf-GYLD3(Oz%l@CF2Z=l}_yGIPN&Q`Dw8D!E{ z7RZkp4 z{Y0K8GDp4y2`IxXU4jnMCE7cF&Rg46;|tMcI-M_A9YM#)sO^Bg!Q|au3AU~rHXpDr zH*2r*-N_%=*Wbe3z8_ruA!v+(zD#2NbC5B;M9n{zFw;>9rF|b~0`!^QoEB&uH9P(Lc&c z>{zja*u4~QI6fk{A<_8%eMor&@l}Fi(RgyM6>oZV5cV< zjovb#khwcpRD-|({-5CQpC)hY!suK(Q@-DYNcToNExklqDWk%ZnXqxsNu{g%dK1HlnwFxM0nJ+&of@%K+ zL<6fGp*3`&Tn`>I%JW4?>AS+0MXZpwGX0lXgF6i&tm*M8eMYa6@kziRi_*vR4`ogN zK-TmRW6!pezwgCc1JCw_-G5^C)uiDPww`H+SUs6~hM}a2a=sT1}w*Q)KZpSwxAqnJWKLaHrw2h}bEoDM%{iqr^V~fPxIT zgriof<~869tPYoPXW(g!#w#FRnw)YDngx`P4EdJibF@fOe*tg4obn5DB-DWKg2k7@ z!A)#S^W|HJ_!`Y$>RG@y%PD8U+X)i~X~Yn3pL`3REF(WD=g?iJ$Y(shxu7KB?m1v? z%C}(2vhzqLF=XroYR`F~U(4O+DbK_(T%e{Zr8{V<%{1BM0&5}DE<&x~0wv@kP$fX| zfN5G9F2a008Fvvj@c)Hj^dgML%H3dq6?X~Yww^BG#9pO9AjNlU-h#mw0Yu%BdKI80a>`W# zT_ey{m{@Cy_8K*U*eTb*-lfG-KZ@c2L9JBOxz@6H_@Whn`pV!bhYILsK_z`lmNiprz<0_F!dG=D>4O% zm$7%q9F@}UP(JQJJ4MqD_!Vx4$hcq8=usw%#G4>@gD3G1W6@d2AkR{zg#jgOfU_)q z1#?SYvASQsM&TL?GJ#5-uTjdRQg131Q)vlGU;jxkVkJ(XxWl?2!Q>|JPNP9W6x~(gFZN*xeG%zOFORn4ht5Z+4zLZ=T$J<%f0$| z>U8JXYE6J=s`7zgu8U50hAsPFg6fX$_`7R1`hfS*kU@~RqGTtVMvwC-zWL+P~4 zTXh)i*#dJ}tj7V>-1BmCf11qAuH61N*z!+jDf?9XYxNO}_SeFAQQAMFf;XLA33_N8 zOaDoQ-%|`{$0 zHrvX9!Uh7*#&7xeDGovJYjHFL$?S%0|ofzT7*b8FP!rD6<$} zGSLRNFS<6&whc0a`XpU-4|r?HrtVN}{8^r{UKq*>x{-#SLFg6;x;C4; zI}V1hj^=A@ak`=%&TOlbkdIA3XGO^8zT9Bpgx!TxP3~RGxk_X;D@10sAA|c{N7)&` z!1t9~U|SLQD{}vAsGJAf@aN??3u@_K=7w6iVHLREtU!%Cw0zcW!7SBN=AFvH2dCF^ zQ#(wiwpKBiLqupXJ+r?KW5Mb=SPPfS1^yTUi>kya z%uUu=?L`tZhRag`W@J_Y&aMcw25_9rQGH%0&&DHDd&XB$o>WnJHo_S^d9JE#C{IQZ zZc3D18A8f6)kRcE$MA~U-7tZA$e9N2!#SVnrIBO<9jN*0KGMN#@C$sMIZxFuoZ#gEK z(*;G%2H@70iyQD^tc`q6BuNf!$j8Ib&4zp=bCk)Acpq%*RyKmO2hyuCYL0SzV;;D@MK>@r@2T zg^>b=0z~}<_+w0Uf4JixW8mA$`~<$bcJ)k1ZPT%~>3dsb0p${iiJ-T(T8NdhdOXU$ z4!z~4E%_as?b@~Ckyyf~w&G1ZGJ~KuwMK8K7XZqrpsO}lo@&M0WW+MNnov!PQ-^e0 zY)k0FmJh-P$(Em zFkSV@@Z)~O6IaaS#M6CjwZPegr!YnX?mFI-@Cm1v_Z3?C)B1OHQ=@BRwDlS(W=~fio zro^xG8B|}A&Yh9y9a?UVr}GPlWtWzWqI8}D=>bi8E}i?JdRVJoOXnp3AJxFc>3j#O zr!{FwI`0bb8BKa5-DZsLk|N{N6Kn>L9@JlVS%a3Q^GHCi+tMhq$SX{*QG&nurB9*q z8ykkyk>@-iQh(r>;9nq-Edusx9a?>44vI+`~@3* z@OOL4#}zKQ4dVaQO9gENXavn9d}z|rC(Z<#q=A+I)GJ7p4%0yWGfb%I8frOE$#qn* zc3-2L1(408)RDSb0o27b!0f8mRWX`Z-5Qgj&ox8&8M+#~>Zu^*4?7SOpM;=uG$Xxh z*oH7P79V_9?^F`^u3eqX*Lh5-uIGLqf}gbG4b$Rf%L8nrZChRwU+AjamN#vqPf#U} zbV9*rNNtQ(E6biJaz}e2w%dd0_Y?@2?Hc&!wu9@STXlL%tEHCM^30TL+H$|HNq||_ z_4xu|kCgx{LZNy-e$h`2nm2e|QU-lbz3wu~b}L|!9H4)+lBL~gD3Z|Hu8DL@=8e7X zfKhFU*FWG{9-{J6AEo?E4oc<$89ShP%__?J5QZVU593x1tX`8%<_)k_W1HG&o;C9T z%qm8yII>s-Y89(gJQ*igoKi8cD`cRFQmM;+BuP`H63L#Bq?uBQWecg&oGKZ*1U87w zB`Bg~W=WNnN~J5?MYvWk{I-;sqrcK8D( z-6HlmdHvYK2+0!mmMVR{Y%pN*Sud*eQ{q|6V#q*$8|sFwY$8bp*bYObh((jv6eYM~ z<^+kq)j(@|SU94yEQFS|l~+@E@?Ar?P3{*qn5@ahk2b!qPh zP0LQeS`PJ`1_zdZ$ei}vH)9-Fwl-QnPKUCstx~aMA41W#x>B)bZ>Um3snlS(q+_R4 z99cB!*eexR_7lMzl!_+{B$%U8@nuU1=A={%Yz@IYYG80#>gr+x6VieEh8_Xa&b2RM zL!MmG0(`1{1snFRuMoVAMS{k3IV{I^;I({@Am4)-jljW{m?O0SviKXntaQ#na%%@( zA6vFN9k?GZGv0OJURI}p?--LTYj)(dJ>J1vC%cBEGX}HYp$+PZ-zCXDCSg(q;amt? zSS8BECSiO9;X<@5=CjuFJcM3kHr6ck4~CG{v0IfO9XfHhPDdfG6GUya$XlLnJ!I4b zU7Z+eokiZFbQ@Bx(TA54o_|8iqCM+<9p=3Q)U8tN>po8Zgs)n#~h?iu8us~%w84o~YE z)tM7>wnF!+1qPlyW9?j+OJQMe?u|boQ?_%~x=-bbncTDRRbO7r*h9IaKM%A@GhoZq z%v;{-52kBj{s8O(J?HAUC9B5UI9IdI(z6HpP>XSZS=bl8Na4j6o_Ba{7v9;0B;gjL zN#e|#F@2zXH;C6Qd@+dkVl2Ecc?kc+i8r*Bn1l{b4ECPTqq2g&Ry6LTkBJL z`-yt}xB6NUdOIHGtgk^ftPOhK4tl$Z`Y_aZsNR>D6Z9TLcqeDQO|jnkTYVj>wpWG6 z^2jZ-XfWt#TKT{;5#ijZp}Pr@#xz2!&1i&_~f(EqX&O7VfbgG z3)`*XdDX18hFWe7+ZKlVHosk)c>?n?y}$6&y6--9vCdIft+3A)UdXY(cG}JdL|rXW zMPLB+^@@&5l#* zlA}BliGNmm^HbH{vv%^+ANdbBjXCW^w7q4$orrz1?6Z^m*E5}g_rka{jI7gk$#i<4 z&k2p6A`3`4S?=D6ZCD%0cA?f#dhJ5ZS*B7gT~67B)849B`DzzW@~ZzvweVOaI{J8hIC09HpK1;vCyUX7A+@sqTNNM!!?z(v8E?K)O{Iv6&h_YlVv6jp0F` zWg5TgVz^f0FOyzB@d&S&WYzu>&CNwkJY1&!gppd|=1{R}hb? zs5Z`NGeDn%8j8to`?v?4Yd_t``_tL=B&heVTCR7hXkBAm8j;a|_Q+QI(Z$Q&se)Eo zOj(+|wk+6>0ntM4-j8&(laE0%s@_3W!x@&0eU1NVL?3%}G<^a!e%0IRWQ|``s^UJ^ zoQ~7@RS!>dG`@CaDdhp2-0`@0b$~D6w~okJ#XJdz^%KRsEnR0gALRXUyD|14lIgie zb)hW|I)7a3Q>f9h;2;{5F3*ERJ-Vu*)ZHt#-WsavRqYy$zgR{c;%nG)dHoQ-8dddH zb~#Qi)mm! z8rVB+gzdobmP~IwE&0!Yjh0bA16K6~!aWUUl~_3NXa0jb-+58m-s0i5p6%6;@T$1g zEuLh-UdilVc?=sM5B|#IZPxZxN7GYjQ^I3xzM@+Jd=ANWsPYdt$XO-4h0O<>RknwG gxrw{TTO~Y*kJ&8wUEFb%$(DC<8TFf-d6x(O4~QAwvH$=8 delta 29770 zcmZu(2Ut``*WMXeY0{(@DHcQ!0Y!=xR1kZM#x5Fr)M#SC2H1nBkxX>#qA{`e0(P)r zSB$Yo(Wrr_i6thO;{NZs_b$8e{rfy{X3lv}nKR|i%w5=h+HUhHyCuQA?OSM3)z+(bk&4`XktqdhwW|9< z?6LRoe%f5+=2w!wOBRpq>$hv7Dc`On?%}Sg6<6XHYUWBR@oy#X>*H{Ri*e4@BEmVr z^AlA)?|Q|ULPVx>xL3*qm0MOx8YzmL!+HLvf>&$9hKP36lDq=CYKDHOXee21sTS^) z@v&y8lC+a}T`gSfcCmJjy-`uGhlq0t_sSWda#Jfw`-z#5W(-rMd6lG}i1RKHp8YhJ zm4u^&vun7x<_ecTR&+UD^mYyB0Taan*Cem}?wajNpqZl7HG-uIZ?`1z%FSAgaEs>| zgT+?2B(Ib%n##?JcGn6U_i(Rx&0tw2=|<7jJzO|>Af8(l^|px>?%_OTqPXCW{2Gl{ z0v!=`J&=h{Rn@Xe(gHEwBV0sy!uaiq#?OmG9_YeR;#ZF(9?)Mj@J!-4UBy(-B+1Z{DqfKgmLVqRuTq@K|UBdpJ^^DNyEez zpKz`lD(?CuiQT@|BG@_O2QGMw0gK#vDUj~m874ENWXCL$`2kNRP;DeOz}g%57k^& zl1>)|kfwCgd{&aq7B>FjUOH{+msOHxims5x4^eevA6E3cM67@`Cq?sHNh-x7l8)2- zR+6q2bptSn2B^}qO49Gec#>*)iY>0_cZWCxX~rncZzbt|!2*%R(VE{%(xaknAbN3> zm>P(Qq>YQ%M-?4h5_e!C-sqr`^o9tm0S8*M^D0U2i;*?Lc?O1ljW%qkcw7VP$0RM% z#}(bY5eYRB%VhC+O-#7);&9C*ubdt#CidrwSX<#$E1buV6zyu!GW&I{B(HeQY*{5} zfOuUC9iFNgdQ#C)u!yS-ryq+^wUL0qsxYq-C`O#GjVAU{rDc_*&4qIi@;_N~@U)_X zM9~{k-EftgT1nbbtcNsbf-23cB>hN~21T%u!n+Pu)H+yE>m;z=Vrw0&8rrPPdsflg z=fWm9!c$v|$|?z`h_1m{PwQHXFN5Q~QpRf`{Zi3Hrg#*LfVE{auaY!d)U9iJfK(E$ z5aa7&O%1UYo9klbFfNHD6&-96EF_#4e=Zt?px3m-lvM)ditLbZ(IwPcoC}HP`6GmF zCE9n_kXQu`zP@}G+c~>B(;*{sYs}YM@CoidA%gBVr}}DRRX;c zMFdI_JS<5p39}Ym!V)|OsxI=LS9E19wuD8n&&1s@bcgo1jeSuO8{@0>q$0VMyN-O};trgchVp;EKEdn~> zVZKrf?u5mDvDgZtTPogk!no{Yy)V9VvK80m>|4D`8{+qa?j9bYzQ-}Fg) z7#k((r}{J)yjZ6@L9v&#UaQj`azW`ZZS;~e&n7R@zq>`H!jh(h;)L>BE2gD-+qo0N zf*55YC)FqN)gsg_seXM8%($auW~S9`)yxG#=?S%6yh!!wxRL5rs6LOhJS%EV*0jb38qDF+#ADeR`jR$VYkr)#@tPA#Xw27_SJJ;jGKM=@zy9Ud`C zteY0Zo{6*5>awHa)wBUTX_@FUeONV*ktP*t^5ete(I(e@_oo{e8!zsseau#hsPrJ- zb-w7AUdJYQKEdZY4VG6TS-3co9_+m5YmH?vkb#4_V&*r#`IsHfO7--XQ=ZRS^ZDA{Nx=uLup$pg&HoIFnbf-X2FW)g%M+7bC=KQH@qW?M7r~Q{Ab3tR5 z(cl_K&xs+ZV36Hh(4^)Vb3RmbC0qMca4>1Rnu#npuo6j&x;do+g+?_yqdIsgHZN-8 zI>p?MV*mEX;?{!TnEp=uT@GQ?E5)f0U0*{NeOPUTm35R6!ywT<$vYDycTw0()6U}X=lFbDbZN50G0vk>= zImfsU{9egN;m=AwqJA#VN7P)id{{qL@{x2_$;XW|$VaI7XCngJ=@u_E?Sok}>}M#fX2Y8h^=gHLT@ghiDqK4|b@j7mUzu1YM>==V{Pr;rLC{ z=&l;{q7nM)A)r!)*3zIiW>jeGoeiRBWp!4pwDrY9rLAS()Ny<$Pu4Ju9U*^q!zAsiSOQ;#~69(m? zZ)&Cdj*PHthp`Z1NZTJ$x?Zv4APmbqZ0Fr4+?-kwT}8o)0j$1AmtM}Uit-#)87_y2 zEwVa`7KJiCZtgv#CTmWu)}=6PTr;-7dimT7pkO+8q!yE1b$EKOqlM9yTGk=+_mcek zV!-lNHa_s4JoB{EE|Hy`v&)nmBbEoJb%xm6*qR=1SF=kXP-$m|3yZNhPlBad0B zxcKRo;-Z}xx2BUryD6%R_yVNPPh46P!2dfcIxkHVqu1VI!$j+K%~&rnYh4ZB?~b6` z&pDZO`zJTl9=z5ZJy@M)1IrTrIbPMqYXYa=)GjFaLA1;9^%hw=UFO{B%?*Yu<#%}} zUZD`H{nA?PxN87Vg7z+>j&q>MsN;IU=<}{$pR6vPlN`3KjC&0$dg-tlUj{(HEU9Ptg1ED)L!7ZVNx4rQhN??^4xTCS9BG6 zKdX9rP47Sjz0XW~`xQM>TS;n9RJAKR)F{&`sHK|JW|XUaLTXP{HEE;iwHbr%@#QnG z3d5#2>tTRkK6MfCo9jEK)3LzVEpM+X-Eut_-SU7}yG&hDwe+&VP&m67IsS%;f(=17 zx4=N>>^`V;&U&?Wc)#enDIonOR(exH796CwmGoaFn3Dbjmk{9}YJ{a*)rPIWrplxy zOlr%^)zV1qovOB1QyUDmB^~2_o8aBHFj40aT`XR0vS+KshfR&yOcA%ak>kp-X3cZB ztTgZC0i}6i7pQr5mKTl9yCU*8)UkPUL22E^{YvYOs`%Jic}dC_Xw{Hih|Qnasx+ESV_2+wG4Fjx)QDvmh~NPh0-)NpW>ggw3xfm4uwyBCPj@+3Z(qm$!)K zd&3wO>b(i9p4hoJkf)}JqP-rdyx#93{@v?_mAl%$o~)}Fxv!z)Xu6Pss~lP@iwnfI zeF1EqxU}yV>pzdvI=(bT%-rE3uIzWS95P*}6A$-R7nTRS970ejU#S}?rkfuaZe^(| ziHsetBL9H5!3+vJY+f8!hRqLKY1lA3u`V~6 zKR!yM#`@Y(rMX)~U|xNkV!GtTv$i5TFEDOts(I(x;MuP&1dB;S>GKIk&X?3iim9B5E2|rgoOxLPWgzZ!TtIyG7ZT`o@ zSxxc*yS+nnFJab%Up1Mt>cB@^=6)b(_wQ>(zMxH^$0=fcE$`^XIr}J{R*%ZJuK4H=8_ssC^NO!TDz93 z9yVyuJ_M!fUNh)f4Lat39Bfy##uk>;BDE0})w*bFbd2huK=be(Q|}O6=9zh@twF1* z(3=|c3PEZ0HiI7CB*q{06swO|r!OZlJ>AU2mfO{2Y-_6|u8~%y`F`lLiqPJgEJKAZ z(5fv7N|)AVR(EQ$9xC*qQteb&;z3y2KA2%Gv>iu?ijC5$FQx+ec|~Y1O=d_&&xx)l znmLZ4w;xz^lv8cOL1ho^zXN;dMPkXk8X{w60)M%mcF{gJ4$v})D-x^^ST)9Du{nWd zSywVVRoOS&A5`|uQ$_rVPL5MQHZ$94zhX9FTLrU!?3QWr<$Ta2 z(C5oX0nGjDT~(s}_JW-?_Zs#_>XH@)1IK5<9hQ;=MZK`Zxod^PgZm_rP!Q~wzsFp4 zf>+5^*g8H(Rjn!J7eu;@S0T4yUAr=vD=rpU5xR55iF>xt- zlomF}nvCm!OPiJJfDgNr)5p`@h}3i{ir!794`wS~o$_@31~!a6c_N&WnGz@l&I)#U zx>E@?*c8W7@$u;Z{@`;Z*K>9&;k@2eej0z>)hwJdJC$&1Zc@V8^Su(zC+Jn&PPBt% zvv5}Jpm1V88){0}?0m~ZIc9+&uL0V0+0?=W!x&gPj-p{r#KW@<_~squ!EEkq7R>bR zN-$HuQ-ZPnP6@^vV*$ai?G=LQwoM5p=o6C{3T9iyVB|)1#tmp@f+3g=W0lmr*`}ms z;I{H;2GTRd*i#L+D$%_DR*5G4TP2#J%@mDO-j)i{*a&vfhyRo!{4O?k3)@Vm>$$aP z*clJkd1CyqYp(tc&R2(y zRRnGm{+HZ&z^6*1&u&&4-EcD+?JYK3@=EWd*?H9lBkU?v(Th_R9$f_gz7@?t&U{IF zU6rmbmsX`-f%HQXq(7)qb*D$V1-n#fF-dQz(&BR6%a~HoO)oh~;vZEp|CV};lyk6% zkm-#irFYTb)hd@3<*L$oB&COv?64RSrNVk_ucb-zE4kV>lwvb*am)@rBH-dhZ2r0dzh4fXqG>eWakX|P#y+MVv zTDmeul~m&lMdJM=rk9-%N0mzh=v)ZtGLk-2r9I1~`EONeDoN?JB6OFROPl?vO8bzM z-U&i_Sd)s}D~>kw@(;ZG8^zTtZt3*m3pKy*K$N~{MF)QP){*`*RT^I|?Q&CRG)YTT>6~)upLBZ!>GvcpRi(|pFBey#%Rq>~Br&}ng6VVR(&xCm zBk6Dht@rQ^z_&cCYC zH?1IjtxCTxm;R_pZ;PUbgf=w(Ff8lENQ#ZU@+~KOMYFC*9A|(J3b%J3N(I; zhU+To7A3M!@mW!j%?*G`?O{z6Uylg5_$^|~N-T3csB3CJ(d$G%ddSQJV><p#&^7 zga;(7t>)o6ag`9xp+u&Sb7X}&Z7*_v!m1ACXvZ3H{Kv+2KX+Y`O0 zTuUU~Zt5_vIXvS*7f-AZvE;TdYbJKw{*=GoF1+v5Q2U@%N_#o!vQo!A22qceZ2q6|0}A@8(eoyEO7!EwV@7z}S6 zofHL7`)IQEaluXnNNx)Ec67^=^Q!Mi2?U&@JBnvtb28sPHepwiR*#;_flAG(d@n_`$qJi=ZJ*ai{%;1ho38?oj=BF|kW1{AyF?e;$p{DV4wgWGUbZA!HhVbp<5!TM_rSwb&| z5+_8&KU|EvfU6G|p=0|Od+>K(i%G>DZT=J(f-_I&=x}l3A|4j|MU4Jh8I-SRJdS&Z zp^EKRu;jey z2%n{QCe69|6I_$C^zRy>JUgEyXX<}N@p&?MrNqMpL`ZU$+c7F<>6Z~v?N9mTD zr=MP-&DDVUmN2TRjhDtZ$o#y@stt;M{@k>1@jtIvOj z87v*T2{leA(|?61dhF&kdkLE32pcO`s_ym?ZjrvdFg*4Q=msg452dH(L!fFlHR^O1 zF+T@mNlW?JGwStM7<@fmDC?MVL|R&ozX_4zIT?9L0n`^il3j< z;fCd+>eB#LU4%Uis~HLrp-P@DHsM1wJco@X=SA0lt2b<&nRp-eOCn9ao~UK``r1tQ zCUN0w=VEdBsSgVjrBD4?g0OiOTC*!eim$3>_%0eg7(CTiy5`G4wXd|xRxQI<-Xc?+ z|3;|3Zh%MmPHvL;YQl7siYbB#bP8CcZ-bYKR4v96KC1^Bf#-|TFRhSX$cJn4e4|{v zedgmg8K#w38<_ciyENUI^7NT`2GPc9JrDy-IE@G{xts;a@Ej&ZRZPj$hib zYNG6yx@||`T`0vg6I+(7#QU?0Eiv?I@O`BTMi>Q56CBh8ogtV#dqsIA9 zNu@Y#L_w*idj#J8l8^Hcmj~5X{9YRB_i30GQ_uoaOryXgd`l7gYqvy0JyS^ksAYt- zCDVj|NnGI1fH!-_QQgG$=)KLv8A-e9Mf#&l#noTE{MG=cbXG4j<<*+<1X1OAlwW%z zq>34&od&5PdOh#QpJs}K&l9lxmp%WKO%g+1B(eyx^+gXB^7YG5{$Z{Nd)a|GiK#DJ z^2>9@@t2}?EMA&YG+m!idX9#oCremnKC#*&B?xfYS1KZ$5Iyn`eu+BxW<68n2fq?a ze+%(D8>}^8=3GmK$V%aXbuFi^?3ALxKbX5tfi0^cqNJXk6E|2~C% zA#VNd$37B&{_bz*S}yb!0k5XD{w>Iq`(M>Ea=(1G$@_ic!ux*kX3uz{=01-&y=ZY= zq~9hUzVdFg5HKb6ZOnADG~G|YqxecFzA9Mr)CN=)^OfcGC1q zW(n~+-0xIv%}1IU<|LRD%}P=H+MRV5f4y$y+<7J3ry}j0kJ$Z(hi}VFb$s0W ziAGSF;(z+jivQu_=Rbl1r`OQ@#+cce1}6FK4xUK(qi(%uVrZ@#sAae=#@@gfYAsFW z-!zf_E)s9v_q_AQzUtDuAU_ePx#(nu{~Ankfz{y8kkHOl)9klb%dr1`hRJ?24eus~ z{yCJb6BqwX=6}u;ZhzHm*cHbh#ne4&;}g?jm#PW68U@D1Zk_n_uOR@ z3nm%6I9=@iE5X47RoYCa&?5|w>c0Y6T@hH;*LnqO(f2ih$uuP+lD|L$r1`xM37X2Jid?|o;MnwHP$dk?dZ^}_Z_r>yD$qTN5y z3}0~i$D8k*CD!~C>URt;0F_ymnraH>D3}z?H{#hpeb^L{@NaBAC*o-xRaGsc35O?} zv_5#NS~n+)@BXdD^S#Bze|@bt5I0M|O8ow>4>s&}|6$r>h&6Exj7hx|JFaE2+rU}On-qtC^%hKcfARm1A ze=|j=4}NTo81uoOA4?aDKZN*Q_SD>eInm_)5}0IZqqzB@W$W=&)0#d;EyJ^q8GfLK zj{$G?jQ#48mO~cqJ)(}$*BAW^-u{k&sZE_=^5vlEKARwx8XEc?^DuUZ8RjUMT89`$ zv9?RQvX-pM(r;KN`&^)~Fy-TX?|4vVGv+I<2`@HL)@Ez~>nZ0jmdKps1;)DahzS$Mg*^cC|F@fUshfzRYk z3)azYSh+BhTn0<08qA5+l*27qyDGPek~SL0^oL z0eaS-Uz#e@^~{gIm?GEdSpaJ%^YzT1jgrNB7V0|c)G^Fl2nn3bQJ zf_Xq(M1Sy8dBz&SOdMS)m<9@?JQzng*@pGv7e19mHV7s|dfT!<$9A~dp)vHFEkQi- zvYjo9^XD3~hrPamnn-Y<*K1 z#(ibD9rN~U3Y;>I|HARq_#9}WDZ9wwb}YjGH#-fp#SHTjOmc8$ggj`+nzKgo9SHw( zm~2!Pf4=r%gj`dVB{&^{isQlZL@bxTRb?I6K-t8ewGDMsg>&*9=U)DRQ;!=xm$5%D zn_!0?{2AZZpwN(;`!;fyJ@e(q$IHw1EXHr9CMsz<%oKG7m=sYjS;K*KujfitZAdw( zW#s7iP?G}J6z&d{>m8U!T+w)SvHkUwI$_9I><=gx>i1e}DHvm>zXwdhWXjhL%oDw8 z>xhgFGD3aLpeY(ORO-F18f2&>0($ovoBihqUs|3W{~G`a8Wia zQ@={(eM7w3#7oZ9&sTXF#B(NIrhbCT!W68=e5|{wwRSST8uLvL)0_IOu3ARF-5O+y z!-u$t<1Kg?97iot&FX<;w{l{OxuUjgl-e@G38noAq_CvpRg??$g-}q&{46u0XUPgM zY^}_8VcyAt>e}%6N-ZOdW@Z{QHI3eC7&WMB3S-S>C5)=FxeN1b?t(j~69LG5i496> zVhT%|Q*4ELZ)hsG9W6G69fOoR4mjxgU|;> z2V-%OibDXm2GB;{?{6f{uB1+$>e6rxL!>&X198BF(3dy?QF8B+T<(gwvqJ81WnSs& zT=6pSpFgucfE6&{YRH%Uvb^+VDxf@j42{*#J} zA)IXE&H}nTo~YAhS#k`8MQ%4y##fu08;W7mW&)m7Q7FVyArytlRG_72Cl$O11g9XyzCgA*p! zX*2-3R(W(q|9rBdXsIgRF`?GVejd!b!CMn2)u=~c#7+*aRXzJj<&kxhn?3OGI?_)% zd9sG=d)e9(o2+i~OHXXF>?Jmsk^FhzWnL_bALuKiy|8y1B&T>m=qrzd@LPSQr8iW* zmdW0%b+wLtsb>?vJezTJIh>W=aguAju`?Pik9)HqryhME&P=?GX?t7eIETwWyjgqJ zN5=cGhW3+sE4rAF)}@nWh7aq=FZGsJeOORJ zt&WT9fr(NJ$FFM0TE48KLok%^B*sGk<9M1(_r=rtQcropmyO_id&#=h*);yNhy1=e z`v#|moISLFm^D zouqRe=ITDjB&pj89+1d6c@`4qwAgCHh@p(lBXGt_$6Ba;aK63TmUqg6qqJqzvS2jw za(mf4nDyX)wyW3(Yk47<*|8{jGnlpXEa+ft$!?`3*OZo=VybaJMYn;+0%dtqjGt() zc5n-<`4v0Z#b=TNQ~s2qNjnwxoF*;877+^?;IWYqf=!Ww>=(l7G#v(rHmZW*6{r$C zzp5OkcQCYg2f-7j%_~fsSGozUAV-njZWNYmlg&d}9d6N14i9BXNbJr~^x8D}8@NnJ z_j;_Y>y|cZ!m=`4VSRR)zvJR9@{4+`nd7Zr;lcQ}ZW_M9dE19|lK1Md!7M^H4`ZHv zt}D7rBMf9>ZY;=gde=d&+ayy|b9<49%7TyoUE=`O14TxwZlOl;3M5?HaO%JUT(f zH)NsQCP9uNdOu#SB)ThJ780EmFP$6VFwuH|3~$70@)q$jCW=M#;qmgbDAvgFRe$n- zG7ovsmF$a``=VGl7WA_XSv@|qg`&&qNarY4%dSQX3P15&hpa9#K8l6m3eq`-)pBfMuKKvCoD<6i@UNT5C$TKh^7m%ghZan($*r5o`f+#wUT-Rg z#IeSX2e8v9AN;+W$sKX5I&arkUW#L#y=|Jnapv4q>fhPNi0E*0wn!h?OEzlE`nrGA zlmeSO4g%%cgPu(}P2~5DSv+svRF*VmUHJAUvT+mEEB$NO%9=ZxOf5g#+9DrgrBy!0 z%YxqJG#1zVCutnojdU)wk_au7ARWiUPN^w+S^Q-2_`Wu z_>Tv`9x=x@qBT)J{0DgzGKcoCi16p!Bx!-%9l%@@3rmJKP(Uf*wp}zar)?%KIEs=p z-y|<;^x_l6j{5xahsWpLvy_M^vHw9WvjFyjZc03yeS&RNLtHV`BM17o%=Ircgu){I z&p#^Yx@RL5w#%dv=(PA3Lv5$?QW8Mk$#;D51XaJrx85!ta{cS3x~MzY#aAr zLSS;C1^(;``m@i|}p*40JwUcnJnH;X*9OH}3a1+8*W77u87HwecVVDZqeANte zKU4+1>rWojWRJEm*QTC4(Ut`?IB-$PaLEqzvuQ|`bPB;RZ5xJRY6nY5!y*lLpkA(X zJNCPN*>M(Y{v-0a=fN(lksi0Fe|BZHH}zxeO&4Q;q64BLqM~90qN4&LBLYSY9W-R<=ZzzyBfxGH6@}k%(E%|5 zpAQ}1II>ZU*u#BgMsIeD#mZiNSQ?LwmACt_^w5Tym8eL-V*|zwnlPd<6{Di!A{zum zH7GaIAVTixk5gSvU)I&NVE{RbjA#%A7lS7bYuungBwYC92J~Y^?Eeu*DPoEL+;hz> zD(-)@qc!b;cm?4a{lD^9^6i_OlENaGORQ0D^c@!?za7MyAzhCKF;CaX%H|tJ#vwSD z+Wtgong`!McT=d#}+fjYY~^quDyvKu#XRPOyf# zF=N>)TNyqDoDoyle;~uBvgUI8RNT9|Ph*WNkP?|R4O_jaXgO*co6Msl<-KXF4UdhH z)u*#K-Y`aX0nN>x&K#ZGA{H17arkM8pZ56q2tWOE4=iLKTk?q5T!(BHY{4UgLG?uM>sTX<{(>9m2hw26w=h1BoRDke6!?*=x~GJRyp2g3y1rmTMc!LSVCV<>i3bdT_Vh9sHiEYHH5e{|KJ+sf{s0XQgq{r?)-)JegRTiO7)FC` z23-ic4|F@|^APBP+JqVmFKqCjj6}f+2dq7qpb?<8F)6!%x`i7IkT(A}U% zL9c;+iuLLh=&zton8X9HRz-l`#U85{Xf(E?7W6h~GB(L&=_ve- zf@f8oZaFsIv7j?szyN69co+a}lmG*uM_R%FXhLfk0Ci~#1E6i&LEm1dYlB02ENBES zBzl2*b%8!;URUUY_ULIa&bOTcih5*p1xWA7F-HO)$DWJ`8 za?1eS{;9!`16mvV>3q;+&|=WXp#Or(F$e%xNS0#}0B8k%k}c7yE}D3f-x z8r&;TjzS&pp)(<7m*o~BYvg$%i)1O0bJAuH$P-zY$QQCLk?V3K2oI_w7wkbBr^-FV zJt&Ka+?KCF0^3JmjG=>ci4IQlcq{uV{3~>sPUj0&2hdY8axY-Xn5=s%z_ygb76Nux zjt2}c$Fqq9%A&o@NB;tXdsOsiOXX`K|48S3AcJHiNP-JyG`65xFIMgYcMc za_WAhx4}npCDE2W7?0rU2wtb~bmXtEqn z$kQ?#gvSq*7jl_*?H7xiE@tcQY9`v9<3kO!N~ z2b$!gA#a}|7wl%<`h_U3lj9FE|8^O8Ul#8Q9b>mz#JG|Y&BaTA{NO8AjaVC4Ef<8k~L(e^vlK2ojqSB<)S`wz8sbd`P}(( z0o6~#5vB9y$&6ewz3USf9waGhmI9 zQwj)0tnu;?STgkt7y)NtZl;Vo3q~0+a=?(WXHhDqQYw`K3ISRx;|gJDqvo!VdGKvh zz4qE5c20a2xrk*35QVNyIsFZ^ed#VQd z=sc8P$oJHT?22eoN^7k?_r>TaKzgo--E~YlRpfSBCw9iDMi$nYt)1y1b9il2ZP(FQ;55Oc7-h8IZBpscAm|{YDLG{SVY&;ueD|@vnW6*&C4C%D5X)P5ps};tc}* zKp=>Cz%(@lgD^sQ@HF}N1xoObz~CSA!u*fG#7vWouYkQCZ0vLo{fHJN8lg9#*AW$E zAUy=&BN=y-;`|ZnIX9_eZo=&&;AHAeis%+heh#=g@T&S9Z!Qvs4;lle1RY4i_Jfw9@}%NM?|^PTzH!*=@*&4DFham@e7|= zOO>+KUcEhax@G?!kn{qL}upUn0hQ}OgSob+LlyE1F0R(5;eg>lVB(kJeWN>qH+e|bf%P`A`ohSHrpgI3f3a0 zy;(<15N)!Rg(FQ@_Ng@ZaChGh%=U1(QKRZccx%J9$VgxAjz8NfknMcAcX|wSYk^T_ z@kQ}O8{DkuS}@zz$PDU}bao!_7S8DZBhlxN@{E0qp{$_smz)ZE2BDiH=m2(Mw~DqX zA8;Fhb{Yy{pyq3Qeww0Pm)Y8pkdKc?XNAb$e0hLHRkm6>SLfa}?JGrw1;0EptK%5l zW$R=o0BgLj*aE#d?jdqta#$_^Ze(dW&VpL{+RU6AR)HH|tyd!tEuVF}FiZ6m`HvM< ze=1kC7^{1rj4_Msg%fpFmN+1ux+(4bxOe^2wlSy2bP*{q!{1 zE~-;)`nCV2!^kDs1H19`L-SXuF?24^^(0av{lli&su(zGnyWBy%xt7vO~g>#p`7)r|3)kRcE#|U%nu9!gG!@5iSBfxt8?J7BIZ-S#2JLHxG@aD{U zW|8X9J5i+rb7SyVs5UC-ISB-^PcQ)d8Ixdf?C6H z-kn{L^TYWhwo85p=filoK@N-Hb0B;k!JAk#)iGH&63)JoJtKKAdnwZ+`DFH;{0oFz zm&tJr_;!3Brg}qgGvv~Sd<2v71CbSScohEvhVDi2(KrkwH{!inw%pJN&TdMtXw*KD zUqtgd+^$rvj^^{&Tv;=Q&u81@wixIaN!M7A5;-H5kLB&2$d|Fa7n+w8hep4Z*>PxB zUwJu>*T<#6zj54?&6948c|9KTNVaN>Ozf0tjd?0s`&VN=hAogooABBQH4B7?+?RWs z@L1mXwtUe9DLEorHRZi|)mw6HQ>b2(cZf`suFZHX8!9^znJDKq>r-&`*7}pEd0E>| zp&F|)8RON3$~LpXxA1WpNM(7rIq!z=PuaKNVb1m>t^xZ_tx#y8v(Ihcg8Q;Kh2I6U z%#HX4N1eh*0Yd?z{tEnY#=1Y;@xB=NHh2-mzpHJV0jW(I);4`Fi`hWA&@9qhTYZI< z(zXT4zK(6>s0981hrG5eIlgcqr?%vcJ;v99d}`HRP+t!yqk^u=6nU{FZ=D{-?5jgH zBUT;KZLlq&4_iG18>D~^m^t{KLoh)svd^VC4^5q*tIwR(dP!Q~xtahpV7AmO{zbg= zNL@o_Lk=vm@25F*ic_uPEB?yId7LhaxvR>>X-JZ13nYZ$&fn+Vj|>T}416+NN0)KUZ9oMtt8=vdvB z2(oUGos(uo(QQfmMvp6Ki|plTyc!a{OUuovzK^oS6E({P`3IQc1%{|bWMYg$(D({4PJRHNaQ}Y4t?o=0^*Y(cO`Q7Y7SGidJWv` z(#KBTO61kks~Y*ORk*GIJ2tzKx)g6pphfmK>AI@^^tV^|1Zt3HfN&cGKgvr5Z3pN$ z%?*5L8q&uOaVell8fZB{TWhJ(5gI5W-H4j5p;iO6Do7R6x5?=95kPj6294Iu3Zzb> zAyaiguqxEN>ZTYC&C?9!;0oO)q@p1{96@JkMtV8)4`E4)gXhX`SiXlWe^py`lA96bl1UyIl@eh6Qm0gvterqjb+wkgamF(GuH%YhG;&!5Q2tMAmF($1nd!Wdj z9EjL{TZev+f`HjBM@-zdXArWj(_31tu*AmZbI7@yMSY+we?*5_-1MNifMwwu630Mn z8SFD3EDr(2B`DbC;1~T!r(|v&S_-S4dfks;*e`}3a;vjHrj;!1k3o%u*7l*YRWgrG zzY0c`sd%!tkfdA1DYXDrNER9^m0N-}##Itfap3)@7nmP(};Gf<_q`#l7j!fp{P$+Z}j5o}aC zSx8pm9>;vB(pITVU<*m9ogH;|Dw{=(=veImT9?6+2-eB*DJrwreUfyxehPE5Sx>5T zb$o})muv|c=xvWb|IsaBlgVpe4+A92*{@XT=VgNt);otKQ?0)e&}J4)76#Z*7wu-l zNHWlN1S+_}B(Et-aQTdrWU#dZES%O^ZibSzl~)sZ@?B1_PzUEC*|{CBX*U5t{x`fj z{~~9A;nf*fJL%vDP0QxMS`PP|2K$!9@=!bOoBjz{wl-Qnj)AhRtx~aMZJ=mtr&O%j zGpbZoDpgq;>DVh3{P`K_I4BiYwu4}fO2w185X?!b__75Ab5<$=Y&pR^s$#5J>Volt zx>tMd8+rgtd)I!54S8}!3-GBj7d9MR-ynD!i+GLcvR|%i&ujV~K)#1E8i7MCF?DJJ zWbqe%S?Q{|$p`qB9a}7`cHn;aQ?bwv+{@}1@EuyTk?lM1+8)2bTSxmS(iw*(#IX_T ziJKDTe4{YQOgII?=8mo9DWkB3nJ@z_i<#U~8X)XQW@Al4e@_Tmko|UTsko>%3(I+Q z6*MUq=%8BEWQ*+8Y1YHWOwa|zP-88!m!#SJCdYT=eolWO>=38T)Wqz~X;qrbbsf2X zx*myPHS9@uwQ(InnLcc_YaHDA&C>YZDjWQ-$mx7&`UR2~T3}uKAqMYHH7GU=%7?8! zY>dx4fPC=m(YhLifHEhgH(ZU2-+*!ro7~*4op@*4M0cHqLu0!pc5!xX@dUSZ)Y%1E zQ^_t$XJOqqkf{=mhj&#w=FF;DF$nD$YwJP<2bGumv=_(U+E^a!&x;u@;T{d(HLRut zU{lr9OWF?P`Iauci%agsf!Hc~&e3s8R)x2zR>gX@o;}rvT1*1c!Zz1u5YM-8xx;I_ z@J=oysc-QGN$hif8-iUpo0D-0YahV` zCPnK2y;pC&15a{8^z~iz?JPPIG&1+z41U0p<2LN;S-e5*+#fdaB~`5Ugjntg-5ZLF zGk@G>a?9L>J9$&)Wqj}8r{((zb&AeO*E{#oE}qM=U0$)55A+Ioq{^w!=;KP=4A?xp zFykIxeIKjrQ&4d6F6J-AcwfiBDyF z?=*g}+_MwO_B_BdyuSNaf#UCIR5}v2tHJg*x#s{Lix=dh1Ki))cmO`4N&l732a(;% z*IbjaF(BntGT|U^<0b!4ZI-G;=b=}{^W}OH52bkV!Qaj*pA=18B=LS~GT$B}r{?k` zoB|7Sxd-l`?&Ko%)@3Sq4I-gWTTEMW`IQXJ;~sb$B^&4Qn>f}vAA-^~S@#eR=UC?Y z9OB1uuJbw!8yy6JXtlvxLqo|FP2}hBj$}7@LOgl1hQ;sKb<%MjsCVnZ`!$>5)0H(BYxt5?G zH1VOu3R_3t?4{2OjsHZlV`wy9-X23FJ7xAUL~>Xbfa(2_t7>Gms-pW*>nfa3-yGuu z=oH%RI3M8Mz(vI!&~VYX{-KCF9+4N0qc>hk=M#v$@&)fI4VEnvPQdAEIUXdk@@-NT zoJPsm+DO%j13HgBH8g&KEQ0Y!yHb@sPiyz*nz-_*XRgM-EWPsiK>le9yuaa#dH5M= zTYyj}%B}^x4c$PjEZ_sY=r2O)L8thw$jbMotFf`AX4+~OFUp&27}=!pC(4nh;p&210peBp zs=7ALn54ZzK01x?@t_Sk!|Qt;xupbxFEFW}y0pp;*`BSLA6z#~CPE`bsq(0&|NB$XBtCAo`T$3z8^D)F3?NqS5;LQ?5ZQbYen z2!DptRFu&rX}H`hAs0^VTuhOa>Y!`Vm+s>KO?`PnuBn*o38(#pUnG_F-3~eO%a6T; zJC%u|zKiw4Qc<6z!oAASa@Wk^!-kd@4=Hz5c;*e6H)8mZ;lomDDpPJ?CXiiL{G*r} zJASePH7$e*H!2ZzJTLW8S#MEJ{3-ng^`Bv#_Lpuy-T!!xgh{{Zxpm4I;vu_9hIr^A zeZoW|ABPn2Fn?I?M57T;lpIjKOR6v3~@8847mt?*G2I6 zfLrk|{33fg(oZ&bgj0Ju!oLP?#lP@tEP#&q2V4XneGxq8BKR5LR{RUUZUJza(pRxI z@e(7{5~GaTh7hniBUf=Ts?9XN|kCXtuLx)@)~Kp{pD~d1XZz ziU>k(ZfRAutHNE%vNi7FN{?HqaaWhRU2{rMY%YbUYi1ECtadx+6uK(FSX@$F4Ys0r zh0an}MPa#XL5WgcSyWig!xG;wf-felUu8Za48O5}>)HJfr!)@aTtUcw6HfDhymS*T>!z|}CL9em zuG1!5HBiNfSDLSAY|2ZxBc zJS`0T>w|e(==lE@%+mtL|7qd|7uwNk74=Whvgp&%Rd;FUmTWS7?z(Kl4t()WxP9HQS==dit;8syf}R6 zy8t+R885Cj2?V z>0t-;wsL$Y;mZim<#;p4&k*h=9C_k@o8#9IJ{>qkhkp_bRtK*2UKTBlfX?Gul-W`-i=yeP1R|nJ) z-v&XUXFlUkuO^aw-k}|HtUGe6W8LXUhh?*4=XrN;C>SIZ#02*9IFRxbpLH2CP^@^a zpX~5vL{QS9ed+GuXw2w>jK1dIfq-5NTQ^6iBX5}jS)+cE_t&CO*dxb_ejGu)h5|8d z7x_cmY#0x-%Mjl zuOJbPYNE%Du$qX&KbWL~?hVRANYPVBKAYsh7A{X5{zE^xh&;7JKSEvJjpX}XD9>8@ z%EjbKyZ$Q4Z^aMZ*J zS5T3!XFDwLo{Ml_gY-d`j&%3&p0gmkos9EEuLa3bv$kLqot{tX{A;PnX)UOP+N*y{ z6*gw&Zu5*0R z6CfdMi*~TIv@LolvaoF+2yAOX_0z*`OGBA{2deTrF{<@LXK)t_x|qd}mT__(n}Njr z#Gz#z<^aF{HAa6NT7Lhb-DtW)b0;P_wEV z`0R;RO2@ZGCDN4CYEO(x1=Zif)aGckCnf}48soTsBU!sa|K@Zcz{ksf-+o~zYe3Na z#_0QMgVy7I5YOAmCqv5*H6{^_F~;A2uRY$3ZF6zUklk`Yvt&=O-kB?#!{&w?zW;%~ znS6?xBjfMC*`Bi=Y=`}a?P0U|Oqy>l7HbVBP3^JeWBU5{Bu7I)T}pd-4)4Fasf$-4 z^%mwktSZoMhp*pL4o$}`&$7pH>bS#ux?62~_S^67;1?!?da%+!AfCqbe3(sqT5I;H zgN}7yM>>2_k2owXj^tKvYig#tI-p+z8ywnhhxRG4XdgJ%wMRO|0WR>B4tkDj0OPqD&)|5c6*bgJ}Yx`-g0wH_&bFBG#nf1apaY zHOcnWqmE0o=XNsfQtk0AB8!KcExwX0mi{x@n^|{0zIK9kJhT3!rw?-p)qF3~(UZ_%GH5HyXj>0#@`WAue?&=?fic6a|nEIOZvc5h+vFwi42Y>~(Y=MgAn@P>9 zP~&JgtSPu{m8M8?tv)Xl@S=|f3 zG-fu1^>^RWfX!4OdgfPXjvNo40q5i4CN!3hhuvUcBdi&P?T?r|RN6#qA)3S+Grk3v z{w~$!%h;EN^fzoiPk)lslegFk>0YQXDS&*&7BDCjH|{)$K1QOeNz|9|&?ux|Vrnw} z050C1CkXInJV9datHCyv*u0#r-e9XHpkWW=u#wV20)p`4Iuen0y^mziG_5 zuct6f*6kzr*NEZycSvG*KBKRIpo!J<5ubaF^|yWxud1G^V&n9e0NS6C?d9Y34$kBx zCWNh`XA#q%LdI*a4#%r$zC-UdruT!2`_DZL9cn%8W1QR&uQs$Idvb$St$z>+2c~g# zaTM;^;_g%j@KX1u_Bi?c+L*ou&EV7e58t2eKMJ23xJQNGpPExqxqb(+Hl{nF znfFH)0N=2y5O34GU-hQ}d@Yu^@JF`xJw}DP^gD=Ud%s6ZZbK_W@3T4D{?PlZ;~jaQ zHMirNIke0tR@M&3sV_Ue&#pNl+d(WBxzF-3@*uJLvS3Eb*W2(soso-D}SN5sT^lQ2NU~u@4 zV-^zq1KDmUX!@ge?>}kQ09LUXSYMukBPG@$-*BOXGab(XPlZX zoxT@9Xq>&pR;mj5Wd_{@;P*GcB>lz4+vIHR1UdS8U%snu>VXtQ|3wf041>gdUXD>~1;;FECD#?#QN&8y4{c#)WH%!Vwmz?d&b@})b@zJj zhVCeP30UnhB!0(auHzc7ZloOTr`@?-O=`p9=D2$IPIYLXT4ML7?NXE0A6KX1-{39Y zbrx;QI(>j;i?(j(nHM75ePLhAarL@&$JOcU)s*OQkXaDziS+s{mTmW+UG&&;MSW-# zEOivE*FJW*wv?5YmaaQLz_ISkz~pay!!&KDs_DP&|+Jf-&4`ntG{g-`EI8AyUh+XI5Xy$XG3n$!S+Gip3&;sdk4|# zWSWa6wnG+u)Yn+0HXKyzuSAvhkzaZ~Lum#|n^P!6u0?VC)+W)DwN83eNirUb)rQx} zJ>HEYaPw^WIo&*I)4`vMwK8vi7(1O80_%~HTuQL_=SyqyR~Y})p!)2f`Xg9(^7bHF zuD*8!g%8EeT%^>YyVb?LAtvUHJJ);L5kI?YzXQjhsf=U4y7+6fmW0Ow`g#!5TeLy@)ImYX zn zcJd~)A8QM`5oDoi2mGK9MvXZm+dcpCcVX)RjGs2dz#fb-a`kopz>xXi{&QM|??-4zLX~9~XIpp(z)pWTcu^nf`m_|y8v@?r>SgxC9{QSpF)c`{ zQ=eZ=)K##4LrN5SO(Cg|7DKJg4jZ1q8G`JWd4O*`!WE7h3P=065)6atfB zrQZS-`p=+D=%@LXt+}yohFyv~#o>*96)6iW9STZQMRRwQsL9b!BTsXwzY7$Iaqi7n z%H-l8S3z>^o5gd$?Zn-faUF;rO%D;ijDDDC^kiD~V}Vu&rSL)jvo!5mu_>QP0X>E>%)1EG<)jDlMj@C+BWeK!thP@FtwkdaT#m}SddK)c+8-Zd~uKy3+ z;e8qRQ^D(^05bdZC)ut4-oymGjbvM+Hz5Wo#@5mgh-^h(w|_-0%4GJj`$7T?d>SP% za3zSxMGJe}l1HBMbcJ;Z(`IaNXz$yxs}@D(#ppM1%VNoZ;V=M(q2#Fk5J1{Rcg2CQM?D&yz za(#qa{}EN;%a{drQiQm{y_t2+^AILx^eP~T#!#&d&#~$)YQq*Jyk}$7`a?+Awf7J> zBpjn3qP}5Xc!X?ejb2g|>V-z+^)3hH_&B-VqSo&qJG>i{5F@b5{oREPi{=gc979y^ zW@^}dsE##?TE`mZzaH}v8dU?Hg+{%i=yQTPr*rGt)n2ul1j@go?&6d$+FWbvB`(s6uvFA*PW z;X0V{I9i~u$Ffz%$Lb%94~J;5DLxt?9O}v+86P>QiN{AZ+0q(aRu~!|vys=o`rY>kl?~f_(fF7I*0A_k1;Nlp$@qx7klA}7vxtwaH-^N=U4rok<6{uF z|2#zXWW)Y_`qi-ilJQ}iV!MOhW7+T?i|!Q|w0(LPP^k3j17e4QJhfps<|2poE?d&Q zNUJC9G@Dp{O@j}QwDsFq;-p%CH8}0s)+}v%miDe)JK+67wR!(p&~C&1*?Y#~p6w_~ z$SE4WCJF*s*ldZ__GD=%`TZ_uiL7ZdQXU_wib8z1S@#}R*HhFj>);kxf8-Bn!om4@!X=S=r*>@nz*gzkHw zyZu?)$xT*wU+i7^v=iO;3&%C#KKKJ^`Y2jI_c zmU|P7fo=XzfpTKd)@7giSIDNsI^TT0`Jaedv3Y?vkb(s-QQ79o8W?&L*)o&aa)g!? zpU@LB7GMOA<8Y34N^fBg&PVlG@S%ShW;>gABkiv5#?Cc1!@t*?_rh0y!ECBWb2ooJ z6dJlgLwl=fePo-Wwebm#~M_9e6;^ z8;s17UMOM@uy3=$VcdAn!g*|b^d-CjUg)+OZ3M;;&hmYIU_~-#p zNQs^mD9O^kYtJy&=W0s&7g)NhN$2qNdAc@FP1$wNFV&Q-_mtQ$v>d+CQ4ZC<+u_|5 zWy3?5`oO)Y9R^>Hf4PwQhnn>5ahrPQZZ-cqb!hwCRnYe^({~yR?{jkps7ary`JbsN zSKkA4ZoE45YxVK<>QKM>c*}_O?x(=CjdDxu(2HspT#hFjHUC33rO$1oW^q4iZDYo7 zr}3dPhn_rq8H>p84`We_-nkh?eCSv|V})DsJgB=-XxEO}llR-S&3JX8E`AW2c;r#g zD_$pE#&2M$j5cmlPvlM*@P`s(v zPf)vBqrXO#Fw+>}N08TDsKn?mTF&$5I6fb#L*G}I>_M#hbMT|I$)--(>VE@CIIRHE zG~bLMNBJ^tqpGK)YP2mHMcira|6qj&5hD7nC?spjV2ytctu7ift`bU)lOQ(6Ny!yl zNz0v5$sf6rMWo~`R+OYII*1HNdgTA;3hcs>P9@7sYzeZYp48wswsmmPsV=Al@!4@Q7qp8 zhs9%)Up|kjNe4JzI}TLL?TsOFP#yXOi^&5#Cf@@K8#(IqFVvxj)Fn@#CUvOJhSm_O zE#=^X9z3Z3NJ`2b+9^C5<|p>RPg;TL+*RwSv4^m-gqeWVq;>i)_{6hjj_U8E5GJ+J|_X*mFD#gZlK}LZdq6D|IoQb5f^l_D?4| zAd@{0N&huL3HP}Z#Q#s`0@2W)QwiqaNODqZ^yw*~4gDT@y>>SlUxylDn&_{e!>+jr z7xtH0UrJ34>9g82*s6^}#oBt!d$i|Kq3Ci;dC zX&%!)p@-lE7AEm*Hz7uU3x0#A9=#6jZayG_C7y!iGTdWMZiqnl;&F$blM~eXo=}%| z82ondlQL36Pp|b5t@~$GkU3thr*|6uy{H)NfLRgladgYc1{@OJB^@X8cR;NiXMlWSfj3hPMqFoPir9^-GVw+8#Mj z4`}XB(1X}P{YR$yc&j?}Q}yw6nIqnJKLaK)=Kg`(h={+ThiJ?VT7wa-rtG0U+? zv(@@8XxlsZheLjti_l(d2gRqSlMPcoR~OGiRR|D&6;X^Y=1Knvnzq<@BtNSSk0MWo zZ3azi@jn70;+dDbd3gg-li{#UM8)&yP8hxr^NarCezW1{Fs+)*X2Ea;*v!FD3keDs zXruNu9QNFVIfie*yajpwz;i#<(HcEBKXe2xKwdxbAvM5L1{+nhc~b*| zo<9h0L--vC>-s)(18xp&fPV;fz_`P2fKU1RJBP35RT!$1OC4&(R_!BtISge7(evIf zaWddgX2_;L_H?5^L>Y0nA-#&yYWX(G@5ZoQJ_#*|jeY`z@AdXPMb-k~=JDKH;T4Ye+MtSgMP1$E(4tonH=?#5O;+T6+P~G>9LdKF zuJ+wxFQf7X7kIg+0z;_W?>$J%=oB(%LBS9j3f7UKS2 zwAX=NLk|>Q3tMuqW|r;Eo2s0wHNyXxj0bGj=G{hKQVR*j!dBT_c;n;$FQ2JHnc#S4bMtj)%qNa8|w6t=hga6 za2w$~; z2ZABEqDE7h5qqS3UoM|RJ0G{^XnS+Cb8OELOMmNldVY9MKh0P7-7zca{V3g-zA0BO z{a=2M1=Dj@6b7(Br3dMsAxIDm{U8sY8NpBb^rwiwF=HbXknR;+_p8^Ss0HHC?J{&v z;JTAY_aB7r?RXk$fA%C!+gjcIz2_rquk`geflBzD*x0n#gnbKCGlN%yJ>(vG8n0?J zRW+Gcbv{QnCfDT;KBkz(U)we&4{n)_Bfp!-k9ECl+8vN1T_+DCP5r0tY1qe;rx%ml_fPC)%$V{ zqm8m;l+gqCU&(~l=s%)>JS}fIbO2u;1Rl0N<^FO{2IGB#k<3r$=Esp0BbgO@)P@n5 z8em!%0uurH^VwWc2j$9$ZEC|AgqFkGVsVT-rZ#-QGIDcb1LWSj8ghp|f*j3SA^T(I z-Lag;^i$cG3}VwygQyMvgz-33ggGA_!45TGV^}*ymDJB5$J4^Ph9%Hvn~|WMs$A;Q zUHB+K=lwRmG4T}Po~ZGSgOBARI=kiK@Ib>M*q%G`OSL|lG&E-1LRD*<;f@NVfMGw6 z+V9J_ip(DZ^U)C>JLEj^_Ezj$oWniE3s!JV?+31~;L7%%$0pN!Xkcf1=o~QLNHU*q zHug5<9@BkLERTKui`FXZbUN8w7kaXJEGm^JdcYMt+5ARRj`kJxeby($aa8{^b<<-o zO|CD}wsL=H+c5IoeQ5mm?oB6ve@X#;4xN^b(Ud##TeV?pNDs2@C7jR%|E4}pC7FPIBUle}*0XMA|xwSRAE9A+|GCWD2 zzL@wMGyVbvqr7s-hOZ!CJwgc?U|&ms^kMexGn0L;$SS}80C zV=0nFQ^vJOWNY8y#RU$p(lX>dFtN#`E0*ZK+c5PWv0$#m5{CDKT|2?XA^KrhV&;e& zJxO%XIorF@f+ICG{)QH8x9+o1`lGO=0sQmO81m11bT`v_B-PgYAcz1sBX6ghT9}#7rVl3Gjnny?T zVa5|=;zq2AVgDTHV&}os)mQ0xkOFomVe@EY-U>ineU2X#A4n3uj69NFj5HI2Tl*zK zW)NibcrJgXAs^Uel0Se|X^s}q7mycQqbtE>j>{U-a0CMI`xQvjV&y2W(n3{U&JBLs zE*<_X@%l2Jx&nnKh3@{)-To{zd;~Vq@Mo@}IRQ*N!30wm7#a$=hLNP8cj>o|NCZN@4^oJno{|#VTYV6`ofB7e9 z-N)~vU=aqO&AXWd=0X5ncV3@C5;`R0{6+V3e7F$d9*&};-oF6n=W^y5Y3b#UR0DC8smN)l*HA4q@|)#))z!#=%$ z*l`X71Ye6)2qhh@C+U@N5k9Mp{t~>H9_b@Sd{2z}9a{R|fH|~2q#wq<074g%&x@p<1hwQh zY(ZKfw-vbFJBSU|KcOWO9<0#6`ZzWT;8i2OdiQ1gj(GKTQr`2SJ`LqMdw)R!yuY=K zLEvNGl~6s{h-tw$f|mh<8F3)OqS#xz8TUhO)xL6kJw^3o^khcJ^PffZRc7muBx%}Fi!?1#nsy1hn%MmX?RDd9?j`K8h1g?0KM#BA<6+Mt zT1z($SxLI+tDFIbJ+z=V)@8g-^SaFV?#!^~;4dy|&tIE=z&{67*mHCn*^|B;y4Z-& z7m|oK<0JruodIm2akhoC{mNjQ0=8**-vxkgV`b9q`q#v}0=(_Jg7F0PBS~%uG}8BM z{a6k3J=+1yqWt@v1Te4#QD7}**IQ}bV|zAu z`q@p>@=I#mGn8qgD~l>CD`qHeWNU_cDqQZNl*F&BE=wt5D1H}oX`!baP|4hqa;K}t z>8dELe|ELN;p@(F3aBgj z6*UxjQdLHXDer_`-HT(O zb)eS21_G<7{BME4AH&HL>O3*gYg0}*Js4md|HsnAHKpmj_ zu}$^@Xj?PvqjGF~CUphH`=J$}Eue3J7GUf8Gf)Mu`eI_B7jzhC3tkr&fbPe3=rW?% znBNVWx+@S!>;`-BRw@s46<)KtL9KZCzmh1n%|8T<#}OOMgo=W5B!fX$?L+^77T{># zbA%rV1oneA;pp<?9nt4OGFWLWe+Cg7)YEK2R&D(hj?c z;_A(bVp%XzvCNCNT-Bp%OcOS53CF8;r3x|gQ{u6A#g4C{B;wyN{2TEi>I7Bd;>W}# z+@{9X#?&dd_8ocMjfn#ZCV70uqpSiS6C@B9;conU0eBMu;v#$*{vAVo*AeE3i_eRT zVf@b_8-o~S!yI^_z~2UL1wKsh-zD%5NxTF65b&xF@F=u*Iq-!-PegHC4B129!YCLM z!v#KF=pP0=33!^orwBX;cph-(0N6QM;Kjgab%4{iJ*n`+UZE$VEiPsR(vJ%Md{AXn zT)Z!0R9wQcNPC=hag;qS$s6s6tBTmyJub->XSKy8fMZl#%-C4=_XgS^vkc>wx}Prc z{Xt+$fr&0>*lA$(CO*6%Rp{(|9k6B+92d9W67g#HxENb3l_jAp5#xP_QTCQmM!&OT zH_EmfWp5f~1t?pFc_6%u`s`kmWnyli!~4pZxcFreXw713r#C91v3p#CO|;AvmypGh zJoa9LoDR7^btHF>Np4(FE(yGcAXk97rmO?G@rIZ^mf}7E^VDvk@;; z_oKk40)K$;Y*zO#QFm^vEiNV%&}%5)g7UvnIc!@Tfrfe`$HrMBT)Y-A=Emm7B_Ifq zB-?bz49@stb;|2Zovf;q7u``iId(c)# zY{Y}6f{1C{K9pp|M&u*I`!y>z6DpTMe=6p19q9}7|Hh=otl!SUWDHz~zoLaX96COO zj&h;H7m;O*oiQ|avg1+_A|XS^hDKL`zX#njaPK$+9aO(B0#nx2Bikb%3`Dyg7J3PQMhJeEbm2Z4X9{inIEnM#Uv9gO5`e zcd^Bd@OHJwR)_b|HZ;OrC%2Q)vttcJ_-UPfC%rNstCcrJ^?J=>WZz_0( zVLebqwuSmHBIv(Su{56R!8`B0K!Cn9<#F$zc@RP7jk-OqAmR_*S-A1p5N#*@v>vgy zbud;k7a9Y_E@I>$cw=^6nwNYUAEPKcz)Qbe+tfc#lqO=XCn zh!RXFqhl+moa#S@@?|LRLFKpzi^AG+DX=jN!8{L|0Bj?$F2WDXB62AvS>Hwe1S2V7 zESuoj4N=H-l1>kFdZ5z-ogV1)K&J;fJ<#caP7ic?pwk2Y4G+k_D=YtwEImfjwTu%* zKJTyx9$-BMzI-B2;1d&e$-h^NPoda_$0l~+n;&+`zgtWDbacsb{6>mO%F}xex@hZ$ zu6ZIsTNQNe7v*@oVi(&hL<*1U?4sv8y83Wp{1jr!yoWeMkGgd2=7c>*QWB5)?82uj z>`D*@N<3a9q}?&XQFtum{DSruRPvn*@b-b7LFYw&m1r2=L$UTtzaJC%Wup9y$kW!^ z|Bp-lJ@;_ksq}!0D^t)sK??+}60}axCP7yUx=K*4<;VY&f45ln(~SjOcI@cUH(Qe? z&-7HdJ=U}vQ*KO29Wva*vNtTeVOUD)u#~i9QSd{xk)NZKZ*a0Z^rC*Wpk$c{7^^70 z9JC{T>gSH|WZ)4>yi(OmC=ld&fv*h1e<5%={-jhs5*GZuZbuVGWPB7b{3nVWPrOu7 zmLNg(%JD4m-!T3@#@~~cIE|N%?5DkP(z8koB=#-^*hc)bC|4@se^2^dfyWCwWt`Hx ziH`KsK05P{m{gVF~fu{>x&Rc&Lc&@nOgSlVtEgAbi}c6j zh+h%7)I;yE2-l0a0y)pqJ8;6=1TOUq5qP}7MYkzA0zWpB>yh^dm%v*Dzx4lnfoBT* zCSiZ0z+Vu0VRK{dDtrEH`$NhV1QdOA1VTuqQ7DMy_BM2j=*eo{T?{At4%bBy&Ff# zs{*%*g@=sucLbg%_!kO2A4)wU(6$SFufXHQ0A=skQTDCGg?<@tw9tx&{jyy`jnWl3 z+1VltWbbuQI6&a36F8@|GgaW3LVvSRbhE(o#Defo0-r>9#AS+HKMGj6Q|hsEMBW#w z1YUJ5$8{mFOyKkl9bFQCQQ*g{3|81XS0pzwoMYyn`viZJILh_3C_FCpT*rY&1>O_= zPX1XbCN}B+D+FFZ3kF>BXw_hW=LtZLi#r6~W@YS%F@6;b+$ttiiB}3dRp=LHDZdtY zrs$V3LeFmn&R%W+D--yO0&lvW1F~Hk87`PiWVhhAW^<6e-$C*yaEhPs`2YSQdU|3a zWpS0m_1rD$xC*#cq|M|y;55(NSX;$Dc}ggo?Vj|-d8CQ z<21p-@jHQ&J#}Kd3>5rD7~mbvCo=_qoACcI!Cx!zs#FfJ_p?Yg2|O=M|6>9#NaXzG zLeKNS<1x?FJuCo0UK0GPe!&45=bHsyC2nXR3H}qJzcNK5ek$-!z)$|Pih0;7aKF&g zl*s}1{u0Tq@B`TsK0jOzobYal2Un+z zVYtYci1Q-2Tj-(R*+iExOSxa*RX1{cw3vv02b}CbCK&1dO4rK*&lLWV_}fBH=19)R z-b*9-4}r786Uei7+Mp*$58^Z2Zx$@%I*O~S7#^==iu)aVmkB+CfRmjQMf{_i*fk8e zRiw>iywKAm<^lHp5e!oV-j>X{=L;d1MP9uat(2sC!a1o(O2bYIRC;~H+~ z*QBCqcUnrN;&c|ybUEFH;=DFL6OOVPw+Em47b(Rh)g@(g1iRYlp5rVkudFDkflzU! zv#h*wW?{Lr*j-s&<1F;dQ;KkuwjAevi&IiN=5W%HUuR);b>Vy`j$l{MS4yi3=ae{$ zJ#*&FhlnYM1L!Vy2rDdeR(jl39(M{3?7C4$nNyr1FXIQ)6%QRKhRy5{b6z!03`N*j4Jn$!w-(lDm3RRbf#{wUOn= zxzom@En(OVL5$fWPb=Fhiuu82D8s4a8beGn7yu3;8|m?MIzHIAoRW%=_CXhpQ3tt8 z%0jX@g)QwL>o$@(!Q_PMEINX06yc0>7=ZfOq3Dw8F_qO9m`dgai+TGDW#Zhkkv9%k z8wk8;q{XpvcB-5oDwn3iD1(cgyf$+D}J+zatDW*)MU7r zOOBd9$vq#snMUrxU}1+qW$Q;UQ4T`DA*vDE)TPw@`z_#-36Wtw$Ou62~mGdqX*Gw30OLgJTms*GkEL1b#A zm=tisLU;2BR&Wa`x=;wd&1b{I=`5R5Ss|i5I5=q%z(^>rsdUnpG3YmE_5^ShyDFTX z8hLX-OAD**m9-c7Cd$;+tTpHZ8{G~SG-Yy?$z!>NHM0?<72=-5TV(Xug~7oigDb!Y z#GGJf-vF8Y$9Za4g(A+K&Y3ke!Y#};AuqTVpXd2}*5Pc%7_($&jjpUHD)$tZ(7+2$Wqd*wZY!EsNYe#Aomvn! z3)8xXw@}o|bo2fn<#LDIA50UB$#I;QwVkb8|=T=eNxm6C$5luA;{Dm*Dw)s>id@$ps=n(1+s7Y}h23&=Jqdk8Hm8T+ilnpsLp z@%#!@!71)StYj{I-&a`?l5wJ}x}?021VpN;+^wWA&!ixkQie4EOVpGUDJkxfdC1bz z65N$+T2CpNB^HyjilI&BxDLLm4w6qqMza!M_Nh zCP6%BNh;s>$y$ile9^WJJ=;k65kg*4@mOt$80&n2&^DD>p1z-=OH%oK%29eJ5qf1K zYnGSqe;gtjmh$qwsic>OIXo<@{0g%44pPd?_l}YdL^)m3e#s~4LX^=vO_`VPH6<+|VO-(% za}>XN5((-PDKFo%N-E#8%KF3G|G1DJB^1i{wvz4^ILVXG!sVX7oq?|-)zt`M;xvwi}Psu1~xc@c@dD;I;fnXH0DNMjBiY0j$394Vp%l8

_Xs#4A^sYAYq5lUqINS$9I5r=JbF9RbMDKF1S%v(gP);dnDA}fiMlldMHCQQ~Z_sy(zoTGr0n=Y#WS_3bmHj-rf;wgT^}l?{m*2_`U!4ozF+kIp61bzUMj5dCqe0jCE^0 z*RA#3>?L?#U!YMx*Nf^3qs0dP*Bi~LQ!&i>b&IRLPIVYKNLjIRd(je)oN)7mnHtT` z>4HWhJ9HZyROsKXq0uNCW&oeT@h>=jneZiq&*b=593NW~xQXytujnrzde zOV@isdX(@Sj<4nTD#E`f-1-XJ2*TG8p3CtyTz?kfIfUCdzKY`oe!wRXzF07;!*Cl! z)rBC91a@vvxI!IX0pW>+FX8xNP83xScm&}Nj^}gzy7htACOn_xQ@Q@5roit{175)K z>=iz02mK--xWMkU2r%y_G2`MaPA4>j^lQRba@@e_yuE-gC;S7BkKy_SgwG|skmD`6 z{yA^p?-0I<;~88(t`=}3;cJA!YCIZngRwM@_9Xa-8~Aa&UjyL5gsO?Ejlz~`h19a#2zIe(s3P)oR!KR#I+OC#H39`j&%tF}Ene>R0ZtrSaL~q*2T-;Ty4JBr8ey zt<#MW5a^uH{EBN9V8JLSf$sj21K9-ZBj5`TOeWyF5$tHEC4muSK3ReJ_gwfVGE4Ct z!LmAE7S6N&i7mt;J)4u*s*zQX*qzuBCTKK9+h4Nn&cWnhKaH~cO|~a7U${`zPv2J* z?VZ@CU1P=7o!QB*=BTJ4;4)nWd3RVLnpcrFN`0WayK&$I0pbugH)(|UMgqH-G$$}T z9ni!pFdE2pE+CVX+UabHVUlQ!XIBiP#dd>>dUx9@igSaRm|_v%YV_%%6hU~v@_HnQ zjRV=f9_>YIP|>3vPXsY9u;`)ONDwCm6xHpe6~)Y+%w`N>9gO`*-#AIg#oy4PhJ9|= zFh|PP6VmcMvh|^~e6LrTWc4EtY|mt?OUm&?J=OMbXW1IW;i1uXNAWImxs0}dcGsfF zp`D7hY}+SW_eeQ!0+gc^gKa-rOAnLAsIu(2{;oRHJd+(6E`#N%x3qLKa5V#Q_Y6_ zbx_Lv2Bfk*RY-Nrt1Vmpu1vM{@l3XrrrJ$XrED{KRmxG7M%#0?XJF$#vaM8(avGwJ z8XU$5m*tVKl$(SV9(O{v>=ROj+lM?O;Grf{nyfvH4KdSTTM<@BBeOO@L7&t^)<9G- zIv0z2^EGpYWGVK51GWhff%z|H`=T86yV4rNNVV;!VPwe(XQdo}a@EmYNKM!;<+#9R zv|TqQT%8(V$etU4sh3h66CzxhF;Zxb+L>&-vAYv$*hYx&k6(!I5b@PRSmdZb9p)Y` zOJx@+_cwCQF(g7TCR9iZr@=ef4v*}f5tLv4@X$CaF`|#-vj#Yo``DhRmj310M|f^@ z=m!snW$9lv`UroO`=u_}Px0uJa9_%~B$9v6jkdp)73kQyXWC`k*(il(_r=7T_hm|< z$%xRyJ)V-a38p`Va?^zAmx@ybLtYUKT1*)G!Ll!JHZt zCq#6HASc|OQolU7ichv21oXf(N-D0A7-llxP4qV1lxYl^k(mzL}XUM%BIodQ3 z$fJ&19@Uf<`5}}K_aZ=9Sg+Vatg%o_9rYt675cYfRR7h#ADKh;1Z(Z_ z)ac{*;WhG(7K+RKGv5qqs+pxLfGXjN3QtQ*g|6y|L-+J;Y?FPDkh(!yZl$!gct!}w z5H;!so0{U3K9&Q|T*#_WX=xlP>clwrq9%oA!zWt(I(Ih_XEwb~qo50p~|qy?;Yk(IMO z8ZXvK)i8I`RvY(F3C1u}ZR$cb*wt~_JR_X6XnD4#I)3z|>2c^b(-HIw{8GE9k5Qrv zicOHM;#Q(N)-=VX@&fm^Mo4U{)oblwaFoM`&vPS$+j!VbU)g`>cZ%e z!O@_$9Cg@orPA`)Yl_v3O59JjUoE9xM!RPlqs_Bp!tp70oZ~P?4C`|ol9UHKf8z5q zk59xJH~cAwt*6j^)dcKRw{C}SK6EJVcicK#cubm5*s)92ho4&xYZO*vt^ zhkRA|GFq(?W}Ns0%pJIK$fG0`~2usTB` zL{E{m8xke-XG4b!Yiz&;m^iTrHO}_#2A!nN7VPwpk%7`v>`zaf$&kFv)Qt5V+PHVp zMy%r+wA^SLmWq80d5$u4x>1y@m%w2-n4_h(#@PrNVfUp>u$z22rS&m_WB0*ypM?tB zIW)-pn=I^=ku0`9 zPn~BdgK&OUrT&ToYU)#vUrPO1=vTF!`LeAC_T8RHG-+G1AHtnn_qlUBeBMs8X?5H!jKUD_=%C-jx znk*%kX3uGYym*Qz$(Ea5$#x&3L;E^AHY~t=a398F*&l|Rk!+ungsYXQaduaYsbT7< z{c?gLEqnkYC27CQmEw5E(+fKC|I{&HdX!+djvsXT{!g9j#8Zjhh^Im7sFMaqazs<3 zoN!}mm+U!V*c`Ot06GHZ`Xjw>8y$5b(1f4YX`4D!NEr42{ba=pm!k%Qt==`wjIbhFXdc7Q;B7_GX{$n(paw%Eye4vvl$~=MPGj% zdO2G$M+*`orcNJCpM zKg{J%&>z|NT{TVAtDzDcz=O+e>&kzPbzzQ^tS zIRMrZroNC}bIXoZ$qtcBcf!;j!W(X35rnvJ()qKx|Kk1zn_#$7UaD%N)tD5DoZFz_CitBb>>}#baeJI^pq*&}d0VJ2 z#uAsT8f1%e4i-ig%Y1@!#sYEPgSzr;w<;5BP>1jLXLa7uo3E764mLLePuIy2UP@D_ z$PWKMV5vS6;7JO%b|n#mGupMkEXJ`*$%dyaEXF!tLCx|+G&MnegIf16`CFa{Xxh<4 zFXV!e)~Q{;9mYnRb2ly4xIO5Eyl$`512v={LP{5Ik{WH7m9KtO;T*uKa!@~bL_+0q z348WVbF-xOr}nM&QtMTHYwti8eP2O=zW0DV_`mzU2bnS*V|NZmc$6jRE%U{VCci=o zd2G`c+cX+HJ7I#TE!*_pa3Bfo8X=GE+Lbo8@!fr5!4GU=<}y*A$Ar-xYwq8r9+ONO zGhGna#mq+R*ywn6W=tKHJbI#bXRbygs_4gK;)Q1H?3fJZHBN3P+jT!#HJXyv7^3{| zAIgNC7{BG2x3nk&4m#$wfx<>8q$f$mEv2)i!Ovjf{~&NWkcvSSn;>=ZD41~r3JeAM=H>19#=O|e{(ES28#k2_{|R1$Wu z1LO4dA7jUXW_M_o%%r$Gw=@6oP5U(fkT`6{W@Q%?q}_AqS|TLnxTal7N34=G%BS4$ zrUizR$Z#2e@~tJf>uHo+E<8rUDFjU0&TQj5`{WTo4_itMJ2pO5Y;R$m#x@a4w=w;M z#-r~qtdg$Yrlv(psMDdMRmLLe;pPcwq^krJ8xyq17YKHcX;n~%khL1rj@3aegaXA> z>AH=TOlWNW4sGQZVs+@v*rOF%Iv^TMMC#)pz1e$O{A$9;7JVKRGz0L^KzoM11DO_+ zsY4%&^i;l7Y4oF@#XVm|fJOf{nVDXLS|#OVsDwbaHh4(?u#_sJW`&14S$$YoxekKKm%ExtLJI4rE2u@g*%s z$|ZO>U_N`26=J^nood%=ewEz`0P3bgk<{V(3teAG)74l|rfr6XnqH~@UQj;e_BZF@ z`dNVtazC=c)&@!WUUyrW!}azp)O0D(n4Idg*}@bRe#bJbu`=NR*iM& z7Pfv$Q!#!EJ2<6HWDOD@FSpzhOijVi6Kbi}3#RZ?>mSqpC~2d?%pWgTE^THZQv=0= zn_2wSWbgdmIBsIq^-Y@d_I>r@n9RLNOrVj_5IQ662K|}#EzvNxw@A!=x@@xRs^HLt&ic08>xe~%IP9Ni=1uk341?B6nS^pXB z#FCC|(Tr9dR^i>Unqd`E-DJFpN%-330z0bGTUujJq}mZYHMmntRs8q7(ttT~TRXbnU#gJY3LHCwhm$dEr8}uSuTj8of+szNDZ1c=uFAa%&v;sRhvt3Y1 zDiq4@QBX{D|G20W(Gqj$o3JLc!rNJ4j}U2g(;uKV;!B1DJXt~>4;+B~FHp8?heHC^ zjOlFptd>Dv$s%Swsm%r_*PH$@9frs7i%_W zNW-3{R~_h$wo-$AFsGw9zXvOu6D8DVkLR=!e@$VLb6bkG6gF^fg19?{<f zo`#*8n^E!yblG)vPQDQ}R)_8tPaZ`6D zqZr$rO`D$}uIfdNPsBA1($2+(ixQ^aH-LBI?#ES_`z&+a7#Ok&?ynur@dVP%$p*LJ|_ z4EZ|JNpC}MQ^uXSrIKw;VoMh^4=$XjUW=Y8T|dEw{H@V;NYQd9=XYgg3tD)ef&zkc zdg8K$0lp6su{a_ROKC^3>-n)}3%kZ`2bAo{!t>>wTNTNYpY~!a>;<1+&va&)N@??6b6nRccyCB89*0~jXvM{!DEfVGiBbW%?zzKX> zCgM9Gj3%@zMpN)NMOF8BeATq9Tc--gc46;YdWh@CQw#)Lt1Q92Ms$I}&A-$g#6#(R zM^!Wsc!q;18l^Q*`U2$v^>Il1C3s(+$xUc0W7jcVPDgVX>Xaq%l|FJ5}K>(Dl5EA!ja62dByuz5yLz74<$k3txj7S1FNp>|!b50UUB#*Cil5kd@ zQ$OT&g3bYQ)&!qr4_%Zy!A>f!RIaRL!Pc-A`DkL%6cB2?g5896=Uud2M_$H#O-j2e z#WedZijA^17r%;Pc5C~(LrEHQZFX%w7nxD4%-UESk;raY1I5HdRx>v&U_HL0csVkk zp{-=BWnFR`i3j4@+qq3!^aX^T`=OAmc6ZNn;$Q8VMY2zGFW--qNMWD|{$VTCmQG+SmQ2BOil5A472qmc1xc zoY#@9Uli;m!5E(Tu>*?+i0wPEpu8CIS_12pml80q1Nrwmg4Aqhb5zsLA{+CYv(NKd zM<=|HO|O<2QNyWxWqLC;c}YE?IeV7Zp{`R$E}WkY7xqap+JBm{WLungCZ5f(C5i9q z*bdt?A%w*)ZZ2-?$lhAqIlKc-%9mr>32o)UD)rHNG(yp>Bl~`FXK`ppc5iXK|1QuE z%#@``KiN*v%^M0iI@ZM=)XW443Ci#s*q7?kgd@~Gi!FZ8JL=HieuvGo$N3FwhiBNw z!i=$Td$5dWHf6i*Nxr@S4L{(n0`KcYvD!--2@-3*q@&oiJsZBHow!rSmM@7F=j+&k zB~6=N8u_Zz*U(lz{s0H=;}z-zUTepE98JB~0!Pe09?3d7nu%E>*)WH`?LBm*B>tfu zF}3OIp3Rq4n^oNI5gvbT#H)S&fwoe(l9B-rXlkZ~Jf=&azbtK1g+p!;)h6gw^UhVo8 z+RDZi?BUW#?@g#IkrqCKODJ6S8J3Wt^_G;g8wrFEhE{7GfR@T|M+xE# z9_jRWr9NwZ0U_<`TgZn)+Dx}wRTsB$Xe-U&g8FbmFCe_nng&8q?^Y!Lb=?0=cvM#s zR5#8`)_6K09Qw}*i~#6N1K_^u#vfrvmNyY6wPv@LM|y7?j2!dPZ6C}+R!r$e-?rgM zK^HN=DVT~kaXR$7aGENuPoZwtt%Md&zQmIh3c>iUrO5R_h?SK?E0 zN#CxY?B-s?xf6){D>Aq18o0T;X_TEyfH?F;QIIZmlNVzw<)0WF^Xc4kzU6+Gkq=Gh zd0hD^v;%0k4*k(6w(x^UuW<0mK6RS1?>?~idjkeonzR&bwIh@aBE{1?d7pDa?f%xA zRYPNTRhUS2!H`%GeCgvJ2FxnKn^Gp5rFS+!F zN2=|VY>nO6mwW5M`x{M(_e+*Y;qXJAQN)E!R0p6Kgy z=jKAh=Qf;l9s175dF3H~O+sJsg&<<(pI`=8xEa3T48w`xIF#U4CzSzbBz|{gQz_1& zp?vSAxPVwXhw@C%Z^62(?j`O|V~bZuioI;?`_*xYqw#`8Dt@F$Fm|$M)bTOp1n;Le zF`YgJff=)HupFc`=l}!6GsUSy_nq#GgC7t&0dK91wj zgy-Az;k?;cRa0Mz;vrO9o18urM)4BYw`4r7nyW80$8)ZR#PvRL;U!iy zMqbgsYO+=>0&3S?As~!GpGN??%pmnc+CHG6Y$z{OUnzt<9v}}=eZ2<@r8eic2ch2P zCI02r{GB+zrJ6s=%`cF;T{n&dNI^}yQ)0K*gqc4BfG=n0O}j&1iiT{{O;HPfB7sX| zP|yd}cimN`FqiIwA&>EGXBg~kz?GaASS#fW?Z%eWihAHSk-yY%ym>S1>kZw7us6~zf& zoJXM@VRIJ*OY*yta?H zzpwfhxSy4Mv$nDC{xDcbszqz1FFU=qo7kQ!l;$w~$Blg>NP&Kn0fvmeEc4@T;)XX= zhPWJJFz19q;m#4Y&p~fg_4(Waz@je(pqbVRu4RNn?J!r1t5!P$wRF2S9{}D5sR4s- zH0iE^ZuyB91ILgby$*VuTk6aFHEIvf%y^rB1?!i;%|8nb^~JLpQfF5z-&Y8Byi72J z6TqI{Omq9fD*LWvABqj+75iB)+Xt)m?5}mcK7*>vTnmd_>*9RB+kC%)x$r}mYmE;^ z@{!B+6lMHcmn*O~zE)q4(4h4C)aA-S8HlnFWhBb4QO2X(gR&Ck1(b*JgkOoW@H3aI zK^=`|%;zpw8C6lLHSF4xUE_&q~BDjHvnX3&=~Kv{@VMj81P z3{fg5*PuN7H4LeZ@)F81-@05$66`j^L6nD4?x7M(p}ikEE_S*4qEt|tQ0CzqfORM% zw}Xe|JK?Y&ZZczjaJeGtqAYQ_vQTcv_o_djr0=K|l<@~#uG;kwk;5)mJe8R82`CGZ zZiOiGkeB;W#$#9atB(#*CZf#4?miP`AP(XED7WLD|H+EAP9QPqSf68!#lU53+_4yO&UoV3X$+979@Bxb{3la~1z%Q^^W*^aV~V&B#5pR#Ci`Dzw&JfvX+5);u^Kdtb0 z1GdyQAF}?(V}iogV2VkQ?CUq)*Gm(O>P?8{HEi|q5OMn&w)1#fG5I5Q`*=*l`$+66 z9*Ry5jd(3$Mj-5WyNz|-o^?sZ3+7cx2EU0K?U%!cPwm0;{(7cbR z+-2*3Ybs1&_kL@kO-2%5Lan8k_8%5Sve%CUu!57Z!d+H+ zvbS)b)j8Et^!ko z{VXD82i5z)laSZ*UczbiY9mq`53rqQf`q5+)S1xexd&fOhapgy39JVh;zKh-i{|@- zMImR$c?xHXY!^bc81WaEho^2Huj**N;f2P9Qq=fqvL|q$J{`mO(9bgoUpJAr)wxAA z){S3c{jLlbvnH|ct_%~~OfIT-HO52Cn!~#NHB8J{!#??Isn}*YYy0<7F(Z@h{d<_` zH-?2P)5X4-Y_$^8R+GzV6W!g-sG-r+Lw8wgIgW`{KY4CEJCi+DV#Iv>oZLAKxoLCu zjLT+Rr)nsJYjTdwQ#h{hLNncsUt+?I0I^LL3%c>SP{vAc%xKhRHrHA1RxQRdB{wj- z@}6S;Jhr+#M)b>KM^I!;V2@E`uVv9Uhc!xa$8ogV@>{GNvMgikZ}t>33fYaD!$i%R zqF%TD6vWMD7JX-_xNa)jd8Y>^Lbw|sZXU~m?oNjv1$SrAD}Y+}dWcz>tpB|jF=;eg zh*ri&?8vozO3khzVB5G7yV|j{`Z#(m)Pa|0gdw2Wv0=r;r5yqNJ>7ex(@<^ p?%Fy0*gb3MZmFNCsM~`s4TaMmEbtLxz0a=aYG=3Y@DWCP{67oJq&ffq delta 13230 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 NF}I(0dkCYQ{ttMzI7k2h