... | ... |
@@ -125,7 +125,7 @@ const struct clam_option __clam_options[] = { |
125 | 125 |
{ NULL, "bytecode-trust-all", 't', TYPE_BOOL, MATCH_BOOL, 0, NULL, 0, OPT_CLAMSCAN, "Trust loaded bytecode (default: only if signed)", ""}, |
126 | 126 |
{ NULL, "info", 'i', TYPE_BOOL, MATCH_BOOL, 0, NULL, 0, OPT_CLAMBC, "Load and print bytecode information without executing", ""}, |
127 | 127 |
{ NULL, "printsrc", 'p', TYPE_BOOL, MATCH_BOOL, 0, NULL, 0, OPT_CLAMBC, "Print source code of bytecode", ""}, |
128 |
- { NULL, "input", 'i', TYPE_STRING, NULL, -1, NULL, 0, OPT_CLAMBC, "Input file to run the bytecode n", ""}, |
|
128 |
+ { NULL, "input", 'r', TYPE_STRING, NULL, -1, NULL, 0, OPT_CLAMBC, "Input file to run the bytecode n", ""}, |
|
129 | 129 |
{ NULL, "trace", 't', TYPE_NUMBER, MATCH_NUMBER, 7, NULL, 0, OPT_CLAMBC, "bytecode trace level",""}, |
130 | 130 |
{ NULL, "no-trace-showsource", 's', TYPE_BOOL, MATCH_BOOL, 0, NULL, 0, OPT_CLAMBC, "Don't show source line during tracing",""}, |
131 | 131 |
|
... | ... |
@@ -29,23 +29,31 @@ |
29 | 29 |
#include <limits.h> |
30 | 30 |
#include <string.h> |
31 | 31 |
#include <check.h> |
32 |
+#include <fcntl.h> |
|
32 | 33 |
#include "../libclamav/clamav.h" |
33 | 34 |
#include "../libclamav/others.h" |
34 | 35 |
#include "../libclamav/bytecode.h" |
35 | 36 |
#include "checks.h" |
36 | 37 |
#include "../libclamav/dconf.h" |
37 | 38 |
#include "../libclamav/bytecode_priv.h" |
39 |
+#include "../libclamav/pe.h" |
|
38 | 40 |
|
39 |
-static void runtest(const char *file, uint64_t expected, int fail, int nojit) |
|
41 |
+static void runtest(const char *file, uint64_t expected, int fail, int nojit, |
|
42 |
+ const char *infile, struct cli_pe_hook_data *pedata, |
|
43 |
+ struct cli_exe_section *sections, const char *expectedvirname) |
|
40 | 44 |
{ |
45 |
+ fmap_t *map = NULL; |
|
41 | 46 |
int rc; |
42 | 47 |
int fd = open_testfile(file); |
43 | 48 |
FILE *f; |
44 | 49 |
struct cli_bc bc; |
50 |
+ cli_ctx cctx; |
|
45 | 51 |
struct cli_bc_ctx *ctx; |
46 | 52 |
struct cli_all_bc bcs; |
47 | 53 |
uint64_t v; |
48 | 54 |
|
55 |
+ memset(&cctx, 0, sizeof(cctx)); |
|
56 |
+ |
|
49 | 57 |
fail_unless(fd >= 0, "retmagic open failed"); |
50 | 58 |
f = fdopen(fd, "r"); |
51 | 59 |
fail_unless(!!f, "retmagic fdopen failed"); |
... | ... |
@@ -78,6 +86,18 @@ static void runtest(const char *file, uint64_t expected, int fail, int nojit) |
78 | 78 |
ctx->bytecode_timeout = 10; |
79 | 79 |
fail_unless(!!ctx, "cli_bytecode_context_alloc failed"); |
80 | 80 |
|
81 |
+ if (infile) { |
|
82 |
+ int fdin = open(infile, O_RDONLY); |
|
83 |
+ fail_unless(fdin >= 0, "failed to open infile"); |
|
84 |
+ map = fmap(fdin, 0, 0); |
|
85 |
+ fail_unless(!!map, "unable to fmap infile"); |
|
86 |
+ ctx->ctx = &cctx; |
|
87 |
+ if (pedata) |
|
88 |
+ ctx->hooks.pedata = pedata; |
|
89 |
+ ctx->sections = sections; |
|
90 |
+ cli_bytecode_context_setfile(ctx, map); |
|
91 |
+ } |
|
92 |
+ |
|
81 | 93 |
cli_bytecode_context_setfuncid(ctx, &bc, 0); |
82 | 94 |
rc = cli_bytecode_run(&bcs, &bc, ctx); |
83 | 95 |
fail_unless_fmt(rc == fail, "cli_bytecode_run failed, expected: %u, have: %u\n", |
... | ... |
@@ -88,7 +108,14 @@ static void runtest(const char *file, uint64_t expected, int fail, int nojit) |
88 | 88 |
fail_unless_fmt(v == expected, "Invalid return value from bytecode run, expected: %llx, have: %llx\n", |
89 | 89 |
expected, v); |
90 | 90 |
} |
91 |
+ if (infile && expectedvirname) { |
|
92 |
+ fail_unless(ctx->virname && |
|
93 |
+ !strcmp(ctx->virname, expectedvirname), |
|
94 |
+ "Invalid virname, expected: %s\n", expectedvirname); |
|
95 |
+ } |
|
91 | 96 |
cli_bytecode_context_destroy(ctx); |
97 |
+ if (map) |
|
98 |
+ funmap(map); |
|
92 | 99 |
cli_bytecode_destroy(&bc); |
93 | 100 |
cli_bytecode_done(&bcs); |
94 | 101 |
} |
... | ... |
@@ -96,32 +123,32 @@ static void runtest(const char *file, uint64_t expected, int fail, int nojit) |
96 | 96 |
START_TEST (test_retmagic) |
97 | 97 |
{ |
98 | 98 |
cl_init(CL_INIT_DEFAULT); |
99 |
- runtest("input/retmagic.cbc", 0x1234f00d, CL_SUCCESS, 0); |
|
100 |
- runtest("input/retmagic.cbc", 0x1234f00d, CL_SUCCESS, 1); |
|
99 |
+ runtest("input/retmagic.cbc", 0x1234f00d, CL_SUCCESS, 0, NULL, NULL, NULL, NULL); |
|
100 |
+ runtest("input/retmagic.cbc", 0x1234f00d, CL_SUCCESS, 1, NULL, NULL, NULL, NULL); |
|
101 | 101 |
} |
102 | 102 |
END_TEST |
103 | 103 |
|
104 | 104 |
START_TEST (test_arith) |
105 | 105 |
{ |
106 | 106 |
cl_init(CL_INIT_DEFAULT); |
107 |
- runtest("input/arith.cbc", 0xd5555555, CL_SUCCESS, 0); |
|
108 |
- runtest("input/arith.cbc", 0xd5555555, CL_SUCCESS, 1); |
|
107 |
+ runtest("input/arith.cbc", 0xd5555555, CL_SUCCESS, 0, NULL, NULL, NULL, NULL); |
|
108 |
+ runtest("input/arith.cbc", 0xd5555555, CL_SUCCESS, 1, NULL, NULL, NULL, NULL); |
|
109 | 109 |
} |
110 | 110 |
END_TEST |
111 | 111 |
|
112 | 112 |
START_TEST (test_apicalls) |
113 | 113 |
{ |
114 | 114 |
cl_init(CL_INIT_DEFAULT); |
115 |
- runtest("input/apicalls.cbc", 0xf00d, CL_SUCCESS, 0); |
|
116 |
- runtest("input/apicalls.cbc", 0xf00d, CL_SUCCESS, 1); |
|
115 |
+ runtest("input/apicalls.cbc", 0xf00d, CL_SUCCESS, 0, NULL, NULL, NULL, NULL); |
|
116 |
+ runtest("input/apicalls.cbc", 0xf00d, CL_SUCCESS, 1, NULL, NULL, NULL, NULL); |
|
117 | 117 |
} |
118 | 118 |
END_TEST |
119 | 119 |
|
120 | 120 |
START_TEST (test_apicalls2) |
121 | 121 |
{ |
122 | 122 |
cl_init(CL_INIT_DEFAULT); |
123 |
- runtest("input/apicalls2.cbc", 0xf00d, CL_SUCCESS, 0); |
|
124 |
- runtest("input/apicalls2.cbc", 0xf00d, CL_SUCCESS, 1); |
|
123 |
+ runtest("input/apicalls2.cbc", 0xf00d, CL_SUCCESS, 0, NULL, NULL, NULL, NULL); |
|
124 |
+ runtest("input/apicalls2.cbc", 0xf00d, CL_SUCCESS, 1, NULL, NULL, NULL, NULL); |
|
125 | 125 |
} |
126 | 126 |
END_TEST |
127 | 127 |
|
... | ... |
@@ -129,24 +156,49 @@ START_TEST (test_div0) |
129 | 129 |
{ |
130 | 130 |
cl_init(CL_INIT_DEFAULT); |
131 | 131 |
/* must not crash on div#0 but catch it */ |
132 |
- runtest("input/div0.cbc", 0, CL_EBYTECODE, 0); |
|
133 |
- runtest("input/div0.cbc", 0, CL_EBYTECODE, 1); |
|
132 |
+ runtest("input/div0.cbc", 0, CL_EBYTECODE, 0, NULL, NULL, NULL, NULL); |
|
133 |
+ runtest("input/div0.cbc", 0, CL_EBYTECODE, 1, NULL, NULL, NULL, NULL); |
|
134 | 134 |
} |
135 | 135 |
END_TEST |
136 | 136 |
|
137 | 137 |
START_TEST (test_lsig) |
138 | 138 |
{ |
139 | 139 |
cl_init(CL_INIT_DEFAULT); |
140 |
- runtest("input/lsig.cbc", 0, 0, 0); |
|
141 |
- runtest("input/lsig.cbc", 0, 0, 1); |
|
140 |
+ runtest("input/lsig.cbc", 0, 0, 0, NULL, NULL, NULL, NULL); |
|
141 |
+ runtest("input/lsig.cbc", 0, 0, 1, NULL, NULL, NULL, NULL); |
|
142 | 142 |
} |
143 | 143 |
END_TEST |
144 | 144 |
|
145 | 145 |
START_TEST (test_inf) |
146 | 146 |
{ |
147 | 147 |
cl_init(CL_INIT_DEFAULT); |
148 |
- runtest("input/inf.cbc", 0, CL_ETIMEOUT, 0); |
|
149 |
- runtest("input/inf.cbc", 0, CL_ETIMEOUT, 1); |
|
148 |
+ runtest("input/inf.cbc", 0, CL_ETIMEOUT, 0, NULL, NULL, NULL, NULL); |
|
149 |
+ runtest("input/inf.cbc", 0, CL_ETIMEOUT, 1, NULL, NULL, NULL, NULL); |
|
150 |
+} |
|
151 |
+END_TEST |
|
152 |
+ |
|
153 |
+START_TEST (test_matchwithread) |
|
154 |
+{ |
|
155 |
+ struct cli_exe_section sect; |
|
156 |
+ struct cli_pe_hook_data pedata; |
|
157 |
+ cl_init(CL_INIT_DEFAULT); |
|
158 |
+ memset(&pedata, 0, sizeof(pedata)); |
|
159 |
+ pedata.ep = 64; |
|
160 |
+ pedata.opt32.ImageBase = 0x400000; |
|
161 |
+ pedata.hdr_size = 0x400; |
|
162 |
+ pedata.nsections = 1; |
|
163 |
+ sect.rva = 4096; |
|
164 |
+ sect.vsz = 4096; |
|
165 |
+ sect.raw = 0; |
|
166 |
+ sect.rsz = 512; |
|
167 |
+ sect.urva = 4096; |
|
168 |
+ sect.uvsz = 4096; |
|
169 |
+ sect.uraw = 1; |
|
170 |
+ sect.ursz = 512; |
|
171 |
+ runtest("input/matchwithread.cbc", 0, 0, 0, "../test/clam.exe", &pedata, |
|
172 |
+ §, "ClamAV-Test-File-detected-via-bytecode"); |
|
173 |
+ runtest("input/matchwithread.cbc", 0, 0, 1, "../test/clam.exe", &pedata, |
|
174 |
+ §, "ClamAV-Test-File-detected-via-bytecode"); |
|
150 | 175 |
} |
151 | 176 |
END_TEST |
152 | 177 |
|
... | ... |
@@ -163,5 +215,6 @@ Suite *test_bytecode_suite(void) |
163 | 163 |
tcase_add_test(tc_cli_arith, test_div0); |
164 | 164 |
tcase_add_test(tc_cli_arith, test_lsig); |
165 | 165 |
tcase_add_test(tc_cli_arith, test_inf); |
166 |
+ tcase_add_test(tc_cli_arith, test_matchwithread); |
|
166 | 167 |
return s; |
167 | 168 |
} |
168 | 169 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,49 @@ |
0 |
+ClamBCafhheb`ajkd|afefdfggifnf```ca`a```|alcflfafmfbfcfmb`cnb`ccc``becabp`clamcoincidencejb:1443 |
|
1 |
+BC.foomatchwithread.{ClamAV-Test-File-detected-via-bytecode};Target:1;(2&1&0);0:4d5a50000200000004000f00ffff0000;EOF-544:4d5a50000200000004000f00ffff0000;S0+0:4d5a50000200000004000f00ffff0000 |
|
2 |
+Tedebdgebcgebbgebageb`gebofebheebnfebmfeblfebffebefebdfebcfebieebbfeb`febadebcddaeahdakahaaaaaaaa`aabb`bb`baacb`bbadb`baacb`bb`bb`baadb`bbadbadb`bcafahbafahbafahbafcaab`bdb`db`bdbgaahdbccahdbfaahcakb`bb`bb`abgfbhfbifbjfb`bb`bb`bb`bcahb`bb`ab`ab`bb`bb`bb`ab`acboab`aahahb`bb`bb`bb`bb`bb`bb`bb`bb`bb`ab`ab`ab`ab`ab`ab`bb`bb`bb`bb`ab`ab`bb`bb`bb`bb`bb`bbjfcbnab`aahahb`bb`bb`bb`bb`bb`db`bb`bb`ab`ab`ab`ab`ab`ab`bb`bb`bb`bb`ab`ab`db`db`db`db`bb`bbjfdb`abkfcabb`bb`bdbeaahdbnbahdbkaahdbfbahdbibahdbcbahdaabaddbgbahdbdaah |
|
3 |
+Eaoafagble|baadfefbfeggfoe`gbgifnfdgoeegifnfdg``aoble|ak`gefoebgafggafdfdfbg``afbme|b`adfefbfeggfoe`gbgifnfdgoecgdgbg``abbme|aebgefafdf``adbne|aecgefefkf``aebme|amcgefdgfgifbgegcgnfafmfef`` |
|
4 |
+Gdc``hbgb`@`bdgBbdBcdBnbBffBofBofBmfBafBdgBcfBhfBggBifBdgBhfBbgBefBafBdf@`bcgBcdBlfBafBmfBadBfeBmbBdeBefBcgBdgBmbBfdBifBlfBefBmbBdfBefBdgBefBcfBdgBefBdfBmbBfgBifBafBmbBbfBigBdgBefBcfBofBdfBef@`bbg@Ab`b`aAa`bagB`cBjcBdcBdfBecBafBecB`cB`cB`cB`cBbcB`cB`cB`cB`cB`cB`cB`cBdcB`cB`cB`cBffB`cB`cBffBffBffBffB`cB`cB`cB`c@`b`gBedBodBfdBmbBecBdcBdcBjcBdcBdfBecBafBecB`cB`cB`cB`cBbcB`cB`cB`cB`cB`cB`cB`cBdcB`cB`cB`cBffB`cB`cBffBffBffBffB`cB`cB`cB`c@`bofBceB`cBkbB`cBjcBdcBdfBecBafBecB`cB`cB`cB`cBbcB`cB`cB`cB`cB`cB`cB`cBdcB`cB`cB`cBffB`cB`cBffBffBffBffB`cB`cB`cB`c@`b`aCa`a`bheBedB`eBjcB`b@`bnfBcdBofBegBlfBdfBnfBgbBdgB`bBbgBefBafBdfB`bBecB`bBbfBigBdgBefBcgB`bB`dBedB`eAj@`bmfBndBofB`bBgbBmfBofBfgB`bBefBbfBhgBlbB`bBcfBigB`gBhfBefBbgBdgBefBhgBdgBgbB`bBffBofBegBnfBdfB`bBafBdgB`bBefBnfBdgBbgBigB`gBofBifBnfBdgAj@`blfBfeBadB`bBofBffB`bBcfBigB`gBhfBefBbgBdgBefBhgBdgB`bBifBcgB`b@`befBbeBfeBadB`bBofBffB`bBcfBigB`gBhfBefBbgBdgBefBhgBdgB`bBifBcgB`b@`bdfBcdBafBnfBgbBdgB`bBlfBofBcfBafBdgBefB`bBdgBhfBefB`bB`gBhfBifBcgBifBcfBafBlfB`bBofBffBffBcgBefBdgB`bBofBffB`bBdgBhfBefB`bBcfBigB`gBhfBefBbgBdgBefBhgBdg@`befBcdBigB`gBhfBefBbgBdgBefBhgBdgB`bBcgBdgBafBbgBdgBcgB`bBafBdgB`b@`bcfBcdBafBnfBgbBdgB`bBbgBefBafBdfB`bBcfBigB`gBhfBefBbgBdgBefBhgBdgAj@`bieBhdBedBldBldBodB`bBgeBodBbeBmd@`b`f@@@Aa@Ab`bad@Ab`bad@Ae`bad@Af`bad@Ag`bad@Ai`bad@Aj`bad@Ak`bad@Al`bad@Dc``h`bcdB`dDc``h`bcdAdDc``h`bad@Am`bad@An`bad@Ao`bad@B`a`bad@Baa`bad@D```h`bcdAhD```h`bcdAdD```h`bcd@D```h` |
|
5 |
+A`b`bLbjeb`babheabieab`b`b`b`b`b`b`b`bad`b`b`aa`b`b`ah`aa`b`b`bad`b`b`aa`````b`b`b`b`b`b`b`b`b`b`b`b`b`b`b`b`aa`b`b`b`b`b`b`b`b`bad`b`b`aa`b`b`ah`ah```bad`ah`ah`ah```bad`ah`ah`ah```bad`ah`ah`ah```bad`ah`ah`ah```bad`ah`ah`ah```bad`ah`ah`ah```bad`ah`ah`ah```bad`ah`ah`ah```bad`ah`ah`ah```b`b`aa`bad```b`b`b`b`Fbdfam |
|
6 |
+Bb`bacgbBma`b`badabbafBga`@db`baeabaagacb`bafabbadac@dbadagdbbkdaa@db`bahabbabagAedaaaieab`bahAedTaaaiabaa |
|
7 |
+Bb`bajabbafBha`@dTcab`b@d |
|
8 |
+BahakgbagaaaleaahakBkkaTaaaladac |
|
9 |
+Bb`bamabbafBia`@dTcab`b@d |
|
10 |
+BbadandbbkdaaAadb`baogbanaab`alb``bbao`Taab`aaeaf |
|
11 |
+Bb`b`obaoTbaaf |
|
12 |
+Bb`bbcabb`bcab`bbdaabbafBja`@db`bbeaabaagbcab`bbfagbBla`b`bbgab`bcabfab`bbhaabbafBna`@db`bbiaabaagbgab`bbjaabaaobgaaabkaeab`bbjaHoooooooodTaabkaagah |
|
13 |
+Bb`bblaabbafBoa`@dTcab`b@d |
|
14 |
+Bb`bbmaabbafB`b`@db`bbnaabaagbjab`bboaabbadbja@dbadb`bdbbceab@db`bbababbabb`bAjdaabbbeab`bbabAjdTaabbbajai |
|
15 |
+Bb`bbcbabbafBab`@dTcab`b@d |
|
16 |
+Bahbdbgbb`bahbebm`bdbBjba``fbbebb`bbadbgbdbbceabAadahbhba`bebAaaahbibgbbgbahbjbm`bhbbib``fbbjbbgbbadblbdbbceabAbdahbmba`bjbAaaahbnbgbblbahbobm`bmbbnb``fbbobblbbadbacdbbceabAcdahbbca`bobAaaahbccgbbacahbdcm`bbcbcc``fbbdcbacbadbfcdbbceabAddahbgca`bdcAaaahbhcgbbfcahbicm`bgcbhc``fbbicbfcbadbkcdbbceabAedahblca`bicAaaahbmcgbbkcahbncm`blcbmc``fbbncbkcbadb`ddbbceabAfdahbada`bncAaaahbbdgbb`dahbcdm`badbbd``fbbcdb`dbadbeddbbceabAgdahbfda`bcdAaaahbgdgbbedahbhdm`bfdbgd``fbbhdbedbadbjddbbceabAhdahbkda`bhdAaaahbldgbbjdahbmdm`bkdbld``fbbmdbjdbadboddbbceabAidahb`ea`bmdAaaahbaegbbodahbbem`b`ebae``fbbbebodb`bbdekbb`bBbb`Ajdaabeeeab`bbde@dTaabeeakal |
|
17 |
+BbadbfedbbceabAjd``fb@abfeb`bbheabbafb`b@db`bbieabbaeBca`@dTcab`b@d |
|
18 |
+BTcab`b@dE |
|
19 |
+A`aaLahb`b`b`b`b`b`aa`aa`aa`aa`aa`Faiaa |
|
20 |
+Bb`b`gbBfb`b`baagbBeb`b`babgbBdb`aaacfab`bab@daaadfab`baa@daaaefab`b`@daaafk`adaeaaagk`afacTcaaaagE |
|
21 |
+Sfeidbeeecendadmdedoe`ebeedfdidhehb`bbbbdcdnbffofofmfafdgcfhfggifdghfbgefafdfbb`bibSfeidbeeecendadmdedcehbbbcdlfafmfadfembdeefcgdgmbfdiflfefmbdfefdgefcfdgefdfmbfgifafmbbfigdgefcfofdfefbbib |
|
22 |
+deadbegdeddehbacibSobjb`bdehfifcg`bifcg`baflflf`bdfegmfmfig`bcgdgegffff`bjbobSceidgdndaddeeebeedceoeddedcdldoebdedgdidndSddedcdldadbeedoeceidgdndaddeeebeedhbmdjeffbgofmfbdodfdib |
|
23 |
+ddedcdldadbeedoeceidgdndaddeeebeedhbmdjeffbgofmfedodfdibSddedcdldadbeedoeceidgdndaddeeebeedhbmdjeffbgofmfce`cibSceidgdndaddeeebeedceoeddedcdldoeedndddSceidgdndaddeeebeedceoeddedfdoebdedgdidnd |
|
24 |
+ddedfdidndedoeceidgdndaddeeebeedhbmdjeffbgofmfbdodfdlb`b`b`b`b`b`b`bbb`cjcdcdfecafec`c`c`c`cbc`c`c`c`c`c`c`cdc`c`c`cff`c`cffffffff`c`c`c`cbbibSddedfdidndedoeceidgdndaddeeebeedhbmdjeffbgofmfedodfdlb`bbbedodfdmbecdcdcjcdcdfecafec`c`c`c`cbc`c`c`c`c`c`c`cdc`c`c`cff`c`cffffffff`c`c`c`cbbib |
|
25 |
+ddedfdidndedoeceidgdndaddeeebeedhbmdjeffbgofmfce`clb`b`b`b`b`bbbce`ckb`cjcdcdfecafec`c`c`c`cbc`c`c`c`c`c`c`cdc`c`c`cff`c`cffffffff`c`c`c`cbbibSceidgdndaddeeebeedceoeednddd |
|
26 |
+`eedoeeend`eadcdkdedbeoeddedcdldadbeedSbfofoflf`blfofgfifcfaflfoedgbgifgfgfefbghbfgofifdfibSkgSbgefdgegbgnf`bmfafdgcfhfefcghbceifgfnfafdgegbgefcgnbmdjeffbgofmfbdodfdib`bfbfb`bmfafdgcfhfefcghbceifgfnfafdgegbgefcgnbmdjeffbgofmfedodfdib`bfbfb`bmfafdgcfhfefcghbceifgfnfafdgegbgefcgnbmdjeffbgofmfce`cibkc |
|
27 |
+mgSobjb`bddegmfmfig`bcgdgegffff`befnfdfcg`bhfefbgef`bjbobSifnfdg`befnfdgbgig`gofifnfdghbib`bkgSobob`bgdefdg`bdghfef`befnfdgbgig`b`gofifnfdg`bodfdfdceeddeSegifnfdgccbcoedg`bef`g`bmc`bgfefdgednfdgbgig`eofifnfdghbibkc |
|
28 |
+dfefbfeggfhbbbed`ejc`bbbibkc`bdfefbfeggfhbef`gibkcSobob`bmdoffgef`bdgof`bdghfef`befnfdgbgig`b`gofifnfdg`bofffffcgefdg`bifnf`bdghfef`bffiflfefScgefefkfhbef`glb`bceededkdoeceeddeibkc |
|
29 |
+objb`bhdefbgef`bggef`blfofofkf`bffofbg`bmfoffg`befbfhglb`bfgaflfegefSdehfef`bdfifcgafcgcgefmfbflfefbg`bifcg`bhfofggeffgefbg`bnfofdg`bigefdg`bifnfdgefgfbgafdgefdf`bifnf`bdghfef`bbfcf`bcgof`bffofbg`bnfofgg`bggef`bcfhfefcfkf |
|
30 |
+mfafnfegaflflfig`bifff`bifdggbcg`baf`bmfoffgnb`bidnf`bhfefhg`bifdg`bcghfofeglfdf`bbfef`bbfbfccccbcbcacac`c`c`bffofbg`bmfoffg`befbfhglb`b`c`cacacbcbccccc`bSdghfafdg`bifcg`bec`bbfigdgefcg`boffgefbgaflflfnb |
|
31 |
+jbobSobob`bmdafkfef`bbgofofmf`bffofbg`bdghfef`bec`bbfigdgefcg`bdgof`bbfef`bbgefafdfSegifnfdghcoedg`bffifbgcgdgoeof`gkeecmekcSobob`bbeefafdf`bec`bbfigdgefcgSifffhbbgefafdfhbffifbgcgdgoeof`glb`becibabmcecib`bkg |
|
32 |
+dfefbfeggfhbbbcdofeglfdfnfgbdg`bbgefafdf`bec`bbfigdgefcg`b`ded`elenfbbibkcSbgefdgegbgnf`b`ckcSmgSobob`bcdhfefcfkf`bifff`bdghfef`bffifbgcgdg`bbfigdgef`bhbafkfaf`bffifbgcgdgoeof`gke`cmeib`bifcg`bbfbf |
|
33 |
+ifffhbffifbgcgdgoeof`gke`cme`babmc`b`chgbfbfib`bkgSdfefbfeggfhbbbndof`bgbmfoffg`befbfhglb`bcfig`ghfefbgdgefhgdggb`bffofegnfdf`bafdg`befnfdgbgig`gofifnfdglenfbbibkc |
|
34 |
+bgefdgegbgnf`b`ckcSmgSobob`bdeafkfef`bdghfef`bafbggfegmfefnfdg`bofff`bmfoffg`befbfhglb`bnbnbnb`bgghfifcfhf`bifcg`bdghfef`bfead`bofff`bdghfef`bcfig`ghfefbgdgefhgdg |
|
35 |
+egifnfdgccbcoedg`bfgafoeofffoecfig`ghfefbgdgefhgdg`bmc`bcflfifoebgefafdfifnfdgccbchbhbegifnfdgccbcoedg`bjbibhbffifbgcgdgoeof`gkbacibibkcSdfefbfeggfhbbbfead`bofff`bcfig`ghfefbgdgefhgdg`bifcg`bbbibkcdfefbfeggfhbfgafoeofffoecfig`ghfefbgdgefhgdgibkc |
|
36 |
+obob`bmdafkfef`bdghfef`bfead`bafnf`bbefead`bmb`bdghfafdg`bifcg`bcgegbfdgbgafcfdg`bdghfef`bifmfafgfefbfafcgef`bffbgofmf`bifdgSegifnfdgccbcoedg`bbgfgafoeofffoecfig`ghfefbgdgefhgdg`bmc`bfgafoeofffoecfig`ghfefbgdgefhgdg`bmb`b`boeoecflfafmfbfcfoe`gefdfafdgafnbof`gdgccbcnbidmfafgfefbdafcgefkc |
|
37 |
+dfefbfeggfhbbbbefead`bofff`bcfig`ghfefbgdgefhgdg`bifcg`bbbibkcdfefbfeggfhbbgfgafoeofffoecfig`ghfefbgdgefhgdgibkcSobob`bdeegbgnf`bdghfef`bbefead`bofff`bdghfef`bcfig`ghfefbgdgefhgdg`bifnfdgof`baf`bffiflfef`bhbbgafggib`bofffffcgefdg |
|
38 |
+egifnfdgccbcoedg`bofffffcgefdgoeofffoecfig`ghfefbgdgefhgdg`bmc`b`gefoebgafggafdfdfbghbbgfgafoeofffoecfig`ghfefbgdgefhgdgibkcSobob`bidff`bdghfef`bofffffcgefdg`bifcg`bbfafdflb`bbfafiflf`bofegdg |
|
39 |
+ifffhbofffffcgefdgoeofffoecfig`ghfefbgdgefhgdg`bmcmc`b`eedoeidndfeadldidddoebefeadib`bkgSdfefbfeggfhbbbcdafnfgbdg`blfofcfafdgef`bdghfef`b`ghfifcgifcfaflf`bofffffcgefdg`bofff`bdghfef`bcfig`ghfefbgdgefhgdgbbibkc |
|
40 |
+bgefdgegbgnf`b`ckcSmgSdfefbfeggfhbbbcdig`ghfefbgdgefhgdg`bcgdgafbgdgcg`bafdg`bbbibkcdfefbfeggfhbofffffcgefdgoeofffoecfig`ghfefbgdgefhgdgibkcSobob`bmdoffgef`bdgof`bdghfef`bcfig`ghfefbgdgefhgdg`bifnf`bdghfef`bffiflfef |
|
41 |
+cgefefkfhbofffffcgefdgoeofffoecfig`ghfefbgdgefhgdglb`bceededkdoeceeddeibkcSobob`bmdafkfef`bbgofofmf`bffofbg`bdghfef`bcfig`ghfefbgdgefhgdg`bdgof`bbfef`bbgefafdf`bmb`bac`c`bbfigdgefcg`bdghfafdg`bifcg`bbbhdedldldod`bgeodbemdbb`b`glfegcg`bofnfef`bbfigdgef`bffofbg`bdghfef`bdgefbgmfifnfafdgofbg |
|
42 |
+egifnfdghcoedg`bcfig`ghfefbgdgefhgdgkeacacmekcSobob`bbeefafdf`bdghfef`bcfig`ghfefbgdgefhgdg`bffbgofmf`bffiflfef`bifnfdgof`bbbcfig`ghfefbgdgefhgdgbbSifffhbbgefafdfhbcfig`ghfefbgdgefhgdglb`bac`cibabmcac`cib`bkg |
|
43 |
+dfefbfeggfhbbbcdafnfgbdg`bbgefafdf`bcfig`ghfefbgdgefhgdglenfbbibkcSbgefdgegbgnf`b`ckcSmgSobob`bdehfef`bbbdfefcfbgig`gdgifofnfbb`blfofof`g`bmb`bdgegbgnfcg`bdghfef`bcfig`ghfefbgdgefhgdg`bifnfdgof`b`glfafigifnfdgefhgdg |
|
44 |
+egifnfdghcoedg`bcfegbgbgefnfdgoe`gofcgifdgifofnflb`bkfefig`bmc`b`chgbcickcSffofbghbcfegbgbgefnfdgoe`gofcgifdgifofnfmc`ckc`bcfegbgbgefnfdgoe`gofcgifdgifofnflcac`ckc`bcfegbgbgefnfdgoe`gofcgifdgifofnfkbkbib`bkg |
|
45 |
+kfefigkbkbkcScfig`ghfefbgdgefhgdgkecfegbgbgefnfdgoe`gofcgifdgifofnfme`bnemc`bkfefigkcSkfefig`bmc`bcfig`ghfefbgdgefhgdgkecfegbgbgefnfdgoe`gofcgifdgifofnfmekcSmgSobob`bcdofmf`gafbgef`bdghfef`bhbnfofggib`b`glfafifnfdgefhgdg`bggifdghf`bdghfef`bbgefffefbgefnfcfef`bhbbbhdedldldod`bgeodbemdbbib |
|
46 |
+ifffhbabmfefmfcfmf`ghbcfig`ghfefbgdgefhgdglb`bbbhdedldldod`bgeodbemdbblb`bac`cibib`bkgScfig`ghfefbgdgefhgdgkeac`cme`bmc`b`ckc`bobob`baddfdf`baf`bcgdgbgifnfgf`bdgefbgmfifnfafdgofbg |
|
47 |
+dfefbfeggfhbhbcfhfafbg`bjbibcfig`ghfefbgdgefhgdgibkc`bobob`b`ebgifnfdg`bifdglb`bjfegcgdg`bffofbg`bffegnfSffofegnfdffeifbgegcghbbbcdlfafmfadfembdeefcgdgmbfdiflfefmbdfefdgefcfdgefdfmbfgifafmbbfigdgefcfofdfefbbibkc`bobob`bceefdg`bdghfef`bfgifbgegcg`bnfafmfefab |
|
48 |
+mgSbgefdgegbgnf`b`ckcSmgSS |
|
0 | 49 |
\ No newline at end of file |